Skip to content

Commit

Permalink
FileConventions: fix WrapText function
Browse files Browse the repository at this point in the history
Split paragraph based on codeblock positions so that codeblocks
with two lines, are not broken into multiple paragraphs.

Fixes nblockchain#117
  • Loading branch information
parhamsaremi committed Aug 9, 2023
1 parent 4f76c3d commit 9da447a
Showing 1 changed file with 48 additions and 4 deletions.
52 changes: 48 additions & 4 deletions src/FileConventions/Library.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ open System.IO
open System.Linq
open System.Text.RegularExpressions

let codeBlockRegex = "\s*(```[\s\S]*```)\s*"

let HasCorrectShebang(fileInfo: FileInfo) =
let fileText = File.ReadLines fileInfo.FullName

Expand Down Expand Up @@ -148,8 +150,6 @@ type Text =
}

let SplitIntoWords(text: string) =
let codeBlockRegex = "\s*(```[\s\S]*```)\s*"

let words =
Regex.Split(text, codeBlockRegex)
|> Seq.filter(fun item -> not(String.IsNullOrEmpty item))
Expand Down Expand Up @@ -241,11 +241,55 @@ let private WrapParagraph (text: string) (maxCharsPerLine: int) : string =

processWords String.Empty String.Empty words

let rec ExtractParagraphs (text: string) : List<string> =
let codeBlockParagraphRegex = "(\s*)(```[\s\S]*```)(\s*)"
let matchedRegex = Regex.Match(text, codeBlockParagraphRegex)
let twoNewLines = $"{Environment.NewLine}{Environment.NewLine}"

if matchedRegex.Success then
let preWhiteSpaceGroup = matchedRegex.Groups[1]
let postWhiteSpaceGroup = matchedRegex.Groups[3]

let beforeMatch = text.Substring(0, matchedRegex.Index)
let afterMatch = text.Substring(matchedRegex.Index + matchedRegex.Length)

let paragraphsBeforeMatch = ExtractParagraphs beforeMatch
let paragraphsAfterMatch = ExtractParagraphs afterMatch

if preWhiteSpaceGroup.Value.Contains(twoNewLines) && postWhiteSpaceGroup.Value.Contains(twoNewLines) then
paragraphsBeforeMatch @ (List.singleton matchedRegex.Value) @ paragraphsAfterMatch
elif preWhiteSpaceGroup.Value.Contains(twoNewLines) then
match paragraphsAfterMatch with
| [] ->
paragraphsBeforeMatch @ (List.singleton matchedRegex.Value)
| head::tail ->
paragraphsBeforeMatch @ List.singleton (matchedRegex.Value + postWhiteSpaceGroup.Value + head) @ tail
elif postWhiteSpaceGroup.Value.Contains(twoNewLines) then
match List.rev paragraphsBeforeMatch with
| [] ->
(List.singleton matchedRegex.Value) @ paragraphsAfterMatch
| head::tail ->
List.rev tail @ List.singleton (head + preWhiteSpaceGroup.Value + matchedRegex.Value) @ paragraphsAfterMatch
else
match List.rev paragraphsBeforeMatch, paragraphsAfterMatch with
| [], [] ->
List.singleton matchedRegex.Value
| headPre::tailPre, [] ->
List.rev tailPre @ List.singleton (headPre + preWhiteSpaceGroup.Value + matchedRegex.Value)
| [], headPost::tailPost ->
List.singleton (matchedRegex.Value + postWhiteSpaceGroup.Value + headPost) @ tailPost
| headPre::tailPre, headPost::tailPost ->
List.rev tailPre @ List.singleton (headPre + preWhiteSpaceGroup.Value + matchedRegex.Value + postWhiteSpaceGroup.Value + headPost) @ tailPost
elif String.IsNullOrEmpty(text) then
List.Empty
else
text.Split $"{Environment.NewLine}{Environment.NewLine}"
|> Seq.toList

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(
$"{Environment.NewLine}{Environment.NewLine}",
wrappedParagraphs
Expand Down

0 comments on commit 9da447a

Please sign in to comment.