From b95de8535964d3a631a4efde965b41d47c4c8527 Mon Sep 17 00:00:00 2001 From: Pomax Date: Tue, 4 Aug 2020 18:11:52 -0700 Subject: [PATCH] fallback building, part 1 --- chapters/introduction/cubic.png | Bin 13116 -> 391 bytes chapters/introduction/quadratic.png | Bin 13116 -> 391 bytes chapters/whatis/interpolation.png | Bin 13116 -> 977 bytes package-lock.json | 477 ++++++++++++++++++++++++ package.json | 1 + tools/build/convert-markdown.js | 6 +- tools/build/generate-placeholders.js | 61 +++ tools/build/process-locale.js | 2 + tools/build/rewrite-graphics-element.js | 13 + 9 files changed, 557 insertions(+), 3 deletions(-) create mode 100644 tools/build/generate-placeholders.js create mode 100644 tools/build/rewrite-graphics-element.js diff --git a/chapters/introduction/cubic.png b/chapters/introduction/cubic.png index 653228ab02df2f9b6eb7c702feee266282f80a8a..dd1b210b36865434d5e48344852ce82007ce3830 100644 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0y~yU=#*n4mO~O=*mYsfD~Jjx4R3&e-K=-cll(Xw2h~W xV@SoEw+9Uwf%1nIeD%-eV9i$6_NE1i| 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 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -422,6 +570,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -451,6 +605,15 @@ "dev": true, "optional": true }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -486,6 +649,12 @@ "has-symbols": "^1.0.1" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "js-yaml": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", @@ -518,6 +687,12 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -533,6 +708,25 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -542,6 +736,57 @@ "minimist": "^1.2.5" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true + }, + "needle": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", + "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "dev": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -549,6 +794,44 @@ "dev": true, "optional": true }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -558,6 +841,12 @@ "boolbase": "~1.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "nunjucks": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.2.tgz", @@ -570,6 +859,12 @@ "commander": "^5.1.0" } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", @@ -625,6 +920,28 @@ "wrappy": "1" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -644,12 +961,45 @@ "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", @@ -660,12 +1010,68 @@ "picomatch": "^2.2.1" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -684,6 +1090,17 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, "string.prototype.trimend": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", @@ -704,6 +1121,30 @@ "es-abstract": "^1.17.5" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -734,6 +1175,21 @@ "util.promisify": "~1.0.0" } }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -756,6 +1212,12 @@ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -768,11 +1230,26 @@ "object.getownpropertydescriptors": "^2.1.0" } }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } } diff --git a/package.json b/package.json index af42e03a..659cccfc 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "ebook" ], "devDependencies": { + "canvas": "^2.6.1", "fs-extra": "^9.0.1", "glob": "^7.1.6", "marked": "^1.1.1", diff --git a/tools/build/convert-markdown.js b/tools/build/convert-markdown.js index 64917645..aaab4c90 100644 --- a/tools/build/convert-markdown.js +++ b/tools/build/convert-markdown.js @@ -12,7 +12,7 @@ module.exports = async function convertMarkDown(markdown) { let latexSection = 0, pos = -1, data = markdown, - latex = [], + latex = {}, startmark = ``; @@ -20,7 +20,7 @@ module.exports = async function convertMarkDown(markdown) { pos = data.indexOf(startmark); if (pos !== -1) { let endpos = data.indexOf(endmark, pos) + endmark.length; - let key = `latex${latexSection}`; + let key = `latex${latexSection++}`; latex[key] = data.substring( pos + startmark.length, endpos - endmark.length @@ -47,6 +47,6 @@ module.exports = async function convertMarkDown(markdown) { .replace(/"/g, '"') .replace(/

