diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2018-03-23 01:13:30 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2018-03-23 01:13:30 +0000 |
commit | 92837363f3bfc23752b0bc2f4cfde13f0f48fcb9 (patch) | |
tree | 1c9bfa55da53b611c4ac2913fb5e3ee4467a40be /FMark/src | |
parent | 52d07354fa1ba772097f70533d06d60afc611a03 (diff) | |
parent | 1bd9c582f5d34f66b5cd417d665c9460d95e434e (diff) | |
download | FMark-92837363f3bfc23752b0bc2f4cfde13f0f48fcb9.tar.gz FMark-92837363f3bfc23752b0bc2f4cfde13f0f48fcb9.zip |
Merged #161 and regenerated js
Diffstat (limited to 'FMark/src')
-rw-r--r-- | FMark/src/Common/Parser/Parser.fs | 115 | ||||
-rw-r--r-- | FMark/src/Common/Parser/ParserTest.fs | 14 |
2 files changed, 113 insertions, 16 deletions
diff --git a/FMark/src/Common/Parser/Parser.fs b/FMark/src/Common/Parser/Parser.fs index 793bc58..caa561d 100644 --- a/FMark/src/Common/Parser/Parser.fs +++ b/FMark/src/Common/Parser/Parser.fs @@ -156,27 +156,110 @@ let (|MatchTOC|_|) hdList toks = //{h with HeaderName = Link((h.HeaderName), sprintf "#HEADER%i" i)} // Link of HyperText: TFrmtedString * URL: string let linksLst = List.mapi makeRelLink hdList {HeaderLst=linksLst} - let filterHeaders d hdLst = - let headerFilter hd = - hd.Level <= d - List.filter headerFilter hdLst + let filterHeadersByDepth depthOption hdList = + match depthOption with + | Some d -> + let headerFilter hd = + hd.Level <= d + List.filter headerFilter hdList + | None -> hdList + + let filterHeadersByName hdExListOption hdList = + match hdExListOption with + | Some hdExList -> + let filterOutHeaders hdList hdToExclude = + let hdTLine = hdToExclude |> parseInLineElements + let headerFilter hd = + hd.HeaderName <> hdTLine + List.filter headerFilter hdList + List.fold filterOutHeaders hdList hdExList + | None -> hdList + + let splitToksAt sep toks : Token list list = + let rec split (toksList, toks) = + match toks with + | [] -> + // delete empty list + match toksList with + | []::retoksList -> retoksList + | _ -> toksList + |> List.rev + | sym::rtks when sym=sep -> + ( + []::toksList, rtks ) + |> split + | tok::rtks -> + ( + (tok::(List.head toksList))::(List.tail toksList), rtks ) + |> split + split ([[]], toks) + |> List.map List.rev + + + let trimWhitespaces toks = + let rec trimer toks = + match toks with + | WHITESPACE _::retoks -> trimer retoks + | _ -> toks + toks + |> trimer + |> List.rev + |> trimer + |> List.rev + + /// (maxDepth option, hdExList option) + let parseTOCparameters toks = + let parmFields = splitToksAt COMMA toks + let (|MatchRSBRA|_|) toks = + let rec matcher (pToks, toks) = + match toks with + | [] -> None + | RSBRA::_ -> pToks |> List.rev |> Some + | tk::rst -> (tk::pToks, rst) |> matcher + matcher ([], toks) + let parmsFolder (maxDepth, hdExList) parm = + match parm |> trimWhitespaces with + | LITERAL"depth"::EQUAL::NUMBER noStr::_ -> + noStr |> int |> Some, hdExList + | LITERAL"excludes"::EQUAL::LSBRA::rst -> + let newHdExList = + match rst with + | MatchRSBRA exList -> + exList + |> splitToksAt SEMICOLON + |> List.map (fun x -> x |> trimWhitespaces) + |> Some + | _ -> None + printfn "hdExList:%A" newHdExList + maxDepth, newHdExList + | _ -> maxDepth, hdExList + // state: (maxDepth, hdExList) + List.fold parmsFolder (None, None) parmFields + + match toks with //| PERCENT::PERCENT::LITERAL("TOC")::// Options - | PERCENT::PERCENT::LITERAL("TOC")::WHITESPACE _::LITERAL"depth"::EQUAL::NUMBER noStr::rst -> - // filter out headers with level > depth - // ignore the rest tokens in this line - let depth = noStr|>int + // | PERCENT::PERCENT::LITERAL("TOC")::WHITESPACE _::LITERAL"depth"::EQUAL::NUMBER noStr::rst -> + // // filter out headers with level > depth + // // ignore the rest tokens in this line + // let depth = noStr|>int + // ( + // hdList + // |>filterHeaders depth + // |> createLinks + // , + // rst|>cutFirstLine|>snd + // ) |> Some + | PERCENT::PERCENT::LITERAL("TOC")::rst -> + let (tocLine, retoks) = rst|>cutFirstLine + let (maxDepth, hdExList) = parseTOCparameters tocLine ( hdList - |>filterHeaders depth - |> createLinks - , - rst|>cutFirstLine|>snd - ) |> Some - | PERCENT::PERCENT::LITERAL("TOC")::rst -> - // No depth specified, ignore the rest tokens in this line - (createLinks hdList, rst|>cutFirstLine|>snd) + |> filterHeadersByDepth maxDepth + |> filterHeadersByName hdExList + |> createLinks + ,retoks) |> Some | _ -> None diff --git a/FMark/src/Common/Parser/ParserTest.fs b/FMark/src/Common/Parser/ParserTest.fs index 8902629..3ab30e8 100644 --- a/FMark/src/Common/Parser/ParserTest.fs +++ b/FMark/src/Common/Parser/ParserTest.fs @@ -517,6 +517,8 @@ let ``TOC tests`` = let tocTok = [PERCENT;PERCENT;LITERAL"TOC"] let tocTokMisc = tocTok@[WHITESPACE 1;LITERAL "nothing"] let tocDepthTok = tocTok@[WHITESPACE 1;LITERAL"depth";EQUAL;NUMBER "2"] + let tocExcludeToks = [COMMA;LITERAL"excludes";EQUAL;LSBRA;LITERAL"h2";RSBRA] + let tocExcludePreludeToks = [COMMA;LITERAL"excludes";EQUAL;LSBRA] let endline = [ENDLINE] let h1Tok = [HASH;WHITESPACE 1;LITERAL "h1"] let h2Tok = [HASH;HASH;WHITESPACE 1;LITERAL "h2"] @@ -589,6 +591,18 @@ let ``TOC tests`` = [h12ContentTable]@[h1ParsedObj]@[h2ParsedObj]@[h3ParsedObj], "TOC, h1, h2, h3, depth=2, unrcognized text" ); + ( + tocDepthTok@tocExcludeToks@twoEndlines@h1Tok@twoEndlines@h2Tok@twoEndlines@h3Tok, + [h1ContentTable]@[h1ParsedObj]@[h2ParsedObj]@[h3ParsedObj], + "TOC, h1, h2, h3, depth=2, exclude h2" + ); + ( + tocTok + @tocExcludePreludeToks@[LITERAL"h2";SEMICOLON;LITERAL"h3"]@[RSBRA]@twoEndlines + @h1Tok@twoEndlines@h2Tok@twoEndlines@h3Tok, + [h1ContentTable]@[h1ParsedObj]@[h2ParsedObj]@[h3ParsedObj], + "TOC, h1, h2, h3, exclude h2 h3" + ); ] [<Tests>] |