@@ -68,10 +68,13 @@ readTypst _opts inp = do
68
68
currentUTCTime = getCurrentTime,
69
69
lookupEnvVar = fmap (fmap T. unpack) . lookupEnv . T. pack,
70
70
checkExistence = fileExists }
71
- evaluateTypst ops inputName parsed >>=
72
- either (throwError . PandocParseError . T. pack . show ) pure >>=
73
- runParserT pPandoc () inputName . F. toList >>=
74
- either (throwError . PandocParseError . T. pack . show ) pure
71
+ res <- evaluateTypst ops inputName parsed
72
+ case res of
73
+ Left e -> throwError $ PandocParseError $ tshow e
74
+ Right cs -> do
75
+ let labs = findLabels cs
76
+ runParserT pPandoc labs inputName (F. toList cs) >>=
77
+ either (throwError . PandocParseError . T. pack . show ) pure
75
78
76
79
pBlockElt :: PandocMonad m => P m B. Blocks
77
80
pBlockElt = try $ do
@@ -98,13 +101,29 @@ pInline = try $ do
98
101
| " math." `T.isPrefixOf` tname
99
102
, tname /= " math.equation" ->
100
103
B. math . writeTeX <$> pMathMany (Seq. singleton res)
101
- Elt name@ (Identifier tname) pos fields ->
102
- case M. lookup name inlineHandlers of
103
- Nothing -> do
104
- ignored (" unknown inline element " <> tname <>
105
- " at " <> tshow pos)
106
- pure mempty
107
- Just handler -> handler Nothing fields
104
+ Elt name@ (Identifier tname) pos fields -> do
105
+ labs <- getState
106
+ labelTarget <- (do VLabel t <- getField " target" fields
107
+ True <$ guard (t `elem` labs))
108
+ <|> pure False
109
+ if tname == " ref" && not labelTarget
110
+ then do
111
+ -- @foo is a citation unless it links to a lab in the doc:
112
+ let targetToKey (Identifier " target" ) = Identifier " key"
113
+ targetToKey k = k
114
+ case M. lookup " cite" inlineHandlers of
115
+ Nothing -> do
116
+ ignored (" unknown inline element " <> tname <>
117
+ " at " <> tshow pos)
118
+ pure mempty
119
+ Just handler -> handler Nothing (M. mapKeys targetToKey fields)
120
+ else do
121
+ case M. lookup name inlineHandlers of
122
+ Nothing -> do
123
+ ignored (" unknown inline element " <> tname <>
124
+ " at " <> tshow pos)
125
+ pure mempty
126
+ Just handler -> handler Nothing fields
108
127
109
128
pPandoc :: PandocMonad m => P m B. Pandoc
110
129
pPandoc = B. doc <$> pBlocks
@@ -547,3 +566,12 @@ collapseAdjacentCites = B.fromList . foldr go [] . B.toList
547
566
modString :: (Text -> Text ) -> B. Inline -> B. Inline
548
567
modString f (B. Str t) = B. Str (f t)
549
568
modString _ x = x
569
+
570
+ findLabels :: Seq. Seq Content -> [Text ]
571
+ findLabels = foldr go []
572
+ where
573
+ go (Txt {}) = id
574
+ go (Lab t) = (t : )
575
+ go (Elt { eltFields = fs }) = \ ts -> foldr go' ts fs
576
+ go' (VContent cs) = (findLabels cs ++ )
577
+ go' _ = id
0 commit comments