diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..1885487 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-midnight \ No newline at end of file diff --git a/basis-escher.html b/basis-escher.html index 65f1e23..3267689 100644 --- a/basis-escher.html +++ b/basis-escher.html @@ -20,64 +20,64 @@

Escher faculty

Index reflex

Every running Escher circuit program has been materialized relative to an index. -The index reflex, escher.Index, is a noun reflex that emits the index relative to which +The index reflex, e.Index, is a noun reflex that emits the index relative to which the current circuit has been materialized.

The following program, for instance, will print out the index used to materialize the invoking circuit program: -

+
 {
-	*Show = *escher.Index
+	*e.Show = *e.Index
 }
 

Materialize reflex

-

The materialize reflex, named escher.Materialize, +

The materialize reflex, named e.Materialize, materializes a program circuit relative to an index of faculties.

The reflex requires that two valves, :View and :Residue, be connected. Values sent to :View must be circuits containing gates named Index and Program. -The value of the Program gate must be a circuit program (or any +The value of the Program gate must be a circuit program (or any gate value allowed within a circuit program). Whereas the value of the Index gate should hold the index, relative to which the program will be materialized. -

When a value is received at :View, the materialize reflex will materialize the +

When a value is received at :View, the materialize reflex will materialize the program relative to the given index and will return the residue to the valve :Residue.

Consider the following example program: -

+
 {
-	m *escher.Materialize
-	f *Fork
+	m *e.Materialize
+	f *e.Fork
 
 	m:View = f:
 	f:Program = {
-		*Show = "Hello from the child circuit program."
+		*e.Show = "Hello from the child circuit program."
 	}
-	f:Index = *escher.Index
-	m:Residue = *Show
+	f:Index = *e.Index
+	m:Residue = *e.Show
 }
 

This program will materialize the child program -

+
 {
-	*Show = "Hello from the child circuit program."
+	*e.Show = "Hello from the child circuit program."
 }
 

using the same index that was used to materialize the parent program, as acquired from -the *escher.Index reflex in the parent program. +the *e.Index reflex in the parent program.

diff --git a/basis-flow.html b/basis-flow.html index e887d30..3c63291 100644 --- a/basis-flow.html +++ b/basis-flow.html @@ -23,69 +23,76 @@

Information flow reflexes

Star reflex

-

The star is the simplest flow reflex. It accepts any number of +

(The implementation can be found in +faculty/basic/star.go.) + +

The star is the simplest flow reflex. It accepts any number of connected valves and ignores their specific names.

When a value is received on any one of its connected valves, the star reflex forwards that value to all other connected valves. -

Every forwarded value is emitted (i.e. sent) to its respective -valve on a dedicated goroutine. Therefore the star reflex never -blocks. +

Every forwarded value is emitted (i.e. sent) to its respective +valve on a dedicated Go routine. Therefore, the star reflex never +blocks.

An example usage: -

+
 {
-	star *Star
+	star *e.Star
 	one 1
 
 	star:X = one:
-	star:Y = *Show
-	star:Z = *Show
-	star:W = *Show
+	star:Y = *e.Show
+	star:Z = *e.Show
+	star:W = *e.Show
 }
 

When this circuit is materialized, the constant 1 will be emitted from gate one to valve X of gate star. The star gate will then forward the value to each of the valves Y, Z and W in parallel. Consequently -it will be printed on the standard output three times by the receiving *Show reflexes. +it will be printed on the standard output three times by the receiving *e.Show reflexes.

Fork reflex

+

(The implementation can be found in +be/union.go.) +

In our experience, the fork is the most commonly used synchronization primitive in Escher. -It requires that the distinguished empty-string valve be connected, as well as one or more +It requires that the distinguished empty-string valve be connected, as well as one or more freely-named (string or integer) other valves. -

Fork can be described as two entirely independent reflexes, let us call -them merge and split, embodied in one. +

Fork can be described as two entirely independent reflexes. +Let us call them merge and split, embodied in one.

Split direction

-

Whenever a value W is received on the empty string valve of a fork, -the reflex will process it using the split logic. The received value must be of type -circuit. For every valve whose name N is not the empty string, fork will -send the value of the gate named N from circuit W to that valve. +

Whenever a value W (must be of type Circuit) +is received on the empty string valve of a fork, +the reflex will process it using the split logic. +For every valve whose name N is not the empty string, +fork will send the value of the gate named N from circuit W to that valve.

Take for instance this program: -

+
 {
-	f *Fork
+	f *e.Fork
 	f: = {
 		x "Hello"
 		y "World"
 		z "Foo"
 	}
-	f:x = *Show
-	f:y = *Show
+	f:x = *e.Show
+	f:y = *e.Show
 }
 
-

The values "Hello" and "World" will be sent -to and printed by the connected *Show reflexes. Whereas the value "Foo" -will be ignored. +

The values "Hello" and "World" will be sent +to and printed by the connected *e.Show reflexes. +Whereas the value "Foo" will be ignored.

Merge direction

@@ -94,16 +101,16 @@

Merge direction

gate names follow respective valve names, and will send this circuit out to its empty string valve.

Note that in the merge direction fork reflexes act as powerful synchronization primitives. -They effectively wait, blocking any other receptions on the non-empty-string valves, until -one value is available on each such valve. Subsequently these values are packed into a -single circuit and sent out. +They effectively wait, blocking any other receptions on the non-empty-string valves, until +one value is available on each such valve. +Subsequently, these values are packed into a single circuit and sent out.

Consider the following program, for instance: -

+
 {
-	f *Fork
-	f: = *Show
+	f *e.Fork
+	f: = *e.Show
 	f:x = "New"
 	f:y = "York"
 }
@@ -112,21 +119,21 @@ 

Merge direction

Fork will wait until "New" and "York" are received on valves x and y, respectively. Then the value -

+
 {
 	x "New"
 	y "York"
 }
 
-

will be sent to and printed by the *Show reflex. +

will be sent to and printed by the *e.Show reflex.

diff --git a/basis-os.html b/basis-os.html index 891f7b2..cc447a8 100644 --- a/basis-os.html +++ b/basis-os.html @@ -18,7 +18,7 @@

POSIX faculty

The os faculty contains various reflexes for interacting with the POSIX environment within which an Escher program executes. It contains a few simple reflexes for accessing things like command-line arguments, environment variables, standard file -descriptors, process execution and the like. +descriptors, process execution and the like.

Most reflexes in os are implemented in less than 10 lines of code and in that sense their implementation is their best documentation. Here we detail @@ -36,7 +36,7 @@

Process execution reflex

An example of the command circuit value is as follows: -

+
 {
 	Env {
 		"PATH=/abc:/bin"
@@ -50,7 +50,7 @@ 

Process execution reflex

The returned IO circuit value is of the following form: -

+
 {
 	Stdin (io.WriteCloser)
 	Stdout (io.ReadCloser)
@@ -63,7 +63,7 @@ 

Process execution reflex

The exit circuit is of the form -

+
 {
 	Exit (int)
 }
@@ -72,7 +72,7 @@ 

Process execution reflex

The following example demonstrates invoking the /bin/ls command and forwarding its standard output and error to those of the Escher program itself. -

+
 {
 	proc *os.Process
 	proc:Command = {
@@ -80,24 +80,24 @@ 

Process execution reflex

Args { "/" } } - yio *Fork + yio *e.Fork proc:IO = yio: - yio:Stdin = *Ignore + yio:Stdin = *e.Ignore yio:Stdout = *os.Stdout yio:Stderr = *os.Stderr - yexit *Fork - proc:Exit = yexit: - + yExit *e.Fork + proc:Exit = yExit: + exit *os.Exit - yexit:Exit = exit: + yExit:Exit = exit: }

The standard file descriptors of the child process must always be handled. In this example, standard output and error are forwarded while standard input is -“ignored”. The reflex *Ignore is a “smart” reflex which +“ignored”. The reflex *e.Ignore is a “smart” reflex which ignores primitive values (integers, floats, etc.), whereas it closes io.Closer objects and it drains io.Reader objects. @@ -106,7 +106,7 @@

Process execution reflex

diff --git a/basis.html b/basis.html index 8a8ad1b..302b2ff 100644 --- a/basis.html +++ b/basis.html @@ -15,15 +15,22 @@

Reflex basis and faculties

-

There are two kinds of reflexes in Escher: +

A faculty is a set of reflexes, similar to a package in Java, or a namespace in C++. + +

There are two kinds of reflexes in Escher:

    -
  • Those that are implemented in the underlying technology, the Go language, and linked into the runtime, which we call -basis reflexes. -
  • And those that are compositions of other reflexes, described by program circuits, which we call -derivative reflexes. +
  • Basis reflexes + are implemented in the underlying technology — + the Go language — and linked into the runtime +
  • Derivative reflexes + are compositions of other reflexes, + described by program circuits
-

Basis reflexes determine the basic arithmetic and data manipulation +

We will now have a look at the equivalent of std in C++, +the Escher basis faculty. + +

Basis reflexes determine the basic arithmetic and data manipulation operations that Escher programs can ultimately perform, as well as external technologies that Escher programs might have access to. @@ -37,29 +44,33 @@

Arithmetic

Information flow

We find that most Escher programs benefit from -a few basic reflexes that control information flow. -We have included a few in the default runtime and they are described in the following -sections. These gates can be viewed as Escher's “synchronization” facilities. +a few basic reflexes that control information flow. +We have included a few in the default runtime, +and they are described in a separate page. +These gates can be viewed as Escher's “synchronization” facilities.

External technologies

-

Basis reflexes are also Escher's way of interacting with external technologies, +

Basis reflexes are also Escher's way of interacting with external technologies such as input/output devices. The POSIX systems is a canonical example of an -external technology and Escher has a dedicated os faculty for it. +external technology, and Escher has a dedicated +os +faculty for it.

Escher within Escher

-

The most powerful feature of Escher is its recursive nature: Circuit programs -can create program circuits and materialize them into other circuit programs. -This programming pattern is enabled by the escher faculty, -which among other things offers reflexes that materialize program circuits. +

The most powerful feature of Escher is its recursive nature: +Circuit programs can create program circuits and materialize them into other circuit programs. +This programming pattern is enabled by the +escher +faculty, which among other things offers reflexes that materialize program circuits.

diff --git a/cloud.html b/cloud.html index a0e3dcd..aa8d9f9 100644 --- a/cloud.html +++ b/cloud.html @@ -22,45 +22,48 @@

Paradigm for building clouds with Circuit and Escher

and understandable to users.

We propose a syntactic abstraction, called Escher circuits, for representing the state of the cloud. -The abstraction enables modular compositing of large circuits from smaller components, facilitating -manual descriptions of cloud topologies. Further, it supports a circuit “difference” calculation +The abstraction enables modular composition of large circuits from smaller components, facilitating +manual descriptions of cloud topologies. Further, it supports a circuit “difference” calculation to facilitate the representation of incremental system changes.

The result is a system that provides a 3-step workflow for the Operations Engineer, which is captured in the following command-line operations: -

+
 cloud sense > current_state.circuit
 cloud diff desired_state.circuit current_state.circuit > diff.circuit
 cloud materialize diff.circuit
 

All .circuit files involved in the control of the cloud are simple text files -(that use Escher syntax) and as such all changes to the cloud +that use Escher syntax. Therefore, all changes to the cloud integrate cleanly with versioning systems like Git, -resulting in full hitorical accountability of cloud state changes. +which when used gives us full historical accountability of cloud state changes.

Framework

-

Every well-defined system requires a clear specification of the objects -at play, their possible interrelations in any moment in time, as well as the allowable operations -that can be performed to its components. +

Every well-defined system requires a clear specification of the objects at play, +their possible interrelations in any moment in time, +as well as the allowable operations that can be performed to its components. -

The systems of interest here, which model cloud applications in the datacenter, have +

The systems of interest here, which model cloud applications in the data-center, have three types of components: hosts, services and links. We will treat these objects cleanly in -a formal manner, but it should be clear that they will end up corresponding to well-known +a formal manner, but it should be clear that they will end up corresponding to well-known, real technologies utilized in specific manners.

Our hosts will correspond to physical machines (or virtual machines, as the case might be). Our services will correspond to Docker containers, whose images are configured in a standard manner to expect a number of named incoming or outgoing TCP connections. -And each of our links will correspond to a pair of lightweiht DNS servers, one at each endpoint host, +And each of our links will correspond to a pair of lightweight DNS servers, one at each endpoint host, configured to point the respective Docker TCP connections at each other. -

The exact details of the correspondence between hosts, services and links, and machines, Docker -containers and DNS servers, respectively, will be fleshed out in a later section. For now, suffice it to say -that this correspondence will be made simple and natural through the use of the gocircuit.org -tool for dynamic cloud orchestration (although with an appropriate driver a similar result can be accomplished -with any cloud provider like Google Compute Engine +

The exact details of the correspondence between hosts, services and links on the one hand, +and machines, Docker containers and DNS servers on the other, +will be fleshed out in a later section. +For now, suffice it to say that this correspondence will be made simple and natural +through the use of the gocircuit.org tool +for dynamic cloud orchestration (although with an appropriate driver, +a similar result can be accomplished with any cloud provider like +Google Compute Engine or Amazon EC2, for instance).

Getting back to the abstract system framework, the allowed relationships between hosts, services and links @@ -68,15 +71,18 @@

Framework

  • Every host in the system is identified by a unique string identifier -
  • Every service “resides” on one host and every such service has a string identifier, unique only across the services residing -on the same host. -
  • Every service has a “type” denoted by a string (which will correspond to the Docker image name of its container). -
  • Every service can have zero or more named “valves” (where a valve will correspond to a TCP connection, client or server) -under the requirement that valve names are unique within one service. -
  • Every link “connects” one service-valve pair to another, so that no such pair is connected more than once. +
  • Every service “resides” on one host and every such service has a string identifier, + unique only across the services residing on the same host. +
  • Every service has a “type” denoted by a string + (which will correspond to the Docker image name of its container). +
  • Every service can have zero or more named “valves” + (where a valve will correspond to a TCP connection, client or server) + under the requirement that valve names are unique within one service. +
  • Every link “connects” one service-valve pair to another, + so that no such pair is connected more than once.
-

Relationships between the components of a system can be represented visually using the same +

Relationships between the components of a system can be represented visually using the same symbolism employed by Escher for representing nested circuits: @@ -90,16 +96,16 @@

Framework

-

In the illustration above there are two hosts named host1 and host2. -Two services, named cache and server, reside on host1. -One service, named database, resides on host2. Service cache +

In the illustration above, there are two hosts named host1 and host2. +Two services — named cache and server — reside on host1. +One service — named database — resides on host2. Service cache is of type MemCache, service server is of type Http and service database is of type Redis. There are two links in the system: one connecting the service-valve pair (server, x) to (cache, y), and one connecting (cache, z) to (database, w). (Disregard the labels p and q for now.) -

Thus far we have addressed the properties describing the state of a system in a singular moment in time. +

Thus far, we have addressed the properties describing the state of a system in a singular moment in time. System state can change over time, or “dynamically”, according to the following additional postulates:

    @@ -110,11 +116,14 @@

    Framework

    In particular, hosts, services and links can appear independently of each other. -

    Some of these dynamic events (of emergence or disappearance) will be caused by external -factors (for instance a host might die due to bad hardware) and others will be caused by operations -that we perform with the system (for instance, we might start a service). No matter what the cause -for an event is, the important thing is that these are the only changes of state that can happen to -the system. +

    Some of these dynamic events (of emergence or disappearance) +will be caused by external factors +(for instance a host might die due to bad hardware) +and others will be caused by operations that we perform with the system +(for instance, we might start a service). +No matter what the cause for an event is, +the important thing is that these are the only changes of state +that can happen to the system.

    The resulting UI to the engineer

    @@ -123,20 +132,20 @@

    The resulting UI to the engineer

    failures in the hosting hardware. Other changes will be caused by commands initiated by the user. -

    Since user-initiated changes and external changes are mutually asynchronous, we +

    Since user-initiated changes and external changes are mutually asynchronous, we propose the following simple workflow for the user's point-of-view or point-of-control, as the case might be:

    1. Connect to the “cloud” and retrieve a consistent representation of the “current” cloud state. -
    2. Compute the difference between a representation of the “desired” state of the cloud and the -retrieved “current” state. -
    3. Send a minimal stream of “commands” to the cloud, aimed at modifying its state from -“current” to “desired”. +
    4. Compute the difference between a representation of the “desired” state of the cloud + and the retrieved “current” state. +
    5. Send a minimal stream of “commands” to the cloud, + aimed at modifying its state from “current” to “desired”.

    In the remainder of this document, we describe the design of a command-line tool -cloud which embodies the above three operations as— +cloud, which embodies the above three operations as:

    1. cloud sense > current.circuit @@ -152,14 +161,14 @@

      Representation

      The symbolic visual representation of system state, exemplified above, can very well be used as a formal representation, much like architectural blueprints are used as formal representations -of building design. However, this visual representation while natural for people is not easy to use +of building design. However, this visual representation, while natural for people, is not easy to use by machines.

      As we explain in the section on Escher syntax, this visual representation has an equivalent syntactic (i.e. written) form, which is well-suited for machine manipulations. In particular, the syntactic representation of the diagram above would be as follows: -

      +
       {
       	host1 {
       		cache MemCache
      @@ -175,21 +184,21 @@ 

      Representation

      }
      -

      In other words, every system state can be represented in the form of an Escher circuit. This gives -us a two-fold benefit. +

      In other words, every system state can be represented in the form of an Escher circuit. +This gives us a two-fold benefit.

      On the one hand, Escher circuits can be manipulated programmatically (both from Go and from Escher) simply as data structures. This allows flexible programmatic investigation of system state through familiar technologies.

      On the other hand, Escher's programming and materialization mechanism -allows for such circuits to be built out modularly from smaller component circuits. In other words, large -datacenter topologies can be composed out of smaller standard components, whereby even the components -circuits can span multiple machines and themselves be non-trivial subsystems. +allows for such circuits to be built out in a modular way from smaller component circuits. +In other words, large data-center topologies can be composed out of smaller standard components, +whereby even the components circuits can span multiple machines and themselves be non-trivial subsystems.

      For instance, our example system state could be generated out of smaller components in the following manner. Let the following circuit be an index (i.e. a library), consisting of two circuits designs: -

      +
       Index {
       	HttpHost {
       		cache MemCache
      @@ -204,9 +213,9 @@ 

      Representation

      }
      -

      Then, if we materialize the program +

      Then, if we materialize the program relative to Index, -

      +
       {
       	host1 HttpHost
       	host2 DbHost
      @@ -214,23 +223,29 @@ 

      Representation

      }
      -relative to Index, the resulting residue will be precisely the system state circuit that +the resulting residue will be precisely the system state circuit that we started with, i.e. the one illustrated in the drawing above.

      Dual representation

      -

      We call the circuit representation of system state, described thus far, a “primal” representation or simply a primal. -Every primal has an equivalent “dual” representation. Transitioning from primal to dual and vice-versa is a matter of -a simple transformation, as we shall see. +

      We call the circuit representation of system state, described thus far, +a “primal” representation or simply a primal. +Every primal has an equivalent “dual” representation. +Transitioning from primal to dual and vice-versa is a matter of +a simple transformation, as we shall see. -

      The dual representation of system state is useful to us, as it is more convenient to carry out certain manipulations -within this representation. In particular, it will be easier to compute the difference between two states in the dual. -As well as it will be easier to “materialize” a dual system state description into an actual running datacenter topology. +

      The dual representation of system state is useful to us, +as it is more convenient to carry out certain manipulations within this representation. +In particular, it will be easier to compute the difference between two states in the dual. +As well as it will be easier to “materialize” a dual system state description +into an actual running data-center topology. -

      The dual representation of a system state primal consists of two lists: a list of services and a list of links. +

      The dual representation of a system state primal consists of two lists: +a list of services and a list of links. -

      The list of services simply enumerates all services found in the primal, each specified by its “full path” -in the primal, accompanied by its type. For our running example, the list of services would be +

      The list of services simply enumerates all services found in the primal, +each specified by its “full path” in the primal, accompanied by its type. +For our running example, the list of services would be

       (host1.cache, MemCache)
      @@ -238,7 +253,7 @@ 

      Dual representation

      (host2.database, Redis)
      -

      The list of links enumerates all service-to-service links present in the primal representation as pairs +

      The list of links enumerates all service-to-service links present in the primal representation as pairs of endpoints, wherein each endpoint (a service-valve pair) is also specified by its “full path” in the primal. In our example, that list would be: @@ -250,11 +265,11 @@

      Dual representation

      It is not hard to see how the primal can be derived from the dual by reversing this process.

      Furthermore, it is self-evident that one can compute the “difference” between two systems, when -this makes sense, by simply computing the difference of their corresponding dual representations elementwise. +this makes sense, by simply computing the difference of their corresponding dual representations element-wise.

      Sensing and materializing

      -

      Sensing and materializing are the two operations that convert between the abstract circuit +

      Sensing and materializing are the two operations that convert between the abstract circuit representation of a cloud topology and the actual physical topology that executes on the cloud.

      Sensing is the operation of “reading” the current state of the cloud and representing it in the @@ -267,8 +282,8 @@

      Sensing and materializing

      work. The subsequent conversions from dual to primal, a mere data structure transformation, was explained in the previous section. -

      The specific API for manipulating the cloud can be any: -Google Compute Engine, Amazon EC2, Circuit, and +

      The specific API for manipulating the cloud can be any: +Google Compute Engine, Amazon EC2, Circuit, and so forth. Our following explanations will be based on the Circuit as its simple API provides exactly the minimum necessary for such manipulations. @@ -276,33 +291,40 @@

      Preparing Docker service containers

      We have chosen to use executable Docker containers as embodiment for services. -

      Each service communicates with the outside—with other services—through a set +

      Each service communicates with the outside — with other services — through a set of zero or more named valves. A valve corresponds to a TCP client connection, a TCP server connection or both. -

      Service container images must be prepared in a standardized manner so that after the -execution of a container, our framework can (i) obtain the TCP server address corresponding -to each valve (if there is one), as well as (ii) supply the remote TCP server address if the -valve also corresponds to a TCP client connection. +

      Service container images must be prepared in a standardized manner, so that after the +execution of a container, our framework can +

        +
      • (i) obtain the TCP server address corresponding to each valve + (if there is one), as well as +
      • (ii) supply the remote TCP server address + if the valve also corresponds to a TCP client connection. +
      -

      There are various ways to prepare Docker containers to accomplish this and we do not +

      There are various ways to prepare Docker containers to accomplish this, and we do not mandate a specific one. Here, we merely suggest one way of doing it without going into unnecessary technical detail. -

      To accomplish (i), one can utilize the Docker -port mapping mechanism. In particular, the software inside the container can be hardwired to -listen to specific port numbers which, in lexicographic order, correspond to the valve names -of the service. Once the container is executed, the effective TCP server addresses—those visible to -other containers in the cloud network—can be automatically obtained using the docker port -command. They will be utilized by our system to “link” containers (i.e. service valves) in a manner described later. - -

      To accomplish (ii), we propose configuring each Docker service container to use a DNS +

      To accomplish (i), +one can utilize the +Docker port mapping mechanism. In particular, the software inside the container can be hardwired to +listen to specific port numbers, which — in lexicographic order — correspond to the valve names +of the service. Once the container is executed, the effective TCP server addresses — those visible to +other containers in the cloud network — can be automatically obtained using the docker port +command. They will be utilized by our system to “link” containers +(i.e. service valves) in a manner described later. + +

      To accomplish (ii), +we propose configuring each Docker service container to use a DNS server whose address is passed on it upon execution, using any one of the various mechanisms available for passing arguments to containers upon execution, provided by Docker itself. Subsequently, the software executing inside the Docker container should simply be hardwired to obtain the IP address for any given valve name by simply looking up that valve name (perhaps prefixed by a standard domain name) through the DNS system. Our framework, described later, -which executes the Docker containers will arrange for a light-weight dedicated DNS server +which executes the Docker containers will arrange for a light-weight, dedicated DNS server for each container, whose sole job would be to resolve these queries appropriately.

      Materializing a dual form to the cloud

      @@ -327,138 +349,165 @@

      Materializing a dual form to the cloud

      1. Obtain a list of available and unused hosts in the cloud. -

        The Circuit API -presents all of its resources uniformly as a file system, where root level directories correspond to available hosts. -Unused hosts are precisely those root level directories that have no children (i.e. no services or other Circuit elements -are running on them). Such a list can be obtained through the API or through the command line using -circuit ls /.... Let us assume, for instance, that the list of available and unused hosts is -

        -/X65cc3c8e31817756
        -/Xe4abe0c286b0e0bc
        -/X9738a5e29e51338e
        -
        - -
      2. Group the elements of the list of services (from the dual) by host and assign a unique (available and unused) -Circuit host to each of the hosts from dual. For instance: -
        -(/X65cc3c8e31817756, host1)
        -(/Xe4abe0c286b0e0bc, host2)
        -
        - -
      3. Execute every service in the dual, as follows. Take, for instance, the service -
        -(host1.cache, MemCache)
        -
        - -
          -
        • Create a dedicated light-weight DNS server for this service, on the Circuit host assigned to this service in the previous step. -Using the Circuit, we spawn a DNS element and choose its name to follow this convention: -
          -/X65cc3c8e31817756/host1/cache/dns
          -
          -

          This is accomplished using the Circuit circuit mkdns command. The details of this are omitted for brevity. -Initially the DNS server will have no resource records, i.e. it will not resolve any lookups. Appropriate records will be added -to it later, when we materialize the list of links from the dual form. -

        • Execute the service's Docker container on that same host using a similar naming convention: -
          -/X65cc3c8e31817756/host1/cache/service
          -
          -

          This is accomplished using the Circuit's circuit mkdkr command, and recall that the service type, -MemCache in this case, is used as the name of the Docker image to be used. Furthermore, the IP address of the DNS server created in the previous step is passed to the Docker container on execution. -

        - -
      4. For each link in the list of links, add DNS resource records to the appropriate DNS servers. -Take for instance the link: -
        -(host1.cache:z, host2.database:w)
        -
        - -
          -
        • First, we inquire into the TCP server address for host1.cache:z, if one is available. -To do so, we access the Docker container -
          -/X65cc3c8e31817756/host1/cache/service
          -
          -and we query the TCP server address for valve named z, using the Docker port exporting -provisions set in place as described earlier. - -
        • Next, we access the Circuit DNS element -
          -/Xe4abe0c286b0e0bc/host2/database/dns
          -
          -and set the resource record for the domain name w to that TCP server address obtained in the previous step. -In addition to setting a DNS A record for the name w, we also set a -DNS TXT record for the same record with the value of host1.cache:z. -This TXT record will later facilitate recovering the dual form for this link directly from the DNS server itself. - -
        • Finally, we repeat the same process with the roles of host1.cache:z -and host2.database:w reversed. - -
        +

        The Circuit API + presents all of its resources uniformly as a *nix style file system, + where root level directories correspond to available hosts. + Unused hosts are precisely those root level directories, + that have no children + (i.e. no services or other Circuit elements are running on them). + Such a list can be obtained through the API, + or through the command line using circuit ls /.... + Let us assume, for instance, that the list of available and unused hosts is +

        +	/X65cc3c8e31817756
        +	/Xe4abe0c286b0e0bc
        +	/X9738a5e29e51338e
        +	
        + +
      5. Group the elements of the list of services (from the dual) by host, + and assign a unique (available and unused) Circuit host to each of the hosts from dual. + For instance: +
        +	(/X65cc3c8e31817756, host1)
        +	(/Xe4abe0c286b0e0bc, host2)
        +	
        + +
      6. Execute every service in the dual as follows. + Take, for instance, the service +
        +	(host1.cache, MemCache)
        +	
        + +
          +
        • Create a dedicated, light-weight DNS server for this service, + on the Circuit host assigned to this service in the previous step. + Using the Circuit, we spawn a DNS element and choose its name to follow this convention: +
          +		/X65cc3c8e31817756/host1/cache/dns
          +		
          +

          This is accomplished using the Circuit command circuit mkdns. + The details of this are omitted for brevity. + Initially, the DNS server will have no resource records, + i.e. it will not resolve any lookups. + Appropriate records will be added to it later, + when we materialize the list of links from the dual form. +

        • Execute the service's Docker container on that same host, + using a similar naming convention: +
          +		/X65cc3c8e31817756/host1/cache/service
          +		
          +

          This is accomplished using the Circuit command circuit mkdkr. + Recall that the service type — MemCache in this case — + is the name of the Docker image to be used. + Furthermore, the IP address of the DNS server created in the previous step + is passed to the Docker container on execution. +

        + +
      7. For each link in the list of links, + add DNS resource records to the appropriate DNS servers. + Take for instance the link: +
        +	(host1.cache:z, host2.database:w)
        +	
        + +
          +
        • First, we inquire into the TCP server address for host1.cache:z, + if one is available. + To do so, we access the Docker container +
          +		/X65cc3c8e31817756/host1/cache/service
          +		
          + and we query the TCP server address for the valve named z, + using the Docker port exporting provisions set in place as described earlier. + +
        • Next, we access the Circuit DNS element +
          +		/Xe4abe0c286b0e0bc/host2/database/dns
          +		
          + and set the resource record for the domain name w + to that TCP server address obtained in the previous step. + In addition to setting a DNS A record for the name w, + we also set a DNS TXT record for the same record with the value of host1.cache:z. + This TXT record will later facilitate recovering the dual form + for this link directly from the DNS server itself. + +
        • Finally, we repeat the same process with the roles + of host1.cache:z + and host2.database:w reversed. + +

      Sensing the cloud state into a dual form

      -

      Reading the current state of the cloud is fairly straightforward. -After listing the contents of the Circuit, using circuit ls /..., -there will only be paths ending in /service and paths -ending in /dns. We are going to read the list of services -from the former ones, and then the list of links from the latter one. +

      Reading the current state of the cloud is fairly straightforward. +After listing the contents of the Circuit using circuit ls /..., +there will only be paths ending in /service, +and paths ending in /dns. +We are going to read the list of services from the former ones, +and then the list of links from the latter one.

      To read the list of services, we consider each path ending in /service. For instance, the path

       /X65cc3c8e31817756/host1/cache/service
       
      -will correspond to a service named host1.cache (simply drop the first and last path elements -and replace slashes with dots). -Then we query the configuration of the underlying Docker container, using the -circuit peek command. This gives us the Docker image name of the -container—which is the service type—and thus the service entry has been recovered. +will correspond to a service named host1.cache +(simply drop the first and last path elements, and replace slashes with dots). +Then we query the configuration of the underlying Docker container, +using the circuit peek command. +This gives us the Docker image name of the container — which is the service type — +and thus the service entry has been recovered.

      To read the list of links, we consider in turn each path ending in /dns -unless it has already been considered. For instance— +unless it has already been considered. +For instance:

       /X65cc3c8e31817756/host1/cache/dns
       
      -

      This path will be a link endpoint with a prefix host1.cache:, as follows -from the manner in which we materialized links in the previous section. +

      This path will be a link endpoint with a prefix host1.cache:, +as follows from the manner in which we materialized links in the previous section.

      We then list the DNS resource records at this path, using circuit peek, -and in the case of this example we will see resource records for the domain names -y and z. In other words, the names correspond to valve -names of the service. And so each name gives us one endpoint in a link. In this case— +and in the case of this example, +we will see resource records for the domain names y and z. +In other words, the names correspond to valve names of the service. +And so each name gives us one endpoint in a link. +In this case:

       (host1.cache:y, …)
       (host1.cache:z, …)
       
      -

      To recover the other endpoint in each of the links, it suffices to look at the DNS TXT -record accompanying each of the names, y and z. -These TXT records will contain, as per the materialization process, the other endpoint -of the respective link, thus allowing is to recover the whole links— +

      To recover the other endpoint in each of the links, +it suffices to look at the DNS TXT record accompanying each of the names, +y and z. +These TXT records will contain, as per the materialization process, +the other endpoint of the respective link, +thus allowing us to recover the whole links:

       (host1.cache:y, host1.server:x)
       (host1.cache:z, host2.database:w)
       
      -

      Before we add these links to the list of links, we also verify that the opposing service -is still alive. Otherwise by convention we treat the link as not present. +

      Before we add these links to the list of links, +we also verify that the opposing service is still alive. +Otherwise — by convention — we treat the link as not present. For instance, if we want to verify that the endpoint host2.database is alive, -we simply consider the Circuit path list, obtained with circuit ls /..., and -look for the glob pattern /*/host2/database/service. +we simply consider the Circuit path list, obtained with circuit ls /..., +and look for the glob pattern /*/host2/database/service.

      diff --git a/cmd.html b/cmd.html index 7c64953..174f7de 100644 --- a/cmd.html +++ b/cmd.html @@ -18,7 +18,7 @@

      Command-line and runtime

      The Escher binary is intended to be a general-purpose execution environment for Escher programs. It is invoked with two parameters: -

      +
       escher -src SourceDirectory MainDirective
       
      @@ -30,26 +30,30 @@

      Command-line and runtime

    2. The supplied source directory is traversed recursively:
      • Files with extension .escher are parsed as Escher source files. - Circuits found therein are placed in the startup index, such that their location in the index - is the same as the path of their source file relative to the source directory, followed by their circuit names. - For instance, the source file a/b/c.escher, containing: -
        -		CircuitName { … }
        -	
        - Will be registered under the index address a.b.c.CircuitName. + Circuits found therein are placed in the startup index, such that their location in the index + is the same as the path of their source file relative to the source directory, followed by their circuit names. + For instance, the source file a/b/c.escher, containing: +
        +	CircuitName { … }
        +
        + Will be registered under the index directive a.b.c.CircuitName.
      • Files with other extensions will be converted into SourceFile reflex materializers, - located in the index at the path of their source file relative to the source directory. SourceFile - reflexes, when materialized, return an io.ReadCloser for the content of the source file. + located in the index at the path of their source file relative to the source directory. SourceFile + reflexes, when materialized, return an io.ReadCloser for the content of the source file. +
    3. Finally, the main directive is materialized.
    +

    The following command, for instance, will generate the contents of this handbook and place it in the current working directory where it is invoked: -

    -escher -src github.com/gocircuit/escher/src *handbook.main
    +
    +
    +escher -src "$GOPATH/src/github.com/gocircuit/escher/src/" "*handbook.main"
     
    +

    The -src can be omitted in favor of setting the ESCHER environment variable. @@ -57,7 +61,7 @@

    Command-line and runtime

    diff --git a/css/font/input/ChangeLog.txt b/css/font/input/ChangeLog.txt deleted file mode 100644 index 63c146f..0000000 --- a/css/font/input/ChangeLog.txt +++ /dev/null @@ -1,22 +0,0 @@ -INPUT -CHANGE LOG - -* v 1.1.5 2014-09-19 David Jonathan Ross - - * Changed default line-height option to 1.2x. - * Added web customization support for alternate curly bracket glyphs and dotless zero glyphs. - * Added “Download with these settings” button to preview page, which will automatically fill out the customization form on the download page. - * Added live-updating URL to preview and download pages, which allows bookmarking and sharing of customization settings. - -* v 1.1 2014-09-03 David Jonathan Ross - - * Added glyphs for [Powerline](https://github.com/Lokaltog/powerline) (U+E0A0–E0A2, U+E0B0–E0B3). - * Added glyph for high voltage sign character (U+26A1). - * Added alternate curly bracket glyphs for users who prefer simplified forms. - * Added alternate dotless zero glyph for users who don’t want a dot or slash in the zero. - * Added zero width space (U+200B) and zero width no-break space (U+FEFF). - * Added Stylistic Alternates {salt} OpenType feature. - -* v 1.0 2014-08-03 David Jonathan Ross - - * Initial release. diff --git a/css/font/input/INSTALL.txt b/css/font/input/INSTALL.txt deleted file mode 100644 index 360650d..0000000 --- a/css/font/input/INSTALL.txt +++ /dev/null @@ -1,72 +0,0 @@ -INPUT -=============== - -## FONT INSTALLATION - -Once you have downloaded and unzipped your fonts, you can install them on your system. Please choose one of the methods below and follow the instructions to install your fonts. - -Using Font Management Software: - -Many users managing large collections of fonts use font management software, which allow them to activate and deactivate fonts, organize their font library, and provide various other features. - -If you are using font management software, follow the installation instructions that came with the software. Typically installation is as simple as dragging the font file into the font management software.  - - -### Using Mac OS: - -Close all open applications, and locate the folder of fonts that you want to install in Finder. - -On Mac OS X, we recommend installing fonts using Font Book, an app. Simply drag the font files onto Font Book to install. - -Alternatively, you can drag the font files manually to the /User/Library/Fonts folder, or in versions prior to OS X, the /System/Fonts folder. - - -### Using Windows: - - 1. Navigate to Control Panel > Fonts. You can find the Control Panel in Start > Control Panel, or in versions prior to Windows XP,  Start > Settings > Control Panel.  - - 2. Choose File > Install New Font. - - 3. In the dialog, locate the fonts you want to install by choosing the drive and folder where the fonts are located. Once the folder is selected, the fonts will appear under List of Fonts. - - 4. From the List of Fonts, select the fonts that you would like to install (CTRL+A will select all fonts in the list). We recommend that you select Copy fonts to the Fonts folder. - - 5. When you see the font name in the Fonts folder, the font has been loaded and is ready for use. - -Alternatively, in recent versions of Windows, you can simply right-click on a font file and choose “Install” from the menu. - - -### Using other operating systems: - -I have to admit, I don't have tons of experience installing fonts on other operating systems, but usually it’s as easy as putting the font files in the right folder. Please consult your the manual for your operating system. - - -## TROUBLESHOOTING - -Many font installation issues are due to issues in the operating system's font caches. If you find that the fonts are not appearing in the font menu, follow the instructions below to clear your caches. If you continue to have issues installing your fonts, please contact us for assistance. - - -### Clearing the Font Caches in Mac OS X: - -There are a variety of font cache files in Mac OS X, so we recommend you use a third party utility to clear them. - -FontNuke  is a free download that will clear font caches. Simply download the program, open it, and follow the instructions provided. Note that it requires you to restart your system. - -Many font management programs are also equipped to clear font caches. Please consult the instructions that came with that software. - -If you wish to clear the font caches manually, follow the instructions on this page:  - - - -Or, for earlier versions of OS X: - - - - -### Clearing the Font Cache in Windows: - - 1. Locate the font cache file by navigating to C:\Windows\System32\FNTCACHE.DAT. In versions prior to Windows XP, the cache file is C:\WINDOWS\ttfCache. - - 2. Delete this cache file by pressing the delete key or moving it to the Recycle Bin. - - 3. Restart your computer, and the cache file will be rebuilt. \ No newline at end of file diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Black.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Black.ttf deleted file mode 100644 index 3c13d3f..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-BlackItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-BlackItalic.ttf deleted file mode 100644 index 39d48c2..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Bold.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Bold.ttf deleted file mode 100644 index b611b97..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-BoldItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-BoldItalic.ttf deleted file mode 100644 index 918af2c..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ExtraLight.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ExtraLight.ttf deleted file mode 100644 index 7b4b224..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ExtraLightItalic.ttf deleted file mode 100644 index df6bd0f..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Italic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Italic.ttf deleted file mode 100644 index 49edc1a..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Light.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Light.ttf deleted file mode 100644 index a1a5905..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-LightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-LightItalic.ttf deleted file mode 100644 index d456cba..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Medium.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Medium.ttf deleted file mode 100644 index af92bfc..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-MediumItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-MediumItalic.ttf deleted file mode 100644 index 45d5f8a..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Regular.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Regular.ttf deleted file mode 100644 index 89a8024..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Thin.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Thin.ttf deleted file mode 100644 index c876aa0..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ThinItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ThinItalic.ttf deleted file mode 100644 index e7555b3..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMono/InputMono-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Black.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Black.ttf deleted file mode 100644 index 110445f..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-BlackItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-BlackItalic.ttf deleted file mode 100644 index dd5f219..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Bold.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Bold.ttf deleted file mode 100644 index 7919209..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-BoldItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-BoldItalic.ttf deleted file mode 100644 index 7d92bd7..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ExtraLight.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ExtraLight.ttf deleted file mode 100644 index 82330a2..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ExtraLightItalic.ttf deleted file mode 100644 index e8fac75..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Italic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Italic.ttf deleted file mode 100644 index b8800b4..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Light.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Light.ttf deleted file mode 100644 index f84c371..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-LightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-LightItalic.ttf deleted file mode 100644 index 37fe6d3..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Medium.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Medium.ttf deleted file mode 100644 index 2d99060..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-MediumItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-MediumItalic.ttf deleted file mode 100644 index af5b684..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Regular.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Regular.ttf deleted file mode 100644 index 589d558..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Thin.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Thin.ttf deleted file mode 100644 index b96c359..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ThinItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ThinItalic.ttf deleted file mode 100644 index 72ae99d..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCompressed/InputMonoCompressed-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Black.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Black.ttf deleted file mode 100644 index 76f3802..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-BlackItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-BlackItalic.ttf deleted file mode 100644 index ff05bda..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Bold.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Bold.ttf deleted file mode 100644 index c2639af..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-BoldItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-BoldItalic.ttf deleted file mode 100644 index ec48c7d..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ExtraLight.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ExtraLight.ttf deleted file mode 100644 index db57b13..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ExtraLightItalic.ttf deleted file mode 100644 index c736bab..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Italic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Italic.ttf deleted file mode 100644 index 871479c..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Light.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Light.ttf deleted file mode 100644 index 2635ba4..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-LightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-LightItalic.ttf deleted file mode 100644 index 070d999..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Medium.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Medium.ttf deleted file mode 100644 index f17a769..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-MediumItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-MediumItalic.ttf deleted file mode 100644 index 254af0e..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Regular.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Regular.ttf deleted file mode 100644 index 19e0fbf..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Thin.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Thin.ttf deleted file mode 100644 index 762b50f..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ThinItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ThinItalic.ttf deleted file mode 100644 index cdde671..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoCondensed/InputMonoCondensed-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Black.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Black.ttf deleted file mode 100644 index 5f07cbe..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-BlackItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-BlackItalic.ttf deleted file mode 100644 index d1bea6a..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Bold.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Bold.ttf deleted file mode 100644 index aa214b5..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-BoldItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-BoldItalic.ttf deleted file mode 100644 index db6a103..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ExtraLight.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ExtraLight.ttf deleted file mode 100644 index a2d6147..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ExtraLightItalic.ttf deleted file mode 100644 index bfe3e9d..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Italic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Italic.ttf deleted file mode 100644 index 48ebd64..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Light.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Light.ttf deleted file mode 100644 index eb9079c..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-LightItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-LightItalic.ttf deleted file mode 100644 index 449bd0a..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Medium.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Medium.ttf deleted file mode 100644 index e5c65b4..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-MediumItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-MediumItalic.ttf deleted file mode 100644 index 73d28a5..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Regular.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Regular.ttf deleted file mode 100644 index dc56df1..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Thin.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Thin.ttf deleted file mode 100644 index e2648f2..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ThinItalic.ttf b/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ThinItalic.ttf deleted file mode 100644 index 4254567..0000000 Binary files a/css/font/input/Input_Fonts/InputMono/InputMonoNarrow/InputMonoNarrow-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Black.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Black.ttf deleted file mode 100644 index f1ec231..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-BlackItalic.ttf deleted file mode 100644 index 51ee85c..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Bold.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Bold.ttf deleted file mode 100644 index 192558e..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-BoldItalic.ttf deleted file mode 100644 index da53a65..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ExtraLight.ttf deleted file mode 100644 index ba553a1..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ExtraLightItalic.ttf deleted file mode 100644 index 0f1c215..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Italic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Italic.ttf deleted file mode 100644 index fa157ca..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Light.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Light.ttf deleted file mode 100644 index 946ef97..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-LightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-LightItalic.ttf deleted file mode 100644 index d971e6d..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Medium.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Medium.ttf deleted file mode 100644 index 6071eec..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-MediumItalic.ttf deleted file mode 100644 index f87c1ef..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Regular.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Regular.ttf deleted file mode 100644 index 7a013b8..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Thin.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Thin.ttf deleted file mode 100644 index 619aa17..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ThinItalic.ttf deleted file mode 100644 index a9d598e..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSans/InputSans-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Black.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Black.ttf deleted file mode 100644 index a16b7ff..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-BlackItalic.ttf deleted file mode 100644 index 67a937f..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Bold.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Bold.ttf deleted file mode 100644 index 8c16e03..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-BoldItalic.ttf deleted file mode 100644 index c7fb3a3..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ExtraLight.ttf deleted file mode 100644 index 5c217ce..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ExtraLightItalic.ttf deleted file mode 100644 index 5032990..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Italic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Italic.ttf deleted file mode 100644 index 84434e1..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Light.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Light.ttf deleted file mode 100644 index 52ff84a..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-LightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-LightItalic.ttf deleted file mode 100644 index 38fdf2e..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Medium.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Medium.ttf deleted file mode 100644 index ec65f13..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-MediumItalic.ttf deleted file mode 100644 index 5ef3617..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Regular.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Regular.ttf deleted file mode 100644 index dbd8429..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Thin.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Thin.ttf deleted file mode 100644 index edc4274..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ThinItalic.ttf deleted file mode 100644 index 7aa67d6..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCompressed/InputSansCompressed-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Black.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Black.ttf deleted file mode 100644 index 040c65a..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-BlackItalic.ttf deleted file mode 100644 index 41e7320..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Bold.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Bold.ttf deleted file mode 100644 index d3b2499..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-BoldItalic.ttf deleted file mode 100644 index fb6a1cd..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ExtraLight.ttf deleted file mode 100644 index 54fb3d6..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ExtraLightItalic.ttf deleted file mode 100644 index 3b045da..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Italic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Italic.ttf deleted file mode 100644 index 13bc91a..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Light.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Light.ttf deleted file mode 100644 index 664ec10..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-LightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-LightItalic.ttf deleted file mode 100644 index a5e00d4..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Medium.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Medium.ttf deleted file mode 100644 index 317fa32..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-MediumItalic.ttf deleted file mode 100644 index c5cf3f9..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Regular.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Regular.ttf deleted file mode 100644 index 5350921..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Thin.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Thin.ttf deleted file mode 100644 index 49f624e..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ThinItalic.ttf deleted file mode 100644 index f71ea9a..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansCondensed/InputSansCondensed-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Black.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Black.ttf deleted file mode 100644 index 85d9e7b..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-BlackItalic.ttf deleted file mode 100644 index 76b5519..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Bold.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Bold.ttf deleted file mode 100644 index 9081e22..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-BoldItalic.ttf deleted file mode 100644 index e176929..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ExtraLight.ttf deleted file mode 100644 index 276d367..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ExtraLightItalic.ttf deleted file mode 100644 index ec38a21..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Italic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Italic.ttf deleted file mode 100644 index 791b552..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Light.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Light.ttf deleted file mode 100644 index b124234..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-LightItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-LightItalic.ttf deleted file mode 100644 index 821d709..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Medium.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Medium.ttf deleted file mode 100644 index 36d1ad4..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-MediumItalic.ttf deleted file mode 100644 index 01f0f2e..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Regular.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Regular.ttf deleted file mode 100644 index adcb248..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Thin.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Thin.ttf deleted file mode 100644 index 11836a3..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ThinItalic.ttf deleted file mode 100644 index 7536f57..0000000 Binary files a/css/font/input/Input_Fonts/InputSans/InputSansNarrow/InputSansNarrow-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Black.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Black.ttf deleted file mode 100644 index 90c0dda..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-BlackItalic.ttf deleted file mode 100644 index 100c582..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Bold.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Bold.ttf deleted file mode 100644 index 9539e1b..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-BoldItalic.ttf deleted file mode 100644 index 9acd878..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ExtraLight.ttf deleted file mode 100644 index e89453b..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ExtraLightItalic.ttf deleted file mode 100644 index 51eb732..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Italic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Italic.ttf deleted file mode 100644 index 4c05145..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Light.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Light.ttf deleted file mode 100644 index 7d8849b..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-LightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-LightItalic.ttf deleted file mode 100644 index 050b677..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Medium.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Medium.ttf deleted file mode 100644 index 5f8c540..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-MediumItalic.ttf deleted file mode 100644 index 39055bb..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Regular.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Regular.ttf deleted file mode 100644 index 9b8c67b..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Thin.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Thin.ttf deleted file mode 100644 index 4878396..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ThinItalic.ttf deleted file mode 100644 index ea0b5e1..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerif/InputSerif-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Black.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Black.ttf deleted file mode 100644 index 2cd4b67..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-BlackItalic.ttf deleted file mode 100644 index f5c93e9..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Bold.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Bold.ttf deleted file mode 100644 index 5c33d4b..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-BoldItalic.ttf deleted file mode 100644 index 84add86..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ExtraLight.ttf deleted file mode 100644 index 86951ca..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ExtraLightItalic.ttf deleted file mode 100644 index 712e2ed..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Italic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Italic.ttf deleted file mode 100644 index 85577d9..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Light.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Light.ttf deleted file mode 100644 index d3a4f69..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-LightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-LightItalic.ttf deleted file mode 100644 index 0c07a37..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Medium.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Medium.ttf deleted file mode 100644 index 6fcfd98..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-MediumItalic.ttf deleted file mode 100644 index 030ad53..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Regular.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Regular.ttf deleted file mode 100644 index b85c020..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Thin.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Thin.ttf deleted file mode 100644 index b3b9519..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ThinItalic.ttf deleted file mode 100644 index 5c7ef2a..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCompressed/InputSerifCompressed-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Black.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Black.ttf deleted file mode 100644 index 453d794..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-BlackItalic.ttf deleted file mode 100644 index c78a5ff..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Bold.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Bold.ttf deleted file mode 100644 index c5de78b..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-BoldItalic.ttf deleted file mode 100644 index 88e4a51..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ExtraLight.ttf deleted file mode 100644 index 653b84d..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ExtraLightItalic.ttf deleted file mode 100644 index bdd3e29..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Italic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Italic.ttf deleted file mode 100644 index 4cc0d04..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Light.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Light.ttf deleted file mode 100644 index a2bfd50..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-LightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-LightItalic.ttf deleted file mode 100644 index 0d50560..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Medium.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Medium.ttf deleted file mode 100644 index 0d645da..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-MediumItalic.ttf deleted file mode 100644 index 210daf0..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Regular.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Regular.ttf deleted file mode 100644 index adc1c02..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Thin.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Thin.ttf deleted file mode 100644 index 642a18f..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ThinItalic.ttf deleted file mode 100644 index 3125c37..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifCondensed/InputSerifCondensed-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Black.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Black.ttf deleted file mode 100644 index 28fc906..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Black.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-BlackItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-BlackItalic.ttf deleted file mode 100644 index 6042199..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-BlackItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Bold.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Bold.ttf deleted file mode 100644 index 84ac3d8..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Bold.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-BoldItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-BoldItalic.ttf deleted file mode 100644 index c8857db..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-BoldItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ExtraLight.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ExtraLight.ttf deleted file mode 100644 index 026b778..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ExtraLight.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ExtraLightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ExtraLightItalic.ttf deleted file mode 100644 index 16cfb96..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ExtraLightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Italic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Italic.ttf deleted file mode 100644 index bf85bab..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Italic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Light.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Light.ttf deleted file mode 100644 index 3aa93f4..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Light.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-LightItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-LightItalic.ttf deleted file mode 100644 index 0f9298c..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-LightItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Medium.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Medium.ttf deleted file mode 100644 index 84ea2e2..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Medium.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-MediumItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-MediumItalic.ttf deleted file mode 100644 index 0ca4ccc..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-MediumItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Regular.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Regular.ttf deleted file mode 100644 index 925e6fe..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Regular.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Thin.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Thin.ttf deleted file mode 100644 index a7f82c7..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-Thin.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ThinItalic.ttf b/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ThinItalic.ttf deleted file mode 100644 index 5a16c05..0000000 Binary files a/css/font/input/Input_Fonts/InputSerif/InputSerifNarrow/InputSerifNarrow-ThinItalic.ttf and /dev/null differ diff --git a/css/font/input/Input_Fonts/SETTINGS.txt b/css/font/input/Input_Fonts/SETTINGS.txt deleted file mode 100644 index 9f95678..0000000 --- a/css/font/input/Input_Fonts/SETTINGS.txt +++ /dev/null @@ -1,13 +0,0 @@ -INPUT -SETTINGS - -These fonts have been customized with the settings below. You can further customize -your fonts with the inputCustomize.py command-line tool found in this package, or -by re-downloading the fonts at . - - - Alternates - --asterisk=height - --zero=slash - - Line Height: 1.2× \ No newline at end of file diff --git a/css/font/input/LICENSE.txt b/css/font/input/LICENSE.txt deleted file mode 100644 index d4c2a2f..0000000 --- a/css/font/input/LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ -INPUT -FONT SOFTWARE LICENSE AGREEMENT - -This License Agreement is a legal Agreement between you and the publisher; please read it carefully. This Font Software was developed specially for use by software developers and includes special terms dedicated to promoting the use of the Font Software for such purposes. - -FREE PERSONAL USE. The Font Software is free for personal use. For the purposes of this License, Personal Use is defined as any use on your own computer that involves computer programming, software devleopment, or the composition of plaintext documents in personal, professional, or non-professional contexts. It is also permitted to publish screenshots of your development environment while using the Font Software. - -SEPARATE PUBLISHING LICENSE. If you use the Input Font Software in a non-development context, or in any context where the Font Software or its appearance will be published or distributed, you will need to purchase the appropriate License. The uses noted below require a separate license: - - - Print and/or publishing of rich-text documents (such as PDF or Word) - - Websites, with fonts served via the WebType service - - Websites, with self-hosted fonts - - Embedding in Applications (“Apps”) - - Bundling of the Input Font with coding or text processing software  - -LIMITED MODIFICATIONS ALLOWED. The Font Software contains a customizing script that will swaps out alternate glyphs, line-height, and other features that are not available in some coding applications. Modifications created by the customizing script included in the Font Software are permitted. Modifications created by third party software is permitted for Personal Use, but is otherwise not permitted. Distribution of personally modified versions of the Font Software is not permitted. - -NO REDISTRIBUTION. You may not distribute the Font Software to third parties for the purposes of permitting the display of the Font Software or allowing or facilitating redistribution of the Font Software irrespective of the terms of the redistribution. For the purposes of clarity you are not permitted to embed the Font Software or otherwise bundle the Font Software with another file. All such uses require the purchase of a special license. - -LIMITATION OF LIABILITY. Except as may be otherwise provided for herein, the Font Software and related documentation is provided “AS IS” and without warranty of any kind and Licensor EXPRESSLY DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. LICENSOR DOES NOT WARRANT THAT THE OPERATION OF THE FONT SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT THE FONT SOFTWARE IS WITHOUT DEFECTS. THE FONT SOFTWARE IS NOT INTENDED AND WAS NOT DESIGNED OR MANUFACTURED FOR USE IN ANY CIRCUMSTANCES WHERE THE FAILURE OF THE FONT SOFTWARE COULD LEAD TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE. THE FONT SOFTWARE IS NOT FAULT TOLERANT AND IS NOT INTENDED FOR USE IN THE CONTROL OR OPERATION OF PROCESS CONTROL DEVICES OR EQUIPMENT FOR MANUFACTURING. EXCEPT AS PROVIDED IN SECTION 12, UNDER NO CIRCUMSTANCES SHALL LICENSOR BE LIABLE TO LICENSEE OR ANY OTHER PARTY, WHETHER IN CONTRACT OR TORT (INCLUDING NEGLIGENCE) OR OTHERWISE, FOR ANY SPECIAL, CONSEQUENTIAL, OR INCIDENTAL DAMAGES, INCLUDING LOST PROFITS, SAVINGS OR BUSINESS INTERRUPTION AS A RESULT OF THE USE OF THE FONT SOFTWARE EVEN IF NOTIFIED IN ADVANCE OF SUCH POSSIBILITY. Licensor’s liability to Licensee shall in no event exceed the cost of this Font Software License Agreement. - -COMPLIANCE WITH LAWS. Licensee shall be responsible for compliance with all laws, foreign and domestic, including but not limited to, all United States laws and regulations relating to the control of exports or the transfer of technology. - -ENTIRE AGREEMENT. This Agreement constitutes the entire understanding between the parties and supersedes all previous agreements, promises, representations and negotiations between the parties concerning the Font Software. - -GOVERNING LAW AND FORUM. The validity, construction, and performance of this agreement shall be governed by the laws of the State of New York without giving effect to its conflict of laws principles. Licensor and Licensee agree to settle all disputes, controversies, or claims relating to or arising from this Agreement in and specifically consent to personal jurisdiction of the state or federal district courts located in New York over any action arising out of or related to this Agreement. You agree that any breach of this License will cause irreparable harm to Licensor and that any damages are impossible to ascertain and that Licensor expressly shall be entitled to pursue equitable relief including, but not limited to, temporary restraining orders, and preliminary injunctions without the obligation of bond or other security in additions to other remedies under law. - -SEVERABILITY. If any provision of this Agreement is declared by a court of competent jurisdiction to be invalid, void or unenforceable, the remaining provisions of this Agreement shall continue in full force and effect, and the invalid provision shall be replaced by Licensor with a valid and enforceable provision that most closely effects the intent of the invalid provision. - -AUTHORIZED PARTIES. The parties, by their signatures or the downloading and installation of the Font Software represent that they are authorized to enter into this Agreement. diff --git a/css/font/input/README.txt b/css/font/input/README.txt deleted file mode 100644 index 6e95f6b..0000000 --- a/css/font/input/README.txt +++ /dev/null @@ -1,155 +0,0 @@ -INPUT -=============== - -Input is a font family designed for computer programming, data, and text composition. It was designed by David Jonathan Ross between 2012 and 2014 and published by The Font Bureau. It contains a wide array of styles so you can fine-tune the typography that works best in your editing environment. Beyond the 168 styles, there is also a command line tool that allows you to customize line-spacing and certain letterforms within the fonts. - -You can find more information about the fonts at [http://input.fontbureau.com]. - -Please note: The entire Input font family is available at no cost for private use, which includes uses on your own computer in plaintext and code. You must purchase inexpensive publishing licenses in order to use Input in print, on the web, or in any publishing context. - - * Web licenses: [http://www.webtype.com/font/input-family] - * Print/desktop licenses: [http://www.fontbureau.com/fonts/Input/styles] - -Both print/desktop and annual web licenses start at: - * US$5 per style - * US$40 for a 14-style package of one width of Sans, Serif, or Mono - * US$80 for a 56-style package of all widths of Sans, Serif, or Mono - * US$200 for the entire 168-style series - -Read the enclosed LICENSE.txt for more information, and learn more here: [http://input.fontbureau.com/download] - -Questions? Comments? Thoughts about coding typography? Feel free to get in touch: [input@fontbureau.com] - -If you’d like to support this project, please purchase a license. - -## INSTALLATION - -Follow the directions in INSTALL.txt. - -## FAMILIES - -Input Mono is a monospaced typeface, where all characters occupy a fixed width. Input Sans and Serif are proportional typefaces that are designed with all of the features of a good monospace — generous spacing, large punctuation, and easily distinguishable characters — but without the limitations of a fixed width. - -## WIDTHS - -Input comes in four widths: Normal, Narrow, Condensed, and Compressed. - -I generally tend towards the wider widths, though the narrower widths can be handy if you use a smaller screen, diff multiple files side-by-side, or if your code usually has long lines. I use Input Mono Compressed in my terminal. - -Input Mono Narrow approximates the copyfit of a 10-pitch font, and can be used as an alternative to Courier at the same size. - -## WEIGHTS - -Input comes in seven weights: Thin, Extra Light, Light, Regular, Medium, Bold, Black. - -The Light and Medium weights were designed to be only slightly lighter than Regular and Bold, so that they can appear to be a similar weight when used with light text on a dark background. However, on some operating systems (like Mac OS), a dark background color can cause such significant haloing that the Extra Light or Thin weights may be a better approximation. - -In Input’s proportional styles, the Thin, Extra Light, Light, and Regular weights all share the same setwidths, as do the Medium and Bold. - -## ITALICS - -Input’s Italics are always drawn on the same widths as the correspoding upright style. Input Serif’s Italics have an alternative serif arrangement, which makes them especially distinctive and useful when setting apart blocks of text. - -## SIZE - -These fonts are primarily intended for small sizes in subpixel-rendered environments. The design’s target size is 11px, but the core weights (Light, Regular, Medium, and Bold) can go anywhere from 9px to 16px, and are manually hinted to improve performance at small sizes across operating systems. The extreme weights (Thin, Extra Light, and Black) styles are intended for 16px+. For use at display sizes, I recommend applying negative tracking and reducing the wordspace. - -## COMBINING STYLES - -I can’t predict which styles will work best for you in which combinations, which is why I offer them all. There are plenty of ways that you can mix and match these styles. I have been experimenting with setting my code as follows: - - * Sans for keywords, variables, and text - * Serif for strings, tags, and values - * Mono for working in a Terminal, or while editing code that uses wordspaces/tabs for alignment - * Bold for class and function definitions - * Italic for comments, special words (like ‘this’ or ‘self’), and secondary languages (like CSS within an HTML document) - -## ALTERNATES - -Input allows you to use OpenType features or a command-line interface to select your preferred form of easily confusable characters: - - * Stylistic Set 01: Schoolbook a - * Stylistic Set 02: Schoolbook g - - * Stylistic Set 03: i with top serif (Sans and Mono only) - * Stylistic Set 04: l with top serif (Sans and Mono only) - - * Stylistic Set 05: i with top and bottom serif (Sans and Mono only) - * Stylistic Set 06: l with top and bottom serif (Sans and Mono only) - - * Stylistic Set 07: i with full serif (Sans only) - * Stylistic Set 08: l with full serif (Sans only) - - * Stylistic Set 09: i with top serif and tail (Sans and Mono only) - * Stylistic Set 10: l with top serif and tail (Sans and Mono only) - - * Stylistic Set 11: Mid-height asterisk - * Stylistic Set 12: Straight braces - - * Stylistic Set 13: Undotted square zero - * Slashed Zero ('zero') - -Here are some examples of how you can customize Input to mimic the arrangement of these characters in common fonts: - - * Andale Mono - * OpenType features: ss03, ss06 - * inputCustomize.py: --i=topserif --l=serifs - * Consolas - * OpenType features: ss07, ss08, zero - * inputCustomize.py: --i=serif --l=serif --zero=slash - * Menlo - * OpenType features: ss02, ss07, ss10, ss11, zero - * inputCustomize.py: --g=ss --i=serif --l=serifs_round --asterisk=height --zero=slash - * Monaco - * OpenType features: ss01, ss02, ss05, ss06, zero - * inputCustomize.py: --a=ss --g=ss --i=serifs --l=serifs --zero=slash - * Source Code Pro: - * OpenType features: ss03, ss10 - * inputCustomize.py: --i=topserif --l=serifs_round --asterisk=height - -See more examples at [http://input.fontbureau.com/preview]. - -## CUSTOMIZATION - -inputCustomize.py is a command-line python script that allows you to easily make adjustments to your fonts. It requires TTX/FontTools . - -My hope is that Input will encourage developers of source code editors to include better typographic support, so that these issues don’t need to be addressed in such a hacky way. - -### Alternates - -Since most coding applications don’t offer support of OpenType features, this tool will swap out default glyphs for their alternate forms. See description of the alternates above. - -### Hack for line-spacing - -Since many coding applications don’t include the option to adjust line-spacing, you can modify the built-in linespacing of the fonts. - -### Hack for four-style families - -Since most coding applications don’t allow you to use more than one four-style family, Input allows you to assemble arbitrary four-style families. I use this in order to combine Sans and Serif, by slotting InputSerif–Regular into the Bold Italic position. - -Font family “Input” - * Regular: Input Sans Regular - * Italic: Input Sans Italic - * Bold: Input Sans Bold - * Bold Italic: Input Serif Regular - -If you would like to use multiple families at the same time, you can use the --suffix parameter to add a short suffix to Input’s menu names, which can help you distinguish different versions. - -### Examples - -You can use inputCustomize.py like this to work on all fonts in the current working directory: - - $ cd /path/to/the/fonts/you/want/to/edit - $ python /path/to/inputCustomize.py --dest=/path/to/output --lineHeight=1.5 --fourStyleFamily --a --g --i=topserif --l=serifs_round --zero --asterisk - -Or like this, to create a family out of any four styles: - - $ python /path/to/inputCustomize.py InputSans-Regular.ttf InputSans-Italic.ttf InputSans-Bold.ttf InputSerif-Regular.ttf --suffix=Hack --fourStyleFamily --a - -For more details, see the script’s help: - - $ python /path/to/inputCustomize.py -h - -## SPECIAL THANKS - -All typefaces I work on are collaborations, but this typeface especially benefitted from the feedback and advice of a large number of people. I’d like to thank all of Input’s beta testers who tried it on for size; Maria Doreuli, who consulted with me on the Cyrillic; Matthew Butterick, who gave helpful advice as a coder and as typeface designer; the folks at Paratype, who made the hinting of this massive family possible; Frank Grießhammer, who wrote the excellent box drawing character generator and suggested the Thin weights; and finally my coworkers who all played a role in making this typeface happen: David Berlow, Sam Berlow, Petr van Blokland, Paley Dreier, CJ Dunn, Cyrus Highsmith, Indra Kupferschmid, Chris Lewis, André Mora, Jill Pichotta, and Nick Sherman. Thank you so much. – David Jonathan Ross \ No newline at end of file diff --git a/css/font/input/Scripts/_template_Bold.txt b/css/font/input/Scripts/_template_Bold.txt deleted file mode 100644 index 3db6755..0000000 Binary files a/css/font/input/Scripts/_template_Bold.txt and /dev/null differ diff --git a/css/font/input/Scripts/_template_BoldItalic.txt b/css/font/input/Scripts/_template_BoldItalic.txt deleted file mode 100644 index d665af1..0000000 Binary files a/css/font/input/Scripts/_template_BoldItalic.txt and /dev/null differ diff --git a/css/font/input/Scripts/_template_Italic.txt b/css/font/input/Scripts/_template_Italic.txt deleted file mode 100644 index 2d7828e..0000000 Binary files a/css/font/input/Scripts/_template_Italic.txt and /dev/null differ diff --git a/css/font/input/Scripts/_template_Regular.txt b/css/font/input/Scripts/_template_Regular.txt deleted file mode 100644 index 86d9766..0000000 Binary files a/css/font/input/Scripts/_template_Regular.txt and /dev/null differ diff --git a/css/font/input/Scripts/inputCustomize.py b/css/font/input/Scripts/inputCustomize.py deleted file mode 100644 index daaf2cb..0000000 --- a/css/font/input/Scripts/inputCustomize.py +++ /dev/null @@ -1,275 +0,0 @@ -#!/usr/bin/env python2.6 -# -*- coding: utf-8 -*- - -# Thanks to Jonas Kjellström and Cody Boisclair for their help in finding bugs in this script! - -import re -import os -import sys -import tempfile -from fontTools.ttLib import TTFont, newTable -from fontTools.ttLib.xmlImport import importXML - -doc = """USAGE: python /path/to/inputCustomize.py [INPUT] [--dest=OUTPUT] [OPTIONS] -Use this script to customize one or more Input font files. -Requires TTX/FontTools: - -If INPUT is missing, it will customize all fonts in the Current Working Directory. -If OUTPUT is missing, it will overwrite the INPUT files. - -Options: - -h, --help Print this help text, and exit. - --lineHeight= A multiplier for the font's built-in line-height. - --fourStyleFamily Only works when four INPUT files are provided. - Assigns Regular, Italic, Bold, and Bold Italic names to the - INPUT fonts in the order provided. - --suffix= Append a suffix to the font names. Takes a string with no spaces. - --a=ss Swaps alternate single-story 'a' for the default double-story 'a' - --g=ss Swaps alternate single-story 'g' for the default double-story 'a' - --i=serif Swaps one of the alternate 'i' for the default in Sans/Mono - serifs - serifs_round - topserif - --l=serif Swaps one of the alternate 'l' for the default in Sans/Mono - serifs - serifs_round - topserif - --zero=slash Swaps the slashed zero for the default dotted zero - nodot Swaps a dotless zero for the default dotted zero - --asterisk=height Swaps the mid-height asterisk for the default superscripted asterisk - --braces=straight Swaps tamer straight-sided braces for the default super-curly braces - - Example 1: - $ cd /path/to/the/top/level/of/the/fonts/you/want/to/edit - $ python /path/to/InputCustomize.py --dest=/path/to/output --lineHeight=1.5 --suffix=Hack --fourStyleFamily --a=ss --g=ss --i=topserif --l=serifs_round --zero=slash --asterisk=height - - Example 2: - $ cd /path/to/the/top/level/of/the/fonts/you/want/to/edit - $ python /path/to/InputCustomize.py InputSans-Regular.ttf InputSans-Italic.ttf InputSans-Bold.ttf InputSerif-Regular.ttf --suffix=Hack --fourStyleFamily -""" - -class InputModifier(object): - """ - An object for manipulating Input, takes a TTFont. Sorry this is a little hacky. - """ - - def __init__(self, f): - self.f = f - - def changeLineHeight(self, lineHeight): - """ - Takes a line height multiplier and changes the line height. - """ - f = self.f - baseAsc = f['OS/2'].sTypoAscender - baseDesc = f['OS/2'].sTypoDescender - multiplier = float(lineHeight) - f['hhea'].ascent = round(baseAsc * multiplier) - f['hhea'].descent = round(baseDesc * multiplier) - f['OS/2'].usWinAscent = round(baseAsc * multiplier) - f['OS/2'].usWinDescent = round(baseDesc * multiplier)*-1 - - def swap(self, swap): - """ - Takes a dictionary of glyphs to swap and swaps 'em. - """ - f = self.f - glyphNames = f.getGlyphNames() - maps = { - 'a': {'a': 97, 'aring': 229, 'adieresis': 228, 'acyrillic': 1072, 'aacute': 225, 'amacron': 257, 'agrave': 224, 'atilde': 227, 'acircumflex': 226, 'aogonek': 261, 'abreve': 259}, - 'g': {'gdotaccent': 289, 'gbreve': 287, 'gcircumflex': 285, 'gcommaaccent': 291, 'g': 103}, - 'i': {'i': 105, 'iacute': 237, 'iogonek': 303, 'igrave': 236, 'itilde': 297, 'icircumflex': 238, 'imacron': 299, 'ij': 307, 'ibreve': 301, 'yicyrillic': 1111, 'idieresis': 239, 'icyrillic': 1110}, - 'l': {'l': 108, 'lcaron': 318, 'lcommaaccent': 316, 'lacute': 314, 'lslash': 322, 'dotlessi': 305, 'ldot': 320}, - 'zero': {'zero': 48}, - 'asterisk': {'asterisk': 42}, - 'braces': {'braceleft': 123, 'braceright': 125} - } - swapMap = {} - for k, v in swap.items(): - for gname, u in maps[k].items(): - newGname = gname + '.salt_' + v - if newGname in glyphNames: - swapMap[gname] = newGname - for table in f['cmap'].tables: - cmap = table.cmap - for u, gname in cmap.items(): - if swapMap.has_key(gname): - cmap[u] = swapMap[gname] - - def fourStyleFamily(self, position, suffix=None): - """ - Replaces the name table and certain OS/2 values with those that will make a four-style family. - """ - f = self.f - source = TTFont(fourStyleFamilySources[position]) - - tf = tempfile.mkstemp() - pathToXML = tf[1] - source.saveXML(pathToXML, tables=['name']) - os.close(tf[0]) - - with open(pathToXML, "r") as temp: - xml = temp.read() - - # make the changes - if suffix: - xml = xml.replace("Input", "Input" + suffix) - - # save the table - with open(pathToXML, 'w') as temp: - temp.write(xml) - temp.write('\r') - - f['OS/2'].usWeightClass = source['OS/2'].usWeightClass - f['OS/2'].fsType = source['OS/2'].fsType - - # write the table - f['name'] = newTable('name') - importXML(f, pathToXML) - - def changeNames(self, suffix=None): - # this is a similar process to fourStyleFamily() - - tf = tempfile.mkstemp() - pathToXML = tf[1] - f.saveXML(pathToXML, tables=['name']) - os.close(tf[0]) - - with open(pathToXML, "r") as temp: - xml = temp.read() - - # make the changes - if suffix: - xml = xml.replace("Input", "Input" + suffix) - - # save the table - with open(pathToXML, 'w') as temp: - temp.write(xml) - temp.write('\r') - - # write the table - f['name'] = newTable('name') - importXML(f, pathToXML) - - - - - -baseTemplatePath = os.path.split(__file__)[0] -fourStyleFamilySources = [ - os.path.join(baseTemplatePath, '_template_Regular.txt'), - os.path.join(baseTemplatePath, '_template_Italic.txt'), - os.path.join(baseTemplatePath, '_template_Bold.txt'), - os.path.join(baseTemplatePath, '_template_BoldItalic.txt'), -] - -fourStyleFileNameAppend = [ 'Regular', 'Italic', 'Bold', 'BoldItalic' ] - -if __name__ == "__main__": - - # Get command-line arguments - go = True - arguments = sys.argv[1:] - paths = [] - swap = {} - lineHeight = None - fourStyleFamily = None - suffix = None - destBase = None - - - # parse arguments - for argument in arguments: - key = None - value = None - if len(argument.split('=')) == 2: - key, value = argument.split('=') - key = key[2:] - elif argument[0:2] == '--': - key = argument[2:] - value = True - elif argument == '-h': - print doc - go = False - else: - key = argument - value = None - # assign preference variables - if value is None: - paths.append(key) - elif key == 'lineHeight': - lineHeight = value - elif key == 'fourStyleFamily': - fourStyleFamily = True - elif key == 'suffix': - suffix = value - elif key == 'dest': - destBase = value - elif key == 'help': - print doc - go = False - else: - swap[key] = value - - # account for arguments where no value is given (for example, '--a' instead of '--a=ss') - if swap.get('a') is True: - swap['a'] = 'ss' - if swap.get('g') is True: - swap['g'] = 'ss' - if swap.get('i') is True: - swap['i'] = 'serifs' - if swap.get('l') is True: - swap['l'] = 'serifs' - if swap.get('zero') is True: - swap['zero'] = 'slash' - if swap.get('asterisk') is True: - swap['asterisk'] = 'height' - if swap.get('braces') is True: - swap['braces'] = 'straight' - - - # if specific paths were not supplied, collect them from the current directory - if not paths: - for root, dirs, files in os.walk(os.getcwd()): - for filename in files: - basePath, ext = os.path.splitext(filename) - if ext in ['.otf', '.ttf']: - paths.append(os.path.join(root, filename)) - - # if four paths were not supplied, do not process as a four-style family - if len(paths) != 4: - fourStyleFamily = None - - if go: - for i, path in enumerate(paths): - print os.path.split(path)[1] - f = TTFont(path) - c = InputModifier(f) - if lineHeight: - c.changeLineHeight(lineHeight) - if swap: - c.swap(swap) - if fourStyleFamily: - c.fourStyleFamily(i, suffix) - base, ext = os.path.splitext(path) - path = base + '_as_' + fourStyleFileNameAppend[i] + ext - elif suffix: - c.changeNames(suffix) - if destBase: - baseScrap, fileAndExt = os.path.split(path) - destPath = os.path.join(destBase, fileAndExt) - else: - destPath = path - try: - os.remove(destPath) - except: - pass - - # Take care of that weird "post" table issue, just in case. Delta#1 - try: - del f['post'].mapping['Delta#1'] - except: - pass - - f.save(destPath) - print 'done' diff --git a/css/main.css b/css/main.css index aff1125..64003fc 100644 --- a/css/main.css +++ b/css/main.css @@ -1,14 +1,61 @@ -*, body, li, ul, table, td, ul, ol, dt, dd { +body { /*background: rgb(240,255,255);*/ - background: rgb(245,255,255); + background: rgb(245, 255, 255); /*color: rgba(95,95,95, 0.8);*/ - color: rgba(30,30,30, 0.7); + color: rgba(30, 30, 30, 0.7); font-family: 'helvetica', sans-serif; font-weight: 400; line-height: 1.4em; /*letter-spacing: -0.05em;*/ } +table.dataRows { + /* This makes highlighted table rows be a single area, instead of being separated column-fields. */ + border-collapse: collapse; + width: 100%; +} + +table.dataRows th { + padding-top: 12px; + padding-bottom: 12px; + text-align: left; + background-color: rgb(150, 200, 255); +} + +table.dataRows td, table.dataRows th { + border-right: 1px dashed lightgray; + padding: 8px; +} + +table.dataRows td:last-child, #indexTable th:last-child { + border-right: none; +} + +table.dataRows tr:last-child td { + border-bottom: none; +} + +table.dataRows tr:nth-child(even) { + background-color: rgb(235, 255, 255); +} + +table.dataRows tr:nth-child(odd) { + background-color: rgb(215, 255, 255); +} + +/* Highlights link targets: The tag with the id set to the part of the URL after the '#'. */ +table.dataRows tr:target { + animation: flashTableRow 2s linear; +} + +@keyframes flashTableRow { + 50% { background: rgb(255, 255, 50) } +} + +.paddingBetweenRows td { + padding: 0 15px 0 15px; +} + body, div { padding: 0; margin: 0; @@ -64,7 +111,7 @@ pre { div.page { margin: auto auto; padding: 4em; - //width: 750px; + /*width: 750px;*/ } div.header { diff --git a/debug.html b/debug.html index ff7d9df..f43a29e 100644 --- a/debug.html +++ b/debug.html @@ -15,121 +15,140 @@

    Debugging and panics

    -

    Similarly to other languages like Go, Escher has two mechanisms for -debugging programs: panic traces and user-controlled code instrumentation. +

    Similarly to other languages, like Go, +Escher has two mechanisms for debugging programs. -

    Panic traces

    +

    1. Panic traces

    There are two ways in which a running Escher program can panic: -

      +
      1. While a reflex is processing an incoming event in a Cognize method, or
      2. During materialization of a program circuit which is invalid.
      3. -
    +

    In both cases, two types of “traces” will be printed out automatically before the process exits. -One of these traces is the standard Go stack trace. This is useful to pin-point the location in the -Go implementation of a reflex where the panic occurs, in the event of panics occuring in Cognize -methods. The Go stack trace, however, will not reflect the materialization path that lead to the -creation of the problematic reflex. This is reflected by the second type of trace, which we demonstrate -by example. - -

    Consider the following toy Escher program: - -

    -{
    -	*Show = "Parent circuit"
    -
    -	m *escher.QuickMaterialize
    -	m:Residue = *Ignore
    -	m:Index = *escher.Index
    +One of these traces is the standard Go stack trace.
    +This is useful to pin-point the location in the Go implementation of a reflex where the panic occurs,
    +in the event of panics occurring in Cognize methods.
    +The Go stack trace, however, will not reflect the materialization path
    +that lead to the creation of the problematic reflex.
    +This is reflected by the second type of trace,
    +which we demonstrate by example.
    +
    +

    Consider +the following toy Escher program: + +

    +Debug {
    +	*e.Show = "Parent circuit"
    +
    +	m *e.QuickMaterialize
    +	m:Residue = *e.Ignore
    +	m:Index = *e.Index
     	m:Program = {
    -		*escher.Breakpoint = 1
    +		*e.Breakpoint = 1
     	}
     }
     
    -

    This program will first materialize the inner program, which in turn will send the constant 1 -to the breakpoint reflex, causing it to panic. In other words, an outer circuit materializes an inner circuit -and subsequnetly a panic occurs in the inner circuit. The goal of the Escher trace is to reflect that. +

    This program will first materialize the inner program, +which in turn will send the constant 1 to the breakpoint reflex, +causing it to panic. +In other words, an outer circuit materializes an inner circuit, +and subsequently a panic occurs in the inner circuit. +The goal of the Escher trace is to reflect that. + +

    When run with: + +

    +src_dir="$GOPATH/src/github.com/gocircuit/escher/src/"
    +escher -src "$src_dir" "*tutorial.Debug"
    +
    + The following Escher trace will be printed:
     BASIS(:)
    -DIRECTIVE(:) *escher.Breakpoint/*escher.Breakpoint
    +DIRECTIVE(:) *e.Breakpoint/*e.Breakpoint
     CIRCUIT() {
    -        0 *escher.Breakpoint
    -        1 1
    -        0: = 1:
    +		0 *e.Breakpoint
    +		1 1
    +		0: = 1:
     }
     MATERIALIZE() {
    -        0 *escher.Breakpoint
    -        1 1
    -        0: = 1:
    +		0 *e.Breakpoint
    +		1 1
    +		0: = 1:
     }
     BASIS(:Residue :View)
    -DIRECTIVE(:Residue :View) *escher.Materialize/*escher.Materialize
    +DIRECTIVE(:Residue :View) *e.Materialize/*e.Materialize
     CIRCUIT(:Index :Program :Residue) {
    -        x *escher.Materialize
    -        y *Fork
    -        :Residue = x:Residue
    -        :Index = y:Index
    -        :Program = y:Program
    -        x:View = y:
    +		x *e.Materialize
    +		y *e.Fork
    +		:Residue = x:Residue
    +		:Index = y:Index
    +		:Program = y:Program
    +		x:View = y:
     }
    -DIRECTIVE(:Index :Program :Residue) *escher.QuickMaterialize/*escher.QuickMaterialize
    +DIRECTIVE(:Index :Program :Residue) *e.QuickMaterialize/*e.QuickMaterialize
     CIRCUIT() {
    -        m *escher.QuickMaterialize
    -        0 *Show
    -        1 "Parent circuit"
    -        2 *Ignore
    -        3 *escher.Index
    -        4 {
    -                0 *escher.Breakpoint
    -                1 1
    -                0: = 1:
    -        }
    -        0: = 1:
    -        m:Program = 4:
    -        m:Residue = 2:
    -        m:Index = 3:
    +		m *e.QuickMaterialize
    +		0 *e.Show
    +		1 "Parent circuit"
    +		2 *e.Ignore
    +		3 *e.Index
    +		4 {
    +				0 *e.Breakpoint
    +				1 1
    +				0: = 1:
    +		}
    +		0: = 1:
    +		m:Program = 4:
    +		m:Residue = 2:
    +		m:Index = 3:
     }
     DIRECTIVE() *tutorial.Debug/*tutorial.Debug
     MATERIALIZE() *tutorial.Debug
     MAIN()
     
    -

    Escher traces consist of frames, indicated by capital letters. Frames correspond to -reflexes (basis or derivative) or directives. They are listed in most-specific to least-specific -order: The first frame corresponds to the problematic reflex, whereas the last one corresponds -to the main circuit being materialized. +

    Escher traces consist of frames, indicated by capital letters. +Frames correspond to reflexes (basis or derivative) or directives. +They are listed in most-specific to least-specific order: +The first frame corresponds to the problematic reflex, +whereas the last one corresponds to the main circuit being materialized. -

    Since every frame corresponds to a reflex that is materialized, a list of valves connected -to this reflex is given in brackets next to the frame name. Following the brackets is a frame -argument whose meaning depends on the type of frame: +

    Since every frame corresponds to a reflex that is materialized, +a list of valves connected to this reflex is given in brackets next to the frame name. +Following the brackets is a frame argument whose meaning depends on the type of frame:

    • MAIN marks the start of the Escher runtime. -
    • MATERIALIZE frames mark the beginning of materialization. The argument of such frames -describe the program that is being materialized. +
    • MATERIALIZE frames mark the beginning of materialization. + The argument of such frames describe the program that is being materialized.
    • DIRECTIVE frames indicate that a directive gate value is being resolved. -The argument equals the source of the directive, followed by the computed fully-qualified -source of directive (in case the directive uses local addressing). -
    • CIRCUIT frames indicate that a program circuit is being materialized. Their -argument equals the circuit source. + The argument equals the source of the directive, + followed by the computed, fully-qualified source of directive + (in case the directive uses local addressing). +
    • CIRCUIT frames indicate that a program circuit is being materialized. + Their argument equals the circuit source.
    • BASIS frames indicate that a basis reflex is being materialized.
    • NOUN frames indicate that a noun reflex is being materialized.
    -

    Instrumentation reflexes

    +

    2. Instrumentation reflexes

    -

    In many lanuages the simplest instrumentation technique is the insertion of “printf” -statements. Escher has its own analog. Given a link in a circuit program, the idea is to print out -the values that flow through that link without otherwise affecting the execution of the program. +

    In many languages, the simplest instrumentation technique +is the insertion of “printf” statements. +Escher has its own analog. +Given a link in a circuit program, +the idea is to print out the values that flow through that link +without otherwise affecting the execution of the program. -

    This is accomplished with the use of a *Show reflex, which simply lets values -pass through it while printing them on standard error together with the name of the valve they -were received on. +

    This is accomplished with the use of a *e.Show reflex, +which simply lets values pass through it while printing them on standard error +together with the name of the valve they were received on.

    Suppose the following program is to be debugged: @@ -141,14 +160,14 @@

    Instrumentation reflexes

    }
    -

    We could then add a debug *Show reflex to “eavesdrop” on the link +

    We could then add a debug *e.Show reflex to “eavesdrop” on the link from source to sink, like so:

     {
     	source *Source
     	sink *Sink
    -	eve *Show
    +	eve *e.Show
     	source: = eve:Source
     	eve:Sink = sink:
     }
    @@ -159,7 +178,7 @@ 

    Instrumentation reflexes

    diff --git a/generate.sh b/generate.sh new file mode 100755 index 0000000..0e04587 --- /dev/null +++ b/generate.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# *nix script to generate the HTML handbook +# from the sources in "github.com/gocircuit/escher/src/handbook". + +commit="false" +if [ "$1" = "-c" ] +then + commit="true" +fi + +escher_repo="$GOPATH/src/github.com/gocircuit/escher" +src_dir="$escher_repo/src" +scripts_dir="$escher_repo/scripts" + +# Generate the static HTML pages +"${scripts_dir}/build_handbook.sh" "./" + +# Create a git commit, if requested, and if there are local changes +local_changes=$(git status --porcelain) +if [ "$commit" = "true" -a "$local_changes" != "" ] +then + echo "Committing ..." + git add --all + branch_name=$(cd "$escher_repo" ; git rev-parse --abbrev-ref HEAD) + remote_and_branch_name=$(cd "$escher_repo" ; git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) + commit_description=$(cd "$escher_repo" ; git describe --tags --always) + #commit_date=$(cd "$escher_repo" ; git log -1 --format="%at" | xargs -I{} date -d @{} +"%d. %B %Y %H:%M:%S") + commit_date=$(cd "$escher_repo" ; git log -1 --format="%at" | xargs -I{} date -d @{} +"%d. %B %Y") + #commit_time=$(cd "$escher_repo" ; git log -1 --format="%at" | xargs -I{} date -d @{} +"%H:%M:%S") + git commit --quiet --message "latest as of $commit_date, generated from $remote_and_branch_name $commit_description" && \ + git push --quiet && \ + echo "Pushed!" || \ + echo "Failed!" +fi + diff --git a/glossary.html b/glossary.html new file mode 100644 index 0000000..0c8f6d1 --- /dev/null +++ b/glossary.html @@ -0,0 +1,484 @@ + + + + + Escher - Explanation of important words + + + +
    + Escher A language for connecting technologies using pure metaphors +
    + +
    + + +

    Explanation of important words

    + +

    Gate statements begin on a new line with a gate name identifier, space, and a gate value expression. + There are six value types that can be expressed: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WordAlternative WordsMeaningSyntaxExampleExplanation
    Address--- + rootFaculty.parentFac.childFac.theGate
    + TODO or is it "topMostGate.lowerGate.lowestGate" ?
    + I think it is the first one, + but what is the second one? or is it an address too?
    + I guess it is practically simply never used/required. +
    + The fully qualified path to a gate, relative to a certain Index. + An address is represented by series circuits. +
    Circuit-meaningsyntax + A simple circuit called Nand, + with 2 gates and 4 links: +
    +Nand {
    +	and *binary.And
    +	not *binary.Not
    +
    +	and:X = :X
    +	and:Y = :Y
    +	and:XAndY = not:Z
    +	not:NotZ = :
    +}
    +			
    +
    + A circuit is the central unit of declaration in Escher. + It specifies gates and links + immediately contained within that (class of) circuit + (no gates or links outside or inside its own gates). +
    Default Valve + gateX: (vector on gate gateX with the default valve)
    + : (vector on the super gate with the default valve) +
    + The valve denoted by the empty string "".
    + You may think of it as the default input/output of a circuit.
    + It has not special logic within Escher, other then not requiring to be named in code. +
    Directive-meaning- + materialize: + *fully.qualified.Name
    + recall: + @fully.qualified.Name +
    + A combination of a verb and an address.
    + It means:
    + "Do 'verb' with 'address'." +
    Facultypackage?meaning-- + Eschers word for a namespace; a group of escher source files in a single directory, + respectively the circuits therein. +
    Flow---- + XXX (A synonym for Link?)
    + TODO Should probably be renamed to Link
    + See the go code of the circuit struct at + circuit/circuit.go. +
    GateMembrane?
    Brane?
    -syntax + A circuit with 7 gates: +
    +alpha {
    +	directive1 *fully.qualified.Name
    +	directive2 @fully.qualified.Name
    +	integral   123
    +	floating   3.14
    +	complex    (1-3i)
    +	quoted     "abcd\n\tefgh"
    +	backQuoted 
    +}
    +			
    +
    + An instantiation of a circuit inside an other circuit.
    + Gates are the nodes of an Escher circuit, if interpreted as a graph.
    + They are connected to each other by creating links between their valves. +
    Index-meaning- + This exemplifies part of a typical index: +
    +{
    +	e {
    +		Alt (be.Materializer)
    +		Alternate (be.Materializer)
    +		Breakpoint (be.Materializer)
    +		Fork (be.Materializer)
    +		Grow (be.Materializer)
    +		Help (be.Materializer)
    +		Ignore (be.Materializer)
    +		...
    +	}
    +	element {
    +		Docker (be.Materializer)
    +		Process (be.Materializer)
    +	}
    +	...
    +}
    +			
    +
    + An Escher index is a tree circuit, + which we interpret as a an list containing the addresses to all gates. +
    Map-meaning- +
    +ImplicitIntMap {
    +	*fully.qualified.Name
    +	123
    +	3.14
    +}
    +
    +ExplicitIntMap {
    +	3   *fully.qualified.Name
    +	6   @fully.qualified.Name
    +	1   123
    +}
    +
    +StringMap {
    +	directive  *fully.qualified.Name
    +	integral   123
    +	floating   3.14
    +}
    +
    +MixedMap {
    +	directive  *fully.qualified.Name
    +	1          123
    +	2          3.14
    +}
    +			
    +
    + A circuit with the limitation that it has no links.
    + While we might think of a general circuit more of as a set of instructions plus data, + a map is rather purely data.
    + It maps keys of type int or string to arbitrary values, + quite like maps in other programming languages. +
    materialize--- + *fully.qualified.Name
    + or
    +
    +*{
    +	fully
    +	qualified
    +	Name
    +}
    +			
    +
    TODO
    Name---- + The name part of a gate. + Each gate is comprised of a name and a value. + A name can be any string without spaces, + but in practise you probably want to limit it more, + say to a common definition of a variable name as found in many other languages, + for example using the regex: [a-zA-Z0-9_]+ +
    Programrunnable?, executable circuit?meaning- + See any of the *Main circuits in the + Escher tutorials + Programs are circuits that describe executable systems.
    recall--- + @fully.qualified.Name
    + or
    +
    +@{
    +	fully
    +	qualified
    +	Name
    +}
    +			
    +
    TODO
    Seriesmeaningsyntax + implicit series: +
    +alpha {
    +	*fully.qualified.Name
    +	@fully.qualified.Name
    +	123
    +	3.14
    +	(1-3i)
    +	"abcd\n\tefgh"
    +	
    +	{
    +		A 1
    +		B "C"
    +	}
    +}
    +			
    + + which is equivalent to this explicit series: + +
    +alpha {
    +	0 *fully.qualified.Name
    +	1 @fully.qualified.Name
    +	2 123
    +	3 3.14
    +	4 (1-3i)
    +	5 "abcd\n\tefgh"
    +	6 
    +	7 {
    +		A 1
    +		B "C"
    +	}
    +}
    +			
    +
    + A series is a map with the additional restrictions that:
    +
      +
    • it can only have int names
    • +
    • the names have to form a consecutive series, starting from 0
    • +
    + They are an analogue to arrays in other languages. +
    Super Gatesuper-membrane
    super-brane
    -- + :valveNo3 (vector with valve valveNo3 on the super gate)
    + : (vector with default valve on the super gate) +
    + The empty-string named gate is called the super gate.
    + While one cannot assign a value to it through syntax, it is possible to connect links to it. + +

    When materializing, + the links connected to the super gate are exposed to the higher-level/enclosing/“super” circuit. +

    Tree-meaning- +
    +Tree {
    +	Trunk {
    +		Branches {
    +			"Johnny"
    +			"Katie"
    +		}
    +	}
    +	Root {
    +		Tentacles {
    +			"Grandpa"
    +			"Grandma"
    +		}
    +	}
    +}
    +			
    +
    + A recursive structure of maps, + where maps can contain other maps. +
    Value--- +
    +SomeCircuit {
    +	directive1 *fully.qualified.Name
    +	directive2 @fully.qualified.Name
    +	integral   123
    +	floating   3.14
    +	complex	(1-3i)
    +	quoted	 "abcd\n\tefgh"
    +	backQuoted 
    +}
    +			
    +
    + The value part of a gate. + Each gate is comprised of a name and a value.
    + FIXME Some point of the documentation says, the value cna be any Go value, while an other part states, + that it can be one of Integer, Float, complex-number, string, directive or circuit. Both can't be true. +
    ValveI/O whole/connector--- + An input and-or output "connector" between the inside and the outside of a gate. + It has a unique name within the circuit it is declared. + It can be connected to at most one other valve (of the same gate or an other) + using a link. +
    Vectorvalve-ID?-- + gateX:valveNo3
    + :valveNo3
    + gateX:
    + : +
    + A qualified valve, consisting of a gate-name + and one of its valves names, separated with a ":".
    + If the gate is being omitted, the vector refers to the super gte.
    + If the valve is being omitted, the vector refers to the default valve. +
    Verbinstruction?-- + *
    or
    @ +
    + Can be either "*" (materialize) + or "@" (recall), + and is the first part of a directive. +
    + + + + +

    + + + + + + \ No newline at end of file diff --git a/img/NAND.png b/img/NAND.png index 9815306..73135f7 100644 Binary files a/img/NAND.png and b/img/NAND.png differ diff --git a/img/circuit-instances-plain-generated.svg b/img/circuit-instances-plain-generated.svg new file mode 100644 index 0000000..2529fd5 --- /dev/null +++ b/img/circuit-instances-plain-generated.svg @@ -0,0 +1,1163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/circuit-instances.png b/img/circuit-instances.png new file mode 100644 index 0000000..766463f Binary files /dev/null and b/img/circuit-instances.png differ diff --git a/img/circuit-parts-plain-generated.svg b/img/circuit-parts-plain-generated.svg new file mode 100644 index 0000000..b60b941 --- /dev/null +++ b/img/circuit-parts-plain-generated.svg @@ -0,0 +1,1163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/circuit-parts.png b/img/circuit-parts.png new file mode 100644 index 0000000..d5167cc Binary files /dev/null and b/img/circuit-parts.png differ diff --git a/img/circuit-raw-plain-generated.svg b/img/circuit-raw-plain-generated.svg new file mode 100644 index 0000000..cf2955d --- /dev/null +++ b/img/circuit-raw-plain-generated.svg @@ -0,0 +1,1163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/circuit-raw.png b/img/circuit-raw.png new file mode 100644 index 0000000..e601ce9 Binary files /dev/null and b/img/circuit-raw.png differ diff --git a/img/circuit.png b/img/circuit.png new file mode 100644 index 0000000..ef8c3e9 Binary files /dev/null and b/img/circuit.png differ diff --git a/img/circuit.svg b/img/circuit.svg new file mode 100644 index 0000000..bd03ac2 --- /dev/null +++ b/img/circuit.svg @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Circuit Valves + (= Membranes) + Gates + Links external external internal + + :valve3 + gate2:valve1 + gate3:valve2 + : + gate3 gate2 gate1 gate2:valve1 = gate3:valve2 + "" gate2:valve3 = :valve3 + : = gate1:valve1 + + + diff --git a/img/cloud.png b/img/cloud.png index 140ee0b..09dd589 100644 Binary files a/img/cloud.png and b/img/cloud.png differ diff --git a/img/expanded.png b/img/expanded.png index 097c96f..8c97a3a 100644 Binary files a/img/expanded.png and b/img/expanded.png differ diff --git a/img/expanded.svg b/img/expanded.svg index 56be2ac..ab29c5d 100644 --- a/img/expanded.svg +++ b/img/expanded.svg @@ -1,4 +1,4 @@ - + diff --git a/img/flattened.png b/img/flattened.png index 506f982..46fc3a1 100644 Binary files a/img/flattened.png and b/img/flattened.png differ diff --git a/img/flattened.svg b/img/flattened.svg index 8e0b5b6..c91c2e6 100644 --- a/img/flattened.svg +++ b/img/flattened.svg @@ -1,4 +1,4 @@ - + diff --git a/img/reflex.jpg b/img/reflex.jpg deleted file mode 100644 index 2a42107..0000000 Binary files a/img/reflex.jpg and /dev/null differ diff --git a/img/reflex.png b/img/reflex.png new file mode 100644 index 0000000..30faa53 Binary files /dev/null and b/img/reflex.png differ diff --git a/img/reflex.svg b/img/reflex.svg new file mode 100644 index 0000000..4ae3502 --- /dev/null +++ b/img/reflex.svg @@ -0,0 +1,159 @@ + + + + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/scanprint.png b/img/scanprint.png index ce2aff8..e49be28 100644 Binary files a/img/scanprint.png and b/img/scanprint.png differ diff --git a/img/telescope.png b/img/telescope.png index 94c1d11..8f1dbca 100644 Binary files a/img/telescope.png and b/img/telescope.png differ diff --git a/img/telescope.svg b/img/telescope.svg index 962aaf2..337ff71 100644 --- a/img/telescope.svg +++ b/img/telescope.svg @@ -1,4 +1,4 @@ - + diff --git a/img/tkr.jpg b/img/tkr.jpg deleted file mode 100644 index 8026f30..0000000 Binary files a/img/tkr.jpg and /dev/null differ diff --git a/img/tkr.png b/img/tkr.png new file mode 100644 index 0000000..a546ffe Binary files /dev/null and b/img/tkr.png differ diff --git a/img/tkr.svg b/img/tkr.svg new file mode 100644 index 0000000..e65e439 --- /dev/null +++ b/img/tkr.svg @@ -0,0 +1,204 @@ + + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index d87ebb5..da0594c 100644 --- a/index.html +++ b/index.html @@ -12,50 +12,61 @@
    -

    Escher language

    +

    Escher programming language

    -

    Web pages and links form a graph. Datacenter computers and cables form a graph. -Application processes and connections form a graph. Facebook users and -friendships form a graph. Facebook groups and memberships form a graph. -Neurons and synapses form a graph. Threads and shared data structures form a graph. +

    Motivation

    + +

    Web pages and links form a graph. +Data-center computers and cables form a graph. +Application processes and connections form a graph. +Facebook users and friendships form a graph. +Facebook groups and memberships form a graph. +Neurons and synapses form a graph. +Threads and shared data structures form a graph. Processes and sockets form a graph.

    Not only are all of the above situations visually described by graphs, but also their essential behavior (as best as we understand it) is the same in all cases: -Independent processing units, pairwise-interlinked by sequential channels—both channels -and processors emerging and disappearing asynchronously. +They are comprised of independent processing units, +which are pairwise-interlinked by sequential channels, +while both channels and processors are emerging and disappearing asynchronously.

    Three decades ago, before the above examples were within practical reach, -a British gentleman—named Tony -Hoare—had noticed that this essential behavior was exhibited by virtually -all identifiable interacting physical (as well as man-made abstract) entities: People interacting with people, -people interacting with vending machines, components of vending -machines interacting with each other, animals interacting with animals, -cells interacting with cells, proteins interacting with proteins, and so on. - -

    He called this high-level behavioral model of the world (or discernable subsystems thereof) +a British gentleman — named Tony +Hoare — had noticed that this essential behavior was exhibited by virtually +all identifiable interacting physical (as well as man-made abstract) entities: +People interacting with people, +people interacting with vending machines, +components of vending machines interacting with each other, +animals interacting with animals, +cells interacting with cells, +proteins interacting with proteins, +and so on. + +

    He called this high-level behavioral model of the world (or discernible subsystems thereof) Communicating Sequential Processes. Hoare's model is nothing more and nothing less than a minimal abstraction of how -we see and understand (and subsequently will to control) the world from an -observer—i.e. third person—point of view. +we see and understand (and subsequently will to control) the world +from an observer — i.e. third person — point of view. -

    I prefer to call such systems circuits both for brevity and for the fact that +

    I prefer to call such systems circuits, both for brevity and for the fact that electrical circuits were probably the first man-made manifestation of communicating sequential processes that was rich, flexible and not present in untouched nature.

    Today's connected Internet services and devices are no different than electrical components on a circuit: They are independent processing units communicating via sequential streams of data, as opposed to sequential streams of changes in electrical voltage. The difference -between circuits analog and digital is entirely linguistic: It is the difference between a +between analog and digital circuits is entirely linguistic: It is the difference between a floating-point number (the voltage) and a data structure (a digital message).

    If it is indeed the case that most things that we program or that we program about are circuits at the end of the day, then it is only appropriate to complement Hoare's -model of everything with an appropriate programming language. This is the goal of Escher. +model of everything with an appropriate programming language. +This is the goal of Escher.

    Sources

    -

    Find the source repository for Escher on GitHub. +

    Find the source repository for Escher on GitHub. Follow us on Twitter @escherio.

    Documentation

    @@ -101,12 +112,12 @@

    Case studies

    - +

    diff --git a/install.html b/install.html index f723deb..a6c13a0 100644 --- a/install.html +++ b/install.html @@ -12,34 +12,37 @@
    -

    Bulding and installing Escher

    +

    Building and installing Escher

    Escher requires the Go language toolchain to be installed first. Fetching, building and installing Escher can then be accomplished with one command: -

    -	% go get github.com/gocircuit/escher/escher
    +
    +go get github.com/gocircuit/escher/escher
     
    -

    To check that installation succeeded, run - -

    -	% ESCHER=github.com/gocircuit/escher/src escher test.All
    -	+ Test basic.TestFork (ok)
    -	+ Test basic.TestFunc (ok)
    -	+ Test text.TestForm (ok)
    -	+ Test yield.TestValues (ok)
    -	…
    +

    To check whether the installation succeeded, run: +

    +ESCHER=$GOPATH/src/github.com/gocircuit/escher/src escher "*test.All"
     
    -

    Note that the environment ESCHER must point to the src +NOTE The environment variable ESCHER must point to the src subdirectory of the main Escher repo on your host. - + +

    You should see output similar to this: +

    ++ Test *basic.TestFork (ok)
    ++ Test *basic.TestAlternate (ok)
    ++ Test *text.TestForm (ok)
    ++ Test *yield.TestFlows (ok)
    ++ Test *yield.TestValues (ok)
    +
    +
    diff --git a/m.html b/m.html index 64b6bd3..7bd2279 100644 --- a/m.html +++ b/m.html @@ -27,12 +27,12 @@

    Introduction

    - +

    diff --git a/meaning.html b/meaning.html index 98805ea..28a6b1f 100644 --- a/meaning.html +++ b/meaning.html @@ -20,9 +20,10 @@

    Interpretations of circuits

    dependent on context and/or content. A circuit interpretation will usually utilize a subset of the representational freedoms of a circuit, and will have an intuitive graphical representation. -

    Here we introduce four basic circuit interpretations—or specializations, if you will—that +

    Here we introduce four basic circuit interpretations — or specializations, if you will — that will also serve us as a vocabulary when discussing Escher in following chapters. +

    Series

    Circuit gate names, recall, can be integers or strings. If a circuit has no links and the gate @@ -31,7 +32,7 @@

    Series

    Gate names are slice indices; gate values are slice element values.

    For instance, the circuit -

    +
     Singer {
     	0 "Dolly"
     	1 "Rebecca"
    @@ -39,7 +40,7 @@ 

    Series

    }
    is analogous (in meaning) to the Go slice: -
    +
     var Singer = []interface{}{
     	"Dolly",
     	"Rebecca",
    @@ -51,7 +52,7 @@ 

    Series

    the syntax section, we have dedicated a shorthand syntax for series circuits that omits the gate names: -
    +
     Singer {
     	"Dolly"
     	"Rebecca"
    @@ -59,18 +60,47 @@ 

    Series

    }
    -

    Indices

    -

    More generally than series, when a circuit has no links we call it an index and -we view it as a map from integers and/or strings to anything else. In this respect an index -is akin in purpose to structures, dictionaries, hash tables and maps in other languages. +

    Maps

    + +

    +More generally than series, +when a circuit has no valves/links, +we call it a map (previously index), +and we view it as a mapping from integers and/or strings to anything else. +In this respect, a map is akin in purpose to structures, dictionaries, hash tables and maps in other languages. +

    + +
    +ImplicitIntMap {
    +	*fully.qualified.Name
    +	123
    +	3.14
    +}
     
    -

    The gate values of index circuits are analogously called children and they can -be of primitive types (integers, floats, etc.) as well as recursively they can be other circuits -or indices. +ExplicitIntMap { + 3 *fully.qualified.Name + 6 @fully.qualified.Name + 1 123 +} + +StringMap { + directive *fully.qualified.Name + integral 123 + floating 3.14 +} +

    -
    -Tree {
    +
    +

    Trees

    + +

    +The gate values of map circuit are analogously called children, +and they can be of primitive types (integers, floats, etc.) +as well as recursively, they can be other circuits or maps. + +

    +TreeCircuit {
     	Trunk {
     		Branches {
     			"Johnny"
    @@ -85,16 +115,31 @@ 

    Indices

    } }
    +

    + +

    +Such recursive structures of maps, or just trees for short, +serve the same purpose as file-systems, namespaces, trees and others: +To organize their internal and leaf values in a hierarchical manner, +so that each node (internal or leaf) is identifiable by a unique path. +

    -

    Such recursive structures of indices, or just indices for short, serve the same purpose as -file-systems, namespaces, trees and others: To organize their internal and leaf values in a -hierarchical manner, so that each node (internal or leaf) is identifiable by a unique -path which we shall call address of a value relative to a given index. -

    For instance, the address of "Grandma" relative to the index -Tree would be +

    Indices

    + +

    +An Escher index is basically a tree circuit, +which we interpret as a an absolute (and in future releases also relative) +tree containing all circuits/gates. +This also associates a unique path to each gate, +which we shall call address of a value relative to a given index. +

    -
    +

    +For instance, the address of "Grandma" relative to the index +Tree would be + +

     {
     	Root
     	Tentacles
    @@ -102,6 +147,8 @@ 

    Indices

    }
    (Note that addresses are represented by series circuits.) +

    +

    Directives

    @@ -110,7 +157,7 @@

    Directives

    Directives are represented as a single circuit, wherein the empty-string gate holds the verb, while the number gates hold the components of the address. For instance, -
    +
     {
     	"" "*"
     	0 Root
    @@ -122,15 +169,15 @@ 

    Directives

    This circuit holds the verb value "*" and the address whose components are Root, Tentacles and 1, in that order. There are only two types of verbs, signified by the verb values "*" -and "@", whose meaning is explained in later sections. -We call these verbs materialize and recall, respectively, while their +and "@", whose meaning is explained in later sections. +We call these verbs materialize and recall, respectively, while their single-characters values, "*" and "@", are a design choice of expediency.

    Due to the ubiquitous use of directives in circuit programs, directives can be written using the dedicated syntactic sugar: -

    +
     *Root.Tentacles.1
     
    @@ -143,7 +190,7 @@

    Programs

    The gates of program circuits ultimately represent independently executing services, which are interconnected according to the link pattern of the circuit. -

    Gate values designate the processing logic—i.e. they codify the service type—while +

    Gate values designate the processing logic — i.e. they codify the service type — while gate names are used solely as identifiers, needed in the description of the circuit links.

    Gate values can be of any kind: integer, float, complex, string @@ -153,18 +200,18 @@

    Programs

    Circuit links are allowed only between gate names, defined within the circuit or the empty-string gate name. -

    The empty-string gate name represents an implicit -“enclosing” or “parent” circuit. In particular, program -circuits are not allowed to define a gate with the empty-string -name. +

    The empty-string gate name represents an implicit +“enclosing” or “parent” circuit we call super gate. +In particular, program circuits are not allowed to use a vector +with the empty-string name. -

    Links whose endpoints are connected to the same +

    Links whose endpoints are connected to the same gate name are allowed, as long as they connect into different valve names.

    Here is an example of a valid program circuit: -

    +
     {
     	tkr *time.Ticker
     	sum *math.Sum
    @@ -174,7 +221,7 @@ 

    Programs

    tkr: = sum:Sum sum:X = :Phase - sum:Y = *Show + sum:Y = *e.Show }
    @@ -183,7 +230,9 @@

    Programs

    - + + +

    @@ -194,7 +243,7 @@

    Programs

    diff --git a/program.html b/program.html index 539a876..57c8cf3 100644 --- a/program.html +++ b/program.html @@ -30,7 +30,7 @@

    Circuit programming

    A program circuit describes a system of interconnected reflexes. -

    Each circuit gate corresponds to a reflex. The gate value +

    Each circuit gate corresponds to a reflex. The gate value describes the type of reflex that is to be materialized. While the gate name is merely an identifier, unique to the program circuit, used mainly to enable the specification of the reflex-to-reflex links. @@ -45,7 +45,7 @@

    Circuit programming

    or between a defined gate and the super gate.

    Links connected to the super gate are endpoints whose eventual connection -to a reflex is defered to the enclosing circuit. +to a reflex is deferred to the enclosing circuit.

    Circuit programs that have no links to the super gate are called closed circuits, as they describe complete materializable systems on their own. @@ -56,20 +56,23 @@

    Circuit programming

    Gate value interpretation

    Circuit programs recognize the following types of gate values: -

      -
    • Integer, float, complex, string, or a non-directive circuit, or
    • +
        +
      1. Integer
      2. +
      3. Float
      4. +
      5. Complex
      6. +
      7. String
      8. +
      9. Circuit (non-directive)
      10. Directive circuit -
    +

    Noun reflexes

    -

    Gate values in the first group (integer, float, complex, string or a non-directive circuit) -will result in the materialization of a “noun” reflex, whose noun value is the -gate value. +

    Gate value types 1 to 5 will result in the materialization of a “noun” reflex, +whose noun value is the gate value. -

    A noun reflex is a generic built-in reflex type which, after materialization, +

    A noun reflex is a generic, built-in reflex type, which — after materialization — emits its corresponding gate value to each one of its connected valves. -If no valves are connected, the noun reflex leaves the gate value as its +If no valves are connected, the noun reflex leaves the gate value as its residue. Otherwise, it leaves no residue.

    Expanding directives

    @@ -77,24 +80,24 @@

    Expanding directives

    When the gate value is a directive, materialization proceeds as follows: -

      -
    • First, the runtime looks up the “target” value, which resides in the index -at the address specified in the directive.
    • -
    • Second, -
        -
      • If the directive verb is @, the gate is materialized as a noun gate -emitting the target value.
      • -
      • If the directive verb is *, the target value is substituted as the gate value, -and the materialization process described in this section is repeated now with the target -value as the gate value. -
      +
        +
      1. The runtime looks up the “target” value, which resides in the index + at the address specified in the directive.
      2. +
      3. +
          +
        • If the directive verb is @, the gate is materialized as a noun gate + emitting the target value.
        • +
        • If the directive verb is *, the target value is substituted as the gate value, + and the materialization process described in this section is repeated now with the target + value as the gate value. +
      4. -
    +

    Circuit residue

    As pointed out in the section on reflexes, every reflex -can leave a residue value as a result of being materialized, or the Go value nil +can leave a residue value as a result of being materialized, or the Go value nil, which indicates leaving no residue.

    Circuit programs are no different than reflexes (in fact they describe higher-order reflexes themselves) @@ -102,7 +105,7 @@

    Circuit residue

    The residue of materializing a circuit program is the same circuit, wherein each gate value is replaced by the residue of materializing that gate. -Gate corresponding to reflexes that leave no residue are not present +Gates corresponding to reflexes that leave no residue are not present in the residue circuit.

    If no gates leave any residue, the circuit program itself leaves no residue. @@ -111,31 +114,31 @@

    Example with an illustration

    Consider, for instance, the following index: -

    +
     {
     	Database {
     		cache Cache
    -		left Shard
    -		right Shard
    +		shard1 Shard
    +		shard2 Shard
     		link Link
     
     		cache:Web = :Web
    -		left:Cache = cache:Left
    -		right:Cache = cache:Right
    -		left:Backup = link:Left
    -		right:Backup = link:Right
    +		shard1:Cache = cache:Left
    +		shard2:Cache = cache:Right
    +		shard1:Backup = link:Left
    +		shard2:Backup = link:Right
     		link: = :Backup
     	}
     	App {
     		web Web
    -		left Database
    -		right Database
    -		backup Backup
    -
    -		left:Web = web:Left
    -		right:Web = web:Right
    -		left:Backup = backup:Left
    -		right:Backup = backup:Right
    +		db1 Database
    +		db2 Database
    +		bkp Backup
    +
    +		db1:Web = web:Left
    +		db2:Web = web:Right
    +		db1:Backup = bkp:Left
    +		db2:Backup = bkp:Right
     	}
     	Web …
     	Cache …
    @@ -152,7 +155,7 @@ 

    Example with an illustration

    - +
    @@ -161,10 +164,10 @@

    Example with an illustration

    If we materialize the program circuit App with respect to the index given above -(i.e. directive addresses will resolve with respect to that index), +(i.e. directive addresses will resolve with respect to that index), we are going to get the following residue: -
    +
     {
     	web WebResidue
     	bkp BackupResidue
    @@ -188,27 +191,27 @@ 

    Example with an illustration

    link LinkResidue cache:Web = :Web - left:Cache = cache:Left - right:Cache = cache:Right - left:Backup = link:Left - right:Backup = link:Right + shard1:Cache = cache:Left + shard2:Cache = cache:Right + shard1:Backup = link:Left + shard2:Backup = link:Right link: = :Backup } - left:Web = web:Left - right:Web = web:Right - left:Backup = backup:Left - right:Backup = backup:Right + db1:Web = web:Left + db2:Web = web:Right + db1:Backup = bkp:Left + db2:Backup = bkp:Right }

    Where WebResidue, BackupResidue, Shard1Residue, etc. are -merely placeholders here for whatever the actual residue values of the respetive reflexes are. +merely placeholders here for whatever the actual residue values of the respective reflexes are. Visually the program residue could be represented as:

    - +
    @@ -222,7 +225,7 @@

    Example with an illustration

    - +
    @@ -235,20 +238,19 @@

    Example with an illustration

    Three ways to invoke materialization

    -

    One can materialize (i.e. execute) a program circuit given an index from three different places: -from Go, from another program circuit (i.e. from Escher) and from the POSIX shell. +

    One can materialize (i.e. execute) a program circuit given an index from three different places. -

    Materializing from Go

    +

    Materializing from Go

    Package be provides the materialization method: -

    +
     func MaterializeSystem(program interface{}, index, barrier Circuit) (residue interface{})
     
    -

    Argument program contains the program circuit, of Go type Circuit, +

    Argument program contains the program circuit — of Go type Circuit — that is to be materialized. Incidentally, the value of program can be any value -recognized as a gate value in a circuit program as described earlier. Often one will pass a directive +recognized as a gate value in a circuit program as described earlier. Often, one will pass a directive circuit as program.

    Argument index holds the materialization index, relative to which @@ -256,21 +258,24 @@

    Materializing from Go

    The last argument, barrier, is to be set to nil. -

    The function returns the residue of the materialization process. +

    The function returns the residue of the materialization process. -

    Materializing from Escher

    +

    Materializing from within Escher

    -

    One can recursively materialize circuits programs from within other -circuit programs. This is accomplished using the built-in reflex escher.Materialize +

    One can recursively materialize circuits programs from within other +circuit programs. This is accomplished using the built-in reflex e.Materialize which is described in the materialization faculty section. -

    Materializing from POSIX

    +

    Materializing from the command-line

    The Escher executable, which is explained in detail in the runtime section, -will materialize a directive from the command-line: +will materialize a directive from the command-line. +Given our index (project source root) is "/src/app/", +and in one of the "*.escher" files in that directory we have a gate named "Main", +we can materialize it from the command-line like this: -

    -% escher -src /src/app *app.Main
    +
    +escher -src /src/ "*app.Main"
     
    @@ -278,7 +283,7 @@

    Materializing from POSIX

    diff --git a/reflex.html b/reflex.html index a88ccc3..6ba40d4 100644 --- a/reflex.html +++ b/reflex.html @@ -15,19 +15,19 @@

    Implementing reflexes

    -

    A key motivation for the design of Escher is the idea that +

    A key motivation for the design of Escher is the idea that software programs should be assembled as the interconnection of independently-executing computational devices of special-purpose logic. -In other words, computer programs—small or large—should be -no different in their essential structure than cloud applications, +In other words, computer programs — small or large — should be +no different in their essential structure than cloud applications, which are no more and no less than an interconnection of independently running special-purpose services.

    We call these “computational devices” reflexes. -Reflexes can be implemented in the language underlying Escher +Reflexes can be implemented in the language underlying Escher (the Go language) or they can be composed out of other reflexes, using circuit programs from within Escher. -Here we describe how to implement relfexes in Go and link them +Here we describe how to implement reflexes in Go and link them into the Escher runtime.

    Reflexes and the runtime

    @@ -38,7 +38,9 @@

    Reflexes and the runtime

    - + + +

    @@ -54,7 +56,7 @@

    Receiver type

    Every reflex is embodied by a user-defined Go receiver type. -

    +
     type Receiver struct {
     	…
     }
    @@ -64,11 +66,11 @@ 

    Receiver type

    The spark

    -

    When a reflex is materialized, the Escher runtime creates a new instance of the underlying +

    When a reflex is materialized, the Escher runtime creates a new instance of the underlying Go receiver type and invokes a designated initialization method, called Spark. All receivers must implement that method. -

    +
     func (r *Receiver) Spark(eye *Eye, matter Circuit, aux ...interface{}) Value {
     	…
     }
    @@ -78,7 +80,7 @@ 

    Eye to the outside

    The first argument eye is an object with a singleton public method: -

    +
     func (eye *Eye) Show(valve Name, value interface{})
     
    @@ -99,38 +101,38 @@

    Materialization matter

    From a programmatic standpoint, only one of the gates of circuit matter is of interest to reflex programmers. The gate called View lists -the names of all valves connected to this reflex by the parent system which is +the names of all valves connected to this reflex by the parent system which is materializing this reflex. The View gate has a circuit value, whose gate names correspond to the names of the valves connected to the reflex being materialized.

    For instance, the names of the connected valves can be printed with this code: -

    +
     	view := matter.CircuitAt("View")
     	for _, valve := range view.SortedNames() {
    -		fmt.Printf("valve name = %v\n", vavle)
    +		fmt.Printf("valve name = %v\n", valve)
     	}
     

    Auxiliary input

    -

    The last argument aux contains user-supplied auxiliary +

    The last argument aux contains user-supplied auxiliary information that can inform the Spark method to specialize -this reflex one way or another. The auxiliary information is specified -by the user when linking the reflex to the runtime, which is explained -furhter below. +this reflex one way or another. The auxiliary information is specified +by the user when linking the reflex to the runtime, which is explained +further below.

    Return residue

    -

    The Spark method can return a value called the +

    The Spark method can return a value called the residue (of materializing this reflex). The residue value can be int, float64, complex128, string, Circuit or Materializer. The latter is a Go type that can materialize reflexes (it is essentially a factory object for reflexes), described in the linking section below. -

    The residue will be made available through the Escher +

    The residue will be made available through the Escher programming environment for further manipulations. @@ -142,12 +144,12 @@

    Receiver methods

    Fixed valve names

    -

    The first kind are receiver methods named +

    The first kind are receiver methods named CognizeVALVE, where VALVE can be any string (including the empty string), that have the following signature: -

    +
     func (r *Receiver) CognizeVALVE(eye *be.Eye, value interface{}) {
     	…
     }
    @@ -157,26 +159,26 @@ 

    Fixed valve names

    runtime that this reflex type requires the valve named VALVE to be connected (when the reflex is materialized as part of a circuit of reflexes). -

    Furthermore, every event sent to this valve (of this reflex instance) -will result in an invokation of the method CognizeVALVE, wherein the event value -is held by the argument value. The eye object, supplied -for convenience, can be used to send out events to any of the reflex's connected +

    Furthermore, every event sent to this valve (of this reflex instance) +will result in an invocation of the method CognizeVALVE, wherein the event value +is held by the argument value. The eye object, supplied +for convenience, can be used to send out events to any of the reflex's connected valves. -

    We say that that the method CognizeVALVE captures the event. +

    We say that the method CognizeVALVE captures the event.

    Varying valve names

    The second kind are receiver methods with this exact signature: -

    +
     func (r *Receiver) OverCognize(eye *be.Eye, valve Name, value interface{}) {
     	…
     }
     

    If such a method is present, the runtime is informed that the reflex -accepts any number and naming of connected valves. The method +accepts any number and naming of connected valves. The method OverCognize will be invoked whenever an event is received that is not captured by a fixed-name valve method. @@ -192,7 +194,7 @@

    Linking user reflexes into the runtime

    Creating the Materializer is accomplished using the function NewMaterializer in package be: -

    +
     func NewMaterializer(receiver Material, aux ...interface{}) Materializer
     
    @@ -203,18 +205,18 @@

    Linking user reflexes into the runtime

    To add a materializer for a new reflex type to the Escher index, one uses the method Register in package faculty: -

    +
     func Register(v Materializer, addr ...Name)
     

    The first argument is the materializer for the reflex, obtained from NewMaterializer, and the second argument is the address within the index where the materializer will be placed. -

    Typically the user will implement a package with multiple topically-related reflex receivers, +

    Typically, the user will implement a package with multiple topically-related reflex receivers, and will register their respective materializers with the runtime as a side-effect of importing the package, using an init function: -

    +
     func init() {
     	faculty.Register(be.NewMaterializer(&Receiver{}), "example", "ReflexName")
     }
    @@ -238,7 +240,7 @@ 

    A one-way door example

    wherein each passing value is blocked until its transmission is allowed by a “strobe” value sent to Door. -
    +
     package example
     
     import (
    @@ -277,7 +279,7 @@ 

    A one-way door example

    diff --git a/syntax.html b/syntax.html index fdf0ab9..b78f224 100644 --- a/syntax.html +++ b/syntax.html @@ -16,36 +16,126 @@

    Syntax and meaning

    At heart Escher is a Go package that parses a simple written syntax into a labeled graph data structure, called a circuit. If you view -XML as a syntax that represents labeled trees, then Escher would be a +XML as a syntax that represents labeled trees, then Escher would be a syntax that represents labeled graphs. +

    Syntax comparison with Java and C++

    + +

    As Escher is a so called Conceptual Programming Language, +it uses concepts that are very different then what you may know +from Object Oriented or Functional Programming, for example. +It therefore also uses very different concepts, parts, and names thereof. +This section tries to clarify those names. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Declarative unitJavaEscherC++
    Basic declaration unitclasscircuitclass
    Logical group of basic declaration unitspackagefacultynamespace
    Variable name + type/interfacevariable name + typegatevariable name + type
    enclosing declataion unit instancethissuper gatethis
    The runtime structure containing all the codeclass-pathindexLD_LIBRARY_PATH
    Unique string identifier of a declaration unitfully-qualified (class-)nameaddressfully-qualified (class-)name
    The underlying runtimeJVMEscher runtimethe OS
    The underlying technologyJVM/C/AssemblerGolangnone/the OS
    +

    Circuits

    -

    A circuit consists of nodes, called gates, which have -a name and a value. Names are strings or integers. Gates have unique names -within a circuit. Values are anything representable by the underlying -technology, which for our implementation means any Go value, equivalently, interface{}. -

    Additionally, a circuit has a set of links across pairs of gates. +

    +
    + + + +
    + Shows the different parts of a circuit, with each type of a part coded with a diferent color.
    +
    +

    + + +

    A circuit has the strucutre of a graph, +consists of nodes, called gates, +and edges, called links. + +Gates have a name and a value: +

      +
    • + Names are strings or integers. + Gates have unique names within a circuit. +
    • +
    • + Values are anything representable by the underlying technology, + which — for this Escher implementation — means any Go value, + or equivalently interface{}. +
    • +
    + +

    A circuits links go across pairs of gates. A link has two endpoints, called vectors. -Each vector consists of a gate name and a valve -name. Vectors do not overlap in the sense that all vectors with the -same gate name have unique valve names. +Each vector consists of a gate name and a valve name. +Vectors do not overlap, in the sense that all vectors +with the same gate name (within the circuit) have unique valve names.

    Symbolism

    -

    Circuits have a standard visual representation that fully captures -the internal structure of the circuit, which consists of the -gate names and links and excludes the gate values—the external structure. +

    Circuits have a standard visual representation +that fully captures the internal structure of the circuit, +which consists of the gate names and links, +and excludes the gate values — the external structure. -

    To draw a circuit we start with a solid black oval, denoting the circuit's internal name space. -White ovals—contained inside the black one and mutually non-overlapping—denote gates. +

    To draw a circuit, we start with a solid black oval, denoting the circuit's internal name space. +White ovals — contained inside the black one and mutually non-overlapping — denote gates.

    Links are depicted as white lines that connect the outlines of gate ovals. -Link endpoints connecting to the super gate are attached to -the outline of the surrounding black oval. +Link endpoints connecting to the super gate are attached to +the outline of the surrounding black oval. -

    Valve names are written in white within the black oval, next to their +

    Valve names are written in white within the black oval, next to their respective visual connection point. Connection points where valve names are visually missing correspond to empty-string valves. @@ -63,7 +153,7 @@

    Symbolism

    In this illustration, the depicted circuit has three valves at the super gate, - labeled as “X”, “Y” and “” (the empty string). + labeled as “X”, “Y” and “” (the empty string). The source for this circuit is given later below.

    @@ -96,26 +186,27 @@

    Go interface

    Using the Escher parser is very simple, in three steps:

      -
    • Import the parsing package "github.com/gocircuit/escher/see"
    • +
    • Import the parsing packages "github.com/gocircuit/escher/a" and "github.com/gocircuit/escher/see"
    • Create a parsing object for your source string
    • Repeatedly parse one circuit definition at a time
    -

    The following example illustrates this: +

    The following Go example illustrates this:

     package main
     
     import (
     	"fmt"
    +	"github.com/gocircuit/escher/a"
     	"github.com/gocircuit/escher/see"
     )
     
     func main() {
    -	src = "alpha { a 123; b 3.14; a: = b:}\n beta { 1, 2, 3, \"abc\" }"
    -	p := see.NewSrcString(src) // create a parsing object
    +	src := "alpha { a 123; b 3.14; a: = b:}\n beta { 1, 2, 3, \"abc\" }"
    +	p := a.NewSrcString(src) // create a parsing object
     	for {
    -		n, v := see.See(p) // parse one circuit at a time
    +		n, v := see.SeePeer(p) // parse one circuit at a time
     		if v == nil {
     			break
     		}
    @@ -144,12 +235,20 @@ 

    Grammar

    Comments

    -

    Go-style end-of-line comments are allowed everywhere. +

    We use a trick: +We use syntactic sugared (empty string named), string valued gates, +and — purely to visually indicate a comment — +we use "//" in the beginning, or "/*" plus "*/" at the end.

    -alpha {            // circuit definition
    -	float 1.23 // gate named float with a floating-point value
    -	beta {}    // gate named beta with an empty circuit value
    +alpha {		  `// circuit definition`
    +	float 1.23 ; `// gate named float with a floating-point value`
    +	beta {}	; `// gate named beta with an empty circuit value`
    +	`/*
    +	  * We can also do this:
    +	  * A multi-line comment within a circuit definition.
    +	  * Outside the circuit though, no comments are possible.
    +	  */`
     }
     
    @@ -157,20 +256,36 @@

    Gates

    Gate statements begin on a new line with a gate name identifier, space, and a gate value expression. There are six value types that can be expressed: -

      -
    • Integers -
    • Floating-point numbers -
    • Complex numbers -
    • Strings -
    • Directives -
    • Circuits -
    - -

    The first four correspond to the Go types int, float64, complex128 -and string and are expressed using the same syntax. -Addresses have a dedicated Go type Address. They represent a sequence of names and are -written as dot-separated fully-qualified names. Finally, circuits—whose dedicated Go type is Circuit— -can be values of gates as well. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeRepresents
    Integernative Go type int
    Floating-point numbernative Go type float64
    Complex numbernative Go type complex128
    Stringnative Go type string
    DirectiveEscher internal Go type Address, representing a sequence of names, written as dot-separated, fully-qualified names
    CircuitEscher internal Go type Circuit

    For instance, @@ -182,7 +297,7 @@

    Gates

    floating 3.14 complex (1-3i) quoted "abcd\n\tefgh" - backquoted ` + backQuoted ` <html> <div>abc</div> </html> @@ -204,8 +319,8 @@

    Gates

    Series

    Gate names can be omitted in circuit definitions, in which case gates are -assigned consequtive integral names, starting from zero. We call the resulting -circuits series. +assigned consecutive integral names, starting from zero. We call the resulting +circuits series.

     alpha {
    @@ -227,6 +342,28 @@ 

    Series

    }
    +which is equivalent to: + +
    +alpha {
    +	0 *fully.qualified.Name
    +	1 @fully.qualified.Name
    +	2 123
    +	3 3.14
    +	4 (1-3i)
    +	5 "abcd\n\tefgh"
    +	6 `
    +		<html>
    +			<div>abc</div>
    +		</html>
    +	`
    +	7 {
    +		A 1
    +		B "C"
    +	}
    +}
    +
    +

    Circuit links are semantically symmetric. A link is a pair of two @@ -235,10 +372,13 @@

    Vectors are written as the gate name, followed by : (the colon sign), followed by the valve name. Links are written as a vector, followed by optional whitespace, followed by = (the equals sign), followed by another optional whitespace and -the second vector. For instance, +the second vector. Valid examples:

     	and:XAndY = not:X
    +	and:XAndY= not:X
    +	and:XAndY =not:X
    +	and:XAndY=not:X
     

    A few idioms are commonly useful: @@ -247,13 +387,13 @@

  • Gate names can be the empty string. The empty-string gate is called the super gate. While one cannot assign a value to it through syntax, it is possible to connect links to it. -

    The super gate has a distinguished role in some contexts. -For instance, when materializing circuits, +

    The super gate has a distinguished role in some contexts. +For instance, when materializing circuits, the links connected to the super gate are exposed to the higher-level “super” circuit.

  • Valve names can be the empty string. We call such valves default, as -they are commonly refered to hereinafter in various idioms. +they are commonly referred to hereinafter in various idioms. -

    For instance, it is a common pattern to name the output valve of +

    For instance, it is a common pattern to name the output valve of materializable circuits after the empty string. The default valve of the super gate, on the other hand, is a way of taking advantage of Escher's syntactic sugar rule. @@ -274,8 +414,8 @@

    Syntactic sugar

    -

    When circuits are used to represent programs—in other words, -executable code—it is common to include a gate and then link to its default valve. +

    When circuits are used to represent programs — in other words, +executable code — it is common to include a gate and then link to its default valve. To reduce verbosity in this case, link definitions support a piece of syntactic sugar.

    Either (or both) vectors in a link definition can be substituted for a gate value. @@ -293,7 +433,7 @@

    Syntactic sugar

    sum:Summand = 0:
  • -

    In another example both sides of the equation are sugared: +

    In this example, both sides of the equation are sugared:

     	*os.Scanln = *os.Println
    @@ -307,12 +447,12 @@ 

    Syntactic sugar

    0: = 1:
    - +