git.iko.soy/typeable/pandoc
on master help sign in
Biblio: Improve footnote generation.
5e1dc6aJohn MacFarlane
src/Text/Pandoc/Biblio.hs+24−10
@@ -107,26 +107,35 @@ procInlines f b
107mvCiteInNote :: [Inline] -> Block -> Block
107mvCiteInNote :: [Inline] -> Block -> Block
108mvCiteInNote is = procInlines mvCite
108mvCiteInNote is = procInlines mvCite
109 where
109 where
110− elem_ x xs = case x of Cite cs _ -> (Cite cs []) `elem` xs; _ -> False
111 mvCite :: [Inline] -> [Inline]
110 mvCite :: [Inline] -> [Inline]
112 mvCite inls
111 mvCite inls
112+ | x:i:xs <- inls, startWPt xs
113+ , x == Space, i `elem_` is = split i xs ++ mvCite (tailInline xs)
113 | x:i:xs <- inls
114 | x:i:xs <- inls
114− , x == Space, i `elem_` is = mvInNote i : mvCite xs
115+ , x == Space, i `elem_` is = mvInNote i : mvCite xs
115− | i:xs <- inls, i `elem_` is = mvInNote i : mvCite xs
116+ | i:xs <- inls, i `elem_` is
117+ , startWPt xs = split i xs ++ mvCite (tailInline xs)
116− | i:xs <- inls, Note _ <- i = checkNt i : mvCite xs
118+ | i:xs <- inls, Note _ <- i = checkNt i : mvCite xs
117− | i:xs <- inls = i : mvCite xs
119+ | i:xs <- inls = i : mvCite xs
118 | otherwise = []
120 | otherwise = []
121+ elem_ x xs = case x of Cite cs _ -> (Cite cs []) `elem` xs; _ -> False
122+ split i xs = Str (headInline xs) : mvInNote i : []
119 mvInNote i
123 mvInNote i
120− | Cite t o <- i = Note [Para [Cite t $ toCapital o]]
124+ | Cite t o <- i = Note [Para [Cite t $ sanitize o]]
121− | otherwise = Note [Para [i ]]
125+ | otherwise = Note [Para [i ]]
126+ sanitize i
127+ | endWPt i = toCapital i
128+ | otherwise = toCapital (i ++ [Str "."])
129+
122 checkPt i
130 checkPt i
123 | Cite c o : xs <- i
131 | Cite c o : xs <- i
124 , headInline xs == lastInline o
132 , headInline xs == lastInline o
125− , isPunct o = Cite c (initInline o) : checkPt xs
133+ , endWPt o = Cite c (initInline o) : checkPt xs
126 | x:xs <- i = x : checkPt xs
134 | x:xs <- i = x : checkPt xs
127 | otherwise = []
135 | otherwise = []
128− isPunct = and . map isPunctuation . lastInline
136+ endWPt = and . map isPunctuation . lastInline
137+ startWPt = and . map isPunctuation . headInline
129− checkNt = processWith $ procInlines checkPt
138+ checkNt = processWith $ procInlines checkPt
130
139
131headInline :: [Inline] -> String
140headInline :: [Inline] -> String
132headInline [] = []
141headInline [] = []
@@ -164,6 +173,11 @@ initInline (i:[])
164 init' s = if s /= [] then init s else []
173 init' s = if s /= [] then init s else []
165initInline (i:xs) = i : initInline xs
174initInline (i:xs) = i : initInline xs
166
175
176+tailInline :: [Inline] -> [Inline]
177+tailInline = mapHeadInline tail'
178+ where
179+ tail' s = if s /= [] then tail s else []
180+
167toCapital :: [Inline] -> [Inline]
181toCapital :: [Inline] -> [Inline]
168toCapital = mapHeadInline toCap
182toCapital = mapHeadInline toCap
169 where
183 where