mirror of https://github.com/status-im/codimd.git
Initial support for markdownlint
Signed-off-by: Yukai Huang <yukaihuangtw@gmail.com>
This commit is contained in:
parent
85fc41c350
commit
6ddf872dec
|
@ -94,6 +94,7 @@
|
||||||
"markdown-it-sub": "~1.0.0",
|
"markdown-it-sub": "~1.0.0",
|
||||||
"markdown-it-sup": "~1.0.0",
|
"markdown-it-sup": "~1.0.0",
|
||||||
"markdown-pdf": "~9.0.0",
|
"markdown-pdf": "~9.0.0",
|
||||||
|
"markdownlint": "^0.16.0",
|
||||||
"mathjax": "~2.7.5",
|
"mathjax": "~2.7.5",
|
||||||
"mattermost-redux": "~5.13.0",
|
"mattermost-redux": "~5.13.0",
|
||||||
"mermaid": "~8.2.3",
|
"mermaid": "~8.2.3",
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 193 B |
Binary file not shown.
After Width: | Height: | Size: 126 B |
Binary file not shown.
After Width: | Height: | Size: 215 B |
Binary file not shown.
After Width: | Height: | Size: 194 B |
Binary file not shown.
After Width: | Height: | Size: 233 B |
|
@ -3,6 +3,7 @@ import * as utils from './utils'
|
||||||
import config from './config'
|
import config from './config'
|
||||||
import statusBarTemplate from './statusbar.html'
|
import statusBarTemplate from './statusbar.html'
|
||||||
import toolBarTemplate from './toolbar.html'
|
import toolBarTemplate from './toolbar.html'
|
||||||
|
import './markdown-lint'
|
||||||
|
|
||||||
/* config section */
|
/* config section */
|
||||||
const isMac = CodeMirror.keyMap.default === CodeMirror.keyMap.macDefault
|
const isMac = CodeMirror.keyMap.default === CodeMirror.keyMap.macDefault
|
||||||
|
@ -552,6 +553,7 @@ export default class Editor {
|
||||||
this.editor = CodeMirror.fromTextArea(textit, {
|
this.editor = CodeMirror.fromTextArea(textit, {
|
||||||
mode: defaultEditorMode,
|
mode: defaultEditorMode,
|
||||||
backdrop: defaultEditorMode,
|
backdrop: defaultEditorMode,
|
||||||
|
lint: true,
|
||||||
keyMap: 'sublime',
|
keyMap: 'sublime',
|
||||||
viewportMargin: viewportMargin,
|
viewportMargin: viewportMargin,
|
||||||
styleActiveLine: true,
|
styleActiveLine: true,
|
||||||
|
@ -573,7 +575,8 @@ export default class Editor {
|
||||||
gutters: [
|
gutters: [
|
||||||
'CodeMirror-linenumbers',
|
'CodeMirror-linenumbers',
|
||||||
'authorship-gutters',
|
'authorship-gutters',
|
||||||
'CodeMirror-foldgutter'
|
'CodeMirror-foldgutter',
|
||||||
|
'CodeMirror-lint-markers'
|
||||||
],
|
],
|
||||||
extraKeys: this.defaultExtraKeys,
|
extraKeys: this.defaultExtraKeys,
|
||||||
flattenSpans: true,
|
flattenSpans: true,
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
import markdownlint from 'markdownlint'
|
||||||
|
|
||||||
|
// load lint plugin explicitly
|
||||||
|
import 'script-loader!@hackmd/codemirror/addon/lint/lint'
|
||||||
|
import './lint.css'
|
||||||
|
|
||||||
|
(function(mod) {
|
||||||
|
mod(CodeMirror);
|
||||||
|
})(function(CodeMirror) {
|
||||||
|
function validator(text, options) {
|
||||||
|
return lint(text).map(error => {
|
||||||
|
const lineNumber = error.lineNumber - 1
|
||||||
|
|
||||||
|
let start, end
|
||||||
|
if (error.errorRange) {
|
||||||
|
start = error.errorRange[0] - 1
|
||||||
|
end = error.errorRange[1] - 1
|
||||||
|
} else {
|
||||||
|
start = 0
|
||||||
|
end = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: error.ruleDescription,
|
||||||
|
severity: 'error',
|
||||||
|
from: CodeMirror.Pos(lineNumber, start),
|
||||||
|
to: CodeMirror.Pos(lineNumber, end)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
CodeMirror.registerHelper('lint', 'markdown', validator);
|
||||||
|
});
|
||||||
|
|
||||||
|
function lint (content) {
|
||||||
|
const { content: errors } = markdownlint.sync({
|
||||||
|
strings: {
|
||||||
|
content
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return errors
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/* The lint marker gutter */
|
||||||
|
.CodeMirror-lint-markers {
|
||||||
|
width: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-tooltip {
|
||||||
|
background-color: #ffd;
|
||||||
|
border: 1px solid black;
|
||||||
|
border-radius: 4px 4px 4px 4px;
|
||||||
|
color: black;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 10pt;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 2px 5px;
|
||||||
|
position: fixed;
|
||||||
|
white-space: pre;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
z-index: 100;
|
||||||
|
max-width: 600px;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity .4s;
|
||||||
|
-moz-transition: opacity .4s;
|
||||||
|
-webkit-transition: opacity .4s;
|
||||||
|
-o-transition: opacity .4s;
|
||||||
|
-ms-transition: opacity .4s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
|
||||||
|
background-position: left bottom;
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-mark-error {
|
||||||
|
background-image: url(/images/lint/mark-error.png);
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-mark-warning {
|
||||||
|
background-image: url(/images/lint/mark-warning.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
vertical-align: middle;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
|
||||||
|
padding-left: 18px;
|
||||||
|
background-position: top left;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
|
||||||
|
background-image: url(/images/lint/message-error.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
|
||||||
|
background-image: url(/images/lint/message-warning.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
.CodeMirror-lint-marker-multiple {
|
||||||
|
background-image: url(/images/lint/mark-multiple.png);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right bottom;
|
||||||
|
width: 100%; height: 100%;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
exports.URL = window.URL
|
|
@ -167,7 +167,11 @@ module.exports = {
|
||||||
to: 'reveal.js/plugin'
|
to: 'reveal.js/plugin'
|
||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
new MiniCssExtractPlugin()
|
new MiniCssExtractPlugin(),
|
||||||
|
new webpack.NormalModuleReplacementPlugin(
|
||||||
|
/^url$/,
|
||||||
|
path.resolve(__dirname, './public/js/url.js')
|
||||||
|
)
|
||||||
],
|
],
|
||||||
|
|
||||||
entry: {
|
entry: {
|
||||||
|
@ -374,7 +378,8 @@ module.exports = {
|
||||||
'js-sequence-diagrams': path.join(__dirname, 'node_modules/@hackmd/js-sequence-diagrams/build/main.js'),
|
'js-sequence-diagrams': path.join(__dirname, 'node_modules/@hackmd/js-sequence-diagrams/build/main.js'),
|
||||||
vega: path.join(__dirname, 'node_modules/vega/build/vega.min.js'),
|
vega: path.join(__dirname, 'node_modules/vega/build/vega.min.js'),
|
||||||
'vega-lite': path.join(__dirname, 'node_modules/vega-lite/build/vega-lite.min.js'),
|
'vega-lite': path.join(__dirname, 'node_modules/vega-lite/build/vega-lite.min.js'),
|
||||||
'vega-embed': path.join(__dirname, 'node_modules/vega-embed/build/vega-embed.min.js')
|
'vega-embed': path.join(__dirname, 'node_modules/vega-embed/build/vega-embed.min.js'),
|
||||||
|
'markdown-it': path.join(__dirname, 'node_modules/markdown-it/dist/markdown-it.js')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -7890,7 +7890,7 @@ markdown-it-sup@~1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3"
|
resolved "https://registry.yarnpkg.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3"
|
||||||
integrity sha1-y5yf+RpSVawI8/09YyhuFd8KH8M=
|
integrity sha1-y5yf+RpSVawI8/09YyhuFd8KH8M=
|
||||||
|
|
||||||
markdown-it@~9.0.1:
|
markdown-it@9.0.1, markdown-it@~9.0.1:
|
||||||
version "9.0.1"
|
version "9.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-9.0.1.tgz#aafe363c43718720b6575fd10625cde6e4ff2d47"
|
resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-9.0.1.tgz#aafe363c43718720b6575fd10625cde6e4ff2d47"
|
||||||
integrity sha512-XC9dMBHg28Xi7y5dPuLjM61upIGPJG8AiHNHYqIaXER2KNnn7eKnM5/sF0ImNnyoV224Ogn9b1Pck8VH4k0bxw==
|
integrity sha512-XC9dMBHg28Xi7y5dPuLjM61upIGPJG8AiHNHYqIaXER2KNnn7eKnM5/sF0ImNnyoV224Ogn9b1Pck8VH4k0bxw==
|
||||||
|
@ -7921,6 +7921,13 @@ markdown-table@^1.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60"
|
resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60"
|
||||||
integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==
|
integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==
|
||||||
|
|
||||||
|
markdownlint@^0.16.0:
|
||||||
|
version "0.16.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.16.0.tgz#69f73cc755a44231fbe5dc7c37a5909cedc0ac6e"
|
||||||
|
integrity sha512-Zo+iPezP3eM6lLhKepkUw+X98H44lipIdx4d6faaugfB0+7VuDB3R0hXmx7z9F1N3/ypn46oOFgAD9iF++Ie6A==
|
||||||
|
dependencies:
|
||||||
|
markdown-it "9.0.1"
|
||||||
|
|
||||||
marked@~0.6.2:
|
marked@~0.6.2:
|
||||||
version "0.6.3"
|
version "0.6.3"
|
||||||
resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946"
|
resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946"
|
||||||
|
|
Loading…
Reference in New Issue