mirror of
https://github.com/flarum/framework.git
synced 2025-03-15 00:05:12 +08:00
Merge remote-tracking branch 'extensions_markdown/REWRITE'
This commit is contained in:
commit
4ed4013a32
19
extensions/markdown/.editorconfig
Normal file
19
extensions/markdown/.editorconfig
Normal file
@ -0,0 +1,19 @@
|
||||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{diff,md}]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{php,xml,json}]
|
||||
indent_size = 4
|
18
extensions/markdown/.gitattributes
vendored
Normal file
18
extensions/markdown/.gitattributes
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
.gitmodules export-ignore
|
||||
.github export-ignore
|
||||
.travis export-ignore
|
||||
.travis.yml export-ignore
|
||||
.editorconfig export-ignore
|
||||
.styleci.yml export-ignore
|
||||
|
||||
phpunit.xml export-ignore
|
||||
tests export-ignore
|
||||
|
||||
js/dist/* -diff
|
||||
js/dist/* linguist-generated
|
||||
js/dist-typings/* linguist-generated
|
||||
js/yarn.lock -diff
|
||||
|
||||
* text=auto eol=lf
|
15
extensions/markdown/.github/workflows/backend.yml
vendored
Normal file
15
extensions/markdown/.github/workflows/backend.yml
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
name: Markdown PHP
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||
# This will break your current script.
|
||||
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||
|
||||
jobs:
|
||||
run:
|
||||
uses: flarum/.github/.github/workflows/REUSABLE_backend.yml@main
|
||||
with:
|
||||
enable_backend_testing: false
|
||||
|
||||
backend_directory: .
|
21
extensions/markdown/.github/workflows/frontend.yml
vendored
Normal file
21
extensions/markdown/.github/workflows/frontend.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
name: Markdown JS
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||
# This will break your current script.
|
||||
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||
|
||||
jobs:
|
||||
run:
|
||||
uses: flarum/.github/.github/workflows/REUSABLE_frontend.yml@main
|
||||
with:
|
||||
enable_bundlewatch: false
|
||||
enable_prettier: true
|
||||
enable_typescript: false
|
||||
|
||||
frontend_directory: ./js
|
||||
main_git_branch: master
|
||||
|
||||
secrets:
|
||||
bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}
|
12
extensions/markdown/.gitignore
vendored
Normal file
12
extensions/markdown/.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
/vendor
|
||||
composer.lock
|
||||
composer.phar
|
||||
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
tests/.phpunit.result.cache
|
||||
/tests/integration/tmp
|
||||
.vagrant
|
||||
.idea/*
|
||||
.vscode
|
||||
js/coverage-ts
|
14
extensions/markdown/.styleci.yml
Normal file
14
extensions/markdown/.styleci.yml
Normal file
@ -0,0 +1,14 @@
|
||||
preset: recommended
|
||||
|
||||
enabled:
|
||||
- logical_not_operators_with_successor_space
|
||||
|
||||
disabled:
|
||||
- align_double_arrow
|
||||
- blank_line_after_opening_tag
|
||||
- multiline_array_trailing_comma
|
||||
- new_with_braces
|
||||
- phpdoc_align
|
||||
- phpdoc_order
|
||||
- phpdoc_separation
|
||||
- phpdoc_types
|
120
extensions/markdown/CHANGELOG.md
Normal file
120
extensions/markdown/CHANGELOG.md
Normal file
@ -0,0 +1,120 @@
|
||||
# Changelog
|
||||
|
||||
## [1.2.0](https://github.com/flarum/markdown/compare/v1.1.1...v1.2.0)
|
||||
|
||||
No changes.
|
||||
|
||||
## [1.1.1](https://github.com/flarum/markdown/compare/v1.1.0...v1.1.1)
|
||||
|
||||
### Added
|
||||
|
||||
- feat: make markdown toolbar extensible by @davwheat in https://github.com/flarum/markdown/pull/33
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: re-use of texteditor with markdown ext breaks markdown toolbar items by @davwheat in https://github.com/flarum/markdown/pull/34
|
||||
|
||||
## [1.1.0](https://github.com/flarum/markdown/compare/v1.0.1...v1.1.0)
|
||||
|
||||
### Added
|
||||
|
||||
- Spoiler and strikethrough buttons (https://github.com/flarum/markdown/pulls/30)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Browser/system shortcuts triggering when applying editor style from shortcut (https://github.com/flarum/markdown/pulls/32)
|
||||
|
||||
## [1.0.1](https://github.com/flarum/markdown/compare/v1.0.0...v1.0.1)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Link button is not visible on the markdown toolbar (https://github.com/flarum/markdown/pull/29)
|
||||
|
||||
## [1.0.0](https://github.com/flarum/markdown/compare/v0.1.0-beta.16.1...v1.0.0)
|
||||
|
||||
### Changed
|
||||
|
||||
- Compatibility with Flarum v1.0.0.
|
||||
- GitHub markdown toolbar moves to flarum/core (https://github.com/flarum/markdown/pull/28)
|
||||
- Simplification of toolbar and button system (https://github.com/flarum/markdown/pull/28)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Toolbar buttons submits the form
|
||||
- Tooltips generate a deprecation warning
|
||||
|
||||
### Removed
|
||||
|
||||
- Dropped mdarea (https://github.com/flarum/markdown/pull/28)
|
||||
|
||||
## [0.1.0-beta.16.1](https://github.com/flarum/markdown/compare/v0.1.0-beta.16...v0.1.0-beta.16.1)
|
||||
|
||||
### Added
|
||||
|
||||
- Admin setting to disable mdarea (https://github.com/flarum/markdown/pull/27)
|
||||
|
||||
## [0.1.0-beta.16](https://github.com/flarum/markdown/compare/v0.1.0-beta.15...v0.1.0-beta.16)
|
||||
|
||||
### Added
|
||||
|
||||
- Editor Driver support ([ba3e1fb](https://github.com/flarum/markdown/commit/ba3e1fb528ce7e85bde27753f6c1cce3b03fe9d3))
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated admin category from formatting to feature (https://github.com/flarum/markdown/pull/25)
|
||||
- Moved locale files from translation pack to extension (https://github.com/flarum/markdown/pull/21)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Double quote marks cause inconvenience typing ([6d8ea34](https://github.com/flarum/markdown/commit/6d8ea342061fdd2ab267cee93b9f5ade69149123))
|
||||
|
||||
## [0.1.0-beta.15](https://github.com/flarum/markdown/compare/v0.1.0-beta.14...v0.1.0-beta.15)
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated composer.json and admin javascript for new admin area.
|
||||
|
||||
## [0.1.0-beta.14](https://github.com/flarum/markdown/compare/v0.1.0-beta.13...v0.1.0-beta.14)
|
||||
|
||||
### Changed
|
||||
|
||||
- Switch image and link defaults (#11)
|
||||
- Updated mithril to version 2
|
||||
- Load language strings correctly on en-/disable
|
||||
|
||||
### Removed
|
||||
|
||||
- Support for IE 11 (#18)
|
||||
|
||||
## [0.1.0-beta.13](https://github.com/flarum/markdown/compare/v0.1.0-beta.12...v0.1.0-beta.13)
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated JS dependencies
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed not hiding other html entities than mentions (#14)
|
||||
|
||||
## [0.1.0-beta.12](https://github.com/flarum/markdown/compare/v0.1.0-beta.10...v0.1.0-beta.12)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Mentions could be seen within spoiler blocks (#13)
|
||||
|
||||
## [0.1.0-beta.10](https://github.com/flarum/markdown/compare/v0.1.0-beta.9...v0.1.0-beta.10)
|
||||
|
||||
### Added
|
||||
|
||||
- The toolbar now has an image button (#8)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Unusable toolbar in IE11 (#8)
|
||||
- Tabbing out of the post composer was not possible (#8)
|
||||
|
||||
## [0.1.0-beta.9](https://github.com/flarum/markdown/compare/v0.1.0-beta.8...v0.1.0-beta.9)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Markdown toolbar did not work on IE11 ([31c064f](https://github.com/flarum/markdown/commit/31c064f0c6c945083bc0ebc50cb3e44a676f40e2) and [e762293](https://github.com/flarum/markdown/commit/e7622938b1422e89a50feeb52c9c9ef7b38db95a))
|
23
extensions/markdown/LICENSE
Normal file
23
extensions/markdown/LICENSE
Normal file
@ -0,0 +1,23 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2019-2021 Stichting Flarum (Flarum Foundation)
|
||||
Copyright (c) 2014-2019 Toby Zerner (toby.zerner@gmail.com)
|
||||
Copyright (c) 2017-2018 GitHub, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
58
extensions/markdown/composer.json
Normal file
58
extensions/markdown/composer.json
Normal file
@ -0,0 +1,58 @@
|
||||
{
|
||||
"name": "flarum/markdown",
|
||||
"description": "Allow posts to be formatted with Markdown.",
|
||||
"type": "flarum-extension",
|
||||
"keywords": [
|
||||
"formatting"
|
||||
],
|
||||
"license": "MIT",
|
||||
"support": {
|
||||
"issues": "https://github.com/flarum/core/issues",
|
||||
"source": "https://github.com/flarum/markdown",
|
||||
"forum": "https://discuss.flarum.org"
|
||||
},
|
||||
"homepage": "https://flarum.org",
|
||||
"funding": [
|
||||
{
|
||||
"type": "website",
|
||||
"url": "https://flarum.org/donate/"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"flarum/core": "^1.2"
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.x-dev"
|
||||
},
|
||||
"flarum-extension": {
|
||||
"title": "Markdown",
|
||||
"category": "feature",
|
||||
"icon": {
|
||||
"image": "icon.svg",
|
||||
"backgroundColor": "#000",
|
||||
"backgroundSize": "100%",
|
||||
"backgroundRepeat": "no-repeat",
|
||||
"backgroundPosition": "center",
|
||||
"color": "#fff"
|
||||
}
|
||||
},
|
||||
"flarum-cli": {
|
||||
"modules": {
|
||||
"admin": false,
|
||||
"forum": true,
|
||||
"js": true,
|
||||
"jsCommon": false,
|
||||
"css": true,
|
||||
"gitConf": true,
|
||||
"githubActions": true,
|
||||
"prettier": true,
|
||||
"typescript": false,
|
||||
"bundlewatch": false,
|
||||
"backendTesting": false,
|
||||
"editorConfig": true,
|
||||
"styleci": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
32
extensions/markdown/extend.php
Normal file
32
extensions/markdown/extend.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Flarum\Extend;
|
||||
use s9e\TextFormatter\Configurator;
|
||||
|
||||
return [
|
||||
(new Extend\Frontend('forum'))
|
||||
->js(__DIR__.'/js/dist/forum.js')
|
||||
->css(__DIR__.'/less/common.less'),
|
||||
|
||||
(new Extend\Frontend('admin'))
|
||||
->js(__DIR__.'/js/dist/admin.js')
|
||||
->css(__DIR__.'/less/common.less'),
|
||||
|
||||
(new Extend\Formatter)
|
||||
->configure(function (Configurator $config) {
|
||||
$config->Litedown;
|
||||
|
||||
// Overwrite the default inline spoiler so that it is compatible
|
||||
// with more styling for children in an external stylesheet.
|
||||
$config->tags['ispoiler']->template = '<span class="spoiler" data-s9e-livepreview-ignore-attrs="class" onclick="removeAttribute(\'class\')"><xsl:apply-templates/></span>';
|
||||
}),
|
||||
|
||||
new Extend\Locales(__DIR__.'/locale'),
|
||||
];
|
1
extensions/markdown/icon.svg
Executable file
1
extensions/markdown/icon.svg
Executable file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="208" height="128" viewBox="0 0 208 128"><path d="M30 98v-68h20l20 25 20-25h20v68h-20v-39l-20 25-20-25v39zM155 98l-30-33h20v-35h20v35h20z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 205 B |
9
extensions/markdown/js/.gitignore
vendored
Normal file
9
extensions/markdown/js/.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/sdks
|
||||
!.yarn/versions
|
||||
|
||||
node_modules
|
1
extensions/markdown/js/admin.js
Normal file
1
extensions/markdown/js/admin.js
Normal file
@ -0,0 +1 @@
|
||||
export * from './src/admin';
|
2
extensions/markdown/js/dist/admin.js
generated
vendored
Normal file
2
extensions/markdown/js/dist/admin.js
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
(()=>{var t={n:o=>{var e=o&&o.__esModule?()=>o.default:()=>o;return t.d(e,{a:e}),e},d:(o,e)=>{for(var r in e)t.o(e,r)&&!t.o(o,r)&&Object.defineProperty(o,r,{enumerable:!0,get:e[r]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},o={};(()=>{"use strict";t.r(o);const e=flarum.core.compat["admin/app"];var r=t.n(e);const i=flarum.core.compat["common/app"];var n=t.n(i);const a=flarum.core.compat["common/extend"],c=flarum.core.compat["common/components/TextEditor"];var l=t.n(c);const s=flarum.core.compat["common/utils/BasicEditorDriver"];var d=t.n(s);const u=flarum.core.compat["common/utils/styleSelectedText"];var f=t.n(u);function p(t,o){return p=Object.setPrototypeOf||function(t,o){return t.__proto__=o,t},p(t,o)}function h(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,p(t,o)}const k=flarum.core.compat["common/Component"];var y=t.n(k),b=function(t){function o(){return t.apply(this,arguments)||this}return h(o,t),o.prototype.view=function(t){return m("div",{class:"MarkdownToolbar"},t.children)},o}(y());const x=flarum.core.compat["common/helpers/icon"];var v=t.n(x);const g=flarum.core.compat["common/components/Tooltip"];var _=t.n(g),w=function(t){function o(){return t.apply(this,arguments)||this}h(o,t);var e=o.prototype;return e.oncreate=function(o){t.prototype.oncreate.call(this,o)},e.view=function(){var 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},v()(this.attrs.icon));return this.attrs.title?m(_(),{text:this.attrs.title},t):t},e.keydown=function(t){" "!==t.key&&"Enter"!==t.key||(t.preventDefault(),this.element.click())},o}(y());const T=flarum.core.compat["common/utils/ItemList"];var O=t.n(T),S=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl",I={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}},P=function(t,o){f()(o.el,I[t])};function j(t,o,e){return function(r){r.key===o&&(r.metaKey&&"⌘"===S||r.ctrlKey&&"ctrl"===S)&&(r.preventDefault(),P(t,e))}}function F(t){var o=this,e="function"==typeof t?t():new(O());function r(t,o){return n().translator.trans("flarum-markdown.lib.composer."+t+"_tooltip")+(o?" <"+S+"-"+o+">":"")}var i=function(t){return function(){return P(t,o.attrs.composer.editor)}};return e.add("header",m(w,{title:r("header"),icon:"fas fa-heading",onclick:i("header")}),1e3),e.add("bold",m(w,{title:r("bold","b"),icon:"fas fa-bold",onclick:i("bold")}),900),e.add("italic",m(w,{title:r("italic","i"),icon:"fas fa-italic",onclick:i("italic")}),800),e.add("strikethrough",m(w,{title:r("strikethrough"),icon:"fas fa-strikethrough",onclick:i("strikethrough")}),700),e.add("quote",m(w,{title:r("quote"),icon:"fas fa-quote-left",onclick:i("quote")}),600),e.add("spoiler",m(w,{title:r("spoiler"),icon:"fas fa-exclamation-triangle",onclick:i("spoiler")}),500),e.add("code",m(w,{title:r("code"),icon:"fas fa-code",onclick:i("code")}),400),e.add("link",m(w,{title:r("link"),icon:"fas fa-link",onclick:i("link")}),300),e.add("image",m(w,{title:r("image"),icon:"fas fa-image",onclick:i("image")}),200),e.add("unordered_list",m(w,{title:r("unordered_list"),icon:"fas fa-list-ul",onclick:i("unordered_list")}),100),e.add("ordered_list",m(w,{title:r("ordered_list"),icon:"fas fa-list-ol",onclick:i("ordered_list")}),0),e}r().initializers.add("flarum-markdown",(function(t){(0,a.extend)(d().prototype,"keyHandlers",(function(t){t.add("bold",j("bold","b",this)),t.add("italic",j("italic","i",this))})),l().prototype.markdownToolbarItems?(0,a.override)(l().prototype,"markdownToolbarItems",F):l().prototype.markdownToolbarItems=F,(0,a.extend)(l().prototype,"toolbarItems",(function(t){t.add("markdown",m(b,{for:this.textareaId,setShortcutHandler:function(t){return shortcutHandler=t}},this.markdownToolbarItems().toArray()),100)}))}))})(),module.exports=o})();
|
||||
//# sourceMappingURL=admin.js.map
|
1
extensions/markdown/js/dist/admin.js.map
generated
vendored
Normal file
1
extensions/markdown/js/dist/admin.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
2
extensions/markdown/js/dist/forum.js
generated
vendored
Normal file
2
extensions/markdown/js/dist/forum.js
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
(()=>{var t={n:o=>{var e=o&&o.__esModule?()=>o.default:()=>o;return t.d(e,{a:e}),e},d:(o,e)=>{for(var r in e)t.o(e,r)&&!t.o(o,r)&&Object.defineProperty(o,r,{enumerable:!0,get:e[r]})},o:(t,o)=>Object.prototype.hasOwnProperty.call(t,o),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},o={};(()=>{"use strict";t.r(o);const e=flarum.core.compat["forum/app"];var r=t.n(e);const i=flarum.core.compat["common/app"];var n=t.n(i);const a=flarum.core.compat["common/extend"],c=flarum.core.compat["common/components/TextEditor"];var l=t.n(c);const s=flarum.core.compat["common/utils/BasicEditorDriver"];var d=t.n(s);const u=flarum.core.compat["common/utils/styleSelectedText"];var f=t.n(u);function p(t,o){return p=Object.setPrototypeOf||function(t,o){return t.__proto__=o,t},p(t,o)}function h(t,o){t.prototype=Object.create(o.prototype),t.prototype.constructor=t,p(t,o)}const k=flarum.core.compat["common/Component"];var y=t.n(k),b=function(t){function o(){return t.apply(this,arguments)||this}return h(o,t),o.prototype.view=function(t){return m("div",{class:"MarkdownToolbar"},t.children)},o}(y());const x=flarum.core.compat["common/helpers/icon"];var v=t.n(x);const g=flarum.core.compat["common/components/Tooltip"];var _=t.n(g),w=function(t){function o(){return t.apply(this,arguments)||this}h(o,t);var e=o.prototype;return e.oncreate=function(o){t.prototype.oncreate.call(this,o)},e.view=function(){var 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},v()(this.attrs.icon));return this.attrs.title?m(_(),{text:this.attrs.title},t):t},e.keydown=function(t){" "!==t.key&&"Enter"!==t.key||(t.preventDefault(),this.element.click())},o}(y());const T=flarum.core.compat["common/utils/ItemList"];var O=t.n(T),S=navigator.userAgent.match(/Macintosh/)?"⌘":"ctrl",I={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}},P=function(t,o){f()(o.el,I[t])};function j(t,o,e){return function(r){r.key===o&&(r.metaKey&&"⌘"===S||r.ctrlKey&&"ctrl"===S)&&(r.preventDefault(),P(t,e))}}function F(t){var o=this,e="function"==typeof t?t():new(O());function r(t,o){return n().translator.trans("flarum-markdown.lib.composer."+t+"_tooltip")+(o?" <"+S+"-"+o+">":"")}var i=function(t){return function(){return P(t,o.attrs.composer.editor)}};return e.add("header",m(w,{title:r("header"),icon:"fas fa-heading",onclick:i("header")}),1e3),e.add("bold",m(w,{title:r("bold","b"),icon:"fas fa-bold",onclick:i("bold")}),900),e.add("italic",m(w,{title:r("italic","i"),icon:"fas fa-italic",onclick:i("italic")}),800),e.add("strikethrough",m(w,{title:r("strikethrough"),icon:"fas fa-strikethrough",onclick:i("strikethrough")}),700),e.add("quote",m(w,{title:r("quote"),icon:"fas fa-quote-left",onclick:i("quote")}),600),e.add("spoiler",m(w,{title:r("spoiler"),icon:"fas fa-exclamation-triangle",onclick:i("spoiler")}),500),e.add("code",m(w,{title:r("code"),icon:"fas fa-code",onclick:i("code")}),400),e.add("link",m(w,{title:r("link"),icon:"fas fa-link",onclick:i("link")}),300),e.add("image",m(w,{title:r("image"),icon:"fas fa-image",onclick:i("image")}),200),e.add("unordered_list",m(w,{title:r("unordered_list"),icon:"fas fa-list-ul",onclick:i("unordered_list")}),100),e.add("ordered_list",m(w,{title:r("ordered_list"),icon:"fas fa-list-ol",onclick:i("ordered_list")}),0),e}r().initializers.add("flarum-markdown",(function(t){(0,a.extend)(d().prototype,"keyHandlers",(function(t){t.add("bold",j("bold","b",this)),t.add("italic",j("italic","i",this))})),l().prototype.markdownToolbarItems?(0,a.override)(l().prototype,"markdownToolbarItems",F):l().prototype.markdownToolbarItems=F,(0,a.extend)(l().prototype,"toolbarItems",(function(t){t.add("markdown",m(b,{for:this.textareaId,setShortcutHandler:function(t){return shortcutHandler=t}},this.markdownToolbarItems().toArray()),100)}))}))})(),module.exports=o})();
|
||||
//# sourceMappingURL=forum.js.map
|
1
extensions/markdown/js/dist/forum.js.map
generated
vendored
Normal file
1
extensions/markdown/js/dist/forum.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
extensions/markdown/js/forum.js
Normal file
1
extensions/markdown/js/forum.js
Normal file
@ -0,0 +1 @@
|
||||
export * from './src/forum';
|
26
extensions/markdown/js/package.json
Normal file
26
extensions/markdown/js/package.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@flarum/markdown",
|
||||
"prettier": "@flarum/prettier-config",
|
||||
"dependencies": {
|
||||
"flarum-webpack-config": "^2.0.0",
|
||||
"webpack": "^5.65.0",
|
||||
"webpack-cli": "^4.9.1"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "webpack --mode development --watch",
|
||||
"build": "webpack --mode production",
|
||||
"format": "prettier --write src",
|
||||
"format-check": "prettier --check src",
|
||||
"analyze": "cross-env ANALYZER=true yarn build"
|
||||
},
|
||||
"packageManager": "yarn@3.1.1",
|
||||
"devDependencies": {
|
||||
"@flarum/prettier-config": "^1.0.0",
|
||||
"flarum-tsconfig": "^1.0.2",
|
||||
"prettier": "^2.5.1",
|
||||
"flarum-webpack-config": "^2.0.0",
|
||||
"webpack": "^5.65.0",
|
||||
"webpack-cli": "^4.9.1"
|
||||
}
|
||||
}
|
4
extensions/markdown/js/src/admin/index.js
Normal file
4
extensions/markdown/js/src/admin/index.js
Normal file
@ -0,0 +1,4 @@
|
||||
import app from 'flarum/admin/app';
|
||||
import { initialize } from '../common/index';
|
||||
|
||||
app.initializers.add('flarum-markdown', initialize);
|
@ -0,0 +1,36 @@
|
||||
import Component from 'flarum/common/Component';
|
||||
import icon from 'flarum/common/helpers/icon';
|
||||
import Tooltip from 'flarum/common/components/Tooltip';
|
||||
|
||||
export default class MarkdownButton extends Component {
|
||||
oncreate(vnode) {
|
||||
super.oncreate(vnode);
|
||||
}
|
||||
|
||||
view() {
|
||||
const button = (
|
||||
<button
|
||||
className="Button Button--icon Button--link"
|
||||
type="button"
|
||||
data-hotkey={this.attrs.hotkey}
|
||||
onkeydown={this.keydown.bind(this)}
|
||||
onclick={this.attrs.onclick}
|
||||
>
|
||||
{icon(this.attrs.icon)}
|
||||
</button>
|
||||
);
|
||||
|
||||
if (this.attrs.title) {
|
||||
return <Tooltip text={this.attrs.title}>{button}</Tooltip>;
|
||||
}
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
keydown(event) {
|
||||
if (event.key === ' ' || event.key === 'Enter') {
|
||||
event.preventDefault();
|
||||
this.element.click();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
import Component from 'flarum/common/Component';
|
||||
|
||||
export default class MarkdownToolbar extends Component {
|
||||
view(vnode) {
|
||||
return <div class="MarkdownToolbar">{vnode.children}</div>;
|
||||
}
|
||||
}
|
107
extensions/markdown/js/src/common/index.js
Normal file
107
extensions/markdown/js/src/common/index.js
Normal file
@ -0,0 +1,107 @@
|
||||
/*!
|
||||
* Includes modified code from GitHub Markdown Toolbar Element
|
||||
* https://github.com/github/markdown-toolbar-element/
|
||||
*
|
||||
* Original Copyright GitHub, Inc.
|
||||
* Released under the MIT license
|
||||
* https://github.com/github/markdown-toolbar-element/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
import app from 'flarum/common/app';
|
||||
import { extend, override } from 'flarum/common/extend';
|
||||
import TextEditor from 'flarum/common/components/TextEditor';
|
||||
import BasicEditorDriver from 'flarum/common/utils/BasicEditorDriver';
|
||||
import styleSelectedText from 'flarum/common/utils/styleSelectedText';
|
||||
|
||||
import MarkdownToolbar from './components/MarkdownToolbar';
|
||||
import MarkdownButton from './components/MarkdownButton';
|
||||
import ItemList from 'flarum/common/utils/ItemList';
|
||||
|
||||
const modifierKey = navigator.userAgent.match(/Macintosh/) ? '⌘' : 'ctrl';
|
||||
|
||||
const styles = {
|
||||
header: { prefix: '### ' },
|
||||
bold: { prefix: '**', suffix: '**', trimFirst: true },
|
||||
italic: { prefix: '_', suffix: '_', trimFirst: true },
|
||||
strikethrough: { prefix: '~~', suffix: '~~', trimFirst: true },
|
||||
quote: { prefix: '> ', multiline: true, surroundWithNewlines: true },
|
||||
code: { prefix: '`', suffix: '`', blockPrefix: '```', blockSuffix: '```' },
|
||||
link: { prefix: '[', suffix: '](https://)', replaceNext: 'https://', scanFor: 'https?://' },
|
||||
image: { prefix: '', replaceNext: 'https://', scanFor: 'https?://' },
|
||||
unordered_list: { prefix: '- ', multiline: true, surroundWithNewlines: true },
|
||||
ordered_list: { prefix: '1. ', multiline: true, orderedList: true },
|
||||
spoiler: { prefix: '>!', suffix: '!<', blockPrefix: '>! ', multiline: true, trimFirst: true },
|
||||
};
|
||||
|
||||
const applyStyle = (id, editorDriver) => {
|
||||
// This is a nasty hack that breaks encapsulation of the editor.
|
||||
// In future releases, we'll need to tweak the editor driver interface
|
||||
// to support triggering events like this.
|
||||
styleSelectedText(editorDriver.el, styles[id]);
|
||||
};
|
||||
|
||||
function makeShortcut(id, key, editorDriver) {
|
||||
return function (e) {
|
||||
if (e.key === key && ((e.metaKey && modifierKey === '⌘') || (e.ctrlKey && modifierKey === 'ctrl'))) {
|
||||
e.preventDefault();
|
||||
applyStyle(id, editorDriver);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function markdownToolbarItems(oldFunc) {
|
||||
const items = typeof oldFunc === 'function' ? oldFunc() : new ItemList();
|
||||
|
||||
function tooltip(name, hotkey) {
|
||||
return app.translator.trans(`flarum-markdown.lib.composer.${name}_tooltip`) + (hotkey ? ` <${modifierKey}-${hotkey}>` : '');
|
||||
}
|
||||
|
||||
const makeApplyStyle = (id) => {
|
||||
return () => applyStyle(id, this.attrs.composer.editor);
|
||||
};
|
||||
|
||||
items.add('header', <MarkdownButton title={tooltip('header')} icon="fas fa-heading" onclick={makeApplyStyle('header')} />, 1000);
|
||||
items.add('bold', <MarkdownButton title={tooltip('bold', 'b')} icon="fas fa-bold" onclick={makeApplyStyle('bold')} />, 900);
|
||||
items.add('italic', <MarkdownButton title={tooltip('italic', 'i')} icon="fas fa-italic" onclick={makeApplyStyle('italic')} />, 800);
|
||||
items.add(
|
||||
'strikethrough',
|
||||
<MarkdownButton title={tooltip('strikethrough')} icon="fas fa-strikethrough" onclick={makeApplyStyle('strikethrough')} />,
|
||||
700
|
||||
);
|
||||
items.add('quote', <MarkdownButton title={tooltip('quote')} icon="fas fa-quote-left" onclick={makeApplyStyle('quote')} />, 600);
|
||||
items.add('spoiler', <MarkdownButton title={tooltip('spoiler')} icon="fas fa-exclamation-triangle" onclick={makeApplyStyle('spoiler')} />, 500);
|
||||
items.add('code', <MarkdownButton title={tooltip('code')} icon="fas fa-code" onclick={makeApplyStyle('code')} />, 400);
|
||||
items.add('link', <MarkdownButton title={tooltip('link')} icon="fas fa-link" onclick={makeApplyStyle('link')} />, 300);
|
||||
items.add('image', <MarkdownButton title={tooltip('image')} icon="fas fa-image" onclick={makeApplyStyle('image')} />, 200);
|
||||
items.add(
|
||||
'unordered_list',
|
||||
<MarkdownButton title={tooltip('unordered_list')} icon="fas fa-list-ul" onclick={makeApplyStyle('unordered_list')} />,
|
||||
100
|
||||
);
|
||||
items.add('ordered_list', <MarkdownButton title={tooltip('ordered_list')} icon="fas fa-list-ol" onclick={makeApplyStyle('ordered_list')} />, 0);
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
export function initialize(app) {
|
||||
extend(BasicEditorDriver.prototype, 'keyHandlers', function (items) {
|
||||
items.add('bold', makeShortcut('bold', 'b', this));
|
||||
items.add('italic', makeShortcut('italic', 'i', this));
|
||||
});
|
||||
|
||||
if (TextEditor.prototype.markdownToolbarItems) {
|
||||
override(TextEditor.prototype, 'markdownToolbarItems', markdownToolbarItems);
|
||||
} else {
|
||||
TextEditor.prototype.markdownToolbarItems = markdownToolbarItems;
|
||||
}
|
||||
|
||||
extend(TextEditor.prototype, 'toolbarItems', function (items) {
|
||||
items.add(
|
||||
'markdown',
|
||||
<MarkdownToolbar for={this.textareaId} setShortcutHandler={(handler) => (shortcutHandler = handler)}>
|
||||
{this.markdownToolbarItems().toArray()}
|
||||
</MarkdownToolbar>,
|
||||
100
|
||||
);
|
||||
});
|
||||
}
|
4
extensions/markdown/js/src/forum/index.js
Normal file
4
extensions/markdown/js/src/forum/index.js
Normal file
@ -0,0 +1,4 @@
|
||||
import app from 'flarum/forum/app';
|
||||
import { initialize } from '../common/index';
|
||||
|
||||
app.initializers.add('flarum-markdown', initialize);
|
1
extensions/markdown/js/webpack.config.js
Normal file
1
extensions/markdown/js/webpack.config.js
Normal file
@ -0,0 +1 @@
|
||||
module.exports = require('flarum-webpack-config')();
|
2321
extensions/markdown/js/yarn.lock
Normal file
2321
extensions/markdown/js/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
25
extensions/markdown/less/common.less
Normal file
25
extensions/markdown/less/common.less
Normal file
@ -0,0 +1,25 @@
|
||||
.MarkdownToolbar {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
span.spoiler {
|
||||
// Style the inline spoiler itself: a dark block, invisible font
|
||||
background: #444;
|
||||
color: transparent;
|
||||
|
||||
// Try to generically hide all possible children
|
||||
* {
|
||||
// Links and other interactive elements would give their presence
|
||||
// away when hovering
|
||||
pointer-events: none;
|
||||
|
||||
// Children can have special text or background colors
|
||||
background: transparent;
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
// Hide images visually
|
||||
img {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
14
extensions/markdown/locale/en.yml
Normal file
14
extensions/markdown/locale/en.yml
Normal file
@ -0,0 +1,14 @@
|
||||
flarum-markdown:
|
||||
lib:
|
||||
composer:
|
||||
bold_tooltip: Add bold text
|
||||
code_tooltip: Insert code
|
||||
header_tooltip: Add header text
|
||||
image_tooltip: Add an image
|
||||
italic_tooltip: Add italic text
|
||||
link_tooltip: Add a link
|
||||
ordered_list_tooltip: Add a numbered list
|
||||
quote_tooltip: Insert a quote
|
||||
spoiler_tooltip: Insert a spoiler
|
||||
strikethrough_tooltip: Add strikethrough text
|
||||
unordered_list_tooltip: Add a bulleted list
|
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Flarum\Database\Migration;
|
||||
|
||||
return Migration::addSettings([
|
||||
'flarum-markdown.mdarea' => true
|
||||
]);
|
Loading…
x
Reference in New Issue
Block a user