From f904fd00e5e57f1e6366a0a8f42f30d280457539 Mon Sep 17 00:00:00 2001 From: Rokt33r Date: Wed, 4 May 2016 00:47:22 +0900 Subject: [PATCH] add code block line numbering option to --- browser/components/MarkdownPreview.js | 10 ++++++---- browser/lib/markdown.js | 14 +++++++------- browser/main/modal/Preference/AppSettingTab.js | 16 ++++++++++++++-- browser/styles/main/ArticleDetail.styl | 3 +++ browser/styles/mixins/marked.styl | 9 ++++----- lib/config.js | 3 ++- 6 files changed, 36 insertions(+), 19 deletions(-) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 5d10cca8..f4c00971 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -21,7 +21,7 @@ const sanitizeOpts = { 'a': ['lineAnchor'], 'div': ['math'], 'pre': ['hljs'], - 'span': ['math', 'hljs-*'], + 'span': ['math', 'hljs-*', 'lineNumber'], 'code': ['language-*'] }, allowedAttributes: { @@ -91,7 +91,8 @@ export default class MarkdownPreview extends React.Component { this.state = { fontSize: config['preview-font-size'], - fontFamily: config['preview-font-family'] + fontFamily: config['preview-font-family'], + lineNumber: config['preview-line-number'] } } componentDidMount () { @@ -182,7 +183,8 @@ export default class MarkdownPreview extends React.Component { handleConfigApply (e, config) { this.setState({ fontSize: config['preview-font-size'], - fontFamily: config['preview-font-family'] + fontFamily: config['preview-font-family'], + lineNumber: config['preview-line-number'] }) } @@ -196,7 +198,7 @@ export default class MarkdownPreview extends React.Component { return (
this.handleClick(e)} onDoubleClick={e => this.handleDoubleClick(e)} onMouseDown={e => this.handleMouseDown(e)} diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 6a24cbd6..d8636f8e 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -3,14 +3,14 @@ import emoji from 'markdown-it-emoji' import math from '@rokt33r/markdown-it-math' import hljs from 'highlight.js' -var createGutter = function (str) { - var lc = (str.match(/\n/g) || []).length; - var lines = []; - for (var i = 1; i <= lc; i++) { - lines.push('' + i + ''); +function createGutter (str) { + let lc = (str.match(/\n/g) || []).length + let lines = [] + for (let i = 1; i <= lc; i++) { + lines.push('' + i + '') } - return '' + lines.join('') + ''; -}; + return '' + lines.join('') + '' +} var md = markdownit({ typographer: true, diff --git a/browser/main/modal/Preference/AppSettingTab.js b/browser/main/modal/Preference/AppSettingTab.js index c44675a8..36410ef8 100644 --- a/browser/main/modal/Preference/AppSettingTab.js +++ b/browser/main/modal/Preference/AppSettingTab.js @@ -81,9 +81,18 @@ export default class AppSettingTab extends React.Component { } } + handleLineNumberingClick (e) { + let config = this.state.config + + config['preview-line-number'] = e.target.checked + this.setState({ + config + }) + } + handleDisableDirectWriteClick (e) { let config = this.state.config - config['disable-direct-write'] = !config['disable-direct-write'] + config['disable-direct-write'] = e.target.checked this.setState({ config }) @@ -174,11 +183,14 @@ export default class AppSettingTab extends React.Component {
+
+ +
{ global.process.platform === 'win32' ? (
- +
) : null diff --git a/browser/styles/main/ArticleDetail.styl b/browser/styles/main/ArticleDetail.styl index 9c897eb0..bcf9edeb 100644 --- a/browser/styles/main/ArticleDetail.styl +++ b/browser/styles/main/ArticleDetail.styl @@ -382,6 +382,9 @@ infoButton() color lighten(inactiveTextColor, 10%) user-select none font-size 14px + &.lineNumbered + .lineNumber + display block .CodeEditor absolute top left right bottom border-top solid 1px borderColor diff --git a/browser/styles/mixins/marked.styl b/browser/styles/mixins/marked.styl index 94b5f508..7b79c1a1 100644 --- a/browser/styles/mixins/marked.styl +++ b/browser/styles/mixins/marked.styl @@ -135,19 +135,18 @@ marked() &>pre border none margin -5px - &>span + &>span.lineNumber font-family Monaco, Menlo, 'Ubuntu Mono', Consolas, source-code-pro, monospace - display block + display none float left margin 0 0.5em 0 -0.5em border-right 1px solid text-align right + font-size 0.9em + line-height 1.65em &>span display block padding 0 .5em 0 1em - &>.cl - display block - clear both table width 100% margin 15px 0 25px diff --git a/lib/config.js b/lib/config.js index 8e631e47..d4a42d80 100644 --- a/lib/config.js +++ b/lib/config.js @@ -15,7 +15,8 @@ const defaultConfig = { 'disable-direct-write': false, 'theme-ui': 'light', 'theme-code': 'xcode', - 'theme-syntax': 'xcode' + 'theme-syntax': 'xcode', + 'preview-line-number': false } const configFile = 'config.json'