Initial commit
This commit is contained in:
commit
8ee072f7d5
6 changed files with 156 additions and 0 deletions
4
bin/dune
Normal file
4
bin/dune
Normal file
|
@ -0,0 +1,4 @@
|
|||
(executable
|
||||
(public_name kortfat)
|
||||
(name main)
|
||||
(libraries kortfat cmarkit))
|
19
bin/main.ml
Normal file
19
bin/main.ml
Normal file
|
@ -0,0 +1,19 @@
|
|||
let read_markdown file =
|
||||
let s =
|
||||
let ic = open_in file in
|
||||
(* XXX: probably doesn't work on Windows *)
|
||||
let len = In_channel.length ic |> Int64.to_int in
|
||||
Fun.protect (fun () -> really_input_string ic len)
|
||||
~finally:(fun () -> close_in ic)
|
||||
in
|
||||
Cmarkit.Doc.of_string ~file s
|
||||
|
||||
let kortfat files =
|
||||
let mds = List.map read_markdown files in
|
||||
let doc = Kortfat.kortfat mds in
|
||||
Cmarkit_commonmark.of_doc doc
|
||||
|> print_endline
|
||||
|
||||
let () =
|
||||
let files = List.tl (Array.to_list Sys.argv) in
|
||||
kortfat files
|
26
dune-project
Normal file
26
dune-project
Normal file
|
@ -0,0 +1,26 @@
|
|||
(lang dune 3.16)
|
||||
|
||||
(name kortfat)
|
||||
|
||||
(generate_opam_files true)
|
||||
|
||||
(source
|
||||
(github username/reponame))
|
||||
|
||||
(authors "Author Name")
|
||||
|
||||
(maintainers "Maintainer Name")
|
||||
|
||||
(license LICENSE)
|
||||
|
||||
(documentation https://url/to/documentation)
|
||||
|
||||
(package
|
||||
(name kortfat)
|
||||
(synopsis "A short synopsis")
|
||||
(description "A longer description")
|
||||
(depends ocaml dune cmarkit)
|
||||
(tags
|
||||
(topics "to describe" your project)))
|
||||
|
||||
; See the complete stanza docs at https://dune.readthedocs.io/en/stable/reference/dune-project/index.html
|
32
kortfat.opam
Normal file
32
kortfat.opam
Normal file
|
@ -0,0 +1,32 @@
|
|||
# This file is generated by dune, edit dune-project instead
|
||||
opam-version: "2.0"
|
||||
synopsis: "A short synopsis"
|
||||
description: "A longer description"
|
||||
maintainer: ["Maintainer Name"]
|
||||
authors: ["Author Name"]
|
||||
license: "LICENSE"
|
||||
tags: ["topics" "to describe" "your" "project"]
|
||||
homepage: "https://github.com/username/reponame"
|
||||
doc: "https://url/to/documentation"
|
||||
bug-reports: "https://github.com/username/reponame/issues"
|
||||
depends: [
|
||||
"ocaml"
|
||||
"dune" {>= "3.16"}
|
||||
"cmarkit"
|
||||
"odoc" {with-doc}
|
||||
]
|
||||
build: [
|
||||
["dune" "subst"] {dev}
|
||||
[
|
||||
"dune"
|
||||
"build"
|
||||
"-p"
|
||||
name
|
||||
"-j"
|
||||
jobs
|
||||
"@install"
|
||||
"@runtest" {with-test}
|
||||
"@doc" {with-doc}
|
||||
]
|
||||
]
|
||||
dev-repo: "git+https://github.com/username/reponame.git"
|
3
lib/dune
Normal file
3
lib/dune
Normal file
|
@ -0,0 +1,3 @@
|
|||
(library
|
||||
(name kortfat)
|
||||
(libraries cmarkit))
|
72
lib/kortfat.ml
Normal file
72
lib/kortfat.ml
Normal file
|
@ -0,0 +1,72 @@
|
|||
module SM = Map.Make(String)
|
||||
|
||||
let heading_to_string heading =
|
||||
Cmarkit.Block.Heading.inline heading
|
||||
|> Cmarkit.Inline.to_plain_text ~break_on_soft:false
|
||||
|> List.map (String.concat "")
|
||||
|> String.concat "\n"
|
||||
|
||||
let aggregate t doc =
|
||||
let rec aggregate t heading = function
|
||||
| [] -> t
|
||||
| Cmarkit.Block.Heading (heading, _) :: rest ->
|
||||
let heading = heading_to_string heading in
|
||||
let t =
|
||||
SM.update heading
|
||||
(function
|
||||
| None -> Some []
|
||||
| Some blocks -> Some blocks)
|
||||
t
|
||||
in
|
||||
aggregate t heading rest
|
||||
| block :: rest ->
|
||||
let t =
|
||||
SM.update heading
|
||||
(function
|
||||
| None ->
|
||||
Some [ block ]
|
||||
| Some blocks ->
|
||||
Some (block :: blocks))
|
||||
t
|
||||
in
|
||||
aggregate t heading rest
|
||||
in
|
||||
match Cmarkit.Doc.block doc with
|
||||
| Cmarkit.Block.Blocks (blocks, _) ->
|
||||
aggregate t "" blocks
|
||||
| Cmarkit.Block.Heading (heading, _) ->
|
||||
let heading = heading_to_string heading in
|
||||
SM.update heading
|
||||
(function
|
||||
| None -> Some []
|
||||
| Some blocks -> Some blocks)
|
||||
t
|
||||
| block ->
|
||||
SM.update ""
|
||||
(function
|
||||
| None ->
|
||||
Some [ block ]
|
||||
| Some blocks ->
|
||||
Some (block :: blocks))
|
||||
t
|
||||
|
||||
let kortfat docs =
|
||||
let rev_t = List.fold_left aggregate SM.empty docs in
|
||||
let t = SM.map List.rev rev_t in
|
||||
let blocks =
|
||||
SM.fold
|
||||
(fun heading blocks acc ->
|
||||
let heading =
|
||||
Cmarkit.Block.Heading
|
||||
(Cmarkit.Block.Heading.make
|
||||
~level:2
|
||||
(Cmarkit.Inline.Text
|
||||
(heading, Cmarkit.Meta.none)),
|
||||
Cmarkit.Meta.none)
|
||||
in
|
||||
heading :: blocks @ acc)
|
||||
t
|
||||
[]
|
||||
in
|
||||
Cmarkit.Block.Blocks (blocks, Cmarkit.Meta.none)
|
||||
|> Cmarkit.Doc.make
|
Loading…
Reference in a new issue