Skip to content

Commit

Permalink
Merge pull request atom#18168 from isundaylee/master
Browse files Browse the repository at this point in the history
[packages/autoflow] Handles wrapping text around LaTeX tags
  • Loading branch information
smashwilson authored Jan 15, 2019
2 parents cbe3080 + 92407c1 commit c3b8966
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 3 deletions.
23 changes: 20 additions & 3 deletions packages/autoflow/lib/autoflow.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,30 @@ module.exports =
tabLengthInSpaces = ''

for block in paragraphBlocks
blockLines = block.split('\n')

# For LaTeX tags surrounding the text, we simply ignore them, and
# reproduce them verbatim in the wrapped text.
beginningLinesToIgnore = []
endingLinesToIgnore = []
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)
beginningLinesToIgnore.push(blockLines[0])
blockLines.shift()
while blockLines[blockLines.length - 1].match(latexTagRegex) or
blockLines[blockLines.length - 1].match(latexTagEndRegex)
endingLinesToIgnore.unshift(blockLines[blockLines.length - 1])
blockLines.pop()

# 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 = block.match(/^\s*(\/\/|\/\*|;;|#'|\|\|\||--|[#%*>-])?\s*/g)[0]
linePrefix = blockLines[0].match(/^\s*(\/\/|\/\*|;;|#'|\|\|\||--|[#%*>-])?\s*/g)[0]
linePrefixTabExpanded = linePrefix
if tabLengthInSpaces
linePrefixTabExpanded = linePrefix.replace(/\t/g, tabLengthInSpaces)
blockLines = block.split('\n')

if linePrefix
escapedLinePrefix = _.escapeRegExp(linePrefix)
Expand Down Expand Up @@ -93,7 +109,8 @@ module.exports =
currentLineLength += segment.length
lines.push(linePrefix + currentLine.join(''))

paragraphs.push(lines.join('\n').replace(/\s+\n/g, '\n'))
wrappedLines = beginningLinesToIgnore.concat(lines.concat(endingLinesToIgnore))
paragraphs.push(wrappedLines.join('\n').replace(/\s+\n/g, '\n'))

leadingVerticalSpace + paragraphs.join('\n\n') + trailingVerticalSpace

Expand Down
68 changes: 68 additions & 0 deletions packages/autoflow/spec/autoflow-spec.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -560,3 +560,71 @@ 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

0 comments on commit c3b8966

Please sign in to comment.