OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]


Subject: Re: DOCBOOK-APPS: dsssl1.77 html TOC linkage problem


On Tuesday 18 February 2003 12:12, Doug du Boulay wrote:
>
> Although this provides the desired functionality of switching back and
> forth between the control lists and the descriptive sections by selecting
> the title link/xref, sadly it breaks the TOC linkage, as well as the
> next/prev links on each html page.

Actually it doesnt break the next prev links at all :-)

> The resultant html for those items is rendered as
> <href><href>xreftext</href>titletext</href>
> with only the innermost href active (tested with Mozilla and Konqueror).
> I am not sure if this is a dsssl (stylesheets 1.77)  bug, or just tag
> misuse on my part.
>

Assuming it is a bug, and not misuse on my part,
I enclose below a dsssl customization to short-circuit any xref->href in a 
section title when it is being embedded into a TOC. I imagine it could/should 
be enhanced for all possible links in all possible titles, but this seems to 
be sufficient enough for my needs at the moment.


doug





;; from common/dbcommon.dsl

(define (element-title-nosublink-sosofo #!optional (nd (current-node)))
  (if (node-list-empty? nd)
      (empty-sosofo)
      (cond
       ;; Use a seperately defined assoc list?
       ((equal? (gi nd) (normalize "appendix")) (appendix-title-sosofo nd ))
       ((equal? (gi nd) (normalize "article")) (article-title-sosofo nd))
       ((equal? (gi nd) (normalize "bibliography")) (bibliography-title-sosofo nd))
       ((equal? (gi nd) (normalize "book")) (book-title-sosofo nd))
       ((equal? (gi nd) (normalize "chapter")) (chapter-title-sosofo nd))
       ((equal? (gi nd) (normalize "dedication")) (dedication-title-sosofo nd))
       ((equal? (gi nd) (normalize "glossary")) (glossary-title-sosofo nd))
       ((equal? (gi nd) (normalize "index")) (index-title-sosofo nd))
       ((equal? (gi nd) (normalize "colophon")) (colophon-title-sosofo nd))
       ((equal? (gi nd) (normalize "setindex")) (index-title-sosofo nd))
       ((equal? (gi nd) (normalize "part")) (part-title-sosofo nd))
       ((equal? (gi nd) (normalize "preface")) (preface-title-sosofo nd))
       ((equal? (gi nd) (normalize "refentry")) (refentry-title-sosofo nd))
       ((equal? (gi nd) (normalize "reference")) (reference-title-sosofo nd))
       ((equal? (gi nd) (normalize "refsect1")) (refsection-title-sosofo nd))
       ((equal? (gi nd) (normalize "refsect2")) (refsection-title-sosofo nd))
       ((equal? (gi nd) (normalize "refsect3")) (refsection-title-sosofo nd))
       ((equal? (gi nd) (normalize "refsynopsisdiv")) (refsynopsisdiv-title-sosofo nd))
       ((equal? (gi nd) (normalize "sect1")) (section-title-sosofo nd 'supress))
       ((equal? (gi nd) (normalize "sect2")) (section-title-sosofo nd 'supress))
       ((equal? (gi nd) (normalize "sect3")) (section-title-sosofo nd 'supress))       ((equal? (gi nd) (normalize "sect4")) (section-title-sosofo nd 'supress))
       ((equal? (gi nd) (normalize "sect5")) (section-title-sosofo nd 'supress))
       ((equal? (gi nd) (normalize "set")) (set-title-sosofo nd))
       (else (block-title-sosofo nd)))))


(define (section-title-sosofo nd #!optional supress-link )
  (let ((title (section-title nd)))
    (if (string? title)
        (empty-sosofo)
        (if supress-link
            (with-mode title-nosublink-sosofo-mode
               (process-node-list title))
            (with-mode title-sosofo-mode
               (process-node-list title))))))


(mode title-nosublink-sosofo-mode
  (element title
    (process-children-trim))

  (element citetitle
    (process-children-trim))

  (element xref
    (xref-supress-link))

  (element refname
    (process-children-trim))

  (element refentrytitle
    (process-children-trim)))





;; from html/dbautoc.dsl

(define (toc-entry tocentry)
  (make element gi: "DT"
        (make sequence
          (if (equal? (element-label tocentry) "")
              (empty-sosofo)
              (make sequence
                (literal (element-label tocentry))
                (literal (gentext-label-title-sep
                          (gi tocentry)))))

          ;; If the tocentry isn't in its own
          ;; chunk, don't make a link...
          (if (and #f (not (chunk? tocentry)))
              (element-title-sosofo tocentry)
              (make element gi: "A"
                    attributes: (list
                                 (list "HREF"
                                       (href-to tocentry)))
                    (element-title-nosublink-sosofo tocentry)))

          ;; Maybe annotate...
          (if (and %annotate-toc%
                   (equal? (gi tocentry) (normalize "refentry")))
              (make sequence
                (dingbat-sosofo "nbsp");
                (dingbat-sosofo "em-dash");
                (dingbat-sosofo "nbsp");
                (toc-annotation tocentry))
              (empty-sosofo)))))


;; /html/dblink.dsl

(element xref
  (let* ((endterm   (attribute-string (normalize "endterm")))
	 (linkend   (attribute-string (normalize "linkend")))
	 (target    (element-with-id linkend))
	 (xreflabel (if (node-list-empty? target)
			#f
			(attribute-string (normalize "xreflabel") target))))
    (if (node-list-empty? target)
	(error (string-append "XRef LinkEnd to missing ID '" linkend "'"))
	(make element gi: "A"
	      attributes: (list
			   (list "HREF" (href-to target)))
	      (if xreflabel
		  (literal xreflabel)
		  (xref-endterm target endterm))) )))

(define (xref-supress-link)
  (let* ((endterm   (attribute-string (normalize "endterm")))
	 (linkend   (attribute-string (normalize "linkend")))
	 (target    (element-with-id linkend))
	 (xreflabel (if (node-list-empty? target)
			#f
			(attribute-string (normalize "xreflabel") target))))
    (if (node-list-empty? target)
	(error (string-append "XRef LinkEnd to missing ID '" linkend "'"))
	(if xreflabel
	  (literal xreflabel)
	  (xref-endterm target endterm)) )))
     


(define (xref-endterm target endterm)
   (if endterm
      (if (node-list-empty? (element-with-id endterm))
	  (error (string-append
			  "XRef EndTerm to missing ID '" 
			  endterm "'"))
	  (with-mode xref-endterm-mode
		    (process-node-list (element-with-id endterm))))
      (cond ((or (equal? (gi target) (normalize "biblioentry"))
	    (equal? (gi target) (normalize "bibliomixed")))
		;; xref to the bibliography is a special case
		(xref-biblioentry target))
       ((equal? (gi target) (normalize "co"))
		;; callouts are a special case
		($callout-mark$ target #f))
       ((equal? (gi target) (normalize "listitem"))
		;; listitems are a special case
		(if (equal? (gi (parent target)) (normalize "orderedlist"))
		    (literal (orderedlist-listitem-label-recursive target))
		    (error (string-append "XRef to LISTITEM only supported in ORDEREDLISTs"))))
       ((equal? (gi target) (normalize "varlistentry"))
		(xref-varlistentry target))
       ((equal? (gi target) (normalize "question"))
		;; questions and answers are (yet another) special case
		(make sequence
		  (literal (gentext-element-name target))
		  (literal (gentext-label-title-sep target))
		  (literal (question-answer-label target))))
       ((equal? (gi target) (normalize "answer"))
		;; questions and answers are (yet another) special case
		(make sequence
		  (literal (gentext-element-name target))
		  (literal (gentext-label-title-sep target))
		  (literal (question-answer-label target))))
       ((equal? (gi target) (normalize "refentry"))
		;; so are refentrys
		(xref-refentry target))
       ((equal? (gi target) (normalize "refnamediv"))
		;; and refnamedivs
		(xref-refnamediv target))
       ((equal? (gi target) (normalize "glossentry"))
		;; as are glossentrys
		(xref-glossentry target))
       ((equal? (gi target) (normalize "author"))
		;; and authors
		(xref-author target))
       ((equal? (gi target) (normalize "authorgroup"))
		;; and authorgroups
			(xref-authorgroup target))
; this doesn't really work very well yet
;      ((equal? (gi target) (normalize "substeps"))
;		;; and substeps
;		(xref-substeps target))
       (else 
		(xref-general target))))  )



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]


Powered by eList eXpress LLC