oop html block got parsed correct and then didn't do correct whitespace

This commit is contained in:
Pagwin 2026-02-27 22:51:28 -05:00
parent 8f31672b0f
commit 2a87e61a05
No known key found for this signature in database
GPG key ID: 81137023740CA260
2 changed files with 10 additions and 6 deletions

10
TODO.md
View file

@ -10,14 +10,16 @@
- Borsh - Borsh
- https://crates.io/crates/tree-sitter-highlight - https://crates.io/crates/tree-sitter-highlight
- Or potentially https://docs.rs/arborium/latest/arborium/ - Or potentially https://docs.rs/arborium/latest/arborium/
- [ ] Refactor template handling so templates include other templates via lambda rather than implicitly https://hackage-content.haskell.org/package/mustache-2.4.3.1/docs/Text-Mustache.html#v:overText
- [ ] Make a function which takes IR and spits out some kind of table of contents - [ ] Make a function which takes IR and spits out some kind of table of contents
- [ ] swap from using `draft` to using `date` for determing draft status, lack of date = draft
- [ ] setup font subsetting (font file minimization)
- `pyftsubset` (`fonttools subset`) is an external tool I can and probably should use
for this
- [ ] Refactor template handling so templates include other templates via lambda rather than implicitly https://hackage-content.haskell.org/package/mustache-2.4.3.1/docs/Text-Mustache.html#v:overText
- [ ] Fix time via timestamps potentially meaning something (via preshim?) and use local offset instead of absolute time https://www.rfc-editor.org/rfc/rfc3339#section-4.2
- [ ] Add rst or org support and convert markdown handling to custom parser instead of pandoc - [ ] Add rst or org support and convert markdown handling to custom parser instead of pandoc
- [ ] Add in functionality for footnotes - [ ] Add in functionality for footnotes
- There should be a per footnote template as well and also either the default or post template should have an attribute which handles footnotes - There should be a per footnote template as well and also either the default or post template should have an attribute which handles footnotes
- [ ] swap from using `draft` to using `date` for determing draft status, lack of date = draft
- [ ] Fix time via timestamps potentially meaning something (via preshim?) and use local offset instead of absolute time https://www.rfc-editor.org/rfc/rfc3339#section-4.2
- [ ] setup font subsetting (font file minimization)
- [ ] dev server setup (with live reloading) - [ ] dev server setup (with live reloading)
- https://hackage-content.haskell.org/package/warp-3.4.10 - https://hackage-content.haskell.org/package/warp-3.4.10
- https://hackage.haskell.org/package/file-embed - https://hackage.haskell.org/package/file-embed

View file

@ -10,6 +10,7 @@ module Markdown (document, metadata) where
import Control.Applicative (many, optional, some, (<|>)) import Control.Applicative (many, optional, some, (<|>))
import Control.Monad (guard, void) import Control.Monad (guard, void)
import Data.Functor.Identity (Identity) import Data.Functor.Identity (Identity)
import Data.List (intercalate)
import Data.Maybe (fromMaybe, maybeToList) import Data.Maybe (fromMaybe, maybeToList)
import Data.Proxy (Proxy (Proxy)) import Data.Proxy (Proxy (Proxy))
import Data.String (IsString) import Data.String (IsString)
@ -188,15 +189,16 @@ htmlBlock = do
attrs <- attrs <-
if not hasEnded if not hasEnded
then then
Just . toText . mconcat <$> htmlAttrs Just . toText . intercalate " " <$> htmlAttrs
else pure Nothing else pure Nothing
-- technically not standard markdown but I don't want to write a full HTML parser in my -- technically not standard markdown but I don't want to write a full HTML parser in my
inside <- many (notFollowedBy ((chunk $ "</" <> tagName <> ">") <|> chunk "</>") *> anySingle) inside <- many (notFollowedBy ((chunk $ "</" <> tagName <> ">") <|> chunk "</>") *> anySingle)
end <- toText <$> ((chunk $ "</" <> tagName <> ">") <|> chunk "</>") end <- toText <$> ((chunk $ "</" <> tagName <> ">") <|> chunk "</>")
-- if a blockEnding after some whitespace isn't next when we should parse this as inline text/paragraph -- if a blockEnding after some whitespace isn't next when we should parse this as inline text/paragraph
many ((notFollowedBy lineEnding) *> spaceChar) many ((notFollowedBy lineEnding) *> spaceChar)
lookAhead blockEnding lookAhead blockEnding
pure $ HTML $ HTMLTag $ T.concat ["<", toText tagName, fromMaybe "" attrs, ">", T.pack inside, if end == "</>" then "" else end] pure $ HTML $ HTMLTag $ T.concat ["<", toText tagName, " ", fromMaybe "" attrs, ">", T.pack inside, if end == "</>" then "" else end]
where where
tagNameEnd = (lookAhead spaceChar <* space) <|> char '>' tagNameEnd = (lookAhead spaceChar <* space) <|> char '>'
htmlAttrs = ((notFollowedBy $ char '>') *> htmlAttr) `sepBy` space htmlAttrs = ((notFollowedBy $ char '>') *> htmlAttr) `sepBy` space