npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@liascript/markdownify

v0.1.0

Published

Create LiaScript documents from a common JSON-model

Downloads

25

Readme

LiaScript-Markdownify

Create LiaScript documents from a common JSON-model

Install

Install directly via npm:

npm install @liascript/markdownify

Usage

Currently there is only one function that takes as an input-parameter either a string or a JSON/Object directly. liascriptify will return a promise that will either return the correct LiaScript-Markdown document or it will return an error message.

import liascriptify from './node_modules/@liascript/markdownify/dist/lib'

const example = {
  meta: {
    author: 'Superhero',
    email: '[email protected]',
  },
  sections: [
    {
      title: 'Title',
      indent: 1,
      body: [
        'This can be either a list of Strings',
        'that are interpreted as Markdown-blocks',
        {
          paragraph: [
            { string: 'Or a set of ' },
            {
              bold: [
                { string: 'more sophisticated '},
                { superscript: 'elements' },
              ],
            },
            '!',
          ],
        },
      ],
    },
  ],
}

liascriptify(example)
  .then((doc: string) => {
    console.log('ok', doc)
  })
  .catch((err: string) => {
    console.warn('err', err)
  })

Base structure

The basic structure of a LiaScript-Json format is rather simple, you can either directly pass Markdown as a string or you can break it down to collections of block and inline elements. Every Json-file has the following structure:

{
  "meta": {
    "author": "Superhero",
    "email": "[email protected]"
  },
  "sections": [
    {
      "title": "Main Title",
      "indent": 1,
      "body": [
        "This can be either a list of Strings",
        "that are interpreted as Markdown-blocks",
        {
          "paragraph": [
            {
              "string": "Or a set of "
            },
            {
              "bold": [
                {
                  "string": "more sophisticated "
                },
                {
                  "superscript": "elements"
                }
              ]
            },
            "!"
          ]
        }
      ]
    }
  ]
}

The meta fields are optional, but you can define a global filed on top that will define the main-header. The sections are required and are a list of single "pages", which consists of a title, indent, and a body for the content. Additionally it is possible to add another meta field to every section.

<!--

author: Superhero

email: [email protected]

-->


# Main Title

This can be either a list of Strings

that are interpreted as Markdown-blocks

Or a set of __more sophisticated ^elements^__!

Body: Block-Elements

# Body 1

It is possible to pass directly valid __LiaScript/Markdown__ code to the body.

This can contain multiple blocks that are separated by newlines.


## Body 2

Or to keep it clean

You can pass multiple strings, that are treated as blocks

... each

{
  "sections": [
    {
      "title": "Body 1",
      "indent": 1,
      "body": "It is possible to pass directly valid __LiaScript/Markdown__ code to the body.\n\nThis can contain multiple blocks that are separated by newlines."
    },
    {
      "title": "Body 2",
      "indent": 2,
      "body": [
        "Or to keep it clean",
        "You can pass multiple strings, that are treated as blocks",
        "... each"
      ]
    }
  ]
}

Blocks

Paragraphs

### `paragraph` or `p`

A paragraph is either a string,

but it can also__be a simple list__^of multiple $ inline elements $^.

{
  "indent": 3,
  "title": "`paragraph` or `p`",
  "body": [
    {
      "paragraph": "A paragraph is either a string,"
    },
    {
      "paragraph": [
        "but it can also",
        {
          "bold": [
            {
              "string": "be a simple list"
            }
          ]
        },
        {
          "superscript": [
            "of multiple ",
            {
              "formula": "inline elements"
            }
          ]
        },
        "."
      ]
    }
  ]
}

Unordered Lists

### `unordered list` or `ul`

* is either a list of strings,

* <!-- style=color: red; -->
  or a list of further Blocks an tables.

* But it is also possible
  
  * put group multiple blocks into
  
  * a single list

{
  "title": "`unordered list` or `ul`",
  "indent": 3,
  "body": [
    {
      "unordered list": [
        "is either a list of strings,",
        {
          "paragraph": "or a list of further Blocks an tables.",
          "attributes": {
            "style": "color: red;"
          }
        },
        [
          "But it is also possible",
          {
            "ul": ["put group multiple elements within", "a single list"]
          }
        ]
      ]
    }
  ]
}

Ordered Lists

### `ordered list` or `ol`

1. behave similar to unordered lists,

2. the only __difference__ is

3. <!-- style=color: red; -->
   that the blocks are identified by their appearance.

4. Grouping works exactly the same way,
   
   1. simply put multiple elements
   
   2. into a single list

