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:
parent
c1f6d5e31f
commit
b241472a90
5 changed files with 78 additions and 65 deletions
15
Setup.hs
15
Setup.hs
|
@ -38,12 +38,11 @@ main = defaultMainWithHooks $ simpleUserHooks {
|
||||||
, instHook = \pkgdescr ->
|
, instHook = \pkgdescr ->
|
||||||
instHook simpleUserHooks pkgdescr{ executables =
|
instHook simpleUserHooks pkgdescr{ executables =
|
||||||
[x | x <- executables pkgdescr, exeName x `notElem` noInstall] }
|
[x | x <- executables pkgdescr, exeName x `notElem` noInstall] }
|
||||||
, postBuild = \args bf pkgdescr lbi -> do
|
, postBuild = \args bf pkgdescr lbi ->
|
||||||
makeManPages args bf pkgdescr lbi
|
makeManPages args bf pkgdescr lbi
|
||||||
makeReferenceFiles args bf pkgdescr lbi
|
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
noInstall = ["make-pandoc-man-pages","make-reference-files"]
|
noInstall = ["make-pandoc-man-pages"]
|
||||||
|
|
||||||
ppBlobSuffixHandler :: PPSuffixHandler
|
ppBlobSuffixHandler :: PPSuffixHandler
|
||||||
ppBlobSuffixHandler = ("hsb", \_ _ ->
|
ppBlobSuffixHandler = ("hsb", \_ _ ->
|
||||||
|
@ -64,13 +63,3 @@ makeManPages _ bf _ LocalBuildInfo{buildDir=buildDir}
|
||||||
where
|
where
|
||||||
verbosity = fromFlagOrDefault normal $ buildVerbosity bf
|
verbosity = fromFlagOrDefault normal $ buildVerbosity bf
|
||||||
progPath = buildDir </> "make-pandoc-man-pages" </> "make-pandoc-man-pages"
|
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"]
|
|
||||||
|
|
50
pandoc.cabal
50
pandoc.cabal
|
@ -69,28 +69,6 @@ Data-Files:
|
||||||
data/templates/default.org
|
data/templates/default.org
|
||||||
data/templates/default.epub
|
data/templates/default.epub
|
||||||
data/templates/default.epub3
|
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
|
-- source files for reference.docx
|
||||||
data/docx/[Content_Types].xml
|
data/docx/[Content_Types].xml
|
||||||
data/docx/_rels/.rels
|
data/docx/_rels/.rels
|
||||||
|
@ -116,6 +94,24 @@ Extra-Source-Files:
|
||||||
data/odt/Configurations2/accelerator/current.xml
|
data/odt/Configurations2/accelerator/current.xml
|
||||||
data/odt/Thumbnails/thumbnail.png
|
data/odt/Thumbnails/thumbnail.png
|
||||||
data/odt/META-INF/manifest.xml
|
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
|
||||||
trypandoc/Makefile
|
trypandoc/Makefile
|
||||||
trypandoc/index.html
|
trypandoc/index.html
|
||||||
|
@ -439,16 +435,6 @@ Executable make-pandoc-man-pages
|
||||||
Default-Language: Haskell98
|
Default-Language: Haskell98
|
||||||
Buildable: True
|
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
|
Test-Suite test-pandoc
|
||||||
Type: exitcode-stdio-1.0
|
Type: exitcode-stdio-1.0
|
||||||
Main-Is: test-pandoc.hs
|
Main-Is: test-pandoc.hs
|
||||||
|
|
|
@ -211,11 +211,10 @@ writeDocx opts doc@(Pandoc meta _) = do
|
||||||
let doc' = stripInvalidChars . walk fixDisplayMath $ doc
|
let doc' = stripInvalidChars . walk fixDisplayMath $ doc
|
||||||
username <- lookup "USERNAME" <$> getEnvironment
|
username <- lookup "USERNAME" <$> getEnvironment
|
||||||
utctime <- getCurrentTime
|
utctime <- getCurrentTime
|
||||||
refArchive <- liftM (toArchive . toLazy) $
|
distArchive <- getDefaultReferenceDocx datadir
|
||||||
case writerReferenceDocx opts of
|
refArchive <- case writerReferenceDocx opts of
|
||||||
Just f -> B.readFile f
|
Just f -> liftM (toArchive . toLazy) $ B.readFile f
|
||||||
Nothing -> readDataFile datadir "reference.docx"
|
Nothing -> return distArchive
|
||||||
distArchive <- liftM (toArchive . toLazy) $ readDataFile datadir "reference.docx"
|
|
||||||
|
|
||||||
parsedDoc <- parseXml refArchive distArchive "word/document.xml"
|
parsedDoc <- parseXml refArchive distArchive "word/document.xml"
|
||||||
let wname f qn = qPrefix qn == Just "w" && f (qName qn)
|
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
|
settingsEntry <- copyChildren refArchive distArchive settingsPath epochtime settingsList
|
||||||
|
|
||||||
let entryFromArchive arch path =
|
let entryFromArchive arch path =
|
||||||
maybe (fail $ path ++ " corrupt or missing in reference docx")
|
maybe (fail $ path ++ " missing in reference docx")
|
||||||
return
|
return
|
||||||
(findEntryByPath path arch `mplus` findEntryByPath path distArchive)
|
(findEntryByPath path arch `mplus` findEntryByPath path distArchive)
|
||||||
docPropsAppEntry <- entryFromArchive refArchive "docProps/app.xml"
|
docPropsAppEntry <- entryFromArchive refArchive "docProps/app.xml"
|
||||||
|
@ -1204,11 +1203,12 @@ defaultFootnotes = [ mknode "w:footnote"
|
||||||
|
|
||||||
parseXml :: Archive -> Archive -> String -> IO Element
|
parseXml :: Archive -> Archive -> String -> IO Element
|
||||||
parseXml refArchive distArchive relpath =
|
parseXml refArchive distArchive relpath =
|
||||||
case ((findEntryByPath relpath refArchive `mplus`
|
case findEntryByPath relpath refArchive `mplus`
|
||||||
findEntryByPath relpath distArchive)
|
findEntryByPath relpath distArchive of
|
||||||
>>= parseXMLDoc . UTF8.toStringLazy . fromEntry) 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
|
Just d -> return d
|
||||||
Nothing -> fail $ relpath ++ " corrupt or missing in reference docx"
|
|
||||||
|
|
||||||
-- | Scales the image to fit the page
|
-- | Scales the image to fit the page
|
||||||
-- sizes are passed in emu
|
-- sizes are passed in emu
|
||||||
|
@ -1219,3 +1219,28 @@ fitToPage (x, y) pageWidth
|
||||||
(pageWidth, round $
|
(pageWidth, round $
|
||||||
((fromIntegral pageWidth) / ((fromIntegral :: Integer -> Double) x)) * (fromIntegral y))
|
((fromIntegral pageWidth) / ((fromIntegral :: Integer -> Double) x)) * (fromIntegral y))
|
||||||
| otherwise = (x, 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
|
||||||
|
|
|
@ -60,11 +60,10 @@ writeODT :: WriterOptions -- ^ Writer options
|
||||||
writeODT opts doc@(Pandoc meta _) = do
|
writeODT opts doc@(Pandoc meta _) = do
|
||||||
let datadir = writerUserDataDir opts
|
let datadir = writerUserDataDir opts
|
||||||
let title = docTitle meta
|
let title = docTitle meta
|
||||||
refArchive <- liftM toArchive $
|
refArchive <-
|
||||||
case writerReferenceODT opts of
|
case writerReferenceODT opts of
|
||||||
Just f -> B.readFile f
|
Just f -> liftM toArchive $ B.readFile f
|
||||||
Nothing -> (B.fromChunks . (:[])) `fmap`
|
Nothing -> getDefaultReferenceODT datadir
|
||||||
readDataFile datadir "reference.odt"
|
|
||||||
-- handle formulas and pictures
|
-- handle formulas and pictures
|
||||||
picEntriesRef <- newIORef ([] :: [Entry])
|
picEntriesRef <- newIORef ([] :: [Entry])
|
||||||
doc' <- walkM (transformPicMath opts picEntriesRef) $ walk fixDisplayMath doc
|
doc' <- walkM (transformPicMath opts picEntriesRef) $ walk fixDisplayMath doc
|
||||||
|
@ -178,3 +177,21 @@ transformPicMath _ entriesRef (Math t math) = do
|
||||||
, ("xlink:actuate", "onLoad")]
|
, ("xlink:actuate", "onLoad")]
|
||||||
|
|
||||||
transformPicMath _ _ x = return x
|
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
|
||||||
|
|
|
@ -5,10 +5,6 @@ cabal sandbox init
|
||||||
cabal clean
|
cabal clean
|
||||||
cabal install hsb2hs
|
cabal install hsb2hs
|
||||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
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
|
cabal install -v1 --force --reinstall --flags="embed_data_files" . pandoc-citeproc
|
||||||
if %errorlevel% neq 0 exit /b %errorlevel%
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
strip .\.cabal-sandbox\bin\pandoc.exe
|
strip .\.cabal-sandbox\bin\pandoc.exe
|
||||||
|
|
Loading…
Reference in a new issue