Very fast Markdown parser and HTML generator implemented in WebAssembly, based on md4c

Overview

markdown-wasm

Very fast Markdown parser & HTML renderer implemented in WebAssembly

  • Zero dependencies (31 kB gzipped)
  • Portable & safe (WASM executes in isolated memory and can run almost anywhere)
  • Simple API
  • Very fast
  • Based on md4c — compliant to the CommonMark specification

Examples

In NodeJS, single file with embedded compressed WASM

const markdown = require("./dist/markdown.node.js")
console.log(markdown.parse("# hello\n*world*"))

ES module with WASM loaded separately

import * as markdown from "./dist/markdown.es.js"
await markdown.ready
console.log(markdown.parse("# hello\n*world*"))

Web browser

">
<script src="markdown.js">script>
<script>
window["markdown"].ready.then(markdown => {
  console.log(markdown.parse("# hello\n*world*"))
})
script>

Install

npm install markdown-wasm

Benchmarks

The test/benchmark directory contain a benchmark suite which you can run yourself. It tests a few popular markdown parser-renderers by parsing & rendering a bunch of different sample markdown files.

The following results were samples on a 2.9 GHz MacBook running macOS 10.15, NodeJS v14.11.0

Average ops/second

Ops/second represents how many times a library is able to parse markdown and render HTML during a second, on average across all sample files.

Average throughput

Throughput is the average amount of markdown data processed during a second while both parsing and rendering to HTML. The statistics does not include HTML generated but only bytes of markdown source text parsed.

Min–max parse time

This graph shows the spread between the fastest and slowest parse-and-render operations for each library. Lower numbers are better.

See test/benchmark for more information.

API

Uint8Array|string|null|undefined /** @depreceated use "bytes" instead (v1.1.1) */ asMemoryView? :boolean } /** UTF8Bytes is a Uint8Array representing UTF8 text */ export interface UTF8Bytes extends Uint8Array { /** toString returns a UTF8 decoded string (lazily decoded and cached) */ toString() :string } /** Flags that customize Markdown parsing */ export enum ParseFlags { /** In TEXT, collapse non-trivial whitespace into single ' ' */ COLLAPSE_WHITESPACE, /** Enable $ and $$ containing LaTeX equations. */ LATEX_MATH_SPANS, /** Disable raw HTML blocks. */ NO_HTML_BLOCKS, /** Disable raw HTML (inline). */ NO_HTML_SPANS, /** Disable indented code blocks. (Only fenced code works.) */ NO_INDENTED_CODE_BLOCKS, /** Do not require space in ATX headers ( ###header ) */ PERMISSIVE_ATX_HEADERS, /** Recognize e-mails as links even without <...> */ PERMISSIVE_EMAIL_AUTO_LINKS, /** Recognize URLs as links even without <...> */ PERMISSIVE_URL_AUTO_LINKS, /** Enable WWW autolinks (without proto; just 'www.') */ PERMISSIVE_WWW_AUTOLINKS, /** Enable strikethrough extension. */ STRIKETHROUGH, /** Enable tables extension. */ TABLES, /** Enable task list extension. */ TASK_LISTS, /** Enable wiki links extension. */ WIKI_LINKS, /** Enable underline extension (disables '_' for emphasis) */ UNDERLINE, /** Default flags are: * COLLAPSE_WHITESPACE | * PERMISSIVE_ATX_HEADERS | * PERMISSIVE_URL_AUTO_LINKS | * STRIKETHROUGH | * TABLES | * TASK_LISTS */ DEFAULT, /** Shorthand for NO_HTML_BLOCKS | NO_HTML_SPANS */ NO_HTML, } ">
/**
 * parse reads markdown source at s and converts it to HTML.
 * When output is a byte array, it will be a reference.
 */
export function parse(s :Source, o? :ParseOptions & { bytes? :never|false }) :string
export function parse(s :Source, o? :ParseOptions & { bytes :true }) :Uint8Array

/** Markdown source code can be provided as a JavaScript string or UTF8 encoded data */
type Source = string | ArrayLike<number>

/** Options for the parse function */
export interface ParseOptions {
  /** Customize parsing. Defaults to ParseFlags.DEFAULT */
  parseFlags? :ParseFlags

  /** Select output format. Defaults to "html" */
  format? : "html" | "xhtml"

  /**
   * bytes=true causes parse() to return the result as a Uint8Array instead of a string.
   *
   * The returned Uint8Array is only valid until the next call to parse().
   * If you need to keep the returned data around, call Uint8Array.slice() to make a copy,
   * as each call to parse() uses the same underlying memory.
   *
   * This only provides a performance benefit when you never need to convert the output
   * to a string. In most cases you're better off leaving this unset or false.
   */
  bytes? :boolean

