Added proper support for DocBook 'xref' elements
'xref' is used to create cross references to other parts of the document. It is an empty element - the cross reference text depends on various attributes. Quoting 'DocBook: The Definitive Guide': 1. If the endterm attribute is specified on xref, the content of the element pointed to by endterm will be used as the text of the cross-reference. 2. Otherwise, if the object pointed to has a specified XRefLabel, the content of that attribute will be used as the cross-reference text.
This commit is contained in:
parent
f6538144f0
commit
35f12b5095
5 changed files with 120 additions and 2 deletions
|
@ -125,6 +125,7 @@ Extra-Source-Files:
|
||||||
tests/bodybg.gif
|
tests/bodybg.gif
|
||||||
tests/*.native
|
tests/*.native
|
||||||
tests/docbook-reader.docbook
|
tests/docbook-reader.docbook
|
||||||
|
tests/docbook-xref.docbook
|
||||||
tests/html-reader.html
|
tests/html-reader.html
|
||||||
tests/opml-reader.opml
|
tests/opml-reader.opml
|
||||||
tests/haddock-reader.haddock
|
tests/haddock-reader.haddock
|
||||||
|
|
|
@ -18,6 +18,7 @@ import Text.TeXMath (readMathML, writeTeX)
|
||||||
import Text.Pandoc.Error (PandocError)
|
import Text.Pandoc.Error (PandocError)
|
||||||
import Text.Pandoc.Compat.Except
|
import Text.Pandoc.Compat.Except
|
||||||
import Data.Default
|
import Data.Default
|
||||||
|
import Data.Foldable (asum)
|
||||||
|
|
||||||
{-
|
{-
|
||||||
|
|
||||||
|
@ -498,7 +499,7 @@ List of all DocBook tags, with [x] indicating implemented,
|
||||||
[x] warning - An admonition set off from the text
|
[x] warning - An admonition set off from the text
|
||||||
[x] wordasword - A word meant specifically as a word and not representing
|
[x] wordasword - A word meant specifically as a word and not representing
|
||||||
anything else
|
anything else
|
||||||
[ ] xref - A cross reference to another part of the document
|
[x] xref - A cross reference to another part of the document
|
||||||
[ ] year - The year of publication of a document
|
[ ] year - The year of publication of a document
|
||||||
[x] ?asciidoc-br? - line break from asciidoc docbook output
|
[x] ?asciidoc-br? - line break from asciidoc docbook output
|
||||||
-}
|
-}
|
||||||
|
@ -952,7 +953,13 @@ parseInline (Elem e) =
|
||||||
"keycombo" -> keycombo <$> (mapM parseInline $ elContent e)
|
"keycombo" -> keycombo <$> (mapM parseInline $ elContent e)
|
||||||
"menuchoice" -> menuchoice <$> (mapM parseInline $
|
"menuchoice" -> menuchoice <$> (mapM parseInline $
|
||||||
filter isGuiMenu $ elContent e)
|
filter isGuiMenu $ elContent e)
|
||||||
"xref" -> return $ str "?" -- so at least you know something is there
|
"xref" -> do
|
||||||
|
content <- dbContent <$> get
|
||||||
|
let linkend = attrValue "linkend" e
|
||||||
|
let title = case attrValue "endterm" e of
|
||||||
|
"" -> maybe "???" xrefTitleByElem (findElementById linkend content)
|
||||||
|
endterm -> maybe "???" strContent (findElementById endterm content)
|
||||||
|
return $ link ('#' : linkend) "" (singleton (Str title))
|
||||||
"email" -> return $ link ("mailto:" ++ strContent e) ""
|
"email" -> return $ link ("mailto:" ++ strContent e) ""
|
||||||
$ str $ strContent e
|
$ str $ strContent e
|
||||||
"uri" -> return $ link (strContent e) "" $ str $ strContent e
|
"uri" -> return $ link (strContent e) "" $ str $ strContent e
|
||||||
|
@ -1013,3 +1020,12 @@ parseInline (Elem e) =
|
||||||
isGuiMenu (Elem x) = named "guimenu" x || named "guisubmenu" x ||
|
isGuiMenu (Elem x) = named "guimenu" x || named "guisubmenu" x ||
|
||||||
named "guimenuitem" x
|
named "guimenuitem" x
|
||||||
isGuiMenu _ = False
|
isGuiMenu _ = False
|
||||||
|
|
||||||
|
findElementById idString content
|
||||||
|
= asum [filterElement (\x -> attrValue "id" x == idString) el | Elem el <- content]
|
||||||
|
|
||||||
|
xrefTitleByElem el
|
||||||
|
| null xrefLabel = "???"
|
||||||
|
| otherwise = xrefLabel
|
||||||
|
where
|
||||||
|
xrefLabel = attrValue "xreflabel" el
|
||||||
|
|
|
@ -105,6 +105,8 @@ tests = [ testGroup "markdown"
|
||||||
[ testGroup "writer" $ writerTests "docbook"
|
[ testGroup "writer" $ writerTests "docbook"
|
||||||
, test "reader" ["-r", "docbook", "-w", "native", "-s"]
|
, test "reader" ["-r", "docbook", "-w", "native", "-s"]
|
||||||
"docbook-reader.docbook" "docbook-reader.native"
|
"docbook-reader.docbook" "docbook-reader.native"
|
||||||
|
, test "reader" ["-r", "docbook", "-w", "native", "-s"]
|
||||||
|
"docbook-xref.docbook" "docbook-xref.native"
|
||||||
]
|
]
|
||||||
, testGroup "native"
|
, testGroup "native"
|
||||||
[ testGroup "writer" $ writerTests "native"
|
[ testGroup "writer" $ writerTests "native"
|
||||||
|
|
70
tests/docbook-xref.docbook
Normal file
70
tests/docbook-xref.docbook
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
|
||||||
|
<book><title>An Example Book</title>
|
||||||
|
<chapter id="ch01"><title>XRef Samples</title>
|
||||||
|
<para>
|
||||||
|
This paragraph demonstrates several features of
|
||||||
|
<sgmltag>XRef</sgmltag>.
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>A straight link generates the
|
||||||
|
cross-reference text: <xref linkend="ch02"/>.
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>A link to an element with an
|
||||||
|
<sgmltag class="attribute">XRefLabel</sgmltag>:
|
||||||
|
<xref linkend="ch03"/>.
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>A link with an
|
||||||
|
<sgmltag class="attribute">EndTerm</sgmltag>:
|
||||||
|
<xref linkend="ch04" endterm="ch04short"/>.
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>A link to an
|
||||||
|
<sgmltag>cmdsynopsis</sgmltag> element: <xref linkend="cmd01"/>.
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>A link to an
|
||||||
|
<sgmltag>funcsynopsis</sgmltag> element: <xref linkend="func01"/>.
|
||||||
|
</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="ch02">
|
||||||
|
<title>The Second Chapter</title>
|
||||||
|
<para>Some content here</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="ch03" xreflabel="Chapter the Third">
|
||||||
|
<title>The Third Chapter</title>
|
||||||
|
<para>Some content here</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="ch04">
|
||||||
|
<title>The Fourth Chapter</title>
|
||||||
|
<titleabbrev id="ch04short">Chapter 4</titleabbrev>
|
||||||
|
<para>Some content here</para>
|
||||||
|
|
||||||
|
<cmdsynopsis id="cmd01">
|
||||||
|
<command>chgrp</command>
|
||||||
|
<arg>-R
|
||||||
|
<group>
|
||||||
|
<arg>-H</arg>
|
||||||
|
<arg>-L</arg>
|
||||||
|
<arg>-P</arg>
|
||||||
|
</group>
|
||||||
|
</arg>
|
||||||
|
<arg>-f</arg>
|
||||||
|
<arg choice='plain'><replaceable>group</replaceable></arg>
|
||||||
|
<arg rep='repeat' choice='plain'><replaceable>file</replaceable></arg>
|
||||||
|
</cmdsynopsis>
|
||||||
|
|
||||||
|
|
||||||
|
<funcsynopsis id="func01">
|
||||||
|
<funcprototype>
|
||||||
|
<funcdef>int <function>max</function></funcdef>
|
||||||
|
<paramdef>int <parameter>int1</parameter></paramdef>
|
||||||
|
<paramdef>int <parameter>int2</parameter></paramdef>
|
||||||
|
</funcprototype>
|
||||||
|
</funcsynopsis>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
</book>
|
||||||
|
|
29
tests/docbook-xref.native
Normal file
29
tests/docbook-xref.native
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
Pandoc (Meta {unMeta = fromList []})
|
||||||
|
[Header 1 ("ch01",[],[]) [Str "XRef",Space,Str "Samples"]
|
||||||
|
,Para [Str "This",Space,Str "paragraph",Space,Str "demonstrates",Space,Str "several",Space,Str "features",Space,Str "of",Space,Str "XRef."]
|
||||||
|
,BulletList
|
||||||
|
[[Para [Str "A",Space,Str "straight",Space,Str "link",Space,Str "generates",Space,Str "the",Space,Str "cross-reference",Space,Str "text:",Space,Link [Str "???"] ("#ch02",""),Str "."]]
|
||||||
|
,[Para [Str "A",Space,Str "link",Space,Str "to",Space,Str "an",Space,Str "element",Space,Str "with",Space,Str "an",Space,Str "XRefLabel:",Space,Link [Str "Chapter the Third"] ("#ch03",""),Str "."]]
|
||||||
|
,[Para [Str "A",Space,Str "link",Space,Str "with",Space,Str "an",Space,Str "EndTerm:",Space,Link [Str "Chapter 4"] ("#ch04",""),Str "."]]
|
||||||
|
,[Para [Str "A",Space,Str "link",Space,Str "to",Space,Str "an",Space,Str "cmdsynopsis",Space,Str "element:",Space,Link [Str "???"] ("#cmd01",""),Str "."]]
|
||||||
|
,[Para [Str "A",Space,Str "link",Space,Str "to",Space,Str "an",Space,Str "funcsynopsis",Space,Str "element:",Space,Link [Str "???"] ("#func01",""),Str "."]]]
|
||||||
|
,Header 1 ("ch02",[],[]) [Str "The",Space,Str "Second",Space,Str "Chapter"]
|
||||||
|
,Para [Str "Some",Space,Str "content",Space,Str "here"]
|
||||||
|
,Header 1 ("ch03",[],[]) [Str "The",Space,Str "Third",Space,Str "Chapter"]
|
||||||
|
,Para [Str "Some",Space,Str "content",Space,Str "here"]
|
||||||
|
,Header 1 ("ch04",[],[]) [Str "The",Space,Str "Fourth",Space,Str "Chapter"]
|
||||||
|
,Para [Str "Some",Space,Str "content",Space,Str "here"]
|
||||||
|
,Plain [Str "chgrp"]
|
||||||
|
,Plain [Str "-R"]
|
||||||
|
,Plain [Str "-H"]
|
||||||
|
,Plain [Str "-L"]
|
||||||
|
,Plain [Str "-P"]
|
||||||
|
,Plain [Str "-f"]
|
||||||
|
,Plain [Str "group"]
|
||||||
|
,Plain [Str "file"]
|
||||||
|
,Plain [Str "int"]
|
||||||
|
,Plain [Str "max"]
|
||||||
|
,Plain [Str "int"]
|
||||||
|
,Plain [Str "int1"]
|
||||||
|
,Plain [Str "int"]
|
||||||
|
,Plain [Str "int2"]]
|
Loading…
Reference in a new issue