{
  "title": "`ordered list` or `ol`",
  "indent": 3,
  "body": [
    {
      "ordered list": [
        "behave similar to unordered lists,",
        {
          "paragraph": "the only __difference__ is"
        },
        {
          "paragraph": "that the blocks are identified by their appearance.",
          "attributes": {
            "style": "color: red;"
          }
        },
        [
          "Grouping works exactly the same way,",
          {
            "ul": ["simply put multiple elements", "into a single list"]
          }
        ]
      ]
    }
  ]
}

Horizontal Rule

### `horizontal rule` or `hr`

A horizontal rule is a simple line that separates two blocks:

---

or

---

{
  "title": "`horizontal rule` or `hr`",
  "indent": 3,
  "body": [
    "A horizontal rule is a simple line that separates two blocks:",
    {
      "hr": null
    },
    "or",
    {
      "horizontal rule": null
    }
  ]
}

Blockquotes

### `blockquote` or `q`

> This can also be a simple string...

---

> __A list of multiple strings__
> 
> These are interpreted as separate blocks

---

> Or a combination
> 
> > of various different blocks
> > 
> > * lists
> > 
> > * blockquotes
> > 
> > * tables
> > 
> > * etc.

{
  "title": "`blockquote` or `q`",
  "indent": 3,
  "body": [
    {
      "blockquote": "This can also be a simple string..."
    },
    {
      "hr": null
    },
    {
      "blockquote": [
        "__A list of multiple strings__",
        "These are interpreted as separate blocks"
      ]
    },
    {
      "hr": null
    },
    {
      "blockquote": [
        {
          "paragraph": "Or a combination"
        },
        {
          "q": [
            "of various different blocks",
            {
              "ul": [
                "lists",
                "blockquotes",
                "tables",
                "etc."
              ]
            }
          ]
        }
      ]
    }
  ]
}

Citation

### `citation` or `cite`

Citations are a special LiaScript case of a blockquote, which will be rendered differently, but behave like normal blockquotes.

> If you want your children to be intelligent, read them fairy tales.If you want them to be more intelligent, read them more fairy tales.
> 
> -- Albert Einstein

{
  "title": "`citation` or `cite`",
  "indent": 3,
  "body": [
    {
      "paragraph": "Citations are a special LiaScript case of a blockquote, which will be rendered differently, but behave like normal blockquotes."
    },
    {
      "citation": [
        {
          "p": [
            "If you want your children to be intelligent, read them fairy tales.",
            "If you want them to be more intelligent, read them more fairy tales."
          ]
        }
      ],
      "by": "Albert Einstein"
    }
  ]
}

Comments & TTS

### `comment`

    --{{1 Ukrainian Female}}--
Comments in LiaScript are these parts that are spoken out loud.They will be displayed only in `Textbook` mode.Every comment requires an `id`, to mark the animation step, when it should be spoken out loud.Additionally you can set the voice, which is optional in contrast to the id.

{
  "title": "`comment`",
  "indent": 3,
  "body": [
    {
      "comment": [
        "Comments in LiaScript are these parts that are spoken out loud.",
        "They will be displayed only in `Textbook` mode.",
        "Every comment requires an `id`, to mark the animation step, when it should be spoken out loud.",
        "Additionally you can set the voice, which is optional in contrast to the id"
      ],
      "id": 1,
      "voice": "Ukrainian Female"
    }
  ]
}

ASCII-Art

### `ascii art` or `ascii`

``` ascii    Title is optional and will be displayed as an image __caption__
+------+   +-----+   +-----+   +-----+
|      |   |     |   |     |   |     |
| Foo  +-->| Bar +---+ Baz |<--+ Moo |
|      |   |     |   |     |   |     |
+------+   +-----+   +--+--+   +-----+
              ^         |
              |         V
.-------------+-----------------------.
| Hello here and there and everywhere |
'-------------------------------------'
```

{
  "title": "`ascii art` or `ascii`",
  "indent": 3,
  "body": [
    {
      "ascii": [
        "+------+   +-----+   +-----+   +-----+",
        "|      |   |     |   |     |   |     |",
        "| Foo  +-->| Bar +---+ Baz |<--+ Moo |",
        "|      |   |     |   |     |   |     |",
        "+------+   +-----+   +--+--+   +-----+",
        "              ^         |",
        "              |         V",
        ".-------------+-----------------------.",
        "| Hello here and there and everywhere |",
        "'-------------------------------------'"
      ],
      "title": "  Title is optional and will be displayed as an image __caption__"
    }
  ]
}

Charts

### `chart` or `diagram`

                                diagram title       
    1.5 |           *                     (* stars) 
        |                                           
      y |        *      *                           
      - |      *          *                         
      a |     *             *       *               
      x |    *                 *                    
      i |   *                                       
      s |  *                                        
        | *                              *        * 
      0 +------------------------------------------ 
       2.0              x-axis                100 

