aboutsummaryrefslogtreecommitdiffstats
path: root/FMark/src/Common/Shared.fs
blob: 6d20e19316a031cc49224862613a88b4017689cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
module Shared

open Types
open Logger
open System.Text.RegularExpressions

// Helpers

/// Inverse the values in a tuple
let invTuple (a, b) = b, a

/// Try to find a key in a map, return Some value when it is found, otherwise it
/// returns None
let mapTryFind k (map: Map<'a, 'b>) = map.TryFind(k)

/// Try find key in a list
let listTryFind s =
    List.map invTuple >> Map.ofList >> mapTryFind s

/// The list of characters used in the parser
let charList = ["#", HASH; "|", PIPE; "=", EQUAL; "-", MINUS; "+", PLUS; "*", ASTERISK
                ".", DOT; "**", DASTERISK; "***", TASTERISK; "_", UNDERSCORE; "__", DUNDERSCORE
                "___", TUNDERSCORE; "~", TILDE; "~~", DTILDE; "~~~", TTILDE; "[", LSBRA
                "]", RSBRA; "(", LBRA; ")", RBRA; @"\", BSLASH; "/", SLASH; "<", LABRA
                ">", RABRA; "{", LCBRA; "}", RCBRA; "`", BACKTICK;
                "!", EXCLAMATION; ":", COLON; "^", CARET; "%", PERCENT; ",", COMMA]

let charMap = charList |> List.map invTuple |> Map.ofList

let (|CharTok|_|) tok =
    mapTryFind tok charMap

let mapTok = function
    | CharTok s -> s
    | CODEBLOCK _ -> "CODEBLOCK"
    | FOOTNOTE _ -> sprintf "FOOTNOTE found"
    | CITATION _ -> sprintf "CITATION found"
    | HEADER n -> sprintf "HEADER %d" n
    | NUMBER s -> s
    | LITERAL s -> s
    | WHITESPACE n -> String.replicate n " "
    | _ -> "\n"

/// turn all tokens into string
let strAllToks toks =
    let pacMan str tok =
        str + mapTok tok
    List.fold pacMan "" toks

let mapLang lang =
    match lang with
    | Python -> "python"
    | FSharp -> "fsharp"
    | CPP -> "cpp"
    | C -> "c"
    | Empty -> ""

let xOnwards x lst = if List.length lst > x then lst.[x..] else []
let sOnwards s str = if String.length str > s then str.[s..] else ""
let removeChars lst s =
            let folder (s:string) x = s.Replace(x,"")
            List.fold folder s lst
let replaceChars pat (rep:string) s =
    Regex.Replace(s,pat,rep)
let removeWhitespace (s:string) = 
    s |> removeChars ["\n";"\t";"\r";" "]
let sharedLog = Logger(LogLevel.WARNING)