diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f53b571..6ce3e2ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.5.0](https://github.com/streamich/mdast-flat/compare/v1.4.0...v1.5.0) (2019-03-03) + + +### Features + +* 🎸 add `parent` key to all nodes ([c4d611f](https://github.com/streamich/mdast-flat/commit/c4d611f)) + # [1.4.0](https://github.com/streamich/mdast-flat/compare/v1.3.0...v1.4.0) (2019-03-01) diff --git a/README.md b/README.md index 72ef9f4d..2e912575 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,15 @@ interface MdastFlat { - `footnoteOrder` — ordered list of footnote node indices. +### Nodes + +MDAST-Flat nodes have the following attributes. + +- All the same attributes as MDAST tokens, except see below. +- `children` attribute is an array of numbers that index into `nodes` list. +- `idx` a number, which is the index of current node in `nodes` list. +- `parent` a number, which is the index of parent node in the `nodes` list. + ## Usage ```js diff --git a/package.json b/package.json index 88391f12..5b4642a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mdast-flat", - "version": "1.4.0", + "version": "1.5.0", "description": "", "author": { "name": "streamich", @@ -27,26 +27,26 @@ }, "keywords": [], "dependencies": { - "md-mdast": "^3.0.0" + "md-mdast": "^3.1.0" }, "devDependencies": { - "@semantic-release/changelog": "^3.0.2", - "@semantic-release/git": "^7.0.8", - "@semantic-release/npm": "^5.1.4", - "@types/jest": "^24.0.6", - "@types/node": "^11.9.5", - "husky": "^1.3.1", - "jest": "^24.1.0", - "lint-staged": "^8.1.4", - "prettier": "^1.16.4", - "pretty-quick": "^1.10.0", - "rimraf": "^2.6.3", - "semantic-release": "^15.13.3", - "ts-jest": "^24.0.0", - "ts-node": "^8.0.2", - "tslint": "^5.13.0", - "tslint-config-common": "^1.6.0", - "typescript": "^3.3.3333" + "@semantic-release/changelog": "3.0.2", + "@semantic-release/git": "7.0.8", + "@semantic-release/npm": "5.1.4", + "@types/jest": "24.0.9", + "@types/node": "11.10.4", + "husky": "1.3.1", + "jest": "24.1.0", + "lint-staged": "8.1.5", + "prettier": "1.16.4", + "pretty-quick": "1.10.0", + "rimraf": "2.6.3", + "semantic-release": "15.13.3", + "ts-jest": "24.0.0", + "ts-node": "8.0.2", + "tslint": "5.13.1", + "tslint-config-common": "1.6.0", + "typescript": "3.3.3333" }, "types": "lib/index.d.ts", "typings": "lib/index.d.ts", diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..3d1bae41 --- /dev/null +++ b/renovate.json @@ -0,0 +1,14 @@ +{ + "extends": [ + "config:base" + ], + "automerge": true, + "pinVersions": false, + "major": { + "automerge": false + }, + "devDependencies": { + "automerge": true, + "pinVersions": true + } +} diff --git a/src/__tests__/md/parent-key.md b/src/__tests__/md/parent-key.md new file mode 100644 index 00000000..d5330970 --- /dev/null +++ b/src/__tests__/md/parent-key.md @@ -0,0 +1,3 @@ +# Hello world + +This __is__ *SPARTA*! diff --git a/src/__tests__/mdastToFlat.spec.ts b/src/__tests__/mdastToFlat.spec.ts index 41e3f501..3ae75903 100644 --- a/src/__tests__/mdastToFlat.spec.ts +++ b/src/__tests__/mdastToFlat.spec.ts @@ -415,4 +415,23 @@ describe('structure', () => { expect(flat.footnotes.b).toBe(flat.footnoteOrder[1]); expect(flat.footnotes.c).toBe(flat.footnoteOrder[2]); }); + + it('all nodes should have a parent key', () => { + const parser = create(); + const md = fs.readFileSync(__dirname + '/md/parent-key.md', 'utf8'); + const mdast = parser.tokenizeBlock(md)!; + const flat = mdastToFlat(mdast); + + // console.log(flat); + expect(flat.nodes[0].parent).toBe(0); + expect(flat.nodes[1].parent).toBe(0); + expect(flat.nodes[2].parent).toBe(1); + expect(flat.nodes[3].parent).toBe(0); + expect(flat.nodes[4].parent).toBe(3); + expect(flat.nodes[5].parent).toBe(3); + expect(flat.nodes[6].parent).toBe(5); + expect(flat.nodes[7].parent).toBe(3); + expect(flat.nodes[8].parent).toBe(3); + expect(flat.nodes[9].parent).toBe(8); + }); }); diff --git a/src/mdastToFlat.ts b/src/mdastToFlat.ts index 104451b1..f7180f76 100644 --- a/src/mdastToFlat.ts +++ b/src/mdastToFlat.ts @@ -15,16 +15,16 @@ export const mdastToFlat: MdastToFlat = (mdast) => { footnoteOrder, }; - const traverse = (token: IRoot | TAnyToken): number => { + const traverse = (token: IRoot | TAnyToken, parent: number): number => { const idx = nodes.length; - const node = {...token, idx} as TNode; + const node = {...token, idx, parent} as TNode; nodes.push(node); if (token.children) { if (token.children instanceof Array) { - node.children = (token.children as any).map(traverse).filter((i: number) => i > -1); + node.children = (token.children as any).map(token => traverse(token, idx)).filter((i: number) => i > -1); } else { - const childIndex = traverse(token.children); + const childIndex = traverse(token.children, idx); if (childIndex > -1) { node.children = [childIndex] as any; } @@ -47,7 +47,7 @@ export const mdastToFlat: MdastToFlat = (mdast) => { }; if (mdast) { - traverse(mdast); + traverse(mdast, 0); let footnoteCounter = 0; for (const node of nodes) { diff --git a/src/types.ts b/src/types.ts index 1cb894f9..6b0796f0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -8,7 +8,11 @@ export interface FlatFootnotes { [id: string]: number; } -export type TNode = (IRoot | TAnyToken) & {idx: number; children?: number[]}; +export type TNode = (IRoot | TAnyToken) & { + idx: number; + parent: number; + children?: number[]; +}; export interface Flat { /** diff --git a/yarn.lock b/yarn.lock index 47725f05..2eb15831 100644 --- a/yarn.lock +++ b/yarn.lock @@ -138,20 +138,6 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" -"@iamstarkov/listr-update-renderer@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz#d7c48092a2dcf90fd672b6c8b458649cb350c77e" - integrity sha512-IJyxQWsYDEkf8C8QthBn5N8tIUR9V9je6j3sMIpAkonaadjbvxmRC6RAhpa3RKxndhNnU2M6iNbtJwd7usQYIA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -207,7 +193,7 @@ dependencies: any-observable "^0.3.0" -"@semantic-release/changelog@^3.0.2": +"@semantic-release/changelog@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-3.0.2.tgz#b09a8e0d072ef54d2bc7a5c82f6112dc3c8ae85d" integrity sha512-pDUaBNAuPAqQ+ArHwvR160RG2LbfyIVz9EJXgxH0V547rlx/hCs0Sp7L4Rtzi5Z+d6CHcv9g2ynxplE1xAzp2g== @@ -234,7 +220,7 @@ resolved "https://registry.yarnpkg.com/@semantic-release/error/-/error-2.2.0.tgz#ee9d5a09c9969eade1ec864776aeda5c5cddbbf0" integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg== -"@semantic-release/git@^7.0.8": +"@semantic-release/git@7.0.8": version "7.0.8" resolved "https://registry.yarnpkg.com/@semantic-release/git/-/git-7.0.8.tgz#b9e1af094a19d4e96974b90a969ad0e6782c8727" integrity sha512-sA+XoPU6GrV+A4YswO0b5JWL1KbzmyyaqUK6Y2poDkIVPlj+oQdi/stpKz/bKF5z9ChMGP87OVPMeUyXGaNFtw== @@ -273,7 +259,7 @@ parse-github-url "^1.0.1" url-join "^4.0.0" -"@semantic-release/npm@^5.0.5", "@semantic-release/npm@^5.1.4": +"@semantic-release/npm@5.1.4", "@semantic-release/npm@^5.0.5": version "5.1.4" resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-5.1.4.tgz#970b62765e6c5d51f94e1c14d3bc1f5a224e2ed0" integrity sha512-YRl8VTVwnRTl/sVRvTXs1ncYcuvuGrqPEXYy+lUK1YRLq25hkrhIdv3Ju0u1zGLqVCA8qRlF3NzWl7pULJXVog== @@ -310,17 +296,17 @@ resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== -"@types/jest@^24.0.6": - version "24.0.6" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.6.tgz#ba4c8c7900ce098a82ca99293cbe4192bde4f355" - integrity sha512-NE7FBG/F4cMDKdCBqgyd+Sa6JZ5GiMOyA5QwJdeS4Ii/Z9a18WgGbFrHbcr48/7I9HdnkaAYP+S2MmQ27qoqJA== +"@types/jest@24.0.9": + version "24.0.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.9.tgz#74ce9cf337f25e189aa18f76ab3d65e8669b55f2" + integrity sha512-k3OOeevcBYLR5pdsOv5g3OP94h3mrJmLPHFEPWgbbVy2tGv0TZ/TlygiC848ogXhK8NL0I5up7YYtwpCp8xCJA== dependencies: "@types/jest-diff" "*" -"@types/node@^11.9.5": - version "11.9.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.9.5.tgz#011eece9d3f839a806b63973e228f85967b79ed3" - integrity sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q== +"@types/node@11.10.4": + version "11.10.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.10.4.tgz#3f5fc4f0f322805f009e00ab35a2ff3d6b778e42" + integrity sha512-wa09itaLE8L705aXd8F80jnFpxz3Y1/KRHfKsYL2bPc0XF+wEWu8sR9n5bmeu8Ba1N9z2GRNzm/YdHcghLkLKg== JSONStream@^1.0.4, JSONStream@^1.3.4: version "1.3.5" @@ -2399,7 +2385,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -husky@^1.3.1: +husky@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg== @@ -3270,7 +3256,7 @@ jest-worker@^24.0.0: merge-stream "^1.0.1" supports-color "^6.1.0" -jest@^24.1.0: +jest@24.1.0: version "24.1.0" resolved "https://registry.yarnpkg.com/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2" integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A== @@ -3502,12 +3488,11 @@ libnpx@^10.2.0: y18n "^4.0.0" yargs "^11.0.0" -lint-staged@^8.1.4: - version "8.1.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.4.tgz#a726592c0e55231116af295e730643bb711c169b" - integrity sha512-oFbbhB/VzN8B3i/sIdb9gMfngGArI6jIfxSn+WPdQb2Ni3GJeS6T4j5VriSbQfxfMuYoQlMHOoFt+lfcWV0HfA== +lint-staged@8.1.5: + version "8.1.5" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" + integrity sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA== dependencies: - "@iamstarkov/listr-update-renderer" "0.4.1" chalk "^2.3.1" commander "^2.14.1" cosmiconfig "^5.0.2" @@ -3520,6 +3505,7 @@ lint-staged@^8.1.4: is-glob "^4.0.0" is-windows "^1.0.2" listr "^0.14.2" + listr-update-renderer "^0.5.0" lodash "^4.17.11" log-symbols "^2.2.0" micromatch "^3.1.8" @@ -3875,10 +3861,10 @@ matcher@^1.0.0: dependencies: escape-string-regexp "^1.0.4" -md-mdast@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/md-mdast/-/md-mdast-3.0.0.tgz#6be00546a1fb68fea609ec8b32c117f64e3d7075" - integrity sha512-gbHq595JuwRKNhifFly1uqsFIr7lyxPiGg2o8+rD2LKYX4rF4u1tcZgNyZygwijGZgtnBSXGjxhl6IjxM+Rn9A== +md-mdast@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/md-mdast/-/md-mdast-3.1.0.tgz#809e304f396bdd56a01ba4c3cee84b912e74c2c1" + integrity sha512-IoVQtTfS7zFzZH7CdggpkvjjE1oPzm4RD/u3lXXSSNsC8rxGPdicuj/Q0JIu1RpUgu5XLgGlTaBUccQmyeVEaA== meant@~1.0.1: version "1.0.1" @@ -4981,7 +4967,7 @@ prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier@^1.16.4: +prettier@1.16.4: version "1.16.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== @@ -4994,7 +4980,7 @@ pretty-format@^24.0.0: ansi-regex "^4.0.0" ansi-styles "^3.2.0" -pretty-quick@^1.10.0: +pretty-quick@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-1.10.0.tgz#d86cc46fe92ed8cfcfba6a082ec5949c53858198" integrity sha512-uNvm2N3UWmnZRZrClyQI45hIbV20f5BpSyZY51Spbvn4APp9+XLyX4bCjWRGT3fGyVyQ/2/iw7dbQq1UUaq7SQ== @@ -5441,7 +5427,7 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -5511,7 +5497,7 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -semantic-release@^15.13.3: +semantic-release@15.13.3: version "15.13.3" resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-15.13.3.tgz#412720b9c09f39f04df67478fa409a914107e05b" integrity sha512-cax0xPPTtsxHlrty2HxhPql2TTvS74Ni2O8BzwFHxNY/mviVKEhI4OxHzBYJkpVxx1fMVj36+oH7IlP+SJtPNA== @@ -6234,7 +6220,7 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-jest@^24.0.0: +ts-jest@24.0.0: version "24.0.0" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.0.tgz#3f26bf2ec1fa584863a5a9c29bd8717d549efbf6" integrity sha512-o8BO3TkMREpAATaFTrXkovMsCpBl2z4NDBoLJuWZcJJj1ijI49UnvDMfVpj+iogn/Jl8Pbhuei5nc/Ti+frEHw== @@ -6249,7 +6235,7 @@ ts-jest@^24.0.0: semver "^5.5" yargs-parser "10.x" -ts-node@^8.0.2: +ts-node@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.0.2.tgz#9ecdf8d782a0ca4c80d1d641cbb236af4ac1b756" integrity sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw== @@ -6265,7 +6251,7 @@ tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslint-config-common@^1.6.0: +tslint-config-common@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/tslint-config-common/-/tslint-config-common-1.6.0.tgz#4b5abeae6f904f09694b3c00278e13de1d51a679" integrity sha512-ekSNpES/oOcmxPPstTFP22Oq18jPtw14ts0iaVhKnUz90R1u7Haz6IdZv90Iyqzm4uG68kDu1TozEcz3Fh8anQ== @@ -6285,10 +6271,10 @@ tslint-react@^3.6.0: dependencies: tsutils "^2.13.1" -tslint@^5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.13.0.tgz#239a2357c36b620d72d86744754b6fc088a25359" - integrity sha512-ECOOQRxXCYnUUePG5h/+Z1Zouobk3KFpIHA9aKBB/nnMxs97S1JJPDGt5J4cGm1y9U9VmVlfboOxA8n1kSNzGw== +tslint@5.13.1: + version "5.13.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.13.1.tgz#fbc0541c425647a33cd9108ce4fd4cd18d7904ed" + integrity sha512-fplQqb2miLbcPhyHoMV4FU9PtNRbgmm/zI5d3SZwwmJQM6V0eodju+hplpyfhLWpmwrDNfNYU57uYRb8s0zZoQ== dependencies: babel-code-frame "^6.22.0" builtin-modules "^1.1.1" @@ -6335,7 +6321,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.3.3333: +typescript@3.3.3333: version "3.3.3333" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==