From 54f757bbe70a697c0751ebf0ab70b2c7f49b1872 Mon Sep 17 00:00:00 2001 From: Winston Liu <50Wliu@users.noreply.github.com> Date: Thu, 23 May 2019 18:26:26 -0400 Subject: [PATCH] autoflow: Do not reflow selections that contain only LaTeX tags --- packages/autoflow/lib/autoflow.coffee | 20 ++- packages/autoflow/spec/autoflow-spec.coffee | 143 +++++++++++--------- 2 files changed, 91 insertions(+), 72 deletions(-) diff --git a/packages/autoflow/lib/autoflow.coffee b/packages/autoflow/lib/autoflow.coffee index 656d800e43e..e9e85df01cf 100644 --- a/packages/autoflow/lib/autoflow.coffee +++ b/packages/autoflow/lib/autoflow.coffee @@ -60,15 +60,25 @@ module.exports = latexTagRegex = /^\s*\\\w+(\[.*\])?\{\w+\}(\[.*\])?\s*$/g # e.g. \begin{verbatim} latexTagStartRegex = /^\s*\\\w+\s*\{\s*$/g # e.g. \item{ latexTagEndRegex = /^\s*\}\s*$/g # e.g. } - while blockLines[0].match(latexTagRegex) or - blockLines[0].match(latexTagStartRegex) + while blockLines.length > 0 and ( + blockLines[0].match(latexTagRegex) or + blockLines[0].match(latexTagStartRegex)) beginningLinesToIgnore.push(blockLines[0]) blockLines.shift() - while blockLines[blockLines.length - 1].match(latexTagRegex) or - blockLines[blockLines.length - 1].match(latexTagEndRegex) + while blockLines.length > 0 and ( + blockLines[blockLines.length - 1].match(latexTagRegex) or + blockLines[blockLines.length - 1].match(latexTagEndRegex)) endingLinesToIgnore.unshift(blockLines[blockLines.length - 1]) blockLines.pop() + # The paragraph might be a LaTeX section with no text, only tags: + # \documentclass{article} + # In that case, we have nothing to reflow. + # Push the tags verbatim and continue to the next paragraph. + unless blockLines.length > 0 + paragraphs.push(block) + continue + # TODO: this could be more language specific. Use the actual comment char. # Remember that `-` has to be the last character in the character class. linePrefix = blockLines[0].match(/^\s*(\/\/|\/\*|;;|#'|\|\|\||--|[#%*>-])?\s*/g)[0] @@ -112,7 +122,7 @@ module.exports = wrappedLines = beginningLinesToIgnore.concat(lines.concat(endingLinesToIgnore)) paragraphs.push(wrappedLines.join('\n').replace(/\s+\n/g, '\n')) - leadingVerticalSpace + paragraphs.join('\n\n') + trailingVerticalSpace + return leadingVerticalSpace + paragraphs.join('\n\n') + trailingVerticalSpace getTabLength: (editor) -> atom.config.get('editor.tabLength', scope: editor.getRootScopeDescriptor()) ? 2 diff --git a/packages/autoflow/spec/autoflow-spec.coffee b/packages/autoflow/spec/autoflow-spec.coffee index 3e132305d29..c302042c106 100644 --- a/packages/autoflow/spec/autoflow-spec.coffee +++ b/packages/autoflow/spec/autoflow-spec.coffee @@ -561,70 +561,79 @@ describe "Autoflow package", -> expect(autoflow.reflow(test, wrapColumn: 80)).toEqual res - it 'properly reflows text around LaTeX tags', -> - text = - ''' - \\begin{verbatim} - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. - \\end{verbatim} - ''' - - res = - ''' - \\begin{verbatim} - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at - blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget - condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec - semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit - quam, elementum neque pellentesque pulvinar et vestibulum. - \\end{verbatim} - ''' - - expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res - - it 'properly reflows text inside LaTeX tags', -> - text = - ''' - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. - } - ''' - - res = - ''' - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at - blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget - condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec - semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit - quam, elementum neque pellentesque pulvinar et vestibulum. - } - ''' - - expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res - - it 'properly reflows text inside nested LaTeX tags', -> - text = - ''' - \\begin{enumerate}[label=(\\alph*)] - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. - } - \\end{enumerate} - ''' - - res = - ''' - \\begin{enumerate}[label=(\\alph*)] - \\item{ - Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at - blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. - Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. - Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore - velit quam, elementum neque pellentesque pulvinar et vestibulum. - } - \\end{enumerate} - ''' - - expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res - + describe 'LaTeX', -> + it 'properly reflows text around LaTeX tags', -> + text = + ''' + \\begin{verbatim} + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. + \\end{verbatim} + ''' + + res = + ''' + \\begin{verbatim} + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at + blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget + condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec + semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit + quam, elementum neque pellentesque pulvinar et vestibulum. + \\end{verbatim} + ''' + + expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + + it 'properly reflows text inside LaTeX tags', -> + text = + ''' + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. + } + ''' + + res = + ''' + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at + blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget + condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec + semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit + quam, elementum neque pellentesque pulvinar et vestibulum. + } + ''' + + expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + + it 'properly reflows text inside nested LaTeX tags', -> + text = + ''' + \\begin{enumerate}[label=(\\alph*)] + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore velit quam, elementum neque pellentesque pulvinar et vestibulum. + } + \\end{enumerate} + ''' + + res = + ''' + \\begin{enumerate}[label=(\\alph*)] + \\item{ + Lorem ipsum dolor sit amet, nisl odio amet, et tempor netus neque at at + blandit, vel vestibulum libero dolor, semper lobortis ligula praesent. + Eget condimentum integer, porta sagittis nam, fusce vitae a vitae augue. + Nec semper quis sed ut, est porttitor praesent. Nisl velit quam dolore + velit quam, elementum neque pellentesque pulvinar et vestibulum. + } + \\end{enumerate} + ''' + + expect(autoflow.reflow(text, wrapColumn: 80)).toEqual res + + it 'does not attempt to reflow a selection that contains only LaTeX tags and nothing else', -> + text = + ''' + \\begin{enumerate} + \\end{enumerate} + ''' + + expect(autoflow.reflow(text, wrapColumn: 5)).toEqual text