Skip to content

Commit

Permalink
feat(hiccup-markdown): update/extend new parser
Browse files Browse the repository at this point in the history
- update blockquote handling
- add emoji support (& dependency)
- update/improve metablock format/handling
  - add meta type/syntax identifier
  - TODO meta data parsing
- update TagTransforms to accept meta data
- update horizontal rule parser (keep track of length)
  • Loading branch information
postspectacular committed Feb 20, 2023
1 parent c5fdc40 commit 5d030ad
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 24 deletions.
4 changes: 2 additions & 2 deletions packages/hiccup-markdown/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"@thi.ng/arrays": "^2.5.5",
"@thi.ng/checks": "^3.3.9",
"@thi.ng/defmulti": "^2.1.30",
"@thi.ng/emoji": "^0.0.1",
"@thi.ng/errors": "^2.2.11",
"@thi.ng/fsm": "^3.1.40",
"@thi.ng/hiccup": "^4.2.32",
Expand Down Expand Up @@ -95,6 +96,5 @@
"parent": "@thi.ng/hiccup",
"status": "alpha",
"year": 2018
},
"gitHead": "2b5a99a8af71670780875637299be9118b01084d\n"
}
}
78 changes: 56 additions & 22 deletions packages/hiccup-markdown/src/parser.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
// thing:no-export

