mirror of
https://github.com/moodle/moodle.git
synced 2025-01-22 16:18:24 +01:00
de909d238d
forms (forums, readings, journals etc). Works only on IE 5.5 and later. Slightly customised for a slimmer toolbar.
186 lines
5.3 KiB
JavaScript
186 lines
5.3 KiB
JavaScript
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// HTML Text Editing Component for hosting in Web Pages
|
|
// Copyright (C) 2001 Ramesys (Contracting Services) Limited
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU LesserGeneral Public License
|
|
// along with this program; if not a copy can be obtained from
|
|
//
|
|
// http://www.gnu.org/copyleft/lesser.html
|
|
//
|
|
// or by writing to:
|
|
//
|
|
// Free Software Foundation, Inc.
|
|
// 59 Temple Place - Suite 330,
|
|
// Boston,
|
|
// MA 02111-1307,
|
|
// USA.
|
|
//
|
|
// Original Developer:
|
|
//
|
|
// Austin David France
|
|
// Ramesys (Contracting Services) Limited
|
|
// Mentor House
|
|
// Ainsworth Street
|
|
// Blackburn
|
|
// Lancashire
|
|
// BB1 6AY
|
|
// United Kingdom
|
|
// email: Austin.France@Ramesys.com
|
|
//
|
|
// Home Page: http://richtext.sourceforge.net/
|
|
// Support: http://richtext.sourceforge.net/
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Author(s): austin.france@ramesys.com OZ
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
// Escape XHTML text
|
|
//
|
|
|
|
function escapeXHTML(str)
|
|
{
|
|
return str.replace(/[&]/g, "&")
|
|
.replace(/[<]/g, "<")
|
|
.replace(/[>]/g, ">")
|
|
;
|
|
}
|
|
|
|
function escapeXHTMLAttribute(str)
|
|
{
|
|
return str.replace(/[\"]/g, """);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
// Return the XHTML attribute list (space separated) for the given element
|
|
//
|
|
// Notes:
|
|
// The ignore list is a JavaScript Regular expression that matches those
|
|
// attribute that should not be output.
|
|
//
|
|
|
|
function innerXHTMLAttributes(el, ignore)
|
|
{
|
|
// Start with an empty attribute list
|
|
var str = '';
|
|
|
|
// Output attributes for the element
|
|
for (var i = 0; i < el.attributes.length; i++)
|
|
{
|
|
// Get this attribute
|
|
var attr = el.attributes[i];
|
|
|
|
// Only output if it has a value of type string
|
|
if (attr.nodeValue && typeof(attr.nodeValue) == "string")
|
|
{
|
|
// and it's not one we want to ignore
|
|
if (!ignore || attr.nodeName.toLowerCase().search(ignore) == -1)
|
|
{
|
|
// Output the attribute (space separated if necessary)
|
|
if (str.length) str += ' ';
|
|
str += attr.nodeName.toLowerCase();
|
|
str += '="' + escapeXHTMLAttribute(attr.nodeValue) + '"';
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return the resulting attribute string
|
|
return str;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
// Get the inner XHTML from the supplied element.
|
|
//
|
|
// Return Value:
|
|
// XHTML string
|
|
//
|
|
// Notes:
|
|
// The ignore list is a JavaScript Regular expression that matches those
|
|
// attribute that should not be output.
|
|
//
|
|
|
|
function innerXHTML(el, ignore)
|
|
{
|
|
// Default innerXTHML is empty
|
|
var str = '';
|
|
|
|
// Create a text range for the element we are converting to source
|
|
var r2; var r = document.body.createTextRange();
|
|
r.moveToElementText(el);
|
|
|
|
// Scan the child nodes of this element.
|
|
for (var i = 0; i < el.children.length; i++)
|
|
{
|
|
// Create a text range for this child node
|
|
r2 = document.body.createTextRange();
|
|
r2.moveToElementText(el.children[i]);
|
|
|
|
// Set the end of our range to the start of this child node.
|
|
// so that r.text contains all the text up to this element.
|
|
r.setEndPoint("EndToStart", r2);
|
|
str += escapeXHTML(r.text);
|
|
|
|
// Emit the child node
|
|
str += outerXHTML(el.children[i], ignore);
|
|
|
|
// Now, reset the text range for the main element and then move
|
|
// the start point of our range to the end of the element just
|
|
// output in preperation for the next chunk of text (or last chunk
|
|
// if this was the last child node)
|
|
r.moveToElementText(el);
|
|
r.setEndPoint("StartToEnd", r2);
|
|
}
|
|
|
|
// Output the HTML (if any) plus the last chunk of text (again, if any).
|
|
// Note: if no child nodes existed, the r.text contains the entire text
|
|
// however, if child nodes did exist, then r.text contains just the
|
|
return str + escapeXHTML(r.text);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Description:
|
|
// Get the outer XHTML from the supplied element.
|
|
//
|
|
// Return Value:
|
|
// XHTML string
|
|
//
|
|
// Notes:
|
|
// The ignore list is a JavaScript Regular expression that matches those
|
|
// attribute that should not be output.
|
|
//
|
|
|
|
function outerXHTML(el, ignore)
|
|
{
|
|
// First, get the attribute values
|
|
var attrs = innerXHTMLAttributes(el, ignore);
|
|
|
|
// And any inner XHTML
|
|
var inner = innerXHTML(el, ignore);
|
|
|
|
// Then build the tag. Note: We use the XML abbreviation if the element is empty
|
|
return '<' + el.nodeName.toLowerCase()
|
|
+ (attrs.length ? ' ' + attrs : '')
|
|
+ (inner.length ? '>' + inner + '</' + el.nodeName.toLowerCase() + '>'
|
|
: ' />');
|
|
}
|