From a0e5947ba47abb4fe5241d8216530745643af0d5 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Thu, 28 Feb 2019 00:21:40 +0000 Subject: [PATCH] All: Resolves #163: Added Mermaid support to desktop and mobile --- .gitignore | 1 + README.md | 18 + ReactNativeClient/lib/MdToHtml_Mermaid.js | 6 +- ReactNativeClient/package-lock.json | 381 ---------------------- ReactNativeClient/package.json | 2 +- Tools/buildReactNativeInjectedJs.js | 5 + docs/images/Mermaid.png | Bin 0 -> 31134 bytes readme/welcome/4_tips.md | 10 + 8 files changed, 39 insertions(+), 384 deletions(-) create mode 100644 docs/images/Mermaid.png diff --git a/.gitignore b/.gitignore index eef4769b5..0f503c65a 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ node_modules Tools/github_oauth_token.txt _releases ReactNativeClient/lib/csstojs/ +ReactNativeClient/lib/rnInjectedJs/ ElectronClient/app/gui/note-viewer/fonts/ ElectronClient/app/gui/note-viewer/lib.js Tools/commit_hook.txt \ No newline at end of file diff --git a/README.md b/README.md index 312e3b933..e9a1bbe8d 100644 --- a/README.md +++ b/README.md @@ -251,6 +251,24 @@ You can create a link to a note by specifying its ID in the URL. For example: Since getting the ID of a note is not straightforward, each app provides a way to create such link. In the **desktop app**, right click on a note an select "Copy Markdown link". In the **mobile app**, open a note and, in the top right menu, select "Copy Markdown link". You can then paste this link anywhere in another note. +## Charts + +You can create charts in Joplin using the [Mermaid syntax](https://mermaidjs.github.io/). To add such a graph, wrap the Mermaid script inside a "\`\`\`mermaid" code block like this: + + ```mermaid + graph TD; + A-->B; + A-->C; + B-->D; + C-->D; + ``` + +This is how it would look with the Markdown on the left, and rendered graph on the right: + +![Mermaid support in Joplin](https://joplin.cozic.net/images/Mermaid.png) + +Note that Mermaid graphs are always rendered on a white background regardless of the current theme. This is because they can contain various colours that may not be compatible with the current theme. + ## Math notation Math expressions can be added using the [KaTeX notation](https://khan.github.io/KaTeX/). To add an inline equation, wrap the expression in `$EXPRESSION$`, eg. `$\sqrt{3x-1}+(1+x)^2$`. To create an expression block, wrap it as follow: diff --git a/ReactNativeClient/lib/MdToHtml_Mermaid.js b/ReactNativeClient/lib/MdToHtml_Mermaid.js index 3b1e49f39..e5842eefc 100644 --- a/ReactNativeClient/lib/MdToHtml_Mermaid.js +++ b/ReactNativeClient/lib/MdToHtml_Mermaid.js @@ -1,5 +1,4 @@ const { shim } = require('lib/shim'); -const mermaid = require('mermaid'); const injectedJs = require('lib/rnInjectedJs/mermaid'); class MdToHtml_Mermaid { @@ -14,7 +13,10 @@ class MdToHtml_Mermaid { } extraCss() { - return ''; + // Force a white background because the graphs can have various colours + // that may not be compatible with the current theme. Also make it + // inline-block so that the div is the same size as the content. + return '.mermaid { background-color: white; display:inline-block; }'; } injectedJavaScript() { diff --git a/ReactNativeClient/package-lock.json b/ReactNativeClient/package-lock.json index 5541e6267..a84953dfa 100644 --- a/ReactNativeClient/package-lock.json +++ b/ReactNativeClient/package-lock.json @@ -2217,302 +2217,6 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, - "d3": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.9.1.tgz", - "integrity": "sha512-JceuBn5VVWySPQc9EA0gfq0xQVgEQXGokHhe+359bmgGeUITLK2r2b9idMzquQne9DKxb7JDCE1gDRXe9OIF2Q==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "d3-brush": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", - "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "d3-color": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", - "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==" - }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", - "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" - }, - "d3-drag": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", - "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.1.1.tgz", - "integrity": "sha512-1EH1oRGSkeDUlDRbhsFytAXU6cAmXFzc52YUe6MRlPClmWb85MP1J5x+YJRzya4ynZWnbELdSAvATFW/MbxaXw==", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "d3-ease": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", - "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" - }, - "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.0.tgz", - "integrity": "sha512-PFLcDnRVANHMudbQlIB87gcfQorEsDIAvRpZ2bNddfM/WxdsEkyrEaOIPoydhH1I1V4HPjNLGOMLXCA0AuGQ9w==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" - }, - "d3-geo": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.3.tgz", - "integrity": "sha512-n30yN9qSKREvV2fxcrhmHUdXP9TNH7ZZj3C/qnaoU0cVf/Ea85+yT7HY7i8ySPwkwjCNYtmKqQFTvLFngfkItQ==", - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" - }, - "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", - "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" - }, - "d3-polygon": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", - "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==" - }, - "d3-quadtree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.6.tgz", - "integrity": "sha512-NUgeo9G+ENQCQ1LsRr2qJg3MQ4DJvxcDNCiohdJGHt5gRhBW6orIB5m5FJ9kK3HNL8g9F4ERVoBzcEwQBfXWVA==" - }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", - "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.0.tgz", - "integrity": "sha512-EYVwBxQGEjLCKF2pJ4+yrErskDnz5v403qvAid96cNdCMr8rmCYfY5RGzWz24mdIbxmDf6/4EAH+K9xperD5jg==" - }, - "d3-shape": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.4.tgz", - "integrity": "sha512-izaz4fOpOnY3CD17hkZWNxbaN70sIGagLR/5jb6RS96Y+6VqX+q1BQf1av6QSBRdfULi3Gb8Js4CzG4+KAPjMg==", - "requires": { - "d3-path": "1" - } - }, - "d3-time": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", - "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==" - }, - "d3-time-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", - "requires": { - "d3-time": "1" - } - }, - "d3-timer": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", - "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" - }, - "d3-transition": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz", - "integrity": "sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw==", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "d3-zoom": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.3.tgz", - "integrity": "sha512-xEBSwFx5Z9T3/VrwDkMt+mr0HCzv7XjpGURJ8lWmIC8wxe32L39eWHIasEe/e7Ox8MPU4p1hvH8PKN2olLzIBg==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "dagre-d3-renderer": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/dagre-d3-renderer/-/dagre-d3-renderer-0.5.8.tgz", - "integrity": "sha512-XH2a86isUHRxzIYbjQVEuZtJnWEufb64H5DuXIUmn8esuB40jgLEbUUclulWOW62/ZoXlj2ZDyL8SJ+YRxs+jQ==", - "requires": { - "dagre-layout": "^0.8.8", - "lodash": "^4.17.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - } - } - }, - "dagre-layout": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dagre-layout/-/dagre-layout-0.8.8.tgz", - "integrity": "sha512-ZNV15T9za7X+fV8Z07IZquUKugCxm5owoiPPxfEx6OJRD331nkiIaF3vSt0JEY5FkrY0KfRQxcpQ3SpXB7pLPQ==", - "requires": { - "graphlibrary": "^2.2.0", - "lodash": "^4.17.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - } - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2686,11 +2390,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escaper": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz", - "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ==" - }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", @@ -3521,21 +3220,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "graphlibrary": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/graphlibrary/-/graphlibrary-2.2.0.tgz", - "integrity": "sha512-XTcvT55L8u4MBZrM37zXoUxsgxs/7sow7YSygd9CIwfWTVO8RVu7AYXhhCiTuFEf+APKgx6Jk4SuQbYR0vYKmQ==", - "requires": { - "lodash": "^4.17.5" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - } - } - }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -3613,11 +3297,6 @@ } } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, "hoist-non-react-statics": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz", @@ -3916,11 +3595,6 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4262,33 +3936,6 @@ "readable-stream": "^2.0.1" } }, - "mermaid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.0.0.tgz", - "integrity": "sha512-vUQRykev0A6RtxIVqQT3a9TDxcSbdZbQF5JDyKgidnYuJy8BE8jp6LM+HKDSQuroKm6buu4NlpMO+qhxIP/cTg==", - "requires": { - "d3": "^5.7.0", - "dagre-d3-renderer": "^0.5.8", - "dagre-layout": "^0.8.8", - "graphlibrary": "^2.2.0", - "he": "^1.2.0", - "lodash": "^4.17.11", - "moment": "^2.23.0", - "scope-css": "^1.2.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - } - } - }, "metro": { "version": "0.48.5", "resolved": "https://registry.npmjs.org/metro/-/metro-0.48.5.tgz", @@ -6440,11 +6087,6 @@ "is-promise": "^2.1.0" } }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -6788,16 +6430,6 @@ "object-assign": "^4.1.1" } }, - "scope-css": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scope-css/-/scope-css-1.2.1.tgz", - "integrity": "sha512-UjLRmyEYaDNiOS673xlVkZFlVCtckJR/dKgr434VMm7Lb+AOOqXKdAcY7PpGlJYErjXXJzKN7HWo4uRPiZZG0Q==", - "requires": { - "escaper": "^2.5.3", - "slugify": "^1.3.1", - "strip-css-comments": "^3.0.0" - } - }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", @@ -6963,11 +6595,6 @@ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, - "slugify": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.4.tgz", - "integrity": "sha512-KP0ZYk5hJNBS8/eIjGkFDCzGQIoZ1mnfQRYS5WM3273z+fxGWXeN0fkwf2ebEweydv9tioZIHGZKoF21U07/nw==" - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7242,14 +6869,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-css-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz", - "integrity": "sha1-elYl7/iisibPiUehElTaluE9rok=", - "requires": { - "is-regexp": "^1.0.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", diff --git a/ReactNativeClient/package.json b/ReactNativeClient/package.json index a451e3446..95cf7f8e0 100644 --- a/ReactNativeClient/package.json +++ b/ReactNativeClient/package.json @@ -6,7 +6,7 @@ "private": true, "scripts": { "start": "node node_modules/react-native/local-cli/cli.js start", - "postinstall": "node ../Tools/copycss.js" + "postinstall": "node ../Tools/copycss.js && node ../Tools/buildReactNativeInjectedJs.js" }, "dependencies": { "async-mutex": "^0.1.3", diff --git a/Tools/buildReactNativeInjectedJs.js b/Tools/buildReactNativeInjectedJs.js index bcc34ddd2..15a657ed9 100644 --- a/Tools/buildReactNativeInjectedJs.js +++ b/Tools/buildReactNativeInjectedJs.js @@ -1,3 +1,8 @@ +// React Native WebView cannot load external JS files, however it can load +// arbitraty JS via the injectedJavaScript property. So we use this to load external +// files: First here we convert the JS file to a plain string, and that string +// is then loaded by eg. the Mermaid plugin, and finally injected in the WebView. + const fs = require('fs-extra'); const cwd = process.cwd(); diff --git a/docs/images/Mermaid.png b/docs/images/Mermaid.png new file mode 100644 index 0000000000000000000000000000000000000000..892e8f2cadccf3f03d3c91507d9a3d6289557604 GIT binary patch literal 31134 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 Us{+E35cqdPQR8~9yoK+70K_Y&M*si- literal 0 HcmV?d00001 diff --git a/readme/welcome/4_tips.md b/readme/welcome/4_tips.md index 06d250ef1..016ea8ed7 100644 --- a/readme/welcome/4_tips.md +++ b/readme/welcome/4_tips.md @@ -52,6 +52,16 @@ f(x) = \int_{-\infty}^\infty \,d\xi $$ +And graphs can be added using the [Mermaid syntax](https://mermaidjs.github.io/): + +```mermaid +graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +``` + Various other tricks are possible, such as using HTML, or customising the CSS. See the Markdown documentation for more info - https://joplin.cozic.net#markdown ## Community and further help