diff options
| author | John MacFarlane <[email protected]> | 2017-08-20 10:42:52 -0700 |
|---|---|---|
| committer | John MacFarlane <[email protected]> | 2017-08-20 10:42:52 -0700 |
| commit | dd08891e8ca10395de4fcb4040bd3c0d8892d5fe (patch) | |
| tree | 4cd1a267c663608c6deb97da3a497e9f4f365251 | |
| parent | bb2a4f2bc0ef7dcf2e9110762f8994a5c3834574 (diff) | |
Checkpoint, writers.figures
| -rw-r--r-- | src/Text/Pandoc/Writers/JATS.hs | 56 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/LaTeX.hs | 29 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/Markdown.hs | 13 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/MediaWiki.hs | 25 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/Ms.hs | 47 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/Muse.hs | 2 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/OpenDocument.hs | 14 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/RST.hs | 25 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/RTF.hs | 2 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/TEI.hs | 14 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/Texinfo.hs | 17 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/Textile.hs | 11 |
12 files changed, 128 insertions, 127 deletions
diff --git a/src/Text/Pandoc/Writers/JATS.hs b/src/Text/Pandoc/Writers/JATS.hs index 012ff8416..9818f8cfb 100644 --- a/src/Text/Pandoc/Writers/JATS.hs +++ b/src/Text/Pandoc/Writers/JATS.hs @@ -209,31 +209,16 @@ blockToJATS _ h@(Header _ _ _) = do return empty -- No Plain, everything needs to be in a block-level tag blockToJATS opts (Plain lst) = blockToJATS opts (Para lst) --- title beginning with fig: indicates that the image is a figure -blockToJATS opts (Para [Image (ident,_,kvs) txt - (src,'f':'i':'g':':':tit)]) = do - alt <- inlinesToJATS opts txt - let capt = if null txt - then empty - else inTagsSimple "caption" alt - let attr = [("id", ident) | not (null ident)] ++ - [(k,v) | (k,v) <- kvs, k `elem` ["fig-type", "orientation", - "position", "specific-use"]] - let mbMT = getMimeType src - let maintype = fromMaybe "image" $ - lookup "mimetype" kvs `mplus` - (takeWhile (/='/') <$> mbMT) - let subtype = fromMaybe "" $ - lookup "mime-subtype" kvs `mplus` - ((drop 1 . dropWhile (/='/')) <$> mbMT) - let graphicattr = [("mimetype",maintype), - ("mime-subtype",drop 1 subtype), - ("xlink:href",src), -- do we need to URL escape this? - ("xlink:title",tit)] - return $ inTags True "fig" attr $ - capt $$ selfClosingTag "graphic" graphicattr +inlineToJATS _ (Para [Image (ident,_,kvs) _ (src, tit)]) = do + let attr = getImageAttr ident kvs src tit + return $ selfClosingTag "graphic" attr blockToJATS opts (Para lst) = inTagsIndented "p" <$> inlinesToJATS opts lst +blockToJATS opts (Figure attr (Caption _short long) bs) = + contents <- blocksToJATS opts bs + capt <- blocksToJATS opts long + return $ inTags True "fig" attr $ + capt $$ contents blockToJATS opts (LineBlock lns) = blockToJATS opts $ linesToPara lns blockToJATS opts (BlockQuote blocks) = @@ -424,6 +409,12 @@ inlineToJATS opts (Link (ident,_,kvs) txt (src, tit)) = do contents <- inlinesToJATS opts txt return $ inTags False "ext-link" attr contents inlineToJATS _ (Image (ident,_,kvs) _ (src, tit)) = do + let attr = getImageAttr ident kvs src tit + return $ selfClosingTag "inline-graphic" attr + +getImageAttr :: String -> [(String, String)] -> String -> String + -> [(String, String)] +getImageAttr ident kvs src tit = let mbMT = getMimeType src let maintype = fromMaybe "image" $ lookup "mimetype" kvs `mplus` @@ -431,13 +422,12 @@ inlineToJATS _ (Image (ident,_,kvs) _ (src, tit)) = do let subtype = fromMaybe "" $ lookup "mime-subtype" kvs `mplus` ((drop 1 . dropWhile (/='/')) <$> mbMT) - let attr = [("id", ident) | not (null ident)] ++ - [("mimetype", maintype), - ("mime-subtype", subtype), - ("xlink:href", src)] ++ - [("xlink:title", tit) | not (null tit)] ++ - [(k,v) | (k,v) <- kvs, k `elem` ["baseline-shift", - "content-type", "specific-use", "xlink:actuate", - "xlink:href", "xlink:role", "xlink:show", - "xlink:type"]] - return $ selfClosingTag "inline-graphic" attr + in [("id", ident) | not (null ident)] ++ + [("mimetype", maintype), + ("mime-subtype", subtype), + ("xlink:href", src)] ++ + [("xlink:title", tit) | not (null tit)] ++ + [(k,v) | (k,v) <- kvs, k `elem` ["baseline-shift", + "content-type", "specific-use", "xlink:actuate", + "xlink:href", "xlink:role", "xlink:show", + "xlink:type"]] diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs index 4a81cd245..5a04c33c8 100644 --- a/src/Text/Pandoc/Writers/LaTeX.hs +++ b/src/Text/Pandoc/Writers/LaTeX.hs @@ -488,41 +488,40 @@ blockToLaTeX (Div (identifier,classes,kvs) bs) = do else linkAnchor $$ txt fmap (wrapColumns . wrapColumn . wrapDir . wrapLang . wrapNotes) $ blockListToLaTeX bs +-- . . . indicates pause in beamer slides +blockToLaTeX (Para [Str ".",Space,Str ".",Space,Str "."]) = do + beamer <- gets stBeamer + if beamer + then blockToLaTeX (RawBlock "latex" "\\pause") + else inlineListToLaTeX [Str ".",Space,Str ".",Space,Str "."] +blockToLaTeX (Para lst) = + inlineListToLaTeX $ dropWhile isLineBreakOrSpace lst blockToLaTeX (Plain lst) = inlineListToLaTeX $ dropWhile isLineBreakOrSpace lst --- title beginning with fig: indicates that the image is a figure -blockToLaTeX (Para [Image attr@(ident, _, _) txt (src,'f':'i':'g':':':tit)]) = do +blockToLaTeX (Figure (ident,clasess,kvs) (Caption short long) bs) = do inNote <- gets stInNote inMinipage <- gets stInMinipage modify $ \st -> st{ stInMinipage = True, stNotes = [] } - capt <- inlineListToLaTeX txt + contents <- blockListToLaTeX bs + capt <- blockListToLaTeX long notes <- gets stNotes modify $ \st -> st{ stInMinipage = False, stNotes = [] } -- We can't have footnotes in the list of figures, so remove them: captForLof <- if null notes then return empty - else brackets <$> inlineListToLaTeX (walk deNote txt) - img <- inlineToLaTeX (Image attr txt (src,tit)) + else brackets <$> inlineListToLaTeX (walk deNote short) let footnotes = notesToLaTeX notes lab <- labelFor ident let caption = "\\caption" <> captForLof <> braces capt <> lab - let figure = cr <> "\\begin{figure}" $$ "\\centering" $$ img $$ + let figure = cr <> "\\begin{figure}" $$ "\\centering" $$ contents $$ caption $$ "\\end{figure}" <> cr figure' <- hypertarget True ident figure return $ if inNote || inMinipage -- can't have figures in notes or minipage (here, table cell) -- http://www.tex.ac.uk/FAQ-ouparmd.html - then "\\begin{center}" $$ img $+$ capt $$ "\\end{center}" + then "\\begin{center}" $$ contents $+$ capt $$ "\\end{center}" else figure' $$ footnotes --- . . . indicates pause in beamer slides -blockToLaTeX (Para [Str ".",Space,Str ".",Space,Str "."]) = do - beamer <- gets stBeamer - if beamer - then blockToLaTeX (RawBlock "latex" "\\pause") - else inlineListToLaTeX [Str ".",Space,Str ".",Space,Str "."] -blockToLaTeX (Para lst) = - inlineListToLaTeX $ dropWhile isLineBreakOrSpace lst blockToLaTeX (LineBlock lns) = do blockToLaTeX $ linesToPara lns blockToLaTeX (BlockQuote lst) = do diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs index 95977ce17..c105efea9 100644 --- a/src/Text/Pandoc/Writers/Markdown.hs +++ b/src/Text/Pandoc/Writers/Markdown.hs @@ -432,11 +432,18 @@ blockToMarkdown' opts (Plain inlines) = do -> text $ escapeMarker rendered | otherwise -> contents return $ contents' <> cr --- title beginning with fig: indicates figure -blockToMarkdown' opts (Para [Image attr alt (src,'f':'i':'g':':':tit)]) = - blockToMarkdown opts (Para [Image attr alt (src,tit)]) blockToMarkdown' opts (Para inlines) = (<> blankline) `fmap` blockToMarkdown opts (Plain inlines) +blockToMarkdown' opts (Figure (ident,classes,kvs) + (Caption short long) bs) = + case bs of + [Image (_,classes',kvs') alt (src,tit)] + | isEnabled Ext_implicit_figures opts -> + blockToMarkdown opts (Para [Image (ident,classes',kvs') + short (src,tit)]) + _ -> blockToMarkdown opts $ + Div (ident,"figure":classes,kvs) + (bs ++ [Div ("",["caption"],[]) long]) blockToMarkdown' opts (LineBlock lns) = if isEnabled Ext_line_blocks opts then do diff --git a/src/Text/Pandoc/Writers/MediaWiki.hs b/src/Text/Pandoc/Writers/MediaWiki.hs index 58d1b0707..0699036f8 100644 --- a/src/Text/Pandoc/Writers/MediaWiki.hs +++ b/src/Text/Pandoc/Writers/MediaWiki.hs @@ -105,17 +105,6 @@ blockToMediaWiki (Div attrs bs) = do blockToMediaWiki (Plain inlines) = inlineListToMediaWiki inlines --- title beginning with fig: indicates that the image is a figure -blockToMediaWiki (Para [Image attr txt (src,'f':'i':'g':':':tit)]) = do - capt <- if null txt - then return "" - else ("|caption " ++) `fmap` inlineListToMediaWiki txt - img <- imageToMediaWiki attr - let opt = if null txt - then "" - else "|alt=" ++ if null tit then capt else tit ++ capt - return $ "[[File:" ++ src ++ "|frame|none" ++ img ++ opt ++ "]]\n" - blockToMediaWiki (Para inlines) = do tags <- asks useTags lev <- asks listLevel @@ -124,6 +113,20 @@ blockToMediaWiki (Para inlines) = do then "<p>" ++ contents ++ "</p>" else contents ++ if null lev then "\n" else "" +blockToMediaWiki (Figure _attr (Caption _short long) + [Para [Image _imgattr alt (src,tit)]) = do + capt <- if null long + then return "" + else ("|caption " ++) `fmap` blockListToMediaWiki txt + img <- imageToMediaWiki attr + let opt = if null txt + then "" + else "|alt=" ++ tit + return $ "[[File:" ++ src ++ "|frame|none" ++ img ++ opt ++ capt ++ "]]\n" + +blockToMediaWiki (Figure _attr (Caption _short long) bs = + blockListToMediaWiki (bs ++ long) + blockToMediaWiki (LineBlock lns) = blockToMediaWiki $ linesToPara lns diff --git a/src/Text/Pandoc/Writers/Ms.hs b/src/Text/Pandoc/Writers/Ms.hs index 54eecdcc6..f8ff7a608 100644 --- a/src/Text/Pandoc/Writers/Ms.hs +++ b/src/Text/Pandoc/Writers/Ms.hs @@ -226,31 +226,19 @@ blockToMs opts (Div _ bs) = do return res blockToMs opts (Plain inlines) = liftM vcat $ mapM (inlineListToMs' opts) $ splitSentences inlines -blockToMs opts (Para [Image attr alt (src,_tit)]) -- figure - | let ext = takeExtension src in (ext == ".ps" || ext == ".eps") = do - let (mbW,mbH) = (inPoints opts <$> dimension Width attr, - inPoints opts <$> dimension Height attr) - let sizeAttrs = case (mbW, mbH) of - (Just wp, Nothing) -> space <> doubleQuotes - (text (show (floor wp :: Int) ++ "p")) - (Just wp, Just hp) -> space <> doubleQuotes - (text (show (floor wp :: Int) ++ "p")) <> - space <> - doubleQuotes (text (show (floor hp :: Int))) - _ -> empty - capt <- inlineListToMs' opts alt - return $ nowrap (text ".PSPIC -C " <> - doubleQuotes (text (escapeString src)) <> - sizeAttrs) $$ - text ".ce 1000" $$ - capt $$ - text ".ce 0" blockToMs opts (Para inlines) = do firstPara <- gets stFirstPara resetFirstPara contents <- liftM vcat $ mapM (inlineListToMs' opts) $ splitSentences inlines return $ text (if firstPara then ".LP" else ".PP") $$ contents +blockToMs opts (Figure attr (Caption _short long) bs) = do + contents <- blockListToMs opts bs + capt <- blockListToMs opts long + return $ contents $$ + text ".ce 1000" $$ + capt $$ + text ".ce 0" blockToMs _ b@(RawBlock f str) | f == Format "ms" = return $ text str | otherwise = do @@ -525,8 +513,25 @@ inlineToMs opts (Link _ txt (src, _)) = do doubleQuotes (text (escapeUri src)) <> text " -A " <> doubleQuotes (text "\\c") <> space <> text "\\") <> cr <> text " -- " <> doubleQuotes (nowrap contents) <> cr <> text "\\&" -inlineToMs _ (Image _ alternate (_, _)) = - return $ char '[' <> text "IMAGE: " <> +inlineToMs opts (Image attr alternate (src, tit)) = + | takeExtension src `elem` [".ps", ".eps"] = do + let (mbW,mbH) = (inPoints opts <$> dimension Width attr, + inPoints opts <$> dimension Height attr) + let sizeAttrs = case (mbW, mbH) of + (Just wp, Nothing) -> space <> doubleQuotes + (text (show (floor wp :: Int) ++ "p")) + (Just wp, Just hp) -> space <> doubleQuotes + (text (show (floor wp :: Int) ++ "p")) <> + space <> + doubleQuotes (text (show (floor hp :: Int))) + _ -> empty + capt <- inlineListToMs' opts alt + return $ cr <> nowrap (text ".PSPIC -C " <> + doubleQuotes (text (escapeString src)) <> + sizeAttrs) <> cr + | otherwise = do + report $ CouldNotConvertImage src "only .ps and .eps are supported in ms" + return $ char '[' <> text "IMAGE: " <> text (escapeString (stringify alternate)) <> char ']' inlineToMs _ (Note contents) = do modify $ \st -> st{ stNotes = contents : stNotes st } diff --git a/src/Text/Pandoc/Writers/Muse.hs b/src/Text/Pandoc/Writers/Muse.hs index 3a5eefc18..28eeeb337 100644 --- a/src/Text/Pandoc/Writers/Muse.hs +++ b/src/Text/Pandoc/Writers/Muse.hs @@ -256,6 +256,8 @@ blockToMuse (Table caption _ _ headers rows) = do $$ body $$ (if null caption then empty else " |+ " <> caption' <> " +|") $$ blankline +blockToMuse (Figure _attr (Caption _short long) bs) = + blockListToMuse (bs ++ long) blockToMuse (Div _ bs) = blockListToMuse bs blockToMuse Null = return empty diff --git a/src/Text/Pandoc/Writers/OpenDocument.hs b/src/Text/Pandoc/Writers/OpenDocument.hs index ed3dabb87..e80850a6f 100644 --- a/src/Text/Pandoc/Writers/OpenDocument.hs +++ b/src/Text/Pandoc/Writers/OpenDocument.hs @@ -322,11 +322,11 @@ blockToOpenDocument o bs | Plain b <- bs = if null b then return empty else inParagraphTags =<< inlinesToOpenDocument o b - | Para [Image attr c (s,'f':'i':'g':':':t)] <- bs - = figure attr c s t | Para b <- bs = if null b then return empty else inParagraphTags =<< inlinesToOpenDocument o b + | Figure attr (Caption _short long) bs <- bs + = figure attr long bs | LineBlock b <- bs = blockToOpenDocument o $ linesToPara b | Div attr xs <- bs = withLangFromAttr attr (blocksToOpenDocument o xs) @@ -384,11 +384,11 @@ blockToOpenDocument o bs , ("table:style-name", name) ] (vcat columns $$ th $$ vcat tr) $$ captionDoc figure attr caption source title | null caption = - withParagraphStyle o "Figure" [Para [Image attr caption (source,title)]] - | otherwise = do - imageDoc <- withParagraphStyle o "FigureWithCaption" [Para [Image attr caption (source,title)]] - captionDoc <- withParagraphStyle o "FigureCaption" [Para caption] - return $ imageDoc $$ captionDoc + withParagraphStyle o "Figure" bs + | otherwise = do + figDoc <- withParagraphStyle o "FigureWithCaption" bs + captionDoc <- withParagraphStyle o "FigureCaption" caption + return $ figDoc $$ captionDoc colHeadsToOpenDocument :: PandocMonad m => WriterOptions -> String -> [String] -> [[Block]] diff --git a/src/Text/Pandoc/Writers/RST.hs b/src/Text/Pandoc/Writers/RST.hs index 8c941f568..f7fe673f8 100644 --- a/src/Text/Pandoc/Writers/RST.hs +++ b/src/Text/Pandoc/Writers/RST.hs @@ -211,23 +211,28 @@ blockToRST (Div attr bs) = do let endTag = ".. raw:: html" $+$ nest 3 "</div>" return $ blankline <> startTag $+$ contents $+$ endTag $$ blankline blockToRST (Plain inlines) = inlineListToRST inlines --- title beginning with fig: indicates that the image is a figure -blockToRST (Para [Image attr txt (src,'f':'i':'g':':':tit)]) = do - capt <- inlineListToRST txt +blockToRST (Para inlines) + | LineBreak `elem` inlines = do -- use line block if LineBreaks + linesToLineBlock $ splitBy (==LineBreak) inlines + | otherwise = do + contents <- inlineListToRST inlines + return $ contents <> blankline +blockToRST (Figure attr (Caption _short long) + [Para [Image _ alt (src,_)]]) = do + capt <- inlineListToRST long dims <- imageDimsToRST attr + alt' <- inlineListToRST alt let fig = "figure:: " <> text src - alt = ":alt: " <> if null tit then capt else text tit + alt = ":alt: " <> text alt' (_,cls,_) = attr classes = if null cls then empty else ":figclass: " <> text (unwords cls) return $ hang 3 ".. " (fig $$ alt $$ classes $$ dims $+$ capt) $$ blankline -blockToRST (Para inlines) - | LineBreak `elem` inlines = do -- use line block if LineBreaks - linesToLineBlock $ splitBy (==LineBreak) inlines - | otherwise = do - contents <- inlineListToRST inlines - return $ contents <> blankline +blockToRST (Figure attr (Caption _short long) bs = do + bs <- blockListToRST bs + capt <- inlineListToRST long + return $ bs $+$ capt blockToRST (LineBlock lns) = linesToLineBlock lns blockToRST (RawBlock f@(Format f') str) diff --git a/src/Text/Pandoc/Writers/RTF.hs b/src/Text/Pandoc/Writers/RTF.hs index 48d31c7bf..0d19b3f88 100644 --- a/src/Text/Pandoc/Writers/RTF.hs +++ b/src/Text/Pandoc/Writers/RTF.hs @@ -260,6 +260,8 @@ blockToRTF :: PandocMonad m blockToRTF _ _ Null = return "" blockToRTF indent alignment (Div _ bs) = blocksToRTF indent alignment bs +blockToRTF indent alignment (Figure _attr (Caption _short long) bs) = + blocksToRTF indent alignment (bs ++ long) blockToRTF indent alignment (Plain lst) = rtfCompact indent 0 alignment <$> inlinesToRTF lst blockToRTF indent alignment (Para lst) = diff --git a/src/Text/Pandoc/Writers/TEI.hs b/src/Text/Pandoc/Writers/TEI.hs index 26070966e..a46a77c1f 100644 --- a/src/Text/Pandoc/Writers/TEI.hs +++ b/src/Text/Pandoc/Writers/TEI.hs @@ -167,20 +167,10 @@ blockToTEI _ h@(Header _ _ _) = do -- we use treat as Para to ensure that Plain text ends up contained by -- something: blockToTEI opts (Plain lst) = blockToTEI opts $ Para lst --- title beginning with fig: indicates that the image is a figure ---blockToTEI opts (Para [Image attr txt (src,'f':'i':'g':':':_)]) = --- let alt = inlinesToTEI opts txt --- capt = if null txt --- then empty --- else inTagsSimple "title" alt --- in inTagsIndented "figure" $ --- capt $$ --- (inTagsIndented "mediaobject" $ --- (inTagsIndented "imageobject" --- (imageToTEI opts attr src)) $$ --- inTagsSimple "textobject" (inTagsSimple "phrase" alt)) blockToTEI opts (Para lst) = inTags False "p" [] <$> inlinesToTEI opts lst +blockToTEI opts (Figure _attr (Caption _short long) bs) = do + blocksToTEI opts (bs ++ long) blockToTEI opts (LineBlock lns) = blockToTEI opts $ linesToPara lns blockToTEI opts (BlockQuote blocks) = diff --git a/src/Text/Pandoc/Writers/Texinfo.hs b/src/Text/Pandoc/Writers/Texinfo.hs index 549d4f3d9..2d38ffa4e 100644 --- a/src/Text/Pandoc/Writers/Texinfo.hs +++ b/src/Text/Pandoc/Writers/Texinfo.hs @@ -145,18 +145,17 @@ blockToTexinfo (Div _ bs) = blockListToTexinfo bs blockToTexinfo (Plain lst) = inlineListToTexinfo lst --- title beginning with fig: indicates that the image is a figure -blockToTexinfo (Para [Image attr txt (src,'f':'i':'g':':':tit)]) = do - capt <- if null txt - then return empty - else (\c -> text "@caption" <> braces c) `fmap` - inlineListToTexinfo txt - img <- inlineToTexinfo (Image attr txt (src,tit)) - return $ text "@float" $$ img $$ capt $$ text "@end float" - blockToTexinfo (Para lst) = inlineListToTexinfo lst -- this is handled differently from Plain in blockListToTexinfo +blockToTexinfo (Figure _attr (Caption _short long) bs) = do + contents <- blockListToTexinfo bs + capt <- blockListToTexinfo long + return $ text "@float" $$ + contents $$ + (text "@cation" <> braces capt) $$ + text "@end float" + blockToTexinfo (LineBlock lns) = blockToTexinfo $ linesToPara lns diff --git a/src/Text/Pandoc/Writers/Textile.hs b/src/Text/Pandoc/Writers/Textile.hs index acc9eaa0f..ac4b00633 100644 --- a/src/Text/Pandoc/Writers/Textile.hs +++ b/src/Text/Pandoc/Writers/Textile.hs @@ -125,12 +125,6 @@ blockToTextile opts (Div attr bs) = do blockToTextile opts (Plain inlines) = inlineListToTextile opts inlines --- title beginning with fig: indicates that the image is a figure -blockToTextile opts (Para [Image attr txt (src,'f':'i':'g':':':tit)]) = do - capt <- blockToTextile opts (Para txt) - im <- inlineToTextile opts (Image attr txt (src,tit)) - return $ im ++ "\n" ++ capt - blockToTextile opts (Para inlines) = do useTags <- gets stUseTags listLevel <- gets stListLevel @@ -139,6 +133,11 @@ blockToTextile opts (Para inlines) = do then "<p>" ++ contents ++ "</p>" else contents ++ if null listLevel then "\n" else "" +blockToTextile opts (Figure _attr (Caption _short long) bs) = do + contents <- blockListToTextile opts bs + capt <- blockListToTextile opts bs + return $ im ++ "\n" ++ capt + blockToTextile opts (LineBlock lns) = blockToTextile opts $ linesToPara lns |