{
  "title": "`chart` or `diagram`",
  "indent": 3,
  "body": [
    {
      "chart": [
        "                            diagram title       ",
        "1.5 |           *                     (* stars) ",
        "    |                                           ",
        "  y |        *      *                           ",
        "  - |      *          *                         ",
        "  a |     *             *       *               ",
        "  x |    *                 *                    ",
        "  i |   *                                       ",
        "  s |  *                                        ",
        "    | *                              *        * ",
        "  0 +------------------------------------------ ",
        "   2.0              x-axis                100   "
      ]
    }
  ]
}

Quizzes

Text-Input

#### `text`

What did the fish say, when he hit the wall?

[[dam]]

Selection

#### `selection`

The solution is defined by its position in the option list

[[option 0 | ( option 1 ) | __this is Bold and wrong__]]

Single-Choice

#### `single-choice`

What did the fish say, when he hit the wall?

- [( )] option 0
- [(X)] option 1
- [( )] __option 3__

Multiple-Choice

#### `multiple-choice`

What did the fish say, when he hit the wall?

- [[ ]] option 0
- [[X]] option 1
- [[X]] __option 3__

Gap-Text

#### `gap-text`

What did the fish say, when he hit the wall?

__Some Inlines__ [[damn]] some more test [[ option1 | ( option2 ) | option3 ]] some more test 

{
  "title": "`gap-text`",
  "indent": 4,
  "body": [
    "What did the fish say, when he hit the wall?",
    {
      "quiz": "gap-text",
      "body": {
        "p": [
          {
            "bold": "Some Inlines"
          },
          " ",
          {
            "input": "text",
            "solution": "damn"
          },
          " some more test ",
          {
            "input": "selection",
            "solution": 1,
            "options": [
              "option1",
              "option2",
              "option3"
            ]
          },
          " some more test "
        ]
      }
    }
  ]
}

Tweaks

#### `selection` part 2

The solution is defined by its position in the option list...

... But, as there are multiple options, you can define also multiple solutions too.

<!-- data-trials=5 -->
[[( option 0 ) | option 1 | ( __this is Bold__ )]]
[[?]] hint number one
[[?]] the second and last hint
************************

These blocks will only be visible...

... if and only if, the quiz is solved

or if the user clicks onto the resolve button.

************************

{
  "title": "`selection` part 2",
  "indent": 4,
  "body": [
    "The solution is defined by its position in the option list...",
    "... But, as there are multiple options, you can define also multiple solutions too.",
    {
      "quiz": "selection",
      "solution": [
        0,
        2
      ],
      "options": [
        "option 0",
        "option 1",
        [
          {
            "bold": "this is Bold"
          }
        ]
      ],
      "hints": [
        "hint number one",
        "the second and last hint"
      ],
      "answer": [
        "These blocks will only be visible...",
        "... if and only if, the quiz is solved",
        "or if the user clicks onto the resolve button."
      ],
      "attributes": {
        "data-trials": "5"
      }
    }
  ]
}

Surveys

TODO

Gallery

### `gallery`

A gallery is simply a collection of multimedia links