{{/g, `{{`) .replace(/}}<\/p>/g, `}}`); - + return nunjucks.renderString(converted, latex); } diff --git a/tools/build/generate-placeholders.js b/tools/build/generate-placeholders.js new file mode 100644 index 00000000..87e7b73b --- /dev/null +++ b/tools/build/generate-placeholders.js @@ -0,0 +1,61 @@ +const fs = require("fs-extra"); +const path = require("path"); +const canvas = require("canvas"); +const rewriteGraphicsElement = require("./rewrite-graphics-element"); +const localeStrings = require("../../locale-strings.json"); +const defaultLocale = localeStrings.defaultLocale; + +module.exports = async function generatePlaceHolders(locale, markdown) { + if (locale !== defaultLocale) return; + + let graphic = 0, + pos = -1, + data = markdown, + elements = {}, + startmark = ``; + + do { + pos = data.indexOf(startmark); + if (pos !== -1) { + let endpos = data.indexOf(endmark, pos) + endmark.length; + let key = `graphic${graphic++}`; + elements[key] = data.substring(pos, endpos - endmark.length); + data = `${data.slice(0, pos)}{{ ${key} }}${data.slice(endpos)}`; + } + } while (pos !== -1); + + const keys = Object.keys(elements); + sourcePaths = Object.values(elements).map(v => v.match(/src="([^"]+)"/)[1]); + + sourcePaths.forEach((sourcePath,i) => { + try { + sourcePath = path.join(__dirname, "..", "..", sourcePath); + let code = fs.readFileSync(sourcePath).toString(`utf8`); + let width = elements[keys[i]].match(`width="([^"]+)"`)[1]; + let height = elements[keys[i]].match(`height="([^"]+)"`)[1]; + + // TODO: figure out how to convert this code to code that will + // actually run in Node, with node's `canvas` module backing + // rather than the HTMLCanvasElement object, and in a way + // that uses `require()` or `import`, but not both. + + let nodeCode = rewriteGraphicsElement(code, width, height); + + var m = new module.constructor(); + m.paths = module.paths; + m._compile(nodeCode, sourcePath); + + const sketch = m.exports; + const dataURI = sketch.toDataURL(); + const start = dataURI.indexOf(`base64,`) + 7; + const imageData = Buffer.from(dataURI.substring(start), `base64`); + const filename = sourcePath.replace(`.js`, `.png`); + + console.log(`Writing placeholder to ${filename}`); + fs.writeFileSync(filename, imageData); + } catch (e) { + console.error(e); + } + }); +}; diff --git a/tools/build/process-locale.js b/tools/build/process-locale.js index 0774d2c8..562e0c77 100644 --- a/tools/build/process-locale.js +++ b/tools/build/process-locale.js @@ -3,6 +3,7 @@ const path = require("path"); const localeStrings = require("../../locale-strings.json"); const defaultLocale = localeStrings.defaultLocale const convertMarkDown = require("./convert-markdown.js"); +const generatePlaceHolders = require("./generate-placeholders.js"); const nunjucks = require("nunjucks"); nunjucks.configure(".", { autoescape: false }); @@ -38,6 +39,7 @@ module.exports = async function processLocale( const chapter = file.match(/chapters\/([^/]+)\/content./)[1]; try { const markdown = fs.readFileSync(file).toString("utf8"); + await generatePlaceHolders(locale, markdown); const replaced = nunjucks.renderString(markdown, { disableMessage: `${localeStrings.disabledMessage[locale]}`, }); diff --git a/tools/build/rewrite-graphics-element.js b/tools/build/rewrite-graphics-element.js new file mode 100644 index 00000000..26a2938c --- /dev/null +++ b/tools/build/rewrite-graphics-element.js @@ -0,0 +1,13 @@ +module.exports = function rewriteGraphicsElement(code, width, height) { + + // const split = splitCodeSections(code); + // const globalCode = split.quasiGlobal; + // const classCode = performCodeSurgery(split.classCode); + + return ` + const { createCanvas, loadImage } = require('canvas'); + const canvas = createCanvas(${width}, ${height}); + const ctx = canvas.getContext('2d'); + module.exports = canvas; + `; +};