sub
new {
my
(
$class
,
%options
) =
@_
;
my
$self
=
$class
->SUPER::new(
%options
);
$$self
{db} =
$options
{db};
$$self
{handlers} = {};
$self
->registerHandler(
'ltx:document'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:part'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:chapter'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:section'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:appendix'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:subsection'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:subsubsection'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:paragraph'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:subparagraph'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:bibliography'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:index'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:glossary'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:table'
=> \
&captioned_handler
);
$self
->registerHandler(
'ltx:figure'
=> \
&captioned_handler
);
$self
->registerHandler(
'ltx:float'
=> \
&captioned_handler
);
$self
->registerHandler(
'ltx:listing'
=> \
&captioned_handler
);
$self
->registerHandler(
'ltx:theorem'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:proof'
=> \
§ion_handler
);
$self
->registerHandler(
'ltx:equation'
=> \
&labelled_handler
);
$self
->registerHandler(
'ltx:equationgroup'
=> \
&labelled_handler
);
$self
->registerHandler(
'ltx:item'
=> \
&labelled_handler
);
$self
->registerHandler(
'ltx:listingline'
=> \
&labelled_handler
);
$self
->registerHandler(
'ltx:anchor'
=> \
&anchor_handler
);
$self
->registerHandler(
'ltx:note'
=> \
¬e_handler
);
$self
->registerHandler(
'ltx:bibitem'
=> \
&bibitem_handler
);
$self
->registerHandler(
'ltx:bibentry'
=> \
&bibentry_handler
);
$self
->registerHandler(
'ltx:indexmark'
=> \
&indexmark_handler
);
$self
->registerHandler(
'ltx:glossaryentry'
=> \
&glossaryentry_handler
);
$self
->registerHandler(
'ltx:glossarydefinition'
=> \
&glossaryentry_handler
);
$self
->registerHandler(
'ltx:ref'
=> \
&ref_handler
);
$self
->registerHandler(
'ltx:bibref'
=> \
&bibref_handler
);
$self
->registerHandler(
'ltx:glossaryref'
=> \
&glossaryref_handler
);
$self
->registerHandler(
'ltx:navigation'
=> \
&navigation_handler
);
$self
->registerHandler(
'ltx:rdf'
=> \
&rdf_handler
);
$self
->registerHandler(
'ltx:declare'
=> \
&declare_handler
);
$self
->registerHandler(
'ltx:rawhtml'
=> \
&rawhtml_handler
);
return
$self
; }
sub
registerHandler {
my
(
$self
,
$tag
,
$handler
) =
@_
;
$$self
{handlers}{
$tag
} =
$handler
;
return
; }
sub
process {
my
(
$self
,
$doc
,
$root
) =
@_
;
my
$id
=
$root
->getAttribute(
'xml:id'
);
if
(!
defined
$id
) {
$id
=
"Document"
;
if
(
my
$preventry
=
$$self
{db}->lookup(
"ID:$id"
)) {
if
(
my
$loc
=
$doc
->siteRelativeDestination) {
my
$prevloc
=
$preventry
->getValue(
'location'
);
if
((
defined
$prevloc
) && (
$loc
ne
$prevloc
)) {
Warn(
'unexpected'
,
'location'
,
undef
,
"Using default ID='$id', "
.
"but there's an apparent conflict with location '$loc' and previous '$prevloc'"
); } } }
$root
->setAttribute(
'xml:id'
=>
$id
); }
my
$siteentry
=
$$self
{db}->lookup(
'SITE_ROOT'
);
if
(!
$siteentry
) {
$siteentry
=
$$self
{db}->register(
'SITE_ROOT'
,
id
=>
$id
); }
my
$siteid
=
$siteentry
->getValue(
'id'
);
$self
->scan(
$doc
,
$root
,
$$doc
{parent_id});
$$self
{db}->register(
"DOCUMENT:"
. (
$doc
->siteRelativeDestination ||
''
),
id
=>
$id
);
my
$entry
=
$$self
{db}->lookup(
"ID:$id"
);
if
((
$id
ne
$siteid
) && !
$entry
->getValue(
'parent'
)) {
my
$parent_id
;
if
(!
$parent_id
) {
my
$upid
=
$id
;
while
(
$upid
=~ s/\.[^\.]+$//) {
if
(
$$self
{db}->lookup(
"ID:$upid"
)) {
$parent_id
=
$upid
;
last
; } } }
if
(!
$parent_id
) {
my
$loc
=
$entry
->getValue(
'location'
);
my
$dir
=
$loc
;
while
((
$dir
) = pathname_split(
$dir
)) {
if
(
my
$pentry
=
$$self
{db}->lookup(
"DOCUMENT:"
. pathname_concat(
$dir
,
'index.xml'
))) {
my
$pid
=
$pentry
->getValue(
'id'
);
if
(
$pid
&& (
$pid
ne
$id
)) {
$parent_id
=
$pid
;
last
; } } } }
if
(!
$parent_id
) {
$parent_id
=
$siteid
; }
if
(
$parent_id
&& (
$parent_id
ne
$id
)) {
$entry
->setValues(
parent
=>
$parent_id
);
$self
->addAsChild(
$id
,
$parent_id
); }
else
{
Info(
'expected'
,
'parent'
,
undef
,
"No parent document found for '$id'"
); } }
NoteLog(
"Scan: DBStatus: "
.
$$self
{db}->status);
return
$doc
; }
sub
scan {
my
(
$self
,
$doc
,
$node
,
$parent_id
) =
@_
;
no
warnings
'recursion'
;
my
$tag
=
$doc
->getQName(
$node
);
my
$handler
=
$$self
{handlers}{
$tag
} || \
&default_handler
;
&$handler
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
);
return
; }
sub
scanChildren {
my
(
$self
,
$doc
,
$node
,
$parent_id
) =
@_
;
no
warnings
'recursion'
;
foreach
my
$child
(
$node
->childNodes) {
if
(
$child
->nodeType == XML_ELEMENT_NODE) {
$self
->scan(
$doc
,
$child
,
$parent_id
); } }
return
; }
sub
addAsChild {
my
(
$self
,
$id
,
$parent_id
) =
@_
;
while
(
my
$parent
=
$parent_id
&&
$$self
{db}->lookup(
"ID:$parent_id"
)) {
if
(
$parent
->hasValue(
'children'
)) {
$parent
->pushNew(
'children'
,
$id
);
last
; }
else
{
$parent_id
=
$parent
->getValue(
'parent'
); } }
return
; }
sub
pageID {
my
(
$self
,
$doc
) =
@_
;
return
$doc
->getDocumentElement->getAttribute(
'xml:id'
); }
sub
inPageID {
my
(
$self
,
$doc
,
$node
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
my
$baseid
=
$doc
->getDocumentElement->getAttribute(
'xml:id'
) ||
''
;
if
(
$$self
{labelids}) {
if
(
my
$labels
=
$node
->getAttribute(
'labels'
)) {
my
(
$l
) =
split
(
' '
,
$labels
);
$id
=
$l
;
if
(
my
$baselabels
=
$doc
->getDocumentElement->getAttribute(
'labels'
)) {
my
(
$bl
) =
split
(
' '
,
$baselabels
);
$baseid
=
$bl
; } } }
if
(!
$id
) {
return
$id
; }
elsif
(
$baseid
eq
$id
) {
return
; }
elsif
(
$baseid
&& (
$id
=~ /^\Q
$baseid
\E\.(.*)$/)) {
return
$1; }
elsif
(
$$doc
{split_from_id} && (
$id
=~ /^\Q
$$doc
{split_from_id}\E\.(.*)$/)) {
return
$1; }
else
{
return
$id
; } }
sub
noteLabels {
my
(
$self
,
$node
) =
@_
;
if
(
my
$id
=
$node
->getAttribute(
'xml:id'
)) {
if
(
my
$labels
=
$node
->getAttribute(
'labels'
)) {
my
@labels
=
split
(
' '
,
$node
->getAttribute(
'labels'
));
foreach
my
$label
(
@labels
) {
$$self
{db}->register(
$label
,
id
=> orNull(
$id
)); }
return
[
@labels
]; } }
return
; }
sub
cleanNode {
my
(
$self
,
$doc
,
$node
) =
@_
;
return
$node
unless
$node
;
my
$cleaned
=
$doc
->cloneNode(
$node
);
map
{
$_
->parentNode->removeChild(
$_
) }
$doc
->findnodes(
'.//ltx:indexmark'
,
$cleaned
);
return
$cleaned
; }
our
$TOCTEXT_MAX_LENGTH
=
undef
;
sub
truncateNode {
my
(
$self
,
$doc
,
$node
) =
@_
;
return
$node
if
!
$node
|| !
defined
$TOCTEXT_MAX_LENGTH
;
my
@children
=
$node
->childNodes;
my
$n
=
$TOCTEXT_MAX_LENGTH
;
my
$trunc
= 0;
while
(
$n
&&
@children
) {
my
$c
=
shift
(
@children
);
if
(
$c
->nodeType == XML_TEXT_NODE) {
my
$s
=
$c
->textContent;
my
@w
=
split
(/\s/,
$s
);
if
(
scalar
(
@w
) >
$n
) {
$c
->setData(
join
(
' '
,
@w
[0 ..
$n
]));
$trunc
= 1;
$n
= 0; }
else
{
$n
--; } }
else
{
$n
--; } }
if
(
$trunc
|| (
scalar
(
@children
) > 1)) {
map
{
$node
->removeChild(
$_
) }
@children
;
$node
->appendText(
"\x{2026}"
); }
return
$node
; }
sub
addCommon {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
my
$inlist
;
if
(
my
$listnames
=
$node
->getAttribute(
'inlist'
)) {
$inlist
= {
map
{ (
$_
=> 1) }
split
(/\s/,
$listnames
) }; }
my
%props
= (
id
=> orNull(
$id
),
type
=> orNull(
$tag
),
parent
=> orNull(
$parent_id
),
labels
=> orNull(
$self
->noteLabels(
$node
)),
location
=> orNull(
$doc
->siteRelativeDestination),
pageid
=> orNull(
$self
->pageID(
$doc
)),
fragid
=> orNull(
$self
->inPageID(
$doc
,
$node
)),
inlist
=>
$inlist
,
);
foreach
my
$tagnode
(
$doc
->findnodes(
'ltx:tags/ltx:tag'
,
$node
)) {
my
$key
;
if
(
my
$role
=
$tagnode
->getAttribute(
'role'
)) {
if
(
$role
=~ /.
*refnum
$/) {
$key
=
$role
; }
else
{
$key
=
'tag:'
.
$role
; } }
else
{
$key
=
'refnum'
; }
$props
{
$key
} =
$self
->cleanNode(
$doc
,
$tagnode
); }
return
%props
; }
sub
default_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
no
warnings
'recursion'
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
));
$self
->addAsChild(
$id
,
$parent_id
); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
section_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
primary
=> 1,
title
=> orNull(
$self
->cleanNode(
$doc
,
$doc
->findnode(
'ltx:title'
,
$node
))),
toctitle
=> orNull(
$self
->cleanNode(
$doc
,
$doc
->findnode(
'ltx:toctitle'
,
$node
))),
children
=> [],
stub
=> orNull(
$node
->getAttribute(
'stub'
)));
$self
->addAsChild(
$id
,
$parent_id
); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
captioned_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
my
(
$caption
) = (
$doc
->findnode(
'child::ltx:caption'
,
$node
),
$doc
->findnode(
'descendant::ltx:caption'
,
$node
));
my
(
$toccaption
) = (
$doc
->findnode(
'child::ltx:toccaption'
,
$node
),
$doc
->findnode(
'descendant::ltx:toccaption'
,
$node
));
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
role
=> orNull(
$node
->getAttribute(
'role'
)),
caption
=> orNull(
$self
->cleanNode(
$doc
,
$caption
)),
toccaption
=> orNull(
$self
->truncateNode(
$doc
,
$self
->cleanNode(
$doc
,
$toccaption
))));
$self
->addAsChild(
$id
,
$parent_id
); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
labelled_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
role
=> orNull(
$node
->getAttribute(
'role'
)),
);
$self
->addAsChild(
$id
,
$parent_id
); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
note_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
my
$note
=
$self
->cleanNode(
$doc
,
$node
);
map
{
$note
->removeChild(
$_
) }
$doc
->findnodes(
'.//ltx:tags'
,
$note
);
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
role
=> orNull(
$node
->getAttribute(
'role'
)),
note
=>
$note
,
);
$self
->addAsChild(
$id
,
$parent_id
); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
anchor_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
title
=> orNull(
$self
->cleanNode(
$doc
,
$node
)),
);
$self
->addAsChild(
$id
,
$parent_id
); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
ref_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
my
$label
=
$node
->getAttribute(
'labelref'
)) {
if
(!
$doc
->findnodes(
'ancestor::ltx:tocentry'
.
'| ancestor::ltx:bibblock[contains(@class,"ltx_bib_cited")]'
,
$node
)) {
my
$entry
=
$$self
{db}->register(
$label
);
$entry
->noteAssociation(
referrers
=>
$parent_id
); } }
$self
->default_handler(
$doc
,
$node
,
$tag
,
$parent_id
);
return
; }
sub
bibref_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
if
(!
$doc
->findnodes(
'ancestor::ltx:bibblock[contains(@class,"ltx_bib_cited")]'
,
$node
)) {
if
(
my
$keys
=
$node
->getAttribute(
'bibrefs'
)) {
my
$l
=
$node
->getAttribute(
'inlist'
);
my
@lists
= ((
$l
?
split
(/\s+/,
$l
) : ()),
'bibliography'
);
foreach
my
$bibkey
(
split
(
','
,
$keys
)) {
if
(
$bibkey
) {
foreach
my
$list
(
@lists
) {
my
$entry
=
$$self
{db}->register(
"BIBLABEL:$list:$bibkey"
);
$entry
->noteAssociation(
referrers
=>
$parent_id
); } } } } }
$self
->default_handler(
$doc
,
$node
,
$tag
,
$parent_id
);
return
; }
sub
glossaryref_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$list
=
$node
->getAttribute(
'inlist'
);
my
$key
=
$node
->getAttribute(
'key'
);
if
(
$key
&&
$list
) {
my
$entry
=
$$self
{db}->register(
join
(
':'
,
'GLOSSARY'
,
$list
,
$key
));
$entry
->noteAssociation(
referrers
=>
$parent_id
); }
$self
->default_handler(
$doc
,
$node
,
$tag
,
$parent_id
);
return
; }
sub
indexmark_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
@phrases
=
$doc
->findnodes(
'ltx:indexphrase'
,
$node
);
my
@seealso
=
$doc
->findnodes(
'ltx:indexsee'
,
$node
);
my
$key
=
join
(
':'
,
'INDEX'
,
map
{
$_
->getAttribute(
'key'
) }
@phrases
);
my
$inlist
;
if
(
my
$listnames
=
$node
->getAttribute(
'inlist'
)) {
$inlist
= {
map
{ (
$_
=> 1) }
split
(/\s/,
$listnames
) }; }
my
$entry
=
$$self
{db}->lookup(
$key
)
||
$$self
{db}->register(
$key
,
phrases
=> [
@phrases
],
see_also
=> [],
inlist
=>
$inlist
);
if
(
@seealso
) {
$entry
->pushNew(
'see_also'
,
@seealso
); }
else
{
$entry
->noteAssociation(
referrers
=>
$parent_id
=> (
$node
->getAttribute(
'style'
) ||
'normal'
)); }
return
; }
sub
glossaryentry_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
= (
$tag
eq
'ltx:glossaryentry'
?
$node
->getAttribute(
'xml:id'
) :
undef
);
my
$p
;
my
$lists
=
$node
->getAttribute(
'inlist'
) ||
((
$p
=
$doc
->findnode(
'ancestor::ltx:glossarylist[@lists] | ancestor::ltx:glossary[@lists]'
,
$node
))
&&
$p
->getAttribute(
'lists'
))
||
'glossary'
;
my
$key
=
$node
->getAttribute(
'key'
);
my
@phrases
=
$doc
->findnodes(
'ltx:glossaryphrase'
,
$node
);
foreach
my
$list
(
split
(/\s+/,
$lists
)) {
my
$gkey
=
join
(
':'
,
'GLOSSARY'
,
$list
,
$key
);
my
$entry
=
$$self
{db}->lookup(
$gkey
) ||
$$self
{db}->register(
$gkey
);
$entry
->setValues(
map
{ (
'phrase:'
. (
$_
->getAttribute(
'role'
) ||
'label'
) =>
$_
) }
@phrases
);
$entry
->setValues(
id
=>
$id
)
if
$id
; }
if
(
$id
) {
$$self
{db}->register(
"ID:$id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
)); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
bibitem_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'xml:id'
);
if
(
$id
) {
my
$key
=
$node
->getAttribute(
'key'
);
my
$bib
=
$doc
->findnode(
'ancestor-or-self::ltx:bibliography'
,
$node
);
my
@lists
=
split
(/\s+/, (
$bib
&&
$bib
->getAttribute(
'lists'
)) ||
'bibliography'
);
if
(
$key
) {
foreach
my
$list
(
@lists
) {
$$self
{db}->register(
"BIBLABEL:$list:$key"
,
id
=> orNull(
$id
)); } }
$$self
{db}->register(
"ID:$id"
,
id
=> orNull(
$id
),
type
=> orNull(
$tag
),
parent
=> orNull(
$parent_id
),
bibkey
=> orNull(
$key
),
location
=> orNull(
$doc
->siteRelativeDestination),
pageid
=> orNull(
$self
->pageID(
$doc
)),
fragid
=> orNull(
$self
->inPageID(
$doc
,
$node
)),
authors
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="authors"]'
,
$node
)),
fullauthors
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="fullauthors"]'
,
$node
)),
year
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="year"]'
,
$node
)),
number
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="number"]'
,
$node
)),
refnum
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="refnum"]'
,
$node
)),
title
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="title"]'
,
$node
)),
keytag
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="key"]'
,
$node
)),
typetag
=> orNull(
$doc
->findnode(
'ltx:tags/ltx:tag[@role="bibtype"]'
,
$node
))); }
$self
->scanChildren(
$doc
,
$node
,
$id
||
$parent_id
);
return
; }
sub
bibentry_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
return
; }
sub
declare_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$type
=
$node
->getAttribute(
'type'
);
my
$sort
=
$node
->getAttribute(
'sortkey'
);
my
$decl_id
=
$node
->getAttribute(
'xml:id'
);
my
$term
=
$self
->cleanNode(
$doc
,
$doc
->findnode(
'child::ltx:tags/ltx:tag[@role="term"]'
,
$node
));
my
$description
=
$self
->cleanNode(
$doc
,
$doc
->findnode(
'child::ltx:text'
,
$node
));
my
$definiens
=
$node
->getAttribute(
'definiens'
);
if
(
defined
$type
&& (
$type
eq
'definition'
)) {
if
((!
defined
$definiens
) && (
defined
$term
)) {
my
(
@syms
) =
$doc
->findnodes(
'descendant-or-self::ltx:XMTok[@meaning]'
,
$term
);
@syms
= ((
grep
{ (
$_
->getAttribute(
'role'
) ||
''
) ne
'RELOP'
; }
@syms
),
@syms
);
@syms
=
grep
{
$_
->getAttribute(
'meaning'
) !~ /^delimited-/ }
@syms
;
$definiens
=
$syms
[0] &&
$syms
[0]->getAttribute(
'meaning'
); }
if
(
defined
$definiens
) {
$$self
{db}->register(
"DECLARATION:global:$definiens"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
description
=>
$description
); } }
elsif
((!
$type
) &&
$parent_id
) {
if
(
$decl_id
&& (
$description
||
$doc
->findnode(
'ltx:tags/ltx:tag'
,
$node
))) {
$$self
{db}->register(
"DECLARATION:local:$decl_id"
,
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
description
=>
$description
); } }
if
(
$sort
) {
$$self
{db}->register(
"NOTATION:"
. (
$definiens
||
$decl_id
||
$sort
),
$self
->addCommon(
$doc
,
$node
,
$tag
,
$parent_id
),
sortkey
=>
$sort
,
description
=>
$description
); }
return
; }
sub
navigation_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
return
; }
sub
rdf_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
my
$id
=
$node
->getAttribute(
'about'
);
if
(!(
$id
&& (
$id
=~ s/^
$id
=
$parent_id
; }
my
$property
=
$node
->getAttribute(
'property'
);
my
$value
=
$node
->getAttribute(
'resource'
) ||
$node
->getAttribute(
'content'
);
return
unless
(
$property
&&
$value
);
$$self
{db}->register(
"ID:$id"
,
$property
=> orNull(
$value
));
return
; }
sub
rawhtml_handler {
my
(
$self
,
$doc
,
$node
,
$tag
,
$parent_id
) =
@_
;
return
; }
sub
orNull {
return
(
grep
{
defined
}
@_
) ?
@_
:
undef
; }
1;