aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2014-08-11 20:38:23 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2014-08-11 20:38:23 -0700
commit4c88e64894af56a71a15289a70b2ae7950157f86 (patch)
tree4a9f2b07c691c2af7ffa119c56b1ec8478b0c4f4
parent86d4da994a2e8a091aea325d9738f3b99ab4dbca (diff)
parent45ec035e93ec0c32f9fb7d7f2f99ca17de73ebf9 (diff)
downloadpandoc-4c88e64894af56a71a15289a70b2ae7950157f86.tar.gz
Merge pull request #1522 from jkr/dropCap
Drop cap
-rw-r--r--pandoc.cabal1
-rw-r--r--src/Text/Pandoc/Readers/Docx.hs26
-rw-r--r--src/Text/Pandoc/Readers/Docx/Parse.hs14
-rw-r--r--tests/Tests/Readers/Docx.hs10
-rw-r--r--tests/docx.drop_cap.docxbin0 -> 26931 bytes
-rw-r--r--tests/docx.drop_cap.native4
6 files changed, 40 insertions, 15 deletions
diff --git a/pandoc.cabal b/pandoc.cabal
index 4b2da0f9e..587258dc2 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -177,6 +177,7 @@ Extra-Source-Files:
tests/docx.codeblock.docx,
tests/docx.deep_normalize.docx,
tests/docx.definition_list.docx,
+ tests/docx.drop_cap.docx,
tests/docx.hanging_indent.docx,
tests/docx.headers.docx,
tests/docx.image.docx,
diff --git a/src/Text/Pandoc/Readers/Docx.hs b/src/Text/Pandoc/Readers/Docx.hs
index 085ee01fc..c856ca30a 100644
--- a/src/Text/Pandoc/Readers/Docx.hs
+++ b/src/Text/Pandoc/Readers/Docx.hs
@@ -105,11 +105,15 @@ readDocx opts bytes =
Left _ -> error $ "couldn't parse docx file"
data DState = DState { docxAnchorMap :: M.Map String String
- , docxMediaBag :: MediaBag }
+ , docxMediaBag :: MediaBag
+ , docxDropCap :: [Inline]
+ }
instance Default DState where
def = DState { docxAnchorMap = M.empty
- , docxMediaBag = mempty }
+ , docxMediaBag = mempty
+ , docxDropCap = []
+ }
data DEnv = DEnv { docxOptions :: ReaderOptions
, docxInHeaderBlock :: Bool }
@@ -457,13 +461,17 @@ bodyPartToBlocks (Paragraph pPr parparts)
return [hdr]
bodyPartToBlocks (Paragraph pPr parparts) = do
ils <- parPartsToInlines parparts >>= (return . normalizeSpaces)
- case ils of
- [] -> return []
- _ -> do
- return $
- rebuild
- (parStyleToContainers pPr)
- [Para ils]
+ dropIls <- gets docxDropCap
+ let ils' = reduceList $ dropIls ++ ils
+ if dropCap pPr
+ then do modify $ \s -> s { docxDropCap = ils' }
+ return []
+ else do modify $ \s -> s { docxDropCap = [] }
+ return $ case ils' of
+ [] -> []
+ _ -> rebuild
+ (parStyleToContainers pPr)
+ [Para $ ils']
bodyPartToBlocks (ListItem pPr numId lvl levelInfo parparts) = do
let
kvs = case levelInfo of
diff --git a/src/Text/Pandoc/Readers/Docx/Parse.hs b/src/Text/Pandoc/Readers/Docx/Parse.hs
index 1abd4bc6b..175bf2784 100644
--- a/src/Text/Pandoc/Readers/Docx/Parse.hs
+++ b/src/Text/Pandoc/Readers/Docx/Parse.hs
@@ -146,12 +146,14 @@ data ParIndentation = ParIndentation { leftParIndent :: Maybe Integer
data ParagraphStyle = ParagraphStyle { pStyle :: [String]
, indentation :: Maybe ParIndentation
+ , dropCap :: Bool
}
deriving Show
defaultParagraphStyle :: ParagraphStyle
defaultParagraphStyle = ParagraphStyle { pStyle = []
, indentation = Nothing
+ , dropCap = False
}
@@ -637,8 +639,16 @@ elemToParagraphStyle ns element
(findAttr (elemName ns "w" "val"))
(findChildren (elemName ns "w" "pStyle") pPr)
, indentation =
- findChild (elemName ns "w" "ind") pPr >>=
- elemToParIndentation ns
+ findChild (elemName ns "w" "ind") pPr >>=
+ elemToParIndentation ns
+ , dropCap =
+ case
+ findChild (elemName ns "w" "framePr") pPr >>=
+ findAttr (elemName ns "w" "dropCap")
+ of
+ Just "none" -> False
+ Just _ -> True
+ Nothing -> False
}
elemToParagraphStyle _ _ = defaultParagraphStyle
diff --git a/tests/Tests/Readers/Docx.hs b/tests/Tests/Readers/Docx.hs
index c310cc8d7..65fdd4a55 100644
--- a/tests/Tests/Readers/Docx.hs
+++ b/tests/Tests/Readers/Docx.hs
@@ -82,14 +82,14 @@ compareMediaBagIO docxFile = do
df <- B.readFile docxFile
let (_, mb) = readDocx def df
bools <- mapM
- (\(fp, _, _) -> compareMediaPathIO fp mb docxFile)
+ (\(fp, _, _) -> compareMediaPathIO fp mb docxFile)
(mediaDirectory mb)
return $ and bools
testMediaBagIO :: String -> FilePath -> IO Test
testMediaBagIO name docxFile = do
outcome <- compareMediaBagIO docxFile
- return $ testCase name (assertBool
+ return $ testCase name (assertBool
("Media didn't match media bag in file " ++ docxFile)
outcome)
@@ -176,7 +176,10 @@ tests = [ testGroup "inlines"
"code block"
"docx.codeblock.docx"
"docx.codeblock.native"
-
+ , testCompare
+ "dropcap paragraphs"
+ "docx.drop_cap.docx"
+ "docx.drop_cap.native"
]
, testGroup "track changes"
[ testCompare
@@ -229,4 +232,3 @@ tests = [ testGroup "inlines"
]
]
-
diff --git a/tests/docx.drop_cap.docx b/tests/docx.drop_cap.docx
new file mode 100644
index 000000000..19fab4a52
--- /dev/null
+++ b/tests/docx.drop_cap.docx
Binary files differ
diff --git a/tests/docx.drop_cap.native b/tests/docx.drop_cap.native
new file mode 100644
index 000000000..d361cfb0b
--- /dev/null
+++ b/tests/docx.drop_cap.native
@@ -0,0 +1,4 @@
+[Para [Str "Drop",Space,Str "cap."]
+,Para [Str "Next",Space,Str "paragraph."]
+,Para [Str "Drop",Space,Str "cap",Space,Str "in",Space,Str "margin."]
+,Para [Str "Drop",Space,Str "cap",Space,Str "(not",Space,Str "really)."]]