--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">\r
+<head>\r
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
+<meta name="copyright" content="© 2014 (CC) BY Julien Moutinho &lt;julm+hledger@autogeree.net&gt;" />\r
+<meta name="generator" content="AsciiDoc 8.6.9 / slidy2 backend 1.0.3" />\r
+<meta name="font-size-adjustment" content="-3" />\r
+<title>Informatiser une comptabilité avec confiance</title>\r
+<style type="text/css">\r
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
+\r
+/* Default font. */\r
+body {\r
+ font-family: Georgia,serif;\r
+}\r
+\r
+/* Title font. */\r
+h1, h2, h3, h4, h5, h6,\r
+div.title, caption.title,\r
+thead, p.table.header,\r
+#toctitle,\r
+#author, #revnumber, #revdate, #revremark,\r
+#footer {\r
+ font-family: Arial,Helvetica,sans-serif;\r
+}\r
+\r
+body {\r
+ margin: 1em 5% 1em 5%;\r
+}\r
+\r
+a {\r
+ color: blue;\r
+ text-decoration: underline;\r
+}\r
+a:visited {\r
+ color: fuchsia;\r
+}\r
+\r
+em {\r
+ font-style: italic;\r
+ color: navy;\r
+}\r
+\r
+strong {\r
+ font-weight: bold;\r
+ color: #083194;\r
+}\r
+\r
+h1, h2, h3, h4, h5, h6 {\r
+ color: #527bbd;\r
+ margin-top: 1.2em;\r
+ margin-bottom: 0.5em;\r
+ line-height: 1.3;\r
+}\r
+\r
+h1, h2, h3 {\r
+ border-bottom: 2px solid silver;\r
+}\r
+h2 {\r
+ padding-top: 0.5em;\r
+}\r
+h3 {\r
+ float: left;\r
+}\r
+h3 + * {\r
+ clear: left;\r
+}\r
+h5 {\r
+ font-size: 1.0em;\r
+}\r
+\r
+div.sectionbody {\r
+ margin-left: 0;\r
+}\r
+\r
+hr {\r
+ border: 1px solid silver;\r
+}\r
+\r
+p {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0.5em;\r
+}\r
+\r
+ul, ol, li > p {\r
+ margin-top: 0;\r
+}\r
+ul > li { color: #aaa; }\r
+ul > li > * { color: black; }\r
+\r
+.monospaced, code, pre {\r
+ font-family: "Courier New", Courier, monospace;\r
+ font-size: inherit;\r
+ color: navy;\r
+ padding: 0;\r
+ margin: 0;\r
+}\r
+pre {\r
+ white-space: pre-wrap;\r
+}\r
+\r
+#author {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ font-size: 1.1em;\r
+}\r
+#email {\r
+}\r
+#revnumber, #revdate, #revremark {\r
+}\r
+\r
+#footer {\r
+ font-size: small;\r
+ border-top: 2px solid silver;\r
+ padding-top: 0.5em;\r
+ margin-top: 4.0em;\r
+}\r
+#footer-text {\r
+ float: left;\r
+ padding-bottom: 0.5em;\r
+}\r
+#footer-badges {\r
+ float: right;\r
+ padding-bottom: 0.5em;\r
+}\r
+\r
+#preamble {\r
+ margin-top: 1.5em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.imageblock, div.exampleblock, div.verseblock,\r
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
+div.admonitionblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.admonitionblock {\r
+ margin-top: 2.0em;\r
+ margin-bottom: 2.0em;\r
+ margin-right: 10%;\r
+ color: #606060;\r
+}\r
+\r
+div.content { /* Block element content. */\r
+ padding: 0;\r
+}\r
+\r
+/* Block element titles. */\r
+div.title, caption.title {\r
+ color: #527bbd;\r
+ font-weight: bold;\r
+ text-align: left;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.5em;\r
+}\r
+div.title + * {\r
+ margin-top: 0;\r
+}\r
+\r
+td div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content div.title:first-child {\r
+ margin-top: 0.0em;\r
+}\r
+div.content + div.title {\r
+ margin-top: 0.0em;\r
+}\r
+\r
+div.sidebarblock > div.content {\r
+ background: #ffffee;\r
+ border: 1px solid #dddddd;\r
+ border-left: 4px solid #f0f0f0;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.listingblock > div.content {\r
+ border: 1px solid #dddddd;\r
+ border-left: 5px solid #f0f0f0;\r
+ background: #f8f8f8;\r
+ padding: 0.5em;\r
+}\r
+\r
+div.quoteblock, div.verseblock {\r
+ padding-left: 1.0em;\r
+ margin-left: 1.0em;\r
+ margin-right: 10%;\r
+ border-left: 5px solid #f0f0f0;\r
+ color: #888;\r
+}\r
+\r
+div.quoteblock > div.attribution {\r
+ padding-top: 0.5em;\r
+ text-align: right;\r
+}\r
+\r
+div.verseblock > pre.content {\r
+ font-family: inherit;\r
+ font-size: inherit;\r
+}\r
+div.verseblock > div.attribution {\r
+ padding-top: 0.75em;\r
+ text-align: left;\r
+}\r
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
+div.verseblock + div.attribution {\r
+ text-align: left;\r
+}\r
+\r
+div.admonitionblock .icon {\r
+ vertical-align: top;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ text-decoration: underline;\r
+ color: #527bbd;\r
+ padding-right: 0.5em;\r
+}\r
+div.admonitionblock td.content {\r
+ padding-left: 0.5em;\r
+ border-left: 3px solid #dddddd;\r
+}\r
+\r
+div.exampleblock > div.content {\r
+ border-left: 3px solid #dddddd;\r
+ padding-left: 0.5em;\r
+}\r
+\r
+div.imageblock div.content { padding-left: 0; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
+a.image:visited { color: white; }\r
+\r
+dl {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+dt {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0;\r
+ font-style: normal;\r
+ color: navy;\r
+}\r
+dd > *:first-child {\r
+ margin-top: 0.1em;\r
+}\r
+\r
+ul, ol {\r
+ list-style-position: outside;\r
+}\r
+ol.arabic {\r
+ list-style-type: decimal;\r
+}\r
+ol.loweralpha {\r
+ list-style-type: lower-alpha;\r
+}\r
+ol.upperalpha {\r
+ list-style-type: upper-alpha;\r
+}\r
+ol.lowerroman {\r
+ list-style-type: lower-roman;\r
+}\r
+ol.upperroman {\r
+ list-style-type: upper-roman;\r
+}\r
+\r
+div.compact ul, div.compact ol,\r
+div.compact p, div.compact p,\r
+div.compact div, div.compact div {\r
+ margin-top: 0.1em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+tfoot {\r
+ font-weight: bold;\r
+}\r
+td > div.verse {\r
+ white-space: pre;\r
+}\r
+\r
+div.hdlist {\r
+ margin-top: 0.8em;\r
+ margin-bottom: 0.8em;\r
+}\r
+div.hdlist tr {\r
+ padding-bottom: 15px;\r
+}\r
+dt.hdlist1.strong, td.hdlist1.strong {\r
+ font-weight: bold;\r
+}\r
+td.hdlist1 {\r
+ vertical-align: top;\r
+ font-style: normal;\r
+ padding-right: 0.8em;\r
+ color: navy;\r
+}\r
+td.hdlist2 {\r
+ vertical-align: top;\r
+}\r
+div.hdlist.compact tr {\r
+ margin: 0;\r
+ padding-bottom: 0;\r
+}\r
+\r
+.comment {\r
+ background: yellow;\r
+}\r
+\r
+.footnote, .footnoteref {\r
+ font-size: 0.8em;\r
+}\r
+\r
+span.footnote, span.footnoteref {\r
+ vertical-align: super;\r
+}\r
+\r
+#footnotes {\r
+ margin: 20px 0 20px 0;\r
+ padding: 7px 0 0 0;\r
+}\r
+\r
+#footnotes div.footnote {\r
+ margin: 0 0 5px 0;\r
+}\r
+\r
+#footnotes hr {\r
+ border: none;\r
+ border-top: 1px solid silver;\r
+ height: 1px;\r
+ text-align: left;\r
+ margin-left: 0;\r
+ width: 20%;\r
+ min-width: 100px;\r
+}\r
+\r
+div.colist td {\r
+ padding-right: 0.5em;\r
+ padding-bottom: 0.3em;\r
+ vertical-align: top;\r
+}\r
+div.colist td img {\r
+ margin-top: 0.3em;\r
+}\r
+\r
+@media print {\r
+ #footer-badges { display: none; }\r
+}\r
+\r
+#toc {\r
+ margin-bottom: 2.5em;\r
+}\r
+\r
+#toctitle {\r
+ color: #527bbd;\r
+ font-size: 1.1em;\r
+ font-weight: bold;\r
+ margin-top: 1.0em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
+ margin-top: 0;\r
+ margin-bottom: 0;\r
+}\r
+div.toclevel2 {\r
+ margin-left: 2em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel3 {\r
+ margin-left: 4em;\r
+ font-size: 0.9em;\r
+}\r
+div.toclevel4 {\r
+ margin-left: 6em;\r
+ font-size: 0.9em;\r
+}\r
+\r
+span.aqua { color: aqua; }\r
+span.black { color: black; }\r
+span.blue { color: blue; }\r
+span.fuchsia { color: fuchsia; }\r
+span.gray { color: gray; }\r
+span.green { color: green; }\r
+span.lime { color: lime; }\r
+span.maroon { color: maroon; }\r
+span.navy { color: navy; }\r
+span.olive { color: olive; }\r
+span.purple { color: purple; }\r
+span.red { color: red; }\r
+span.silver { color: silver; }\r
+span.teal { color: teal; }\r
+span.white { color: white; }\r
+span.yellow { color: yellow; }\r
+\r
+span.aqua-background { background: aqua; }\r
+span.black-background { background: black; }\r
+span.blue-background { background: blue; }\r
+span.fuchsia-background { background: fuchsia; }\r
+span.gray-background { background: gray; }\r
+span.green-background { background: green; }\r
+span.lime-background { background: lime; }\r
+span.maroon-background { background: maroon; }\r
+span.navy-background { background: navy; }\r
+span.olive-background { background: olive; }\r
+span.purple-background { background: purple; }\r
+span.red-background { background: red; }\r
+span.silver-background { background: silver; }\r
+span.teal-background { background: teal; }\r
+span.white-background { background: white; }\r
+span.yellow-background { background: yellow; }\r
+\r
+span.big { font-size: 2em; }\r
+span.small { font-size: 0.6em; }\r
+\r
+span.underline { text-decoration: underline; }\r
+span.overline { text-decoration: overline; }\r
+span.line-through { text-decoration: line-through; }\r
+\r
+div.unbreakable { page-break-inside: avoid; }\r
+\r
+\r
+/*\r
+ * xhtml11 specific\r
+ *\r
+ * */\r
+\r
+div.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+div.tableblock > table {\r
+ border: 3px solid #527bbd;\r
+}\r
+thead, p.table.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.table {\r
+ margin-top: 0;\r
+}\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
+div.tableblock > table[frame="void"] {\r
+ border-style: none;\r
+}\r
+div.tableblock > table[frame="hsides"] {\r
+ border-left-style: none;\r
+ border-right-style: none;\r
+}\r
+div.tableblock > table[frame="vsides"] {\r
+ border-top-style: none;\r
+ border-bottom-style: none;\r
+}\r
+\r
+\r
+/*\r
+ * html5 specific\r
+ *\r
+ * */\r
+\r
+table.tableblock {\r
+ margin-top: 1.0em;\r
+ margin-bottom: 1.5em;\r
+}\r
+thead, p.tableblock.header {\r
+ font-weight: bold;\r
+ color: #527bbd;\r
+}\r
+p.tableblock {\r
+ margin-top: 0;\r
+}\r
+table.tableblock {\r
+ border-width: 3px;\r
+ border-spacing: 0px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+ border-collapse: collapse;\r
+}\r
+th.tableblock, td.tableblock {\r
+ border-width: 1px;\r
+ padding: 4px;\r
+ border-style: solid;\r
+ border-color: #527bbd;\r
+}\r
+\r
+table.tableblock.frame-topbot {\r
+ border-left-style: hidden;\r
+ border-right-style: hidden;\r
+}\r
+table.tableblock.frame-sides {\r
+ border-top-style: hidden;\r
+ border-bottom-style: hidden;\r
+}\r
+table.tableblock.frame-none {\r
+ border-style: hidden;\r
+}\r
+\r
+th.tableblock.halign-left, td.tableblock.halign-left {\r
+ text-align: left;\r
+}\r
+th.tableblock.halign-center, td.tableblock.halign-center {\r
+ text-align: center;\r
+}\r
+th.tableblock.halign-right, td.tableblock.halign-right {\r
+ text-align: right;\r
+}\r
+\r
+th.tableblock.valign-top, td.tableblock.valign-top {\r
+ vertical-align: top;\r
+}\r
+th.tableblock.valign-middle, td.tableblock.valign-middle {\r
+ vertical-align: middle;\r
+}\r
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
+ vertical-align: bottom;\r
+}\r
+\r
+\r
+/*\r
+ * manpage specific\r
+ *\r
+ * */\r
+\r
+body.manpage h1 {\r
+ padding-top: 0.5em;\r
+ padding-bottom: 0.5em;\r
+ border-top: 2px solid silver;\r
+ border-bottom: 2px solid silver;\r
+}\r
+body.manpage h2 {\r
+ border-style: none;\r
+}\r
+body.manpage div.sectionbody {\r
+ margin-left: 3em;\r
+}\r
+\r
+@media print {\r
+ body.manpage div#toc { display: none; }\r
+}\r
+</style>\r
+<style type="text/css">\r
+/* slidy.css\r
+\r
+ Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.\r
+ W3C liability, trademark, document use and software licensing\r
+ rules apply, see:\r
+\r
+ http://www.w3.org/Consortium/Legal/copyright-documents\r
+ http://www.w3.org/Consortium/Legal/copyright-software\r
+*/\r
+\r
+/*\r
+ SJR: 2010-09-29: Modified for AsciiDoc slidy backend.\r
+ Mostly just commented out stuff that is handled by AsciiDoc's CSS files.\r
+*/\r
+\r
+body\r
+{\r
+ margin: 0 0 0 0;\r
+ padding: 0 0 0 0;\r
+ width: 100%;\r
+ height: 100%;\r
+ color: black;\r
+ background-color: white;\r
+/*\r
+ font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;\r
+*/\r
+ font-size: 14pt;\r
+}\r
+\r
+div.toolbar {\r
+ position: fixed; z-index: 200;\r
+ top: auto; bottom: 0; left: 0; right: 0;\r
+ height: 1.2em; text-align: right;\r
+ padding-left: 1em;\r
+ padding-right: 1em;\r
+ font-size: 60%;\r
+ color: red;\r
+ background-color: rgb(240,240,240);\r
+ border-top: solid 1px rgb(180,180,180);\r
+}\r
+\r
+div.toolbar span.copyright {\r
+ color: black;\r
+ margin-left: 0.5em;\r
+}\r
+\r
+div.initial_prompt {\r
+ position: absolute;\r
+ z-index: 1000;\r
+ bottom: 1.2em;\r
+ width: 90%;\r
+ background-color: rgb(200,200,200);\r
+ opacity: 0.35;\r
+ cursor: pointer;\r
+}\r
+\r
+div.initial_prompt p.help {\r
+ text-align: center;\r
+}\r
+\r
+div.initial_prompt p.close {\r
+ text-align: right;\r
+ font-style: italic;\r
+}\r
+\r
+div.slidy_toc {\r
+ position: absolute;\r
+ z-index: 300;\r
+ width: 60%;\r
+ max-width: 30em;\r
+ height: 30em;\r
+ overflow: auto;\r
+ top: auto;\r
+ right: auto;\r
+ left: 4em;\r
+ bottom: 4em;\r
+ padding: 1em;\r
+ background: rgb(240,240,240);\r
+ border-style: solid;\r
+ border-width: 2px;\r
+ font-size: 60%;\r
+}\r
+\r
+div.slidy_toc .toc_heading {\r
+ text-align: center;\r
+ width: 100%;\r
+ margin: 0;\r
+ margin-bottom: 1em;\r
+ border-bottom-style: solid;\r
+ border-bottom-color: rgb(180,180,180);\r
+ border-bottom-width: 1px;\r
+}\r
+\r
+div.slide {\r
+ z-index: 20;\r
+ margin: 0 0 0 0;\r
+ padding-top: 0;\r
+ padding-bottom: 0;\r
+ padding-left: 20px;\r
+ padding-right: 20px;\r
+ border-width: 0;\r
+ clear: both;\r
+ top: 0;\r
+ bottom: 0;\r
+ left: 0;\r
+ right: 0;\r
+ line-height: 120%;\r
+ background-color: transparent;\r
+}\r
+\r
+div.background {\r
+ display: none;\r
+}\r
+\r
+div.handout {\r
+ margin-left: 20px;\r
+ margin-right: 20px;\r
+}\r
+\r
+div.slide.titlepage {\r
+ text-align: center;\r
+}\r
+\r
+div.slide.titlepage.h1 {\r
+ padding-top: 10%;\r
+}\r
+\r
+div.slide h1 {\r
+ padding-left: 0;\r
+ padding-right: 20pt;\r
+ padding-top: 4pt;\r
+ padding-bottom: 4pt;\r
+ margin-top: 0;\r
+ margin-left: 0;\r
+ margin-right: 60pt;\r
+ margin-bottom: 0.5em;\r
+ display: block;\r
+ font-size: 160%;\r
+ line-height: 1.2em;\r
+ background: transparent;\r
+}\r
+\r
+div.toc {\r
+ position: absolute;\r
+ top: auto;\r
+ bottom: 4em;\r
+ left: 4em;\r
+ right: auto;\r
+ width: 60%;\r
+ max-width: 30em;\r
+ height: 30em;\r
+ border: solid thin black;\r
+ padding: 1em;\r
+ background: rgb(240,240,240);\r
+ color: black;\r
+ z-index: 300;\r
+ overflow: auto;\r
+ display: block;\r
+ visibility: visible;\r
+}\r
+\r
+div.toc-heading {\r
+ width: 100%;\r
+ border-bottom: solid 1px rgb(180,180,180);\r
+ margin-bottom: 1em;\r
+ text-align: center;\r
+}\r
+\r
+/*\r
+pre {\r
+ font-size: 80%;\r
+ font-weight: bold;\r
+ line-height: 120%;\r
+ padding-top: 0.2em;\r
+ padding-bottom: 0.2em;\r
+ padding-left: 1em;\r
+ padding-right: 1em;\r
+ border-style: solid;\r
+ border-left-width: 1em;\r
+ border-top-width: thin;\r
+ border-right-width: thin;\r
+ border-bottom-width: thin;\r
+ border-color: #95ABD0;\r
+ color: #00428C;\r
+ background-color: #E4E5E7;\r
+}\r
+*/\r
+\r
+/*\r
+li pre { margin-left: 0; }\r
+\r
+blockquote { font-style: italic }\r
+\r
+img { background-color: transparent }\r
+\r
+p.copyright { font-size: smaller }\r
+*/\r
+\r
+.center { text-align: center }\r
+.footnote { font-size: smaller; margin-left: 2em; }\r
+\r
+/*\r
+a img { border-width: 0; border-style: none }\r
+*/\r
+\r
+a:visited { color: navy }\r
+a:link { color: navy }\r
+a:hover { color: red; text-decoration: underline }\r
+a:active { color: red; text-decoration: underline }\r
+\r
+a {text-decoration: none}\r
+.navbar a:link {color: white}\r
+.navbar a:visited {color: yellow}\r
+.navbar a:active {color: red}\r
+.navbar a:hover {color: red}\r
+\r
+/*\r
+ul { list-style-type: square; }\r
+ul ul { list-style-type: disc; }\r
+ul ul ul { list-style-type: circle; }\r
+ul ul ul ul { list-style-type: disc; }\r
+li { margin-left: 0.5em; margin-top: 0.5em; }\r
+li li { font-size: 85%; font-style: italic }\r
+li li li { font-size: 85%; font-style: normal }\r
+*/\r
+\r
+div dt\r
+{\r
+ margin-left: 0;\r
+ margin-top: 1em;\r
+ margin-bottom: 0.5em;\r
+ font-weight: bold;\r
+}\r
+div dd\r
+{\r
+ margin-left: 2em;\r
+ margin-bottom: 0.5em;\r
+}\r
+\r
+\r
+/*\r
+p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {\r
+ margin-left: 1em;\r
+ margin-right: 1em;\r
+}\r
+*/\r
+\r
+p.subhead { font-weight: bold; margin-top: 2em; }\r
+\r
+.smaller { font-size: smaller }\r
+.bigger { font-size: 130% }\r
+\r
+/*\r
+td,th { padding: 0.2em }\r
+*/\r
+\r
+ul {\r
+ margin: 0.5em 1.5em 0.5em 1.5em;\r
+ padding: 0;\r
+}\r
+\r
+ol {\r
+ margin: 0.5em 1.5em 0.5em 1.5em;\r
+ padding: 0;\r
+}\r
+\r
+ul { list-style-type: square; }\r
+ul ul { list-style-type: disc; }\r
+ul ul ul { list-style-type: circle; }\r
+ul ul ul ul { list-style-type: disc; }\r
+\r
+/*\r
+ul li {\r
+ list-style: square;\r
+ margin: 0.1em 0em 0.6em 0;\r
+ padding: 0 0 0 0;\r
+ line-height: 140%;\r
+}\r
+\r
+ol li {\r
+ margin: 0.1em 0em 0.6em 1.5em;\r
+ padding: 0 0 0 0px;\r
+ line-height: 140%;\r
+ list-style-type: decimal;\r
+}\r
+\r
+li ul li {\r
+ font-size: 85%;\r
+ font-style: italic;\r
+ list-style-type: disc;\r
+ background: transparent;\r
+ padding: 0 0 0 0;\r
+}\r
+li li ul li {\r
+ font-size: 85%;\r
+ font-style: normal;\r
+ list-style-type: circle;\r
+ background: transparent;\r
+ padding: 0 0 0 0;\r
+}\r
+li li li ul li {\r
+ list-style-type: disc;\r
+ background: transparent;\r
+ padding: 0 0 0 0;\r
+}\r
+\r
+li ol li {\r
+ list-style-type: decimal;\r
+}\r
+\r
+\r
+li li ol li {\r
+ list-style-type: decimal;\r
+}\r
+*/\r
+\r
+/*\r
+ setting class="outline" on ol or ul makes it behave as an\r
+ ouline list where blocklevel content in li elements is\r
+ hidden by default and can be expanded or collapsed with\r
+ mouse click. Set class="expand" on li to override default\r
+*/\r
+\r
+ol.outline li:hover { cursor: pointer }\r
+ol.outline li.nofold:hover { cursor: default }\r
+\r
+ul.outline li:hover { cursor: pointer }\r
+ul.outline li.nofold:hover { cursor: default }\r
+\r
+ol.outline { list-style:decimal; }\r
+ol.outline ol { list-style-type:lower-alpha }\r
+\r
+ol.outline li.nofold {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.unfolded {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.folded {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.unfolded:hover {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.folded:hover {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;\r
+}\r
+\r
+ul.outline li.nofold {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.unfolded {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.folded {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.unfolded:hover {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.folded:hover {\r
+ padding: 0 0 0 20px;\r
+ background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;\r
+}\r
+\r
+/* for slides with class "title" in table of contents */\r
+a.titleslide { font-weight: bold; font-style: italic }\r
+\r
+/*\r
+ hide images for work around for save as bug\r
+ where browsers fail to save images used by CSS\r
+*/\r
+img.hidden { display: none; visibility: hidden }\r
+div.initial_prompt { display: none; visibility: hidden }\r
+\r
+ div.slide {\r
+ visibility: visible;\r
+ position: inherit;\r
+ }\r
+ div.handout {\r
+ border-top-style: solid;\r
+ border-top-width: thin;\r
+ border-top-color: black;\r
+ }\r
+\r
+@media screen {\r
+ .hidden { display: none; visibility: visible }\r
+\r
+ div.slide.hidden { display: block; visibility: visible }\r
+ div.handout.hidden { display: block; visibility: visible }\r
+ div.background { display: none; visibility: hidden }\r
+ body.single_slide div.initial_prompt { display: block; visibility: visible }\r
+ body.single_slide div.background { display: block; visibility: visible }\r
+ body.single_slide div.background.hidden { display: none; visibility: hidden }\r
+ body.single_slide .invisible { visibility: hidden }\r
+ body.single_slide .hidden { display: none; visibility: hidden }\r
+ body.single_slide div.slide { position: absolute }\r
+ body.single_slide div.handout { display: none; visibility: hidden }\r
+}\r
+\r
+@media print {\r
+ .hidden { display: block; visibility: visible }\r
+\r
+/*\r
+ div.slide pre { font-size: 60%; padding-left: 0.5em; }\r
+*/\r
+ div.toolbar { display: none; visibility: hidden; }\r
+ div.slidy_toc { display: none; visibility: hidden; }\r
+ div.background { display: none; visibility: hidden; }\r
+ div.slide { page-break-before: always }\r
+ /* :first-child isn't reliable for print media */\r
+ div.slide.first-slide { page-break-before: avoid }\r
+}\r
+\r
+\r
+/* SJR: AsciiDoc slidy backend tweaks */\r
+\r
+ol, ul {\r
+ margin: 0.8em 1.5em 0.8em 1.8em;\r
+}\r
+li > ul, li > ol {\r
+ margin-top: 0.5em;\r
+}\r
+\r
+.outline > li.folded,\r
+.outline > li.unfolded {\r
+ color: #527bbd;\r
+}\r
+ul > li{ color: #aaa; }\r
+ul > li > *, ol > li > * { color: black; }\r
+\r
+li {\r
+ margin-top: 0.5em;\r
+ margin-bottom: 0.5em;\r
+}\r
+\r
+/* jmi hack */\r
+@media screen {\r
+ body.single_slide .invisible { opacity: 0.15; visibility: visible; }\r
+ /*img.invisible { opacity: 0.1; visibility: visible; } */\r
+ img.invisible { visibility: hidden !important }\r
+}\r
+a {text-decoration: underline;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_none">\r
+/* empty color set styles */\r
+</style>\r
+<style type="text/css" title="slidy_color_set_yellow">\r
+/* rainbow color styles */\r
+body { background-color: #ffffaa;}\r
+a:link, a:visited, a:hover, a:active { color: blue; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { color: black;}\r
+div.slide h1,h2,h3,h4,h5,h6 { color: orange;}\r
+em { color: green;}\r
+tt { color: green;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: red;}\r
+div.quoteblock, div.verseblock { color: black; }\r
+div.admonitionblock { color: red;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_green">\r
+/* blue color styles */\r
+body { background-color: #449900;}\r
+a:link, a:visited, a:hover, a:active { color: fuchsia; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { color: yellow;}\r
+div.slide h1,h2,h3,h4,h5,h6 { color: lime;}\r
+em { color: orange;}\r
+tt { color: orange;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: #44ff00;}\r
+div.quoteblock, div.verseblock { color: black; }\r
+div.admonitionblock { color: #88ff55;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_blue">\r
+/* blue color styles */\r
+body { background-color: navy;}\r
+a:link, a:visited, a:hover, a:active { color: yellow; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { background-color: navy; color: aqua;}\r
+div.slide h1,h2,h3,h4,h5,h6 { color: aqua;}\r
+em { color: blue;}\r
+tt { color: blue;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: teal;}\r
+div.admonitionblock { color: teal;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_black">\r
+/* black color set styles */\r
+body { background-color: black !important; }\r
+a:link, a:visited, a:hover, a:active { color: gray; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { color: silver !important; }\r
+span, caption, th { color: silver !important; }\r
+div.slide h1,h2,h3,h4,h5,h6 { color: white;}\r
+em, strong { color: #999999;}\r
+tt { color: blue;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: black; }\r
+div.admonitionblock, div.quoteblock, div.verseblock { color: white; }\r
+div.cover.slide, div.cover.slide h1 { background-color: black; }\r
+</style>\r
+<style type="text/css">\r
+html body {\r
+ color:#343434;\r
+ font-family:serif;\r
+ font-size:10px;\r
+ margin:0 0;\r
+ padding:0 0 0 0;\r
+ }\r
+/* titres */\r
+ h1, h2, h3, h4, h5, h6 {\r
+ font-family: serif;\r
+ }\r
+ div.slide h1 {\r
+ margin: 0 0 0 0 !important;\r
+ }\r
+ #revnumber {\r
+ font-family: serif;\r
+ font-size:inherit;\r
+ font-weight:bold;\r
+ }\r
+/* sections */\r
+ .article {\r
+ }\r
+ .article > .sect1,\r
+ .article > .sect2,\r
+ .article > .sect3 {\r
+ -moz-box-sizing:border-box;\r
+ -webkit-box-sizing:border-box;\r
+ box-sizing:border-box;\r
+ clear:both;\r
+ display:table;\r
+ float:left;\r
+ margin:0 auto 0 auto;\r
+ padding:0 1em 0 1em;\r
+ width:100%;\r
+ }\r
+ .article > .sect1:last-child {\r
+ margin-bottom:2ex;\r
+ }\r
+ .article > .sect1 * {\r
+ clear:both;\r
+ }\r
+ .article > .refnamediv > *,\r
+ .article > .sect1 > *,\r
+ .article > .refsynopsisdiv > * {\r
+ }\r
+ .article > .sect1 > .sect2 > * {\r
+ margin-left:1em;\r
+ }\r
+ .article > .sect1 > .sect2 > .sect3 > * {\r
+ margin-left:2em;\r
+ }\r
+/* text */\r
+ a:empty {\r
+ margin:0 0 0 0;\r
+ padding:0 0 0 0;\r
+ }\r
+ .article em {\r
+ color:#000080;\r
+ }\r
+ .article .emphasis {\r
+ text-decoration:underline;\r
+ }\r
+ .article p {\r
+ margin:0 0 0 0;\r
+ max-width:34em;\r
+ padding:1ex 0 0 0;\r
+ text-align:justify;\r
+ }\r
+ .article h2 + p {\r
+ margin-top:0;\r
+ padding-top:0.25ex;\r
+ }\r
+ .article h3 + p,\r
+ .article h3 + p[title] {\r
+ margin-top:0;\r
+ padding-top:0;\r
+ }\r
+/* citations */\r
+ .article code,\r
+ .article code.literal {\r
+ background-color:#EEEEEE;\r
+ color:inherit !important;\r
+ font-family:monospace,Courier;\r
+ white-space:pre;\r
+ font-size:90%;\r
+ }\r
+ .article pre {\r
+ /*background-color: #ffffff;*/\r
+ font-family:monospace,Courier;\r
+ line-height:1.3; /* TODO: 1.2 ? */\r
+ color: #000000;\r
+ font-family: monospace;\r
+ line-height: 1.13;\r
+ overflow: auto;\r
+ white-space: pre;\r
+ }\r
+ .article pre.literallayout {\r
+ border-left:1ex solid navy;\r
+ margin-left:0;\r
+ padding-left:1ex;\r
+ }\r
+ .article .screen {\r
+ border-width:0px 0px 0px 5px;\r
+ color:black;\r
+ display:inline-block;\r
+ margin:0.5ex 0 0.5ex 0;\r
+ }\r
+ .article .programlisting {\r
+ color:black;\r
+ margin-left:2em;\r
+ margin-right:2em;\r
+ }\r
+ .article .listitem > .simpara {\r
+ display:inline;\r
+ margin-bottom:0;\r
+ }\r
+/* titles */\r
+ .article > .sect1 > h2 {\r
+ border-bottom:2px solid black;\r
+ /*box-shadow:0px 1px 00px #888888;*/\r
+ color:green;\r
+ font-family:monospace,Arial,sans-serif;\r
+ font-size:120%;\r
+ /*font-variant:small-caps;*/\r
+ line-height:1.2;\r
+ margin:1ex 0 0.5ex 0;\r
+ padding:0 0 0.5ex 0;\r
+ }\r
+ .article > .refnamediv > h2,\r
+ .article > .refsynopsisdiv > h2 {\r
+ font-variant:small-caps;\r
+ }\r
+ .article > .sect1 > .sect2 > h3 {\r
+ color:DarkGreen;\r
+ font-family:monospace,Arial,sans-serif;\r
+ font-size:100%;\r
+ padding:1.5ex 0 0.5ex 0;\r
+ margin:0 0 0 0;\r
+ }\r
+ .article > .sect1 > h2 + .sect2 > h3 {\r
+ padding-top:0;\r
+ }\r
+ .article > .sect1 > .sect2 > h3:before,\r
+ .article .toc .sect2:before {\r
+ color:black;\r
+ content:"► ";\r
+ font-family:monospace,Arial,sans-serif;\r
+ float:left;\r
+ }\r
+ .article > .sect1 > .sect2 > .sect3 > h4 {\r
+ color:DarkGreen;\r
+ font-family:monospace,Arial,sans-serif;\r
+ font-size:100%;\r
+ padding:1em 0 0 0;\r
+ margin:0 0 0 0;\r
+ }\r
+ .article > .sect1 > .sect2 > .sect3 > h4:before,\r
+ .article .toc .sect3:before {\r
+ color:black;\r
+ content:"►► ";\r
+ font-family:monospace,Arial,sans-serif;\r
+ float:left;\r
+ }\r
+ .article li.listitem > p.simpara:first-child {\r
+ margin-top:0;\r
+ }\r
+ .article p .formalpara-title {\r
+ /* XXX: there is a docbook-xsl bug here:\r
+ * https://lists.oasis-open.org/archives/docbook-apps/201107/msg00003.html\r
+ */\r
+ color:black;\r
+ font-weight:bold;\r
+ line-height:1.4;\r
+ margin:0 0 0 0;\r
+ padding:0 0 0 0;\r
+ text-align:left;\r
+ }\r
+ .article p[title] {\r
+ margin:1ex 0 0 0;\r
+ max-width:none;\r
+ padding:0 0 0 0;\r
+ }\r
+ .article span.citerefentry > span.articletitle {\r
+ white-space:nowrap;\r
+ }\r
+/* lists */\r
+ .article .hdlist p {\r
+ padding:0 0 0 0;\r
+ }\r
+ .article .hdlist td.hdlist1 {\r
+ text-align:right;\r
+ vertical-align:top;\r
+ }\r
+ .article .hdlist td.hdlist1,\r
+ .article .hdlist td.hdlist1 {\r
+ text-align:right;\r
+ }\r
+ .article .hdlist td.hdlist2 {\r
+ text-align:left;\r
+ padding:0 0 0 0;\r
+ vertical-align:middle;\r
+ }\r
+ .article .hdlist td.hdlist2 > .listingblock {\r
+ margin-top: 0;\r
+ }\r
+ .article .hdlist.math td.hdlist1,\r
+ .article .hdlist.math td.hdlist2 {\r
+ vertical-align:middle !important;\r
+ }\r
+ .article .calloutlist p {\r
+ padding:0 0 0 0;\r
+ }\r
+ .article .calloutlist td {\r
+ padding:0 0 0 0;\r
+ }\r
+ .article .calloutlist td p {\r
+ }\r
+ .article .calloutlist td:first-child {\r
+ padding-right:1em;\r
+ }\r
+ .article .calloutlist td:first-child p {\r
+ text-align:right;\r
+ }\r
+ .article .itemizedlist,\r
+ .article .orderedlist {\r
+ padding:0 0 0 0;\r
+ margin:0 0 0 0;\r
+ }\r
+ .article .itemizedlist ul,\r
+ .article .orderedlist ol {\r
+ padding:0 0 0 0;\r
+ margin:0 0 0 1.5em;\r
+ list-style-position:outside;\r
+ }\r
+ .article .itemizedlist ul li,\r
+ .article .orderedlist ol li {\r
+ margin:0 0 0 0;\r
+ max-width:51em;\r
+ padding:0 0 0 0;\r
+ }\r
+ .article .dlist {\r
+ padding:0 0 0 0;\r
+ margin:0 0 0 0;\r
+ }\r
+ .article .dlist dl {\r
+ list-style-position:outside;\r
+ margin:0 0 0 0;\r
+ padding:0.5ex 0 0 0;\r
+ }\r
+ .article .dlist dl dt {\r
+ margin:0 0 0 0;\r
+ padding-left:1px;\r
+ }\r
+ .article .dlist dl dd {\r
+ border-left:1px dotted black;\r
+ margin:0.5ex 0 0.5ex 0.9ex;\r
+ max-width:51em;\r
+ padding-left:1.1ex;\r
+ text-align:justify;\r
+ }\r
+ .article .dlist dl dd > p:first-child {\r
+ padding-top:0;\r
+ }\r
+ .article .dlist dl dd > p:last-child {\r
+ padding-bottom:0;\r
+ }\r
+ .article .dlist dt:before,\r
+ .article .toc dt:before {\r
+ color:black;\r
+ content:"▪ ";\r
+ font-family:monospace,Arial,sans-serif;\r
+ float:left;\r
+ }\r
+ .article h2 + .itemizedlist ul,\r
+ .article h2 + .orderedlist ol,\r
+ .article h2 + .dlist dl {\r
+ padding-top:0;\r
+ }\r
+/* fhs */\r
+ .article a[href^="#fhs:"] {\r
+ white-space:pre;\r
+ }\r
+ .article .toc a[href^="#fhs:"] {\r
+ white-space:normal;\r
+ }\r
+/* sidebar */\r
+ .article .sidebar {\r
+ -moz-box-sizing:border-box;\r
+ -webkit-box-sizing:border-box;\r
+ background:none repeat scroll 0 0 #FFFFEE;\r
+ border:1px solid #C0C0C0;\r
+ box-sizing:border-box;\r
+ clear:both;\r
+ float:left;\r
+ height:96%;\r
+ left:0;\r
+ margin:1em 0 0 1em;\r
+ overflow:auto;\r
+ padding:1ex 1em 1ex 1em;\r
+ position:fixed;\r
+ top:0;\r
+ width:30em;\r
+ }\r
+ .article .sidebar .refnamediv {\r
+ margin:0 0 1ex 0;\r
+ }\r
+ .article .sidebar .refnamediv h2 {\r
+ border-bottom:2px solid black;\r
+ color:green;\r
+ font-family:monospace,Arial,sans-serif;\r
+ font-size:120%;\r
+ font-variant:small-caps;\r
+ border-bottom:0 solid black;\r
+ margin:0 0 0.5ex 0;\r
+ padding:0 0 0 0;\r
+ }\r
+ .article .sidebar .refnamediv p {\r
+ margin:0 0 0 0;\r
+ padding:0 0 0 0;\r
+ text-align:justify;\r
+ }\r
+/* location */\r
+ .article .location {\r
+ margin:0 0 0 0;\r
+ }\r
+ .article .location .location-title {\r
+ display:inline-block;\r
+ }\r
+ .article .location .location-path {\r
+ display:inline-block;\r
+ margin-left:1em;\r
+ margin-bottom:0.5ex;\r
+ }\r
+ .article .location .location-path a {\r
+ display:inline-block;\r
+ }\r
+ .article .location .location-path .dir {\r
+ color:blue;\r
+ font-weight:bold;\r
+ }\r
+ .article .location .location-path .dir .slash {\r
+ color:black;\r
+ }\r
+ .article .location .location-path .file {\r
+ font-weight:bold;\r
+ }\r
+/* language */\r
+ .article .language {\r
+ margin:0 0 0 0;\r
+ }\r
+ .article .language .language-title {\r
+ display:inline-block;\r
+ }\r
+ .article .language .language-list {\r
+ display:inline-block;\r
+ font-weight:bold;\r
+ margin-left:1em;\r
+ }\r
+ .article .language .language-list .lang-available {\r
+ color:blue;\r
+ }\r
+ .article .language .language-list .lang-current {\r
+ color:black;\r
+ }\r
+/* toc */\r
+ .article .toc {\r
+ }\r
+ .article .toc dl {\r
+ clear:left;\r
+ margin-left:0;\r
+ padding-left:0;\r
+ }\r
+ .article .toc dl dd {\r
+ border-left:1px dotted #333;\r
+ margin-bottom:1px;\r
+ margin-left:0.1ex;\r
+ padding-left:1.9ex;\r
+ }\r
+ .article .toc dl dt span.refsynopsisdiv {\r
+ }\r
+ .article .toc .sect1:before {\r
+ color:black;\r
+ content:"§ ";\r
+ font-family:monospace,Arial,sans-serif;\r
+ float:left;\r
+ }\r
+ .article .toc .toc-title,\r
+ .article .language .language-title,\r
+ .article .location .location-title {\r
+ border-bottom:0 solid black;\r
+ color:green;\r
+ font-size:120%;\r
+ font-variant:small-caps;\r
+ font-weight:bold;\r
+ margin-bottom:0.5ex;\r
+ }\r
+ div.slidy_toc,\r
+ body > div.slidy_toc,\r
+ .article div.slidy_toc {\r
+ background: none repeat scroll 0 0 #F0F0F0;\r
+ border-style: solid;\r
+ border-width: 2px;\r
+ font-size: 100%;\r
+ height: 80%;\r
+ left: auto !important;\r
+ bottom: auto !important;\r
+ right: 0 !important;\r
+ max-width: none !important;\r
+ width: 50% !important;\r
+ overflow: auto;\r
+ padding: 1em;\r
+ position: absolute;\r
+ top: 0;\r
+ z-index: 300;\r
+ }\r
+ .article div.toc-heading {\r
+ border-bottom: 1px solid #B4B4B4;\r
+ font-weight: bold;\r
+ margin-bottom: 1em;\r
+ text-align: center;\r
+ width: 100%;\r
+ }\r
+/* incremental preview */\r
+ body.single_slide .invisible {\r
+ opacity: 0.15;\r
+ visibility: visible;\r
+ }\r
+ img.invisible {\r
+ visibility: hidden !important;\r
+ }\r
+/* image */\r
+ .imageblock img {\r
+ border:1px solid black;\r
+ display:block;\r
+ margin:0 auto 0 auto;\r
+ }\r
+/* splash */\r
+ div.hledgersplash > div.imageblock {\r
+ /*border:black solid 1px;*/\r
+ left:-50%;\r
+ position:relative;\r
+ }\r
+/* vim syntax */\r
+ pre .Error { color: #8080ff; background-color: #ffffff; }\r
+ pre .PreProc { color: #ff6060; text-decoration: underline; font-weight: bold; }\r
+ pre .Special { color: #8080ff; font-weight: bold; }\r
+ pre .Constant { color: #ff40ff; text-decoration: none; }\r
+ pre .Statement { color: #B8860B; font-weight: bold; }\r
+ pre .Identifier { color: #ffff00; text-decoration: underline; }\r
+ pre .Comment { color: #4169e1; font-weight: bold; }\r
+/* vim syntax: hledger */\r
+ pre .hledgerNumberOdd { color: #0000ff; background-color: #e5e5e5; font-weight: bold; }\r
+ pre .hledgerPostingAmountOdd { color: #eead0e; background-color: #e5e5e5; font-weight: bold; }\r
+ pre .hledgerAccountSeparatorOdd { color: #eead0e; background-color: #e5e5e5; font-weight: bold; }\r
+ pre .hledgerPostingAccountOdd { color: #4d4d4d; background-color: #e5e5e5; }\r
+ pre .hledgerNumber { color: #0000ff; background-color: #90ee90; font-weight: bold; }\r
+ pre .hledgerPostingAmount { color: #eead0e; background-color: #90ee90; font-weight: bold; }\r
+ pre .hledgerAccountSeparator { color: #eead0e; background-color: #90ee90; font-weight: bold; }\r
+ pre .hledgerPostingAccount { color: #4d4d4d; background-color: #90ee90; }\r
+ pre .hledgerTagValue { color: #ff0000; }\r
+ pre .hledgerTag { color: #ffa500; font-weight: bold; }\r
+ pre .hledgerTransactionComment { color: #4169e1; font-weight: bold; }\r
+ pre .hledgerTransaction { font-weight: bold; }\r
+ pre .hledgerTransactionDate { background-color: #eedd82; font-weight: bold; }\r
+ pre .hledgerDirective { font-weight: bold; }\r
+ pre .hledgerInclude { font-weight: bold; }\r
+ pre .hledgerComment { color: #4169e1; font-weight: bold; }\r
+</style>\r
+<script type="text/javascript">\r
+/*<![CDATA[*/\r
+/* slidy.js\r
+\r
+ Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.\r
+ W3C liability, trademark, document use and software licensing\r
+ rules apply, see:\r
+\r
+ http://www.w3.org/Consortium/Legal/copyright-documents\r
+ http://www.w3.org/Consortium/Legal/copyright-software\r
+\r
+ Defines single name "w3c_slidy" in global namespace\r
+ Adds event handlers without trampling on any others\r
+\r
+ JMI: Dynamic features added\r
+*/\r
+\r
+// the slidy object implementation\r
+var w3c_slidy = {\r
+ // classify which kind of browser we're running under\r
+ ns_pos: (typeof window.pageYOffset!='undefined'),\r
+ khtml: ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false),\r
+ opera: ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false),\r
+ ipad: ((navigator.userAgent).indexOf("iPad") >= 0 ? true : false),\r
+ iphone: ((navigator.userAgent).indexOf("iPhone") >= 0 ? true : false),\r
+ ie: (typeof document.all != "undefined" && !this.opera),\r
+ ie6: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 6") != -1),\r
+ ie7: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1),\r
+ ie8: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1),\r
+ ie9: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 9") != -1),\r
+ keyboardless: (this.ipad || this.iphone),\r
+\r
+ // are we running as XHTML? (doesn't work on Opera)\r
+ is_xhtml: /xml/.test(document.contentType),\r
+\r
+ slide_number: 0, // integer slide count: 0, 1, 2, ...\r
+ slide_number_element: null, // element containing slide number\r
+ slides: [], // set to array of slide div's\r
+ notes: [], // set to array of handout div's\r
+ backgrounds: [], // set to array of background div's\r
+ toolbar: null, // element containing toolbar\r
+ title: null, // document title\r
+ last_shown: null, // last incrementally shown item\r
+ eos: null, // span element for end of slide indicator\r
+ toc: null, // table of contents\r
+ outline: null, // outline element with the focus\r
+ selected_text_len: 0, // length of drag selection on document\r
+ view_all: 0, // 1 to view all slides + handouts\r
+ want_toolbar: true, // user preference to show/hide toolbar\r
+ mouse_click_enabled: true, // enables left click for next slide\r
+ scroll_hack: 0, // IE work around for position: fixed\r
+ disable_slide_click: false, // used by clicked anchors\r
+\r
+ lang: "en", // updated to language specified by html file\r
+\r
+ help_anchor: null, // used for keyboard focus hack in showToolbar()\r
+ help_page: "http://www.w3.org/Talks/Tools/Slidy2/help/help.html",\r
+ help_text: "Navigate with mouse click, space bar, Cursor Left/Right, " +\r
+ "or Pg Up and Pg Dn. Use S and B to change font size.",\r
+// jmi\r
+ help_keymap:\r
+ "PGDN\t: nextSlide\n" +\r
+ "PGUP\t: previousSlide\n" +\r
+ "HOME\t: firstSlide\n" +\r
+ "END \t: lastSlide\n" +\r
+ "SPACE\t: nextContent\n" +\r
+ "-> \t: nextContent\n" +\r
+ "<- \t: previousContent\n" +\r
+ "A \t: toggleAllSlides\n" +\r
+ "F \t: toggleFooter\n" +\r
+ "K \t: toggleMouseClick\n" +\r
+ "I \t: toggleIncremental\n" +\r
+ "L \t: toggleColorSet\n" +\r
+ "T, C\t: tableOfContents\n" +\r
+ "B \t: biggerFontSize\n" +\r
+ "S \t: smallerFontSize\n" +\r
+ "M \t: key mapping\n",\r
+\r
+ size_index: 0,\r
+ size_adjustment: 0,\r
+ sizes: new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt",\r
+ "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"),\r
+\r
+ // needed for efficient resizing\r
+ last_width: 0,\r
+ last_height: 0,\r
+\r
+\r
+ // Needed for cross browser support for relative width/height on\r
+ // object elements. The work around is to save width/height attributes\r
+ // and then to recompute absolute width/height dimensions on resizing\r
+ objects: [],\r
+\r
+//jmi\r
+incremental_display: true,\r
+\r
+ // attach initialiation event handlers\r
+ set_up: function () {\r
+ var init = function() { w3c_slidy.init(); };\r
+ if (typeof window.addEventListener != "undefined")\r
+ window.addEventListener("load", init, false);\r
+ else\r
+ window.attachEvent("onload", init);\r
+ },\r
+\r
+ hide_slides: function () {\r
+ if (document.body && !w3c_slidy.initialized)\r
+ document.body.style.visibility = "hidden";\r
+ else\r
+ setTimeout(w3c_slidy.hide_slides, 50);\r
+ },\r
+\r
+ // hack to persuade IE to compute correct document height\r
+ // as needed for simulating fixed positioning of toolbar\r
+ ie_hack: function () {\r
+ window.resizeBy(0,-1);\r
+ window.resizeBy(0, 1);\r
+ },\r
+\r
+ init: function () {\r
+ //alert("slidy starting test 10");\r
+ document.body.style.visibility = "visible";\r
+ this.init_localization();\r
+ this.add_toolbar();\r
+ this.wrap_implicit_slides();\r
+ this.collect_slides();\r
+ this.collect_notes();\r
+ this.collect_backgrounds();\r
+ this.objects = document.body.getElementsByTagName("object");\r
+ this.patch_anchors();\r
+ this.slide_number = this.find_slide_number(location.href);\r
+ window.offscreenbuffering = true;\r
+ this.size_adjustment = this.find_size_adjust();\r
+ this.time_left = this.find_duration();\r
+ this.hide_image_toolbar(); // suppress IE image toolbar popup\r
+ this.init_outliner(); // activate fold/unfold support\r
+ this.title = document.title;\r
+ // jmi\r
+ this.color_sets = new Array();\r
+ this.init_color_sets();\r
+\r
+ // work around for opera bug\r
+ this.is_xhtml = (document.body.tagName == "BODY" ? false : true);\r
+\r
+ if (this.slides.length > 0)\r
+ {\r
+ var slide = this.slides[this.slide_number];\r
+\r
+ if (this.slide_number > 0)\r
+ {\r
+ this.set_visibility_all_incremental("visible");\r
+ this.last_shown = this.previous_incremental_item(null);\r
+ this.set_eos_status(true);\r
+ }\r
+ else\r
+ {\r
+ this.last_shown = null;\r
+ this.set_visibility_all_incremental("hidden");\r
+ this.set_eos_status(!this.next_incremental_item(this.last_shown));\r
+ }\r
+\r
+ this.set_location();\r
+ this.add_class(this.slides[0], "first-slide");\r
+ w3c_slidy.show_slide(slide);\r
+ }\r
+\r
+ this.toc = this.table_of_contents();\r
+\r
+ this.add_initial_prompt();\r
+\r
+ // bind event handlers without interfering with custom page scripts\r
+ // Tap events behave too weirdly to support clicks reliably on\r
+ // iPhone and iPad, so exclude these from click handler\r
+\r
+ if (!this.keyboardless)\r
+ this.add_listener(document.body, "click", this.mouse_button_click);\r
+\r
+ this.add_listener(document, "keydown", this.key_down);\r
+ this.add_listener(document, "keypress", this.key_press);\r
+ this.add_listener(window, "resize", this.resized);\r
+ this.add_listener(window, "scroll", this.scrolled);\r
+ this.add_listener(window, "unload", this.unloaded);\r
+\r
+ // this seems to be a debugging hack\r
+ //if (!document.body.onclick)\r
+ // document.body.onclick = function () { };\r
+\r
+ this.single_slide_view();\r
+\r
+ //this.set_location();\r
+\r
+ this.resized();\r
+\r
+ if (this.ie7)\r
+ setTimeout(w3c_slidy.ie_hack, 100);\r
+\r
+ this.show_toolbar();\r
+\r
+ // for back button detection\r
+ setInterval(function () { w3c_slidy.check_location(); }, 200);\r
+ w3c_slidy.initialized = true;\r
+ },\r
+\r
+ // create div element with links to each slide\r
+ table_of_contents: function () {\r
+ var toc = this.create_element("div");\r
+ this.add_class(toc, "slidy_toc hidden");\r
+ //toc.setAttribute("tabindex", "0");\r
+\r
+ var heading = this.create_element("div");\r
+ this.add_class(heading, "toc-heading");\r
+ heading.innerHTML = this.localize("Table of Contents");\r
+\r
+ toc.appendChild(heading);\r
+ var previous = null;\r
+\r
+ for (var i = 0; i < this.slides.length; ++i)\r
+ {\r
+ var title = this.has_class(this.slides[i], "title");\r
+ var num = document.createTextNode((i + 1) + ". ");\r
+\r
+ toc.appendChild(num);\r
+\r
+ var a = this.create_element("a");\r
+ a.setAttribute("href", "#(" + (i+1) + ")");\r
+\r
+ if (title)\r
+ this.add_class(a, "titleslide");\r
+\r
+ var name = document.createTextNode(this.slide_name(i));\r
+ a.appendChild(name);\r
+ a.onclick = w3c_slidy.toc_click;\r
+ a.onkeydown = w3c_slidy.toc_key_down;\r
+ a.previous = previous;\r
+\r
+ if (previous)\r
+ previous.next = a;\r
+\r
+ toc.appendChild(a);\r
+\r
+ if (i == 0)\r
+ toc.first = a;\r
+\r
+ if (i < this.slides.length - 1)\r
+ {\r
+ var br = this.create_element("br");\r
+ toc.appendChild(br);\r
+ }\r
+\r
+ previous = a;\r
+ }\r
+\r
+ toc.focus = function () {\r
+ if (this.first)\r
+ this.first.focus();\r
+ }\r
+\r
+ toc.onmouseup = w3c_slidy.mouse_button_up;\r
+\r
+ toc.onclick = function (e) {\r
+ e||(e=window.event);\r
+\r
+ if (w3c_slidy.selected_text_len <= 0)\r
+ w3c_slidy.hide_table_of_contents(true);\r
+\r
+ w3c_slidy.stop_propagation(e);\r
+\r
+ if (e.cancel != undefined)\r
+ e.cancel = true;\r
+\r
+ if (e.returnValue != undefined)\r
+ e.returnValue = false;\r
+\r
+ return false;\r
+ };\r
+\r
+ document.body.insertBefore(toc, document.body.firstChild);\r
+ return toc;\r
+ },\r
+\r
+ is_shown_toc: function () {\r
+ return !w3c_slidy.has_class(w3c_slidy.toc, "hidden");\r
+ },\r
+\r
+ show_table_of_contents: function () {\r
+ w3c_slidy.remove_class(w3c_slidy.toc, "hidden");\r
+ var toc = w3c_slidy.toc;\r
+ toc.focus();\r
+\r
+ if (w3c_slidy.ie7 && w3c_slidy.slide_number == 0)\r
+ setTimeout(w3c_slidy.ie_hack, 100);\r
+ },\r
+\r
+ hide_table_of_contents: function (focus) {\r
+ w3c_slidy.add_class(w3c_slidy.toc, "hidden");\r
+\r
+ if (focus && !w3c_slidy.opera)\r
+ w3c_slidy.help_anchor.focus();\r
+ },\r
+\r
+ toggle_table_of_contents: function () {\r
+ if (w3c_slidy.is_shown_toc())\r
+ w3c_slidy.hide_table_of_contents(true);\r
+ else\r
+ w3c_slidy.show_table_of_contents();\r
+ },\r
+\r
+ // called on clicking toc entry\r
+ toc_click: function (e) {\r
+ if (!e)\r
+ e = window.event;\r
+\r
+ var target = w3c_slidy.get_target(e);\r
+\r
+ if (target && target.nodeType == 1)\r
+ {\r
+ var uri = target.getAttribute("href");\r
+\r
+ if (uri)\r
+ {\r
+ //alert("going to " + uri);\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.last_shown = null;\r
+ w3c_slidy.set_location();\r
+ w3c_slidy.set_visibility_all_incremental("hidden");\r
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+ w3c_slidy.show_slide(slide);\r
+ //target.focus();\r
+\r
+ try\r
+ {\r
+ if (!w3c_slidy.opera)\r
+ w3c_slidy.help_anchor.focus();\r
+ }\r
+ catch (e)\r
+ {\r
+ }\r
+ }\r
+ }\r
+\r
+ w3c_slidy.hide_table_of_contents(true);\r
+ if (w3c_slidy.ie7) w3c_slidy.ie_hack();\r
+ w3c_slidy.stop_propagation(e);\r
+ return w3c_slidy.cancel(e);\r
+ },\r
+\r
+ // called onkeydown for toc entry\r
+ toc_key_down: function (event) {\r
+ var key;\r
+\r
+ if (!event)\r
+ var event = window.event;\r
+\r
+ // kludge around NS/IE differences\r
+ if (window.event)\r
+ key = window.event.keyCode;\r
+ else if (event.which)\r
+ key = event.which;\r
+ else\r
+ return true; // Yikes! unknown browser\r
+\r
+ // ignore event if key value is zero\r
+ // as for alt on Opera and Konqueror\r
+ if (!key)\r
+ return true;\r
+\r
+ // check for concurrent control/command/alt key\r
+ // but are these only present on mouse events?\r
+\r
+ if (event.ctrlKey || event.altKey)\r
+ return true;\r
+\r
+ if (key == 13)\r
+ {\r
+ var uri = this.getAttribute("href");\r
+\r
+ if (uri)\r
+ {\r
+ //alert("going to " + uri);\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.last_shown = null;\r
+ w3c_slidy.set_location();\r
+ w3c_slidy.set_visibility_all_incremental("hidden");\r
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+ w3c_slidy.show_slide(slide);\r
+ //target.focus();\r
+\r
+ try\r
+ {\r
+ if (!w3c_slidy.opera)\r
+ w3c_slidy.help_anchor.focus();\r
+ }\r
+ catch (e)\r
+ {\r
+ }\r
+ }\r
+\r
+ w3c_slidy.hide_table_of_contents(true);\r
+\r
+ if (self.ie7)\r
+ w3c_slidy.ie_hack();\r
+\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+\r
+ if (key == 40 && this.next)\r
+ {\r
+ this.next.focus();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+\r
+ if (key == 38 && this.previous)\r
+ {\r
+ this.previous.focus();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+\r
+ return true;\r
+ },\r
+\r
+\r
+ // ### OBSOLETE ###\r
+ before_print: function () {\r
+ this.show_all_slides();\r
+ this.hide_toolbar();\r
+ alert("before print");\r
+ },\r
+\r
+ // ### OBSOLETE ###\r
+ after_print: function () {\r
+ if (!this.view_all)\r
+ {\r
+ this.single_slide_view();\r
+ this.show_toolbar();\r
+ }\r
+ alert("after print");\r
+ },\r
+\r
+ // ### OBSOLETE ###\r
+ print_slides: function () {\r
+ this.before_print();\r
+ window.print();\r
+ this.after_print();\r
+ },\r
+\r
+ // ### OBSOLETE ?? ###\r
+ toggle_view: function () {\r
+ if (this.view_all)\r
+ {\r
+ this.single_slide_view();\r
+ this.show_toolbar();\r
+ this.view_all = 0;\r
+ }\r
+ else\r
+ {\r
+ this.show_all_slides();\r
+ this.hide_toolbar();\r
+ this.view_all = 1;\r
+ }\r
+ },\r
+\r
+ // prepare for printing ### OBSOLETE ###\r
+ show_all_slides: function () {\r
+ this.remove_class(document.body, "single_slide");\r
+ this.set_visibility_all_incremental("visible");\r
+ },\r
+\r
+ // restore after printing ### OBSOLETE ###\r
+ single_slide_view: function () {\r
+ this.add_class(document.body, "single_slide");\r
+ this.set_visibility_all_incremental("visible");\r
+ this.last_shown = this.previous_incremental_item(null);\r
+ },\r
+\r
+ // suppress IE's image toolbar pop up\r
+ hide_image_toolbar: function () {\r
+ if (!this.ns_pos)\r
+ {\r
+ var images = document.getElementsByTagName("IMG");\r
+\r
+ for (var i = 0; i < images.length; ++i)\r
+ images[i].setAttribute("galleryimg", "no");\r
+ }\r
+ },\r
+\r
+ unloaded: function (e) {\r
+ //alert("unloaded");\r
+ },\r
+\r
+ // Safari and Konqueror don't yet support getComputedStyle()\r
+ // and they always reload page when location.href is updated\r
+ is_KHTML: function () {\r
+ var agent = navigator.userAgent;\r
+ return (agent.indexOf("KHTML") >= 0 ? true : false);\r
+ },\r
+\r
+ // find slide name from first h1 element\r
+ // default to document title + slide number\r
+ slide_name: function (index) {\r
+ var name = null;\r
+ var slide = this.slides[index];\r
+\r
+ var heading = this.find_heading(slide);\r
+\r
+ if (heading)\r
+ name = this.extract_text(heading);\r
+\r
+ if (!name)\r
+ name = this.title + "(" + (index + 1) + ")";\r
+\r
+ name.replace(/\&/g, "&");\r
+ name.replace(/\</g, "<");\r
+ name.replace(/\>/g, ">");\r
+\r
+ return name;\r
+ },\r
+\r
+ // find first h1 element in DOM tree\r
+ find_heading: function (node) {\r
+ if (!node || node.nodeType != 1)\r
+ return null;\r
+\r
+ if (node.nodeName == "H1" || node.nodeName == "h1")\r
+ return node;\r
+\r
+ var child = node.firstChild;\r
+\r
+ while (child)\r
+ {\r
+ node = this.find_heading(child);\r
+\r
+ if (node)\r
+ return node;\r
+\r
+ child = child.nextSibling;\r
+ }\r
+\r
+ return null;\r
+ },\r
+\r
+ // recursively extract text from DOM tree\r
+ extract_text: function (node) {\r
+ if (!node)\r
+ return "";\r
+\r
+ // text nodes\r
+ if (node.nodeType == 3)\r
+ return node.nodeValue;\r
+\r
+ // elements\r
+ if (node.nodeType == 1)\r
+ {\r
+ node = node.firstChild;\r
+ var text = "";\r
+\r
+ while (node)\r
+ {\r
+ text = text + this.extract_text(node);\r
+ node = node.nextSibling;\r
+ }\r
+\r
+ return text;\r
+ }\r
+\r
+ return "";\r
+ },\r
+\r
+ // find copyright text from meta element\r
+ find_copyright: function () {\r
+ var name, content;\r
+ var meta = document.getElementsByTagName("meta");\r
+\r
+ for (var i = 0; i < meta.length; ++i)\r
+ {\r
+ name = meta[i].getAttribute("name");\r
+ content = meta[i].getAttribute("content");\r
+\r
+ if (name == "copyright")\r
+ return content;\r
+ }\r
+\r
+ return null;\r
+ },\r
+\r
+ find_size_adjust: function () {\r
+ var name, content, offset;\r
+ var meta = document.getElementsByTagName("meta");\r
+\r
+ for (var i = 0; i < meta.length; ++i)\r
+ {\r
+ name = meta[i].getAttribute("name");\r
+ content = meta[i].getAttribute("content");\r
+\r
+ if (name == "font-size-adjustment")\r
+ return 1 * content;\r
+ }\r
+\r
+ return 1;\r
+ },\r
+\r
+ // <meta name="duration" content="20" /> for 20 minutes\r
+ find_duration: function () {\r
+ var name, content, offset;\r
+ var meta = document.getElementsByTagName("meta");\r
+\r
+ for (var i = 0; i < meta.length; ++i)\r
+ {\r
+ name = meta[i].getAttribute("name");\r
+ content = meta[i].getAttribute("content");\r
+\r
+ if (name == "duration")\r
+ return 60000 * content;\r
+ }\r
+\r
+ return null;\r
+ },\r
+\r
+ replace_by_non_breaking_space: function (str) {\r
+ for (var i = 0; i < str.length; ++i)\r
+ str[i] = 160;\r
+ },\r
+\r
+ // ### CHECK ME ### is use of "li" okay for text/html?\r
+ // for XHTML do we also need to specify namespace?\r
+ init_outliner: function () {\r
+ var items = document.getElementsByTagName("li");\r
+\r
+ for (var i = 0; i < items.length; ++i)\r
+ {\r
+ var target = items[i];\r
+\r
+ if (!this.has_class(target.parentNode, "outline"))\r
+ continue;\r
+\r
+ target.onclick = this.outline_click;\r
+/* ### more work needed for IE6\r
+ if (!this.ns_pos)\r
+ {\r
+ target.onmouseover = this.hover_outline;\r
+ target.onmouseout = this.unhover_outline;\r
+ }\r
+*/\r
+ if (this.foldable(target))\r
+ {\r
+ target.foldable = true;\r
+ target.onfocus = function () {w3c_slidy.outline = this;};\r
+ target.onblur = function () {w3c_slidy.outline = null;};\r
+\r
+ if (!target.getAttribute("tabindex"))\r
+ target.setAttribute("tabindex", "0");\r
+\r
+ if (this.has_class(target, "expand"))\r
+ this.unfold(target);\r
+ else\r
+ this.fold(target);\r
+ }\r
+ else\r
+ {\r
+ this.add_class(target, "nofold");\r
+ target.visible = true;\r
+ target.foldable = false;\r
+ }\r
+ }\r
+ },\r
+\r
+ foldable: function (item) {\r
+ if (!item || item.nodeType != 1)\r
+ return false;\r
+\r
+ var node = item.firstChild;\r
+\r
+ while (node)\r
+ {\r
+ if (node.nodeType == 1 && this.is_block(node))\r
+ return true;\r
+\r
+ node = node.nextSibling;\r
+ }\r
+\r
+ return false;\r
+ },\r
+\r
+ // ### CHECK ME ### switch to add/remove "hidden" class\r
+ fold: function (item) {\r
+ if (item)\r
+ {\r
+ this.remove_class(item, "unfolded");\r
+ this.add_class(item, "folded");\r
+ }\r
+\r
+ var node = item ? item.firstChild : null;\r
+\r
+ while (node)\r
+ {\r
+ if (node.nodeType == 1 && this.is_block(node)) // element\r
+ {\r
+ w3c_slidy.add_class(node, "hidden");\r
+ }\r
+\r
+ node = node.nextSibling;\r
+ }\r
+\r
+ item.visible = false;\r
+ },\r
+\r
+ // ### CHECK ME ### switch to add/remove "hidden" class\r
+ unfold: function (item) {\r
+ if (item)\r
+ {\r
+ this.add_class(item, "unfolded");\r
+ this.remove_class(item, "folded");\r
+ }\r
+\r
+ var node = item ? item.firstChild : null;\r
+\r
+ while (node)\r
+ {\r
+ if (node.nodeType == 1 && this.is_block(node)) // element\r
+ {\r
+ w3c_slidy.remove_class(node, "hidden");\r
+ }\r
+\r
+ node = node.nextSibling;\r
+ }\r
+\r
+ item.visible = true;\r
+ },\r
+\r
+ outline_click: function (e) {\r
+ if (!e)\r
+ e = window.event;\r
+\r
+ var rightclick = false;\r
+ var target = w3c_slidy.get_target(e);\r
+\r
+ while (target && target.visible == undefined)\r
+ target = target.parentNode;\r
+\r
+ if (!target)\r
+ return true;\r
+\r
+ if (e.which)\r
+ rightclick = (e.which == 3);\r
+ else if (e.button)\r
+ rightclick = (e.button == 2);\r
+\r
+ if (!rightclick && target.visible != undefined)\r
+ {\r
+ if (target.foldable)\r
+ {\r
+ if (target.visible)\r
+ w3c_slidy.fold(target);\r
+ else\r
+ w3c_slidy.unfold(target);\r
+ }\r
+\r
+ w3c_slidy.stop_propagation(e);\r
+ e.cancel = true;\r
+ e.returnValue = false;\r
+ }\r
+\r
+ return false;\r
+ },\r
+\r
+ add_initial_prompt: function () {\r
+ var prompt = this.create_element("div");\r
+ prompt.setAttribute("class", "initial_prompt");\r
+\r
+ var p1 = this.create_element("p");\r
+ prompt.appendChild(p1);\r
+ p1.setAttribute("class", "help");\r
+\r
+ if (this.keyboardless)\r
+ p1.innerHTML = "Tap footer to move to next slide";\r
+ else\r
+ p1.innerHTML = "Space or Right Arrow to move to next " +\r
+ "slide, M to see keys mapping, click help below for more details";\r
+\r
+ this.add_listener(prompt, "click", function (e) {\r
+ document.body.removeChild(prompt);\r
+ w3c_slidy.stop_propagation(e);\r
+\r
+ if (e.cancel != undefined)\r
+ e.cancel = true;\r
+\r
+ if (e.returnValue != undefined)\r
+ e.returnValue = false;\r
+\r
+ return false;\r
+ });\r
+\r
+ document.body.appendChild(prompt);\r
+ this.initial_prompt = prompt;\r
+ setTimeout(function() {document.body.removeChild(prompt);}, 5000);\r
+ },\r
+\r
+ add_toolbar: function () {\r
+ var counter, page;\r
+\r
+ this.toolbar = this.create_element("div");\r
+ this.toolbar.setAttribute("class", "toolbar");\r
+\r
+ // a reasonably behaved browser\r
+ if (this.ns_pos || !this.ie6)\r
+ {\r
+ var right = this.create_element("div");\r
+ right.setAttribute("style", "float: right; text-align: right");\r
+\r
+ counter = this.create_element("span")\r
+ counter.innerHTML = this.localize("slide") + " n/m";\r
+ right.appendChild(counter);\r
+ this.toolbar.appendChild(right);\r
+\r
+ var left = this.create_element("div");\r
+ left.setAttribute("style", "text-align: left");\r
+\r
+ // global end of slide indicator\r
+ this.eos = this.create_element("span");\r
+ this.eos.innerHTML = "* ";\r
+ left.appendChild(this.eos);\r
+\r
+ var help = this.create_element("a");\r
+ help.setAttribute("href", this.help_page);\r
+ help.setAttribute("title", this.localize(this.help_text));\r
+ help.innerHTML = this.localize("help?");\r
+ left.appendChild(help);\r
+ this.help_anchor = help; // save for focus hack\r
+\r
+ var gap1 = document.createTextNode(" ");\r
+ left.appendChild(gap1);\r
+\r
+ var contents = this.create_element("a");\r
+ contents.setAttribute("href", "javascript:w3c_slidy.toggle_table_of_contents()");\r
+ contents.setAttribute("title", this.localize("table of contents"));\r
+ contents.innerHTML = this.localize("contents?");\r
+ left.appendChild(contents);\r
+\r
+ var gap2 = document.createTextNode(" ");\r
+ left.appendChild(gap2);\r
+\r
+ var copyright = this.find_copyright();\r
+\r
+ if (copyright)\r
+ {\r
+ var span = this.create_element("span");\r
+ span.className = "copyright";\r
+ span.innerHTML = copyright;\r
+ left.appendChild(span);\r
+ }\r
+\r
+ this.toolbar.setAttribute("tabindex", "0");\r
+ this.toolbar.appendChild(left);\r
+ }\r
+ else // IE6 so need to work around its poor CSS support\r
+ {\r
+ this.toolbar.style.position = (this.ie7 ? "fixed" : "absolute");\r
+ this.toolbar.style.zIndex = "200";\r
+ this.toolbar.style.width = "99.9%";\r
+ this.toolbar.style.height = "1.2em";\r
+ this.toolbar.style.top = "auto";\r
+ this.toolbar.style.bottom = "0";\r
+ this.toolbar.style.left = "0";\r
+ this.toolbar.style.right = "0";\r
+ this.toolbar.style.textAlign = "left";\r
+ this.toolbar.style.fontSize = "60%";\r
+ this.toolbar.style.color = "red";\r
+ this.toolbar.borderWidth = 0;\r
+ this.toolbar.className = "toolbar";\r
+ this.toolbar.style.background = "rgb(240,240,240)";\r
+\r
+ // would like to have help text left aligned\r
+ // and page counter right aligned, floating\r
+ // div's don't work, so instead use nested\r
+ // absolutely positioned div's.\r
+\r
+ var sp = this.create_element("span");\r
+ sp.innerHTML = " * ";\r
+ this.toolbar.appendChild(sp);\r
+ this.eos = sp; // end of slide indicator\r
+\r
+ var help = this.create_element("a");\r
+ help.setAttribute("href", this.help_page);\r
+ help.setAttribute("title", this.localize(this.help_text));\r
+ help.innerHTML = this.localize("help?");\r
+ this.toolbar.appendChild(help);\r
+ this.help_anchor = help; // save for focus hack\r
+\r
+ var gap1 = document.createTextNode(" ");\r
+ this.toolbar.appendChild(gap1);\r
+\r
+ var contents = this.create_element("a");\r
+ contents.setAttribute("href", "javascript:toggleTableOfContents()");\r
+ contents.setAttribute("title", this.localize("table of contents".localize));\r
+ contents.innerHTML = this.localize("contents?");\r
+ this.toolbar.appendChild(contents);\r
+\r
+ var gap2 = document.createTextNode(" ");\r
+ this.toolbar.appendChild(gap2);\r
+\r
+ var copyright = this.find_copyright();\r
+\r
+ if (copyright)\r
+ {\r
+ var span = this.create_element("span");\r
+ span.innerHTML = copyright;\r
+ span.style.color = "black";\r
+ span.style.marginLeft = "0.5em";\r
+ this.toolbar.appendChild(span);\r
+ }\r
+\r
+ counter = this.create_element("div")\r
+ counter.style.position = "absolute";\r
+ counter.style.width = "auto"; //"20%";\r
+ counter.style.height = "1.2em";\r
+ counter.style.top = "auto";\r
+ counter.style.bottom = 0;\r
+ counter.style.right = "0";\r
+ counter.style.textAlign = "right";\r
+ counter.style.color = "red";\r
+ counter.style.background = "rgb(240,240,240)";\r
+\r
+ counter.innerHTML = this.localize("slide") + " n/m";\r
+ this.toolbar.appendChild(counter);\r
+ }\r
+\r
+ // ensure that click isn't passed through to the page\r
+ this.toolbar.onclick =\r
+ function (e) {\r
+ if (!e)\r
+ e = window.event;\r
+\r
+ var target = e.target;\r
+\r
+ if (!target && e.srcElement)\r
+ target = e.srcElement;\r
+\r
+ // work around Safari bug\r
+ if (target && target.nodeType == 3)\r
+ target = target.parentNode;\r
+\r
+ w3c_slidy.stop_propagation(e);\r
+\r
+ if (target && target.nodeName.toLowerCase() != "a")\r
+ w3c_slidy.mouse_button_click(e);\r
+ };\r
+\r
+ this.slide_number_element = counter;\r
+ this.set_eos_status(false);\r
+ document.body.appendChild(this.toolbar);\r
+ },\r
+\r
+ // wysiwyg editors make it hard to use div elements\r
+ // e.g. amaya loses the div when you copy and paste\r
+ // this function wraps div elements around implicit\r
+ // slides which start with an h1 element and continue\r
+ // up to the next heading or div element\r
+ wrap_implicit_slides: function () {\r
+ var i, heading, node, next, div;\r
+ var headings = document.getElementsByTagName("h1");\r
+\r
+ if (!headings)\r
+ return;\r
+\r
+ for (i = 0; i < headings.length; ++i)\r
+ {\r
+ heading = headings[i];\r
+\r
+ if (heading.parentNode != document.body)\r
+ continue;\r
+\r
+ node = heading.nextSibling;\r
+\r
+ div = document.createElement("div");\r
+ this.add_class(div, "slide");\r
+ document.body.replaceChild(div, heading);\r
+ div.appendChild(heading);\r
+\r
+ while (node)\r
+ {\r
+ if (node.nodeType == 1 && // an element\r
+ (node.nodeName == "H1" ||\r
+ node.nodeName == "h1" ||\r
+ node.nodeName == "DIV" ||\r
+ node.nodeName == "div"))\r
+ break;\r
+\r
+ next = node.nextSibling;\r
+ node = document.body.removeChild(node);\r
+ div.appendChild(node);\r
+ node = next;\r
+ }\r
+ }\r
+ },\r
+\r
+// return new array of all slides\r
+ collect_slides: function () {\r
+ var slides = new Array();\r
+ var divs = document.body.getElementsByTagName("div");\r
+\r
+ for (var i = 0; i < divs.length; ++i)\r
+ {\r
+ div = divs.item(i);\r
+\r
+ if (this.has_class(div, "slide"))\r
+ {\r
+ // add slide to collection\r
+ slides[slides.length] = div;\r
+\r
+ // hide each slide as it is found\r
+ this.add_class(div, "hidden");\r
+\r
+ // add dummy <br/> at end for scrolling hack\r
+ var node1 = document.createElement("br");\r
+ div.appendChild(node1);\r
+ var node2 = document.createElement("br");\r
+ div.appendChild(node2);\r
+ }\r
+ else if (this.has_class(div, "background"))\r
+ { // work around for Firefox SVG reload bug\r
+ // which otherwise replaces 1st SVG graphic with 2nd\r
+ div.style.display = "block";\r
+ }\r
+ }\r
+\r
+ this.slides = slides;\r
+ },\r
+\r
+ // return new array of all <div class="handout">\r
+ collect_notes: function () {\r
+ var notes = new Array();\r
+ var divs = document.body.getElementsByTagName("div");\r
+\r
+ for (var i = 0; i < divs.length; ++i)\r
+ {\r
+ div = divs.item(i);\r
+\r
+ if (this.has_class(div, "handout"))\r
+ {\r
+ // add note to collection\r
+ notes[notes.length] = div;\r
+\r
+ // and hide it\r
+ this.add_class(div, "hidden");\r
+ }\r
+ }\r
+\r
+ this.notes = notes;\r
+ },\r
+\r
+ // return new array of all <div class="background">\r
+ // including named backgrounds e.g. class="background titlepage"\r
+ collect_backgrounds: function () {\r
+ var backgrounds = new Array();\r
+ var divs = document.body.getElementsByTagName("div");\r
+\r
+ for (var i = 0; i < divs.length; ++i)\r
+ {\r
+ div = divs.item(i);\r
+\r
+ if (this.has_class(div, "background"))\r
+ {\r
+ // add background to collection\r
+ backgrounds[backgrounds.length] = div;\r
+\r
+ // and hide it\r
+ this.add_class(div, "hidden");\r
+ }\r
+ }\r
+\r
+ this.backgrounds = backgrounds;\r
+ },\r
+\r
+ // set click handlers on all anchors\r
+ patch_anchors: function () {\r
+ var self = w3c_slidy;\r
+ var handler = function (event) {\r
+ // compare this.href with location.href\r
+ // for link to another slide in this doc\r
+\r
+ if (self.page_address(this.href) == self.page_address(location.href))\r
+ {\r
+ // yes, so find new slide number\r
+ var newslidenum = self.find_slide_number(this.href);\r
+\r
+ if (newslidenum != self.slide_number)\r
+ {\r
+ var slide = self.slides[self.slide_number];\r
+ self.hide_slide(slide);\r
+ self.slide_number = newslidenum;\r
+ slide = self.slides[self.slide_number];\r
+ self.show_slide(slide);\r
+ self.set_location();\r
+ }\r
+ }\r
+ else\r
+ w3c_slidy.stop_propagation(event);\r
+\r
+// else if (this.target == null)\r
+// location.href = this.href;\r
+\r
+ this.blur();\r
+ self.disable_slide_click = true;\r
+ };\r
+\r
+ var anchors = document.body.getElementsByTagName("a");\r
+\r
+ for (var i = 0; i < anchors.length; ++i)\r
+ {\r
+ if (window.addEventListener)\r
+ anchors[i].addEventListener("click", handler, false);\r
+ else\r
+ anchors[i].attachEvent("onclick", handler);\r
+ }\r
+ },\r
+\r
+ // ### CHECK ME ### see which functions are invoked via setTimeout\r
+ // either directly or indirectly for use of w3c_slidy vs this\r
+ show_slide_number: function () {\r
+ var timer = w3c_slidy.get_timer();\r
+ w3c_slidy.slide_number_element.innerHTML = timer + w3c_slidy.localize("slide") + " " +\r
+ (w3c_slidy.slide_number + 1) + "/" + w3c_slidy.slides.length;\r
+ },\r
+\r
+ // every 200mS check if the location has been changed as a\r
+ // result of the user activating the Back button/menu item\r
+ // doesn't work for Opera < 9.5\r
+ check_location: function () {\r
+ var hash = location.hash;\r
+\r
+ if (w3c_slidy.slide_number > 0 && (hash == "" || hash == "#"))\r
+ w3c_slidy.goto_slide(0);\r
+ else if (hash.length > 2 && hash != "#("+(w3c_slidy.slide_number+1)+")")\r
+ {\r
+ var num = parseInt(location.hash.substr(2));\r
+\r
+ if (!isNaN(num))\r
+ w3c_slidy.goto_slide(num-1);\r
+ }\r
+\r
+ if (w3c_slidy.time_left && w3c_slidy.slide_number > 0)\r
+ {\r
+ w3c_slidy.show_slide_number();\r
+\r
+ if (w3c_slidy.time_left > 0)\r
+ w3c_slidy.time_left -= 200;\r
+ }\r
+ },\r
+\r
+ get_timer: function () {\r
+ var timer = "";\r
+ if (w3c_slidy.time_left)\r
+ {\r
+ var mins, secs;\r
+ secs = Math.floor(w3c_slidy.time_left/1000);\r
+ mins = Math.floor(secs / 60);\r
+ secs = secs % 60;\r
+ timer = (mins ? mins+"m" : "") + secs + "s ";\r
+ }\r
+\r
+ return timer;\r
+ },\r
+\r
+ // this doesn't push location onto history stack for IE\r
+ // for which a hidden iframe hack is needed: load page into\r
+ // the iframe with script that set's parent's location.hash\r
+ // but that won't work for standalone use unless we can\r
+ // create the page dynamically via a javascript: URL\r
+ set_location: function () {\r
+ var uri = w3c_slidy.page_address(location.href);\r
+ var hash = "#(" + (w3c_slidy.slide_number+1) + ")";\r
+\r
+ if (w3c_slidy.slide_number >= 0)\r
+ uri = uri + hash;\r
+\r
+ if (w3c_slidy.ie && !w3c_slidy.ie8)\r
+ w3c_slidy.push_hash(hash);\r
+\r
+ if (uri != location.href) // && !khtml\r
+ location.href = uri;\r
+\r
+ if (this.khtml)\r
+ hash = "(" + (w3c_slidy.slide_number+1) + ")";\r
+\r
+ if (!this.ie && location.hash != hash && location.hash != "")\r
+ location.hash = hash;\r
+\r
+ document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";\r
+ w3c_slidy.show_slide_number();\r
+ },\r
+\r
+ page_address: function (uri) {\r
+ var i = uri.indexOf("#");\r
+\r
+ if (i < 0)\r
+ i = uri.indexOf("%23");\r
+\r
+ // check if anchor is entire page\r
+\r
+ if (i < 0)\r
+ return uri; // yes\r
+\r
+ return uri.substr(0, i);\r
+ },\r
+\r
+ // only used for IE6 and IE7\r
+ on_frame_loaded: function (hash) {\r
+ location.hash = hash;\r
+ var uri = w3c_slidy.page_address(location.href);\r
+ location.href = uri + hash;\r
+ },\r
+\r
+ // history hack with thanks to Bertrand Le Roy\r
+ push_hash: function (hash) {\r
+ if (hash == "") hash = "#(1)";\r
+ window.location.hash = hash;\r
+\r
+ var doc = document.getElementById("historyFrame").contentWindow.document;\r
+ },\r
+\r
+ // find current slide based upon location\r
+ // first find target anchor and then look\r
+ // for associated div element enclosing it\r
+ // finally map that to slide number\r
+ find_slide_number: function (uri) {\r
+ // first get anchor from page location\r
+\r
+ var i = uri.indexOf("#");\r
+\r
+ // check if anchor is entire page\r
+ if (i < 0)\r
+ return 0; // yes\r
+\r
+ var anchor = unescape(uri.substr(i+1));\r
+\r
+ // now use anchor as XML ID to find target\r
+ var target = document.getElementById(anchor);\r
+\r
+ if (!target)\r
+ {\r
+ // does anchor look like "(2)" for slide 2 ??\r
+ // where first slide is (1)\r
+ var re = /\((\d)+\)/;\r
+\r
+ if (anchor.match(re))\r
+ {\r
+ var num = parseInt(anchor.substring(1, anchor.length-1));\r
+\r
+ if (num > this.slides.length)\r
+ num = 1;\r
+\r
+ if (--num < 0)\r
+ num = 0;\r
+\r
+ return num;\r
+ }\r
+\r
+ // accept [2] for backwards compatibility\r
+ re = /\[(\d)+\]/;\r
+\r
+ if (anchor.match(re))\r
+ {\r
+ var num = parseInt(anchor.substring(1, anchor.length-1));\r
+\r
+ if (num > this.slides.length)\r
+ num = 1;\r
+\r
+ if (--num < 0)\r
+ num = 0;\r
+\r
+ return num;\r
+ }\r
+\r
+ // oh dear unknown anchor\r
+ return 0;\r
+ }\r
+\r
+ // search for enclosing slide\r
+\r
+ while (true)\r
+ {\r
+ // browser coerces html elements to uppercase!\r
+ if (target.nodeName.toLowerCase() == "div" &&\r
+ this.has_class(target, "slide"))\r
+ {\r
+ // found the slide element\r
+ break;\r
+ }\r
+\r
+ // otherwise try parent element if any\r
+\r
+ target = target.parentNode;\r
+\r
+ if (!target)\r
+ {\r
+ return 0; // no luck!\r
+ }\r
+ };\r
+\r
+ for (i = 0; i < slides.length; ++i)\r
+ {\r
+ if (slides[i] == target)\r
+ return i; // success\r
+ }\r
+\r
+ // oh dear still no luck\r
+ return 0;\r
+ },\r
+\r
+ previous_slide: function (incremental) {\r
+ if (!w3c_slidy.view_all)\r
+ {\r
+ var slide;\r
+\r
+//jmi\r
+if (!w3c_slidy.incremental_display) {incremental = false;}\r
+\r
+ if ((incremental || w3c_slidy.slide_number == 0) && w3c_slidy.last_shown != null)\r
+ {\r
+ w3c_slidy.last_shown = w3c_slidy.hide_previous_item(w3c_slidy.last_shown);\r
+ w3c_slidy.set_eos_status(false);\r
+ }\r
+ else if (w3c_slidy.slide_number > 0)\r
+ {\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+\r
+ w3c_slidy.slide_number = w3c_slidy.slide_number - 1;\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.set_visibility_all_incremental("visible");\r
+ w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);\r
+ w3c_slidy.set_eos_status(true);\r
+ w3c_slidy.show_slide(slide);\r
+ }\r
+\r
+ w3c_slidy.set_location();\r
+\r
+ if (!w3c_slidy.ns_pos)\r
+ w3c_slidy.refresh_toolbar(200);\r
+ }\r
+ },\r
+\r
+ next_slide: function (incremental) {\r
+ if (!w3c_slidy.view_all)\r
+ {\r
+ var slide, last = w3c_slidy.last_shown;\r
+//jmi\r
+if (!w3c_slidy.incremental_display) {incremental = false;}\r
+\r
+ if (incremental || w3c_slidy.slide_number == w3c_slidy.slides.length - 1)\r
+ w3c_slidy.last_shown = w3c_slidy.reveal_next_item(w3c_slidy.last_shown);\r
+\r
+ if ((!incremental || w3c_slidy.last_shown == null) &&\r
+ w3c_slidy.slide_number < w3c_slidy.slides.length - 1)\r
+ {\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+\r
+ w3c_slidy.slide_number = w3c_slidy.slide_number + 1;\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.last_shown = null;\r
+ w3c_slidy.set_visibility_all_incremental("hidden");\r
+ w3c_slidy.show_slide(slide);\r
+ }\r
+ else if (!w3c_slidy.last_shown)\r
+ {\r
+ if (last && incremental)\r
+ w3c_slidy.last_shown = last;\r
+ }\r
+\r
+ w3c_slidy.set_location();\r
+\r
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+\r
+ if (!w3c_slidy.ns_pos)\r
+ w3c_slidy.refresh_toolbar(200);\r
+ }\r
+ },\r
+\r
+ // to first slide with nothing revealed\r
+ // i.e. state at start of presentation\r
+ first_slide: function () {\r
+ if (!w3c_slidy.view_all)\r
+ {\r
+ var slide;\r
+\r
+ if (w3c_slidy.slide_number != 0)\r
+ {\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+\r
+ w3c_slidy.slide_number = 0;\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.last_shown = null;\r
+ w3c_slidy.set_visibility_all_incremental("hidden");\r
+ w3c_slidy.show_slide(slide);\r
+ }\r
+\r
+ w3c_slidy.set_eos_status(\r
+ !w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+ w3c_slidy.set_location();\r
+ }\r
+ },\r
+\r
+ // goto last slide with everything revealed\r
+ // i.e. state at end of presentation\r
+ last_slide: function () {\r
+ if (!w3c_slidy.view_all)\r
+ {\r
+ var slide;\r
+\r
+ w3c_slidy.last_shown = null; //revealNextItem(lastShown);\r
+\r
+ if (w3c_slidy.last_shown == null &&\r
+ w3c_slidy.slide_number < w3c_slidy.slides.length - 1)\r
+ {\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.slide_number = w3c_slidy.slides.length - 1;\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.set_visibility_all_incremental("visible");\r
+ w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);\r
+\r
+ w3c_slidy.show_slide(slide);\r
+ }\r
+ else\r
+ {\r
+ w3c_slidy.set_visibility_all_incremental("visible");\r
+ w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);\r
+ }\r
+\r
+ w3c_slidy.set_eos_status(true);\r
+ w3c_slidy.set_location();\r
+ }\r
+ },\r
+\r
+\r
+ // ### check this and consider add/remove class\r
+ set_eos_status: function (state) {\r
+ if (this.eos)\r
+ this.eos.style.color = (state ? "rgb(240,240,240)" : "red");\r
+ },\r
+\r
+ // first slide is 0\r
+ goto_slide: function (num) {\r
+ //alert("going to slide " + (num+1));\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.slide_number = num;\r
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.last_shown = null;\r
+ w3c_slidy.set_visibility_all_incremental("hidden");\r
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+ document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";\r
+ w3c_slidy.show_slide(slide);\r
+ w3c_slidy.show_slide_number();\r
+ },\r
+\r
+\r
+ show_slide: function (slide) {\r
+ this.sync_background(slide);\r
+ window.scrollTo(0,0);\r
+ this.remove_class(slide, "hidden");\r
+ },\r
+\r
+ hide_slide: function (slide) {\r
+ this.add_class(slide, "hidden");\r
+ },\r
+\r
+ // show just the backgrounds pertinent to this slide\r
+ // when slide background-color is transparent\r
+ // this should now work with rgba color values\r
+ sync_background: function (slide) {\r
+ var background;\r
+ var bgColor;\r
+\r
+ if (slide.currentStyle)\r
+ bgColor = slide.currentStyle["backgroundColor"];\r
+ else if (document.defaultView)\r
+ {\r
+ var styles = document.defaultView.getComputedStyle(slide,null);\r
+\r
+ if (styles)\r
+ bgColor = styles.getPropertyValue("background-color");\r
+ else // broken implementation probably due Safari or Konqueror\r
+ {\r
+ //alert("defective implementation of getComputedStyle()");\r
+ bgColor = "transparent";\r
+ }\r
+ }\r
+ else\r
+ bgColor == "transparent";\r
+\r
+ if (bgColor == "transparent" ||\r
+ bgColor.indexOf("rgba") >= 0 ||\r
+ bgColor.indexOf("opacity") >= 0)\r
+ {\r
+ var slideClass = this.get_class_list(slide);\r
+\r
+ for (var i = 0; i < this.backgrounds.length; i++)\r
+ {\r
+ background = this.backgrounds[i];\r
+\r
+ var bgClass = this.get_class_list(background);\r
+\r
+ if (this.matching_background(slideClass, bgClass))\r
+ this.remove_class(background, "hidden");\r
+ else\r
+ this.add_class(background, "hidden");\r
+ }\r
+ }\r
+ else // forcibly hide all backgrounds\r
+ this.hide_backgrounds();\r
+ },\r
+\r
+ hide_backgrounds: function () {\r
+ for (var i = 0; i < this.backgrounds.length; i++)\r
+ {\r
+ background = this.backgrounds[i];\r
+ this.add_class(background, "hidden");\r
+ }\r
+ },\r
+\r
+ // compare classes for slide and background\r
+ matching_background: function (slideClass, bgClass) {\r
+ var i, count, pattern, result;\r
+\r
+ // define pattern as regular expression\r
+ pattern = /\w+/g;\r
+\r
+ // check background class names\r
+ result = bgClass.match(pattern);\r
+\r
+ for (i = count = 0; i < result.length; i++)\r
+ {\r
+ if (result[i] == "hidden")\r
+ continue;\r
+\r
+ if (result[i] == "background")\r
+ continue;\r
+\r
+ ++count;\r
+ }\r
+\r
+ if (count == 0) // default match\r
+ return true;\r
+\r
+ // check for matches and place result in array\r
+ result = slideClass.match(pattern);\r
+\r
+ // now check if desired name is present for background\r
+ for (i = count = 0; i < result.length; i++)\r
+ {\r
+ if (result[i] == "hidden")\r
+ continue;\r
+\r
+ if (this.has_token(bgClass, result[i]))\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ },\r
+\r
+ resized: function () {\r
+ var width = 0;\r
+\r
+ if ( typeof( window.innerWidth ) == 'number' )\r
+ width = window.innerWidth; // Non IE browser\r
+ else if (document.documentElement && document.documentElement.clientWidth)\r
+ width = document.documentElement.clientWidth; // IE6\r
+ else if (document.body && document.body.clientWidth)\r
+ width = document.body.clientWidth; // IE4\r
+\r
+ var height = 0;\r
+\r
+ if ( typeof( window.innerHeight ) == 'number' )\r
+ height = window.innerHeight; // Non IE browser\r
+ else if (document.documentElement && document.documentElement.clientHeight)\r
+ height = document.documentElement.clientHeight; // IE6\r
+ else if (document.body && document.body.clientHeight)\r
+ height = document.body.clientHeight; // IE4\r
+\r
+ if (height && (width/height > 1.05*1024/768))\r
+ {\r
+ width = height * 1024.0/768;\r
+ }\r
+\r
+ // IE fires onresize even when only font size is changed!\r
+ // so we do a check to avoid blocking < and > actions\r
+ if (width != w3c_slidy.last_width || height != w3c_slidy.last_height)\r
+ {\r
+ if (width >= 1100)\r
+ w3c_slidy.size_index = 5; // 4\r
+ else if (width >= 1000)\r
+ w3c_slidy.size_index = 4; // 3\r
+ else if (width >= 800)\r
+ w3c_slidy.size_index = 3; // 2\r
+ else if (width >= 600)\r
+ w3c_slidy.size_index = 2; // 1\r
+ else if (width)\r
+ w3c_slidy.size_index = 0;\r
+\r
+ // add in font size adjustment from meta element e.g.\r
+ // <meta name="font-size-adjustment" content="-2" />\r
+ // useful when slides have too much content ;-)\r
+\r
+ if (0 <= w3c_slidy.size_index + w3c_slidy.size_adjustment &&\r
+ w3c_slidy.size_index + w3c_slidy.size_adjustment < w3c_slidy.sizes.length)\r
+ w3c_slidy.size_index = w3c_slidy.size_index + w3c_slidy.size_adjustment;\r
+\r
+ // enables cross browser use of relative width/height\r
+ // on object elements for use with SVG and Flash media\r
+ w3c_slidy.adjust_object_dimensions(width, height);\r
+\r
+ if (document.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index])\r
+ {\r
+ document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];\r
+ }\r
+\r
+ w3c_slidy.last_width = width;\r
+ w3c_slidy.last_height = height;\r
+\r
+ // force reflow to work around Mozilla bug\r
+ if (w3c_slidy.ns_pos)\r
+ {\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.show_slide(slide);\r
+ }\r
+\r
+ // force correct positioning of toolbar\r
+ w3c_slidy.refresh_toolbar(200);\r
+ }\r
+ },\r
+\r
+ scrolled: function () {\r
+ if (w3c_slidy.toolbar && !w3c_slidy.ns_pos && !w3c_slidy.ie7)\r
+ {\r
+ w3c_slidy.hack_offset = w3c_slidy.scroll_x_offset();\r
+ // hide toolbar\r
+ w3c_slidy.toolbar.style.display = "none";\r
+\r
+ // make it reappear later\r
+ if (w3c_slidy.scrollhack == 0 && !w3c_slidy.view_all)\r
+ {\r
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, 1000);\r
+ w3c_slidy.scrollhack = 1;\r
+ }\r
+ }\r
+ },\r
+\r
+ hide_toolbar: function () {\r
+ w3c_slidy.add_class(w3c_slidy.toolbar, "hidden");\r
+ window.focus();\r
+ },\r
+\r
+ // used to ensure IE refreshes toolbar in correct position\r
+ refresh_toolbar: function (interval) {\r
+ if (!w3c_slidy.ns_pos && !w3c_slidy.ie7)\r
+ {\r
+ w3c_slidy.hide_toolbar();\r
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, interval);\r
+ }\r
+ },\r
+\r
+ // restores toolbar after short delay\r
+ show_toolbar: function () {\r
+ if (w3c_slidy.want_toolbar)\r
+ {\r
+ w3c_slidy.toolbar.style.display = "block";\r
+\r
+ if (!w3c_slidy.ns_pos)\r
+ {\r
+ // adjust position to allow for scrolling\r
+ var xoffset = w3c_slidy.scroll_x_offset();\r
+ w3c_slidy.toolbar.style.left = xoffset;\r
+ w3c_slidy.toolbar.style.right = xoffset;\r
+\r
+ // determine vertical scroll offset\r
+ //var yoffset = scrollYOffset();\r
+\r
+ // bottom is doc height - window height - scroll offset\r
+ //var bottom = documentHeight() - lastHeight - yoffset\r
+\r
+ //if (yoffset > 0 || documentHeight() > lastHeight)\r
+ // bottom += 16; // allow for height of scrollbar\r
+\r
+ w3c_slidy.toolbar.style.bottom = 0; //bottom;\r
+ }\r
+\r
+ w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden");\r
+ }\r
+\r
+ w3c_slidy.scrollhack = 0;\r
+\r
+\r
+ // set the keyboard focus to the help link on the\r
+ // toolbar to ensure that document has the focus\r
+ // IE doesn't always work with window.focus()\r
+ // and this hack has benefit of Enter for help\r
+\r
+ try\r
+ {\r
+ if (!w3c_slidy.opera)\r
+ w3c_slidy.help_anchor.focus();\r
+ }\r
+ catch (e)\r
+ {\r
+ }\r
+ },\r
+\r
+// invoked via F key\r
+ toggle_toolbar: function () {\r
+ if (!w3c_slidy.view_all)\r
+ {\r
+ if (w3c_slidy.has_class(w3c_slidy.toolbar, "hidden"))\r
+ {\r
+ w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden")\r
+ w3c_slidy.want_toolbar = 1;\r
+ }\r
+ else\r
+ {\r
+ w3c_slidy.add_class(w3c_slidy.toolbar, "hidden")\r
+ w3c_slidy.want_toolbar = 0;\r
+ }\r
+ }\r
+ },\r
+\r
+ scroll_x_offset: function () {\r
+ if (window.pageXOffset)\r
+ return self.pageXOffset;\r
+\r
+ if (document.documentElement &&\r
+ document.documentElement.scrollLeft)\r
+ return document.documentElement.scrollLeft;\r
+\r
+ if (document.body)\r
+ return document.body.scrollLeft;\r
+\r
+ return 0;\r
+ },\r
+\r
+ scroll_y_offset: function () {\r
+ if (window.pageYOffset)\r
+ return self.pageYOffset;\r
+\r
+ if (document.documentElement &&\r
+ document.documentElement.scrollTop)\r
+ return document.documentElement.scrollTop;\r
+\r
+ if (document.body)\r
+ return document.body.scrollTop;\r
+\r
+ return 0;\r
+ },\r
+\r
+ // looking for a way to determine height of slide content\r
+ // the slide itself is set to the height of the window\r
+ optimize_font_size: function () {\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+\r
+ //var dh = documentHeight(); //getDocHeight(document);\r
+ var dh = slide.scrollHeight;\r
+ var wh = getWindowHeight();\r
+ var u = 100 * dh / wh;\r
+\r
+ alert("window utilization = " + u + "% (doc "\r
+ + dh + " win " + wh + ")");\r
+ },\r
+\r
+ // from document object\r
+ get_doc_height: function (doc) {\r
+ if (!doc)\r
+ doc = document;\r
+\r
+ if (doc && doc.body && doc.body.offsetHeight)\r
+ return doc.body.offsetHeight; // ns/gecko syntax\r
+\r
+ if (doc && doc.body && doc.body.scrollHeight)\r
+ return doc.body.scrollHeight;\r
+\r
+ alert("couldn't determine document height");\r
+ },\r
+\r
+ get_window_height: function () {\r
+ if ( typeof( window.innerHeight ) == 'number' )\r
+ return window.innerHeight; // Non IE browser\r
+\r
+ if (document.documentElement && document.documentElement.clientHeight)\r
+ return document.documentElement.clientHeight; // IE6\r
+\r
+ if (document.body && document.body.clientHeight)\r
+ return document.body.clientHeight; // IE4\r
+ },\r
+\r
+ document_height: function () {\r
+ var sh, oh;\r
+\r
+ sh = document.body.scrollHeight;\r
+ oh = document.body.offsetHeight;\r
+\r
+ if (sh && oh)\r
+ {\r
+ return (sh > oh ? sh : oh);\r
+ }\r
+\r
+ // no idea!\r
+ return 0;\r
+ },\r
+\r
+ smaller: function () {\r
+ if (w3c_slidy.size_index > 0)\r
+ {\r
+ --w3c_slidy.size_index;\r
+ }\r
+\r
+ w3c_slidy.toolbar.style.display = "none";\r
+ document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.show_slide(slide);\r
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);\r
+ },\r
+\r
+ bigger: function () {\r
+ if (w3c_slidy.size_index < w3c_slidy.sizes.length - 1)\r
+ {\r
+ ++w3c_slidy.size_index;\r
+ }\r
+\r
+ w3c_slidy.toolbar.style.display = "none";\r
+ document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ w3c_slidy.show_slide(slide);\r
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);\r
+ },\r
+\r
+ // enables cross browser use of relative width/height\r
+ // on object elements for use with SVG and Flash media\r
+ // with thanks to Ivan Herman for the suggestion\r
+ adjust_object_dimensions: function (width, height) {\r
+ for( var i = 0; i < w3c_slidy.objects.length; i++ )\r
+ {\r
+ var obj = this.objects[i];\r
+ var mimeType = obj.getAttribute("type");\r
+\r
+ if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash")\r
+ {\r
+ if ( !obj.initialWidth )\r
+ obj.initialWidth = obj.getAttribute("width");\r
+\r
+ if ( !obj.initialHeight )\r
+ obj.initialHeight = obj.getAttribute("height");\r
+\r
+ if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" )\r
+ {\r
+ var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1));\r
+ var newW = width * (w/100.0);\r
+ obj.setAttribute("width",newW);\r
+ }\r
+\r
+ if ( obj.initialHeight &&\r
+ obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" )\r
+ {\r
+ var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1));\r
+ var newH = height * (h/100.0);\r
+ obj.setAttribute("height", newH);\r
+ }\r
+ }\r
+ }\r
+ },\r
+\r
+ // needed for Opera to inhibit default behavior\r
+ // since Opera delivers keyPress even if keyDown\r
+ // was cancelled\r
+ key_press: function (event) {\r
+ if (!event)\r
+ event = window.event;\r
+\r
+ if (!w3c_slidy.key_wanted)\r
+ return w3c_slidy.cancel(event);\r
+\r
+ return true;\r
+ },\r
+\r
+ // See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes\r
+ key_down: function (event) {\r
+ var key, target, tag;\r
+\r
+ w3c_slidy.key_wanted = true;\r
+\r
+ if (!event)\r
+ event = window.event;\r
+\r
+ // kludge around NS/IE differences\r
+ if (window.event)\r
+ {\r
+ key = window.event.keyCode;\r
+ target = window.event.srcElement;\r
+ }\r
+ else if (event.which)\r
+ {\r
+ key = event.which;\r
+ target = event.target;\r
+ }\r
+ else\r
+ return true; // Yikes! unknown browser\r
+\r
+ // ignore event if key value is zero\r
+ // as for alt on Opera and Konqueror\r
+ if (!key)\r
+ return true;\r
+\r
+ // avoid interfering with keystroke\r
+ // behavior for non-slidy chrome elements\r
+ if (!w3c_slidy.slidy_chrome(target) &&\r
+ w3c_slidy.special_element(target))\r
+ return true;\r
+\r
+ // check for concurrent control/command/alt key\r
+ // but are these only present on mouse events?\r
+\r
+ if (event.ctrlKey || event.altKey || event.metaKey)\r
+ return true;\r
+\r
+ // dismiss table of contents if visible\r
+ if (w3c_slidy.is_shown_toc() && key != 9 && key != 16 && key != 38 && key != 40)\r
+ {\r
+ w3c_slidy.hide_table_of_contents(true);\r
+\r
+ if (key == 27 || key == 84 || key == 67)\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+\r
+ if (key == 34) // Page Down\r
+ {\r
+ if (w3c_slidy.view_all)\r
+ return true;\r
+\r
+ w3c_slidy.next_slide(false);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 33) // Page Up\r
+ {\r
+ if (w3c_slidy.view_all)\r
+ return true;\r
+\r
+ w3c_slidy.previous_slide(false);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 32) // space bar\r
+ {\r
+ w3c_slidy.next_slide(true);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 37) // Left arrow\r
+ {\r
+ w3c_slidy.previous_slide(!event.shiftKey);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 36) // Home\r
+ {\r
+ w3c_slidy.first_slide();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 35) // End\r
+ {\r
+ w3c_slidy.last_slide();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 39) // Right arrow\r
+ {\r
+ w3c_slidy.next_slide(!event.shiftKey);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 13) // Enter\r
+ {\r
+ if (w3c_slidy.outline)\r
+ {\r
+ if (w3c_slidy.outline.visible)\r
+ w3c_slidy.fold(w3c_slidy.outline);\r
+ else\r
+ w3c_slidy.unfold(w3c_slidy.outline);\r
+\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ }\r
+ else if (key == 188) // < for smaller fonts\r
+ {\r
+ w3c_slidy.smaller();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 190) // > for larger fonts\r
+ {\r
+ w3c_slidy.bigger();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 189 || key == 109) // - for smaller fonts\r
+ {\r
+ w3c_slidy.smaller();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 187 || key == 191 || key == 107) // = + for larger fonts\r
+ {\r
+ w3c_slidy.bigger();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 83) // S for smaller fonts\r
+ {\r
+ w3c_slidy.smaller();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 66) // B for larger fonts\r
+ {\r
+ w3c_slidy.bigger();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 90) // Z for last slide\r
+ {\r
+ w3c_slidy.last_slide();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 70) // F for toggle toolbar\r
+ {\r
+ w3c_slidy.toggle_toolbar();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 65) // A for toggle view single/all slides\r
+ {\r
+ w3c_slidy.toggle_view();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 75) // toggle action of left click for next page\r
+ {\r
+ w3c_slidy.mouse_click_enabled = !w3c_slidy.mouse_click_enabled;\r
+ var alert_msg = (w3c_slidy.mouse_click_enabled ?\r
+ "enabled" : "disabled") + " mouse click advance";\r
+\r
+ alert(w3c_slidy.localize(alert_msg));\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 84 || key == 67) // T or C for table of contents\r
+ {\r
+ if (w3c_slidy.toc)\r
+ w3c_slidy.toggle_table_of_contents();\r
+\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 72) // H for help\r
+ {\r
+ window.location = w3c_slidy.help_page;\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+//jmi\r
+ else if (key == 73) // I to toggle incremental display\r
+ {\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+ w3c_slidy.hide_slide(slide);\r
+ if (w3c_slidy.incremental_display) { w3c_slidy.set_visibility_all_incremental("visible"); }\r
+ w3c_slidy.incremental_display = !w3c_slidy.incremental_display ;\r
+ w3c_slidy.last_shown = null ;\r
+ w3c_slidy.set_visibility_all_incremental("hidden");\r
+ //this.set_eos_status(true);\r
+ w3c_slidy.show_slide(slide);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 76) // L to toggle color-set\r
+ {\r
+ w3c_slidy.toggle_color_set();\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+ else if (key == 77) // display help_keymap\r
+ {\r
+ alert(w3c_slidy.help_keymap);\r
+ return w3c_slidy.cancel(event);\r
+ }\r
+//jmi end\r
+ //else alert("key code is "+ key);\r
+ return true;\r
+ },\r
+\r
+ // safe for both text/html and application/xhtml+xml\r
+ create_element: function (name) {\r
+ if (this.xhtml && (typeof document.createElementNS != 'undefined'))\r
+ return document.createElementNS("http://www.w3.org/1999/xhtml", name)\r
+\r
+ return document.createElement(name);\r
+ },\r
+\r
+ get_element_style: function (elem, IEStyleProp, CSSStyleProp) {\r
+ if (elem.currentStyle)\r
+ {\r
+ return elem.currentStyle[IEStyleProp];\r
+ }\r
+ else if (window.getComputedStyle)\r
+ {\r
+ var compStyle = window.getComputedStyle(elem, "");\r
+ return compStyle.getPropertyValue(CSSStyleProp);\r
+ }\r
+ return "";\r
+ },\r
+\r
+ // the string str is a whitespace separated list of tokens\r
+ // test if str contains a particular token, e.g. "slide"\r
+ has_token: function (str, token) {\r
+ if (str)\r
+ {\r
+ // define pattern as regular expression\r
+ var pattern = /\w+/g;\r
+\r
+ // check for matches\r
+ // place result in array\r
+ var result = str.match(pattern);\r
+\r
+ // now check if desired token is present\r
+ for (var i = 0; i < result.length; i++)\r
+ {\r
+ if (result[i] == token)\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ },\r
+\r
+ get_class_list: function (element) {\r
+ if (typeof element.className != 'undefined')\r
+ return element.className;\r
+\r
+ return element.getAttribute("class");\r
+ },\r
+\r
+ has_class: function (element, name) {\r
+ if (element.nodeType != 1)\r
+ return false;\r
+\r
+ var regexp = new RegExp("(^| )" + name + "\W*");\r
+\r
+ if (typeof element.className != 'undefined')\r
+ return regexp.test(element.className);\r
+\r
+ return regexp.test(element.getAttribute("class"));\r
+ },\r
+\r
+ remove_class: function (element, name) {\r
+ var regexp = new RegExp("(^| )" + name + "\W*");\r
+ var clsval = "";\r
+\r
+ if (typeof element.className != 'undefined')\r
+ {\r
+ clsval = element.className;\r
+\r
+ if (clsval)\r
+ {\r
+ clsval = clsval.replace(regexp, "");\r
+ element.className = clsval;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ clsval = element.getAttribute("class");\r
+\r
+ if (clsval)\r
+ {\r
+ clsval = clsval.replace(regexp, "");\r
+ element.setAttribute("class", clsval);\r
+ }\r
+ }\r
+ },\r
+\r
+ add_class: function (element, name) {\r
+ if (!this.has_class(element, name))\r
+ {\r
+ if (typeof element.className != 'undefined')\r
+ element.className += " " + name;\r
+ else\r
+ {\r
+ var clsval = element.getAttribute("class");\r
+ clsval = clsval ? clsval + " " + name : name;\r
+ element.setAttribute("class", clsval);\r
+ }\r
+ }\r
+ },\r
+\r
+ // HTML elements that can be used with class="incremental"\r
+ // note that you can also put the class on containers like\r
+ // up, ol, dl, and div to make their contents appear\r
+ // incrementally. Upper case is used since this is what\r
+ // browsers report for HTML node names (text/html).\r
+ incremental_elements: null,\r
+ okay_for_incremental: function (name) {\r
+ if (!this.incremental_elements)\r
+ {\r
+ var inclist = new Array();\r
+ inclist["p"] = true;\r
+ inclist["pre"] = true;\r
+ inclist["li"] = true;\r
+ inclist["blockquote"] = true;\r
+ inclist["dt"] = true;\r
+ inclist["dd"] = true;\r
+ inclist["h2"] = true;\r
+ inclist["h3"] = true;\r
+ inclist["h4"] = true;\r
+ inclist["h5"] = true;\r
+ inclist["h6"] = true;\r
+ inclist["span"] = true;\r
+ inclist["address"] = true;\r
+ inclist["table"] = true;\r
+ inclist["tr"] = true;\r
+ inclist["th"] = true;\r
+ inclist["td"] = true;\r
+ inclist["img"] = true;\r
+ inclist["object"] = true;\r
+ this.incremental_elements = inclist;\r
+ }\r
+ return this.incremental_elements[name.toLowerCase()];\r
+ },\r
+\r
+ next_incremental_item: function (node) {\r
+ var br = this.is_xhtml ? "br" : "BR";\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+\r
+ for (;;)\r
+ {\r
+ node = w3c_slidy.next_node(slide, node);\r
+\r
+ if (node == null || node.parentNode == null)\r
+ break;\r
+\r
+ if (node.nodeType == 1) // ELEMENT\r
+ {\r
+ if (node.nodeName == br)\r
+ continue;\r
+\r
+ if (w3c_slidy.has_class(node, "incremental")\r
+ && w3c_slidy.okay_for_incremental(node.nodeName))\r
+ return node;\r
+\r
+ if (w3c_slidy.has_class(node.parentNode, "incremental")\r
+ && !w3c_slidy.has_class(node, "non-incremental"))\r
+ return node;\r
+ }\r
+ }\r
+\r
+ return node;\r
+ },\r
+\r
+ previous_incremental_item: function (node) {\r
+ var br = this.is_xhtml ? "br" : "BR";\r
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+\r
+ for (;;)\r
+ {\r
+ node = w3c_slidy.previous_node(slide, node);\r
+\r
+ if (node == null || node.parentNode == null)\r
+ break;\r
+\r
+ if (node.nodeType == 1)\r
+ {\r
+ if (node.nodeName == br)\r
+ continue;\r
+\r
+ if (w3c_slidy.has_class(node, "incremental")\r
+ && w3c_slidy.okay_for_incremental(node.nodeName))\r
+ return node;\r
+\r
+ if (w3c_slidy.has_class(node.parentNode, "incremental")\r
+ && !w3c_slidy.has_class(node, "non-incremental"))\r
+ return node;\r
+ }\r
+ }\r
+\r
+ return node;\r
+ },\r
+\r
+ // set visibility for all elements on current slide with\r
+ // a parent element with attribute class="incremental"\r
+ set_visibility_all_incremental: function (value) {\r
+ var node = this.next_incremental_item(null);\r
+\r
+//jmi\r
+if (!w3c_slidy.incremental_display) {value = "visible";}\r
+\r
+ if (value == "hidden")\r
+ {\r
+ while (node)\r
+ {\r
+ w3c_slidy.add_class(node, "invisible");\r
+ node = w3c_slidy.next_incremental_item(node);\r
+ }\r
+ }\r
+ else // value == "visible"\r
+ {\r
+ while (node)\r
+ {\r
+ w3c_slidy.remove_class(node, "invisible");\r
+ node = w3c_slidy.next_incremental_item(node);\r
+ }\r
+ }\r
+ },\r
+\r
+ // reveal the next hidden item on the slide\r
+ // node is null or the node that was last revealed\r
+ reveal_next_item: function (node) {\r
+ node = w3c_slidy.next_incremental_item(node);\r
+\r
+ if (node && node.nodeType == 1) // an element\r
+ w3c_slidy.remove_class(node, "invisible");\r
+\r
+ return node;\r
+ },\r
+\r
+ // exact inverse of revealNextItem(node)\r
+ hide_previous_item: function (node) {\r
+ if (node && node.nodeType == 1) // an element\r
+ w3c_slidy.add_class(node, "invisible");\r
+\r
+ return this.previous_incremental_item(node);\r
+ },\r
+\r
+ // left to right traversal of root's content\r
+ next_node: function (root, node) {\r
+ if (node == null)\r
+ return root.firstChild;\r
+\r
+ if (node.firstChild)\r
+ return node.firstChild;\r
+\r
+ if (node.nextSibling)\r
+ return node.nextSibling;\r
+\r
+ for (;;)\r
+ {\r
+ node = node.parentNode;\r
+\r
+ if (!node || node == root)\r
+ break;\r
+\r
+ if (node && node.nextSibling)\r
+ return node.nextSibling;\r
+ }\r
+\r
+ return null;\r
+ },\r
+\r
+ // right to left traversal of root's content\r
+ previous_node: function (root, node) {\r
+ if (node == null)\r
+ {\r
+ node = root.lastChild;\r
+\r
+ if (node)\r
+ {\r
+ while (node.lastChild)\r
+ node = node.lastChild;\r
+ }\r
+\r
+ return node;\r
+ }\r
+\r
+ if (node.previousSibling)\r
+ {\r
+ node = node.previousSibling;\r
+\r
+ while (node.lastChild)\r
+ node = node.lastChild;\r
+\r
+ return node;\r
+ }\r
+\r
+ if (node.parentNode != root)\r
+ return node.parentNode;\r
+\r
+ return null;\r
+ },\r
+\r
+ previous_sibling_element: function (el) {\r
+ el = el.previousSibling;\r
+\r
+ while (el && el.nodeType != 1)\r
+ el = el.previousSibling;\r
+\r
+ return el;\r
+ },\r
+\r
+ next_sibling_element: function (el) {\r
+ el = el.nextSibling;\r
+\r
+ while (el && el.nodeType != 1)\r
+ el = el.nextSibling;\r
+\r
+ return el;\r
+ },\r
+\r
+ first_child_element: function (el) {\r
+ var node;\r
+\r
+ for (node = el.firstChild; node; node = node.nextSibling)\r
+ {\r
+ if (node.nodeType == 1)\r
+ break;\r
+ }\r
+\r
+ return node;\r
+ },\r
+\r
+ first_tag: function (element, tag) {\r
+ var node;\r
+\r
+ if (!this.is_xhtml)\r
+ tag = tag.toUpperCase();\r
+\r
+ for (node = element.firstChild; node; node = node.nextSibling)\r
+ {\r
+ if (node.nodeType == 1 && node.nodeName == tag)\r
+ break;\r
+ }\r
+\r
+ return node;\r
+ },\r
+\r
+ hide_selection: function () {\r
+ if (window.getSelection) // Firefox, Chromium, Safari, Opera\r
+ {\r
+ var selection = window.getSelection();\r
+\r
+ if (selection.rangeCount > 0)\r
+ {\r
+ var range = selection.getRangeAt(0);\r
+ range.collapse (false);\r
+ }\r
+ }\r
+ else // Internet Explorer\r
+ {\r
+ var textRange = document.selection.createRange ();\r
+ textRange.collapse (false);\r
+ }\r
+ },\r
+\r
+ get_selected_text: function () {\r
+ try\r
+ {\r
+ if (window.getSelection)\r
+ return window.getSelection().toString();\r
+\r
+ if (document.getSelection)\r
+ return document.getSelection().toString();\r
+\r
+ if (document.selection)\r
+ return document.selection.createRange().text;\r
+ }\r
+ catch (e)\r
+ {\r
+ }\r
+\r
+ return "";\r
+ },\r
+\r
+ // make note of length of selected text\r
+ // as this evaluates to zero in click event\r
+ mouse_button_up: function (e) {\r
+ w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length;\r
+ },\r
+\r
+ // right mouse button click is reserved for context menus\r
+ // it is more reliable to detect rightclick than leftclick\r
+ mouse_button_click: function (e) {\r
+ var rightclick = false;\r
+ var leftclick = false;\r
+ var middleclick = false;\r
+ var target;\r
+\r
+ if (!e)\r
+ var e = window.event;\r
+\r
+ if (e.target)\r
+ target = e.target;\r
+ else if (e.srcElement)\r
+ target = e.srcElement;\r
+\r
+ // work around Safari bug\r
+ if (target.nodeType == 3)\r
+ target = target.parentNode;\r
+\r
+ if (e.which) // all browsers except IE\r
+ {\r
+ leftclick = (e.which == 1);\r
+ middleclick = (e.which == 2);\r
+ rightclick = (e.which == 3);\r
+ }\r
+ else if (e.button)\r
+ {\r
+ // Konqueror gives 1 for left, 4 for middle\r
+ // IE6 gives 0 for left and not 1 as I expected\r
+\r
+ if (e.button == 4)\r
+ middleclick = true;\r
+\r
+ // all browsers agree on 2 for right button\r
+ rightclick = (e.button == 2);\r
+ }\r
+ else\r
+ leftclick = true;\r
+\r
+ if (w3c_slidy.selected_text_len > 0)\r
+ {\r
+ w3c_slidy.stop_propagation(e);\r
+ e.cancel = true;\r
+ e.returnValue = false;\r
+ return false;\r
+ }\r
+\r
+ // dismiss table of contents\r
+ w3c_slidy.hide_table_of_contents(false);\r
+\r
+ // check if target is something that probably want's clicks\r
+ // e.g. a, embed, object, input, textarea, select, option\r
+ var tag = target.nodeName.toLowerCase();\r
+\r
+ if (w3c_slidy.mouse_click_enabled && leftclick &&\r
+ !w3c_slidy.special_element(target) &&\r
+ !target.onclick)\r
+ {\r
+ w3c_slidy.next_slide(true);\r
+ w3c_slidy.stop_propagation(e);\r
+ e.cancel = true;\r
+ e.returnValue = false;\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ },\r
+\r
+ special_element: function (e) {\r
+ var tag = e.nodeName.toLowerCase();\r
+\r
+ return e.onkeydown ||\r
+ e.onclick ||\r
+ tag == "a" ||\r
+ tag == "embed" ||\r
+ tag == "object" ||\r
+ tag == "video" ||\r
+ tag == "audio" ||\r
+ tag == "input" ||\r
+ tag == "textarea" ||\r
+ tag == "select" ||\r
+ tag == "option";\r
+ },\r
+\r
+ slidy_chrome: function (el) {\r
+ while (el)\r
+ {\r
+ if (el == w3c_slidy.toc ||\r
+ el == w3c_slidy.toolbar ||\r
+ w3c_slidy.has_class(el, "outline"))\r
+ return true;\r
+\r
+ el = el.parentNode;\r
+ }\r
+\r
+ return false;\r
+ },\r
+\r
+ get_key: function (e)\r
+ {\r
+ var key;\r
+\r
+ // kludge around NS/IE differences\r
+ if (typeof window.event != "undefined")\r
+ key = window.event.keyCode;\r
+ else if (e.which)\r
+ key = e.which;\r
+\r
+ return key;\r
+ },\r
+\r
+ get_target: function (e) {\r
+ var target;\r
+\r
+ if (!e)\r
+ e = window.event;\r
+\r
+ if (e.target)\r
+ target = e.target;\r
+ else if (e.srcElement)\r
+ target = e.srcElement;\r
+\r
+ if (target.nodeType != 1)\r
+ target = target.parentNode;\r
+\r
+ return target;\r
+ },\r
+\r
+ // does display property provide correct defaults?\r
+ is_block: function (elem) {\r
+ var tag = elem.nodeName.toLowerCase();\r
+\r
+ return tag == "ol" || tag == "ul" || tag == "p" ||\r
+ tag == "li" || tag == "table" || tag == "pre" ||\r
+ tag == "h1" || tag == "h2" || tag == "h3" ||\r
+ tag == "h4" || tag == "h5" || tag == "h6" ||\r
+ tag == "blockquote" || tag == "address";\r
+ },\r
+\r
+ add_listener: function (element, event, handler) {\r
+ if (window.addEventListener)\r
+ element.addEventListener(event, handler, false);\r
+ else\r
+ element.attachEvent("on"+event, handler);\r
+ },\r
+\r
+ // used to prevent event propagation from field controls\r
+ stop_propagation: function (event) {\r
+ event = event ? event : window.event;\r
+ event.cancelBubble = true; // for IE\r
+\r
+ if (event.stopPropagation)\r
+ event.stopPropagation();\r
+\r
+ return true;\r
+ },\r
+\r
+ cancel: function (event) {\r
+ if (event)\r
+ {\r
+ event.cancel = true;\r
+ event.returnValue = false;\r
+\r
+ if (event.preventDefault)\r
+ event.preventDefault();\r
+ }\r
+\r
+ w3c_slidy.key_wanted = false;\r
+ return false;\r
+ },\r
+// jmi\r
+ init_color_sets: function(){\r
+ if (this.color_sets.length == 0){\r
+ // initialize color_sets array\r
+ var tmp = document.styleSheets;\r
+ var j = 0;\r
+ for (var i=0;i<tmp.length;i++) {\r
+ var css_name = null ;\r
+ if (tmp[i].title) {\r
+ css_name = tmp[i].title ;\r
+ }\r
+ if ((tmp[i].href) && (tmp[i].href.indexOf('.css') != -1)) {\r
+ css_name = tmp[i].href.substring(tmp[i].href.lastIndexOf('/')+1,tmp[i].href.indexOf('.css')) ;\r
+ }\r
+ if ((css_name) && (css_name.indexOf('color_set') > 0)) {\r
+ this.color_sets[j] = tmp[i];\r
+ this.color_sets[j++].disabled = true;\r
+ }\r
+ }\r
+ if (this.color_sets.length > 0){ this.color_sets[0].disabled = false; }\r
+ }\r
+ },\r
+ toggle_color_set: function(){\r
+ // toggle to the next color_set\r
+ if (this.color_sets.length > 0){\r
+ var i = 0;\r
+ while ((i < this.color_sets.length) && (this.color_sets[i].disabled == true)) { i = i + 1 ; }\r
+ if (i == this.color_sets.length) { i = i - 1; }\r
+ this.color_sets[i].disabled = true ;\r
+ this.color_sets[(i + 1) % (this.color_sets.length)].disabled = false ;\r
+ }\r
+ },\r
+\r
+// for each language define an associative array\r
+// and also the help text which is longer\r
+\r
+ strings_es: {\r
+ "slide":"pág.",\r
+ "help?":"Ayuda",\r
+ "contents?":"Índice",\r
+ "table of contents":"tabla de contenidos",\r
+ "Table of Contents":"Tabla de Contenidos",\r
+ "restart presentation":"Reiniciar presentación",\r
+ "restart?":"Inicio"\r
+ },\r
+ help_es:\r
+ "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " +\r
+ "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente.",\r
+\r
+ strings_ca: {\r
+ "slide":"pàg..",\r
+ "help?":"Ajuda",\r
+ "contents?":"Índex",\r
+ "table of contents":"taula de continguts",\r
+ "Table of Contents":"Taula de Continguts",\r
+ "restart presentation":"Reiniciar presentació",\r
+ "restart?":"Inici"\r
+ },\r
+ help_ca:\r
+ "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " +\r
+ "o Re pàg y Av pàg. Usi S i B per canviar grandària de font.",\r
+\r
+ strings_cs: {\r
+ "slide":"snímek",\r
+ "help?":"nápověda",\r
+ "contents?":"obsah",\r
+ "table of contents":"obsah prezentace",\r
+ "Table of Contents":"Obsah prezentace",\r
+ "restart presentation":"znovu spustit prezentaci",\r
+ "restart?":"restart"\r
+ },\r
+ help_cs:\r
+ "Prezentaci můžete procházet pomocí kliknutí myši, mezerníku, " +\r
+ "šipek vlevo a vpravo nebo kláves PageUp a PageDown. Písmo se " +\r
+ "dá zvětšit a zmenšit pomocí kláves B a S.",\r
+\r
+ strings_nl: {\r
+ "slide":"pagina",\r
+ "help?":"Help?",\r
+ "contents?":"Inhoud?",\r
+ "table of contents":"inhoudsopgave",\r
+ "Table of Contents":"Inhoudsopgave",\r
+ "restart presentation":"herstart presentatie",\r
+ "restart?":"Herstart?"\r
+ },\r
+ help_nl:\r
+ "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " +\r
+ "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen.",\r
+\r
+ strings_de: {\r
+ "slide":"Seite",\r
+ "help?":"Hilfe",\r
+ "contents?":"Übersicht",\r
+ "table of contents":"Inhaltsverzeichnis",\r
+ "Table of Contents":"Inhaltsverzeichnis",\r
+ "restart presentation":"Präsentation neu starten",\r
+ "restart?":"Neustart"\r
+ },\r
+ help_de:\r
+ "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " +\r
+ "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse.",\r
+\r
+ strings_pl: {\r
+ "slide":"slajd",\r
+ "help?":"pomoc?",\r
+ "contents?":"spis treści?",\r
+ "table of contents":"spis treści",\r
+ "Table of Contents":"Spis Treści",\r
+ "restart presentation":"Restartuj prezentację",\r
+ "restart?":"restart?"\r
+ },\r
+ help_pl:\r
+ "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" +\r
+ "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki.",\r
+\r
+ strings_fr: {\r
+ "slide":"page",\r
+ "help?":"Aide",\r
+ "contents?":"Index",\r
+ "table of contents":"table des matières",\r
+ "Table of Contents":"Table des matières",\r
+ "restart presentation":"Recommencer l'exposé",\r
+ "restart?":"Début"\r
+ },\r
+ help_fr:\r
+ "Naviguez avec la souris, la barre d'espace, les flèches " +\r
+ "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " +\r
+ "les touches S et B pour modifier la taille de la police, M pour l'association des touches.",\r
+\r
+ strings_hu: {\r
+ "slide":"oldal",\r
+ "help?":"segítség",\r
+ "contents?":"tartalom",\r
+ "table of contents":"tartalomjegyzék",\r
+ "Table of Contents":"Tartalomjegyzék",\r
+ "restart presentation":"bemutató újraindítása",\r
+ "restart?":"újraindítás"\r
+ },\r
+ help_hu:\r
+ "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " +\r
+ "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " +\r
+ "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " +\r
+ "a szöveg méretét.",\r
+\r
+ strings_it: {\r
+ "slide":"pag.",\r
+ "help?":"Aiuto",\r
+ "contents?":"Indice",\r
+ "table of contents":"indice",\r
+ "Table of Contents":"Indice",\r
+ "restart presentation":"Ricominciare la presentazione",\r
+ "restart?":"Inizio"\r
+ },\r
+ help_it:\r
+ "Navigare con mouse, barra spazio, frecce sinistra/destra o " +\r
+ "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri.",\r
+\r
+ strings_el: {\r
+ "slide":"σελίδα",\r
+ "help?":"βοήθεια;",\r
+ "contents?":"περιεχόμενα;",\r
+ "table of contents":"πίνακας περιεχομένων",\r
+ "Table of Contents":"Πίνακας Περιεχομένων",\r
+ "restart presentation":"επανεκκίνηση παρουσίασης",\r
+ "restart?":"επανεκκίνηση;"\r
+ },\r
+ help_el:\r
+ "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " +\r
+ "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " +\r
+ "το μέγεθος της γραμματοσειράς.",\r
+\r
+ strings_ja: {\r
+ "slide":"スライド",\r
+ "help?":"ヘルプ",\r
+ "contents?":"目次",\r
+ "table of contents":"目次を表示",\r
+ "Table of Contents":"目次",\r
+ "restart presentation":"最初から再生",\r
+ "restart?":"最初から"\r
+ },\r
+ help_ja:\r
+ "マウス左クリック ・ スペース ・ 左右キー " +\r
+ "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更",\r
+\r
+ strings_zh: {\r
+ "slide":"幻灯片",\r
+ "help?":"帮助?",\r
+ "contents?":"内容?",\r
+ "table of contents":"目录",\r
+ "Table of Contents":"目录",\r
+ "restart presentation":"重新启动展示",\r
+ "restart?":"重新启动?"\r
+ },\r
+ help_zh:\r
+ "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " +\r
+ "用 S, B 改变字体大小.",\r
+\r
+ strings_ru: {\r
+ "slide":"слайд",\r
+ "help?":"помощь?",\r
+ "contents?":"содержание?",\r
+ "table of contents":"оглавление",\r
+ "Table of Contents":"Оглавление",\r
+ "restart presentation":"перезапустить презентацию",\r
+ "restart?":"перезапуск?"\r
+ },\r
+ help_ru:\r
+ "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" +\r
+ "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта.",\r
+\r
+ strings_sv: {\r
+ "slide":"sida",\r
+ "help?":"hjälp",\r
+ "contents?":"innehåll",\r
+ "table of contents":"innehållsförteckning",\r
+ "Table of Contents":"Innehållsförteckning",\r
+ "restart presentation":"visa presentationen från början",\r
+ "restart?":"börja om"\r
+ },\r
+ help_sv:\r
+ "Bläddra med ett klick med vänstra musknappen, mellanslagstangenten, " +\r
+ "vänster- och högerpiltangenterna eller tangenterna Pg Up, Pg Dn. " +\r
+ "Använd tangenterna S och B för att ändra textens storlek.",\r
+\r
+ strings: { },\r
+\r
+ localize: function (src) {\r
+ if (src == "")\r
+ return src;\r
+\r
+ // try full language code, e.g. en-US\r
+ var s, lookup = w3c_slidy.strings[w3c_slidy.lang];\r
+\r
+ if (lookup)\r
+ {\r
+ s = lookup[src];\r
+\r
+ if (s)\r
+ return s;\r
+ }\r
+\r
+ // strip country code suffix, e.g.\r
+ // try en if undefined for en-US\r
+ var lg = w3c_slidy.lang.split("-");\r
+\r
+ if (lg.length > 1)\r
+ {\r
+ lookup = w3c_slidy.strings[lg[0]];\r
+\r
+ if (lookup)\r
+ {\r
+ s = lookup[src];\r
+\r
+ if (s)\r
+ return s;\r
+ }\r
+ }\r
+\r
+ // otherwise string as is\r
+ return src;\r
+ },\r
+\r
+ init_localization: function () {\r
+ var i18n = w3c_slidy;\r
+ var help_text = w3c_slidy.help_text;\r
+\r
+ // each such language array is declared in the localize array\r
+ // this is used as in w3c_slidy.localize("foo");\r
+ this.strings = {\r
+ "es":this.strings_es,\r
+ "ca":this.strings_ca,\r
+ "cs":this.strings_cs,\r
+ "nl":this.strings_nl,\r
+ "de":this.strings_de,\r
+ "pl":this.strings_pl,\r
+ "fr":this.strings_fr,\r
+ "hu":this.strings_hu,\r
+ "it":this.strings_it,\r
+ "el":this.strings_el,\r
+ "jp":this.strings_ja,\r
+ "zh":this.strings_zh,\r
+ "ru":this.strings_ru,\r
+ "sv":this.strings_sv\r
+ },\r
+\r
+ i18n.strings_es[help_text] = i18n.help_es;\r
+ i18n.strings_ca[help_text] = i18n.help_ca;\r
+ i18n.strings_cs[help_text] = i18n.help_cs;\r
+ i18n.strings_nl[help_text] = i18n.help_nl;\r
+ i18n.strings_de[help_text] = i18n.help_de;\r
+ i18n.strings_pl[help_text] = i18n.help_pl;\r
+ i18n.strings_fr[help_text] = i18n.help_fr;\r
+ i18n.strings_hu[help_text] = i18n.help_hu;\r
+ i18n.strings_it[help_text] = i18n.help_it;\r
+ i18n.strings_el[help_text] = i18n.help_el;\r
+ i18n.strings_ja[help_text] = i18n.help_ja;\r
+ i18n.strings_zh[help_text] = i18n.help_zh;\r
+ i18n.strings_ru[help_text] = i18n.help_ru;\r
+ i18n.strings_sv[help_text] = i18n.help_sv;\r
+\r
+ w3c_slidy.lang = document.body.parentNode.getAttribute("lang");\r
+\r
+ if (!w3c_slidy.lang)\r
+ w3c_slidy.lang = document.body.parentNode.getAttribute("xml:lang");\r
+\r
+ if (!w3c_slidy.lang)\r
+ w3c_slidy.lang = "en";\r
+ }\r
+};\r
+\r
+// hack for back button behavior\r
+if (w3c_slidy.ie6 || w3c_slidy.ie7)\r
+{\r
+ document.write("<iframe id='historyFrame' " +\r
+ "src='javascript:\"<html"+"></"+"html>\"' " +\r
+ "height='1' width='1' " +\r
+ "style='position:absolute;left:-800px'></iframe>");\r
+}\r
+\r
+// attach event listeners for initialization\r
+w3c_slidy.set_up();\r
+\r
+// hide the slides as soon as body element is available\r
+// to reduce annoying screen mess before the onload event\r
+setTimeout(w3c_slidy.hide_slides, 50);\r
+\r
+/*]]>*/\r
+</script>\r
+<script type="text/javascript">\r
+/*<![CDATA[*/\r
+/*\r
+LaTeXMathML.js\r
+==============\r
+\r
+This file, in this form, is due to Douglas Woodall, June 2006.\r
+It contains JavaScript functions to convert (most simple) LaTeX\r
+math notation to Presentation MathML. It was obtained by\r
+downloading the file ASCIIMathML.js from\r
+ http://www1.chapman.edu/~jipsen/mathml/asciimathdownload/\r
+and modifying it so that it carries out ONLY those conversions\r
+that would be carried out in LaTeX. A description of the original\r
+file, with examples, can be found at\r
+ www1.chapman.edu/~jipsen/mathml/asciimath.html\r
+ ASCIIMathML: Math on the web for everyone\r
+\r
+Here is the header notice from the original file:\r
+\r
+ASCIIMathML.js\r
+==============\r
+This file contains JavaScript functions to convert ASCII math notation\r
+to Presentation MathML. The conversion is done while the (X)HTML page\r
+loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet\r
+Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/).\r
+Just add the next line to your (X)HTML page with this file in the same folder:\r
+(script type="text/javascript" src="ASCIIMathML.js")(/script)\r
+This is a convenient and inexpensive solution for authoring MathML.\r
+\r
+Version 1.4.7 Dec 15, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen\r
+Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js\r
+For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt\r
+If you use it on a webpage, please send the URL to jipsen@chapman.edu\r
+\r
+This program is free software; you can redistribute it and/or modify\r
+it under the terms of the GNU General Public License as published by\r
+the Free Software Foundation; either version 2 of the License, or (at\r
+your option) any later version.\r
+\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+General Public License (at http://www.gnu.org/copyleft/gpl.html)\r
+for more details.\r
+\r
+LaTeXMathML.js (ctd)\r
+==============\r
+\r
+The instructions for use are the same as for the original\r
+ASCIIMathML.js, except that of course the line you add to your\r
+file should be\r
+(script type="text/javascript" src="LaTeXMathML.js")(/script)\r
+Or use absolute path names if the file is not in the same folder\r
+as your (X)HTML page.\r
+*/\r
+\r
+var checkForMathML = true; // check if browser can display MathML\r
+var notifyIfNoMathML = true; // display note if no MathML capability\r
+var alertIfNoMathML = false; // show alert box if no MathML capability\r
+// was "red":\r
+var mathcolor = ""; // change it to "" (to inherit) or any other color\r
+// was "serif":\r
+var mathfontfamily = ""; // change to "" to inherit (works in IE)\r
+ // or another family (e.g. "arial")\r
+var showasciiformulaonhover = true; // helps students learn ASCIIMath\r
+/*\r
+// Commented out by DRW -- not now used -- see DELIMITERS (twice) near the end\r
+var displaystyle = false; // puts limits above and below large operators\r
+var decimalsign = "."; // change to "," if you like, beware of `(1,2)`!\r
+var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters\r
+var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$";\r
+var doubleblankmathdelimiter = false; // if true, x+1 is equal to `x+1`\r
+ // for IE this works only in <!-- -->\r
+//var separatetokens;// has been removed (email me if this is a problem)\r
+*/\r
+var isIE = document.createElementNS==null;\r
+\r
+if (document.getElementById==null)\r
+ alert("This webpage requires a recent browser such as \nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer")\r
+\r
+// all further global variables start with "AM"\r
+\r
+function AMcreateElementXHTML(t) {\r
+ if (isIE) return document.createElement(t);\r
+ else return document.createElementNS("http://www.w3.org/1999/xhtml",t);\r
+}\r
+\r
+function AMnoMathMLNote() {\r
+ var nd = AMcreateElementXHTML("h3");\r
+ nd.setAttribute("align","center")\r
+ nd.appendChild(AMcreateElementXHTML("p"));\r
+ nd.appendChild(document.createTextNode("To view the "));\r
+ var an = AMcreateElementXHTML("a");\r
+ an.appendChild(document.createTextNode("LaTeXMathML"));\r
+ an.setAttribute("href","http://www.maths.nott.ac.uk/personal/drw/lm.html");\r
+ nd.appendChild(an);\r
+ nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+"));\r
+ an = AMcreateElementXHTML("a");\r
+ an.appendChild(document.createTextNode("MathPlayer"));\r
+ an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm");\r
+ nd.appendChild(an);\r
+ nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox"));\r
+ nd.appendChild(AMcreateElementXHTML("p"));\r
+ return nd;\r
+}\r
+\r
+function AMisMathMLavailable() {\r
+ if (navigator.appName.slice(0,8)=="Netscape")\r
+ if (navigator.appVersion.slice(0,1)>="5") return null;\r
+ else return AMnoMathMLNote();\r
+ else if (navigator.appName.slice(0,9)=="Microsoft")\r
+ try {\r
+ var ActiveX = new ActiveXObject("MathPlayer.Factory.1");\r
+ return null;\r
+ } catch (e) {\r
+ return AMnoMathMLNote();\r
+ }\r
+ else return AMnoMathMLNote();\r
+}\r
+\r
+// character lists for Mozilla/Netscape fonts\r
+var AMcal = ["\uD835\uDC9C", "\uD835\uDC9D", "\uD835\uDC9E", "\uD835\uDC9F", "\uD835\uDCA0", "\uD835\uDCA1", "\uD835\uDCA2", "\uD835\uDCA3", "\uD835\uDCA4", "\uD835\uDCA5", "\uD835\uDCA6", "\uD835\uDCA7", "\uD835\uDCA8", "\uD835\uDCA9", "\uD835\uDCAA", "\uD835\uDCAB", "\uD835\uDCAC", "\uD835\uDCAD", "\uD835\uDCAE", "\uD835\uDCAF", "\uD835\uDCB0", "\uD835\uDCB1", "\uD835\uDCB2", "\uD835\uDCB3", "\uD835\uDCB4", "\uD835\uDCB5"];\r
+var AMfrk = ["\uD835\uDD04", "\uD835\uDD05", "\uD835\uDD06", "\uD835\uDD07", "\uD835\uDD08", "\uD835\uDD09", "\uD835\uDD0A", "\uD835\uDD0B", "\uD835\uDD0C", "\uD835\uDD0D", "\uD835\uDD0E", "\uD835\uDD0F", "\uD835\uDD10", "\uD835\uDD11", "\uD835\uDD12", "\uD835\uDD13", "\uD835\uDD14", "\uD835\uDD15", "\uD835\uDD16", "\uD835\uDD17", "\uD835\uDD18", "\uD835\uDD19", "\uD835\uDD1A", "\uD835\uDD1B", "\uD835\uDD1C", "\uD835\uDD1D"];\r
+var AMbbb = ["\uD835\uDD38", "\uD835\uDD39", "\uD835\uDD3A", "\uD835\uDD3B", "\uD835\uDD3C", "\uD835\uDD3D", "\uD835\uDD3E", "\uD835\uDD3F", "\uD835\uDD40", "\uD835\uDD41", "\uD835\uDD42", "\uD835\uDD43", "\uD835\uDD44", "\uD835\uDD45", "\uD835\uDD46", "\uD835\uDD47", "\uD835\uDD48", "\uD835\uDD49", "\uD835\uDD4A", "\uD835\uDD4B", "\uD835\uDD4C", "\uD835\uDD4D", "\uD835\uDD4E", "\uD835\uDD4F", "\uD835\uDD50", "\uD835\uDD51"];\r
+\r
+var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,\r
+ RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,\r
+ TEXT = 9, BIG = 10, LONG = 11, STRETCHY = 12, MATRIX = 13; // token types\r
+\r
+var AMsqrt = {input:"\\sqrt", tag:"msqrt", output:"sqrt", ttype:UNARY},\r
+ AMnot = {input:"\\not", tag:"mnot", output:"not", ttype:UNARY},\r
+ AMroot = {input:"\\root", tag:"mroot", output:"root", ttype:BINARY},\r
+ AMfrac = {input:"\\frac", tag:"mfrac", output:"/", ttype:BINARY},\r
+ AMover = {input:"\\stackrel", tag:"mover", output:"stackrel", ttype:BINARY},\r
+ AMatop = {input:"\\atop", tag:"mfrac", output:"", ttype:INFIX},\r
+ AMchoose = {input:"\\choose", tag:"mfrac", output:"", ttype:INFIX},\r
+ AMsub = {input:"_", tag:"msub", output:"_", ttype:INFIX},\r
+ AMsup = {input:"^", tag:"msup", output:"^", ttype:INFIX},\r
+ AMtext = {input:"\\mathrm", tag:"mtext", output:"text", ttype:TEXT},\r
+ AMmbox = {input:"\\mbox", tag:"mtext", output:"mbox", ttype:TEXT};\r
+\r
+// Commented out by DRW to prevent 1/2 turning into a 2-line fraction\r
+// AMdiv = {input:"/", tag:"mfrac", output:"/", ttype:INFIX},\r
+// Commented out by DRW so that " prints literally in equations\r
+// AMquote = {input:"\"", tag:"mtext", output:"mbox", ttype:TEXT};\r
+\r
+// List of negations obtained from http://frodo.elon.edu/tutorial/tutorial.pdf\r
+var AMRelationNegations = {\r
+ "\u003C":"\u226E", "\u003E":"\u226F", "\u2264":"\u2270", "\u2265":"\u2271",\r
+ "\u003D":"\u2260", "\u2261":"\u2262", "\u227A":"\u2280", "\u227B":"\u2281",\r
+ "\u227C":"\u22E0", "\u227D":"\u22E1", "\u223C":"\u2241", "\u2243":"\u2244",\r
+ "\u2282":"\u2284", "\u2283":"\u2285", "\u2286":"\u2288", "\u2287":"\u2289",\r
+ "\u2248":"\u2249", "\u2245":"\u2247", "\u2291":"\u22E2", "\u2292":"\u22E3",\r
+ "\u224D":"\u226D"\r
+}\r
+\r
+var AMsymbols = [\r
+//Greek letters\r
+{input:"\\alpha", tag:"mi", output:"\u03B1", ttype:CONST},\r
+{input:"\\beta", tag:"mi", output:"\u03B2", ttype:CONST},\r
+{input:"\\gamma", tag:"mi", output:"\u03B3", ttype:CONST},\r
+{input:"\\delta", tag:"mi", output:"\u03B4", ttype:CONST},\r
+{input:"\\epsilon", tag:"mi", output:"\u03B5", ttype:CONST},\r
+{input:"\\varepsilon", tag:"mi", output:"\u025B", ttype:CONST},\r
+{input:"\\zeta", tag:"mi", output:"\u03B6", ttype:CONST},\r
+{input:"\\eta", tag:"mi", output:"\u03B7", ttype:CONST},\r
+{input:"\\theta", tag:"mi", output:"\u03B8", ttype:CONST},\r
+{input:"\\vartheta", tag:"mi", output:"\u03D1", ttype:CONST},\r
+{input:"\\iota", tag:"mi", output:"\u03B9", ttype:CONST},\r
+{input:"\\kappa", tag:"mi", output:"\u03BA", ttype:CONST},\r
+{input:"\\lambda", tag:"mi", output:"\u03BB", ttype:CONST},\r
+{input:"\\mu", tag:"mi", output:"\u03BC", ttype:CONST},\r
+{input:"\\nu", tag:"mi", output:"\u03BD", ttype:CONST},\r
+{input:"\\xi", tag:"mi", output:"\u03BE", ttype:CONST},\r
+{input:"\\pi", tag:"mi", output:"\u03C0", ttype:CONST},\r
+{input:"\\varpi", tag:"mi", output:"\u03D6", ttype:CONST},\r
+{input:"\\rho", tag:"mi", output:"\u03C1", ttype:CONST},\r
+{input:"\\varrho", tag:"mi", output:"\u03F1", ttype:CONST},\r
+{input:"\\varsigma", tag:"mi", output:"\u03C2", ttype:CONST},\r
+{input:"\\sigma", tag:"mi", output:"\u03C3", ttype:CONST},\r
+{input:"\\tau", tag:"mi", output:"\u03C4", ttype:CONST},\r
+{input:"\\upsilon", tag:"mi", output:"\u03C5", ttype:CONST},\r
+{input:"\\phi", tag:"mi", output:"\u03C6", ttype:CONST},\r
+{input:"\\varphi", tag:"mi", output:"\u03D5", ttype:CONST},\r
+{input:"\\chi", tag:"mi", output:"\u03C7", ttype:CONST},\r
+{input:"\\psi", tag:"mi", output:"\u03C8", ttype:CONST},\r
+{input:"\\omega", tag:"mi", output:"\u03C9", ttype:CONST},\r
+{input:"\\Gamma", tag:"mo", output:"\u0393", ttype:CONST},\r
+{input:"\\Delta", tag:"mo", output:"\u0394", ttype:CONST},\r
+{input:"\\Theta", tag:"mo", output:"\u0398", ttype:CONST},\r
+{input:"\\Lambda", tag:"mo", output:"\u039B", ttype:CONST},\r
+{input:"\\Xi", tag:"mo", output:"\u039E", ttype:CONST},\r
+{input:"\\Pi", tag:"mo", output:"\u03A0", ttype:CONST},\r
+{input:"\\Sigma", tag:"mo", output:"\u03A3", ttype:CONST},\r
+{input:"\\Upsilon", tag:"mo", output:"\u03A5", ttype:CONST},\r
+{input:"\\Phi", tag:"mo", output:"\u03A6", ttype:CONST},\r
+{input:"\\Psi", tag:"mo", output:"\u03A8", ttype:CONST},\r
+{input:"\\Omega", tag:"mo", output:"\u03A9", ttype:CONST},\r
+\r
+//fractions\r
+{input:"\\frac12", tag:"mo", output:"\u00BD", ttype:CONST},\r
+{input:"\\frac14", tag:"mo", output:"\u00BC", ttype:CONST},\r
+{input:"\\frac34", tag:"mo", output:"\u00BE", ttype:CONST},\r
+{input:"\\frac13", tag:"mo", output:"\u2153", ttype:CONST},\r
+{input:"\\frac23", tag:"mo", output:"\u2154", ttype:CONST},\r
+{input:"\\frac15", tag:"mo", output:"\u2155", ttype:CONST},\r
+{input:"\\frac25", tag:"mo", output:"\u2156", ttype:CONST},\r
+{input:"\\frac35", tag:"mo", output:"\u2157", ttype:CONST},\r
+{input:"\\frac45", tag:"mo", output:"\u2158", ttype:CONST},\r
+{input:"\\frac16", tag:"mo", output:"\u2159", ttype:CONST},\r
+{input:"\\frac56", tag:"mo", output:"\u215A", ttype:CONST},\r
+{input:"\\frac18", tag:"mo", output:"\u215B", ttype:CONST},\r
+{input:"\\frac38", tag:"mo", output:"\u215C", ttype:CONST},\r
+{input:"\\frac58", tag:"mo", output:"\u215D", ttype:CONST},\r
+{input:"\\frac78", tag:"mo", output:"\u215E", ttype:CONST},\r
+\r
+//binary operation symbols\r
+{input:"\\pm", tag:"mo", output:"\u00B1", ttype:CONST},\r
+{input:"\\mp", tag:"mo", output:"\u2213", ttype:CONST},\r
+{input:"\\triangleleft",tag:"mo", output:"\u22B2", ttype:CONST},\r
+{input:"\\triangleright",tag:"mo",output:"\u22B3", ttype:CONST},\r
+{input:"\\cdot", tag:"mo", output:"\u22C5", ttype:CONST},\r
+{input:"\\star", tag:"mo", output:"\u22C6", ttype:CONST},\r
+{input:"\\ast", tag:"mo", output:"\u002A", ttype:CONST},\r
+{input:"\\times", tag:"mo", output:"\u00D7", ttype:CONST},\r
+{input:"\\div", tag:"mo", output:"\u00F7", ttype:CONST},\r
+{input:"\\circ", tag:"mo", output:"\u2218", ttype:CONST},\r
+//{input:"\\bullet", tag:"mo", output:"\u2219", ttype:CONST},\r
+{input:"\\bullet", tag:"mo", output:"\u2022", ttype:CONST},\r
+{input:"\\oplus", tag:"mo", output:"\u2295", ttype:CONST},\r
+{input:"\\ominus", tag:"mo", output:"\u2296", ttype:CONST},\r
+{input:"\\otimes", tag:"mo", output:"\u2297", ttype:CONST},\r
+{input:"\\bigcirc", tag:"mo", output:"\u25CB", ttype:CONST},\r
+{input:"\\oslash", tag:"mo", output:"\u2298", ttype:CONST},\r
+{input:"\\odot", tag:"mo", output:"\u2299", ttype:CONST},\r
+{input:"\\land", tag:"mo", output:"\u2227", ttype:CONST},\r
+{input:"\\wedge", tag:"mo", output:"\u2227", ttype:CONST},\r
+{input:"\\lor", tag:"mo", output:"\u2228", ttype:CONST},\r
+{input:"\\vee", tag:"mo", output:"\u2228", ttype:CONST},\r
+{input:"\\cap", tag:"mo", output:"\u2229", ttype:CONST},\r
+{input:"\\cup", tag:"mo", output:"\u222A", ttype:CONST},\r
+{input:"\\sqcap", tag:"mo", output:"\u2293", ttype:CONST},\r
+{input:"\\sqcup", tag:"mo", output:"\u2294", ttype:CONST},\r
+{input:"\\uplus", tag:"mo", output:"\u228E", ttype:CONST},\r
+{input:"\\amalg", tag:"mo", output:"\u2210", ttype:CONST},\r
+{input:"\\bigtriangleup",tag:"mo",output:"\u25B3", ttype:CONST},\r
+{input:"\\bigtriangledown",tag:"mo",output:"\u25BD", ttype:CONST},\r
+{input:"\\dag", tag:"mo", output:"\u2020", ttype:CONST},\r
+{input:"\\dagger", tag:"mo", output:"\u2020", ttype:CONST},\r
+{input:"\\ddag", tag:"mo", output:"\u2021", ttype:CONST},\r
+{input:"\\ddagger", tag:"mo", output:"\u2021", ttype:CONST},\r
+{input:"\\lhd", tag:"mo", output:"\u22B2", ttype:CONST},\r
+{input:"\\rhd", tag:"mo", output:"\u22B3", ttype:CONST},\r
+{input:"\\unlhd", tag:"mo", output:"\u22B4", ttype:CONST},\r
+{input:"\\unrhd", tag:"mo", output:"\u22B5", ttype:CONST},\r
+\r
+\r
+//BIG Operators\r
+{input:"\\sum", tag:"mo", output:"\u2211", ttype:UNDEROVER},\r
+{input:"\\prod", tag:"mo", output:"\u220F", ttype:UNDEROVER},\r
+{input:"\\bigcap", tag:"mo", output:"\u22C2", ttype:UNDEROVER},\r
+{input:"\\bigcup", tag:"mo", output:"\u22C3", ttype:UNDEROVER},\r
+{input:"\\bigwedge", tag:"mo", output:"\u22C0", ttype:UNDEROVER},\r
+{input:"\\bigvee", tag:"mo", output:"\u22C1", ttype:UNDEROVER},\r
+{input:"\\bigsqcap", tag:"mo", output:"\u2A05", ttype:UNDEROVER},\r
+{input:"\\bigsqcup", tag:"mo", output:"\u2A06", ttype:UNDEROVER},\r
+{input:"\\coprod", tag:"mo", output:"\u2210", ttype:UNDEROVER},\r
+{input:"\\bigoplus", tag:"mo", output:"\u2A01", ttype:UNDEROVER},\r
+{input:"\\bigotimes", tag:"mo", output:"\u2A02", ttype:UNDEROVER},\r
+{input:"\\bigodot", tag:"mo", output:"\u2A00", ttype:UNDEROVER},\r
+{input:"\\biguplus", tag:"mo", output:"\u2A04", ttype:UNDEROVER},\r
+{input:"\\int", tag:"mo", output:"\u222B", ttype:CONST},\r
+{input:"\\oint", tag:"mo", output:"\u222E", ttype:CONST},\r
+\r
+//binary relation symbols\r
+{input:":=", tag:"mo", output:":=", ttype:CONST},\r
+{input:"\\lt", tag:"mo", output:"<", ttype:CONST},\r
+{input:"\\gt", tag:"mo", output:">", ttype:CONST},\r
+{input:"\\ne", tag:"mo", output:"\u2260", ttype:CONST},\r
+{input:"\\neq", tag:"mo", output:"\u2260", ttype:CONST},\r
+{input:"\\le", tag:"mo", output:"\u2264", ttype:CONST},\r
+{input:"\\leq", tag:"mo", output:"\u2264", ttype:CONST},\r
+{input:"\\leqslant", tag:"mo", output:"\u2264", ttype:CONST},\r
+{input:"\\ge", tag:"mo", output:"\u2265", ttype:CONST},\r
+{input:"\\geq", tag:"mo", output:"\u2265", ttype:CONST},\r
+{input:"\\geqslant", tag:"mo", output:"\u2265", ttype:CONST},\r
+{input:"\\equiv", tag:"mo", output:"\u2261", ttype:CONST},\r
+{input:"\\ll", tag:"mo", output:"\u226A", ttype:CONST},\r
+{input:"\\gg", tag:"mo", output:"\u226B", ttype:CONST},\r
+{input:"\\doteq", tag:"mo", output:"\u2250", ttype:CONST},\r
+{input:"\\prec", tag:"mo", output:"\u227A", ttype:CONST},\r
+{input:"\\succ", tag:"mo", output:"\u227B", ttype:CONST},\r
+{input:"\\preceq", tag:"mo", output:"\u227C", ttype:CONST},\r
+{input:"\\succeq", tag:"mo", output:"\u227D", ttype:CONST},\r
+{input:"\\subset", tag:"mo", output:"\u2282", ttype:CONST},\r
+{input:"\\supset", tag:"mo", output:"\u2283", ttype:CONST},\r
+{input:"\\subseteq", tag:"mo", output:"\u2286", ttype:CONST},\r
+{input:"\\supseteq", tag:"mo", output:"\u2287", ttype:CONST},\r
+{input:"\\subsetneq", tag:"mo", output:"\u228A", ttype:CONST},\r
+{input:"\\supsetneq", tag:"mo", output:"\u228B", ttype:CONST},\r
+{input:"\\sqsubset", tag:"mo", output:"\u228F", ttype:CONST},\r
+{input:"\\sqsupset", tag:"mo", output:"\u2290", ttype:CONST},\r
+{input:"\\sqsubseteq", tag:"mo", output:"\u2291", ttype:CONST},\r
+{input:"\\sqsupseteq", tag:"mo", output:"\u2292", ttype:CONST},\r
+{input:"\\sim", tag:"mo", output:"\u223C", ttype:CONST},\r
+{input:"\\simeq", tag:"mo", output:"\u2243", ttype:CONST},\r
+{input:"\\approx", tag:"mo", output:"\u2248", ttype:CONST},\r
+{input:"\\cong", tag:"mo", output:"\u2245", ttype:CONST},\r
+{input:"\\Join", tag:"mo", output:"\u22C8", ttype:CONST},\r
+{input:"\\bowtie", tag:"mo", output:"\u22C8", ttype:CONST},\r
+{input:"\\in", tag:"mo", output:"\u2208", ttype:CONST},\r
+{input:"\\ni", tag:"mo", output:"\u220B", ttype:CONST},\r
+{input:"\\owns", tag:"mo", output:"\u220B", ttype:CONST},\r
+{input:"\\propto", tag:"mo", output:"\u221D", ttype:CONST},\r
+{input:"\\vdash", tag:"mo", output:"\u22A2", ttype:CONST},\r
+{input:"\\dashv", tag:"mo", output:"\u22A3", ttype:CONST},\r
+{input:"\\models", tag:"mo", output:"\u22A8", ttype:CONST},\r
+{input:"\\perp", tag:"mo", output:"\u22A5", ttype:CONST},\r
+{input:"\\smile", tag:"mo", output:"\u2323", ttype:CONST},\r
+{input:"\\frown", tag:"mo", output:"\u2322", ttype:CONST},\r
+{input:"\\asymp", tag:"mo", output:"\u224D", ttype:CONST},\r
+{input:"\\notin", tag:"mo", output:"\u2209", ttype:CONST},\r
+\r
+//matrices\r
+{input:"\\begin{eqnarray}", output:"X", ttype:MATRIX, invisible:true},\r
+{input:"\\begin{array}", output:"X", ttype:MATRIX, invisible:true},\r
+{input:"\\\\", output:"}&{", ttype:DEFINITION},\r
+{input:"\\end{eqnarray}", output:"}}", ttype:DEFINITION},\r
+{input:"\\end{array}", output:"}}", ttype:DEFINITION},\r
+\r
+//grouping and literal brackets -- ieval is for IE\r
+{input:"\\big", tag:"mo", output:"X", atval:"1.2", ieval:"2.2", ttype:BIG},\r
+{input:"\\Big", tag:"mo", output:"X", atval:"1.6", ieval:"2.6", ttype:BIG},\r
+{input:"\\bigg", tag:"mo", output:"X", atval:"2.2", ieval:"3.2", ttype:BIG},\r
+{input:"\\Bigg", tag:"mo", output:"X", atval:"2.9", ieval:"3.9", ttype:BIG},\r
+{input:"\\left", tag:"mo", output:"X", ttype:LEFTBRACKET},\r
+{input:"\\right", tag:"mo", output:"X", ttype:RIGHTBRACKET},\r
+{input:"{", output:"{", ttype:LEFTBRACKET, invisible:true},\r
+{input:"}", output:"}", ttype:RIGHTBRACKET, invisible:true},\r
+\r
+{input:"(", tag:"mo", output:"(", atval:"1", ttype:STRETCHY},\r
+{input:"[", tag:"mo", output:"[", atval:"1", ttype:STRETCHY},\r
+{input:"\\lbrack", tag:"mo", output:"[", atval:"1", ttype:STRETCHY},\r
+{input:"\\{", tag:"mo", output:"{", atval:"1", ttype:STRETCHY},\r
+{input:"\\lbrace", tag:"mo", output:"{", atval:"1", ttype:STRETCHY},\r
+{input:"\\langle", tag:"mo", output:"\u2329", atval:"1", ttype:STRETCHY},\r
+{input:"\\lfloor", tag:"mo", output:"\u230A", atval:"1", ttype:STRETCHY},\r
+{input:"\\lceil", tag:"mo", output:"\u2308", atval:"1", ttype:STRETCHY},\r
+\r
+// rtag:"mi" causes space to be inserted before a following sin, cos, etc.\r
+// (see function AMparseExpr() )\r
+{input:")", tag:"mo",output:")", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"]", tag:"mo",output:"]", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rbrack",tag:"mo",output:"]", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\}", tag:"mo",output:"}", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rbrace",tag:"mo",output:"}", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rangle",tag:"mo",output:"\u232A", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rfloor",tag:"mo",output:"\u230B", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rceil", tag:"mo",output:"\u2309", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+\r
+// "|", "\\|", "\\vert" and "\\Vert" modified later: lspace = rspace = 0em\r
+{input:"|", tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
+{input:"\\|", tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
+{input:"\\vert", tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
+{input:"\\Vert", tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
+{input:"\\mid", tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
+{input:"\\parallel", tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
+{input:"/", tag:"mo", output:"/", atval:"1.01", ttype:STRETCHY},\r
+{input:"\\backslash", tag:"mo", output:"\u2216", atval:"1", ttype:STRETCHY},\r
+{input:"\\setminus", tag:"mo", output:"\\", ttype:CONST},\r
+\r
+//miscellaneous symbols\r
+{input:"\\!", tag:"mspace", atname:"width", atval:"-0.167em", ttype:SPACE},\r
+{input:"\\,", tag:"mspace", atname:"width", atval:"0.167em", ttype:SPACE},\r
+{input:"\\>", tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},\r
+{input:"\\:", tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},\r
+{input:"\\;", tag:"mspace", atname:"width", atval:"0.278em", ttype:SPACE},\r
+{input:"~", tag:"mspace", atname:"width", atval:"0.333em", ttype:SPACE},\r
+{input:"\\quad", tag:"mspace", atname:"width", atval:"1em", ttype:SPACE},\r
+{input:"\\qquad", tag:"mspace", atname:"width", atval:"2em", ttype:SPACE},\r
+//{input:"{}", tag:"mo", output:"\u200B", ttype:CONST}, // zero-width\r
+{input:"\\prime", tag:"mo", output:"\u2032", ttype:CONST},\r
+{input:"'", tag:"mo", output:"\u02B9", ttype:CONST},\r
+{input:"''", tag:"mo", output:"\u02BA", ttype:CONST},\r
+{input:"'''", tag:"mo", output:"\u2034", ttype:CONST},\r
+{input:"''''", tag:"mo", output:"\u2057", ttype:CONST},\r
+{input:"\\ldots", tag:"mo", output:"\u2026", ttype:CONST},\r
+{input:"\\cdots", tag:"mo", output:"\u22EF", ttype:CONST},\r
+{input:"\\vdots", tag:"mo", output:"\u22EE", ttype:CONST},\r
+{input:"\\ddots", tag:"mo", output:"\u22F1", ttype:CONST},\r
+{input:"\\forall", tag:"mo", output:"\u2200", ttype:CONST},\r
+{input:"\\exists", tag:"mo", output:"\u2203", ttype:CONST},\r
+{input:"\\Re", tag:"mo", output:"\u211C", ttype:CONST},\r
+{input:"\\Im", tag:"mo", output:"\u2111", ttype:CONST},\r
+{input:"\\aleph", tag:"mo", output:"\u2135", ttype:CONST},\r
+{input:"\\hbar", tag:"mo", output:"\u210F", ttype:CONST},\r
+{input:"\\ell", tag:"mo", output:"\u2113", ttype:CONST},\r
+{input:"\\wp", tag:"mo", output:"\u2118", ttype:CONST},\r
+{input:"\\emptyset", tag:"mo", output:"\u2205", ttype:CONST},\r
+{input:"\\infty", tag:"mo", output:"\u221E", ttype:CONST},\r
+{input:"\\surd", tag:"mo", output:"\\sqrt{}", ttype:DEFINITION},\r
+{input:"\\partial", tag:"mo", output:"\u2202", ttype:CONST},\r
+{input:"\\nabla", tag:"mo", output:"\u2207", ttype:CONST},\r
+{input:"\\triangle", tag:"mo", output:"\u25B3", ttype:CONST},\r
+{input:"\\therefore", tag:"mo", output:"\u2234", ttype:CONST},\r
+{input:"\\angle", tag:"mo", output:"\u2220", ttype:CONST},\r
+//{input:"\\\\ ", tag:"mo", output:"\u00A0", ttype:CONST},\r
+{input:"\\diamond", tag:"mo", output:"\u22C4", ttype:CONST},\r
+//{input:"\\Diamond", tag:"mo", output:"\u25CA", ttype:CONST},\r
+{input:"\\Diamond", tag:"mo", output:"\u25C7", ttype:CONST},\r
+{input:"\\neg", tag:"mo", output:"\u00AC", ttype:CONST},\r
+{input:"\\lnot", tag:"mo", output:"\u00AC", ttype:CONST},\r
+{input:"\\bot", tag:"mo", output:"\u22A5", ttype:CONST},\r
+{input:"\\top", tag:"mo", output:"\u22A4", ttype:CONST},\r
+{input:"\\square", tag:"mo", output:"\u25AB", ttype:CONST},\r
+{input:"\\Box", tag:"mo", output:"\u25A1", ttype:CONST},\r
+{input:"\\wr", tag:"mo", output:"\u2240", ttype:CONST},\r
+\r
+//standard functions\r
+//Note UNDEROVER *must* have tag:"mo" to work properly\r
+{input:"\\arccos", tag:"mi", output:"arccos", ttype:UNARY, func:true},\r
+{input:"\\arcsin", tag:"mi", output:"arcsin", ttype:UNARY, func:true},\r
+{input:"\\arctan", tag:"mi", output:"arctan", ttype:UNARY, func:true},\r
+{input:"\\arg", tag:"mi", output:"arg", ttype:UNARY, func:true},\r
+{input:"\\cos", tag:"mi", output:"cos", ttype:UNARY, func:true},\r
+{input:"\\cosh", tag:"mi", output:"cosh", ttype:UNARY, func:true},\r
+{input:"\\cot", tag:"mi", output:"cot", ttype:UNARY, func:true},\r
+{input:"\\coth", tag:"mi", output:"coth", ttype:UNARY, func:true},\r
+{input:"\\csc", tag:"mi", output:"csc", ttype:UNARY, func:true},\r
+{input:"\\deg", tag:"mi", output:"deg", ttype:UNARY, func:true},\r
+{input:"\\det", tag:"mi", output:"det", ttype:UNARY, func:true},\r
+{input:"\\dim", tag:"mi", output:"dim", ttype:UNARY, func:true}, //CONST?\r
+{input:"\\exp", tag:"mi", output:"exp", ttype:UNARY, func:true},\r
+{input:"\\gcd", tag:"mi", output:"gcd", ttype:UNARY, func:true}, //CONST?\r
+{input:"\\hom", tag:"mi", output:"hom", ttype:UNARY, func:true},\r
+{input:"\\inf", tag:"mo", output:"inf", ttype:UNDEROVER},\r
+{input:"\\ker", tag:"mi", output:"ker", ttype:UNARY, func:true},\r
+{input:"\\lg", tag:"mi", output:"lg", ttype:UNARY, func:true},\r
+{input:"\\lim", tag:"mo", output:"lim", ttype:UNDEROVER},\r
+{input:"\\liminf", tag:"mo", output:"liminf", ttype:UNDEROVER},\r
+{input:"\\limsup", tag:"mo", output:"limsup", ttype:UNDEROVER},\r
+{input:"\\ln", tag:"mi", output:"ln", ttype:UNARY, func:true},\r
+{input:"\\log", tag:"mi", output:"log", ttype:UNARY, func:true},\r
+{input:"\\max", tag:"mo", output:"max", ttype:UNDEROVER},\r
+{input:"\\min", tag:"mo", output:"min", ttype:UNDEROVER},\r
+{input:"\\Pr", tag:"mi", output:"Pr", ttype:UNARY, func:true},\r
+{input:"\\sec", tag:"mi", output:"sec", ttype:UNARY, func:true},\r
+{input:"\\sin", tag:"mi", output:"sin", ttype:UNARY, func:true},\r
+{input:"\\sinh", tag:"mi", output:"sinh", ttype:UNARY, func:true},\r
+{input:"\\sup", tag:"mo", output:"sup", ttype:UNDEROVER},\r
+{input:"\\tan", tag:"mi", output:"tan", ttype:UNARY, func:true},\r
+{input:"\\tanh", tag:"mi", output:"tanh", ttype:UNARY, func:true},\r
+\r
+//arrows\r
+{input:"\\gets", tag:"mo", output:"\u2190", ttype:CONST},\r
+{input:"\\leftarrow", tag:"mo", output:"\u2190", ttype:CONST},\r
+{input:"\\to", tag:"mo", output:"\u2192", ttype:CONST},\r
+{input:"\\rightarrow", tag:"mo", output:"\u2192", ttype:CONST},\r
+{input:"\\leftrightarrow", tag:"mo", output:"\u2194", ttype:CONST},\r
+{input:"\\uparrow", tag:"mo", output:"\u2191", ttype:CONST},\r
+{input:"\\downarrow", tag:"mo", output:"\u2193", ttype:CONST},\r
+{input:"\\updownarrow", tag:"mo", output:"\u2195", ttype:CONST},\r
+{input:"\\Leftarrow", tag:"mo", output:"\u21D0", ttype:CONST},\r
+{input:"\\Rightarrow", tag:"mo", output:"\u21D2", ttype:CONST},\r
+{input:"\\Leftrightarrow", tag:"mo", output:"\u21D4", ttype:CONST},\r
+{input:"\\iff", tag:"mo", output:"~\\Longleftrightarrow~", ttype:DEFINITION},\r
+{input:"\\Uparrow", tag:"mo", output:"\u21D1", ttype:CONST},\r
+{input:"\\Downarrow", tag:"mo", output:"\u21D3", ttype:CONST},\r
+{input:"\\Updownarrow", tag:"mo", output:"\u21D5", ttype:CONST},\r
+{input:"\\mapsto", tag:"mo", output:"\u21A6", ttype:CONST},\r
+{input:"\\longleftarrow", tag:"mo", output:"\u2190", ttype:LONG},\r
+{input:"\\longrightarrow", tag:"mo", output:"\u2192", ttype:LONG},\r
+{input:"\\longleftrightarrow", tag:"mo", output:"\u2194", ttype:LONG},\r
+{input:"\\Longleftarrow", tag:"mo", output:"\u21D0", ttype:LONG},\r
+{input:"\\Longrightarrow", tag:"mo", output:"\u21D2", ttype:LONG},\r
+{input:"\\Longleftrightarrow", tag:"mo", output:"\u21D4", ttype:LONG},\r
+{input:"\\longmapsto", tag:"mo", output:"\u21A6", ttype:CONST},\r
+ // disaster if LONG\r
+\r
+//commands with argument\r
+AMsqrt, AMnot, AMroot, AMfrac, AMover, AMsub, AMsup, AMtext, AMmbox, AMatop, AMchoose,\r
+\r
+//AMdiv, AMquote,\r
+\r
+//diacritical marks\r
+{input:"\\acute", tag:"mover", output:"\u00B4", ttype:UNARY, acc:true},\r
+//{input:"\\acute", tag:"mover", output:"\u0317", ttype:UNARY, acc:true},\r
+//{input:"\\acute", tag:"mover", output:"\u0301", ttype:UNARY, acc:true},\r
+//{input:"\\grave", tag:"mover", output:"\u0300", ttype:UNARY, acc:true},\r
+//{input:"\\grave", tag:"mover", output:"\u0316", ttype:UNARY, acc:true},\r
+{input:"\\grave", tag:"mover", output:"\u0060", ttype:UNARY, acc:true},\r
+{input:"\\breve", tag:"mover", output:"\u02D8", ttype:UNARY, acc:true},\r
+{input:"\\check", tag:"mover", output:"\u02C7", ttype:UNARY, acc:true},\r
+{input:"\\dot", tag:"mover", output:".", ttype:UNARY, acc:true},\r
+{input:"\\ddot", tag:"mover", output:"..", ttype:UNARY, acc:true},\r
+//{input:"\\ddot", tag:"mover", output:"\u00A8", ttype:UNARY, acc:true},\r
+{input:"\\mathring", tag:"mover", output:"\u00B0", ttype:UNARY, acc:true},\r
+{input:"\\vec", tag:"mover", output:"\u20D7", ttype:UNARY, acc:true},\r
+{input:"\\overrightarrow",tag:"mover",output:"\u20D7", ttype:UNARY, acc:true},\r
+{input:"\\overleftarrow",tag:"mover", output:"\u20D6", ttype:UNARY, acc:true},\r
+{input:"\\hat", tag:"mover", output:"\u005E", ttype:UNARY, acc:true},\r
+{input:"\\widehat", tag:"mover", output:"\u0302", ttype:UNARY, acc:true},\r
+{input:"\\tilde", tag:"mover", output:"~", ttype:UNARY, acc:true},\r
+//{input:"\\tilde", tag:"mover", output:"\u0303", ttype:UNARY, acc:true},\r
+{input:"\\widetilde", tag:"mover", output:"\u02DC", ttype:UNARY, acc:true},\r
+{input:"\\bar", tag:"mover", output:"\u203E", ttype:UNARY, acc:true},\r
+{input:"\\overbrace", tag:"mover", output:"\uFE37", ttype:UNARY, acc:true}, //Changed unicode overbrace\r
+{input:"\\overbracket", tag:"mover", output:"\u23B4", ttype:UNARY, acc:true}, //old overbrace = overbracket\r
+{input:"\\overline", tag:"mover", output:"\u00AF", ttype:UNARY, acc:true},\r
+{input:"\\underbrace", tag:"munder", output:"\uFE38", ttype:UNARY, acc:true}, //Changed unicode underbrace\r
+{input:"\\underbracket",tag:"munder", output:"\u23B5", ttype:UNARY, acc:true}, //old underbrace = underbracket\r
+{input:"\\underline", tag:"munder", output:"\u00AF", ttype:UNARY, acc:true},\r
+//{input:"underline", tag:"munder", output:"\u0332", ttype:UNARY, acc:true},\r
+\r
+//typestyles and fonts\r
+{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true", ttype:UNARY},\r
+{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false", ttype:UNARY},\r
+{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1", ttype:UNARY},\r
+{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2", ttype:UNARY},\r
+{input:"\\textrm", tag:"mstyle", output:"\\mathrm", ttype: DEFINITION},\r
+{input:"\\mathbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},\r
+{input:"\\textbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},\r
+{input:"\\mathit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},\r
+{input:"\\textit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},\r
+{input:"\\mathtt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},\r
+{input:"\\texttt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},\r
+{input:"\\mathsf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", ttype:UNARY},\r
+{input:"\\mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", ttype:UNARY, codes:AMbbb},\r
+{input:"\\mathcal",tag:"mstyle", atname:"mathvariant", atval:"script", ttype:UNARY, codes:AMcal},\r
+{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant", atval:"fraktur",ttype:UNARY, codes:AMfrk},\r
+{input:"\\textcolor",tag:"mstyle",atname:"mathvariant", atval:"mathcolor", ttype:BINARY},\r
+{input:"\\colorbox",tag:"mstyle",atname:"mathvariant", atval:"background", ttype:BINARY}\r
+];\r
+\r
+function compareNames(s1,s2) {\r
+ if (s1.input > s2.input) return 1\r
+ else return -1;\r
+}\r
+\r
+var AMnames = []; //list of input symbols\r
+\r
+function AMinitSymbols() {\r
+ AMsymbols.sort(compareNames);\r
+ for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;\r
+}\r
+\r
+var AMmathml = "http://www.w3.org/1998/Math/MathML";\r
+\r
+function AMcreateElementMathML(t) {\r
+ if (isIE) return document.createElement("m:"+t);\r
+ else return document.createElementNS(AMmathml,t);\r
+}\r
+\r
+function AMcreateMmlNode(t,frag) {\r
+// var node = AMcreateElementMathML(name);\r
+ if (isIE) var node = document.createElement("m:"+t);\r
+ else var node = document.createElementNS(AMmathml,t);\r
+ node.appendChild(frag);\r
+ return node;\r
+}\r
+\r
+function newcommand(oldstr,newstr) {\r
+ AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,\r
+ ttype:DEFINITION}]);\r
+}\r
+\r
+function AMremoveCharsAndBlanks(str,n) {\r
+//remove n characters and any following blanks\r
+ var st;\r
+ st = str.slice(n);\r
+ for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);\r
+ return st.slice(i);\r
+}\r
+\r
+function AMposition(arr, str, n) {\r
+// return position >=n where str appears or would be inserted\r
+// assumes arr is sorted\r
+ if (n==0) {\r
+ var h,m;\r
+ n = -1;\r
+ h = arr.length;\r
+ while (n+1<h) {\r
+ m = (n+h) >> 1;\r
+ if (arr[m]<str) n = m; else h = m;\r
+ }\r
+ return h;\r
+ } else\r
+ for (var i=n; i<arr.length && arr[i]<str; i++);\r
+ return i; // i=arr.length || arr[i]>=str\r
+}\r
+\r
+function AMgetSymbol(str) {\r
+//return maximal initial substring of str that appears in names\r
+//return null if there is none\r
+ var k = 0; //new pos\r
+ var j = 0; //old pos\r
+ var mk; //match pos\r
+ var st;\r
+ var tagst;\r
+ var match = "";\r
+ var more = true;\r
+ for (var i=1; i<=str.length && more; i++) {\r
+ st = str.slice(0,i); //initial substring of length i\r
+ j = k;\r
+ k = AMposition(AMnames, st, j);\r
+ if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){\r
+ match = AMnames[k];\r
+ mk = k;\r
+ i = match.length;\r
+ }\r
+ more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];\r
+ }\r
+ AMpreviousSymbol=AMcurrentSymbol;\r
+ if (match!=""){\r
+ AMcurrentSymbol=AMsymbols[mk].ttype;\r
+ return AMsymbols[mk];\r
+ }\r
+ AMcurrentSymbol=CONST;\r
+ k = 1;\r
+ st = str.slice(0,1); //take 1 character\r
+ if ("0"<=st && st<="9") tagst = "mn";\r
+ else tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");\r
+/*\r
+// Commented out by DRW (not fully understood, but probably to do with\r
+// use of "/" as an INFIX version of "\\frac", which we don't want):\r
+//}\r
+//if (st=="-" && AMpreviousSymbol==INFIX) {\r
+// AMcurrentSymbol = INFIX; //trick "/" into recognizing "-" on second parse\r
+// return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};\r
+//}\r
+*/\r
+ return {input:st, tag:tagst, output:st, ttype:CONST};\r
+}\r
+\r
+\r
+/*Parsing ASCII math expressions with the following grammar\r
+v ::= [A-Za-z] | greek letters | numbers | other constant symbols\r
+u ::= sqrt | text | bb | other unary symbols for font commands\r
+b ::= frac | root | stackrel binary symbols\r
+l ::= { | \left left brackets\r
+r ::= } | \right right brackets\r
+S ::= v | lEr | uS | bSS Simple expression\r
+I ::= S_S | S^S | S_S^S | S Intermediate expression\r
+E ::= IE | I/I Expression\r
+Each terminal symbol is translated into a corresponding mathml node.*/\r
+\r
+var AMpreviousSymbol,AMcurrentSymbol;\r
+\r
+function AMparseSexpr(str) { //parses str and returns [node,tailstr,(node)tag]\r
+ var symbol, node, result, result2, i, st,// rightvert = false,\r
+ newFrag = document.createDocumentFragment();\r
+ str = AMremoveCharsAndBlanks(str,0);\r
+ symbol = AMgetSymbol(str); //either a token or a bracket or empty\r
+ if (symbol == null || symbol.ttype == RIGHTBRACKET)\r
+ return [null,str,null];\r
+ if (symbol.ttype == DEFINITION) {\r
+ str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ symbol = AMgetSymbol(str);\r
+ if (symbol == null || symbol.ttype == RIGHTBRACKET)\r
+ return [null,str,null];\r
+ }\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ switch (symbol.ttype) {\r
+ case SPACE:\r
+ node = AMcreateElementMathML(symbol.tag);\r
+ node.setAttribute(symbol.atname,symbol.atval);\r
+ return [node,str,symbol.tag];\r
+ case UNDEROVER:\r
+ if (isIE) {\r
+ if (symbol.input.substr(0,4) == "\\big") { // botch for missing symbols\r
+ str = "\\"+symbol.input.substr(4)+str; // make \bigcup = \cup etc.\r
+ symbol = AMgetSymbol(str);\r
+ symbol.ttype = UNDEROVER;\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ }\r
+ }\r
+ return [AMcreateMmlNode(symbol.tag,\r
+ document.createTextNode(symbol.output)),str,symbol.tag];\r
+ case CONST:\r
+ var output = symbol.output;\r
+ if (isIE) {\r
+ if (symbol.input == "'")\r
+ output = "\u2032";\r
+ else if (symbol.input == "''")\r
+ output = "\u2033";\r
+ else if (symbol.input == "'''")\r
+ output = "\u2033\u2032";\r
+ else if (symbol.input == "''''")\r
+ output = "\u2033\u2033";\r
+ else if (symbol.input == "\\square")\r
+ output = "\u25A1"; // same as \Box\r
+ else if (symbol.input.substr(0,5) == "\\frac") {\r
+ // botch for missing fractions\r
+ var denom = symbol.input.substr(6,1);\r
+ if (denom == "5" || denom == "6") {\r
+ str = symbol.input.replace(/\\frac/,"\\frac ")+str;\r
+ return [node,str,symbol.tag];\r
+ }\r
+ }\r
+ }\r
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(output));\r
+ return [node,str,symbol.tag];\r
+ case LONG: // added by DRW\r
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
+ node.setAttribute("minsize","1.5");\r
+ node.setAttribute("maxsize","1.5");\r
+ node = AMcreateMmlNode("mover",node);\r
+ node.appendChild(AMcreateElementMathML("mspace"));\r
+ return [node,str,symbol.tag];\r
+ case STRETCHY: // added by DRW\r
+ if (isIE && symbol.input == "\\backslash")\r
+ symbol.output = "\\"; // doesn't expand, but then nor does "\u2216"\r
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
+ if (symbol.input == "|" || symbol.input == "\\vert" ||\r
+ symbol.input == "\\|" || symbol.input == "\\Vert") {\r
+ node.setAttribute("lspace","0em");\r
+ node.setAttribute("rspace","0em");\r
+ }\r
+ node.setAttribute("maxsize",symbol.atval); // don't allow to stretch here\r
+ if (symbol.rtag != null)\r
+ return [node,str,symbol.rtag];\r
+ else\r
+ return [node,str,symbol.tag];\r
+ case BIG: // added by DRW\r
+ var atval = symbol.atval;\r
+ if (isIE)\r
+ atval = symbol.ieval;\r
+ symbol = AMgetSymbol(str);\r
+ if (symbol == null)\r
+ return [null,str,null];\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
+ if (isIE) { // to get brackets to expand\r
+ var space = AMcreateElementMathML("mspace");\r
+ space.setAttribute("height",atval+"ex");\r
+ node = AMcreateMmlNode("mrow",node);\r
+ node.appendChild(space);\r
+ } else { // ignored in IE\r
+ node.setAttribute("minsize",atval);\r
+ node.setAttribute("maxsize",atval);\r
+ }\r
+ return [node,str,symbol.tag];\r
+ case LEFTBRACKET: //read (expr+)\r
+ if (symbol.input == "\\left") { // left what?\r
+ symbol = AMgetSymbol(str);\r
+ if (symbol != null) {\r
+ if (symbol.input == ".")\r
+ symbol.invisible = true;\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ }\r
+ }\r
+ result = AMparseExpr(str,true,false);\r
+ if (symbol==null ||\r
+ (typeof symbol.invisible == "boolean" && symbol.invisible))\r
+ node = AMcreateMmlNode("mrow",result[0]);\r
+ else {\r
+ node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));\r
+ node = AMcreateMmlNode("mrow",node);\r
+ node.appendChild(result[0]);\r
+ }\r
+ return [node,result[1],result[2]];\r
+ case MATRIX: //read (expr+)\r
+ if (symbol.input == "\\begin{array}") {\r
+ var mask = "";\r
+ symbol = AMgetSymbol(str);\r
+ str = AMremoveCharsAndBlanks(str,0);\r
+ if (symbol == null)\r
+ mask = "l";\r
+ else {\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ if (symbol.input != "{")\r
+ mask = "l";\r
+ else do {\r
+ symbol = AMgetSymbol(str);\r
+ if (symbol != null) {\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ if (symbol.input != "}")\r
+ mask = mask+symbol.input;\r
+ }\r
+ } while (symbol != null && symbol.input != "" && symbol.input != "}");\r
+ }\r
+ result = AMparseExpr("{"+str,true,true);\r
+// if (result[0]==null) return [AMcreateMmlNode("mo",\r
+// document.createTextNode(symbol.input)),str];\r
+ node = AMcreateMmlNode("mtable",result[0]);\r
+ mask = mask.replace(/l/g,"left ");\r
+ mask = mask.replace(/r/g,"right ");\r
+ mask = mask.replace(/c/g,"center ");\r
+ node.setAttribute("columnalign",mask);\r
+ node.setAttribute("displaystyle","false");\r
+ if (isIE)\r
+ return [node,result[1],null];\r
+// trying to get a *little* bit of space around the array\r
+// (IE already includes it)\r
+ var lspace = AMcreateElementMathML("mspace");\r
+ lspace.setAttribute("width","0.167em");\r
+ var rspace = AMcreateElementMathML("mspace");\r
+ rspace.setAttribute("width","0.167em");\r
+ var node1 = AMcreateMmlNode("mrow",lspace);\r
+ node1.appendChild(node);\r
+ node1.appendChild(rspace);\r
+ return [node1,result[1],null];\r
+ } else { // eqnarray\r
+ result = AMparseExpr("{"+str,true,true);\r
+ node = AMcreateMmlNode("mtable",result[0]);\r
+ if (isIE)\r
+ node.setAttribute("columnspacing","0.25em"); // best in practice?\r
+ else\r
+ node.setAttribute("columnspacing","0.167em"); // correct (but ignored?)\r
+ node.setAttribute("columnalign","right center left");\r
+ node.setAttribute("displaystyle","true");\r
+ node = AMcreateMmlNode("mrow",node);\r
+ return [node,result[1],null];\r
+ }\r
+ case TEXT:\r
+ if (str.charAt(0)=="{") i=str.indexOf("}");\r
+ else i = 0;\r
+ if (i==-1)\r
+ i = str.length;\r
+ st = str.slice(1,i);\r
+ if (st.charAt(0) == " ") {\r
+ node = AMcreateElementMathML("mspace");\r
+ node.setAttribute("width","0.33em"); // was 1ex\r
+ newFrag.appendChild(node);\r
+ }\r
+ newFrag.appendChild(\r
+ AMcreateMmlNode(symbol.tag,document.createTextNode(st)));\r
+ if (st.charAt(st.length-1) == " ") {\r
+ node = AMcreateElementMathML("mspace");\r
+ node.setAttribute("width","0.33em"); // was 1ex\r
+ newFrag.appendChild(node);\r
+ }\r
+ str = AMremoveCharsAndBlanks(str,i+1);\r
+ return [AMcreateMmlNode("mrow",newFrag),str,null];\r
+ case UNARY:\r
+ result = AMparseSexpr(str);\r
+ if (result[0]==null) return [AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)),str];\r
+ if (typeof symbol.func == "boolean" && symbol.func) { // functions hack\r
+ st = str.charAt(0);\r
+// if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {\r
+ if (st=="^" || st=="_" || st==",") {\r
+ return [AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)),str,symbol.tag];\r
+ } else {\r
+ node = AMcreateMmlNode("mrow",AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));\r
+ if (isIE) {\r
+ var space = AMcreateElementMathML("mspace");\r
+ space.setAttribute("width","0.167em");\r
+ node.appendChild(space);\r
+ }\r
+ node.appendChild(result[0]);\r
+ return [node,result[1],symbol.tag];\r
+ }\r
+ }\r
+ if (symbol.input == "\\sqrt") { // sqrt\r
+ if (isIE) { // set minsize, for \surd\r
+ var space = AMcreateElementMathML("mspace");\r
+ space.setAttribute("height","1.2ex");\r
+ space.setAttribute("width","0em"); // probably no effect\r
+ node = AMcreateMmlNode(symbol.tag,result[0])\r
+// node.setAttribute("minsize","1"); // ignored\r
+// node = AMcreateMmlNode("mrow",node); // hopefully unnecessary\r
+ node.appendChild(space);\r
+ return [node,result[1],symbol.tag];\r
+ } else\r
+ return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];\r
+ } else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent\r
+ node = AMcreateMmlNode(symbol.tag,result[0]);\r
+ var output = symbol.output;\r
+ if (isIE) {\r
+ if (symbol.input == "\\hat")\r
+ output = "\u0302";\r
+ else if (symbol.input == "\\widehat")\r
+ output = "\u005E";\r
+ else if (symbol.input == "\\bar")\r
+ output = "\u00AF";\r
+ else if (symbol.input == "\\grave")\r
+ output = "\u0300";\r
+ else if (symbol.input == "\\tilde")\r
+ output = "\u0303";\r
+ }\r
+ var node1 = AMcreateMmlNode("mo",document.createTextNode(output));\r
+ if (symbol.input == "\\vec" || symbol.input == "\\check")\r
+ // don't allow to stretch\r
+ node1.setAttribute("maxsize","1.2");\r
+ // why doesn't "1" work? \vec nearly disappears in firefox\r
+ if (isIE && symbol.input == "\\bar")\r
+ node1.setAttribute("maxsize","0.5");\r
+ if (symbol.input == "\\underbrace" || symbol.input == "\\underline")\r
+ node1.setAttribute("accentunder","true");\r
+ else\r
+ node1.setAttribute("accent","true");\r
+ node.appendChild(node1);\r
+ if (symbol.input == "\\overbrace" || symbol.input == "\\underbrace")\r
+ node.ttype = UNDEROVER;\r
+ return [node,result[1],symbol.tag];\r
+ } else if (symbol.input == "\\not") { // not\r
+ // added by infinity0 on 2009-12-15 to implement \not command\r
+ text = result[0].childNodes[0].nodeValue;\r
+ if (typeof text == "string" && text.length == 1 && text in AMRelationNegations) {\r
+ result[0].childNodes[0].nodeValue = AMRelationNegations[text];\r
+ return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];\r
+ }\r
+ return [AMcreateMmlNode("mo",document.createTextNode("\\")),"not " + str,symbol.tag];\r
+ } else { // font change or displaystyle command\r
+ if (!isIE && typeof symbol.codes != "undefined") {\r
+ for (i=0; i<result[0].childNodes.length; i++)\r
+ if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {\r
+ st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:\r
+ result[0].childNodes[i].firstChild.nodeValue);\r
+ var newst = [];\r
+ for (var j=0; j<st.length; j++)\r
+ if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91)\r
+ { newst = newst + symbol.codes[st.charCodeAt(j)-65] }\r
+ // String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]); alert(newst); }\r
+ else newst = newst + st.charAt(j);\r
+ if (result[0].nodeName=="mi")\r
+ result[0]=AMcreateElementMathML("mo").\r
+ appendChild(document.createTextNode(newst));\r
+ else result[0].replaceChild(AMcreateElementMathML("mo").\r
+ appendChild(document.createTextNode(newst)),result[0].childNodes[i]);\r
+ }\r
+ }\r
+ node = AMcreateMmlNode(symbol.tag,result[0]);\r
+ node.setAttribute(symbol.atname,symbol.atval);\r
+ if (symbol.input == "\\scriptstyle" ||\r
+ symbol.input == "\\scriptscriptstyle")\r
+ node.setAttribute("displaystyle","false");\r
+ return [node,result[1],symbol.tag];\r
+ }\r
+ case BINARY:\r
+ result = AMparseSexpr(str);\r
+ if (result[0]==null) return [AMcreateMmlNode("mo",document.createTextNode(symbol.input)),str,null];\r
+ result2 = AMparseSexpr(result[1]);\r
+ if (result2[0]==null) return [AMcreateMmlNode("mo",document.createTextNode(symbol.input)),str,null];\r
+ //added by J. Knisley to allow \textcolor and \colorbox within equations\r
+ if (symbol.input=="\\textcolor" || symbol.input=="\\colorbox") {\r
+ var tclr = str.match(/\{s*([#\w]+)\s*\}/); //get's color from beginning of str\r
+ str = str.replace(/\{s*[#\w]+\s*\}/,"");\r
+ if(tclr!=null) {\r
+ if(IsColorName.test(tclr[1].toLowerCase())) {\r
+ tclr=LaTeXColor[tclr[1].toLowerCase()];\r
+ } else {\r
+ tclr=tclr[1]; // no checking for valid color!!\r
+ }\r
+ node = AMcreateElementMathML("mstyle");\r
+ node.setAttribute(symbol.atval,tclr);\r
+ node.appendChild(result2[0]);\r
+ return [node,result2[1],symbol.tag];\r
+ }\r
+ }\r
+ if (symbol.input=="\\root" || symbol.input=="\\stackrel") newFrag.appendChild(result2[0]);\r
+ newFrag.appendChild(result[0]);\r
+ if (symbol.input=="\\frac") newFrag.appendChild(result2[0]);\r
+ return [AMcreateMmlNode(symbol.tag,newFrag),result2[1],symbol.tag];\r
+ case INFIX:\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),\r
+ str,symbol.tag];\r
+ default:\r
+ return [AMcreateMmlNode(symbol.tag, //its a constant\r
+ document.createTextNode(symbol.output)),str,symbol.tag];\r
+ }\r
+}\r
+\r
+function AMparseIexpr(str) {\r
+ var symbol, sym1, sym2, node, result, tag, underover;\r
+ str = AMremoveCharsAndBlanks(str,0);\r
+ sym1 = AMgetSymbol(str);\r
+ result = AMparseSexpr(str);\r
+ node = result[0];\r
+ str = result[1];\r
+ tag = result[2];\r
+ symbol = AMgetSymbol(str);\r
+ if (symbol.ttype == INFIX) {\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ result = AMparseSexpr(str);\r
+ if (result[0] == null) // show box in place of missing argument\r
+ result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));\r
+ str = result[1];\r
+ tag = result[2];\r
+ if (symbol.input == "_" || symbol.input == "^") {\r
+ sym2 = AMgetSymbol(str);\r
+ tag = null; // no space between x^2 and a following sin, cos, etc.\r
+// This is for \underbrace and \overbrace\r
+ underover = ((sym1.ttype == UNDEROVER) || (node.ttype == UNDEROVER));\r
+// underover = (sym1.ttype == UNDEROVER);\r
+ if (symbol.input == "_" && sym2.input == "^") {\r
+ str = AMremoveCharsAndBlanks(str,sym2.input.length);\r
+ var res2 = AMparseSexpr(str);\r
+ str = res2[1];\r
+ tag = res2[2]; // leave space between x_1^2 and a following sin etc.\r
+ node = AMcreateMmlNode((underover?"munderover":"msubsup"),node);\r
+ node.appendChild(result[0]);\r
+ node.appendChild(res2[0]);\r
+ } else if (symbol.input == "_") {\r
+ node = AMcreateMmlNode((underover?"munder":"msub"),node);\r
+ node.appendChild(result[0]);\r
+ } else {\r
+ node = AMcreateMmlNode((underover?"mover":"msup"),node);\r
+ node.appendChild(result[0]);\r
+ }\r
+ node = AMcreateMmlNode("mrow",node); // so sum does not stretch\r
+ } else {\r
+ node = AMcreateMmlNode(symbol.tag,node);\r
+ if (symbol.input == "\\atop" || symbol.input == "\\choose")\r
+ node.setAttribute("linethickness","0ex");\r
+ node.appendChild(result[0]);\r
+ if (symbol.input == "\\choose")\r
+ node = AMcreateMmlNode("mfenced",node);\r
+ }\r
+ }\r
+ return [node,str,tag];\r
+}\r
+\r
+function AMparseExpr(str,rightbracket,matrix) {\r
+ var symbol, node, result, i, tag,\r
+ newFrag = document.createDocumentFragment();\r
+ do {\r
+ str = AMremoveCharsAndBlanks(str,0);\r
+ result = AMparseIexpr(str);\r
+ node = result[0];\r
+ str = result[1];\r
+ tag = result[2];\r
+ symbol = AMgetSymbol(str);\r
+ if (node!=undefined) {\r
+ if ((tag == "mn" || tag == "mi") && symbol!=null &&\r
+ typeof symbol.func == "boolean" && symbol.func) {\r
+ // Add space before \sin in 2\sin x or x\sin x\r
+ var space = AMcreateElementMathML("mspace");\r
+ space.setAttribute("width","0.167em");\r
+ node = AMcreateMmlNode("mrow",node);\r
+ node.appendChild(space);\r
+ }\r
+ newFrag.appendChild(node);\r
+ }\r
+ } while ((symbol.ttype != RIGHTBRACKET)\r
+ && symbol!=null && symbol.output!="");\r
+ tag = null;\r
+ if (symbol.ttype == RIGHTBRACKET) {\r
+ if (symbol.input == "\\right") { // right what?\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+ symbol = AMgetSymbol(str);\r
+ if (symbol != null && symbol.input == ".")\r
+ symbol.invisible = true;\r
+ if (symbol != null)\r
+ tag = symbol.rtag;\r
+ }\r
+ if (symbol!=null)\r
+ str = AMremoveCharsAndBlanks(str,symbol.input.length); // ready to return\r
+ var len = newFrag.childNodes.length;\r
+ if (matrix &&\r
+ len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&\r
+ newFrag.childNodes[len-2].nodeName == "mo" &&\r
+ newFrag.childNodes[len-2].firstChild.nodeValue == "&") { //matrix\r
+ var pos = []; // positions of ampersands\r
+ var m = newFrag.childNodes.length;\r
+ for (i=0; matrix && i<m; i=i+2) {\r
+ pos[i] = [];\r
+ node = newFrag.childNodes[i];\r
+ for (var j=0; j<node.childNodes.length; j++)\r
+ if (node.childNodes[j].firstChild.nodeValue=="&")\r
+ pos[i][pos[i].length]=j;\r
+ }\r
+ var row, frag, n, k, table = document.createDocumentFragment();\r
+ for (i=0; i<m; i=i+2) {\r
+ row = document.createDocumentFragment();\r
+ frag = document.createDocumentFragment();\r
+ node = newFrag.firstChild; // <mrow> -&-&...&-&- </mrow>\r
+ n = node.childNodes.length;\r
+ k = 0;\r
+ for (j=0; j<n; j++) {\r
+ if (typeof pos[i][k] != "undefined" && j==pos[i][k]){\r
+ node.removeChild(node.firstChild); //remove &\r
+ row.appendChild(AMcreateMmlNode("mtd",frag));\r
+ k++;\r
+ } else frag.appendChild(node.firstChild);\r
+ }\r
+ row.appendChild(AMcreateMmlNode("mtd",frag));\r
+ if (newFrag.childNodes.length>2) {\r
+ newFrag.removeChild(newFrag.firstChild); //remove <mrow> </mrow>\r
+ newFrag.removeChild(newFrag.firstChild); //remove <mo>&</mo>\r
+ }\r
+ table.appendChild(AMcreateMmlNode("mtr",row));\r
+ }\r
+ return [table,str];\r
+ }\r
+ if (typeof symbol.invisible != "boolean" || !symbol.invisible) {\r
+ node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));\r
+ newFrag.appendChild(node);\r
+ }\r
+ }\r
+ return [newFrag,str,tag];\r
+}\r
+\r
+function AMparseMath(str) {\r
+ var result, node = AMcreateElementMathML("mstyle");\r
+ //added by J. Knisley to allow limited implementation of \color\r
+ var cclr = str.match(/\\color\s*\{s*([#\w]+)\s*\}/);\r
+ str = str.replace(/\\color\s*\{s*[#\w]+\s*\}/g,"");\r
+ if(cclr!=null) {\r
+ if(IsColorName.test(cclr[1].toLowerCase())) {\r
+ cclr=LaTeXColor[cclr[1].toLowerCase()];\r
+ } else {\r
+ cclr=cclr[1]; // no checking for valid color!!\r
+ }\r
+ node.setAttribute("mathcolor",cclr);\r
+ } else {\r
+ if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);\r
+ };\r
+ if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily);\r
+ node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false,false)[0]);\r
+ node = AMcreateMmlNode("math",node);\r
+ if (showasciiformulaonhover) //fixed by djhsu so newline\r
+ node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko\r
+ if (false ) { //&& mathfontfamily != "" && (isIE || mathfontfamily != "serif")) {\r
+ var fnode = AMcreateElementXHTML("font");\r
+ fnode.setAttribute("face",mathfontfamily);\r
+ fnode.appendChild(node);\r
+ return fnode;\r
+ }\r
+ return node;\r
+}\r
+\r
+function AMstrarr2docFrag(arr, linebreaks) {\r
+ var newFrag=document.createDocumentFragment();\r
+ var expr = false;\r
+ for (var i=0; i<arr.length; i++) {\r
+ if (expr) newFrag.appendChild(AMparseMath(arr[i]));\r
+ else {\r
+ var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);\r
+ newFrag.appendChild(AMcreateElementXHTML("span").\r
+ appendChild(document.createTextNode(arri[0])));\r
+ for (var j=1; j<arri.length; j++) {\r
+ newFrag.appendChild(AMcreateElementXHTML("p"));\r
+ newFrag.appendChild(AMcreateElementXHTML("span").\r
+ appendChild(document.createTextNode(arri[j])));\r
+ }\r
+ }\r
+ expr = !expr;\r
+ }\r
+ return newFrag;\r
+}\r
+\r
+function AMprocessNodeR(n, linebreaks) {\r
+ var mtch, str, arr, frg, i;\r
+ if (n.childNodes.length == 0) {\r
+ if ((n.nodeType!=8 || linebreaks) &&\r
+ n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&\r
+ n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" &&\r
+ n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") {\r
+ str = n.nodeValue;\r
+ if (!(str == null)) {\r
+ str = str.replace(/\r\n\r\n/g,"\n\n");\r
+ str = str.replace(/\x20+/g," ");\r
+ str = str.replace(/\s*\r\n/g," ");\r
+// DELIMITERS:\r
+ mtch = (str.indexOf("\$")==-1 ? false : true);\r
+ str = str.replace(/([^\\])\$/g,"$1 \$");\r
+ str = str.replace(/^\$/," \$"); // in case \$ at start of string\r
+ arr = str.split(" \$");\r
+ for (i=0; i<arr.length; i++)\r
+ arr[i]=arr[i].replace(/\\\$/g,"\$");\r
+ if (arr.length>1 || mtch) {\r
+ if (checkForMathML) {\r
+ checkForMathML = false;\r
+ var nd = AMisMathMLavailable();\r
+ AMnoMathML = nd != null;\r
+ if (AMnoMathML && notifyIfNoMathML)\r
+ if (alertIfNoMathML)\r
+ alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\\r
+ or Firefox/Mozilla/Netscape");\r
+ else AMbody.insertBefore(nd,AMbody.childNodes[0]);\r
+ }\r
+ if (!AMnoMathML) {\r
+ frg = AMstrarr2docFrag(arr,n.nodeType==8);\r
+ var len = frg.childNodes.length;\r
+ n.parentNode.replaceChild(frg,n);\r
+ return len-1;\r
+ } else return 0;\r
+ }\r
+ }\r
+ } else return 0;\r
+ } else if (n.nodeName!="math") {\r
+ for (i=0; i<n.childNodes.length; i++)\r
+ i += AMprocessNodeR(n.childNodes[i], linebreaks);\r
+ }\r
+ return 0;\r
+}\r
+\r
+function AMprocessNode(n, linebreaks, spanclassAM) {\r
+ var frag,st;\r
+ if (spanclassAM!=null) {\r
+ frag = document.getElementsByTagName("span")\r
+ for (var i=0;i<frag.length;i++)\r
+ if (frag[i].className == "AM")\r
+ AMprocessNodeR(frag[i],linebreaks);\r
+ } else {\r
+ try {\r
+ st = n.innerHTML;\r
+ } catch(err) {}\r
+// DELIMITERS:\r
+ if (st==null || st.indexOf("\$")!=-1)\r
+ AMprocessNodeR(n,linebreaks);\r
+ }\r
+ if (isIE) { //needed to match size and font of formula to surrounding text\r
+ frag = document.getElementsByTagName('math');\r
+ for (var i=0;i<frag.length;i++) frag[i].update()\r
+ }\r
+}\r
+\r
+/* Below is LaTeX pre-processing to produce CSS supported */\r
+/* standard latex structures*/\r
+/* Jeff Knisley (knisleyj@etsu.edu)\r
+/* Supported in part by the Howard Hughes Medical Institute */\r
+/* as part of the Symbiosis Project: HHMI #52005872 */\r
+\r
+var inAppendix = false;\r
+var sectionCntr = 0;\r
+var IEcommentWarning = true;\r
+var biblist = [];\r
+var bibcntr = 0;\r
+\r
+var LaTeXCounter = [];\r
+LaTeXCounter["definition"] = 0;\r
+LaTeXCounter["proposition"] = 0;\r
+LaTeXCounter["lemma"] = 0;\r
+LaTeXCounter["theorem"] = 0;\r
+LaTeXCounter["corollary"] = 0;\r
+LaTeXCounter["example"] = 0;\r
+LaTeXCounter["exercise"] = 0;\r
+LaTeXCounter["subsection"] = 0;\r
+LaTeXCounter["subsubsection"] = 0;\r
+LaTeXCounter["figure"] = 0;\r
+LaTeXCounter["equation"] = 0;\r
+LaTeXCounter["table"] = 0;\r
+LaTeXCounter["label"] = 0;\r
+\r
+var LaTeXColor = [];\r
+LaTeXColor["greenyellow"] = "#D9FF4F";\r
+LaTeXColor["yellow"] = "#FFFF00";\r
+LaTeXColor["goldenrod"] = "#FFE529";\r
+LaTeXColor["dandelion"] = "#FFB529";\r
+LaTeXColor["apricot"] = "#FFAD7A";\r
+LaTeXColor["peach"] = "#FF804D";\r
+LaTeXColor["melon"] = "#FF8A80";\r
+LaTeXColor["yelloworange"] = "#FF9400";\r
+LaTeXColor["orange"] = "#FF6321";\r
+LaTeXColor["burntorange"] = "#FF7D00";\r
+LaTeXColor["bittersweet"] = "#C20300";\r
+LaTeXColor["redorange"] = "#FF3B21";\r
+LaTeXColor["mahogany"] = "#A60000";\r
+LaTeXColor["maroon"] = "#AD0000";\r
+LaTeXColor["brickred"] = "#B80000";\r
+LaTeXColor["red"] = "#FF0000";\r
+LaTeXColor["orangered"] = "#FF0080";\r
+LaTeXColor["rubinered"] = "#FF00DE";\r
+LaTeXColor["wildstrawberry"] = "#FF0A9C";\r
+LaTeXColor["salmon"] = "#FF789E";\r
+LaTeXColor["carnationpink"] = "#FF5EFF";\r
+LaTeXColor["magenta"] = "#FF00FF";\r
+LaTeXColor["violetred"] = "#FF30FF";\r
+LaTeXColor["rhodamine"] = "#FF2EFF";\r
+LaTeXColor["mulberry"] = "#A314FA";\r
+LaTeXColor["redviolet"] = "#9600A8";\r
+LaTeXColor["fuchsia"] = "#7303EB";\r
+LaTeXColor["lavender"] = "#FF85FF";\r
+LaTeXColor["thistle"] = "#E069FF";\r
+LaTeXColor["orchid"] = "#AD5CFF";\r
+LaTeXColor["darkorchid"] = "#9933CC";\r
+LaTeXColor["purple"] = "#8C24FF";\r
+LaTeXColor["plum"] = "#8000FF";\r
+LaTeXColor["violet"] = "#361FFF";\r
+LaTeXColor["royalpurple"] = "#401AFF";\r
+LaTeXColor["blueviolet"] = "#1A0DF5";\r
+LaTeXColor["periwinkle"] = "#6E73FF";\r
+LaTeXColor["cadetblue"] = "#616EC4";\r
+LaTeXColor["cornflowerblue"] = "#59DEFF";\r
+LaTeXColor["midnightblue"] = "#007091";\r
+LaTeXColor["navyblue"] = "#0F75FF";\r
+LaTeXColor["royalblue"] = "#0080FF";\r
+LaTeXColor["blue"] = "#0000FF";\r
+LaTeXColor["cerulean"] = "#0FE3FF";\r
+LaTeXColor["cyan"] = "#00FFFF";\r
+LaTeXColor["processblue"] = "#0AFFFF";\r
+LaTeXColor["skyblue"] = "#61FFE0";\r
+LaTeXColor["turquoise"] = "#26FFCC";\r
+LaTeXColor["tealblue"] = "#1FFAA3";\r
+LaTeXColor["aquamarine"] = "#2EFFB2";\r
+LaTeXColor["bluegreen"] = "#26FFAB";\r
+LaTeXColor["emerald"] = "#00FF80";\r
+LaTeXColor["junglegreen"] = "#03FF7A";\r
+LaTeXColor["seagreen"] = "#4FFF80";\r
+LaTeXColor["green"] = "#00FF00";\r
+LaTeXColor["forestgreen"] = "#00E000";\r
+LaTeXColor["pinegreen"] = "#00BF29";\r
+LaTeXColor["limegreen"] = "#80FF00";\r
+LaTeXColor["yellowgreen"] = "#8FFF42";\r
+LaTeXColor["springgreen"] = "#BDFF3D";\r
+LaTeXColor["olivegreen"] = "#009900";\r
+LaTeXColor["rawsienna"] = "#8C0000";\r
+LaTeXColor["sepia"] = "#4D0000";\r
+LaTeXColor["brown"] = "#660000";\r
+LaTeXColor["tan"] = "#DB9470";\r
+LaTeXColor["gray"] = "#808080";\r
+LaTeXColor["grey"] = "#808080";\r
+LaTeXColor["black"] = "#000000";\r
+LaTeXColor["white"] = "#FFFFFF";\r
+\r
+var IsColorName = /^(?:greenyellow|yellow|goldenrod|dandelion|apricot|peach|melon|yelloworange|orange|burntorange|bittersweet|redorange|mahogany|maroon|brickred|red|orangered|rubinered|wildstrawberry|salmon|carnationpink|magenta|violetred|rhodamine|mulberry|redviolet|fuchsia|lavender|thistle|orchid|darkorchid|purple|plum|violet|royalpurple|blueviolet|periwinkle|cadetblue|cornflowerblue|midnightblue|navyblue|royalblue|blue|cerulean|cyan|processblue|skyblue|turquoise|tealblue|aquamarine|bluegreen|emerald|junglegreen|seagreen|green|forestgreen|pinegreen|limegreen|yellowgreen|springgreen|olivegreen|rawsienna|sepia|brown|tan|gray|grey|black|white)$/;\r
+var IsCounter = /^(?:definition|proposition|lemma|theorem|corollary|example|exercise|subsection|subsubsection|figure|equation|table)$/ ;\r
+var IsLaTeXElement = /^(?:displayequation|title|author|address|date|abstract|keyword|section|subsection|subsubsection|ref|cite|thebibliography|definition|proposition|lemma|theorem|corollary|example|exercise|itemize|enumerate|enddefinition|endproposition|endlemma|endtheorem|endcorollary|endexample|endexercise|enditemize|endenumerate|LaTeXMathMLlabel|LaTeXMathML|smallskip|medskip|bigskip|quote|quotation|endquote|endquotation|center|endcenter|description|enddescription|inlinemath)$/;\r
+var IsTextOnlyArea = /^(?:form|textarea|pre)$/i;\r
+var tableid = 0;\r
+\r
+function makeNumberString(cntr) {\r
+ if(sectionCntr > 0) {\r
+ if(inAppendix) {\r
+ return "A"+sectionCntr+"."+cntr;\r
+ } else {\r
+ return sectionCntr+"."+cntr;\r
+ }\r
+ } else {\r
+ return ""+cntr;\r
+ }\r
+};\r
+\r
+\r
+function LaTeXpreProcess(thebody) {\r
+ var TheBody = thebody;\r
+ if(TheBody.hasChildNodes()) {\r
+ if(!(IsLaTeXElement.test(TheBody.className)))\r
+ {\r
+ for(var i=0; i<TheBody.childNodes.length; i++) {\r
+ LaTeXpreProcess(TheBody.childNodes[i]) }\r
+ }\r
+ }\r
+ else {\r
+ if( TheBody.nodeType==3 &&\r
+ !(IsTextOnlyArea.test(TheBody.parentNode.nodeName) ) )\r
+ {\r
+ var str = TheBody.nodeValue;\r
+ if( !(str==null)) {\r
+\r
+ str = str.replace(/\\%/g, "<per>"); // % sign\r
+ str = str.replace(/%[^\n]*(?=\n)/g,"");\r
+ str = str.replace(/%[^\r]*(?=\r)/g,""); //Used by Explorer\r
+ str = str.replace(/%[^\n]*$/,"") // End of text segment comment\r
+\r
+ if(isIE && str.match(/%/g) != null && IEcommentWarning) {\r
+ alert("Comments may not have parsed properly. Try putting in <pre class='LaTeX><div>..</div></pre> structure.");\r
+ IEcommentWarning = false;\r
+ }\r
+ str = str.replace(/<per>/g,"%");\r
+\r
+ //if(str.match(/XXX[\s\S]*/)!=null) {\r
+ // var tmp = str.match(/XXX[\s\S]*/)[0];\r
+ // var tmpstr = tmp.charCodeAt(7)+"::"+tmp.charCodeAt(8)+"::"+tmp.charCodeAt(9)+"::"+tmp.charCodeAt(10)+"::"+tmp.charCodeAt(11)+"::"+tmp.charCodeAt(12)+"::"+tmp.charCodeAt(13);\r
+ // alert(tmpstr);\r
+ //}\r
+\r
+ //spacing that in LaTeXMathML may cause problems because of our approach. We use purely unicode\r
+ // First we remove singleton / symbols\r
+ str = str.replace(/([^\\])\\(\s)/g,"$1\u00A0$2"); // must be a space after \ for it to make an nbsp\r
+\r
+ str = str.replace(/\\quad/g,"\u2001");\r
+ str = str.replace(/\\qquad/g,"\u2001\u2001");\r
+ str = str.replace(/\\enspace/g,"\u2002");\r
+ str = str.replace(/\\;/g,"\u2004");\r
+ str = str.replace(/\\:/g,"\u2005");\r
+ str = str.replace(/\\,/g,"\u2006");\r
+ str = str.replace(/\\thinspace/g,"\u200A");\r
+ str = str.replace(/([^\\])~/g,"$1\u00A0");\r
+ str = str.replace(/\\~/g,"~");\r
+\r
+ //Added \[ ... \] and $$..$$ functionality.\r
+ str = str.replace(/\\\[/g," <DEQ> $\\displaystyle{");\r
+ str = str.replace(/\\\]/g,"}$ <DEQ> ");\r
+ str = str.replace(/\$\$/g,"${$<DEQ>$}$");\r
+\r
+ // Separate replacements for begin .. end to (eventually) allow LaTeX equations with html codes mixed in\r
+ // (as is the case for theorem, etc.\r
+ // all variations of spaces with \begin{array} .. \end{array} -- not displayed, however\r
+ str = str.replace(/\\begin\s*\{s*array\s*\}/g,"\\begin{array}");\r
+ str = str.replace(/\\end\s*\{s*array\s*\}/g,"\\end{array}");\r
+\r
+ // all variations of spaces with \begin{eqnarray} .. \end{eqnarray}\r
+ str = str.replace(/\\begin\s*\{s*eqnarray\s*\}/g," <DEQ>eqno$\\begin{eqnarray}");\r
+ str = str.replace(/\\end\s*\{s*eqnarray\s*\}/g,"\\end{eqnarray}$<DEQ> ");\r
+\r
+ // all variations of spaces with \begin{eqnarray*} .. \end{eqnarray*}\r
+ str = str.replace(/\\begin\s*\{s*eqnarray\*\s*\}/g," <DEQ>$\\begin{eqnarray}");\r
+ str = str.replace(/\\end\s*\{s*eqnarray\*\s*\}/g,"\\end{eqnarray}$<DEQ> ");\r
+\r
+ // all variations of spaces with \begin{displaymath} .. \end{displaymath}\r
+ str = str.replace(/\\begin\s*\{s*displaymath\s*\}/g," <DEQ> $\\displaystyle{");\r
+ str = str.replace(/\\end\s*\{s*displaymath\s*\}/g,"}$ <DEQ> ");\r
+\r
+ // all variations of spaces with \begin{equation*} .. \end{equation*}\r
+ str = str.replace(/\\begin\s*\{s*equation\s*\*\s*\}/g," <DEQ> $\\displaystyle{");\r
+ str = str.replace(/\\end\s*\{s*equation\s*\*\s*\}/g,"}$ <DEQ> ");\r
+\r
+ // all variations of spaces with \begin{equation} .. \end{equation}\r
+ str = str.replace(/\\begin\s*\{s*equation\s*\}/g," <DEQ>eqno$\\displaystyle{");\r
+ str = str.replace(/\\end\s*\{s*equation\s*\}/g,"}$ <DEQ> ");\r
+\r
+\r
+\r
+ //now parse to translate <DEQ> structures to <table class = 'dispeq'> stuff\r
+ //and to identify non-display math content (sections, etc).\r
+\r
+ str = str.split("<DEQ>");\r
+ // var ntype = TheBody.nodeType;\r
+ var newFrag = document.createDocumentFragment();\r
+\r
+ for(var i=0;i<str.length;i++) {\r
+ if(i % 2) {\r
+ //odd = table of type displayequation\r
+ var DEQtable = document.createElement("table");\r
+ DEQtable.className='displayequation';\r
+ var DEQtbody = document.createElement("tbody");\r
+\r
+ var DEQtr = document.createElement("tr");\r
+ var DEQtdeq = document.createElement("td");\r
+ DEQtdeq.className='eq';\r
+\r
+ // AfterFix to repair for $$...$$\r
+ str[i] = str[i].replace(/\$\}$/g,"$\\displaystyle{");\r
+ str[i] = str[i].replace(/\$\{$/g,"}");\r
+\r
+ //check for equation number via either label or eqno at beginning -- \nonumber is removed\r
+ var lbl = str[i].match(/\\label\s*\{s*(\w+)\s*\}/);\r
+ var ISeqno = str[i].match(/^eqno/);\r
+\r
+ // append nodes into row\r
+ str[i] = str[i].replace(/^eqno/," ");\r
+ str[i] = str[i].replace(/\\label\s*\{s*\w+\s*\}/," ");\r
+ DEQtdeq.appendChild(document.createTextNode( str[i] ) );\r
+ DEQtr.appendChild(DEQtdeq);\r
+\r
+ str[i] = str[i].replace(/\\nonumber/g,"");\r
+\r
+ if(ISeqno!=null || lbl !=null) {\r
+ var DEQtdno = document.createElement("td");\r
+ DEQtdno.className='eqno';\r
+ LaTeXCounter["equation"]++;\r
+ var eqnoString = makeNumberString(LaTeXCounter["equation"]);\r
+\r
+ var DEQanchor = document.createElement("a");\r
+ if(lbl!=null) { DEQanchor.id = lbl[1] };\r
+ DEQanchor.className = "eqno";\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = "eqno";\r
+ anchorSpan.style.display = "none";\r
+ anchorSpan.appendChild(document.createTextNode(eqnoString));\r
+ DEQanchor.appendChild(anchorSpan);\r
+ DEQtdno.appendChild(DEQanchor);\r
+ var DEQspan = document.createElement("span");\r
+ DEQspan.className = "eqno";\r
+ DEQspan.appendChild(document.createTextNode("("+eqnoString+")" ));\r
+ DEQtdno.appendChild(DEQspan);\r
+ DEQtr.appendChild(DEQtdno);\r
+ }\r
+ DEQtbody.appendChild(DEQtr);\r
+ DEQtable.appendChild(DEQtbody);\r
+ newFrag.appendChild(DEQtable);\r
+ }\r
+ else {\r
+ //even = this is text, where we may have sections, labels, subsections, and so on\r
+\r
+ // AfterFix to repair for $$...$$\r
+ str[i] = str[i].replace(/\$\}$/g,"");\r
+ str[i] = str[i].replace(/\$\{$/g,"");\r
+\r
+ //Some stuff we just want to remove\r
+ str[i] = str[i].replace(/\\maketitle/g,"");\r
+ str[i] = str[i].replace(/\\begin\s*\{s*document\s*\}/g,"");\r
+ str[i] = str[i].replace(/\\end\s*\{s*document\s*\}/g,"");\r
+ str[i] = str[i].replace(/\\documentclass[^\}]*?\}/g,"");\r
+ str[i] = str[i].replace(/\\usepackage[^\}]*?\}/g,""); //ignores packages and their options\r
+ str[i] = str[i].replace(/\\noindent/g,"");\r
+ str[i] = str[i].replace(/\\notag/g,"");\r
+\r
+ //Next: labels, ref's, hrefs, urls, and cites\r
+ str[i] = str[i].replace(/\\ref\s*\{s*(\w+)\}/g," \\[ref\\]$1\\[ ");\r
+ str[i] = str[i].replace (/\\url\s*\{s*([^\}n]+)\}/g," \\[url\\]$1\\[ ");\r
+ str[i] = str[i].replace(/\\href\s*\{s*([^\}]+)\}s*\{s*([^\}]+)\}/g," \\[href\\]$1\\]$2\\[ ");\r
+ str[i] = str[i].replace(/\\cite\s*\{s*(\w+)\}/g," \\[cite\\]$1\\[ ");\r
+\r
+ //Miscellaneous stuff!!\r
+ str[i] = str[i].replace(/\\qed/g,"\u220E");\r
+ str[i] = str[i].replace(/\\endproof/g,"\u220E");\r
+ str[i] = str[i].replace(/\\proof/g,"\\textbf{Proof: }");\r
+\r
+ //breaks and skips\r
+ str[i] = str[i].replace(/\\n(?=\s)/g, " \\[br\\] \\[ ");\r
+ str[i] = str[i].replace(/\\newline/g," \\[br\\] \\[ ");\r
+ str[i] = str[i].replace(/\\linebreak/g," \\[br\\] \\[ ");\r
+ str[i] = str[i].replace(/\\smallskip/g," \\[logicalbreak\\]smallskip\\[ ");\r
+ str[i] = str[i].replace(/\\medskip/g," \\[logicalbreak\\]medskip\\[ ");\r
+ str[i] = str[i].replace(/\\bigskip/g," \\[logicalbreak\\]bigskip\\[ ");\r
+ str[i] = str[i].replace(/[\n\r]+[ \f\n\r\t\v\u2028\u2029]*[\n\r]+/g," \\[logicalbreak\\]LaTeXMathML\\[ "); // extra return replaced by <p>\r
+ if(isIE) {\r
+ str[i] = str[i].replace(/\r/g," "); // replace \r by a space to aid spacing!\r
+ }\r
+\r
+\r
+ //items and appendix\r
+ str[i] = str[i].replace(/\\bibitem\s*([^\{]*\{s*\w*\s*\})/g," \\[bibitem\\]$1\\[ ");\r
+ str[i] = str[i].replace(/\\bibitem\s*/g," \\[bibitem\\] \\[ ");\r
+ str[i] = str[i].replace(/\\item\s*\[\s*(\w+)\s*\]/g," \\[alistitem\\]$1\\[ ");\r
+ str[i] = str[i].replace(/\\item\s*/g," \\[alistitem\\] \\[ ");\r
+ str[i] = str[i].replace(/\\appendix/g," \\[appendix\\] \\[ ");\r
+\r
+\r
+ // \includegraphics[][]{image} -- no processing of options. This treatment is DANGEROUS. It assumes no html will be\r
+ // placed within the \begin{figure} ... \end{figure} structure, and the [\s\S] character class could lead to strange matches\r
+ str[i] = str[i].replace(/\\begin\s*\{s*figure\s*\}([\s\S]+?)\\end\s*\{s*figure\s*\}/g," \\[figure\\]$1\\[ ");\r
+ str[i] = str[i].replace(/\\begin\s*\{s*table\s*\}([\s\S]+?)\\end\s*\{s*table\s*\}/g," \\[table\\]$1\\[ ");\r
+ //str[i] = str[i].replace(/\\begin\s*\{s*array\s*\}([\s\S]+?)\\end\s*\{s*array\s*\}/g," \\[array\\]$1\\[ ");\r
+ //goal is to protect array \\ from being converted into linebreaks\r
+\r
+ //This construction allows css classes for divs for these elements, but the CSS will have to be supplied through a\r
+ //css file or (script) .. (/script) in the header. (It makes sense to me that style files in LaTeX should correspond\r
+ //to css and/or xslt when translating to mathml, but \ref's are a problem).\r
+ str[i] = str[i].replace(/\\begin\s*\{s*theorem\s*\}/g," \\[theorem\\]Theorem \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*theorem\s*\}/g," \\[endtheorem\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*definition\s*\}/g," \\[definition\\]Definition \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*definition\s*\}/g," \\[enddefinition\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*lemma\s*\}/g," \\[lemma\\]Lemma \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*lemma\s*\}/g," \\[endlemma\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*corollary\s*\}/g," \\[corollary\\]Corollary \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*corollary\s*\}/g," \\[endcorollary\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*proposition\s*\}/g," \\[proposition\\]Proposition \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*proposition\s*\}/g," \\[endproposition\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*example\s*\}/g," \\[example\\]Example \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*example\s*\}/g," \\[endexample\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*exercise\s*\}/g," \\[exercise\\]Exercise \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*exercise\s*\}/g," \\[endexercise\\] \\[ ");\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*thebibliography\s*\}s*\{s*\w+\s*\}/g," \\[thebibliography\\]References \\[ ");\r
+ str[i] = str[i].replace(/\\begin\s*\{s*thebibliography\s*\}/g," \\[thebibliography\\]References \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*thebibliography\s*\}/g," \\[endthebibliography\\]References \\[ ");\r
+\r
+\r
+ str[i] = str[i].replace(/\\begin\s*\{s*proof\s*\}/g," \\[proof\\]Proof: \\[ ");\r
+ if(isIE) { //IE is just so weird\r
+ str[i] = str[i].replace(/\\end\s*\{s*proof\s*\}/g,"\u220E \\[endproof\\] \\[ ");\r
+ } else {\r
+ str[i] = str[i].replace(/\\end\s*\{s*proof\s*\}/g," \\[endproof\\] \\[ ");\r
+ }\r
+\r
+ //The frontmatter -- all translated to div's to be handled by CSS\r
+ str[i] = str[i].replace(/\\title\s*\{s*([^\}]+)\}/g," \\[title\\] \\[$1 \\[endtitle\\] \\[ ");\r
+ str[i] = str[i].replace(/\\author\s*\{s*([^\}]+)\}/g," \\[author\\] \\[$1 \\[endauthor\\] \\[ ");\r
+ str[i] = str[i].replace(/\\address\s*\{s*([^\}]+)\}/g," \\[address\\] \\[$1 \\[endaddress\\] \\[ ");\r
+ str[i] = str[i].replace(/\\date\s*\{s*([^\}]+)\}/g," \\[date\\] \\[$1 \\[enddate\\] \\[ ");\r
+ str[i] = str[i].replace(/\\begin\s*\{s*keyword\s*\}/g," \\[keyword\\] \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*keyword\s*\}/g," \\[endkeyword\\] \\[ ");\r
+ str[i] = str[i].replace(/\\begin\s*\{s*abstract\s*\}/g," \\[abstract\\] \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*abstract\s*\}/g," \\[endabstract\\] \\[ ");\r
+\r
+ //The rest of the environments -- Users can even "make up their own" -- but it avoids the array and tabular environments\r
+ str[i] = str[i].replace(/\\begin\s*\{s*(?!array|tabular)(\w+)\s*\}/g," \\[$1\\] \\[ ");\r
+ str[i] = str[i].replace(/\\end\s*\{s*(?!array|tabular)(\w+)\s*\}/g," \\[end$1\\] \\[ ");\r
+\r
+ //Next, we look at section--subsection stuff. This is nested -- this would be so much better if LaTeX used\r
+ //some type of \begin{sectionhead}...\end{sectionhead} structure\r
+ var sectionIndex = str[i].search(/\\section\s*\{s*[\s\S]+\}/);\r
+\r
+ while(sectionIndex >= 0) {\r
+ str[i] = str[i].replace(/\\section\s*\{/ ," \\[section\\]");\r
+ var delimcnt = 1;\r
+ for(var ii=sectionIndex;ii<str[i].length;ii++) {\r
+ if(str[i].charAt(ii) == "{") { delimcnt++ };\r
+ if(str[i].charAt(ii) == "}") { delimcnt-- };\r
+ if(delimcnt == 0) {\r
+ str[i] = str[i].substring(0,ii)+"\\[ "+str[i].substring(ii+1,str[i].length) ;\r
+ break;\r
+ }\r
+ };\r
+ sectionIndex = str[i].search(/\\section\s*\{s*[\s\S]+\}/); //look for next\r
+ }\r
+\r
+ sectionIndex = str[i].search(/\\subsection\s*\{s*[\s\S]+\}/);\r
+\r
+ while(sectionIndex >= 0) {\r
+ str[i] = str[i].replace(/\\subsection\s*\{/ ," \\[subsection\\]");\r
+ var delimcnt = 1;\r
+ for(var ii=sectionIndex;ii<str[i].length;ii++) {\r
+ if(str[i].charAt(ii) == "{") { delimcnt++ };\r
+ if(str[i].charAt(ii) == "}") { delimcnt-- };\r
+ if(delimcnt == 0) {\r
+ str[i] = str[i].substring(0,ii)+"\\[ "+str[i].substring(ii+1,str[i].length) ;\r
+ break;\r
+ }\r
+ };\r
+ sectionIndex = str[i].search(/\\subsection\s*\{s*[\s\S]+\}/); //look for next\r
+ }\r
+\r
+ sectionIndex = str[i].search(/\\subsubsection\s*\{s*[\s\S]+\}/);\r
+\r
+ while(sectionIndex >= 0) {\r
+ str[i] = str[i].replace(/\\subsubsection\s*\{/ ," \\[subsubsection\\]");\r
+ var delimcnt = 1;\r
+ for(var ii=sectionIndex;ii<str[i].length;ii++) {\r
+ if(str[i].charAt(ii) == "{") { delimcnt++ };\r
+ if(str[i].charAt(ii) == "}") { delimcnt-- };\r
+ if(delimcnt == 0) {\r
+ str[i] = str[i].substring(0,ii)+"\\[ "+str[i].substring(ii+1,str[i].length) ;\r
+ break;\r
+ }\r
+ };\r
+ sectionIndex = str[i].search(/\\subsubsection\s*\{s*[\s\S]+\}/); //look for next\r
+ }\r
+\r
+ var CatToNextEven = "";\r
+ //split into alternating text elements and "marked" elements\r
+ var strtmp = str[i].split("\\[");\r
+ //document.write(strtmp[0]);\r
+\r
+ for(var j=0;j<strtmp.length;j++) {\r
+ if(j % 2) {\r
+ //odd = split on \\]\r
+ var strtmparray = strtmp[j].split("\\]");\r
+ switch (strtmparray[0]) {\r
+ case "section":\r
+ var nodeTmp = document.createElement("H2");\r
+ nodeTmp.className = 'section';\r
+ //reset counters\r
+ sectionCntr++;\r
+ for (var div in LaTeXCounter) { LaTeXCounter[div] = 0 };\r
+ //Create Title of section\r
+ var nodeAnchor = document.createElement("a");\r
+ if(inAppendix) {\r
+ nodeAnchor.className='appendixsection';\r
+ } else {\r
+ nodeAnchor.className='section';\r
+ }\r
+ var nodeNumString = makeNumberString("");\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = "section";\r
+ anchorSpan.style.display = "none";\r
+ anchorSpan.appendChild(document.createTextNode(nodeNumString));\r
+ nodeAnchor.appendChild(anchorSpan);\r
+ nodeTmp.appendChild(nodeAnchor);\r
+\r
+ var nodeSpan = document.createElement("span");\r
+ nodeSpan.className = 'section';\r
+ nodeSpan.appendChild(document.createTextNode(nodeNumString+" "));\r
+ nodeTmp.appendChild(nodeSpan);\r
+ nodeTmp.appendChild(document.createTextNode( strtmparray[1] ) );\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "subsection":\r
+ var nodeTmp = document.createElement("H3");\r
+ nodeTmp.className = 'subsection';\r
+ //counters\r
+ LaTeXCounter["subsection"]++;\r
+ LaTeXCounter["subsubsection"]=0;\r
+ //Create Title of section\r
+ var nodeAnchor = document.createElement("a");\r
+ nodeAnchor.className = 'subsection';\r
+ var nodeNumString = makeNumberString(LaTeXCounter["subsection"]);\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = "subsection";\r
+ anchorSpan.style.display = "none";\r
+ anchorSpan.appendChild(document.createTextNode(nodeNumString));\r
+ nodeAnchor.appendChild(anchorSpan);\r
+ nodeTmp.appendChild(nodeAnchor);\r
+ var nodeSpan = document.createElement("span");\r
+ nodeSpan.className = 'subsection';\r
+ nodeSpan.appendChild(document.createTextNode(nodeNumString+". "));\r
+ nodeTmp.appendChild(nodeSpan);\r
+ nodeTmp.appendChild(document.createTextNode( strtmparray[1] ) );\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "subsubsection":\r
+ var nodeTmp = document.createElement("H4");\r
+ nodeTmp.className = 'subsubsection';\r
+ //counters\r
+ LaTeXCounter["subsubsection"]++;\r
+ //Create Title of section\r
+ var nodeAnchor = document.createElement("a");\r
+ nodeAnchor.className = 'subsubsection';\r
+ var nodeNumString = makeNumberString(LaTeXCounter["subsection"]+"."+LaTeXCounter["subsubsection"]);\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = "subsubsection";\r
+ anchorSpan.style.display = "none";\r
+ anchorSpan.appendChild(document.createTextNode(nodeNumString));\r
+ nodeAnchor.appendChild(anchorSpan);\r
+ nodeTmp.appendChild(nodeAnchor);\r
+ var nodeSpan = document.createElement("span");\r
+ nodeSpan.className = 'subsubsection';\r
+ nodeSpan.appendChild(document.createTextNode(nodeNumString+". "));\r
+ nodeTmp.appendChild(nodeSpan);\r
+ nodeTmp.appendChild(document.createTextNode( strtmparray[1] ) );\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "href":\r
+ var nodeTmp = document.createElement("a");\r
+ nodeTmp.className = 'LaTeXMathML';\r
+ nodeTmp.href = strtmparray[1];\r
+ nodeTmp.appendChild(document.createTextNode( strtmparray[2]));\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "url":\r
+ var nodeTmp = document.createElement("a");\r
+ nodeTmp.className = 'LaTeXMathML';\r
+ nodeTmp.href = strtmparray[1];\r
+ nodeTmp.appendChild(document.createTextNode( strtmparray[1]));\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "figure":\r
+ var nodeTmp = document.createElement("table");\r
+ nodeTmp.className = 'figure';\r
+ var FIGtbody = document.createElement("tbody");\r
+\r
+ var FIGlbl = strtmparray[1].match(/\\label\s*\{s*(\w+)\s*\}/);\r
+ strtmparray[1]=strtmparray[1].replace(/\\label\s*\{w+\}/g,"");\r
+\r
+ var capIndex = strtmparray[1].search(/\\caption\s*\{[\s\S]+\}/);\r
+ var FIGcap = "";\r
+\r
+ if(capIndex >= 0) { // caption may contain other { } structures -- but not displaymath!!\r
+ var tmp = strtmparray[1];\r
+ var delimcnt = 0;\r
+ var capstart = -1;\r
+ for(var pos=capIndex;pos<tmp.length;pos++) {\r
+ if(tmp.charAt(pos) == "{") { delimcnt++ };\r
+ if(tmp.charAt(pos) == "}") { delimcnt-- };\r
+ if(delimcnt == 1 && capstart<0) { capstart = pos+1 };\r
+ if(delimcnt == 0 && capstart>0) {\r
+ capend = pos-1;\r
+ FIGcap = tmp.substring(capstart,pos);\r
+ break\r
+ }\r
+ }\r
+ }\r
+\r
+ var FIGtr2 = document.createElement("tr");\r
+ var FIGtd2 = document.createElement("td");\r
+ FIGtd2.className="caption";\r
+\r
+\r
+ var FIGanchor = document.createElement("a");\r
+ FIGanchor.className = "figure";\r
+ if(FIGlbl!=null) { FIGanchor.id = FIGlbl[1]; }\r
+ LaTeXCounter["figure"]++;\r
+ var fignmbr = makeNumberString(LaTeXCounter["figure"]);\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = "figure";\r
+ anchorSpan.style.display = "none";\r
+ anchorSpan.appendChild(document.createTextNode(fignmbr));\r
+ FIGanchor.appendChild(anchorSpan);\r
+ FIGtd2.appendChild(FIGanchor);\r
+\r
+ var FIGspan = document.createElement("span");\r
+ FIGspan.className = "figure"; //For CSS counters, comment this line\r
+ FIGspan.appendChild(document.createTextNode("Figure "+fignmbr+". " ) );\r
+ FIGtd2.appendChild(FIGspan);\r
+ FIGtd2.appendChild(document.createTextNode(""+FIGcap));\r
+ FIGtr2.appendChild(FIGtd2);\r
+ FIGtbody.appendChild(FIGtr2);\r
+ var IsSpecial = false;\r
+\r
+ var FIGinfo = strtmparray[1].match(/\\includegraphics\s*\{([^\}]+)\}/);\r
+ if(FIGinfo==null) { //options not processed, for now\r
+ FIGinfo = strtmparray[1].match(/\\includegraphics\s*\[[^\]]*\]\s*\{s*([^\}]+)\s*\}/);\r
+ }\r
+ if(FIGinfo==null) {\r
+ FIGinfo = strtmparray[1].match(/\\special\s*\{s*([^\}]+)\}/);\r
+ IsSpecial=true //Hook: Later can include "special" graphics commands\r
+ };\r
+\r
+ if(FIGinfo!=null) { //Caption will be above the image\r
+ var FIGtr1 = document.createElement("tr");\r
+ var FIGtd1 = document.createElement("td");\r
+ FIGtd1.className="image";\r
+ var FIGimg = document.createElement("img");\r
+ var FIGsrc = FIGinfo[1]; //options not processed, for now\r
+ FIGimg.src = FIGsrc;\r
+ FIGimg.alt = "Figure "+FIGsrc+" did not load";\r
+ FIGimg.title = "Figure "+fignmbr+". "+FIGcap;\r
+ FIGimg.id = "figure"+fignmbr;\r
+ FIGtd1.appendChild(FIGimg);\r
+ FIGtr1.appendChild(FIGtd1);\r
+ FIGtbody.appendChild(FIGtr1);\r
+ }\r
+ nodeTmp.appendChild(FIGtbody);\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "table":\r
+ var nodeTmp = document.createElement("table");\r
+ if(strtmparray[1].search(/\\centering/) >= 0) {\r
+ nodeTmp.className = 'LaTeXtable centered';\r
+ nodeTmp.align = "center";\r
+ } else {\r
+ nodeTmp.className = 'LaTeXtable';\r
+ };\r
+ tableid++;\r
+ nodeTmp.id = "LaTeXtable"+tableid; //unique id for each table\r
+\r
+ var TABlbl = strtmparray[1].match(/\\label\s*\{s*(\w+)\s*\}/);\r
+ strtmparray[1]=strtmparray[1].replace(/\\label\s*\{w+\}/g,"");\r
+\r
+ var capIndex = strtmparray[1].search(/\\caption\s*\{[\s\S]+\}/);\r
+ var TABcap = "";\r
+\r
+ if(capIndex >= 0) { // caption may contain other { } structures -- but not displaymath!!\r
+ var tmp = strtmparray[1];\r
+ var delimcnt = 0;\r
+ var capstart = -1;\r
+ for(var pos=capIndex;pos<tmp.length;pos++) {\r
+ if(tmp.charAt(pos) == "{") { delimcnt++ };\r
+ if(tmp.charAt(pos) == "}") { delimcnt-- };\r
+ if(delimcnt == 1 && capstart<0) { capstart = pos+1 };\r
+ if(delimcnt == 0 && capstart>0) {\r
+ capend = pos-1;\r
+ TABcap = tmp.substring(capstart,pos);\r
+ break\r
+ }\r
+ }\r
+ }\r
+\r
+ if(TABcap!="") {\r
+ var TABtbody = document.createElement("tbody");\r
+ var TABcaption = document.createElement("caption");\r
+ TABcaption.className="LaTeXtable centered";\r
+ var TABanchor = document.createElement("a");\r
+ TABanchor.className = "LaTeXtable";\r
+ if(TABlbl!=null) { TABanchor.id = TABlbl[1]; }\r
+ LaTeXCounter["table"]++;\r
+ var tabnmbr = makeNumberString(LaTeXCounter["table"]);\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = "LaTeXtable";\r
+ anchorSpan.style.display = "none";\r
+ anchorSpan.appendChild(document.createTextNode(tabnmbr));\r
+ TABanchor.appendChild(anchorSpan);\r
+ TABcaption.appendChild(TABanchor);\r
+\r
+ var TABspan = document.createElement("span");\r
+ TABspan.className = "LaTeXtable"; //For CSS counters, comment this line\r
+ TABspan.appendChild(document.createTextNode("Table "+tabnmbr+". " ) );\r
+ TABcaption.appendChild(TABspan);\r
+ TABcaption.appendChild(document.createTextNode(""+TABcap));\r
+ nodeTmp.appendChild(TABcaption);\r
+ }\r
+ var TABinfo = strtmparray[1].match(/\\begin\s*\{s*tabular\s*\}([\s\S]+)\\end\s*\{s*tabular\s*\}/);\r
+ if(TABinfo!=null) {\r
+ var TABtbody = document.createElement('tbody');\r
+ var TABrow = null;\r
+ var TABcell = null;\r
+ var row=0;\r
+ var col=0;\r
+\r
+ var TABalign = TABinfo[1].match(/^\s*\{([^\}]+)\}/);\r
+ TABinfo = TABinfo[1].replace(/^\s*\{[^\}]+\}/,"");\r
+ TABinfo = TABinfo.replace(/\\hline/g,""); //no horizontal bars\r
+ TABalign[1] = TABalign[1].replace(/\|/g,""); //no vertical bars\r
+ TABalign[1] = TABalign[1].replace(/\s/g,"");\r
+ TABinfo = TABinfo.split("\\\\"); // into rows\r
+ for(row=0;row<TABinfo.length;row++) {\r
+ TABrow = document.createElement("tr");\r
+ TABinfo[row] = TABinfo[row].split("&");\r
+ for(col=0;col<TABinfo[row].length;col++) {\r
+ TABcell = document.createElement("td");\r
+ switch (TABalign[1].charAt(col)) {\r
+ case "l":\r
+ TABcell.style.textAlign = "left";\r
+ break;\r
+ case "c":\r
+ TABcell.style.textAlign = "center";\r
+ break;\r
+ case "r":\r
+ TABcell.style.textAlign = "right";\r
+ break;\r
+ default :\r
+ TABcell.style.textAlign = "left";\r
+ };\r
+ TABcell.appendChild(document.createTextNode(TABinfo[row][col]));\r
+ TABrow.appendChild(TABcell);\r
+ }\r
+ TABtbody.appendChild(TABrow);\r
+ }\r
+ nodeTmp.appendChild(TABtbody);\r
+ }\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "logicalbreak":\r
+ var nodeTmp = document.createElement("p");\r
+ nodeTmp.className = strtmparray[1];\r
+ nodeTmp.appendChild(document.createTextNode("\u00A0"));\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "appendix":\r
+ inAppendix=true;\r
+ sectionCntr=0;\r
+ break;\r
+ case "alistitem":\r
+ var EndDiv = document.createElement("div");\r
+ EndDiv.className = "endlistitem";\r
+ newFrag.appendChild(EndDiv);\r
+ var BegDiv = document.createElement("div");\r
+ BegDiv.className = "listitem";\r
+ if(strtmparray[1]!=" ") {\r
+ var BegSpan = document.createElement("span");\r
+ BegSpan.className="listitemmarker";\r
+ var boldBegSpan = document.createElement("b");\r
+ boldBegSpan.appendChild(document.createTextNode(strtmparray[1]+" "));\r
+ BegSpan.appendChild(boldBegSpan);\r
+ BegDiv.appendChild(BegSpan);\r
+ }\r
+ newFrag.appendChild(BegDiv);\r
+ break;\r
+ case "br":\r
+ newFrag.appendChild(document.createElement("br"));\r
+ break;\r
+ case "bibitem":\r
+ newFrag.appendChild(document.createElement("br"));\r
+ var nodeTmp = document.createElement("a");\r
+ nodeTmp.className = 'bibitem';\r
+ var nodeSpan = document.createElement("span");\r
+ nodeSpan.className = 'bibitem';\r
+\r
+ bibcntr++;\r
+\r
+ var lbl = strtmparray[1].match(/\{s*(\w+)\s*\}/);\r
+ strtmparray[1] = strtmparray[1].replace(/\s*\{s*\w+\s*\}/g,"");\r
+ strtmparray[1] = strtmparray[1].replace(/^\s*\[/,"");\r
+ strtmparray[1] = strtmparray[1].replace(/\s*\]$/,"");\r
+ strtmparray[1] = strtmparray[1].replace(/^\s+|\s+$/g,"");\r
+ //We create a list of id's for the bibitems -- it seemed important at one time??\r
+ if(lbl==null) {\r
+ biblist[bibcntr] = "bibitem"+bibcntr\r
+ } else {\r
+ biblist[bibcntr] = lbl[1];\r
+ };\r
+ nodeTmp.name = biblist[bibcntr];\r
+ nodeTmp.id = biblist[bibcntr];\r
+ // We place content into <a> -- access it with \cite, thus allowing appropriate labels!\r
+ if(strtmparray[1]!="") {\r
+ nodeSpan.appendChild(document.createTextNode(strtmparray[1]));\r
+ } else {\r
+ nodeSpan.appendChild(document.createTextNode("["+bibcntr+"]"));\r
+ }\r
+ nodeTmp.appendChild(nodeSpan);\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "cite":\r
+ var nodeTmp = document.createElement("a");\r
+ nodeTmp.className = 'cite';\r
+ nodeTmp.name = 'cite';\r
+ nodeTmp.href = "#"+strtmparray[1];\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "ref":\r
+ var nodeTmp = document.createElement("a");\r
+ nodeTmp.className = 'ref';\r
+ nodeTmp.name = 'ref';\r
+ nodeTmp.href = "#"+strtmparray[1];\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ default :\r
+ var nodeTmp = document.createElement("div");\r
+ nodeTmp.className = strtmparray[0];\r
+ if( IsCounter.test(strtmparray[0]) ) {\r
+ LaTeXCounter[strtmparray[0]]++;\r
+ var nodeAnchor = document.createElement("a");\r
+ nodeAnchor.className = strtmparray[0];\r
+ var divnum = makeNumberString(LaTeXCounter[strtmparray[0]]);\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = strtmparray[0];\r
+ anchorSpan.appendChild(document.createTextNode(divnum));\r
+ anchorSpan.style.display="none";\r
+ nodeAnchor.appendChild(anchorSpan);\r
+ nodeTmp.appendChild(nodeAnchor);\r
+\r
+ var nodeSpan = document.createElement("span");\r
+ nodeSpan.className = strtmparray[0];\r
+ nodeSpan.appendChild(document.createTextNode(strtmparray[1]+" "+divnum+". "));\r
+ nodeTmp.appendChild(nodeSpan);\r
+ }\r
+ if(isIE) { //remove if IE supports :before and :after\r
+ if(strtmparray[0]==("thebibliography"||"abstract"||"keyword"||"proof")) {\r
+ var nodeSpan = document.createElement("span");\r
+ nodeSpan.className = strtmparray[0];\r
+ nodeSpan.appendChild(document.createTextNode(strtmparray[1]));\r
+ nodeTmp.appendChild(nodeSpan);\r
+ }\r
+ } //end of IE :before and :after fixes\r
+ if(strtmparray[0]=="endenumerate" || strtmparray[0]=="enditemize" || strtmparray[0]=="enddescription") {\r
+ var endDiv = document.createElement("div");\r
+ endDiv.className = "endlistitem";\r
+ newFrag.appendChild(endDiv);\r
+ }\r
+ newFrag.appendChild(nodeTmp);\r
+ if(strtmparray[0]=="enumerate" || strtmparray[0]=="itemize" || strtmparray[0]=="description") {\r
+ var endDiv = document.createElement("div");\r
+ endDiv.className = "listitem";\r
+ newFrag.appendChild(endDiv);\r
+ }\r
+ }\r
+ } else {\r
+ //even = text, labels, bf, and italics, and linebreaks, and math -- we now remove the math\r
+ strtmp[j] = strtmp[j].replace(/\\\$/g,"<per>");\r
+ strtmp[j] = strtmp[j].replace(/\$([^\$]+)\$/g," \\[$1\\[ ");\r
+ strtmp[j] = strtmp[j].replace(/<per>/g,"\\$");\r
+ strtmp[j] = strtmp[j].replace(/\\begin\s*\{s*math\s*\}([\s\S]+?)\\end\s*\{s*math\s*\}/g," \\[$1\\[ ");\r
+\r
+ var strtmptmp = strtmp[j].split("\\[");\r
+\r
+ for(var jjj=0;jjj<strtmptmp.length;jjj++) {\r
+ if(jjj % 2) { //odd = math\r
+ var nodeTmp = document.createElement("span");\r
+ nodeTmp.className = 'inlinemath';\r
+ nodeTmp.appendChild(document.createTextNode("$"+strtmptmp[jjj]+"$"));\r
+ newFrag.appendChild(nodeTmp);\r
+ } else {\r
+ //all other tags will be mapped to span's (most should be font-face tags) with class-names matching the tag name.\r
+ //Exceptions will be textcolor, colorbox, textbf, textit, and emph. These cannot include any html tags.\r
+ var TagIndex = strtmptmp[jjj].search(/\\\w+/);\r
+ var tmpIndex = TagIndex;\r
+ while(tmpIndex>-1) {\r
+ if(/^\\textcolor/.test(strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length))) {\r
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\textcolor\s*\{s*(\w+)\s*\}s*/," \\[textcolor\\]$1\\]|");\r
+ } else {\r
+ if(/^\\colorbox/.test(strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length))) {\r
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\colorbox\s*\{s*(\w+)\s*\}s*/," \\[colorbox\\]$1\\]|");\r
+ } else {\r
+ strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).replace(/\\\s*(\w+)\s*/," \\[$1\\]|");\r
+ }\r
+ }\r
+ TagIndex +=strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).search(/\|/);\r
+ TagIndex++;\r
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\]\|/,"\\] ");\r
+ if(strtmptmp[jjj].charAt(TagIndex) == "{") {\r
+ strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+strtmptmp[jjj].substring(TagIndex+1,strtmptmp[jjj].length);\r
+ var delimcnt = 1;\r
+ for(var kk = TagIndex;kk<strtmptmp[jjj].length;kk++) {\r
+ if(strtmptmp[jjj].charAt(kk) == "{") { delimcnt++ };\r
+ if(strtmptmp[jjj].charAt(kk) == "}") { delimcnt-- };\r
+ if(delimcnt==0) { break; }\r
+ }\r
+ strtmptmp[jjj] = strtmptmp[jjj].substring(0,kk)+"\\[ "+strtmptmp[jjj].substring(kk+1,strtmptmp[jjj].length);\r
+ TagIndex = kk+3;\r
+ } else {\r
+ strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+"\\[ "+strtmptmp[jjj].substring(TagIndex+1,strtmptmp[jjj].length);\r
+ TagIndex = TagIndex + 3;\r
+ }\r
+ if(TagIndex<strtmptmp[jjj].length) {\r
+ tmpIndex = strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).search(/\\\w+/);\r
+ }\r
+ else {\r
+ tmpIndex = -1 };\r
+ TagIndex += tmpIndex;\r
+ }\r
+\r
+\r
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\\\s*\\\\/g,"\\\\");\r
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\\/g," \\[br\\] \\[ ");\r
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\label\s*\{s*(\w+)\s*\}/g," \\[label\\]$1\\[ ");\r
+ var strlbls = strtmptmp[jjj].split("\\[");\r
+\r
+ for(var jj=0;jj<strlbls.length;jj++) {\r
+ if(jj % 2) { //odd = labels, boldface, and breaks\r
+ var strtmparray = strlbls[jj].split("\\]");\r
+ switch(strtmparray[0]) {\r
+ case "textcolor":\r
+ var nodeTmp = document.createElement("span");\r
+ nodeTmp.className = 'LaTeXColor';\r
+ if(IsColorName.test(strtmparray[1].toLowerCase())) {\r
+ nodeTmp.style.color=LaTeXColor[strtmparray[1].toLowerCase()];\r
+ } else {\r
+ nodeTmp.style.color=strtmparray[1];\r
+ };\r
+ nodeTmp.appendChild(document.createTextNode(strtmparray[2]));\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "colorbox":\r
+ var nodeTmp = document.createElement("span");\r
+ nodeTmp.className = 'LaTeXColor';\r
+ if(IsColorName.test(strtmparray[1].toLowerCase())) {\r
+ nodeTmp.style.background=LaTeXColor[strtmparray[1].toLowerCase()];\r
+ } else {\r
+ nodeTmp.style.background=strtmparray[1];\r
+ };\r
+ nodeTmp.appendChild(document.createTextNode(strtmparray[2]));\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ case "br":\r
+ newFrag.appendChild(document.createElement("br"));\r
+ break;\r
+ case "label" :\r
+ var nodeTmp = document.createElement("a");\r
+ nodeTmp.className = 'LaTeXMathMLlabel';\r
+ var lblid = strtmparray[1].match(/\s*(\w+)\s*/);\r
+ if(lblid != null) { nodeTmp.id = lblid[1] };\r
+ nodeTmp.style.display = "none";\r
+\r
+ LaTeXCounter['label']++;\r
+ var lblnum = makeNumberString(LaTeXCounter['label']);\r
+\r
+ var anchorSpan = document.createElement("span");\r
+ anchorSpan.className = 'LaTeXMathMLlabel';\r
+ anchorSpan.appendChild(document.createTextNode(lblnum));\r
+ anchorSpan.style.display="none";\r
+ nodeTmp.appendChild(anchorSpan);\r
+ newFrag.appendChild(nodeTmp);\r
+ break;\r
+ default :\r
+ var nodeTmp = document.createElement("span");\r
+ nodeTmp.className = strtmparray[0];\r
+ nodeTmp.appendChild(document.createTextNode(strtmparray[1]))\r
+ newFrag.appendChild(nodeTmp);\r
+ }\r
+ } else {\r
+ newFrag.appendChild(document.createTextNode(strlbls[jj]));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } // end else for even splits of strtmp\r
+ }\r
+ }\r
+ }; //else sections and labels\r
+ TheBody.parentNode.replaceChild(newFrag,TheBody);\r
+ } //str nodevalue is not empty\r
+ }\r
+ } // split off recursion\r
+ return TheBody;\r
+}\r
+\r
+function LaTeXDivsAndRefs(thebody) {\r
+ var TheBody = thebody;\r
+\r
+ var EndDivClass = null;\r
+ var AllDivs = TheBody.getElementsByTagName("div");\r
+ var lbl2id = "";\r
+ var lblnode = null;\r
+ for(var i=AllDivs.length-1;i>=0;i--) {\r
+ EndDivClass = AllDivs[i].className.match(/end\w+/ );\r
+ if(EndDivClass!=null) {\r
+ EndDivClass = EndDivClass[0];\r
+ var DivClass = EndDivClass.substring(3,EndDivClass.length);\r
+ var EndDivNode = AllDivs[i];\r
+ break;\r
+ }\r
+ }\r
+ while(EndDivClass!=null) {\r
+ // TrackBack to Beginning, appending to newfrag as we go\r
+ var newFrag = document.createDocumentFragment();\r
+ var RootNode = EndDivNode.parentNode;\r
+ var ClassCount = 1; // because of EndDivNode\r
+ while(EndDivNode.previousSibling!=null && ClassCount>0) {\r
+ switch(EndDivNode.previousSibling.className) {\r
+ case EndDivClass:\r
+ ClassCount++;\r
+ newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);\r
+ break;\r
+ case DivClass:\r
+ if(EndDivNode.previousSibling.nodeName=="DIV") {\r
+ ClassCount-- ;\r
+ //Must check to see if we need a label here!\r
+ if(lbl2id !="" ) {\r
+ EndDivNode.previousSibling.id = lbl2id;\r
+ lbl2id = ""\r
+ }\r
+ if(ClassCount==0) {\r
+ RootNode = EndDivNode.previousSibling;\r
+ } else {\r
+ newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);\r
+ }\r
+ };\r
+ break;\r
+ case 'LaTeXMathMLlabel':\r
+ lbl2id = EndDivNode.previousSibling.id;\r
+ EndDivNode.parentNode.removeChild(EndDivNode.previousSibling);\r
+ break;\r
+ default:\r
+ newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);\r
+ }\r
+ }\r
+ RootNode.appendChild(newFrag);\r
+ EndDivNode.parentNode.removeChild(EndDivNode);\r
+\r
+ //Look for more end div items\r
+ AllDivs = TheBody.getElementsByTagName("DIV");\r
+ for(i=AllDivs.length-1;i>=0;i--) {\r
+ EndDivClass = AllDivs[i].className.match(/end\w+/ );\r
+ if(EndDivClass!=null) {\r
+ ClassCount = 0;\r
+ EndDivClass = EndDivClass[0];\r
+ DivClass = EndDivClass.substring(3,EndDivClass.length);\r
+ EndDivNode = AllDivs[i];\r
+ RootNode = EndDivNode.parentNode;\r
+ break;\r
+ }\r
+ }\r
+ } // end while!\r
+\r
+\r
+\r
+\r
+ var AllDivs = TheBody.getElementsByTagName("div"); //Convert itemize and enumerate to html lists:\r
+ var DIV2LI = null;\r
+\r
+ for(var i=0;i<AllDivs.length;i++) {\r
+ if( AllDivs[i].className=="itemize" || AllDivs[i].className=="enumerate" || AllDivs[i].className=="description") {\r
+ if(AllDivs[i].className=="itemize") {\r
+ RootNode = document.createElement("UL");\r
+ } else {\r
+ RootNode = document.createElement("OL");\r
+ }\r
+ RootNode.className = 'LaTeXMathML';\r
+ if(AllDivs[i].hasChildNodes()) { AllDivs[i].removeChild(AllDivs[i].firstChild) };\r
+ while(AllDivs[i].hasChildNodes()) {\r
+ if(AllDivs[i].firstChild.hasChildNodes()) {\r
+ DIV2LI = document.createElement("LI");\r
+ while(AllDivs[i].firstChild.hasChildNodes()) {\r
+ DIV2LI.appendChild(AllDivs[i].firstChild.firstChild);\r
+ }\r
+ if(DIV2LI.firstChild.className=="listitemmarker") {\r
+ DIV2LI.style.listStyleType = "none";\r
+ }\r
+ RootNode.appendChild(DIV2LI)\r
+ }\r
+ AllDivs[i].removeChild(AllDivs[i].firstChild);\r
+ }\r
+ AllDivs[i].appendChild(RootNode);\r
+ }\r
+ }\r
+\r
+ // From here to 'end for AllAnchors is necessary only because CSS3 is not implemented yet.\r
+ // Once CSS3 target-text is available, this can be done using CSS\r
+ var AllAnchors = TheBody.getElementsByTagName("a");\r
+ for(var i=0;i<AllAnchors.length;i++) {\r
+ if(AllAnchors[i].className == "ref" || AllAnchors[i].className == "cite" ) {\r
+ var label = AllAnchors[i].href.match(/\#(\w+)/);\r
+ if(label!=null) {\r
+ var labelNode = document.getElementById(label[1]);\r
+ if(labelNode!=null) {\r
+ var TheSpans = labelNode.getElementsByTagName("SPAN");\r
+ if(TheSpans!=null) {\r
+ var refNode = TheSpans[0].cloneNode(true);\r
+ refNode.style.display="inline"\r
+ refNode.className = AllAnchors[i].className;\r
+ AllAnchors[i].appendChild(refNode);\r
+ //break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } // end for AllAnchors\r
+\r
+ // Eventually: Collapsible Sections\r
+\r
+ return TheBody;\r
+}\r
+\r
+var AMbody;\r
+var AMnoMathML = false, AMtranslated = false;\r
+\r
+function translate(spanclassAM) {\r
+ if (!AMtranslated) { // run this only once\r
+ AMtranslated = true;\r
+ AMinitSymbols();\r
+ var LaTeXContainers = [];\r
+ var AllContainers = document.getElementsByTagName('*');\r
+ var ExtendName = "";\r
+\r
+ for (var k = 0,l=0; k < AllContainers.length; k++) {\r
+ ExtendName = " "+AllContainers[k].className+" ";\r
+ if(ExtendName.match(/\sLaTeX\s/)!=null) {\r
+ LaTeXContainers[l] = AllContainers[k];\r
+ l++;\r
+ }\r
+ };\r
+ if(LaTeXContainers.length>0) {\r
+ for(var m=0;m<LaTeXContainers.length;m++) {\r
+ AMbody = LaTeXContainers[m];\r
+ try {\r
+ AMbody = LaTeXDivsAndRefs(LaTeXpreProcess(AMbody)); //\r
+ } catch(err) {\r
+ alert("Unknown Error: Defaulting to Original LaTeXMathML");\r
+ }\r
+ if(AMbody.tagName=="PRE") {\r
+ var PreChilds = document.createDocumentFragment();\r
+ var DivChilds = document.createElement("DIV");\r
+ while(AMbody.hasChildNodes()) {\r
+ DivChilds.appendChild(AMbody.firstChild);\r
+ }\r
+ PreChilds.appendChild(DivChilds);\r
+ AMbody.parentNode.replaceChild(PreChilds,AMbody);\r
+ AMbody = DivChilds; //Leaves empty pre -- may be useful??\r
+\r
+ }\r
+ AMprocessNode(AMbody, false, spanclassAM);\r
+ }\r
+ } else { //Default to entire page\r
+ AMbody = document.getElementsByTagName("body")[0];\r
+ try {\r
+ AMbody = LaTeXDivsAndRefs(LaTeXpreProcess(AMbody)); //\r
+ } catch(err) {\r
+ alert("Unknown Error: Defaulting to Original LaTeXMathML");\r
+ }\r
+ AMprocessNode(AMbody, false, spanclassAM);\r
+ }\r
+ }\r
+}\r
+\r
+if (isIE) {\r
+ // avoid adding MathPlayer info explicitly to each webpage\r
+ document.write("<object id=\"mathplayer\"\\r
+ classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");\r
+ document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");\r
+}\r
+\r
+// GO1.1 Generic onload by Brothercake\r
+// http://www.brothercake.com/\r
+//onload function (replaces the onload="translate()" in the <body> tag)\r
+function generic()\r
+{\r
+ translate();\r
+};\r
+//setup onload function\r
+if(typeof window.addEventListener != 'undefined')\r
+{\r
+ //.. gecko, safari, konqueror and standard\r
+ window.addEventListener('load', generic, false);\r
+}\r
+else if(typeof document.addEventListener != 'undefined')\r
+{\r
+ //.. opera 7\r
+ document.addEventListener('load', generic, false);\r
+}\r
+else if(typeof window.attachEvent != 'undefined')\r
+{\r
+ //.. win/ie\r
+ window.attachEvent('onload', generic);\r
+}\r
+//** remove this condition to degrade older browsers\r
+else\r
+{\r
+ //.. mac/ie5 and anything else that gets this far\r
+ //if there's an existing onload function\r
+ if(typeof window.onload == 'function')\r
+ {\r
+ //store it\r
+ var existing = onload;\r
+ //add new onload handler\r
+ window.onload = function()\r
+ {\r
+ //call existing onload function\r
+ existing();\r
+ //call generic onload function\r
+ generic();\r
+ };\r
+ }\r
+ else\r
+ {\r
+ //setup onload function\r
+ window.onload = generic;\r
+ }\r
+}\r
+/*]]>*/\r
+</script>\r
+</head>\r
+<body class="article">\r
+<div id="header" class="slide hledgersplash">\r
+<h1>Informatiser une comptabilité avec confiance</h1>\r
+<span id="author">git://git.autogeree.net/tool/hledger</span><br />\r
+<span id="revnumber">version 6ca58eb</span>\r
+<br /><span id="revremark"></span>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_le_code_ledger_code_un_format_de_em_grand_livre_em_ouvert_et_simple">1. Le <code>.ledger</code> : un format de <em>Grand Livre</em> ouvert.. et simple</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="1. Le <code>.ledger</code> : un format de <em>Grand Livre</em> ouvert.. et simple";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+<span class="hledgerTransactionDate">2014/05/01</span> <span class="hledgerTransactionDescription">Stand manif</span>\r
+<span class="hledgerPostingAccount"> Don</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Anonyme</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">42</span>\r
+<span class="hledgerPostingAccountOdd"> Caisse</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Grève</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">42</span>\r
+\r
+<span class="hledgerTransactionDate">2014/05/08</span> <span class="hledgerTransactionDescription">Propagande</span>\r
+<span class="hledgerPostingAccount"> Caisse</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Grève</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">7</span>\r
+<span class="hledgerPostingAccountOdd"> Achat</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Impression</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Tracts</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">7</span>\r
+\r
+<span class="Comment">; Répéter ad nauseam</span>\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_les_plus">1.1. Les plus</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="1.1. Les plus";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+Transparent\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Visibilité de <em>toutes</em> les informations.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Pérenne\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Compréhensible sans peine.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Modifiable\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Pas d’interface protectrice.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Accès\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Pas de changement d’interface non-consenti.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Versionnable\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Suivi et fusion simples des modifications.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Écrit\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Langage pour s’exprimer clairement, par exemple pour discuter dans un courriel.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Hors-ligne\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Pas besoin de réseau.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Interopérable\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Pas spécifique à un éditeur logiciel particulier\r
+(sauf fonctionnalité expérimentale).\r
+</p>\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<a href="http://ledger-cli.org/">http://ledger-cli.org/</a>\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+<a href="http://hledger.org/">http://hledger.org/</a>\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+<a href="http://furius.ca/beancount/">http://furius.ca/beancount/</a>\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+<a href="https://massysett.github.io/penny/">https://massysett.github.io/penny/</a>\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+<a href="https://github.com/hrj/abandon/">https://github.com/hrj/abandon/</a>\r
+</span>\r
+</li>\r
+</ul>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_les_moins">1.2. Les moins</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="1.2. Les moins";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+Modifiable\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Mais pas moins que les autres logiciels\r
+et à nuancer si couplé à un gestionnaires de versions,\r
+et/ou avec signature cryptographiques.\r
+</p>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% git tag <span class="Special">--sign</span> v2011 <span class="Special">-m</span> <span class="Statement">"</span><span class="Constant">Clôture de la comptabilité 2011</span><span class="Statement">"</span>\r
+% git tag <span class="Special">--verify</span> v2011\r
+</pre></div></div>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% gpg <span class="Special">--sign</span> <span class="PreProc">$fichier</span>.hledger\r
+% gpg <span class="Special">--verify-files</span> <span class="PreProc">$fichier</span>.hledger.gpg\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Textuel\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Préférable de bien savoir utiliser\r
+un éditeur de texte structuré.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Peu contraint\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+<span class="hledgerTransactionDate">2102/03/21</span> <span class="hledgerTransactionDescription">Remise chq (1101804)</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">5</span><span class="hledgerPostingAccount">.Finance</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Etablissement</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Valeur</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">2</span><span class="hledgerPostingAccount">.Chèque_à_encaisser</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">145</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">5</span><span class="hledgerPostingAccountOdd">.Finance</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">1</span><span class="hledgerPostingAccountOdd">.Etablissement</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Banque</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">001</span><span class="hledgerPostingAccountOdd">.Courant</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">145</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">00</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+<div class="admonitionblock incremental">\r
+<table><tr>\r
+<td class="icon">\r
+<img src="./icons/note.png" alt="Note" />\r
+</td>\r
+<td class="content">KISS</td>\r
+</tr></table>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_code_hledger_code_un_outil_libre_et_convivial">2. <code>hledger</code> : un outil libre.. et convivial</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="2. <code>hledger</code> : un outil libre.. et convivial";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% hledger balance <span class="Statement">'</span><span class="Constant">^6</span><span class="Statement">'</span> <span class="Statement">'</span><span class="Constant">^7</span><span class="Statement">'</span> <span class="Special">--depth</span> <span class="Constant">2</span> <span class="Special">-f</span> Paris.2011.hledger\r
+ <span class="Constant">770</span>,<span class="Constant">58</span>€ 6.Charge\r
+ <span class="Constant">248</span>,<span class="Constant">87</span>€ 0.Achat\r
+ <span class="Constant">441</span>,<span class="Constant">46</span>€ 1.Service\r
+ <span class="Constant">55</span>,<span class="Constant">25</span>€ 2.Autre_service\r
+ <span class="Constant">25</span>,<span class="Constant">00</span>€ 5.Gestion\r
+ <span class="Constant">-726</span>,<span class="Constant">00</span>€ 7.Produit\r
+ <span class="Constant">-700</span>,<span class="Constant">00</span>€ 0.Vente\r
+ <span class="Constant">-26</span>,<span class="Constant">00</span>€ 5.Autre_gestion_courante\r
+‑-------------------\r
+ <span class="Constant">44</span>,<span class="Constant">58</span>€\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_les_plus_2">2.1. Les plus</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="2.1. Les plus";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="dlist"><dl class=" incremental">\r
+<dt class="hdlist1">\r
+Utilisation\r
+</dt>\r
+<dt class="hdlist1">\r
+Étude\r
+</dt>\r
+<dt class="hdlist1">\r
+Modification\r
+</dt>\r
+<dt class="hdlist1">\r
+Duplication\r
+</dt>\r
+<dd>\r
+<p>\r
+Permises techniquement et légalement<br />\r
+(« logiciel libre » sous <code>GNU/GPLv3</code>)\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+Certification\r
+</dt>\r
+<dd>\r
+<p>\r
+Programmé en <a href="http://fr.wikipedia.org/wiki/Haskell">Haskell</a>\r
+</p>\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+Fonctionnel pur\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Aucune mutation de données externes à une fonction (effet de bord).\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Typage statique\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Vérification des erreurs de type avant l’exécution du programme.\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Typage fort\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+Aucune conversion implicite de types de données.\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+Portable\r
+</dt>\r
+<dd>\r
+<p>\r
+GNU/Linux, Apple/MacOS, Microsoft/Windows\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
+Support\r
+</dt>\r
+<dd>\r
+<p>\r
+~1 développeur à mi-temps\r
+</p>\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+Simon Michael <<a href="mailto:simon@joyful.com">simon@joyful.com</a>>\r
+</span>\r
+</li>\r
+</ul>\r
+</dd>\r
+<dt class="hdlist1">\r
+Ligne de commande\r
+</dt>\r
+<dd>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+ % hledger balance <span class="Special">-f</span> <span class="PreProc">$fichier</span>.hledger\r
+</pre></div></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+Interface Web\r
+</dt>\r
+<dd>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+ % hledger-web <span class="Special">--server</span> <span class="Special">-f</span> <span class="PreProc">$fichier</span>.hledger\r
+ % firefox <span class="Statement">"</span><span class="Constant"><a href="http://localhost:5000">http://localhost:5000</a></span><span class="Statement">"</span>\r
+</pre></div></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+Extensible\r
+</dt>\r
+<dd>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+ % ghc hledger-fait-ce-que-je-veux.hs\r
+ % ./hledger-fait-ce-que-je-veux <span class="Special">-f</span> <span class="PreProc">$fichier</span>.hledger\r
+</pre></div></div>\r
+</dd>\r
+</dl></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_les_moins_2">2.2. Les moins</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="2.2. Les moins";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="dlist"><dl class=" incremental">\r
+<dt class="hdlist1">\r
+Ligne de commande\r
+</dt>\r
+<dd>\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>…</p>\r
+</div>\r
+</div>\r
+</dd>\r
+</dl></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_installer_code_hledger_code">3. Installer <code>hledger</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="3. Installer <code>hledger</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<a href="http://hledger.org/installing">http://hledger.org/installing</a>\r
+</span>\r
+</li>\r
+</ul>\r
+<div class="listingblock incremental">\r
+<div class="title">Debian/jessie</div>\r
+<div class="content"><pre>\r
+% sudo apt-get install hledger hledger-web\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_via_code_cabal_code">3.1. Via <code>cabal</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="3.1. Via <code>cabal</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<a href="http://www.haskell.org/cabal/">http://www.haskell.org/cabal/</a>\r
+</span>\r
+</li>\r
+</ul>\r
+<div class="listingblock incremental">\r
+<div class="title">Debian/wheezy</div>\r
+<div class="content"><pre>\r
+% <span class="Statement">echo</span><span class="Constant"> </span><span class="Statement">'</span><span class="Constant">PATH="$HOME/.cabal/bin:$PATH"</span><span class="Statement">'</span><span class="Constant"> </span><span class="Statement">>></span>~/.profile\r
+ <span class="Comment"># NOTE: rajoute dans le chemins des exécutables</span>\r
+ <span class="Comment"># les exécutables installés par cabal</span>\r
+% <span class="Statement">exit</span> <span class="Comment"># NOTE: recharge ~/.profile</span>\r
+\r
+% sudo apt-get install ghc cabal-install <span class="Statement">\</span>\r
+ libncurses5-dev libtinfo-dev zlib1g-dev\r
+% cabal update\r
+% cabal install cabal <span class="Comment"># NOTE: met à jour cabal</span>\r
+% cabal install happy <span class="Comment"># NOTE: anticipe une dépendance exécutable</span>\r
+% cabal install hledger\r
+% cabal install alex <span class="Comment"># NOTE: anticipe une dépendance exécutable</span>\r
+% cabal install warp-2.0.3.4 hledger-web\r
+ <span class="Comment"># NOTE: aide cabal à sélectionner un warp qui fonctionne</span>\r
+</pre></div></div>\r
+<div class="listingblock incremental">\r
+<div class="title">Mise-à-jour</div>\r
+<div class="content"><pre>\r
+% cabal install <span class="Special">--reinstall</span> hledger hledger-web\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect3">\r
+<h1 id="_version_de_développement">3.1.1. Version de développement</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect3";nexttitle="3.1.1. Version de développement";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% git clone <a href="http://github.com/simonmichael/hledger.git">http://github.com/simonmichael/hledger.git</a> ~/src/hledger\r
+% <span class="Statement">cd</span> ~/src/hledger\r
+% cabal install <span class="Special">--reinstall</span> <span class="Special">--force-reinstalls</span> <span class="Statement">\</span>\r
+ ./hledger-lib ./hledger ./hledger-web\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_écrire_en_code_ledger_code">4. Écrire en <code>.ledger</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="4. Écrire en <code>.ledger</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>Un <code>.ledger</code> est un fichier de texte brut respectant une syntaxe préçise\r
+qui forme une succession d’écritures comptables, ordonnées librement.</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_exemple">4.1. Exemple</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="4.1. Exemple";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+<span class="Comment">; Ceci est un exemple de livre comptable « ledger »</span>\r
+<span class="Comment">; NOTE: fantaisiste comptablement parlant, mais syntaxiquement correct</span>\r
+\r
+<span class="hledgerTransactionDate">2014/01/01</span> <span class="hledgerTransactionDescription">Libellé de l’écriture </span><span class="hledgerTransactionComment">; </span><span class="hledgerTag">UN_TAG:</span><span class="hledgerTransactionComment">, </span><span class="hledgerTag">Autre_tag:</span><span class="hledgerTagValue">Avec_Valeur</span>\r
+<span class="hledgerPostingAccount"> Compte</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Sous-Compte</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">42</span> <span class="hledgerTransactionComment">; flux créditant</span>\r
+<span class="hledgerPostingAccountOdd"> Autre_Compte</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Sous-Compte</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Sous-Sous-Compte</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">42</span> <span class="hledgerTransactionComment">; flux débitant</span>\r
+\r
+<span class="hledgerTransactionDate">2014/01/01</span> <span class="hledgerTransactionDescription">Deuxième écriture le même jour</span>\r
+<span class="hledgerPostingAccount"> Vente</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Âme</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">666</span> <span class="hledgerTransactionComment">; (tag de flux) </span><span class="hledgerTag">Arnaque:</span>\r
+<span class="hledgerPostingAccountOdd"> Kapital</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">666</span>\r
+\r
+<span class="hledgerTransactionDate">2014/01/02</span> <span class="hledgerTransactionDescription">Troisième écriture le jour suivant avec ventilation des flux</span>\r
+<span class="hledgerPostingAccount"> Compte</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Crédité</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">A</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">1</span>\r
+<span class="hledgerPostingAccountOdd"> Compte</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Crédité</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">B</span><span class="hledgerPostingAmountOdd"> -</span><span class="hledgerNumberOdd">2</span>\r
+<span class="hledgerPostingAccount"> Compte</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Débité</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Z</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">1</span>\r
+<span class="hledgerPostingAccountOdd"> Compte</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Débité</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Y</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">1</span>\r
+<span class="hledgerPostingAccount"> Compte</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Débité</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">X</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">x</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">1</span>\r
+\r
+<span class="hledgerTransactionDate">2014/04/12</span>\r
+<span class="hledgerPostingAccount"> Compte</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Crédité</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">1234</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">56</span>\r
+<span class="hledgerPostingAccountOdd"> Compte</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Débité</span> <span class="hledgerTransactionComment">; 1234,56 (montant inféré)</span>\r
+\r
+<span class="hledgerTransactionDate">2014/02/01</span> <span class="hledgerTransactionDescription">Écriture non ordonnée par date </span><span class="hledgerTransactionComment">; Ok, mais déconseillé</span>\r
+<span class="hledgerPostingAccount"> Compte</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">Débité</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">1</span>\r
+<span class="hledgerPostingAccountOdd"> Compte</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerPostingAccountOdd">Crédité</span><span class="hledgerPostingAmountOdd"> -</span><span class="hledgerNumberOdd">1</span> <span class="hledgerTransactionComment">; Flux non ordonné par crédit/débit</span>\r
+ <span class="hledgerTransactionDescription"> </span><span class="hledgerTransactionComment">; c'est juste moins lisible...</span>\r
+\r
+<span class="Comment">; Répéter ad nauseam</span>\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_langage">4.2. Langage</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="4.2. Langage";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="tableblock">\r
+<table rules="all"\r
+width="100%"\r
+frame="border"\r
+cellspacing="0" cellpadding="4">\r
+<col width="50%" />\r
+<col width="50%" />\r
+<thead>\r
+<tr>\r
+<th align="center" valign="top">Syntaxe (grammaire <a href="https://fr.wikipedia.org/wiki/Forme_de_Backus-Naur">BNF</a>)</th>\r
+<th align="center" valign="top">Structure (signatures fonctionnelles)</th>\r
+</tr>\r
+</thead>\r
+<tbody class="incremental">\r
+<tr>\r
+<td align="left" valign="top"><div><div class="listingblock incremental">\r
+<div class="content"><pre>\r
+livre ::= (écriture | commentaire | <span class="Constant">"⏎"</span> | <span class="Constant">"␣"</span>)*\r
+</pre></div></div></div></td>\r
+<td align="left" valign="top"><div><div class="hdlist math"><table><tbody class=" incremental math">\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>livre</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>f:\textcolor{#D2691E}{\textbf{fichier}} →\r
+ \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div></div></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><div><div class="listingblock incremental">\r
+<div class="content"><pre>\r
+écriture ::= date <span class="Constant">"␣"</span> <span class="Constant">"␣"</span>* libellé commentaire <span class="Constant">"⏎"</span>\r
+ (<span class="Constant">"␣"</span> flux <span class="Constant">"⏎"</span>)*\r
+date ::= (année <span class="Constant">"/"</span>)? mois <span class="Constant">"/"</span> jour\r
+libellé ::= (· - (<span class="Constant">";"</span>|<span class="Constant">"⏎"</span>))*\r
+</pre></div></div></div></td>\r
+<td align="left" valign="top"><div><div class="hdlist math"><table><tbody class=" incremental math">\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>date</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →\r
+ (\textcolor{#083194}{\textbf{ann\acute{e}e}}:\textcolor{#D2691E}{\textbf{ℕ}},~\r
+ \textcolor{#083194}{\textbf{mois}}:\{\textcolor{#D2691E}{\textbf{01}},...,\textcolor{#D2691E}{\textbf{12}}\},~\r
+ \textcolor{#083194}{\textbf{jour}}:\{\textcolor{#D2691E}{\textbf{01}},...,\textcolor{#D2691E}{\textbf{31}}\})$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>libellé</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →\r
+ \textcolor{#D2691E}{\textbf{texte}}$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>commentaire</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →\r
+ \textcolor{#D2691E}{\textbf{texte}}$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>tags</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →\r
+ \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack\r
+ \ =\ \textbf{tags}~(\textbf{commentaire}~e)$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>flux</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →\r
+ \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div></div></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><div><div class="listingblock incremental">\r
+<div class="content"><pre>\r
+flux ::= compte <span class="Constant">"␣␣"</span> <span class="Constant">"␣"</span>* (<span class="Constant">"-"</span> crédit | débit) (<span class="Constant">"␣"</span>|<span class="Constant">"⏎"</span>)* commentaire\r
+compte ::= nom ( <span class="Constant">":"</span> nom )*\r
+nom ::= (· - (<span class="Constant">":"</span>|<span class="Constant">"⏎"</span>)) (· - (<span class="Constant">":"</span>|<span class="Constant">"⏎"</span>))*\r
+crédit ::= quantité\r
+débit ::= quantité\r
+</pre></div></div></div></td>\r
+<td align="left" valign="top"><div><div class="hdlist math"><table><tbody class=" incremental math">\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>compte</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>f:\textcolor{#D2691E}{\textbf{flux}} →\r
+ \lbrack\textcolor{#D2691E}{\textbf{nom}}\rbrack$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>montant</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>f:\textcolor{#D2691E}{\textbf{flux}} → \textcolor{#D2691E}{ℚ} = \displaystyle{\r
+ \left\{\begin{array}{ll} -~(\textbf{cr\acute{e}dit}~f) & \mathit{\mbox{si défini}} \\\r
+ (\textbf{d\acute{e}bit}~f) & \mathit{\mbox{sinon}}\r
+ \end{array}\right}$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>tags</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>f:\textcolor{#D2691E}{\textbf{flux}} →\r
+ \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack\r
+ \ =\ \textbf{tags}~(\textbf{commentaire}~f)$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div></div></td>\r
+</tr>\r
+<tr>\r
+<td align="left" valign="top"><div><div class="listingblock incremental">\r
+<div class="content"><pre>\r
+commentaire ::= ( <span class="Constant">";"</span> (tag <span class="Constant">":"</span> valeur? | ·)* )\r
+ ( (<span class="Constant">"⏎"</span>|<span class="Constant">"␣"</span>)* <span class="Constant">";"</span> (tag <span class="Constant">":"</span> valeur? | ·)* )*\r
+</pre></div></div></div></td>\r
+<td align="left" valign="top"><div><div class="hdlist math"><table><tbody class=" incremental math">\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>tags</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>m:\textcolor{#D2691E}{\textbf{commentaire}} →\r
+ \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>tag</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<span class=" LaTeX ">$\r
+ :\>(\textcolor{#083194}{\textbf{tag}}:\textcolor{#D2691E}{\textbf{texte}},%\r
+ ~\textcolor{#083194}{\textbf{valeur}}:\textcolor{#D2691E}{\textbf{\mbox{texte}}\>?})$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div></div></td>\r
+</tr>\r
+</tbody>\r
+</table>\r
+</div>\r
+<div class="admonitionblock incremental">\r
+<table><tr>\r
+<td class="icon">\r
+<img src="./icons/note.png" alt="Note" />\r
+</td>\r
+<td class="content">RTFM @ <a href="http://hledger.org/manual/">http://hledger.org/manual/</a>.</td>\r
+</tr></table>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_calculs">4.3. Calculs</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="4.3. Calculs";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>compte_parent</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+ <span class=" LaTeX ">$:\>c : \textcolor{#D2691E}{\textbf{compte}} → \textcolor{#D2691E}{\textbf{compte}}\>?$</span><br />\r
+ <span class=" LaTeX ">$=\>c_{\lbrack0,\cdots,|c|-2\rbrack}\ \mbox{si}\ |c| \ge 2$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>hiérarchie_de_compte</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+ <span class=" LaTeX ">$:\>\mathbb c : \textcolor{#D2691E}{\textbf{compte}} → \lbrack\textcolor{#D2691E}{\textbf{compte}}\rbrack$</span><br />\r
+ <span class=" LaTeX ">$=\>\lbrack{\ c\ :\ \lbrack{\ c\ |\ c ← (\mathbf{compte\mbox{_}parent}\>{c})}\ \rbrack}\ \rbrack$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>comptes</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+ <span class=" LaTeX ">$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → \{\textcolor{#D2691E}{\textbf{compte}}\}$</span><br />\r
+ <span class=" LaTeX ">$\{\ (\textbf{compte}\>f)\ |\ f ← (\textbf{flux}\>e)\ |\ e ← \mathbb E\ \}$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>balance</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+ <span class=" LaTeX ">$:\>\mathbb F : \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack → ℚ$</span><br />\r
+ <span class=" LaTeX ">$=\>{(\ m\ |\ m ← m + (\textbf{montant}\>f)\ |\ f ← \mathbb F\ |\ m ← 0\ )$</span><br />\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>solde_de_compte</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+ <span class=" LaTeX ">$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → c : \textcolor{#D2691E}{\textbf{compte}} → ℚ$</span><br />\r
+ <span class=" LaTeX ">$=\>{\textbf{balance}\>\lbrack{\ f\ |\ f ← (\textbf{flux}\>e),\ c\>≼\>(\textbf{compte}\>f)\ |\ e ← \mathbb E\ }\rbrack$</span><br />\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>solde</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+ <span class=" LaTeX ">$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack →\r
+ \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$</span><br />\r
+ <span class=" LaTeX ">$=\>\displaystyle{\left\lbrack\r
+ \begin{array}{l}\r
+ (\textcolor{#083194}{\textbf{compte}}=c´, \textcolor{#083194}{\textbf{montant}}=m) \\\r
+ |\ m ← (\mathbf{\mbox{solde_de_compte}}\,\mathbb E\,c´) \\\r
+ |\ c´ ← (\mathbf{hi\acute{e}rarchie\mbox{_}de\mbox{_}compte}\,c) \\\r
+ |\ c ← (\mathbf{comptes}\,\mathbb E)\r
+ \end{array}}\right\rbrack$</span>\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_utiliser_un_éditeur_de_texte_structuré_code_vim_code">4.4. Utiliser un éditeur de texte structuré (<code>vim</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="4.4. Utiliser un éditeur de texte structuré (<code>vim</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="dlist"><dl class=" incremental">\r
+<dt class="hdlist1">\r
+Coloration syntaxique sur mesure\r
+</dt>\r
+<dd>\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<code>hledger.vim</code>\r
+</span>\r
+<div class="listingblock incremental">\r
+<div class="title">~/.vimrc</div>\r
+<div class="content"><pre>\r
+<span class="Statement">autocmd</span> <span class="Type">BufNewFile</span>,<span class="Type">BufRead</span> *.hledger,*.ledger <span class="Statement">setfiletype</span> hledger\r
+</pre></div></div>\r
+</li>\r
+</ul>\r
+</dd>\r
+<dt class="hdlist1">\r
+Complètement automatique des comptes (<code><Tab></code>)\r
+</dt>\r
+<dd>\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<a href="https://github.com/Shougo/neocomplete.vim">https://github.com/Shougo/neocomplete.vim</a>\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+<a href="https://github.com/Shougo/neocomplcache.vim">https://github.com/Shougo/neocomplcache.vim</a>\r
+</span>\r
+<div class="listingblock incremental">\r
+<div class="title">~/.vimrc</div>\r
+<div class="content"><pre>\r
+<span class="Statement">autocmd</span> <span class="Type">Filetype</span> hledger <span class="Statement">set</span> <span class="PreProc">iskeyword</span>+=.<span class="Statement">,</span>38<span class="Statement">,</span>39<span class="Statement">,</span>40<span class="Statement">,</span>41<span class="Statement">,</span>44<span class="Statement">,</span>45<span class="Statement">,</span>58 "\r
+</pre></div></div>\r
+</li>\r
+</ul>\r
+</dd>\r
+<dt class="hdlist1">\r
+Alignement automatique des montants\r
+</dt>\r
+<dd>\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<a href="https://github.com/junegunn/vim-easy-align">https://github.com/junegunn/vim-easy-align</a>\r
+</span>\r
+<div class="listingblock incremental">\r
+<div class="title">~/.vimrc</div>\r
+<div class="content"><pre>\r
+ <span class="Statement">let</span> <span class="Identifier">g</span>:easy_align_ignore_groups <span class="Statement">=</span> [<span class="Constant">'Comment'</span>, <span class="Constant">'String'</span>, <span class="Constant">'hledgerTransaction'</span>]\r
+</pre></div></div>\r
+</li>\r
+</ul>\r
+</dd>\r
+</dl></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect3">\r
+<h1 id="_suivre_les_modifications_à_plusieurs_et_ou_à_distance_code_git_code">4.4.1. Suivre les modifications à plusieurs et/ou à distance (<code>git</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect3";nexttitle="4.4.1. Suivre les modifications à plusieurs et/ou à distance (<code>git</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_commandes_code_hledger_code">5. Commandes <code>hledger</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="5. Commandes <code>hledger</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_calculer_des_soldes_code_balance_code">5.1. Calculer des soldes (<code>balance</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="5.1. Calculer des soldes (<code>balance</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% hledger balance <span class="Special">-f</span> <span class="PreProc">$fichier</span>.ledger <span class="PreProc">$filtre</span>\r
+</pre></div></div>\r
+<div class="listingblock incremental">\r
+<div class="title">Suivi des comptes</div>\r
+<div class="content"><pre>\r
+% hledger balance <span class="Special">-b</span> <span class="Constant">2012</span>/<span class="Constant">02</span>/<span class="Constant">01</span> <span class="Special">-e</span> <span class="Constant">2012</span>/<span class="Constant">04</span>/<span class="Constant">30</span> <span class="Special">--monthly</span> <span class="Special">-f</span> <span class="PreProc">$fichier</span>.ledger <span class="Statement">></span>/tmp/bal.flow\r
+% hledger balance <span class="Special">-b</span> <span class="Constant">2012</span>/<span class="Constant">02</span>/<span class="Constant">01</span> <span class="Special">-e</span> <span class="Constant">2012</span>/<span class="Constant">04</span>/<span class="Constant">30</span> <span class="Special">--cumulative</span> <span class="Special">--monthly</span> <span class="Special">-f</span> <span class="PreProc">$fichier</span>.ledger <span class="Statement">></span>/tmp/bal.cumulative\r
+% hledger balance <span class="Special">-b</span> <span class="Constant">2012</span>/<span class="Constant">02</span>/<span class="Constant">01</span> <span class="Special">-e</span> <span class="Constant">2012</span>/<span class="Constant">04</span>/<span class="Constant">30</span> <span class="Special">--historical</span> <span class="Special">--monthly</span> <span class="Special">-f</span> <span class="PreProc">$fichier</span>.ledger <span class="Statement">></span>/tmp/bal.historical\r
+% gvimdiff <span class="Special">-o</span> /tmp/bal.<span class="Special">{</span>cumulative,historical<span class="Special">}</span>\r
+</pre></div></div>\r
+<div class="imageblock incremental">\r
+<div class="content">\r
+<img src="data/gvimdiff-cumulative-historical.png" alt="data/gvimdiff-cumulative-historical.png" />\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_filtrer_des_écritures_code_print_code">5.2. Filtrer des écritures (<code>print</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="5.2. Filtrer des écritures (<code>print</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_suivre_un_compte_code_register_code">5.3. Suivre un compte (<code>register</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="5.3. Suivre un compte (<code>register</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_observer_des_statistiques_code_stats_code_code_activity_code">5.4. Observer des statistiques (<code>stats</code>, <code>activity</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="5.4. Observer des statistiques (<code>stats</code>, <code>activity</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_exercice_comptable">6. Exercice comptable</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="6. Exercice comptable";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_plan_comptable_d_une_association">6.1. Plan comptable d’une association</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="6.1. Plan comptable d’une association";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+DOC : <a href="https://wiki.cyclocoop.org/Comptabilité/Document/Plan_comptable/">https://wiki.cyclocoop.org/Comptabilité/Document/Plan_comptable/</a>\r
+</span>\r
+</li>\r
+</ul>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+#include::data/Cyclofficine.Plan_comptable.hledger[]\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_comptabiliser_en_partie_double">6.2. Comptabiliser en partie double</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="6.2. Comptabiliser en partie double";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="dlist"><dl class=" incremental">\r
+<dt class="hdlist1">\r
+Solde nul de toute écriture\r
+</dt>\r
+<dd>\r
+<div class="dlist"><dl class=" incremental">\r
+<dt class="hdlist1">\r
+Pour toute écriture\r
+</dt>\r
+<dd>\r
+<p>\r
+Tout ce qui est <em>débité</em> (<code>+</code>) dans ses comptes<br />\r
+est forcément <em>crédité</em> (<code>-</code>) dans ses autres comptes.\r
+</p>\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<span class=" LaTeX ">$\forall e : \textcolor{#D2691E}{\textbf{\acute{e}criture}},\r
+ \ \textbf{balance}\>(\textbf{flux}\>{e}) = 0$</span>\r
+</span>\r
+</li>\r
+</ul>\r
+</dd>\r
+</dl></div>\r
+</dd>\r
+<dt class="hdlist1">\r
+Relation de Chasles par écritures d’engagement et de paiement\r
+</dt>\r
+<dd>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+<span class="hledgerTransactionDate">01/01</span> <span class="hledgerTransactionDescription">Écriture d’engagement</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">7</span><span class="hledgerPostingAccount">.Produit</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">0</span><span class="hledgerPostingAccount">.Vente</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Produit_fini</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Vélo</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">80</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">5</span><span class="hledgerPostingAccountOdd">.Finance</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">1</span><span class="hledgerPostingAccountOdd">.Etablissement</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">1</span><span class="hledgerPostingAccountOdd">.Valeur</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Chèque_à_encaisser</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">80</span>\r
+\r
+<span class="hledgerTransactionDate">01/02</span> <span class="hledgerTransactionDescription">Écriture de paiement</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">5</span><span class="hledgerPostingAccount">.Finance</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Etablissement</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Valeur</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">2</span><span class="hledgerPostingAccount">.Chèque_à_encaisser</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">80</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">5</span><span class="hledgerPostingAccountOdd">.Finance</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">1</span><span class="hledgerPostingAccountOdd">.Etablissement</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Banque</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">001</span><span class="hledgerPostingAccountOdd">.Courant</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">80</span>\r
+</pre></div></div>\r
+<div class="admonitionblock incremental">\r
+<table><tr>\r
+<td class="icon">\r
+<img src="./icons/note.png" alt="Note" />\r
+</td>\r
+<td class="content">pour des espèces, transiter par : <code>5.Finance:3.Caisse:1.Siège</code></td>\r
+</tr></table>\r
+</div>\r
+</dd>\r
+</dl></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect3">\r
+<h1 id="_soldes_nuls_souhaitables">6.2.1. Soldes nuls souhaitables</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect3";nexttitle="6.2.1. Soldes nuls souhaitables";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+Écritures des recettes\r
+</span>\r
+<ol class="arabic incremental">\r
+<li>\r
+<span>\r
+<span class=" LaTeX ">$\sum{\mbox{ventes}} + \sum{\mbox{dons}} = \sum{\mbox{espèces entrées en caisse}} + \sum{\mbox{Chèques à encaisser}}$</span><br />\r
+(Total des ventes + dons == Total d’espèces entrée en caisse + Chèques à encaisser (5112))\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+Total chèques à encaisser (5112) == Total remises de chèques à la banque (512) (+/- argent non déposé en banque)\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+Solde du compte caisse (531) == Total entrées espèces en caisse - Total des sorties (remises d’espèces en banque - sorties d’achats - erreur de caisse)\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+Solde compte caisse (531) == Total entrées en caisse - Dépôt espèce en banque - Achat en espèce\r
+</span>\r
+</li>\r
+</ol>\r
+</li>\r
+<li>\r
+<span>\r
+Écritures de paye\r
+</span>\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</li>\r
+</ul>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_journaux_filtres">6.3. Journaux (filtres)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="6.3. Journaux (filtres)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>Banque</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger </span><span class="Statement">'</span><span class="Constant">^5.Finance:1.Etablissement:2.Banque:</span><span class="Statement">'</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>Achats</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger </span><span class="Statement">'</span><span class="Constant">^(2.Immobilisation:1.Corporelle:|6.Charge:(0.Achat|1.Service|2.Autre_service):)</span><span class="Statement">'</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>Vente</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger </span><span class="Statement">'</span><span class="Constant">^7.Produit:0.Vente:</span><span class="Statement">'</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>Caisse</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger </span><span class="Statement">'</span><span class="Constant">^5.Finance:3.Caisse:</span><span class="Statement">'</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>Paye</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger </span><span class="Statement">'</span><span class="Constant">6.Charge:(3.Impôt:(1.|3.):|4.Personnel:)</span><span class="Statement">'</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>À NouVeaux</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger tag:ANV</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+<strong>Opération_Diverses</strong>\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+hledger <span class="Statement">print</span><span class="Constant"> -f </span><span class="PreProc">$fichier</span><span class="Constant">.ledger tag:OD</span>\r
+</pre></div></div>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_clôture_ouverture_code_equity_code">6.4. Clôture / Ouverture (<code>equity</code>)</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="6.4. Clôture / Ouverture (<code>equity</code>)";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p><code>hledger-equity</code> calcule une balance de comptes\r
+et en fait deux écritures, respectivement :</p>\r
+</div>\r
+</div>\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+de clôture\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+pour les solder à zéro en fin d’exercice ;\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+d’ouverture\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+pour les réinitialiser à leur solde du précédent exercice.\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% hledger-equity <span class="Special">-f</span> <span class="PreProc">$fichier</span>.ledger <span class="PreProc">$filtre</span>\r
+</pre></div></div>\r
+<div class="listingblock incremental">\r
+<div class="title">Solde des compte de gestion</div>\r
+<div class="content"><pre>\r
+% hledger-equity '^6' '^7' -f Paris.2011.hledger\r
+<span class="hledgerTransactionDate">2014/07/29</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Charge</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">0</span><span class="hledgerPostingAccount">.Achat</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Non_stocké</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">8</span><span class="hledgerPostingAccount">.Autre_Matière,Fourniture</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Atelier</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">248</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">87</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAccountOdd">.Charge</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">1</span><span class="hledgerPostingAccountOdd">.Service</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">3</span><span class="hledgerPostingAccountOdd">.Location</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Immobilière</span><span class="hledgerPostingAmountOdd"> -</span><span class="hledgerNumberOdd">441</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">46</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Charge</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">2</span><span class="hledgerPostingAccount">.Autre_service</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">3</span><span class="hledgerPostingAccount">.Communication</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Catalogue,Imprimé</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">24</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAccountOdd">.Charge</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Autre_service</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">7</span><span class="hledgerPostingAccountOdd">.Service_bancaire</span><span class="hledgerPostingAmountOdd"> -</span><span class="hledgerNumberOdd">31</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">25</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Charge</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">5</span><span class="hledgerPostingAccount">.Gestion</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">8</span><span class="hledgerPostingAccount">.Divers</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Cotisation_(vie_statutaire)</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">25</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">7</span><span class="hledgerPostingAccountOdd">.Produit</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">0</span><span class="hledgerPostingAccountOdd">.Vente</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAccountOdd">.Prest'action</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">700</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">00</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">7</span><span class="hledgerPostingAccount">.Produit</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">5</span><span class="hledgerPostingAccount">.Autre_gestion_courante</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Cotisation</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">20</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">7</span><span class="hledgerPostingAccountOdd">.Produit</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">5</span><span class="hledgerPostingAccountOdd">.Autre_gestion_courante</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">8</span><span class="hledgerPostingAccountOdd">.Divers</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">00</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> equity</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">closing balances</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">44</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">58</span><span class="hledgerPostingAmount">€</span>\r
+\r
+<span class="hledgerTransactionDate">2014/07/29</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Charge</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">0</span><span class="hledgerPostingAccount">.Achat</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Non_stocké</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">8</span><span class="hledgerPostingAccount">.Autre_Matière,Fourniture</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">1</span><span class="hledgerPostingAccount">.Atelier</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">248</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">87</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAccountOdd">.Charge</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">1</span><span class="hledgerPostingAccountOdd">.Service</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">3</span><span class="hledgerPostingAccountOdd">.Location</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Immobilière</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">441</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">46</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Charge</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">2</span><span class="hledgerPostingAccount">.Autre_service</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">3</span><span class="hledgerPostingAccount">.Communication</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Catalogue,Imprimé</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">24</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAccountOdd">.Charge</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">2</span><span class="hledgerPostingAccountOdd">.Autre_service</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">7</span><span class="hledgerPostingAccountOdd">.Service_bancaire</span><span class="hledgerPostingAmountOdd"> </span><span class="hledgerNumberOdd">31</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">25</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Charge</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">5</span><span class="hledgerPostingAccount">.Gestion</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">8</span><span class="hledgerPostingAccount">.Divers</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Cotisation_(vie_statutaire)</span><span class="hledgerPostingAmount"> </span><span class="hledgerNumber">25</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">7</span><span class="hledgerPostingAccountOdd">.Produit</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">0</span><span class="hledgerPostingAccountOdd">.Vente</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAccountOdd">.Prest'action</span><span class="hledgerPostingAmountOdd"> -</span><span class="hledgerNumberOdd">700</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">00</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> </span><span class="hledgerNumber">7</span><span class="hledgerPostingAccount">.Produit</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">5</span><span class="hledgerPostingAccount">.Autre_gestion_courante</span><span class="hledgerAccountSeparator">:</span><span class="hledgerNumber">6</span><span class="hledgerPostingAccount">.Cotisation</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">20</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">00</span><span class="hledgerPostingAmount">€</span>\r
+<span class="hledgerPostingAccountOdd"> </span><span class="hledgerNumberOdd">7</span><span class="hledgerPostingAccountOdd">.Produit</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">5</span><span class="hledgerPostingAccountOdd">.Autre_gestion_courante</span><span class="hledgerAccountSeparatorOdd">:</span><span class="hledgerNumberOdd">8</span><span class="hledgerPostingAccountOdd">.Divers</span><span class="hledgerPostingAmountOdd"> -</span><span class="hledgerNumberOdd">6</span><span class="hledgerPostingAmountOdd">,</span><span class="hledgerNumberOdd">00</span><span class="hledgerPostingAmountOdd">€</span>\r
+<span class="hledgerPostingAccount"> equity</span><span class="hledgerAccountSeparator">:</span><span class="hledgerPostingAccount">opening balances</span><span class="hledgerPostingAmount"> -</span><span class="hledgerNumber">44</span><span class="hledgerPostingAmount">,</span><span class="hledgerNumber">58</span><span class="hledgerPostingAmount">€</span>\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_import_et_export_avec_code_hledger_code">7. Import et export avec <code>hledger</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="7. Import et export avec <code>hledger</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<ul class=" incremental">\r
+<li>\r
+<span>\r
+<a href="https://github.com/eval/total_recall">https://github.com/eval/total_recall</a>\r
+</span>\r
+</li>\r
+<li>\r
+<span>\r
+<a href="https://github.com/quentinsf/icsv2ledger">https://github.com/quentinsf/icsv2ledger</a>\r
+</span>\r
+</li>\r
+</ul>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect2">\r
+<h1 id="_feuilles_de_calculs_des_documents_comptables">7.1. Feuilles de calculs des documents comptables</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="7.1. Feuilles de calculs des documents comptables";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect3">\r
+<h1 id="_bilan_financier">7.1.1. Bilan financier</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect3";nexttitle="7.1.1. Bilan financier";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect3">\r
+<h1 id="_comptes_de_résultats">7.1.2. Comptes de résultats</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect3";nexttitle="7.1.2. Comptes de résultats";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_code_hledger_web_code">8. <code>hledger-web</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="8. <code>hledger-web</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_bonus_scripter_code_hledger_code">9. (bonus) Scripter <code>hledger</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="9. (bonus) Scripter <code>hledger</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="paragraph">\r
+<div class="incremental">\r
+<p>TODO</p>\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+\r
+<div class="sect2">\r
+<h1 id="_installer_un_script_code_hledger_code">9.1. Installer un script <code>hledger</code></h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect2";nexttitle="9.1. Installer un script <code>hledger</code>";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="listingblock incremental">\r
+<div class="content"><pre>\r
+% <span class="Statement">echo</span><span class="Constant"> </span><span class="Statement">'</span><span class="Constant">PATH="$HOME/src/hledger/extra:$PATH"</span><span class="Statement">'</span><span class="Constant"> </span><span class="Statement">>></span>~/.profile\r
+% <span class="Statement">exit</span> <span class="Comment"># NOTE: recharge ~/.profile</span>\r
+% ghc ~/src/hledger/extra/hledger-SCRIPT.hs\r
+</pre></div></div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div><div class="slide">\r
+\r
+<div class="sect1">\r
+<h1 id="_communauté">10. Communauté</h1>\r
+<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="10. Communauté";slidefootnotes="";/*]]>*/</script>\r
+<div class="sectionbody">\r
+<div class="hdlist"><table><tbody class=" incremental">\r
+<tr>\r
+<td class="hdlist1">\r
+Chat\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<a href="irc://irc.freenode.net#ledger">irc://irc.freenode.net#ledger</a>\r
+</p>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td class="hdlist1">\r
+Liste\r
+<br />\r
+</td>\r
+<td class="hdlist2">\r
+<p style="margin-top: 0;">\r
+<<a href="mailto:hledger+subscribe@googlegroups.com">hledger+subscribe@googlegroups.com</a>>\r
+</p>\r
+</td>\r
+</tr>\r
+</tbody></table></div>\r
+<div class="background hledgersplash" style="position: absolute; left: 50%; top: 10%;">\r
+<div class="imageblock incremental">\r
+<div class="content">\r
+<img src="data/hledger.splash.png" alt="hledgersplash" />\r
+</div>\r
+</div>\r
+</div>\r
+<div id="footer" style="position: absolute; left: 5%; top: 80%; width: 90%;">\r
+<div id="footer-text">\r
+Version 6ca58eb<br />\r
+Dernière mise à jour 2014-07-29 21:47:32 CEST\r
+</div>\r
+</div>\r
+</div></div>\r
+<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>"+slidefootnotes+"</p>");}/*]]>*/</script>\r
+</div>\r
+<script type="text/javascript">\r
+/*<![CDATA[*/\r
+ // move the div class="background" elements immediately\r
+ // as document.body children\r
+ var re = new RegExp("(^| )background\W*");\r
+ var divs = document.body.getElementsByTagName("div");\r
+ for (var i = (divs.length - 1); i >= 0 ; --i)\r
+ {\r
+ div = divs.item(i);\r
+ if ( re.test(div.getAttribute("class")) )\r
+ {\r
+ div2 = div.cloneNode(true);\r
+ div.parentNode.removeChild(div);\r
+ document.body.appendChild(div2);\r
+ }\r
+ }\r
+/*]]>*/\r
+</script>\r
+</body>\r
+</html>\r