diff options
author | Wade Brainerd <wadetb@gmail.com> | 2008-05-23 23:01:10 (GMT) |
---|---|---|
committer | Wade Brainerd <wadetb@gmail.com> | 2008-05-23 23:01:10 (GMT) |
commit | c52d16375b2f2a8ce33a5e058085fcaf36d584dd (patch) | |
tree | 766b02240ba9527641baa87ab8737710920a7cae | |
parent | 9878512ab181ef56e82d91ed3e69ddbaa50520d0 (diff) |
Reorganization stpe 3.
-rw-r--r-- | js/instaview-0.6.1.js | 955 | ||||
-rw-r--r-- | js/instaview-0.6.4.js | 1379 | ||||
-rw-r--r-- | js/wiki2html.js | 86 | ||||
-rw-r--r-- | tools/get_images.py (renamed from woip/py/get_images.py) | 0 | ||||
-rw-r--r-- | woip/py/setup.py (renamed from woip/py/wp/setup.py) | 0 | ||||
-rw-r--r-- | woip/py/wp.i (renamed from woip/py/wp/wp.i) | 0 |
6 files changed, 0 insertions, 2420 deletions
diff --git a/js/instaview-0.6.1.js b/js/instaview-0.6.1.js deleted file mode 100644 index 2421d8f..0000000 --- a/js/instaview-0.6.1.js +++ /dev/null @@ -1,955 +0,0 @@ -function convert_wiki_to_html(wiki) -{ - return InstaView.convert(wiki); -} - -/* - * InstaView - a Mediawiki to HTML converter in JavaScript - * Version 0.6.1 - * Copyright (C) Pedro Fayolle 2005-2006 - * http://en.wikipedia.org/wiki/User:Pilaf - * Distributed under the BSD license - * - * Changelog: - * - * 0.6.1 - * - Fixed problem caused by \r characters - * - Improved inline formatting parser - * - * 0.6 - * - Changed name to InstaView - * - Some major code reorganizations and factored out some common functions - * - Handled conversion of relative links (i.e. [[/foo]]) - * - Fixed misrendering of adjacent definition list items - * - Fixed bug in table headings handling - * - Changed date format in signatures to reflect Mediawiki's - * - Fixed handling of [[:Image:...]] - * - Updated MD5 function (hopefully it will work with UTF-8) - * - Fixed bug in handling of links inside images - * - * To do: - * - Better support for <math> - * - Full support for <nowiki> - * - Parser-based (as opposed to RegExp-based) inline wikicode handling (make it one-pass and bullet-proof) - * - Support for templates (through AJAX) - * - Support for coloured links (AJAX) - */ - - -var InstaView = {} - -// options -InstaView.conf = -{ - user: {}, - - wiki: { - lang: 'es', - interwiki: 'ab|aa|af|ak|sq|als|am|ang|ar|an|arc|hy|roa-rup|as|ast|av|ay|az|bm|ba|eu|be|bn|bh|bi|bs|br|bg|my|ca|ch|ce|chr|chy|ny|zh|zh-tw|zh-cn|cho|cv|kw|co|cr|hr|cs|da|dv|nl|dz|en|eo|et|ee|fo|fj|fi|fr|fy|ff|gl|ka|de|got|el|kl|gn|gu|ht|ha|haw|he|hz|hi|ho|hu|is|io|ig|id|ia|ie|iu|ik|ga|it|ja|jv|kn|kr|csb|ks|kk|km|ki|rw|rn|tlh|kv|kg|ko|kj|ku|ky|lo|la|lv|li|ln|lt|jbo|nds|lg|lb|mk|mg|ms|ml|mt|gv|mi|minnan|mr|mh|zh-min-nan|mo|mn|mus|nah|na|nv|ne|se|no|nn|oc|or|om|pi|fa|pl|pt|pa|ps|qu|ro|rm|ru|sm|sg|sa|sc|gd|sr|sh|st|tn|sn|scn|simple|sd|si|sk|sl|so|st|es|su|sw|ss|sv|tl|ty|tg|ta|tt|te|th|bo|ti|tpi|to|tokipona|ts|tum|tr|tk|tw|uk|ur|ug|uz|ve|vi|vo|wa|cy|wo|xh|ii|yi|yo|za|zu', - default_thumb_width: 180 - }, - - paths: { - articles: '/wiki/', - math: '/math/', - images: '/images/', - images_fallback: 'http://upload.wikimedia.org/wikipedia/commons/', - magnify_icon: 'http://es.wikipedia.org/skins-1.5/common/images/magnify-clip.png' - }, - - locale: { - user: 'User', - image: 'Imagen', - category: 'Category', - months: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] - } -} - - -// get values from MediaWiki global variables (Cacycle) -if (typeof(wgArticlePath) != 'undefined') { InstaView.conf.paths.articles = wgArticlePath.replace(/\$1/, ''); } -if (typeof(wgContentLanguage) != 'undefined') { InstaView.conf.wiki.lang = wgContentLanguage; } - -// options with default values or backreferences -with (InstaView.conf) { - user.name = user.name || 'Wikipedian' - user.signature = '[['+locale.user+':'+user.name+'|'+user.name+']]' - paths.images = 'http://upload.wikimedia.org/wikipedia/' + wiki.lang + '/' -} - -// define constants -InstaView.BLOCK_IMAGE = new RegExp('^\\[\\['+InstaView.conf.locale.image+':.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)', 'i'); - -InstaView.dump = function(from, to) -{ - if (typeof from == 'string') from = document.getElementById(from) - if (typeof to == 'string') to = document.getElementById(to) - to.innerHTML = this.convert(from.value) -} - -InstaView.convert = function(wiki) -{ - var ll = (typeof wiki == 'string')? wiki.replace(/\r/g,'').split(/\n/): wiki, // lines of wikicode - o='', // output - p=0, // para flag - $r // result of passing a regexp to $() - - // some shorthands - function remain() { return ll.length } - function sh() { return ll.shift() } // shift - function ps(s) { o+=s } // push - - function f() // similar to C's printf, uses ? as placeholders, ?? to escape question marks - { - var i=1,a=arguments,f=a[0],o='',c,p - for (;i<a.length; i++) if ((p=f.indexOf('?'))+1) { - // allow character escaping - i -= c=f.charAt(p+1)=='?'?1:0 - o += f.substring(0,p)+(c?'?':a[i]) - f=f.substr(p+1+c) - } else break; - return o+f - } - - function html_entities(s) { return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">") } - - function max(a,b) { return (a>b)?a:b } - function min(a,b) { return (a<b)?a:b } - - // return the first non matching character position between two strings - function str_imatch(a, b) - { - for (var i=0, l=min(a.length, b.length); i<l; i++) if (a.charAt(i)!=b.charAt(i)) break - return i - } - - // compare current line against a string or regexp - // if passed a string it will compare only the first string.length characters - // if passed a regexp the result is stored in $r - function $(c) { return (typeof c == 'string') ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)) } - - function $$(c) { return ll[0]==c } // compare current line against a string - function _(p) { return ll[0].charAt(p) } // return char at pos p - - function endl(s) { ps(s); sh() } - - function parse_list() - { - var prev=''; - - while (remain() && $(/^([*#:;]+)(.*)$/)) { - - var l_match = $r - - sh() - - var ipos = str_imatch(prev, l_match[1]) - - // close uncontinued lists - for (var i=prev.length-1; i >= ipos; i--) { - - var pi = prev.charAt(i) - - if (pi=='*') ps('</ul>') - else if (pi=='#') ps('</ol>') - // close a dl only if the new item is not a dl item (:, ; or empty) - else switch (l_match[1].charAt(i)) { case'':case'*':case'#': ps('</dl>') } - } - - // open new lists - for (var i=ipos; i<l_match[1].length; i++) { - - var li = l_match[1].charAt(i) - - if (li=='*') ps('<ul>') - else if (li=='#') ps('<ol>') - // open a new dl only if the prev item is not a dl item (:, ; or empty) - else switch(prev.charAt(i)) { case'':case'*':case'#': ps('<dl>') } - } - - switch (l_match[1].charAt(l_match[1].length-1)) { - - case '*': case '#': - ps('<li>' + parse_inline_nowiki(l_match[2])); break - - case ';': - ps('<dt>') - - var dt_match - - // handle ;dt :dd format - if (dt_match = l_match[2].match(/(.*?) (:.*?)$/)) { - - ps(parse_inline_nowiki(dt_match[1])) - ll.unshift(dt_match[2]) - - } else ps(parse_inline_nowiki(l_match[2])) - - break - - case ':': - ps('<dd>' + parse_inline_nowiki(l_match[2])) - } - - prev=l_match[1] - } - - // close remaining lists - for (var i=prev.length-1; i>=0; i--) - ps(f('</?>', (prev.charAt(i)=='*')? 'ul': ((prev.charAt(i)=='#')? 'ol': 'dl'))) - } - - function parse_table() - { - endl(f('<table?>', $(/^\{\|( .*)$/)? $r[1]: '')) - - for (;remain();) if ($('|')) switch (_(1)) { - case '}': endl('</table>'); return - case '-': endl(f('<tr ?>', $(/\|-*(.*)/)[1])); break - default: parse_table_data() - } - else if ($('!')) parse_table_data() - else sh() - } - - function parse_table_data() - { - var td_line, match_i - - // 1: "|+", '|' or '+' - // 2: ?? - // 3: attributes ?? - // TODO: finish commenting this regexp - var td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/) - - if (td_match[1] == '|+') ps('<caption'); - else ps('<t' + ((td_match[1]=='|')?'d':'h')) - - if (typeof td_match[3] != 'undefined') { - - ps(' ' + td_match[3]) - match_i = 4 - - } else match_i = 2 - - ps('>') - - if (td_match[1] != '|+') { - - // use || or !! as a cell separator depending on context - // NOTE: when split() is passed a regexp make sure to use non-capturing brackets - td_line = td_match[match_i].split((td_match[1] == '|')? '||': /(?:\|\||!!)/) - - ps(parse_inline_nowiki(td_line.shift())) - - while (td_line.length) ll.unshift(td_match[1] + td_line.pop()) - - } else ps(td_match[match_i]) - - var tc = 0, td = [] - - for (;remain(); td.push(sh())) - if ($('|')) { - if (!tc) break // we're at the outer-most level (no nested tables), skip to td parse - else if (_(1)=='}') tc-- - } - else if (!tc && $('!')) break - else if ($('{|')) tc++ - - if (td.length) ps(InstaView.convert(td)) - } - - function parse_pre() - { - ps('<pre>') - do endl(parse_inline_nowiki(ll[0].substring(1)) + "\n"); while (remain() && $(' ')) - ps('</pre>') - } - - function parse_block_image() - { - ps(parse_image(sh())) - } - - function parse_image(str) - { - // get what's in between "[[Image:" and "]]" - var tag = str.substring(InstaView.conf.locale.image.length + 3, str.length - 2); - - var width; - var attr = [], filename, caption = ''; - var thumb=0, frame=0, center=0; - var align=''; - - if (tag.match(/\|/)) { - // manage nested links - var nesting = 0; - var last_attr = ''; - for (var i = tag.length-1; i > 0; i--) { - if (tag.charAt(i) == '|' && !nesting) { - last_attr = tag.substr(i+1); - tag = tag.substring(0, i); - break; - } else switch (tag.substr(i-1, 2)) { - case ']]': - nesting++; - i--; - break; - case '[[': - nesting--; - i--; - } - } - - attr = tag.split(/\s*\|\s*/); - attr.push(last_attr); - filename = attr.shift(); - - var w_match; - - for (;attr.length; attr.shift()) - if (w_match = attr[0].match(/^(\d*)px$/)) width = w_match[1] - else switch(attr[0]) { - case 'thumb': - case 'thumbnail': - thumb=true; - case 'frame': - frame=true; - break; - case 'none': - case 'right': - case 'left': - center=false; - align=attr[0]; - break; - case 'center': - center=true; - align='none'; - break; - default: - if (attr.length == 1) caption = attr[0]; - } - - } else filename = tag; - - - var o=''; - - if (frame) { - - if (align=='') align = 'right'; - - o += f("<div class='thumb t?'>", align); - - if (thumb) { - if (!width) width = InstaView.conf.wiki.default_thumb_width; - - o += f("<div style='width:?px;'>?", 2+width*1, make_image(filename, caption, width)) + - f("<div class='thumbcaption'><div class='magnify' style='float:right'><a href='?' class='internal' title='Enlarge'><img src='?'></a></div>?</div>", - InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename, - InstaView.conf.paths.magnify_icon, - parse_inline_nowiki(caption) - ) - } else { - o += '<div>' + make_image(filename, caption) + f("<div class='thumbcaption'>?</div>", parse_inline_nowiki(caption)) - } - - o += '</div></div>'; - - } else if (align != '') { - o += f("<div class='float?'><span>?</span></div>", align, make_image(filename, caption, width)); - } else { - return make_image(filename, caption, width); - } - - return center? f("<div class='center'>?</div>", o): o; - } - - function parse_inline_nowiki(str) - { - var start, lastend=0 - var substart=0, nestlev=0, open, close, subloop; - var html=''; - - while (-1 != (start = str.indexOf('<nowiki>', substart))) { - html += parse_inline_wiki(str.substring(lastend, start)); - start += 8; - substart = start; - subloop = true; - do { - open = str.indexOf('<nowiki>', substart); - close = str.indexOf('</nowiki>', substart); - if (close<=open || open==-1) { - if (close==-1) { - return html + html_entities(str.substr(start)); - } - substart = close+9; - if (nestlev) { - nestlev--; - } else { - lastend = substart; - html += html_entities(str.substring(start, lastend-9)); - subloop = false; - } - } else { - substart = open+8; - nestlev++; - } - } while (subloop) - } - - return html + parse_inline_wiki(str.substr(lastend)); - } - - function make_image(filename, caption, width) - { - // uppercase first letter in file name - filename = filename.charAt(0).toUpperCase() + filename.substr(1); - // replace spaces with underscores - filename = filename.replace(/ /g, '_'); - - caption = strip_inline_wiki(caption); - - var md5 = hex_md5(filename); - - var source = md5.charAt(0) + '/' + md5.substr(0,2) + '/' + filename; - - if (width) width = "width='" + width + "px'"; - - var img = f("<img onerror=\"this.onerror=null;this.src='?'\" src='?' ? ?>", InstaView.conf.paths.images_fallback + source, InstaView.conf.paths.images + source, (caption!='')? "alt='" + caption + "'" : '', width); - - return f("<a class='image' ? href='?'>?</a>", (caption!='')? "title='" + caption + "'" : '', InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename, img); - } - - function parse_inline_images(str) - { - var start, substart=0, nestlev=0; - var loop, close, open, wiki, html; - - while (-1 != (start=str.indexOf('[[', substart))) { - if(str.substr(start+2).match(RegExp('^' + InstaView.conf.locale.image + ':','i'))) { - loop=true; - substart=start; - do { - substart+=2; - close=str.indexOf(']]',substart); - open=str.indexOf('[[',substart); - if (close<=open||open==-1) { - if (close==-1) return str; - substart=close; - if (nestlev) { - nestlev--; - } else { - wiki=str.substring(start,close+2); - html=parse_image(wiki); - str=str.replace(wiki,html); - substart=start+html.length; - loop=false; - } - } else { - substart=open; - nestlev++; - } - } while (loop) - - } else break; - } - - return str; - } - - // the output of this function doesn't respect the FILO structure of HTML - // but since most browsers can handle it I'll save myself the hassle - function parse_inline_formatting(str) - { - var em,st,i,li,o=''; - while ((i=str.indexOf("''",li))+1) { - o += str.substring(li,i); - li=i+2; - if (str.charAt(i+2)=="'") { - li++; - st=!st; - o+=st?'<strong>':'</strong>'; - } else { - em=!em; - o+=em?'<em>':'</em>'; - } - } - return o+str.substr(li); - } - - function parse_inline_wiki(str) - { - var aux_match; - - str = parse_inline_images(str); - str = parse_inline_formatting(str); - - // math - while (aux_match = str.match(/<(?:)math>(.*?)<\/math>/i)) { - var math_md5 = hex_md5(aux_match[1]); - str = str.replace(aux_match[0], f("<img src='?.png'>", InstaView.conf.paths.math+math_md5)); - } - - // Build a Mediawiki-formatted date string - var date = new Date; - var minutes = date.getUTCMinutes(); - if (minutes < 10) minutes = '0' + minutes; - var date = f("?:?, ? ? ? (UTC)", date.getUTCHours(), minutes, date.getUTCDate(), InstaView.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear()); - - // text formatting - return str. - // signatures - replace(/~{5}(?!~)/g, date). - replace(/~{4}(?!~)/g, InstaView.conf.user.name+' '+date). - replace(/~{3}(?!~)/g, InstaView.conf.user.name). - - // [[:Category:...]], [[:Image:...]], etc... - replace(RegExp('\\[\\[:((?:'+InstaView.conf.locale.category+'|'+InstaView.conf.locale.image+'|'+InstaView.conf.wiki.interwiki+'):.*?)\\]\\]','gi'), "<a href='"+InstaView.conf.paths.articles+"$1'>$1</a>"). - replace(RegExp('\\[\\[(?:'+InstaView.conf.locale.category+'|'+InstaView.conf.wiki.interwiki+'):.*?\\]\\]','gi'),''). - - // [[/Relative links]] - replace(/\[\[(\/[^|]*?)\]\]/g, f("<a href='?$1'>$1</a>", location)). - - // [[/Replaced|Relative links]] - replace(/\[\[(\/.*?)\|(.+?)\]\]/g, f("<a href='?$1'>$2</a>", location)). - - // [[Common links]] - replace(/\[\[([^|]*?)\]\](\w*)/g, f("<a href='?$1'>$1$2</a>", InstaView.conf.paths.articles)). - - // [[Replaced|Links]] - replace(/\[\[(.*?)\|([^\]]+?)\]\](\w*)/g, f("<a href='?$1'>$2$3</a>", InstaView.conf.paths.articles)). - - // [[Stripped:Namespace|Namespace]] - replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, f("<a href='?$1$2$3'>$2</a>", InstaView.conf.paths.articles)). - - // External links - replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, "<a href='$1:$2$3'>$4</a>"). - replace(/\[http:\/\/(.*?)\]/g, "<a href='http://$1'>[#]</a>"). - replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, "<a href='$1:$2$3'>$1:$2$3</a>"). - replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*)/g, "$1<a href='$2:$3$4'>$2:$3$4</a>"). - - replace('__NOTOC__',''). - replace('__NOEDITSECTION__',''); - } - - function strip_inline_wiki(str) - { - return str - .replace(/\[\[[^\]]*\|(.*?)\]\]/g,'$1') - .replace(/\[\[(.*?)\]\]/g,'$1') - .replace(/''(.*?)''/g,'$1'); - } - - // begin parsing - for (;remain();) if ($(/^(={1,6})(.*)\1(.*)$/)) { - p=0 - endl(f('<h?>?</h?>?', $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3])) - - } else if ($(/^[*#:;]/)) { - p=0 - parse_list() - - } else if ($(' ')) { - p=0 - parse_pre() - - } else if ($('{|')) { - p=0 - parse_table() - - } else if ($(/^----+$/)) { - p=0 - endl('<hr>') - - } else if ($(InstaView.BLOCK_IMAGE)) { - p=0 - parse_block_image() - - } else { - - // handle paragraphs - if ($$('')) { - if (p = (remain()>1 && ll[1]==(''))) endl('<p><br>') - } else { - if(!p) { - ps('<p>') - p=1 - } - ps(parse_inline_nowiki(ll[0]) + ' ') - } - - sh(); - } - - return o -} - - -/* - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ - -/* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ -var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ -var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ - -/* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ -function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); } -function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); } -function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); } -function hex_hmac_md5(k, d) - { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } -function b64_hmac_md5(k, d) - { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } -function any_hmac_md5(k, d, e) - { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); } - -/* - * Calculate the MD5 of a raw string - */ -function rstr_md5(s) -{ - return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); -} - -/* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ -function rstr_hmac_md5(key, data) -{ - var bkey = rstr2binl(key); - if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8); - - var ipad = Array(16), opad = Array(16); - for(var i = 0; i < 16; i++) - { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); -} - -/* - * Convert a raw string to a hex string - */ -function rstr2hex(input) -{ - var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var output = ""; - var x; - for(var i = 0; i < input.length; i++) - { - x = input.charCodeAt(i); - output += hex_tab.charAt((x >>> 4) & 0x0F) - + hex_tab.charAt( x & 0x0F); - } - return output; -} - -/* - * Convert a raw string to a base-64 string - */ -function rstr2b64(input) -{ - var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var output = ""; - var len = input.length; - for(var i = 0; i < len; i += 3) - { - var triplet = (input.charCodeAt(i) << 16) - | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0) - | (i + 2 < len ? input.charCodeAt(i+2) : 0); - for(var j = 0; j < 4; j++) - { - if(i * 8 + j * 6 > input.length * 8) output += b64pad; - else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); - } - } - return output; -} - -/* - * Convert a raw string to an arbitrary string encoding - */ -function rstr2any(input, encoding) -{ - var divisor = encoding.length; - var remainders = Array(); - var i, q, x, quotient; - - /* Convert to an array of 16-bit big-endian values, forming the dividend */ - var dividend = Array(input.length / 2); - for(i = 0; i < dividend.length; i++) - { - dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); - } - - /* - * Repeatedly perform a long division. The binary array forms the dividend, - * the length of the encoding is the divisor. Once computed, the quotient - * forms the dividend for the next step. We stop when the dividend is zero. - * All remainders are stored for later use. - */ - while(dividend.length > 0) - { - quotient = Array(); - x = 0; - for(i = 0; i < dividend.length; i++) - { - x = (x << 16) + dividend[i]; - q = Math.floor(x / divisor); - x -= q * divisor; - if(quotient.length > 0 || q > 0) - quotient[quotient.length] = q; - } - remainders[remainders.length] = x; - dividend = quotient; - } - - /* Convert the remainders to the output string */ - var output = ""; - for(i = remainders.length - 1; i >= 0; i--) - output += encoding.charAt(remainders[i]); - - return output; -} - -/* - * Encode a string as utf-8. - * For efficiency, this assumes the input is valid utf-16. - */ -function str2rstr_utf8(input) -{ - var output = ""; - var i = -1; - var x, y; - - while(++i < input.length) - { - /* Decode utf-16 surrogate pairs */ - x = input.charCodeAt(i); - y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; - if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) - { - x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); - i++; - } - - /* Encode output as utf-8 */ - if(x <= 0x7F) - output += String.fromCharCode(x); - else if(x <= 0x7FF) - output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), - 0x80 | ( x & 0x3F)); - else if(x <= 0xFFFF) - output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - else if(x <= 0x1FFFFF) - output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), - 0x80 | ((x >>> 12) & 0x3F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - } - return output; -} - -/* - * Encode a string as utf-16 - */ -function str2rstr_utf16le(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode( input.charCodeAt(i) & 0xFF, - (input.charCodeAt(i) >>> 8) & 0xFF); - return output; -} - -function str2rstr_utf16be(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, - input.charCodeAt(i) & 0xFF); - return output; -} - -/* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ -function rstr2binl(input) -{ - var output = Array(input.length >> 2); - for(var i = 0; i < output.length; i++) - output[i] = 0; - for(var i = 0; i < input.length * 8; i += 8) - output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32); - return output; -} - -/* - * Convert an array of little-endian words to a string - */ -function binl2rstr(input) -{ - var output = ""; - for(var i = 0; i < input.length * 32; i += 8) - output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF); - return output; -} - -/* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ -function binl_md5(x, len) -{ - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for(var i = 0; i < x.length; i += 16) - { - var olda = a; - var oldb = b; - var oldc = c; - var oldd = d; - - a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); - d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); - c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); - b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); - a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); - d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); - c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); - b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); - a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); - d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); - c = md5_ff(c, d, a, b, x[i+10], 17, -42063); - b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); - a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); - d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); - c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); - b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); - - a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); - d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); - c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); - b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); - a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); - d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); - c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); - b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); - a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); - d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); - c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); - b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); - a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); - d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); - c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); - b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); - - a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); - d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); - c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); - b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); - a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); - d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); - c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); - b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); - a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); - d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); - c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); - b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); - a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); - d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); - c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); - b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); - - a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); - d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); - c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); - b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); - a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); - d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); - c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); - b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); - a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); - d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); - c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); - b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); - a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); - d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); - c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); - b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - } - return Array(a, b, c, d); -} - -/* - * These functions implement the four basic operations the algorithm uses. - */ -function md5_cmn(q, a, b, x, s, t) -{ - return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); -} -function md5_ff(a, b, c, d, x, s, t) -{ - return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); -} -function md5_gg(a, b, c, d, x, s, t) -{ - return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); -} -function md5_hh(a, b, c, d, x, s, t) -{ - return md5_cmn(b ^ c ^ d, a, b, x, s, t); -} -function md5_ii(a, b, c, d, x, s, t) -{ - return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); -} - -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ -function safe_add(x, y) -{ - var lsw = (x & 0xFFFF) + (y & 0xFFFF); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); -} - -/* - * Bitwise rotate a 32-bit number to the left. - */ -function bit_rol(num, cnt) -{ - return (num << cnt) | (num >>> (32 - cnt)); -} diff --git a/js/instaview-0.6.4.js b/js/instaview-0.6.4.js deleted file mode 100644 index af45ce2..0000000 --- a/js/instaview-0.6.4.js +++ /dev/null @@ -1,1379 +0,0 @@ -function convert_wiki_to_html(wiki) -{ - return InstaView.convert(wiki); -} - -var InstaView = {} - -// options -InstaView.conf = -{ - user: {}, - - wiki: { - lang: 'es', - interwiki: 'ab|aa|af|ak|sq|als|am|ang|ar|an|arc|hy|roa-rup|as|ast|av|ay|az|bm|ba|eu|be|bn|bh|bi|bs|br|bg|my|ca|ch|ce|chr|chy|ny|zh|zh-tw|zh-cn|cho|cv|kw|co|cr|hr|cs|da|dv|nl|dz|en|eo|et|ee|fo|fj|fi|fr|fy|ff|gl|ka|de|got|el|kl|gn|gu|ht|ha|haw|he|hz|hi|ho|hu|is|io|ig|id|ia|ie|iu|ik|ga|it|ja|jv|kn|kr|csb|ks|kk|km|ki|rw|rn|tlh|kv|kg|ko|kj|ku|ky|lo|la|lv|li|ln|lt|jbo|nds|lg|lb|mk|mg|ms|ml|mt|gv|mi|minnan|mr|mh|zh-min-nan|mo|mn|mus|nah|na|nv|ne|se|no|nn|oc|or|om|pi|fa|pl|pt|pa|ps|qu|ro|rm|ru|sm|sg|sa|sc|gd|sr|sh|st|tn|sn|scn|simple|sd|si|sk|sl|so|st|es|su|sw|ss|sv|tl|ty|tg|ta|tt|te|th|bo|ti|tpi|to|tokipona|ts|tum|tr|tk|tw|uk|ur|ug|uz|ve|vi|vo|wa|cy|wo|xh|ii|yi|yo|za|zu', - default_thumb_width: 180 - }, - - paths: { - articles: '/wiki/', - math: '/math/', - images: '/images/', - images_fallback: 'http://upload.wikimedia.org/wikipedia/commons/', - magnify_icon: 'http://es.wikipedia.org/skins-1.5/common/images/magnify-clip.png' - }, - - locale: { - user: 'User', - image: 'Imagen', - category: 'Category', - months: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] - } -} - -// options with default values or backreferences -with (InstaView.conf) { - user.name = user.name || 'Wikipedian' - user.signature = '[['+locale.user+':'+user.name+'|'+user.name+']]' - paths.images = '/images/' -} -//reset internal counters - -// pregormated text token -InstaView.inPre = false; - -// the level of nowiki nesting -InstaView.nestlev = 0; - -// define constants -// Maximum number of includes -/**///InstaView.IncNum = 0; - - -// new line token -// One of the folowing strings (or combinaton): -// '\n' | '<br style="display:none;"/>' | '<br class="hidden"/>' | '' -InstaView.br = '\n'; - -//Regular Expression for wiki images processing -InstaView.BLOCK_IMAGE = new RegExp('^\\[\\[Image:|'+InstaView.conf.locale.image+':.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)', 'i'); - -InstaView.el = function(aID) -{ - return (typeof(aID) != 'string') ? aID : (document.getElementById) ? document.getElementById(aID) - : (document.layers) ? document.layers[aID] : document.all[aID]; -} - - -InstaView.dump = function(from, to) -{ - this.el(to).innerHTML = this.convert( this.el(from).value ) -} - -InstaView.convert = function(wiki) -{ - var ll = (typeof wiki == 'string')? wiki.replace(/\r/g,'').split(/\n/): wiki, // lines of wikicode - o='', // output - p=0, // para flag - $r // result of passing a regexp to $() - - // some shorthands - function remain() { return ll.length } - function sh() { return ll.shift() } // shift - function ps(s) { o+=s } // push - - function f() // similar to C's printf, uses ? as placeholders, ?? to escape question marks - { - var i=1,a=arguments,f=a[0],o='',c,p - for (;i<a.length; i++) if ((p=f.indexOf('?'))+1) { - // allow character escaping - i -= c=f.charAt(p+1)=='?'?1:0 - o += f.substring(0,p)+(c?'?':a[i]) - f=f.substr(p+1+c) - } else break; - return o+f - } - - function html_entities(s) { - // alert("html: "+s+" "+ s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")); - return s.replace(/&/g,"&").replace(/</g,"<").replace(/\"/g,""").replace(/>/g,">") - } - - function max(a,b) { return (a>b)?a:b } - function min(a,b) { return (a<b)?a:b } - - // return the first non matching character position between two strings - function str_imatch(a, b) - { - for (var i=0, l=min(a.length, b.length); i<l; i++) if (a.charAt(i)!=b.charAt(i)) break - return i - } - - // compare current line against a string or regexp - // if passed a string it will compare only the first string.length characters - // if passed a regexp the result is stored in $r - function $(c) { return (typeof c == 'string') ? (ll[0].substr(0,c.length)==c) : ($r = ll[0].match(c)) } - - function $$(c) { return ll[0]==c } // compare current line against a string - function _(p) { return ll[0].charAt(p) } // return char at pos p - - //function endl(s) { ps(s); sh() } - /**/function endl(s) { ps(s+InstaView.br); sh() } - /**/function endP() { /*alert(o);*/ if (p) { p=0; ps('</p>') } return !p; } - /**/function trim(s) { return s.replace(/^\s*(.*)\s*$/, '$1') ; } - /**/function ltrim() { - if (!remain()) return; - var str = ll[0]; - //alert('str = "' + str + '"'); - ll[0] = str.replace(/^\s*(.*)$/, '$1') ; - //alert('ll[0] = "' + ll[0] + '"'); - str = str.replace(/^(\s*)(.*)$/, '$1') ; - ps (str); - //alert('str = "' + str + '"'); - } - - // Delete 1-st empty line. (like MW does - propose to delete ALL empty lines - while not if) - /**/ while ($$('')) sh(); - - function parse_nowiki () - { - var start=0, open=0, close=0; - - while ( InstaView.nestlev || ( remain() && /<nowiki>/i . test( ll[0].substring( start ) ) ) ) { - - open = ll[0] . toLowerCase(). indexOf( '<nowiki>' , start); - close = ll[0]. toLowerCase(). indexOf( '</'+'nowiki>', start); - - // if < nowiki > tag is opened and < / nowiki > closing tag stands before the next < nowiki > (if it exists...) - if (InstaView.nestlev && (close < open || ( open == -1 && close >= 0 ) ) ) { - - // extract the substring from the current line - // (the text between the starting point and closing tag), - // replace '<', '>' and '&' with their html entities - // and push the result to output - ps( html_entities( ll[0] . substring(start, close) ) ); - - // close opened span indicating the borders of each nowiki container - ps( '</span class="nowiki_' + InstaView.nestlev-- + '">' ); - - // and shift the starting point to 9 simbols after closing tag position - start = close + 9; - - // if < nowiki > was found on the line - } else if (open >= 0) { - - // select text before the opening nowiki tag - var before = ll[0] . substring( start, open ); - - // if inside the multiline nowiki replace special html symbols (<, >, &) - // before the opening tag with their html entities otherwise paste the text as it is - // and push the result to output - ps( (InstaView.nestlev) ? html_entities(before) : before ); - - // anyway - create new span indicating the borders of each nowiki container - ps( '<span class="nowiki_' + ++InstaView.nestlev + '">' ); - - // if there are no closing < / nowiki > tags... - if (close == -1) { - - // extract the substring from the current line (the text after the opening tag), - // replace special html symbols after the opening tag with their html entities - // and push the result to output - endl( html_entities( ll[0] . substring(open + 8) ) ); - - // reset the starting point - start=0; - - - // if closing tag stands after the opening ( .. < nowiki > .. < / nowiki > .. ) - } else if ( close > open) { - - // replace special html symbols between the nowiki tags with their html entities - ps( html_entities( ll[0] . substring(open + 8, close) ) ); - - // close opened span indicating the borders of each nowiki container - ps( '</span class="nowiki_' + InstaView.nestlev-- + '">' ); - - - // and shift the starting point to 9 simbols after closing tag position - start = close + 9; - - } - } - - //alert('Current line:\n' + ll[0] + - // '\n InstaView.nestlev = ' + InstaView.nestlev + '\n open = ' + open + '\n close = ' + close ); - - var after = ll[0] . substring( start ); - - // if the line doesn't contain's nowiki tags... - if ( !/<\/?nowiki>/i . test( after ) ) { - - - // if inside the multiline nowiki replace special html symbols (<, >, &) - // before the opening tag with their html entities otherwise paste the text as it is; - // then push the result to output and shift the array of lines - - endl( (InstaView.nestlev) ? html_entities(after) : after ); - } - } - //alert('nowiki ended:\n' + o); - } - - function parse_pre () - { - - function doInPre( $0, $1, $2, $3) - { - //alert(o); - //alert($0+" : "+$1+" : "+$2+" : "+$3); - - if ($2 == '<pre>') { - //var closeindex = $3. toLowerCase(). indexOf( '</'+'pre>', 0); - //var preclose = $3.substring(0,closeindex); - // var close = $3.substring(closeindex); - return $1 + $2 + html_entities($3); - } - return html_entities($1) + $2 + $3; - } - - if ( !remain() ) return; - - if ( ll[0].match('<pre>') && !InstaView.inPre ) { - // alert("one:"+ll[0]); - InstaView.inPre = true; - endl( ll[0].replace(/(.*?)(<pre>)[*</pre>]+/i, doInPre) ); - - } - - while ( InstaView.inPre ) { - - parse_nowiki(); - if ( !remain() ) return; - // alert(o); - if ( !ll[0].match('</'+'pre>') ) endl( html_entities(ll[0]) ); - - else { - // alert("two:"+ll[0]); - InstaView.inPre = false; - endl( ll[0].replace(/(.*?)(<\/pre>)[*<pre>]+/i, doInPre) ); - - } - } - //alert('preformatted line passed:\n' + o); - - } - /* - function dont_parse() - { - - var openmatch = '(<html|<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<p|<ul|<ol|<li' + - //.'|<\\/center|<tr|<\\/tr|<\\/td|<\\/th'+ - ')'; - var closematch = '(<\\/html|<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' + - //.'<td|<th|<div|<\\/div|<hr|<\\/pre|<center|' + - '<\\/p|<\\/li|<\\/ul|<\\/ol); - var patterns = [openmatch, closematch] - - if (!remain()) return true; - - //alert(' Open Match: ' + openmatch.test(ll[0]) + '\n Close Match: ' + closematch.test(ll[0]) ) - - op_part = RegExp( '^\\s*' + openmatch + '.*$', 'i' ); - cl_pat = RegExp( '^.*' + closematch + '\\s*$', 'i' ); - - if ( $(op_pat) ) { - - //if (InstaView.BlockEl) ps('</'+'pre>'); - ps('<pre>'); - InstaView.BlockEl = true; - - ltrim(); - //alert('Trimed line with html tag(s):\n' + ll[0]) - - endl(ll[0]); - - return true; - } - - if ( $(cl_pat) ) { - - if (InstaView.BlockEl) ps('</'+'pre>'); - InstaView.BlockEl = false; - - ltrim(); - //alert('Trimed line with html tag(s):\n' + ll[0]) - - endl(ll[0]); - - return true; - } - - - if ( $(/^\s*\{\|/) ) { - - if (this.inPre) ps('</'+'pre>'); - InstaView.BlockEl = false; - - parse_table(); - - return true; - } - return false; - - } - */ - function parse_list() - { - - var prev=''; - var DtOpen = false; - - function next(char) - { - - switch (char) { - - case '*': case '#': - ps('</li><li>'); - //alert('Countinue "ol" or "ul"') - break; - - case ';': - ps( (DtOpen)?'</dt>':'</dd>' + '<dt>' ); - //alert('Countinue "dl" - dt') - break - - case ':': - ps( (DtOpen)?'</dt>':'</dd>' + '<dd>' ); - //alert('Countinue "dl" - dd') - DtOpen = false; - } - } - - function close(pi) - { - //alert("pi is: "+pi); - if (pi=='*') { - ps('</li></ul>'); - //alert('Close "ul"') - } - - else if (pi=='#') { - ps('</li></ol>'); - //alert('Close "ol"') - } - - // close a dl only if the new item is not a dl item (:, ; or empty) - else switch (l_match[1].charAt(i)) { - - case'':case'*':case'#': - - ps( (DtOpen)?'</dt>':'</dd>' + '</dl>' ); - //alert('Close "dl"'); - DtOpen = false; - - } //switch - - // print the line-break after each list's closing tag (if the line isn't last) - //if (remain()>1) - //alert('Close list at: '+ll[0]); - ps(InstaView.br); - - // return t; - - } - - function open(li) - { - - if (li=='*') { - ps('<ul><li>'); - //alert('Start "ul"') - } - - else if (li=='#') { - ps('<ol><li>'); - //alert('Start "ol"') - } - - // do wee need the coparison at all? it don't work... (imho) - else switch(prev.charAt(i)) { - - case'':case'*':case'#': - - // open a new dl only if it is needed for nesting: - // don't add <dl> if the previous and the current - // char are equal to ';' at the same time - - if ( (l_match[1].charAt(i-1) != ';') || (l_match[1].charAt(i) != ';') ) { - ps('<dl>'); - //alert('Start "dl"') - if (li==':') ps('<dd>'); - else { - ps('<dt>'); - DtOpen = true; - } //else - - } // if - - } //else - } - - while (remain() && $(/^([*#:;]+)(.*)$/)) { - - var l_match = $r - - sh() - - var ipos = str_imatch(prev, l_match[1]) - - // continue opened lists - //if ( prev == l_match[1] ) next(l_match[1].charAt(l_match[1].length-1)) - - //else if ( l_match[1].length || prev.length ) { - // alert("we are: " + prev.length+prev+ipos+prev.charAt(0)+ o); - // close uncontinued lists - for (var i=prev.length-1; i >= ipos && prev.length != 0 ; i--) { - // alert("closing: " + prev.charAt(i-1)); - close(prev.charAt(i)); - } - // open new lists - for (var i=ipos; i<l_match[1].length; i++) open(l_match[1].charAt(i)); - - // continue unclosed lists %) - if ( l_match[1].length <= ipos && ipos > 0 ) { - // alert('Continue list: '+ l_match[1][ipos-1] + - // ',\n cause the current prefix is shorter then previous') - // alert("matching: "+ipos+l_match[1]); - next( l_match[1].charAt(ipos-1) ); - } - - // process the remaining wikitext - prev=l_match[1] - //alert("prev is: " + prev+ipos); - // Nested DL's solution - see bug #6569 [http://bugzilla.wikimedia.org/show_bug.cgi?id=6569] - // ps( l_match[1].replace(/^.*?[;:]([;:]*)$/g, '$1') ) - - var dt_match - - var pr_char = prev.charAt(prev.length-1) - - // handle ;dt :dd format - if ( (pr_char == ';') && (dt_match = l_match[2].match(/(.*?) (:.*?)$/) ) ) { - - ps(parse_inline_wiki(dt_match[1])) - //alert(dt_match[1]) - ll.unshift(dt_match[2]) - - } else { - - ps(parse_inline_wiki(l_match[2])); - //alert(l_match[2]) - } - - // print the line-break - ps(InstaView.br); - - - //} // else if - - } // while - - // alert(prev+', '+ipos+o) - for (var i=prev.length-1; i >= ipos-1 && prev.length != 0 && i >= 0; i--) { - // alert("i is: "+i); - // alert('lists processed:\n' + o) ; - close(prev.charAt(i)) ; - // alert('lists processed:\n' + o) - // alert('open:\n' + close(prev.charAt(i))); - } -// alert('lists processed:\n'+prev+ipos + o) - } //function - - function parse_table() - { - ltrim(); - //alert('ll[0] = "' + ll[0] + '"'); - /**/endl(f('<table?>', $(/^\s*\{\|( .*)$/)? $r[1] : '' )); - //ps(f('<table?>', $(/^\{\|( .*)$/)? $r[1]: '')); - //sh(); - - while (remain()) { - - ltrim(); - //alert('ll[0] = "' + ll[0] + '"'); - - if ($('|')) switch (_(1)) { - - // close table and parse inline wiki after it - case '}': endl('</table>' + parse_inline_wiki(ll[0].substr(ll[0].indexOf('}')+1))); return - case '-': endl(f('<tr ?>', $(/\|-*(.*)/)[1])); break - default: parse_table_data() - } else if ($('!')) parse_table_data() - //else sh(); - // add new line token and shift the array of lines - /**/else endl('') - } - - } - - function parse_table_data() - { - var td_line, match_i - - // 1: "|+", '|' or '!' - // 2: Full string: - // all the chars before the "|" and "[" but not "||" if such pattern exists in the string ; and any way - the rest of the line - - // (?: .. ) and (?! .. ) doesn't save the matches. So they aren't counted. - // The first matches for pattern agter the colon but not saves it. - // The second matches ig the pattern given after ! doesn't match the string. - // So: - // (?: .. )?(.*)$ - if the line before the '|' exists (see #3) return "substring"+"the_rest_of_the_line" ; otherwise return "the rest of the line" only - // (?!\|) - not a "|" - - // 3: attribute - any minimal (maybe even 0-length) number of occurances of neither "[" nor "|" characters - // 4: The rest of the line - can be less that #2 - any chars till the end of the line - - var td_match = sh().match(/^\s*(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/) - ltrim(); - //alert('td_match =\n' + td_match); - if (td_match[1] == '|+') ps('<caption'); - else ps('<t' + ((td_match[1]=='|')?'d':'h')) - - // the was some attribute - if (typeof td_match[3] != 'undefined') { - - ps(' ' + td_match[3]) - match_i = 4 - - } else match_i = 2 - - /**/ps('>') - //ps('>' + InstaView.br) - - if (td_match[1] != '|+') { - - // use || or !! as a cell separator depending on context - // NOTE: when split() is passed a regexp make sure to use non-capturing brackets - td_line = td_match[match_i].split((td_match[1] == '|')? '||': /(?:\|\||!!)/) - - ps(parse_inline_wiki(td_line.shift())) - - while (td_line.length) ll.unshift(td_match[1] + td_line.pop()) - - } else ps(td_match[match_i]) - - var tc = 0, td = [] - - while (remain()) { - if ($('|')) { - if (!tc) break // we're at the outer-most level (no nested tables), skip to td parse - else if (_(1)=='}') tc-- - } - else if (!tc && $('!')) break - else if ($('{|')) tc++ - - td.push(sh()); - ltrim(); - } - - if (td.length) ps(InstaView.convert(td)) - //add closing <td> or <th> and new line token - /**/ps('</t' + ((td_match[1]=='|')?'d':'h')+'>' + InstaView.br); - } - - function parse_sp_lines() - { - - //close paragraph if it was opened - /**/endP();//p=0 - ps('<pre>'); - - while (_(0)==' ' && remain()) { - - /*if ( !remain() || dont_parse() ) break; - - this.inPre = true; - */ - endl(parse_inline_wiki(ll[0].substring(1))); - - } - if (this.inPre) ps('</'+'pre>'); - - } - - function parse_block_image() - { - //ps(parse_image(sh())) - //add new line token - /**/ps(parse_image(sh()) + InstaView.br) - } - - function parse_image(str) - { - // get what's in between "[[Image:" and "]]" - var tag = str.substring(str.search(":") + 1, str.length - 2); - - var width; - var attr = [], filename, caption = ''; - var thumb=0, frame=0, center=0; - var align=''; - - if (tag.match(/\|/)) { - // manage nested links - var nesting = 0; - var last_attr; - for (var i = tag.length-1; i > 0; i--) { - if (tag.charAt(i) == '|' && !nesting) { - last_attr = tag.substr(i+1); - tag = tag.substring(0, i); - break; - } else switch (tag.substr(i-1, 2)) { - case ']]': - nesting++; - i--; - break; - case '[[': - nesting--; - i--; - } - } - - attr = tag.split(/\s*\|\s*/); - attr.push(last_attr); - filename = attr.shift(); - - var w_match; - - for (;attr.length; attr.shift()) - if (w_match = attr[0].match(/^(\d*)px$/)) width = w_match[1] - else switch(attr[0]) { - case 'thumb': - case 'thumbnail': - thumb=true; - case 'frame': - frame=true; - break; - case 'none': - case 'right': - case 'left': - center=false; - align=attr[0]; - break; - case 'center': - center=true; - align='none'; - break; - default: - if (attr.length == 1) caption = attr[0]; - } - - } else filename = tag; - - - var o=''; - - if (frame) { - - if (align=='') align = 'right'; - - o += f('<div class="thumb t?">', align); - - if (thumb) { - if (!width) width = InstaView.conf.wiki.default_thumb_width; - - o += f('<div style="width:?px;">?', 2+width*1, make_image(filename, caption, width)) + - f('<div class="thumbcaption"><div class="magnify" style="float:right"><a href="?" class="internal" title="Enlarge"><img src="?"></a></div>?</div>', - InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename, - InstaView.conf.paths.magnify_icon, - parse_inline_wiki(caption) - ) - } else { - o += '<div>' + make_image(filename, caption) + f('<div class="thumbcaption">?</div>', parse_inline_wiki(caption)) - } - - o += '</div></div>'; - - } else if (align != '') { - o += f('<div class="float?"><span>?</span></div>', align, make_image(filename, caption, width)); - } else { - return make_image(filename, caption, width); - } - //alert(width); - return center? f('<div class="center">?</div>', o): o; - } - - function make_image(filename, caption, width) - { - // uppercase first letter in file name - filename = filename.charAt(0).toUpperCase() + filename.substr(1); - // replace spaces with underscores - filename = filename.replace(/ /g, '_'); - - caption = strip_inline_wiki(caption); - - var md5 = hex_md5(filename); - - var source = md5.charAt(0) + '/' + md5.substr(0,2) + '/' + filename; - - width = (width) ? 'width="' + width + '"' : ''; - - var img = f('<img src="?" ? longdesc="?" ? onerror="this.onerror=null;this.src=\'?\'">', InstaView.conf.paths.images + source, (caption!='')? 'alt="' + caption + '"' : '', InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename, width, InstaView.conf.paths.images_fallback + source); - - return f('<a href="?" class="image" ?>?</a>', InstaView.conf.paths.articles + InstaView.conf.locale.image + ':' + filename, (caption!='')? 'title="' + caption + '"' : '', img); - } - - function parse_inline_images(str) - { - var start, substart=0, nestlev=0; - var loop, close, open, wiki, html; - - while (-1 != (start=str.indexOf('[[', substart))) { - if(str.substr(start+2).match(RegExp('^' + InstaView.conf.locale.image + ':','i'))) { - loop=true; - substart=start; - do { - substart+=2; - close=str.indexOf(']]',substart); - open=str.indexOf('[[',substart); - if (close<=open||open==-1) { - if (close==-1) return str; - substart=close; - if (nestlev) { - nestlev--; - } else { - wiki=str.substring(start,close+2); - html=parse_image(wiki); - str=str.replace(wiki,html); - substart=start+html.length; - loop=false; - } - } else { - substart=open; - nestlev++; - } - } while (loop) - - } else break; - } - - return str; - } - - // the output of this function doesn't respect the FILO structure of HTML - // but since most browsers can handle it I'll save myself the hassle - function parse_inline_formatting(str) - { - var em,st,i,li,o=''; - while ((i=str.indexOf("''",li))+1) { - o += str.substring(li,i); - li=i+2; - if (str.charAt(i+2)=="'") { - li++; - st=!st; - //o+=st?'<strong>':'</strong>'; - //MW uses <b> and <i> - /**/o+=st?'<b>':'</b>'; - - } else { - em=!em; - //o+=em?'<em>':'</em>'; - /**/o+=em?'<i>':'</i>'; - } - } - return o+str.substr(li); - } - - function parse_inline_wiki(str) - { - var aux_match; - - str = parse_inline_images(str); - str = parse_inline_formatting(str); - - // math - while (aux_match = str.match(/<(?:)math>(.*?)<\/math>/i)) { - var math_md5 = hex_md5(aux_match[1]); - str = str.replace(aux_match[0], f('<img src="?.png">', InstaView.conf.paths.math+math_md5)); - } - - // Build a Mediawiki-formatted date string - var date = new Date; - var minutes = date.getUTCMinutes(); - if (minutes < 10) minutes = '0' + minutes; - var date = f("?:?, ? ? ? (UTC)", date.getUTCHours(), minutes, date.getUTCDate(), InstaView.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear()); - - //alert('??????' + urlencode('??????') ); - - // text formatting - return str. - // signatures - replace(/~{5}(?!~)/g, date). - replace(/~{4}(?!~)/g, InstaView.conf.user.name+' '+date). - replace(/~{3}(?!~)/g, InstaView.conf.user.name). -/* -//********************************** - - // {{{ Variables }}} and {{{ Replaced | Variables }}} - replace(/\{\{\{(.*?)(?:\|(.*?))?\}\}\}/g, f('')). - // {{ (Striped:)? Templates (| with_args )? }} - replace(/\{\{([^\]]*?:)?(.*?)(?:\|(.*?))?\}\}/g, f('')). - -//********************************** - */ - // 2Do: Urlencode the article name in ''href'' attribute - // [[:Category:...]], [[:Image:...]], etc... - replace(RegExp('\\[\\[:((?:'+InstaView.conf.locale.category+'|'+InstaView.conf.locale.image+'|'+InstaView.conf.wiki.interwiki+'):.*?)\\]\\]','gi'), '<a href="'+InstaView.conf.paths.articles+'$1" title="$1">$1</a>'). - replace(RegExp('\\[\\[('+InstaView.conf.locale.category+'|'+InstaView.conf.wiki.interwiki+'):(.*?)\\]\\]','gi'), '<span dir="ltr" style="display:none"><a href="'+InstaView.conf.paths.articles+'$1:$2" title="$1:$2">$2</a></span>'). - - // [[/Relative links]] - replace(/\[\[(\/[^|]*?)\]\]/g, f('<a href="?$1" title="$1">$1</a>', location)). - - // [[/Replaced|Relative links]] - replace(/\[\[(\/.*?)\|(.+?)\]\]/g, f('<a href="?$1" title="$1">$2</a>', location)). - - // Bug: Non-english words are ignored due to \w - // Solved for cyrilic: \w -> [\w?-??] - // Bug: Upcase chars should be ignored, they dont - // Solved: \w - > [a-z] - - // [[Common links]]with_trail - replace(/\[\[([^|]*?)\]\]([a-z?-??]*)/g, f('<a href="?$1" title="$1">$1$2</a>', InstaView.conf.paths.articles)). - - // [[Replaced|Links]]with_trail - replace(/\[\[(.*?)\|([^\]]+?)\]\]([a-z?-??]*)/g, f('<a href="?$1" title="$1">$2$3</a>', InstaView.conf.paths.articles)). - - // [[Stripped:Namespace|]] - replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, f('<a href="?$1$2$3" title="$1$2$3">$2</a>', InstaView.conf.paths.articles)). - - // External links - replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, '<a href="$1:$2$3">$4</a>'). - replace(/\[http:\/\/(.*?)\]/g, '<a href="http://$1">[#]</a>'). - replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, '<a href="$1:$2$3">$1:$2$3</a>'). - replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*)/g, '$1<a href="$2:$3$4">$2:$3$4</a>'). - - replace('__NOTOC__',''). - replace('__NOEDITSECTION__',''); - } - - function strip_inline_wiki(str) - { - return str - .replace(/\[\[[^\]]*\|(.*?)\]\]/g,'$1') - .replace(/\[\[(.*?)\]\]/g,'$1') - .replace(/''(.*?)''/g,'$1'); - } - - // begin parsing - do { - - parse_nowiki(); - parse_pre(); - //dont_parse(); - - if (!remain()) break; - - //parse headings - if ($(/^(={1,6})(.*)\1(.*)$/)) { - //close paragraph if it was opened - /**/endP();//p=0 - endl(f('<h?>?</h?>?', $r[1].length, parse_inline_wiki($r[2]), $r[1].length, $r[3])) - - //alert('headings processed:\n' + o) - - //parse lists - } else if ($(/^[*#:;]/)) { - //close paragraph if it was opened - /**/endP();//p=0 - /**/ps(InstaView.br); - - parse_list() - - //alert('lists processed:\n' + o) - - //parse tables - } else if ($(/^(?:\s*)\{\|/)) { - //alert('ll[0] = "' + ll[0] + '"') - //close paragraph if it was opened - /**/endP();//p=0 - parse_table() - //alert('tables processed:\n' + o) - - //parse lines that start with space - } else if ( _(0) == ' ') { - parse_sp_lines() - //alert('spaced lines processed:\n' + o) - - //do the <hr> - } else if ($(/^----+$/)) { - //close paragraph if it was opened - /**/endP();//p=0 - endl('<hr>') - //alert('horizontal lines processed:\n' + o) - - //parse images - } else if ($(InstaView.BLOCK_IMAGE)) { - //close paragraph if it was opened - /**/endP();//p=0 - parse_block_image() - //alert('images processed:\n' + o) - - } else { - - //escape < /pre > tag cause there's no opening tag and it should be treaten as text - ll[0] = ll[0].replace( '</'+'pre>', '</pre>') - - - // handle paragraphs - if (trim(ll[0]) == '') { //blank line - //if (p = (remain()>1 && ll[1]==(''))) endl('<p><br>') - - //if para was opened - close it - //if 2 empty strings - add hard line break - - if ( endP() ) - if ( remain()>1 ){ - ps('<p>'); - p=1; - - /**/ if (trim(ll[1])==('') ) - /**/ {sh(); ps('<br>'); p=1} - } else break; - } else { - if(!p) { - ps('<p>') - p=1 - } - - if (remain()<2) { - //alert('The last line:' + ll[0]); - ps(parse_inline_wiki(ll[0])); - endP(); - break; - } else ps(parse_inline_wiki(ll[0])); - - //add new line token - //ps(parse_inline_wiki(ll[0]) + InstaView.br) - - //alert('Add inblockElem - in order to disable the creation of new paragraph' + - //'for such elements as:\n tables, headings, lists and so on.' ); - - } - - //alert('paragraphs processed:\n' + o) - - //sh(); - //add new line token and shift the array of lines - /**/endl(''); - } - } while (remain()) - //add closing </tr> - /**/o = o.replace(/(<\/t[dh]>\s*)(<tr (.*)>|<\/table>)/gim, '$1</tr>'+ InstaView.br +'$2') - /**/.replace(/<tr >/gim, '<tr>') - - //escape closing < / nowiki > tags - /**/.replace(/<\/nowiki>/i, '</nowiki>'); - - CatLinks = o.match(/<span dir="ltr" style="display:none">(.*?)<\/span>/gim); - - if (CatLinks) - { - o += '<div id="catlinks"><p class="catlinks">'; - for (i in CatLinks) - { - alert(CatLinks[i]); - o += CatLinks[i].replace(' style="display:none"', ''); - if ( i != CatLinks.length-1 ) { alert(i); alert(CatLinks.length-1); o += ' | ';} - } - o += '</p></div>'; - } - - - /*// - maybe faster, but don't work :(((. - ShortExtLinks = o.match('[#]'); - - for (i in ShortExtLinks) - { - alert(ShortExtLinks[i] + ' ' + i); - o.replace(/\[#\]/m, '[' + i + ']'); - } - */ - i=0; - while ( /\[#\]/m.test(o) ) o=o.replace(/\[#\]/m, '[' + ++i + ']'); - - - //alert('"'+o+'"'); - return o -} - -// -/* - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ - -/* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ -var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ -var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ - -/* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ -function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); } -function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); } -function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); } -function hex_hmac_md5(k, d) - { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } -function b64_hmac_md5(k, d) - { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } -function any_hmac_md5(k, d, e) - { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); } - -/* - * Calculate the MD5 of a raw string - */ -function rstr_md5(s) -{ - return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); -} - -/* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ -function rstr_hmac_md5(key, data) -{ - var bkey = rstr2binl(key); - if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8); - - var ipad = Array(16), opad = Array(16); - for(var i = 0; i < 16; i++) - { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); -} - -/* - * Convert a raw string to a hex string - */ -function rstr2hex(input) -{ - var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var output = ""; - var x; - for(var i = 0; i < input.length; i++) - { - x = input.charCodeAt(i); - output += hex_tab.charAt((x >>> 4) & 0x0F) - + hex_tab.charAt( x & 0x0F); - } - return output; -} - -/* - * Convert a raw string to a base-64 string - */ -function rstr2b64(input) -{ - var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var output = ""; - var len = input.length; - for(var i = 0; i < len; i += 3) - { - var triplet = (input.charCodeAt(i) << 16) - | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0) - | (i + 2 < len ? input.charCodeAt(i+2) : 0); - for(var j = 0; j < 4; j++) - { - if(i * 8 + j * 6 > input.length * 8) output += b64pad; - else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); - } - } - return output; -} - -/* - * Convert a raw string to an arbitrary string encoding - */ -function rstr2any(input, encoding) -{ - var divisor = encoding.length; - var remainders = Array(); - var i, q, x, quotient; - - /* Convert to an array of 16-bit big-endian values, forming the dividend */ - var dividend = Array(input.length / 2); - for(i = 0; i < dividend.length; i++) - { - dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); - } - - /* - * Repeatedly perform a long division. The binary array forms the dividend, - * the length of the encoding is the divisor. Once computed, the quotient - * forms the dividend for the next step. We stop when the dividend is zero. - * All remainders are stored for later use. - */ - while(dividend.length > 0) - { - quotient = Array(); - x = 0; - for(i = 0; i < dividend.length; i++) - { - x = (x << 16) + dividend[i]; - q = Math.floor(x / divisor); - x -= q * divisor; - if(quotient.length > 0 || q > 0) - quotient[quotient.length] = q; - } - remainders[remainders.length] = x; - dividend = quotient; - } - - /* Convert the remainders to the output string */ - var output = ""; - for(i = remainders.length - 1; i >= 0; i--) - output += encoding.charAt(remainders[i]); - - return output; -} - -/* - * Encode a string as utf-8. - * For efficiency, this assumes the input is valid utf-16. - */ -function str2rstr_utf8(input) -{ - var output = ""; - var i = -1; - var x, y; - - while(++i < input.length) - { - /* Decode utf-16 surrogate pairs */ - x = input.charCodeAt(i); - y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; - if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) - { - x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); - i++; - } - - /* Encode output as utf-8 */ - if(x <= 0x7F) - output += String.fromCharCode(x); - else if(x <= 0x7FF) - output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), - 0x80 | ( x & 0x3F)); - else if(x <= 0xFFFF) - output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - else if(x <= 0x1FFFFF) - output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), - 0x80 | ((x >>> 12) & 0x3F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - } - return output; -} - -/* - * Encode a string as utf-16 - */ -function str2rstr_utf16le(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode( input.charCodeAt(i) & 0xFF, - (input.charCodeAt(i) >>> 8) & 0xFF); - return output; -} - -function str2rstr_utf16be(input) -{ - var output = ""; - for(var i = 0; i < input.length; i++) - output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, - input.charCodeAt(i) & 0xFF); - return output; -} - -/* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ -function rstr2binl(input) -{ - var output = Array(input.length >> 2); - for(var i = 0; i < output.length; i++) - output[i] = 0; - for(var i = 0; i < input.length * 8; i += 8) - output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32); - return output; -} - -/* - * Convert an array of little-endian words to a string - */ -function binl2rstr(input) -{ - var output = ""; - for(var i = 0; i < input.length * 32; i += 8) - output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF); - return output; -} - -/* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ -function binl_md5(x, len) -{ - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for(var i = 0; i < x.length; i += 16) - { - var olda = a; - var oldb = b; - var oldc = c; - var oldd = d; - - a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); - d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); - c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); - b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); - a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); - d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); - c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); - b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); - a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); - d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); - c = md5_ff(c, d, a, b, x[i+10], 17, -42063); - b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); - a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); - d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); - c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); - b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); - - a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); - d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); - c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); - b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); - a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); - d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); - c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); - b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); - a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); - d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); - c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); - b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); - a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); - d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); - c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); - b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); - - a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); - d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); - c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); - b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); - a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); - d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); - c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); - b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); - a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); - d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); - c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); - b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); - a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); - d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); - c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); - b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); - - a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); - d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); - c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); - b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); - a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); - d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); - c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); - b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); - a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); - d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); - c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); - b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); - a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); - d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); - c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); - b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - } - return Array(a, b, c, d); -} - -/* - * These functions implement the four basic operations the algorithm uses. - */ -function md5_cmn(q, a, b, x, s, t) -{ - return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); -} -function md5_ff(a, b, c, d, x, s, t) -{ - return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); -} -function md5_gg(a, b, c, d, x, s, t) -{ - return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); -} -function md5_hh(a, b, c, d, x, s, t) -{ - return md5_cmn(b ^ c ^ d, a, b, x, s, t); -} -function md5_ii(a, b, c, d, x, s, t) -{ - return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); -} - -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ -function safe_add(x, y) -{ - var lsw = (x & 0xFFFF) + (y & 0xFFFF); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); -} - -/* - * Bitwise rotate a 32-bit number to the left. - */ -function bit_rol(num, cnt) -{ - return (num << cnt) | (num >>> (32 - cnt)); -} diff --git a/js/wiki2html.js b/js/wiki2html.js deleted file mode 100644 index bbc3043..0000000 --- a/js/wiki2html.js +++ /dev/null @@ -1,86 +0,0 @@ -function convert_wiki_to_html(wiki) -{ - return wiki2html(wiki); -} - -/* - @author: remy sharp / http://remysharp.com - @url: http://remysharp.com/2008/04/01/wiki-to-html-using-javascript/ - @license: Creative Commons License - ShareAlike http://creativecommons.org/licenses/by-sa/3.0/ - @version: 1.0 - - Can extend String or be used stand alone - just change the flag at the top of the script. -*/ - -// utility function to check whether it's worth running through the wiki2html -function iswiki(s) { - return !!(s.match(/^[\s{2} `#\*='{2}]/m)); -} - -// the regex beast... -function wiki2html(s) { - // lists need to be done using a function to allow for recusive calls - function list(str) { - return str.replace(/(?:(?:(?:^|\n)[\*#].*)+)/g, function (m) { // (?=[\*#]) - var type = m.match(/(^|\n)#/) ? 'OL' : 'UL'; - // strip first layer of list - m = m.replace(/(^|\n)[\*#][ ]{0,1}/g, "$1"); - m = list(m); - return '<' + type + '><li>' + m.replace(/^\n/, '').split(/\n/).join('</li><li>') + '</li></' + type + '>'; - }); - } - - return list(s - - /* BLOCK ELEMENTS */ - .replace(/(?:^|\n+)([^# =\*<].+)(?:\n+|$)/gm, function (m, l) { - if (l.match(/^\^+$/)) return l; - return "\n<p>" + l + "</p>\n"; - }) - - .replace(/(?:^|\n)[ ]{2}(.*)+/g, function (m, l) { // blockquotes - if (l.match(/^\s+$/)) return m; - return '<blockquote>' + l + '</pre>'; - }) - - .replace(/((?:^|\n)[ ]+.*)+/g, function (m) { // code - if (m.match(/^\s+$/)) return m; - return '<pre>' + m.replace(/(^|\n)[ ]+/g, "$1") + '</pre>'; - }) - - .replace(/(?:^|\n)([=]+)(.*)\1/g, function (m, l, t) { // headings - return '<h' + l.length + '>' + t + '</h' + l.length + '>'; - }) - - /* INLINE ELEMENTS */ - .replace(/'''(.*?)'''/g, function (m, l) { // bold - return '<strong>' + l + '</strong>'; - }) - - .replace(/''(.*?)''/g, function (m, l) { // italic - return '<em>' + l + '</em>'; - }) - - .replace(/[^\[](http[^\[\s]*)/g, function (m, l) { // normal link - return '<a href="' + l + '">' + l + '</a>'; - }) - - .replace(/[\[](http.*)[!\]]/g, function (m, l) { // external link - var p = l.replace(/[\[\]]/g, '').split(/ /); - var link = p.shift(); - return '<a href="' + link + '">' + (p.length ? p.join(' ') : link) + '</a>'; - }) - - .replace(/\[\[(.*?)\]\]/g, function (m, l) { // internal link or image - var p = l.split(/\|/); - var link = p.shift(); - - if (link.match(/^Image:(.*)/)) { - // no support for images - since it looks up the source from the wiki db :-( - return m; - } else { - return '<a href="' + link + '">' + (p.length ? p.join('|') : link) + '</a>'; - } - }) - ); -} diff --git a/woip/py/get_images.py b/tools/get_images.py index 91da39e..91da39e 100644 --- a/woip/py/get_images.py +++ b/tools/get_images.py diff --git a/woip/py/wp/setup.py b/woip/py/setup.py index 4d43048..4d43048 100644 --- a/woip/py/wp/setup.py +++ b/woip/py/setup.py diff --git a/woip/py/wp/wp.i b/woip/py/wp.i index 1bba516..1bba516 100644 --- a/woip/py/wp/wp.i +++ b/woip/py/wp.i |