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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 NQPjAWdDY^{{{hj29Gn0E 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"