// Downloaded @ 2023-02-18T13:59:10.044Z
// Source: https://demo.thi.ng/umbrella/parse-playground/#ldoKU0ROTDE6IDxETkw-KyA9PiBkaXNjYXJkIDsKRE5MMjogPE5MPnsyLH0gOwppbmxpbmVkZWxpbTogKCAiIVsiIHwgJ1snIHwgIioqIiB8ICdfJyB8ICJ-fiIgfCAnYCcgfCAiIDoiICkgOwpkZWxpbTogKCA8aW5saW5lZGVsaW0-IHwgPEROTDI-ICkgOwpkZWxpbTE6ICggPGlubGluZWRlbGltPiB8IDxOTD4gKSA7CmJvZHk6IC4oPy08ZGVsaW0-ISkgPT4gam9pbiA7CmJvZHkxOiAuKD8tPGRlbGltMT4hKSA9PiBqb2luIDsKCnJlZjogIltbIiEgLig_KyJdXSIhKSA9PiBqb2luIDsKZm5yZWY6ICJbXiIhIDx1aW50PiAiXSIhIDsKZm5vdGU6IDxMU1RBUlQ-ICJbXiIhIDx1aW50PiAiXToiISA8V1MxPiA8cGFyYT4gOwpsYWJlbDogLig_KyddJyEpID0-IGpvaW4gOwp0YXJnZXQ6IC4oPysnKSchKSA9PiBqb2luIDsKbGluazogJ1snISA8bGFiZWw-ICcoJyEgPHRhcmdldD4gOwpsaW5rcmVmOiAnWychIDxsYWJlbD4gJ1snISA8bGFiZWw-IDsKbGlua2RlZjogPExTVEFSVD4gJ1snISA8bGFiZWw-ICc6JyEgPFdTMT4gPGxkdGFyZ2V0PiA7CmxkdGFyZ2V0OiAuKD8rPEROTDE-KSA9PiBqb2luIDsKaW1nOiAiIVsiISA8bGFiZWw-ICcoJyEgPHRhcmdldD4gOwpib2xkOiAiKioiISAuKD8rIioqIiEpID0-IGpvaW4gOwppdGFsaWM6ICJfIiEgLig_KyJfIiEpID0-IGpvaW4gOwpjb2RlOiAnYCchIC4oPysnYCchKSA9PiBqb2luIDsKc3RyaWtlOiAifn4iISAuKD8rIn5-IiEpID0-IGpvaW4gOwplbW9qaTogIiA6IiEgPEFMUEhBX05VTT4oPysnOichKSA9PiBqb2luIDsKcGFyYTogKDxyZWY-IHwgPGltZz4gfCA8Zm5yZWY-IHwgPGxpbmtyZWY-IHwgPGxpbms-IHwgPGJvbGQ-IHwgPGl0YWxpYz4gfCA8c3RyaWtlPiB8IDxjb2RlPiB8IDxlbW9qaT4gfCA8Ym9keT4pKiA8RE5MMj4hIDsKCmhkbGV2ZWw6ICcjJysgPT4gY291bnQgOwpoZDogPExTVEFSVD4gPGhkbGV2ZWw-IDxXUzA-CiAgICAoPHJlZj4gfCA8aW1nPiB8IDxmbnJlZj4gfCA8bGluaz4gfCA8Ym9sZD4gfCA8aXRhbGljPiB8IDxzdHJpa2U-IHwgPGNvZGU-IHwgPGVtb2ppPiB8IDxib2R5MT4gKSogPEROTDE-IDsKCmxpbGV2ZWw6ICcgJyogPT4gY291bnQgOwp1aW50OiA8RElHSVQ-KyA9PiBpbnQgOwp1bGlkOiA8RE5MPiA8V1MwPiAnLSchIDsKb2xpZDogPEROTD4gPFdTMD4gPERJR0lUPishICcuJyEgOwpsaWRlbGltOiAoIDxkZWxpbT4gfCA8dWxpZD4gfCA8b2xpZD4gKSA7CmxpYm9keTogLig_LTxsaWRlbGltPiEpID0-IGpvaW4gOwp0b2RvOiAnWychIFsgeFhdICddJyEgPFdTMT4gPT4gaG9pc3RSIDsKdWxpdGVtOiA8TFNUQVJUPiA8bGlsZXZlbD4gIi0gIiEgPHRvZG8-PwogICAgICAgICg8cmVmPiB8IDxpbWc-IHwgPGZucmVmPiB8IDxsaW5rPiB8IDxib2xkPiB8IDxpdGFsaWM-IHwgPHN0cmlrZT4gfCA8Y29kZT4gfCA8ZW1vamk-IHwgPGxpYm9keT4gKSogPEROTD4gOwpvbGl0ZW06IDxMU1RBUlQ-IDxsaWxldmVsPiA8dWludD4gIi4gIiEgPHRvZG8-PwogICAgICAgICg8cmVmPiB8IDxpbWc-IHwgPGZucmVmPiB8IDxsaW5rPiB8IDxib2xkPiB8IDxpdGFsaWM-IHwgPHN0cmlrZT4gfCA8Y29kZT4gfCA8ZW1vamk-IHwgPGxpYm9keT4gKSogPEROTD4gOwpsaXN0OiAoPHVsaXRlbT4gfCA8b2xpdGVtPikrIDxETkwxPiA7CgpjYmRlbGltOiA8TFNUQVJUPiAiYGBgIiEgOwpjb2RlYmxvY2s6IDxjYmRlbGltPiEgPGNvZGVtZXRhPiA8Y29kZWJvZHk-IDxETkwxPiA7CmNvZGVtZXRhOiAuKD8rPE5MPiEpID0-IGpvaW4gOwpjb2RlYm9keTogLig_KzxjYmRlbGltPikgPT4gam9pbiA7CgpjdXN0b21kZWxpbTogPExTVEFSVD4gIjo6OiIhIDsKY3VzdG9tYmxvY2s6IDxjdXN0b21kZWxpbT4hIDxjdXN0b21tZXRhPiA8Y3VzdG9tYm9keT4gPEROTDE-IDsKY3VzdG9tbWV0YTogLig_KzxOTD4hKSA9PiBqb2luIDsKY3VzdG9tYm9keTogLig_KzxjdXN0b21kZWxpbT4pID0-IGpvaW4gOwoKbWV0YWJsb2NrOiA8TFNUQVJUPiAie3t7IiEgPG1ldGE-IDxETkwxPiA9PiBob2lzdCA7Cm1ldGFlbmQ6ICJ9fX0iIDxMRU5EPiA7Cm1ldGE6IC4oPys8bWV0YWVuZD4hKSA9PiBqc29uIDsKCmJxbGluZTogPExTVEFSVD4gIj4gIiEKICAgICAgICAoPHJlZj4gfCA8aW1nPiB8IDxmbnJlZj4gfCA8bGluaz4gfCA8Ym9sZD4gfCA8aXRhbGljPiB8IDxzdHJpa2U-IHwgPGNvZGU-IHwgPGVtb2ppPiB8IDxib2R5MT4pKiA8RE5MPiA7CmJxdW90ZTogPGJxbGluZT4rIDxETkwxPiA7Cgp0ZGVsaW06ICg8aW5saW5lZGVsaW0-IHwgJ3wnICkgOwp0Ym9keTogLig_LTx0ZGVsaW0-ISkgPT4gam9pbiA7CnRjZWxsOiA8V1MwPiAoPHJlZj4gfCA8aW1nPiB8IDxmbnJlZj4gfCA8bGluaz4gfCA8Ym9sZD4gfCA8aXRhbGljPiB8IDxzdHJpa2U-IHwgPGNvZGU-IHwgPGVtb2ppPiB8IDx0Ym9keT4gKSogJ3wnISA7CnRyb3c6IDxMU1RBUlQ-ICd8JyEgPHRjZWxsPig_KzxETkw-KSA7CnRhYmxlOiA8dHJvdz4rIDxETkwxPiA7CgpocjogIi0tIiEgJy0nISg_LTxOTD4hKSA8RE5MMT4gOwoKbWFpbjogPFdTMD4gKDxoZD4gfCA8bGlzdD4gfCA8YnF1b3RlPiB8IDxjb2RlYmxvY2s-IHwgPGN1c3RvbWJsb2NrPiB8IDxtZXRhYmxvY2s-IHwgPHRhYmxlPiB8IDxocj4gfCA8Zm5vdGU-IHwgPGxpbmtkZWY-IHwgPHBhcmE-KSogO6RtYWlu2gHNIyBIZWxsbyA6d29ybGQ6W14xXQoKOjo6YWxlcnQKVGVzdCBbbGFiZWxdW3JlZnJlZl0KOjo6Cgp7e3sgeyJpZCI6IDEyMywgInByb3RlY3RlZCI6IHRydWUgfSB9fX0KU28gW1tzbWlsZV9mb28xMl1dIPCfmI0gd2hhdCdzIFt0aGlzXSguL3RoaXMubWQpW14xXSB0aGVuOgoKW14xXTogRm9vIGJhciBiYXoKCjpzbWlsZToKCmBgYHRzIHRhbmdsZTpubyBsbjp5ZXMKY29uc3QgZm9vID0KCmBgYAoKMS4gZm9vCiAgMjMuIGJhcgogICAgIGJheiBhbmQgc28gb24KICAgICBtdWx0aWxpbmUKMi4gYmFycnJyCgo-IGJsb2NrcXVvdGUKPiBtdWx0aWxpbmUgdG9vCj4gLS0gc291cmNlCgp8IGZvbyB8IGJhciB8Cnw6LXwtOnwKfCBbW3JlZiMyMl1dIHwgYG9uYCAqKm9mZioqIHwKClteMV06IEZvbyBfYmFyXyBiYXoKClteMl06IFRPRE8KCltyZWZyZWZdOiBodHRwOi8vdGhpLm5nLwpbZm9vXTogLi9mb28ubWQjYmFyCgrZIjExLiBhYmMKICAtIHh5egoyMS4geHh4CiAgMS4gZm9vCgq6aW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCgo
// Downloaded @ 2023-02-20T22:42:01.250Z
// Source: https://demo.thi.ng/umbrella/parse-playground/#ldoKi0ROTDE6IDxETkw-KyA9PiBkaXNjYXJkIDsKRE5MMjogPE5MPnsyLH0gOwppbmxpbmVkZWxpbTogKCAiIVsiIHwgJ1snIHwgIioqIiB8ICdfJyB8ICJ-fiIgfCAnYCcgfCAiIDoiICkgOwpkZWxpbTogKCA8aW5saW5lZGVsaW0-IHwgPEROTDI-ICkgOwpkZWxpbTE6ICggPGlubGluZWRlbGltPiB8IDxOTD4gKSA7CmJvZHk6IC4oPy08ZGVsaW0-ISkgPT4gam9pbiA7CmJvZHkxOiAuKD8tPGRlbGltMT4hKSA9PiBqb2luIDsKCnJlZjogIltbIiEgLig_KyJdXSIhKSA9PiBqb2luIDsKZm5yZWY6ICJbXiIhIDx1aW50PiAiXSIhIDsKZm5vdGU6IDxMU1RBUlQ-ICJbXiIhIDx1aW50PiAiXToiISA8V1MxPiA8cGFyYT4gOwpsYWJlbDogLig_KyddJyEpID0-IGpvaW4gOwp0YXJnZXQ6IC4oPysnKSchKSA9PiBqb2luIDsKbGluazogJ1snISA8bGFiZWw-ICcoJyEgPHRhcmdldD4gOwpsaW5rcmVmOiAnWychIDxsYWJlbD4gJ1snISA8bGFiZWw-IDsKbGlua2RlZjogPExTVEFSVD4gJ1snISA8bGFiZWw-ICc6JyEgPFdTMT4gPGxkdGFyZ2V0PiA7CmxkdGFyZ2V0OiAuKD8rPEROTDE-KSA9PiBqb2luIDsKaW1nOiAiIVsiISA8bGFiZWw-ICcoJyEgPHRhcmdldD4gOwpib2xkOiAiKioiISAuKD8rIioqIiEpID0-IGpvaW4gOwppdGFsaWM6ICJfIiEgLig_KyJfIiEpID0-IGpvaW4gOwpjb2RlOiAnYCchIC4oPysnYCchKSA9PiBqb2luIDsKc3RyaWtlOiAifn4iISAuKD8rIn5-IiEpID0-IGpvaW4gOwplbW9qaTogJyAnPyAnOichIDxBTFBIQV9OVU0-KD8rJzonISkgPT4gam9pbiA7CnBhcmE6ICg8cmVmPiB8IDxpbWc-IHwgPGZucmVmPiB8IDxsaW5rcmVmPiB8IDxsaW5rPiB8IDxib2xkPiB8IDxpdGFsaWM-IHwgPHN0cmlrZT4gfCA8Y29kZT4gfCA8ZW1vamk-IHwgPGJvZHk-KSogPEROTDI-ISA7CgpoZGxldmVsOiAnIycrID0-IGNvdW50IDsKaGQ6IDxMU1RBUlQ-IDxoZGxldmVsPiA8V1MwPgogICAgKDxyZWY-IHwgPGltZz4gfCA8Zm5yZWY-IHwgPGxpbms-IHwgPGJvbGQ-IHwgPGl0YWxpYz4gfCA8c3RyaWtlPiB8IDxjb2RlPiB8IDxlbW9qaT4gfCA8Ym9keTE-ICkqIDxETkwxPiA7CgpsaWxldmVsOiAnICcqID0-IGNvdW50IDsKdWludDogPERJR0lUPisgPT4gaW50IDsKdWxpZDogPEROTD4gPFdTMD4gJy0nISA7Cm9saWQ6IDxETkw-IDxXUzA-IDxESUdJVD4rISAnLichIDsKbGlkZWxpbTogKCA8ZGVsaW0-IHwgPHVsaWQ-IHwgPG9saWQ-ICkgOwpsaWJvZHk6IC4oPy08bGlkZWxpbT4hKSA9PiBqb2luIDsKdG9kbzogJ1snISBbIHhYXSAnXSchIDxXUzE-ID0-IGhvaXN0UiA7CnVsaXRlbTogPExTVEFSVD4gPGxpbGV2ZWw-ICItICIhIDx0b2RvPj8KICAgICAgICAoPHJlZj4gfCA8aW1nPiB8IDxmbnJlZj4gfCA8bGluaz4gfCA8Ym9sZD4gfCA8aXRhbGljPiB8IDxzdHJpa2U-IHwgPGNvZGU-IHwgPGVtb2ppPiB8IDxsaWJvZHk-ICkqIDxETkw-IDsKb2xpdGVtOiA8TFNUQVJUPiA8bGlsZXZlbD4gPHVpbnQ-ICIuICIhIDx0b2RvPj8KICAgICAgICAoPHJlZj4gfCA8aW1nPiB8IDxmbnJlZj4gfCA8bGluaz4gfCA8Ym9sZD4gfCA8aXRhbGljPiB8IDxzdHJpa2U-IHwgPGNvZGU-IHwgPGVtb2ppPiB8IDxsaWJvZHk-ICkqIDxETkw-IDsKbGlzdDogKDx1bGl0ZW0-IHwgPG9saXRlbT4pKyA8RE5MMT4gOwoKY2JkZWxpbTogPExTVEFSVD4gImBgYCIhIDsKY29kZWJsb2NrOiA8Y2JkZWxpbT4hIDxjb2RlbWV0YT4gPGNvZGVib2R5PiA8RE5MMT4gOwpjb2RlbWV0YTogLig_KzxOTD4hKSA9PiBqb2luIDsKY29kZWJvZHk6IC4oPys8Y2JkZWxpbT4pID0-IGpvaW4gOwoKY3VzdG9tZGVsaW06IDxMU1RBUlQ-ICI6OjoiISA7CmN1c3RvbWJsb2NrOiA8Y3VzdG9tZGVsaW0-ISA8Y3VzdG9tbWV0YT4gPGN1c3RvbWJvZHk-IDxETkwxPiA7CmN1c3RvbW1ldGE6IC4oPys8Tkw-ISkgPT4gam9pbiA7CmN1c3RvbWJvZHk6IC4oPys8Y3VzdG9tZGVsaW0-KSA9PiBqb2luIDsKCm1ldGFibG9jazogPExTVEFSVD4gInt7eyIhIDxtZXRhdHlwZT4gPG1ldGFib2R5PiA8RE5MMT4gOwptZXRhdHlwZTogPEFMUEhBX05VTT4rID0-IGpvaW4gOwptZXRhYm9keTogLig_KzxtZXRhZW5kPiEpID0-IGpvaW4gOwptZXRhZW5kOiAifX19IiA8TEVORD4gOwoKYnFsaW5lOiA8TFNUQVJUPiAiPiAiIQogICAgICAgICg8cmVmPiB8IDxpbWc-IHwgPGZucmVmPiB8IDxsaW5rPiB8IDxib2xkPiB8IDxpdGFsaWM-IHwgPHN0cmlrZT4gfCA8Y29kZT4gfCA8ZW1vamk-IHwgPGJvZHkxPikqIDxETkw-IDsKYnF1b3RlOiA8YnFsaW5lPisgPEROTDE-IDsKCnRkZWxpbTogKDxpbmxpbmVkZWxpbT4gfCAnfCcgKSA7CnRib2R5OiAuKD8tPHRkZWxpbT4hKSA9PiBqb2luIDsKdGNlbGw6IDxXUzA-ICg8cmVmPiB8IDxpbWc-IHwgPGZucmVmPiB8IDxsaW5rPiB8IDxib2xkPiB8IDxpdGFsaWM-IHwgPHN0cmlrZT4gfCA8Y29kZT4gfCA8ZW1vamk-IHwgPHRib2R5PiApKiAnfCchIDsKdHJvdzogPExTVEFSVD4gJ3wnISA8dGNlbGw-KD8rPEROTD4pIDsKdGFibGU6IDx0cm93PisgPEROTDE-IDsKCmhyOiAiLS0iICgnLScoPy08Tkw-ISkpKiA8RE5MMT4gPT4gam9pbiA7CgptYWluOiA8V1MwPiAoPGhkPiB8IDxsaXN0PiB8IDxicXVvdGU-IHwgPGNvZGVibG9jaz4gfCA8Y3VzdG9tYmxvY2s-IHwgPG1ldGFibG9jaz4gfCA8dGFibGU-IHwgPGhyPiB8IDxmbm90ZT4gfCA8bGlua2RlZj4gfCA8cGFyYT4pKiA7pG1haW7aAgMjIEhlbGxvIDp3b3JsZDpbXjFdCgo6c21pbGU6Cgo6OjphbGVydApUZXN0IFtsYWJlbF1bcmVmcmVmXQo6OjoKCi0tLQoKe3t7anNvbiB7ImlkIjogMTIzLCAicHJvdGVjdGVkIjogdHJ1ZSB9IH19fQpTbyBbW3NtaWxlX2ZvbzEyXV0g8J-YjSB3aGF0J3MgW3RoaXNdKC4vdGhpcy5tZClbXjFdIHRoZW46CgpBIFtsaW5rIHdpdGggcmVmZXJlbmNlXVtyZWZyZWZdLi4uCgpbXjFdOiBGb28gYmFyIGJhegoKOnNtaWxlOgoKYGBgdHMgdGFuZ2xlOm5vIGxuOnllcwpjb25zdCBmb28gPQoKYGBgCgoxLiBmb28KICAyMy4gYmFyCiAgICAgYmF6IGFuZCBzbyBvbgogICAgIG11bHRpbGluZQoyLiBiYXJycnIKCj4gYmxvY2txdW90ZQo-IG11bHRpbGluZSB0b28KPiAtLSBzb3VyY2UKCnwgZm9vIHwgYmFyIHwKfDotfC06fAp8IFtbcmVmIzIyXV0gfCBgb25gICoqb2ZmKiogfAoKW14xXTogRm9vIF9iYXJfIGJhegoKW14yXTogVE9ETwoKW3JlZnJlZl06IGh0dHA6Ly90aGkubmcvCltmb29dOiAuL2Zvby5tZCNiYXIKCtktMTEuIGFiYwogIC0geHl6CjIxLiB4eHgKICAxLiBmb28KICAgIDEuIGJhcgoK2SZ7e3t5YW1sCi0gZm9vCi0gYmFyCiAgLSBiYXoKfX19ClRlc3QKCg

