From cb9a7f4cd117e8739b51ea51776835879e2c55e2 Mon Sep 17 00:00:00 2001 From: Tyler Long Date: Fri, 1 Sep 2017 16:04:22 +0800 Subject: [PATCH] Remove dist/www --- dist/www/all.html | 1408 - dist/www/demos.html | 227 - dist/www/development.html | 163 - dist/www/flowchart.html | 296 - dist/www/fonts/slate.eot | Bin 1876 -> 0 bytes dist/www/fonts/slate.svg | 14 - dist/www/fonts/slate.ttf | Bin 1720 -> 0 bytes dist/www/fonts/slate.woff | Bin 1796 -> 0 bytes dist/www/fonts/slate.woff2 | Bin 796 -> 0 bytes dist/www/gantt.html | 353 - dist/www/images/header.png | Bin 70627 -> 0 bytes dist/www/images/logo.png | Bin 3370 -> 0 bytes dist/www/images/navbar.png | Bin 96 -> 0 bytes dist/www/index.html | 179 - dist/www/javascripts/all.js | 146 - dist/www/javascripts/all_nosearch.js | 44 - dist/www/javascripts/highlight.pack.js | 2 - dist/www/javascripts/lib/mermaid.js | 59095 --------------------- dist/www/mermaidAPI.html | 138 - dist/www/mermaidCLI.html | 158 - dist/www/sequenceDiagram.html | 394 - dist/www/stylesheets/mermaid.forest.css | 1 - dist/www/stylesheets/mono-blue.css | 69 - dist/www/stylesheets/print.css | 261 - dist/www/stylesheets/screen.css | 908 - dist/www/stylesheets/solarized_light.css | 107 - dist/www/upgrading.html | 117 - dist/www/usage.html | 337 - 28 files changed, 64417 deletions(-) delete mode 100644 dist/www/all.html delete mode 100644 dist/www/demos.html delete mode 100644 dist/www/development.html delete mode 100644 dist/www/flowchart.html delete mode 100755 dist/www/fonts/slate.eot delete mode 100644 dist/www/fonts/slate.svg delete mode 100755 dist/www/fonts/slate.ttf delete mode 100755 dist/www/fonts/slate.woff delete mode 100755 dist/www/fonts/slate.woff2 delete mode 100755 dist/www/gantt.html delete mode 100644 dist/www/images/header.png delete mode 100644 dist/www/images/logo.png delete mode 100644 dist/www/images/navbar.png delete mode 100644 dist/www/index.html delete mode 100644 dist/www/javascripts/all.js delete mode 100644 dist/www/javascripts/all_nosearch.js delete mode 100644 dist/www/javascripts/highlight.pack.js delete mode 100644 dist/www/javascripts/lib/mermaid.js delete mode 100644 dist/www/mermaidAPI.html delete mode 100644 dist/www/mermaidCLI.html delete mode 100755 dist/www/sequenceDiagram.html delete mode 100644 dist/www/stylesheets/mermaid.forest.css delete mode 100644 dist/www/stylesheets/mono-blue.css delete mode 100644 dist/www/stylesheets/print.css delete mode 100644 dist/www/stylesheets/screen.css delete mode 100644 dist/www/stylesheets/solarized_light.css delete mode 100644 dist/www/upgrading.html delete mode 100644 dist/www/usage.html diff --git a/dist/www/all.html b/dist/www/all.html deleted file mode 100644 index a416b080c..000000000 --- a/dist/www/all.html +++ /dev/null @@ -1,1408 +0,0 @@ - - - - - - - mermaid - Generation of diagrams and flowcharts from text in a similar manner as markdown. - - - - - - - - - - - - - - - - - - NAV - - - - -
- - - - - -
-
- -
-
-
-
-

mermaid

-

Alt text

-
-

Generation of diagrams and flowcharts from text in a similar manner as markdown.

-
-

Ever wanted to simplify documentation and avoid heavy tools like Visio when explaining your code?

-

This is why mermaid was born, a simple markdown-like script language for generating charts from text via javascript. Try it using our editor.

-

Code examples below:

-

An example of a flowchart

-
graph TD;
-    A-->B;
-    A-->C;
-    B-->D;
-    C-->D;

An example of a sequence diagram

-
sequenceDiagram
-    participant Alice
-    participant Bob
-    Alice->John: Hello John, how are you?
-    loop Healthcheck
-        John->John: Fight against hypochondria
-    end
-    Note right of John: Rational thoughts <br/>prevail...
-    John-->Alice: Great!
-    John->Bob: How about you?
-    Bob-->John: Jolly good!

Example code for a gantt diagram

-
gantt
-        dateFormat  YYYY-MM-DD
-        title Adding GANTT diagram functionality to mermaid
-        section A section
-        Completed task            :done,    des1, 2014-01-06,2014-01-08
-        Active task               :active,  des2, 2014-01-09, 3d
-        Future task               :         des3, after des2, 5d
-        Future task2               :         des4, after des3, 5d
-        section Critical tasks
-        Completed task in the critical line :crit, done, 2014-01-06,24h
-        Implement parser and jison          :crit, done, after des1, 2d
-        Create tests for parser             :crit, active, 3d
-        Future task in critical line        :crit, 5d
-        Create tests for renderer           :2d
-        Add to mermaid                      :1d

Play with mermaid using this editor or this live editor.

-

Credits

-

Many thanks to the d3 and dagre-d3 projects for providing
the graphical layout and drawing libraries! Thanks also to the
js-sequence-diagram project for usage of the grammar for the
sequence diagrams.

-

Mermaid was created by Knut Sveidqvist for easier documentation.

-

Knut has not done all work by himself, here is the full list of the projects contributors.

-

Downstream projects

-

Mermaid is supported in a number of publishing systems and editors. Please report if a plugin/editor is missing from the list below:

- -

Online live editor

-

An editor is available for creating diagrams. With it you can quickly start writing mermaid diagrams. It is possible to:

-
    -
  • save the result as a svg
  • -
  • get a link to a viewer of the diagram
  • -
  • get a link to edit of the diagram to share a diagram so that someone else can tweak it and send a new link back

    -
  • -
  • Editor

    -
  • -
- -

Usage

-

Installation

-

Either use the npm or bower package managers as per below:

-
bower install mermaid --save-dev
npm install mermaid --save-dev

Or download a javascript bundle and a stylesheet, e.g. the urls below are for the default style and the all-in-one javascript - note that #version# should be replaced with version of choice:

-
https://cdn.rawgit.com/knsv/mermaid/#version#/dist/mermaid.css
-https://cdn.rawgit.com/knsv/mermaid/#version#/dist/mermaid.min.js

Ex:

- -

Checkout the latest version and other styles such as forest and dark.

-

There are some bundles to choose from:

-
    -
  • mermaid.js, mermaid.min.js This bundle contains all the javascript libraries you need to run mermaid
  • -
  • mermaid.slim.js, mermaid.slim.min.js This bundle does not contain d3 which is useful for sites that already have d3 in place
  • -
  • mermaidAPI.js, mermaidAPI.min.js, This bundle does not contain the web integration provided in the other packages but has a render function instead returns svg code.
  • -
-

Important:

-
-

It's best to use a specific tag or commit hash in the URL (not a branch). Files are cached permanently after the first request.

-
-

Read more about that at https://rawgit.com/

-

Simple usage on a web page

-

The easiest way to integrate mermaid on a web page requires two elements:

-
    -
  1. Inclusion of the mermaid framework in the html page using a script tag
  2. -
  3. A graph definition on the web page
  4. -
-

If these things are in place mermaid listens to the page load event and when fires, when the page has loaded, it will
locate the graphs n the page and transform them to svg files.

-

Include mermaid on your web page:

-

-<script src="mermaid.min.js"></script>
-<script>mermaid.initialize({startOnLoad:true});</script>

Further down on your page mermaid will look for tags with class="mermaid". From these tags mermaid will try to
read the chart definiton which will be replaced with the svg chart.

-

Define a chart like this:

-
<div class="mermaid">
-    CHART DEFINITION GOES HERE
-</div>

Would end up like this:

-
<div class="mermaid" id="mermaidChart0">
-    <svg>
-        Chart ends up here
-    </svg>
-</div>

An id is also added to mermaid tags without id.

-

Labels out of bounds

-

If you use dynamically loaded fonts that are loaded through CSS, such as Google fonts, mermaid should wait for the
whole page to have been loaded (dom + assets, particularly the fonts file).

-

$(document).load(function() {
mermaid.initialize();
});
over

-

$(document).ready(function() {
mermaid.initialize();
});

-

Not doing so will most likely result in mermaid rendering graphs that have labels out of bounds. The default integration
in mermaid uses the window.load event to start rendering.

-

Calling mermaid.init

-

By default, mermaid.init will be called when the document is ready, finding all elements with
class="mermaid". If you are adding content after mermaid is loaded, or otherwise need
finer-grained control of this behavior, you can call init yourself with:

-
    -
  • a configuration object
  • -
  • some nodes, as
      -
    • a node
    • -
    • an a array-like of nodes
    • -
    • or W3C selector that will find your nodes
    • -
    -
  • -
-

Example:

-
mermaid.init({noteMargin: 10}, ".someOtherClass");

Or with no config object, and a jQuery selection:

-
mermaid.init(undefined, $("#someId .yetAnotherClass"));
- -

Usage with browserify

-

The reader is assumed to know about CommonJS style of module handling and how to use browserify. If not a good place
to start would be http://browserify.org/ website.

-

Minimalistic javascript:

-
mermaid = require('mermaid');
-console.log('Test page! mermaid version'+mermaid.version());

Bundle the javascript with browserify.

-

Us the created bundle on a web page as per example below:

-
<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="UTF-8">
-    <link rel="stylesheet" href="mermaid.css" />
-    <script src="bundle.js"></script>
-</head>
-<body>
-    <div class="mermaid">
-        graph LR
-            A-->B
-            B-->C
-            C-->A
-            D-->C
-    </div>
-</body>
-</html>

API usage

-

The main idea with the API is to be able to call a render function with graph defintion as a string. The render function
will render the graph and call a callback with the resulting svg code. With this approach it is up to the site creator to
fetch the graph definition from the site, perhaps from a textarea, render it and place the graph somewhere in the site.

-

To do this, include mermaidAPI on your web website instead of mermaid.js. The example below show an outline of how this
could be used. The example just logs the resulting svg to the javascript console.

-
<script src="mermaidAPI.js"></script>
-
-<script>
-    mermaidAPI.initialize({
-        startOnLoad:false
-    });
-    $(function(){
-    // Example of using the API
-        var element = document.querySelector("#graphDiv");
-
-        var insertSvg = function(svgCode, bindFunctions){
-            element.innerHTML = svgCode;
-        };
-
-        var graphDefinition = 'graph TB\na-->b';
-        var graph = mermaidAPI.render('graphDiv', graphDefinition, insertSvg);
-    });
-</script>

Sample of API usage together with browserify

-
$ = require('jquery');
-mermaidAPI = require('mermaid').mermaidAPI;
-mermaidAPI.initialize({
-        startOnLoad:false
-    });
-
-$(function(){
-    var graphDefinition = 'graph TB\na-->b';
-    var cb = function(html){
-        console.log(html);
-    }
-    mermaidAPI.render('id1',graphDefinition,cb);
-});

Binding events

-

Sometimes the generated graph also has defined interactions like tooltip and click events. When using the API one must
add those events after the graph has been inserted into the DOM.

-

The example code below is an extract of wheat mermaid does when using the API. The example show how it is possible to
bind events to a svg when using the API for rendering.

-
     var insertSvg = function(svgCode, bindFunctions){
-         element.innerHTML = svgCode;
-         if(typeof callback !== 'undefined'){
-             callback(id);
-         }
-         bindFunctions(element);
-     };
-
-     var id = 'theGraph';
-
-
-     mermaidAPI.render(id,txt,insertSvg, element);
    -
  1. The graph is generated using the render call.
  2. -
  3. After generation the render function calls the provided callback function, in this case its called insertSvg.
  4. -
  5. The callback function is called with two parameters, the svg code of the generated graph and a function. This
    function binds events to the svg after it is inserted into the DOM.
  6. -
  7. Insert the svg code into the DOM for presentation
  8. -
  9. Call the binding function that bainds the events
  10. -
-

Example of a marked renderer

-

This is the renderer used for transforming the documentation from markdown to html with mermaid diagrams in the html.

-
    var renderer = new marked.Renderer();
-    renderer.code = function (code, language) {
-        if(code.match(/^sequenceDiagram/)||code.match(/^graph/)){
-            return '<div class="mermaid">'+code+'</div>';
-        }
-        else{
-            return '<pre><code>'+code+'</code></pre>';
-        }
-    };

Another example in coffeescript that also includes the mermaid script tag into the generated markup.

-
marked = require 'marked'
-
-module.exports = (options) ->
-  hasMermaid = false
-  renderer = new marked.Renderer()
-  renderer.defaultCode = renderer.code
-  renderer.code = (code, language) ->
-    if language is 'mermaid'
-      html = ''
-      if not hasMermaid
-        hasMermaid = true
-        html += '&ltscript src="'+options.mermaidPath+'"></script>'
-      html + '&ltdiv class="mermaid">'+code+'</div>'
-    else
-      @defaultCode(code, language)
-
-  renderer

Advanced usage

-

Error handling

-

When the parser encounters invalid syntax the mermaid.parseError function is called. It is possible to override this
function in order to handle the error in an application specific way.

-

Parsing text without rendering

-

It is also possible to validate the syntax before rendering in order to streamline the user experience. The function
mermaid.parse(txt) takes a text string as an argument and returns true if the text is syntactically correct and
false if it is not. The parseError function will be called when the parse function returns false.

-

The code-example below in meta code illustrates how this could work:

-

-mermaid.parseError = function(err,hash){
-    displayErrorInGui(err);
-};
-
-var textFieldUpdated = function(){
-    var textStr = getTextFromFormField('code');
-
-    if(mermaid.parse(textStr)){
-        reRender(textStr)
-    }
-};
-
-bindEventHandler('change', 'code', textFieldUpdated);

Configuration

-

Mermaid takes a number of options which lets you tweak the rendering of the diagrams. Currently there are three ways of
setting the options in mermaid.

-
    -
  1. Instantiation of the configuration using the initialize call
  2. -
  3. Using the global mermaid object - deprecated
  4. -
  5. using the global mermaid_config object - deprecated
  6. -
  7. Instantiation of the configuration using the mermaid.init call
  8. -
-

The list above has two ways to many of doing this. Three are deprecated and will eventually be removed. The list of
configuration objects are described in the mermaidAPI documentation.

-

Using the mermaidAPI.initialize/mermaid.initialize call

-

The future proof way of setting the configuration is by using the initialization call to mermaid or mermaidAPi depending
on what kind of integration you use.

-
    <script src="../dist/mermaid.js"></script>
-    <script>
-        var config = {
-            startOnLoad:true,
-            flowchart:{
-                    useMaxWidth:false,
-                    htmlLabels:true
-            }
-        };
-        mermaid.initialize(config);
-    </script>
- - -

Using the mermaid object

-

Is it possible to set some configuration via the mermaid object. The two parameters that are supported using this
approach are:

-
    -
  • mermaid.startOnLoad
  • -
  • mermaid.htmlLabels
  • -
-
mermaid.startOnLoad = true;
- -

Using the mermaid_config

-

Is it possible to set some configuration via the mermaid object. The two parameters that are supported using this
approach are:

-
    -
  • mermaid_config.startOnLoad
  • -
  • mermaid_config.htmlLabels
  • -
-
mermaid_config.startOnLoad = true;
- -

Using the mermaid.init call

-

Is it possible to set some configuration via the mermaid object. The two parameters that are supported using this
approach are:

-
    -
  • mermaid_config.startOnLoad
  • -
  • mermaid_config.htmlLabels
  • -
-
mermaid_config.startOnLoad = true;
- -

Flowcharts - Basic Syntax

-

Graph

-

This statement declares a new graph and the direction of the graph layout.

-
%% Example code
-graph TD

This declares a graph oriented from top to bottom.

-
graph TD - Start --> Stop
%% Example code
-graph LR

This declares a graph oriented from left to right.

-

Possible directions are:

-
    -
  • TB - top bottom
  • -
  • BT - bottom top
  • -
  • RL - right left
  • -
  • LR - left right

    -
  • -
  • TD - same as TB

    -
  • -
-
graph LR - Start --> Stop

