mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-11-04 06:11:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			219 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
;; $Id$
 | 
						|
;;
 | 
						|
;; This file is part of the Modular DocBook Stylesheet distribution.
 | 
						|
;; See ../README or http://www.berkshire.net/~norm/dsssl/
 | 
						|
;;
 | 
						|
 | 
						|
(define ($inpre$)
 | 
						|
  (let ((wrapper (ancestor-member (current-node)
 | 
						|
				  (list (normalize "address")
 | 
						|
					(normalize "funcsynopsisinfo")
 | 
						|
					(normalize "literallayout")
 | 
						|
					(normalize "programlisting")
 | 
						|
					(normalize "screen")
 | 
						|
					(normalize "synopsis")))))
 | 
						|
    (if (or (and (equal? wrapper "literallayout")
 | 
						|
		 (not (equal? (attribute-string "class" wrapper)
 | 
						|
			      (normalize "monospaced"))))
 | 
						|
	    (equal? wrapper "address"))
 | 
						|
	#f
 | 
						|
	#t)))
 | 
						|
 | 
						|
(define ($format-indent$ indent)
 | 
						|
  ;; This code is made complex by the fact that we need an additional
 | 
						|
  ;; wrapper and we have to translate spaces into nbsp entity-refs,
 | 
						|
  ;; if we aren't in a PRE.
 | 
						|
  ;; 
 | 
						|
  (if ($inpre$)
 | 
						|
      (literal indent)
 | 
						|
      (make element gi: "CODE"
 | 
						|
	    ($sp-to-nbsp-sosofo$ indent))))
 | 
						|
 | 
						|
(define ($format-linenumber$ linenumber)
 | 
						|
  ;; This code is made complex by the fact that we need an additional
 | 
						|
  ;; wrapper and we have to translate spaces into nbsp entity-refs,
 | 
						|
  ;; if we aren't in a PRE.
 | 
						|
  ;; 
 | 
						|
  (if (equal? (remainder linenumber %linenumber-mod%) 0)
 | 
						|
      (if ($inpre$)
 | 
						|
	  (make sequence
 | 
						|
	    (literal (pad-string (format-number linenumber "1") 
 | 
						|
				 %linenumber-length% %linenumber-padchar%))
 | 
						|
	    ($linenumber-space$))
 | 
						|
	  (make element gi: "CODE"
 | 
						|
		($sp-to-nbsp-sosofo$ 
 | 
						|
		 (pad-string (format-number linenumber "1") 
 | 
						|
			     %linenumber-length% %linenumber-padchar%))
 | 
						|
		($linenumber-space$)))
 | 
						|
      (if ($inpre$)
 | 
						|
	  (make sequence
 | 
						|
	    (literal (pad-string "" %linenumber-length% " "))
 | 
						|
	    ($linenumber-space$))
 | 
						|
	  (make element gi: "CODE"
 | 
						|
		($sp-to-nbsp-sosofo$ 
 | 
						|
		 (pad-string "" %linenumber-length% " "))
 | 
						|
		($linenumber-space$)))))
 | 
						|
 | 
						|
(define ($line-start$ indent line-numbers? #!optional (line-number 1))
 | 
						|
  (make sequence
 | 
						|
    (if indent
 | 
						|
	($format-indent$ indent)
 | 
						|
	(empty-sosofo))
 | 
						|
    (if line-numbers?
 | 
						|
	($format-linenumber$ line-number)
 | 
						|
	(empty-sosofo))))
 | 
						|
 | 
						|
(define ($sp-to-nbsp-sosofo$ string)
 | 
						|
  ;; Given a string, return it as a sosofo, but replace spaces with 
 | 
						|
  ;; nbsp entity-refs.
 | 
						|
  (make sequence
 | 
						|
    (let loop ((charlist (string->list string))
 | 
						|
	       (res (empty-sosofo)))
 | 
						|
      (if (null? charlist)
 | 
						|
	  res
 | 
						|
	  (loop
 | 
						|
	   (cdr charlist)
 | 
						|
	   (let ((c (car charlist)))
 | 
						|
	     (if (equal? c #\ )
 | 
						|
		 (sosofo-append res
 | 
						|
				(make entity-ref name: "nbsp"))
 | 
						|
		 (sosofo-append res (literal (list->string (list c)))))))))))
 | 
						|
 | 
						|
(define ($verbatim-display$ indent line-numbers?)
 | 
						|
  (let ((content (make element gi: "PRE"
 | 
						|
		       attributes: (list
 | 
						|
				    (list "CLASS" (gi)))
 | 
						|
		       (if (or indent line-numbers?)
 | 
						|
			   ($verbatim-line-by-line$ indent line-numbers?)
 | 
						|
			   (process-children)))))
 | 
						|
    (if %shade-verbatim%
 | 
						|
	(make element gi: "TABLE"
 | 
						|
	      attributes: ($shade-verbatim-attr$)
 | 
						|
	      (make element gi: "TR"
 | 
						|
		    (make element gi: "TD"
 | 
						|
			  content)))
 | 
						|
	(make sequence
 | 
						|
	  (para-check)
 | 
						|
	  content
 | 
						|
	  (para-check 'restart)))))
 | 
						|
 | 
						|
(define ($verbatim-line-by-line$ indent line-numbers?)
 | 
						|
  (let ((expanded-content
 | 
						|
	 ;; this is the content with
 | 
						|
	 ;; inlinemediaobject/imageobject[@format='linespecific']
 | 
						|
	 ;; expanded
 | 
						|
	 (let loop ((kl (children (current-node))) (rl (empty-node-list)))
 | 
						|
	   (if (node-list-empty? kl)
 | 
						|
	       rl
 | 
						|
	       (if (equal? (gi (node-list-first kl))
 | 
						|
			   (normalize "inlinemediaobject"))
 | 
						|
		   (let* ((imgobj (node-list-filter-by-gi
 | 
						|
				   (children (node-list-first kl))
 | 
						|
				   (list (normalize "imageobject"))))
 | 
						|
			  (datobj (node-list-filter-by-gi
 | 
						|
				   (children imgobj)
 | 
						|
				   (list (normalize "imagedata")))))
 | 
						|
		     (if (and (not (node-list-empty? imgobj))
 | 
						|
			      (not (node-list-empty? datobj))
 | 
						|
			      (equal? (attribute-string (normalize "format") datobj)
 | 
						|
				      (normalize "linespecific")))
 | 
						|
			 (loop (node-list-rest kl)
 | 
						|
			       (node-list rl (string->nodes (include-characters
 | 
						|
							     (if (attribute-string (normalize "fileref") datobj)
 | 
						|
								 (attribute-string (normalize "fileref") datobj)
 | 
						|
								 (entity-generated-system-id (attribute-string (normalize "entityref") datobj)))))))
 | 
						|
			 (loop (node-list-rest kl)
 | 
						|
			       (node-list rl (node-list-first kl)))))
 | 
						|
		   (loop (node-list-rest kl) (node-list rl (node-list-first kl))))))))
 | 
						|
    (make sequence
 | 
						|
      ($line-start$ indent line-numbers? 1)
 | 
						|
      (let loop ((kl expanded-content)
 | 
						|
		 (linecount 1)
 | 
						|
		 (res (empty-sosofo)))
 | 
						|
	(if (node-list-empty? kl)
 | 
						|
	    res
 | 
						|
	    (loop
 | 
						|
	     (node-list-rest kl)
 | 
						|
	     (if (char=? (node-property 'char (node-list-first kl)
 | 
						|
					default: #\U-0000) #\U-000D)
 | 
						|
		 (+ linecount 1)
 | 
						|
		 linecount)
 | 
						|
	     (let ((c (node-list-first kl)))
 | 
						|
	       (if (char=? (node-property 'char c default: #\U-0000) 
 | 
						|
			   #\U-000D)
 | 
						|
		   (sosofo-append res
 | 
						|
				  (process-node-list c)
 | 
						|
				  ($line-start$ indent 
 | 
						|
						line-numbers?
 | 
						|
						(+ linecount 1)))
 | 
						|
		   (sosofo-append res (process-node-list c))))))))))
 | 
						|
 | 
						|
(define ($linespecific-display$ indent line-numbers?)
 | 
						|
  (make element gi: "P"
 | 
						|
	attributes: (list (list "CLASS" (gi)))
 | 
						|
	(make sequence
 | 
						|
	  ($line-start$ indent line-numbers? 1)
 | 
						|
	  (let loop ((kl (children (current-node)))
 | 
						|
		     (linecount 1)
 | 
						|
		     (res (empty-sosofo)))
 | 
						|
	    (if (node-list-empty? kl)
 | 
						|
		res
 | 
						|
		(loop
 | 
						|
		 (node-list-rest kl)
 | 
						|
		 (if (char=? (node-property 'char (node-list-first kl)
 | 
						|
					    default: #\U-0000) #\U-000D)
 | 
						|
		     (+ linecount 1)
 | 
						|
		     linecount)
 | 
						|
		 (let ((c (node-list-first kl)))
 | 
						|
		   (if (char=? (node-property 'char c default: #\U-0000) 
 | 
						|
			       #\U-000D)
 | 
						|
		       (sosofo-append res
 | 
						|
				      (make empty-element gi: "br")
 | 
						|
				      (process-node-list c)
 | 
						|
				      ($line-start$ indent 
 | 
						|
						    line-numbers? 
 | 
						|
						    (+ linecount 1)))
 | 
						|
		       (if (char=? (node-property 'char c default: #\U-0000) 
 | 
						|
				   #\U-0020)
 | 
						|
			   (sosofo-append res
 | 
						|
					  (make entity-ref name: "nbsp"))
 | 
						|
			   (sosofo-append res (process-node-list c)))))))))))
 | 
						|
 | 
						|
(element literallayout
 | 
						|
  (if (equal? (attribute-string "class") (normalize "monospaced"))
 | 
						|
      ($verbatim-display$
 | 
						|
       %indent-literallayout-lines%
 | 
						|
       (or %number-literallayout-lines%
 | 
						|
	   (equal? (attribute-string (normalize "linenumbering"))
 | 
						|
		   (normalize "numbered"))))
 | 
						|
      ($linespecific-display$
 | 
						|
       %indent-literallayout-lines%
 | 
						|
       (or %number-literallayout-lines%
 | 
						|
	   (equal? (attribute-string (normalize "linenumbering"))
 | 
						|
		   (normalize "numbered"))))))
 | 
						|
 | 
						|
(element address
 | 
						|
  ($linespecific-display$
 | 
						|
   %indent-address-lines%
 | 
						|
   (or %number-address-lines%
 | 
						|
       (equal? (attribute-string (normalize "linenumbering"))
 | 
						|
	       (normalize "numbered")))))
 | 
						|
 | 
						|
(element programlisting
 | 
						|
  ($verbatim-display$
 | 
						|
   %indent-programlisting-lines%
 | 
						|
   (or %number-programlisting-lines%
 | 
						|
       (equal? (attribute-string (normalize "linenumbering"))
 | 
						|
	       (normalize "numbered")))))
 | 
						|
 | 
						|
(element screen
 | 
						|
  ($verbatim-display$
 | 
						|
   %indent-screen-lines%
 | 
						|
   (or %number-screen-lines%
 | 
						|
       (equal? (attribute-string (normalize "linenumbering"))
 | 
						|
	       (normalize "numbered")))))
 | 
						|
 | 
						|
(element screenshot (process-children))
 | 
						|
(element screeninfo (empty-sosofo))
 | 
						|
 |