import type { Fn3, IObjectOf } from "@thi.ng/api";
import { peek } from "@thi.ng/arrays/peek";
import { DEFAULT, defmulti } from "@thi.ng/defmulti";
import { EMOJI } from "@thi.ng/emoji/emoji";
import type { ContextOpts, ParseScope } from "@thi.ng/parse";
import { defContext } from "@thi.ng/parse/context";
import { defGrammar } from "@thi.ng/parse/grammar";
Expand Down Expand Up @@ -33,7 +34,7 @@ bold: "**"! .(?+"**"!) => join ;
italic: "_"! .(?+"_"!) => join ;
code: '\`'! .(?+'\`'!) => join ;
strike: "~~"! .(?+"~~"!) => join ;
emoji: " :"! <ALPHA_NUM>(?+':'!) => join ;
emoji: ' '? ':'! <ALPHA_NUM>(?+':'!) => join ;
para: (<ref> | <img> | <fnref> | <linkref> | <link> | <bold> | <italic> | <strike> | <code> | <emoji> | <body>)* <DNL2>! ;
hdlevel: '#'+ => count ;
Expand Down Expand Up @@ -63,9 +64,10 @@ customblock: <customdelim>! <custommeta> <custombody> <DNL1> ;
custommeta: .(?+<NL>!) => join ;
custombody: .(?+<customdelim>) => join ;
metablock: <LSTART> "{{{"! <meta> <DNL1> => hoist ;
metablock: <LSTART> "{{{"! <metatype> <metabody> <DNL1> ;
metatype: <ALPHA_NUM>+ => join ;
metabody: .(?+<metaend>!) => join ;
metaend: "}}}" <LEND> ;
meta: .(?+<metaend>!) => json ;
bqline: <LSTART> "> "!
(<ref> | <img> | <fnref> | <link> | <bold> | <italic> | <strike> | <code> | <emoji> | <body1>)* <DNL> ;
Expand All @@ -77,7 +79,7 @@ tcell: <WS0> (<ref> | <img> | <fnref> | <link> | <bold> | <italic> | <strike> |
trow: <LSTART> '|'! <tcell>(?+<DNL>) ;
table: <trow>+ <DNL1> ;
hr: "--"! '-'!(?-<NL>!) <DNL1> ;
hr: "--" ('-'(?-<NL>!))* <DNL1> => join ;
main: <WS0> (<hd> | <list> | <bquote> | <codeblock> | <customblock> | <metablock> | <table> | <hr> | <fnote> | <linkdef> | <para>)* ;
`);
Expand All @@ -89,9 +91,12 @@ export const parseRaw = (src: string, opts?: Partial<ContextOpts>) => {

export interface TagTransforms {
bold(body: string): any;
bquote(body: any[], meta?: any): any;
code(body: string): any;
custom(kind: string, body: string, meta?: any): any;
emoji(id: string): any;
hd(level: number, body: any[], meta?: any): any;
hr(lenght: number): any;
italic(body: string): any;
link(target: string, body: any[]): any;
ol(items: any[], meta?: any): any;
Expand All @@ -117,26 +122,29 @@ export const defMDContext = (tags: Partial<TagTransforms>): MDParseContext => ({
meta: null,
tags: {
bold: (body) => ["strong", {}, body],
bquote: (body, meta) => ["blockquote", __withMeta({}, meta), ...body],
code: (body) => ["code", {}, body],
custom: (kind, body, meta) => [kind, withMeta({}, meta), body],
hd: (level, body, meta) => [`h${level}`, withMeta({}, meta), ...body],
custom: (kind, body, meta) => [kind, __withMeta({}, meta), body],
emoji: (id) => EMOJI[id] || id,
hd: (level, body, meta) => [`h${level}`, __withMeta({}, meta), ...body],
hr: (__length) => ["hr", { __length }],
italic: (body) => ["em", {}, body],
link: (href, body) => ["a", { href }, ...body],
olitem: (attribs, index, body) => [
"li",
{ ...attribs, __index: index },
...body,
],
ol: (items, meta) => ["ol", withMeta({}, meta), ...items],
para: (body, meta) => ["p", withMeta({}, meta), ...body],
ol: (items, meta) => ["ol", __withMeta({}, meta), ...items],
para: (body, meta) => ["p", __withMeta({}, meta), ...body],
strike: (body) => ["s", {}, body],
ul: (items, meta) => ["ul", withMeta({}, meta), ...items],
ul: (items, meta) => ["ul", __withMeta({}, meta), ...items],
ulitem: (attribs, body) => ["li", attribs, ...body],
...tags,
},
});

const withMeta = (target: any, meta?: any) => {
const __withMeta = (target: any, meta?: any) => {
if (meta != null) {
target.__meta = meta;
}
Expand All @@ -154,9 +162,10 @@ export const walk: Fn3<
return x.id;
},
{
main: "root",
body1: "body",
bqline: "repeat0",
libody: "body",
main: "root",
repeat1: "repeat0",
},
{
Expand All @@ -172,17 +181,22 @@ export const walk: Fn3<
for (let c of scope.children!) walk(c, ctx, acc);
},

hd: ({ children }, ctx, acc) => {
const body: any[] = [];
walk(children![1], ctx, body);
acc.push(ctx.tags.hd(children![0].result, body, ctx.meta));
ctx.meta = null;
},

body: (scope, _, acc) => acc.push(scope.result),

bold: (scope, ctx, acc) => acc.push(ctx.tags.bold(scope.result)),

bquote: (scope, ctx, acc) => {
const body: any[] = [];
const children = scope.children![0].children!;
for (let i = 0, n = children!.length - 1; i <= n; i++) {
walk(children[i].children![0], ctx, body);
// TODO add opt to customize break (e.g. ["br"] vs " ")
if (i < n) body.push(" ");
}
acc.push(ctx.tags.bquote(body, ctx.meta));
ctx.meta = null;
},

code: (scope, ctx, acc) => acc.push(ctx.tags.code(scope.result)),

customblock: ({ children }, ctx, acc) => {
Expand All @@ -196,6 +210,23 @@ export const walk: Fn3<
ctx.meta = null;
},

emoji: ({ result }, ctx, acc) => {
if (result[0] === " ") {
acc.push(" ");
result = result.substring(1);
}
acc.push(ctx.tags.emoji(result));
},

hd: ({ children }, ctx, acc) => {
const body: any[] = [];
walk(children![1], ctx, body);
acc.push(ctx.tags.hd(children![0].result, body, ctx.meta));
ctx.meta = null;
},

hr: (scope, ctx, acc) => acc.push(ctx.tags.hr(scope.result.length)),

italic: (scope, ctx, acc) => acc.push(ctx.tags.italic(scope.result)),

link: (scope, ctx, acc) => {
Expand Down Expand Up @@ -252,8 +283,11 @@ export const walk: Fn3<
ctx.meta = null;
},

meta: (scope, ctx) => {
ctx.meta = scope.result;
metablock: ({ children }, ctx) => {
ctx.meta = {
type: children![0].result,
body: children![1].result.trim(),
};
},

olitem: (scope, ctx, acc) => {
Expand Down
1 change: 1 addition & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4010,6 +4010,7 @@ __metadata:
"@thi.ng/arrays": ^2.5.5
"@thi.ng/checks": ^3.3.9
"@thi.ng/defmulti": ^2.1.30
"@thi.ng/emoji": ^0.0.1
"@thi.ng/errors": ^2.2.11
"@thi.ng/fsm": ^3.1.40
"@thi.ng/hiccup": ^4.2.32
Expand Down

0 comments on commit 5d030ad

Please sign in to comment.