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.