diff --git a/browser/components/MarkdownEditor.js b/browser/components/MarkdownEditor.js index 4c195797..70df16a0 100644 --- a/browser/components/MarkdownEditor.js +++ b/browser/components/MarkdownEditor.js @@ -250,7 +250,7 @@ class MarkdownEditor extends React.Component { : 'codeEditor--hide' } ref='code' - mode='GitHub Flavored Markdown' + mode='Boost Flavored Markdown' value={value} theme={config.editor.theme} keyMap={config.editor.keyMap} diff --git a/browser/components/MarkdownSplitEditor.js b/browser/components/MarkdownSplitEditor.js index ddc9d7e0..d714125a 100644 --- a/browser/components/MarkdownSplitEditor.js +++ b/browser/components/MarkdownSplitEditor.js @@ -145,7 +145,7 @@ class MarkdownSplitEditor extends React.Component { styleName='codeEditor' ref='code' width={this.state.codeEditorWidthInPercent + '%'} - mode='GitHub Flavored Markdown' + mode='Boost Flavored Markdown' value={value} theme={config.editor.theme} keyMap={config.editor.keyMap} diff --git a/extra_scripts/codemirror/mode/bfm/bfm.css b/extra_scripts/codemirror/mode/bfm/bfm.css new file mode 100644 index 00000000..cb6fd638 --- /dev/null +++ b/extra_scripts/codemirror/mode/bfm/bfm.css @@ -0,0 +1,44 @@ +.cm-table-row-even { background-color: rgb(242, 242, 242); } +.cm-s-3024-day.CodeMirror .cm-table-row-even { background-color: rgb(238, 237, 237); } +.cm-s-3024-night.CodeMirror .cm-table-row-even { background-color: rgb(30, 24, 21); } +.cm-s-abcdef.CodeMirror .cm-table-row-even { background-color: rgb(36, 39, 37); } +.cm-s-ambiance.CodeMirror .cm-table-row-even { background-color: rgb(242, 242, 242); } +.cm-s-base16-dark.CodeMirror .cm-table-row-even { background-color: rgb(41, 41, 41); } +.cm-s-base16-light.CodeMirror .cm-table-row-even { background-color: rgb(234, 234, 234); } +.cm-s-bespin.CodeMirror .cm-table-row-even { background-color: rgb(52, 45, 40); } +.cm-s-blackboard.CodeMirror .cm-table-row-even { background-color: rgb(36, 39, 55); } +.cm-s-cobalt.CodeMirror .cm-table-row-even { background-color: rgb(26, 56, 83); } +.cm-s-colorforth.CodeMirror .cm-table-row-even { background-color: rgb(25, 25, 25); } +.cm-s-darcula.CodeMirror .cm-table-row-even { background-color: rgb(56, 57, 59); } +.cm-s-dracula.CodeMirror .cm-table-row-even { background-color: rgb(61, 63, 73); } +.cm-s-duotone-dark.CodeMirror .cm-table-row-even { background-color: rgb(49, 45, 60); } +.cm-s-duotone-light.CodeMirror .cm-table-row-even { background-color: rgb(246, 243, 238); } +.cm-s-erlang-dark.CodeMirror .cm-table-row-even { background-color: rgb(26, 56, 83); } +.cm-s-gruvbox-dark.CodeMirror .cm-table-row-even { background-color: rgb(55, 53, 51); } +.cm-s-hopscotch.CodeMirror .cm-table-row-even { background-color: rgb(66, 58, 65); } +.cm-s-isotope.CodeMirror .cm-table-row-even { background-color: rgb(22, 22, 22); } +.cm-s-lesser-dark.CodeMirror .cm-table-row-even { background-color: rgb(58, 58, 57); } +.cm-s-liquibyte.CodeMirror .cm-table-row-even { background-color: rgb(26, 26, 26); } +.cm-s-lucario.CodeMirror .cm-table-row-even { background-color: rgb(64, 81, 96); } +.cm-s-material.CodeMirror .cm-table-row-even { background-color: rgb(58, 69, 74); } +.cm-s-mbo.CodeMirror .cm-table-row-even { background-color: rgb(65, 65, 63); } +.cm-s-midnight.CodeMirror .cm-table-row-even { background-color: rgb(34, 46, 63); } +.cm-s-monokai.CodeMirror .cm-table-row-even { background-color: rgb(60, 61, 55); } +.cm-s-neo.CodeMirror .cm-table-row-even { background-color: rgb(245, 245, 245); } +.cm-s-night.CodeMirror .cm-table-row-even { background-color: rgb(34, 25, 53); } +.cm-s-oceanic-next.CodeMirror .cm-table-row-even { background-color: rgb(68, 83, 89); } +.cm-s-paraiso-dark.CodeMirror .cm-table-row-even { background-color: rgb(61, 45, 59); } +.cm-s-paraiso-light.CodeMirror .cm-table-row-even { background-color: rgb(223, 224, 211); } +.cm-s-pastel-on-dark.CodeMirror .cm-table-row-even { background-color: rgb(54, 51, 49); } +.cm-s-railscasts.CodeMirror .cm-table-row-even { background-color: rgb(63, 63, 62); } +.cm-s-rubyblue.CodeMirror .cm-table-row-even { background-color: rgb(41, 58, 73); } +.cm-s-seti.CodeMirror .cm-table-row-even { background-color: rgb(40, 42, 43); } +.cm-s-shadowfox.CodeMirror .cm-table-row-even { background-color: rgb(56, 56, 59); } +.cm-s-solarized.CodeMirror .cm-table-row-even { background-color: rgb(242, 242, 242); } +.cm-s-the-matrix.CodeMirror .cm-table-row-even { background-color: rgb(0, 26, 0); } +.cm-s-tomorrow-night-bright.CodeMirror .cm-table-row-even { background-color: rgb(23, 23, 23); } +.cm-s-tomorrow-night-eighties.CodeMirror .cm-table-row-even { background-color: rgb(20, 20, 20); } +.cm-s-twilight.CodeMirror .cm-table-row-even { background-color: rgb(43, 43, 43); } +.cm-s-vibrant-ink.CodeMirror .cm-table-row-even { background-color: rgb(26, 26, 26); } +.cm-s-xq-dark.CodeMirror .cm-table-row-even { background-color: rgb(34, 25, 53); } +.cm-s-yeti.CodeMirror .cm-table-row-even { background-color: rgb(235, 232, 230); } \ No newline at end of file diff --git a/extra_scripts/codemirror/mode/bfm/bfm.js b/extra_scripts/codemirror/mode/bfm/bfm.js new file mode 100644 index 00000000..1cd9e87c --- /dev/null +++ b/extra_scripts/codemirror/mode/bfm/bfm.js @@ -0,0 +1,71 @@ +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../codemirror/lib/codemirror"), require("../codemirror/mode/gfm/gfm")) + else if (typeof define == "function" && define.amd) // AMD + define(["../codemirror/lib/codemirror", "../codemirror/mode/gfm/gfm"], mod) + else // Plain browser env + mod(CodeMirror) +})(function(CodeMirror) { + 'use strict' + + CodeMirror.defineMode('bfm', function(config, gfmConfig) { + const bfmOverlay = { + startState() { + return { + inTable: false, + rowIndex: 0 + } + }, + copyState(s) { + return { + inTable: s.inTable, + rowIndex: s.rowIndex + } + }, + token(stream, state) { + state.combineTokens = true + + if (state.inTable) { + if (stream.match(/^\|/)) { + ++state.rowIndex + + stream.skipToEnd() + + if (state.rowIndex === 1) { + return 'table table-separator' + } else if (state.rowIndex % 2 === 0) { + return 'table table-row table-row-even' + } else { + return 'table table-row table-row-odd' + } + } else { + state.inTable = false + + stream.skipToEnd() + return null + } + } else if (stream.match(/^\|/)) { + state.inTable = true + state.rowIndex = 0 + + stream.skipToEnd() + return 'table table-header' + } + + stream.skipToEnd() + return null + } + } + + gfmConfig.name = 'gfm' + return CodeMirror.overlayMode(CodeMirror.getMode(config, gfmConfig), bfmOverlay) + }) + + CodeMirror.defineMIME('text/x-bfm', 'bfm') + + CodeMirror.modeInfo.push({ + name: "Boost Flavored Markdown", + mime: "text/x-bfm", + mode: "bfm" + }) +}) \ No newline at end of file diff --git a/gruntfile.js b/gruntfile.js index 5683adda..651640fc 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -1,3 +1,4 @@ +const fs = require('fs') const path = require('path') const ChildProcess = require('child_process') const packager = require('electron-packager') @@ -284,5 +285,48 @@ module.exports = function (grunt) { } }) + grunt.registerTask('bfm', function () { + const Color = require('color') + const parseCSS = require('css').parse + + const root = path.join(__dirname, 'node_modules/codemirror/theme/') + + const colors = fs.readdirSync(root).map(file => { + const css = parseCSS(fs.readFileSync(path.join(root, file), 'utf8')) + + const rules = css.stylesheet.rules.filter(rule => rule.selectors && /\b\.CodeMirror$/.test(rule.selectors[0])) + if (rules.length === 1) { + let bgColor = Color('white') + let fgColor = Color('black') + + rules[0].declarations.forEach(declaration => { + if (declaration.property === 'background-color' || declaration.property === 'background') { + bgColor = Color(declaration.value.split(' ')[0]) + } else if (declaration.property === 'color') { + const value = /^(.*?)(?:\s*!important)?$/.exec(declaration.value)[1] + let match = /^rgba\((.*?),\s*1\)$/.exec(value) + if (match) { + fgColor = Color(`rgb(${match[1]})`) + } else { + fgColor = Color(value) + } + } + }) + + if (bgColor.isLight()) { + bgColor = bgColor.mix(fgColor, 0.05) + } else { + bgColor = bgColor.mix(fgColor, 0.1) + } + + return `${rules[0].selectors[0]} .cm-table-row-even { background-color: ${bgColor.rgb().string()}; }` + } + }).filter(value => !!value) + + const defaultBgColor = Color('white').mix(Color('black'), 0.05) + + fs.writeFileSync(path.join(__dirname, 'extra_scripts/codemirror/mode/bfm/bfm.css'), [`.cm-table-row-even { background-color: ${defaultBgColor.rgb().string()}; }`, ...colors].join('\n'), 'utf8') + }) + grunt.registerTask('default', ['build']) } diff --git a/lib/main.html b/lib/main.html index 663c1d23..65c540a3 100644 --- a/lib/main.html +++ b/lib/main.html @@ -10,6 +10,7 @@ +