mirror of https://github.com/voidlizard/hbs2
wip, fixme attribute in-place handling
This commit is contained in:
parent
6abd961ae8
commit
c64fea3ceb
|
@ -9,14 +9,16 @@ import Data.ByteString.Lazy.Char8 qualified as LBS8
|
||||||
import Data.Text qualified as Text
|
import Data.Text qualified as Text
|
||||||
import Data.Text.Encoding (decodeUtf8With)
|
import Data.Text.Encoding (decodeUtf8With)
|
||||||
import Data.Text.Encoding.Error (ignore)
|
import Data.Text.Encoding.Error (ignore)
|
||||||
|
import Data.Char (isSpace)
|
||||||
|
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.HashSet qualified as HS
|
import Data.HashSet qualified as HS
|
||||||
|
import Data.HashMap.Strict qualified as HM
|
||||||
import Data.Coerce
|
import Data.Coerce
|
||||||
|
|
||||||
import GHC.Generics (Generic)
|
|
||||||
import Data.Generics.Product.Fields (field)
|
import Data.Generics.Product.Fields (field)
|
||||||
import Lens.Micro.Platform
|
import Lens.Micro.Platform
|
||||||
|
import Text.InterpolatedString.Perl6 (qc)
|
||||||
|
|
||||||
import Streaming.Prelude qualified as S
|
import Streaming.Prelude qualified as S
|
||||||
|
|
||||||
|
@ -45,6 +47,7 @@ data FixmePart = FixmePart Int FixmeWhat
|
||||||
|
|
||||||
data FixmeWhat = FixmeHead Int Int Text Text
|
data FixmeWhat = FixmeHead Int Int Text Text
|
||||||
| FixmeLine Text
|
| FixmeLine Text
|
||||||
|
| FixmeAttr FixmeAttrName FixmeAttrVal
|
||||||
deriving stock (Show,Data,Generic)
|
deriving stock (Show,Data,Generic)
|
||||||
|
|
||||||
data P = P0 [FixmePart] | P1 Int Fixme [FixmePart]
|
data P = P0 [FixmePart] | P1 Int Fixme [FixmePart]
|
||||||
|
@ -66,6 +69,10 @@ scanBlob fpath lbs = do
|
||||||
comments <- fixmeGetCommentsFor fpath
|
comments <- fixmeGetCommentsFor fpath
|
||||||
<&> filter (not . LBS8.null) . fmap (LBS8.pack . Text.unpack)
|
<&> filter (not . LBS8.null) . fmap (LBS8.pack . Text.unpack)
|
||||||
|
|
||||||
|
anames <- asks fixmeEnvAttribs >>= readTVarIO <&> HS.toList
|
||||||
|
|
||||||
|
let setters = [ ( LBS8.pack [qc|${show $ pretty n}:|], n ) | n <- anames ]
|
||||||
|
|
||||||
let ls = LBS8.lines lbs & zip [0..]
|
let ls = LBS8.lines lbs & zip [0..]
|
||||||
|
|
||||||
parts <- S.toList_ do
|
parts <- S.toList_ do
|
||||||
|
@ -94,7 +101,19 @@ scanBlob fpath lbs = do
|
||||||
| li <= l0 && not (LBS8.null bs) -> next (S S0 (x:xs))
|
| li <= l0 && not (LBS8.null bs) -> next (S S0 (x:xs))
|
||||||
|
|
||||||
| otherwise -> do
|
| otherwise -> do
|
||||||
emitFixmeLine (fst x) l0 bs
|
|
||||||
|
let stripped = LBS8.dropWhile isSpace bs
|
||||||
|
let attr = headMay [ (s, LBS8.drop (LBS8.length a) stripped)
|
||||||
|
| (a,s) <- setters, LBS8.isPrefixOf a stripped
|
||||||
|
]
|
||||||
|
|
||||||
|
case attr of
|
||||||
|
Just (a,v) -> do
|
||||||
|
let vv = LBS8.toStrict v & decodeUtf8With ignore & Text.strip
|
||||||
|
emitFixmeAttr (fst x) l0 a (FixmeAttrVal vv)
|
||||||
|
Nothing -> do
|
||||||
|
emitFixmeLine (fst x) l0 bs
|
||||||
|
|
||||||
next (S (Sf (succEln env bs)) xs)
|
next (S (Sf (succEln env bs)) xs)
|
||||||
|
|
||||||
S _ [] -> pure ()
|
S _ [] -> pure ()
|
||||||
|
@ -111,9 +130,12 @@ scanBlob fpath lbs = do
|
||||||
emitFixme fx
|
emitFixme fx
|
||||||
next (P1 l (fromHead h) rs)
|
next (P1 l (fromHead h) rs)
|
||||||
|
|
||||||
(P1 w fx (FixmePart lno (FixmeLine what) : rs)) -> do
|
(P1 _ fx (FixmePart lno (FixmeLine what) : rs)) -> do
|
||||||
next (P1 lno (setLno lno $ over (field @"fixmePlain") (<> [FixmePlainLine what]) fx) rs)
|
next (P1 lno (setLno lno $ over (field @"fixmePlain") (<> [FixmePlainLine what]) fx) rs)
|
||||||
|
|
||||||
|
(P1 _ fx (FixmePart lno (FixmeAttr a v) : rs)) -> do
|
||||||
|
next (P1 lno (setLno lno $ over (field @"fixmeAttr") (<> HM.singleton a v) fx) rs)
|
||||||
|
|
||||||
(P1 _ fx []) -> emitFixme fx
|
(P1 _ fx []) -> emitFixme fx
|
||||||
(P0 ( _ : rs ) ) -> next (P0 rs)
|
(P0 ( _ : rs ) ) -> next (P0 rs)
|
||||||
(P0 []) -> pure ()
|
(P0 []) -> pure ()
|
||||||
|
@ -150,7 +172,10 @@ scanBlob fpath lbs = do
|
||||||
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.strip
|
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.strip
|
||||||
S.yield (FixmePart lno (FixmeHead lno lvl tag rest))
|
S.yield (FixmePart lno (FixmeHead lno lvl tag rest))
|
||||||
|
|
||||||
emitFixmeLine lno l0 restbs = do
|
emitFixmeAttr lno _ name val = do
|
||||||
|
S.yield (FixmePart lno (FixmeAttr name val))
|
||||||
|
|
||||||
|
emitFixmeLine lno _ restbs = do
|
||||||
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.stripEnd
|
let rest = decodeUtf8With ignore (LBS8.toStrict restbs) & Text.stripEnd
|
||||||
S.yield (FixmePart lno (FixmeLine rest))
|
S.yield (FixmePart lno (FixmeLine rest))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue