"Handy Tasks 2" by rfavero

Rating: 10.0 (1 votes)

Report this Script

Name: Handy Tasks 2
Uploaded By: rfavero
Date Created: Aug. 11, 2010 5:36 p.m.
Date Modified: Aug. 16, 2010 10:07 a.m.
Description: 1) Escape HTML Chars | 2) Unescape HTML Chars - Deluxe (see comments in code for details) Inspired by JohnLBevan's "Escape Characters for HTML" ** Please vote and leave a comment so others know if they should take the time to bother with this script.
Num Views: 384
Num Downloads: 160

Contents

Download this script

###############################################################################
# This is a list of a few handy tasks:
#
#	- Escape HTML Chars (inspired by JohnLBevan's "Escape Characters for HTML")
#		This script will convert "&", "<", ">" chars to their HTML escaped equivalents.
#		Deluxe: The affected text is left highlighted so the extent of the changes
#		is easy to see.
#
#	- Unescape HTML Chars (inspired by JohnLBevan's "Escape Characters for HTML")
#		This script will convert 3 common HTML escaped character sequences back
#		to "&", "<", ">". Deluxe: The affected text is left highlighted so the extent
#		of the changes is easy to see.
#
#	I make these scripts available in the public domain. There are no restrictions on
#	their use, and no attribution is necessary. No warranty is made. Use at your own risk.
#
# Author: Rob Favero
#
###############################################################################

import pn
import scintilla
from pypn.decorators import script

#
# Converts "<", ">", and "&" to/from their HTML escaped equivalents. If at least one replacement
# occurs, a portion of the text will be highlighted. The highlighted portion will start just
# before the first replacement and end just after the last replacement. This is handy to see
# exactly what portion of the document was affected by the replacement.
#
def ReplaceHtmlChars(doEsc):
	doc = pn.CurrentDoc()
	if doc is None:
		return
	editor = scintilla.Scintilla(doc)
	start = editor.SelectionStart
	end = editor.SelectionEnd
	if (start == end):
		start = 0
		end = editor.Length
	text = editor.GetTextRange(start, end)
	if (doEsc):
		#
		# Narrow the targeted replacement area to start at the first replacment
		# and end at the last.
		#
		tmpText = text.replace("<", "&").replace(">", "&")
		nStart = tmpText.find("&")
		if (nStart < 0):
			return
		nEnd = tmpText.rfind("&") + 1
		nText = text[nStart:nEnd] # This is now the text from the narrowed
									# targeted replacement area.
		start = start + nStart # Adjust start and end
		end = end - (len(text) - nEnd)
		modText = nText.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
	else:
		#
		# Narrow the targeted replacement area to start at the first replacment
		# and end at the last. This more more complex than above, because the
		# strings to be replaced are not all the same size.
		#
		nStart = text.find("&amp;")
		nStartLt = text.find("&lt;")
		nStartGt = text.find("&gt;")
		if ((nStart < 0) or ((nStartLt >= 0) and (nStartLt < nStart))):
				nStart = nStartLt
		if ((nStart < 0) or ((nStartGt >= 0) and (nStartGt < nStart))):
				nStart = nStartGt
		if (nStart < 0):
			return
		nEnd = text.rfind("&amp;")
		nEndLen = 5
		nEndLt = text.rfind("&lt;")
		nEndGt = text.rfind("&gt;")
		if (nEndLt > nEnd):
			nEnd = nEndLt
			nEndLen = 4
		if (nEndGt > nEnd):
			nEnd = nEndGt
			nEndLen = 4
		nEnd = nEnd + nEndLen
		nText = text[nStart:nEnd] # This is now the text from the narrowed
									# targeted replacement area.

		start = start + nStart
		end = end - (len(text) - nEnd)
		modText = nText.replace("&amp;", "&", ).replace("&lt;", "<").replace("&gt;", ">")
	editor.BeginUndoAction()
	editor.SetSel(start, end)
	editor.ReplaceSel(modText)
	editor.SetSel(start, start + len(modText))
	editor.EndUndoAction()
	return

#
# Converts "<", ">", and "&" to their HTML escaped equivalents.
#
@script("Escape HTML Chars", "Handy Tasks")
def EscHtmlChars():
	ReplaceHtmlChars(True)
	return

#
# Converts to "<", ">", and "&" from their HTML escaped equivalents.
#
@script("Unescape HTML Chars", "Handy Tasks")
def UnescHtmlChars():
	ReplaceHtmlChars(False)
	return

Comments:

Please vote and leave a comment so others know if they should take the time to consider using this script.

Posted by rfavero on Aug. 16, 2010 at 10:06 a.m.