Monday, November 08, 2010 at 12:05 AM.

system.verbs.builtins.radio.html.editTextFile

on editTextFile () {
	<<Changes
		<<9/17/04; 1:53:28 PM by SK
			<<Bug fix to name the form and allow better compatibility with the WYSIWYG text editor
		<<8/11/03; 4:02:09 AM by JES
			<<Added support for the Mozilla rich text editor.
		<<1/28/02; 6:27:11 PM by JES
			<<On MacOS, convert from Mac to Latin when sending file text to the browser for editing, and convert back to Mac text before writing the file to disk.
		<<1/26/02; 2:59:03 AM by JES
			<<Make sure that the editor has a minimum vertical size.
		<<1/25/02; 6:41:48 PM by JES
			<<Handles editing of text files. Takes two getArgs from an Edit This Page button: f, and referer. The user edits the file in a textarea on the page. When done, they click a Post Changes button, the file is written to disk, and the browser is redirected to the referer.
			<<Referer deafults to the home page, if not present.
			<<If f is not present, an (innocuous) error message appears in place of the editing form.
	local (pta = html.getPageTableAddress ());
	local (adrblog = radio.weblog.init ());
	pta^.editingToolName = adrblog^.prefs.editingToolName;
	
	local (f, referer = "http://" + pta^.host + pta^.path);
	
	if pta^.method == "POST" { //write changes, redirect to referer
		local (adrargs = @pta^.radioResponder.postArgs);
		if defined (adrargs^.postChanges) {
			f = radio.file.getAbsolutePath (adrargs^.f);
			if defined (adrargs^.referer) {
				referer = adrargs^.referer};
			local (filetext = adrargs^.itemtext);
			if system.environment.isMac {
				filetext = string.latinToMac (filetext)};
			bundle { //add directives to the begining of filetext -- this only happens when using the wysiwyg editor
				local (adr);
				for adr in adrargs {
					local (name = nameOf (adr^));
					local (val = adr^);
					if system.environment.isMac {
						val = string.latinToMac (val)};
					if name beginsWith "#" {
						filetext = (name + " " + val + "\r\n") + filetext}}};
			file.writeTextFile (f, filetext);
			radio.webserver.redirect (referer);
			return ("")}};
	
	local (htmltext);
	on add (s) {
		htmltext = htmltext + s + "\r"};
	
	local (adrargs = @pta^.radioResponder.getArgs);
	if defined (adrargs^.referer) {
		referer = adrargs^.referer};
	if defined (adrargs^.f) { //render the editing form
		f = radio.file.getAbsolutePath (adrargs^.f);
		local (title, adrfile);
		radio.file.getFileAttributes (f, @adrfile);
		title = adrfile^.title;
		pta^.title = radio.string.getlocalizedstring ("editTextFile.titlePrefix") + title;
		add (html.editor.formStart ("itemtext", name:"editPostForm", pta:pta));
		local (ctrows);
		bundle { //get filetext, and possibly create hidden fields for directives
			filetext = file.readWholeFile (f);
			filetext = radio.html.translateToEntities (filetext);
			filetext = string.replaceAll (filetext, "\r\n", "\r");
			filetext = string.replaceAll (filetext, "\n", "\r");
			if html.editor.getEditingTool (pta) contains "wysiwyg" { //put directives in hidden fields if using the WYSIWYG editor
				loop {
					if sizeOf (filetext) == 0 { // account for files that contain nothing but directives (or are empty)
						break};
					if filetext[1] == "#" { //read in a directive, and add a hidden field
						local (directive = string.nthField (filetext, "\r", 1));
						local (directiveName = string.nthField (directive, " ", 1));
						local (ixOperand = string.patternMatch (" ", directive) + 1);
						local (operand = string.mid (directive, ixOperand, infinity));
						add ("<input type=\"hidden\" name=\"" + directiveName + "\" value=\"" + operand + "\">");
						filetext = string.delete (filetext, 1, sizeOf (directive) + 1)}
					else { //done reading directives
						break}}};
			ctrows = string.countFields (filetext, "\r") * 2;
			if system.environment.isMac {
				filetext = string.macToLatin (filetext)};
			case html.editor.getEditingTool (pta) {
				"wysiwygEditorMozilla" { //pre-process for Mozilla's rich text editor
					}}//do nothing
					<<if filetext contains "\r\r"
						<<filetext = string.replaceAll (filetext, "\r\r", "<br><br>")
			else { //other editors
				filetext = string.replaceAll (filetext, "\r", "
")}};
		if ctrows < 15 {ctrows = 15};
		add (radio.userInterface.editorBox (filetext, ctrows, 70));
		add ("<input type=\"hidden\" name=\"f\" value=\"" + radio.file.getRelativePath (f) + "\">");
		add ("<input type=\"hidden\" name=\"referer\" value=\"" + referer + "\"><br><br>");
		add ("<input type=\"submit\" name=\"postChanges\" value=\"" + radio.string.getlocalizedstring ("editTextFile.postChangesButton") + "\">");
		add ("</form>");
		add ("<br><br><br>")} //add some white-space below the Post Changes button
	else { //no file specified -- display an error message
		add (radio.string.getlocalizedstring ("editTextFile.noFileSpecifiedError"))};
	return (htmltext)}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.