# HG changeset patch # User Dan # Date 1269963420 14400 # Node ID 4797a4a885339704ef4ceaa73cb2a2cb25651db2 # Parent 31d226269d2ff10af237f35ee6b006915d563e95 Added selection and popup for
 tags within wikitext. Also fixed more bugs found in the HTML paragraph parser (mostly self-closing tags e.g. 
). diff -r 31d226269d2f -r 4797a4a88533 includes/clientside/css/enano-shared.css --- a/includes/clientside/css/enano-shared.css Tue Mar 30 11:34:56 2010 -0400 +++ b/includes/clientside/css/enano-shared.css Tue Mar 30 11:37:00 2010 -0400 @@ -1039,3 +1039,20 @@ .log_addfilter { display: none; } + +/* + * The header over
 in the content area
+ */
+
+div.preformat-panel {
+	text-transform: uppercase;
+	font-size: 9px;
+	font-family: tahoma, arial, sans-serif;
+	font-weight: bold;
+	margin-left: 1em;
+	border-width: 1px 1px 0 1px;
+	border-style: dashed;
+	border-color: black;
+	background-color: #ddd;
+	padding: 3px;
+}
diff -r 31d226269d2f -r 4797a4a88533 includes/clientside/static/enano-lib-basic.js
--- a/includes/clientside/static/enano-lib-basic.js	Tue Mar 30 11:34:56 2010 -0400
+++ b/includes/clientside/static/enano-lib-basic.js	Tue Mar 30 11:37:00 2010 -0400
@@ -58,6 +58,8 @@
 var is_Opera = checkIt('opera');
 var is_iPhone = checkIt('iphone') || checkIt('ipod');
 var is_iPhone_3 = checkIt('iphone os 3_');
+var is_Webkit = checkIt('applewebkit');
+var is_Gecko = checkIt('gecko');
 var is_firefox2 = checkIt('firefox/2.');
 
 var KILL_SWITCH = false;
@@ -474,6 +476,7 @@
 	'json.js',
 	'sliders.js',
 	'tinymce-init.js',
+	'preformat.js',
 	'loader.js'
 ];
 