![LiaScript Live-Editor](https://liascript.github.io/img/LiveEditor.jpg "More and optional information.")
?[Magnetic's ELM Podcast: One More Summer Sun](https://soundcloud.com/magnetic-magazine/magnetics-elm-podcast-one-more)
!?[Some random video](https://www.youtube.com/watch?v=q_Usix3nyGA)
??[](https://falstad.com/circuit/circuitjs.html)

{
  "title": "`gallery`",
  "indent": 3,
  "body": [
    "A gallery is simply a collection of multimedia links",
    {
      "gallery": [
        {
          "link": "image",
          "url": "https://liascript.github.io/img/LiveEditor.jpg",
          "alt": "LiaScript Live-Editor",
          "title": "More and optional information."
        },
        {
          "link": "audio",
          "url": "https://soundcloud.com/magnetic-magazine/magnetics-elm-podcast-one-more",
          "alt": "Magnetic's ELM Podcast: One More Summer Sun"
        },
        {
          "link": "video",
          "url": "https://www.youtube.com/watch?v=q_Usix3nyGA",
          "alt": "Some random video"
        },
        {
          "link": "embed",
          "url": "https://falstad.com/circuit/circuitjs.html"
        }
      ]
    }
  ]
}

Tasks

### `tasks`

Tasks are defined by a task and by a done list:

- [X] task 1
- [ ] task 2
- [X] task 3

Additionally it is possible to define a done list with only checked positions:

- [X] task 1
- [ ] task 2
- [X] task 3

{
  "title": "`tasks`",
  "indent": 3,
  "body": [
    "Tasks are defined by a task and by a done list:",
    {
      "tasks": ["task 1", "task 2", "task 3"],
      "done": [true, false, true]
    },
    "Additionally it is possible to define a done list with only checked positions:",
    {
      "tasks": ["task 1", "task 2", "task 3"],
      "done": [0, 2]
    }
  ]
}

Tables

### `table`

Tables are defined by a head and a row, the orientation is optional

| head 1 | head 2 | __head 3__ |
| :----- | -----: | :--------: |
| 1      |      2 |      3     |
| 4      |      5 |      6     |
| 7      |      8 |      9     |

{
  "title": "`table`",
  "indent": 3,
  "body": [
    "Tables are defined by a head and a row, the orientation is optional",
    {
      "table": {
        "head": ["head 1", "head 2", [{ "bold": "head 3" }]],
        "orientation": ["left", "right", "center"],
        "rows": [
          ["1", "2", "3"],
          ["4", "5", "6"],
          ["7", "8", "9"]
        ]
      }
    }
  ]
}

Code-Snippets

The code is passed as a single string or a list of strings, language, name, and closed are optional parameters.

### `code`

``` javascript   -test.js
This is a simple code block
with multiple lines
and a specific language
for syntax highlighting
```

{
  "title": "`code`",
  "indent": 3,
  "body": [
    {
      "code": [
        "This is a simple code block",
        "with multiple lines",
        "and a specific language",
        "for syntax highlighting"
      ],
      "language": "javascript",
      "name": "test.js",
      "closed": true
    }
  ]
}

Projects

A project can be defined by a single code-block or by a list of code-blocks. Additionally it is possible to add an appendix, which is either a script or a macro that evaluates to a script, and that defines how the code can be made executable.

### `project`

``` javascript   var.js
var i = 0;
```
``` javascript   alert.js
alert("Hallo Welt")
```
@eval

{
  "title": "`project`",
  "indent": 3,
  "body": [
    {
      "project": [
        {
          "code": "var i = 0;",
          "language": "javascript",
          "name": "var.js"
        },
        {
          "code": "alert(\"Hallo Welt\")",
          "language": "javascript",
          "name": "alert.js"
        }
      ],
      "appendix": "@eval"
    }
  ]
}

HTML

### `html`

<section "style"="color: red;">This is a simple HTML element</section>

{
  "title": "`html`",
  "indent": 3,
  "body": [
    {
      "html": "section",
      "body": [{ "paragraph": "This is a simple HTML element" }],
      "attributes": {
        "style": "color: red;"
      }
    }
  ]
}

Inline Elements

### Inline Elements`

final strings are normal strings or string objects

Additionally it is possible to add attributes to all inline-elements<!-- "style"="color: green; display: block" -->

__this is a bold string__

_this is a italic string_

___this is a bold and italic string___

~~this is a underlined string~~ ~this is a striked string~ ~~this is a underlined ~and striked string~~~

^this is a superscript string^

This is a $ \frac{1}{x} $

A code `__Verbatim code__`

And a piece of <span "id"="foo" "style"="color: green; display: block">content</span>

{
  "title": "Inline Elements`",
  "indent": 3,
  "body": [
    {
      "p": [
        "final strings are normal strings or ",
        { "string": "string objects" }
      ]
    },
    {
      "p": [
        "Additionally it is possible to add attributes to all ",
        {
          "string": "inline-elements",
          "attributes": { "style": "color: green; display: block" }
        }
      ]
    },
    {
      "p": [
        {
          "bold": "this is a bold string"
        }
      ]
    },
    {
      "p": [
        {
          "italic": "this is a italic string"
        }
      ]
    },
    {
      "p": [
        {
          "bold": [{ "italic": "this is a bold and italic string" }]
        }
      ]
    },
    {
      "p": [
        {
          "underline": "this is a underlined string"
        },
        " ",
        {
          "strike": "this is a striked string"
        },
        " ",
        {
          "underline": [
            "this is a underlined ",
            {
              "strike": "and striked string"
            }
          ]
        }
      ]
    },
    { "p": [{ "superscript": "this is a superscript string" }] },
    { "p": ["This is a ", { "formula": "\\frac{1}{x}" }] },
    { "p": ["A code ", { "verbatim": "__Verbatim code__" }] },
    {
      "p": [
        "And a piece of ",
        {
          "html": "span",
          "body": "content",
          "attributes": {
            "id": "foo",
            "style": "color: green; display: block"
          }
        }
      ]
    }
  ]
}