{"id":16328440,"url":"https://github.com/henry-luo/mark","last_synced_at":"2026-01-14T15:28:18.933Z","repository":{"id":143803920,"uuid":"100926932","full_name":"henry-luo/mark","owner":"henry-luo","description":"A simple and unified notation for both object and markup data.","archived":false,"fork":false,"pushed_at":"2025-07-25T01:38:35.000Z","size":1509,"stargazers_count":458,"open_issues_count":2,"forks_count":15,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-12-21T19:38:50.599Z","etag":null,"topics":["dom","json","jsx","markup","parser","xml","yaml"],"latest_commit_sha":null,"homepage":"https://marknotation.org/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/henry-luo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-08-21T07:48:33.000Z","updated_at":"2025-08-24T18:19:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"2d5a7f2b-89aa-48fb-ba76-58c0206478fa","html_url":"https://github.com/henry-luo/mark","commit_stats":null,"previous_names":["henry-luo/mark-js"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/henry-luo/mark","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henry-luo%2Fmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henry-luo%2Fmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henry-luo%2Fmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henry-luo%2Fmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/henry-luo","download_url":"https://codeload.github.com/henry-luo/mark/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henry-luo%2Fmark/sbom","scorecard":{"id":461520,"data":{"date":"2025-08-11","repo":{"name":"github.com/henry-luo/mark","commit":"bb86028d6a34c7addbf0672b5956415de198373e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/henry-luo/mark/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/henry-luo/mark/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/henry-luo/mark/ci.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/ci.yml:29","Warn: npmCommand not pinned by hash: .github/workflows/ci.yml:33","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"68 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-42xw-2xvc-qx8m","Warn: Project is vulnerable to: GHSA-4w2v-q235-vp99","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-pp7h-53gx-mx7r","Warn: Project is vulnerable to: GHSA-9mvj-f7w8-pvh2","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-9j49-mfvp-vmhm","Warn: Project is vulnerable to: GHSA-j4f2-536g-r55m","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-2j2x-2gpw-g8fm","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-44pw-h2cw-w3vq","Warn: Project is vulnerable to: GHSA-jp4x-w63m-7wgm","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-7x7c-qm48-pq9c","Warn: Project is vulnerable to: GHSA-rc3x-jf5g-xvc5","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-fvqr-27wr-82fm","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-82v2-mx6x-wq7q","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-4c7m-wxvm-r7gc","Warn: Project is vulnerable to: GHSA-pch5-whg9-qr2r","Warn: Project is vulnerable to: GHSA-48ww-j4fc-435p","Warn: Project is vulnerable to: GHSA-hwqf-gcqm-7353","Warn: Project is vulnerable to: GHSA-9h6g-pr28-7cqp","Warn: Project is vulnerable to: GHSA-6fx8-h7jm-663j","Warn: Project is vulnerable to: GHSA-hg79-j56m-fxgv","Warn: Project is vulnerable to: GHSA-35q2-47q7-3pc3","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-hjp8-2cm3-cc45","Warn: Project is vulnerable to: GHSA-fxwf-4rqh-v8g3","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-xfhh-g9f5-x4m4","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-cqmj-92xf-r6r9","Warn: Project is vulnerable to: GHSA-f523-2f5j-gfcg","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-xc7v-wxcw-j472","Warn: Project is vulnerable to: GHSA-cf4h-3jhx-xvhq","Warn: Project is vulnerable to: GHSA-mgfv-m47x-4wqp","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-72mh-269x-7mh5","Warn: Project is vulnerable to: GHSA-h4j5-c7cj-74xg","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T11:15:01.904Z","repository_id":143803920,"created_at":"2025-08-19T11:15:01.904Z","updated_at":"2025-08-19T11:15:01.904Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28424374,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T13:30:50.153Z","status":"ssl_error","status_checked_at":"2026-01-14T13:29:08.907Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dom","json","jsx","markup","parser","xml","yaml"],"created_at":"2024-10-10T23:14:19.713Z","updated_at":"2026-01-14T15:28:18.916Z","avatar_url":"https://github.com/henry-luo.png","language":"JavaScript","readme":"# Mark Notation\n\n[![npm version](https://badge.fury.io/js/mark-js.svg)](https://badge.fury.io/js/mark-js)\n[![CI](https://github.com/henry-luo/mark/actions/workflows/ci.yml/badge.svg)](https://github.com/henry-luo/mark/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/henry-luo/mark/branch/master/graph/badge.svg)](https://codecov.io/gh/henry-luo/mark)\n\n**Mark** is a unified notation for both object and markup data, combining the best of JSON, HTML, and XML with a clean syntax and succinct data model.\n\n- It has **clean syntax** with **fully-typed** data model *(like JSON, or even better)*\n- It is **generic** and **extensible** *(like XML, or even better)*\n- It has built-in **mixed content** support *(like HTML5 or even better)*\n\n|                       | Mark    | JSON | HTML | JSX                              | XML         | S-expr  | YAML                                  |\n| --------------------- | ------- | ---- | ---- | -------------------------------- | ----------- | ------- | ------------------------------------- |\n| Clean syntax          | yes     | yes  | no   | no                               | verbose     | yes     | yes \u003csub\u003e(only for basic usage)\u003c/sub\u003e |\n| Fully-typed           | yes     | yes  | no   | partially\u003cbr\u003e\u003csub\u003ein {...}\u003c/sub\u003e | need schema | yes     | yes                                   |\n| Generic               | yes     | yes  | no   | no                               | yes         | yes     | yes                                   |\n| Mixed content support | yes     | hard | yes  | yes                              | yes         | hard    | hard                                  |\n| Wide adoption         | not yet | yes  | yes  | yes                              | yes         | limited | limited                               |\n\n## Mark Syntax\n\nThe major syntax extension Mark makes to JSON is the introduction of a Mark element. It is a JSON object extended with a type name and a list of content items, similar to element in HTML and XML.\n\nFor example, a HTML registration form:\n\n```html\n\u003cform\u003e\n  \u003cdiv class=\"form-group\"\u003e\n    \u003clabel for=\"email\"\u003eEmail address:\u003c/label\u003e\n    \u003cinput type=\"email\" id=\"email\"\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"form-group\"\u003e\n    \u003clabel for=\"pwd\"\u003ePassword\u003c/label\u003e\n    \u003cinput type=\"password\" id=\"pwd\"\u003e\n  \u003c/div\u003e\n  \u003cbutton class='btn btn-info'\u003eSubmit\u003c/button\u003e\n\u003c/form\u003e\n```\n\nCould be represented in Mark as:\n\n```mark\n\u003cform                                 // element with name 'form'\n  \u003cdiv class:'form-group'             // nested child element\n    \u003clabel for:email                  // 'for' and its value, both unquoted\n      \"Email address:\"                // text needs to be double quoted\n    \u003e                                 // end element with just '\u003e'\n    \u003cinput type:email, id:email\u003e      // element without child\n  \u003e                                   \n  \u003cdiv class:'form-group'             // 'form-group' is a quoted symbol\n    \u003clabel for:pwd; \"Password\"\u003e       // pwd is an unquoted symbol\n    \u003cinput type:password, id:pwd\u003e     // attrs separated by comma, like JSON\n  \u003e\n  \u003cbutton class:[btn,'btn-info']      // attribute with complex values\n    \"Submit\"                          // comment like in JS!\n  \u003e                                   \n\u003e\n```\n\nYou can refer to the [Mark syntax doc](https:/marknotation.org//mark-syntax.html) for details.\n\n## Mark Data Model\n\nMark 1.0 introduced a few new data types: *symbol*, *datetime*, *binary*, and *list*. Together with the existing data types (in Mark 0.11 beta release), they pretty well cover all the commonly used built-in datatypes in JS. And here's the Mark 1.0 datatype hierarchy:\n\n\u003cdiv align=\"center\"\u003e\u003cimg src='docs/mark-datatype-hierarchy.png' width=\"650\"\u003e\u003c/div\u003e\n\nRoughly speaking, data models of JSON, XML, HTML are subsets of Mark data model, and Mark data model is a subset of JS data model.\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src='https://marknotation.org/data-model.png' width='280'\u003e\n\u003c/div\u003e\n\n### Mark element\n\nEach Mark element has 3 facets of data:\n\n- **Element name**, which is mapped to `object.constructor.name` under JavaScript.\n- **Attributes**, which is a collection of key-value pairs, stored as normal JavaScript *named properties*.\n- **Contents**, which is a list of child objects, stored as *indexed properties* inside the same JavaScript object.\n\nMark utilizes a novel feature in JavaScript that a plain JS object is actually *array-like*, it can contain both named properties and indexed properties.\n\nSo each Mark element is mapped to just **one** plain JavaScript object, which is more compact and efficient compared to other JSON-based DOM models (e.g. [JsonML](http://www.jsonml.org/), [virtual-dom](https://github.com/Matt-Esch/virtual-dom), [MicroXML](https://dvcs.w3.org/hg/microxml/raw-file/tip/spec/microxml.html)), and is more intuitive to use under JS.\n\nYou can refer to the [Mark data model doc](https://marknotation.org/mark-model.html) for details.\n\n## Mark vs. Other Formats\n### Mark vs. JSON\n\nMark is a superset of JSON. It extends JSON notation with additional scalar and container types.\n\nCompared to JSON, Mark has the following advantages:\n\n- Additional scalar types supported under Mark, including: *symbol*, *decimal number*, *datetime*, *binary* (essentially covering all commonly used built-in data types under JS).\n- Mark supports a new container type: ***element***. Mark *element* has a type-name, which is important in identifying what the data represents; whereas JSON map is actually an anonymous object, missing the type name.\n- Mark element has built-in mixed-content support, like in HTML and XML, which is awkward for JSON.\n- Mark incorporates some syntax enhancements to JSON (e.g. allowing comments, name without quotes, etc.), thus making the format even more friendly to use than JSON.\n\nSome disadvantages of Mark, compared to JSON:\n\n- It is no longer a subset of JavaScript literal syntax, although a Mark object is still a simple POJO in JS data model.\n- It does not yet have wide support, like JSON, at the moment.\n\n### Mark vs. HTML/JSX\n\nCompared to HTML/JSX, Mark has the following advantages:\n\n- Mark is a generic data format, whereas HTML is a specialized format for web content.\n- It does not have whitespace ambiguity, as the text objects are quoted explicitly. It can be minified or prettified without worrying about changing the underlying content.\n- Mark attributes can have complex values, like JSON, not just quoted string values as in HTML.\n- It has a very clean syntax, whereas HTML5 parsing is complicated, e.g. the non-extensible and error-prone self-closing syntax rules.\n- Mark contains just a hierarchy of POJO objects, which can be easily processed using the built-in JS language or any 3rd party libraries, without the need of complex DOM APIs. Making it an ideal for virtual DOM and other application usages.\n\n### Mark vs. XML\n\nCompared to XML, Mark has the following advantages:\n\n- Mark attributes can have complex objects as values; whereas XML attribute values always need to be quoted, and cannot have complex objects as values.\n- Mark syntax is much cleaner than XML. No whitespace ambiguity. No verbose closing tag. Does not have legacies like DTD, which is half-baked for full schema definition. \n- The data model produced by Mark is fully typed, like JSON; whereas XML is only semi-typed, when there's no schema.\n- Simple POJO vs. complex DOM APIs.\n\n### Mark vs. S-expressions\n\nLisp and S-expression gave rise to novel ideas like high-order composition, self-hosting program, data as code, code as data, etc.. It's the source of inspiration of Mark and [Lambda Script](https://github.com/henry-luo/lambda).\n\nThe advantage of Mark over S-expressions is that it takes a more modern, web-first approach in its design, making it more readily usable in web and Node.js environments.\n\n## Using Mark\n\n### mark.js library\n\n`mark.js` is the JS library to work with data in Mark format. It consists of 4 modules:\n\n- The core module `mark.js`, which provides `parse()` and `stringify()` functions, like JSON, and a direct Mark object construction function `Mark()`, and some functional APIs to work with the object content.\n- Sub-module `mark.mutate.js`, which provides mutative APIs to change the Mark object data model.\n- Sub-module `mark.convert.js`, which provides conversion between Mark format and other formats like HTML and XML.\n- Sub-module `mark.selector.js`, which provides CSS selector based query interface on the Mark object model, like jQuery.\n\n### mark.js installation\n\nInstall from NPM:\n\n```\nnpm install mark-js --save\n```\n\nThen in your node script, use it as:\n\n```js\nconst Mark = require('mark-js');\nvar obj = Mark.parse(`\u003cdiv \u003cspan \"Hello World!\"\u003e\u003e`);\nconsole.log(\"Greeting from Mark: \" + Mark.stringify(obj));\n```\n\nTo use the library in browser, you can include the `mark.js` under `/dist` directory into your html page, like:\n\n```html\n\u003cscript src='mark.js'\u003e\u003c/script\u003e\n\u003cscript\u003e\nvar obj = Mark(`\u003cdiv \u003cspan \"Hello World!\"\u003e\u003e`);  // using a shorthand\nconsole.log(\"Greeting from Mark: \" + Mark.stringify(obj));\n\u003c/script\u003e\n```\n\nNote: /dist/mark.js has bundled all sub-modules and all dependencies with it, and is meant to run in browser. The entire script is about 14K after gzip. It supports latest browsers, including Chrome, Safari, Firefox, Edge. (*Legacy browser IE is not supported.*)\n\n*If you just want the core functional API, without the sub-modules, you can also use mark.core.js, which is only 7K after gzip. You can also refer to the package.json to create your own custom bundle with the sub-modules you need.*\n\n### VS Code extension\n\nAnd here's the [Mark VSC Extension](https://marketplace.visualstudio.com/items?itemName=henryluo.mark-vsce) to help syntax highlight Mark documents when you edit it in VS Code.\n\n## Documentation\n\n- [Syntax documentation](https://marknotation.org/syntax)\n- [Data model documentation](https://marknotation.org/data-model)\n- [API documentation](https://marknotation.org/api)\n- [FAQ](https://marknotation.org/faq)\n- Hacker News discussion about [Mark beta release](https://news.ycombinator.com/item?id=16308581)\n- Hacker News discussion about [Mark 1.0 release](https://news.ycombinator.com/item?id=44604474)\n\n## 1.0 and Beyond\n\nMark 1.0 release just mark the start of a long journey to make web a better platform to store and exchange both object and markup data.\n\n1.0 release just means whatever is released in this version will receive backward compatible support in the foreseeable future like the ever-green HTML. \n\nSome of the planned further enhancements include:\n- Namespace support;\n- ID and IDREF support;\n\nFor a new notation to be widely adopted, just defining the syntax and data model is not enough. It needs languages, tools and eco-system to work with it. Thus a new project, [Lambda Script](https://github.com/henry-luo/lambda), has been started to develop a general-purpose, pure functional language to validate, query, transform, and present data stored in Mark format.\n\nYour contribution and feedback to both projects are welcome.\n\n## Credits\n\nThanks to the following platforms or services that support the open source development of Mark: NPM, GitHub,  [Codecov](https://codecov.io/), [JS.org](https://js.org/).\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhenry-luo%2Fmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhenry-luo%2Fmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhenry-luo%2Fmark/lists"}