From ab038b1f311103dc1407f5b14e87e758e3cf6bc2 Mon Sep 17 00:00:00 2001 From: ozone <802146+o-3@users.noreply.github.com> Date: Fri, 4 May 2018 00:44:22 -0400 Subject: [PATCH 1/2] Add configuration to render line breaks as
or not --- browser/components/MarkdownEditor.js | 1 + browser/components/MarkdownPreview.js | 12 ++++++++---- browser/components/MarkdownSplitEditor.js | 1 + browser/lib/markdown.js | 2 +- browser/main/lib/ConfigManager.js | 1 + browser/main/modals/PreferencesModal/UiTab.js | 11 +++++++++++ tests/fixtures/markdowns.js | 5 ++++- tests/lib/markdown-test.js | 9 +++++++++ tests/lib/snapshots/markdown-test.js.md | 14 ++++++++++++++ tests/lib/snapshots/markdown-test.js.snap | Bin 1665 -> 3060 bytes 10 files changed, 50 insertions(+), 6 deletions(-) diff --git a/browser/components/MarkdownEditor.js b/browser/components/MarkdownEditor.js index 2c98f18e..2bd5d951 100644 --- a/browser/components/MarkdownEditor.js +++ b/browser/components/MarkdownEditor.js @@ -283,6 +283,7 @@ class MarkdownEditor extends React.Component { indentSize={editorIndentSize} scrollPastEnd={config.preview.scrollPastEnd} smartQuotes={config.preview.smartQuotes} + breaks={config.preview.breaks} sanitize={config.preview.sanitize} ref='preview' onContextMenu={(e) => this.handleContextMenu(e)} diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 058dce19..9d457238 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -145,10 +145,11 @@ export default class MarkdownPreview extends React.Component { } initMarkdown () { - const { smartQuotes, sanitize } = this.props + const { smartQuotes, sanitize, breaks } = this.props this.markdown = new Markdown({ typographer: smartQuotes, - sanitize + sanitize, + breaks }) } @@ -340,7 +341,9 @@ export default class MarkdownPreview extends React.Component { componentDidUpdate (prevProps) { if (prevProps.value !== this.props.value) this.rewriteIframe() - if (prevProps.smartQuotes !== this.props.smartQuotes || prevProps.sanitize !== this.props.sanitize) { + if (prevProps.smartQuotes !== this.props.smartQuotes || + prevProps.sanitize !== this.props.sanitize || + prevProps.breaks !== this.props.breaks) { this.initMarkdown() this.rewriteIframe() } @@ -599,5 +602,6 @@ MarkdownPreview.propTypes = { value: PropTypes.string, showCopyNotification: PropTypes.bool, storagePath: PropTypes.string, - smartQuotes: PropTypes.bool + smartQuotes: PropTypes.bool, + breaks: PropTypes.bool } diff --git a/browser/components/MarkdownSplitEditor.js b/browser/components/MarkdownSplitEditor.js index 27505a5a..2bee5c24 100644 --- a/browser/components/MarkdownSplitEditor.js +++ b/browser/components/MarkdownSplitEditor.js @@ -131,6 +131,7 @@ class MarkdownSplitEditor extends React.Component { lineNumber={config.preview.lineNumber} scrollPastEnd={config.preview.scrollPastEnd} smartQuotes={config.preview.smartQuotes} + breaks={config.preview.breaks} sanitize={config.preview.sanitize} ref='preview' tabInde='0' diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index 1ef488a7..e5923790 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -25,7 +25,7 @@ class Markdown { linkify: true, html: true, xhtmlOut: true, - breaks: true, + breaks: config.preview.breaks, highlight: function (str, lang) { const delimiter = ':' const langInfo = lang.split(delimiter) diff --git a/browser/main/lib/ConfigManager.js b/browser/main/lib/ConfigManager.js index ee8a57c7..166e7181 100644 --- a/browser/main/lib/ConfigManager.js +++ b/browser/main/lib/ConfigManager.js @@ -55,6 +55,7 @@ export const DEFAULT_CONFIG = { latexBlockClose: '$$', scrollPastEnd: false, smartQuotes: true, + breaks: true, sanitize: 'STRICT' // 'STRICT', 'ALLOW_STYLES', 'NONE' }, blog: { diff --git a/browser/main/modals/PreferencesModal/UiTab.js b/browser/main/modals/PreferencesModal/UiTab.js index a607f548..42f1503c 100644 --- a/browser/main/modals/PreferencesModal/UiTab.js +++ b/browser/main/modals/PreferencesModal/UiTab.js @@ -96,6 +96,7 @@ class UiTab extends React.Component { latexBlockClose: this.refs.previewLatexBlockClose.value, scrollPastEnd: this.refs.previewScrollPastEnd.checked, smartQuotes: this.refs.previewSmartQuotes.checked, + breaks: this.refs.previewBreaks.checked, sanitize: this.refs.previewSanitize.value } } @@ -475,6 +476,16 @@ class UiTab extends React.Component { Enable smart quotes +
+ +
diff --git a/tests/fixtures/markdowns.js b/tests/fixtures/markdowns.js index 8db35485..69e335e0 100644 --- a/tests/fixtures/markdowns.js +++ b/tests/fixtures/markdowns.js @@ -48,10 +48,13 @@ const checkboxes = ` const smartQuotes = 'This is a "QUOTE".' +const breaks = 'This is the first line.\nThis is the second line.' + export default { basic, codeblock, katex, checkboxes, - smartQuotes + smartQuotes, + breaks } diff --git a/tests/lib/markdown-test.js b/tests/lib/markdown-test.js index b2a81fdf..73b68799 100644 --- a/tests/lib/markdown-test.js +++ b/tests/lib/markdown-test.js @@ -34,3 +34,12 @@ test('Markdown.render() should text with quotes correctly', t => { const renderedNonSmartQuotes = newmd.render(markdownFixtures.smartQuotes) t.snapshot(renderedNonSmartQuotes) }) + +test('Markdown.render() should render line breaks correctly', t => { + const renderedBreaks = md.render(markdownFixtures.breaks) + t.snapshot(renderedBreaks) + + const newmd = new Markdown({ breaks: false }) + const renderedNonBreaks = newmd.render(markdownFixtures.breaks) + t.snapshot(renderedNonBreaks) +}) diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md index d4f0469e..0c3e317b 100644 --- a/tests/lib/snapshots/markdown-test.js.md +++ b/tests/lib/snapshots/markdown-test.js.md @@ -73,4 +73,18 @@ Generated by [AVA](https://ava.li). > Snapshot 2 `

This is a "QUOTE".

␊ + + +## Markdown.render() should render line breaks correctly + +> Snapshot 1 + + `

This is the first line.
␊ + This is the second line.

␊ ` + +> Snapshot 2 + + `

This is the first line.␊ + This is the second line.

␊ + ` \ No newline at end of file diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap index 71ff221d9f61036d05dda745e42bdb820e08eda5..1dc64bba756effea535593a01693be463c95a26a 100644 GIT binary patch literal 3060 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 Lf>1$nsS*GH)B7ad From 83a9e5489677af66005a630e16a3da72e93dabc6 Mon Sep 17 00:00:00 2001 From: ozone <802146+o-3@users.noreply.github.com> Date: Fri, 4 May 2018 01:22:55 -0400 Subject: [PATCH 2/2] Fix snapshot --- tests/lib/snapshots/markdown-test.js.md | 28 +++++++++++----------- tests/lib/snapshots/markdown-test.js.snap | Bin 3060 -> 1724 bytes 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/lib/snapshots/markdown-test.js.md b/tests/lib/snapshots/markdown-test.js.md index 0c3e317b..ffc3d699 100644 --- a/tests/lib/snapshots/markdown-test.js.md +++ b/tests/lib/snapshots/markdown-test.js.md @@ -4,6 +4,20 @@ The actual snapshot is saved in `markdown-test.js.snap`. Generated by [AVA](https://ava.li). +## Markdown.render() should render line breaks correctly + +> Snapshot 1 + + `

This is the first line.
␊ + This is the second line.

␊ + ` + +> Snapshot 2 + + `

This is the first line.␊ + This is the second line.

␊ + ` + ## Markdown.render() should renders KaTeX correctly > Snapshot 1 @@ -73,18 +87,4 @@ Generated by [AVA](https://ava.li). > Snapshot 2 `

This is a "QUOTE".

␊ - - -## Markdown.render() should render line breaks correctly - -> Snapshot 1 - - `

This is the first line.
␊ - This is the second line.

␊ ` - -> Snapshot 2 - - `

This is the first line.␊ - This is the second line.

␊ - ` \ No newline at end of file diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap index 1dc64bba756effea535593a01693be463c95a26a..fc310cfd28f22b2e7d20fa14c94bd5f9b806b0fd 100644 GIT binary patch delta 1717 zcmV;m21@z#7rYIS8-LzrqAWHj5g&^P00000000y1S4)T-MHuc~#Dpkl)EsgvTUJ5S z)AQKP&L%UB`^cKajfv)ol1Oz=?RM>SclB0P?_{E4@DT(bL4<(f18*Kff+tbDh~PmC z2qGdvPI}T)Jc<5Q-P1cWnSE%YCkLjx=6`(utLm?RE*XY#tAFv$=53d+eEZD#(xo5m z7`Ezr3oE*~B*ESo*-JjKeu3x$E+!rssy#3l6 zv-b{Z>JN7s#^Udrf88Rle){3p$3EY3`!73&H1&h6hH>hRVpSjPrZF2xO8f1+hu=PQ$_au628O6ChgtOEyi8L=Qq{-5^7+H zt$;?PZk9|$8+G$I2|N}OOEPPUF(D%+iRoliBpJ%7_ttE`1au$Bo(@nM1LJg^xFq-z6w^#V1>?e3=Xtt zL;7`dY-iB~9lGGlx>+fWnMiQ2Zu(NjVwY{VTCGBxB{FeI0sOW}=#qv#S6q7R(41Hf z+Xqaf;atWWgx5^~!$H7W^GOg0j}sC(H9NI{i6`kYm2C@04GSE^ z*-r?)SQ#brgt$c&EVg;uZ%H5)_J;O}6k7pU|TS39h+_Z_rz zdv=R9sXZOAq+uOyM;?t9w5L-LXcDU$0|#Xsbbmh%IzyapcfLM?KVLE$ROKmX$3Ta|gRT0)&DAUqONwtvDx?%VBEUQYZGc?U2Sj*Jv zJZB-Q3CUTs;B;hac1GwqXE$D$M@iddm_u!R#-*1?NJfW-a@x%>6XIA{G_v-cLi;DWRQT&;M>ROE6?BI9N)LIO2!A^VI~?QahQPdN1#H?^O=P{gtpTQ!dVjcN8WQg|76r+xDdSn3sE;cIDal^ z8XgBI=Zu?9O+fZK+(aUO|=1#}c>-c^86AOT*-LwtsVoAV)}9B9KcAB06+apb*FCmEtbBZmWHh&rp3n!364PZ7$UK>4~}%GD$W)O)Qh zfCu8hNfe3Or?(7Ovb5wtYJWS{)Quhut(b|z^tsEb6iTHE@cQ#J)+L`AiU%ITa$$V+ zQ%BFJ`J2PND=qjzb|UqxpinB^fyv4^{f&R)ufMnV`#!7heV0b2>VK^Ns*!beko*4* z`Y(3S`mf$`;$x#T`*j?VSTyG#srw`e!ABa!aQn!13_*K7@tQ6>oer3tUsl+oUK{f- LnAZa9c@qEtkRLub literal 3060 zcmZ8jTT@e46b^z71V%0aBm@YAt0=c{Q6LCGAPE;y10<1)2DwC#Yc7ZoV@KPW&gesZ zw6=CSbz0kL`_N7woN;{6b{u@rGVM&A4&y^RZJ*k|(C=fNo~X{Z*80}o=bY@l*0(p> zMr?(yMc;D3zZ5JC*XiOk=Dgu$`>-i>@!y9JW?+Y!D$-4eiJIMidQf*CTwZq${P^Q* z6@F%`2S-P2Aa9_oUIw1rdVB-y&-ZRRLW3Y-Sa1z)WEgG=HVI2lFvY$Rzf^DxW928| z1h$k!v$^y5C1ftE4DoHCl|K{VLdvx=0w3Ls(P{(uikgEgND_Ny`!2UB*g!~utw-T} z3FSvyHeS91S~JEOAQ0f<^CW?9GQ#cLf#VxzV1oTMDh1&~z`pZvscX5C!Sfw6?6Nun zaul`-t7(O6fT`d<&hdF*0yZZUev!`tk8Z(5g!7|57{8?=nN5iB8^JlQW;*I|b<1pq z1o$$QRe_C5c348j+*x(D2aIy*?=prEjwD&LGx{v^pmjyX%15S#N(@`~Fa%t9Eg<2` ztGfF96Np?5FkiC$F@mmcsmXH?q=#B8ruudrqQLJ&EXk6jE1wylU4qk%z$vQ?r0hfD zr=UWC3$q9b`EbC~``!b>9LtDY$|)G-NQs<=b;3$5E6zAX!1?#hciY@!l;QK+9)4Hb zFEe8ZN{)(8(7jK5`pEhO7@$%=RfxipWV6rSY=sI?d0^*gxw zyg985vIYQ4s%tc|jsn(qzfirKn-b(B1U7ien_z8B0bl;2y#O&=QdgRvV#|%!PUi*N zSxBG)W)#Zx7D=>tf(A%G3pzT$z`_*yo+eG7GQy7QAm!|50~%?|-iMH1Wh zeKK$ep%+%qeVX~Qz&cw5k_7Y0KyYdeuPsk)E98_BHZ98o0pUT$5jIqOr22icAj8?3BjKi&r2oz&y}xa z@Y(wjkd@d?!<1Jvz^)aB~aoid4bJi{Ywa^}pPM7x1Cts!9sp=wh+0JhlK8)&^Vg=o!2j zaCTULvi|>1R2sM@`Q+iYBh~)g0&T@#*FQKuz|ytAxc6Q0DaG+-QR%h3zb0&O0)AJw zt{fT}a&(y}4S?HKp`52aN(4B>URi{DS%xlNw;dFxHq0a0o6|rI1AZz6I47aBd7)8Q zyaaeEm*7Z;q=rCQTg&RuD(5|uMtY{%OA}AYk)>fYfkHEIswnEs7a+)`} z;!2o6DNG*KH8!3#Uup=;1m#uCMbxk$iClCQtSOge6Yw&m;FbqV*%8WwR}c>+@axyy zB*0gP6fw8+?FHqclIf?PPWjsV!B4yw>h>DYQH&~ol(9Oev?v1ovsHz_dWZZxg#8I`2Qh`6s}!fhUNPb!`D$kZgy)Tu)3@%Yo%QL&P?#%K7&hf!wEX(qOD**-zdSj|z(*^r(YELW%;Au~9X# z6dCU^9to}}#D?wO))W{}k_2bZgfHree+1ehJBwkKkrsUX^jKab`VMy^ON8c?<=c sJEDuj5iorNuXDfw(>2DrGG?=~fq)AZdh)HYd%_4tl>>WV>w1mmKX*}