  /** Allow "javascript:" in links */
  allowJSURIs? :boolean

  /**
   * Optional callback which if provided is called for each code block.
   * langname holds the "language tag", if any, of the block.
   *
   * The returned value is inserted into the resulting HTML verbatim, without HTML escaping.
   * Thus, you should take care of properly escaping any special HTML characters.
   *
   * If the function returns null or undefined, or an exception occurs, the body will be
   * included as-is after going through HTML escaping.
   *
   * Note that use of this callback has an adverse impact on performance as it casues
   * calls and data to be bridged between WASM and JS on every invocation.
   */
  onCodeBlock? :(langname :string, body :UTF8Bytes) => Uint8Array|string|null|undefined

  /** @depreceated use "bytes" instead (v1.1.1) */
  asMemoryView? :boolean
}

/** UTF8Bytes is a Uint8Array representing UTF8 text  */
export interface UTF8Bytes extends Uint8Array {
  /** toString returns a UTF8 decoded string (lazily decoded and cached) */
  toString() :string
}

/** Flags that customize Markdown parsing */
export enum ParseFlags {
  /** In TEXT, collapse non-trivial whitespace into single ' ' */ COLLAPSE_WHITESPACE,
  /** Enable $ and $$ containing LaTeX equations. */              LATEX_MATH_SPANS,
  /** Disable raw HTML blocks. */                                 NO_HTML_BLOCKS,
  /** Disable raw HTML (inline). */                               NO_HTML_SPANS,
  /** Disable indented code blocks. (Only fenced code works.) */  NO_INDENTED_CODE_BLOCKS,
  /** Do not require space in ATX headers ( ###header ) */        PERMISSIVE_ATX_HEADERS,
  /** Recognize e-mails as links even without <...> */            PERMISSIVE_EMAIL_AUTO_LINKS,
  /** Recognize URLs as links even without <...> */               PERMISSIVE_URL_AUTO_LINKS,
  /** Enable WWW autolinks (without proto; just 'www.') */        PERMISSIVE_WWW_AUTOLINKS,
  /** Enable strikethrough extension. */                          STRIKETHROUGH,
  /** Enable tables extension. */                                 TABLES,
  /** Enable task list extension. */                              TASK_LISTS,
  /** Enable wiki links extension. */                             WIKI_LINKS,
  /** Enable underline extension (disables '_' for emphasis) */   UNDERLINE,

  /** Default flags are:
   *    COLLAPSE_WHITESPACE |
   *    PERMISSIVE_ATX_HEADERS |
   *    PERMISSIVE_URL_AUTO_LINKS |
   *    STRIKETHROUGH |
   *    TABLES |
   *    TASK_LISTS
   */
  DEFAULT,

  /** Shorthand for NO_HTML_BLOCKS | NO_HTML_SPANS */
  NO_HTML,
}

See markdown.d.ts

Building from source

npm install
npx wasmc

Build debug version of markdown into ./build/debug and watch source files:

npx wasmc -g -w

If you need special builds, like for example an ES module with embedded WASM, edit the wasmc.js file and add module({...}) directives.

Example:

module({ ...m,
  name:   "markdown-custom",
  out:    outdir + "/markdown.custom.js",
  embed:  true,
  format: "es",
})
Issues
  • Preventing JavaScript URLs upon parsing markdown links

    Preventing JavaScript URLs upon parsing markdown links

    I was looking at using this project for a server-side Markdown parser, but someone I was working with tried out the demo and pointed out that this markdown:

    [some text](javascript:alert("xss"))
    

    renders as an actual JavaScript link. Does markdown-wasm offer more fine-grained control to prevent this specific URL type from being parsed?

    If not, we can attempt to remove them manually (using JavaScript), but it would be great if it could directly be dealt with in the Wasm parser itself.

    enhancement 
    opened by ghost 4
  • Unexpected escaping within code blocks

    Unexpected escaping within code blocks

    First of all: this is an amazing library! I love the anchor links auto-generated in headings. Fantastic 🎉

    That said, there are some unexpected results when parsing code blocks. Here’s an example from Redux’s README:

      /**
    -  * This is a reducer, a pure function with (state, action) => state signature.
    +  * This is a reducer, a pure function with (state, action) =&gt; state signature.
    
     …
    
    - store.subscribe(() => console.log(store.getState()))
    + store.subscribe(() =&gt; console.log(store.getState()))
    

    This results in (caused mostly by the syntax highlighting library):

    Screen Shot 2020-09-14 at 7 23 58 PM

    Expected behavior would be to not HTML escape anything within those code blocks.

    I don’t know of a README with an actual lesser-than comparison (e.g. x < y -> x &lt; y), but I’d suspect a similar behavior with that, too.

    If desired, I could make an attempt at a PR (but be warned—I’m a C n00b).

    opened by drwpow 3
  • UTF-8 support should likely be enabled in MD4C.

    UTF-8 support should likely be enabled in MD4C.

    Hello, MD4C author here.

    Just noticed in the demo that reference links are not handled properly with the respect to non-ASCII case-insensitive label matching, so for example:

    [á]: /url
    [Á]
    

    is rendered as a literal

    <p>[Á]</p>
    

    instead as a link.

    You might perhaps want to use -DMD4C_USE_UTF8 to remedy that. (See https://github.com/mity/md4c#inputoutput-encoding for more info.)

    opened by mity 3
  • Deno support?

    Deno support?

    Any plan to add Deno support for markdown-wasm, and Deno developer can use this module to render Markdown quickly.

    Now I have following Deno typescript code, such as demo.ts

    import * as markdown from "https://raw.githubusercontent.com/rsms/markdown-wasm/master/dist/markdown.es.js";
    await markdown.ready
    console.log(markdown.parse("# hello\n*world*"))
    

    I got the error with deno run demo.ts

    Download https://raw.githubusercontent.com/rsms/markdown-wasm/master/dist/markdown.es.js
    Check file:///Users/xxxx/demo.ts
    error: Uncaught ReferenceError: document is not defined
        at https://raw.githubusercontent.com/rsms/markdown-wasm/master/dist/markdown.es.js:1:1908
    

    Is it possible to produce a js file for Deno? such as markdown.deno.js, and the code alike following:

    import {parse} from "https://denopkg.com/rsms/markdown-wasm/dist/markdown.deno.js";
    console.log(parse("# hello\n*world*"))
    
    opened by linux-china 2
  • Reference images inside reference links

    Reference images inside reference links

    Given the following markdown (this one found in testing-library/react-testing-library):

    [![Build Status][build-badge]][build]
    
    [build-badge]: https://img.shields.io/travis/testing-library/react-testing-library.svg?style=flat-square
    [build]: https://travis-ci.org/testing-library/react-testing-library
    

    This is expected:

    <a href="https://travis-ci.org/testing-library/react-testing-library"><img src="https://img.shields.io/travis/testing-library/react-testing-library.svg?style=flat-square" alt="Build Status" /></a>
    

    But instead the following markup is generated (link is after <img> tag, and extra square brackets are left):

    [<img src="https://img.shields.io/travis/testing-library/react-testing-library.svg?style=flat-square" alt="Build Status">]<a href="https://travis-ci.org/testing-library/react-testing-library">build</a>
    

    While I can’t say I’ve ever used the pattern much, it seems that quite a number of packages on npm use this paradigm.

    Would love to help on this issue if desired. Thanks!

    opened by drwpow 2
  • Bump lodash from 4.17.20 to 4.17.21 in /test/benchmark

    Bump lodash from 4.17.20 to 4.17.21 in /test/benchmark

    Bumps lodash from 4.17.20 to 4.17.21.

    Commits
    • f299b52 Bump to v4.17.21
    • c4847eb Improve performance of toNumber, trim and trimEnd on large input strings
    • 3469357 Prevent command injection through _.template's variable option
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump y18n from 4.0.0 to 4.0.1 in /test/benchmark

    Bump y18n from 4.0.0 to 4.0.1 in /test/benchmark

    Bumps y18n from 4.0.0 to 4.0.1.

    Changelog

    Sourced from y18n's changelog.

    Change Log

    All notable changes to this project will be documented in this file. See standard-version for commit guidelines.

    5.0.5 (2020-10-25)

    Bug Fixes

    5.0.4 (2020-10-16)

    Bug Fixes

    • exports: node 13.0 and 13.1 require the dotted object form with a string fallback (#105) (4f85d80)

    5.0.3 (2020-10-16)

    Bug Fixes

    • exports: node 13.0-13.6 require a string fallback (#103) (e39921e)

    5.0.2 (2020-10-01)

    Bug Fixes

    5.0.1 (2020-09-05)

    Bug Fixes

    5.0.0 (2020-09-05)

    ⚠ BREAKING CHANGES

    • exports maps are now used, which modifies import behavior.
    • drops Node 6 and 4. begin following Node.js LTS schedule (#89)

    Features

    ... (truncated)

    Commits
    Maintainer changes

    This version was pushed to npm by oss-bot, a new releaser for y18n since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • [Question] Can I visit all node of markdown AST using Markdown-wasm?

    [Question] Can I visit all node of markdown AST using Markdown-wasm?

    Hi all, I looking for a efficient parser and Markdown-wasm get may attention because is super fast and really real time parser. So, on may problem I need that, but is very import visit all nodes of markdown ast. Like the title, can I visit the ast using one interface provided by Markdown-wasm. If its possible, you have some docs?

    Thank in advance.

    opened by newtonjose 0
  • How add class or id for h tags ?

    How add class or id for h tags ?

    Hi. I have included this library. And my output is this format.

    <h1><a id="" class="anchor" aria-hidden="true" href="#"></a>test 1</h1>
    <h2><a id="" class="anchor" aria-hidden="true" href="#"></a>test 2</h2>
    

    How add my id or class in markdown ? And is it possible not to create tags a. How about adding an id for the h tag? And how can i convert html to markdown ?

    opened by zababurinsv 0
  • Certain indentation in code block causes NUL byte in output

    Certain indentation in code block causes NUL byte in output

    repro: Input markdown:

                         |
    

    Expected output:

    <pre><code>                 |⮐</code></pre>
    
    3c 70 72 65 3e 3c 63 6f 64 65 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a
    3c 2f 63 6f 64 65 3e 3c 2f 70 72 65 3e 0a
    

    Actual output:

    3c 70 72 65 3e 3c 63 6f 64 65 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00 7c 0a
                                                                                     ~~
                                                                                     NUL
    3c 2f 63 6f 64 65 3e 3c 2f 70 72 65 3e 0a
    

    bug1.js.zip

    opened by rsms 0
  • How to explicitly specify the location of markdown.wasm?

    How to explicitly specify the location of markdown.wasm?

    I'm trying to use it in a Vue component, but when viewed from the browser URL, it tries to read markdown.wasm on the same path, so an error occurs depending on the URL. I want to fix the location of this markdown.wasm to a location like /asset/markdowwn.wasm. How should I set it?

    opened by logue 0
  • Option to disable anchor in title block

    Option to disable anchor in title block

    Hi! Thanks for this library. It's really super fast!

    I've some issues when I send the html output to a wysiwyg editor caused by the anchor link added in each title. Let's say there is a title: # h1 The output is: <h1><a id="h1" class="anchor" aria-hidden="true" href="#h1"></a>h1</h1>

    It's a good idea to add an anchor, but that doesn't play well with some wysiwyg editor like prosemiror. Currently, I manually remove this anchor, but it would be nice to have an option to disable this feature.

    opened by ManUtopiK 1
  • Unable to use with Svelte-kit

    Unable to use with Svelte-kit

    Hi,

    First off, thanks a lot for this module!

    I'm trying to use this in Svelte-kit. I got it working in development mode locally after spending a few hours trying to understand and modify markdown.es.js. But while building for deployment I get this error -

    [vite:worker] UMD and IIFE output formats are not supported for code-splitting builds.
    

    Do you know how I can resolve this?

    opened by saiabishek1 1
  • Add remarkable benchmark

    Add remarkable benchmark

    I was interested in seeing how markdown-wasm compares to remarkable, which was made to improve marked - not only to improve speed but also add plugins. Their benchmarks say over 3 times speed increase over marked (which if accurate would mean it's faster than markdown-wasm), in reality it's less than 2 times on average.

    This pull request adds remarkable to the benchmark suite (with their default settings) and updates rendered images to include my results. You likely want to run it on your macbook to have the results from your macbook as stated in README.

    I have 3.5 GHz AMD Ryzen 3 desktop, 16GB RAM running Manjaro 5.10

    opened by danbulant 0
  • TypeError: Cannot set property exports of undefined

    TypeError: Cannot set property exports of undefined

    I am trying to use this package inside Atom, which is an Electron app. I used the following code to load and instantiate the wasm module asynchronously because Electron doesn't allow compiling large wasm files on the main thread.

      if (markdown_parse === undefined) {
        // wasm should be loaded async
        // @ts-ignore
        const markdown_wasm = (await import("markdown-wasm/dist/markdown.es")) as typeof import("markdown-wasm") & {
          ready: Promise<void>
        }
        // instantiate wasm
        await markdown_wasm.ready
        markdown_parse = markdown_wasm.parse
      }
    

    I use Rollup as my compiler.

    However, when I bundle the application I get these errors:

    TypeError: Cannot set property exports of undefined

    image

    image

    image

    opened by aminya 0
Owner
Rasmus
Personal Software, languages, compilers, Humans & Computers, and other fun things. Past professional life at Figma, Facebook, Spotify, Dropbox, etc.
Rasmus
Standards compliant, fast, secure markdown processing library in C

Hoedown Hoedown is a revived fork of Sundown, the Markdown parser based on the original code of the Upskirt library by Natacha Porté. Features Fully s

Hoedown 919 Jul 28, 2022
Tau is a fast syntax highlighter capable of emitting HTML.

tau - a reasonably fast (wip) syntax highlighter. Tau is a fast syntax highlighter capable of emitting HTML. It highlights the following languages: py

Palaiologos 12 Apr 21, 2022
Rich text library supporting customizable Markdown formatting

Rich text library supporting customizable Markdown formatting

Brace Yourself Games 81 Aug 3, 2022
The libxo library allows an application to generate text, XML, JSON, and HTML output using a common set of function calls. The application decides at run time which output style should be produced.

libxo libxo - A Library for Generating Text, XML, JSON, and HTML Output The libxo library allows an application to generate text, XML, JSON, and HTML

Juniper Networks 242 Jul 19, 2022
Repair UTF-8 codes and problematic HTML in Eudora mailboxes

Eudora_fix_mbx: Repair UTF-8 character codes and problematic HTML in Eudora mailboxes

Len Shustek 4 Feb 7, 2022
A tiny programming language that transpiles to C, C++, Java, TypeScript, Python, C#, Swift, Lua and WebAssembly 🚀

A tiny programming language that transpiles to C, C++, Java, TypeScript, Python, C#, Swift, Lua and WebAssembly ??

Lingdong Huang 537 Aug 2, 2022
Python bindings for Wasm3, the fastest WebAssembly interpreter

pywasm3 Python bindings for Wasm3, the fastest WebAssembly interpreter Main repository: Wasm3 project Install # Latest release: pip3 install pywasm3

Wasm3 Labs 46 Jun 17, 2022
C-code generator for docopt language.

C-code generator for docopt language Note, at this point the code generator handles only options (positional arguments, commands and pattern matching

null 310 Jul 21, 2022
Simple and lightweight pathname parser for C. This module helps to parse dirname, basename, filename and file extension .

Path Module For C File name and extension parsing functionality are removed because it's difficult to distinguish between a hidden dir (ex: .git) and

Prajwal Chapagain 3 Feb 25, 2022
Lightweight state machine implemented in C++

Intro This is my second take on C++ state machine implementation. My first attempt can be found here. The main goals of the implementation are: No dyn

Łukasz Gemborowski 20 Jul 14, 2022
tiny recursive descent expression parser, compiler, and evaluation engine for math expressions

TinyExpr TinyExpr is a very small recursive descent parser and evaluation engine for math expressions. It's handy when you want to add the ability to

Lewis Van Winkle 1.1k Aug 7, 2022
Parser for argv that works similarly to getopt

About Most command-line programs have to parse options, so there are a lot of different solutions to this problem. Some offer many features, while oth

Jørgen Ibsen 152 Aug 3, 2022
Simple .INI file parser in C, good for embedded systems

inih (INI Not Invented Here) inih (INI Not Invented Here) is a simple .INI file parser written in C. It's only a couple of pages of code, and it was d

Ben Hoyt 1.8k Aug 6, 2022
ini file parser

Iniparser 4 I - Overview This modules offers parsing of ini files from the C level. See a complete documentation in HTML format, from this directory o

Nicolas D 807 Aug 1, 2022
Small configuration file parser library for C.

libConfuse Introduction Documentation Examples Build & Install Origin & References Introduction libConfuse is a configuration file parser library writ

null 411 Aug 5, 2022
Universal configuration library parser

LIBUCL Table of Contents generated with DocToc Introduction Basic structure Improvements to the json notation General syntax sugar Automatic arrays cr

Vsevolod Stakhov 1.4k Jul 27, 2022
MiniCalculator with a simple parser.

MiniCalculator with a simple parser. This is a homework-expanded project. To learn something about parser and basic theory of programmi

GZTime 8 Oct 9, 2021
A simple YAML parser which produces a Node Tree Object representation of YAML Documents

A simple YAML parser which produces a Node Tree Object representation of YAML Documents and includes a find method to locate individual Nodes within the parsed Node Tree.

Timothy Rule 2 Jul 14, 2022
A PE parser written as an exercise to study the PE file structure.

Description A PE parser written as an exercise to study the PE file structure. It parses the following parts of PE32 and PE32+ files: DOS Header Rich

Ahmed Hesham 15 Jun 22, 2022