Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FileConventions: fix WrapText function #135

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/FileConventions.Test/WrapTextTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,25 @@ let WrapTextTest5() =
let expectedResult = text

Assert.That(WrapText text characterCount, Is.EqualTo expectedResult)

[<Test>]
let WrapTextTest6() =
let characterCount = 64
parhamsaremi marked this conversation as resolved.
Show resolved Hide resolved

let commitMsg =
"foo: this is a header"
+ Environment.NewLine
+ Environment.NewLine
+ "This is a body:"
+ Environment.NewLine
+ Environment.NewLine
+ "```"
+ Environment.NewLine
+ "A code block that has two conditions, it has a very long line that exceeds the limit."
+ Environment.NewLine
+ Environment.NewLine
+ "It also has multiple paragraphs."
+ Environment.NewLine
+ "```"

Assert.That(WrapText commitMsg characterCount, Is.EqualTo commitMsg)
67 changes: 66 additions & 1 deletion src/FileConventions/Library.fs
Original file line number Diff line number Diff line change
Expand Up @@ -244,9 +244,74 @@ let private WrapParagraph (text: string) (maxCharsPerLine: int) : string =

processWords String.Empty String.Empty words

// This function will extract paragraphs and will ignore the paragraphs inside a
// code block. Each paragraph is determined by two consecutive new lines.
let ExtractParagraphs(text: string) =
let lines = text.Split Environment.NewLine |> Seq.toList
let codeBlockStartOrEndToken = "```"

let rec processLines
(remainingLines: List<string>)
(currentParagraph: List<string>)
(paragraphs: List<string>)
(insideCodeBlock: bool)
=
// process each line individually and form paragraphs
match remainingLines with
| [] ->
if not currentParagraph.IsEmpty then
String.Join(Environment.NewLine, List.rev currentParagraph)
:: paragraphs
else
paragraphs
| line :: rest ->
if String.IsNullOrWhiteSpace line then
// a new paragraph has been detected, if it's inside code block
// add to the previous paragraph. Otherwise, join the previous
// paragraph to a string and start a new paragraph
if insideCodeBlock then
processLines
rest
(line :: currentParagraph)
paragraphs
insideCodeBlock
elif not currentParagraph.IsEmpty then
let newParagraph =
String.Join(
Environment.NewLine,
List.rev currentParagraph
)

processLines
rest
List.Empty
(newParagraph :: paragraphs)
insideCodeBlock
else
processLines rest List.Empty paragraphs insideCodeBlock
elif line.Trim().StartsWith codeBlockStartOrEndToken then
// start or end of a code block has been detected, the line will
// be added to the current paragraph and the state which determines
// if we're inside a code block or not is switched.
let newInsideCodeBlock = not insideCodeBlock

processLines
rest
(line :: currentParagraph)
paragraphs
newInsideCodeBlock
else
processLines
rest
(line :: currentParagraph)
paragraphs
insideCodeBlock

List.rev <| processLines lines List.Empty List.Empty false

let WrapText (text: string) (maxCharsPerLine: int) : string =
let wrappedParagraphs =
text.Split $"{Environment.NewLine}{Environment.NewLine}"
ExtractParagraphs text
|> Seq.map(fun paragraph -> WrapParagraph paragraph maxCharsPerLine)

String.Join(
Expand Down
Loading