├── lib ├── cccs │ ├── logo.png │ ├── cccs.css │ └── chaosknoten.svg ├── styles.css ├── slides.js └── prettify.js ├── .gitmodules ├── assets └── images │ ├── header.jpg │ ├── cc.by-nc-sa.eu.svg │ └── cc.logo.svg ├── README.md └── index.html /lib/cccs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/LightningTalk-ProjektvorstellungCMS/master/lib/cccs/logo.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/animate"] 2 | path = lib/animate 3 | url = https://github.com/daneden/animate.css.git 4 | -------------------------------------------------------------------------------- /assets/images/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cccs/LightningTalk-ProjektvorstellungCMS/master/assets/images/header.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Vortragsfolien "Projektvorstellung 'Chaos macht Schule'" 2 | ========================================= 3 | 4 | Lightning-Talk beim CCC Stuttgart, 9.8.2012. 5 | 6 | 7 | Referenzen 8 | ---------- 9 | 10 | Folientemplate basiert auf den [html5-Folien von Benjamin Erb](https://github.com/berb/html5slides-uulm). 11 | 12 | 13 | Lizenz 14 | ------ 15 | 16 | Autor: Stefan Schlott, PGP 0x75FD7074 17 | 18 | Soweit bei Einzelteilen nicht anders angegeben, steht dieses Werk unter 19 | einer Creative Commons Namensnennung-Nicht-kommerziell-Weitergabe unter 20 | gleichen Bedingungen 3.0 Unported Lizenz [(CC BY-NC-SA)](http://creativecommons.org/licenses/by-nc-sa/3.0/). 21 | 22 | -------------------------------------------------------------------------------- /lib/cccs/cccs.css: -------------------------------------------------------------------------------- 1 | .slides.template-cccs-in section > article:not(.fill):not(.title-slide):before{ 2 | content:""; 3 | display:block; 4 | /* border-top:6px solid rgb(145,181,215); */ 5 | position: absolute; 6 | width: 77%; 7 | height: 2px; 8 | min-height: 2px; 9 | left: 0; 10 | top: 24px; 11 | } 12 | 13 | 14 | 15 | .slides.template-cccs-in section > article:not(.fill):not(.title-slide) .slide-nr{ 16 | display:inline; 17 | position: absolute; 18 | color: #dde; 19 | font-size:18px; 20 | line-height: 18px; 21 | font-weight: 600; 22 | letter-spacing: -1px; 23 | left: 78%; 24 | width: 20%; 25 | min-width: 20%; 26 | height: 20%; 27 | min-height: 20%; 28 | top: 24px; 29 | padding:0px; 30 | padding-left:6px; 31 | padding-right:6px; 32 | margin:0; 33 | text-align:right; 34 | background-image: url(chaosknoten.svg); 35 | background-repeat: no-repeat; 36 | background-size: 100% 100%; 37 | -webkit-background-size: 100% 100%; 38 | } 39 | 40 | 41 | 42 | .slides.template-cccs-in section > article.title-slide img { 43 | position: absolute; 44 | left: 0; 45 | top: 20%; 46 | 47 | min-width: 100%; 48 | min-height: 50%; 49 | width:100%; 50 | height:50%; 51 | 52 | 53 | 54 | z-index: -1; 55 | } 56 | 57 | .slides.template-cccs-in section > article h1, .slides.template-cccs-in section > article h2, .slides.template-cccs-in section > article h3{ 58 | color: rgb(92,136,179); 59 | } 60 | .slides.template-cccs-in section > article.title-slide #title{ 61 | font-size: 48px; 62 | position: absolute; 63 | left: 50%; 64 | top: 75%; 65 | text-align:left; 66 | margin:0; 67 | padding:0; 68 | } 69 | 70 | 71 | .slides.template-cccs-in section > article.title-slide #subtitle{ 72 | font-size: 28px; 73 | position: absolute; 74 | left: 50%; 75 | bottom: 3%; 76 | text-align:left; 77 | margin:0; 78 | padding:0; 79 | } 80 | 81 | .slides.template-cccs-in section > article.title-slide #author{ 82 | font-size: 28px; 83 | position: absolute; 84 | left: 5%; 85 | bottom: 3%; 86 | text-align:left; 87 | margin:0; 88 | padding:0; 89 | } 90 | 91 | .slides.template-cccs-in section > article.title-slide #cccs-logo { 92 | position: absolute; 93 | left: 50%; 94 | top: 4%; 95 | z-index: -2; 96 | width: 48%; 97 | min-width: 48%; 98 | min-height: 13%; 99 | height: 13%; 100 | } 101 | 102 | 103 | 104 | .slides.template-cccs-in section > article:not(.fill){ 105 | padding-top: 100px; 106 | padding-left: 80px; 107 | padding-right: 80px; 108 | padding-bottom: 32px; 109 | } 110 | 111 | .slides.template-cccs-in section > article:not(.nobackground):not(.biglogo) { 112 | background-color: white; 113 | } 114 | 115 | .slides.template-cccs-in li::before { 116 | color: rgb(92,136,179); 117 | } 118 | 119 | .slides.template-cccs-in td{ 120 | background: rgba(169,162,141,0.4); 121 | padding: 5px 10px; 122 | vertical-align: top; 123 | } 124 | 125 | .slides.template-cccs-in th{ 126 | background: rgba(169,162,141,0.8); 127 | padding: 5px 10px; 128 | vertical-align: top; 129 | color:#eee; 130 | } 131 | 132 | .slides.template-cccs-in iframe { 133 | height: 580px; 134 | } 135 | 136 | .slides.template-cccs-in h3 + iframe { 137 | margin-top: 40px; 138 | height: 480px; 139 | } 140 | 141 | .slides.template-cccs-in section article.fill iframe { 142 | position: absolute; 143 | left: 0; 144 | top: 0; 145 | width: 100%; 146 | height: 100%; 147 | 148 | border: 0; 149 | margin: 0; 150 | 151 | border-radius: 10px; 152 | -o-border-radius: 10px; 153 | -moz-border-radius: 10px; 154 | -webkit-border-radius: 10px; 155 | 156 | z-index: -1; 157 | } 158 | 159 | 160 | .cccs-color { 161 | color: rgb(145,181,215); 162 | } 163 | 164 | .mawi-color { 165 | color: rgb(179,72,55); 166 | } 167 | 168 | .in-color { 169 | color: rgb(92,136,179); 170 | } 171 | 172 | .nawi-color { 173 | color: rgb(55,179,133); 174 | } 175 | 176 | .med-color { 177 | color: rgb(55,101,144); 178 | } 179 | 180 | .accent-color { 181 | color: rgb(169,162,141); 182 | } 183 | 184 | .slides.template-cccs-in a{ 185 | color: rgb(125,154,170); 186 | } 187 | 188 | a{ 189 | text-decoration: none; 190 | } 191 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 14 | 21 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 50 | 68 | Chaos macht Schule 69 | 70 | 71 | 72 | 73 |
74 |
75 |
76 |

Chaos macht Schule

77 |

78 | Stefan Schlott 79 |

80 |

81 | Das Kinder- und Jugendprojekt beim CCC 82 |

83 |

84 | 85 | 86 |

87 |
88 | 94 |
95 | 96 |
97 |
Chaos macht Schule
98 | 99 |
100 |

„Könnt ihr uns mal besuchen?“

101 |

Klassiker: Lehrer möchten ein (technisches) Thema behandeln, fühlen sich darin aber nicht ausreichend souverän

102 |

Respekt: Die „Hacker”, die alles können

103 |

Nicht-Lehrer: Anderer Zugang

104 |

Techniker: Fundierte Kenntnisse

105 |
106 | 107 |
108 |

Projekt „Chaos macht Schule“

109 |

Bundesweite Gruppe innerhalb des CCC

110 |

Koordination von Anfragen

111 |

Austausch von Erfahrungen und Materialien

112 |

Gemeinsame Ziele

113 |
114 | 115 |
116 |

Veranstaltungen mit Jugendlichen

117 |

Besuch in Schulen, Jugendclubs, etc.

118 |

Meist „Zeigefingerthemen“ wie Facebook, Sicherheit, etc.

119 |

Auch Basteln, Programmierkurse, ...

120 |
121 | 122 |
123 |

Material für Multiplikatoren

124 |

Besuch bei Eltern, Lehrern, Schulämter

125 |

Nerds briefen Nerds

126 |

Mannheim: Medienscouts

127 |

Vorbereitung Lehrmaterialien und Unterrichtsstunden

128 |
129 | 130 |
131 | 132 |

Interesse? Mach' mit!

133 |
134 |

Infos auf der Webseite http://ccc.de/schule/

135 |

Mailingliste schule(ät)lists.ccc.de

