package kkmarkdown

  1. Overview
  2. Docs

Source file AllSpanRules.ml

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
(** List of all span rules in descending order, except {!SpanRuleChars} *)
let all : (module SpanRule.S) list =
  [
    (module SpanRuleEscape);
    (module SpanRuleUnicode.Hex);
    (module SpanRuleUnicode.Dec);
    (module SpanRuleStack.EmStrong);
    (module SpanRuleStack.Strong);
    (module SpanRuleStack.Em);
    (module SpanRuleStack.Strike);
    (module SpanRuleStack.Code);
    (module SpanRuleA.Automatic);
    (module SpanRuleA.UnsafeNormal);
  ]

module Map = FirstChar.Map (struct
  module type Rule = SpanRule.S

  let first_char rule =
    let module Rule = (val rule : SpanRule.S) in
    Rule.first_char
end)

let first_char_map, any = Map.init all
let find c = Map.find c first_char_map

module SpanRuleChars = struct
  let is_safe = true
  let first_char = FirstChar.Any

  let construct _ ({ SpanRule.s; cur } as state) =
    let len = String.length s in

    let next_cur =
      let exception Done of int in
      try
        for i = cur + 1 to len - 1 do
          if Map.mem s.[i] first_char_map then raise (Done i)
        done;
        len
      with Done i -> i
    in
    let res = Typ.CharsSpan (String.sub s cur (next_cur - cur)) in
    state.cur <- next_cur;
    Some res
end

let any = any @ [ (module SpanRuleChars : SpanRule.S) ]
OCaml

Innovation. Community. Security.