├── 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:"![",suffix:"](https://)",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 suffix: '](https://)',\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:"![",suffix:"](https://)",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 suffix: '](https://)',\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: '![', suffix: '](https://)', 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 | --------------------------------------------------------------------------------