Nodes & shapes

-

A node (default)

-
graph LR
-    id1
graph LR - id

Note that the id is what is displayed in the box.

-

A node with text

-

It is also possible to set text in the box that differs from the id. If this is done several times, it is the last text
found for the node that will be used. Also if you define edges for the node later on, you can omit text definitions. The
one previously defined will be used when rendering the box.

-
graph LR
-    id1[This is the text in the box]
graph LR - id1[This is the text in the box]

A node with round edges

-
graph LR
-    id1(This is the text in the box);
graph LR - id1(This is the text in the box)

A node in the form of a circle

-
graph LR
-    id1((This is the text in the circle));
graph LR - id1((This is the text in the circle))

A node in an asymetric shape

-
graph LR
-    id1>This is the text in the box]
graph LR - id1>This is the text in the box]

Currently only the shape above is possible and not its mirror. This might change with future releases.

-

A node (rhombus)

-
graph LR
-    id1{This is the text in the box}
graph LR - id1{This is the text in the box}
-

Nodes can be connected with links/edges. It is possible to have different types of links or attach a text string to a link.

- -
graph LR
-    A-->B
graph LR;
-    A-->B
-
graph LR
-    A --- B
graph LR; - A --- B
-
A-- This is the text --- B

or

-
A---|This is the text|B;
graph LR; - A-- This is the text ---B
-
A-->|text|B
graph LR; - A-->|text|B

or

-
A-- text -->B
graph LR; - A-- text -->B
-

-.->

-
graph LR; - A-.->B;
-

-. text .->

-
graph LR; - A-. text .-> B
-

==>

-
graph LR; - A ==> B
-

== text ==>

-
graph LR; - A == text ==> B

Special characters that break syntax

-

It is possible to put text within quotes in order to render more troublesome characters. As in the example below:

-
graph LR
-    d1["This is the (text) in the box"]
graph LR - id1["This is the (text) in the box"]

Entity codes to escape characters

-

It is possible to escape characters using the syntax examplified here.

-

The flowchart defined by the following code:

-
    graph LR
-        A["A double quote:#quot;"] -->B["A dec char:#9829;"]

This would render to the diagram below:

-
graph LR - A["A double quote:#quot;"] -->B["A dec char:#9829;"]

Subgraphs

-
subgraph title
-    graph definition
-end

An example below:

-
 %% Subgraph example
- graph TB
-         subgraph one
-         a1-->a2
-         end
-         subgraph two
-         b1-->b2
-         end
-         subgraph three
-         c1-->c2
-         end
-         c1-->a2
graph TB - c1-->a2 - subgraph one - a1-->a2 - end - subgraph two - b1-->b2 - end - subgraph three - c1-->c2 - end

Interaction

-

It is possible to bind a click event to a node, the click can lead to either a javascript callback or to a link which will be opened in a new browser tab.

-
click nodeId callback
    -
  • nodeId is the id of the node
  • -
  • callback is the name of a javascript function defined on the page displaying the graph, the function will be called with the nodeId as parameter.
  • -
-

Examples of tooltip usage below:

-
<script>
-    var callback = function(){
-        alert('A callback was triggered');
-    }
-<script>
graph LR;
-    A-->B;
-    click A callback "Tooltip for a callback"
-    click B "http://www.github.com" "This is a tooltip for a link"

The tooltip text is surrounded in double quotes. The styles of the tooltip are set by the class .mermaidTooltip.

-
graph LR; - A-->B; - click A callback "Tooltip" - click B "http://www.github.com" "This is a link"
- -

When integration mermaid using the mermaidAPI #mermaidapi the function that binds the events need to be run when the finished graph has been added to the page. This is described in the API usage section.

-

Styling and classes

- -

It is possible to style links. For instance you might want to style a link that is going backwards in the flow. As links
have no ids in the same way as nodes, some other way of deciding what style the links should be attached to is required.
Instead of ids, the order number of when the link was defined in the graph is used. In the example below the style
defined in the linkStyle statement will belong to the fourth link in the graph:

-
linkStyle 3 stroke:#ff3,stroke-width:4px;

Styling a node

-

It is possible to apply specific styles such as a thicker border or a different background color to a node.

-
%% Example code
-graph LR
-    id1(Start)-->id2(Stop)
-    style id1 fill:#f9f,stroke:#333,stroke-width:4px;
-    style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 5, 5;
graph LR - id1(Start)-->id2(Stop) - style id1 fill:#f9f,stroke:#333,stroke-width:4px - style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 5, 5

Classes

-

More convenient then defining the style every time is to define a class of styles and attach this class to the nodes that
should have a different look.

-

a class definition looks like the example below:

-
    classDef className fill:#f9f,stroke:#333,stroke-width:4px;

Attachment of a class to a node is done as per below:

-
    class nodeId1 className;

It is also possible to attach a class to a list of nodes in one statement:

-
    class nodeId1,nodeId2 className;

Css classes

-

It is also possible to pre dine classes in css styles that can be applied from the graph definition as in the example
below:
Example style

-

Example definition

-
graph LR;
-    A-->B[AAABBB];
-    B-->D;
-    class A cssClass;
- - - -

Default class

-

If a class is named default it will be assigned to all classes without specific class definitions.

-
    classDef default fill:#f9f,stroke:#333,stroke-width:4px;

Basic support for fontawesome

-

It is possible to add icons from fontawesome. In order to do so, you need to add the fontwesome as described in the instructions at
the fontawesome web site.

-

The icons are acessed via the syntax fa:#icon class name#.

-

The example code below

-
graph TD
-    B["fa:fa-twitter for peace"]
-    B-->C[fa:fa-ban forbidden]
-    B-->D(fa:fa-spinner);
-    B-->E(A fa:fa-camera-retro perhaps?);

Would render the graph below:

-
graph TD - B["fa:fa-twitter for peace"] - B-->C[fa:fa-ban forbidden] - B-->D(fa:fa-spinner); - B-->E(A fa:fa-camera-retro perhaps?);
- - -
    -
  • In graph declarations, the statements also can now end without a semicolon. After release 0.2.16, ending a graph statement with semicolon is just optional. So the below graph declaration is also valid along with the old declarations of the graph.

    -
  • -
  • A single space is allowed between vertices and the link. However there should not be any space between a vertex and its text and a link and its text. The old syntax of graph declaration will also work and hence this new feature is optional and is introduce to improve readability.

    -
  • -
-

Below is the new declaration of the graph edges which is also valid along with the old declaration of the graph edges.

-
    A[Hard edge] -->|Link text| B(Round edge)
-    B --> C{Decision}
-    C -->|One| D[Result one]
-    C -->|Two| E[Result two]
graph LR - A[Hard edge] -->|Link text| B(Round edge) - B --> C{Decision} - C -->|One| D[Result one] - C -->|Two| E[Result two]
-

Sequence diagrams

-
-

A Sequence diagram is an interaction diagram that shows how processes operate with one another and in what order.

-
-

Mermaid can render sequence diagrams. The code snippet below:

-
%% Example of sequence diagram
-sequenceDiagram
-    Alice->>John: Hello John, how are you?
-    John-->>Alice: Great!

Renders the following diagram:

-
sequenceDiagram - Alice->>John: Hello John, how are you? - John-->>Alice: Great!

Syntax

-

Participants

-

The participants can be defined implicitly as in the first example on this page. The participants or actors are
rendered in order of appearance in the diagram source text. Sometimes you might want to show the participants in a
different order than how they appear in the first message. It is possible to specify the actor's order of
appearance by doing the following:

-
%% Example of sequence diagram
-sequenceDiagram
-    participant John
-    participant Alice
-    Alice->>John: Hello John, how are you?
-    John-->>Alice: Great!

Renders to the diagram below:

-
sequenceDiagram - participant John - participant Alice - Alice->>John: Hello John, how are you? - John-->>Alice: Great!

Messages

-

Messages can be of two displayed either solid or with a dotted line.

-
[Actor][Arrow][Actor]:Message text

There are six types of arrows currently supported:

-

-> which will render a solid line without arrow

-

--> which will render a dotted line without arrow

-

->> which will render a solid line with arrowhead

-

-->> which will render a dotted line with arrowhead

-

-x which will render a solid line with a cross at the end (async)

-

--x which will render a dotted line with a cross at the end (async)

-

Activations

-

It is possible to activate and deactivate an actor. (de)activation can be dedicated declarations:

-
sequenceDiagram
-    Alice->>John: Hello John, how are you?
-    activate John
-    John-->>Alice: Great!
-    deactivate John

Renders to the diagram below:

-
sequenceDiagram - Alice->>John: Hello John, how are you? - activate John - John-->>Alice: Great! - deactivate John

There is also a shortcut notation by appending +/- suffix to the message arrow:

-
sequenceDiagram
-    Alice->>+John: Hello John, how are you?
-    John-->>-Alice: Great!

Activations can be stacked for same actor:

-
sequenceDiagram
-    Alice->>+John: Hello John, how are you?
-    Alice->>+John: John, can yoy hear me?
-    John-->>-Alice: Hi Alice, I can hear you!
-    John-->>-Alice: I feel great!

Stacked activations look like this:

-
sequenceDiagram - Alice->>+John: Hello John, how are you? - Alice->>+John: John, can yoy hear me? - John-->>-Alice: Hi Alice, I can hear you! - John-->>-Alice: I feel great!

Notes

-

It is possible to add notes to a sequence diagram. This is done by the notation
Note [ right of | left of | over ] [Actor]: Text in note content

-

See the example below:

-
%% Example of sequence diagram
-sequenceDiagram
-    participant John
-    Note right of John: Text in note

Renders to the diagram below:

-
sequenceDiagram - participant John - Note right of John: Text in note

It is also possible to create notes spanning two participants:

-
sequenceDiagram
-    Alice->John: Hello John, how are you?
-    Note over Alice,John: A typical interaction
sequenceDiagram - Alice->John: Hello John, how are you? - Note over Alice,John: A typical interaction

Loops

-

It is possible to express loops in a sequence diagram. This is done by the notation

-
loop Loop text
-... statements ...
-end

See the example below

-
%% Example of sequence diagram
-sequenceDiagram
-    Alice->John: Hello John, how are you?
-    loop Reply every minute
-        John-->Alice: Great!
-    end
sequenceDiagram - Alice->John: Hello John, how are you? - loop Every minute - John-->Alice: Great! - end

Alt

-

It is possible to express alternative paths in a sequence diagram. This is done by the notation

-
alt Describing text
-... statements ...
-else
-... statements ...
-end

or if there is sequence that is optional (if without else).

-
opt Describing text
-... statements ...
-end

See the example below

-
%% Example of sequence diagram
-    sequenceDiagram
-        Alice->>Bob: Hello Bob, how are you?
-        alt is sick
-            Bob->>Alice: Not so good :(
-        else is well
-            Bob->>Alice: Feeling fresh like a daisy
-        end
-        opt Extra response
-            Bob->>Alice: Thanks for asking
-        end
sequenceDiagram - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - opt Extra response - Bob->>Alice: Thanks for asking - end

Styling

-

Styling of the a sequence diagram is done by defining a number of css classes. During rendering these classes are extracted from the

-

Classes used

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ClassDescription
actorStyle for the actor box at the top of the diagram.
text.actorStyles for text in the actor box at the top of the diagram.
actor-lineThe vertical line for an actor.
messageLine0Styles for the solid message line.
messageLine1Styles for the dotted message line.
messageTextDefines styles for the text on the message arrows.
labelBoxDefines styles label to left in a loop.
labelTextStyles for the text in label for loops.
loopTextStyles for the text in the loop box.
loopLineDefines styles for the lines in the loop box.
noteStyles for the note box.
noteTextStyles for the text on in the note boxes.
-

Sample stylesheet

-

-body {
-    background: white;
-}
-
-.actor {
-    stroke: #CCCCFF;
-    fill: #ECECFF;
-}
-text.actor {
-    fill:black;
-    stroke:none;
-    font-family: Helvetica;
-}
-
-.actor-line {
-    stroke:grey;
-}
-
-.messageLine0 {
-    stroke-width:1.5;
-    stroke-dasharray: "2 2";
-    marker-end:"url(#arrowhead)";
-    stroke:black;
-}
-
-.messageLine1 {
-    stroke-width:1.5;
-    stroke-dasharray: "2 2";
-    stroke:black;
-}
-
-#arrowhead {
-    fill:black;
-
-}
-
-.messageText {
-    fill:black;
-    stroke:none;
-    font-family: 'trebuchet ms', verdana, arial;
-    font-size:14px;
-}
-
-.labelBox {
-    stroke: #CCCCFF;
-    fill: #ECECFF;
-}
-
-.labelText {
-    fill:black;
-    stroke:none;
-    font-family: 'trebuchet ms', verdana, arial;
-}
-
-.loopText {
-    fill:black;
-    stroke:none;
-    font-family: 'trebuchet ms', verdana, arial;
-}
-
-.loopLine {
-    stroke-width:2;
-    stroke-dasharray: "2 2";
-    marker-end:"url(#arrowhead)";
-    stroke: #CCCCFF;
-}
-
-.note {
-    stroke: #decc93;
-    stroke: #CCCCFF;
-    fill: #fff5ad;
-}
-
-.noteText {
-    fill:black;
-    stroke:none;
-    font-family: 'trebuchet ms', verdana, arial;
-    font-size:14px;
-}

Configuration

-

Is it possible to adjust the margins for rendering the sequence diagram.

-

This is done by defining mermaid.sequenceConfig or by the CLI to use a json file with the configuration. How to use
the CLI is described in the mermaidCLI page.
mermaid.sequenceConfig can be set to a JSON string with config parameters or the corresponding object.

-
mermaid.sequenceConfig = {
-    diagramMarginX:50,
-    diagramMarginY:10,
-    boxTextMargin:5,
-    noteMargin:10,
-    messageMargin:35,
-    mirrorActors:true
-    };

Possible configration params:

- - - - - - - - - - - - - - - - - - - - -
ParamDescriotionDefault value
mirrorActorTurns on/off the rendering of actors below the diagram as well as above itfalse
bottomMarginAdjAdjusts how far down the graph ended. Wide borders styles with css could generate unwantewd clipping which is why this config param exists.1
- -

Gant diagrams

-
-

A Gantt chart is a type of bar chart, first developed by Karol Adamiecki in 1896, and independently by Henry Gantt in the 1910s, that illustrates a project schedule. Gantt charts illustrate the start and finish dates of the terminal elements and summary elements of a project.

-
-

Mermaid can render Gantt diagrams. The code snippet below:

-
%% Example of sequence diagram
-gantt
-    title A Gantt Diagram
-
-    section Section
-    A task           :a1, 2014-01-01, 30d
-    Another task     :after a1  , 20d
-    section Another
-    Task in sec      :2014-01-12  , 12d
-    anther task      : 24d

Renders the following diagram:

-
gantt - title A Gantt Diagram - dateFormat YYYY-MM-DD - section Section - A task :a1, 2014-01-01, 30d - Another task :after a1 , 20d - section Another - Task in sec :2014-01-12 , 12d - anther task : 24d

Syntax

-
%% Example with slection of syntaxes
-        gantt
-        dateFormat  YYYY-MM-DD
-        title Adding GANTT diagram functionality to mermaid
-
-        section A section
-        Completed task            :done,    des1, 2014-01-06,2014-01-08
-        Active task               :active,  des2, 2014-01-09, 3d
-        Future task               :         des3, after des2, 5d
-        Future task2               :         des4, after des3, 5d
-
-        section Critical tasks
-        Completed task in the critical line :crit, done, 2014-01-06,24h
-        Implement parser and jison          :crit, done, after des1, 2d
-        Create tests for parser             :crit, active, 3d
-        Future task in critical line        :crit, 5d
-        Create tests for renderer           :2d
-        Add to mermaid                      :1d
-
-        section Documentation
-        Describe gantt syntax               :active, a1, after des1, 3d
-        Add gantt diagram to demo page      :after a1  , 20h
-        Add another diagram to demo page    :doc1, after a1  , 48h
-
-        section Last section
-        Describe gantt syntax               :after doc1, 3d
-        Add gantt diagram to demo page      : 20h
-        Add another diagram to demo page    : 48h

Renders like below:

-
gantt - dateFormat YYYY-MM-DD - title Adding GANTT diagram functionality to mermaid - - section A section - Completed task :done, des1, 2014-01-06,2014-01-08 - Active task :active, des2, 2014-01-09, 3d - Future task : des3, after des2, 5d - Future task2 : des4, after des3, 5d - - section Critical tasks - Completed task in the critical line :crit, done, 2014-01-06,24h - Implement parser and jison :crit, done, after des1, 2d - Create tests for parser :crit, active, 3d - Future task in critical line :crit, 5d - Create tests for renderer :2d - Add to mermaid :1d - - section Documentation - Describe gantt syntax :active, a1, after des1, 3d - Add gantt diagram to demo page :after a1 , 20h - Add another diagram to demo page :doc1, after a1 , 48h - - section Last section - Describe gantt syntax :after doc1, 3d - Add gantt diagram to demo page : 20h - Add another diagram to demo page : 48h

title

-

Tbd

-

Sections statements

-

Tbd

-

Setting dates

-

Tbd

-

Date format

-

Tbd

-

Diagram definition

-

Input Example Description:

-
YYYY    2014    4 digit year
-YY    14    2 digit year
-Q    1..4    Quarter of year. Sets month to first month in quarter.
-M MM    1..12    Month number
-MMM MMMM    January..Dec    Month name in locale set by moment.locale()
-D DD    1..31    Day of month
-Do    1st..31st    Day of month with ordinal
-DDD DDDD    1..365    Day of year
-X    1410715640.579    Unix timestamp
-x    1410715640579    Unix ms timestamp
-
-Input    Example    Description
-H HH    0..23    24 hour time
-h hh    1..12    12 hour time used with a A.
-a A    am pm    Post or ante meridiem
-m mm    0..59    Minutes
-s ss    0..59    Seconds
-S    0..9    Tenths of a second
-SS    0..99    Hundreds of a second
-SSS    0..999    Thousandths of a second
-Z ZZ    +12:00    Offset from UTC as +-HH:mm, +-HHmm, or Z

More info in: http://momentjs.com/docs/#/parsing/string-format/

-

Scale

-
%a - abbreviated weekday name.
-%A - full weekday name.
-%b - abbreviated month name.
-%B - full month name.
-%c - date and time, as "%a %b %e %H:%M:%S %Y".
-%d - zero-padded day of the month as a decimal number [01,31].
-%e - space-padded day of the month as a decimal number [ 1,31]; equivalent to %_d.
-%H - hour (24-hour clock) as a decimal number [00,23].
-%I - hour (12-hour clock) as a decimal number [01,12].
-%j - day of the year as a decimal number [001,366].
-%m - month as a decimal number [01,12].
-%M - minute as a decimal number [00,59].
-%L - milliseconds as a decimal number [000, 999].
-%p - either AM or PM.
-%S - second as a decimal number [00,61].
-%U - week number of the year (Sunday as the first day of the week) as a decimal number [00,53].
-%w - weekday as a decimal number [0(Sunday),6].
-%W - week number of the year (Monday as the first day of the week) as a decimal number [00,53].
-%x - date, as "%m/%d/%Y".
-%X - time, as "%H:%M:%S".
-%y - year without century as a decimal number [00,99].
-%Y - year with century as a decimal number.
-%Z - time zone offset, such as "-0700".
-%% - a literal "%" character.

More info in: https://github.com/mbostock/d3/wiki/Time-Formatting

-

Styling

-

Styling of the a sequence diagram is done by defining a number of css classes. During rendering these classes are extracted from the

-

Classes used

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ClassDescription
actorStyle for the actor box at the top of the diagram.
text.actorStyles for text in the actor box at the top of the diagram.
actor-lineThe vertical line for an actor.
messageLine0Styles for the solid message line.
messageLine1Styles for the dotted message line.
messageTextDefines styles for the text on the message arrows.
labelBoxDefines styles label to left in a loop.
labelTextStyles for the text in label for loops.
loopTextStyles for the text in the loop box.
loopLineDefines styles for the lines in the loop box.
noteStyles for the note box.
noteTextStyles for the text on in the note boxes.
-

Sample stylesheet

-

-            .grid .tick {
-                stroke: lightgrey;
-                opacity: 0.3;
-                shape-rendering: crispEdges;
-            }
-            .grid path {
-                stroke-width: 0;
-            }
-
-
-            #tag {
-                color: white;
-                background: #FA283D;
-                width: 150px;
-                position: absolute;
-                display: none;
-                padding:3px 6px;
-                margin-left: -80px;
-                font-size: 11px;
-            }
-
-
-
-            #tag:before {
-                border: solid transparent;
-                content: ' ';
-                height: 0;
-                left: 50%;
-                margin-left: -5px;
-                position: absolute;
-                width: 0;
-                border-width: 10px;
-                border-bottom-color: #FA283D;
-                top: -20px;
-            }
-            .taskText {
-                fill:white;
-                text-anchor:middle;
-            }
-            .taskTextOutsideRight {
-                fill:black;
-                text-anchor:start;
-            }
-            .taskTextOutsideLeft {
-                fill:black;
-                text-anchor:end;
-            }

Configuration

-

Is it possible to adjust the margins for rendering the sequence diagram.

-

This is done by defining the sequenceConfig part of the configuration object. Read more about it here. How to use
the CLI is described in the mermaidCLI page.

- -

mermaid CLI

-

Installing mermaid globally (npm install -g mermaid) will expose the mermaid command to your environment, allowing you to generate PNGs from any file containing mermaid markup via the command line.

-

Note: The mermaid command requires PhantomJS (version ^1.9.0) to be installed and available in your $PATH, or you can specify it's location with the -e option. For most environments, npm install -g phantomjs will satisfy this requirement.

-

Usage

-
$ mermaid --help
-
-Usage: mermaid [options] ...
-
-file    The mermaid description file to be rendered
-
-Options:
-  -s --svg             Output SVG instead of PNG (experimental)
-  -p --png             If SVG was selected, and you also want PNG, set this flag
-  -o --outputDir       Directory to save files, will be created automatically, defaults to `cwd`
-  -e --phantomPath     Specify the path to the phantomjs executable
-  -c --sequenceConfig  Specify the path to the file with the configuration to be applied in the sequence diagram
-  -h --help            Show this message
-  -v --verbose         Show logging
-  -w --width           width of the generated png (number)
-  --version            Print version and quit
mermaid testGraph.mmd
-mermaid testGraph.mmd -w 980

Sequence diagram configuration

-

The --sequenceConfig option allows overriding the sequence diagram configuration. It could be useful to increase the width between actors, the notes width or the margin to fit some large texts that are not well rendered with the default configuration, for example.

-

The content of the file must be a JSON like this:

-

-{
-    "diagramMarginX": 100,
-    "diagramMarginY": 10,
-    "actorMargin": 150,
-    "width": 150,
-    "height": 65,
-    "boxMargin": 10,
-    "boxTextMargin": 5,
-    "noteMargin": 10,
-    "messageMargin": 35
-}

These properties will override the default values and if a property is not set in this object, it will left it empty and could raise an error. The current properties (measured in px) are:

-
    -
  • diagramMarginX: Size of the empty space to add at the left-right of the diagram.
  • -
  • diagramMarginY: Size of the empty space to add at the top-bottom of the diagram.
  • -
  • actorMargin: Horizontal space between each participant. The arrows between them would have this size too.
  • -
  • width: Width of the participant box.
  • -
  • height: Height of the participant box.
  • -
  • boxMargin: Blank area around loop boxes.
  • -
  • boxTextMargin: Blank area between the text and the border in a loop box.
  • -
  • noteMargin: Size of the empty space around a note.
  • -
  • messageMargin: Space between messages
  • -
-

CLI Known Issues

-
    -
  • SVG output currently does some replacement on text, as mermaid's SVG output is only appropriate for browsers. Text color and background color is not yet replicated; please use PNGs for most purposes until this is resolved.
  • -
  • SVG output is decidedly non-standard. It works, but may cause issues in some viewers.
  • -
- -

Demos

-

Basic flowchart

-
%% Example diagram
-graph LR
-    A[Square Rect] -- Link text --> B((Circle))
-    A --> C(Round Rect)
-    B --> D{Rhombus}
-    C --> D
graph LR - A[Square Rect] -- Link text --> B((Circle)) - A --> C(Round Rect) - B --> D{Rhombus} - C --> D

Larger flowchart with some styling

-
%% Code for flowchart below
-graph TB
-    sq[Square shape] --> ci((Circle shape))
-
-    subgraph A subgraph
-        od>Odd shape]-- Two line<br>edge comment --> ro
-        di{Diamond with <br/> line break} -.-> ro(Rounded<br>square<br>shape)
-        di==>ro2(Rounded square shape)
-    end
-
-    %% Notice that no text in shape are added here instead that is appended further down
-    e --> od3>Really long text with linebreak<br>in an Odd shape]
-
-    %% Comments after double percent signs
-    e((Inner / circle<br>and some odd <br>special characters)) --> f(,.?!+-*ز)
-
-    cyr[Cyrillic]-->cyr2((Circle shape Начало));
-
-     classDef green fill:#9f6,stroke:#333,stroke-width:2px;
-     classDef orange fill:#f96,stroke:#333,stroke-width:4px;
-     class sq,e green
-     class di orange
graph TB - sq[Square shape] --> ci((Circle shape)) - - subgraph A subgraph - od>Odd shape]-- Two line<br>edge comment --> ro - di{Diamond with <br/> line break} -.-> ro(Rounded<br>square<br>shape) - di==>ro2(Rounded square shape) - end - - %% Notice that no text in shape are added here instead that is appended further down - e --> od3>Really long text with linebreak
in an Odd shape] - - %% Comments after double percent signs - e((Inner / circle
and some odd
special characters)) --> f(,.?!+-*ز) - - cyr[Cyrillic]-->cyr2((Circle shape Начало)); - - classDef green fill:#9f6,stroke:#333,stroke-width:2px; - classDef orange fill:#f96,stroke:#333,stroke-width:4px; - class sq,e green - class di orange

Basic sequence diagram

-
%% Sequence diagram code
-sequenceDiagram
-    Alice ->> Bob: Hello Bob, how are you?
-    Bob-->>John: How about you John?
-    Bob--x Alice: I am good thanks!
-    Bob-x John: I am good thanks!
-    Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
-
-    Bob-->Alice: Checking with John...
-    Alice->John: Yes... John, how are you?
sequenceDiagram - Alice->> Bob: Hello Bob, how are you? - Bob-->> John: How about you John? - Bob--x Alice: I am good thanks! - Bob-x John: I am good thanks! - - Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row. - - Bob-->Alice: Checking with John... - Alice->John: Yes... John, how are you?

Loops, alt and opt

-
%% Sequence diagram code
-sequenceDiagram
-    loop Daily query
-        Alice->>Bob: Hello Bob, how are you?
-        alt is sick
-            Bob->>Alice: Not so good :(
-        else is well
-            Bob->>Alice: Feeling fresh like a daisy
-        end
-
-        opt Extra response
-            Bob->>Alice: Thanks for asking
-        end
-    end
sequenceDiagram - loop Daily query - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - - opt Extra response - Bob->>Alice: Thanks for asking - end - end

Message to self in loop

-
%% Sequence diagram code
-sequenceDiagram
-    participant Alice
-    participant Bob
-    Alice->>John: Hello John, how are you?
-    loop Healthcheck
-        John->>John: Fight against hypochondria
-    end
-    Note right of John: Rational thoughts<br/>prevail...
-    John-->>Alice: Great!
-    John->>Bob: How about you?
-    Bob-->>John: Jolly good!
sequenceDiagram - participant Alice - participant Bob - Alice->>John: Hello John, how are you? - loop Healthcheck - John->>John: Fight against hypochondria - end - Note right of John: Rational thoughts
prevail... - John-->>Alice: Great! - John->>Bob: How about you? - Bob-->>John: Jolly good!
-

mermaidAPI

-

This is the api to be used when handling the integration with the web page instead of using the default integration
(mermaid.js).

-

The core of this api is the render function that given a graph definitionas text renders the graph/diagram and
returns a svg element for the graph. It is is then up to the user of the API to make use of the svg, either insert it
somewhere in the page or something completely different.

-

Configuration

-

These are the default options which can be overridden with the initialization call as in the example below:

-
mermaid.initialize({
-  flowchart:{
-     htmlLabels: false
-  }
-});

logLevel , decides the amount of logging to be used.

-
    -
  • debug: 1
  • -
  • info: 2
  • -
  • warn: 3
  • -
  • error: 4
  • -
  • fatal: 5
    cloneCssStyles - This options controls whether or not the css rules should be copied into the generated svg
    startOnLoad - This options controls whether or mermaid starts when the page loads
    arrowMarkerAbsolute - This options controls whether or arrow markers in html code will be absolute paths or
    an anchor, #. This matters if you are using base tag settings.

    flowchart

    -The object containing configurations specific for flowcharts
    htmlLabels - Flag for setting whether or not a html tag should be used for rendering labels
    on the edges
    useMaxWidth - Flag for setting whether or not a all available width should be used for
    the diagram.

    sequenceDiagram

    -The object containing configurations specific for sequence diagrams
    diagramMarginX - margin to the right and left of the sequence diagram
    diagramMarginY - margin to the over and under the sequence diagram
    actorMargin - Margin between actors
    width - Width of actor boxes
    height - Height of actor boxes
    boxMargin - Margin around loop boxes
    boxTextMargin - margin around the text in loop/alt/opt boxes
    noteMargin - margin around notes
    messageMargin - Space between messages
    mirrorActors - mirror actors under diagram
    bottomMarginAdj - Depending on css styling this might need adjustment.
    Prolongs the edge of the diagram downwards
    useMaxWidth - when this flag is set the height and width is set to 100% and is then scaling with the
    available space if not the absolute space required is used

    gantt

    -The object containing configurations specific for gantt diagrams
    titleTopMargin - margin top for the text over the gantt diagram
    barHeight - the height of the bars in the graph
    barGap - the margin between the different activities in the gantt diagram
    topPadding - margin between title and gantt diagram and between axis and gantt diagram.
    leftPadding - the space allocated for the section name to the left of the activities.
    gridLineStartPadding - Vertical starting position of the grid lines
    fontSize - font size ...
    fontFamily - font family ...
    numberSectionStyles - the number of alternating section styles
    *axisFormatter
    - formatting of the axis, this might need adjustment to match your locale and preferences

    parse

    -Function that parses a mermaid diagram definition. If parsing fails the parseError callback is called and an error is
    thrown and

    version

    -Function returning version information
    ##render
    Function that renders an svg with a graph from a chart definition. Usage example below.
  • -
-
mermaidAPI.initialize({
-     startOnLoad:true
- });
- $(function(){
-     var graphDefinition = 'graph TB\na-->b';
-     var cb = function(svgGraph){
-         console.log(svgGraph);
-     };
-     mermaidAPI.render('id1',graphDefinition,cb);
- });
-

Development

-

Updating the documentation

-

Getting the development environment up

-
    -
  1. Fork the gh-pages branch in the the mermaid repository
  2. -
  3. Do npm install
  4. -
-

Working with the documentation

-

The html files are generated from the source and the markdown files in the docs folder. The site generation is done
using the docker.js framework with the command below.

-
docker -i ../mermaid/ -x "*git*|*travis*|*bin*|*dist*|*node_modules*|*gulp*|*lib*|*editor*|*conf*|*scripts*|*test*|*htmlDocs*" --extras mermaid -w -o htmlDocs

Thus ... One important thing to remember. Do not edit the html files directly! Those changes will be overwritten
when the site is re-generated.

-

Committing the changes

-

Do a pull request to merge the changes to the site.

-

Things to be done in order to add a new diagram type

-

Step 1: Grammar & Parsing

-

Grammar

-

This would be to define a jison grammar for the new diagram type. That should start with a way to identify that the text in the mermaid tag is a diagram of that type. Create a new folder under diagrams for your new diagram type and a parser folder in it. This leads us to step 2.

-

For instance:

-
    -
  • the flowchart starts with the keyword graph.
  • -
  • the sequence diagram starts with the keyword sequenceDiagram
  • -
-

Store data found during parsing

-

There are some jison specific sub steps here where the parser stores the data encountered when parsing the diagram, this data is later used by the renderer. You can during the parsing call a object provided to the parser by the user of the parser. This object can be called during parsing for storing data.

-
statement
-    : 'participant' actor  { $$='actor'; }
-    | signal               { $$='signal'; }
-    | note_statement       { $$='note';  }
-    | 'title' message      { yy.setTitle($2);  }
-    ;

In the extract of the grammar above, it is defined that a call to the setTitle method in the data object will be done when parsing and the title keyword is encountered.

-

Note: Make sure that the parseError function for the parser is defined and calling mermaidPAI.parseError this way a common way of detecting parse errors is provided for the end-user.

-

For more info look in the example diagram type:

-

The yy object has the following function:

-
exports.parseError = function(err,hash){
-   mermaidAPI.parseError(err,hash);
-};

when parsing the yy object is initialized as per below:

-
    var parser;
-    parser = exampleParser.parser;
-    parser.yy = db;

Step 2: Rendering

-

Write a renderer that given the data found during parsing renders the diagram. To look at an example look at sequendeRenderer.js rather then the flowchart renderer as this is a more generic example.

-

Place the renderer in the diagram folder.

-

Step 3: Detection of the new diagram type

-

The second thing to do is to add the capability to detect the new new diagram to type to the detectType in utils.js. The detection should return a key for the new diagram type.

-

Step 4: The final piece - triggering the rendering

-

At this point when mermaid is trying to render the diagram, it will detect it as being of the new type but there will be no match when trying to render the diagram. To fix this add a new case in the switch statement in main.js:init this should match the diagram type returned from step number 2. The code in this new case statement should call the renderer for the diagram type with the data found by the parser as an argument.

-

Usage of the parser as a separate module

-

Setup

-
var graph = require('./graphDb');
-var flow = require('./parser/flow');
-flow.parser.yy = graph;

Parsing

-
flow.parser.parse(text);

Data extraction

-
// Javascript example
-graph.getDirection();
-graph.getVertices();
-graph.getEdges();

The parser is also exposed in the mermaid api by calling:

-
var parser = mermaid.getParser();

Note that the parse needs a graph object to store the data as per:

-
flow.parser.yy = graph;

Look at graphDb.js for more details on that object.

- -

Upgrading to from version -0.4.0

-

Some of the interfaces has been upgraded.

-

Initialization

-

mermaid_config is no longer used. Instead a call to mermaid initialize is done as in the example below:

-

version 0.4.0

-
mermaid_config = {
-    startOnLoad:true
-    };

will look like below in version 0.5.0

-
mermaid.initialize({
-    startOnLoad:true
-});
- -
-
-
- shell - ruby - python -
-
-
- - diff --git a/dist/www/demos.html b/dist/www/demos.html deleted file mode 100644 index 7d0dd7cc3..000000000 --- a/dist/www/demos.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - mermaid - Generation of diagrams and flowcharts from text in a similar manner as markdown. - - - - - - - - - - - - - - - - - - NAV - - - - -
- - - - - -
-
- -
-
-
-
-

Demos

-

Basic flowchart

-
%% Example diagram
-graph LR
-    A[Square Rect] -- Link text --> B((Circle))
-    A --> C(Round Rect)
-    B --> D{Rhombus}
-    C --> D
graph LR - A[Square Rect] -- Link text --> B((Circle)) - A --> C(Round Rect) - B --> D{Rhombus} - C --> D

Larger flowchart with some styling

-
%% Code for flowchart below
-graph TB
-    sq[Square shape] --> ci((Circle shape))
-
-    subgraph A subgraph
-        od>Odd shape]-- Two line<br>edge comment --> ro
-        di{Diamond with <br/> line break} -.-> ro(Rounded<br>square<br>shape)
-        di==>ro2(Rounded square shape)
-    end
-
-    %% Notice that no text in shape are added here instead that is appended further down
-    e --> od3>Really long text with linebreak<br>in an Odd shape]
-
-    %% Comments after double percent signs
-    e((Inner / circle<br>and some odd <br>special characters)) --> f(,.?!+-*ز)
-
-    cyr[Cyrillic]-->cyr2((Circle shape Начало));
-
-     classDef green fill:#9f6,stroke:#333,stroke-width:2px;
-     classDef orange fill:#f96,stroke:#333,stroke-width:4px;
-     class sq,e green
-     class di orange
graph TB - sq[Square shape] --> ci((Circle shape)) - - subgraph A subgraph - od>Odd shape]-- Two line<br>edge comment --> ro - di{Diamond with <br/> line break} -.-> ro(Rounded<br>square<br>shape) - di==>ro2(Rounded square shape) - end - - %% Notice that no text in shape are added here instead that is appended further down - e --> od3>Really long text with linebreak
in an Odd shape] - - %% Comments after double percent signs - e((Inner / circle
and some odd
special characters)) --> f(,.?!+-*ز) - - cyr[Cyrillic]-->cyr2((Circle shape Начало)); - - classDef green fill:#9f6,stroke:#333,stroke-width:2px; - classDef orange fill:#f96,stroke:#333,stroke-width:4px; - class sq,e green - class di orange

