diff --git a/.gitignore b/.gitignore index 9d4f4b0..6a78d65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ _build _tmp +dist-newstyle diff --git a/Makefile b/Makefile index 91766c3..bb26ae8 100644 --- a/Makefile +++ b/Makefile @@ -12,20 +12,30 @@ OUTPUTSTYLE = $(patsubst %,$(BUILDDIR)/%,$(STYLE)) OUTPUT = $(OUTPUTPAGES) $(OUTPUTSTYLE) +LANGFILTER = $(TMPDIR)/langfilter +EXECS = $(LANGFILTER) + .PHONY: all all: build .PHONY: build build: $(OUTPUT) -$(BUILDDIR)/%.html: $(PAGESDIR)/%.md $(TEMPLATE) +$(BUILDDIR)/%.html: $(PAGESDIR)/%.md $(TEMPLATE) $(LANGFILTER) mkdir -p $(dir $@) - pandoc -s --toc --template $(TEMPLATE) -o $@ $< + pandoc -s --toc --template $(TEMPLATE) --filter $(LANGFILTER) -o $@ $< $(BUILDDIR)/%: % mkdir -p $(dir $@) cp $< $@ +$(LANGFILTER): langfilter/*.hs langfilter/langfilter.cabal + mkdir -p $(dir $@) + cabal build -v0 all + find dist-newstyle -name $(notdir $@) \ + -print -type f -exec cp {} $(TMPDIR) \; + + .PHONY: clean distclean clean: rm -rf $(BUILDDIR) diff --git a/cabal.project b/cabal.project new file mode 100644 index 0000000..e4aa891 --- /dev/null +++ b/cabal.project @@ -0,0 +1 @@ +packages: ./langfilter diff --git a/langfilter/langfilter.cabal b/langfilter/langfilter.cabal new file mode 100644 index 0000000..4c18973 --- /dev/null +++ b/langfilter/langfilter.cabal @@ -0,0 +1,23 @@ +cabal-version: 2.2 +name: langfilter +version: 0.1.0 +synopsis: filter for conlang stuff +license: AGPL-3.0-or-later + +author: Rhiannon Morris +maintainer: Rhiannon Morris + +executable langfilter + hs-source-dirs: . + main-is: langfilter.hs + ghc-options: + -Wall -threaded -rtsopts -with-rtsopts=-N + default-language: Haskell2010 + default-extensions: + BlockArguments, + LambdaCase, + PatternSynonyms, + ViewPatterns + build-depends: + base ^>= 4.14.0.0, + pandoc-types == 1.17.* diff --git a/langfilter/langfilter.hs b/langfilter/langfilter.hs new file mode 100644 index 0000000..090c47e --- /dev/null +++ b/langfilter/langfilter.hs @@ -0,0 +1,27 @@ +import Text.Pandoc.Definition +import Text.Pandoc.JSON +import Text.Pandoc.Builder + +main :: IO () +main = toJSONFilter \case + Code _ txt + | Just _ <- enclosed '/' '/' txt -> + Span (cls ["ipa", "ipa-broad"]) $ text' txt + | Just _ <- enclosed '[' ']' txt -> + Span (cls ["ipa", "ipa-narrow"]) $ text' txt + | Just txt' <- enclosed '{' '}' txt -> + Span (cls ["lang"]) $ text' txt' + i -> i + +cls :: [String] -> Attr +cls cs = ("", cs, []) + +text' :: String -> [Inline] +text' = toList . text + + +enclosed :: Char -> Char -> String -> Maybe String +enclosed o c txt + | length txt >= 2, head txt == o, last txt == c + = Just $ init $ tail txt +enclosed _ _ _ = Nothing