]> Git — Sourcephile - sourcephile-web.git/blob - generator/Utils/Pandoc/SignsCount.hs
init
[sourcephile-web.git] / generator / Utils / Pandoc / SignsCount.hs
1 module Utils.Pandoc.SignsCount where
2
3 --import Text.HTML.TagSoup (innerText, parseTags)
4 import Data.Text qualified as Text
5 import Relude
6 import Text.Pandoc.Definition
7
8 signsCount :: Pandoc -> Int
9 signsCount (Pandoc _ bs) = sum $ map goBlock bs
10 where
11 goBlocks = sum . map goBlock
12 goBlocks2 = sum . map goBlocks
13
14 goBlock :: Block -> Int
15 goBlock (BlockQuote bs') = goBlocks bs'
16 goBlock (BulletList bss) = goBlocks2 bss
17 goBlock (CodeBlock _ s) = Text.length s
18 goBlock (DefinitionList ls) = sum $ map (\(is, bss) -> goInlines is + goBlocks2 bss) ls
19 goBlock (Div (id', classes, _) bs')
20 | id' == "refs" && "references" `elem` classes = 0
21 | otherwise = goBlocks bs'
22 goBlock (Header _ _ is) = goInlines is
23 goBlock HorizontalRule = 0
24 goBlock (LineBlock iss) = goInlines2 iss
25 goBlock (OrderedList _ bss) = goBlocks2 bss
26 goBlock (Para is) = goInlines is
27 goBlock (Plain is) = goInlines is
28 -- TODO: goBlock (RawBlock _ s) = Text.length . innerText . parseTags $ s
29 goBlock (RawBlock _ s) = 0
30 goBlock Null = 0
31 goBlock (Table _ (Caption msc bs') _ (TableHead _ thrs) tbs (TableFoot _ tfrs)) =
32 goInlines (concat (maybeToList msc)) +
33 goBlocks bs' +
34 goRows thrs +
35 goRows tfrs +
36 sum (map (\(TableBody _ _ hr br) -> goRows hr + goRows br) tbs)
37
38 goRows = sum . map goRow
39 goRow (Row _ cells) = sum . map goCell $ cells
40 goCell (Cell _ _ _ _ bs') = goBlocks bs'
41
42 goInlines = sum . map goInline
43 goInlines2 = sum . map goInlines
44
45 goInline :: Inline -> Int
46 goInline (Cite _ is) = goInlines is
47 goInline (Code _ s) = Text.length s
48 goInline (Emph is) = goInlines is
49 goInline (Image _ is (_, s)) = goInlines is + Text.length s
50 goInline (Link _ is (_, s)) = goInlines is + Text.length s
51 goInline (Math _ s) = Text.length s
52 goInline (Note bs') = goBlocks bs'
53 goInline (Quoted _ is) = goInlines is
54 goInline (RawInline _ s) = Text.length s
55 goInline (SmallCaps is) = goInlines is
56 goInline (Span _ s) = goInlines s
57 goInline (Str s) = Text.length s
58 goInline (Strikeout is) = goInlines is
59 goInline (Strong is) = goInlines is
60 goInline (Subscript is) = goInlines is
61 goInline (Superscript is) = goInlines is
62 goInline (Underline is) = goInlines is
63 goInline LineBreak = 1
64 goInline SoftBreak = 1
65 goInline Space = 1