diff -r 31d226269d2f -r 4797a4a88533 includes/clientside/static/login.js
--- a/includes/clientside/static/login.js	Tue Mar 30 11:34:56 2010 -0400
+++ b/includes/clientside/static/login.js	Tue Mar 30 11:37:00 2010 -0400
@@ -973,6 +973,7 @@
 
 window.ajaxLoginShowFriendlyError = function(response)
 {
+	eval(setHook('ajax_login_process_error'));
 	var text = ajaxLoginGetErrorText(response);
 	if ( text == false )
 		return true;
diff -r 31d226269d2f -r 4797a4a88533 includes/clientside/static/preformat.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/includes/clientside/static/preformat.js	Tue Mar 30 11:37:00 2010 -0400
@@ -0,0 +1,94 @@
+//
+// Add the wrappers for preformatted tags within content.
+//
+
+addOnloadHook(function()
+	{
+		preformat_process_all();
+	});
+
+function preformat_process_all()
+{
+	var aec = document.getElementById('ajaxEditContainer');
+	if ( !aec )
+		return false;
+	var pres = aec.getElementsByTagName('pre');
+	for ( var i = 0; i < pres.length; i++ )
+	{
+		if ( pres[i].hasButtonPanel )
+			continue;
+		pres[i].hasButtonPanel = true;
+		
+		var btnp = document.createElement('div');
+		btnp.mypre = pres[i];
+		btnp.className = 'preformat-panel';
+		btnp.appendChild(document.createTextNode($lang.get('onpage_pre_lbl_code')));
+		btnp.appendChild(document.createTextNode(' <'));
+		var a_sel = document.createElement('a');
+		a_sel.href = '#';
+		a_sel.onclick = function()
+			{
+				preformat_handle_select_click(this.parentNode);
+				return false;
+			};
+		a_sel.appendChild(document.createTextNode($lang.get('onpage_pre_btn_select')));
+		btnp.appendChild(a_sel);
+		btnp.appendChild(document.createTextNode('> <'));
+		var a_pop = document.createElement('a');
+		a_pop.href = '#';
+		a_pop.onclick = function()
+			{
+				preformat_handle_popup_click(this.parentNode);
+				return false;
+			};
+		a_pop.appendChild(document.createTextNode($lang.get('onpage_pre_btn_popup')));
+		btnp.appendChild(a_pop);
+		btnp.appendChild(document.createTextNode('>'));
+		pres[i].parentNode.insertBefore(btnp, pres[i]);
+	}
+}
+
+function preformat_handle_select_click(btnp)
+{
+	var pre = btnp.mypre;
+	select_element(pre);
+}
+
+function preformat_handle_popup_click(btnp)
+{
+	var pre = btnp.mypre;
+	var text = pre.innerHTML;
+	var newwin = window.open('about:blank', 'codepopwin', 'width=800,height=600,status=no,toolbars=no,toolbar=no,address=no,scroll=yes');
+	newwin.document.open();
+	newwin.document.write('' + $lang.get('onpage_pre_popup_title') + '');
+	newwin.document.write('
' + text + '
'); + newwin.document.write(''); + newwin.document.close(); +} + +function select_element(element) +{ + if (IE) + { + // IE + var range = document.body.createTextRange(); + range.moveToElementText(element); + range.select(); + } + else if (is_Gecko || is_Opera) + { + // Mozilla/Opera + var selection = window.getSelection(); + var range = document.createRange(); + range.selectNodeContents(element); + selection.removeAllRanges(); + selection.addRange(range); + } + else if (is_Webkit) + { + // Safari (Chrome?) + var selection = window.getSelection(); + selection.setBaseAndExtent(element, 0, element, 1); + } +} + diff -r 31d226269d2f -r 4797a4a88533 includes/sessions.php --- a/includes/sessions.php Tue Mar 30 11:34:56 2010 -0400 +++ b/includes/sessions.php Tue Mar 30 11:37:00 2010 -0400 @@ -3822,7 +3822,7 @@ * @return array LoginAPI response */ - function process_login_request($req, $_dbgtmp = false) + function process_login_request($req) { global $db, $session, $paths, $template, $plugins; // Common objects diff -r 31d226269d2f -r 4797a4a88533 includes/wikiengine/parse_mediawiki.php --- a/includes/wikiengine/parse_mediawiki.php Tue Mar 30 11:34:56 2010 -0400 +++ b/includes/wikiengine/parse_mediawiki.php Tue Mar 30 11:37:00 2010 -0400 @@ -188,7 +188,20 @@ // Find all opening and closing tags - $regex = ";(<(?:/(?:$blocklevel)|(?:$blocklevel)(?: [^>]*?)?)>);s"; + $regex = ";( + < + (?: + # closing tag + /(?:$blocklevel) + | + # opening or self-closing tag + (?:$blocklevel) + (?:[ ][^>]*?)? + /? + ) + > + ) + ;xs"; // oh. and we're using this tokens thing because for identical matches, the first match will // get wrapped X number of times instead of all matches getting wrapped once; replacing each @@ -204,11 +217,11 @@ // go through the text, extract tag names, and push them to a stack. foreach ( $text_split as $splitpart ) { - if ( preg_match(";^<(/)?($blocklevel)( |>);i", $splitpart, $match) ) + if ( preg_match(";^<(/)?($blocklevel)( ([^>]*?(/)?>)|(/)?>);i", $splitpart, $match) ) { $tagname = $match[2]; if ( $match[1] == '/' ) - { + { // closing tag if ( $tagname != ($top = array_pop($tag_stack)) ) { @@ -224,21 +237,32 @@ } else { - // push - array_push($tag_stack, $tagname); - if ( count($tag_stack) == 1 ) - $splitpart = '<_paragraph_bypass>' . $splitpart; + // is it a self-closed tag? + // FIXME: This parser is VERY STRICT right now as far as XHTML compliance.
will + // pretty much totally break it, because it will be treated as an opening tag. + // Yes, self closing tags work. + if ( (isset($match[5]) && $match[5] === '/') || (isset($match[6]) && $match[6] === '/') ) + { + // yes + if ( count($tag_stack) == 0 ) + $splitpart = "<_paragraph_bypass>$splitpart"; + } + else + { + // opening tag - push + array_push($tag_stack, $tagname); + if ( count($tag_stack) == 1 ) + $splitpart = '<_paragraph_bypass>' . $splitpart; + } } } $text .= $splitpart; } - //echo '
' . htmlspecialchars(print_r($text, true)) . '
'; + // echo '
' . htmlspecialchars(print_r($text, true)) . '
'; } // All things that should be para-bypassed now are surrounded by _paragraph_bypass tags. - // die('
' . htmlspecialchars($text) . '
'); - RenderMan::tag_unstrip('_paragraph_bypass', $text, $_nw, true); // This is potentially a hack. It allows the parser to stick in <_paragraph_bypass> tags diff -r 31d226269d2f -r 4797a4a88533 language/english/core.json --- a/language/english/core.json Tue Mar 30 11:34:56 2010 -0400 +++ b/language/english/core.json Tue Mar 30 11:37:00 2010 -0400 @@ -315,6 +315,11 @@ cat_heading_pages: 'Pages', cat_msg_no_pages: 'No pages in this category.', + pre_lbl_code: 'Code:', + pre_btn_select: 'Select', + pre_btn_popup: 'Popup', + pre_popup_title: 'Code window', + filebox_heading: 'Uploaded file', filebox_msg_not_found: 'There are no files uploaded with this name yet. Upload a file...', filebox_lbl_type: 'Type:', diff -r 31d226269d2f -r 4797a4a88533 themes/enanium/css/babygrand.css --- a/themes/enanium/css/babygrand.css Tue Mar 30 11:34:56 2010 -0400 +++ b/themes/enanium/css/babygrand.css Tue Mar 30 11:37:00 2010 -0400 @@ -306,6 +306,16 @@ margin-left: 0.8em; } +div.content pre { + margin-left: 1em; + margin-top: 0; + background-color: #F8F8F8; + border: 1px dashed #90B0D0; + padding: 10px; + overflow: auto; + clip: rect(0px, auto, auto, 0px); +} + /* Wikilinks to pages that don't exist */ div.content a.wikilink-nonexistent { color: #B05020;