集成组合实用程序,使您的 CP 文章写作能力加倍






3.50/5 (6投票s)
2005年9月25日
4分钟阅读

32002

220
一篇关于一个能帮助您撰写Code Project文章的实用工具的文章。
1. 全页面预览
2. 顶部的文件操作部分
3. 底部的文本编辑部分
打开文件
保存到文件
关闭文件
预览当前工作
加载CP文章模板
引言
或许,对于阅读本文的各位来说,先阅读Code Project Article Writer Helper这篇文章会更好,该文由Jason Henderson撰写。事实上,这项工作就是基于他出色的作品。
当有人推荐我使用Jason Henderson贡献的Code Project Article Writer Helper来撰写文章时,我发现自己被这个精美的工具深深吸引。该工具的文本编辑部分非常好用,整个界面看起来既漂亮又清晰。
但是,在我自己的电脑上使用时,遇到了一些问题。例如,打开HTML文件…按钮无法正常打开文件。我总是收到这样的提示:抱歉,您必须手动将此HTML复制/粘贴到Article Helper中。 而且,当我有时编写一个很长的HTML文件时,每次按下按键,文本编辑区域的光标都会自己向上跳。因此,我的写作经常无法进行。我不知道是否还有其他人遇到这些问题,以及他们是如何解决的。
既然我如此喜欢它,为什么不能做些什么来改进它呢?因此,我尽力改进了这个工具。
文本编辑部分几乎完全继承下来,只有一些小的修改;而文件操作部分则几乎是全新的。执行一些常用文本编辑功能的按钮,如全选、剪切、复制,被移除了,因为大多数用户可以通过快捷键或至少通过菜单来操作它们。当前工作的预览被放在了一个新窗口中,我认为这有时比在同一页面编辑更方便。添加了加载文章模板按钮,以便用户能够快速开始新文章的撰写。为了表达我对Jason Henderson的尊重,我尽可能地保留了他的UI风格。
如何使用
该工具只是一个单独的HTML文件。您可能需要用Microsoft Internet Explorer打开它。
使用方法非常简单。首先,您可以按打开…按钮打开现有文件,或者按加载文章模板按钮加载文章模板,或者直接从一个空文件开始。现在您可以进行编辑。编辑过程中,您可以随时保存或预览您的工作。您还可以关闭当前文件或打开其他文件。这与一些其他应用程序中常见的文件操作几乎相同。
工作原理
我将主要讨论由JavaScript编写的文件操作功能。每个函数都将以简短的解释开始。
打开文件
实际上,使用一个隐藏的类型为file的input对象来打开一个文件选择对话框。但它不太美观且难以定制,因此它与用户交互的角色由一个文本input对象fileName和打开…按钮来承担。以下是处理点击打开…按钮的实际代码。使用一个ActiveXObject来读取所选文件的内容。bTextChanged
是一个全局变量,用于指示文件在打开后或上次保存后文本是否发生过更改。
function OpenFile() { fileClose(); fileInput.click(); var fileName = fileInput.value; if (fileName=="") return false; Form1.fileName.value = fileName; var ForReading = 1; var TristateUseDefault = -2; try { var fso = new ActiveXObject("Scripting.FileSystemObject"); var File = fso.OpenTextFile(fileName, ForReading, false, TristateUseDefault); Form1.inputarea.value = ""; Form1.inputarea.value = File.ReadAll(); File.close(); Form1.inputarea.focus(); bTextChanged = false; } catch(err) { } }
保存到文件
当未指定当前文件名或当前文件被标记为只读时,保存按钮的标签将变为另存为…,保存操作将打开一个另存为对话框,该对话框实际上是从一个不可见的frame调用的。否则,标签将是保存,文件将被保存到由input对象fileName指定的文件中。
不幸的是,语句FrameForSave.document.execCommand("SaveAs", true, "New Article");
无法返回用户用于保存文件的文件名。因此,新保存的文件名无法显示在input对象fileName中。另一个问题是,我们无法阻止将当前文本保存到当前标记为只读的文件中。
function Save() { bTextChanged = false; if (Form1.btnSave.value == "Save As...") { FrameForSave.document.open("text/html", "replace"); FrameForSave.document.write(Form1.inputarea.value); FrameForSave.document.close(); FrameForSave.document.execCommand("SaveAs", true, "New Article"); } else { var ForWriting = 2; var TristateUseDefault = -2; try { var fso = new ActiveXObject("Scripting.FileSystemObject"); var File = fso.OpenTextFile(Form1.fileName.value, ForWriting, true, TristateUseDefault); File.write(Form1.inputarea.value); File.close(); } catch(err) { } } }
保存按钮的状态由fileName对象和checkReadOnly对象控制。它们调用此函数来更改保存按钮的标签。
function SwitchSaveState() { if (Form1.checkReadOnly.checked | Form1.fileName.value == "") Form1.btnSave.value = "Save As..."; else Form1.btnSave.value = "Save"; }
关闭文件
关闭文件时,如果文件已更改但未保存,则会显示一个对话框,询问用户的意图是保存文件还是不保存。
function fileClose() { if (bTextChanged == true) if (confirm("Text of the file has been changed. Do you want to save it?")) Save(); Form1.fileName.value = ""; Form1.inputarea.value = ""; Form1.btnSave.value = "Save As..."; bTextChanged = false; }
预览当前工作
将显示一个新窗口进行预览,您可以轻松自定义。
function Preview() { var codes=Form1.inputarea.value; var win = window.open("", "PreviewWindow", "top=0, left=0, height=400, width=700, \ toolbar=no, menubar=yes, scrollbars=yes, \ resizable=yes,location=no, status=no") win.focus(); win.document.open("", "replace"); win.document.write(codes); win.document.close(); }
加载CP文章模板
函数LoadTemplate
加载一个不可见对象的内容,该对象的值设置为code project文章模板的内容。
function LoadTemplate()
{
fileClose();
Form1.inputarea.value = templateFile.value;
bTextChanged = false;
}