Jump to content

User:Proteins/unindent.js: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Proteins (talk | contribs)
improve code for counting prose size
Proteins (talk | contribs)
different approach to unindenting
Line 134: Line 134:


if (indent_level > 0) {
if (indent_level > 0) {
if ((top_DD_node) && (top_DL_node)) {
if ((top_DD_node) && (top_DL_node)) {
top_DL_node.insertBefore(temp_DD_element, top_DD_element);
/*
sibling_node = top_DD_node.nextSibling;
sibling_node = top_DD_node.nextSibling;
while ((sibling_node) && (sibling_node.nodeType != 1)) {
while ((sibling_node) && (sibling_node.nodeType != 1)) {
Line 145: Line 147:
top_DL_node.appendChild(temp_DD_element);
top_DL_node.appendChild(temp_DD_element);
}
}
*/
} // check that both the top_DD and top_DL elements are defined
} // check that both the top_DD and top_DL elements are defined
} // check for unindenting
} // check for unindenting
} // closes loop over the DD elements of the document
} // closes loop over the DD elements of the document
window.alert(diagnostic_string);
window.alert(diagnostic_string);

// Third-pass loop to uncreate empty discursive lists


//Acknowledgment
//Acknowledgment

Revision as of 14:52, 23 October 2008

//<pre>
// Unindent discusions for accessibility
 
function unindent() {
	var alert_string = "";
	var diagnostic_string = "";

	var indent_level = 0;
	var indent_level_string = "";

	var DL_elements;
	var num_DL_elements = 0;

	var DT_elements;
	var num_DT_elements = 0;

	var DD_elements;
	var temp_DD_element;
	var num_DD_elements = 0;
	var DD_element_index = 0;
	var num_unindented_DD_elements = 0;

	var top_node;
	var child_node;
	var parent_node;
	var top_DL_node;
	var top_DD_node;

	var untagged_text;
	var byte_count = 0;
	var num_child_nodes = 0;

	// Colors to help sighted people after the unindenting
	var num_colors = 0;
	var DD_background_colors = ["white", "yellow", "greenyellow", "gold", "lawngreen", "orange", "lightskyblue", "darkorange"];


// Initialization
	num_colors = DD_background_colors.length;

	top_node = document.getElementById('bodyContent');
	DD_elements = top_node.getElementsByTagName("DD");
	num_DD_elements = DD_elements.length;

// First-pass loop colors the links and adds the level to the beginning
	diagnostic_string = "";
	for (DD_element_index=0; DD_element_index<num_DD_elements; DD_element_index++) { 
		temp_DD_element = DD_elements[DD_element_index];

		// Skip empty DD elements
		num_child_nodes = temp_DD_element.childNodes.length;
		if (!num_child_nodes) { continue; } // ignore empty DD elements

		untagged_text = temp_DD_element.innerHTML.replace(/(<([^>]+)>)/ig,""); // remove HTML tags
		byte_count = untagged_text.replace(/\s/ig, "").length; // remove whitespaces
		if (byte_count < 1) { continue; }

		// Find the topmost DL element for this DD node
		indent_level = 0;
		top_DL_node = null;
		top_DD_node = null;
		parent_node = temp_DD_element.parentNode;

		while ((parent_node) && (parent_node != top_node)) {
			if (parent_node.nodeType != 1) {
				parent_node = parent_node.parentNode;
				continue; 
			} // examine only Element nodes

			if (parent_node.nodeName == "DL") { 
				// Check whether the parent DL element has any DT elements
				num_DT_elements = parent_node.getElementsByTagName("DT").length;
				if (num_DT_elements > 0) { break; } // if so, stop unindenting...

				// ...else make this the new indent level
				indent_level++;
				top_DL_node = parent_node;
			} // closes check for a parental DL element

			if (parent_node.nodeName == "DD") { top_DD_node = parent_node; }

			parent_node = parent_node.parentNode;
		} // closes loop climbing up the document tree

		if (indent_level > 0) { 
			num_unindented_DD_elements++;
			temp_DD_element.style.cssText = "background-color:" + DD_background_colors[indent_level%num_colors];

			indent_level_string = "(Indent level " + indent_level + ") ";
			child_node = temp_DD_element.firstChild;
			if (child_node) { 
				temp_DD_element.insertBefore(document.createTextNode(indent_level_string), child_node);
			} else {
				indent_level_string += "No text in this DD element.\n";
				temp_DD_element.appendChild(document.createTextNode(indent_level_string));
			}
			diagnostic_string += "DD element " + DD_element_index + " is indented to level " + indent_level + ".\n";
		} // check for unindenting
	} // closes loop over the DD elements of the document
	window.alert(diagnostic_string);

// Second-pass loop changes the document tree structure
	diagnostic_string = "";
	for (DD_element_index=0; DD_element_index<num_DD_elements; DD_element_index++) { 
		temp_DD_element = DD_elements[DD_element_index];

		indent_level = 0;

		// Find the topmost DL element for this DD node
		top_DL_node = null;
		top_DD_node = null;
		parent_node = temp_DD_element.parentNode;

		while ((parent_node) && (parent_node != top_node)) {
			if (parent_node.nodeType != 1) {
				parent_node = parent_node.parentNode;
				continue; 
			} // examine only Element nodes

			if (parent_node.nodeName == "DL") { 
				// Check whether the parent DL element has any DT elements
				num_DT_elements = parent_node.getElementsByTagName("DT").length;
				if (num_DT_elements > 0) { break; } // if so, stop unindenting...

				// ...else make this the new indent level
				indent_level++;
				top_DL_node = parent_node;
			} // closes check for a parental DL element

			if (parent_node.nodeName == "DD") { top_DD_node = parent_node; }

			parent_node = parent_node.parentNode;
		} // closes loop climbing up the document tree

		if (indent_level > 0) { 
			if ((top_DD_node) && (top_DL_node)) {
				top_DL_node.insertBefore(temp_DD_element, top_DD_element);
/* 
				sibling_node = top_DD_node.nextSibling;
				while ((sibling_node) && (sibling_node.nodeType != 1)) { 
					sibling_node = sibling_node.nextSibling;
				}
				
				if (sibling_node) { 
					top_DL_node.insertBefore(temp_DD_element, sibling_code);
				} else { 
					top_DL_node.appendChild(temp_DD_element);
				}
*/
			} // check that both the top_DD and top_DL elements are defined
		} // check for unindenting
	} // closes loop over the DD elements of the document
	window.alert(diagnostic_string);

// Third-pass loop to uncreate empty discursive lists

//Acknowledgment
	alert_string = "Unindented " + num_unindented_DD_elements + " paragraphs of " + num_DD_elements + " possible.";
	window.alert(alert_string);

} // closes unindent() function

addOnloadHook(function () {
            addPortletLink('p-cactions', 'javascript:unindent()', 'unindent', 'ca-unindent', 'Unindent discussions', '', '');
});
 
//</pre>