65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (6投票s)

2005年9月25日

4分钟阅读

viewsIcon

32002

downloadIcon

220

一篇关于一个能帮助您撰写Code Project文章的实用工具的文章。

1. 全页面预览
NewArticleHelper1.gif

2. 顶部的文件操作部分
NewArticleHelper2.gif

3. 底部的文本编辑部分
NewArticleHelper3.gif

  • 引言
  • 如何使用
  • 工作原理
            打开文件
            保存到文件
            关闭文件
            预览当前工作
            加载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;
    }
    

    历史

  • 2005年9月25日 - 首次发布
  • © . All rights reserved.