ocaml
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge remote-tracking branch 'origin/main'

+100 -94
+1 -3
lib/frontend/LaTeX_template.ml
··· 1 1 let write fmt ~preamble ~source = 2 2 let newline () = Format.fprintf fmt "\n" in 3 - Format.fprintf fmt {|\RequirePackage{ifpdf}|}; 4 - newline (); 5 - Format.fprintf fmt {|\ifpdf\documentclass[crop]{standalone}\else\documentclass[crop,dvisvgm]{standalone}\fi|}; 3 + Format.fprintf fmt {|\documentclass[crop,dvisvgm]{standalone}|}; 6 4 newline (); 7 5 Format.fprintf fmt "%s" preamble; 8 6 newline ();
+86 -91
lib/frontend/Lexer.mll
··· 1 1 { 2 + open Prelude 2 3 exception SyntaxError of string 3 4 let drop_sigil c str = 1 |> List.nth @@ String.split_on_char c str 4 - let ident str = Grammar.IDENT (drop_sigil '\\' str) 5 - let illegal str = raise @@ SyntaxError str 6 - 7 - let text str = Grammar.TEXT str 8 - let whitespace str = Grammar.WHITESPACE str 9 - let dbg str = Format.printf "%s\n" str; flush stdout 10 - 11 - let verbatim = ref false 12 - 13 - let return_thunk lexbuf thunk = 14 - match !verbatim with 15 - | true -> text (Lexing.lexeme lexbuf) 16 - | false -> thunk () 17 - 18 - let return lexbuf tok = 19 - return_thunk lexbuf @@ fun _ -> tok 20 - 5 + let verbatim_buff = Buffer.create 1000 21 6 } 22 7 23 8 let digit = ['0'-'9'] ··· 25 10 let int = '-'? digit+ 26 11 let ident = '\\' (alpha) (alpha|digit|'-'|'/'|'#')* 27 12 let addr = (alpha) (alpha|digit|'_'|'-')* 28 - let whitespace = [' ' '\t']+ 13 + let wschar = [' ' '\t'] 29 14 let newline = '\r' | '\n' | "\r\n" 30 15 let text = [^ ' ' '%' '#' '\\' '{' '}' '[' ']' '(' ')' '\r' '\n']+ 31 16 32 17 rule token = 33 18 parse 34 - | "\\%" { return lexbuf @@ Grammar.TEXT "%"} 19 + | "\\%" { Grammar.TEXT "%"} 35 20 | "%" { comment lexbuf } 36 - | "##{" { return lexbuf @@ Grammar.HASH_HASH_LBRACE } 37 - | "#{" { return lexbuf @@ Grammar.HASH_LBRACE } 38 - | "\\\\" { return lexbuf @@ Grammar.IDENT {|\|} } 39 - | "\\," { return lexbuf @@ Grammar.IDENT {|,|} } 40 - | "\\\"" { return lexbuf @@ Grammar.IDENT {|"|} } 41 - | "\\'" { return lexbuf @@ Grammar.IDENT {|'|} } 42 - | "\\`" { return lexbuf @@ Grammar.IDENT {|`|} } 43 - | "\\_" { return lexbuf @@ Grammar.IDENT {|_|} } 44 - | "\\;" { return lexbuf @@ Grammar.IDENT {|;|} } 45 - | "\\#" { return lexbuf @@ Grammar.IDENT {|#|} } 46 - | "\\{" { return lexbuf @@ Grammar.IDENT {|{|} } 47 - | "\\}" { return lexbuf @@ Grammar.IDENT {|}|} } 48 - | "\\[" { return lexbuf @@ Grammar.IDENT {|[|} } 49 - | "\\]" { return lexbuf @@ Grammar.IDENT {|]|} } 50 - | "\\startverb" { verbatim := true; token lexbuf } 51 - | "\\stopverb" { verbatim := false; token lexbuf } 52 - | "\\ " { return lexbuf @@ Grammar.IDENT {| |} } 53 - | "\\title" { return lexbuf @@ Grammar.TITLE } 54 - | "\\parent" { return lexbuf @@ Grammar.PARENT } 55 - | "\\taxon" { return lexbuf @@ Grammar.TAXON } 56 - | "\\author" { return lexbuf @@ Grammar.AUTHOR } 57 - | "\\contributor" { return lexbuf @@ Grammar.CONTRIBUTOR } 58 - | "\\scope" { return lexbuf @@ Grammar.SCOPE } 59 - | "\\put" { return lexbuf @@ Grammar.PUT } 60 - | "\\put?" { return lexbuf @@ Grammar.DEFAULT } 61 - | "\\get" { return lexbuf @@ Grammar.GET } 62 - | "\\tag" { return lexbuf @@ Grammar.TAG } 63 - | "\\ref" { return lexbuf @@ Grammar.REF } 64 - | "\\date" { return lexbuf @@ Grammar.DATE } 65 - | "\\import" { return lexbuf @@ Grammar.IMPORT } 66 - | "\\export" { return lexbuf @@ Grammar.EXPORT } 67 - | "\\namespace" { return lexbuf @@ Grammar.NAMESPACE } 68 - | "\\open" { return lexbuf @@ Grammar.OPEN } 69 - | "\\meta" { return lexbuf @@ Grammar.META } 70 - | "\\def" { return lexbuf @@ Grammar.DEF } 71 - | "\\alloc" { return lexbuf @@ Grammar.ALLOC } 72 - | "\\let" { return lexbuf @@ Grammar.LET } 73 - | "\\tex" { return lexbuf @@ Grammar.TEX } 74 - | "\\transclude" { return lexbuf @@ Grammar.TRANSCLUDE } 75 - | "\\subtree" { return lexbuf @@ Grammar.SUBTREE } 76 - | "\\query/and" {return lexbuf @@ Grammar.QUERY_AND } 77 - | "\\query/or" {return lexbuf @@ Grammar.QUERY_OR } 78 - | "\\query/author" {return lexbuf @@ Grammar.QUERY_AUTHOR } 79 - | "\\query/tag" {return lexbuf @@ Grammar.QUERY_TAG } 80 - | "\\query/taxon" {return lexbuf @@ Grammar.QUERY_TAXON } 81 - | "\\query/meta" {return lexbuf @@ Grammar.QUERY_META } 82 - | "\\query" { return lexbuf @@ Grammar.QUERY_TREE } 83 - | "\\xml" { return lexbuf @@ Grammar.XML_TAG } 84 - | "\\p" { return lexbuf @@ Grammar.PRIM `P } 85 - | "\\em" { return lexbuf @@ Grammar.PRIM `Em } 86 - | "\\strong" { return lexbuf @@ Grammar.PRIM `Strong } 87 - | "\\li" { return lexbuf @@ Grammar.PRIM `Li } 88 - | "\\ul" { return lexbuf @@ Grammar.PRIM `Ul } 89 - | "\\ol" { return lexbuf @@ Grammar.PRIM `Ol } 90 - | "\\code" { return lexbuf @@ Grammar.PRIM `Code } 91 - | "\\blockquote" { return lexbuf @@ Grammar.PRIM `Blockquote } 92 - | "\\pre" { return lexbuf @@ Grammar.PRIM `Pre } 93 - | "\\object" { return lexbuf @@ Grammar.OBJECT } 94 - | "\\patch" { return lexbuf @@ Grammar.PATCH } 95 - | "\\call" { return lexbuf @@ Grammar.CALL } 96 - | "#" { return lexbuf @@ Grammar.TEXT "#" } 97 - | ident { return lexbuf @@ ident (Lexing.lexeme lexbuf) } 98 - | '{' { return lexbuf @@ Grammar.LBRACE } 99 - | '}' { return lexbuf @@ Grammar.RBRACE } 100 - | '[' { return lexbuf @@ Grammar.LSQUARE } 101 - | ']' { return lexbuf @@ Grammar.RSQUARE } 102 - | '(' { return lexbuf @@ Grammar.LPAREN } 103 - | ')' { return lexbuf @@ Grammar.RPAREN } 104 - | text { text (Lexing.lexeme lexbuf) } 105 - | whitespace { whitespace (Lexing.lexeme lexbuf) } 106 - | newline { Lexing.new_line lexbuf; whitespace (Lexing.lexeme lexbuf) } 21 + | "##{" { Grammar.HASH_HASH_LBRACE } 22 + | "#{" { Grammar.HASH_LBRACE } 23 + | "\\\\" { Grammar.IDENT {|\|} } 24 + | "\\," { Grammar.IDENT {|,|} } 25 + | "\\\"" { Grammar.IDENT {|"|} } 26 + | "\\'" { Grammar.IDENT {|'|} } 27 + | "\\`" { Grammar.IDENT {|`|} } 28 + | "\\_" { Grammar.IDENT {|_|} } 29 + | "\\;" { Grammar.IDENT {|;|} } 30 + | "\\#" { Grammar.IDENT {|#|} } 31 + | "\\{" { Grammar.IDENT {|{|} } 32 + | "\\}" { Grammar.IDENT {|}|} } 33 + | "\\[" { Grammar.IDENT {|[|} } 34 + | "\\]" { Grammar.IDENT {|]|} } 35 + | "\\startverb" { 36 + Buffer.clear verbatim_buff; 37 + verbatim lexbuf; 38 + let text = String_util.trim_newlines @@ Buffer.contents verbatim_buff in 39 + Grammar.TEXT text 40 + } 41 + | "\\ " { Grammar.IDENT {| |} } 42 + | "\\title" { Grammar.TITLE } 43 + | "\\parent" { Grammar.PARENT } 44 + | "\\taxon" { Grammar.TAXON } 45 + | "\\author" { Grammar.AUTHOR } 46 + | "\\contributor" { Grammar.CONTRIBUTOR } 47 + | "\\scope" { Grammar.SCOPE } 48 + | "\\put" { Grammar.PUT } 49 + | "\\put?" { Grammar.DEFAULT } 50 + | "\\get" { Grammar.GET } 51 + | "\\tag" { Grammar.TAG } 52 + | "\\ref" { Grammar.REF } 53 + | "\\date" { Grammar.DATE } 54 + | "\\import" { Grammar.IMPORT } 55 + | "\\export" { Grammar.EXPORT } 56 + | "\\namespace" { Grammar.NAMESPACE } 57 + | "\\open" { Grammar.OPEN } 58 + | "\\meta" { Grammar.META } 59 + | "\\def" { Grammar.DEF } 60 + | "\\alloc" { Grammar.ALLOC } 61 + | "\\let" { Grammar.LET } 62 + | "\\tex" { Grammar.TEX } 63 + | "\\transclude" { Grammar.TRANSCLUDE } 64 + | "\\subtree" { Grammar.SUBTREE } 65 + | "\\query/and" {Grammar.QUERY_AND } 66 + | "\\query/or" {Grammar.QUERY_OR } 67 + | "\\query/author" {Grammar.QUERY_AUTHOR } 68 + | "\\query/tag" {Grammar.QUERY_TAG } 69 + | "\\query/taxon" {Grammar.QUERY_TAXON } 70 + | "\\query/meta" {Grammar.QUERY_META } 71 + | "\\query" { Grammar.QUERY_TREE } 72 + | "\\xml" { Grammar.XML_TAG } 73 + | "\\p" { Grammar.PRIM `P } 74 + | "\\em" { Grammar.PRIM `Em } 75 + | "\\strong" { Grammar.PRIM `Strong } 76 + | "\\li" { Grammar.PRIM `Li } 77 + | "\\ul" { Grammar.PRIM `Ul } 78 + | "\\ol" { Grammar.PRIM `Ol } 79 + | "\\code" { Grammar.PRIM `Code } 80 + | "\\blockquote" { Grammar.PRIM `Blockquote } 81 + | "\\pre" { Grammar.PRIM `Pre } 82 + | "\\object" { Grammar.OBJECT } 83 + | "\\patch" { Grammar.PATCH } 84 + | "\\call" { Grammar.CALL } 85 + | "#" { Grammar.TEXT "#" } 86 + | ident { Grammar.IDENT (drop_sigil '\\' (Lexing.lexeme lexbuf)) } 87 + | '{' { Grammar.LBRACE } 88 + | '}' { Grammar.RBRACE } 89 + | '[' { Grammar.LSQUARE } 90 + | ']' { Grammar.RSQUARE } 91 + | '(' { Grammar.LPAREN } 92 + | ')' { Grammar.RPAREN } 93 + | text { Grammar.TEXT (Lexing.lexeme lexbuf) } 94 + | wschar+ { Grammar.WHITESPACE (Lexing.lexeme lexbuf) } 95 + | newline { Lexing.new_line lexbuf; Grammar.WHITESPACE (Lexing.lexeme lexbuf) } 107 96 | eof { Grammar.EOF } 108 - | _ { illegal @@ Lexing.lexeme lexbuf } 97 + | _ { raise @@ SyntaxError (Lexing.lexeme lexbuf) } 109 98 110 99 and comment = 111 100 parse ··· 113 102 | eof { Grammar.EOF } 114 103 | _ { comment lexbuf } 115 104 105 + and verbatim = 106 + parse 107 + | "\\stopverb" { () } 108 + | _ as c 109 + { Buffer.add_char verbatim_buff c; 110 + verbatim lexbuf }
+12
lib/prelude/String_util.ml
··· 17 17 let sentence_case str = 18 18 let words = String.split_on_char ' ' str in 19 19 String.concat " " @@ List.mapi title_case_word words 20 + 21 + let trim_newlines str = 22 + 23 + let rec process_lines lines = 24 + match lines with 25 + | [] -> [] 26 + | "" :: lines -> process_lines lines 27 + | _ -> lines 28 + in 29 + 30 + let lines = String.split_on_char '\n' str in 31 + String.concat "\n" @@ List.rev @@ process_lines @@ List.rev @@ process_lines lines
+1
lib/prelude/String_util.mli
··· 1 1 val sentence_case : string -> string 2 + val trim_newlines : string -> string