Better fix for #2187.

* Reverted kludgy change to make-windows-installer.bat.
* Removed make-reference-fiels.hs.
* Moved the individual ingredients of reference.docx and
  reference.odt to the data directory.
* Removed reference.docx and reference.odt from data directory.
* We now build the reference archives from their ingredient pieces
  in the docx and odt writers, instead of having a reference.docx
  or reference.odt intermediary.

This should fix #2187.

It also simplifies the bulid procedure.

The one thing users may notice is different is that you can
no longer get the reference.docx or reference.odt using
`--print-default-data-file`.  Instead, simply generate a
docx or odt using pandoc with a blank or minimal input,
and use that (or a customized version) with `--reference-docx`
or `--reference-odt`.
This commit is contained in:
John MacFarlane 2015-05-28 18:15:01 -07:00
parent c1f6d5e31f
commit b241472a90
5 changed files with 78 additions and 65 deletions

View file

@ -38,12 +38,11 @@ main = defaultMainWithHooks $ simpleUserHooks {
, instHook = \pkgdescr ->
instHook simpleUserHooks pkgdescr{ executables =
[x | x <- executables pkgdescr, exeName x `notElem` noInstall] }
, postBuild = \args bf pkgdescr lbi -> do
, postBuild = \args bf pkgdescr lbi ->
makeManPages args bf pkgdescr lbi
makeReferenceFiles args bf pkgdescr lbi
}
where
noInstall = ["make-pandoc-man-pages","make-reference-files"]
noInstall = ["make-pandoc-man-pages"]
ppBlobSuffixHandler :: PPSuffixHandler
ppBlobSuffixHandler = ("hsb", \_ _ ->
@ -64,13 +63,3 @@ makeManPages _ bf _ LocalBuildInfo{buildDir=buildDir}
where
verbosity = fromFlagOrDefault normal $ buildVerbosity bf
progPath = buildDir </> "make-pandoc-man-pages" </> "make-pandoc-man-pages"
makeReferenceFiles :: Args -> BuildFlags -> PackageDescription -> LocalBuildInfo -> IO ()
makeReferenceFiles _ bf _ LocalBuildInfo{buildDir=buildDir}
= mapM_
(rawSystemExit verbosity progPath . return)
referenceFormats
where
verbosity = fromFlagOrDefault normal $ buildVerbosity bf
progPath = buildDir </> "make-reference-files" </> "make-reference-files"
referenceFormats = ["docx", "odt"]

View file

@ -69,28 +69,6 @@ Data-Files:
data/templates/default.org
data/templates/default.epub
data/templates/default.epub3
-- data for ODT writer
data/reference.odt
-- data for docx writer
data/reference.docx
-- stylesheet for EPUB writer
data/epub.css
-- data for LaTeXMathML writer
data/LaTeXMathML.js
data/MathMLinHTML.js
-- data for dzslides writer
data/dzslides/template.html
-- sample lua custom writer
data/sample.lua
-- documentation
README, COPYRIGHT
Extra-Source-Files:
-- documentation
INSTALL, BUGS, CONTRIBUTING.md, changelog
-- code to create pandoc.1 man page
Makefile
man/man1/pandoc.1.template
man/man5/pandoc_markdown.5.template
-- source files for reference.docx
data/docx/[Content_Types].xml
data/docx/_rels/.rels
@ -116,6 +94,24 @@ Extra-Source-Files:
data/odt/Configurations2/accelerator/current.xml
data/odt/Thumbnails/thumbnail.png
data/odt/META-INF/manifest.xml
-- stylesheet for EPUB writer
data/epub.css
-- data for LaTeXMathML writer
data/LaTeXMathML.js
data/MathMLinHTML.js
-- data for dzslides writer
data/dzslides/template.html
-- sample lua custom writer
data/sample.lua
-- documentation
README, COPYRIGHT
Extra-Source-Files:
-- documentation
INSTALL, BUGS, CONTRIBUTING.md, changelog
-- code to create pandoc.1 man page
Makefile
man/man1/pandoc.1.template
man/man5/pandoc_markdown.5.template
-- trypandoc
trypandoc/Makefile
trypandoc/index.html
@ -439,16 +435,6 @@ Executable make-pandoc-man-pages
Default-Language: Haskell98
Buildable: True
Executable make-reference-files
Main-Is: make-reference-files.hs
Hs-Source-Dirs: data
Build-Depends: zip-archive >= 0.2.3.4 && < 0.3,
base >= 4.2 && < 5,
filepath >= 1.1 && < 1.5,
directory >= 1 && < 1.3,
bytestring >= 0.9 && < 0.11
Default-Language: Haskell2010
Test-Suite test-pandoc
Type: exitcode-stdio-1.0
Main-Is: test-pandoc.hs

View file

@ -211,11 +211,10 @@ writeDocx opts doc@(Pandoc meta _) = do
let doc' = stripInvalidChars . walk fixDisplayMath $ doc
username <- lookup "USERNAME" <$> getEnvironment
utctime <- getCurrentTime
refArchive <- liftM (toArchive . toLazy) $
case writerReferenceDocx opts of
Just f -> B.readFile f
Nothing -> readDataFile datadir "reference.docx"
distArchive <- liftM (toArchive . toLazy) $ readDataFile datadir "reference.docx"
distArchive <- getDefaultReferenceDocx datadir
refArchive <- case writerReferenceDocx opts of
Just f -> liftM (toArchive . toLazy) $ B.readFile f
Nothing -> return distArchive
parsedDoc <- parseXml refArchive distArchive "word/document.xml"
let wname f qn = qPrefix qn == Just "w" && f (qName qn)
@ -474,7 +473,7 @@ writeDocx opts doc@(Pandoc meta _) = do
settingsEntry <- copyChildren refArchive distArchive settingsPath epochtime settingsList
let entryFromArchive arch path =
maybe (fail $ path ++ " corrupt or missing in reference docx")
maybe (fail $ path ++ " missing in reference docx")
return
(findEntryByPath path arch `mplus` findEntryByPath path distArchive)
docPropsAppEntry <- entryFromArchive refArchive "docProps/app.xml"
@ -1204,11 +1203,12 @@ defaultFootnotes = [ mknode "w:footnote"
parseXml :: Archive -> Archive -> String -> IO Element
parseXml refArchive distArchive relpath =
case ((findEntryByPath relpath refArchive `mplus`
findEntryByPath relpath distArchive)
>>= parseXMLDoc . UTF8.toStringLazy . fromEntry) of
case findEntryByPath relpath refArchive `mplus`
findEntryByPath relpath distArchive of
Nothing -> fail $ relpath ++ " missing in reference docx"
Just e -> case parseXMLDoc . UTF8.toStringLazy . fromEntry $ e of
Nothing -> fail $ relpath ++ " corrupt in reference docx"
Just d -> return d
Nothing -> fail $ relpath ++ " corrupt or missing in reference docx"
-- | Scales the image to fit the page
-- sizes are passed in emu
@ -1219,3 +1219,28 @@ fitToPage (x, y) pageWidth
(pageWidth, round $
((fromIntegral pageWidth) / ((fromIntegral :: Integer -> Double) x)) * (fromIntegral y))
| otherwise = (x, y)
getDefaultReferenceDocx :: Maybe FilePath -> IO Archive
getDefaultReferenceDocx datadir = do
let paths = ["[Content_Types].xml",
"_rels/.rels",
"docProps/app.xml",
"docProps/core.xml",
"word/document.xml",
"word/fontTable.xml",
"word/footnotes.xml",
"word/numbering.xml",
"word/settings.xml",
"word/webSettings.xml",
"word/styles.xml",
"word/_rels/document.xml.rels",
"word/_rels/footnotes.xml.rels",
"word/theme/theme1.xml"]
let pathToEntry path = do epochtime <- (floor . utcTimeToPOSIXSeconds) <$>
getCurrentTime
contents <- toLazy <$> readDataFile datadir
("docx/" ++ path)
return $ toEntry path epochtime contents
entries <- mapM pathToEntry paths
let archive = foldr addEntryToArchive emptyArchive entries
return archive

View file

@ -60,11 +60,10 @@ writeODT :: WriterOptions -- ^ Writer options
writeODT opts doc@(Pandoc meta _) = do
let datadir = writerUserDataDir opts
let title = docTitle meta
refArchive <- liftM toArchive $
refArchive <-
case writerReferenceODT opts of
Just f -> B.readFile f
Nothing -> (B.fromChunks . (:[])) `fmap`
readDataFile datadir "reference.odt"
Just f -> liftM toArchive $ B.readFile f
Nothing -> getDefaultReferenceODT datadir
-- handle formulas and pictures
picEntriesRef <- newIORef ([] :: [Entry])
doc' <- walkM (transformPicMath opts picEntriesRef) $ walk fixDisplayMath doc
@ -178,3 +177,21 @@ transformPicMath _ entriesRef (Math t math) = do
, ("xlink:actuate", "onLoad")]
transformPicMath _ _ x = return x
getDefaultReferenceODT :: Maybe FilePath -> IO Archive
getDefaultReferenceODT datadir = do
let paths = ["mimetype",
"manifest.rdf",
"styles.xml",
"content.xml",
"meta.xml",
"settings.xml",
"Configurations2/accelerator/current.xml",
"Thumbnails/thumbnail.png",
"META-INF/manifest.xml"]
let pathToEntry path = do epochtime <- floor `fmap` getPOSIXTime
contents <- (B.fromChunks . (:[])) `fmap`
readDataFile datadir ("odt/" ++ path)
return $ toEntry path epochtime contents
entries <- mapM pathToEntry paths
return $ foldr addEntryToArchive emptyArchive entries

View file

@ -5,10 +5,6 @@ cabal sandbox init
cabal clean
cabal install hsb2hs
if %errorlevel% neq 0 exit /b %errorlevel%
REM We do it once to regenrate data/reference.docx/odt
cabal install -v1 --force --reinstall
cabal clean
REM then again for real, because otherwise it won't work with embed_data_files:
cabal install -v1 --force --reinstall --flags="embed_data_files" . pandoc-citeproc
if %errorlevel% neq 0 exit /b %errorlevel%
strip .\.cabal-sandbox\bin\pandoc.exe