Skribilo: The Ultimate Document Programming Framework
|
Skribilo is a free document production tool that takes a structured document representation as its input and renders that document in a variety of output formats: HTML for on-line browsing, and Lout and LaTeX for high-quality hard copies. The input document can use Skribilo's markup language to provide information about the document's structure, which is similar to HTML or LaTeX and does not require expertise. Alternatively, it can use a simpler, ``markup-less'' format that borrows from Emacs' outline mode and from other conventions used in emails, Usenet and text. Last but not least, Skribilo can be thought of as a complete document programming framework for the Scheme programming language that may be used to automate a variety of document generation tasks. Skribilo uses GNU Guile 1.8 as the underlying Scheme implementation. Features
ExampleHere is a live example: the source code of this web page, colored using Skribilo's computer program coloring features. 1: ;;; 2: ;;; Skribilo's Wonderful Website. 3: ;;; 4: 5: (define (html-left-margin n e) 6: ;; Create the left margin of the HTML page being output. N is the 7: ;; node being output (e.g., a chapter) and E is an engine. 8: (let* ((doc (ast-document n)) 9: (chapters (search-down (lambda (n) 10: (is-markup? n 'chapter)) 11: doc))) 12: (table :class "left-margin-menu" :frame 'none 13: (cons (tr (td (ref :mark "intro" :text "Introduction"))) 14: (map (lambda (chapter) 15: (tr (td (ref :handle (handle chapter) 16: :text (markup-option chapter :title))))) 17: chapters))))) 18: 19: 20: (let ((html (find-engine 'html))) 21: ;; Customizing the HTML output... 22: (if (engine? html) 23: (begin 24: (engine-custom-set! html 'left-margin html-left-margin) 25: (engine-custom-set! html 'css "skribilo.css")))) 26: 27: 28: 29: ;;; 30: ;;; List of useful URLs. 31: ;;; 32: 33: (define (wikipedia/markup . body) 34: (ref :url "http://en.wikipedia.org/wiki/Markup_language" 35: :text body)) 36: 37: (define (wikipedia/markup-less . body) 38: (ref :url "http://en.wikipedia.org/wiki/Lightweight_markup_language" 39: :text body)) 40: 41: (define (scheme . body) 42: (ref :url "http://schemers.org/" :text body)) 43: 44: (define (guile . body) 45: (ref :url "http://www.gnu.org/software/guile/guile.html" :text body)) 46: 47: (define (r6rs . body) 48: (ref :url "http://r6rs.org/" :text body)) 49: 50: (define (latex . body) 51: (ref :url "http://www.latex-project.org/" :text body)) 52: 53: (define (lout . body) 54: (ref :url "http://lout.sf.net/" :text body)) 55: 56: (define (ploticus . body) 57: (ref :url "http://ploticus.sf.net/" :text body)) 58: 59: (define (guile-lib . body) 60: (ref :url "http://home.gna.org/guile-lib/" :text body)) 61: 62: (define (freedom . body) 63: (ref :url "http://www.gnu.org/philosophy/free-sw.html" :text body)) 64: 65: (define (gpl . body) 66: (ref :url "http://www.gnu.org/licenses/gpl.html" :text body)) 67: 68: (define (emacs/outline . body) 69: (ref :url "http://www.gnu.org/software/emacs/manual/html_node/Outline-Format.html" 70: :text body)) 71: 72: (define (skribilo-ml . body) 73: (ref :url "http://lists.nongnu.org/mailman/listinfo/skribilo-users" 74: :text body)) 75: 76: (define (arch . body) 77: (ref :url "http://www.gnu.org/software/gnu-arch/" :text body)) 78: 79: (define (skribe* . body) 80: (ref :url "http://www-sop.inria.fr/mimosa/fp/Skribe/" :text body)) 81: 82: (define (scribe . body) 83: (ref :url "http://www-sop.inria.fr/mimosa/fp/Scribe/" :text body)) 84: 85: (define (bigloo . body) 86: (ref :url "http://www-sop.inria.fr/mimosa/fp/Bigloo/" :text body)) 87: 88: (define (stklos . body) 89: (ref :url "http://www.stklos.org/" :text body)) 90: 91: 92: ;;; 93: ;;; The website. 94: ;;; 95: 96: (document :title [Skribilo: The Ultimate Document Programming Framework] 97: :author #f 98: :keywords '("Skribilo" "document programming" 99: "document formatting" "authoring" 100: "Scheme" "Guile" 101: "Skribe" "Lout" "LaTeX" "HTML") 102: 103: (mark "intro") 104: 105: (p [Skribilo is a ,(freedom [free]) document production tool that 106: takes a structured document representation as its input and renders that 107: document in a variety of output formats: HTML for on-line browsing, and 108: ,(lout [Lout]) and ,(latex [LaTeX]) for high-quality hard copies.]) 109: 110: (p [The input document can use Skribilo's ,(wikipedia/markup [markup 111: language]) to provide information about the document's structure, which 112: is similar to HTML or ,(latex [LaTeX]) and does not require expertise. 113: Alternatively, it can use a simpler, ``,(wikipedia/markup-less 114: [markup-less])'' format that borrows from ,(emacs/outline [Emacs' 115: outline mode]) and from other conventions used in emails, Usenet and 116: text.]) 117: 118: (p [Last but not least, Skribilo can be thought of as a complete 119: ,(emph [document programming framework]) for the ,(scheme [Scheme 120: programming language]) that may be used to automate a variety of 121: document generation tasks. Skribilo uses ,(guile [GNU Guile]) 1.8 as 122: the underlying Scheme implementation.]) 123: 124: 125: (chapter :title [Features] :number #f :file #f 126: 127: (itemize 128: (item [Output in a variety of formats: HTML, XML, ,(lout 129: [Lout]), ,(latex [LaTeX]), ConTeXt.]) 130: (item [Input using ,(skribe* [Skribe])'s markup (see 131: ,(ref :mark "self" :text [this example])) or using free form, 132: markup-less text and conventions similar to those used in 133: ,(emacs/outline [Emacs' outline mode]).]) 134: (item [Packages are available to produce: slides (overhead 135: transparencies), pie charts, equation formatting, syntax highlighting of 136: computer programs, and others.]) 137: (item [Bibliography management, i.e., BibTeX on steroids thanks 138: to the programmability brought by ,(scheme [Scheme]).]) 139: (item [Use of a proper module system (currently that of ,(guile 140: [Guile]), eventually that of ,(r6rs [R6RS])) rather than ,(tt 141: [load])-style interactions.]) 142: (item [And much more! :-)]))) 143: 144: (chapter :title [Example] :number #f :file #f 145: 146: (p [Here is a live example: the source code of this web page, 147: colored using Skribilo's computer program coloring features.]) 148: 149: (mark "self") 150: (tt (prog 151: (source :language skribe 152: :file "index.skb")))) 153: 154: (chapter :title [Documentation] :number #f :file #f ;; FIXME: Do it! 155: 156: (p [Coming real soon...])) 157: 158: (chapter :title [Availability] :number #f :file #f 159: 160: (p [Skribilo is available under the ,(gpl [GNU General Public 161: Licence]), version 2 or later. In order to use Skribilo, you need the 162: following pieces of software: 163: 164: ,(itemize 165: (item [,(guile [GNU Guile]) 1.8.0 or later;]) 166: (item [,(ref :url "http://savannah.gnu.org/projects/guile-reader/" 167: :text [Guile-reader]) 0.3 or later;]) 168: (item [a recent version of ,(guile-lib [Guile-lib]);]) 169: (item [either ,(lout [Lout]) 3.31 or ,(latex [LaTeX]) to produce 170: hard copies (PostScript/PDF);]) 171: (item [optionally, ,(ploticus [Ploticus]) to produce pie charts 172: (alternatively, ,(lout [Lout]) can be used for that purpose.]))]) 173: 174: (p [There has been no public release yet.])) 175: 176: (chapter :title [Mailing List] :number #f :file #f 177: :ident "mailing-list" 178: 179: (p [If you want to complain or tell how bright and shinning your 180: life has become since you discovered Skribilo, then go ahead and 181: subscribe to the ,(skribilo-ml [,(tt [skribilo-users]) mailing list])! 182: If you want to suggest improvements, that's also where they should go!])) 183: 184: (chapter :title [Development] :number #f :file #f 185: 186: (p [Development is done using the good ol' ,(arch [GNU Arch]) 187: distributed revision control system. You can fetch the latest version 188: of the main branch using the following incantations: 189: 190: ,(frame :class "code-excerpt" :border #f :margin #f 191: (code [ 192: $ tla register-archive http://arch.sv.gnu.org/archives/skribilo/2006/ 193: ,(linebreak) 194: $ tla get skribilo--devo--1.2 my-skribilo-directory 195: ])) 196: 197: You can then happily hack on your side and eventually promote your 198: changes ,(ref :ident "mailing-list" :text [on the mailing-list]).])) 199: 200: (chapter :title [History] :number #f :file #f 201: 202: (p [Skribilo is a direct descendant of ,(skribe* [Skribe]), a 203: document production tool written by Manuel Serrano for ,(bigloo 204: [Bigloo]) and ported to ,(stklos [STkLos]) by Erick Gallesio. 205: Development of ,(skribe* [Skribe]) started around 2003 as a successor of 206: Manuel's previous documentation system named ,(scribe [Scribe]).]) 207: 208: (p [Skribilo derives from Skribe 1.2d but it differs in a number 209: of ways: 210: 211: ,(itemize 212: (item [It contains new packages (pie charts, equation formatting) 213: and a new engine (the ,(lout [Lout]) engine).]) 214: (item [Symmetrically to the notion of engine (rendering back-ends), 215: Skribilo has the concept of ,(emph [readers]). A reader is the part 216: that reads an input document in a specific syntax and returns an 217: abstract syntax tree understandable by the core mechanisms. Skribilo 218: currently comes with two readers: one that implements the standard 219: Skribe syntax, and one that reads free form text with annotations 220: similar to those found in ,(emacs/outline [Emacs' outline mode]).]) 221: (item [It's been reworked to be used as a framework or library, 222: rather than as a stand-alone program. As a result, the logical 223: separation of modules has been improved, the globally shared state has 224: been significantly reduced, and ,(ref :url 225: "http://srfi.schemers.org/srfi-35/srfi-35.html" :text [SRFI-35 226: exceptions]) are used rather than plain ,(tt [error]) or ,(tt [exit]) 227: calls. The idea is to expose ,(emph [all the core mechanisms]) of 228: Skribilo to the user, thereby blurring the border between the user 229: program or document and the core of the system.]) 230: (item [Although Skribilo only runs on ,(guile [GNU Guile]), care was 231: taken to use mostly portable APIs (,(ref :url "http://srfi.schemers.org/" 232: :text [SRFIs])) so that the code is intelligible to most Scheme 233: programmers. Following ,(r6rs [R6RS]) is also an objective for the near 234: future.]))])) 235: 236: (chapter :title [Related Links] :number #f :file #f 237: 238: (itemize 239: (item [,(skribe* [Skribe]), the father of Skribilo. Its 240: predecessor is ,(scribe [Scribe]) and their goals were expressed in 241: ,(ref :url "http://www-sop.inria.fr/mimosa/fp/Scribe/doc/scribe.html" 242: :text [the Scribe white paper]) by Manuel Serrano and Erick Gallesio.]) 243: (item [Andy Wingo's ,(ref :url 244: "http://wingolog.org/software/guile-lib/texinfo/" :text [STexi]) (,(ref 245: :text [Texinfo] :url "http://www.gnu.org/software/texinfo/") as 246: S-expressions), available in ,(guile-lib [Guile-lib]).]) 247: (item [,(ref :url "http://okmij.org/ftp/Scheme/SXML.html" 248: :text [SXML]), XML as S-expressions.]) 249: (item [,(ref :url "http://www.it.usyd.edu.au/~jeff/nonpareil/" 250: :text [Nonpareil]), Jeff Kingston's much anticipated successor to ,(lout 251: [Lout]). Although Nonpareil is more ambitious than Skribilo, the 252: document entitled ,(it [Nonpareil Document Formatting]) shows 253: interesting similarities between both systems: separation of document 254: syntax and programming syntax (``readers'' and Scheme in Skribilo), 255: representation of document structure separated from the representation 256: of a laid out document (Nonpareil's ,(it [doc]) objects resemble 257: Skribilo's ,(tt [<ast>]) objects; its ,(it [scene]) objects have no 258: equivalent in Skribilo since Skribilo doesn't address text layout by 259: itself). It also includes interesting discussions about text selection 260: and document traversal (Nonpareil's ,(it [doc]) objects have no parent 261: pointers, unlike Skribilo's ,(tt [<ast>])).]) 262: (item [Good ol' ,(ref :url 263: "http://www.gnu.org/software/texinfo/" :text [GNU Texinfo]) abstracts 264: the various kinds of back-ends very well (in particular its 265: cross-reference-related commands).]) 266: (item [,(ref :url 267: "http://www.coyotos.org/docs/osdoc/osdoc.html" :text [OSDoc]), a 268: derivative of ,(ref :url "http://docbook.org/" :text [Docbook]).]) 269: (item [Systems that produce documents in various formats from 270: (almost) markup-less input text: ,(ref :url "http://txt2tags.sf.net/" 271: :text [txt2tags]), ,(ref :url 272: "http://os.inf.tu-dresden.de/~nf2/files/GOSH/" :text [GOSH]), ,(ref :url 273: "http://mercnet.pt/plaindoc/pd.html" :text [PlainDoc]), and many 274: others.])))) 275: 276: 277: ;;; Local Variables: 278: ;;; coding: latin-1 279: ;;; ispell-local-dictionary: "american" 280: ;;; End: 281: 282: ;;; arch-tag: fd51e0ce-d99f-4b70-8b92-9afbcfcf8855 DocumentationComing real soon... AvailabilitySkribilo is available under the GNU General Public Licence, version 2 or later. In order to use Skribilo, you need the following pieces of software:
There has been no public release yet. Mailing ListIf you want to complain or tell how bright and shinning your life has become since you discovered Skribilo, then go ahead and subscribe to the skribilo-users mailing list! If you want to suggest improvements, that's also where they should go! DevelopmentDevelopment is done using the good ol' GNU Arch distributed revision control system. You can fetch the latest version of the main branch using the following incantations:
HistorySkribilo is a direct descendant of Skribe, a document production tool written by Manuel Serrano for Bigloo and ported to STkLos by Erick Gallesio. Development of Skribe started around 2003 as a successor of Manuel's previous documentation system named Scribe. Skribilo derives from Skribe 1.2d but it differs in a number of ways:
Related Links
|
This HTML page was produced by Skribilo.
Last update: Sat Feb 24 15:31:43+0100 2007