136 |
137 |
138 | 139 | 151 |
152 | 153 |
154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /lib/cccs/chaosknoten.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 29 | 49 | 52 | 56 | 60 | 64 | 68 | 72 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /lib/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | Google HTML5 slides template 3 | 4 | Authors: Luke Mahé (code) 5 | Marcin Wichary (code and design) 6 | 7 | Dominic Mazzoni (browser compatibility) 8 | Charles Chen (ChromeVox support) 9 | 10 | URL: http://code.google.com/p/html5slides/ 11 | */ 12 | 13 | /* Framework */ 14 | 15 | html { 16 | height: 100%; 17 | } 18 | 19 | body { 20 | margin: 0; 21 | padding: 0; 22 | 23 | display: block !important; 24 | 25 | height: 100%; 26 | min-height: 740px; 27 | 28 | overflow-x: hidden; 29 | overflow-y: auto; 30 | 31 | background: rgb(215, 215, 215); 32 | background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 33 | background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 34 | background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 35 | background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190))); 36 | 37 | -webkit-font-smoothing: antialiased; 38 | } 39 | 40 | .slides { 41 | width: 100%; 42 | height: 100%; 43 | left: 0; 44 | top: 0; 45 | 46 | position: absolute; 47 | 48 | -webkit-transform: translate3d(0, 0, 0); 49 | } 50 | 51 | .slides section > article{ 52 | display: block; 53 | 54 | position: absolute; 55 | overflow: hidden; 56 | 57 | width: 900px; 58 | height: 700px; 59 | 60 | left: 50%; 61 | top: 50%; 62 | 63 | margin-left: -450px; 64 | margin-top: -350px; 65 | 66 | padding: 40px 60px; 67 | 68 | box-sizing: border-box; 69 | -o-box-sizing: border-box; 70 | -moz-box-sizing: border-box; 71 | -webkit-box-sizing: border-box; 72 | 73 | border-radius: 10px; 74 | -o-border-radius: 10px; 75 | -moz-border-radius: 10px; 76 | -webkit-border-radius: 10px; 77 | 78 | background-color: white; 79 | 80 | box-shadow: 0 2px 6px rgba(0, 0, 0, .1); 81 | border: 1px solid rgba(0, 0, 0, .3); 82 | 83 | transition: transform .3s ease-out; 84 | -o-transition: -o-transform .3s ease-out; 85 | -moz-transition: -moz-transform .3s ease-out; 86 | -webkit-transition: -webkit-transform .3s ease-out; 87 | } 88 | .slides.layout-widescreen section > article { 89 | margin-left: -550px; 90 | width: 1100px; 91 | } 92 | .slides.layout-faux-widescreen section > article { 93 | margin-left: -550px; 94 | width: 1100px; 95 | 96 | padding: 40px 160px; 97 | } 98 | 99 | .slides.template-default section > article:not(.nobackground):not(.biglogo) { 100 | background: url(images/google-logo-small.png) 710px 625px no-repeat; 101 | 102 | background-color: white; 103 | } 104 | 105 | .slides.layout-widescreen section > article:not(.nobackground):not(.biglogo), 106 | .slides.layout-faux-widescreen > article:not(.nobackground):not(.biglogo) { 107 | background-position-x: 0, 840px; 108 | } 109 | 110 | /* Clickable/tappable areas */ 111 | 112 | .slide-area { 113 | z-index: 1000; 114 | 115 | position: absolute; 116 | left: 0; 117 | top: 0; 118 | width: 150px; 119 | height: 700px; 120 | 121 | left: 50%; 122 | top: 50%; 123 | 124 | cursor: pointer; 125 | margin-top: -350px; 126 | 127 | tap-highlight-color: transparent; 128 | -o-tap-highlight-color: transparent; 129 | -moz-tap-highlight-color: transparent; 130 | -webkit-tap-highlight-color: transparent; 131 | } 132 | #prev-slide-area { 133 | margin-left: -550px; 134 | } 135 | #next-slide-area { 136 | margin-left: 400px; 137 | } 138 | .slides.layout-widescreen #prev-slide-area, 139 | .slides.layout-faux-widescreen #prev-slide-area { 140 | margin-left: -650px; 141 | } 142 | .slides.layout-widescreen #next-slide-area, 143 | .slides.layout-faux-widescreen #next-slide-area { 144 | margin-left: 500px; 145 | } 146 | 147 | 148 | /* Slides */ 149 | 150 | .slides section > article{ 151 | display: none; 152 | } 153 | .slides section > article.far-past { 154 | display: block; 155 | transform: translate(-2040px); 156 | -o-transform: translate(-2040px); 157 | -moz-transform: translate(-2040px); 158 | -webkit-transform: translate3d(-2040px, 0, 0); 159 | } 160 | .slides section> article.past { 161 | display: block; 162 | transform: translate(-1020px); 163 | -o-transform: translate(-1020px); 164 | -moz-transform: translate(-1020px); 165 | -webkit-transform: translate3d(-1020px, 0, 0); 166 | } 167 | .slides section > article.current { 168 | display: block; 169 | transform: translate(0); 170 | -o-transform: translate(0); 171 | -moz-transform: translate(0); 172 | -webkit-transform: translate3d(0, 0, 0); 173 | } 174 | .slides section > article.next { 175 | display: block; 176 | transform: translate(1020px); 177 | -o-transform: translate(1020px); 178 | -moz-transform: translate(1020px); 179 | -webkit-transform: translate3d(1020px, 0, 0); 180 | } 181 | .slides section > article.far-next { 182 | display: block; 183 | transform: translate(2040px); 184 | -o-transform: translate(2040px); 185 | -moz-transform: translate(2040px); 186 | -webkit-transform: translate3d(2040px, 0, 0); 187 | } 188 | 189 | .slides.layout-widescreen section > article.far-past, 190 | .slides.layout-faux-widescreen section > article.far-past { 191 | display: block; 192 | transform: translate(-2260px); 193 | -o-transform: translate(-2260px); 194 | -moz-transform: translate(-2260px); 195 | -webkit-transform: translate3d(-2260px, 0, 0); 196 | } 197 | .slides.layout-widescreen section > article.past, 198 | .slides.layout-faux-widescreen section > article.past { 199 | display: block; 200 | transform: translate(-1130px); 201 | -o-transform: translate(-1130px); 202 | -moz-transform: translate(-1130px); 203 | -webkit-transform: translate3d(-1130px, 0, 0); 204 | } 205 | .slides.layout-widescreen section > article.current, 206 | .slides.layout-faux-widescreen section > article.current { 207 | display: block; 208 | transform: translate(0); 209 | -o-transform: translate(0); 210 | -moz-transform: translate(0); 211 | -webkit-transform: translate3d(0, 0, 0); 212 | } 213 | .slides.layout-widescreen section > article.next, 214 | .slides.layout-faux-widescreen section > article.next { 215 | display: block; 216 | transform: translate(1130px); 217 | -o-transform: translate(1130px); 218 | -moz-transform: translate(1130px); 219 | -webkit-transform: translate3d(1130px, 0, 0); 220 | } 221 | .slides.layout-widescreen section > article.far-next, 222 | .slides.layout-faux-widescreen section > article.far-next { 223 | display: block; 224 | transform: translate(2260px); 225 | -o-transform: translate(2260px); 226 | -moz-transform: translate(2260px); 227 | -webkit-transform: translate3d(2260px, 0, 0); 228 | } 229 | 230 | /* Styles for slides */ 231 | 232 | .slides section > article { 233 | font-family: 'Open Sans', Arial, sans-serif; 234 | 235 | color: rgb(102, 102, 102); 236 | text-shadow: 0 1px 1px rgba(0, 0, 0, .1); 237 | 238 | font-size: 30px; 239 | line-height: 36px; 240 | 241 | letter-spacing: -1px; 242 | } 243 | 244 | b { 245 | font-weight: 600; 246 | } 247 | 248 | .blue { 249 | color: rgb(0, 102, 204); 250 | } 251 | .yellow { 252 | color: rgb(255, 211, 25); 253 | } 254 | .green { 255 | color: rgb(0, 138, 53); 256 | } 257 | .red { 258 | color: rgb(255, 0, 0); 259 | } 260 | .black { 261 | color: black; 262 | } 263 | .white { 264 | color: white; 265 | } 266 | 267 | a { 268 | color: rgb(0, 102, 204); 269 | } 270 | a:visited { 271 | color: rgba(0, 102, 204, .75); 272 | } 273 | a:hover { 274 | color: black; 275 | } 276 | 277 | p { 278 | margin: 0; 279 | padding: 0; 280 | 281 | margin-top: 20px; 282 | } 283 | p:first-child { 284 | margin-top: 0; 285 | } 286 | 287 | h1 { 288 | font-size: 60px; 289 | line-height: 60px; 290 | 291 | padding: 0; 292 | margin: 0; 293 | margin-top: 200px; 294 | padding-right: 40px; 295 | 296 | font-weight: 600; 297 | 298 | letter-spacing: -3px; 299 | 300 | color: rgb(51, 51, 51); 301 | } 302 | 303 | h2 { 304 | font-size: 45px; 305 | line-height: 45px; 306 | 307 | position: absolute; 308 | bottom: 150px; 309 | 310 | padding: 0; 311 | margin: 0; 312 | padding-right: 40px; 313 | 314 | font-weight: 600; 315 | 316 | letter-spacing: -2px; 317 | 318 | color: rgb(51, 51, 51); 319 | } 320 | 321 | h3 { 322 | font-size: 30px; 323 | line-height: 36px; 324 | 325 | padding: 0; 326 | margin: 0; 327 | padding-right: 40px; 328 | 329 | font-weight: 600; 330 | 331 | letter-spacing: -1px; 332 | 333 | color: rgb(51, 51, 51); 334 | } 335 | 336 | article.fill h3 { 337 | background: rgba(255, 255, 255, .75); 338 | padding-top: .2em; 339 | padding-bottom: .3em; 340 | margin-top: -.2em; 341 | margin-left: -60px; 342 | padding-left: 60px; 343 | margin-right: -60px; 344 | padding-right: 60px; 345 | } 346 | 347 | ul { 348 | list-style: none; 349 | margin: 0; 350 | padding: 0; 351 | 352 | margin-top: 40px; 353 | 354 | margin-left: .75em; 355 | } 356 | ul:first-child { 357 | margin-top: 0; 358 | } 359 | ul ul { 360 | margin-top: .5em; 361 | } 362 | li { 363 | padding: 0; 364 | margin: 0; 365 | 366 | margin-bottom: .5em; 367 | } 368 | li::before { 369 | content: '·'; 370 | 371 | width: .75em; 372 | margin-left: -.75em; 373 | 374 | position: absolute; 375 | } 376 | 377 | ol li::before { 378 | content: ''; 379 | } 380 | 381 | nav.toc ol li.done{ 382 | opacity: 0.80; 383 | } 384 | nav.toc ol li.current{ 385 | font-weight:bold; 386 | } 387 | nav.toc ol li.future{ 388 | opacity: 0.95; 389 | } 390 | 391 | pre { 392 | font-family: 'Droid Sans Mono', 'Courier New', monospace; 393 | 394 | font-size: 20px; 395 | line-height: 28px; 396 | padding: 5px 10px; 397 | 398 | letter-spacing: -1px; 399 | 400 | margin-top: 40px; 401 | margin-bottom: 40px; 402 | 403 | color: black; 404 | background: rgb(240, 240, 240); 405 | border: 1px solid rgb(224, 224, 224); 406 | box-shadow: inset 0 2px 6px rgba(0, 0, 0, .1); 407 | 408 | overflow: hidden; 409 | } 410 | 411 | code { 412 | font-size: 95%; 413 | font-family: 'Droid Sans Mono', 'Courier New', monospace; 414 | 415 | color: black; 416 | } 417 | 418 | iframe { 419 | width: 100%; 420 | 421 | height: 620px; 422 | /* 423 | background: white; 424 | border: 1px solid rgb(192, 192, 192); 425 | margin: -1px; 426 | */ 427 | /*box-shadow: inset 0 2px 6px rgba(0, 0, 0, .1);*/ 428 | } 429 | 430 | h3 + iframe { 431 | margin-top: 40px; 432 | height: 540px; 433 | } 434 | 435 | article.fill iframe { 436 | position: absolute; 437 | left: 0; 438 | top: 0; 439 | width: 100%; 440 | height: 100%; 441 | 442 | border: 0; 443 | margin: 0; 444 | 445 | border-radius: 10px; 446 | -o-border-radius: 10px; 447 | -moz-border-radius: 10px; 448 | -webkit-border-radius: 10px; 449 | 450 | z-index: -1; 451 | } 452 | 453 | article.fill img:not(.nofill) { 454 | position: absolute; 455 | left: 0; 456 | top: 0; 457 | min-width: 100%; 458 | min-height: 100%; 459 | 460 | border-radius: 10px; 461 | -o-border-radius: 10px; 462 | -moz-border-radius: 10px; 463 | -webkit-border-radius: 10px; 464 | 465 | z-index: -1; 466 | } 467 | img.centered { 468 | margin: 0 auto; 469 | display: block; 470 | } 471 | 472 | table { 473 | width: 100%; 474 | border-collapse: collapse; 475 | margin-top: 40px; 476 | } 477 | th { 478 | font-weight: 600; 479 | text-align: left; 480 | } 481 | td, 482 | th { 483 | border: 1px solid rgb(224, 224, 224); 484 | padding: 5px 10px; 485 | vertical-align: top; 486 | } 487 | 488 | .source { 489 | position: absolute; 490 | left: 60px; 491 | top: 644px; 492 | padding-right: 175px; 493 | 494 | font-size: 15px; 495 | letter-spacing: 0; 496 | line-height: 18px; 497 | } 498 | 499 | q { 500 | display: block; 501 | font-size: 60px; 502 | line-height: 72px; 503 | 504 | margin-left: 20px; 505 | 506 | margin-top: 100px; 507 | margin-right: 150px; 508 | } 509 | q::before { 510 | content: '„'; 511 | 512 | position: absolute; 513 | display: inline-block; 514 | margin-left: -2.1em; 515 | width: 2em; 516 | text-align: right; 517 | 518 | font-size: 90px; 519 | color: rgb(192, 192, 192); 520 | } 521 | q::after { 522 | content: '“'; 523 | 524 | position: absolute; 525 | margin-left: .1em; 526 | 527 | font-size: 90px; 528 | color: rgb(192, 192, 192); 529 | } 530 | div.author { 531 | text-align: right; 532 | font-size: 40px; 533 | 534 | margin-top: 20px; 535 | margin-right: 150px; 536 | } 537 | div.author::before { 538 | content: '—'; 539 | } 540 | 541 | /* Size variants */ 542 | 543 | article.smaller p, 544 | article.smaller ul, article.smaller dl { 545 | font-size: 20px; 546 | line-height: 24px; 547 | letter-spacing: 0; 548 | } 549 | article.smaller table { 550 | font-size: 20px; 551 | line-height: 24px; 552 | letter-spacing: 0; 553 | } 554 | article.smaller pre { 555 | font-size: 15px; 556 | line-height: 20px; 557 | letter-spacing: 0; 558 | } 559 | article.smaller q { 560 | font-size: 40px; 561 | line-height: 48px; 562 | } 563 | article.smaller q::before, 564 | article.smaller q::after { 565 | font-size: 60px; 566 | } 567 | 568 | /* Builds */ 569 | 570 | .build > .build-default-transition { 571 | transition: opacity 0.5s ease-in-out 0.2s; 572 | -o-transition: opacity 0.5s ease-in-out 0.2s; 573 | -moz-transition: opacity 0.5s ease-in-out 0.2s; 574 | -webkit-transition: opacity 0.5s ease-in-out 0.2s; 575 | } 576 | 577 | .to-build { 578 | opacity: 0; 579 | } 580 | 581 | /* Pretty print */ 582 | 583 | .prettyprint .str, /* string content */ 584 | .prettyprint .atv { /* a markup attribute value */ 585 | color: rgb(0, 138, 53); 586 | } 587 | .prettyprint .kwd, /* a keyword */ 588 | .prettyprint .tag { /* a markup tag name */ 589 | color: rgb(0, 102, 204); 590 | } 591 | .prettyprint .com { /* a comment */ 592 | color: rgb(127, 127, 127); 593 | font-style: italic; 594 | } 595 | .prettyprint .lit { /* a literal value */ 596 | color: rgb(127, 0, 0); 597 | } 598 | .prettyprint .pun, /* punctuation, lisp open bracket, lisp close bracket */ 599 | .prettyprint .opn, 600 | .prettyprint .clo { 601 | color: rgb(127, 127, 127); 602 | } 603 | .prettyprint .typ, /* a type name */ 604 | .prettyprint .atn, /* a markup attribute name */ 605 | .prettyprint .dec, 606 | .prettyprint .var { /* a declaration; a variable name */ 607 | color: rgb(127, 0, 127); 608 | } 609 | 610 | .slide-nr { 611 | display:none; 612 | } 613 | 614 | aside{ 615 | display:none; 616 | } 617 | 618 | .presenter aside{ 619 | z-index:10; 620 | position: absolute; 621 | top:2%; 622 | left:35%; 623 | display:block; 624 | width:60%; 625 | height:96%; 626 | 627 | 628 | padding:5%; 629 | background: rgba(240, 240, 240, .90); 630 | 631 | box-sizing: border-box; 632 | -o-box-sizing: border-box; 633 | -moz-box-sizing: border-box; 634 | -webkit-box-sizing: border-box; 635 | 636 | border-radius: 10px; 637 | -o-border-radius: 10px; 638 | -moz-border-radius: 10px; 639 | -webkit-border-radius: 10px; 640 | box-shadow: 0 2px 6px rgba(0, 0, 0, .3); 641 | border: 1px solid rgba(0, 0, 0, .3); 642 | } 643 | 644 | .presenter .build > * { 645 | transition: opacity 0.5s ease-in-out 0.2s; 646 | -o-transition: opacity 0.5s ease-in-out 0.2s; 647 | -moz-transition: opacity 0.5s ease-in-out 0.2s; 648 | -webkit-transition: opacity 0.5s ease-in-out 0.2s; 649 | } 650 | 651 | .presenter .to-build { 652 | opacity: 100; 653 | } 654 | 655 | 656 | .no-trans.slides section > article{ 657 | transition: transform; 658 | -o-transition: -o-transform; 659 | -moz-transition: -moz-transform; 660 | -webkit-transition: -webkit-transform; 661 | } 662 | 663 | .blackfade { 664 | display: none; 665 | background: #000; 666 | position: fixed; left: 0; top: 0; 667 | width: 100%; height: 100%; 668 | opacity: .90; 669 | z-index: 9999; 670 | } 671 | 672 | .whitefade { 673 | display: none; 674 | background: #FFF; 675 | position: fixed; left: 0; top: 0; 676 | width: 100%; height: 100%; 677 | opacity: .95; 678 | z-index: 9999; 679 | } 680 | 681 | section header{ 682 | display: none; 683 | } 684 | -------------------------------------------------------------------------------- /assets/images/cc.by-nc-sa.eu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 19 | 21 | 43 | 45 | 46 | 48 | image/svg+xml 49 | 51 | 52 | 53 | 54 | 58 | 60 | 65 | 68 | 71 | 80 | 83 | 86 | 87 | 88 | 91 | 101 | 103 | 106 | 115 | 116 | 121 | 122 | 126 | 130 | 134 | 135 | 139 | 143 | 147 | 148 | 152 | 156 | 160 | 161 | 164 | 173 | 176 | 179 | 182 | 183 | 184 | 187 | 196 | 199 | 200 | 201 | 202 | 203 | -------------------------------------------------------------------------------- /lib/slides.js: -------------------------------------------------------------------------------- 1 | /* 2 | Google HTML5 slides template 3 | 4 | Authors: Luke Mahé (code) 5 | Marcin Wichary (code and design) 6 | 7 | Dominic Mazzoni (browser compatibility) 8 | Charles Chen (ChromeVox support) 9 | 10 | URL: http://code.google.com/p/html5slides/ 11 | 12 | Contributors: 13 | Benjamin Erb (presenter mode, notes, structuring) 14 | 15 | URL: https://github.com/berb/html5slides-uulm 16 | */ 17 | 18 | var SLIDE_CLASSES = [ 'far-past', 'past', 'current', 'next', 'far-next' ]; 19 | 20 | var PM_TOUCH_SENSITIVITY = 15; 21 | 22 | var curSlide; 23 | 24 | var showPresenterNotes = false; 25 | var isPresenterSlave = false; 26 | var presenterSlaveWindow = null; 27 | var doTransitions = true; 28 | 29 | /* ---------------------------------------------------------------------- */ 30 | /* 31 | * classList polyfill by Eli Grey 32 | * (http://purl.eligrey.com/github/classList.js/blob/master/classList.js) 33 | */ 34 | 35 | if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { 36 | 37 | (function(view) { 38 | 39 | var classListProp = "classList", protoProp = "prototype", elemCtrProto = (view.HTMLElement || view.Element)[protoProp], objCtr = Object 40 | strTrim = String[protoProp].trim || function() { 41 | return this.replace(/^\s+|\s+$/g, ""); 42 | }, arrIndexOf = Array[protoProp].indexOf || function(item) { 43 | for ( var i = 0, len = this.length; i < len; i++) { 44 | if (i in this && this[i] === item) { 45 | return i; 46 | } 47 | } 48 | return -1; 49 | } 50 | // Vendors: please allow content code to instantiate DOMExceptions 51 | , DOMEx = function(type, message) { 52 | this.name = type; 53 | this.code = DOMException[type]; 54 | this.message = message; 55 | }, checkTokenAndGetIndex = function(classList, token) { 56 | if (token === "") { 57 | throw new DOMEx("SYNTAX_ERR", "An invalid or illegal string was specified"); 58 | } 59 | if (/\s/.test(token)) { 60 | throw new DOMEx("INVALID_CHARACTER_ERR", "String contains an invalid character"); 61 | } 62 | return arrIndexOf.call(classList, token); 63 | }, ClassList = function(elem) { 64 | var trimmedClasses = strTrim.call(elem.className), classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []; 65 | for ( var i = 0, len = classes.length; i < len; i++) { 66 | this.push(classes[i]); 67 | } 68 | this._updateClassName = function() { 69 | elem.className = this.toString(); 70 | }; 71 | }, classListProto = ClassList[protoProp] = [], classListGetter = function() { 72 | return new ClassList(this); 73 | }; 74 | // Most DOMException implementations don't allow calling DOMException's 75 | // toString() 76 | // on non-DOMExceptions. Error's toString() is sufficient here. 77 | DOMEx[protoProp] = Error[protoProp]; 78 | classListProto.item = function(i) { 79 | return this[i] || null; 80 | }; 81 | classListProto.contains = function(token) { 82 | token += ""; 83 | return checkTokenAndGetIndex(this, token) !== -1; 84 | }; 85 | classListProto.add = function(token) { 86 | token += ""; 87 | if (checkTokenAndGetIndex(this, token) === -1) { 88 | this.push(token); 89 | this._updateClassName(); 90 | } 91 | }; 92 | classListProto.remove = function(token) { 93 | token += ""; 94 | var index = checkTokenAndGetIndex(this, token); 95 | if (index !== -1) { 96 | this.splice(index, 1); 97 | this._updateClassName(); 98 | } 99 | }; 100 | classListProto.toggle = function(token) { 101 | token += ""; 102 | if (checkTokenAndGetIndex(this, token) === -1) { 103 | this.add(token); 104 | } 105 | else { 106 | this.remove(token); 107 | } 108 | }; 109 | classListProto.toString = function() { 110 | return this.join(" "); 111 | }; 112 | 113 | if (objCtr.defineProperty) { 114 | var classListPropDesc = { 115 | get : classListGetter, 116 | enumerable : true, 117 | configurable : true 118 | }; 119 | try { 120 | objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); 121 | } 122 | catch (ex) { // IE 8 doesn't support enumerable:true 123 | if (ex.number === -0x7FF5EC54) { 124 | classListPropDesc.enumerable = false; 125 | objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); 126 | } 127 | } 128 | } 129 | else if (objCtr[protoProp].__defineGetter__) { 130 | elemCtrProto.__defineGetter__(classListProp, classListGetter); 131 | } 132 | 133 | }(self)); 134 | 135 | } 136 | /* ---------------------------------------------------------------------- */ 137 | 138 | /* Slide movement */ 139 | 140 | function getSlideEl(no) { 141 | if ((no < 0) || (no >= slideEls.length)) { 142 | return null; 143 | } 144 | else { 145 | return slideEls[no]; 146 | } 147 | }; 148 | 149 | function updateSlideClass(slideNo, className) { 150 | var el = getSlideEl(slideNo); 151 | 152 | if (!el) { 153 | return; 154 | } 155 | 156 | if (className) { 157 | el.classList.add(className); 158 | } 159 | 160 | for ( var i in SLIDE_CLASSES) { 161 | if (className != SLIDE_CLASSES[i]) { 162 | el.classList.remove(SLIDE_CLASSES[i]); 163 | } 164 | } 165 | }; 166 | 167 | function updateSlides() { 168 | for ( var i = 0; i < slideEls.length; i++) { 169 | switch (i) { 170 | case curSlide - 2: 171 | updateSlideClass(i, 'far-past'); 172 | break; 173 | case curSlide - 1: 174 | updateSlideClass(i, 'past'); 175 | break; 176 | case curSlide: 177 | updateSlideClass(i, 'current'); 178 | break; 179 | case curSlide + 1: 180 | updateSlideClass(i, 'next'); 181 | break; 182 | case curSlide + 2: 183 | updateSlideClass(i, 'far-next'); 184 | break; 185 | default: 186 | updateSlideClass(i); 187 | break; 188 | } 189 | } 190 | 191 | triggerLeaveEvent(curSlide - 1); 192 | triggerEnterEvent(curSlide); 193 | 194 | window.setTimeout(function() { 195 | // Hide after the slide 196 | disableSlideFrames(curSlide - 2); 197 | }, 301); 198 | 199 | enableSlideFrames(curSlide - 1); 200 | enableSlideFrames(curSlide + 2); 201 | 202 | if (isChromeVoxActive()) { 203 | speakAndSyncToNode(slideEls[curSlide]); 204 | } 205 | 206 | updateHash(); 207 | 208 | if (presenterSlaveWindow !== null) { 209 | presenterSlaveWindow.postMessage("" + curSlide, "*"); 210 | } 211 | }; 212 | 213 | function buildNextItem() { 214 | var toBuild = slideEls[curSlide].querySelectorAll('.to-build'); 215 | 216 | if (!toBuild.length) { 217 | return false; 218 | } 219 | 220 | if (toBuild[0].getAttribute('buildscript')) { 221 | var attr = toBuild[0].getAttribute('buildscript'); 222 | var method, params; 223 | if (attr.indexOf(' ')<0) { 224 | method = attr; 225 | } else { 226 | method = attr.substr(attr, attr.indexOf(' ')); 227 | params = attr.substr(attr.indexOf(' ')+1); 228 | } 229 | window[method](toBuild[0], params); 230 | } 231 | toBuild[0].classList.remove('to-build', ''); 232 | 233 | if (isChromeVoxActive()) { 234 | speakAndSyncToNode(toBuild[0]); 235 | } 236 | 237 | return true; 238 | }; 239 | 240 | function prevSlide() { 241 | if (curSlide > 0) { 242 | curSlide--; 243 | 244 | updateSlides(); 245 | } 246 | }; 247 | 248 | function nextSlide() { 249 | if (buildNextItem()) { 250 | return; 251 | } 252 | 253 | if (curSlide < slideEls.length - 1) { 254 | curSlide++; 255 | 256 | updateSlides(); 257 | } 258 | }; 259 | 260 | function goToSlide(target) { 261 | if (target >= 0 && target <= slideEls.length) { 262 | var steps = target - (curSlide + 1); 263 | while (steps !== 0) { 264 | if (steps > 0) { 265 | curSlide++; 266 | steps--; 267 | } 268 | else if (steps < 0) { 269 | curSlide--; 270 | steps++; 271 | } 272 | } 273 | updateSlides(); 274 | } 275 | }; 276 | 277 | function togglePresenterNotes() { 278 | if (showPresenterNotes === false) { 279 | var section = document.querySelector("div.slides"); 280 | section.classList.add('presenter'); 281 | } 282 | else { 283 | var section = document.querySelector("div.slides"); 284 | section.classList.remove('presenter'); 285 | } 286 | showPresenterNotes = !showPresenterNotes; 287 | 288 | }; 289 | 290 | function toggleTransitions() { 291 | if (doTransitions === false) { 292 | var section = document.querySelector("div.slides"); 293 | section.classList.remove('no-trans'); 294 | } 295 | else { 296 | var section = document.querySelector("div.slides"); 297 | section.classList.add('no-trans'); 298 | } 299 | doTransitions = !doTransitions; 300 | 301 | }; 302 | 303 | /* Slide events */ 304 | 305 | function triggerEnterEvent(no) { 306 | var el = getSlideEl(no); 307 | if (!el) { 308 | return; 309 | } 310 | 311 | var onEnter = el.getAttribute('onslideenter'); 312 | if (onEnter) { 313 | new Function(onEnter).call(el); 314 | } 315 | 316 | var evt = document.createEvent('Event'); 317 | evt.initEvent('slideenter', true, true); 318 | evt.slideNumber = no + 1; // Make it readable 319 | 320 | el.dispatchEvent(evt); 321 | }; 322 | 323 | function triggerLeaveEvent(no) { 324 | var el = getSlideEl(no); 325 | if (!el) { 326 | return; 327 | } 328 | 329 | var onLeave = el.getAttribute('onslideleave'); 330 | if (onLeave) { 331 | new Function(onLeave).call(el); 332 | } 333 | 334 | var evt = document.createEvent('Event'); 335 | evt.initEvent('slideleave', true, true); 336 | evt.slideNumber = no + 1; // Make it readable 337 | 338 | el.dispatchEvent(evt); 339 | }; 340 | 341 | /* Touch events */ 342 | 343 | function handleTouchStart(event) { 344 | if (event.touches.length == 1) { 345 | touchDX = 0; 346 | touchDY = 0; 347 | 348 | touchStartX = event.touches[0].pageX; 349 | touchStartY = event.touches[0].pageY; 350 | 351 | document.body.addEventListener('touchmove', handleTouchMove, true); 352 | document.body.addEventListener('touchend', handleTouchEnd, true); 353 | } 354 | }; 355 | 356 | function handleTouchMove(event) { 357 | if (event.touches.length > 1) { 358 | cancelTouch(); 359 | } 360 | else { 361 | touchDX = event.touches[0].pageX - touchStartX; 362 | touchDY = event.touches[0].pageY - touchStartY; 363 | } 364 | }; 365 | 366 | function handleTouchEnd(event) { 367 | var dx = Math.abs(touchDX); 368 | var dy = Math.abs(touchDY); 369 | 370 | if ((dx > PM_TOUCH_SENSITIVITY) && (dy < (dx * 2 / 3))) { 371 | if (touchDX > 0) { 372 | prevSlide(); 373 | } 374 | else { 375 | nextSlide(); 376 | } 377 | } 378 | 379 | cancelTouch(); 380 | }; 381 | 382 | function cancelTouch() { 383 | document.body.removeEventListener('touchmove', handleTouchMove, true); 384 | document.body.removeEventListener('touchend', handleTouchEnd, true); 385 | }; 386 | 387 | /* Fadings */ 388 | 389 | 390 | function toggleFade(type){ 391 | 392 | var fadeDiv = document.querySelector('#fadeDiv'); 393 | 394 | if(fadeDiv === null){ 395 | fadeDiv = document.createElement('div'); 396 | fadeDiv.id = "fadeDiv"; 397 | fadeDiv.className = type; 398 | document.body.appendChild(fadeDiv); 399 | } 400 | else if(fadeDiv.className !== type){ 401 | fadeDiv.className = type; 402 | } 403 | 404 | if(fadeDiv.style.display === "block"){ 405 | fadeDiv.style.display = "none"; 406 | } 407 | else{ 408 | fadeDiv.style.display = "block"; 409 | } 410 | 411 | } 412 | 413 | function toggleBlackOut(){ 414 | toggleFade("blackfade"); 415 | } 416 | 417 | 418 | function toggleWhiteOut(){ 419 | toggleFade("whitefade"); 420 | } 421 | 422 | function processToc(){ 423 | 424 | var sections = []; 425 | 426 | var els = document.querySelectorAll('.slides section'); 427 | for(var i = 0;i sections[j].lastSlideNr){ 461 | liEl.className = 'done'; 462 | } 463 | else{ 464 | liEl.className = 'current'; 465 | } 466 | 467 | var aEl = document.createElement('a'); 468 | aEl.href = '#'+sections[j].slideNr; 469 | aEl.innerHTML = sections[j].title; 470 | 471 | var callback = (function(nr){ 472 | aEl.addEventListener('click', function(){ 473 | goToSlide(nr); 474 | }); 475 | })(sections[j].slideNr); 476 | 477 | liEl.appendChild(aEl); 478 | ol.appendChild(liEl); 479 | 480 | } 481 | nav.appendChild(ol); 482 | } 483 | } 484 | } 485 | 486 | /* Preloading frames */ 487 | 488 | function disableSlideFrames(no) { 489 | var el = getSlideEl(no); 490 | if (!el) { 491 | return; 492 | } 493 | 494 | var frames = el.getElementsByTagName('iframe'); 495 | for ( var i = 0, frame; frame = frames[i]; i++) { 496 | disableFrame(frame); 497 | } 498 | }; 499 | 500 | function enableSlideFrames(no) { 501 | var el = getSlideEl(no); 502 | if (!el) { 503 | return; 504 | } 505 | 506 | var frames = el.getElementsByTagName('iframe'); 507 | for ( var i = 0, frame; frame = frames[i]; i++) { 508 | enableFrame(frame); 509 | } 510 | }; 511 | 512 | function disableFrame(frame) { 513 | frame.src = 'about:blank'; 514 | }; 515 | 516 | function enableFrame(frame) { 517 | var src = frame._src; 518 | 519 | if (frame.src != src && src != 'about:blank') { 520 | frame.src = src; 521 | } 522 | }; 523 | 524 | function setupFrames() { 525 | var frames = document.querySelectorAll('iframe'); 526 | for ( var i = 0, frame; frame = frames[i]; i++) { 527 | frame._src = frame.src; 528 | disableFrame(frame); 529 | } 530 | 531 | enableSlideFrames(curSlide); 532 | enableSlideFrames(curSlide + 1); 533 | enableSlideFrames(curSlide + 2); 534 | }; 535 | 536 | function setupInteraction() { 537 | /* Clicking and tapping */ 538 | 539 | var el = document.createElement('div'); 540 | el.className = 'slide-area'; 541 | el.id = 'prev-slide-area'; 542 | el.addEventListener('click', prevSlide, false); 543 | document.querySelector('div.slides').appendChild(el); 544 | 545 | var el = document.createElement('div'); 546 | el.className = 'slide-area'; 547 | el.id = 'next-slide-area'; 548 | el.addEventListener('click', nextSlide, false); 549 | document.querySelector('div.slides').appendChild(el); 550 | 551 | /* Swiping */ 552 | 553 | document.body.addEventListener('touchstart', handleTouchStart, false); 554 | } 555 | 556 | /* ChromeVox support */ 557 | 558 | function isChromeVoxActive() { 559 | if (typeof (cvox) == 'undefined') { 560 | return false; 561 | } 562 | else { 563 | return true; 564 | } 565 | }; 566 | 567 | function speakAndSyncToNode(node) { 568 | if (!isChromeVoxActive()) { 569 | return; 570 | } 571 | 572 | cvox.ChromeVox.navigationManager.switchToStrategy(cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true); 573 | cvox.ChromeVox.navigationManager.syncToNode(node); 574 | cvox.ChromeVoxUserCommands.finishNavCommand(''); 575 | var target = node; 576 | while (target.firstChild) { 577 | target = target.firstChild; 578 | } 579 | cvox.ChromeVox.navigationManager.syncToNode(target); 580 | }; 581 | 582 | function speakNextItem() { 583 | if (!isChromeVoxActive()) { 584 | return; 585 | } 586 | 587 | cvox.ChromeVox.navigationManager.switchToStrategy(cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true); 588 | cvox.ChromeVox.navigationManager.next(true); 589 | if (!cvox.DomUtil.isDescendantOfNode(cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])) { 590 | var target = slideEls[curSlide]; 591 | while (target.firstChild) { 592 | target = target.firstChild; 593 | } 594 | cvox.ChromeVox.navigationManager.syncToNode(target); 595 | cvox.ChromeVox.navigationManager.next(true); 596 | } 597 | cvox.ChromeVoxUserCommands.finishNavCommand(''); 598 | }; 599 | 600 | function speakPrevItem() { 601 | if (!isChromeVoxActive()) { 602 | return; 603 | } 604 | 605 | cvox.ChromeVox.navigationManager.switchToStrategy(cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true); 606 | cvox.ChromeVox.navigationManager.previous(true); 607 | if (!cvox.DomUtil.isDescendantOfNode(cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])) { 608 | var target = slideEls[curSlide]; 609 | while (target.lastChild) { 610 | target = target.lastChild; 611 | } 612 | cvox.ChromeVox.navigationManager.syncToNode(target); 613 | cvox.ChromeVox.navigationManager.previous(true); 614 | } 615 | cvox.ChromeVoxUserCommands.finishNavCommand(''); 616 | }; 617 | 618 | /* Hash functions */ 619 | 620 | function getCurSlideFromHash() { 621 | var slideNo = parseInt(location.hash.substr(1)); 622 | 623 | if (slideNo) { 624 | curSlide = slideNo - 1; 625 | } 626 | else { 627 | curSlide = 0; 628 | } 629 | }; 630 | 631 | function updateHash() { 632 | location.replace('#' + (curSlide + 1)); 633 | }; 634 | 635 | /* Event listeners */ 636 | 637 | function handleBodyKeyDown(event) { 638 | switch (event.keyCode) { 639 | case 39: // right arrow 640 | case 13: // Enter 641 | case 32: // space 642 | case 34: // PgDn 643 | nextSlide(); 644 | event.preventDefault(); 645 | break; 646 | 647 | case 37: // left arrow 648 | case 8: // Backspace 649 | case 33: // PgUp 650 | prevSlide(); 651 | event.preventDefault(); 652 | break; 653 | 654 | case 40: // down arrow 655 | if (isChromeVoxActive()) { 656 | speakNextItem(); 657 | } 658 | else { 659 | nextSlide(); 660 | } 661 | event.preventDefault(); 662 | break; 663 | 664 | case 38: // up arrow 665 | if (isChromeVoxActive()) { 666 | speakPrevItem(); 667 | } 668 | else { 669 | prevSlide(); 670 | } 671 | event.preventDefault(); 672 | break; 673 | 674 | case 71: // g 675 | case 103: // G 676 | var nr = prompt("Go to slide", (curSlide + 1)); 677 | goToSlide(parseInt(nr)); 678 | event.preventDefault(); 679 | // Fix for (at least) FF: set focus on slide again to get next key 680 | // event 681 | window.focus(); 682 | break; 683 | 684 | case 36: // home 685 | goToSlide(1); 686 | event.preventDefault(); 687 | break; 688 | 689 | case 35: // end 690 | goToSlide(slideEls.length); 691 | event.preventDefault(); 692 | break; 693 | 694 | case 190: // "." 695 | if (presenterSlaveWindow !== null) { 696 | presenterSlaveWindow.postMessage("forward", "*"); 697 | } 698 | event.preventDefault(); 699 | break; 700 | 701 | case 188: // "," 702 | if (presenterSlaveWindow !== null) { 703 | presenterSlaveWindow.postMessage("back", "*"); 704 | } 705 | event.preventDefault(); 706 | break; 707 | 708 | case 80: 709 | case 112: 710 | if (!isPresenterSlave && presenterSlaveWindow === null) { 711 | presenterSlaveWindow = window.open(window.location.href, "Presenter Notes", "dependent=yes,width=900,height=700"); 712 | // Wait some time (2 sec.) hoping that the window has been opened 713 | setTimeout(function() { 714 | if (presenterSlaveWindow !== null) { 715 | // you are a slave now! 716 | presenterSlaveWindow.postMessage("slave", "*"); 717 | // goto master's current slide 718 | presenterSlaveWindow.postMessage("" + curSlide, "*"); 719 | } 720 | }, 2000); 721 | // if master has notes enabled, toggle now 722 | if (showPresenterNotes) { 723 | togglePresenterNotes(); 724 | } 725 | 726 | } 727 | event.preventDefault(); 728 | break; 729 | 730 | case 78: // n / N 731 | case 110: 732 | if (presenterSlaveWindow !== null) { 733 | presenterSlaveWindow.postMessage("togglenotes", "*"); 734 | } 735 | else { 736 | togglePresenterNotes(); 737 | } 738 | event.preventDefault(); 739 | break; 740 | 741 | case 84: // t / T 742 | case 110: 743 | toggleTransitions(); 744 | event.preventDefault(); 745 | break; 746 | 747 | case 66: // b 748 | toggleBlackOut(); 749 | break; 750 | case 87: // w 751 | toggleWhiteOut(); 752 | break; 753 | 754 | } 755 | }; 756 | 757 | 758 | 759 | var handleTheMessage = function(event) { 760 | //only using strings as older Firefox version do not support complex messaging payload 761 | if (event.data !== null) { 762 | if (event.data === 'slave') { 763 | //become a slave 764 | isPresenterSlave = true; 765 | 766 | document.title = "Presenter Notes: " + document.title; 767 | togglePresenterNotes(); 768 | // disable transitions 769 | var section = document.querySelector("div.slides"); 770 | section.classList.add('no-trans'); 771 | } 772 | else if (event.data === 'togglenotes') { 773 | //"remote" note toggling 774 | togglePresenterNotes(); 775 | } 776 | else if (event.data === 'forward') { 777 | //move forward only in presenter screen 778 | 779 | // off-by-one => +2 instead of +1 780 | var target = curSlide + 2; 781 | goToSlide(target); 782 | } 783 | else if (event.data === 'back') { 784 | //move back only in presenter screen 785 | 786 | // off-by-one, not less than 1; 787 | goToSlide(curSlide || 1); 788 | } 789 | else { 790 | // optimistic: if none of the above cases, expect a number to be send 791 | goToSlide(parseInt(event.data) + 1); 792 | } 793 | } 794 | } 795 | 796 | function addEventListeners() { 797 | document.addEventListener('keydown', handleBodyKeyDown, false); 798 | window.addEventListener("message", handleTheMessage, false); 799 | }; 800 | 801 | /* Initialization */ 802 | 803 | function enumrateSlides() { 804 | for ( var i = 0, slide; slide = slideEls[i]; i++) { 805 | var el = document.createElement('footer'); 806 | var span = document.createElement('span'); 807 | span.className = 'slide-nr'; 808 | span.innerHTML = "" + (i + 1); 809 | el.appendChild(span); 810 | slide.appendChild(el); 811 | } 812 | }; 813 | 814 | function addPrettify() { 815 | var els = document.querySelectorAll('pre'); 816 | for ( var i = 0, el; el = els[i]; i++) { 817 | if (!el.classList.contains('noprettyprint')) { 818 | el.classList.add('prettyprint'); 819 | } 820 | } 821 | 822 | var el = document.createElement('script'); 823 | el.type = 'text/javascript'; 824 | el.src = 'lib/prettify.js'; 825 | el.onload = function() { 826 | prettyPrint(); 827 | } 828 | document.body.appendChild(el); 829 | }; 830 | 831 | function addFontStyle() { 832 | var el = document.createElement('link'); 833 | el.rel = 'stylesheet'; 834 | el.type = 'text/css'; 835 | el.href = 'http://fonts.googleapis.com/css?family=' + 'Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono'; 836 | 837 | document.body.appendChild(el); 838 | }; 839 | 840 | function addGeneralStyle() { 841 | 842 | var el = document.createElement('meta'); 843 | el.name = 'viewport'; 844 | el.content = 'width=1100,height=750'; 845 | document.querySelector('head').appendChild(el); 846 | 847 | var el = document.createElement('meta'); 848 | el.name = 'apple-mobile-web-app-capable'; 849 | el.content = 'yes'; 850 | document.querySelector('head').appendChild(el); 851 | }; 852 | 853 | function makeBuildLists() { 854 | for ( var i = curSlide, slide; slide = slideEls[i]; i++) { 855 | var items = slide.querySelectorAll('.build > *'); 856 | for ( var j = 0, item; item = items[j]; j++) { 857 | if (item.classList) { 858 | item.classList.add('to-build'); 859 | if (!item.getAttribute('buildscript')) { 860 | item.classList.add('build-default-transition'); 861 | } 862 | } 863 | } 864 | } 865 | }; 866 | 867 | function handleDomLoaded() { 868 | slideEls = document.querySelectorAll('div.slides section > article'); 869 | 870 | setupFrames(); 871 | 872 | enumrateSlides(); 873 | 874 | processToc(); 875 | 876 | addFontStyle(); 877 | addGeneralStyle(); 878 | addPrettify(); 879 | addEventListeners(); 880 | 881 | updateSlides(); 882 | 883 | setupInteraction(); 884 | makeBuildLists(); 885 | 886 | 887 | document.body.classList.add('loaded'); 888 | }; 889 | 890 | function initialize() { 891 | getCurSlideFromHash(); 892 | 893 | if (window['_DCL']) { 894 | handleDomLoaded(); 895 | } 896 | else { 897 | document.addEventListener('DOMContentLoaded', handleDomLoaded, false); 898 | } 899 | } 900 | 901 | initialize(); 902 | -------------------------------------------------------------------------------- /assets/images/cc.logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ]> 16 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | Adobe PDF library 5.00 38 | 39 | 40 | 42 | 43 | 44 | 47 | 2004-05-11T00:59:25-07:00 48 | 2004-05-12T15:44:25Z 49 | Adobe Illustrator 10 50 | 2004-05-11T00:59:25-07:00 51 | 52 | 53 | 54 | JPEG 55 | 256 56 | 64 57 | /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAQAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FUHqWs6PpcQm1O+ t7GE7CS5lSFa/NyoxVJoPzN/Le4m9G3816NNN/vqPULVm60+yJCepxVkUU0U0aywuskTiqOhDKQe 4I2OKr8VdirsVS+fzBoNvcG2uNStYbgGhhknjV6ntxLVxVHghgCDUHcEdCMVbxV2KuxVLo/MXl+W 4FtFqdo9yWKiFZ4y5YdRxDVriqY4q0SAKnYDqcVS0+Z/LQl9I6tZCUNxMf1iLlyrSlOVa1xVMlZW UMpDKwqrDcEHuMVfO3/OXfn/AM5eUf8ACf8AhvVp9L+u/pD636BA9T0vq3p8qg/Z9RqfPFU6/wCc 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 smEtnp9srC1SZTVZHeQK8nE7qOCivWuKv//Z 58 | 59 | 60 | 61 | 62 | 63 | 65 | uuid:d5a59b43-a42a-11d8-833c-000393d00dfa 66 | 67 | 68 | 70 | image/svg+xml 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 93 | 97 | 101 | 105 | 109 | 112 | 116 | 120 | 122 | 126 | 132 | 135 | 137 | 139 | 143 | 144 | 151 | 155 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 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 226 | da2Fvb25SXm+9z60m/R99PrZL9tMmqgKYm6H9vjnplVJ6eTj1m7Ssx02EH+xnvTQ9zre/mzezk0K 227 | EkaZtpgOHv/s9PJWk4bi3dixzaT85/7JU+LGelLu8ZHKydQ10JjVWrdybXHntsfcWE1K5V5fczaT 228 | Ctv+7/5Vem5SmEWbtkqdhj/urSc9pZJ7zYD4aIneyXb4RJ30MRKYQ+/JNXf04lF4lc6+fOdm1vp0 229 | SOXFCI2THi5MetYcCLfVCAOTUpH5leafn6pzk5JZ1LWK343cm92kGepq/1W2nvT8J5b4Gl3fWk5a 230 | iu+xwJXWaxW2L5sllrKZ9DlCld6DW9aTXp41r5+fggFjUo/fNO39Xr9tO2nps/hRs5v0lLq/HB5a 231 | T5pn/R7/XS5xeGS51vvhxZbtpPfvp1sTu0lvqMrJZcaYFNZimvbqOPv+Vnx9tZz09eb73HbSr0e+ 232 | kbOZ9AWkJfU67kas13r9NezdyBJrOen7eaRvO+nIXwr5jElRi5l59Y7KdnoXlpNK15EtX+I1koVJ 233 | 2eg800zfxXd10hobnGMajz/4lK/uk2mZvePA2exa89THfiyJkx7PTQrDfv1oQl84mJ90PNg9Uied 234 | nIRgX2bX6nupPgeVSVOP9PmsKAyPxnfHPpw0sSiTziPaSg/puUkBY/GzLUGZ9oS+jMyJwvCQu1Y0 235 | DbsTS1/OTrozGlVrfZw0Nb/SUbI50Kg3BTQ2r8r5r5iqaU5ixegcgrcGzY+yolOb1XdhFqSzu923 236 | QczqK9HI/Nljke7d2/36kzr78E9tv4LozezafIUd2A2l/aq0pJpfTXHuuyDR7xrc429p/mv/c+vB 237 | 9qtYOI+9GF8Xdl9i9m8/bH8tfVbf9my/Jpndp7rVV9WGyYf6J4ztr/O1m1bc9uvNVg== 238 | 239 | 240 | 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 312 | 313 | 314 | 181K94nOVebaXoWwWi3P5Zp5zFYY8zuGX11WQutXIZhOeNcsz3bDax535dm/TGFW/X0Eyk0SqMsU 315 | 0EvrE6sVM+ksE5cLPVsLHe+Crr67qsZ3x7hYUxqdN7rWuiUA4V7p2MpUY2VbJlr6dV7xQqXwRm4D 316 | RrQlpm533wltbs+uPK7Kl39bT6RY46TY2PU9xY6V3gtO9to0ttLNCB7nQl8c0X2Zr6U2V2ZZLPT9 317 | agZsX0agGrtHbur4DEWn633bGwi+mo4XJjseNylWnw4j477e3BjRtn4dxjtwfW+P7YhW9esjK1tH 318 | v90US1QXYlhWbOEqfQTVpOmIWJMw69UZu73I2fXJCFa75qdrGjw2lcKLZy1rFveym7m1iRQvL8Q3 319 | rTPt3ZQvO18BZbs+VfIb5cuOpQquK72jm6Mxm4PjuWNj0ymPc54+Vn071WFaphKgFnMsMQF75fjY 320 | 5uCYFKg6xRw8K5x4nD4O19y1+XhyeqX3EFzVf+z9MJvMIkjb5u7MZBG44pzH4WJEca174dIrPYrg 321 | WLx8P3Dr8Tmtb1N3QymV3gvRw7VpzPllBPeeDBmPXuu9JEe1PAktuwsarMJNqmVwFN1bF8upqOJC 322 | LetVnC7VcnXr3WXOnFktL6sU3oxaBrTxm7lLjRQvL1HLczdPOpUvr6mWFyIkpHx5Q2q5unW1oZsn 323 | CbKc1DL6+6tVfgLaVlbLriOKhWX5XKSQdYla9pi9KFdq+X20et2n9Vpma4FXy1a0qvtckMnQs+bm 324 | 1SL3ej8W4Daq9wHC7x23et/Frd9Y871C3acLT/x95D6J16buU431kfp+t5Wfrus+947uaWfeXyHT 325 | dSbqVxvPRf1mPAssZd1g1I9JPTSmjncOr5hKioXfNtcVmE5G7C8ssCGL2thtWNH17XOPm759rjZ2 326 | HVZ0c11BOiquwPvuSpZXvu/CfpNXva7ABe8D9f/2ugJV7ytqy5ANx0KRTd4OEtVUV7zsHYaozJsF 327 | W+gPVS8+SR243RGxYrqEFdN5j98XkSLvlg9V75eTwpoPVc89U+3x/8lD1XPPVBPJv/mHquf6efx/ 328 | 8lD13DPVy9ey9kPVtmvZ6EPVc89U400Uf/BQtdVL35t/qHoOOI//Tx6qDs0+Uw1r+YuHqueAIzHY 329 | zT9UPfdMtVb7tuGHqueeqcYstT94qHpuUnwd+w8eqkYYTM9U61GFzT5UPat9zBH4TT5UvWrmsEMZ 330 | pc1D1RYniSbL5pcPVdsBN+8luX2o2m0B+dhdDe96D1XPjbd4V6ejy+XmoeqVanjdPVTtTCrKWlw/ 331 | VO26ZHn2mWr7fEu3xGf5ULVzvuVvH6q2QKDtS98rJo8vRyDe2eXqsky3DDKwemPHqsLONQIXQidO 332 | twQ4uL3LyrM3fMpjU57tIm638KL0Bu/PM4qz3b7O4JRZurw4e5UYrE159joY28yVuXPF2b85FVXL 333 | szeQdeOiPNsFSGRfflee7aI42w5jawatbIqztRelN3m5wmJxts1LRquUZ7vOUfxVebaLiJrtKY/7 334 | 8mwXxdkGV65dnu1CytmuxX15tutXy39Vnm2xifPF2fY2zAojOtYuWmmxFcuzTVRrV5y9ZF/clmev 335 | sC+/KM+2xOLsWcNG9sXR+l3xrk6r8uzfv8DupjzbhbFhvMq0dnm2i+Js82nCbyvd7Yuz17vVfKY8 336 | 2wUq7fKTVyjPdlGcvfKp6GJ5totSY6u8vhXLs10UZzvcC+emPNtFcfZs1s1a5dlrY2zFCkrH4mwn 337 | fnFRduxCS3tcArVi9eUcSHq27frl2YsgWeSN/7o822Vl/S/Ls52Ls8251rjW5nzioOuVWt28o7+d 338 | bXVHt/n1bPe16sveznb1nrjrsnE7wTRXY+UWvBXfznbKtN/M29mGRrZ+PXvt3Zh5O9v1TXq/ejvb 339 | yoJdVkftyqRZWK7t2+if7i5ycSxEJ1XUxN9fI6632tvZlnd1ukagO0PG/b0KnwuVca6vLwFzyBTn 340 | v/y7inGbm1o3XDHuIgq3gYrxxVrRv6gYt8fYJivGN3DDoYuKcbc3HP6uYtycc/V3FeNuXjT4fcW4 341 | xyHhaDMV44sZRH9RMa5X2FkWG2+qYtyoFBZdMto6FePrvmG3WsX4coxtqmIc85PXr51yWzE+f/b6 342 | NxXjlpX1G68Yd38XwW8qxmer0v6qYnxZ7ujmKsZXuntw7Ypx29eyNloxvpm6JKeK8RXqkn5RMb6Q 343 | A/8nFeMboDEXFeMe99r3FxXjMzT2ZxXjq7xZv37FuM2b9RuuGCc3gjJuT1fXrRj3+BffPN98xfiG 344 | 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 386 | 387 | 388 | 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 460 | 461 | 462 | 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 534 | 535 | 536 | +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 591 | sVo= 592 | 593 | 594 | 595 | -------------------------------------------------------------------------------- /lib/prettify.js: -------------------------------------------------------------------------------- 1 | // Copyright (C) 2006 Google Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | 16 | /** 17 | * @fileoverview 18 | * some functions for browser-side pretty printing of code contained in html. 19 | * 20 | *

