From 13c1ed7b2a594f750069813e76e00bba52fb11c7 Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Wed, 12 Feb 2025 15:54:12 -0500 Subject: [PATCH] first commit --- .github/workflows/docs.yml | 17 ++ .gitignore | 2 + LICENSE | 21 ++ README.md | 54 ++++ config.toml | 12 + content/_index.md | 3 + content/chapter1/_index.md | 152 ++++++++++ content/chapter2/_index.md | 103 +++++++ content/chapter2/page1.md | 108 ++++++++ content/chapter3/_index.md | 82 ++++++ content/chapter4/_index.md | 12 + content/chapter4/page1.md | 146 ++++++++++ content/chapter4/page2.md | 68 +++++ content/chapter4/page3.md | 38 +++ content/chapter4/page4.md | 43 +++ content/chapter4/page5.md | 86 ++++++ content/chapter4/page6.md | 113 ++++++++ content/chapter4/page7.md | 94 +++++++ content/chapter4/page8.md | 46 ++++ content/preface/_index.md | 21 ++ sass/_content.scss | 231 ++++++++++++++++ sass/_document.scss | 18 ++ sass/_header.scss | 160 +++++++++++ sass/_navigation.scss | 57 ++++ sass/_normalize.scss | 447 ++++++++++++++++++++++++++++++ sass/_syntax-charcoal.scss | 162 +++++++++++ sass/_syntax.scss | 551 +++++++++++++++++++++++++++++++++++++ sass/_variables.scss | 13 + sass/book.scss | 12 + screenshot.png | Bin 0 -> 145504 bytes static/book.js | 223 +++++++++++++++ templates/index.html | 130 +++++++++ templates/page.html | 40 +++ templates/section.html | 52 ++++ theme.toml | 13 + 35 files changed, 3330 insertions(+) create mode 100644 .github/workflows/docs.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 config.toml create mode 100644 content/_index.md create mode 100644 content/chapter1/_index.md create mode 100644 content/chapter2/_index.md create mode 100644 content/chapter2/page1.md create mode 100644 content/chapter3/_index.md create mode 100644 content/chapter4/_index.md create mode 100644 content/chapter4/page1.md create mode 100644 content/chapter4/page2.md create mode 100644 content/chapter4/page3.md create mode 100644 content/chapter4/page4.md create mode 100644 content/chapter4/page5.md create mode 100644 content/chapter4/page6.md create mode 100644 content/chapter4/page7.md create mode 100644 content/chapter4/page8.md create mode 100644 content/preface/_index.md create mode 100644 sass/_content.scss create mode 100644 sass/_document.scss create mode 100644 sass/_header.scss create mode 100644 sass/_navigation.scss create mode 100644 sass/_normalize.scss create mode 100644 sass/_syntax-charcoal.scss create mode 100644 sass/_syntax.scss create mode 100644 sass/_variables.scss create mode 100644 sass/book.scss create mode 100644 screenshot.png create mode 100644 static/book.js create mode 100644 templates/index.html create mode 100644 templates/page.html create mode 100644 templates/section.html create mode 100644 theme.toml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..ab8fbef --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,17 @@ +name: Build and deploy GH Pages +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v3.0.0 + - name: build_and_deploy + uses: shalzz/zola-deploy-action@v0.17.2 + env: + PAGES_BRANCH: gh-pages + TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4139cd5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea/ +public diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..93ab851 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Vincent Prouillet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..70ba0ab --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# book + +A theme based on [Gitbook](https://www.gitbook.com), to write documentation +or books. + +![book screenshot](https://github.com/Keats/book/blob/master/screenshot.png?raw=true) + + +## Contents + +- [Installation](#installation) +- [Options](#options) + - [Numbered chapters](#numbered-chapters) + +## Installation +First download this theme to your `themes` directory: + +```bash +$ cd themes +$ git clone https://github.com/getzola/book.git +``` +and then enable it in your `config.toml`: + +```toml +theme = "book" +# Optional, if you want search +build_search_index = true +``` + +## Usage +Book will generate a book from the files you place in the `content` directory. Your book +can have two levels of hierarchy: chapters and subchapters. + +Each chapter should be a `section` within the Gutenberg site and should have an `_index.md` +file that sets its `weight` front-matter variable to its chapter number. For example, +chapter 2 should have `weight = 2`. Additionally, each chapter should also set the +`sort_by = "weight"` in its front matter. + +Each subchapter should be a `page` and should have its `weight` variable set to the subchapter +number. For example, subchapter 3.4 should have `weight = 4`. + +Finally, you should create an `_index.md` file and set the `redirect_to` front-matter variable +to redirect to the first section of your content. For example, if your first section has the +slug `introduction`, then you would set `redirect_to = "introduction"`. + +## Options + +### Numbered chapters +By default, the `book` theme will number the chapters and pages in the left menu. +You can disable that by setting the `book_number_chapters` in `extra`: + +```toml +book_number_chapters = false +``` diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..bd9f87f --- /dev/null +++ b/config.toml @@ -0,0 +1,12 @@ +base_url = "https://getzola.github.io/book/" +compile_sass = true +title = "book theme" +description = "A book theme" +build_search_index = true + +[markdown] +highlight_code = true +highlight_theme = "css" + +[extra] +book_number_chapters = true diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..6abf22b --- /dev/null +++ b/content/_index.md @@ -0,0 +1,3 @@ ++++ +redirect_to = "chapter1" ++++ diff --git a/content/chapter1/_index.md b/content/chapter1/_index.md new file mode 100644 index 0000000..4a16897 --- /dev/null +++ b/content/chapter1/_index.md @@ -0,0 +1,152 @@ ++++ +title = "Introduction" +weight = 1 +sort_by = "weight" +insert_anchor_links = "right" ++++ + +BH (Bluespec Haskell/Classic) is a language for hardware design. The +language borrows its notation, type and package system from an existing +general-purpose functional programming language called Haskell +[@haskell12] where those constructs have been well tested for over a +decade. Unlike Haskell, BH is meant solely for hardware design--- a BH +program represents a circuit. The abstract model for these circuits is a +Term Rewriting System (TRS); details about using TRSs for describing +circuits, and compiling these descriptions to real hardware, may be +found in James Hoe's thesis [@jhoe]. BH has several restrictions and +extensions relative to Haskell, arising out of this hardware focus. + + +This document is not meant as a tutorial on BH (separate documents exist +for that purpose). Nevertheless, this document has numerous small +examples to explicate BH notation. + + +## Meta notation + + +The grammar rules in the presentation below mostly follow the usual EBNF +(Extended BNF) structure. Grammar alternatives are separated by +"$\mid$". Items enclosed in \[ \] are optional. Items enclosed in { } +can be repeated zero or more times. The last piece of notation is used +sloppily; sometimes there must be at least one item, and also, the last +terminal inside the { } is sometimes a separator rather than terminator. + + +## Identifiers and the rôle of upper and lower case + + +An identifier in BH consists of a letter followed by zero or more +letters, digits, underscores and single quotes. Identifiers are case +sensitive: `glurph`, `gluRph` and `Glurph` are three distinct +identifiers. + + +The case of the first letter in an identifier is very important. If the +first letter is lower case, the identifier is a "variable identifier", +referred to in the grammar rules as a *varId*. If the first letter is +upper case, the identifier is a "constructor identifier", referred to in +the grammar rules as a *conId*. + + +In BH, package names (*packageId*), type names (*tycon*) and value +constructor names are all constructor identifiers. (Ordinary) variables, +field names and type variables are all variable identifiers. + + +A lone underscore, "` `", is treated as a special identifier--- it is +used as a "don't care" pattern or expression (more details in Sections +[5.10](fixme) and +[6.1](fixme)). + + +## The Standard Prelude + + +The Standard Prelude is a predefined package that is imported implicitly +into every BH package. It contains a number of useful predefined +entities (types, values/functions, classes, instances, etc.). It is +somewhat analogous to the combination of various ".h" files and standard +libraries in C, except that in BH no special action is needed to import +the prelude or to link it in. We will refer to the prelude periodically +in the following sections, and there are more details in appendix +[15](fixme). + + +## Lexical syntax/layout + + +In BH, there are various syntactic constructs that involve zero or more +items enclosed in braces and separated by semicolons: These braces and semicolons can be omitted +entirely if the components are laid out with proper indentation. + + +Suppose the parser discovers a missing open brace (e.g., after the +keywords `where`, `let`, `do` and `of`). Then, the indentation of the +next lexical element is remembered (and the missing open brace is +implicitly inserted before it). For each subsequent line, if it contains +only whitespace or is indented more, then it is treated as a +continuation of the current item. If it is indented the same amount, it +is treated as the beginning of the next item (*i.e.,* a semicolon is +inserted implicitly before the item). If it is indented less, then the +list of items is considered to be complete (*i.e.,* a closing brace is +implicitly inserted). An explicit brace is never matched against an +implicit one. Thus, while using the layout rule, if the parser +encounters an explicit open brace, then it does not resume using the +layout rule for this list of items until it has "emerged" past the +explicit corresponding closing brace (a construct nested inside this +list of items may still use the layout rule). + + +## Comments in BH programs + + +In a BH program, a *comment* is legal as whitespace, and may be +introduced in two ways. An *ordinary comment* is introduced by a lexical +token consisting of two or more consecutive dashes followed by a +non-symbol, and extends up to and including the end of the line. (See +Section +[\[sec-infix-applications\]](fixme) for the list of symbols.) Note: the +lexical token `—>` is a legal token in BH, and since it contains three +consecutive dashes followed by a symbol, it does not begin a comment. + + +A *nested comment* is introduced by the lexeme "`{-`" and extends until +the next matching "`-}`", possibly spanning multiple lines. A nested +comment can itself contain another nested comment; this nesting can be +repeated to any depth. + + +In an ordinary comment, the character sequences "`{-`" and "`-}`" have +no special significance, and, in a nested comment, a sequence of dashes +has no special significance. + + +## General organization of this document + + +A concept that is pervasive in BH is the notion of a *type*. Every value +expression in BH, even a basic value identifier, has a type, and the +compiler does extensive static type checking to rule out absurd use of +values (such as taking the square root of an IP address). Types are +discussed in section [2](fixme). + + +A BH program consists of one or more packages. These outermost +constructs are described in section +[3](fixme). As +explained later, a BH package is a linguistic namespace-management +mechanism and does not have any direct correlation with any hardware +module being described by the program. Hardware modules correspond to +*modules*, a particular type of value in BH. + + +Within each package is a collection of top-level definitions. These are +described in section [4](fixme). + + +Amongst the top-level definitions are *value definitions* (section +[4.7](fixme)), +which constitute the actual meat of the code. Value definitions are +built around *expressions*, which are described in section +[5](fixme). diff --git a/content/chapter2/_index.md b/content/chapter2/_index.md new file mode 100644 index 0000000..6dc15f7 --- /dev/null +++ b/content/chapter2/_index.md @@ -0,0 +1,103 @@ ++++ +title = "Types" +weight = 2 +sort_by = "weight" +insert_anchor_links = "right" ++++ + +Every value expression and, in particular, every value identifier in BH +has a *type*. In some cases the programmer must supply a *type +signature* specifying this and in many cases the compiler infers it +automatically. The BH programmer should be aware of types at all times. + +``` +type ::= btype [ "->" type ] +btype ::= [ btype ] atype +atype ::= tycon | tyvar | ( { type , } ) +tycon ::= conId +``` + + +Most type expressions have the form: *TypeConstructor* $t_1$ $\cdots$ +$t_n$ where $t_1$ $\cdots$ $t_n$ are themselves type expressions, and $n +{\geq} 0$. The $t_1$ $\cdots$ $t_n$ are referred to as the *type +arguments* to the type constructor. $n$ is also called the *arity* of +the type constructor. + + +Familiar basic types have zero-arity type constructors (no type +arguments, $n = 0$). Examples: + + - `Integer` + - `Bool` + - `String` + - `Action` + +Other type constructors have arity $n > 0$; these are also known as +*parameterized types*. + +Examples: + + - `List Bool` + - `List (List Bool)` + - `Array Integer String` + - `Maybe Integer` + +These represent the types of lists of +Booleans, lists of lists of Booleans, arrays indexed by integers and +containing strings, and an optional result possibly containing an +integer. + + +A type can be *polymorphic*, indicated using type variables. Examples: + + - `List a` + - `List (Llist b)` + - `Array i (List String)` + + +These represent lists of things of some unknown type "`a`", lists of +lists of things of some unknown type "`b`", and arrays indexed by some +unknown type "`i`" and containing lists of strings. + + +One type constructor is given special status in the syntax. The type of +functions from arguments of type $t_1$ to results of type $t_2$ could +have been written as: + +Function $t_1$ $t_2$ + +but in BH we write the constructor as an infix arrow: + +$t_1$ -\> $t_2$ + +These associate to the right, *i.e.,* + +$t_1$ -\> $\cdots$ -\> $t_{n-1}$ -\> $t_n$ $\equiv$ $t_1$ +-\> ($\cdots$ -\> ($t_{n-1}$ -\> $t_n$)) + + +There is one particular set of niladic type constructors that look like +numbers. These are used to represent certain "sizes". For example, the +type: + +`Bit 16` + +consists of the unary type constructor `Bit` applied to type represented +by the niladic type constructor "`16`". The type as a whole represents +bit vectors of length 16 bits. Similarly the type + +`UInt 32` + + +represents the type of unsigned integers that can be represented in 32 +bits. These numeric types are said to have kind `#`, rather than kind +`*` for value types. + + +Strings can also be used as type, having kind `$`. This is less common, +but string types are quite useful in the generics library, described in +the *Libraries Reference Guide*. Examples: + + - `MetaData#("Prelude","Maybe",PrimUnit,2)` + - `MetaConsNamed#("Valid",1,1)` diff --git a/content/chapter2/page1.md b/content/chapter2/page1.md new file mode 100644 index 0000000..20ab0cc --- /dev/null +++ b/content/chapter2/page1.md @@ -0,0 +1,108 @@ ++++ +title = "Type classes and overloading" +weight = 1 ++++ + +BH's `class` and `instance` mechanisms form a systematic way to do +*overloading* (the approach has been well tested in Haskell). + + +Overloading is a way to use a common name to refer to a set of +operations at different types. For example, we may want to use the "`<`" +operator name for the integer comparison operation, the floating-point +comparison operation, the vector comparison operation and the matrix +comparison operation. Note that this is not the same as polymorphism: a +polymorphic function is a *single* function that is meaningful at an +infinity of types (*i.e.,* at every possible instantiation of the type +variables in its type). An overloaded identifier, on the other hand, +usually uses a common name to refer to a (usually) small set of distinct +operations. + + +Further, it may make sense to have "`<=`", "`>`" and "`>=`" operations +wherever there is a "`<`" operation, on integers, floating points +numbers, vectors and matrices. Rather than handle these separately, we +say: + + + - there is class of types which we will call `Ord` (for "ordered types"), + - that the integer, floating point, vector and matrix types are members +(or "instances") of this class, and + - that all types that are members of this class have appropriate +definitions for the "`<`", "`<=`", "`>`" and "`>=`" operations. We also +say that these operations are *overloaded* across these instance types, +and we refer to these operations as the *methods* of this class. + + +Another example: we could use a class `Hashable` with an operation +called `hash` to represent those types $T$ for which we can and do +define a hashing function. Each such type $T$ has to specify how to +compute the `hash` function at that type. + + +Classes, and the membership of a type in a class, do not come into +existence by magic. Every class is created explicitly using a class +declaration, described in section +[4.5](fixme). +A type must explicitly be made an instance of a class and the +corresponding class methods have to be provided explicitly; this is +described in [4.6](fixme). + + +### Context-qualified types + + +Consider the following type declaration: + +```hs +sort :: (Ord a) => List a -> List a +``` + + +It expresses the idea that a sorting function takes an (unsorted) input +list of items and produces a (sorted) output list of items, but it is +only meaningful for those types of items ("`a`") for which the ordering +functions (such as "`<`") are defined. Thus, it is ok to apply `sort` to +lists of `Integer`'s or lists of `Bool`'s, because those types are +instances of `Ord`, but it is not ok to apply `sort` to a list of, say, +`Counter`'s (assuming `Counter` is not an instance of the `Ord` class). + + +In the type of `sort` above, the part before "`=>`" is called a +*context*. A context expresses constraints on one or more type +variables--- in the above example, the constraint is that any actual +type "`a`" must be an instance of the `Ord` class. + + +A context-qualified type has the following grammar: + +``` +ctxType ::= [ context => ] type +context ::= ( {classId { varId }, }) +classId ::= conId +``` + +In the above example, the class `Ord` had only one type parameter +(*i.e.,* it constrains a single type) but, in general, a type class can +have multiple type parameters. For example, in BH we frequently use the +class "`Bits a n`" which constrains the type represented by `a` to be +representable in bit strings of length represented by the type `n`. + + +> **NOTE:** +> +> When using an overloaded identifier `x` there is always a question of +> whether or not there is enough type information available to the +> compiler to determine which of the overloaded `x`'s you mean. For +> example, if `read` is an overloaded function that takes strings to +> integers or Booleans, and `show` is an overloaded function that takes +> integers or Booleans to strings, then the expression `show (read s)` is +> ambiguous--- is the thing to be read an integer or a Boolean? +> +> In such ambiguous situations, the compiler will so notify you, and you +> may need to give it a little help by inserting an explicit type +> signature, e.g., +> +> ```hs +> show ((read s) :: Bool) +> ``` diff --git a/content/chapter3/_index.md b/content/chapter3/_index.md new file mode 100644 index 0000000..425b7a9 --- /dev/null +++ b/content/chapter3/_index.md @@ -0,0 +1,82 @@ ++++ +title = "Packages" +weight = 3 +sort_by = "weight" +insert_anchor_links = "right" ++++ + +Packages are the outermost constructs in BH--- all BH code must be +inside packages. There should be one package per file. A BH package is a +linguistic device for namespace control, and is particularly useful for +programming-in-the-large. A package does not directly correspond to +hardware modules. (Hardware modules correspond to BH modules, described +in section [5.13](fixme)) + + +A BH package consists of the package header, import declarations, and +top level definitions. The package header indicates which names defined +in this package are exported, *i.e.,* available for import into other +packages. + +``` +packageDefn ::= package packageId ( exportDecl ) where { + { importDecl ; } + { fixityDecl ; } + { topDefn ; } + } +exportDecl ::= varId |typeId [ conList ] +conList ::= (..) +importDecl ::= import [ qualified ] packageId +fixityDecl ::= fixity integer varId +fixity ::= infix |infixl |infixr +packageId ::= conId +``` + +Example: + +```hs +package Foo (x, y) where +import Bar +import Glurph + +-- top level definition ... +-- top level definition ... +-- top level definition ... +``` + +Here, `Foo` is the name of this package, `x` and `y` +are names exported from this package (they will be defined amongst the +top level definitions in this package), and `Bar` and `Glurph` are the +names of package being imported (for use in this package). + + +The export list is a list of identifiers, each optionally followed by +`(..)`. Each identifier in the list will be visible outside the package. +If the exported identifier is the name of `data`, `struct`, or +`interface`, then the constructors or fields of the type will be visible +only if `(..)` is used. Otherwise, if you export only the name of a type +without the `(..)` suffix, the type is an abstract (opaque) data type +outside the package. The list of identifiers may include identifiers +defined in the package as well as identifiers imported from other +packages. + + +If the keyword `qualified` is present in the import declaration all the +imported entities from that package must be referred to by a qualified +name. + + +The fixity declaration can be used to give a precedence level to a +user-defined infix operator. The `infixl` specifies a left associative +operator, `infixr` a right associative operator, and `infix` a +non-associative operator. + + +## Name clashes and qualified names + + +When used in any scope, a name must have an unambiguous meaning. If +there is name clash for a name $x$ because it is defined in the current +package and/or it is available from one or more imported packages, then +the ambiguity can be resolved by using a qualified name of the form +$M.x$ to refer to the version of $x$ contained in package $M$. diff --git a/content/chapter4/_index.md b/content/chapter4/_index.md new file mode 100644 index 0000000..3e1cd7f --- /dev/null +++ b/content/chapter4/_index.md @@ -0,0 +1,12 @@ ++++ +title = "Top Level Definitions" +weight = 4 +sort_by = "weight" +insert_anchor_links = "right" ++++ + +# Top level definitions + + +Top level definitions can be used only on the top level within a +package. diff --git a/content/chapter4/page1.md b/content/chapter4/page1.md new file mode 100644 index 0000000..d572b31 --- /dev/null +++ b/content/chapter4/page1.md @@ -0,0 +1,146 @@ ++++ +title = "`data`" +weight = 1 ++++ + +A `data` definition defines a brand new type, which is different from +every primitive type and every other type defined using a `data` +definition, even if they look structurally similar. The new type defined +by a `data` definition is a "sum of products", or a "union of products". + +``` +topDefn ::= data typeId {tyVarId } = {summand | }[ derive ] +summand ::= conId {type } +summand ::= conId { { fieldDef ; }} +derive ::= deriving ( { classId , }) +fieldDef ::= fieldId :: type +``` + +The *typeId* is the name of this new type. If the *tyVarId*'s exist, +they are type parameters, thereby making this new type polymorphic. In +each *summand*, the *conId* is called a "constructor". You can think of +them as unique *tag*'s that identify each summand. Each *conId* is +followed by a specification for the fields involved in that summand +(*i.e.,* the fields are the "product" within the summand). In the first +way of specifying a summand, the fields are just identified by position, +hence we only specify the types of the fields. In the second way of +specifying a summand, the fields are named, hence we specify the field +names (*fieldId*'s) and their types. + + +The same constructor name may occur in more than one type. The same +field name can occur in more than one type. The same field name can +occur in more than one summand within the same type, but the type of the +field must be the same in each summand. + + +The optional *derive* clause is used as a shorthand to make this new +type an instance of the *classId*'s, instead of using a separate, +full-blown `instance` declaration. This can only be done for certain +predefined *classId*'s: `Bits`, `Eq`, and `Bounded`. The compiler +automatically derives the operations corresponding to those classes +(such as `pack` and `unpack` for the `Bits` class). Type classes, +instances, and `deriving` are described in more detail in sections +[2.1](fixme), [4.5](fixme) and [ +4.6](fixme). + +To construct a value corresponding to some `data` definition $T$, one +simply applies the constructor to the appropriate number of arguments +(see section [5.3](fixme){reference-type="ref" +reference="sec-exprs-constrs"}); the values of those arguments become +the components/fields of the data structure. + + +To extract a component/field from such a value, one uses pattern +matching (see section [6](fixme){reference-type="ref" +reference="sec-patterns"}). + + +Example: + +```hs +data Bool = False | True +``` + + +This is a "trivial" case of a `data` definition. The type is not +polymorphic (no type parameters); there are two summands with +constructors `False` and `True`, and neither constructor has any fields. +It is a 2-way sum of empty products. A value of type `Bool` is either +the value `False` or the value `True` Definitions like these correspond +to an "enum" definition in C. + + +Example: + +```hs +data Operand = Register (Bit 5) + | Literal (Bit 22) + | Indexed (Bit 5) (Bit 5) +``` + + +Here, the first two summands have one field each; the third has two +fields. The fields are positional (no field names). The field of a +`Register` value must have type Bit 5. A value of type `Operand` is +either a `Register` containing a 5-bit value, or a `Literal` containing +a 22-bit value, or an `Indexed` containing two 5-bit values. + + +Example: + +```hs +data Maybe a = Nothing | Just a + deriving (Eq, Bits) +``` + +This is a very useful and commonly used type. Consider a function that, +given a key, looks up a table and returns some value associated with +that key. Such a function can return either `Nothing`, if the table does +not contain an entry for the given key, of `Just `$v$, if the table +contains $v$ associated with the key. The type is polymorphic (type +parameter "`a`") because it may be used with lookup functions for +integer tables, string tables, IP address tables, etc., *i.e.,* we do +not want here to over-specify the type of the value $v$ at which it may +be used. + + +Example: + +```hs +data Instruction = Immediate { op::Op; rs::Reg; rt::CPUReg; imm::UInt16; } + | Jump { op::Op; target::UInt26; } +``` + + +An `Instruction` is either an `Immediate` or a `Jump`. In the former +case, it contains a field called `op` containing a value of type `Op`, a +field called `rs` containing a value of type `Reg`, a field called `rt` +containing a value of type `CPUReg`, and a field called `imm` containing +a value of type `UInt16`. In the latter case, it contains a field called +`op` containing a value of type `Op`, and a field called `target` +containing a value of type `UInt26`. + +> **NOTE:** +> +> Error messages involving data type definitions sometimes show traces of +> how they are handled internally. Data type definitions are translated +> into a data type where each constructor has exactly one argument. The +> types above translate to: +> +> ```hs +> data Bool = False PrimUnit | True PrimUnit +> +> data Operand = Register (Bit 5) +> | Literal (Bit 22) +> | Indexed Operand_$Indexed +> struct Operand_$Indexed = { _1 :: Reg 5; _2 :: Reg 5 } +> +> data Maybe a = Nothing PrimUnit | Just a +> +> data Instruction = Immediate Instruction_$Immediate +> | Register Instruction_$Register +> +> struct Instruction_$Immediate = { op::Op; rs::Reg; rt::CPUReg; imm::UInt16; } +> struct Instruction_$Register = { op::Op; target::UInt26; } +> ``` diff --git a/content/chapter4/page2.md b/content/chapter4/page2.md new file mode 100644 index 0000000..f06c76f --- /dev/null +++ b/content/chapter4/page2.md @@ -0,0 +1,68 @@ ++++ +title = "`struct`" +weight = 1 ++++ + +Defines a record type (a "pure product"). This is a specialized form of +a `data` definition. The same field name may occur in more than one +type. + +``` +topDefn ::= struct typeId {tyVarId }= { { fieldDef ; }} [ derive ] +fieldDef ::= fieldId :: type +``` + +Example: + +``` +struct Proc = { pc :: Addr; rf :: RegFile; mem :: Memory } +struct Coord = { x :: Int; y :: Int } +``` + + +Section [5.6](fixme) describes how to construct values of a +`struct` type. A field of a `struct` type can be extracted either +directly using "dot" notation (section +[5.7](fixme)) or using pattern matching (section +[6.3](fixme)). + + +### Tuples {#sec-tuple-type} + + +One way to group multiple values together is to use a `data` definition +in which a constructor has multiple fields. + + +However, there is a built-in notation for a common form of grouping, +called "tuples". To group two (or more) values together the Prelude +contains a type, `PrimPair`, for which there is syntactic sugar for type +expressions, value expressions, and patterns. + +The type has the following definition + +```hs +struct PrimPair a b = { fst :: a; snd :: b } deriving (Eq, Bits, Bounded) +``` + +For type expressions the following shorthand can be used: + +(a, b) $\equiv$ PrimPair a b + +Or, more generally, + +($t_1$, $t_2$, $\cdots$, $t_n$) $\equiv$ PrimPair $t_1$ (PrimPair $t_2$ ($\cdots$ $t_n$)) + + +There is a corresponding shorthand for value expressions and patterns: + +(a, b) $\equiv$ PrimPair { fst = a; snd = b } + +There is also special syntax for the empty tuple. It is written "`()`" +for types, expressions, and patterns. The real type has the following +definition + +```hs +struct PrimUnit = { } deriving (Eq, Bits, Bounded) +``` + diff --git a/content/chapter4/page3.md b/content/chapter4/page3.md new file mode 100644 index 0000000..e4fc2f5 --- /dev/null +++ b/content/chapter4/page3.md @@ -0,0 +1,38 @@ ++++ +title = "`type`" +weight = 1 ++++ + +Defines a type synonym. These are used purely for readability, *i.e.,* a +type synonym can always be "expanded out" to its definition at any time. + +``` +topDefn ::= type typeId {tyVarId }= type +``` + +Examples: + +```hs +type Byte = Bit 8 +type Word = Bit 16 +type LongWord = Bit 32 +``` + +These provide commonly used names for certain bit lengths. In a +specification of a processor: + +```hs +data RegName = R0 | R1 | ... | R31 +type Rdest = RegName +type Rsrc = RegName +data ArithInstr = Add Rdest Rsrc Rsrc + | Sub Rdest Rsrc Rsrc +``` + +the last two lines suggest the roles of the registers in the +instructions, and is more readable than: + +```hs +data ArithInstr = Add RegName RegName RegName + | Sub RegName RegName RegName +``` diff --git a/content/chapter4/page4.md b/content/chapter4/page4.md new file mode 100644 index 0000000..c3aadbf --- /dev/null +++ b/content/chapter4/page4.md @@ -0,0 +1,43 @@ ++++ +title = "`interface`" +weight = 1 ++++ + +Defines an interface for a hardware module (see section +[5.13](fixme)). An +interface is essentially a `struct`, but its components are restricted +to those things that have a physical interpretation as wires in and out +of a circuit. The types of fields in an interface are more likely to +involve `Action`'s (see section +[5.11](fixme)), +which are typically interpreted as "enable signals" into a circuit. The +fields of an interface are also known as *methods* (not to be confused +with methods of a class, described in Sections +[2.1](fixme) and +[4.5](fixme)). + +``` +topDefn ::= interface typeId {tyVarId }= { { fieldDef ; }} +``` + +Example: + +```hs +interface Stack a = + push :: a -> Action + pop :: Action + top :: Maybe a +``` + +This describes a circuit that implements a stack (a LIFO) of items. This +polymorphic definition does not specify the type of the contents of the +stack, just that they have some type "`a`". Corresponding to the `push` +method, the circuit will have input wires to carry a value of type +"`a`", and a "push-enable" input wire that specifies when the value +present on the input wires should be pushed on the stack. Corresponding +to the `pop` component, the circuit will have a "pop-enable" input wire +that specifies when a value should be popped off the stack. +Corresponding to the `top` component, the circuit will have a set of +output wires: if the stack is empty, the wires will represent the value +`Nothing`, and if the stack is non-empty and $v$ is the value at the top +of the stack, the wires will represent `Maybe` $v$. diff --git a/content/chapter4/page5.md b/content/chapter4/page5.md new file mode 100644 index 0000000..c723c52 --- /dev/null +++ b/content/chapter4/page5.md @@ -0,0 +1,86 @@ ++++ +title = "`class` declarations" +weight = 1 ++++ + +The general concepts behind classes, instances, overloading etc. were +introduced in section [2.1](fixme). A new class is declared using the +following: + +``` +topDefn ::= class [ context => ] classId {tyVarId }[ | funDep ] where { + {varId :: ctxType ; } + } +``` + + +*classId* is the newly declared class. It can be polymorphic, if +*tyVarId*'s exist; these are called the *parameters* of the type class. +The *tyVarId*'s may themselves be constrained by *context*, in which +case the classes named in *context* are called the "super-classes" of +this class. The "*varId*`::`*ctxType*" list declares the class method +names and their types. + +Example (from the Prelude): + +```hs +class Literal a where + fromInteger :: Integer -> a +``` + +This defines the class `Literal`. It says that any type `a` in this +class must have a method (a function) called `fromInteger` that converts +an `Integer` value into the type `a`. In fact, this is the mechanism the +BH uses to interpret literal constants, e.g., to resolve whether a +literal like `6`847 is to be interpreted as a signed integer, an +unsigned integer, a floating point number, a bit value of 10 bits, a bit +value of 8 bits, etc. (This is described in more detail in Section +[5.3](fixme).) + + +Example (from the Prelude): + +```hs +class (Literal a) => Arith a where + (+) :: a -> a -> a + (-) :: a -> a -> a + negate :: a -> a + (*) :: a -> a -> a +``` + + +This defines the class `Arith` with super-class `Literal`. It says that +for any type `a` that is a member of the class `Arith`, it must also be +a member of the class `Literal`, and it must have four methods with the +given names and types. Said another way, an `Arith` type must have a way +to convert integer literals into that type, and it must have addition, +subtraction, negation and multiplication defined on it. + + +The optional *funDep* section specifies *functional dependencies* +between the parameters of the type class: + +``` +funDep ::= { {tyVarId }-> {tyVarId }, } +``` + +These declarations specify that a type parameter may be determined +uniquely by certain other type parameters. For example: + +```hs +class Add x y z | x y -> z, y z -> x, z x -> y +``` + +Here, the class declaration says that for any triple of types `x`, `y` +and `z` that are in the class `Add`, any two of the types uniquely +determines the remaining type, *i.e.,* + + - x and y uniquely determine z, + - y and z uniquely determine x, and + - z and z uniquely determine y. + +See section [8.1](fixme) for more detailed insights into +the use of functional dependencies. + +> **NOTE:** +> Functional dependencies are not currently checked by the compiler. diff --git a/content/chapter4/page6.md b/content/chapter4/page6.md new file mode 100644 index 0000000..c5a4574 --- /dev/null +++ b/content/chapter4/page6.md @@ -0,0 +1,113 @@ ++++ +title = "`instance` declarations" +weight = 1 ++++ + +A type can be declared as an instance of a class in two ways. The +general mechanism is the `instance` declaration; a convenient shortcut +that can sometimes be used is the `deriving` mechanism. + +The general `instance` declaration grammar is the following: + +``` +topDefn ::= instance context => classId {type }where + { {localDefn ; }} +``` + +This can be read as saying that the type *type* is an instance of class +*classId*, provided the constraints of *context* hold, and where the +*localDefn*'s specify the implementation of the methods of the class. + +Sometimes, when a new type is defined using a `data` declaration, it can +simultaneously be made a member of certain useful, predefined classes, +allowing the compiler to choose the "obvious" implementation of the +class methods. This is done using the `deriving` qualification to a +`data` declaration (described in section +[4.1](fixme)) or to a +`struct` declaration (described in section +[4.2](fixme)). The only classes for which `deriving` can +be used for general types are `Bits`, `Eq` and `Bounded`. Furthermore, +`deriving` can be used for any class if the type is a data type that is +isomorphic to a type that has an instance for the derived class. + +### Deriving `Bits` {#sec-deriving-Bits} + +The instances derived for the `Bits` class can be described as follows: + + - For a `struct` type it is simply the the concatenation of the bits for +all the fields. The first field is in the leftmost (most significant) +bits, and so on. + - For a `data` type, all values of the type occupy the same number of +bits, regardless of which disjunct (constructor) it belongs to. This +size is determined by the largest disjunct. The leftmost (most +significant) bits are a code (a tag) for the constructor. As few bits as +possible are used for this. The first constructor in the definition is +coded 0, the next constructor is coded 1, and so on. The size of the +rest of the bits is determined by the largest numbers of bits needed to +encode the fields for the constructors. For each constructor, the fields +are laid out left to right, and the concatenated bits are stored right +justified (*i.e.,* at the least significant bits). For disjuncts that +are smaller than the largest one, the bits between the constructor code +and the field bits, if any, are "don't care" bits. + +Examples: The type + +```hs +data Bool = False | True +``` + +uses one bit. `False` is represented by 0 and `True` by 1. + +```hs +struct Två = { första :: Bit 8; andra:: Bit 16 } +``` + +uses 24 bits with `första` in the upper 8 bits and `andra` +in the lower 16. + +```hs +data Maybe a = Nothing | Just +``` + +a will use $1+n$ bits, +where $n$ bits are needed to represent values of type `a`. The extra bit +will be the most significant bit and it will be 0 (followed by $n$ +unspecified bits) for `Nothing` and 1 (followed by the $n$ bits for `a`) +for `Just`. + + +### Deriving `Eq` + + +The instances derived for the `Eq` class is the natural equality for the +type. For a struct all fields have to be equal, for a data type the +constructors have to be equal and then all their parts. + + +### Deriving `Bounded` + + +An instance for `Bounded` can be derived for an enumeration type, +*i.e.,* a data type where all constructors are niladic. The `minBound` +will be the first constructor and the `maxBound` will be the last. + +`Bounded` can also be derived for a `struct` type if all the field types +of the struct are `Bounded`. The `minBound` will be the struct with all +fields having their respective `minBound`, and correspondingly for +`maxBound`. + +### Deriving for isomorphic types + +A data type with one constructor and one argument is isomorphic to its +type argument. For such a type any one-parameter class can be used, in a +`deriving`, for which there is an instance for the underlying type. + +Example: + +```hs +data Apples = Apple (UInt 32) deriving (Literal, Arith) +five :: Apples +five = 5 +eatApple :: Apples -\> Apples +eatApple n = n - 1 +``` diff --git a/content/chapter4/page7.md b/content/chapter4/page7.md new file mode 100644 index 0000000..bef4cc9 --- /dev/null +++ b/content/chapter4/page7.md @@ -0,0 +1,94 @@ ++++ +title = "Value definitions" +weight = 1 ++++ + +A value definition defines the value of an identifier (which could be a +function). Value definitions are the meat of a BH program. + +Value definitions consist of a type signature followed immediately by +one or more defining clauses: + +``` +topDefn ::= valueDefn +valueDefn ::= varId :: ctxType ; + {clause ; } +clause ::= varId + {apat }[ when guard ]= exp +``` + +The first line of a value definition is the type signature--- it simply +specifies that the identifier *varId* has the type *ctxType*. Subsequent +lines define the value, one clause at a time. The *varId*'s on the +left-hand side of the type signature and on the left-hand side of each +clause must all be the same, *i.e.,* they collectively define a single +*varId*. + +Each clause defines part of the value, using pattern matching and +guards. If there are patterns (*apat*'s) present, then the *varId* being +defined is a function, and the patterns represent arguments to the +function. The *guard* is a list of arbitrary predicates that may use +identifiers bound in the patterns (see Section [7](fixme)). + +The clause should be read as follows: if the function *varId* is applied to +arguments that match the corresponding *apat*'s (in which case, +identifiers in the *apat*'s are bound to the corresponding components of +the arguments), and if the predicates in the *guard* are true, then the +function returns the value of the expression *exp*. + +Example: + +```hs +wordSize :: Integer +wordSize = 16 +``` + + +This simply defines the identifier `wordSize` to have type `Integer` and +value 16. + + +Example: + +```hs +not :: Bool -> Bool +not True = False +not False = True +``` + +This defines the classical Boolean negation function. The type signature +specifies that `not` is a function with argument type `Bool` and result +type `Bool`. After that, the first clause specifies that if the argument +matches the value `True` (*i.e.,* it *is* the value `True`), then it +returns `False`. The final clause specifies that if the argument is +`False` it returns `True`. + + +Example: + +```hs +f :: Maybe Int -> Int -> Int +f (Just x) y when x > 10, Just y’ <- g y = x + y' +f _ _ = 0 +``` + +(If necessary, please first remember the definition of the `Maybe` type, +introduced in section [4.1](fixme)). The first line specifies that +`f` is a function +of two arguments, of type `Maybe Int` and `Int`, respectively, and that +its result has type `Int`. The second line specifies that if the first +argument has the form `Just x` (in which case let us call its component +`x`), if the second argument is anything (let us call it `y`), if `x`'s +value is greater than 10, if the result of applying `g` to `y` has the +form `Just y’` (in which case let us call the component `y’`), then the +result is the value of `x + y’`. In all other cases, the result is the +value 0. The bare underscores in the second line are *wild-card* +patterns that match anything (described in section +[6.1](fixme)). + + +Clauses are attempted in order, from top to bottom, proceeding to the +next clause only if the pattern matching and guard evaluation fail. +Within each clause, pattern matching and guard evaluation are attempted +from left to right. If no clause succeeds, then the system will raise a +"pattern matching error". diff --git a/content/chapter4/page8.md b/content/chapter4/page8.md new file mode 100644 index 0000000..9508a36 --- /dev/null +++ b/content/chapter4/page8.md @@ -0,0 +1,46 @@ ++++ +title = "Calling foreign functions" +weight = 1 ++++ + +A function can be declared to be foreign which means that its +implementation is not in BH. + + +``` +topDefn ::= foreign varId :: type [= string ] [ , ( {string }) ] +``` + +The optional string gives the name of the external "function" to use. If +no string is given the same name as the BH name is used. The optional +strings in parentheses are the port names of the Verilog module that +implements the function. Without port names positional arguments will be +used. + +Example: + +```hs +foreign countOnes :: Bit n -> Bit 32 = "pop_count" +``` + + +A call to `countOnes` will instantiate the Verilog `pop`` ``count` +module. It should have the same number of arguments (with the same type) +as the BH function, *and* an additional trailing argument which is the +result. If the function is (size) polymorphic the instantiated types +will be used as Verilog parameters. + + +Example: using the declaration above an action, with the type of `x` +being `Bit 5`, + +```hs +y := countOnes x +``` + + +will translate to something like + +```hs +pop_count #(5) ires1(R_x, I_y); +``` diff --git a/content/preface/_index.md b/content/preface/_index.md new file mode 100644 index 0000000..404d7b6 --- /dev/null +++ b/content/preface/_index.md @@ -0,0 +1,21 @@ ++++ +title = "UNDER CONSTRUCTION ⚠️" +weight = 5 +sort_by = "weight" +insert_anchor_links = "right" ++++ + +> Note that these docs are under construction and may not be finished +> until summer 2025! +> There are several chapters remaining to complete! + +This is a largely manual attempt(with much assistance from +[Pandoc][pandoc]) to convert the +[Bluespec Haskell/Classic LaTeX docs][bhdocs] to an online +readable markdown format. + +If you find any errors, please reach out to me at +[yehowshua@joyofhardware.com](mailto:yehowshua@joyofhardware.com) + +[pandoc]: https://pandoc.org +[bhdocs]: https://github.com/B-Lang-org/bsc/tree/main/doc/BH_ref_guide diff --git a/sass/_content.scss b/sass/_content.scss new file mode 100644 index 0000000..af1efe3 --- /dev/null +++ b/sass/_content.scss @@ -0,0 +1,231 @@ +@use "variables"; +.page { + position: absolute; + width: calc(100% - #{variables.$sidebar-width}); + height: 100%; + overflow-y: auto; + color: #000; + background: #fff; + padding-bottom: 20px; + transition: 0.5s; + + .zola-anchor { + color: #357aba; + padding-left: 10px; + text-decoration: none; + font-weight: initial; + + &:hover { + text-decoration: underline; + } + } + + img { + max-width: 100%; + } + + &__content { + a { + color: #357aba; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + + hr { + height: 4px; + padding: 0; + margin: 1.7em 0; + overflow: hidden; + background-color: #e7e7e7; + border: none; + } + + pre { + padding: 1rem; + + span { + white-space: pre-wrap; + } + } + + blockquote { + margin: 0; + margin-bottom: .85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; + } + + pre code { + background: none; + } + + code { + display: inline-block; + vertical-align: middle; + padding: 0.1em 0.3em; + border-radius: 3px; + color: #6e6b5e; + background: #f1f1f1; + font-size: 0.875em; + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + } + + iframe { + border: 0; + } + + table { + margin: 0 auto; + border-collapse: collapse; + border-color: #cccccc; + + td { + padding: 3px 20px; + border: 1px solid #ccc; + } + + thead { + th { + padding: 6px 13px; + font-weight: bold; + border: 1px solid #ccc; + } + } + } + + font-size: 1.6rem; + word-wrap: break-word; + line-height: 1.7; + position: relative; + left: 0; + max-width: 800px; + margin: 0 auto; + padding: 0 15px 40px; + + p { + margin-top: 0; + margin-bottom: 0.85em; + } + } + + .previous, .next { + position: fixed; + display: flex; + top: 50px; + bottom: 0; + font-size: 2.5em; + color: #ccc; + text-decoration: none; + text-align: center; + margin: 0; + max-width: 150px; + min-width: 90px; + justify-content: center; + align-content: center; + flex-direction: column; + + &:hover { + color: #333; + } + } + + .previous { + left: variables.$sidebar-width; + float: left; + transition: left 0.5s; + } + + .next { + // not 0 as it goes over the sidebar otherwise + right: 15px; + float: right; + } + + @include variables.max-screen(1250px) { + .previous, .next { + position: static; + top: auto; + display: inline-block; + max-width: 49%; + width: 49%; + + &:hover { + text-decoration: none; + } + } + } +} + +@include variables.min-screen(600px) { + .page { + left: variables.$sidebar-width; + } +} + +.page-without-menu { + width: 100%; + left: 0; + + .previous { + left: 15px; + } +} + +@include variables.max-screen(600px) { + .page { + width: 100%; + left: 0; + } + + .page-without-menu { + left: calc(100% - 100px); + } +} + +.search-container { + display: none; + + &--is-visible { + display: block; + } + + #search { + width: 100%; + padding: 1rem; + border: 1px solid #aaa; + border-radius: 3px; + background-color: #fafafa; + color: #000; + } + + .search-results { + &__header { + font-weight: bold; + padding: 1rem 0rem; + } + + &__items { + margin: 0; + padding: 0; + list-style: none; + } + + &__item { + margin-bottom: 1rem; + } + + &__teaser { + font-size: 90%; + } + } +} + +.search-mode { + .prev-link, .next-link { + display: none; + } +} diff --git a/sass/_document.scss b/sass/_document.scss new file mode 100644 index 0000000..a54f67f --- /dev/null +++ b/sass/_document.scss @@ -0,0 +1,18 @@ +* { + box-sizing: border-box; +} + +html { + font-size: 62.5%; +} + +body, html { + height: 100%; +} + +body { + text-rendering: optimizeLegibility; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + letter-spacing: 0.2px; +} diff --git a/sass/_header.scss b/sass/_header.scss new file mode 100644 index 0000000..a4034c4 --- /dev/null +++ b/sass/_header.scss @@ -0,0 +1,160 @@ +@mixin menu-icon() { + @keyframes clickfirst { + 0% { + transform: translateY(6px) rotate(0deg); + + } + + 100% { + transform: translateY(0) rotate(45deg); + } + } + + @keyframes clickmid { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } + } + + @keyframes clicklast { + 0% { + transform: translateY(-6px) rotate(0deg); + } + + 100% { + transform: translateY(0) rotate(-45deg); + } + } + + @keyframes outfirst { + 0% { + transform: translateY(0) rotate(-45deg); + } + + 100% { + transform: translateY(-6px) rotate(0deg); + } + } + + @keyframes outmid { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + @keyframes outlast { + 0% { + transform: translateY(0) rotate(45deg); + } + + 100% { + transform: translateY(6px) rotate(0deg); + } + } + + span { + position: absolute; + /* fallback for browsers which still doesn't support for `calc()` */ + left: 15px; + top: 25px; + left: calc((100% - 20px) / 2); + top: calc((100% - 1px) / 2); + width: 20px; + height: 2px; + background-color: rgba(0, 0, 0, 0.5); + + &:nth-child(1) { + transform: translateY(6px) rotate(0deg); + } + + &:nth-child(3) { + transform: translateY(-6px) rotate(0deg); + } + } + + &.icon-click { + span:nth-child(1) { + animation-duration: 0.5s; + animation-fill-mode: both; + animation-name: clickfirst; + } + + span:nth-child(2) { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-name: clickmid; + } + + span:nth-child(3) { + animation-duration: 0.5s; + animation-fill-mode: both; + animation-name: clicklast; + } + } + + &.icon-out { + span:nth-child(1) { + animation-duration: 0.5s; + animation-fill-mode: both; + animation-name: outfirst; + } + + span:nth-child(2) { + animation-duration: 0.2s; + animation-fill-mode: both; + animation-name: outmid; + } + + span:nth-child(3) { + animation-duration: 0.5s; + animation-fill-mode: both; + animation-name: outlast; + } + } +} + +.page__header { + height: 50px; + + .menu-icon { + height: 50px; + width: 50px; + font-size: 24px; + text-align: center; + float: left; + position: relative; + transition: background .5s; + cursor: pointer; + + @include menu-icon(); + + &:hover { + span { + background-color: black; + } + } + } + + .search-icon { + height: 50px; + width: 50px; + display: inline-block; + text-align: center; + line-height: 50px; + color: rgba(0, 0, 0, 0.5); + cursor: pointer; + font-size: 2rem; + + &:hover { + color: black + } + } +} diff --git a/sass/_navigation.scss b/sass/_navigation.scss new file mode 100644 index 0000000..c028fa7 --- /dev/null +++ b/sass/_navigation.scss @@ -0,0 +1,57 @@ +@use "variables"; +.menu { + height: 100%; + position: absolute; + left: 0; + overflow-y: auto; + width: 300px; + color: #364149; + background: #fafafa; + border-right: 1px solid rgba(0, 0, 0, 0.07); + transition: 0.5s; + + ul { + list-style: none; + margin: 0; + padding: 0; + + a { + display: block; + color: #364149; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + text-decoration: none; + padding: 10px 15px; + + &:hover { + text-decoration: underline; + } + } + + li.active > a { + color: #0053bc; + text-decoration: none; + } + + ul { + padding-left: 20px; + } + } +} + +.menu-hidden { + width: 0; +} + +@include variables.max-screen(600px) { + .menu { + width: 0; + z-index: 1; + } + + .menu-hidden { + width: calc(100% - 100px); + z-index: 0; + } +} diff --git a/sass/_normalize.scss b/sass/_normalize.scss new file mode 100644 index 0000000..fa4e73d --- /dev/null +++ b/sass/_normalize.scss @@ -0,0 +1,447 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ + +figcaption, +figure, +main { /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ + +details, /* 1 */ +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + */ + +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ + +template { + display: none; +} + +/* Hidden + ========================================================================== */ + +/** + * Add the correct display in IE 10-. + */ + +[hidden] { + display: none; +} diff --git a/sass/_syntax-charcoal.scss b/sass/_syntax-charcoal.scss new file mode 100644 index 0000000..2073236 --- /dev/null +++ b/sass/_syntax-charcoal.scss @@ -0,0 +1,162 @@ +@mixin dark { + .z-code { + color: #cccece; + background-color: #191919; + } + .z-comment, .z-punctuation.z-definition.z-comment { + color: #7e8384; + } + .z-variable { + color: #cccece; + } + .z-keyword, .z-storage.z-type, .z-storage.z-modifier { + color: #c594c5; + } + .z-keyword.z-operator, .z-constant.z-other.z-color, .z-punctuation, .z-meta.z-tag, .z-punctuation.z-definition.z-tag, .z-punctuation.z-separator.z-inheritance.z-php, .z-punctuation.z-definition.z-tag.z-html, .z-punctuation.z-definition.z-tag.z-begin.z-html, .z-punctuation.z-definition.z-tag.z-end.z-html, .z-punctuation.z-section.z-embedded, .z-keyword.z-other.z-template, .z-keyword.z-other.z-substitution { + color: #5fb3b3; + } + .z-entity.z-name.z-tag, .z-meta.z-tag.z-sgml, .z-markup.z-deleted.z-git_gutter { + color: #ff7b84; + } + .z-entity.z-name.z-function, .z-meta.z-function-call, .z-variable.z-function, .z-support.z-function, .z-keyword.z-other.z-special-method, .z-meta.z-block-level { + color: #78aade; + } + .z-support.z-other.z-variable, .z-string.z-other.z-link { + color: #fa7e81; + } + .z-constant.z-numeric, .z-constant.z-language, .z-support.z-constant, .z-constant.z-character, .z-variable.z-parameter, .z-keyword.z-other.z-unit { + color: #f99157; + } + .z-string, .z-constant.z-other.z-symbol, .z-constant.z-other.z-key, .z-entity.z-other.z-inherited-class, .z-markup.z-heading, .z-markup.z-inserted.z-git_gutter, .z-meta.z-group.z-braces.z-curly .z-constant.z-other.z-object.z-key.z-js .z-string.z-unquoted.z-label.z-js { + color: #99c794; + } + .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class, .z-support.z-type, .z-support.z-class, .z-support.z-orther.z-namespace.z-use.z-php, .z-meta.z-use.z-php, .z-support.z-other.z-namespace.z-php, .z-markup.z-changed.z-git_gutter { + color: #fac863; + } + .z-entity.z-name.z-module.z-js, .z-variable.z-import.z-parameter.z-js, .z-variable.z-other.z-class.z-js { + color: #fe7d83; + } + .z-variable.z-language { + color: #fe7d83; + } + .z-entity.z-name.z-method.z-js { + color: #d8dee9; + } + .z-meta.z-class-method.z-js .z-entity.z-name.z-function.z-js, .z-variable.z-function.z-constructor { + color: #d8dee9; + } + .z-entity.z-other.z-attribute-name { + color: #cd91c4; + } + .z-markup.z-inserted { + color: #99c794; + } + .z-markup.z-deleted { + color: #fe7d83; + } + .z-markup.z-changed { + color: #cd91c4; + } + .z-string.z-regexp { + color: #5fb3b3; + } + .z-constant.z-character.z-escape { + color: #5fb3b3; + } + .z-*url*, .z-*link*, .z-*uri* { + text-decoration: underline; + } + .z-constant.z-numeric.z-line-number.z-find-in-files { + color: #cf9a87; + } + .z-entity.z-name.z-filename.z-find-in-files { + color: #99c794; + } + .z-tag.z-decorator.z-js .z-entity.z-name.z-tag.z-js, .z-tag.z-decorator.z-js .z-punctuation.z-definition.z-tag.z-js { + color: #78aade; + } + .z-source.z-js .z-constant.z-other.z-object.z-key.z-js .z-string.z-unquoted.z-label.z-js { + color: #fe7d83; + } +} +@mixin light { + .z-code { + color: #727373; + background-color: #ffffff; + } + .z-comment, .z-punctuation.z-definition.z-comment { + color: #5f6364; + } + .z-variable { + color: #727373; + } + .z-keyword, .z-storage.z-type, .z-storage.z-modifier { + color: #916392; + } + .z-keyword.z-operator, .z-constant.z-other.z-color, .z-punctuation, .z-meta.z-tag, .z-punctuation.z-definition.z-tag, .z-punctuation.z-separator.z-inheritance.z-php, .z-punctuation.z-definition.z-tag.z-html, .z-punctuation.z-definition.z-tag.z-begin.z-html, .z-punctuation.z-definition.z-tag.z-end.z-html, .z-punctuation.z-section.z-embedded, .z-keyword.z-other.z-template, .z-keyword.z-other.z-substitution { + color: #237e7f; + } + .z-entity.z-name.z-tag, .z-meta.z-tag.z-sgml, .z-markup.z-deleted.z-git_gutter { + color: #ca4251; + } + .z-entity.z-name.z-function, .z-meta.z-function-call, .z-variable.z-function, .z-support.z-function, .z-keyword.z-other.z-special-method, .z-meta.z-block-level { + color: #4076a7; + } + .z-support.z-other.z-variable, .z-string.z-other.z-link { + color: #c14c52; + } + .z-constant.z-numeric, .z-constant.z-language, .z-support.z-constant, .z-constant.z-character, .z-variable.z-parameter, .z-keyword.z-other.z-unit { + color: #b75922; + } + .z-string, .z-constant.z-other.z-symbol, .z-constant.z-other.z-key, .z-entity.z-other.z-inherited-class, .z-markup.z-heading, .z-markup.z-inserted.z-git_gutter, .z-meta.z-group.z-braces.z-curly .z-constant.z-other.z-object.z-key.z-js .z-string.z-unquoted.z-label.z-js { + color: #517c4e; + } + .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class, .z-support.z-type, .z-support.z-class, .z-support.z-orther.z-namespace.z-use.z-php, .z-meta.z-use.z-php, .z-support.z-other.z-namespace.z-php, .z-markup.z-changed.z-git_gutter { + color: #926c00; + } + .z-entity.z-name.z-module.z-js, .z-variable.z-import.z-parameter.z-js, .z-variable.z-other.z-class.z-js { + color: #cb414d; + } + .z-variable.z-language { + color: #cb414d; + } + .z-entity.z-name.z-method.z-js { + color: #6c727c; + } + .z-meta.z-class-method.z-js .z-entity.z-name.z-function.z-js, .z-variable.z-function.z-constructor { + color: #6c727c; + } + .z-entity.z-other.z-attribute-name { + color: #996091; + } + .z-markup.z-inserted { + color: #517c4e; + } + .z-markup.z-deleted { + color: #cb414d; + } + .z-markup.z-changed { + color: #996091; + } + .z-string.z-regexp { + color: #237e7f; + } + .z-constant.z-character.z-escape { + color: #237e7f; + } + .z-*url*, .z-*link*, .z-*uri* { + text-decoration: underline; + } + .z-constant.z-numeric.z-line-number.z-find-in-files { + color: #976756; + } + .z-entity.z-name.z-filename.z-find-in-files { + color: #517c4e; + } + .z-tag.z-decorator.z-js .z-entity.z-name.z-tag.z-js, .z-tag.z-decorator.z-js .z-punctuation.z-definition.z-tag.z-js { + color: #4076a7; + } + .z-source.z-js .z-constant.z-other.z-object.z-key.z-js .z-string.z-unquoted.z-label.z-js { + color: #cb414d; + } +} diff --git a/sass/_syntax.scss b/sass/_syntax.scss new file mode 100644 index 0000000..a3007f4 --- /dev/null +++ b/sass/_syntax.scss @@ -0,0 +1,551 @@ +@mixin dark { + .z-code { + color: #bfbab0; + background-color: #191919; + } + .z-comment, .z-punctuation.z-definition.z-comment { + color: #87929f; + font-style: italic; + } + .z-variable { + color: #bfbab0; + } + .z-string, .z-constant.z-other.z-symbol { + color: #c2d94c; + } + .z-constant.z-numeric { + color: #f29718; + } + .z-string.z-regexp, .z-constant.z-character.z-escape { + color: #95e6cb; + } + .z-constant.z-language { + color: #f29718; + } + .z-constant.z-character, .z-constant.z-other { + color: #f29718; + } + .z-variable.z-member { + color: #fe7d83; + } + .z-keyword, .z-keyword.z-operator.z-word { + color: #00bbff; + } + .z-keyword.z-operator { + color: #f29668; + } + .z-punctuation.z-separator, .z-punctuation.z-terminator { + color: #bfbab0; + } + .z-punctuation.z-section { + color: #bfbab0; + } + .z-punctuation.z-accessor { + color: #f29668; + } + .z-punctuation.z-definition.z-annotation { + color: #bfbab0; + } + .z-variable.z-other.z-dollar.z-only.z-js, .z-variable.z-other.z-object.z-dollar.z-only.z-js, .z-variable.z-type.z-dollar.z-only.z-js, .z-support.z-class.z-dollar.z-only.z-js { + color: #e6b673; + } + .z-storage { + color: #00bbff; + } + .z-storage.z-type { + color: #00bbff; + } + .z-entity.z-name.z-function { + color: #ffb454; + } + .z-entity.z-name, .z-entity.z-name.z-tag, .z-entity.z-name.z-label { + color: #59c2ff; + } + .z-entity.z-other.z-inherited-class { + color: #59c2ff; + text-decoration: underline; + } + .z-variable.z-parameter { + color: #f29718; + } + .z-variable.z-language { + color: #39bae6; + font-style: italic; + } + .z-entity.z-name.z-tag, .z-meta.z-tag.z-sgml { + color: #39bae6; + } + .z-punctuation.z-definition.z-tag.z-end, .z-punctuation.z-definition.z-tag.z-begin, .z-punctuation.z-definition.z-tag { + color: #39bae6; + } + .z-entity.z-other.z-attribute-name { + color: #ffb454; + } + .z-variable.z-function, .z-variable.z-annotation { + color: #ffb454; + } + .z-support.z-function, .z-support.z-macro { + color: #fe7d83; + } + .z-support.z-constant { + color: #f29668; + font-style: italic; + } + .z-support.z-type, .z-support.z-class { + color: #39bae6; + font-style: italic; + } + .z-invalid { + color: #ff7c6d; + } + .z-invalid.z-deprecated { + color: #ffffff; + background-color: #00bbff; + } + .z-meta.z-diff, .z-meta.z-diff.z-header { + color: #c594c5; + } + .z-source.z-ruby .z-variable.z-other.z-readwrite { + color: #ffb454; + } + .z-source.z-css .z-entity.z-name.z-tag, .z-source.z-sass .z-entity.z-name.z-tag, .z-source.z-scss .z-entity.z-name.z-tag, .z-source.z-less .z-entity.z-name.z-tag, .z-source.z-stylus .z-entity.z-name.z-tag { + color: #59c2ff; + } + .z-source.z-css .z-support.z-type, .z-source.z-sass .z-support.z-type, .z-source.z-scss .z-support.z-type, .z-source.z-less .z-support.z-type, .z-source.z-stylus .z-support.z-type { + color: #798491; + } + .z-support.z-type.z-property-name { + color: #39bae6; + } + .z-constant.z-numeric.z-line-number.z-find-in-files { + color: #798491; + } + .z-constant.z-numeric.z-line-number.z-match { + color: #00bbff; + } + .z-entity.z-name.z-filename.z-find-in-files { + color: #c2d94c; + } + .z-message.z-error { + color: #ff7c6d; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #39bae6; + } + .z-markup.z-heading { + color: #00bbff; + font-weight: bold; + } + .z-string.z-other.z-link, .z-markup.z-underline.z-link { + color: #95e6cb; + text-decoration: underline; + font-style: italic; + } + .z-punctuation.z-definition.z-image { + color: #ffb454; + } + .z-markup.z-italic { + color: #fe7d83; + font-style: italic; + } + .z-markup.z-bold { + color: #fe7d83; + font-weight: bold; + } + .z-markup.z-italic .z-markup.z-bold, .z-markup.z-bold .z-markup.z-italic { + font-weight: bold; + font-style: italic; + } + .z-markup.z-raw { + background-color: #bfbab0; + } + .z-markup.z-raw.z-inline { + background-color: #bfbab0; + } + .z-meta.z-separator { + color: #798491; + background-color: #bfbab0; + font-weight: bold; + } + .z-markup.z-quote { + color: #f29718; + font-style: italic; + } + .z-markup.z-list.z-numbered.z-bullet, .z-markup.z-list .z-punctuation.z-definition.z-list_item { + color: #95e6cb; + } + .z-markup.z-inserted { + color: #c2d94c; + } + .z-markup.z-changed { + color: #39bae6; + } + .z-markup.z-deleted { + color: #fe7d83; + } + .z-markup.z-strike { + color: #e6b673; + } + .z-markup.z-table { + color: #39bae6; + background-color: #bfbab0; + } + .z-text.z-html.z-markdown .z-markup.z-raw.z-inline { + color: #f29668; + } + .z-text.z-html.z-markdown .z-meta.z-dummy.z-line-break { + color: #798491; + } + .z-markup.z-raw.z-block.z-fenced.z-markdown { + color: #bfbab0; + background-color: #bfbab0; + } + .z-punctuation.z-definition.z-fenced.z-markdown, .z-variable.z-language.z-fenced.z-markdown { + color: #798491; + background-color: #bfbab0; + } + .z-variable.z-language.z-fenced.z-markdown { + color: #798491; + } + .z-markup.z-inserted.z-git_gutter { + color: #c2d94c; + } + .z-markup.z-changed.z-git_gutter { + color: #39bae6; + } + .z-markup.z-deleted.z-git_gutter { + color: #ff7c6d; + } + .z-markup.z-ignored.z-git_gutter { + color: #20272c; + } + .z-markup.z-untracked.z-git_gutter { + color: #20272c; + } + .z-gutter_color { + color: #ffffff; + } + .z-acejump.z-label.z-blue { + color: #ffffff; + background-color: #39bae6; + } + .z-acejump.z-label.z-green { + color: #ffffff; + background-color: #c2d94c; + } + .z-acejump.z-label.z-orange { + color: #ffffff; + background-color: #00bbff; + } + .z-acejump.z-label.z-purple { + color: #ffffff; + background-color: #fe7d83; + } + .z-sublimelinter.z-mark.z-warning { + color: #39bae6; + } + .z-sublimelinter.z-gutter-mark { + color: #ffffff; + } + .z-sublimelinter.z-mark.z-error { + color: #ff7c6d; + } +} +@mixin light { + .z-code { + color: #50565a; + background-color: #fafafa; + } + .z-comment, .z-punctuation.z-definition.z-comment { + color: #676c72; + font-style: italic; + } + .z-variable { + color: #50565a; + } + .z-string, .z-constant.z-other.z-symbol { + color: #497700; + } + .z-constant.z-numeric { + color: #b04e00; + } + .z-string.z-regexp, .z-constant.z-character.z-escape { + color: #007b59; + } + .z-constant.z-language { + color: #b04e00; + } + .z-constant.z-character, .z-constant.z-other { + color: #b04e00; + } + .z-variable.z-member { + color: #c33947; + } + .z-keyword, .z-keyword.z-operator.z-word { + color: #0062e8; + } + .z-keyword.z-operator { + color: #a4552c; + } + .z-punctuation.z-separator, .z-punctuation.z-terminator { + color: #50565a; + } + .z-punctuation.z-section { + color: #50565a; + } + .z-punctuation.z-accessor { + color: #a4552c; + } + .z-punctuation.z-definition.z-annotation { + color: #50565a; + } + .z-variable.z-other.z-dollar.z-only.z-js, .z-variable.z-other.z-object.z-dollar.z-only.z-js, .z-variable.z-type.z-dollar.z-only.z-js, .z-support.z-class.z-dollar.z-only.z-js { + color: #8b6426; + } + .z-storage { + color: #0062e8; + } + .z-storage.z-type { + color: #0062e8; + } + .z-entity.z-name.z-function { + color: #a45600; + } + .z-entity.z-name, .z-entity.z-name.z-tag, .z-entity.z-name.z-label { + color: #0070b3; + } + .z-entity.z-other.z-inherited-class { + color: #0070b3; + text-decoration: underline; + } + .z-variable.z-parameter { + color: #b04e00; + } + .z-variable.z-language { + color: #007492; + font-style: italic; + } + .z-entity.z-name.z-tag, .z-meta.z-tag.z-sgml { + color: #007492; + } + .z-punctuation.z-definition.z-tag.z-end, .z-punctuation.z-definition.z-tag.z-begin, .z-punctuation.z-definition.z-tag { + color: #007492; + } + .z-entity.z-other.z-attribute-name { + color: #a45600; + } + .z-variable.z-function, .z-variable.z-annotation { + color: #a45600; + } + .z-support.z-function, .z-support.z-macro { + color: #b94046; + } + .z-support.z-constant { + color: #a4552c; + font-style: italic; + } + .z-support.z-type, .z-support.z-class { + color: #007492; + font-style: italic; + } + .z-invalid { + color: #da0001; + } + .z-invalid.z-deprecated { + color: #ffffff; + background-color: #0062e8; + } + .z-source.z-ruby .z-variable.z-other.z-readwrite { + color: #a45600; + } + .z-source.z-css .z-entity.z-name.z-tag, .z-source.z-sass .z-entity.z-name.z-tag, .z-source.z-scss .z-entity.z-name.z-tag, .z-source.z-less .z-entity.z-name.z-tag, .z-source.z-stylus .z-entity.z-name.z-tag { + color: #0070b3; + } + .z-source.z-css .z-support.z-type, .z-source.z-sass .z-support.z-type, .z-source.z-scss .z-support.z-type, .z-source.z-less .z-support.z-type, .z-source.z-stylus .z-support.z-type { + color: #676c72; + } + .z-support.z-type.z-property-name { + color: #007492; + } + .z-constant.z-numeric.z-line-number.z-find-in-files { + color: #676c72; + } + .z-constant.z-numeric.z-line-number.z-match { + color: #0062e8; + } + .z-entity.z-name.z-filename.z-find-in-files { + color: #497700; + } + .z-message.z-error { + color: #da0001; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json, .z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-punctuation.z-definition.z-string { + color: #007492; + } + .z-markup.z-heading { + color: #0062e8; + font-weight: bold; + } + .z-string.z-other.z-link, .z-markup.z-underline.z-link { + color: #007b59; + text-decoration: underline; + font-style: italic; + } + .z-punctuation.z-definition.z-image { + color: #a45600; + } + .z-markup.z-italic { + color: #b94046; + font-style: italic; + } + .z-markup.z-bold { + color: #b94046; + font-weight: bold; + } + .z-markup.z-italic .z-markup.z-bold, .z-markup.z-bold .z-markup.z-italic { + font-weight: bold; + font-style: italic; + } + .z-markup.z-raw { + background-color: #50565a; + } + .z-markup.z-raw.z-inline { + background-color: #50565a; + } + .z-meta.z-separator { + color: #676c72; + background-color: #50565a; + font-weight: bold; + } + .z-markup.z-quote { + color: #b04e00; + font-style: italic; + } + .z-markup.z-list.z-numbered.z-bullet, .z-markup.z-list .z-punctuation.z-definition.z-list_item { + color: #007b59; + } + .z-markup.z-inserted { + color: #497700; + } + .z-markup.z-changed { + color: #007492; + } + .z-markup.z-deleted { + color: #b94046; + } + .z-markup.z-strike { + color: #8b6426; + } + .z-markup.z-table { + color: #007492; + background-color: #50565a; + } + .z-text.z-html.z-markdown .z-markup.z-raw.z-inline { + color: #a4552c; + } + .z-text.z-html.z-markdown .z-meta.z-dummy.z-line-break { + color: #676c72; + } + .z-markup.z-raw.z-block.z-fenced.z-markdown { + color: #50565a; + background-color: #50565a; + } + .z-punctuation.z-definition.z-fenced.z-markdown, .z-variable.z-language.z-fenced.z-markdown { + color: #676c72; + background-color: #50565a; + } + .z-variable.z-language.z-fenced.z-markdown { + color: #676c72; + } + .z-markup.z-inserted.z-git_gutter { + color: #497700; + } + .z-markup.z-changed.z-git_gutter { + color: #007492; + } + .z-markup.z-deleted.z-git_gutter { + color: #da0001; + } + .z-markup.z-ignored.z-git_gutter { + color: #696b6c; + } + .z-markup.z-untracked.z-git_gutter { + color: #696b6c; + } + .z-gutter_color { + color: #ffffff; + } + .z-acejump.z-label.z-blue { + color: #ffffff; + background-color: #007492; + } + .z-acejump.z-label.z-green { + color: #ffffff; + background-color: #497700; + } + .z-acejump.z-label.z-orange { + color: #ffffff; + background-color: #0062e8; + } + .z-acejump.z-label.z-purple { + color: #ffffff; + background-color: #b94046; + } + .z-sublimelinter.z-mark.z-warning { + color: #007492; + } + .z-sublimelinter.z-gutter-mark { + color: #ffffff; + } + .z-sublimelinter.z-mark.z-error { + color: #da0001; + } +} diff --git a/sass/_variables.scss b/sass/_variables.scss new file mode 100644 index 0000000..4114b0a --- /dev/null +++ b/sass/_variables.scss @@ -0,0 +1,13 @@ +@mixin min-screen($min-width: $body-width) { + @media screen and (min-width: $min-width) { + @content; + } +} + +@mixin max-screen($max-width: $body-width) { + @media screen and (max-width: $max-width) { + @content; + } +} + +$sidebar-width: 300px; diff --git a/sass/book.scss b/sass/book.scss new file mode 100644 index 0000000..df1c5f7 --- /dev/null +++ b/sass/book.scss @@ -0,0 +1,12 @@ +@charset "utf-8"; + +@use "normalize"; + +@use "variables"; +@use "document"; +@use "navigation"; +@use "content"; +@use "header"; + +@use "syntax" as syntax; +@include syntax.light; diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d4dfd078436cacf00ce4fa9938a32e506819021a GIT binary patch literal 145504 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 HB{Ts5(S#hF literal 0 HcmV?d00001 diff --git a/static/book.js b/static/book.js new file mode 100644 index 0000000..8e4fc10 --- /dev/null +++ b/static/book.js @@ -0,0 +1,223 @@ +function initToggleMenu() { + var $menu = document.querySelector(".menu"); + var $menuIcon = document.querySelector(".menu-icon"); + var $page = document.querySelector(".page"); + $menuIcon.addEventListener("click", function() { + $menu.classList.toggle("menu-hidden"); + $page.classList.toggle("page-without-menu"); + }); +} + +function debounce(func, wait) { + var timeout; + + return function () { + var context = this; + var args = arguments; + clearTimeout(timeout); + + timeout = setTimeout(function () { + timeout = null; + func.apply(context, args); + }, wait); + }; +} + +// Taken from mdbook +// The strategy is as follows: +// First, assign a value to each word in the document: +// Words that correspond to search terms (stemmer aware): 40 +// Normal words: 2 +// First word in a sentence: 8 +// Then use a sliding window with a constant number of words and count the +// sum of the values of the words within the window. Then use the window that got the +// maximum sum. If there are multiple maximas, then get the last one. +// Enclose the terms in . +function makeTeaser(body, terms) { + var TERM_WEIGHT = 40; + var NORMAL_WORD_WEIGHT = 2; + var FIRST_WORD_WEIGHT = 8; + var TEASER_MAX_WORDS = 30; + + var stemmedTerms = terms.map(function (w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var termFound = false; + var index = 0; + var weighted = []; // contains elements of ["word", weight, index_in_document] + + // split in sentences, then words + var sentences = body.toLowerCase().split(". "); + + for (var i in sentences) { + var words = sentences[i].split(" "); + var value = FIRST_WORD_WEIGHT; + + for (var j in words) { + var word = words[j]; + + if (word.length > 0) { + for (var k in stemmedTerms) { + if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) { + value = TERM_WEIGHT; + termFound = true; + } + } + weighted.push([word, value, index]); + value = NORMAL_WORD_WEIGHT; + } + + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + } + + index += 1; // because we split at a two-char boundary '. ' + } + + if (weighted.length === 0) { + return body; + } + + var windowWeights = []; + var windowSize = Math.min(weighted.length, TEASER_MAX_WORDS); + // We add a window with all the weights first + var curSum = 0; + for (var i = 0; i < windowSize; i++) { + curSum += weighted[i][1]; + } + windowWeights.push(curSum); + + for (var i = 0; i < weighted.length - windowSize; i++) { + curSum -= weighted[i][1]; + curSum += weighted[i + windowSize][1]; + windowWeights.push(curSum); + } + + // If we didn't find the term, just pick the first window + var maxSumIndex = 0; + if (termFound) { + var maxFound = 0; + // backwards + for (var i = windowWeights.length - 1; i >= 0; i--) { + if (windowWeights[i] > maxFound) { + maxFound = windowWeights[i]; + maxSumIndex = i; + } + } + } + + var teaser = []; + var startIndex = weighted[maxSumIndex][2]; + for (var i = maxSumIndex; i < maxSumIndex + windowSize; i++) { + var word = weighted[i]; + if (startIndex < word[2]) { + // missing text from index to start of `word` + teaser.push(body.substring(startIndex, word[2])); + startIndex = word[2]; + } + + // add around search terms + if (word[1] === TERM_WEIGHT) { + teaser.push(""); + } + startIndex = word[2] + word[0].length; + teaser.push(body.substring(word[2], startIndex)); + + if (word[1] === TERM_WEIGHT) { + teaser.push(""); + } + } + teaser.push("…"); + return teaser.join(""); +} + +function formatSearchResultItem(item, terms) { + var li = document.createElement("li"); + li.classList.add("search-results__item"); + li.innerHTML = `${item.doc.title}`; + li.innerHTML += `
${makeTeaser(item.doc.body, terms)}
`; + return li; +} + +// Go from the book view to the search view +function toggleSearchMode() { + var $bookContent = document.querySelector(".book-content"); + var $searchContainer = document.querySelector(".search-container"); + if ($searchContainer.classList.contains("search-container--is-visible")) { + $searchContainer.classList.remove("search-container--is-visible"); + document.body.classList.remove("search-mode"); + $bookContent.style.display = "block"; + } else { + $searchContainer.classList.add("search-container--is-visible"); + document.body.classList.add("search-mode"); + $bookContent.style.display = "none"; + document.getElementById("search").focus(); + } +} + +function initSearch() { + var $searchInput = document.getElementById("search"); + if (!$searchInput) { + return; + } + var $searchIcon = document.querySelector(".search-icon"); + $searchIcon.addEventListener("click", toggleSearchMode); + + var $searchResults = document.querySelector(".search-results"); + var $searchResultsHeader = document.querySelector(".search-results__header"); + var $searchResultsItems = document.querySelector(".search-results__items"); + var MAX_ITEMS = 10; + + var options = { + bool: "AND", + fields: { + title: {boost: 2}, + body: {boost: 1}, + } + }; + var currentTerm = ""; + var index = elasticlunr.Index.load(window.searchIndex); + + $searchInput.addEventListener("keyup", debounce(function() { + var term = $searchInput.value.trim(); + if (term === currentTerm || !index) { + return; + } + $searchResults.style.display = term === "" ? "none" : "block"; + $searchResultsItems.innerHTML = ""; + if (term === "") { + return; + } + + var results = index.search(term, options).filter(function (r) { + return r.doc.body !== ""; + }); + if (results.length === 0) { + $searchResultsHeader.innerText = `No search results for '${term}'.`; + return; + } + + currentTerm = term; + $searchResultsHeader.innerText = `${results.length} search results for '${term}':`; + for (var i = 0; i < Math.min(results.length, MAX_ITEMS); i++) { + if (!results[i].doc.body) { + continue; + } + // var item = document.createElement("li"); + // item.innerHTML = formatSearchResultItem(results[i], term.split(" ")); + console.log(results[i]); + $searchResultsItems.appendChild(formatSearchResultItem(results[i], term.split(" "))); + } + }, 150)); +} + +if (document.readyState === "complete" || + (document.readyState !== "loading" && !document.documentElement.doScroll) +) { + initToggleMenu(); +} else { + document.addEventListener("DOMContentLoaded", function () { + initToggleMenu(); + initSearch(); + }); +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..900fdb1 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,130 @@ + + + + + + + + + {% if page %} + {% if page.description %} + + {% elif config.description %} + + {% endif %} + {% elif config.description %} + + {% endif %} + + {% block title %}{{ config.title }}{% endblock title %} + + {% block js %} + {% endblock js %} + + + {% block css %} + + {% endblock css %} + + {% block extra_head %} + {% endblock extra_head %} + + + + + + + + +
+ + +
+ {% if config.build_search_index %} +
+ +
+
+
    +
    +
    + {% endif %} +
    + {% block content %} + {% endblock content %} +
    +
    + + + + +
    + + {% block js_body %} + {% if config.build_search_index %} + + + {% endif %} + + {% endblock js_body %} + + + diff --git a/templates/page.html b/templates/page.html new file mode 100644 index 0000000..d22c2dd --- /dev/null +++ b/templates/page.html @@ -0,0 +1,40 @@ +{% extends "index.html" %} + + +{% block content %} +

    {{ page.title }}

    + {{ page.content | safe }} +{% endblock content %} + +{% block prev_link %} + {% if page.smaller %} + + {% else %} + {# No page before, find the link for the section it's in if there is one #} + {% set parent = get_section(path=page.ancestors | reverse | first) %} + + {% endif %} +{% endblock prev_link %} + +{% block next_link %} + {% if page.higher %} + + {% else %} + {# No page after, find the link for the following section #} + {% set index = get_section(path="_index.md") %} + {% set found_current = false %} + {% for s in index.subsections %} + {% set subsection = get_section(path=s) %} + {% if found_current %} + + {# no break #} + {% set_global found_current = false %} + {% endif %} + {% for p in subsection.pages %} + {% if p.permalink == page.permalink %} + {% set_global found_current = true %} + {% endif %} + {% endfor %} + {% endfor %} + {% endif %} +{% endblock next_link %} diff --git a/templates/section.html b/templates/section.html new file mode 100644 index 0000000..1673ab2 --- /dev/null +++ b/templates/section.html @@ -0,0 +1,52 @@ +{% extends "index.html" %} + +{% block content %} +

    {{ section.title }}

    + {{ section.content | safe }} +{% endblock content %} + +{% block prev_link %} + {# need to find the last page of the previous section or the previous section directly + if there isn't any pages in it #} + {% set index = get_section(path="_index.md") %} + {% set found_current = false %} + {% for s in index.subsections | reverse %} + {% set subsection = get_section(path=s) %} + {% if subsection.permalink == section.permalink %} + {% set_global found_current = true %} + {% else %} + {% if found_current %} + {% if subsection.pages %} + {% set last_page = subsection.pages | last %} + + {% else %} + + {% endif %} + {# no break #} + {% set_global found_current = false %} + {% endif %} + {% endif %} + {% endfor %} +{% endblock prev_link %} + +{% block next_link %} + {% if section.pages %} + {% set next_page = section.pages | first %} + + {% else %} + {# No page in the section, find the link for the following section #} + {% set index = get_section(path="_index.md") %} + {% set found_current = false %} + {% for s in index.subsections %} + {% set subsection = get_section(path=s) %} + {% if found_current %} + + {# no break #} + {% set_global found_current = false %} + {% endif %} + {% if subsection.permalink == section.permalink %} + {% set_global found_current = true %} + {% endif %} + {% endfor %} + {% endif %} +{% endblock next_link %} diff --git a/theme.toml b/theme.toml new file mode 100644 index 0000000..b343822 --- /dev/null +++ b/theme.toml @@ -0,0 +1,13 @@ +name = "book" +description = "A book theme inspired from GitBook/mdBook" +license = "MIT" +homepage = "https://github.com/getzola/book" +min_version = "0.17.0" +demo = "https://getzola.github.io/book/" + +[extra] +book_number_chapters = true + +[author] +name = "Vincent Prouillet" +homepage = "https://www.vincentprouillet.com"