Basic sequence diagram

-
%% Sequence diagram code
-sequenceDiagram
-    Alice ->> Bob: Hello Bob, how are you?
-    Bob-->>John: How about you John?
-    Bob--x Alice: I am good thanks!
-    Bob-x John: I am good thanks!
-    Note right of John: Bob thinks a long<br/>long time, so long<br/>that the text does<br/>not fit on a row.
-
-    Bob-->Alice: Checking with John...
-    Alice->John: Yes... John, how are you?
sequenceDiagram - Alice->> Bob: Hello Bob, how are you? - Bob-->> John: How about you John? - Bob--x Alice: I am good thanks! - Bob-x John: I am good thanks! - - Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row. - - Bob-->Alice: Checking with John... - Alice->John: Yes... John, how are you?

Loops, alt and opt

-
%% Sequence diagram code
-sequenceDiagram
-    loop Daily query
-        Alice->>Bob: Hello Bob, how are you?
-        alt is sick
-            Bob->>Alice: Not so good :(
-        else is well
-            Bob->>Alice: Feeling fresh like a daisy
-        end
-
-        opt Extra response
-            Bob->>Alice: Thanks for asking
-        end
-    end
sequenceDiagram - loop Daily query - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - - opt Extra response - Bob->>Alice: Thanks for asking - end - end

Message to self in loop

-
%% Sequence diagram code
-sequenceDiagram
-    participant Alice
-    participant Bob
-    Alice->>John: Hello John, how are you?
-    loop Healthcheck
-        John->>John: Fight against hypochondria
-    end
-    Note right of John: Rational thoughts<br/>prevail...
-    John-->>Alice: Great!
-    John->>Bob: How about you?
-    Bob-->>John: Jolly good!
sequenceDiagram - participant Alice - participant Bob - Alice->>John: Hello John, how are you? - loop Healthcheck - John->>John: Fight against hypochondria - end - Note right of John: Rational thoughts
prevail... - John-->>Alice: Great! - John->>Bob: How about you? - Bob-->>John: Jolly good!
- -
-
-
- shell - ruby - python -
-
-
- - diff --git a/dist/www/development.html b/dist/www/development.html deleted file mode 100644 index 928d71916..000000000 --- a/dist/www/development.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - mermaid - Generation of diagrams and flowcharts from text in a similar manner as markdown. - - - - - - - - - - - - - - - - - - NAV - - - - -
- - - - - -
-
- -
-
-
-
-

Development

-

Updating the documentation

-

Getting the development environment up

-
    -
  1. Fork the gh-pages branch in the the mermaid repository
  2. -
  3. Do npm install
  4. -
-

Working with the documentation

-

The html files are generated from the source and the markdown files in the docs folder. The site generation is done
using the docker.js framework with the command below.

-
docker -i ../mermaid/ -x "*git*|*travis*|*bin*|*dist*|*node_modules*|*gulp*|*lib*|*editor*|*conf*|*scripts*|*test*|*htmlDocs*" --extras mermaid -w -o htmlDocs

Thus ... One important thing to remember. Do not edit the html files directly! Those changes will be overwritten
when the site is re-generated.

-

Committing the changes

-

Do a pull request to merge the changes to the site.

-

Things to be done in order to add a new diagram type

-

Step 1: Grammar & Parsing

-

Grammar

-

This would be to define a jison grammar for the new diagram type. That should start with a way to identify that the text in the mermaid tag is a diagram of that type. Create a new folder under diagrams for your new diagram type and a parser folder in it. This leads us to step 2.

-

For instance:

-
    -
  • the flowchart starts with the keyword graph.
  • -
  • the sequence diagram starts with the keyword sequenceDiagram
  • -
-

Store data found during parsing

-

There are some jison specific sub steps here where the parser stores the data encountered when parsing the diagram, this data is later used by the renderer. You can during the parsing call a object provided to the parser by the user of the parser. This object can be called during parsing for storing data.

-
statement
-    : 'participant' actor  { $$='actor'; }
-    | signal               { $$='signal'; }
-    | note_statement       { $$='note';  }
-    | 'title' message      { yy.setTitle($2);  }
-    ;

In the extract of the grammar above, it is defined that a call to the setTitle method in the data object will be done when parsing and the title keyword is encountered.

-

Note: Make sure that the parseError function for the parser is defined and calling mermaidPAI.parseError this way a common way of detecting parse errors is provided for the end-user.

-

For more info look in the example diagram type:

-

The yy object has the following function:

-
exports.parseError = function(err,hash){
-   mermaidAPI.parseError(err,hash);
-};

when parsing the yy object is initialized as per below:

-
    var parser;
-    parser = exampleParser.parser;
-    parser.yy = db;

Step 2: Rendering

-

Write a renderer that given the data found during parsing renders the diagram. To look at an example look at sequendeRenderer.js rather then the flowchart renderer as this is a more generic example.

-

Place the renderer in the diagram folder.

-

Step 3: Detection of the new diagram type

-

The second thing to do is to add the capability to detect the new new diagram to type to the detectType in utils.js. The detection should return a key for the new diagram type.

-

Step 4: The final piece - triggering the rendering

-

At this point when mermaid is trying to render the diagram, it will detect it as being of the new type but there will be no match when trying to render the diagram. To fix this add a new case in the switch statement in main.js:init this should match the diagram type returned from step number 2. The code in this new case statement should call the renderer for the diagram type with the data found by the parser as an argument.

-

Usage of the parser as a separate module

-

Setup

-
var graph = require('./graphDb');
-var flow = require('./parser/flow');
-flow.parser.yy = graph;

Parsing

-
flow.parser.parse(text);

Data extraction

-
// Javascript example
-graph.getDirection();
-graph.getVertices();
-graph.getEdges();

The parser is also exposed in the mermaid api by calling:

-
var parser = mermaid.getParser();

Note that the parse needs a graph object to store the data as per:

-
flow.parser.yy = graph;

Look at graphDb.js for more details on that object.

- - -
-
-
- shell - ruby - python -
-
-
- - diff --git a/dist/www/flowchart.html b/dist/www/flowchart.html deleted file mode 100644 index a94cf8119..000000000 --- a/dist/www/flowchart.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - mermaid - Generation of diagrams and flowcharts from text in a similar manner as markdown. - - - - - - - - - - - - - - - - - - NAV - - - - -
- - - - - -
-
- -
-
-
-
-

Flowcharts - Basic Syntax

-

Graph

-

This statement declares a new graph and the direction of the graph layout.

-
%% Example code
-graph TD

This declares a graph oriented from top to bottom.

-
graph TD - Start --> Stop
%% Example code
-graph LR

This declares a graph oriented from left to right.

-

Possible directions are:

-
    -
  • TB - top bottom
  • -
  • BT - bottom top
  • -
  • RL - right left
  • -
  • LR - left right

    -
  • -
  • TD - same as TB

    -
  • -
-
graph LR - Start --> Stop

Nodes & shapes

-

A node (default)

-
graph LR
-    id1
graph LR - id

Note that the id is what is displayed in the box.

-

A node with text

-

It is also possible to set text in the box that differs from the id. If this is done several times, it is the last text
found for the node that will be used. Also if you define edges for the node later on, you can omit text definitions. The
one previously defined will be used when rendering the box.

-
graph LR
-    id1[This is the text in the box]
graph LR - id1[This is the text in the box]

A node with round edges

-
graph LR
-    id1(This is the text in the box);
graph LR - id1(This is the text in the box)

A node in the form of a circle

-
graph LR
-    id1((This is the text in the circle));
graph LR - id1((This is the text in the circle))

A node in an asymetric shape

-
graph LR
-    id1>This is the text in the box]
graph LR - id1>This is the text in the box]

Currently only the shape above is possible and not its mirror. This might change with future releases.

-

A node (rhombus)

-
graph LR
-    id1{This is the text in the box}
graph LR - id1{This is the text in the box}
-

Nodes can be connected with links/edges. It is possible to have different types of links or attach a text string to a link.

- -
graph LR
-    A-->B
graph LR;
-    A-->B
-
graph LR
-    A --- B
graph LR; - A --- B
-
A-- This is the text --- B

or

-
A---|This is the text|B;
graph LR; - A-- This is the text ---B
-
A-->|text|B
graph LR; - A-->|text|B

or

-
A-- text -->B
graph LR; - A-- text -->B
-

-.->

-
graph LR; - A-.->B;
-

-. text .->

-
graph LR; - A-. text .-> B
-

==>

-
graph LR; - A ==> B
-

== text ==>

-
graph LR; - A == text ==> B

Special characters that break syntax

-

It is possible to put text within quotes in order to render more troublesome characters. As in the example below:

-
graph LR
-    d1["This is the (text) in the box"]
graph LR - id1["This is the (text) in the box"]

Entity codes to escape characters

-

It is possible to escape characters using the syntax examplified here.

-

The flowchart defined by the following code:

-
    graph LR
-        A["A double quote:#quot;"] -->B["A dec char:#9829;"]

This would render to the diagram below:

-
graph LR - A["A double quote:#quot;"] -->B["A dec char:#9829;"]

Subgraphs

-
subgraph title
-    graph definition
-end

An example below:

-
 %% Subgraph example
- graph TB
-         subgraph one
-         a1-->a2
-         end
-         subgraph two
-         b1-->b2
-         end
-         subgraph three
-         c1-->c2
-         end
-         c1-->a2
graph TB - c1-->a2 - subgraph one - a1-->a2 - end - subgraph two - b1-->b2 - end - subgraph three - c1-->c2 - end

Interaction

-

It is possible to bind a click event to a node, the click can lead to either a javascript callback or to a link which will be opened in a new browser tab.

-
click nodeId callback
    -
  • nodeId is the id of the node
  • -
  • callback is the name of a javascript function defined on the page displaying the graph, the function will be called with the nodeId as parameter.
  • -
-

Examples of tooltip usage below:

-
<script>
-    var callback = function(){
-        alert('A callback was triggered');
-    }
-<script>
graph LR;
-    A-->B;
-    click A callback "Tooltip for a callback"
-    click B "http://www.github.com" "This is a tooltip for a link"

The tooltip text is surrounded in double quotes. The styles of the tooltip are set by the class .mermaidTooltip.

-
graph LR; - A-->B; - click A callback "Tooltip" - click B "http://www.github.com" "This is a link"
- -

When integration mermaid using the mermaidAPI #mermaidapi the function that binds the events need to be run when the finished graph has been added to the page. This is described in the API usage section.

-

Styling and classes

- -

It is possible to style links. For instance you might want to style a link that is going backwards in the flow. As links
have no ids in the same way as nodes, some other way of deciding what style the links should be attached to is required.
Instead of ids, the order number of when the link was defined in the graph is used. In the example below the style
defined in the linkStyle statement will belong to the fourth link in the graph:

-
linkStyle 3 stroke:#ff3,stroke-width:4px;

Styling a node

-

It is possible to apply specific styles such as a thicker border or a different background color to a node.

-
%% Example code
-graph LR
-    id1(Start)-->id2(Stop)
-    style id1 fill:#f9f,stroke:#333,stroke-width:4px;
-    style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 5, 5;
graph LR - id1(Start)-->id2(Stop) - style id1 fill:#f9f,stroke:#333,stroke-width:4px - style id2 fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 5, 5

Classes

-

More convenient then defining the style every time is to define a class of styles and attach this class to the nodes that
should have a different look.

-

a class definition looks like the example below:

-
    classDef className fill:#f9f,stroke:#333,stroke-width:4px;

Attachment of a class to a node is done as per below:

-
    class nodeId1 className;

It is also possible to attach a class to a list of nodes in one statement:

-
    class nodeId1,nodeId2 className;

Css classes

-

It is also possible to pre dine classes in css styles that can be applied from the graph definition as in the example
below:
Example style

-

Example definition

-
graph LR;
-    A-->B[AAABBB];
-    B-->D;
-    class A cssClass;
- - - -