21 | * For a fairly comprehensive set of languages see the 22 | * README 23 | * file that came with this source. At a minimum, the lexer should work on a 24 | * number of languages including C and friends, Java, Python, Bash, SQL, HTML, 25 | * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk 26 | * and a subset of Perl, but, because of commenting conventions, doesn't work on 27 | * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. 28 | *

29 | * Usage:

    30 | *
  1. include this source file in an html page via 31 | * {@code } 32 | *
  2. define style rules. See the example page for examples. 33 | *
  3. mark the {@code
    } and {@code } tags in your source with
      34 |  *    {@code class=prettyprint.}
      35 |  *    You can also use the (html deprecated) {@code } tag, but the pretty
      36 |  *    printer needs to do more substantial DOM manipulations to support that, so
      37 |  *    some css styles may not be preserved.
      38 |  * </ol>
      39 |  * That's it.  I wanted to keep the API as simple as possible, so there's no
      40 |  * need to specify which language the code is in, but if you wish, you can add
      41 |  * another class to the {@code <pre>} or {@code <code>} element to specify the
      42 |  * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
      43 |  * starts with "lang-" followed by a file extension, specifies the file type.
      44 |  * See the "lang-*.js" files in this directory for code that implements
      45 |  * per-language file handlers.
      46 |  * <p>
      47 |  * Change log:<br>
      48 |  * cbeust, 2006/08/22
      49 |  * <blockquote>
      50 |  *   Java annotations (start with "@") are now captured as literals ("lit")
      51 |  * </blockquote>
      52 |  * @requires console
      53 |  */
      54 | 
      55 | // JSLint declarations
      56 | /*global console, document, navigator, setTimeout, window */
      57 | 
      58 | /**
      59 |  * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
      60 |  * UI events.
      61 |  * If set to {@code false}, {@code prettyPrint()} is synchronous.
      62 |  */
      63 | window['PR_SHOULD_USE_CONTINUATION'] = true;
      64 | 
      65 | /** the number of characters between tab columns */
      66 | window['PR_TAB_WIDTH'] = 8;
      67 | 
      68 | /** Contains functions for creating and registering new language handlers.
      69 |   * @type {Object}
      70 |   */
      71 | window['PR']
      72 | 
      73 | /** Pretty print a chunk of code.
      74 |   *
      75 |   * @param {string} sourceCodeHtml code as html
      76 |   * @return {string} code as html, but prettier
      77 |   */
      78 |   = window['prettyPrintOne']
      79 | /** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      80 |   * {@code class=prettyprint} and prettify them.
      81 |   * @param {Function?} opt_whenDone if specified, called when the last entry
      82 |   *     has been finished.
      83 |   */
      84 |   = window['prettyPrint'] = void 0;
      85 | 
      86 | 
      87 | (function () {
      88 |   // Keyword lists for various languages.
      89 |   var FLOW_CONTROL_KEYWORDS =
      90 |       "break continue do else for if return while ";
      91 |   var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
      92 |       "double enum extern float goto int long register short signed sizeof " +
      93 |       "static struct switch typedef union unsigned void volatile ";
      94 |   var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
      95 |       "new operator private protected public this throw true try typeof ";
      96 |   var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
      97 |       "concept concept_map const_cast constexpr decltype " +
      98 |       "dynamic_cast explicit export friend inline late_check " +
      99 |       "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
     100 |       "template typeid typename using virtual wchar_t where ";
     101 |   var JAVA_KEYWORDS = COMMON_KEYWORDS +
     102 |       "abstract boolean byte extends final finally implements import " +
     103 |       "instanceof null native package strictfp super synchronized throws " +
     104 |       "transient ";
     105 |   var CSHARP_KEYWORDS = JAVA_KEYWORDS +
     106 |       "as base by checked decimal delegate descending dynamic event " +
     107 |       "fixed foreach from group implicit in interface internal into is lock " +
     108 |       "object out override orderby params partial readonly ref sbyte sealed " +
     109 |       "stackalloc string select uint ulong unchecked unsafe ushort var ";
     110 |   var COFFEE_KEYWORDS = "all and by catch class else extends false finally " +
     111 |       "for if in is isnt loop new no not null of off on or return super then " +
     112 |       "true try unless until when while yes ";
     113 |   var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
     114 |       "debugger eval export function get null set undefined var with " +
     115 |       "Infinity NaN ";
     116 |   var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
     117 |       "goto if import last local my next no our print package redo require " +
     118 |       "sub undef unless until use wantarray while BEGIN END ";
     119 |   var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
     120 |       "elif except exec finally from global import in is lambda " +
     121 |       "nonlocal not or pass print raise try with yield " +
     122 |       "False True None ";
     123 |   var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
     124 |       " defined elsif end ensure false in module next nil not or redo rescue " +
     125 |       "retry self super then true undef unless until when yield BEGIN END ";
     126 |   var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
     127 |       "function in local set then until ";
     128 |   var ALL_KEYWORDS = (
     129 |       CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
     130 |       PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
     131 | 
     132 |   // token style names.  correspond to css classes
     133 |   /** token style for a string literal */
     134 |   var PR_STRING = 'str';
     135 |   /** token style for a keyword */
     136 |   var PR_KEYWORD = 'kwd';
     137 |   /** token style for a comment */
     138 |   var PR_COMMENT = 'com';
     139 |   /** token style for a type */
     140 |   var PR_TYPE = 'typ';
     141 |   /** token style for a literal value.  e.g. 1, null, true. */
     142 |   var PR_LITERAL = 'lit';
     143 |   /** token style for a punctuation string. */
     144 |   var PR_PUNCTUATION = 'pun';
     145 |   /** token style for a punctuation string. */
     146 |   var PR_PLAIN = 'pln';
     147 | 
     148 |   /** token style for an sgml tag. */
     149 |   var PR_TAG = 'tag';
     150 |   /** token style for a markup declaration such as a DOCTYPE. */
     151 |   var PR_DECLARATION = 'dec';
     152 |   /** token style for embedded source. */
     153 |   var PR_SOURCE = 'src';
     154 |   /** token style for an sgml attribute name. */
     155 |   var PR_ATTRIB_NAME = 'atn';
     156 |   /** token style for an sgml attribute value. */
     157 |   var PR_ATTRIB_VALUE = 'atv';
     158 | 
     159 |   /**
     160 |    * A class that indicates a section of markup that is not code, e.g. to allow
     161 |    * embedding of line numbers within code listings.
     162 |    */
     163 |   var PR_NOCODE = 'nocode';
     164 | 
     165 |   /** A set of tokens that can precede a regular expression literal in
     166 |     * javascript.
     167 |     * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
     168 |     * list, but I've removed ones that might be problematic when seen in
     169 |     * languages that don't support regular expression literals.
     170 |     *
     171 |     * <p>Specifically, I've removed any keywords that can't precede a regexp
     172 |     * literal in a syntactically legal javascript program, and I've removed the
     173 |     * "in" keyword since it's not a keyword in many languages, and might be used
     174 |     * as a count of inches.
     175 |     *
     176 |     * <p>The link a above does not accurately describe EcmaScript rules since
     177 |     * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
     178 |     * very well in practice.
     179 |     *
     180 |     * @private
     181 |     */
     182 |   var REGEXP_PRECEDER_PATTERN = function () {
     183 |       var preceders = [
     184 |           "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
     185 |           "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
     186 |           "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
     187 |           "<", "<<", "<<=", "<=", "=", "==", "===", ">",
     188 |           ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
     189 |           "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
     190 |           "||=", "~" /* handles =~ and !~ */,
     191 |           "break", "case", "continue", "delete",
     192 |           "do", "else", "finally", "instanceof",
     193 |           "return", "throw", "try", "typeof"
     194 |           ];
     195 |       var pattern = '(?:^^|[+-]';
     196 |       for (var i = 0; i < preceders.length; ++i) {
     197 |         pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
     198 |       }
     199 |       pattern += ')\\s*';  // matches at end, and matches empty string
     200 |       return pattern;
     201 |       // CAVEAT: this does not properly handle the case where a regular
     202 |       // expression immediately follows another since a regular expression may
     203 |       // have flags for case-sensitivity and the like.  Having regexp tokens
     204 |       // adjacent is not valid in any language I'm aware of, so I'm punting.
     205 |       // TODO: maybe style special characters inside a regexp as punctuation.
     206 |     }();
     207 | 
     208 |   
     209 |   /**
     210 |    * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
     211 |    * matches the union of the sets of strings matched by the input RegExp.
     212 |    * Since it matches globally, if the input strings have a start-of-input
     213 |    * anchor (/^.../), it is ignored for the purposes of unioning.
     214 |    * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
     215 |    * @return {RegExp} a global regex.
     216 |    */
     217 |   function combinePrefixPatterns(regexs) {
     218 |     var capturedGroupIndex = 0;
     219 |   
     220 |     var needToFoldCase = false;
     221 |     var ignoreCase = false;
     222 |     for (var i = 0, n = regexs.length; i < n; ++i) {
     223 |       var regex = regexs[i];
     224 |       if (regex.ignoreCase) {
     225 |         ignoreCase = true;
     226 |       } else if (/[a-z]/i.test(regex.source.replace(
     227 |                      /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
     228 |         needToFoldCase = true;
     229 |         ignoreCase = false;
     230 |         break;
     231 |       }
     232 |     }
     233 |   
     234 |     function decodeEscape(charsetPart) {
     235 |       if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
     236 |       switch (charsetPart.charAt(1)) {
     237 |         case 'b': return 8;
     238 |         case 't': return 9;
     239 |         case 'n': return 0xa;
     240 |         case 'v': return 0xb;
     241 |         case 'f': return 0xc;
     242 |         case 'r': return 0xd;
     243 |         case 'u': case 'x':
     244 |           return parseInt(charsetPart.substring(2), 16)
     245 |               || charsetPart.charCodeAt(1);
     246 |         case '0': case '1': case '2': case '3': case '4':
     247 |         case '5': case '6': case '7':
     248 |           return parseInt(charsetPart.substring(1), 8);
     249 |         default: return charsetPart.charCodeAt(1);
     250 |       }
     251 |     }
     252 |   
     253 |     function encodeEscape(charCode) {
     254 |       if (charCode < 0x20) {
     255 |         return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
     256 |       }
     257 |       var ch = String.fromCharCode(charCode);
     258 |       if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
     259 |         ch = '\\' + ch;
     260 |       }
     261 |       return ch;
     262 |     }
     263 |   
     264 |     function caseFoldCharset(charSet) {
     265 |       var charsetParts = charSet.substring(1, charSet.length - 1).match(
     266 |           new RegExp(
     267 |               '\\\\u[0-9A-Fa-f]{4}'
     268 |               + '|\\\\x[0-9A-Fa-f]{2}'
     269 |               + '|\\\\[0-3][0-7]{0,2}'
     270 |               + '|\\\\[0-7]{1,2}'
     271 |               + '|\\\\[\\s\\S]'
     272 |               + '|-'
     273 |               + '|[^-\\\\]',
     274 |               'g'));
     275 |       var groups = [];
     276 |       var ranges = [];
     277 |       var inverse = charsetParts[0] === '^';
     278 |       for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
     279 |         var p = charsetParts[i];
     280 |         switch (p) {
     281 |           case '\\B': case '\\b':
     282 |           case '\\D': case '\\d':
     283 |           case '\\S': case '\\s':
     284 |           case '\\W': case '\\w':
     285 |             groups.push(p);
     286 |             continue;
     287 |         }
     288 |         var start = decodeEscape(p);
     289 |         var end;
     290 |         if (i + 2 < n && '-' === charsetParts[i + 1]) {
     291 |           end = decodeEscape(charsetParts[i + 2]);
     292 |           i += 2;
     293 |         } else {
     294 |           end = start;
     295 |         }
     296 |         ranges.push([start, end]);
     297 |         // If the range might intersect letters, then expand it.
     298 |         if (!(end < 65 || start > 122)) {
     299 |           if (!(end < 65 || start > 90)) {
     300 |             ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
     301 |           }
     302 |           if (!(end < 97 || start > 122)) {
     303 |             ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
     304 |           }
     305 |         }
     306 |       }
     307 |   
     308 |       // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
     309 |       // -> [[1, 12], [14, 14], [16, 17]]
     310 |       ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
     311 |       var consolidatedRanges = [];
     312 |       var lastRange = [NaN, NaN];
     313 |       for (var i = 0; i < ranges.length; ++i) {
     314 |         var range = ranges[i];
     315 |         if (range[0] <= lastRange[1] + 1) {
     316 |           lastRange[1] = Math.max(lastRange[1], range[1]);
     317 |         } else {
     318 |           consolidatedRanges.push(lastRange = range);
     319 |         }
     320 |       }
     321 |   
     322 |       var out = ['['];
     323 |       if (inverse) { out.push('^'); }
     324 |       out.push.apply(out, groups);
     325 |       for (var i = 0; i < consolidatedRanges.length; ++i) {
     326 |         var range = consolidatedRanges[i];
     327 |         out.push(encodeEscape(range[0]));
     328 |         if (range[1] > range[0]) {
     329 |           if (range[1] + 1 > range[0]) { out.push('-'); }
     330 |           out.push(encodeEscape(range[1]));
     331 |         }
     332 |       }
     333 |       out.push(']');
     334 |       return out.join('');
     335 |     }
     336 |   
     337 |     function allowAnywhereFoldCaseAndRenumberGroups(regex) {
     338 |       // Split into character sets, escape sequences, punctuation strings
     339 |       // like ('(', '(?:', ')', '^'), and runs of characters that do not
     340 |       // include any of the above.
     341 |       var parts = regex.source.match(
     342 |           new RegExp(
     343 |               '(?:'
     344 |               + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
     345 |               + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
     346 |               + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
     347 |               + '|\\\\[0-9]+'  // a back-reference or octal escape
     348 |               + '|\\\\[^ux0-9]'  // other escape sequence
     349 |               + '|\\(\\?[:!=]'  // start of a non-capturing group
     350 |               + '|[\\(\\)\\^]'  // start/emd of a group, or line start
     351 |               + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
     352 |               + ')',
     353 |               'g'));
     354 |       var n = parts.length;
     355 |   
     356 |       // Maps captured group numbers to the number they will occupy in
     357 |       // the output or to -1 if that has not been determined, or to
     358 |       // undefined if they need not be capturing in the output.
     359 |       var capturedGroups = [];
     360 |   
     361 |       // Walk over and identify back references to build the capturedGroups
     362 |       // mapping.
     363 |       for (var i = 0, groupIndex = 0; i < n; ++i) {
     364 |         var p = parts[i];
     365 |         if (p === '(') {
     366 |           // groups are 1-indexed, so max group index is count of '('
     367 |           ++groupIndex;
     368 |         } else if ('\\' === p.charAt(0)) {
     369 |           var decimalValue = +p.substring(1);
     370 |           if (decimalValue && decimalValue <= groupIndex) {
     371 |             capturedGroups[decimalValue] = -1;
     372 |           }
     373 |         }
     374 |       }
     375 |   
     376 |       // Renumber groups and reduce capturing groups to non-capturing groups
     377 |       // where possible.
     378 |       for (var i = 1; i < capturedGroups.length; ++i) {
     379 |         if (-1 === capturedGroups[i]) {
     380 |           capturedGroups[i] = ++capturedGroupIndex;
     381 |         }
     382 |       }
     383 |       for (var i = 0, groupIndex = 0; i < n; ++i) {
     384 |         var p = parts[i];
     385 |         if (p === '(') {
     386 |           ++groupIndex;
     387 |           if (capturedGroups[groupIndex] === undefined) {
     388 |             parts[i] = '(?:';
     389 |           }
     390 |         } else if ('\\' === p.charAt(0)) {
     391 |           var decimalValue = +p.substring(1);
     392 |           if (decimalValue && decimalValue <= groupIndex) {
     393 |             parts[i] = '\\' + capturedGroups[groupIndex];
     394 |           }
     395 |         }
     396 |       }
     397 |   
     398 |       // Remove any prefix anchors so that the output will match anywhere.
     399 |       // ^^ really does mean an anchored match though.
     400 |       for (var i = 0, groupIndex = 0; i < n; ++i) {
     401 |         if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
     402 |       }
     403 |   
     404 |       // Expand letters to groups to handle mixing of case-sensitive and
     405 |       // case-insensitive patterns if necessary.
     406 |       if (regex.ignoreCase && needToFoldCase) {
     407 |         for (var i = 0; i < n; ++i) {
     408 |           var p = parts[i];
     409 |           var ch0 = p.charAt(0);
     410 |           if (p.length >= 2 && ch0 === '[') {
     411 |             parts[i] = caseFoldCharset(p);
     412 |           } else if (ch0 !== '\\') {
     413 |             // TODO: handle letters in numeric escapes.
     414 |             parts[i] = p.replace(
     415 |                 /[a-zA-Z]/g,
     416 |                 function (ch) {
     417 |                   var cc = ch.charCodeAt(0);
     418 |                   return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
     419 |                 });
     420 |           }
     421 |         }
     422 |       }
     423 |   
     424 |       return parts.join('');
     425 |     }
     426 |   
     427 |     var rewritten = [];
     428 |     for (var i = 0, n = regexs.length; i < n; ++i) {
     429 |       var regex = regexs[i];
     430 |       if (regex.global || regex.multiline) { throw new Error('' + regex); }
     431 |       rewritten.push(
     432 |           '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
     433 |     }
     434 |   
     435 |     return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
     436 |   }
     437 | 
     438 | 
     439 |   /**
     440 |    * Split markup into a string of source code and an array mapping ranges in
     441 |    * that string to the text nodes in which they appear.
     442 |    *
     443 |    * <p>
     444 |    * The HTML DOM structure:</p>
     445 |    * <pre>
     446 |    * (Element   "p"
     447 |    *   (Element "b"
     448 |    *     (Text  "print "))       ; #1
     449 |    *   (Text    "'Hello '")      ; #2
     450 |    *   (Element "br")            ; #3
     451 |    *   (Text    "  + 'World';")) ; #4
     452 |    * </pre>
     453 |    * <p>
     454 |    * corresponds to the HTML
     455 |    * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
     456 |    *
     457 |    * <p>
     458 |    * It will produce the output:</p>
     459 |    * <pre>
     460 |    * {
     461 |    *   source: "print 'Hello '\n  + 'World';",
     462 |    *   //                 1         2
     463 |    *   //       012345678901234 5678901234567
     464 |    *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
     465 |    * }
     466 |    * </pre>
     467 |    * <p>
     468 |    * where #1 is a reference to the {@code "print "} text node above, and so
     469 |    * on for the other text nodes.
     470 |    * </p>
     471 |    *
     472 |    * <p>
     473 |    * The {@code} spans array is an array of pairs.  Even elements are the start
     474 |    * indices of substrings, and odd elements are the text nodes (or BR elements)
     475 |    * that contain the text for those substrings.
     476 |    * Substrings continue until the next index or the end of the source.
     477 |    * </p>
     478 |    *
     479 |    * @param {Node} node an HTML DOM subtree containing source-code.
     480 |    * @return {Object} source code and the text nodes in which they occur.
     481 |    */
     482 |   function extractSourceSpans(node) {
     483 |     var nocode = /(?:^|\s)nocode(?:\s|$)/;
     484 |   
     485 |     var chunks = [];
     486 |     var length = 0;
     487 |     var spans = [];
     488 |     var k = 0;
     489 |   
     490 |     var whitespace;
     491 |     if (node.currentStyle) {
     492 |       whitespace = node.currentStyle.whiteSpace;
     493 |     } else if (window.getComputedStyle) {
     494 |       whitespace = document.defaultView.getComputedStyle(node, null)
     495 |           .getPropertyValue('white-space');
     496 |     }
     497 |     var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
     498 |   
     499 |     function walk(node) {
     500 |       switch (node.nodeType) {
     501 |         case 1:  // Element
     502 |           if (nocode.test(node.className)) { return; }
     503 |           for (var child = node.firstChild; child; child = child.nextSibling) {
     504 |             walk(child);
     505 |           }
     506 |           var nodeName = node.nodeName;
     507 |           if ('BR' === nodeName || 'LI' === nodeName) {
     508 |             chunks[k] = '\n';
     509 |             spans[k << 1] = length++;
     510 |             spans[(k++ << 1) | 1] = node;
     511 |           }
     512 |           break;
     513 |         case 3: case 4:  // Text
     514 |           var text = node.nodeValue;
     515 |           if (text.length) {
     516 |             if (!isPreformatted) {
     517 |               text = text.replace(/[ \t\r\n]+/g, ' ');
     518 |             } else {
     519 |               text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
     520 |             }
     521 |             // TODO: handle tabs here?
     522 |             chunks[k] = text;
     523 |             spans[k << 1] = length;
     524 |             length += text.length;
     525 |             spans[(k++ << 1) | 1] = node;
     526 |           }
     527 |           break;
     528 |       }
     529 |     }
     530 |   
     531 |     walk(node);
     532 |   
     533 |     return {
     534 |       source: chunks.join('').replace(/\n$/, ''),
     535 |       spans: spans
     536 |     };
     537 |   }
     538 | 
     539 | 
     540 |   /**
     541 |    * Apply the given language handler to sourceCode and add the resulting
     542 |    * decorations to out.
     543 |    * @param {number} basePos the index of sourceCode within the chunk of source
     544 |    *    whose decorations are already present on out.
     545 |    */
     546 |   function appendDecorations(basePos, sourceCode, langHandler, out) {
     547 |     if (!sourceCode) { return; }
     548 |     var job = {
     549 |       source: sourceCode,
     550 |       basePos: basePos
     551 |     };
     552 |     langHandler(job);
     553 |     out.push.apply(out, job.decorations);
     554 |   }
     555 | 
     556 |   /** Given triples of [style, pattern, context] returns a lexing function,
     557 |     * The lexing function interprets the patterns to find token boundaries and
     558 |     * returns a decoration list of the form
     559 |     * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
     560 |     * where index_n is an index into the sourceCode, and style_n is a style
     561 |     * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
     562 |     * all characters in sourceCode[index_n-1:index_n].
     563 |     *
     564 |     * The stylePatterns is a list whose elements have the form
     565 |     * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
     566 |     *
     567 |     * Style is a style constant like PR_PLAIN, or can be a string of the
     568 |     * form 'lang-FOO', where FOO is a language extension describing the
     569 |     * language of the portion of the token in $1 after pattern executes.
     570 |     * E.g., if style is 'lang-lisp', and group 1 contains the text
     571 |     * '(hello (world))', then that portion of the token will be passed to the
     572 |     * registered lisp handler for formatting.
     573 |     * The text before and after group 1 will be restyled using this decorator
     574 |     * so decorators should take care that this doesn't result in infinite
     575 |     * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
     576 |     * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
     577 |     * '<script>foo()<\/script>', which would cause the current decorator to
     578 |     * be called with '<script>' which would not match the same rule since
     579 |     * group 1 must not be empty, so it would be instead styled as PR_TAG by
     580 |     * the generic tag rule.  The handler registered for the 'js' extension would
     581 |     * then be called with 'foo()', and finally, the current decorator would
     582 |     * be called with '<\/script>' which would not match the original rule and
     583 |     * so the generic tag rule would identify it as a tag.
     584 |     *
     585 |     * Pattern must only match prefixes, and if it matches a prefix, then that
     586 |     * match is considered a token with the same style.
     587 |     *
     588 |     * Context is applied to the last non-whitespace, non-comment token
     589 |     * recognized.
     590 |     *
     591 |     * Shortcut is an optional string of characters, any of which, if the first
     592 |     * character, gurantee that this pattern and only this pattern matches.
     593 |     *
     594 |     * @param {Array} shortcutStylePatterns patterns that always start with
     595 |     *   a known character.  Must have a shortcut string.
     596 |     * @param {Array} fallthroughStylePatterns patterns that will be tried in
     597 |     *   order if the shortcut ones fail.  May have shortcuts.
     598 |     *
     599 |     * @return {function (Object)} a
     600 |     *   function that takes source code and returns a list of decorations.
     601 |     */
     602 |   function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
     603 |     var shortcuts = {};
     604 |     var tokenizer;
     605 |     (function () {
     606 |       var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
     607 |       var allRegexs = [];
     608 |       var regexKeys = {};
     609 |       for (var i = 0, n = allPatterns.length; i < n; ++i) {
     610 |         var patternParts = allPatterns[i];
     611 |         var shortcutChars = patternParts[3];
     612 |         if (shortcutChars) {
     613 |           for (var c = shortcutChars.length; --c >= 0;) {
     614 |             shortcuts[shortcutChars.charAt(c)] = patternParts;
     615 |           }
     616 |         }
     617 |         var regex = patternParts[1];
     618 |         var k = '' + regex;
     619 |         if (!regexKeys.hasOwnProperty(k)) {
     620 |           allRegexs.push(regex);
     621 |           regexKeys[k] = null;
     622 |         }
     623 |       }
     624 |       allRegexs.push(/[\0-\uffff]/);
     625 |       tokenizer = combinePrefixPatterns(allRegexs);
     626 |     })();
     627 | 
     628 |     var nPatterns = fallthroughStylePatterns.length;
     629 |     var notWs = /\S/;
     630 | 
     631 |     /**
     632 |      * Lexes job.source and produces an output array job.decorations of style
     633 |      * classes preceded by the position at which they start in job.source in
     634 |      * order.
     635 |      *
     636 |      * @param {Object} job an object like {@code
     637 |      *    source: {string} sourceText plain text,
     638 |      *    basePos: {int} position of job.source in the larger chunk of
     639 |      *        sourceCode.
     640 |      * }
     641 |      */
     642 |     var decorate = function (job) {
     643 |       var sourceCode = job.source, basePos = job.basePos;
     644 |       /** Even entries are positions in source in ascending order.  Odd enties
     645 |         * are style markers (e.g., PR_COMMENT) that run from that position until
     646 |         * the end.
     647 |         * @type {Array.<number|string>}
     648 |         */
     649 |       var decorations = [basePos, PR_PLAIN];
     650 |       var pos = 0;  // index into sourceCode
     651 |       var tokens = sourceCode.match(tokenizer) || [];
     652 |       var styleCache = {};
     653 | 
     654 |       for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
     655 |         var token = tokens[ti];
     656 |         var style = styleCache[token];
     657 |         var match = void 0;
     658 | 
     659 |         var isEmbedded;
     660 |         if (typeof style === 'string') {
     661 |           isEmbedded = false;
     662 |         } else {
     663 |           var patternParts = shortcuts[token.charAt(0)];
     664 |           if (patternParts) {
     665 |             match = token.match(patternParts[1]);
     666 |             style = patternParts[0];
     667 |           } else {
     668 |             for (var i = 0; i < nPatterns; ++i) {
     669 |               patternParts = fallthroughStylePatterns[i];
     670 |               match = token.match(patternParts[1]);
     671 |               if (match) {
     672 |                 style = patternParts[0];
     673 |                 break;
     674 |               }
     675 |             }
     676 | 
     677 |             if (!match) {  // make sure that we make progress
     678 |               style = PR_PLAIN;
     679 |             }
     680 |           }
     681 | 
     682 |           isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
     683 |           if (isEmbedded && !(match && typeof match[1] === 'string')) {
     684 |             isEmbedded = false;
     685 |             style = PR_SOURCE;
     686 |           }
     687 | 
     688 |           if (!isEmbedded) { styleCache[token] = style; }
     689 |         }
     690 | 
     691 |         var tokenStart = pos;
     692 |         pos += token.length;
     693 | 
     694 |         if (!isEmbedded) {
     695 |           decorations.push(basePos + tokenStart, style);
     696 |         } else {  // Treat group 1 as an embedded block of source code.
     697 |           var embeddedSource = match[1];
     698 |           var embeddedSourceStart = token.indexOf(embeddedSource);
     699 |           var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
     700 |           if (match[2]) {
     701 |             // If embeddedSource can be blank, then it would match at the
     702 |             // beginning which would cause us to infinitely recurse on the
     703 |             // entire token, so we catch the right context in match[2].
     704 |             embeddedSourceEnd = token.length - match[2].length;
     705 |             embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
     706 |           }
     707 |           var lang = style.substring(5);
     708 |           // Decorate the left of the embedded source
     709 |           appendDecorations(
     710 |               basePos + tokenStart,
     711 |               token.substring(0, embeddedSourceStart),
     712 |               decorate, decorations);
     713 |           // Decorate the embedded source
     714 |           appendDecorations(
     715 |               basePos + tokenStart + embeddedSourceStart,
     716 |               embeddedSource,
     717 |               langHandlerForExtension(lang, embeddedSource),
     718 |               decorations);
     719 |           // Decorate the right of the embedded section
     720 |           appendDecorations(
     721 |               basePos + tokenStart + embeddedSourceEnd,
     722 |               token.substring(embeddedSourceEnd),
     723 |               decorate, decorations);
     724 |         }
     725 |       }
     726 |       job.decorations = decorations;
     727 |     };
     728 |     return decorate;
     729 |   }
     730 | 
     731 |   /** returns a function that produces a list of decorations from source text.
     732 |     *
     733 |     * This code treats ", ', and ` as string delimiters, and \ as a string
     734 |     * escape.  It does not recognize perl's qq() style strings.
     735 |     * It has no special handling for double delimiter escapes as in basic, or
     736 |     * the tripled delimiters used in python, but should work on those regardless
     737 |     * although in those cases a single string literal may be broken up into
     738 |     * multiple adjacent string literals.
     739 |     *
     740 |     * It recognizes C, C++, and shell style comments.
     741 |     *
     742 |     * @param {Object} options a set of optional parameters.
     743 |     * @return {function (Object)} a function that examines the source code
     744 |     *     in the input job and builds the decoration list.
     745 |     */
     746 |   function sourceDecorator(options) {
     747 |     var shortcutStylePatterns = [], fallthroughStylePatterns = [];
     748 |     if (options['tripleQuotedStrings']) {
     749 |       // '''multi-line-string''', 'single-line-string', and double-quoted
     750 |       shortcutStylePatterns.push(
     751 |           [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
     752 |            null, '\'"']);
     753 |     } else if (options['multiLineStrings']) {
     754 |       // 'multi-line-string', "multi-line-string"
     755 |       shortcutStylePatterns.push(
     756 |           [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
     757 |            null, '\'"`']);
     758 |     } else {
     759 |       // 'single-line-string', "single-line-string"
     760 |       shortcutStylePatterns.push(
     761 |           [PR_STRING,
     762 |            /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
     763 |            null, '"\'']);
     764 |     }
     765 |     if (options['verbatimStrings']) {
     766 |       // verbatim-string-literal production from the C# grammar.  See issue 93.
     767 |       fallthroughStylePatterns.push(
     768 |           [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
     769 |     }
     770 |     var hc = options['hashComments'];
     771 |     if (hc) {
     772 |       if (options['cStyleComments']) {
     773 |         if (hc > 1) {  // multiline hash comments
     774 |           shortcutStylePatterns.push(
     775 |               [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
     776 |         } else {
     777 |           // Stop C preprocessor declarations at an unclosed open comment
     778 |           shortcutStylePatterns.push(
     779 |               [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
     780 |                null, '#']);
     781 |         }
     782 |         fallthroughStylePatterns.push(
     783 |             [PR_STRING,
     784 |              /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
     785 |              null]);
     786 |       } else {
     787 |         shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
     788 |       }
     789 |     }
     790 |     if (options['cStyleComments']) {
     791 |       fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
     792 |       fallthroughStylePatterns.push(
     793 |           [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
     794 |     }
     795 |     if (options['regexLiterals']) {
     796 |       var REGEX_LITERAL = (
     797 |           // A regular expression literal starts with a slash that is
     798 |           // not followed by * or / so that it is not confused with
     799 |           // comments.
     800 |           '/(?=[^/*])'
     801 |           // and then contains any number of raw characters,
     802 |           + '(?:[^/\\x5B\\x5C]'
     803 |           // escape sequences (\x5C),
     804 |           +    '|\\x5C[\\s\\S]'
     805 |           // or non-nesting character sets (\x5B\x5D);
     806 |           +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
     807 |           // finally closed by a /.
     808 |           + '/');
     809 |       fallthroughStylePatterns.push(
     810 |           ['lang-regex',
     811 |            new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
     812 |            ]);
     813 |     }
     814 | 
     815 |     var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
     816 |     if (keywords.length) {
     817 |       fallthroughStylePatterns.push(
     818 |           [PR_KEYWORD,
     819 |            new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
     820 |     }
     821 | 
     822 |     shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
     823 |     fallthroughStylePatterns.push(
     824 |         // TODO(mikesamuel): recognize non-latin letters and numerals in idents
     825 |         [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
     826 |         [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
     827 |         [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
     828 |         [PR_LITERAL,
     829 |          new RegExp(
     830 |              '^(?:'
     831 |              // A hex number
     832 |              + '0x[a-f0-9]+'
     833 |              // or an octal or decimal number,
     834 |              + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
     835 |              // possibly in scientific notation
     836 |              + '(?:e[+\\-]?\\d+)?'
     837 |              + ')'
     838 |              // with an optional modifier like UL for unsigned long
     839 |              + '[a-z]*', 'i'),
     840 |          null, '0123456789'],
     841 |         // Don't treat escaped quotes in bash as starting strings.  See issue 144.
     842 |         [PR_PLAIN,       /^\\[\s\S]?/, null],
     843 |         [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]);
     844 | 
     845 |     return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
     846 |   }
     847 | 
     848 |   var decorateSource = sourceDecorator({
     849 |         'keywords': ALL_KEYWORDS,
     850 |         'hashComments': true,
     851 |         'cStyleComments': true,
     852 |         'multiLineStrings': true,
     853 |         'regexLiterals': true
     854 |       });
     855 | 
     856 |   /**
     857 |    * Given a DOM subtree, wraps it in a list, and puts each line into its own
     858 |    * list item.
     859 |    *
     860 |    * @param {Node} node modified in place.  Its content is pulled into an
     861 |    *     HTMLOListElement, and each line is moved into a separate list item.
     862 |    *     This requires cloning elements, so the input might not have unique
     863 |    *     IDs after numbering.
     864 |    */
     865 |   function numberLines(node, opt_startLineNum) {
     866 |     var nocode = /(?:^|\s)nocode(?:\s|$)/;
     867 |     var lineBreak = /\r\n?|\n/;
     868 |   
     869 |     var document = node.ownerDocument;
     870 |   
     871 |     var whitespace;
     872 |     if (node.currentStyle) {
     873 |       whitespace = node.currentStyle.whiteSpace;
     874 |     } else if (window.getComputedStyle) {
     875 |       whitespace = document.defaultView.getComputedStyle(node, null)
     876 |           .getPropertyValue('white-space');
     877 |     }
     878 |     // If it's preformatted, then we need to split lines on line breaks
     879 |     // in addition to <BR>s.
     880 |     var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
     881 |   
     882 |     var li = document.createElement('LI');
     883 |     while (node.firstChild) {
     884 |       li.appendChild(node.firstChild);
     885 |     }
     886 |     // An array of lines.  We split below, so this is initialized to one
     887 |     // un-split line.
     888 |     var listItems = [li];
     889 |   
     890 |     function walk(node) {
     891 |       switch (node.nodeType) {
     892 |         case 1:  // Element
     893 |           if (nocode.test(node.className)) { break; }
     894 |           if ('BR' === node.nodeName) {
     895 |             breakAfter(node);
     896 |             // Discard the <BR> since it is now flush against a </LI>.
     897 |             if (node.parentNode) {
     898 |               node.parentNode.removeChild(node);
     899 |             }
     900 |           } else {
     901 |             for (var child = node.firstChild; child; child = child.nextSibling) {
     902 |               walk(child);
     903 |             }
     904 |           }
     905 |           break;
     906 |         case 3: case 4:  // Text
     907 |           if (isPreformatted) {
     908 |             var text = node.nodeValue;
     909 |             var match = text.match(lineBreak);
     910 |             if (match) {
     911 |               var firstLine = text.substring(0, match.index);
     912 |               node.nodeValue = firstLine;
     913 |               var tail = text.substring(match.index + match[0].length);
     914 |               if (tail) {
     915 |                 var parent = node.parentNode;
     916 |                 parent.insertBefore(
     917 |                     document.createTextNode(tail), node.nextSibling);
     918 |               }
     919 |               breakAfter(node);
     920 |               if (!firstLine) {
     921 |                 // Don't leave blank text nodes in the DOM.
     922 |                 node.parentNode.removeChild(node);
     923 |               }
     924 |             }
     925 |           }
     926 |           break;
     927 |       }
     928 |     }
     929 |   
     930 |     // Split a line after the given node.
     931 |     function breakAfter(lineEndNode) {
     932 |       // If there's nothing to the right, then we can skip ending the line
     933 |       // here, and move root-wards since splitting just before an end-tag
     934 |       // would require us to create a bunch of empty copies.
     935 |       while (!lineEndNode.nextSibling) {
     936 |         lineEndNode = lineEndNode.parentNode;
     937 |         if (!lineEndNode) { return; }
     938 |       }
     939 |   
     940 |       function breakLeftOf(limit, copy) {
     941 |         // Clone shallowly if this node needs to be on both sides of the break.
     942 |         var rightSide = copy ? limit.cloneNode(false) : limit;
     943 |         var parent = limit.parentNode;
     944 |         if (parent) {
     945 |           // We clone the parent chain.
     946 |           // This helps us resurrect important styling elements that cross lines.
     947 |           // E.g. in <i>Foo<br>Bar</i>
     948 |           // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
     949 |           var parentClone = breakLeftOf(parent, 1);
     950 |           // Move the clone and everything to the right of the original
     951 |           // onto the cloned parent.
     952 |           var next = limit.nextSibling;
     953 |           parentClone.appendChild(rightSide);
     954 |           for (var sibling = next; sibling; sibling = next) {
     955 |             next = sibling.nextSibling;
     956 |             parentClone.appendChild(sibling);
     957 |           }
     958 |         }
     959 |         return rightSide;
     960 |       }
     961 |   
     962 |       var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
     963 |   
     964 |       // Walk the parent chain until we reach an unattached LI.
     965 |       for (var parent;
     966 |            // Check nodeType since IE invents document fragments.
     967 |            (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
     968 |         copiedListItem = parent;
     969 |       }
     970 |       // Put it on the list of lines for later processing.
     971 |       listItems.push(copiedListItem);
     972 |     }
     973 |   
     974 |     // Split lines while there are lines left to split.
     975 |     for (var i = 0;  // Number of lines that have been split so far.
     976 |          i < listItems.length;  // length updated by breakAfter calls.
     977 |          ++i) {
     978 |       walk(listItems[i]);
     979 |     }
     980 |   
     981 |     // Make sure numeric indices show correctly.
     982 |     if (opt_startLineNum === (opt_startLineNum|0)) {
     983 |       listItems[0].setAttribute('value', opt_startLineNum);
     984 |     }
     985 |   
     986 |     var ol = document.createElement('OL');
     987 |     ol.className = 'linenums';
     988 |     var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
     989 |     for (var i = 0, n = listItems.length; i < n; ++i) {
     990 |       li = listItems[i];
     991 |       // Stick a class on the LIs so that stylesheets can
     992 |       // color odd/even rows, or any other row pattern that
     993 |       // is co-prime with 10.
     994 |       li.className = 'L' + ((i + offset) % 10);
     995 |       if (!li.firstChild) {
     996 |         li.appendChild(document.createTextNode('\xA0'));
     997 |       }
     998 |       ol.appendChild(li);
     999 |     }
    1000 |   
    1001 |     node.appendChild(ol);
    1002 |   }
    1003 | 
    1004 |   /**
    1005 |    * Breaks {@code job.source} around style boundaries in {@code job.decorations}
    1006 |    * and modifies {@code job.sourceNode} in place.
    1007 |    * @param {Object} job like <pre>{
    1008 |    *    source: {string} source as plain text,
    1009 |    *    spans: {Array.<number|Node>} alternating span start indices into source
    1010 |    *       and the text node or element (e.g. {@code <BR>}) corresponding to that
    1011 |    *       span.
    1012 |    *    decorations: {Array.<number|string} an array of style classes preceded
    1013 |    *       by the position at which they start in job.source in order
    1014 |    * }</pre>
    1015 |    * @private
    1016 |    */
    1017 |   function recombineTagsAndDecorations(job) {
    1018 |     var isIE = /\bMSIE\b/.test(navigator.userAgent);
    1019 |     var newlineRe = /\n/g;
    1020 |   
    1021 |     var source = job.source;
    1022 |     var sourceLength = source.length;
    1023 |     // Index into source after the last code-unit recombined.
    1024 |     var sourceIndex = 0;
    1025 |   
    1026 |     var spans = job.spans;
    1027 |     var nSpans = spans.length;
    1028 |     // Index into spans after the last span which ends at or before sourceIndex.
    1029 |     var spanIndex = 0;
    1030 |   
    1031 |     var decorations = job.decorations;
    1032 |     var nDecorations = decorations.length;
    1033 |     // Index into decorations after the last decoration which ends at or before sourceIndex.
    1034 |     var decorationIndex = 0;
    1035 |   
    1036 |     // Simplify decorations.
    1037 |     var decPos = 0;
    1038 |     for (var i = 0; i < nDecorations;) {
    1039 |       // Skip over any zero-length decorations.
    1040 |       var startPos = decorations[i];
    1041 |       var start = i;
    1042 |       while (start + 2 < nDecorations && decorations[start + 2] === startPos) {
    1043 |         start += 2;
    1044 |       }
    1045 |       // Conflate all adjacent decorations that use the same style.
    1046 |       var startDec = decorations[start + 1];
    1047 |       var end = start + 2;
    1048 |       while (end + 2 <= nDecorations
    1049 |              && (decorations[end + 1] === startDec
    1050 |                  || decorations[end] === decorations[end + 2])) {
    1051 |         end += 2;
    1052 |       }
    1053 |       decorations[decPos++] = startPos;
    1054 |       decorations[decPos++] = startDec;
    1055 |       i = end;
    1056 |     }
    1057 |   
    1058 |     // Strip any zero-length decoration at the end.
    1059 |     if (decPos && decorations[decPos - 2] === sourceLength) { decPos -= 2; }
    1060 |     nDecorations = decorations.length = decPos;
    1061 |   
    1062 |     var decoration = null;
    1063 |     while (spanIndex < nSpans) {
    1064 |       var spanStart = spans[spanIndex];
    1065 |       var spanEnd = spans[spanIndex + 2] || sourceLength;
    1066 |   
    1067 |       var decStart = decorations[decorationIndex];
    1068 |       var decEnd = decorations[decorationIndex + 2] || sourceLength;
    1069 |   
    1070 |       var end = Math.min(spanEnd, decEnd);
    1071 |   
    1072 |       var textNode = spans[spanIndex + 1];
    1073 |       if (textNode.nodeType !== 1) {  // Don't muck with <BR>s or <LI>s
    1074 |         var styledText = source.substring(sourceIndex, end);
    1075 |         // This may seem bizarre, and it is.  Emitting LF on IE causes the
    1076 |         // code to display with spaces instead of line breaks.
    1077 |         // Emitting Windows standard issue linebreaks (CRLF) causes a blank
    1078 |         // space to appear at the beginning of every line but the first.
    1079 |         // Emitting an old Mac OS 9 line separator makes everything spiffy.
    1080 |         if (isIE) { styledText = styledText.replace(newlineRe, '\r'); }
    1081 |         textNode.nodeValue = styledText;
    1082 |         var document = textNode.ownerDocument;
    1083 |         var span = document.createElement('SPAN');
    1084 |         span.className = decorations[decorationIndex + 1];
    1085 |         var parentNode = textNode.parentNode;
    1086 |         parentNode.replaceChild(span, textNode);
    1087 |         span.appendChild(textNode);
    1088 |         if (sourceIndex < spanEnd) {  // Split off a text node.
    1089 |           spans[spanIndex + 1] = textNode
    1090 |               // TODO: Possibly optimize by using '' if there's no flicker.
    1091 |               = document.createTextNode(source.substring(end, spanEnd));
    1092 |           parentNode.insertBefore(textNode, span.nextSibling);
    1093 |         }
    1094 |       }
    1095 |   
    1096 |       sourceIndex = end;
    1097 |   
    1098 |       if (sourceIndex >= spanEnd) {
    1099 |         spanIndex += 2;
    1100 |       }
    1101 |       if (sourceIndex >= decEnd) {
    1102 |         decorationIndex += 2;
    1103 |       }
    1104 |     }
    1105 |   }
    1106 | 
    1107 | 
    1108 |   /** Maps language-specific file extensions to handlers. */
    1109 |   var langHandlerRegistry = {};
    1110 |   /** Register a language handler for the given file extensions.
    1111 |     * @param {function (Object)} handler a function from source code to a list
    1112 |     *      of decorations.  Takes a single argument job which describes the
    1113 |     *      state of the computation.   The single parameter has the form
    1114 |     *      {@code {
    1115 |     *        source: {string} as plain text.
    1116 |     *        decorations: {Array.<number|string>} an array of style classes
    1117 |     *                     preceded by the position at which they start in
    1118 |     *                     job.source in order.
    1119 |     *                     The language handler should assigned this field.
    1120 |     *        basePos: {int} the position of source in the larger source chunk.
    1121 |     *                 All positions in the output decorations array are relative
    1122 |     *                 to the larger source chunk.
    1123 |     *      } }
    1124 |     * @param {Array.<string>} fileExtensions
    1125 |     */
    1126 |   function registerLangHandler(handler, fileExtensions) {
    1127 |     for (var i = fileExtensions.length; --i >= 0;) {
    1128 |       var ext = fileExtensions[i];
    1129 |       if (!langHandlerRegistry.hasOwnProperty(ext)) {
    1130 |         langHandlerRegistry[ext] = handler;
    1131 |       } else if ('console' in window) {
    1132 |         console['warn']('cannot override language handler %s', ext);
    1133 |       }
    1134 |     }
    1135 |   }
    1136 |   function langHandlerForExtension(extension, source) {
    1137 |     if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    1138 |       // Treat it as markup if the first non whitespace character is a < and
    1139 |       // the last non-whitespace character is a >.
    1140 |       extension = /^\s*</.test(source)
    1141 |           ? 'default-markup'
    1142 |           : 'default-code';
    1143 |     }
    1144 |     return langHandlerRegistry[extension];
    1145 |   }
    1146 |   registerLangHandler(decorateSource, ['default-code']);
    1147 |   registerLangHandler(
    1148 |       createSimpleLexer(
    1149 |           [],
    1150 |           [
    1151 |            [PR_PLAIN,       /^[^<?]+/],
    1152 |            [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    1153 |            [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    1154 |            // Unescaped content in an unknown language
    1155 |            ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    1156 |            ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    1157 |            [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    1158 |            ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    1159 |            // Unescaped content in javascript.  (Or possibly vbscript).
    1160 |            ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    1161 |            // Contains unescaped stylesheet content
    1162 |            ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    1163 |            ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    1164 |           ]),
    1165 |       ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    1166 |   registerLangHandler(
    1167 |       createSimpleLexer(
    1168 |           [
    1169 |            [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    1170 |            [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    1171 |            ],
    1172 |           [
    1173 |            [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    1174 |            [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    1175 |            ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    1176 |            [PR_PUNCTUATION,  /^[=<>\/]+/],
    1177 |            ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    1178 |            ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    1179 |            ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    1180 |            ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    1181 |            ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    1182 |            ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    1183 |            ]),
    1184 |       ['in.tag']);
    1185 |   registerLangHandler(
    1186 |       createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    1187 |   registerLangHandler(sourceDecorator({
    1188 |           'keywords': CPP_KEYWORDS,
    1189 |           'hashComments': true,
    1190 |           'cStyleComments': true
    1191 |         }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    1192 |   registerLangHandler(sourceDecorator({
    1193 |           'keywords': 'null true false'
    1194 |         }), ['json']);
    1195 |   registerLangHandler(sourceDecorator({
    1196 |           'keywords': CSHARP_KEYWORDS,
    1197 |           'hashComments': true,
    1198 |           'cStyleComments': true,
    1199 |           'verbatimStrings': true
    1200 |         }), ['cs']);
    1201 |   registerLangHandler(sourceDecorator({
    1202 |           'keywords': JAVA_KEYWORDS,
    1203 |           'cStyleComments': true
    1204 |         }), ['java']);
    1205 |   registerLangHandler(sourceDecorator({
    1206 |           'keywords': SH_KEYWORDS,
    1207 |           'hashComments': true,
    1208 |           'multiLineStrings': true
    1209 |         }), ['bsh', 'csh', 'sh']);
    1210 |   registerLangHandler(sourceDecorator({
    1211 |           'keywords': PYTHON_KEYWORDS,
    1212 |           'hashComments': true,
    1213 |           'multiLineStrings': true,
    1214 |           'tripleQuotedStrings': true
    1215 |         }), ['cv', 'py']);
    1216 |   registerLangHandler(sourceDecorator({
    1217 |           'keywords': PERL_KEYWORDS,
    1218 |           'hashComments': true,
    1219 |           'multiLineStrings': true,
    1220 |           'regexLiterals': true
    1221 |         }), ['perl', 'pl', 'pm']);
    1222 |   registerLangHandler(sourceDecorator({
    1223 |           'keywords': RUBY_KEYWORDS,
    1224 |           'hashComments': true,
    1225 |           'multiLineStrings': true,
    1226 |           'regexLiterals': true
    1227 |         }), ['rb']);
    1228 |   registerLangHandler(sourceDecorator({
    1229 |           'keywords': JSCRIPT_KEYWORDS,
    1230 |           'cStyleComments': true,
    1231 |           'regexLiterals': true
    1232 |         }), ['js']);
    1233 |   registerLangHandler(sourceDecorator({
    1234 |           'keywords': COFFEE_KEYWORDS,
    1235 |           'hashComments': 3,  // ### style block comments
    1236 |           'cStyleComments': true,
    1237 |           'multilineStrings': true,
    1238 |           'tripleQuotedStrings': true,
    1239 |           'regexLiterals': true
    1240 |         }), ['coffee']);
    1241 |   registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    1242 | 
    1243 |   function applyDecorator(job) {
    1244 |     var opt_langExtension = job.langExtension;
    1245 | 
    1246 |     try {
    1247 |       // Extract tags, and convert the source code to plain text.
    1248 |       var sourceAndSpans = extractSourceSpans(job.sourceNode);
    1249 |       /** Plain text. @type {string} */
    1250 |       var source = sourceAndSpans.source;
    1251 |       job.source = source;
    1252 |       job.spans = sourceAndSpans.spans;
    1253 |       job.basePos = 0;
    1254 | 
    1255 |       // Apply the appropriate language handler
    1256 |       langHandlerForExtension(opt_langExtension, source)(job);
    1257 | 
    1258 |       // Integrate the decorations and tags back into the source code,
    1259 |       // modifying the sourceNode in place.
    1260 |       recombineTagsAndDecorations(job);
    1261 |     } catch (e) {
    1262 |       if ('console' in window) {
    1263 |         console['log'](e && e['stack'] ? e['stack'] : e);
    1264 |       }
    1265 |     }
    1266 |   }
    1267 | 
    1268 |   /**
    1269 |    * @param sourceCodeHtml {string} The HTML to pretty print.
    1270 |    * @param opt_langExtension {string} The language name to use.
    1271 |    *     Typically, a filename extension like 'cpp' or 'java'.
    1272 |    * @param opt_numberLines {number|boolean} True to number lines,
    1273 |    *     or the 1-indexed number of the first line in sourceCodeHtml.
    1274 |    */
    1275 |   function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
    1276 |     var container = document.createElement('PRE');
    1277 |     // This could cause images to load and onload listeners to fire.
    1278 |     // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
    1279 |     // We assume that the inner HTML is from a trusted source.
    1280 |     container.innerHTML = sourceCodeHtml;
    1281 |     if (opt_numberLines) {
    1282 |       numberLines(container, opt_numberLines);
    1283 |     }
    1284 | 
    1285 |     var job = {
    1286 |       langExtension: opt_langExtension,
    1287 |       numberLines: opt_numberLines,
    1288 |       sourceNode: container
    1289 |     };
    1290 |     applyDecorator(job);
    1291 |     return container.innerHTML;
    1292 |   }
    1293 | 
    1294 |   function prettyPrint(opt_whenDone) {
    1295 |     function byTagName(tn) { return document.getElementsByTagName(tn); }
    1296 |     // fetch a list of nodes to rewrite
    1297 |     var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    1298 |     var elements = [];
    1299 |     for (var i = 0; i < codeSegments.length; ++i) {
    1300 |       for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    1301 |         elements.push(codeSegments[i][j]);
    1302 |       }
    1303 |     }
    1304 |     codeSegments = null;
    1305 | 
    1306 |     var clock = Date;
    1307 |     if (!clock['now']) {
    1308 |       clock = { 'now': function () { return (new Date).getTime(); } };
    1309 |     }
    1310 | 
    1311 |     // The loop is broken into a series of continuations to make sure that we
    1312 |     // don't make the browser unresponsive when rewriting a large page.
    1313 |     var k = 0;
    1314 |     var prettyPrintingJob;
    1315 | 
    1316 |     function doWork() {
    1317 |       var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
    1318 |                      clock.now() + 250 /* ms */ :
    1319 |                      Infinity);
    1320 |       for (; k < elements.length && clock.now() < endTime; k++) {
    1321 |         var cs = elements[k];
    1322 |         if (cs.className && cs.className.indexOf('prettyprint') >= 0) {
    1323 |           // If the classes includes a language extensions, use it.
    1324 |           // Language extensions can be specified like
    1325 |           //     <pre class="prettyprint lang-cpp">
    1326 |           // the language extension "cpp" is used to find a language handler as
    1327 |           // passed to PR.registerLangHandler.
    1328 |           var langExtension = cs.className.match(/\blang-(\w+)\b/);
    1329 |           if (langExtension) { langExtension = langExtension[1]; }
    1330 | 
    1331 |           // make sure this is not nested in an already prettified element
    1332 |           var nested = false;
    1333 |           for (var p = cs.parentNode; p; p = p.parentNode) {
    1334 |             if ((p.tagName === 'pre' || p.tagName === 'code' ||
    1335 |                  p.tagName === 'xmp') &&
    1336 |                 p.className && p.className.indexOf('prettyprint') >= 0) {
    1337 |               nested = true;
    1338 |               break;
    1339 |             }
    1340 |           }
    1341 |           if (!nested) {
    1342 |             // Look for a class like linenums or linenums:<n> where <n> is the
    1343 |             // 1-indexed number of the first line.
    1344 |             var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
    1345 |             lineNums = lineNums
    1346 |                   ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
    1347 |                   : false;
    1348 |             if (lineNums) { numberLines(cs, lineNums); }
    1349 | 
    1350 |             // do the pretty printing
    1351 |             prettyPrintingJob = {
    1352 |               langExtension: langExtension,
    1353 |               sourceNode: cs,
    1354 |               numberLines: lineNums
    1355 |             };
    1356 |             applyDecorator(prettyPrintingJob);
    1357 |           }
    1358 |         }
    1359 |       }
    1360 |       if (k < elements.length) {
    1361 |         // finish up in a continuation
    1362 |         setTimeout(doWork, 250);
    1363 |       } else if (opt_whenDone) {
    1364 |         opt_whenDone();
    1365 |       }
    1366 |     }
    1367 | 
    1368 |     doWork();
    1369 |   }
    1370 | 
    1371 |   window['prettyPrintOne'] = prettyPrintOne;
    1372 |   window['prettyPrint'] = prettyPrint;
    1373 |   window['PR'] = {
    1374 |         'createSimpleLexer': createSimpleLexer,
    1375 |         'registerLangHandler': registerLangHandler,
    1376 |         'sourceDecorator': sourceDecorator,
    1377 |         'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    1378 |         'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    1379 |         'PR_COMMENT': PR_COMMENT,
    1380 |         'PR_DECLARATION': PR_DECLARATION,
    1381 |         'PR_KEYWORD': PR_KEYWORD,
    1382 |         'PR_LITERAL': PR_LITERAL,
    1383 |         'PR_NOCODE': PR_NOCODE,
    1384 |         'PR_PLAIN': PR_PLAIN,
    1385 |         'PR_PUNCTUATION': PR_PUNCTUATION,
    1386 |         'PR_SOURCE': PR_SOURCE,
    1387 |         'PR_STRING': PR_STRING,
    1388 |         'PR_TAG': PR_TAG,
    1389 |         'PR_TYPE': PR_TYPE
    1390 |       };
    1391 | })();
    1392 | 
    
    
    --------------------------------------------------------------------------------