From: Art Cancro Date: Mon, 31 May 2004 20:34:11 +0000 (+0000) Subject: * Message entry using Kevin Roth's excellent cross-platform richtext X-Git-Tag: v7.86~5419 X-Git-Url: https://code.citadel.org/?a=commitdiff_plain;h=9ab34e20231984b8c321ca6d506379981e9ea942;p=citadel.git * Message entry using Kevin Roth's excellent cross-platform richtext editing script. --- diff --git a/webcit/ChangeLog b/webcit/ChangeLog index fbd4e47fe..a81b38814 100644 --- a/webcit/ChangeLog +++ b/webcit/ChangeLog @@ -1,4 +1,8 @@ $Log$ +Revision 510.5 2004/05/31 20:34:11 ajc +* Message entry using Kevin Roth's excellent cross-platform richtext + editing script. + Revision 510.4 2004/05/31 15:54:13 ajc * "text" and "HTML" options for message entry. @@ -1821,3 +1825,4 @@ Sun Dec 6 19:50:55 EST 1998 Art Cancro 1998-12-03 Nathan Bryant * webserver.c: warning fix + diff --git a/webcit/README.txt b/webcit/README.txt index 4b5692297..aa1b553b8 100644 --- a/webcit/README.txt +++ b/webcit/README.txt @@ -6,6 +6,7 @@ Nathan Bryant Nick Grossman Andru Luvisi + Kevin Roth This program is free software released under the terms of the GNU General Public License. Please read COPYING.txt for more licensing information. diff --git a/webcit/auth.c b/webcit/auth.c index 5f4477394..c6a280e9c 100644 --- a/webcit/auth.c +++ b/webcit/auth.c @@ -49,7 +49,7 @@ void display_login(char *mesg) output_headers(3); if (mesg != NULL) if (strlen(mesg) > 0) { - stresc(buf, mesg, 0); + stresc(buf, mesg, 0, 0); svprintf("mesg", WCS_STRING, "%s", buf); } diff --git a/webcit/messages.c b/webcit/messages.c index 7f373d2f8..fbb15c96b 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -1482,13 +1482,13 @@ void display_enter(void) now = time(NULL); fmt_date(buf, now); strcat(&buf[strlen(buf)], " from "); - stresc(&buf[strlen(buf)], WC->wc_username, 1); + stresc(&buf[strlen(buf)], WC->wc_username, 1, 1); if (strlen(bstr("recp")) > 0) { strcat(&buf[strlen(buf)], " to "); - stresc(&buf[strlen(buf)], bstr("recp"), 1); + stresc(&buf[strlen(buf)], bstr("recp"), 1, 1); } strcat(&buf[strlen(buf)], " in "); - stresc(&buf[strlen(buf)], WC->wc_roomname, 1); + stresc(&buf[strlen(buf)], WC->wc_roomname, 1, 1); svprintf("BOXTITLE", WCS_STRING, buf); do_template("beginbox"); @@ -1496,13 +1496,15 @@ void display_enter(void) wprintf("
\n"); + "NAME=\"enterform\"" + "onSubmit=\"return submitForm();\"" + ">\n"); wprintf("\n", bstr("recp")); wprintf("\n", now); - wprintf("\""); + wprintf("\""); + /* "onLoad=\"document.enterform.msgtext.focus();\" " */ wprintf("Subject (optional):" "text \n"); wprintf("HTML \n"); wprintf("" "
\n"); + wprintf("\n" + " \n" + " \n" + " \n"); + +/* wprintf("
\n"); +*/ /* Enumerate any attachments which are already in place... */ for (att = WC->first_attachment; att != NULL; att = att->next) { diff --git a/webcit/roomops.c b/webcit/roomops.c index 042144d63..eab01a968 100644 --- a/webcit/roomops.c +++ b/webcit/roomops.c @@ -114,7 +114,7 @@ void room_tree_list(struct roomlisting *rp) urlescputs(rmname); wprintf("\""); wprintf(">"); - escputs1(rmname, 1); + escputs1(rmname, 1, 1); if ((f & QR_DIRECTORY) && (f & QR_NETWORK)) wprintf("}"); else if (f & QR_DIRECTORY) @@ -1360,7 +1360,7 @@ void display_whok(void) } output_headers(1); - stresc(buf, WC->wc_roomname, 1); + stresc(buf, WC->wc_roomname, 1, 1); svprintf("BOXTITLE", WCS_STRING, "Access control list for %s", buf); do_template("beginbox"); @@ -1986,7 +1986,7 @@ void do_rooms_view(struct folder *fold, int max_folders, int num_floors) { /* Begin inner box */ extract(buf, fold[i].name, levels-1); - stresc(boxtitle, buf, 1); + stresc(boxtitle, buf, 1, 0); svprintf("BOXTITLE", WCS_STRING, boxtitle); do_template("beginbox"); diff --git a/webcit/serv_func.c b/webcit/serv_func.c index 98fb3c071..924f0a089 100644 --- a/webcit/serv_func.c +++ b/webcit/serv_func.c @@ -193,7 +193,7 @@ void text_to_server(char *ptr, int convert_to_html) } } else if ((convert_to_html)&&(strchr("#&;`'|*?-~<>^()[]{}$\\", ch) != NULL)) { sprintf(conv, "%c", ch); - stresc(&buf[strlen(buf)], conv, 0); + stresc(&buf[strlen(buf)], conv, 0, 0); } else { a = strlen(buf); buf[a + 1] = 0; diff --git a/webcit/static/bgcolor.gif b/webcit/static/bgcolor.gif new file mode 100644 index 000000000..55fcf1ba6 Binary files /dev/null and b/webcit/static/bgcolor.gif differ diff --git a/webcit/static/blackdot.gif b/webcit/static/blackdot.gif new file mode 100644 index 000000000..f79319f81 Binary files /dev/null and b/webcit/static/blackdot.gif differ diff --git a/webcit/static/bold.gif b/webcit/static/bold.gif new file mode 100644 index 000000000..bdb3259c3 Binary files /dev/null and b/webcit/static/bold.gif differ diff --git a/webcit/static/centre.gif b/webcit/static/centre.gif new file mode 100644 index 000000000..f98c86a78 Binary files /dev/null and b/webcit/static/centre.gif differ diff --git a/webcit/static/copy.gif b/webcit/static/copy.gif new file mode 100644 index 000000000..faebb18c4 Binary files /dev/null and b/webcit/static/copy.gif differ diff --git a/webcit/static/cut.gif b/webcit/static/cut.gif new file mode 100644 index 000000000..ca60a1aa3 Binary files /dev/null and b/webcit/static/cut.gif differ diff --git a/webcit/static/email.gif b/webcit/static/email.gif new file mode 100644 index 000000000..eb355f021 Binary files /dev/null and b/webcit/static/email.gif differ diff --git a/webcit/static/hr.gif b/webcit/static/hr.gif new file mode 100644 index 000000000..c98da9d00 Binary files /dev/null and b/webcit/static/hr.gif differ diff --git a/webcit/static/hyperlink.gif b/webcit/static/hyperlink.gif new file mode 100644 index 000000000..1fb1a4a5c Binary files /dev/null and b/webcit/static/hyperlink.gif differ diff --git a/webcit/static/image.gif b/webcit/static/image.gif new file mode 100644 index 000000000..8cbba167c Binary files /dev/null and b/webcit/static/image.gif differ diff --git a/webcit/static/indent.gif b/webcit/static/indent.gif new file mode 100644 index 000000000..2abb6b281 Binary files /dev/null and b/webcit/static/indent.gif differ diff --git a/webcit/static/italic.gif b/webcit/static/italic.gif new file mode 100644 index 000000000..8b1485b43 Binary files /dev/null and b/webcit/static/italic.gif differ diff --git a/webcit/static/justifyfull.gif b/webcit/static/justifyfull.gif new file mode 100644 index 000000000..b12528b9f Binary files /dev/null and b/webcit/static/justifyfull.gif differ diff --git a/webcit/static/left_just.gif b/webcit/static/left_just.gif new file mode 100644 index 000000000..505c5d961 Binary files /dev/null and b/webcit/static/left_just.gif differ diff --git a/webcit/static/list.gif b/webcit/static/list.gif new file mode 100644 index 000000000..b3018d9f2 Binary files /dev/null and b/webcit/static/list.gif differ diff --git a/webcit/static/numbered_list.gif b/webcit/static/numbered_list.gif new file mode 100644 index 000000000..d1a4dbcad Binary files /dev/null and b/webcit/static/numbered_list.gif differ diff --git a/webcit/static/outdent.gif b/webcit/static/outdent.gif new file mode 100644 index 000000000..fa3c1b6aa Binary files /dev/null and b/webcit/static/outdent.gif differ diff --git a/webcit/static/palette.htm b/webcit/static/palette.htm new file mode 100644 index 000000000..af4954b47 --- /dev/null +++ b/webcit/static/palette.htm @@ -0,0 +1,126 @@ + + + + + Text Color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/webcit/static/paste.gif b/webcit/static/paste.gif new file mode 100644 index 000000000..9bcc76ac2 Binary files /dev/null and b/webcit/static/paste.gif differ diff --git a/webcit/static/redo.gif b/webcit/static/redo.gif new file mode 100644 index 000000000..b51d6b842 Binary files /dev/null and b/webcit/static/redo.gif differ diff --git a/webcit/static/richtext.js b/webcit/static/richtext.js new file mode 100644 index 000000000..fe4cae332 --- /dev/null +++ b/webcit/static/richtext.js @@ -0,0 +1,600 @@ +// Cross-Browser Rich Text Editor +// http://www.kevinroth.com/rte/demo.htm +// Written by Kevin Roth (kevin@NOSPAMkevinroth.com - remove NOSPAM) + +//init variables +var isRichText = false; +var rng; +var currentRTE; +var allRTEs = ""; + +var isIE; +var isGecko; +var isSafari; +var isKonqueror; + +var imagesPath; +var includesPath; +var cssFile; + + +function initRTE(imgPath, incPath, css) { + //set browser vars + var ua = navigator.userAgent.toLowerCase(); + isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)); + isGecko = (ua.indexOf("gecko") != -1); + isSafari = (ua.indexOf("safari") != -1); + isKonqueror = (ua.indexOf("konqueror") != -1); + + //check to see if designMode mode is available + if (document.getElementById && document.designMode && !isSafari && !isKonqueror) { + isRichText = true; + } + + if (!isIE) document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT | Event.MOUSEDOWN | Event.MOUSEUP); + document.onmouseover = raiseButton; + document.onmouseout = normalButton; + document.onmousedown = lowerButton; + document.onmouseup = raiseButton; + + //set paths vars + imagesPath = imgPath; + includesPath = incPath; + cssFile = css; + + if (isRichText) document.writeln(''); + + //for testing standard textarea, uncomment the following line + //isRichText = false; +} + +function writeRichText(rte, html, width, height, buttons, readOnly) { + if (isRichText) { + if (allRTEs.length > 0) allRTEs += ";"; + allRTEs += rte; + writeRTE(rte, html, width, height, buttons, readOnly); + } else { + writeDefault(rte, html, width, height, buttons, readOnly); + } +} + +function writeDefault(rte, html, width, height, buttons, readOnly) { + if (!readOnly) { + document.writeln(''); + } else { + document.writeln(''); + } +} + +function raiseButton(e) { + if (isIE) { + var el = window.event.srcElement; + } else { + var el= e.target; + } + + className = el.className; + if (className == 'rteImage' || className == 'rteImageLowered') { + el.className = 'rteImageRaised'; + } +} + +function normalButton(e) { + if (isIE) { + var el = window.event.srcElement; + } else { + var el= e.target; + } + + className = el.className; + if (className == 'rteImageRaised' || className == 'rteImageLowered') { + el.className = 'rteImage'; + } +} + +function lowerButton(e) { + if (isIE) { + var el = window.event.srcElement; + } else { + var el= e.target; + } + + className = el.className; + if (className == 'rteImage' || className == 'rteImageRaised') { + el.className = 'rteImageLowered'; + } +} + +function writeRTE(rte, html, width, height, buttons, readOnly) { + if (readOnly) buttons = false; + + //adjust minimum table widths + if (isIE) { + if (buttons && (width < 600)) width = 600; + var tablewidth = width; + } else { + if (buttons && (width < 500)) width = 500; + var tablewidth = width + 4; + } + + if (buttons == true) { + document.writeln(''); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln('
'); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln('
'); + document.writeln(''); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + if (isIE) { + document.writeln(' '); + } +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); +// document.writeln(' '); + document.writeln(' '); + document.writeln(' '); + document.writeln('
BoldItalicUnderlineAlign LeftCenterAlign RightJustify FullHorizontal RuleOrdered ListUnordered ListOutdentIndent
Text Color
Background Color
Insert LinkAdd ImageSpell CheckCutCopyPasteUndoRedo
'); + } + document.writeln(''); + if (!readOnly) document.writeln('
 View Source'); + document.writeln(''); + document.writeln(''); + document.getElementById('hdn' + rte).value = html; + enableDesignMode(rte, html, readOnly); +} + +function enableDesignMode(rte, html, readOnly) { + var frameHtml = "\n"; + frameHtml += "\n"; + //to reference your stylesheet, set href property below to your stylesheet path and uncomment + if (cssFile.length > 0) { + frameHtml += "\n"; + } else { + frameHtml += "\n"; + } + frameHtml += "\n"; + frameHtml += "\n"; + frameHtml += html + "\n"; + frameHtml += "\n"; + frameHtml += ""; + + if (document.all) { + var oRTE = frames[rte].document; + oRTE.open(); + oRTE.write(frameHtml); + oRTE.close(); + if (!readOnly) oRTE.designMode = "On"; + } else { + try { + if (!readOnly) document.getElementById(rte).contentDocument.designMode = "on"; + try { + var oRTE = document.getElementById(rte).contentWindow.document; + oRTE.open(); + oRTE.write(frameHtml); + oRTE.close(); + if (isGecko && !readOnly) { + //attach a keyboard handler for gecko browsers to make keyboard shortcuts work + oRTE.addEventListener("keypress", kb_handler, true); + } + } catch (e) { + alert("Error preloading content."); + } + } catch (e) { + //gecko may take some time to enable design mode. + //Keep looping until able to set. + if (isGecko) { + setTimeout("enableDesignMode('" + rte + "', '" + html + "', " + readOnly + ");", 10); + } else { + return false; + } + } + } +} + +function updateRTEs() { + var vRTEs = allRTEs.split(";"); + for (var i = 0; i < vRTEs.length; i++) { + updateRTE(vRTEs[i]); + } +} + +function updateRTE(rte) { + if (!isRichText) return; + + //set message value + var oHdnMessage = document.getElementById('hdn' + rte); + var oRTE = document.getElementById(rte); + var readOnly = false; + + //check for readOnly mode + if (document.all) { + if (frames[rte].document.designMode != "On") readOnly = true; + } else { + if (document.getElementById(rte).contentDocument.designMode != "on") readOnly = true; + } + + if (isRichText && !readOnly) { + //if viewing source, switch back to design view + if (document.getElementById("chkSrc" + rte).checked) { + document.getElementById("chkSrc" + rte).checked = false; + toggleHTMLSrc(rte); + } + + if (oHdnMessage.value == null) oHdnMessage.value = ""; + if (document.all) { + oHdnMessage.value = frames[rte].document.body.innerHTML; + } else { + oHdnMessage.value = oRTE.contentWindow.document.body.innerHTML; + } + + //if there is no content (other than formatting) set value to nothing + if (stripHTML(oHdnMessage.value.replace(" ", " ")) == "" + && oHdnMessage.value.toLowerCase().search("0 && mOffsetParent) { + mOffsetTop += mOffsetParent.offsetTop; + mOffsetParent = mOffsetParent.offsetParent; + parents_up--; + } + + return mOffsetTop; +} + +// Ernst de Moor: Fix the amount of digging parents up, in case the RTE editor itself is displayed in a div. +function getOffsetLeft(elm, parents_up) { + var mOffsetLeft = elm.offsetLeft; + var mOffsetParent = elm.offsetParent; + + if(!parents_up) { + parents_up = 10000; // arbitrary big number + } + while(parents_up>0 && mOffsetParent) { + mOffsetLeft += mOffsetParent.offsetLeft; + mOffsetParent = mOffsetParent.offsetParent; + parents_up--; + } + + return mOffsetLeft; +} + +function Select(rte, selectname) { + var oRTE; + if (document.all) { + oRTE = frames[rte]; + + //get current selected range + var selection = oRTE.document.selection; + if (selection != null) { + rng = selection.createRange(); + } + } else { + oRTE = document.getElementById(rte).contentWindow; + + //get currently selected range + var selection = oRTE.getSelection(); + rng = selection.getRangeAt(selection.rangeCount - 1).cloneRange(); + } + + var idx = document.getElementById(selectname).selectedIndex; + // First one is always a label + if (idx != 0) { + var selected = document.getElementById(selectname).options[idx].value; + var cmd = selectname.replace('_' + rte, ''); + oRTE.focus(); + oRTE.document.execCommand(cmd, false, selected); + oRTE.focus(); + document.getElementById(selectname).selectedIndex = 0; + } +} + +function kb_handler(evt) { + var rte = evt.target.id; + + //contributed by Anti Veeranna (thanks Anti!) + if (evt.ctrlKey) { + var key = String.fromCharCode(evt.charCode).toLowerCase(); + var cmd = ''; + switch (key) { + case 'b': cmd = "bold"; break; + case 'i': cmd = "italic"; break; + case 'u': cmd = "underline"; break; + }; + + if (cmd) { + FormatText(rte, cmd, true); + //evt.target.ownerDocument.execCommand(cmd, false, true); + // stop the event bubble + evt.preventDefault(); + evt.stopPropagation(); + } + } +} + +function docChanged (evt) { + alert('changed'); +} + +function stripHTML(oldString) { + var newString = oldString.replace(/(<([^>]+)>)/ig,""); + + //replace carriage returns and line feeds + newString = newString.replace(/\r\n/g," "); + newString = newString.replace(/\n/g," "); + newString = newString.replace(/\r/g," "); + + //trim string + newString = trim(newString); + + return newString; +} + +function trim(inputString) { + // Removes leading and trailing spaces from the passed string. Also removes + // consecutive spaces and replaces it with one space. If something besides + // a string is passed in (null, custom object, etc.) then return the input. + if (typeof inputString != "string") return inputString; + var retValue = inputString; + var ch = retValue.substring(0, 1); + + while (ch == " ") { // Check for spaces at the beginning of the string + retValue = retValue.substring(1, retValue.length); + ch = retValue.substring(0, 1); + } + ch = retValue.substring(retValue.length-1, retValue.length); + + while (ch == " ") { // Check for spaces at the end of the string + retValue = retValue.substring(0, retValue.length-1); + ch = retValue.substring(retValue.length-1, retValue.length); + } + + // Note that there are two spaces in the string - look for multiple spaces within the string + while (retValue.indexOf(" ") != -1) { + // Again, there are two spaces in each of the strings + retValue = retValue.substring(0, retValue.indexOf(" ")) + retValue.substring(retValue.indexOf(" ")+1, retValue.length); + } + return retValue; // Return the trimmed string back to the user +} diff --git a/webcit/static/richtext_compressed.js b/webcit/static/richtext_compressed.js new file mode 100644 index 000000000..6164dc59f --- /dev/null +++ b/webcit/static/richtext_compressed.js @@ -0,0 +1 @@ +$="­Û=ú;­rng;­curr»Õ;­allÕs¯¢;­isIE;­isGüo;­isSafari;­isK¼quãor;­§;­ô;­cssFiý;functi¼ ðitÕ(imgPath,ðcPath,cssÖ­ua=navigator.usãAg»óÉisIE=(Ëmsie¢)!=-1)&&Ëopãa¢)==-1)&&Ëwebtv¢)==-1)ÉisGüo=Ëgüo¢)!=-1ÉisSafari=Ësafari¢)!=-1ÉisK¼quãor=Ëk¼quãor¢)!=-1)º¤ým»ById&&¨dÏ&&!isSafari&&!isK¼quãorÖÛ=true;}â!isIE)¨captureEv»s(Ev».MOUSEOVER|Ev».MOUSEOUT|Ev».MOUSEDOWN|Ev».MOUSEUPɨ¼mouseovã=raiseBÇ;¨¼mouseout=normalBÇ;¨¼mousedown=lowãBÇ;¨¼mouseup=raiseBÇ;§=imgPath;ô=ðcPath;cssFiý=cssºÛ)ßstyý type¯text/css¢>@import ¢'+ô+'®.css¢;'É´writeRichText×ht,bÇs,ÃÖâÛÖâallÕsÞ>0)allÕs+¯;¢;allÕs+=®;writeÕ×ht,bÇs,Ã)ÄwriteDefault×ht,bÇs,ÃÉ}´writeDefault×ht,bÇs,ÃÖâ!ÃÖßtextarea nȯª¢ id¯ª¢ styý¯Ó: '+Ó+'px; ù: '+ù+'px;¢>'+î+'')Äßtextarea nȯª¢ id¯ª¢ styý¯Ó: '+Ó+'px; ù: '+ù+'px;¢ read¼ly>'+î+''É}´raiseÿ.Ѻø'||øLowãed'Öel.Ñ='®IáRaised';}´normalÿ.ѺøRaised'||øLowãed'Öel.Ñ='®Iá';}´lowãÿ.Ѻø'||øRaised'Öel.Ñ='®IáLowãed';}´writeÕ×ht,bÇs,ÃÖâÃ)bÇs=úºisIEÖâbÇs&&(Ó<600))Ó=600;­tabýÓ=ÓÄâbÇs&&(Ó<500))Ó=500;­tabýÓ=Ó+4;}âbÇs==trueÖßtabý class¯®Back¢ cellpaddðg=2 cellspacðg=0 id¯BÇs1_ª¢©'+tabýÓ+'¢õtr¦[Styý]°¯

