aboutsummaryrefslogtreecommitdiffstats
path: root/FMark/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2018-03-23 01:13:30 +0000
committerYann Herklotz <ymherklotz@gmail.com>2018-03-23 01:13:30 +0000
commit92837363f3bfc23752b0bc2f4cfde13f0f48fcb9 (patch)
tree1c9bfa55da53b611c4ac2913fb5e3ee4467a40be /FMark/src
parent52d07354fa1ba772097f70533d06d60afc611a03 (diff)
parent1bd9c582f5d34f66b5cd417d665c9460d95e434e (diff)
downloadFMark-92837363f3bfc23752b0bc2f4cfde13f0f48fcb9.tar.gz
FMark-92837363f3bfc23752b0bc2f4cfde13f0f48fcb9.zip
Merged #161 and regenerated js
Diffstat (limited to 'FMark/src')
-rw-r--r--FMark/src/Common/Parser/Parser.fs115
-rw-r--r--FMark/src/Common/Parser/ParserTest.fs14
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>]