git.iko.soy/typeable/pandoc
on master help sign in
Biblio: Improve footnote generation.

Patch from Andrea Rossato.

commit5e1dc6adda5b11a1d5e51dcccae4801f60b64f4b authorJohn MacFarlane <jgm@berkeley.edu> dateWed 3 Nov 2010, 12:58 (16 years ago) parent0758402
1 file changed+24−10
src/Text/Pandoc/Biblio.hs+24−10
src/Text/Pandoc/Biblio.hs+24−10
@@ -107,26 +107,35 @@ procInlines f b
107107mvCiteInNote :: [Inline] -> Block -> Block
108108mvCiteInNote is = procInlines mvCite
109109 where
110− elem_ x xs = case x of Cite cs _ -> (Cite cs []) `elem` xs; _ -> False
111110 mvCite :: [Inline] -> [Inline]
112111 mvCite inls
112+ | x:i:xs <- inls, startWPt xs
113+ , x == Space, i `elem_` is = split i xs ++ mvCite (tailInline xs)
113114 | x:i:xs <- inls
114− , x == Space, i `elem_` is = mvInNote i : mvCite xs
115− | i:xs <- inls, i `elem_` is = mvInNote i : mvCite xs
116− | i:xs <- inls, Note _ <- i = checkNt i : mvCite xs
117− | i:xs <- inls = i : mvCite xs
115+ , x == Space, i `elem_` is = mvInNote i : mvCite xs
116+ | i:xs <- inls, i `elem_` is
117+ , startWPt xs = split i xs ++ mvCite (tailInline xs)
118+ | i:xs <- inls, Note _ <- i = checkNt i : mvCite xs
119+ | i:xs <- inls = i : mvCite xs
118120 | otherwise = []
121+ elem_ x xs = case x of Cite cs _ -> (Cite cs []) `elem` xs; _ -> False
122+ split i xs = Str (headInline xs) : mvInNote i : []
119123 mvInNote i
120− | Cite t o <- i = Note [Para [Cite t $ toCapital o]]
121− | otherwise = Note [Para [i ]]
124+ | Cite t o <- i = Note [Para [Cite t $ sanitize o]]
125+ | otherwise = Note [Para [i ]]
126+ sanitize i
127+ | endWPt i = toCapital i
128+ | otherwise = toCapital (i ++ [Str "."])
129+
122130 checkPt i
123131 | Cite c o : xs <- i
124132 , headInline xs == lastInline o
125− , isPunct o = Cite c (initInline o) : checkPt xs
133+ , endWPt o = Cite c (initInline o) : checkPt xs
126134 | x:xs <- i = x : checkPt xs
127135 | otherwise = []
128− isPunct = and . map isPunctuation . lastInline
129− checkNt = processWith $ procInlines checkPt
136+ endWPt = and . map isPunctuation . lastInline
137+ startWPt = and . map isPunctuation . headInline
138+ checkNt = processWith $ procInlines checkPt
130139
131140headInline :: [Inline] -> String
132141headInline [] = []
@@ -164,6 +173,11 @@ initInline (i:[])
164173 init' s = if s /= [] then init s else []
165174initInline (i:xs) = i : initInline xs
166175
176+tailInline :: [Inline] -> [Inline]
177+tailInline = mapHeadInline tail'
178+ where
179+ tail' s = if s /= [] then tail s else []
180+
167181toCapital :: [Inline] -> [Inline]
168182toCapital = mapHeadInline toCap
169183 where