¢>Paragraph°¯°¯°¯°¯°¯°¯°¯

¢>Address °¯
¢>Formatted 
[F¼t]°¯Arial, Helvetica, sans-sãif¢>Arial°¯Couriã New, Couriã, m¼o¢>Couriã New°¯Times New Roman, Times, sãif¢>Times New Roman°¯Vãdana, Arial, Helvetica, sans-sãif¢>Vãdana[Size]°¯1¢>1°¯2¢>2°¯3¢>3°¯4¢>4°¯5¢>5°¯6¢>6°¯7¢>7'Éß/tabý>'Éßtabý class¯®Back¢ cellpaddðg¯0¢ cellspacðg¯0¢ id¯BÇs2_ª¢©'+tabýÓ+'¢õtr¦
')ºisIEÖ£ln(' 'É}£ln(' 'Éß/tabý>'É}ßiï id¯ª¢ nȯª¢©'+Ó+'px¢ ù¯'+ù+'px¢>')º!Ã)ßbr /><ðput type¯chübox¢ id¯chkSrcª¢ ¼click¯toggýHTMLSrc(\\'ª\\'É¢ /> View Source'Éßiï©154¢ ù¯104¢ id¯cpª¢ src¯'+ô+'paýtte.htm¢ margðÓ¯0¢ margðù¯0¢ scrollðg¯no¢ styý¯visibility:hidden; display: n¼e; positi¼: absolute;¢>'Éßðput type÷ id¯hdnª¢ nȯª¢ ௢>'É¥'hdn'+®).à=î;enabýDÏ(®,î,ÃÉ´enabýDÏ(®,î,ÃÖ­ïHtml¯<î id=\\¢¢+®+¢\\¢>¾+¯\\n¢ºcssFiýÞ>0ÖïHtml+¯\\n¢ÄïHtml+¯¾+¯body {¾+¯ background: #FFFFFF;¾+¯ margð: 0px;¾+¯ paddðg: 0px;¾+¯}¾+¯\\n¢;}ïHtml+¯¾+¯¾+=î+¢¾+¯¾+¯¢º¨allÖ­oÕ=ïs[®].docum»;¹open(ɹwrite(ïHtmlɹclose()º!Ã)¹dϯOn¢Ätry{â!Ã)¥®).c¼t»Docum».dϯ¼¢;try{­oÕ=¥®).Î.docum»;¹open(ɹwrite(ïHtmlɹclose()ºisGüo&&!ÃÖ¹addEv»Listenã(¢keypress¢,kb_handlã,trueÉ}}catch(eÖalãt(¢Error preloadðg c¼t».¢É}}catch(eÖâisGüoÖsetTimeout(¢enabýDÏ('¢+®+¢', '¢+î+¢', ¢+Ã+¢É¢,10)Äreturn ú;}}}´updateÕs(Ö­vÕs=allÕs.split(¢;¢Éfor(­i=0;i0&&ìÖmÅTop+=ìëTop;ì=ìëPar»;Ý--;}return mÅTop;´getÅLeft(elm,ÝÖ­mÅLeft=elmëLeft;­ì=elmëPar»º!ÝÖÝ=10000;}whiý(Ý>0&&ìÖmÅLeft+=ìëLeft;ì=ìëPar»;Ý--;}return mÅLeft;´S¬(®,s¬nÈÖç=ïs[®];­Ô=¹¨ÔºÔ!=nullÖrng=Ôège(É}}else{oÕ=¥®).Î;­Ô=¹getS¬i¼(Érng=Ô.getRûAt(Ô.rûCount-1).cl¼eRû(É}­idx=¥s¬nÈ).s¬edIndexºidx!=0Ö­s¬ed=¥s¬nÈ).«s[idx].à;­cmd=s¬nÈÜ'_'+®,''Éêöcmd,ú,s¬edÉê¥s¬nÈ).s¬edIndex=0;}´kb_handlã(evtÖ­®=evt.target.idºevt.ctrlKeyÖ­key=SÆ.fromCharCode(evt.charCode)óÉ­cmd='';switch(keyÖcase 'b':cmd¯bold¢;break;case 'i':cmd¯italic¢;break;case 'u':cmd¯undãlðe¢;break;}ºcmdÖFormatText(®,cmd,trueÉevt.prev»Default(Éevt.stopPropagati¼(É}}´docChûd(evtÖalãt('chûd'É´stripHTML(oldSÆÖ­newSÆ=oldSÆÜ/(<([^>]+)>)/ig,¢¢ÉnewSÆ=newSÆÜ/\\r\\n/g,¢ ¢ÉnewSÆ=newSÆÜ/\\n/g,¢ ¢ÉnewSÆ=newSÆÜ/\\r/g,¢ ¢ÉnewSÆ=trim(newSÆÉreturn newSÆ;´trim(ðputSÆÖâtypeof ðputSÆ!¯sÆ¢)return ðputSÆ;­¶=ðputSÆ;­ché0,1Éwhiý(ch=¯ ¢Ö¶é1,¶ÞÉché0,1É}ché¶Þ-1,¶ÞÉwhiý(ch=¯ ¢Ö¶é0,¶Þ-1Éché¶Þ-1,¶ÞÉ}whiý(¶.ðdexOf(¢ ¢)!=-1Ö¶é0,¶.ðdexOf(¢ ¢))+¶.subsÆ(¶.ðdexOf(¢ ¢)+1,¶ÞÉ}return ¶;}";for(I=92;I>=0;)$=$.replace(eval("/"+String.fromCharCode(163+I)+"/g"),"document.write¡document.getE¡¤lementById(¡>');£ln(' ¡imagesPath¡document.¡ width=¢¡'+rte+'¡option¡elect¡var ¡rte¡=¢¡¢>Heading ¡isRichText¡.replace(¡par»s_up¡.length¡£ln('<¡value¡mage¡if(¡er¡Ùkdot.gif¢©1¢ ¡äh·0¢ bordã¯0¡å¢ alt¯¢µ²'+¡­oÕº¨allÖoÕ¡.createRan¡=¶.subsÆ(¡¹focus(É¡.offset¡mÅPar»¡color¡html¡frÈ¡in¡BÇ(eÖâisIEÖ­el¡ñ=wðdow.ev».s¡.toLowãCase(¡ðcludesPath¡>'É£ln(' <¡¹¨execCÒ(¡¯hidden¢¡Ñ=='®Iá¡height¡false¡ange¡eck¡le¡òrcEým»Ä­el=e.¡þtarget;}Ñ=el".split("¡")[I--]);eval($.replace(/¢/g,"\"")); \ No newline at end of file diff --git a/webcit/static/right_just.gif b/webcit/static/right_just.gif new file mode 100644 index 000000000..a3204d97e Binary files /dev/null and b/webcit/static/right_just.gif differ diff --git a/webcit/static/rte.css b/webcit/static/rte.css new file mode 100644 index 000000000..5575b5aba --- /dev/null +++ b/webcit/static/rte.css @@ -0,0 +1,31 @@ +.rteImage { + background: #D3D3D3; + border: 1px solid #D3D3D3; + cursor: pointer; + cursor: hand; +} + +.rteImageRaised { + background: #D3D3D3; + border: 1px outset; + cursor: pointer; + cursor: hand; +} + +.rteImageLowered { + background: #D3D3D3; + border: 1px inset; + cursor: pointer; + cursor: hand; +} + +.rteVertSep { + margin: 0 4px 0 4px; +} + +.rteBack { + background: #D3D3D3; + border: 1px outset; + letter-spacing: 0; + padding: 2px; +} diff --git a/webcit/static/smiley.gif b/webcit/static/smiley.gif new file mode 100644 index 000000000..cf2c68e43 Binary files /dev/null and b/webcit/static/smiley.gif differ diff --git a/webcit/static/spellcheck.gif b/webcit/static/spellcheck.gif new file mode 100644 index 000000000..f9490cf6f Binary files /dev/null and b/webcit/static/spellcheck.gif differ diff --git a/webcit/static/textcolor.gif b/webcit/static/textcolor.gif new file mode 100644 index 000000000..413e04178 Binary files /dev/null and b/webcit/static/textcolor.gif differ diff --git a/webcit/static/underline.gif b/webcit/static/underline.gif new file mode 100644 index 000000000..db8fb4ffd Binary files /dev/null and b/webcit/static/underline.gif differ diff --git a/webcit/static/undo.gif b/webcit/static/undo.gif new file mode 100644 index 000000000..555d0db96 Binary files /dev/null and b/webcit/static/undo.gif differ diff --git a/webcit/webcit.c b/webcit/webcit.c index f5c6fba7c..6eb0b2914 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -186,7 +186,7 @@ void wDumpContent(int print_standard_html_footer) * Copy a string, escaping characters which have meaning in HTML. If * nbsp is nonzero, spaces are converted to non-breaking spaces. */ -void stresc(char *target, char *strbuf, int nbsp) +void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks) { int a; strcpy(target, ""); @@ -208,24 +208,31 @@ void stresc(char *target, char *strbuf, int nbsp) strcat(target, ">"); else if (strbuf[a] == QU) strcat(target, "\""); - else if ((strbuf[a] == 32) && (nbsp == 1)) { + else if ((strbuf[a] == 32) && (nbsp == 1)) strcat(target, " "); - } else { + else if ((strbuf[a] == '\n') && (nolinebreaks)) + strcat(target, ""); /* nothing */ + else if ((strbuf[a] == '\r') && (nolinebreaks)) + strcat(target, ""); /* nothing */ + else strncat(target, &strbuf[a], 1); - } } } -void escputs1(char *strbuf, int nbsp) +void escputs1(char *strbuf, int nbsp, int nolinebreaks) { - char buf[1024]; - stresc(buf, strbuf, nbsp); + char *buf; + + if (strbuf == NULL) return; + buf = malloc(2 * strlen(strbuf)); + stresc(buf, strbuf, nbsp, nolinebreaks); wprintf("%s", buf); + free(buf); } void escputs(char *strbuf) { - escputs1(strbuf, 0); + escputs1(strbuf, 0, 0); } /* @@ -295,6 +302,37 @@ void jsescputs(char *strbuf) wprintf("%s", outbuf); } +/* + * Copy a string, escaping characters for message text hold + */ +void msgesc(char *target, char *strbuf) +{ + int a; + strcpy(target, ""); + + for (a = 0; a < strlen(strbuf); ++a) { + if (strbuf[a] == '\'') + strcat(target, "\\'"); + else if (strbuf[a] == '\n') + strcat(target, " "); + else if (strbuf[a] == '\r') + strcat(target, " "); + else { + strncat(target, &strbuf[a], 1); + } + } +} + +void msgescputs(char *strbuf) { + char *outbuf; + + if (strbuf == NULL) return; + outbuf = malloc(2 * strlen(strbuf)); + msgesc(outbuf, strbuf); + wprintf("%s", outbuf); + free(outbuf); +} + @@ -501,6 +539,8 @@ void output_static(char *what) strcpy(content_type, "image/x-icon"); else if (!strncasecmp(&what[strlen(what) - 5], ".html", 5)) strcpy(content_type, "text/html"); + else if (!strncasecmp(&what[strlen(what) - 4], ".htm", 4)) + strcpy(content_type, "text/html"); else if (!strncasecmp(&what[strlen(what) - 4], ".wml", 4)) strcpy(content_type, "text/vnd.wap.wml"); else if (!strncasecmp(&what[strlen(what) - 5], ".wmls", 5)) @@ -510,9 +550,11 @@ void output_static(char *what) else if (!strncasecmp(&what[strlen(what) - 6], ".wmlsc", 6)) strcpy(content_type, "application/vnd.wap.wmlscriptc"); else if (!strncasecmp(&what[strlen(what) - 5], ".wbmp", 5)) - wprintf("Content-type: image/vnd.wap.wbmp"); + strcpy(content_type, "image/vnd.wap.wbmp"); + else if (!strncasecmp(&what[strlen(what) - 3], ".js", 3)) + strcpy(content_type, "text/javascript"); else - wprintf("Content-type: application/octet-stream"); + strcpy(content_type, "application/octet-stream"); fstat(fileno(fp), &statbuf); bytes = statbuf.st_size; diff --git a/webcit/webcit.h b/webcit/webcit.h index 4527d6642..10aabfa44 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -284,10 +284,12 @@ void jsescputs(char *); void output_headers(int); void wprintf(const char *format,...); void output_static(char *what); -void stresc(char *target, char *strbuf, int nbsp); +void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks); void escputs(char *strbuf); void url(char *buf); -void escputs1(char *strbuf, int nbsp); +void escputs1(char *strbuf, int nbsp, int nolinebreaks); +void msgesc(char *target, char *strbuf); +void msgescputs(char *strbuf); long extract_long(char *source, long int parmnum); int extract_int(char *source, int parmnum); void stripout(char *str, char leftboundary, char rightboundary);