Default class

-

If a class is named default it will be assigned to all classes without specific class definitions.

-
    classDef default fill:#f9f,stroke:#333,stroke-width:4px;

Basic support for fontawesome

-

It is possible to add icons from fontawesome. In order to do so, you need to add the fontwesome as described in the instructions at
the fontawesome web site.

-

The icons are acessed via the syntax fa:#icon class name#.

-

The example code below

-
graph TD
-    B["fa:fa-twitter for peace"]
-    B-->C[fa:fa-ban forbidden]
-    B-->D(fa:fa-spinner);
-    B-->E(A fa:fa-camera-retro perhaps?);

Would render the graph below:

-
graph TD - B["fa:fa-twitter for peace"] - B-->C[fa:fa-ban forbidden] - B-->D(fa:fa-spinner); - B-->E(A fa:fa-camera-retro perhaps?);
- - -
    -
  • In graph declarations, the statements also can now end without a semicolon. After release 0.2.16, ending a graph statement with semicolon is just optional. So the below graph declaration is also valid along with the old declarations of the graph.

    -
  • -
  • A single space is allowed between vertices and the link. However there should not be any space between a vertex and its text and a link and its text. The old syntax of graph declaration will also work and hence this new feature is optional and is introduce to improve readability.

    -
  • -
-

Below is the new declaration of the graph edges which is also valid along with the old declaration of the graph edges.

-
    A[Hard edge] -->|Link text| B(Round edge)
-    B --> C{Decision}
-    C -->|One| D[Result one]
-    C -->|Two| E[Result two]
graph LR - A[Hard edge] -->|Link text| B(Round edge) - B --> C{Decision} - C -->|One| D[Result one] - C -->|Two| E[Result two]
- -
-
-
- shell - ruby - python -
-
-
- - diff --git a/dist/www/fonts/slate.eot b/dist/www/fonts/slate.eot deleted file mode 100755 index 13c4839a1975d4c92d66753d75553f922743c6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1876 zcmaJ?&2Jl35TEDWeRg&sP8)xqh$Kr)Yzaiu#`dnNaHtS!Xx9i53LF}#nAmmP`Xfq= z;s{Zte*qCEK;i~h4hYFPaA-x4sD#vVrBXQ{MIaD@1Ke8kn|8tnQ^fdI9N^x@? zd<=RUJW{D`U;b-v<0kYSA}zO8E|&DaCqF0BzlPme0}$TUZbAP8`m<~GR{K~75*dg= zcCEQu4DE@ZpmS=+>&5muJwb0nf0^x#V!izR7X1vpggLV7&CM3_1j&!tPMS_)mkgrN zC!rsJe5kniow8zt{RT+zltXle=pd}!=-!|+8X9a|iyqm&z#GOh#?Z4hMmoI$K1va6 zrUYgm&_U=R+`ZrJ0!LQ9E`42ef0@uHvC8U zo}w4%B?O&MCX$JGEG)w^HIqqa()pb0xK4IFpUb457c*fwDPqaQf|z%md}h1{#>ac0 zD>_@{@&c$_-fEYWRBE3yj7U8q4MTz%hA^cOxdwei%19MlXpM(P_)+e=@Rm}B>tXap zwoqO*DogaoKF+^`!zvX>{f10 zq*F6dk@0&Ok4=k2cHR|EKKaOn+_Q3KG-~~J-9n!;&D+d{W9=SQ|IqlDm9?y2uUl{( zi(0o$Q@Cby<g+B7U zE7gMM6{=S}Ps}C~lhg72%h#4X&vB-0d)je4Z)w>(?>M%-xE~jH;l@L}Lcyy(n4O9z z65lS`w&R>XbW_^$2bKN!lz(S%N3N!tcP>R={D&-^3rjyfS-aWi!AkH>sk+00G5&qW zC1%n(1Gmpd;5$IPUF_Lw@K%&WbbxEX?LgKcF9x!K$J`8LiMQ^#KsG5yOZ=|rBS1K&l2uG4tC&hwF_o-hDp_Le zTrgI}?0+pse - - -Generated by IcoMoon - - - - - - - - - - diff --git a/dist/www/fonts/slate.ttf b/dist/www/fonts/slate.ttf deleted file mode 100755 index ace9a46a7e1ed6b6ab3de2f30ef3e27c572f88d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 zcmaJ>-D_KA7=PaL@t*V?ZMro%kz(6pV-rwZyCyk@Q7?wb>UJv9`gO6wj7^qiCTUqB zO%X@;7dX69!8^V6LWJzXiw!F%45qgVdLa}=5xvm6E&iVKo-9$jJ@CHI_viaTf`}a2 zC!H2wcyVDVd0amU$>&(FZ8pn0bm7yth{U7dH)`ef4)6r{E^wmO*t_`0^~*QG?-S|8 zt!lYq{5ky*k?|Sy{uTt*p8hrX-@re<)$DYS^+1t{800m!H_O^}@g4X@@W-3w?hZXf zuY!M;^{sNV`qeJ|2)=?Gg`Mqo2XzAEd#oqjAaRXMBJF+c79{T|EPkbe7-PE;5S;Q~ zaGL1Q(r@%{&}khDI-bPX!~GUGz-0@x9Aaiik?BxrHq?#(PnWnI%nYaReOv*$ZSm>?)ctla|1hAG;T1^YPnfOv{N&_J8ekcvoG^Cm?MLpzb znO-8ASEU{s)D{<<&JKz%JjTWAM|EWWzjHMajT;ECdZ?bsKw&|^tZONrkvOuIkI%De zUYTtG_26}0jYK0>4*B1QgBuPLXU?}t^*TiboK|r`R>P0_HD+(cdi{Ze{FKYDLBs0R~?v6B%Rx~Edo2aasT@IJ-vtfG(iE^ z$Awv_E5l{^C4s84a|;3+->t#z!u^V-9Nj!@+Ph(RslFP9tMyA^DCS*vdNzG<@yc2l z`u?ov&H8>AuC0gXeBbj{4$|U#n6XQ^x*FE+&d;P>_lp(J^Zj%8%oMl&cI_ZN6TKO{ zkvFp2-&{yO{TDd~50<`txN&oc<4*8TskuV~pXj~g5i{t$k=GYVU^@bQTx>a5uvcK? zADE$i`dge4A3((KH9;?{zv*7K*f>Jt^humckR5yQeHf=xv0R7Ti)jP&N=%#Ng5wPM z_VCv|5z{smX^sCCV+<0Gsc02b(JH2*RZK;zn2MJ0U5I^E%r-TsOdYDyD_EDQO?BF) z7OFc*Cuk9TtZz5Uo$8RKb(q)a%}C8|gD__z_YMNoV9|<#sst6tUZ*|mXK52w&tq|_ J6Wq-M;U6NW`v(93 diff --git a/dist/www/fonts/slate.woff b/dist/www/fonts/slate.woff deleted file mode 100755 index 1e72e0ee0018119d7c814c2097cc60c0bcd05d84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1796 zcmaJ>&2Jl35TCanZ=GF;-Nqj%Qj#SmwgjS~vAs(b4i$%lc7v*fuR|jhlemtH?Nqf< z5&;$c3y8RZ#0{p83^QtGf$~^ZU#vdPL3b z4fcBr_DN>rKz!G#?&4f~pM4ZRM6a}~ts1aTadwIM%N_dh>UO7#K7YRFXF@YA68l_? z@xFm7>0K?wZ&VUvut!OxMlIIQ5*<0_&Hha~Yl49Y@PK@!7+CqFG*;eClSR)#j$=Xw zNnrjF9T`VX|4zRT99<||DqHk_nzSa(NzO5voBad{L?lOWoE4r?ZbRP(V_X@TZL>{} z(3A8mk}l-3xojrwNJr*pi-lsLQVxSKC{0w##ljO}){#>poy#tYg)pcTCk9|L<3To?f*omEO$b9ODUa}gVj!a zAvUB1l6OCpmTg;7PgnO)phbF-Xik@UVo+OLa3((}zVs*;Zywi?{r}GOL=0{q1ou!q ztD%;HAbGE?Z5HC#RzAMSTXWiN9ioS*i+Usm@#fI}eK@$`F!8DQHtAj`iEnm!UKH}P zNl{d*%%o>TwzLq6ppv_9BR_a$H<|Q)z2RXkyY6k4BJlQ)o4+xU@=Bif%MA~%sib$? zbw%hV*Y96nzi0MvpHdWZeO#D>x^i4rP!XsqKRYk5@ZB2RF5E9QWp(qg81F^VmBvaG ztu(Ggk(kS7r)DyTm#?ozQ4q}d{!9==(dt@sJ_vk&`7k5ChZ~1PD=Sgs?%Z@HoBe#* z_k-a4JvVKwyWWZ=q2@1#9uk~9EfrHBtA=!8%MC` zIGu@c6SyDi7WCym@ z2-w*rE$c_UfviKEL=Vy>={0bo+(i5#P1q3$6VB``hVMrCzU@B6vbqKcPy}m-BtQn- zkylU>byNe6DE>18g5d9bm%bZqa|qF=7&3(|U!AY)%Yg-vOsqKIq$w0D$r*3}ks4=+ z>U6?w2xMd=B$;zQ9v)F1K7KwfQ9|)<9nl&i?6-rchs{I8LC1eK^@#(|^QwB-{VeQz zoHLn@cwG?Yo(X!F(Q8iBOqSNs${h}C*?qJYLuZAnVXqx{ww|}Ux0`ca^V#hz?c7{r z7ldYbmk!M1m3G+IYC6(!VcCzqp&pJkZ#1@kw2W<^EJMqOM;^&dq6ELC*|pK!(cC0< zbZtF%BzLsuTw5O*+eg;dX0a+hcfI=gj8a~qWYJoMamHAo)!Qq|6&~9S8`{d0T?L&% z@$R=P6H0rTp6V+-Dlb>EB67JEMQ>kk%`y}{hvBC(RNEw)*%|U|4>SL+B=3rE@y*rw zR_bLZr&~XN?C;+yx2IilcDnrb?M)}An;DsTe@^rq$9L-UWNqY_oTyWyYisN3CMIh; z*C)b12exYgK^2c4S}J#2YJ+00rUlj%+LqQ7E%lldEc`K|1Bky)iLkwF{Wltvj!{A+PBEzhE3BX) zFBgqmj@&z?N1*=OK?z54T7is8FiA(N66oe`X+cKl>`n&&000000HC;3 zk^ug-#56-JW5JAtMV6Rgj#+|9A(7;@^`+^dWy@Alt7D86w|;R>QMs>d+47HJVfKhH aD;vc&%m&dlj4($-ipx}q&#}A+00017%3vV? diff --git a/dist/www/gantt.html b/dist/www/gantt.html deleted file mode 100755 index b7a9f8f1a..000000000 --- a/dist/www/gantt.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - - mermaid - Generation of diagrams and flowcharts from text in a similar manner as markdown. - - - - - - - - - - - - - - - - - - NAV - - - - -
- - - - -
    -
    -
    - -
    -
    -
    -
    -

    Gant diagrams

    -
    -

    A Gantt chart is a type of bar chart, first developed by Karol Adamiecki in 1896, and independently by Henry Gantt in the 1910s, that illustrates a project schedule. Gantt charts illustrate the start and finish dates of the terminal elements and summary elements of a project.

    -
    -

    Mermaid can render Gantt diagrams. The code snippet below:

    -
    %% Example of sequence diagram
    -gantt
    -    title A Gantt Diagram
    -
    -    section Section
    -    A task           :a1, 2014-01-01, 30d
    -    Another task     :after a1  , 20d
    -    section Another
    -    Task in sec      :2014-01-12  , 12d
    -    anther task      : 24d

    Renders the following diagram:

    -
    gantt - title A Gantt Diagram - dateFormat YYYY-MM-DD - section Section - A task :a1, 2014-01-01, 30d - Another task :after a1 , 20d - section Another - Task in sec :2014-01-12 , 12d - anther task : 24d

    Syntax

    -
    %% Example with slection of syntaxes
    -        gantt
    -        dateFormat  YYYY-MM-DD
    -        title Adding GANTT diagram functionality to mermaid
    -
    -        section A section
    -        Completed task            :done,    des1, 2014-01-06,2014-01-08
    -        Active task               :active,  des2, 2014-01-09, 3d
    -        Future task               :         des3, after des2, 5d
    -        Future task2               :         des4, after des3, 5d
    -
    -        section Critical tasks
    -        Completed task in the critical line :crit, done, 2014-01-06,24h
    -        Implement parser and jison          :crit, done, after des1, 2d
    -        Create tests for parser             :crit, active, 3d
    -        Future task in critical line        :crit, 5d
    -        Create tests for renderer           :2d
    -        Add to mermaid                      :1d
    -
    -        section Documentation
    -        Describe gantt syntax               :active, a1, after des1, 3d
    -        Add gantt diagram to demo page      :after a1  , 20h
    -        Add another diagram to demo page    :doc1, after a1  , 48h
    -
    -        section Last section
    -        Describe gantt syntax               :after doc1, 3d
    -        Add gantt diagram to demo page      : 20h
    -        Add another diagram to demo page    : 48h

    Renders like below:

    -
    gantt - dateFormat YYYY-MM-DD - title Adding GANTT diagram functionality to mermaid - - section A section - Completed task :done, des1, 2014-01-06,2014-01-08 - Active task :active, des2, 2014-01-09, 3d - Future task : des3, after des2, 5d - Future task2 : des4, after des3, 5d - - section Critical tasks - Completed task in the critical line :crit, done, 2014-01-06,24h - Implement parser and jison :crit, done, after des1, 2d - Create tests for parser :crit, active, 3d - Future task in critical line :crit, 5d - Create tests for renderer :2d - Add to mermaid :1d - - section Documentation - Describe gantt syntax :active, a1, after des1, 3d - Add gantt diagram to demo page :after a1 , 20h - Add another diagram to demo page :doc1, after a1 , 48h - - section Last section - Describe gantt syntax :after doc1, 3d - Add gantt diagram to demo page : 20h - Add another diagram to demo page : 48h

    title

    -

    Tbd

    -

    Sections statements

    -

    Tbd

    -

    Setting dates

    -

    Tbd

    -

    Date format

    -

    Tbd

    -

    Diagram definition

    -

    Input Example Description:

    -
    YYYY    2014    4 digit year
    -YY    14    2 digit year
    -Q    1..4    Quarter of year. Sets month to first month in quarter.
    -M MM    1..12    Month number
    -MMM MMMM    January..Dec    Month name in locale set by moment.locale()
    -D DD    1..31    Day of month
    -Do    1st..31st    Day of month with ordinal
    -DDD DDDD    1..365    Day of year
    -X    1410715640.579    Unix timestamp
    -x    1410715640579    Unix ms timestamp
    -
    -Input    Example    Description
    -H HH    0..23    24 hour time
    -h hh    1..12    12 hour time used with a A.
    -a A    am pm    Post or ante meridiem
    -m mm    0..59    Minutes
    -s ss    0..59    Seconds
    -S    0..9    Tenths of a second
    -SS    0..99    Hundreds of a second
    -SSS    0..999    Thousandths of a second
    -Z ZZ    +12:00    Offset from UTC as +-HH:mm, +-HHmm, or Z

    More info in: http://momentjs.com/docs/#/parsing/string-format/

    -

    Scale

    -
    %a - abbreviated weekday name.
    -%A - full weekday name.
    -%b - abbreviated month name.
    -%B - full month name.
    -%c - date and time, as "%a %b %e %H:%M:%S %Y".
    -%d - zero-padded day of the month as a decimal number [01,31].
    -%e - space-padded day of the month as a decimal number [ 1,31]; equivalent to %_d.
    -%H - hour (24-hour clock) as a decimal number [00,23].
    -%I - hour (12-hour clock) as a decimal number [01,12].
    -%j - day of the year as a decimal number [001,366].
    -%m - month as a decimal number [01,12].
    -%M - minute as a decimal number [00,59].
    -%L - milliseconds as a decimal number [000, 999].
    -%p - either AM or PM.
    -%S - second as a decimal number [00,61].
    -%U - week number of the year (Sunday as the first day of the week) as a decimal number [00,53].
    -%w - weekday as a decimal number [0(Sunday),6].
    -%W - week number of the year (Monday as the first day of the week) as a decimal number [00,53].
    -%x - date, as "%m/%d/%Y".
    -%X - time, as "%H:%M:%S".
    -%y - year without century as a decimal number [00,99].
    -%Y - year with century as a decimal number.
    -%Z - time zone offset, such as "-0700".
    -%% - a literal "%" character.

    More info in: https://github.com/mbostock/d3/wiki/Time-Formatting

    -

    Styling

    -

    Styling of the a sequence diagram is done by defining a number of css classes. During rendering these classes are extracted from the

    -

    Classes used

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ClassDescription
    actorStyle for the actor box at the top of the diagram.
    text.actorStyles for text in the actor box at the top of the diagram.
    actor-lineThe vertical line for an actor.
    messageLine0Styles for the solid message line.
    messageLine1Styles for the dotted message line.
    messageTextDefines styles for the text on the message arrows.
    labelBoxDefines styles label to left in a loop.
    labelTextStyles for the text in label for loops.
    loopTextStyles for the text in the loop box.
    loopLineDefines styles for the lines in the loop box.
    noteStyles for the note box.
    noteTextStyles for the text on in the note boxes.
    -

    Sample stylesheet

    -
    
    -            .grid .tick {
    -                stroke: lightgrey;
    -                opacity: 0.3;
    -                shape-rendering: crispEdges;
    -            }
    -            .grid path {
    -                stroke-width: 0;
    -            }
    -
    -
    -            #tag {
    -                color: white;
    -                background: #FA283D;
    -                width: 150px;
    -                position: absolute;
    -                display: none;
    -                padding:3px 6px;
    -                margin-left: -80px;
    -                font-size: 11px;
    -            }
    -
    -
    -
    -            #tag:before {
    -                border: solid transparent;
    -                content: ' ';
    -                height: 0;
    -                left: 50%;
    -                margin-left: -5px;
    -                position: absolute;
    -                width: 0;
    -                border-width: 10px;
    -                border-bottom-color: #FA283D;
    -                top: -20px;
    -            }
    -            .taskText {
    -                fill:white;
    -                text-anchor:middle;
    -            }
    -            .taskTextOutsideRight {
    -                fill:black;
    -                text-anchor:start;
    -            }
    -            .taskTextOutsideLeft {
    -                fill:black;
    -                text-anchor:end;
    -            }

    Configuration

    -

    Is it possible to adjust the margins for rendering the sequence diagram.

    -

    This is done by defining the sequenceConfig part of the configuration object. Read more about it here. How to use
    the CLI is described in the mermaidCLI page.

    - - -
    -
    -
    - shell - ruby - python -
    -
    -
    - - diff --git a/dist/www/images/header.png b/dist/www/images/header.png deleted file mode 100644 index 06159b2c94e22cc09fb507db6c7a1562fe4bdeb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70627 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

    ;K?PPVQIlT!3oVk@*hKt%S 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 diff --git a/dist/www/images/logo.png b/dist/www/images/logo.png deleted file mode 100644 index d622fdd4ee0930b52835401fdd0b3f8f142d1b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3370 zcma)9c|4Ts7avQONg?}$#^?$$W@3gJGj;|U`&z;ngTXA#jEt?aleN->D9YuMr9`xd ziX=%P?r4*xC_^Dj3%}95b$@@{exKj_dEfUr@A;hbJ>Tb?^Ld`<&2V}`n1_@vuL<=N=?I?s0k}HW26n(IpgaH7A zc9Pw_S>AXDG?7Mu5;kn0Yzm$44FF(F*>nOioWueLl0wK-EM)FR8w5-a!a}?dco?2; zNeU&~#xO{3F^=xUm~bL02x4ji#<0K`h8|7?gq8<+p_v-L?-e!nyLjs4=7;}rlv zyx7jl+?_o#;~Vbm;UUYZCe{n^654<8k)7lfMC1W4(Ilfpi^*({;1C@kCSQ zntIJCF>`Q@oY+o_(3S$jUBJ^*=5e)Vqu1*vQB}>SyYk+~KEJu@GDdOOZ@QuZEctNgsQG%PY{AuoRbbEM2_(n09UYUIpg5tXeHGw1QW*Fi_khrhMB zb!X)cXrxJ~e2qBgclfE6kF$nom7fZh?rq9GLaG50Hxc*>- zxYSf;iW?UDys|5#=2db1r#wZ4wMQKRydI{4ebzTkvkae}aU(V4*T%H@K)NhPN*e1w z?HDgK^r+}cqHO*RxKdnpNvp;C!W9+i*7oVrAq(yDN7=^|jq^R*3TC&-%Ks7MSu>UJ-fi|&#riJC%mI8b$hFXWN;+OgRa^{y0WRnjL-a}NMP=~{H0HZ zU7MQ7FTVCq?x_()Bx`r4nE8s~x4?ftofOj)#$B}UZbH1jx|=uZg;{vfEN-K;QYt^< zMU^-)^D;IOQ#huS0%_^?ZAxKhP^DM%in;Hv_M5RyQ1ERoX-_^zd`7(*F%G;n5DXo_ z7~GM29&jd=Q|yQnnn`AgHDqs&HP@oseHPiQe|Ls$IVJkVm?{-dNXS=QG5mHBkEwK6 zGsxWghqx0^QuQ)!S|IZe3U&FjUCrS32~E_xaOWkd%}~*FxdOhtOQPV>^A7QxthBT? z5D_dFbRkz1=vcMg$epTIBy(G%ig)+3#Y10_VN2>J&QYWN2PTZd?hc2Uv#wP5ozh=k zeqsbik%0}Ve%YhA`st`li5G06Iop`-L z-qFVcnQ$fgrnOAuVZynl0Mw@>z}-fU7ea0Q`k}k-jJI2#MOe9UePfOaWp$(goJyqB zmirYk#^lL*l-AO4Gt}qerp#l)pB@vyu+jVjg&)<1>-WAF?TWj)qS`4fvpwn_??w)H zE}J&+!JDl0*>5rSHEJL=-M+gY1~FAud$|ETw{BqBS_+17VpVr(&O}z1Z)kwI!r0`A5R$kkZO~XDpp4H>6 zqY18WZCnt3laR2@b^GiUkim})!x?s|=~J8R6D~pD1NZggja4op4K>C9$3Jy78i?QC z_C?M!fWJ8)+wzB=V=s;Jzx~ER)Ze2_@!CN}TkWBa?p!r@AX_vq0A0n|-=2G(zmkd}=3v zu6fkcWW&40n(6q>`cA|UZU?vTbE diff --git a/dist/www/images/navbar.png b/dist/www/images/navbar.png deleted file mode 100644 index df38e90d87e1a215371b4977e18cde90f8832537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx` - - - - - - mermaid - Generation of diagrams and flowcharts from text in a similar manner as markdown. - - - - - - - - - - - - - - - - - - NAV - - - - -

    - - - - -
      -
      -
      - -
      -
      -
      -
      -

      mermaid

      -

      Alt text

      -
      -

      Generation of diagrams and flowcharts from text in a similar manner as markdown.

      -
      -

      Ever wanted to simplify documentation and avoid heavy tools like Visio when explaining your code?

      -

      This is why mermaid was born, a simple markdown-like script language for generating charts from text via javascript. Try it using our editor.

      -

      Code examples below:

      -

      An example of a flowchart

      -
      graph TD;
      -    A-->B;
      -    A-->C;
      -    B-->D;
      -    C-->D;

      An example of a sequence diagram

      -
      sequenceDiagram
      -    participant Alice
      -    participant Bob
      -    Alice->John: Hello John, how are you?
      -    loop Healthcheck
      -        John->John: Fight against hypochondria
      -    end
      -    Note right of John: Rational thoughts <br/>prevail...
      -    John-->Alice: Great!
      -    John->Bob: How about you?
      -    Bob-->John: Jolly good!

      Example code for a gantt diagram

      -
      gantt
      -        dateFormat  YYYY-MM-DD
      -        title Adding GANTT diagram functionality to mermaid
      -        section A section
      -        Completed task            :done,    des1, 2014-01-06,2014-01-08
      -        Active task               :active,  des2, 2014-01-09, 3d
      -        Future task               :         des3, after des2, 5d
      -        Future task2               :         des4, after des3, 5d
      -        section Critical tasks
      -        Completed task in the critical line :crit, done, 2014-01-06,24h
      -        Implement parser and jison          :crit, done, after des1, 2d
      -        Create tests for parser             :crit, active, 3d
      -        Future task in critical line        :crit, 5d
      -        Create tests for renderer           :2d
      -        Add to mermaid                      :1d

      Play with mermaid using this editor or this live editor.

      -

      Credits

      -

      Many thanks to the d3 and dagre-d3 projects for providing
      the graphical layout and drawing libraries! Thanks also to the
      js-sequence-diagram project for usage of the grammar for the
      sequence diagrams.

      -

      Mermaid was created by Knut Sveidqvist for easier documentation.

      -

      Knut has not done all work by himself, here is the full list of the projects contributors.

      -

      Downstream projects

      -

      Mermaid is supported in a number of publishing systems and editors. Please report if a plugin/editor is missing from the list below:

      - -

      Online live editor

      -

      An editor is available for creating diagrams. With it you can quickly start writing mermaid diagrams. It is possible to:

      -
        -
      • save the result as a svg
      • -
      • get a link to a viewer of the diagram
      • -
      • get a link to edit of the diagram to share a diagram so that someone else can tweak it and send a new link back

        -
      • -
      • Editor

        -
      • -
      - - -
      -
      -
      - shell - ruby - python -
      -
      -
      - - diff --git a/dist/www/javascripts/all.js b/dist/www/javascripts/all.js deleted file mode 100644 index 96b2fe9b4..000000000 --- a/dist/www/javascripts/all.js +++ /dev/null @@ -1,146 +0,0 @@ -!(function () { if ('ontouchstart' in window) { var t, e, n, r, i, o, a = {}; t = function (t, e) { return Math.abs(t[0] - e[0]) > 5 || Math.abs(t[1] - e[1]) > 5 }, e = function (t) { this.startXY = [t.touches[0].clientX, t.touches[0].clientY], this.threshold = !1 }, n = function (e) { return this.threshold ? !1 : void (this.threshold = t(this.startXY, [e.touches[0].clientX, e.touches[0].clientY])) }, r = function (e) { if (!this.threshold && !t(this.startXY, [e.changedTouches[0].clientX, e.changedTouches[0].clientY])) { var n = e.changedTouches[0], r = document.createEvent('MouseEvents'); r.initMouseEvent('click', !0, !0, window, 0, n.screenX, n.screenY, n.clientX, n.clientY, !1, !1, !1, !1, 0, null), r.simulated = !0, e.target.dispatchEvent(r) } }, i = function (t) { var e = Date.now(), n = e - a.time, r = t.clientX, i = t.clientY, s = [Math.abs(a.x - r), Math.abs(a.y - i)], u = o(t.target, 'A') || t.target, c = u.nodeName, l = c === 'A', h = window.navigator.standalone && l && t.target.getAttribute('href'); return a.time = e, a.x = r, a.y = i, (!t.simulated && (n < 500 || n < 1500 && s[0] < 50 && s[1] < 50) || h) && (t.preventDefault(), t.stopPropagation(), !h) ? !1 : (h && (window.location = u.getAttribute('href')), void (u && u.classList && (u.classList.add('energize-focus'), window.setTimeout(function () { u.classList.remove('energize-focus') }, 150)))) }, o = function (t, e) { for (var n = t; n !== document.body;) { if (!n || n.nodeName === e) return n; n = n.parentNode } return null }, document.addEventListener('touchstart', e, !1), document.addEventListener('touchmove', n, !1), document.addEventListener('touchend', r, !1), document.addEventListener('click', i, !0) } }()), /* -Copyright 2008-2013 Concur Technologies, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may obtain -a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -License for the specific language governing permissions and limitations -under the License. -*/ -(function (t) { 'use strict'; function e (e) { if (e && e !== '') { $('.lang-selector a').removeClass('active'), $(".lang-selector a[data-language-name='" + e + "']").addClass('active'); for (var n = 0; n < u.length; n++)$('.highlight.' + u[n]).hide(); $('.highlight.' + e).show(), t.toc.calculateHeights(), $(window.location.hash).get(0) && $(window.location.hash).get(0).scrollIntoView(!0) } } function n (t) { return typeof t !== 'string' ? {} : (t = t.trim().replace(/^(\?|#|&)/, ''), t ? t.split('&').reduce(function (t, e) { var n = e.replace(/\+/g, ' ').split('='), r = n[0], i = n[1]; return r = decodeURIComponent(r), i = void 0 === i ? null : decodeURIComponent(i), t.hasOwnProperty(r) ? Array.isArray(t[r]) ? t[r].push(i) : t[r] = [t[r], i] : t[r] = i, t }, {}) : {}) } function r (t) { return t ? Object.keys(t).sort().map(function (e) { var n = t[e]; return Array.isArray(n) ? n.sort().map(function (t) { return encodeURIComponent(e) + '=' + encodeURIComponent(t) }).join('&') : encodeURIComponent(e) + '=' + encodeURIComponent(n) }).join('&') : '' } function i () { if (location.search.length >= 1) { var t = n(location.search).language; if (t) return t; if (jQuery.inArray(location.search.substr(1), u) != -1) return location.search.substr(1) } return !1 } function o (t) { var e = n(location.search); return e.language ? (e.language = t, r(e)) : t } function a (t) { if (history) { var e = window.location.hash; e && (e = e.replace(/^#+/, '')), history.pushState({}, '', '?' + o(t) + '#' + e), localStorage.setItem('language', t) } } function s (t) { var n = localStorage.getItem('language'); u = t; var r = i(); r ? (e(r), localStorage.setItem('language', r)) : e(n !== null && jQuery.inArray(n, u) != -1 ? n : u[0]) } var u = []; t.setupLanguages = s, t.activateLanguage = e, $(function () { $('.lang-selector a').on('click', function () { var t = $(this).data('language-name'); return a(t), e(t), !1 }), window.onpopstate = function () { e(i()) } }) }(window)), /** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.7 - * Copyright (C) 2014 Oliver Nightingale - * MIT Licensed - * @license - */ -(function () { - var t = function (e) { var n = new t.Index(); return n.pipeline.add(t.trimmer, t.stopWordFilter, t.stemmer), e && e.call(n, n), n }; t.version = '0.5.7', /*! - * lunr.utils - * Copyright (C) 2014 Oliver Nightingale - */ -t.utils = {}, t.utils.warn = (function (t) { return function (e) { t.console && console.warn && console.warn(e) } }(this)), /*! - * lunr.EventEmitter - * Copyright (C) 2014 Oliver Nightingale - */ -t.EventEmitter = function () { this.events = {} }, t.EventEmitter.prototype.addListener = function () { var t = Array.prototype.slice.call(arguments), e = t.pop(), n = t; if (typeof e !== 'function') throw new TypeError('last argument must be a function'); n.forEach(function (t) { this.hasHandler(t) || (this.events[t] = []), this.events[t].push(e) }, this) }, t.EventEmitter.prototype.removeListener = function (t, e) { if (this.hasHandler(t)) { var n = this.events[t].indexOf(e); this.events[t].splice(n, 1), this.events[t].length || delete this.events[t] } }, t.EventEmitter.prototype.emit = function (t) { if (this.hasHandler(t)) { var e = Array.prototype.slice.call(arguments, 1); this.events[t].forEach(function (t) { t.apply(void 0, e) }) } }, t.EventEmitter.prototype.hasHandler = function (t) { return t in this.events }, /*! - * lunr.tokenizer - * Copyright (C) 2014 Oliver Nightingale - */ -t.tokenizer = function (t) { if (!arguments.length || t == null || void 0 == t) return []; if (Array.isArray(t)) return t.map(function (t) { return t.toLowerCase() }); for (var e = t.toString().replace(/^\s+/, ''), n = e.length - 1; n >= 0; n--) if (/\S/.test(e.charAt(n))) { e = e.substring(0, n + 1); break } return e.split(/(?:\s+|\-)/).filter(function (t) { return !!t }).map(function (t) { return t.toLowerCase() }) }, /*! - * lunr.Pipeline - * Copyright (C) 2014 Oliver Nightingale - */ -t.Pipeline = function () { this._stack = [] }, t.Pipeline.registeredFunctions = {}, t.Pipeline.registerFunction = function (e, n) { n in this.registeredFunctions && t.utils.warn('Overwriting existing registered function: ' + n), e.label = n, t.Pipeline.registeredFunctions[e.label] = e }, t.Pipeline.warnIfFunctionNotRegistered = function (e) { var n = e.label && e.label in this.registeredFunctions; n || t.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', e) }, t.Pipeline.load = function (e) { var n = new t.Pipeline(); return e.forEach(function (e) { var r = t.Pipeline.registeredFunctions[e]; if (!r) throw new Error('Cannot load un-registered function: ' + e); n.add(r) }), n }, t.Pipeline.prototype.add = function () { var e = Array.prototype.slice.call(arguments); e.forEach(function (e) { t.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) }, this) }, t.Pipeline.prototype.after = function (e, n) { t.Pipeline.warnIfFunctionNotRegistered(n); var r = this._stack.indexOf(e) + 1; this._stack.splice(r, 0, n) }, t.Pipeline.prototype.before = function (e, n) { t.Pipeline.warnIfFunctionNotRegistered(n); var r = this._stack.indexOf(e); this._stack.splice(r, 0, n) }, t.Pipeline.prototype.remove = function (t) { var e = this._stack.indexOf(t); this._stack.splice(e, 1) }, t.Pipeline.prototype.run = function (t) { for (var e = [], n = t.length, r = this._stack.length, i = 0; n > i; i++) { for (var o = t[i], a = 0; r > a && (o = this._stack[a](o, i, t), void 0 !== o); a++);void 0 !== o && e.push(o) } return e }, t.Pipeline.prototype.reset = function () { this._stack = [] }, t.Pipeline.prototype.toJSON = function () { return this._stack.map(function (e) { return t.Pipeline.warnIfFunctionNotRegistered(e), e.label }) }, /*! - * lunr.Vector - * Copyright (C) 2014 Oliver Nightingale - */ -t.Vector = function () { this._magnitude = null, this.list = void 0, this.length = 0 }, t.Vector.Node = function (t, e, n) { this.idx = t, this.val = e, this.next = n }, t.Vector.prototype.insert = function (e, n) { var r = this.list; if (!r) return this.list = new t.Vector.Node(e, n, r), this.length++; for (var i = r, o = r.next; void 0 != o;) { if (e < o.idx) return i.next = new t.Vector.Node(e, n, o), this.length++; i = o, o = o.next } return i.next = new t.Vector.Node(e, n, o), this.length++ }, t.Vector.prototype.magnitude = function () { if (this._magniture) return this._magnitude; for (var t, e = this.list, n = 0; e;)t = e.val, n += t * t, e = e.next; return this._magnitude = Math.sqrt(n) }, t.Vector.prototype.dot = function (t) { for (var e = this.list, n = t.list, r = 0; e && n;)e.idx < n.idx ? e = e.next : e.idx > n.idx ? n = n.next : (r += e.val * n.val, e = e.next, n = n.next); return r }, t.Vector.prototype.similarity = function (t) { return this.dot(t) / (this.magnitude() * t.magnitude()) }, /*! - * lunr.SortedSet - * Copyright (C) 2014 Oliver Nightingale - */ -t.SortedSet = function () { this.length = 0, this.elements = [] }, t.SortedSet.load = function (t) { var e = new this(); return e.elements = t, e.length = t.length, e }, t.SortedSet.prototype.add = function () { Array.prototype.slice.call(arguments).forEach(function (t) { ~this.indexOf(t) || this.elements.splice(this.locationFor(t), 0, t) }, this), this.length = this.elements.length }, t.SortedSet.prototype.toArray = function () { return this.elements.slice() }, t.SortedSet.prototype.map = function (t, e) { return this.elements.map(t, e) }, t.SortedSet.prototype.forEach = function (t, e) { return this.elements.forEach(t, e) }, t.SortedSet.prototype.indexOf = function (t, e, n) { var e = e || 0, n = n || this.elements.length, r = n - e, i = e + Math.floor(r / 2), o = this.elements[i]; return r <= 1 ? o === t ? i : -1 : t > o ? this.indexOf(t, i, n) : o > t ? this.indexOf(t, e, i) : o === t ? i : void 0 }, t.SortedSet.prototype.locationFor = function (t, e, n) { var e = e || 0, n = n || this.elements.length, r = n - e, i = e + Math.floor(r / 2), o = this.elements[i]; if (r <= 1) { if (o > t) return i; if (t > o) return i + 1 } return t > o ? this.locationFor(t, i, n) : o > t ? this.locationFor(t, e, i) : void 0 }, t.SortedSet.prototype.intersect = function (e) { for (var n = new t.SortedSet(), r = 0, i = 0, o = this.length, a = e.length, s = this.elements, u = e.elements; ;) { if (r > o - 1 || i > a - 1) break; s[r] !== u[i] ? s[r] < u[i] ? r++ : s[r] > u[i] && i++ : (n.add(s[r]), r++, i++) } return n }, t.SortedSet.prototype.clone = function () { var e = new t.SortedSet(); return e.elements = this.toArray(), e.length = e.elements.length, e }, t.SortedSet.prototype.union = function (t) { var e, n, r; return this.length >= t.length ? (e = this, n = t) : (e = t, n = this), r = e.clone(), r.add.apply(r, n.toArray()), r }, t.SortedSet.prototype.toJSON = function () { return this.toArray() }, /*! - * lunr.Index - * Copyright (C) 2014 Oliver Nightingale - */ -t.Index = function () { this._fields = [], this._ref = 'id', this.pipeline = new t.Pipeline(), this.documentStore = new t.Store(), this.tokenStore = new t.TokenStore(), this.corpusTokens = new t.SortedSet(), this.eventEmitter = new t.EventEmitter(), this._idfCache = {}, this.on('add', 'remove', 'update', function () { this._idfCache = {} }.bind(this)) }, t.Index.prototype.on = function () { var t = Array.prototype.slice.call(arguments); return this.eventEmitter.addListener.apply(this.eventEmitter, t) }, t.Index.prototype.off = function (t, e) { return this.eventEmitter.removeListener(t, e) }, t.Index.load = function (e) { e.version !== t.version && t.utils.warn('version mismatch: current ' + t.version + ' importing ' + e.version); var n = new this(); return n._fields = e.fields, n._ref = e.ref, n.documentStore = t.Store.load(e.documentStore), n.tokenStore = t.TokenStore.load(e.tokenStore), n.corpusTokens = t.SortedSet.load(e.corpusTokens), n.pipeline = t.Pipeline.load(e.pipeline), n }, t.Index.prototype.field = function (t, e) { var e = e || {}, n = {name: t, boost: e.boost || 1}; return this._fields.push(n), this }, t.Index.prototype.ref = function (t) { return this._ref = t, this }, t.Index.prototype.add = function (e, n) { var r = {}, i = new t.SortedSet(), o = e[this._ref], n = void 0 === n ? !0 : n; this._fields.forEach(function (n) { var o = this.pipeline.run(t.tokenizer(e[n.name])); r[n.name] = o, t.SortedSet.prototype.add.apply(i, o) }, this), this.documentStore.set(o, i), t.SortedSet.prototype.add.apply(this.corpusTokens, i.toArray()); for (var a = 0; a < i.length; a++) { var s = i.elements[a], u = this._fields.reduce(function (t, e) { var n = r[e.name].length; if (!n) return t; var i = r[e.name].filter(function (t) { return t === s }).length; return t + i / n * e.boost }, 0); this.tokenStore.add(s, {ref: o, tf: u}) }n && this.eventEmitter.emit('add', e, this) }, t.Index.prototype.remove = function (t, e) { var n = t[this._ref], e = void 0 === e ? !0 : e; if (this.documentStore.has(n)) { var r = this.documentStore.get(n); this.documentStore.remove(n), r.forEach(function (t) { this.tokenStore.remove(t, n) }, this), e && this.eventEmitter.emit('remove', t, this) } }, t.Index.prototype.update = function (t, e) { var e = void 0 === e ? !0 : e; this.remove(t, !1), this.add(t, !1), e && this.eventEmitter.emit('update', t, this) }, t.Index.prototype.idf = function (t) { var e = '@' + t; if (Object.prototype.hasOwnProperty.call(this._idfCache, e)) return this._idfCache[e]; var n = this.tokenStore.count(t), r = 1; return n > 0 && (r = 1 + Math.log(this.tokenStore.length / n)), this._idfCache[e] = r }, t.Index.prototype.search = function (e) { var n = this.pipeline.run(t.tokenizer(e)), r = new t.Vector(), i = [], o = this._fields.reduce(function (t, e) { return t + e.boost }, 0), a = n.some(function (t) { return this.tokenStore.has(t) }, this); if (!a) return []; n.forEach(function (e, n, a) { var s = 1 / a.length * this._fields.length * o, u = this, c = this.tokenStore.expand(e).reduce(function (n, i) { var o = u.corpusTokens.indexOf(i), a = u.idf(i), c = 1, l = new t.SortedSet(); if (i !== e) { var h = Math.max(3, i.length - e.length); c = 1 / Math.log(h) } return o > -1 && r.insert(o, s * a * c), Object.keys(u.tokenStore.get(i)).forEach(function (t) { l.add(t) }), n.union(l) }, new t.SortedSet()); i.push(c) }, this); var s = i.reduce(function (t, e) { return t.intersect(e) }); return s.map(function (t) { return {ref: t, score: r.similarity(this.documentVector(t))} }, this).sort(function (t, e) { return e.score - t.score }) }, t.Index.prototype.documentVector = function (e) { for (var n = this.documentStore.get(e), r = n.length, i = new t.Vector(), o = 0; r > o; o++) { var a = n.elements[o], s = this.tokenStore.get(a)[e].tf, u = this.idf(a); i.insert(this.corpusTokens.indexOf(a), s * u) } return i }, t.Index.prototype.toJSON = function () { return {version: t.version, fields: this._fields, ref: this._ref, documentStore: this.documentStore.toJSON(), tokenStore: this.tokenStore.toJSON(), corpusTokens: this.corpusTokens.toJSON(), pipeline: this.pipeline.toJSON()} }, t.Index.prototype.use = function (t) { var e = Array.prototype.slice.call(arguments, 1); e.unshift(this), t.apply(this, e) }, /*! - * lunr.Store - * Copyright (C) 2014 Oliver Nightingale - */ -t.Store = function () { this.store = {}, this.length = 0 }, t.Store.load = function (e) { var n = new this(); return n.length = e.length, n.store = Object.keys(e.store).reduce(function (n, r) { return n[r] = t.SortedSet.load(e.store[r]), n }, {}), n }, t.Store.prototype.set = function (t, e) { this.has(t) || this.length++, this.store[t] = e }, t.Store.prototype.get = function (t) { return this.store[t] }, t.Store.prototype.has = function (t) { return t in this.store }, t.Store.prototype.remove = function (t) { this.has(t) && (delete this.store[t], this.length--) }, t.Store.prototype.toJSON = function () { return {store: this.store, length: this.length} }, /*! - * lunr.stemmer - * Copyright (C) 2014 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ -t.stemmer = (function () { var t = {ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log'}, e = {icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: ''}, n = '[^aeiou]', r = '[aeiouy]', i = n + '[^aeiouy]*', o = r + '[aeiou]*', a = '^(' + i + ')?' + o + i, s = '^(' + i + ')?' + o + i + '(' + o + ')?$', u = '^(' + i + ')?' + o + i + o + i, c = '^(' + i + ')?' + r, l = new RegExp(a), h = new RegExp(u), f = new RegExp(s), d = new RegExp(c), p = /^(.+?)(ss|i)es$/, g = /^(.+?)([^s])s$/, m = /^(.+?)eed$/, y = /^(.+?)(ed|ing)$/, v = /.$/, b = /(at|bl|iz)$/, _ = new RegExp('([^aeiouylsz])\\1$'), x = new RegExp('^' + i + r + '[^aeiouwxy]$'), w = /^(.+?[^aeiou])y$/, E = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, A = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, k = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, D = /^(.+?)(s|t)(ion)$/, S = /^(.+?)e$/, C = /ll$/, M = new RegExp('^' + i + r + '[^aeiouwxy]$'), T = function (n) { var r, i, o, a, s, u, c; if (n.length < 3) return n; if (o = n.substr(0, 1), o == 'y' && (n = o.toUpperCase() + n.substr(1)), a = p, s = g, a.test(n) ? n = n.replace(a, '$1$2') : s.test(n) && (n = n.replace(s, '$1$2')), a = m, s = y, a.test(n)) { var T = a.exec(n); a = l, a.test(T[1]) && (a = v, n = n.replace(a, '')) } else if (s.test(n)) { var T = s.exec(n); r = T[1], s = d, s.test(r) && (n = r, s = b, u = _, c = x, s.test(n) ? n += 'e' : u.test(n) ? (a = v, n = n.replace(a, '')) : c.test(n) && (n += 'e')) } if (a = w, a.test(n)) { var T = a.exec(n); r = T[1], n = r + 'i' } if (a = E, a.test(n)) { var T = a.exec(n); r = T[1], i = T[2], a = l, a.test(r) && (n = r + t[i]) } if (a = A, a.test(n)) { var T = a.exec(n); r = T[1], i = T[2], a = l, a.test(r) && (n = r + e[i]) } if (a = k, s = D, a.test(n)) { var T = a.exec(n); r = T[1], a = h, a.test(r) && (n = r) } else if (s.test(n)) { var T = s.exec(n); r = T[1] + T[2], s = h, s.test(r) && (n = r) } if (a = S, a.test(n)) { var T = a.exec(n); r = T[1], a = h, s = f, u = M, (a.test(r) || s.test(r) && !u.test(r)) && (n = r) } return a = C, s = h, a.test(n) && s.test(n) && (a = v, n = n.replace(a, '')), o == 'y' && (n = o.toLowerCase() + n.substr(1)), n }; return T }()), t.Pipeline.registerFunction(t.stemmer, 'stemmer'), /*! - * lunr.stopWordFilter - * Copyright (C) 2014 Oliver Nightingale - */ -t.stopWordFilter = function (e) { return t.stopWordFilter.stopWords.indexOf(e) === -1 ? e : void 0 }, t.stopWordFilter.stopWords = new t.SortedSet(), t.stopWordFilter.stopWords.length = 119, t.stopWordFilter.stopWords.elements = ['', 'a', 'able', 'about', 'across', 'after', 'all', 'almost', 'also', 'am', 'among', 'an', 'and', 'any', 'are', 'as', 'at', 'be', 'because', 'been', 'but', 'by', 'can', 'cannot', 'could', 'dear', 'did', 'do', 'does', 'either', 'else', 'ever', 'every', 'for', 'from', 'get', 'got', 'had', 'has', 'have', 'he', 'her', 'hers', 'him', 'his', 'how', 'however', 'i', 'if', 'in', 'into', 'is', 'it', 'its', 'just', 'least', 'let', 'like', 'likely', 'may', 'me', 'might', 'most', 'must', 'my', 'neither', 'no', 'nor', 'not', 'of', 'off', 'often', 'on', 'only', 'or', 'other', 'our', 'own', 'rather', 'said', 'say', 'says', 'she', 'should', 'since', 'so', 'some', 'than', 'that', 'the', 'their', 'them', 'then', 'there', 'these', 'they', 'this', 'tis', 'to', 'too', 'twas', 'us', 'wants', 'was', 'we', 'were', 'what', 'when', 'where', 'which', 'while', 'who', 'whom', 'why', 'will', 'with', 'would', 'yet', 'you', 'your'], t.Pipeline.registerFunction(t.stopWordFilter, 'stopWordFilter'), /*! - * lunr.trimmer - * Copyright (C) 2014 Oliver Nightingale - */ -t.trimmer = function (t) { return t.replace(/^\W+/, '').replace(/\W+$/, '') }, t.Pipeline.registerFunction(t.trimmer, 'trimmer'), /*! - * lunr.stemmer - * Copyright (C) 2014 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ -t.TokenStore = function () { this.root = {docs: {}}, this.length = 0 }, t.TokenStore.load = function (t) { var e = new this(); return e.root = t.root, e.length = t.length, e }, t.TokenStore.prototype.add = function (t, e, n) { var n = n || this.root, r = t[0], i = t.slice(1); return r in n || (n[r] = {docs: {}}), i.length === 0 ? (n[r].docs[e.ref] = e, void (this.length += 1)) : this.add(i, e, n[r]) }, t.TokenStore.prototype.has = function (t) { if (!t) return !1; for (var e = this.root, n = 0; n < t.length; n++) { if (!e[t[n]]) return !1; e = e[t[n]] } return !0 }, t.TokenStore.prototype.getNode = function (t) { if (!t) return {}; for (var e = this.root, n = 0; n < t.length; n++) { if (!e[t[n]]) return {}; e = e[t[n]] } return e }, t.TokenStore.prototype.get = function (t, e) { return this.getNode(t, e).docs || {} }, t.TokenStore.prototype.count = function (t, e) { return Object.keys(this.get(t, e)).length }, t.TokenStore.prototype.remove = function (t, e) { if (t) { for (var n = this.root, r = 0; r < t.length; r++) { if (!(t[r] in n)) return; n = n[t[r]] } delete n.docs[e] } }, t.TokenStore.prototype.expand = function (t, e) { var n = this.getNode(t), r = n.docs || {}, e = e || []; return Object.keys(r).length && e.push(t), Object.keys(n).forEach(function (n) { n !== 'docs' && e.concat(this.expand(t + n, e)) }, this), e }, t.TokenStore.prototype.toJSON = function () { return {root: this.root, length: this.length} }, (function (t, e) { typeof define === 'function' && define.amd ? define(e) : typeof exports === 'object' ? module.exports = e() : t.lunr = e() }(this, function () { return t })) -}()), /* - * jQuery Highlight plugin - * - * Based on highlight v3 by Johann Burkard - * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html - * - * Code a little bit refactored and cleaned (in my humble opinion). - * Most important changes: - * - has an option to highlight only entire words (wordsOnly - false by default), - * - has an option to be case sensitive (caseSensitive - false by default) - * - highlight element tag and class names can be specified in options - * - * Usage: - * // wrap every occurrance of text 'lorem' in content - * // with (default options) - * $('#content').highlight('lorem'); - * - * // search for and highlight more terms at once - * // so you can save some time on traversing DOM - * $('#content').highlight(['lorem', 'ipsum']); - * $('#content').highlight('lorem ipsum'); - * - * // search only for entire word 'lorem' - * $('#content').highlight('lorem', { wordsOnly: true }); - * - * // don't ignore case during search of term 'lorem' - * $('#content').highlight('lorem', { caseSensitive: true }); - * - * // wrap every occurrance of term 'ipsum' in content - * // with - * $('#content').highlight('ipsum', { element: 'em', className: 'important' }); - * - * // remove default highlight - * $('#content').unhighlight(); - * - * // remove custom highlight - * $('#content').unhighlight({ element: 'em', className: 'important' }); - * - * - * Copyright (c) 2009 Bartek Szopka - * - * Licensed under MIT license. - * - */ -jQuery.extend({highlight: function (t, e, n, r) { if (t.nodeType === 3) { var i = t.data.match(e); if (i) { var o = document.createElement(n || 'span'); o.className = r || 'highlight'; var a = t.splitText(i.index); a.splitText(i[0].length); var s = a.cloneNode(!0); return o.appendChild(s), a.parentNode.replaceChild(o, a), 1 } } else if (t.nodeType === 1 && t.childNodes && !/(script|style)/i.test(t.tagName) && (t.tagName !== n.toUpperCase() || t.className !== r)) for (var u = 0; u < t.childNodes.length; u++)u += jQuery.highlight(t.childNodes[u], e, n, r); return 0 }}), jQuery.fn.unhighlight = function (t) { var e = {className: 'highlight', element: 'span'}; return jQuery.extend(e, t), this.find(e.element + '.' + e.className).each(function () { var t = this.parentNode; t.replaceChild(this.firstChild, this), t.normalize() }).end() }, jQuery.fn.highlight = function (t, e) { var n = {className: 'highlight', element: 'span', caseSensitive: !1, wordsOnly: !1}; if (jQuery.extend(n, e), t.constructor === String && (t = [t]), t = jQuery.grep(t, function (t) { return t != '' }), t = jQuery.map(t, function (t) { return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') }), t.length == 0) return this; var r = n.caseSensitive ? '' : 'i', i = '(' + t.join('|') + ')'; n.wordsOnly && (i = '\\b' + i + '\\b'); var o = new RegExp(i, r); return this.each(function () { jQuery.highlight(this, o, n.element, n.className) }) }, (function () { 'use strict'; function t () { $('h1, h2').each(function () { var t = $(this), e = t.nextUntil('h1, h2'); u.add({id: t.prop('id'), title: t.text(), body: e.text()}) }) } function e () { o = $('.content'), a = $('.search-results'), $('#input-search').on('keyup', n) } function n (t) { if (i(), a.addClass('visible'), t.keyCode === 27 && (this.value = ''), this.value) { var e = u.search(this.value).filter(function (t) { return t.score > 1e-4 }); e.length ? (a.empty(), $.each(e, function (t, e) { var n = document.getElementById(e.ref); a.append("
    • " + $(n).text() + '
    • ') }), r.call(this)) : (a.html('
    • '), $('.search-results li').text('No Results Found for "' + this.value + '"')) } else i(), a.removeClass('visible') } function r () { this.value && o.highlight(this.value, s) } function i () { o.unhighlight(s) } var o, a, s = {element: 'span', className: 'search-highlight'}, u = new lunr.Index(); u.ref('id'), u.field('title', {boost: 10}), u.field('body'), u.pipeline.add(lunr.trimmer, lunr.stopWordFilter), $(t), $(e) }()), /*! jQuery UI - v1.11.3 - 2015-02-12 - * http://jqueryui.com - * Includes: widget.js - * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ -(function (t) { typeof define === 'function' && define.amd ? define(['jquery'], t) : t(jQuery) }(function (t) { /*! - * jQuery UI Widget 1.11.3 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/jQuery.widget/ - */ - var e = 0, n = Array.prototype.slice; t.cleanData = (function (e) { return function (n) { var r, i, o; for (o = 0; (i = n[o]) != null; o++) try { r = t._data(i, 'events'), r && r.remove && t(i).triggerHandler('remove') } catch (a) {}e(n) } }(t.cleanData)), t.widget = function (e, n, r) { var i, o, a, s, u = {}, c = e.split('.')[0]; return e = e.split('.')[1], i = c + '-' + e, r || (r = n, n = t.Widget), t.expr[':'][i.toLowerCase()] = function (e) { return !!t.data(e, i) }, t[c] = t[c] || {}, o = t[c][e], a = t[c][e] = function (t, e) { return this._createWidget ? void (arguments.length && this._createWidget(t, e)) : new a(t, e) }, t.extend(a, o, {version: r.version, _proto: t.extend({}, r), _childConstructors: []}), s = new n(), s.options = t.widget.extend({}, s.options), t.each(r, function (e, r) { return t.isFunction(r) ? void (u[e] = (function () { var t = function () { return n.prototype[e].apply(this, arguments) }, i = function (t) { return n.prototype[e].apply(this, t) }; return function () { var e, n = this._super, o = this._superApply; return this._super = t, this._superApply = i, e = r.apply(this, arguments), this._super = n, this._superApply = o, e } }())) : void (u[e] = r) }), a.prototype = t.widget.extend(s, {widgetEventPrefix: o ? s.widgetEventPrefix || e : e}, u, {constructor: a, namespace: c, widgetName: e, widgetFullName: i}), o ? (t.each(o._childConstructors, function (e, n) { var r = n.prototype; t.widget(r.namespace + '.' + r.widgetName, a, n._proto) }), delete o._childConstructors) : n._childConstructors.push(a), t.widget.bridge(e, a), a }, t.widget.extend = function (e) { for (var r, i, o = n.call(arguments, 1), a = 0, s = o.length; s > a; a++) for (r in o[a])i = o[a][r], o[a].hasOwnProperty(r) && void 0 !== i && (e[r] = t.isPlainObject(i) ? t.isPlainObject(e[r]) ? t.widget.extend({}, e[r], i) : t.widget.extend({}, i) : i); return e }, t.widget.bridge = function (e, r) { var i = r.prototype.widgetFullName || e; t.fn[e] = function (o) { var a = typeof o === 'string', s = n.call(arguments, 1), u = this; return a ? this.each(function () { var n, r = t.data(this, i); return o === 'instance' ? (u = r, !1) : r ? t.isFunction(r[o]) && o.charAt(0) !== '_' ? (n = r[o].apply(r, s), n !== r && void 0 !== n ? (u = n && n.jquery ? u.pushStack(n.get()) : n, !1) : void 0) : t.error("no such method '" + o + "' for " + e + ' widget instance') : t.error('cannot call methods on ' + e + " prior to initialization; attempted to call method '" + o + "'") }) : (s.length && (o = t.widget.extend.apply(null, [o].concat(s))), this.each(function () { var e = t.data(this, i); e ? (e.option(o || {}), e._init && e._init()) : t.data(this, i, new r(o, this)) })), u } }, t.Widget = function () {}, t.Widget._childConstructors = [], t.Widget.prototype = {widgetName: 'widget', widgetEventPrefix: '', defaultElement: '
      ', options: {disabled: !1, create: null}, _createWidget: function (n, r) { r = t(r || this.defaultElement || this)[0], this.element = t(r), this.uuid = e++, this.eventNamespace = '.' + this.widgetName + this.uuid, this.bindings = t(), this.hoverable = t(), this.focusable = t(), r !== this && (t.data(r, this.widgetFullName, this), this._on(!0, this.element, {remove: function (t) { t.target === r && this.destroy() }}), this.document = t(r.style ? r.ownerDocument : r.document || r), this.window = t(this.document[0].defaultView || this.document[0].parentWindow)), this.options = t.widget.extend({}, this.options, this._getCreateOptions(), n), this._create(), this._trigger('create', null, this._getCreateEventData()), this._init() }, _getCreateOptions: t.noop, _getCreateEventData: t.noop, _create: t.noop, _init: t.noop, destroy: function () { this._destroy(), this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)), this.widget().unbind(this.eventNamespace).removeAttr('aria-disabled').removeClass(this.widgetFullName + '-disabled ui-state-disabled'), this.bindings.unbind(this.eventNamespace), this.hoverable.removeClass('ui-state-hover'), this.focusable.removeClass('ui-state-focus') }, _destroy: t.noop, widget: function () { return this.element }, option: function (e, n) { var r, i, o, a = e; if (arguments.length === 0) return t.widget.extend({}, this.options); if (typeof e === 'string') if (a = {}, r = e.split('.'), e = r.shift(), r.length) { for (i = a[e] = t.widget.extend({}, this.options[e]), o = 0; o < r.length - 1; o++)i[r[o]] = i[r[o]] || {}, i = i[r[o]]; if (e = r.pop(), arguments.length === 1) return void 0 === i[e] ? null : i[e]; i[e] = n } else { if (arguments.length === 1) return void 0 === this.options[e] ? null : this.options[e]; a[e] = n } return this._setOptions(a), this }, _setOptions: function (t) { var e; for (e in t) this._setOption(e, t[e]); return this }, _setOption: function (t, e) { return this.options[t] = e, t === 'disabled' && (this.widget().toggleClass(this.widgetFullName + '-disabled', !!e), e && (this.hoverable.removeClass('ui-state-hover'), this.focusable.removeClass('ui-state-focus'))), this }, enable: function () { return this._setOptions({disabled: !1}) }, disable: function () { return this._setOptions({disabled: !0}) }, _on: function (e, n, r) { var i, o = this; typeof e !== 'boolean' && (r = n, n = e, e = !1), r ? (n = i = t(n), this.bindings = this.bindings.add(n)) : (r = n, n = this.element, i = this.widget()), t.each(r, function (r, a) { function s () { return e || o.options.disabled !== !0 && !t(this).hasClass('ui-state-disabled') ? (typeof a === 'string' ? o[a] : a).apply(o, arguments) : void 0 } typeof a !== 'string' && (s.guid = a.guid = a.guid || s.guid || t.guid++); var u = r.match(/^([\w:-]*)\s*(.*)$/), c = u[1] + o.eventNamespace, l = u[2]; l ? i.delegate(l, c, s) : n.bind(c, s) }) }, _off: function (e, n) { n = (n || '').split(' ').join(this.eventNamespace + ' ') + this.eventNamespace, e.unbind(n).undelegate(n), this.bindings = t(this.bindings.not(e).get()), this.focusable = t(this.focusable.not(e).get()), this.hoverable = t(this.hoverable.not(e).get()) }, _delay: function (t, e) { function n () { return (typeof t === 'string' ? r[t] : t).apply(r, arguments) } var r = this; return setTimeout(n, e || 0) }, _hoverable: function (e) { this.hoverable = this.hoverable.add(e), this._on(e, {mouseenter: function (e) { t(e.currentTarget).addClass('ui-state-hover') }, mouseleave: function (e) { t(e.currentTarget).removeClass('ui-state-hover') }}) }, _focusable: function (e) { this.focusable = this.focusable.add(e), this._on(e, {focusin: function (e) { t(e.currentTarget).addClass('ui-state-focus') }, focusout: function (e) { t(e.currentTarget).removeClass('ui-state-focus') }}) }, _trigger: function (e, n, r) { var i, o, a = this.options[e]; if (r = r || {}, n = t.Event(n), n.type = (e === this.widgetEventPrefix ? e : this.widgetEventPrefix + e).toLowerCase(), n.target = this.element[0], o = n.originalEvent) for (i in o)i in n || (n[i] = o[i]); return this.element.trigger(n, r), !(t.isFunction(a) && a.apply(this.element[0], [n].concat(r)) === !1 || n.isDefaultPrevented()) }}, t.each({show: 'fadeIn', hide: 'fadeOut'}, function (e, n) { t.Widget.prototype['_' + e] = function (r, i, o) { typeof i === 'string' && (i = {effect: i}); var a, s = i ? i === !0 || typeof i === 'number' ? n : i.effect || n : e; i = i || {}, typeof i === 'number' && (i = {duration: i}), a = !t.isEmptyObject(i), i.complete = o, i.delay && r.delay(i.delay), a && t.effects && t.effects.effect[s] ? r[e](i) : s !== e && r[s] ? r[s](i.duration, i.easing, o) : r.queue(function (n) { t(this)[e](), o && o.call(r[0]), n() }) } }); t.widget -})), /* jquery Tocify - v1.8.0 - 2013-09-16 -* http://www.gregfranko.com/jquery.tocify.js/ -* Copyright (c) 2013 Greg Franko; Licensed MIT -* Modified lightly by Robert Lord to fix a bug I found, -* and also so it adds ids to headers -* also because I want height caching, since the -* height lookup for h1s and h2s was causing serious -* lag spikes below 30 fps */ -(function (t) { 'use strict'; t(window.jQuery, window, document) }(function (t, e, n, r) { 'use strict'; var i = 'tocify', o = 'tocify-focus', a = 'tocify-hover', s = 'tocify-hide', u = 'tocify-header', c = '.' + u, l = 'tocify-subheader', h = '.' + l, f = 'tocify-item', d = '.' + f, p = 'tocify-extend-page', g = '.' + p; t.widget('toc.tocify', {version: '1.8.0', options: {context: 'body', ignoreSelector: null, selectors: 'h1, h2, h3', showAndHide: !0, showEffect: 'slideDown', showEffectSpeed: 'medium', hideEffect: 'slideUp', hideEffectSpeed: 'medium', smoothScroll: !0, smoothScrollSpeed: 'medium', scrollTo: 0, showAndHideOnScroll: !0, highlightOnScroll: !0, highlightOffset: 40, theme: 'bootstrap', extendPage: !0, extendPageOffset: 100, history: !0, scrollHistory: !1, hashGenerator: 'compact', highlightDefault: !0}, _create: function () { var n = this; n.tocifyWrapper = t('.tocify-wrapper'), n.extendPageScroll = !0, n.items = [], n._generateToc(), n.cachedHeights = [], n.cachedAnchors = [], n._addCSSClasses(), n.webkit = (function () { for (var t in e) if (t && t.toLowerCase().indexOf('webkit') !== -1) return !0; return !1 }()), n._setEventHandlers(), t(e).load(function () { n._setActiveElement(!0), t('html, body').promise().done(function () { setTimeout(function () { n.extendPageScroll = !1 }, 0) }) }) }, _generateToc: function () { var e, n, r = this, o = r.options.ignoreSelector; return e = t(this.options.context).find(this.options.selectors.indexOf(',') !== -1 ? this.options.selectors.replace(/ /g, '').substr(0, this.options.selectors.indexOf(',')) : this.options.selectors.replace(/ /g, '')), e.length ? (r.element.addClass(i), void e.each(function (e) { t(this).is(o) || (n = t('