├── CHANGELOG.md
├── LICENSE
├── composer.json
├── extend.php
├── icon.svg
├── js
├── admin.js
├── dist
│ ├── admin.js
│ ├── admin.js.LICENSE.txt
│ ├── admin.js.map
│ ├── forum.js
│ ├── forum.js.LICENSE.txt
│ └── forum.js.map
├── forum.js
├── package.json
├── src
│ ├── admin
│ │ └── index.js
│ ├── common
│ │ ├── components
│ │ │ ├── MarkdownButton.js
│ │ │ └── MarkdownToolbar.js
│ │ └── index.js
│ └── forum
│ │ └── index.js
├── tsconfig.json
└── webpack.config.js
├── less
├── common.less
└── forum.less
├── locale
└── en.yml
└── migrations
└── 2021_03_25_000000_default_settings.php
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## [1.2.0](https://github.com/flarum/markdown/compare/v1.1.1...v1.2.0)
4 |
5 | No changes.
6 |
7 | ## [1.1.1](https://github.com/flarum/markdown/compare/v1.1.0...v1.1.1)
8 |
9 | ### Added
10 |
11 | - feat: make markdown toolbar extensible by @davwheat in https://github.com/flarum/markdown/pull/33
12 |
13 | ### Fixed
14 |
15 | - fix: re-use of texteditor with markdown ext breaks markdown toolbar items by @davwheat in https://github.com/flarum/markdown/pull/34
16 |
17 | ## [1.1.0](https://github.com/flarum/markdown/compare/v1.0.1...v1.1.0)
18 |
19 | ### Added
20 |
21 | - Spoiler and strikethrough buttons (https://github.com/flarum/markdown/pulls/30)
22 |
23 | ### Fixed
24 |
25 | - Browser/system shortcuts triggering when applying editor style from shortcut (https://github.com/flarum/markdown/pulls/32)
26 |
27 | ## [1.0.1](https://github.com/flarum/markdown/compare/v1.0.0...v1.0.1)
28 |
29 | ### Fixed
30 |
31 | - Link button is not visible on the markdown toolbar (https://github.com/flarum/markdown/pull/29)
32 |
33 | ## [1.0.0](https://github.com/flarum/markdown/compare/v0.1.0-beta.16.1...v1.0.0)
34 |
35 | ### Changed
36 |
37 | - Compatibility with Flarum v1.0.0.
38 | - GitHub markdown toolbar moves to flarum/core (https://github.com/flarum/markdown/pull/28)
39 | - Simplification of toolbar and button system (https://github.com/flarum/markdown/pull/28)
40 |
41 | ### Fixed
42 |
43 | - Toolbar buttons submits the form
44 | - Tooltips generate a deprecation warning
45 |
46 | ### Removed
47 |
48 | - Dropped mdarea (https://github.com/flarum/markdown/pull/28)
49 |
50 | ## [0.1.0-beta.16.1](https://github.com/flarum/markdown/compare/v0.1.0-beta.16...v0.1.0-beta.16.1)
51 |
52 | ### Added
53 |
54 | - Admin setting to disable mdarea (https://github.com/flarum/markdown/pull/27)
55 |
56 | ## [0.1.0-beta.16](https://github.com/flarum/markdown/compare/v0.1.0-beta.15...v0.1.0-beta.16)
57 |
58 | ### Added
59 |
60 | - Editor Driver support ([ba3e1fb](https://github.com/flarum/markdown/commit/ba3e1fb528ce7e85bde27753f6c1cce3b03fe9d3))
61 |
62 | ### Changed
63 |
64 | - Updated admin category from formatting to feature (https://github.com/flarum/markdown/pull/25)
65 | - Moved locale files from translation pack to extension (https://github.com/flarum/markdown/pull/21)
66 |
67 | ### Fixed
68 |
69 | - Double quote marks cause inconvenience typing ([6d8ea34](https://github.com/flarum/markdown/commit/6d8ea342061fdd2ab267cee93b9f5ade69149123))
70 |
71 | ## [0.1.0-beta.15](https://github.com/flarum/markdown/compare/v0.1.0-beta.14...v0.1.0-beta.15)
72 |
73 | ### Changed
74 |
75 | - Updated composer.json and admin javascript for new admin area.
76 |
77 | ## [0.1.0-beta.14](https://github.com/flarum/markdown/compare/v0.1.0-beta.13...v0.1.0-beta.14)
78 |
79 | ### Changed
80 |
81 | - Switch image and link defaults (#11)
82 | - Updated mithril to version 2
83 | - Load language strings correctly on en-/disable
84 |
85 | ### Removed
86 |
87 | - Support for IE 11 (#18)
88 |
89 | ## [0.1.0-beta.13](https://github.com/flarum/markdown/compare/v0.1.0-beta.12...v0.1.0-beta.13)
90 |
91 | ### Changed
92 |
93 | - Updated JS dependencies
94 |
95 | ### Fixed
96 |
97 | - Fixed not hiding other html entities than mentions (#14)
98 |
99 | ## [0.1.0-beta.12](https://github.com/flarum/markdown/compare/v0.1.0-beta.10...v0.1.0-beta.12)
100 |
101 | ### Fixed
102 |
103 | - Mentions could be seen within spoiler blocks (#13)
104 |
105 | ## [0.1.0-beta.10](https://github.com/flarum/markdown/compare/v0.1.0-beta.9...v0.1.0-beta.10)
106 |
107 | ### Added
108 |
109 | - The toolbar now has an image button (#8)
110 |
111 | ### Fixed
112 |
113 | - Unusable toolbar in IE11 (#8)
114 | - Tabbing out of the post composer was not possible (#8)
115 |
116 | ## [0.1.0-beta.9](https://github.com/flarum/markdown/compare/v0.1.0-beta.8...v0.1.0-beta.9)
117 |
118 | ### Fixed
119 |
120 | - Markdown toolbar did not work on IE11 ([31c064f](https://github.com/flarum/markdown/commit/31c064f0c6c945083bc0ebc50cb3e44a676f40e2) and [e762293](https://github.com/flarum/markdown/commit/e7622938b1422e89a50feeb52c9c9ef7b38db95a))
121 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2019-2024 Stichting Flarum (Flarum Foundation)
4 | Copyright (c) 2014-2019 Toby Zerner (toby.zerner@gmail.com)
5 | Copyright (c) 2017-2018 GitHub, Inc.
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "flarum/markdown",
3 | "description": "Allow posts to be formatted with Markdown.",
4 | "type": "flarum-extension",
5 | "keywords": [
6 | "formatting"
7 | ],
8 | "license": "MIT",
9 | "support": {
10 | "issues": "https://github.com/flarum/framework/issues",
11 | "source": "https://github.com/flarum/markdown",
12 | "forum": "https://discuss.flarum.org"
13 | },
14 | "homepage": "https://flarum.org",
15 | "funding": [
16 | {
17 | "type": "website",
18 | "url": "https://flarum.org/donate/"
19 | }
20 | ],
21 | "require": {
22 | "flarum/core": "^2.0.0-beta.3"
23 | },
24 | "extra": {
25 | "branch-alias": {
26 | "dev-main": "2.x-dev"
27 | },
28 | "flarum-extension": {
29 | "title": "Markdown",
30 | "category": "feature",
31 | "icon": {
32 | "image": "icon.svg",
33 | "backgroundColor": "#000",
34 | "backgroundSize": "100%",
35 | "backgroundRepeat": "no-repeat",
36 | "backgroundPosition": "center",
37 | "color": "#fff"
38 | }
39 | },
40 | "flarum-cli": {
41 | "modules": {
42 | "admin": false,
43 | "forum": true,
44 | "js": true,
45 | "jsCommon": false,
46 | "css": true,
47 | "gitConf": true,
48 | "githubActions": true,
49 | "prettier": true,
50 | "typescript": false,
51 | "bundlewatch": false,
52 | "backendTesting": false,
53 | "editorConfig": true,
54 | "styleci": true
55 | }
56 | }
57 | },
58 | "repositories": [
59 | {
60 | "type": "path",
61 | "url": "../../*/*"
62 | }
63 | ],
64 | "minimum-stability": "dev",
65 | "prefer-stable": true
66 | }
67 |
--------------------------------------------------------------------------------
/extend.php:
--------------------------------------------------------------------------------
1 | js(__DIR__.'/js/dist/forum.js')
16 | ->css(__DIR__.'/less/common.less'),
17 |
18 | (new Extend\Frontend('admin'))
19 | ->js(__DIR__.'/js/dist/admin.js')
20 | ->css(__DIR__.'/less/common.less'),
21 |
22 | (new Extend\Formatter)
23 | ->configure(function (Configurator $config) {
24 | $config->Litedown;
25 |
26 | // Overwrite the default inline spoiler so that it is compatible
27 | // with more styling for children in an external stylesheet.
28 | $config->tags['ispoiler']->template = '';
29 | }),
30 |
31 | new Extend\Locales(__DIR__.'/locale'),
32 | ];
33 |
--------------------------------------------------------------------------------
/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/js/admin.js:
--------------------------------------------------------------------------------
1 | export * from './src/admin';
2 |
--------------------------------------------------------------------------------
/js/dist/admin.js:
--------------------------------------------------------------------------------
1 | /*! For license information please see admin.js.LICENSE.txt */
2 | (()=>{var t={n:e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},d:(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)};(()=>{"use strict";const e=flarum.reg.get("core","admin/app");var o=t.n(e);const r=flarum.reg.get("core","common/app");var i=t.n(r);const n=flarum.reg.get("core","common/extend"),a=flarum.reg.get("core","common/utils/BasicEditorDriver");var l=t.n(a);const c=flarum.reg.get("core","common/utils/styleSelectedText");var s=t.n(c);const d=flarum.reg.get("core","common/Component");var f=t.n(d);class u extends(f()){view(t){return m("div",{className:"MarkdownToolbar"},t.children)}}flarum.reg.add("flarum-markdown","common/components/MarkdownToolbar",u);const p=flarum.reg.get("core","common/components/Icon");var k=t.n(p);const h=flarum.reg.get("core","common/components/Tooltip");var g=t.n(h);class x extends(f()){oncreate(t){super.oncreate(t)}view(){const t=m("button",{className:"Button Button--icon Button--link",type:"button","data-hotkey":this.attrs.hotkey,onkeydown:this.keydown.bind(this),onclick:this.attrs.onclick},m(k(),{name:this.attrs.icon}));return this.attrs.title?m(g(),{text:this.attrs.title},t):t}keydown(t){" "!==t.key&&"Enter"!==t.key||(t.preventDefault(),this.element.click())}}flarum.reg.add("flarum-markdown","common/components/MarkdownButton",x);const b=flarum.reg.get("core","common/utils/ItemList");var v=t.n(b);const w=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl",y={header:{prefix:"### "},bold:{prefix:"**",suffix:"**",trimFirst:!0},italic:{prefix:"_",suffix:"_",trimFirst:!0},strikethrough:{prefix:"~~",suffix:"~~",trimFirst:!0},quote:{prefix:"> ",multiline:!0,surroundWithNewlines:!0},code:{prefix:"`",suffix:"`",blockPrefix:"```",blockSuffix:"```"},link:{prefix:"[",suffix:"](https://)",replaceNext:"https://",scanFor:"https?://"},image:{prefix:"",replaceNext:"https://",scanFor:"https?://"},unordered_list:{prefix:"- ",multiline:!0,surroundWithNewlines:!0},ordered_list:{prefix:"1. ",multiline:!0,orderedList:!0},spoiler:{prefix:">!",suffix:"!<",blockPrefix:">! ",multiline:!0,trimFirst:!0}},_=(t,e)=>{s()(e.el,y[t])};function T(t,e,o){return function(r){r.key===e&&(r.metaKey&&"⌘"===w||r.ctrlKey&&"ctrl"===w)&&(r.preventDefault(),_(t,o))}}function F(t){const e="function"==typeof t?t():new(v());function o(t,e){return i().translator.trans(`flarum-markdown.lib.composer.${t}_tooltip`)+(e?` <${w}-${e}>`:"")}const r=t=>()=>_(t,this.attrs.composer.editor);return e.add("header",m(x,{title:o("header"),icon:"fas fa-heading",onclick:r("header")}),1e3),e.add("bold",m(x,{title:o("bold","b"),icon:"fas fa-bold",onclick:r("bold")}),900),e.add("italic",m(x,{title:o("italic","i"),icon:"fas fa-italic",onclick:r("italic")}),800),e.add("strikethrough",m(x,{title:o("strikethrough"),icon:"fas fa-strikethrough",onclick:r("strikethrough")}),700),e.add("quote",m(x,{title:o("quote"),icon:"fas fa-quote-left",onclick:r("quote")}),600),e.add("spoiler",m(x,{title:o("spoiler"),icon:"fas fa-exclamation-triangle",onclick:r("spoiler")}),500),e.add("code",m(x,{title:o("code"),icon:"fas fa-code",onclick:r("code")}),400),e.add("link",m(x,{title:o("link"),icon:"fas fa-link",onclick:r("link")}),300),e.add("image",m(x,{title:o("image"),icon:"fas fa-image",onclick:r("image")}),200),e.add("unordered_list",m(x,{title:o("unordered_list"),icon:"fas fa-list-ul",onclick:r("unordered_list")}),100),e.add("ordered_list",m(x,{title:o("ordered_list"),icon:"fas fa-list-ol",onclick:r("ordered_list")}),0),e}o().initializers.add("flarum-markdown",(function(t){(0,n.extend)(l().prototype,"keyHandlers",(function(t){t.add("bold",T("bold","b",this)),t.add("italic",T("italic","i",this))})),(0,n.override)("flarum/common/components/TextEditor","markdownToolbarItems",F),(0,n.extend)("flarum/common/components/TextEditor","toolbarItems",(function(t){t.add("markdown",m(u,{for:this.textareaId,setShortcutHandler:t=>shortcutHandler=t},this.markdownToolbarItems().toArray()),100)}))}))})(),module.exports={}})();
3 | //# sourceMappingURL=admin.js.map
--------------------------------------------------------------------------------
/js/dist/admin.js.LICENSE.txt:
--------------------------------------------------------------------------------
1 | /*!
2 | * Includes modified code from GitHub Markdown Toolbar Element
3 | * https://github.com/github/markdown-toolbar-element/
4 | *
5 | * Original Copyright GitHub, Inc.
6 | * Released under the MIT license
7 | * https://github.com/github/markdown-toolbar-element/blob/master/LICENSE
8 | */
9 |
--------------------------------------------------------------------------------
/js/dist/admin.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"admin.js","mappings":"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","sources":["webpack://@flarum/markdown/webpack/bootstrap","webpack://@flarum/markdown/webpack/runtime/compat get default export","webpack://@flarum/markdown/webpack/runtime/define property getters","webpack://@flarum/markdown/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'admin/app')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/app')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/extend')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/utils/BasicEditorDriver')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/utils/styleSelectedText')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/Component')\"","webpack://@flarum/markdown/./src/common/components/MarkdownToolbar.js","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/components/Icon')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/components/Tooltip')\"","webpack://@flarum/markdown/./src/common/components/MarkdownButton.js","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/utils/ItemList')\"","webpack://@flarum/markdown/./src/common/index.js","webpack://@flarum/markdown/./src/admin/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'admin/app');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/app');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extend');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/BasicEditorDriver');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/styleSelectedText');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Component');","import Component from 'flarum/common/Component';\nexport default class MarkdownToolbar extends Component {\n view(vnode) {\n return m(\"div\", {\n className: \"MarkdownToolbar\"\n }, vnode.children);\n }\n}\nflarum.reg.add('flarum-markdown', 'common/components/MarkdownToolbar', MarkdownToolbar);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Icon');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Tooltip');","import Component from 'flarum/common/Component';\nimport Icon from 'flarum/common/components/Icon';\nimport Tooltip from 'flarum/common/components/Tooltip';\nexport default class MarkdownButton extends Component {\n oncreate(vnode) {\n super.oncreate(vnode);\n }\n view() {\n const button = m(\"button\", {\n className: \"Button Button--icon Button--link\",\n type: \"button\",\n \"data-hotkey\": this.attrs.hotkey,\n onkeydown: this.keydown.bind(this),\n onclick: this.attrs.onclick\n }, m(Icon, {\n name: this.attrs.icon\n }));\n if (this.attrs.title) {\n return m(Tooltip, {\n text: this.attrs.title\n }, button);\n }\n return button;\n }\n keydown(event) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.element.click();\n }\n }\n}\nflarum.reg.add('flarum-markdown', 'common/components/MarkdownButton', MarkdownButton);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/ItemList');","/*!\n * Includes modified code from GitHub Markdown Toolbar Element\n * https://github.com/github/markdown-toolbar-element/\n *\n * Original Copyright GitHub, Inc.\n * Released under the MIT license\n * https://github.com/github/markdown-toolbar-element/blob/master/LICENSE\n */\n\nimport app from 'flarum/common/app';\nimport { extend, override } from 'flarum/common/extend';\nimport BasicEditorDriver from 'flarum/common/utils/BasicEditorDriver';\nimport styleSelectedText from 'flarum/common/utils/styleSelectedText';\nimport MarkdownToolbar from './components/MarkdownToolbar';\nimport MarkdownButton from './components/MarkdownButton';\nimport ItemList from 'flarum/common/utils/ItemList';\nconst modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';\nconst styles = {\n header: {\n prefix: '### '\n },\n bold: {\n prefix: '**',\n suffix: '**',\n trimFirst: true\n },\n italic: {\n prefix: '_',\n suffix: '_',\n trimFirst: true\n },\n strikethrough: {\n prefix: '~~',\n suffix: '~~',\n trimFirst: true\n },\n quote: {\n prefix: '> ',\n multiline: true,\n surroundWithNewlines: true\n },\n code: {\n prefix: '`',\n suffix: '`',\n blockPrefix: '```',\n blockSuffix: '```'\n },\n link: {\n prefix: '[',\n suffix: '](https://)',\n replaceNext: 'https://',\n scanFor: 'https?://'\n },\n image: {\n prefix: '',\n replaceNext: 'https://',\n scanFor: 'https?://'\n },\n unordered_list: {\n prefix: '- ',\n multiline: true,\n surroundWithNewlines: true\n },\n ordered_list: {\n prefix: '1. ',\n multiline: true,\n orderedList: true\n },\n spoiler: {\n prefix: '>!',\n suffix: '!<',\n blockPrefix: '>! ',\n multiline: true,\n trimFirst: true\n }\n};\nconst applyStyle = (id, editorDriver) => {\n // This is a nasty hack that breaks encapsulation of the editor.\n // In future releases, we'll need to tweak the editor driver interface\n // to support triggering events like this.\n styleSelectedText(editorDriver.el, styles[id]);\n};\nfunction makeShortcut(id, key, editorDriver) {\n return function (e) {\n if (e.key === key && (e.metaKey && modifierKey === '⌘' || e.ctrlKey && modifierKey === 'ctrl')) {\n e.preventDefault();\n applyStyle(id, editorDriver);\n }\n };\n}\nfunction markdownToolbarItems(oldFunc) {\n const items = typeof oldFunc === 'function' ? oldFunc() : new ItemList();\n function tooltip(name, hotkey) {\n return app.translator.trans(`flarum-markdown.lib.composer.${name}_tooltip`) + (hotkey ? ` <${modifierKey}-${hotkey}>` : '');\n }\n const makeApplyStyle = id => {\n return () => applyStyle(id, this.attrs.composer.editor);\n };\n items.add('header', m(MarkdownButton, {\n title: tooltip('header'),\n icon: \"fas fa-heading\",\n onclick: makeApplyStyle('header')\n }), 1000);\n items.add('bold', m(MarkdownButton, {\n title: tooltip('bold', 'b'),\n icon: \"fas fa-bold\",\n onclick: makeApplyStyle('bold')\n }), 900);\n items.add('italic', m(MarkdownButton, {\n title: tooltip('italic', 'i'),\n icon: \"fas fa-italic\",\n onclick: makeApplyStyle('italic')\n }), 800);\n items.add('strikethrough', m(MarkdownButton, {\n title: tooltip('strikethrough'),\n icon: \"fas fa-strikethrough\",\n onclick: makeApplyStyle('strikethrough')\n }), 700);\n items.add('quote', m(MarkdownButton, {\n title: tooltip('quote'),\n icon: \"fas fa-quote-left\",\n onclick: makeApplyStyle('quote')\n }), 600);\n items.add('spoiler', m(MarkdownButton, {\n title: tooltip('spoiler'),\n icon: \"fas fa-exclamation-triangle\",\n onclick: makeApplyStyle('spoiler')\n }), 500);\n items.add('code', m(MarkdownButton, {\n title: tooltip('code'),\n icon: \"fas fa-code\",\n onclick: makeApplyStyle('code')\n }), 400);\n items.add('link', m(MarkdownButton, {\n title: tooltip('link'),\n icon: \"fas fa-link\",\n onclick: makeApplyStyle('link')\n }), 300);\n items.add('image', m(MarkdownButton, {\n title: tooltip('image'),\n icon: \"fas fa-image\",\n onclick: makeApplyStyle('image')\n }), 200);\n items.add('unordered_list', m(MarkdownButton, {\n title: tooltip('unordered_list'),\n icon: \"fas fa-list-ul\",\n onclick: makeApplyStyle('unordered_list')\n }), 100);\n items.add('ordered_list', m(MarkdownButton, {\n title: tooltip('ordered_list'),\n icon: \"fas fa-list-ol\",\n onclick: makeApplyStyle('ordered_list')\n }), 0);\n return items;\n}\nexport function initialize(app) {\n extend(BasicEditorDriver.prototype, 'keyHandlers', function (items) {\n items.add('bold', makeShortcut('bold', 'b', this));\n items.add('italic', makeShortcut('italic', 'i', this));\n });\n override('flarum/common/components/TextEditor', 'markdownToolbarItems', markdownToolbarItems);\n extend('flarum/common/components/TextEditor', 'toolbarItems', function (items) {\n items.add('markdown', m(MarkdownToolbar, {\n for: this.textareaId,\n setShortcutHandler: handler => shortcutHandler = handler\n }, this.markdownToolbarItems().toArray()), 100);\n });\n}","import app from 'flarum/admin/app';\nimport { initialize } from '../common/index';\napp.initializers.add('flarum-markdown', initialize);"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","flarum","reg","MarkdownToolbar","view","vnode","m","className","children","add","MarkdownButton","oncreate","super","button","type","this","attrs","hotkey","onkeydown","keydown","bind","onclick","name","icon","title","text","event","preventDefault","element","click","modifierKey","navigator","userAgent","match","styles","header","prefix","bold","suffix","trimFirst","italic","strikethrough","quote","multiline","surroundWithNewlines","code","blockPrefix","blockSuffix","link","replaceNext","scanFor","image","unordered_list","ordered_list","orderedList","spoiler","applyStyle","id","editorDriver","el","makeShortcut","e","metaKey","ctrlKey","markdownToolbarItems","oldFunc","items","tooltip","trans","makeApplyStyle","composer","editor","app","extend","override","for","textareaId","setShortcutHandler","handler","shortcutHandler","toArray"],"sourceRoot":""}
--------------------------------------------------------------------------------
/js/dist/forum.js:
--------------------------------------------------------------------------------
1 | /*! For license information please see forum.js.LICENSE.txt */
2 | (()=>{var t={n:e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},d:(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)};(()=>{"use strict";const e=flarum.reg.get("core","forum/app");var o=t.n(e);const r=flarum.reg.get("core","common/app");var i=t.n(r);const n=flarum.reg.get("core","common/extend"),a=flarum.reg.get("core","common/utils/BasicEditorDriver");var l=t.n(a);const c=flarum.reg.get("core","common/utils/styleSelectedText");var s=t.n(c);const d=flarum.reg.get("core","common/Component");var f=t.n(d);class u extends(f()){view(t){return m("div",{className:"MarkdownToolbar"},t.children)}}flarum.reg.add("flarum-markdown","common/components/MarkdownToolbar",u);const p=flarum.reg.get("core","common/components/Icon");var k=t.n(p);const h=flarum.reg.get("core","common/components/Tooltip");var g=t.n(h);class x extends(f()){oncreate(t){super.oncreate(t)}view(){const t=m("button",{className:"Button Button--icon Button--link",type:"button","data-hotkey":this.attrs.hotkey,onkeydown:this.keydown.bind(this),onclick:this.attrs.onclick},m(k(),{name:this.attrs.icon}));return this.attrs.title?m(g(),{text:this.attrs.title},t):t}keydown(t){" "!==t.key&&"Enter"!==t.key||(t.preventDefault(),this.element.click())}}flarum.reg.add("flarum-markdown","common/components/MarkdownButton",x);const b=flarum.reg.get("core","common/utils/ItemList");var v=t.n(b);const w=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl",y={header:{prefix:"### "},bold:{prefix:"**",suffix:"**",trimFirst:!0},italic:{prefix:"_",suffix:"_",trimFirst:!0},strikethrough:{prefix:"~~",suffix:"~~",trimFirst:!0},quote:{prefix:"> ",multiline:!0,surroundWithNewlines:!0},code:{prefix:"`",suffix:"`",blockPrefix:"```",blockSuffix:"```"},link:{prefix:"[",suffix:"](https://)",replaceNext:"https://",scanFor:"https?://"},image:{prefix:"",replaceNext:"https://",scanFor:"https?://"},unordered_list:{prefix:"- ",multiline:!0,surroundWithNewlines:!0},ordered_list:{prefix:"1. ",multiline:!0,orderedList:!0},spoiler:{prefix:">!",suffix:"!<",blockPrefix:">! ",multiline:!0,trimFirst:!0}},_=(t,e)=>{s()(e.el,y[t])};function T(t,e,o){return function(r){r.key===e&&(r.metaKey&&"⌘"===w||r.ctrlKey&&"ctrl"===w)&&(r.preventDefault(),_(t,o))}}function F(t){const e="function"==typeof t?t():new(v());function o(t,e){return i().translator.trans(`flarum-markdown.lib.composer.${t}_tooltip`)+(e?` <${w}-${e}>`:"")}const r=t=>()=>_(t,this.attrs.composer.editor);return e.add("header",m(x,{title:o("header"),icon:"fas fa-heading",onclick:r("header")}),1e3),e.add("bold",m(x,{title:o("bold","b"),icon:"fas fa-bold",onclick:r("bold")}),900),e.add("italic",m(x,{title:o("italic","i"),icon:"fas fa-italic",onclick:r("italic")}),800),e.add("strikethrough",m(x,{title:o("strikethrough"),icon:"fas fa-strikethrough",onclick:r("strikethrough")}),700),e.add("quote",m(x,{title:o("quote"),icon:"fas fa-quote-left",onclick:r("quote")}),600),e.add("spoiler",m(x,{title:o("spoiler"),icon:"fas fa-exclamation-triangle",onclick:r("spoiler")}),500),e.add("code",m(x,{title:o("code"),icon:"fas fa-code",onclick:r("code")}),400),e.add("link",m(x,{title:o("link"),icon:"fas fa-link",onclick:r("link")}),300),e.add("image",m(x,{title:o("image"),icon:"fas fa-image",onclick:r("image")}),200),e.add("unordered_list",m(x,{title:o("unordered_list"),icon:"fas fa-list-ul",onclick:r("unordered_list")}),100),e.add("ordered_list",m(x,{title:o("ordered_list"),icon:"fas fa-list-ol",onclick:r("ordered_list")}),0),e}o().initializers.add("flarum-markdown",(function(t){(0,n.extend)(l().prototype,"keyHandlers",(function(t){t.add("bold",T("bold","b",this)),t.add("italic",T("italic","i",this))})),(0,n.override)("flarum/common/components/TextEditor","markdownToolbarItems",F),(0,n.extend)("flarum/common/components/TextEditor","toolbarItems",(function(t){t.add("markdown",m(u,{for:this.textareaId,setShortcutHandler:t=>shortcutHandler=t},this.markdownToolbarItems().toArray()),100)}))}))})(),module.exports={}})();
3 | //# sourceMappingURL=forum.js.map
--------------------------------------------------------------------------------
/js/dist/forum.js.LICENSE.txt:
--------------------------------------------------------------------------------
1 | /*!
2 | * Includes modified code from GitHub Markdown Toolbar Element
3 | * https://github.com/github/markdown-toolbar-element/
4 | *
5 | * Original Copyright GitHub, Inc.
6 | * Released under the MIT license
7 | * https://github.com/github/markdown-toolbar-element/blob/master/LICENSE
8 | */
9 |
--------------------------------------------------------------------------------
/js/dist/forum.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@flarum/markdown/webpack/bootstrap","webpack://@flarum/markdown/webpack/runtime/compat get default export","webpack://@flarum/markdown/webpack/runtime/define property getters","webpack://@flarum/markdown/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'forum/app')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/app')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/extend')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/utils/BasicEditorDriver')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/utils/styleSelectedText')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/Component')\"","webpack://@flarum/markdown/./src/common/components/MarkdownToolbar.js","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/components/Icon')\"","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/components/Tooltip')\"","webpack://@flarum/markdown/./src/common/components/MarkdownButton.js","webpack://@flarum/markdown/external root \"flarum.reg.get('core', 'common/utils/ItemList')\"","webpack://@flarum/markdown/./src/common/index.js","webpack://@flarum/markdown/./src/forum/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/app');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/app');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extend');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/BasicEditorDriver');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/styleSelectedText');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Component');","import Component from 'flarum/common/Component';\nexport default class MarkdownToolbar extends Component {\n view(vnode) {\n return m(\"div\", {\n className: \"MarkdownToolbar\"\n }, vnode.children);\n }\n}\nflarum.reg.add('flarum-markdown', 'common/components/MarkdownToolbar', MarkdownToolbar);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Icon');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Tooltip');","import Component from 'flarum/common/Component';\nimport Icon from 'flarum/common/components/Icon';\nimport Tooltip from 'flarum/common/components/Tooltip';\nexport default class MarkdownButton extends Component {\n oncreate(vnode) {\n super.oncreate(vnode);\n }\n view() {\n const button = m(\"button\", {\n className: \"Button Button--icon Button--link\",\n type: \"button\",\n \"data-hotkey\": this.attrs.hotkey,\n onkeydown: this.keydown.bind(this),\n onclick: this.attrs.onclick\n }, m(Icon, {\n name: this.attrs.icon\n }));\n if (this.attrs.title) {\n return m(Tooltip, {\n text: this.attrs.title\n }, button);\n }\n return button;\n }\n keydown(event) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n this.element.click();\n }\n }\n}\nflarum.reg.add('flarum-markdown', 'common/components/MarkdownButton', MarkdownButton);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/ItemList');","/*!\n * Includes modified code from GitHub Markdown Toolbar Element\n * https://github.com/github/markdown-toolbar-element/\n *\n * Original Copyright GitHub, Inc.\n * Released under the MIT license\n * https://github.com/github/markdown-toolbar-element/blob/master/LICENSE\n */\n\nimport app from 'flarum/common/app';\nimport { extend, override } from 'flarum/common/extend';\nimport BasicEditorDriver from 'flarum/common/utils/BasicEditorDriver';\nimport styleSelectedText from 'flarum/common/utils/styleSelectedText';\nimport MarkdownToolbar from './components/MarkdownToolbar';\nimport MarkdownButton from './components/MarkdownButton';\nimport ItemList from 'flarum/common/utils/ItemList';\nconst modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';\nconst styles = {\n header: {\n prefix: '### '\n },\n bold: {\n prefix: '**',\n suffix: '**',\n trimFirst: true\n },\n italic: {\n prefix: '_',\n suffix: '_',\n trimFirst: true\n },\n strikethrough: {\n prefix: '~~',\n suffix: '~~',\n trimFirst: true\n },\n quote: {\n prefix: '> ',\n multiline: true,\n surroundWithNewlines: true\n },\n code: {\n prefix: '`',\n suffix: '`',\n blockPrefix: '```',\n blockSuffix: '```'\n },\n link: {\n prefix: '[',\n suffix: '](https://)',\n replaceNext: 'https://',\n scanFor: 'https?://'\n },\n image: {\n prefix: '',\n replaceNext: 'https://',\n scanFor: 'https?://'\n },\n unordered_list: {\n prefix: '- ',\n multiline: true,\n surroundWithNewlines: true\n },\n ordered_list: {\n prefix: '1. ',\n multiline: true,\n orderedList: true\n },\n spoiler: {\n prefix: '>!',\n suffix: '!<',\n blockPrefix: '>! ',\n multiline: true,\n trimFirst: true\n }\n};\nconst applyStyle = (id, editorDriver) => {\n // This is a nasty hack that breaks encapsulation of the editor.\n // In future releases, we'll need to tweak the editor driver interface\n // to support triggering events like this.\n styleSelectedText(editorDriver.el, styles[id]);\n};\nfunction makeShortcut(id, key, editorDriver) {\n return function (e) {\n if (e.key === key && (e.metaKey && modifierKey === '⌘' || e.ctrlKey && modifierKey === 'ctrl')) {\n e.preventDefault();\n applyStyle(id, editorDriver);\n }\n };\n}\nfunction markdownToolbarItems(oldFunc) {\n const items = typeof oldFunc === 'function' ? oldFunc() : new ItemList();\n function tooltip(name, hotkey) {\n return app.translator.trans(`flarum-markdown.lib.composer.${name}_tooltip`) + (hotkey ? ` <${modifierKey}-${hotkey}>` : '');\n }\n const makeApplyStyle = id => {\n return () => applyStyle(id, this.attrs.composer.editor);\n };\n items.add('header', m(MarkdownButton, {\n title: tooltip('header'),\n icon: \"fas fa-heading\",\n onclick: makeApplyStyle('header')\n }), 1000);\n items.add('bold', m(MarkdownButton, {\n title: tooltip('bold', 'b'),\n icon: \"fas fa-bold\",\n onclick: makeApplyStyle('bold')\n }), 900);\n items.add('italic', m(MarkdownButton, {\n title: tooltip('italic', 'i'),\n icon: \"fas fa-italic\",\n onclick: makeApplyStyle('italic')\n }), 800);\n items.add('strikethrough', m(MarkdownButton, {\n title: tooltip('strikethrough'),\n icon: \"fas fa-strikethrough\",\n onclick: makeApplyStyle('strikethrough')\n }), 700);\n items.add('quote', m(MarkdownButton, {\n title: tooltip('quote'),\n icon: \"fas fa-quote-left\",\n onclick: makeApplyStyle('quote')\n }), 600);\n items.add('spoiler', m(MarkdownButton, {\n title: tooltip('spoiler'),\n icon: \"fas fa-exclamation-triangle\",\n onclick: makeApplyStyle('spoiler')\n }), 500);\n items.add('code', m(MarkdownButton, {\n title: tooltip('code'),\n icon: \"fas fa-code\",\n onclick: makeApplyStyle('code')\n }), 400);\n items.add('link', m(MarkdownButton, {\n title: tooltip('link'),\n icon: \"fas fa-link\",\n onclick: makeApplyStyle('link')\n }), 300);\n items.add('image', m(MarkdownButton, {\n title: tooltip('image'),\n icon: \"fas fa-image\",\n onclick: makeApplyStyle('image')\n }), 200);\n items.add('unordered_list', m(MarkdownButton, {\n title: tooltip('unordered_list'),\n icon: \"fas fa-list-ul\",\n onclick: makeApplyStyle('unordered_list')\n }), 100);\n items.add('ordered_list', m(MarkdownButton, {\n title: tooltip('ordered_list'),\n icon: \"fas fa-list-ol\",\n onclick: makeApplyStyle('ordered_list')\n }), 0);\n return items;\n}\nexport function initialize(app) {\n extend(BasicEditorDriver.prototype, 'keyHandlers', function (items) {\n items.add('bold', makeShortcut('bold', 'b', this));\n items.add('italic', makeShortcut('italic', 'i', this));\n });\n override('flarum/common/components/TextEditor', 'markdownToolbarItems', markdownToolbarItems);\n extend('flarum/common/components/TextEditor', 'toolbarItems', function (items) {\n items.add('markdown', m(MarkdownToolbar, {\n for: this.textareaId,\n setShortcutHandler: handler => shortcutHandler = handler\n }, this.markdownToolbarItems().toArray()), 100);\n });\n}","import app from 'flarum/forum/app';\nimport { initialize } from '../common/index';\napp.initializers.add('flarum-markdown', initialize);"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","flarum","reg","MarkdownToolbar","view","vnode","m","className","children","add","MarkdownButton","oncreate","super","button","type","this","attrs","hotkey","onkeydown","keydown","bind","onclick","name","icon","title","text","event","preventDefault","element","click","modifierKey","navigator","userAgent","match","styles","header","prefix","bold","suffix","trimFirst","italic","strikethrough","quote","multiline","surroundWithNewlines","code","blockPrefix","blockSuffix","link","replaceNext","scanFor","image","unordered_list","ordered_list","orderedList","spoiler","applyStyle","id","editorDriver","el","makeShortcut","e","metaKey","ctrlKey","markdownToolbarItems","oldFunc","items","tooltip","trans","makeApplyStyle","composer","editor","app","extend","override","for","textareaId","setShortcutHandler","handler","shortcutHandler","toArray"],"sourceRoot":""}
--------------------------------------------------------------------------------
/js/forum.js:
--------------------------------------------------------------------------------
1 | export * from './src/forum';
2 |
--------------------------------------------------------------------------------
/js/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "name": "@flarum/markdown",
4 | "version": "0.0.0",
5 | "prettier": "@flarum/prettier-config",
6 | "dependencies": {
7 | "flarum-webpack-config": "^3.0.0",
8 | "webpack": "^5.76.0",
9 | "webpack-cli": "^4.9.1"
10 | },
11 | "scripts": {
12 | "dev": "webpack --mode development --watch",
13 | "build": "webpack --mode production",
14 | "format": "prettier --write src",
15 | "format-check": "prettier --check src",
16 | "analyze": "cross-env ANALYZER=true yarn run build"
17 | },
18 | "devDependencies": {
19 | "@flarum/prettier-config": "^1.0.0",
20 | "flarum-tsconfig": "^2.0.0",
21 | "prettier": "^2.5.1",
22 | "flarum-webpack-config": "^3.0.0",
23 | "webpack": "^5.76.0",
24 | "webpack-cli": "^4.9.1"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/js/src/admin/index.js:
--------------------------------------------------------------------------------
1 | import app from 'flarum/admin/app';
2 | import { initialize } from '../common/index';
3 |
4 | app.initializers.add('flarum-markdown', initialize);
5 |
--------------------------------------------------------------------------------
/js/src/common/components/MarkdownButton.js:
--------------------------------------------------------------------------------
1 | import Component from 'flarum/common/Component';
2 | import Icon from 'flarum/common/components/Icon';
3 | import Tooltip from 'flarum/common/components/Tooltip';
4 |
5 | export default class MarkdownButton extends Component {
6 | oncreate(vnode) {
7 | super.oncreate(vnode);
8 | }
9 |
10 | view() {
11 | const button = (
12 |
21 | );
22 |
23 | if (this.attrs.title) {
24 | return {button};
25 | }
26 |
27 | return button;
28 | }
29 |
30 | keydown(event) {
31 | if (event.key === ' ' || event.key === 'Enter') {
32 | event.preventDefault();
33 | this.element.click();
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/js/src/common/components/MarkdownToolbar.js:
--------------------------------------------------------------------------------
1 | import Component from 'flarum/common/Component';
2 |
3 | export default class MarkdownToolbar extends Component {
4 | view(vnode) {
5 | return
{vnode.children}
;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/js/src/common/index.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Includes modified code from GitHub Markdown Toolbar Element
3 | * https://github.com/github/markdown-toolbar-element/
4 | *
5 | * Original Copyright GitHub, Inc.
6 | * Released under the MIT license
7 | * https://github.com/github/markdown-toolbar-element/blob/master/LICENSE
8 | */
9 |
10 | import app from 'flarum/common/app';
11 | import { extend, override } from 'flarum/common/extend';
12 | import BasicEditorDriver from 'flarum/common/utils/BasicEditorDriver';
13 | import styleSelectedText from 'flarum/common/utils/styleSelectedText';
14 |
15 | import MarkdownToolbar from './components/MarkdownToolbar';
16 | import MarkdownButton from './components/MarkdownButton';
17 | import ItemList from 'flarum/common/utils/ItemList';
18 |
19 | const modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';
20 |
21 | const styles = {
22 | header: { prefix: '### ' },
23 | bold: { prefix: '**', suffix: '**', trimFirst: true },
24 | italic: { prefix: '_', suffix: '_', trimFirst: true },
25 | strikethrough: { prefix: '~~', suffix: '~~', trimFirst: true },
26 | quote: { prefix: '> ', multiline: true, surroundWithNewlines: true },
27 | code: { prefix: '`', suffix: '`', blockPrefix: '```', blockSuffix: '```' },
28 | link: { prefix: '[', suffix: '](https://)', replaceNext: 'https://', scanFor: 'https?://' },
29 | image: { prefix: '', replaceNext: 'https://', scanFor: 'https?://' },
30 | unordered_list: { prefix: '- ', multiline: true, surroundWithNewlines: true },
31 | ordered_list: { prefix: '1. ', multiline: true, orderedList: true },
32 | spoiler: { prefix: '>!', suffix: '!<', blockPrefix: '>! ', multiline: true, trimFirst: true },
33 | };
34 |
35 | const applyStyle = (id, editorDriver) => {
36 | // This is a nasty hack that breaks encapsulation of the editor.
37 | // In future releases, we'll need to tweak the editor driver interface
38 | // to support triggering events like this.
39 | styleSelectedText(editorDriver.el, styles[id]);
40 | };
41 |
42 | function makeShortcut(id, key, editorDriver) {
43 | return function (e) {
44 | if (e.key === key && ((e.metaKey && modifierKey === '⌘') || (e.ctrlKey && modifierKey === 'ctrl'))) {
45 | e.preventDefault();
46 | applyStyle(id, editorDriver);
47 | }
48 | };
49 | }
50 |
51 | function markdownToolbarItems(oldFunc) {
52 | const items = typeof oldFunc === 'function' ? oldFunc() : new ItemList();
53 |
54 | function tooltip(name, hotkey) {
55 | return app.translator.trans(`flarum-markdown.lib.composer.${name}_tooltip`) + (hotkey ? ` <${modifierKey}-${hotkey}>` : '');
56 | }
57 |
58 | const makeApplyStyle = (id) => {
59 | return () => applyStyle(id, this.attrs.composer.editor);
60 | };
61 |
62 | items.add('header', , 1000);
63 | items.add('bold', , 900);
64 | items.add('italic', , 800);
65 | items.add(
66 | 'strikethrough',
67 | ,
68 | 700
69 | );
70 | items.add('quote', , 600);
71 | items.add('spoiler', , 500);
72 | items.add('code', , 400);
73 | items.add('link', , 300);
74 | items.add('image', , 200);
75 | items.add(
76 | 'unordered_list',
77 | ,
78 | 100
79 | );
80 | items.add('ordered_list', , 0);
81 |
82 | return items;
83 | }
84 |
85 | export function initialize(app) {
86 | extend(BasicEditorDriver.prototype, 'keyHandlers', function (items) {
87 | items.add('bold', makeShortcut('bold', 'b', this));
88 | items.add('italic', makeShortcut('italic', 'i', this));
89 | });
90 |
91 | override('flarum/common/components/TextEditor', 'markdownToolbarItems', markdownToolbarItems);
92 |
93 | extend('flarum/common/components/TextEditor', 'toolbarItems', function (items) {
94 | items.add(
95 | 'markdown',
96 | (shortcutHandler = handler)}>
97 | {this.markdownToolbarItems().toArray()}
98 | ,
99 | 100
100 | );
101 | });
102 | }
103 |
--------------------------------------------------------------------------------
/js/src/forum/index.js:
--------------------------------------------------------------------------------
1 | import app from 'flarum/forum/app';
2 | import { initialize } from '../common/index';
3 |
4 | app.initializers.add('flarum-markdown', initialize);
5 |
--------------------------------------------------------------------------------
/js/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use Flarum's tsconfig as a starting point
3 | "extends": "flarum-tsconfig",
4 | // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder
5 | // and also tells your Typescript server to read core's global typings for
6 | // access to `dayjs` and `$` in the global namespace.
7 | "include": ["src/**/*", "../../../framework/core/js/dist-typings/@types/**/*", "@types/**/*"],
8 | "compilerOptions": {
9 | // This will output typings to `dist-typings`
10 | "declarationDir": "./dist-typings",
11 | "paths": {
12 | "flarum/*": ["../../../framework/core/js/dist-typings/*"]
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/js/webpack.config.js:
--------------------------------------------------------------------------------
1 | module.exports = require('flarum-webpack-config')();
2 |
--------------------------------------------------------------------------------
/less/common.less:
--------------------------------------------------------------------------------
1 | .MarkdownToolbar {
2 | display: inline-block;
3 | }
4 |
5 | span.spoiler {
6 | // Style the inline spoiler itself: a dark block, invisible font
7 | background: #444;
8 | color: transparent;
9 |
10 | // Try to generically hide all possible children
11 | * {
12 | // Links and other interactive elements would give their presence
13 | // away when hovering
14 | pointer-events: none;
15 |
16 | // Children can have special text or background colors
17 | background: transparent;
18 | color: transparent;
19 | }
20 |
21 | // Hide images visually
22 | img {
23 | visibility: hidden;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/less/forum.less:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flarum/markdown/71c9d24cf5cd08dd7f9476d060f039f08362b1b4/less/forum.less
--------------------------------------------------------------------------------
/locale/en.yml:
--------------------------------------------------------------------------------
1 | flarum-markdown:
2 | lib:
3 | composer:
4 | bold_tooltip: Add bold text
5 | code_tooltip: Insert code
6 | header_tooltip: Add header text
7 | image_tooltip: Add an image
8 | italic_tooltip: Add italic text
9 | link_tooltip: Add a link
10 | ordered_list_tooltip: Add a numbered list
11 | quote_tooltip: Insert a quote
12 | spoiler_tooltip: Insert a spoiler
13 | strikethrough_tooltip: Add strikethrough text
14 | unordered_list_tooltip: Add a bulleted list
15 |
--------------------------------------------------------------------------------
/migrations/2021_03_25_000000_default_settings.php:
--------------------------------------------------------------------------------
1 | true
14 | ]);
15 |
--------------------------------------------------------------------------------