From f4820366835fed1e6d59c52c3050f1279ab1844e Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Wed, 5 Sep 2007 08:38:54 -0500 Subject: [PATCH 1/9] S5 Themes Support Added support for S5 Themes. Themes are stored in the public/s5/themes/ directory. 6 themes are included: default, nautilus, blue, flower, i18n, pixel. --- app/controllers/wiki_controller.rb | 13 +- app/views/wiki/s5.rhtml | 13 +- public/s5/themes/blue/bodybg.gif | Bin 0 -> 2198 bytes public/s5/themes/blue/footbg.gif | Bin 0 -> 591 bytes public/s5/themes/blue/pretty.css | 100 +++++++++++++++ public/s5/themes/blue/slides.css | 3 + public/s5/themes/blue/splash.gif | Bin 0 -> 3428 bytes public/s5/{ui => themes}/default/pretty.css | 0 public/s5/themes/default/slides.css | 3 + public/s5/themes/flower/bodybg.jpg | Bin 0 -> 6779 bytes public/s5/themes/flower/pretty.css | 95 +++++++++++++++ public/s5/themes/flower/rightbg.jpg | Bin 0 -> 2215 bytes public/s5/themes/flower/slides.css | 3 + public/s5/themes/i18n/bodybg.jpg | Bin 0 -> 31239 bytes public/s5/themes/i18n/pretty.css | 97 +++++++++++++++ public/s5/themes/i18n/slides.css | 3 + .../default => themes/nautilus}/bodybg.gif | Bin public/s5/themes/nautilus/pretty.css | 91 ++++++++++++++ public/s5/themes/nautilus/slides.css | 3 + public/s5/themes/pixel/bodybg.gif | Bin 0 -> 1716 bytes public/s5/themes/pixel/headbg.jpg | Bin 0 -> 3571 bytes public/s5/themes/pixel/pretty.css | 114 ++++++++++++++++++ public/s5/themes/pixel/slide0bg.gif | Bin 0 -> 3180 bytes public/s5/themes/pixel/slides.css | 3 + public/s5/ui/{default => core}/blank.gif | Bin public/s5/ui/core/bodybg.gif | Bin 0 -> 10119 bytes public/s5/ui/{default => core}/framing.css | 0 public/s5/ui/{default => core}/iepngfix.htc | 0 public/s5/ui/{default => core}/math.css | 0 public/s5/ui/{default => core}/notes.css | 0 public/s5/ui/{default => core}/opera.css | 0 public/s5/ui/{default => core}/outline.css | 0 public/s5/ui/{default => core}/print.css | 0 public/s5/ui/{default => core}/s5-core.css | 0 public/s5/ui/{default => core}/slides.js | 0 public/s5/ui/default/slides.css | 3 - .../maruku/lib/maruku/output/s5/to_s5.rb | 11 ++ 37 files changed, 541 insertions(+), 14 deletions(-) create mode 100644 public/s5/themes/blue/bodybg.gif create mode 100644 public/s5/themes/blue/footbg.gif create mode 100644 public/s5/themes/blue/pretty.css create mode 100644 public/s5/themes/blue/slides.css create mode 100644 public/s5/themes/blue/splash.gif rename public/s5/{ui => themes}/default/pretty.css (100%) create mode 100644 public/s5/themes/default/slides.css create mode 100644 public/s5/themes/flower/bodybg.jpg create mode 100644 public/s5/themes/flower/pretty.css create mode 100644 public/s5/themes/flower/rightbg.jpg create mode 100644 public/s5/themes/flower/slides.css create mode 100644 public/s5/themes/i18n/bodybg.jpg create mode 100644 public/s5/themes/i18n/pretty.css create mode 100644 public/s5/themes/i18n/slides.css rename public/s5/{ui/default => themes/nautilus}/bodybg.gif (100%) mode change 100755 => 100644 create mode 100644 public/s5/themes/nautilus/pretty.css create mode 100644 public/s5/themes/nautilus/slides.css create mode 100644 public/s5/themes/pixel/bodybg.gif create mode 100644 public/s5/themes/pixel/headbg.jpg create mode 100644 public/s5/themes/pixel/pretty.css create mode 100644 public/s5/themes/pixel/slide0bg.gif create mode 100644 public/s5/themes/pixel/slides.css rename public/s5/ui/{default => core}/blank.gif (100%) create mode 100755 public/s5/ui/core/bodybg.gif rename public/s5/ui/{default => core}/framing.css (100%) rename public/s5/ui/{default => core}/iepngfix.htc (100%) rename public/s5/ui/{default => core}/math.css (100%) rename public/s5/ui/{default => core}/notes.css (100%) rename public/s5/ui/{default => core}/opera.css (100%) rename public/s5/ui/{default => core}/outline.css (100%) rename public/s5/ui/{default => core}/print.css (100%) rename public/s5/ui/{default => core}/s5-core.css (100%) rename public/s5/ui/{default => core}/slides.js (100%) delete mode 100644 public/s5/ui/default/slides.css diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index 37e0c822..4e8f1498 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -294,15 +294,20 @@ class WikiController < ApplicationController def s5 if @web.markup == :markdownMML - @s5_content = sanitize_xhtml(Maruku.new(@page.content.delete("\r\x01-\x08\x0B\x0C\x0E-\x1F"), + my_content = Maruku.new(@page.content.delete("\r\x01-\x08\x0B\x0C\x0E-\x1F"), {:math_enabled => true, :math_numbered => ['\\[','\\begin{equation}'], :content_only => true, - :author => @page.author, :title => @page.plain_name}).to_s5.to_ncr) + :author => @page.author, :title => @page.plain_name}) + @s5_content = sanitize_xhtml(my_content.to_s5.to_ncr) + @s5_theme = my_content.s5_theme elsif @web.markup == :markdown - @s5_content = sanitize_xhtml(Maruku.new(@page.content.delete("\r\x01-\x08\x0B\x0C\x0E-\x1F"), + my_content = Maruku.new(@page.content.delete("\r\x01-\x08\x0B\x0C\x0E-\x1F"), {:math_enabled => false, :content_only => true, - :author => @page.author, :title => @page.plain_name}).to_s5.to_ncr) + :author => @page.author, :title => @page.plain_name}) + @s5_content = sanitize_xhtml(my_content.to_s5.to_ncr) + @s5_theme = my_content.s5_theme else @s5_content = "S5 not supported with this text filter" + @s5_theme = "default" end end diff --git a/app/views/wiki/s5.rhtml b/app/views/wiki/s5.rhtml index 37e2eb86..a0ad6397 100644 --- a/app/views/wiki/s5.rhtml +++ b/app/views/wiki/s5.rhtml @@ -13,15 +13,14 @@ - - - - - - + + + + + - + diff --git a/public/s5/themes/blue/bodybg.gif b/public/s5/themes/blue/bodybg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f1c257b6a51ac6733c8698a038211a27ad8f4f0 GIT binary patch literal 2198 zcmbWy|3B0F0>JV2XQxIEa#T2y>(MFXTW)o6ROdL=VHmlc9=Iy$%Rxx4y0|-?bA?#G zCCc1UzVDma=G*4Gk!-UKMMz}KmwmxD?2Gw!ALn1Vuiu|Pyu7?U-M+uo1hRn={1rfc z06GC+{{r9;fNlZkJb*m|zyLu10FVoSr2udgK(PSw1h9Mn1p??4fc*i0C4iy;bOk_8 z0EPm<96;d!x&UCg02l)(6hQ6(mJYyi0E-8Z4}iS{um=FL2GC^y*#lT20Hy%C1E3!P zEDM1B0J;YLuN?kVf4+FYcbTbi2nX}$?5cQ9jC<)2;p+E<5b8KNfxC?A63~*6PKn1w zjVOL>+qAs-u|M^*EJ+hFDBIjkev*=!_B1^M{VX#p)jIci-i!Q#m#+#jMgPSXm%M&c zxUamTvZ@+~ClEdUlXW>z>izpyA0OJ?^kugK(z)wOk{O0C(@Zf#ny=T;XpEm~eY;S|{ZLb}eWujXQ$@AQ{=H{kp* zR`HTaP6K{$x6~t5?}$$$;e92d0N%uGBo5;PDt%u2G?6~m1UE!Y^}iyeP{ZD49`U7< zKQ%-SlWuV7wVxRgLG0JQ49Zkn(wbz7%b-qoC4cqxsI-hW^A>%;K9tv7CuHS)=lcfP z5-&6;IvxFm*V3>!SavbX(yz5qJWTlMW-!0CNjgTm!+qn|MqmEi{80Mk{BKWW)6CSb z|Ki`?tPrvb>~9XVw>%U=6~3kZ9j!{~ctiB`Ku4QeCU_f>;nCT?u_hX>xjER`v8k2| zxuus&JII@wHR<$V*MDG#0NhrPyvHO`@I=>|AV|@75eZU_j-vT#2LmH#o|=V^d+f7F z5be%nSf$&}qK_3u&OWon5oR+T^3lvJ=RR9u_LpQVn@@Vwl;_IZIfA_q3tP(GlCd2JSWoaf+qH?q~NmP;QDG*iWdD@AqUIs>qtBb-( zVq8grgjj8vW+x$36-G&j1RP01BGV<38d@Kg1aBOTlGZjakffA$l|)Kq!tIx6y{r8_ zb!_XJrFx!=bg5y;(|);eBrtlpX%L57rcWkFml=ZC@Q`$?@P&aOqEW+4aA=}xM zvrg`ANsI68Zfh2)yE|K#-cMFh)zVpoxy#H+Mavspik{!=emzsgF-n|;B26^#2-9W~{! zJ>6GdIOt-I*?4n&Lav++XIELfayb5|)q*npYFjVw{wueigc6X|c0ru}z*ghE+nLo4 z5#HPodS6&Gui7b*!wuE0Vwn2Y7M7m8+vaOUY$Wa!hQkXt&-i928+Qip&5sIM!;bTC zE)0&}kLaahfj-`i&ny=gpM1+^mhkWdM zm93w6WTfvyVe5MJu5;7RY2iM@*ok$V8=t7B?HhihUB`PEkODG%Mk>se1jO%$XA1jA zaPCTCKo03Dl-NQFQIdlBq(DahM+!<=6J`)S>)|z8k5!T*=RLDV`$y@m%G$V`=zZZ{ zW33ZPN)o>&RNX(;sZ~;w9goQ1zT-XSDjM34eA|>ejyfo-%gZ6(wK-gg4p!9{@yX$? z+)pN9vW7B)+DI?oi4Ry+Bf+mWDyXJi-lA%v<@Tq^OxzjsZbr&#n-uvy(0@z^9GOP^i&|b({<6=#(t$$r+5O3B5Gmdu7t;>!;3jhAA zqR(xhE;o@UwA|FNJPhmeGTM8)%{JHw|N49kZ|)FU!3oH%e~FK&`CG_FfABzkA%i#X i^xFnEM^RbCLN1&t-rz<0H(M)j$~<`XsWJk>%MR-&vAs^I55zB@BhG{a7Zi~kI02B z$D{<3(5Q4uty-^Gf%7vA4Ln zx*MOg6t=s;!o#DfzBj!|s z?jhi-@ALHa4CwLd_WS(g&+!<<^&3bqm@$AD1PCn1u;D3u2o*Yehzl!f+z4p@ zz(0iH)^Qw3QqDn;IV6@`$f`wW{LU^{d&UQN=PLTlK74jRVrE)+46zyJRn00t=F dfCLt3;DHDxsNjMOHt67k5Jo8Bgv2BO06XYhHRS*R literal 0 HcmV?d00001 diff --git a/public/s5/themes/blue/pretty.css b/public/s5/themes/blue/pretty.css new file mode 100644 index 00000000..f935d36c --- /dev/null +++ b/public/s5/themes/blue/pretty.css @@ -0,0 +1,100 @@ +/* Blue Theme 2004 by Martin Hense :::www.lounge7.de */ + +html {background:#000294 url(splash.gif) right bottom no-repeat;} +body {color:#FFF;font-size:1.6em} +a {text-decoration:none;color:#336;border-bottom:1px dotted} +:link, :visited {text-decoration:none;color:#F8B73E} +h1, h2, h3, h4 {font-size:100%;margin:0;padding:0;font-weight:inherit} +h1 abbr {font-variant:small-caps} +ul, pre {margin:0;line-height:1em} +em {color:#c60} +strong {font-weight:bold} +html, body {margin:0;padding:0} + +blockquote, q {font-style:italic} +blockquote {padding:0 2em 0.5em;margin:0 1.5em 0.5em; + text-align:center;font-size:1em} +blockquote p {margin:0} +blockquote i {font-style:normal} +blockquote b {display:block;margin-top:0.5em;font-weight:normal; + font-size:smaller;font-style:normal} +blockquote b i {font-style:italic} + +kbd {font-weight:bold;font-size:1em} +sup {font-size:smaller;line-height:1px} + +.slide code {padding:2px 0.25em;font-weight:bold;color:#AAABF8} +.slide code.bad, code del {color:red} +.slide code.old {color:silver} +.slide pre {padding:0;margin:0.25em 0 0.5em 0.5em;color:#533;font-size:90%} +.slide pre code {display:block} +.slide ul {margin-left:5%;margin-right:7%;list-style:disc} +.slide li {margin-top:0.75em;margin-right:0} +.slide ul ul {line-height:1} +.slide ul ul li {margin:.2em;font-size:85%;list-style:square} +.slide img.leader {display:block;margin:0 auto} + +div#header, div#footer {width:100%;top:0;left:0} +div#header, div#footer {background:#005;color:#9183BF; + font-family:Verdana, Helvetica, sans-serif} +div#header {background:#005 url(bodybg.gif) -16px 0 no-repeat;} +div#footer {font-size:0.5em;font-weight:bold;padding:.75em 0;top:auto; + bottom:0px;border-top:1px solid #08093F; + background:#000136 url(footbg.gif) top right no-repeat} +#footer h1, #footer h2 {display:block;padding:0 1em} +#footer h2 {font-style:italic} + +div.slide {top:0px;width:92%;padding:32px 4% 4%;overflow:visible; + font-family:georgia, Times, 'Times New Roman', serif; + background:transparent url(bodybg.gif) repeat-x} +div.slide h1 {position:absolute;left:87px;z-index:1; + white-space:nowrap;text-transform:capitalize;top:0;width:80%; + margin:0px auto;text-align:center;padding:0px; + font:36px georgia, Times, 'Times New Roman', serif; + color:#fff;background:transparent} +div.slide h3 {font-size:130%} +div.long {font-size:0.75em} + +div#controls {position: absolute; left: 60%; bottom: 0; + width: 40%; + text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;} +html>body div#controls {position: fixed; padding: 0; top: auto;} +#controls :active {color:#88A !important} +#controls :focus {outline:1px dotted #227} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #779; + cursor: pointer;} +#controls #navList #jumplist {background: #DDD; color: #227;} + + +#currentSlide {font-size:0.5em;font-family:Verdana,Helvetica,sans-serif; + text-align:center;color:#9183BF} +#currentSlide span {font-size:13px;color:#fff} +#currentSlide #csSep {display:none} +#currentSlide #csHere {font-weight:bold} +#currentSlide #csHere:before {content:"#";font-weight:normal} +#currentSlide #csTotal:before {content:" of "} + +#slide0 {padding:3.5em 0 0.5em 0;font-size:90%;width:100%} +#slide0 h1 {color:#fff;background:transparent;width:75%;text-align:center; + position:static;margin:1em auto;padding:0px;white-space:normal; + font:2em Georgia, Times, 'Times New Roman', serif;} +#slide0 h2 {margin:1em 0 2em 0;text-align:center;color:#fff} +#slide0 h3, #slide0 h4, #slide0 p {margin:0.25em;text-align:center;color:#fff} +#slide0 h3 {position:absolute:z-index:1:font-size:1.5em} +#slide0 h4 {position:absolute:z-index:1:font-size:1em} +#slide0 p {margin-top:0.7em} + +ul.urls {list-style:none;display:inline;margin:0} +.urls li {display:inline;margin:0} +.note {display:none} + +.incremental, .incremental *, .incremental *:after, .incremental code + {color:#000295;visibility:visible} +img.incremental {visibility:hidden} +.slide .current {color:#B02} +.flushtop {margin-top:0px} + +/* diagnostics +li:after {content:" [" attr(class) "]";color:#F88} +*/ diff --git a/public/s5/themes/blue/slides.css b/public/s5/themes/blue/slides.css new file mode 100644 index 00000000..3637d728 --- /dev/null +++ b/public/s5/themes/blue/slides.css @@ -0,0 +1,3 @@ +@import url(../../ui/core/s5-core.css); /* required to make the slide show run at all */ +@import url(../../ui/core/framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ diff --git a/public/s5/themes/blue/splash.gif b/public/s5/themes/blue/splash.gif new file mode 100644 index 0000000000000000000000000000000000000000..938a0795cee67071ebac2b38b11b97ef17f89590 GIT binary patch literal 3428 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 div#controls {position: fixed; padding: 0; top: auto;} +#controls :active {color:#88A !important} +#controls :focus {outline:1px dotted #227} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #BA9384; + cursor: pointer;} +#controls #navList #jumplist {background: #DDD; color: #227;} + +#currentSlide {text-align:center;font-size:0.5em; + color:#646587;font-family:Verdana,Helvetica,sans-serif;font-weight:bold} + +#slide0 {padding-top:3.5em;font-size:90%} +#slide0 h1 {position:static;margin:1em 0 1.33em;padding:0; + white-space:normal;color:#000;background:transparent; + font:2em georgia, times, 'Times New Roman', serif} +#slide0 h3 {margin-top:0.5em;font-size:1.5em} +#slide0 h4 {margin-top:0;font-size:1em} + +ul.urls {list-style:none;display:inline;margin:0} +.urls li {display:inline;margin:0} +.note {display:none} +.external {border-bottom:1px dotted gray} +html>body .external {border-bottom:none} +.external:after {content:" \274F";font-size:smaller;color:#77B} + +.incremental, .incremental *, .incremental *:after, .incremental code + {color:#DDE;visibility:visible} +img.incremental {visibility:hidden} +.slide .current {color:#B02} +.flushtop {margin-top:0px} + +/* diagnostics +li:after {content:" [" attr(class) "]";color:#F88} +*/ diff --git a/public/s5/themes/flower/rightbg.jpg b/public/s5/themes/flower/rightbg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..430d21174502952d2b57261d24b1631620a0b8a6 GIT binary patch literal 2215 zcmXYxdpy(oAIHC2u7&0jO$%X0G?^uYt=MKLEm4!p!ET(DL{836s9zDWayP`UO_NlP zEs{Fv#zN6ImzsY4!pNL-*-o5DobUY3=fCgw^?beG-|y$~dcT)nFOLF<05X*fz+f<7 zYH9D|l;4utl2rNGVHUKbS71ZLN9_mIgxW+0?Ep142 zL;!I0foTBR{}3>^;i^pGMs5z&4pw!H|ubm?-b z@Q4BVr3B<1@*jabfX2Ea=zEoeJlcVJ@PMW60l{Eipb1kkhQ*ykVa`gyVB?#Xy>q|P zG84S_str~s*Ekh<`)WpjPareyN>B@8JoF(ogv_mQ81aki8f+~9qZ7P|D=1<}h&>qM zdRy+D-D=9mlW6+k4(m@2a%iAJtwXiMUEq1^x5c81CC3?#cIR#s2_@oi@&mO9oVLBO zUPZ2=*w035z9NN-4Dmr>echbF6%nB~KbG+9Z9sQ;VZ6z7ncvO6UZMYrqT`6>NZkjo z3J1{Mz zaIk$1ikDE_{N-LlGtY}X|FSuA$0gDvy(;o7zeSeV;H(OG+UwMTE_q{dKt_!@^9g*E z?$)8rHsc)~pg1+RW&V5HI?m_EJxYc$F=)~j=1xv_dhN@gfxVq! z=MF4^(_iK-l9ZW6ZjZ%KK0XL{8ZFYNRMsObT{*XDAXBr<8Dy^h8c8x$Zn}{Y#BD?G z7(jDMWo`k+QoX_k+kQgfB0>78a~aUX>Qk?Y$R53>B(!2Ki9t_l5XA>~+d}eQe4BucUBbjUN5xtTcHO3FR!{;qksvQeveQo&@J$6g6iBA*SM`Q_uZ-P+h5<$wR@lIXfgK(8uQq?<3DqR0pZitS60X9BMKSj0weu&!<_>A zk{Mbo(kQPwoTXQth@6)XkZ01%n!COW2Z1beNxm}b6?^lnwfI!uX}hbx)597Cnp%0^ z*WE?q_Re`K>g50OyGpuwAqXI9Vl==&xRS`u0mGiEhHLCS?IUR1gCb6z34G>{ z_8nR3g_F=1B4u$a62Y3O?C=rK$9T;D_(P^>BTYj;!PHS`o`{-gjXtDHMt<7SkXy;T zh>F_O0{3}D_X3;IyQRpU=D=;)2vq{C;3)2x7b~K|SqNqGuHR#?u}{z4=V@g%d;xBE zWI0faR{a8T(3aAt_ncVLn|Hymf+`lHDR!+ zcOQ8oHT7Vr#R>;s@4+Y++C{X0HS|44xML0{-=G6W?=gj~9&g-44I7B+VhCSFZ&_po zj=EUQbxSIi>4*#8nB11N&$yjW7VC$B=8k=GsK@Hz?PIJe2x|F}Av z1z{S7*!+kyi^$17?3~R;N1Nh=CCxioPBSI%hQqqi3 zOkwfS!u)SZ8TohI30h9~-13VbjrW9*iacXgA&1!Yx`CbCzle}Q1Av+2-HYd|Mt7(D z)c@og8CBs3K9mcRM5145i?mN!5CcI_T9cpfi=B}KGU{H!G%7B;j>{voSUgqB>IjOV lF&+yV{r1O#=k?76Su1Y=Ln7QEeN*7*Z~uP;vH|U7+26>$vzq__ literal 0 HcmV?d00001 diff --git a/public/s5/themes/flower/slides.css b/public/s5/themes/flower/slides.css new file mode 100644 index 00000000..3637d728 --- /dev/null +++ b/public/s5/themes/flower/slides.css @@ -0,0 +1,3 @@ +@import url(../../ui/core/s5-core.css); /* required to make the slide show run at all */ +@import url(../../ui/core/framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ diff --git a/public/s5/themes/i18n/bodybg.jpg b/public/s5/themes/i18n/bodybg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6be0296db203367453f3bdd4ef71a22368911abe GIT binary patch literal 31239 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 literal 0 HcmV?d00001 diff --git a/public/s5/themes/i18n/pretty.css b/public/s5/themes/i18n/pretty.css new file mode 100644 index 00000000..ac0b7e27 --- /dev/null +++ b/public/s5/themes/i18n/pretty.css @@ -0,0 +1,97 @@ +/* Following is i18n theme -- edit away! */ + +html {background:#95A7D4 url(bodybg.jpg) no-repeat;} +body {color:#210;font:25px Arial, sans-serif} +a {text-decoration:none;color:#336;border-bottom:1px dotted} +:link, :visited {text-decoration:none;color:#00C} +html, body {margin:0;padding:0} +h1, h2, h3, h4, h5, h6 {font-size:1em;margin:0} +h1 abbr {font-variant:small-caps} +em {color:#c60} +strong {font-weight:bold} +ul {margin-left:1em;padding-left:0} +li {margin-bottom:0.66em} +li li {margin:0.33em 0;font-size:smaller} + +blockquote, q {font-style:italic} +blockquote {padding:0 2em 0.5em;margin:0 1.5em 0.5em; + text-align:center;font-size:1em} +blockquote p {margin:0} +blockquote i {font-style:normal} +blockquote b {display:block;margin-top:0.5em;font-weight:normal; + font-size:smaller;font-style:normal} +blockquote b i {font-style:italic} + +kbd {font-weight:bold;font-size:1em} +sup {font-size:0.75em;font-weight:normal;vertical-align:0.5em;line-height:1px} + +.slide code {padding:2px 0.25em;font-weight:bold;color:#533} +.slide code.bad, code del {color:red} +.slide code.old {color:silver} +.slide pre {padding:0;margin:0.25em 0 0.5em 0.5em;color:#533;font-size:90%} +.slide pre code {display:block} +.slide ul {margin-left:5%;margin-right:7%;list-style:disc} +.slide li {margin-top:0.75em;margin-right:0} +.slide ul ul {line-height:1} +.slide ul ul li {margin:.2em;font-size:85%;list-style:square} +.slide img.leader {display:block;margin:0 auto} + +div#header, div#footer, div.slide {width:100%;top:0px;left:0px} +div#header, div#footer {color:#AAB;font-size:0.5em} +div#header {background:#666;color:#BBB;height:1em;padding-bottom:.5em} +div#footer {background:#666;color:#BBB;height:3.25em;top:auto;bottom:0px;} +#footer h1, #footer h2 {display:block;padding:0.5em 0.75em; + font-weight:normal;font-style:italic} +#footer h1 {left:0;font-size:1em;letter-spacing:1px} +#footer h2 {position:absolute;bottom:0;left:0} + +div.slide {top:0px;width:92%;padding:.5em 4% 4%} +div.slide h1 {font-size:1.66em;line-height:1;letter-spacing:-1px; + margin:0px;padding:0.25em 0px;border-bottom:2px solid rgb(90,94,120)} +div.slide h3 {font-size:130%} +div.long {font-size:0.75em} + +#controls :active {color:#88A !important} +#controls :focus {outline:1px dotted #227} +div#controls {position:absolute;left:50%;bottom:0;width:50%; + text-align:right;font:bold 0.7em Verdana, Helvetica, sans-serif} +html>body div#controls {position:fixed;padding:0 0 1em 0;top:auto} +div#controls form {position:absolute;bottom:0;right:0;width:100%; + margin:0;padding:0} +#controls #navLinks a {padding:0;margin:0 0.5em 0;background:#666; + border:none;color:#AAC;cursor:pointer} +#controls #navList {height:1em} +#controls #navList #jumplist {position:absolute;bottom:0;right:0; + background:#DDD;color:#227} + +#currentSlide {font-size:0.5em} +#currentSlide span {font-size:13px;color:#fff} +#currentSlide #csSep {display:none} +#currentSlide #csHere {font-weight:bold} +#currentSlide #csHere:before {content:"#";font-weight:normal} +#currentSlide #csTotal:before {content:" of "} + +#slide0 {padding-top:3.5em;font-size:90%} +#slide0 h1 {position:static;margin:1em 0 0;padding:0; + font:bold 2em Helvetica, sans-serif;white-space:normal; + color:#000;background:transparent} +#slide0 h2 {font:bold italic 1em Helvetica, sans-serif;margin:0.25em} +#slide0 h3 {margin-top:1.5em;font-size:1.5em} +#slide0 h4 {margin-top:0;font-size:1em} + +ul.urls {list-style:none;display:inline;margin:0} +.urls li {display:inline;margin:0} +.note {display:none} +.external {border-bottom:1px dotted gray} +html>body .external {border-bottom:none} +.external:after {content:" \274F";font-size:smaller;color:#77B} + +.incremental, .incremental *, .incremental *:after, .incremental code + {color:#95A7D8;visibility:visible} +img.incremental {visibility:hidden} +.slide .current {color:#B02} +.flushtop {margin-top:0px} + +/* diagnostics +li:after {content:" [" attr(class) "]";color:#F88} +*/ diff --git a/public/s5/themes/i18n/slides.css b/public/s5/themes/i18n/slides.css new file mode 100644 index 00000000..3637d728 --- /dev/null +++ b/public/s5/themes/i18n/slides.css @@ -0,0 +1,3 @@ +@import url(../../ui/core/s5-core.css); /* required to make the slide show run at all */ +@import url(../../ui/core/framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ diff --git a/public/s5/ui/default/bodybg.gif b/public/s5/themes/nautilus/bodybg.gif old mode 100755 new mode 100644 similarity index 100% rename from public/s5/ui/default/bodybg.gif rename to public/s5/themes/nautilus/bodybg.gif diff --git a/public/s5/themes/nautilus/pretty.css b/public/s5/themes/nautilus/pretty.css new file mode 100644 index 00000000..76194cb8 --- /dev/null +++ b/public/s5/themes/nautilus/pretty.css @@ -0,0 +1,91 @@ +/* Following is the default theme -- edit away! */ + +html {background:#FFF url(bodybg.gif) -16px 0 no-repeat;} +body {color:#000;font-size:1.6em} +a {text-decoration:none;color:#c60;border-bottom:1px dotted} +:link, :visited {text-decoration:none;color:#00C} +html, body {margin:0;padding:0} +h1,h2,h3,h4 {font-size:100%;margin:0;padding:0;font-weight:inherit} +h1 abbr {font-variant:small-caps} +em {color:#c60} +strong {font-weight:bold} +ul, pre {margin:0;line-height:1em} +li {margin-bottom:0.66em} +li li {margin:0.33em 0;font-size:smaller} + +blockquote, q {font-style:italic} +blockquote {padding:0 2em 0.5em;margin:0 1.5em 0.5em; + text-align:center;font-size:1em} +blockquote p {margin:0} +blockquote i {font-style:normal} +blockquote b {display:block;margin-top:0.5em;font-weight:normal; + font-size:smaller;font-style:normal} +blockquote b i {font-style:italic} + +kbd {font-weight:bold;font-size:1em} +sup {font-size:smaller;line-height:1px} + +.slide code {padding:2px 0.25em;font-weight:bold;color:#533} +.slide code.bad, code del {color:red} +.slide code.old {color:silver} +.slide pre {padding:0;margin:0.25em 0 0.5em 0.5em;color:#533;font-size:90%} +.slide pre code {display:block} +.slide ul {margin-left:5%;margin-right:7%;list-style:disc} +.slide li {margin-top:0.75em;margin-right:0} +.slide ul ul {line-height:1} +.slide ul ul li {margin:.2em;font-size:85%;list-style:square} +.slide img.leader {display:block;margin:0 auto} + +div#header, div#footer, div.slide {width:100%;top:0px;left:0px} +div#header, div#footer {color:#AAB;font-family:Verdana,Helvetica,sans-serif} +div#header {background:#005 url(bodybg.gif) -16px 0 no-repeat;height:2.5em} +div#footer {background:#005;height:2.5em;top:auto;bottom:0px; + font-size:0.5em;font-weight:bold;padding:1em 0} +#footer h1, #footer h2 {display:block;padding:0 1em} +#footer h2 {font-style:italic} + +div.slide {top:0px;width:92%;padding:2.5em 4% 4%} +div.slide h1 {position:absolute;top:0;left:87px;z-index:1;color:#DDE; + text-align-left;white-space:nowrap;text-transform:capitalize; + margin:0px;padding:0.3em 0 0 50px;font:bold 150%/1em Helvetica,sans-serif} +div.slide h3 {font-size:130%} +div.long {font-size:0.75em} + +div#controls {position: absolute; left: 60%; bottom: 0; + width: 40%; + text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;} +html>body div#controls {position: fixed; padding: 0; top: auto;} +#controls :active {color:#88A !important} +#controls :focus {outline:1px dotted #227} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #779; + cursor: pointer;} +#controls #navList #jumplist {background: #DDD; color: #227;} + +#currentSlide {text-align:center;font-size:0.5em; + color:#fff;font-family:Verdana,Helvetica,sans-serif;font-weight:bold} + +#slide0 {padding-top:3.5em;font-size:90%} +#slide0 h1 {position:static;white-space:normal; + margin:1em 0 0;padding:0;font:bold 2em Helvetica,sans-serif; + color:#000;background:transparent} +#slide0 h2 {font:bold italic 1em Helvetica, sans-serif;margin:0.25em} +#slide0 h3 {margin-top:1.5em;font-size:1.5em} +#slide0 h4 {margin-top:0;font-size:1em} + +ul.urls {list-style:none;display:inline;margin:0} +.urls li {display:inline;margin:0} +.note {display:none} +.external {border-bottom:1px dotted gray} +html>body .external {border-bottom:none} +.external:after {content:" \274F";font-size:smaller;color:#77B} + +.incremental, .incremental *, .incremental *:after, .incremental code + {color:#DDE;visibility:visible} +img.incremental {visibility:hidden} +.slide .current {color:#B02} +.flushtop {margin-top:0px} + +/* diagnostics +li:after {content:" [" attr(class) "]";color:#F88} +*/ diff --git a/public/s5/themes/nautilus/slides.css b/public/s5/themes/nautilus/slides.css new file mode 100644 index 00000000..3637d728 --- /dev/null +++ b/public/s5/themes/nautilus/slides.css @@ -0,0 +1,3 @@ +@import url(../../ui/core/s5-core.css); /* required to make the slide show run at all */ +@import url(../../ui/core/framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ diff --git a/public/s5/themes/pixel/bodybg.gif b/public/s5/themes/pixel/bodybg.gif new file mode 100644 index 0000000000000000000000000000000000000000..a57ccb106432dd1016e16ebf650b46be91d0c5d3 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/public/s5/themes/pixel/pretty.css b/public/s5/themes/pixel/pretty.css new file mode 100644 index 00000000..f627134a --- /dev/null +++ b/public/s5/themes/pixel/pretty.css @@ -0,0 +1,114 @@ +/* Pixel Theme 2004 by Martin Hense :::www.lounge7.de */ + +html {background:transparent url(bodybg.gif) repeat-y;} +body {color:#08093F;font-size:1.5em} +a {text-decoration:none;color:#336;border-bottom:1px dotted} +:link, :visited {text-decoration:none} +html, body {margin:0;padding:0} +h1, h2, h3, h4 {font-size:100%;margin:0;padding:0;font-weight:inherit} +h1 abbr {font-variant:small-caps} +em {color:#c60} +strong {font-weight:bold} +ul, pre {margin:0;line-height:1em} +li {margin-bottom:0.66em} +li li {margin:0.33em 0;font-size:smaller} + +blockquote, q {font-style:italic} +blockquote {padding:0 2em 0.5em;margin:0 1.5em 0.5em; + text-align:center;font-size:1em} +blockquote p {margin:0} +blockquote i {font-style:normal} +blockquote b {display:block;margin-top:0.5em;font-weight:normal; + font-size:smaller;font-style:normal} +blockquote b i {font-style:italic} + +kbd {font-weight:bold;font-size:1em} +sup {font-size:smaller;line-height:1px} + +.slide code {padding:2px 0.25em;font-weight:bold;color:#533} +.slide code.bad, code del {color:red} +.slide code.old {color:silver} +.slide pre {padding:0;margin:0.25em 0 0.5em 0.5em;color:#533;font-size:90%} +.slide pre code {display:block} +.slide ul {margin-left:50px;margin-right:7%;list-style:square} +.slide li {margin-top:0.75em;margin-right:0} +.slide ul ul {line-height:1} +.slide ul ul li {margin:.2em;font-size:85%;list-style:square} +.slide img.leader {display:block;margin:0 auto} + +div#header, div#footer, div.slide {width:100%;top:0px;left:0px} +div#header, div#footer {color:#646587;font-family:Verdana, Helvetica, sans-serif} +div#header {background:transparent url(headbg.jpg) 0 0 no-repeat;height:80px} +div#footer {background:#fff;font-size:0.5em;font-weight:bold;padding:.5em 0; + top:auto;bottom:0px;height:2em;border-top:1px solid #08093F} +#footer h1, #footer h2 {display:block;padding:0 1em} +#footer h2 {font-style:italic} + +div.slide {top:0px;width:92%;padding:48px 4% 4%; + font-family:Verdana, Helvetica, Arial, sans-serif} +div.slide h1 {position:absolute;top:24px;left:64px;z-index:1;color:#FFF; + background:transparent;margin:0px;padding:0 0 0 50px;white-space:nowrap; + font:bold 30px Helvetica, sans-serif;text-transform:capitalize} +div.slide h3 {font-size:130%} +div.long {font-size:0.75em} +/* +#controls :active {color:#88A !important} +#controls :focus {outline:1px dotted #227} +div#controls {left:50%;bottom:0;z-index:1;width:50%;text-align:right; + height:100%} +html>body div#controls {position:fixed;padding:0 0 1em 0;top:auto} +div#controls form {position:absolute;bottom:0;right:0;width:100%; + margin:0;padding:0} +div#controls #navLinks a {padding:0;margin:0 0.5em;color:#779; + border:none;cursor:pointer} +div#controls #navList {height:1em} +div#controls #navList #jumplist {position:absolute;bottom:0;right:0; + background:#DDD;color:#227} +div#controls select {visibility:hidden;background:#DDD;color:#227} +div#controls div:hover select {visibility:visible} +*/ +div#controls {position: absolute; left: 60%; bottom: 0; + width: 40%; + text-align: right; font: bold 0.7em Verdana, Helvetica, sans-serif;} +html>body div#controls {position: fixed; padding: 0; top: auto;} +#controls :active {color:#88A !important} +#controls :focus {outline:1px dotted #227} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + border: none; color: #779; + cursor: pointer;} +#controls #navList #jumplist {background: #DDD; color: #227;} + +#currentSlide {color:#646587;text-align:center;font-size:0.5em; + font-family:Verdana, Helvetica, sans-serif;font-weight:bold} +#currentSlide span {font-size:13px;color:#08093F} +#currentSlide #csSep {display:none} +#currentSlide #csHere {font-weight:bold} +#currentSlide #csHere:before {content:"#";font-weight:normal} +#currentSlide #csTotal:before {content:" of "} + +#slide0 {padding-top:3.5em;font-size:90%} +#slide0 h1 {position:static;white-space:normal; + margin:0;padding:60px 60px 0 150px;text-align:right; + font:bold 2em Helvetica,sans-serif;white-space:normal;height:281px; + color:#fff;background:transparent url(slide0bg.gif) no-repeat} +#slide0 h3 {margin-bottom:20px;margin-top:0.5em;font-size:1.5em} +#slide0 h4 {margin-bottom:4px;margin-top:0;font-size:1em} + +ul.urls {list-style:none;display:inline;margin:0} +.urls li {display:inline;margin:0} +.note {display:none} +.urls li {display:inline;margin:0} +.note {display:none} +.external {border-bottom:1px dotted gray} +html>body .external {border-bottom:none} +.external:after {content:" \274F";font-size:smaller;color:#77B} + +.incremental, .incremental *, .incremental *:after, .incremental code + {color:#DDE;visibility:visible} +img.incremental {visibility:hidden} +.slide .current {color:#B02} +.flushtop {margin-top:0px} + +/* diagnostics +li:after {content:" [" attr(class) "]";color:#F88} +*/ diff --git a/public/s5/themes/pixel/slide0bg.gif b/public/s5/themes/pixel/slide0bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..fffb08a26acacb88b8a080c8622da8f34c381cf6 GIT binary patch literal 3180 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 S$(Ho!mT%dNi$W0v002Ap6ixd8 literal 0 HcmV?d00001 diff --git a/public/s5/themes/pixel/slides.css b/public/s5/themes/pixel/slides.css new file mode 100644 index 00000000..3637d728 --- /dev/null +++ b/public/s5/themes/pixel/slides.css @@ -0,0 +1,3 @@ +@import url(../../ui/core/s5-core.css); /* required to make the slide show run at all */ +@import url(../../ui/core/framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ diff --git a/public/s5/ui/default/blank.gif b/public/s5/ui/core/blank.gif similarity index 100% rename from public/s5/ui/default/blank.gif rename to public/s5/ui/core/blank.gif diff --git a/public/s5/ui/core/bodybg.gif b/public/s5/ui/core/bodybg.gif new file mode 100755 index 0000000000000000000000000000000000000000..5f448a16fe6dc7a03a4279fb19f9ba3af38eb634 GIT binary patch literal 10119 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 Duh@-b literal 0 HcmV?d00001 diff --git a/public/s5/ui/default/framing.css b/public/s5/ui/core/framing.css similarity index 100% rename from public/s5/ui/default/framing.css rename to public/s5/ui/core/framing.css diff --git a/public/s5/ui/default/iepngfix.htc b/public/s5/ui/core/iepngfix.htc similarity index 100% rename from public/s5/ui/default/iepngfix.htc rename to public/s5/ui/core/iepngfix.htc diff --git a/public/s5/ui/default/math.css b/public/s5/ui/core/math.css similarity index 100% rename from public/s5/ui/default/math.css rename to public/s5/ui/core/math.css diff --git a/public/s5/ui/default/notes.css b/public/s5/ui/core/notes.css similarity index 100% rename from public/s5/ui/default/notes.css rename to public/s5/ui/core/notes.css diff --git a/public/s5/ui/default/opera.css b/public/s5/ui/core/opera.css similarity index 100% rename from public/s5/ui/default/opera.css rename to public/s5/ui/core/opera.css diff --git a/public/s5/ui/default/outline.css b/public/s5/ui/core/outline.css similarity index 100% rename from public/s5/ui/default/outline.css rename to public/s5/ui/core/outline.css diff --git a/public/s5/ui/default/print.css b/public/s5/ui/core/print.css similarity index 100% rename from public/s5/ui/default/print.css rename to public/s5/ui/core/print.css diff --git a/public/s5/ui/default/s5-core.css b/public/s5/ui/core/s5-core.css similarity index 100% rename from public/s5/ui/default/s5-core.css rename to public/s5/ui/core/s5-core.css diff --git a/public/s5/ui/default/slides.js b/public/s5/ui/core/slides.js similarity index 100% rename from public/s5/ui/default/slides.js rename to public/s5/ui/core/slides.js diff --git a/public/s5/ui/default/slides.css b/public/s5/ui/default/slides.css deleted file mode 100644 index 0786d7db..00000000 --- a/public/s5/ui/default/slides.css +++ /dev/null @@ -1,3 +0,0 @@ -@import url(s5-core.css); /* required to make the slide show run at all */ -@import url(framing.css); /* sets basic placement and size of slide components */ -@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff --git a/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb b/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb index a94ad14e..6aa3cdba 100644 --- a/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb +++ b/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb @@ -2,6 +2,17 @@ module MaRuKu class MDDocument + + def s5_theme + html_escape(self.attributes[:slide_theme] || "default") + end + + def html_escape(string) + string.gsub( /&/, "&" ). + gsub( //, ">" ). + gsub( /"/, """ ) + end # Render as an HTML fragment (no head, just the content of BODY). (returns a string) def to_s5(context={}) From 5b182bd228860e12343c2fa36d9a2b9117faca50 Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Thu, 6 Sep 2007 10:40:48 -0500 Subject: [PATCH 2/9] HTML5lib Bug Fixed a bug in the HTML5lib tokenizer (affects S5 slideshows). Some miscellaneous code cleanup. In particular, don't bother with zapping control characters; instead, rely on is_utf8? method to raise an exception (which we do anyway). --- app/controllers/wiki_controller.rb | 12 +++++------ lib/chunks/category.rb | 5 ++++- lib/chunks/chunk.rb | 1 + .../plugins/HTML5lib/lib/html5/tokenizer.rb | 2 +- .../HTML5lib/testdata/sanitizer/tests1.dat | 20 +++++++++++++++++++ .../maruku/lib/maruku/output/s5/to_s5.rb | 1 + 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index 4e8f1498..8c71047c 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -227,13 +227,13 @@ class WikiController < ApplicationController def save render(:status => 404, :text => 'Undefined page name') and return if @page_name.nil? - author_name = params['author'].delete("\x01-\x08\x0B\x0C\x0E-\x1F") + author_name = params['author'] author_name = 'AnonymousCoward' if author_name =~ /^\s*$/ raise "Your name was not valid utf-8" if !author_name.is_utf8? cookies['author'] = { :value => author_name, :expires => Time.utc(2030) } begin - the_content = params['content'].delete("\x01-\x08\x0B\x0C\x0E-\x1F") + the_content = params['content'] raise "Your content was not valid utf-8" if !the_content.is_utf8? filter_spam(the_content) if @page @@ -294,16 +294,16 @@ class WikiController < ApplicationController def s5 if @web.markup == :markdownMML - my_content = Maruku.new(@page.content.delete("\r\x01-\x08\x0B\x0C\x0E-\x1F"), + my_content = Maruku.new(@page.content.delete("\r"), {:math_enabled => true, :math_numbered => ['\\[','\\begin{equation}'], :content_only => true, :author => @page.author, :title => @page.plain_name}) - @s5_content = sanitize_xhtml(my_content.to_s5.to_ncr) + @s5_content = sanitize_xhtml(my_content.to_s5) @s5_theme = my_content.s5_theme elsif @web.markup == :markdown - my_content = Maruku.new(@page.content.delete("\r\x01-\x08\x0B\x0C\x0E-\x1F"), + my_content = Maruku.new(@page.content.delete("\r"), {:math_enabled => false, :content_only => true, :author => @page.author, :title => @page.plain_name}) - @s5_content = sanitize_xhtml(my_content.to_s5.to_ncr) + @s5_content = sanitize_xhtml(my_content.to_s5) @s5_theme = my_content.s5_theme else @s5_content = "S5 not supported with this text filter" diff --git a/lib/chunks/category.rb b/lib/chunks/category.rb index 33e51bc9..7b8c9151 100644 --- a/lib/chunks/category.rb +++ b/lib/chunks/category.rb @@ -1,4 +1,5 @@ require 'chunks/chunk' +require 'sanitize' # The category chunk looks for "category: news" on a line by # itself and parses the terms after the ':' as categories. @@ -8,6 +9,7 @@ require 'chunks/chunk' # # Category lines can be hidden using ':category: news', for example class Category < Chunk::Abstract + CATEGORY_PATTERN = /^(:)?category\s*:(.*)$/i def self.pattern() CATEGORY_PATTERN end @@ -16,7 +18,8 @@ class Category < Chunk::Abstract def initialize(match_data, content) super(match_data, content) @hidden = match_data[1] - @list = match_data[2].split(',').map { |c| html_escape(c.strip) } + @list = match_data[2].split(',').map { |c| c.to_s.is_utf8? ? html_escape(c.strip) : nil } + @list.compact! @unmask_text = '' if @hidden @unmask_text = '' diff --git a/lib/chunks/chunk.rb b/lib/chunks/chunk.rb index f3384943..46382c76 100644 --- a/lib/chunks/chunk.rb +++ b/lib/chunks/chunk.rb @@ -78,6 +78,7 @@ module Chunk string.gsub( /&/, "&" ). gsub( //, ">" ). + gsub( /'/, "'" ). gsub( /"/, """ ) end diff --git a/vendor/plugins/HTML5lib/lib/html5/tokenizer.rb b/vendor/plugins/HTML5lib/lib/html5/tokenizer.rb index 7cb425e8..53e65d8b 100644 --- a/vendor/plugins/HTML5lib/lib/html5/tokenizer.rb +++ b/vendor/plugins/HTML5lib/lib/html5/tokenizer.rb @@ -217,7 +217,7 @@ module HTML5 # This method replaces the need for "entityInAttributeValueState". def process_entity_in_attribute - entity = consume_entity(true) + entity = consume_entity() if entity @current_token[:data][-1][1] += entity else diff --git a/vendor/plugins/HTML5lib/testdata/sanitizer/tests1.dat b/vendor/plugins/HTML5lib/testdata/sanitizer/tests1.dat index cc8d3c96..de151d4a 100644 --- a/vendor/plugins/HTML5lib/testdata/sanitizer/tests1.dat +++ b/vendor/plugins/HTML5lib/testdata/sanitizer/tests1.dat @@ -405,5 +405,25 @@ "name": "xul", "input": "

fubar

", "output": "

fubar

" + }, + + { + "name": "quotes_in_attributes", + "input": "", + "rexml": "", + "output": "" + }, + + { + "name": "named_entities_in_attributes", + "input": "", + "rexml": "", + "output": "" + }, + { + "name": "NCRs_in_attributes", + "input": "", + "rexml": "", + "output": "" } ] diff --git a/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb b/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb index 6aa3cdba..8542ee4e 100644 --- a/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb +++ b/vendor/plugins/maruku/lib/maruku/output/s5/to_s5.rb @@ -11,6 +11,7 @@ module MaRuKu string.gsub( /&/, "&" ). gsub( //, ">" ). + gsub( /'/, "'" ). gsub( /"/, """ ) end From 9db5f83f1319a599fa8408c922194e249afab25e Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Thu, 6 Sep 2007 23:52:22 -0500 Subject: [PATCH 3/9] Tweaks to the S5 "blue" Theme Corrected some small problems in the CSS. --- public/s5/themes/blue/pretty.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/s5/themes/blue/pretty.css b/public/s5/themes/blue/pretty.css index f935d36c..fcf068a4 100644 --- a/public/s5/themes/blue/pretty.css +++ b/public/s5/themes/blue/pretty.css @@ -46,7 +46,7 @@ div#footer {font-size:0.5em;font-weight:bold;padding:.75em 0;top:auto; div.slide {top:0px;width:92%;padding:32px 4% 4%;overflow:visible; font-family:georgia, Times, 'Times New Roman', serif; - background:transparent url(bodybg.gif) repeat-x} + background:transparent url(bodybg.gif) -16px 0 repeat-x} div.slide h1 {position:absolute;left:87px;z-index:1; white-space:nowrap;text-transform:capitalize;top:0;width:80%; margin:0px auto;text-align:center;padding:0px; @@ -81,8 +81,6 @@ html>body div#controls {position: fixed; padding: 0; top: auto;} font:2em Georgia, Times, 'Times New Roman', serif;} #slide0 h2 {margin:1em 0 2em 0;text-align:center;color:#fff} #slide0 h3, #slide0 h4, #slide0 p {margin:0.25em;text-align:center;color:#fff} -#slide0 h3 {position:absolute:z-index:1:font-size:1.5em} -#slide0 h4 {position:absolute:z-index:1:font-size:1em} #slide0 p {margin-top:0.7em} ul.urls {list-style:none;display:inline;margin:0} @@ -94,6 +92,7 @@ ul.urls {list-style:none;display:inline;margin:0} img.incremental {visibility:hidden} .slide .current {color:#B02} .flushtop {margin-top:0px} +.slide .plaintable td {border:1px solid #FFF!important} /* diagnostics li:after {content:" [" attr(class) "]";color:#F88} From f3a89556c41744e1e0866131f022c1bd85eb7ace Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Fri, 7 Sep 2007 00:21:17 -0500 Subject: [PATCH 4/9] A couple more Theme Tweaks. A couple more CSS troubles fixed. --- public/s5/themes/flower/pretty.css | 2 +- public/s5/themes/nautilus/pretty.css | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/s5/themes/flower/pretty.css b/public/s5/themes/flower/pretty.css index 080454c8..ceb865ba 100644 --- a/public/s5/themes/flower/pretty.css +++ b/public/s5/themes/flower/pretty.css @@ -45,7 +45,7 @@ div#footer {background:#fff0cf;top:auto;bottom:0px; #footer h2 {font-style:italic} div.slide {top:0px;left:0px;padding:48px 4% 4%;height:100%;width:92%; - background:transparent url(rightbg.jpg) right top no-repeat;overflow:visible + background:transparent url(rightbg.jpg) right top no-repeat;overflow:visible; font-family:georgia,times,'Times New Roman',serif} div.slide h1 {position:absolute;z-index:1;background:transparent; margin:0;padding:0.3em 0 0 50px;white-space:nowrap; diff --git a/public/s5/themes/nautilus/pretty.css b/public/s5/themes/nautilus/pretty.css index 76194cb8..2e64d5c7 100644 --- a/public/s5/themes/nautilus/pretty.css +++ b/public/s5/themes/nautilus/pretty.css @@ -45,8 +45,8 @@ div#footer {background:#005;height:2.5em;top:auto;bottom:0px; #footer h2 {font-style:italic} div.slide {top:0px;width:92%;padding:2.5em 4% 4%} -div.slide h1 {position:absolute;top:0;left:87px;z-index:1;color:#DDE; - text-align-left;white-space:nowrap;text-transform:capitalize; +div.slide h1 {position:absolute;top:0;left:135px;z-index:1;color:#DDE; + text-align:left;white-space:nowrap;text-transform:capitalize; margin:0px;padding:0.3em 0 0 50px;font:bold 150%/1em Helvetica,sans-serif} div.slide h3 {font-size:130%} div.long {font-size:0.75em} @@ -64,6 +64,7 @@ html>body div#controls {position: fixed; padding: 0; top: auto;} #currentSlide {text-align:center;font-size:0.5em; color:#fff;font-family:Verdana,Helvetica,sans-serif;font-weight:bold} +#currentSlide span {color:#AAB} #slide0 {padding-top:3.5em;font-size:90%} #slide0 h1 {position:static;white-space:normal; From ed68d975df91df09f48d3b2a65f6fdc20ceecd33 Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Sun, 9 Sep 2007 22:26:19 -0500 Subject: [PATCH 5/9] Update to latest HTML5lib Fix that Tokenizer bug for real this time. --- vendor/plugins/HTML5lib/bin/html5 | 4 +- .../plugins/HTML5lib/lib/html5/constants.rb | 226 + .../HTML5lib/lib/html5/filters/iso639codes.rb | 752 +++ .../HTML5lib/lib/html5/filters/rfc2046.rb | 30 + .../HTML5lib/lib/html5/filters/rfc3987.rb | 89 + .../HTML5lib/lib/html5/filters/validator.rb | 830 +++ .../plugins/HTML5lib/lib/html5/html5parser.rb | 30 +- .../lib/html5/html5parser/after_body_phase.rb | 6 +- .../html5/html5parser/after_frameset_phase.rb | 7 +- .../lib/html5/html5parser/after_head_phase.rb | 2 +- .../html5/html5parser/before_head_phase.rb | 2 +- .../lib/html5/html5parser/in_body_phase.rb | 64 +- .../lib/html5/html5parser/in_caption_phase.rb | 6 +- .../lib/html5/html5parser/in_cell_phase.rb | 6 +- .../html5parser/in_column_group_phase.rb | 2 +- .../html5/html5parser/in_frameset_phase.rb | 10 +- .../lib/html5/html5parser/in_head_phase.rb | 10 +- .../lib/html5/html5parser/in_row_phase.rb | 6 +- .../lib/html5/html5parser/in_select_phase.rb | 12 +- .../html5/html5parser/in_table_body_phase.rb | 11 +- .../lib/html5/html5parser/in_table_phase.rb | 19 +- .../lib/html5/html5parser/initial_phase.rb | 11 +- .../HTML5lib/lib/html5/html5parser/phase.rb | 14 +- .../html5/html5parser/trailing_end_phase.rb | 6 +- .../plugins/HTML5lib/lib/html5/inputstream.rb | 6 +- .../HTML5lib/lib/html5/liberalxmlparser.rb | 4 +- .../lib/html5/serializer/htmlserializer.rb | 1 - .../plugins/HTML5lib/lib/html5/tokenizer.rb | 114 +- .../HTML5lib/testdata/sanitizer/tests1.dat | 13 - .../HTML5lib/testdata/tokenizer/entities.test | 4674 +++++++------- .../validator/base-href-attribute.test | 787 +++ .../validator/base-target-attribute.test | 35 + .../validator/blockquote-cite-attribute.test | 7 + .../testdata/validator/classattribute.test | 67 +- .../validator/contenteditableattribute.test | 12 +- .../validator/contextmenuattribute.test | 35 +- .../testdata/validator/dirattribute.test | 59 + .../validator/draggableattribute.test | 63 + .../validator/html-xmlns-attribute.test | 23 + .../testdata/validator/idattribute.test | 35 +- .../validator/irrelevantattribute.test | 63 + .../testdata/validator/langattribute.test | 5579 +++++++++++++++++ .../validator/li-value-attribute.test | 7 + .../validator/link-href-attribute.test | 7 + .../validator/link-hreflang-attribute.test | 7 + .../validator/link-rel-attribute.test | 271 + .../validator/ol-start-attribute.test | 7 + .../validator/style-scoped-attribute.test | 7 + .../testdata/validator/tabindexattribute.test | 79 + vendor/plugins/HTML5lib/tests/preamble.rb | 18 + .../plugins/HTML5lib/tests/test_encoding.rb | 2 +- vendor/plugins/HTML5lib/tests/test_parser.rb | 4 +- .../plugins/HTML5lib/tests/test_validator.rb | 31 + 53 files changed, 11569 insertions(+), 2603 deletions(-) create mode 100755 vendor/plugins/HTML5lib/lib/html5/filters/iso639codes.rb create mode 100755 vendor/plugins/HTML5lib/lib/html5/filters/rfc2046.rb create mode 100755 vendor/plugins/HTML5lib/lib/html5/filters/rfc3987.rb create mode 100755 vendor/plugins/HTML5lib/lib/html5/filters/validator.rb create mode 100755 vendor/plugins/HTML5lib/testdata/validator/base-href-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/base-target-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/blockquote-cite-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/dirattribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/draggableattribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/html-xmlns-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/irrelevantattribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/langattribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/li-value-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/link-href-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/link-hreflang-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/link-rel-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/ol-start-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/style-scoped-attribute.test create mode 100755 vendor/plugins/HTML5lib/testdata/validator/tabindexattribute.test create mode 100755 vendor/plugins/HTML5lib/tests/test_validator.rb diff --git a/vendor/plugins/HTML5lib/bin/html5 b/vendor/plugins/HTML5lib/bin/html5 index 2680aea3..bc0514ad 100755 --- a/vendor/plugins/HTML5lib/bin/html5 +++ b/vendor/plugins/HTML5lib/bin/html5 @@ -81,8 +81,8 @@ def print_output(parser, document, opts) if opts.error errList=[] - for pos, message in parser.errors - errList << ("Line %i Col %i"%pos + " " + message) + for pos, errorcode, datavars in parser.errors + errList << "Line %i Col %i"%pos + " " + constants.E.get(errorcode, 'Unknown error "%s"' % errorcode) % datavars end $stdout.write("\nParse errors:\n" + errList.join("\n")+"\n") end diff --git a/vendor/plugins/HTML5lib/lib/html5/constants.rb b/vendor/plugins/HTML5lib/lib/html5/constants.rb index 8ccaf66d..9a4580fa 100755 --- a/vendor/plugins/HTML5lib/lib/html5/constants.rb +++ b/vendor/plugins/HTML5lib/lib/html5/constants.rb @@ -2,6 +2,8 @@ module HTML5 class EOF < Exception; end + def self._(str); str end + CONTENT_MODEL_FLAGS = [ :PCDATA, :RCDATA, @@ -815,4 +817,228 @@ module HTML5 hz-gb-2312 ] + E = { + "null-character" => + _("Null character in input stream, replaced with U+FFFD."), + "incorrectly-placed-solidus" => + _("Solidus (/) incorrectly placed in tag."), + "incorrect-cr-newline-entity" => + _("Incorrect CR newline entity, replaced with LF."), + "illegal-windows-1252-entity" => + _("Entity used with illegal number (windows-1252 reference)."), + "cant-convert-numeric-entity" => + _("Numeric entity couldn't be converted to character " + + "(codepoint U+%(charAsInt)08x)."), + "illegal-codepoint-for-numeric-entity" => + _("Numeric entity represents an illegal codepoint=> " + + "U+%(charAsInt)08x."), + "numeric-entity-without-semicolon" => + _("Numeric entity didn't end with ';'."), + "expected-numeric-entity-but-got-eof" => + _("Numeric entity expected. Got end of file instead."), + "expected-numeric-entity" => + _("Numeric entity expected but none found."), + "named-entity-without-semicolon" => + _("Named entity didn't end with ';'."), + "expected-named-entity" => + _("Named entity expected. Got none."), + "attributes-in-end-tag" => + _("End tag contains unexpected attributes."), + "expected-tag-name-but-got-right-bracket" => + _("Expected tag name. Got '>' instead."), + "expected-tag-name-but-got-question-mark" => + _("Expected tag name. Got '?' instead. (HTML doesn't " + + "support processing instructions.)"), + "expected-tag-name" => + _("Expected tag name. Got something else instead"), + "expected-closing-tag-but-got-right-bracket" => + _("Expected closing tag. Got '>' instead. Ignoring ''."), + "expected-closing-tag-but-got-eof" => + _("Expected closing tag. Unexpected end of file."), + "expected-closing-tag-but-got-char" => + _("Expected closing tag. Unexpected character '%(data)' found."), + "eof-in-tag-name" => + _("Unexpected end of file in the tag name."), + "expected-attribute-name-but-got-eof" => + _("Unexpected end of file. Expected attribute name instead."), + "eof-in-attribute-name" => + _("Unexpected end of file in attribute name."), + "duplicate-attribute" => + _("Dropped duplicate attribute on tag."), + "expected-end-of-tag-name-but-got-eof" => + _("Unexpected end of file. Expected = or end of tag."), + "expected-attribute-value-but-got-eof" => + _("Unexpected end of file. Expected attribute value."), + "eof-in-attribute-value-double-quote" => + _("Unexpected end of file in attribute value (\")."), + "eof-in-attribute-value-single-quote" => + _("Unexpected end of file in attribute value (')."), + "eof-in-attribute-value-no-quotes" => + _("Unexpected end of file in attribute value."), + "expected-dashes-or-doctype" => + _("Expected '--' or 'DOCTYPE'. Not found."), + "incorrect-comment" => + _("Incorrect comment."), + "eof-in-comment" => + _("Unexpected end of file in comment."), + "eof-in-comment-end-dash" => + _("Unexpected end of file in comment (-)"), + "unexpected-dash-after-double-dash-in-comment" => + _("Unexpected '-' after '--' found in comment."), + "eof-in-comment-double-dash" => + _("Unexpected end of file in comment (--)."), + "unexpected-char-in-comment" => + _("Unexpected character in comment found."), + "need-space-after-doctype" => + _("No space after literal string 'DOCTYPE'."), + "expected-doctype-name-but-got-right-bracket" => + _("Unexpected > character. Expected DOCTYPE name."), + "expected-doctype-name-but-got-eof" => + _("Unexpected end of file. Expected DOCTYPE name."), + "eof-in-doctype-name" => + _("Unexpected end of file in DOCTYPE name."), + "eof-in-doctype" => + _("Unexpected end of file in DOCTYPE."), + "expected-space-or-right-bracket-in-doctype" => + _("Expected space or '>'. Got '%(data)'"), + "unexpected-end-of-doctype" => + _("Unexpected end of DOCTYPE."), + "unexpected-char-in-doctype" => + _("Unexpected character in DOCTYPE."), + "eof-in-bogus-doctype" => + _("Unexpected end of file in bogus doctype."), + "eof-in-innerhtml" => + _("XXX innerHTML EOF"), + "unexpected-doctype" => + _("Unexpected DOCTYPE. Ignored."), + "non-html-root" => + _("html needs to be the first start tag."), + "expected-doctype-but-got-eof" => + _("Unexpected End of file. Expected DOCTYPE."), + "unknown-doctype" => + _("Erroneous DOCTYPE."), + "expected-doctype-but-got-chars" => + _("Unexpected non-space characters. Expected DOCTYPE."), + "expected-doctype-but-got-start-tag" => + _("Unexpected start tag (%(name)). Expected DOCTYPE."), + "expected-doctype-but-got-end-tag" => + _("Unexpected end tag (%(name)). Expected DOCTYPE."), + "end-tag-after-implied-root" => + _("Unexpected end tag (%(name)) after the (implied) root element."), + "expected-named-closing-tag-but-got-eof" => + _("Unexpected end of file. Expected end tag (%(name))."), + "two-heads-are-not-better-than-one" => + _("Unexpected start tag head in existing head. Ignored."), + "unexpected-end-tag" => + _("Unexpected end tag (%(name)). Ignored."), + "unexpected-start-tag-out-of-my-head" => + _("Unexpected start tag (%(name)) that can be in head. Moved."), + "unexpected-start-tag" => + _("Unexpected start tag (%(name))."), + "missing-end-tag" => + _("Missing end tag (%(name))."), + "missing-end-tags" => + _("Missing end tags (%(name))."), + "unexpected-start-tag-implies-end-tag" => + _("Unexpected start tag (%(startName)) " + + "implies end tag (%(endName))."), + "unexpected-start-tag-treated-as" => + _("Unexpected start tag (%(originalName)). Treated as %(newName)."), + "deprecated-tag" => + _("Unexpected start tag %(name). Don't use it!"), + "unexpected-start-tag-ignored" => + _("Unexpected start tag %(name). Ignored."), + "expected-one-end-tag-but-got-another" => + _("Unexpected end tag (%(gotName)). " + + "Missing end tag (%(expectedName))."), + "end-tag-too-early" => + _("End tag (%(name)) seen too early. Expected other end tag."), + "end-tag-too-early-named" => + _("Unexpected end tag (%(gotName)). Expected end tag (%(expectedName))."), + "end-tag-too-early-ignored" => + _("End tag (%(name)) seen too early. Ignored."), + "adoption-agency-1.1" => + _("End tag (%(name)) violates step 1, " + + "paragraph 1 of the adoption agency algorithm."), + "adoption-agency-1.2" => + _("End tag (%(name)) violates step 1, " + + "paragraph 2 of the adoption agency algorithm."), + "adoption-agency-1.3" => + _("End tag (%(name)) violates step 1, " + + "paragraph 3 of the adoption agency algorithm."), + "unexpected-end-tag-treated-as" => + _("Unexpected end tag (%(originalName)). Treated as %(newName)."), + "no-end-tag" => + _("This element (%(name)) has no end tag."), + "unexpected-implied-end-tag-in-table" => + _("Unexpected implied end tag (%(name)) in the table phase."), + "unexpected-implied-end-tag-in-table-body" => + _("Unexpected implied end tag (%(name)) in the table body phase."), + "unexpected-char-implies-table-voodoo" => + _("Unexpected non-space characters in " + + "table context caused voodoo mode."), + "unexpected-start-tag-implies-table-voodoo" => + _("Unexpected start tag (%(name)) in " + + "table context caused voodoo mode."), + "unexpected-end-tag-implies-table-voodoo" => + _("Unexpected end tag (%(name)) in " + + "table context caused voodoo mode."), + "unexpected-cell-in-table-body" => + _("Unexpected table cell start tag (%(name)) " + + "in the table body phase."), + "unexpected-cell-end-tag" => + _("Got table cell end tag (%(name)) " + + "while required end tags are missing."), + "unexpected-end-tag-in-table-body" => + _("Unexpected end tag (%(name)) in the table body phase. Ignored."), + "unexpected-implied-end-tag-in-table-row" => + _("Unexpected implied end tag (%(name)) in the table row phase."), + "unexpected-end-tag-in-table-row" => + _("Unexpected end tag (%(name)) in the table row phase. Ignored."), + "unexpected-select-in-select" => + _("Unexpected select start tag in the select phase " + + "implies select start tag."), + "unexpected-start-tag-in-select" => + _("Unexpected start tag token (%(name) in the select phase. " + + "Ignored."), + "unexpected-end-tag-in-select" => + _("Unexpected end tag (%(name)) in the select phase. Ignored."), + "unexpected-char-after-body" => + _("Unexpected non-space characters in the after body phase."), + "unexpected-start-tag-after-body" => + _("Unexpected start tag token (%(name))" + + " in the after body phase."), + "unexpected-end-tag-after-body" => + _("Unexpected end tag token (%(name))" + + " in the after body phase."), + "unexpected-char-in-frameset" => + _("Unepxected characters in the frameset phase. Characters ignored."), + "unexpected-start-tag-in-frameset" => + _("Unexpected start tag token (%(name))" + + " in the frameset phase. Ignored."), + "unexpected-frameset-in-frameset-innerhtml" => + _("Unexpected end tag token (frameset) " + + "in the frameset phase (innerHTML)."), + "unexpected-end-tag-in-frameset" => + _("Unexpected end tag token (%(name))" + + " in the frameset phase. Ignored."), + "unexpected-char-after-frameset" => + _("Unexpected non-space characters in the " + + "after frameset phase. Ignored."), + "unexpected-start-tag-after-frameset" => + _("Unexpected start tag (%(name))" + + " in the after frameset phase. Ignored."), + "unexpected-end-tag-after-frameset" => + _("Unexpected end tag (%(name))" + + " in the after frameset phase. Ignored."), + "expected-eof-but-got-char" => + _("Unexpected non-space characters. Expected end of file."), + "expected-eof-but-got-start-tag" => + _("Unexpected start tag (%(name))" + + ". Expected end of file."), + "expected-eof-but-got-end-tag" => + _("Unexpected end tag (%(name))" + + ". Expected end of file."), + } + end diff --git a/vendor/plugins/HTML5lib/lib/html5/filters/iso639codes.rb b/vendor/plugins/HTML5lib/lib/html5/filters/iso639codes.rb new file mode 100755 index 00000000..ce3c9623 --- /dev/null +++ b/vendor/plugins/HTML5lib/lib/html5/filters/iso639codes.rb @@ -0,0 +1,752 @@ +# borrowed from feedvalidator, original copyright license is +# +# Copyright (c) 2002-2006, Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +ISO_LANG = { + 'aa' => 'Afar', + 'ab' => 'Abkhazian', + 'ae' => 'Avestan', + 'af' => 'Afrikaans', + 'ak' => 'Akan', + 'am' => 'Amharic', + 'an' => 'Aragonese', + 'ar' => 'Arabic', + 'as' => 'Assamese', + 'av' => 'Avaric', + 'ay' => 'Aymara', + 'az' => 'Azerbaijani', + 'ba' => 'Bashkir', + 'be' => 'Byelorussian', + 'bg' => 'Bulgarian', + 'bh' => 'Bihari', + 'bi' => 'Bislama', + 'bm' => 'Bambara', + 'bn' => 'Bengali;Bangla', + 'bo' => 'Tibetan', + 'br' => 'Breton', + 'bs' => 'Bosnian', + 'ca' => 'Catalan', + 'ce' => 'Chechen', + 'ch' => 'Chamorro', + 'co' => 'Corsican', + 'cr' => 'Cree', + 'cs' => 'Czech', + 'cu' => 'Church Slavic', + 'cv' => 'Chuvash', + 'cy' => 'Welsh', + 'da' => 'Danish', + 'de' => 'German', + 'dv' => 'Divehi', + 'dz' => 'Dzongkha', + 'ee' => 'Ewe', + 'el' => 'Greek', + 'en' => 'English', + 'eo' => 'Esperanto', + 'es' => 'Spanish', + 'et' => 'Estonian', + 'eu' => 'Basque', + 'fa' => 'Persian (Farsi)', + 'ff' => 'Fulah', + 'fi' => 'Finnish', + 'fj' => 'Fiji', + 'fo' => 'Faroese', + 'fr' => 'French', + 'fy' => 'Frisian, Western', + 'ga' => 'Irish', + 'gd' => 'Scots Gaelic', + 'gl' => 'Galician', + 'gn' => 'Guarani', + 'gu' => 'Gujarati', + 'gv' => 'Manx', + 'ha' => 'Hausa', + 'he' => 'Hebrew', + 'hi' => 'Hindi', + 'ho' => 'Hiri Motu', + 'hr' => 'Croatian', + 'ht' => 'Haitian', + 'hu' => 'Hungarian', + 'hy' => 'Armenian', + 'hz' => 'Herero', + 'ia' => 'Interlingua', + 'id' => 'Indonesian', + 'ie' => 'Interlingue', + 'ig' => 'Igbo', + 'ii' => 'Sichuan Yi', + 'ik' => 'Inupiak', + 'io' => 'Ido', + 'is' => 'Icelandic', + 'it' => 'Italian', + 'iu' => 'Inuktitut', + 'ja' => 'Japanese', + 'jv' => 'Javanese', + 'ka' => 'Georgian', + 'kg' => 'Kongo', + 'ki' => 'Kikuyu; Gikuyu', + 'kj' => 'Kuanyama; Kwanyama', + 'kk' => 'Kazakh', + 'kl' => 'Greenlandic', + 'km' => 'Cambodian', + 'kn' => 'Kannada', + 'ko' => 'Korean', + 'kr' => 'Kanuri', + 'ks' => 'Kashmiri', + 'ku' => 'Kurdish', + 'kv' => 'Komi', + 'kw' => 'Cornish', + 'ky' => 'Kirghiz', + 'la' => 'Latin', + 'lb' => 'Letzeburgesch; Luxembourgish', + 'lg' => 'Ganda', + 'li' => 'Limburgan; Limburger, Limburgish', + 'ln' => 'Lingala', + 'lo' => 'Lao', + 'lt' => 'Lithuanian', + 'lu' => 'Luba-Katanga', + 'lv' => 'Latvian', + 'mg' => 'Malagasy', + 'mh' => 'Marshallese', + 'mi' => 'Maori', + 'mk' => 'Macedonian', + 'ml' => 'Malayalam', + 'mn' => 'Mongolian', + 'mo' => 'Moldavian', + 'mr' => 'Marathi', + 'ms' => 'Malay', + 'mt' => 'Maltese', + 'my' => 'Burmese', + 'na' => 'Nauru', + 'nb' => 'Norwegian Bokmal', + 'nd' => 'Ndebele, North', + 'ne' => 'Nepali', + 'ng' => 'Ndonga', + 'nl' => 'Dutch', + 'nn' => 'Norwegian Nynorsk', + 'no' => 'Norwegian', + 'nr' => 'Ndebele, South', + 'nv' => 'Navaho; Navajo', + 'ny' => 'Chewa; Chichewa; Nyanha', + 'oc' => 'Occitan', + 'oj' => 'Ojibwa', + 'om' => 'Afan (Oromo)', + 'or' => 'Oriya', + 'os' => 'Ossetian; Ossetic', + 'pa' => 'Punjabi', + 'pi' => 'Pali', + 'pl' => 'Polish', + 'ps' => 'Pushto', + 'pt' => 'Portuguese', + 'qu' => 'Quechua', + 'rm' => 'Rhaeto-Romance', + 'rn' => 'Kurundi', + 'ro' => 'Romanian', + 'ru' => 'Russian', + 'rw' => 'Kinyarwanda', + 'sa' => 'Sanskrit', + 'sc' => 'Sardinian', + 'sd' => 'Sindhi', + 'se' => 'Northern Sami', + 'sg' => 'Sangho', + 'sh' => 'Serbo-Croatian', + 'si' => 'Singhalese', + 'sk' => 'Slovak', + 'sl' => 'Slovenian', + 'sm' => 'Samoan', + 'sn' => 'Shona', + 'so' => 'Somali', + 'sq' => 'Albanian', + 'sr' => 'Serbian', + 'ss' => 'Swati', + 'st' => 'Sotho, Southern', + 'su' => 'Sundanese', + 'sv' => 'Swedish', + 'sw' => 'Swahili', + 'ta' => 'Tamil', + 'te' => 'Telugu', + 'tg' => 'Tajik', + 'th' => 'Thai', + 'ti' => 'Tigrinya', + 'tk' => 'Turkmen', + 'tl' => 'Tagalog', + 'tn' => 'Tswana', + 'to' => 'Tonga', + 'tr' => 'Turkish', + 'ts' => 'Tsonga', + 'tt' => 'Tatar', + 'tw' => 'Twi', + 'ty' => 'Tahitian', + 'ug' => 'Uigur', + 'uk' => 'Ukrainian', + 'ur' => 'Urdu', + 'uz' => 'Uzbek', + 've' => 'Venda', + 'vi' => 'Vietnamese', + 'vo' => 'Volapuk', + 'wa' => 'Walloon', + 'wo' => 'Wolof', + 'xh' => 'Xhosa', + 'yi' => 'Yiddish', + 'yo' => 'Yoruba', + 'za' => 'Zhuang', + 'zh' => 'Chinese', + 'zu' => 'Zulu', + 'x' => 'a user-defined language', + 'xx' => 'a user-defined language', + + 'abk' => 'Abkhazian', + 'ace' => 'Achinese', + 'ach' => 'Acoli', + 'ada' => 'Adangme', + 'ady' => 'Adygei', + 'ady' => 'Adyghe', + 'aar' => 'Afar', + 'afh' => 'Afrihili', + 'afr' => 'Afrikaans', + 'afa' => 'Afro-Asiatic (Other)', + 'ain' => 'Ainu', + 'aka' => 'Akan', + 'akk' => 'Akkadian', + 'alb' => 'Albanian', + 'sqi' => 'Albanian', + 'gws' => 'Alemanic', + 'ale' => 'Aleut', + 'alg' => 'Algonquian languages', + 'tut' => 'Altaic (Other)', + 'amh' => 'Amharic', + 'anp' => 'Angika', + 'apa' => 'Apache languages', + 'ara' => 'Arabic', + 'arg' => 'Aragonese', + 'arc' => 'Aramaic', + 'arp' => 'Arapaho', + 'arn' => 'Araucanian', + 'arw' => 'Arawak', + 'arm' => 'Armenian', + 'hye' => 'Armenian', + 'rup' => 'Aromanian', + 'art' => 'Artificial (Other)', + 'asm' => 'Assamese', + 'ast' => 'Asturian', + 'ath' => 'Athapascan languages', + 'aus' => 'Australian languages', + 'map' => 'Austronesian (Other)', + 'ava' => 'Avaric', + 'ave' => 'Avestan', + 'awa' => 'Awadhi', + 'aym' => 'Aymara', + 'aze' => 'Azerbaijani', + 'ast' => 'Bable', + 'ban' => 'Balinese', + 'bat' => 'Baltic (Other)', + 'bal' => 'Baluchi', + 'bam' => 'Bambara', + 'bai' => 'Bamileke languages', + 'bad' => 'Banda', + 'bnt' => 'Bantu (Other)', + 'bas' => 'Basa', + 'bak' => 'Bashkir', + 'baq' => 'Basque', + 'eus' => 'Basque', + 'btk' => 'Batak (Indonesia)', + 'bej' => 'Beja', + 'bel' => 'Belarusian', + 'bem' => 'Bemba', + 'ben' => 'Bengali', + 'ber' => 'Berber (Other)', + 'bho' => 'Bhojpuri', + 'bih' => 'Bihari', + 'bik' => 'Bikol', + 'byn' => 'Bilin', + 'bin' => 'Bini', + 'bis' => 'Bislama', + 'byn' => 'Blin', + 'nob' => 'Bokmal, Norwegian', + 'bos' => 'Bosnian', + 'bra' => 'Braj', + 'bre' => 'Breton', + 'bug' => 'Buginese', + 'bul' => 'Bulgarian', + 'bua' => 'Buriat', + 'bur' => 'Burmese', + 'mya' => 'Burmese', + 'cad' => 'Caddo', + 'car' => 'Carib', + 'spa' => 'Castilian', + 'cat' => 'Catalan', + 'cau' => 'Caucasian (Other)', + 'ceb' => 'Cebuano', + 'cel' => 'Celtic (Other)', + 'cai' => 'Central American Indian (Other)', + 'chg' => 'Chagatai', + 'cmc' => 'Chamic languages', + 'cha' => 'Chamorro', + 'che' => 'Chechen', + 'chr' => 'Cherokee', + 'nya' => 'Chewa', + 'chy' => 'Cheyenne', + 'chb' => 'Chibcha', + 'nya' => 'Chichewa', + 'chi' => 'Chinese', + 'zho' => 'Chinese', + 'chn' => 'Chinook jargon', + 'chp' => 'Chipewyan', + 'cho' => 'Choctaw', + 'zha' => 'Chuang', + 'chu' => 'Church Slavic; Church Slavonic; Old Church Slavonic; Old Church Slavic; Old Bulgarian', + 'chk' => 'Chuukese', + 'chv' => 'Chuvash', + 'nwc' => 'Classical Nepal Bhasa; Classical Newari; Old Newari', + 'cop' => 'Coptic', + 'cor' => 'Cornish', + 'cos' => 'Corsican', + 'cre' => 'Cree', + 'mus' => 'Creek', + 'crp' => 'Creoles and pidgins(Other)', + 'cpe' => 'Creoles and pidgins, English-based (Other)', + 'cpf' => 'Creoles and pidgins, French-based (Other)', + 'cpp' => 'Creoles and pidgins, Portuguese-based (Other)', + 'crh' => 'Crimean Tatar; Crimean Turkish', + 'scr' => 'Croatian', + 'hrv' => 'Croatian', + 'cus' => 'Cushitic (Other)', + 'cze' => 'Czech', + 'ces' => 'Czech', + 'dak' => 'Dakota', + 'dan' => 'Danish', + 'dar' => 'Dargwa', + 'day' => 'Dayak', + 'del' => 'Delaware', + 'din' => 'Dinka', + 'div' => 'Divehi', + 'doi' => 'Dogri', + 'dgr' => 'Dogrib', + 'dra' => 'Dravidian (Other)', + 'dua' => 'Duala', + 'dut' => 'Dutch', + 'nld' => 'Dutch', + 'dum' => 'Dutch, Middle (ca. 1050-1350)', + 'dyu' => 'Dyula', + 'dzo' => 'Dzongkha', + 'efi' => 'Efik', + 'egy' => 'Egyptian (Ancient)', + 'eka' => 'Ekajuk', + 'elx' => 'Elamite', + 'eng' => 'English', + 'enm' => 'English, Middle (1100-1500)', + 'ang' => 'English, Old (ca.450-1100)', + 'myv' => 'Erzya', + 'epo' => 'Esperanto', + 'est' => 'Estonian', + 'ewe' => 'Ewe', + 'ewo' => 'Ewondo', + 'fan' => 'Fang', + 'fat' => 'Fanti', + 'fao' => 'Faroese', + 'fij' => 'Fijian', + 'fil' => 'Filipino; Pilipino', + 'fin' => 'Finnish', + 'fiu' => 'Finno-Ugrian (Other)', + 'fon' => 'Fon', + 'fre' => 'French', + 'fra' => 'French', + 'frm' => 'French, Middle (ca.1400-1600)', + 'fro' => 'French, Old (842-ca.1400)', + 'frs' => 'Frisian, Eastern', + 'fry' => 'Frisian, Western', + 'fur' => 'Friulian', + 'ful' => 'Fulah', + 'gaa' => 'Ga', + 'gla' => 'Gaelic', + 'glg' => 'Gallegan', + 'lug' => 'Ganda', + 'gay' => 'Gayo', + 'gba' => 'Gbaya', + 'gez' => 'Geez', + 'geo' => 'Georgian', + 'kat' => 'Georgian', + 'ger' => 'German', + 'deu' => 'German', + 'nds' => 'German, Low', + 'gmh' => 'German, Middle High (ca.1050-1500)', + 'goh' => 'German, Old High (ca.750-1050)', + 'gem' => 'Germanic (Other)', + 'kik' => 'Gikuyu', + 'gil' => 'Gilbertese', + 'gon' => 'Gondi', + 'gor' => 'Gorontalo', + 'got' => 'Gothic', + 'grb' => 'Grebo', + 'grc' => 'Greek, Ancient (to 1453)', + 'gre' => 'Greek, Modern (1453-)', + 'ell' => 'Greek, Modern (1453-)', + 'kal' => 'Greenlandic; Kalaallisut', + 'grn' => 'Guarani', + 'guj' => 'Gujarati', + 'gwi' => 'Gwich\'in', + 'hai' => 'Haida', + 'hat' => 'Haitian', + 'hau' => 'Hausa', + 'haw' => 'Hawaiian', + 'heb' => 'Hebrew', + 'her' => 'Herero', + 'hil' => 'Hiligaynon', + 'him' => 'Himachali', + 'hin' => 'Hindi', + 'hmo' => 'Hiri Motu', + 'hit' => 'Hittite', + 'hmn' => 'Hmong', + 'hun' => 'Hungarian', + 'hup' => 'Hupa', + 'iba' => 'Iban', + 'ice' => 'Icelandic', + 'isl' => 'Icelandic', + 'ido' => 'Ido', + 'ibo' => 'Igbo', + 'ijo' => 'Ijo', + 'ilo' => 'Iloko', + 'smn' => 'Inari Sami', + 'inc' => 'Indic (Other)', + 'ine' => 'Indo-European (Other)', + 'ind' => 'Indonesian', + 'inh' => 'Ingush', + 'ina' => 'Interlingua (International Auxiliary Language Association)', + 'ile' => 'Interlingue', + 'iku' => 'Inuktitut', + 'ipk' => 'Inupiaq', + 'ira' => 'Iranian (Other)', + 'gle' => 'Irish', + 'mga' => 'Irish, Middle (900-1200)', + 'sga' => 'Irish, Old (to 900)', + 'iro' => 'Iroquoian languages', + 'ita' => 'Italian', + 'jpn' => 'Japanese', + 'jav' => 'Javanese', + 'jrb' => 'Judeo-Arabic', + 'jpr' => 'Judeo-Persian', + 'kbd' => 'Kabardian', + 'kab' => 'Kabyle', + 'kac' => 'Kachin', + 'kal' => 'Kalaallisut', + 'xal' => 'Kalmyk', + 'kam' => 'Kamba', + 'kan' => 'Kannada', + 'kau' => 'Kanuri', + 'krc' => 'Karachay-Balkar', + 'kaa' => 'Kara-Kalpak', + 'krl' => 'Karelian', + 'kar' => 'Karen', + 'kas' => 'Kashmiri', + 'csb' => 'Kashubian', + 'kaw' => 'Kawi', + 'kaz' => 'Kazakh', + 'kha' => 'Khasi', + 'khm' => 'Khmer', + 'khi' => 'Khoisan (Other)', + 'kho' => 'Khotanese', + 'kik' => 'Kikuyu', + 'kmb' => 'Kimbundu', + 'kin' => 'Kinyarwanda', + 'kir' => 'Kirghiz', + 'tlh' => 'Klingon; tlhIngan-Hol', + 'kom' => 'Komi', + 'kon' => 'Kongo', + 'kok' => 'Konkani', + 'kor' => 'Korean', + 'kos' => 'Kosraean', + 'kpe' => 'Kpelle', + 'kro' => 'Kru', + 'kua' => 'Kuanyama', + 'kum' => 'Kumyk', + 'kur' => 'Kurdish', + 'kru' => 'Kurukh', + 'kut' => 'Kutenai', + 'kua' => 'Kwanyama', + 'lad' => 'Ladino', + 'lah' => 'Lahnda', + 'lam' => 'Lamba', + 'lao' => 'Lao', + 'lat' => 'Latin', + 'lav' => 'Latvian', + 'ltz' => 'Letzeburgesch', + 'lez' => 'Lezghian', + 'lim' => 'Limburgan', + 'lin' => 'Lingala', + 'lit' => 'Lithuanian', + 'jbo' => 'Lojban', + 'nds' => 'Low German', + 'dsb' => 'Lower Sorbian', + 'loz' => 'Lozi', + 'lub' => 'Luba-Katanga', + 'lua' => 'Luba-Lulua', + 'lui' => 'Luiseno', + 'smj' => 'Lule Sami', + 'lun' => 'Lunda', + 'luo' => 'Luo (Kenya and Tanzania)', + 'lus' => 'Lushai', + 'ltz' => 'Luxembourgish', + 'mac' => 'Macedonian', + 'mkd' => 'Macedonian', + 'mad' => 'Madurese', + 'mag' => 'Magahi', + 'mai' => 'Maithili', + 'mak' => 'Makasar', + 'mlg' => 'Malagasy', + 'may' => 'Malay', + 'msa' => 'Malay', + 'mal' => 'Malayalam', + 'mlt' => 'Maltese', + 'mnc' => 'Manchu', + 'mdr' => 'Mandar', + 'man' => 'Mandingo', + 'mni' => 'Manipuri', + 'mno' => 'Manobo languages', + 'glv' => 'Manx', + 'mao' => 'Maori', + 'mri' => 'Maori', + 'mar' => 'Marathi', + 'chm' => 'Mari', + 'mah' => 'Marshallese', + 'mwr' => 'Marwari', + 'mas' => 'Masai', + 'myn' => 'Mayan languages', + 'men' => 'Mende', + 'mic' => 'Micmac', + 'min' => 'Minangkabau', + 'mwl' => 'Mirandese', + 'mis' => 'Miscellaneous languages', + 'moh' => 'Mohawk', + 'mdf' => 'Moksha', + 'mol' => 'Moldavian', + 'mkh' => 'Mon-Khmer (Other)', + 'lol' => 'Mongo', + 'mon' => 'Mongolian', + 'mos' => 'Mossi', + 'mul' => 'Multiple languages', + 'mun' => 'Munda languages', + 'nah' => 'Nahuatl', + 'nau' => 'Nauru', + 'nav' => 'Navaho; Navajo', + 'nde' => 'Ndebele, North', + 'nbl' => 'Ndebele, South', + 'ndo' => 'Ndonga', + 'nap' => 'Neapolitan', + 'nep' => 'Nepali', + 'new' => 'Newari', + 'nia' => 'Nias', + 'nic' => 'Niger-Kordofanian (Other)', + 'ssa' => 'Nilo-Saharan (Other)', + 'niu' => 'Niuean', + 'nog' => 'Nogai', + 'non' => 'Norse, Old', + 'nai' => 'North American Indian (Other)', + 'frr' => 'Northern Frisian', + 'sme' => 'Northern Sami', + 'nso' => 'Northern Sotho; Pedi; Sepedi', + 'nde' => 'North Ndebele', + 'nor' => 'Norwegian', + 'nob' => 'Norwegian Bokmal', + 'nno' => 'Norwegian Nynorsk', + 'nub' => 'Nubian languages', + 'nym' => 'Nyamwezi', + 'nya' => 'Nyanja', + 'nyn' => 'Nyankole', + 'nno' => 'Nynorsk, Norwegian', + 'nyo' => 'Nyoro', + 'nzi' => 'Nzima', + 'oci' => 'Occitan (post 1500)', + 'oji' => 'Ojibwa', + 'ori' => 'Oriya', + 'orm' => 'Oromo', + 'osa' => 'Osage', + 'oss' => 'Ossetian; Ossetic', + 'oto' => 'Otomian languages', + 'pal' => 'Pahlavi', + 'pau' => 'Palauan', + 'pli' => 'Pali', + 'pam' => 'Pampanga', + 'pag' => 'Pangasinan', + 'pan' => 'Panjabi', + 'pap' => 'Papiamento', + 'paa' => 'Papuan (Other)', + 'per' => 'Persian', + 'fas' => 'Persian', + 'peo' => 'Persian, Old (ca.600-400)', + 'phi' => 'Philippine (Other)', + 'phn' => 'Phoenician', + 'pon' => 'Pohnpeian', + 'pol' => 'Polish', + 'por' => 'Portuguese', + 'pra' => 'Prakrit languages', + 'oci' => 'Provencal', + 'pro' => 'Provencal, Old (to 1500)', + 'pan' => 'Punjabi', + 'pus' => 'Pushto', + 'que' => 'Quechua', + 'roh' => 'Raeto-Romance', + 'raj' => 'Rajasthani', + 'rap' => 'Rapanui', + 'rar' => 'Rarotongan', + 'qaa' => 'Reserved for local use', + 'qtz' => 'Reserved for local use', + 'roa' => 'Romance (Other)', + 'rum' => 'Romanian', + 'ron' => 'Romanian', + 'rom' => 'Romany', + 'run' => 'Rundi', + 'rus' => 'Russian', + 'sal' => 'Salishan languages', + 'sam' => 'Samaritan Aramaic', + 'smi' => 'Sami languages (Other)', + 'smo' => 'Samoan', + 'sad' => 'Sandawe', + 'sag' => 'Sango', + 'san' => 'Sanskrit', + 'sat' => 'Santali', + 'srd' => 'Sardinian', + 'sas' => 'Sasak', + 'nds' => 'Saxon, Low', + 'sco' => 'Scots', + 'gla' => 'Scottish Gaelic', + 'sel' => 'Selkup', + 'sem' => 'Semitic (Other)', + 'nso' => 'Sepedi; Northern Sotho; Pedi', + 'scc' => 'Serbian', + 'srp' => 'Serbian', + 'srr' => 'Serer', + 'shn' => 'Shan', + 'sna' => 'Shona', + 'iii' => 'Sichuan Yi', + 'scn' => 'Sicilian', + 'sid' => 'Sidamo', + 'sgn' => 'Sign languages', + 'bla' => 'Siksika', + 'snd' => 'Sindhi', + 'sin' => 'Sinhalese', + 'sit' => 'Sino-Tibetan (Other)', + 'sio' => 'Siouan languages', + 'sms' => 'Skolt Sami', + 'den' => 'Slave (Athapascan)', + 'sla' => 'Slavic (Other)', + 'slo' => 'Slovak', + 'slk' => 'Slovak', + 'slv' => 'Slovenian', + 'sog' => 'Sogdian', + 'som' => 'Somali', + 'son' => 'Songhai', + 'snk' => 'Soninke', + 'wen' => 'Sorbian languages', + 'nso' => 'Sotho, Northern', + 'sot' => 'Sotho, Southern', + 'sai' => 'South American Indian (Other)', + 'alt' => 'Southern Altai', + 'sma' => 'Southern Sami', + 'nbl' => 'South Ndebele', + 'spa' => 'Spanish', + 'srn' => 'Sranan Tongo', + 'suk' => 'Sukuma', + 'sux' => 'Sumerian', + 'sun' => 'Sundanese', + 'sus' => 'Susu', + 'swa' => 'Swahili', + 'ssw' => 'Swati', + 'swe' => 'Swedish', + 'gsw' => 'Swiss German; Alemanic', + 'syr' => 'Syriac', + 'tgl' => 'Tagalog', + 'tah' => 'Tahitian', + 'tai' => 'Tai (Other)', + 'tgk' => 'Tajik', + 'tmh' => 'Tamashek', + 'tam' => 'Tamil', + 'tat' => 'Tatar', + 'tel' => 'Telugu', + 'ter' => 'Tereno', + 'tet' => 'Tetum', + 'tha' => 'Thai', + 'tib' => 'Tibetan', + 'bod' => 'Tibetan', + 'tig' => 'Tigre', + 'tir' => 'Tigrinya', + 'tem' => 'Timne', + 'tiv' => 'Tiv', + 'tlh' => 'tlhIngan-Hol; Klingon', + 'tli' => 'Tlingit', + 'tpi' => 'Tok Pisin', + 'tkl' => 'Tokelau', + 'tog' => 'Tonga (Nyasa)', + 'ton' => 'Tonga (Tonga Islands)', + 'tsi' => 'Tsimshian', + 'tso' => 'Tsonga', + 'tsn' => 'Tswana', + 'tum' => 'Tumbuka', + 'tup' => 'Tupi languages', + 'tur' => 'Turkish', + 'ota' => 'Turkish, Ottoman (1500-1928)', + 'tuk' => 'Turkmen', + 'tvl' => 'Tuvalu', + 'tyv' => 'Tuvinian', + 'twi' => 'Twi', + 'udm' => 'Udmurt', + 'uga' => 'Ugaritic', + 'uig' => 'Uighur', + 'ukr' => 'Ukrainian', + 'umb' => 'Umbundu', + 'und' => 'Undetermined', + 'hsb' => 'Upper Sorbian', + 'urd' => 'Urdu', + 'uzb' => 'Uzbek', + 'vai' => 'Vai', + 'cat' => 'Valencian', + 'ven' => 'Venda', + 'vie' => 'Vietnamese', + 'vol' => 'Volapuk', + 'vot' => 'Votic', + 'wak' => 'Wakashan languages', + 'wal' => 'Walamo', + 'wln' => 'Walloon', + 'war' => 'Waray', + 'was' => 'Washo', + 'wel' => 'Welsh', + 'cym' => 'Welsh', + 'fry' => 'Wester Frisian', + 'wol' => 'Wolof', + 'xho' => 'Xhosa', + 'sah' => 'Yakut', + 'yao' => 'Yao', + 'yap' => 'Yapese', + 'yid' => 'Yiddish', + 'yor' => 'Yoruba', + 'ypk' => 'Yupik languages', + 'znd' => 'Zande', + 'zap' => 'Zapotec', + 'zen' => 'Zenaga', + 'zha' => 'Zhuang', + 'zul' => 'Zulu', + 'zun' => 'Zuni' +} + +def is_valid_lang_code(value) + if value.include? '-' + lang, sublang = value.split('-', 2) + else + lang = value + end + !!ISO_LANG[lang.downcase] +end \ No newline at end of file diff --git a/vendor/plugins/HTML5lib/lib/html5/filters/rfc2046.rb b/vendor/plugins/HTML5lib/lib/html5/filters/rfc2046.rb new file mode 100755 index 00000000..593baf42 --- /dev/null +++ b/vendor/plugins/HTML5lib/lib/html5/filters/rfc2046.rb @@ -0,0 +1,30 @@ +# adapted from feedvalidator, original copyright license is +# +# Copyright (c) 2002-2006, Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +# mime_re = Regexp.new('[^\s()<>,;:\\"/[\]?=]+/[^\s()<>,;:\\"/[\]?=]+(\s*;\s*[^\s()<>,;:\\"/[\]?=]+=("(\\"|[^"])*"|[^\s()<>,;:\\"/[\]?=]+))*$') + +def is_valid_mime_type(value) + # !!mime_re.match(value) + true +end + diff --git a/vendor/plugins/HTML5lib/lib/html5/filters/rfc3987.rb b/vendor/plugins/HTML5lib/lib/html5/filters/rfc3987.rb new file mode 100755 index 00000000..bf730e06 --- /dev/null +++ b/vendor/plugins/HTML5lib/lib/html5/filters/rfc3987.rb @@ -0,0 +1,89 @@ +# adapted from feedvalidator, original copyright license is +# +# Copyright (c) 2002-2006, Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +iana_schemes = [ # http://www.iana.org/assignments/uri-schemes.html + "ftp", "http", "gopher", "mailto", "news", "nntp", "telnet", "wais", + "file", "prospero", "z39.50s", "z39.50r", "cid", "mid", "vemmi", + "service", "imap", "nfs", "acap", "rtsp", "tip", "pop", "data", "dav", + "opaquelocktoken", "sip", "sips", "tel", "fax", "modem", "ldap", + "https", "soap.beep", "soap.beeps", "xmlrpc.beep", "xmlrpc.beeps", + "urn", "go", "h323", "ipp", "tftp", "mupdate", "pres", "im", "mtqp", + "iris.beep", "dict", "snmp", "crid", "tag", "dns", "info" +] +ALLOWED_SCHEMES = iana_schemes + ['javascript'] + +RFC2396 = Regexp.new("^([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%,#]*$", Regexp::MULTILINE) +rfc2396_full = Regexp.new("[a-zA-Z][0-9a-zA-Z+\\-\\.]*:(//)?[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%,#]+$") +URN = Regexp.new("^[Uu][Rr][Nn]:[a-zA-Z0-9][a-zA-Z0-9-]{1,31}:([a-zA-Z0-9()+,\.:=@;$_!*'\-]|%[0-9A-Fa-f]{2})+$") +TAG = Regexp.new("^tag:([a-z0-9\\-\._]+?@)?[a-z0-9\.\-]+?,\d{4}(-\d{2}(-\d{2})?)?:[0-9a-zA-Z;/\?:@&=+$\.\-_!~*'\(\)%,]*(#[0-9a-zA-Z;/\?:@&=+$\.\-_!~*'\(\)%,]*)?$") + +def is_valid_uri(value, uri_pattern = RFC2396) + scheme = value.split(':').first + scheme.downcase! if scheme + if scheme == 'tag' + if !TAG.match(value) + return false, "invalid-tag-uri" + end + elsif scheme == "urn" + if !URN.match(value) + return false, "invalid-urn" + end + elsif uri_pattern.match(value).to_a.reject{|i| i == ''}.compact.length == 0 || uri_pattern.match(value)[0] != value + urichars = Regexp.new("^[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%,#]$", Regexp::MULTILINE) + if value.length > 0 + value.each_byte do |b| + if b < 128 and !urichars.match([b].pack('c*')) + return false, "invalid-uri-char" + end + end + else + begin + if uri_pattern.match(value.encode('idna')) + return false, "uri-not-iri" + end + rescue + end + return false, "invalid-uri" + end + elsif ['http','ftp'].include?(scheme) + if !value.match(%r{^\w+://[^/].*}) + return false, "invalid-http-or-ftp-uri" + end + elsif value.index(':') && scheme.match(/^[a-z]+$/) && !ALLOWED_SCHEMES.include?(scheme) + return false, "invalid-scheme" + end + return true, "" +end + +def is_valid_iri(value) + begin + if value.length > 0 + value = value.encode('idna') + end + rescue + end + is_valid_uri(value) +end + +def is_valid_fully_qualified_uri(value) + is_valid_uri(value, rfc2396_full) +end diff --git a/vendor/plugins/HTML5lib/lib/html5/filters/validator.rb b/vendor/plugins/HTML5lib/lib/html5/filters/validator.rb new file mode 100755 index 00000000..99e67baa --- /dev/null +++ b/vendor/plugins/HTML5lib/lib/html5/filters/validator.rb @@ -0,0 +1,830 @@ +# HTML 5 conformance checker +# +# Warning: this module is experimental, incomplete, and subject to removal at any time. +# +# Usage: +# >>> from html5lib.html5parser import HTMLParser +# >>> from html5lib.filters.validator import HTMLConformanceChecker +# >>> p = HTMLParser(tokenizer=HTMLConformanceChecker) +# >>> p.parse('\n') +# < nil> +# >>> p.errors +# [((2, 14), 'unknown-attribute', {'attributeName' => u'foo', 'tagName' => u'html'})] + +require 'html5/constants' +require 'html5/filters/base' +require 'html5/filters/iso639codes' +require 'html5/filters/rfc3987' +require 'html5/filters/rfc2046' + +def _(str); str; end + +class String + # lifted from rails + def underscore() + self.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end +end + +HTML5::E.update({ + "unknown-start-tag" => + _("Unknown start tag <%(tagName)>."), + "unknown-attribute" => + _("Unknown '%(attributeName)' attribute on <%(tagName)>."), + "missing-required-attribute" => + _("The '%(attributeName)' attribute is required on <%(tagName)>."), + "unknown-input-type" => + _("Illegal value for attribute on ."), + "attribute-not-allowed-on-this-input-type" => + _("The '%(attributeName)' attribute is not allowed on ."), + "deprecated-attribute" => + _("This attribute is deprecated: '%(attributeName)' attribute on <%(tagName)>."), + "duplicate-value-in-token-list" => + _("Duplicate value in token list: '%(attributeValue)' in '%(attributeName)' attribute on <%(tagName)>."), + "invalid-attribute-value" => + _("Invalid attribute value: '%(attributeName)' attribute on <%(tagName)>."), + "space-in-id" => + _("Whitespace is not allowed here: '%(attributeName)' attribute on <%(tagName)>."), + "duplicate-id" => + _("This ID was already defined earlier: 'id' attribute on <%(tagName)>."), + "attribute-value-can-not-be-blank" => + _("This value can not be blank: '%(attributeName)' attribute on <%(tagName)>."), + "id-does-not-exist" => + _("This value refers to a non-existent ID: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-enumerated-value" => + _("Value must be one of %(enumeratedValues): '%(attributeName)' attribute on <%tagName)>."), + "invalid-boolean-value" => + _("Value must be one of %(enumeratedValues): '%(attributeName)' attribute on <%tagName)>."), + "contextmenu-must-point-to-menu" => + _("The contextmenu attribute must point to an ID defined on a element."), + "invalid-lang-code" => + _("Invalid language code: '%(attributeName)' attibute on <%(tagName)>."), + "invalid-integer-value" => + _("Value must be an integer: '%(attributeName)' attribute on <%tagName)>."), + "invalid-root-namespace" => + _("Root namespace must be 'http://www.w3.org/1999/xhtml', or omitted."), + "invalid-browsing-context" => + _("Value must be one of ('_self', '_parent', '_top'), or a name that does not start with '_' => '%(attributeName)' attribute on <%(tagName)>."), + "invalid-tag-uri" => + _("Invalid URI: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-urn" => + _("Invalid URN: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-uri-char" => + _("Illegal character in URI: '%(attributeName)' attribute on <%(tagName)>."), + "uri-not-iri" => + _("Expected a URI but found an IRI: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-uri" => + _("Invalid URI: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-http-or-ftp-uri" => + _("Invalid URI: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-scheme" => + _("Unregistered URI scheme: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-rel" => + _("Invalid link relation: '%(attributeName)' attribute on <%(tagName)>."), + "invalid-mime-type" => + _("Invalid MIME type: '%(attributeName)' attribute on <%(tagName)>."), +}) + + +class HTMLConformanceChecker < HTML5::Filters::Base + + @@global_attributes = %w[class contenteditable contextmenu dir + draggable id irrelevant lang ref tabindex template + title onabort onbeforeunload onblur onchange onclick + oncontextmenu ondblclick ondrag ondragend ondragenter + ondragleave ondragover ondragstart ondrop onerror + onfocus onkeydown onkeypress onkeyup onload onmessage + onmousedown onmousemove onmouseout onmouseover onmouseup + onmousewheel onresize onscroll onselect onsubmit onunload] + # XXX lang in HTML only, xml:lang in XHTML only + # XXX validate ref, template + + @@allowed_attribute_map = { + 'html' => %w[xmlns], + 'head' => [], + 'title' => [], + 'base' => %w[href target], + 'link' => %w[href rel media hreflang type], + 'meta' => %w[name http-equiv content charset], # XXX charset in HTML only + 'style' => %w[media type scoped], + 'body' => [], + 'section' => [], + 'nav' => [], + 'article' => [], + 'blockquote' => %w[cite], + 'aside' => [], + 'h1' => [], + 'h2' => [], + 'h3' => [], + 'h4' => [], + 'h5' => [], + 'h6' => [], + 'header' => [], + 'footer' => [], + 'address' => [], + 'p' => [], + 'hr' => [], + 'br' => [], + 'dialog' => [], + 'pre' => [], + 'ol' => %w[start], + 'ul' => [], + 'li' => %w[value], # XXX depends on parent + 'dl' => [], + 'dt' => [], + 'dd' => [], + 'a' => %w[href target ping rel media hreflang type], + 'q' => %w[cite], + 'cite' => [], + 'em' => [], + 'strong' => [], + 'small' => [], + 'm' => [], + 'dfn' => [], + 'abbr' => [], + 'time' => %w[datetime], + 'meter' => %w[value min low high max optimum], + 'progress' => %w[value max], + 'code' => [], + 'var' => [], + 'samp' => [], + 'kbd' => [], + 'sup' => [], + 'sub' => [], + 'span' => [], + 'i' => [], + 'b' => [], + 'bdo' => [], + 'ins' => %w[cite datetime], + 'del' => %w[cite datetime], + 'figure' => [], + 'img' => %w[alt src usemap ismap height width], # XXX ismap depends on parent + 'iframe' => %w[src], + # handled separately + 'object' => %w[data type usemap height width], + 'param' => %w[name value], + 'video' => %w[src autoplay start loopstart loopend end loopcount controls], + 'audio' => %w[src autoplay start loopstart loopend end loopcount controls], + 'source' => %w[src type media], + 'canvas' => %w[height width], + 'map' => [], + 'area' => %w[alt coords shape href target ping rel media hreflang type], + 'table' => [], + 'caption' => [], + 'colgroup' => %w[span], # XXX only if element contains no elements + 'col' => %w[span], + 'tbody' => [], + 'thead' => [], + 'tfoot' => [], + 'tr' => [], + 'td' => %w[colspan rowspan], + 'th' => %w[colspan rowspan scope], + # all possible attributes are listed here but is really handled separately + 'input' => %w[accept accesskey action alt autocomplete autofocus checked + disabled enctype form inputmode list maxlength method min + max name pattern step readonly replace required size src + tabindex target template value + ], + 'form' => %w[action method enctype accept name onsubmit onreset accept-charset + data replace + ], + 'button' => %w[action enctype method replace template name value type disabled form autofocus], # XXX may need matrix of acceptable attributes based on value of type attribute (like input) + 'select' => %w[name size multiple disabled data accesskey form autofocus], + 'optgroup' => %w[disabled label], + 'option' => %w[selected disabled label value], + 'textarea' => %w[maxlength name rows cols disabled readonly required form autofocus wrap accept], + 'label' => %w[for accesskey form], + 'fieldset' => %w[disabled form], + 'output' => %w[form name for onforminput onformchange], + 'datalist' => %w[data], + # XXX repetition model for repeating form controls + 'script' => %w[src defer async type], + 'noscript' => [], + 'noembed' => [], + 'event-source' => %w[src], + 'details' => %w[open], + 'datagrid' => %w[multiple disabled], + 'command' => %w[type label icon hidden disabled checked radiogroup default], + 'menu' => %w[type label autosubmit], + 'datatemplate' => [], + 'rule' => [], + 'nest' => [], + 'legend' => [], + 'div' => [], + 'font' => %w[style] + } + + @@required_attribute_map = { + 'link' => %w[href rel], + 'bdo' => %w[dir], + 'img' => %w[src], + 'embed' => %w[src], + 'object' => [], # XXX one of 'data' or 'type' is required + 'param' => %w[name value], + 'source' => %w[src], + 'map' => %w[id] + } + + @@input_type_allowed_attribute_map = { + 'text' => %w[accesskey autocomplete autofocus disabled form inputmode list maxlength name pattern readonly required size tabindex value], + 'password' => %w[accesskey autocomplete autofocus disabled form inputmode maxlength name pattern readonly required size tabindex value], + 'checkbox' => %w[accesskey autofocus checked disabled form name required tabindex value], + 'radio' => %w[accesskey autofocus checked disabled form name required tabindex value], + 'button' => %w[accesskey autofocus disabled form name tabindex value], + 'submit' => %w[accesskey action autofocus disabled enctype form method name replace tabindex target value], + 'reset' => %w[accesskey autofocus disabled form name tabindex value], + 'add' => %w[accesskey autofocus disabled form name tabindex template value], + 'remove' => %w[accesskey autofocus disabled form name tabindex value], + 'move-up' => %w[accesskey autofocus disabled form name tabindex value], + 'move-down' => %w[accesskey autofocus disabled form name tabindex value], + 'file' => %w[accept accesskey autofocus disabled form min max name required tabindex], + 'hidden' => %w[disabled form name value], + 'image' => %w[accesskey action alt autofocus disabled enctype form method name replace src tabindex target], + 'datetime' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'datetime-local' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'date' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'month' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'week' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'time' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'number' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'range' => %w[accesskey autocomplete autofocus disabled form list min max name step readonly required tabindex value], + 'email' => %w[accesskey autocomplete autofocus disabled form inputmode list maxlength name pattern readonly required tabindex value], + 'url' => %w[accesskey autocomplete autofocus disabled form inputmode list maxlength name pattern readonly required tabindex value], + } + + @@input_type_deprecated_attribute_map = { + 'text' => ['size'], + 'password' => ['size'] + } + + @@link_rel_values = %w[alternate archive archives author contact feed first begin start help icon index top contents toc last end license copyright next pingback prefetch prev previous search stylesheet sidebar tag up] + @@a_rel_values = %w[alternate archive archives author contact feed first begin start help index top contents toc last end license copyright next prev previous search sidebar tag up bookmark external nofollow] + + def initialize(stream, *args) + super(HTML5::HTMLTokenizer.new(stream, *args)) + @things_that_define_an_id = [] + @things_that_point_to_an_id = [] + @ids_we_have_known_and_loved = [] + end + + def each + __getobj__.each do |token| + method = "validate_#{token.fetch(:type, '-').to_s.underscore}_#{token.fetch(:name, '-').to_s.underscore}" + if respond_to?(method) + send(method, token){|t| yield t } + else + method = "validate_#{token.fetch(:type, '-').to_s.underscore}" + if respond_to?(method) + send(method, token) do |t| + yield t + end + end + end + yield token + end + eof do |t| + yield t + end + end + + ########################################################################## + # Start tag validation + ########################################################################## + + def validate_start_tag(token) + check_unknown_start_tag(token){|t| yield t} + check_start_tag_required_attributes(token) do |t| + yield t + end + check_start_tag_unknown_attributes(token) do |t| + yield t + end + check_attribute_values(token) do |t| + yield t + end + end + + def validate_start_tag_embed(token) + check_start_tag_required_attributes(token) do |t| + yield t + end + check_attribute_values(token) do |t| + yield t + end + # spec says "any attributes w/o namespace" + # so don't call check_start_tag_unknown_attributes + end + + def validate_start_tag_input(token) + check_attribute_values(token) do |t| + yield t + end + attr_dict = Hash[*token[:data].collect{|(name, value)| [name.downcase, value]}.flatten] + input_type = attr_dict.fetch('type', "text") + if !@@input_type_allowed_attribute_map.keys().include?(input_type) + yield({:type => "ParseError", + :data => "unknown-input-type", + :datavars => {:attrValue => input_type}}) + end + allowed_attributes = @@input_type_allowed_attribute_map.fetch(input_type, []) + attr_dict.each do |attr_name, attr_value| + if !@@allowed_attribute_map['input'].include?(attr_name) + yield({:type => "ParseError", + :data => "unknown-attribute", + :datavars => {"tagName" => "input", + "attributeName" => attr_name}}) + elsif !allowed_attributes.include?(attr_name) + yield({:type => "ParseError", + :data => "attribute-not-allowed-on-this-input-type", + :datavars => {"attributeName" => attr_name, + "inputType" => input_type}}) + end + if @@input_type_deprecated_attribute_map.fetch(input_type, []).include?(attr_name) + yield({:type => "ParseError", + :data => "deprecated-attribute", + :datavars => {"attributeName" => attr_name, + "inputType" => input_type}}) + end + end + end + + ########################################################################## + # Start tag validation helpers + ########################################################################## + + def check_unknown_start_tag(token) + # check for recognized tag name + name = (token[:name] || "").downcase + if !@@allowed_attribute_map.keys.include?(name) + yield({:type => "ParseError", + :data => "unknown-start-tag", + :datavars => {"tagName" => name}}) + end + end + + def check_start_tag_required_attributes(token) + # check for presence of required attributes + name = (token[:name] || "").downcase + if @@required_attribute_map.keys().include?(name) + attrs_present = (token[:data] || []).collect{|t| t[0]} + for attr_name in @@required_attribute_map[name] + if !attrs_present.include?(attr_name) + yield( {:type => "ParseError", + :data => "missing-required-attribute", + :datavars => {"tagName" => name, + "attributeName" => attr_name}}) + end + end + end + end + + def check_start_tag_unknown_attributes(token) + # check for recognized attribute names + name = token[:name].downcase + allowed_attributes = @@global_attributes | @@allowed_attribute_map.fetch(name, []) + for attr_name, attr_value in token.fetch(:data, []) + if !allowed_attributes.include?(attr_name.downcase()) + yield( {:type => "ParseError", + :data => "unknown-attribute", + :datavars => {"tagName" => name, + "attributeName" => attr_name}}) + end + end + end + + ########################################################################## + # Attribute validation helpers + ########################################################################## + +# def checkURI(token, tag_name, attr_name, attr_value) +# is_valid, error_code = rfc3987.is_valid_uri(attr_value) +# if not is_valid +# yield {:type => "ParseError", +# :data => error_code, +# :datavars => {"tagName" => tag_name, +# "attributeName" => attr_name}} +# yield {:type => "ParseError", +# :data => "invalid-attribute-value", +# :datavars => {"tagName" => tag_name, +# "attributeName" => attr_name}} + + def check_iri(token, tag_name, attr_name, attr_value) + is_valid, error_code = is_valid_iri(attr_value) + if !is_valid + yield({:type => "ParseError", + :data => error_code, + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + yield({:type => "ParseError", + :data => "invalid-attribute-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + end + + def check_id(token, tag_name, attr_name, attr_value) + if !attr_value || attr_value.length == 0 + yield({:type => "ParseError", + :data => "attribute-value-can-not-be-blank", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + attr_value.each_byte do |b| + c = [b].pack('c*') + if HTML5::SPACE_CHARACTERS.include?(c) + yield( {:type => "ParseError", + :data => "space-in-id", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + yield( {:type => "ParseError", + :data => "invalid-attribute-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + break + end + end + end + + def parse_token_list(value) + valueList = [] + currentValue = '' + (value + ' ').each_byte do |b| + c = [b].pack('c*') + if HTML5::SPACE_CHARACTERS.include?(c) + if currentValue.length > 0 + valueList << currentValue + currentValue = '' + end + else + currentValue += c + end + end + if currentValue.length > 0 + valueList << currentValue + end + valueList + end + + def check_token_list(tag_name, attr_name, attr_value) + # The "token" in the method name refers to tokens in an attribute value + # i.e. http://www.whatwg.org/specs/web-apps/current-work/#set-of + # but the "token" parameter refers to the token generated from + # HTMLTokenizer. Sorry for the confusion. + value_list = parse_token_list(attr_value) + value_dict = {} + for current_value in value_list + if value_dict.has_key?(current_value) + yield({:type => "ParseError", + :data => "duplicate-value-in-token-list", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name, + "attributeValue" => current_value}}) + break + end + value_dict[current_value] = 1 + end + end + + def check_enumerated_value(token, tag_name, attr_name, attr_value, enumerated_values) + if !attr_value || attr_value.length == 0 + yield( {:type => "ParseError", + :data => "attribute-value-can-not-be-blank", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + return + end + attr_value.downcase! + if !enumerated_values.include?(attr_value) + yield( {:type => "ParseError", + :data => "invalid-enumerated-value", + :datavars => {"tagName" => tag_name, + "attribute_name" => attr_name, + "enumeratedValues" => enumerated_values}}) + yield( {:type => "ParseError", + :data => "invalid-attribute-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + end + + def check_boolean(token, tag_name, attr_name, attr_value) + enumerated_values = [attr_name, ''] + if !enumerated_values.include?(attr_value) + yield( {:type => "ParseError", + :data => "invalid-boolean-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name, + "enumeratedValues" => enumerated_values}}) + yield( {:type => "ParseError", + :data => "invalid-attribute-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + end + + def check_integer(token, tag_name, attr_name, attr_value) + sign = 1 + number_string = '' + state = 'begin' # ('begin', 'initial-number', 'number', 'trailing-junk') + error = {:type => "ParseError", + :data => "invalid-integer-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name, + "attributeValue" => attr_value}} + attr_value.scan(/./) do |c| + if state == 'begin' + if HTML5::SPACE_CHARACTERS.include?(c) + next + elsif c == '-' + sign = -1 + state = 'initial-number' + elsif HTML5::DIGITS.include?(c) + number_string += c + state = 'in-number' + else + yield error + return + end + elsif state == 'initial-number' + if !HTML5::DIGITS.include?(c) + yield error + return + end + number_string += c + state = 'in-number' + elsif state == 'in-number' + if HTML5::DIGITS.include?(c) + number_string += c + else + state = 'trailing-junk' + end + elsif state == 'trailing-junk' + next + end + end + if number_string.length == 0 + yield( {:type => "ParseError", + :data => "attribute-value-can-not-be-blank", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + end + + def check_floating_point_number(token, tag_name, attr_name, attr_value) + # XXX + end + + def check_browsing_context(token, tag_name, attr_name, attr_value) + return if not attr_value + return if attr_value[0] != ?_ + attr_value.downcase! + return if ['_self', '_parent', '_top', '_blank'].include?(attr_value) + yield({:type => "ParseError", + :data => "invalid-browsing-context", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + + def check_lang_code(token, tag_name, attr_name, attr_value) + return if !attr_value || attr_value == '' # blank is OK + if not is_valid_lang_code(attr_value) + yield( {:type => "ParseError", + :data => "invalid-lang-code", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name, + "attributeValue" => attr_value}}) + end + end + + def check_mime_type(token, tag_name, attr_name, attr_value) + # XXX needs tests + if not attr_value + yield( {:type => "ParseError", + :data => "attribute-value-can-not-be-blank", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + if not is_valid_mime_type(attr_value) + yield( {:type => "ParseError", + :data => "invalid-mime-type", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name, + "attributeValue" => attr_value}}) + end + end + + def check_media_query(token, tag_name, attr_name, attr_value) + # XXX + end + + def check_link_relation(token, tag_name, attr_name, attr_value) + check_token_list(tag_name, attr_name, attr_value) do |t| + yield t + end + value_list = parse_token_list(attr_value) + allowed_values = tag_name == 'link' ? @@link_rel_values : @@a_rel_values + for current_value in value_list + if !allowed_values.include?(current_value) + yield({:type => "ParseError", + :data => "invalid-rel", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + end + end + + def check_date_time(token, tag_name, attr_name, attr_value) + # XXX + state = 'begin' # ('begin', '... +# for c in attr_value +# if state == 'begin' => +# if SPACE_CHARACTERS.include?(c) +# continue +# elsif digits.include?(c) +# state = ... + end + + ########################################################################## + # Attribute validation + ########################################################################## + + def check_attribute_values(token) + tag_name = token.fetch(:name, "") + for attr_name, attr_value in token.fetch(:data, []) + attr_name = attr_name.downcase + method = "validate_attribute_value_#{tag_name.to_s.underscore}_#{attr_name.to_s.underscore}" + if respond_to?(method) + send(method, token, tag_name, attr_name, attr_value) do |t| + yield t + end + else + method = "validate_attribute_value_#{attr_name.to_s.underscore}" + if respond_to?(method) + send(method, token, tag_name, attr_name, attr_value) do |t| + yield t + end + end + end + end + end + + def validate_attribute_value_class(token, tag_name, attr_name, attr_value) + check_token_list(tag_name, attr_name, attr_value) do |t| + yield t + yield( {:type => "ParseError", + :data => "invalid-attribute-value", + :datavars => {"tagName" => tag_name, + "attributeName" => attr_name}}) + end + end + + def validate_attribute_value_contenteditable(token, tag_name, attr_name, attr_value) + check_enumerated_value(token, tag_name, attr_name, attr_value, ['true', 'false', '']) do |t| + yield t + end + end + + def validate_attribute_value_dir(token, tag_name, attr_name, attr_value) + check_enumerated_value(token, tag_name, attr_name, attr_value, ['ltr', 'rtl']) do |t| + yield t + end + end + + def validate_attribute_value_draggable(token, tag_name, attr_name, attr_value) + check_enumerated_value(token, tag_name, attr_name, attr_value, ['true', 'false']) do |t| + yield t + end + end + + alias validate_attribute_value_irrelevant check_boolean + alias validate_attribute_value_lang check_lang_code + + def validate_attribute_value_contextmenu(token, tag_name, attr_name, attr_value) + check_id(token, tag_name, attr_name, attr_value) do |t| + yield t + end + @things_that_point_to_an_id << token + end + + def validate_attribute_value_id(token, tag_name, attr_name, attr_value) + # This method has side effects. It adds 'token' to the list of + # things that define an ID (@things_that_define_an_id) so that we can + # later check 1) whether an ID is duplicated, and 2) whether all the + # things that point to something else by ID (like