• CyberArticle二次开发手册 – 5、CyberArticle 文章

    发表于 2009年06月4日 魏 拾俊 没有评论

    每一个CyberArticle文章,都是一个HTML文件。CyberArticle将HTML以及所包含的图片等资源,打包并压缩成一个zip数据包,保存在数据库的Nodes.Article字段内。

    文章节点,都有一个Article属性,可以获得HTML文章对象(ICAArticle)。

    ICAArticle对象的主要属性和方法

    • SaveAsHTML:保存成一个HTML文件。采用unicode编码。
    • SaveAsHTMLAnsi:保存成一个HTML文件,采用ansi或者多字节编码,例如gb2312,utf-8等编码。具体编码,由html文件里面原始的编码指定。如果原始编码是unicode,则保存后采用utf-8编码。
    • SaveAsHTMLAnsiEx:保存成HTML文件,采用ansi或者多字节编码。可以指定是否允许使用utf-8编码。如果不允许使用utf-8,则会采用当前系统的默认字符集老保存那些unicode文件。
    • SaveAsMime:保存成mime文件,扩展名一般是.mht。
    • Children属性:或者HTML资源(ICAArticleResourceCollection)。

    ICAArticleResourceCollection说明

    ICAArticleResourceCollection是一个文章资源集合,除了具有Count和Item两个属性外,还有其它几个重要的方法。利用这个对象,可以删除或者更新某一个文章资源,例如更新或者删除里面的某一个图片。

    • Count:获得HTML资源的数量。包括HTML代码本身。
    • Item:活的某一个资源。Item(0)就是文章的HTML代码(ICAArticleResource)。
    • ItemFromName:通过资源名称,获得某一个资源。按照名称查找的时候,不区分大小写。
    • BeginUpdate:开始更新资源。如果要删除或者更新某一个资源,在删除或者更新之前,需要调用该方法。
    • EndUpdate:结束更新资源。如果要删除或者更新某一个资源,在删除或者更新之后,需要调用该方法。调用之后,会把修改后的数据保存到数据库。
    • GetArticleSourceCode:获得文章的HTML代码。在调用GetArticleSourceCode之前,不需要调用BeginUpdate。
    • SetArticleSourceCode:设置文章的HTML代码。在调用SetArticleSourceCode之前,也需要调用BeginUpdate。之后调用EndUpdate,才会保存数据。

    ICAArticleResourceCollection对象主要的功能,就是可以单独更新或者删除某一个资源。

    ICAArticleResource对象主要属性和方法

    通过ICAArticleResourceCollection.Item,可以获得每一个文章资源。文章资源对象就是ICAArticleResource。

    • Name:资源名称,就是保存成HTML之后的文件名(不包含路径)
    • URL:资源的URL,例如HTML里面的某一个图片的原始URL。
    • Size:资源的大小。
    • SaveToStream:将资源数据,保存到一个IStream里面。

    例子

    下面的代码,我们在一个书籍内建立一个新的文章,然后把文章保存成HTML文件,并且获得其中的每一个文章资源,显示出文章资源的名称和URL。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    function Test()
    {
        var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
        for (var i = 0; i < objBookCollection.Count; i++)
        {
            var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
            //
            var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
            try
            {
                objBook.Open(guidBook); //打开书籍
            }
            catch (e)
            {
                continue;
            }
            //…
            var nodeRoot = objBook.RootNode;
            //
            var nodeArticle = objBook.CreateArticle(nodeRoot, “My Article”); //创建文章
            //文章html
            var htmlText = “<html><head><title>My First SDK Article</title></head><body><h1>My First SDK Article</h1><p>Test text…</p><img src=http://www.wizbrother.com/screenshots/cyberarticle.png></img></body></html>”;
            //创建一个profile
            var objProfile = new ActiveXObject(“CyberArticleBook.CAProfile”);
            objProfile.Name = “Test”;
            objProfile.IncludeImages = true;
            objProfile.DownloadItems = true;
            //使用html文字设置文章内容
            nodeArticle.InitArticle(htmlText, “”, objProfile);
            //
            var objArticle = nodeArticle.Article;   //获得ICAArticle对象
            objArticle.SaveAsHTML(“T:\\temp\\1.htm”);   //保存成HTML文件
            //
            var objArticleResourceCollection = objArticle.Children; //获得ICAArticleResourceCollection
            for (var iResource = 0; iResource < objArticleResourceCollection.Count; iResource++)
            {
                var objArticleResource = objArticleResourceCollection.Item(iResource);
                //
                if (0 == iResource)
                {
                    //第一个资源,显示HTML代码
                    jsAlert(objArticleResourceCollection.GetArticleSourceCode());
                }
                else
                {
                    //显示资源名称和URL
                    jsAlert(objArticleResource.Name + “\n” + objArticleResource.URL);
                }
            }
            //…
            objBook.Close();
            //
            return;
        }
    }
    Test();

    程序运行后的效果如下图:

    Item(0),显示文章HTML代码。注意看里面有一个%ResourceFilePath% / cyberarticle[1].png。在CyberArticle保存后的HTML代码里面,%ResourceFilePath%代表了HTML资源所在的子目录名称,例如xxx_files。在保存成html的时候,CyberArticle会自动替换。

    下面显示了资源的名称和URL(就是初始化html的时候引用的图片)。

    从上面的的例子中可以看到,通过文章对象,可以轻松的操作CyberArticle里面的文章。

  • CyberArticle二次开发手册 – 4、CyberArticle 节点

    发表于 2009年06月4日 魏 拾俊 没有评论

    CyberArticle书籍内最重要的元素就是节点(ICANode)。无论是文件夹还是文章,都是一个节点。

    节点的主要属性和方法

    • ID:节点的ID。书籍内每一个节点都有一个唯一的ID。
    • ParentID:节点的父节点ID。除了根节点,每一个节点,都有一个父节点。
    • ParentNode:节点的父节点。除了根节点,每一个节点,都有一个父节点。
    • Type:节点类型:0是文件夹,1是文章
    • Pos:位置。在同一级别的节点位置,按照从小到大排序。
    • DateCreated:创建时间
    • Color:文字颜色
    • BgColor:背景颜色
    • IconIndex:图标索引。>=0,是系统图标;<0:自定义图标
    • Title:标题
    • Owner:节点所有者。就是创建节点的CyberArticle所在的计算机的名称。
    • MoveTo:移动节点到另外一个节点。父节点,回收站不能移动。
    • MoveToRecycleBin:移动节点到回收站。如果节点已经在回收站,则彻底删除。
    • Delete:删除
    • GetPrevSiblingNode:获得当前节点的前一个同级别节点。
    • GetNextSiblingNode:获得当前节点的下一个同级别节点。
    • Attribute:扩展属性。可以用来存储任何数据。属性名称长度最大为50个字符,属性值的最大长度为255个字符。
    • Book:获得节点所在的书籍。
    • Size:文章或者文件夹的大小。
    • IsIn:可以判断一个节点是否在另外一个节点内。

    文件夹独有的属性和方法

    • Children:获得文件夹的子节点。
    • FindChildNode:通过标题查找一个子节点。

    文章独有的属性和方法

    • DateModified, DateAccessed:最后一次修改,访问文章时间。
    • Unread:文章是否未读
    • FileType:文件类型。对于保存的网页,是.htm,对于导入的文件,则是.doc, .pdf等等,保存了文件的扩展名。
    • Author:作者
    • Keywords:关键字
    • Label1, Label2, Label3, Label4, Label5:标签1-5
    • URL:文章的网址,或者导入的文件原始路径
    • Coments:注释
    • Text:文章里面的文字。如果是网页,则保存的网页里面的文字内容。
    • Article:获得文章对象(ICAArticle)。
    • Attachments:文件附件。(ICAAttachmentCollection)
    • InitArticle:设置文章内容。可以通过一个HTML字符串和一个网址,来初始化或者修改文章内容。
    • AddAttachment:添加附件。

    书籍内的重要节点

    • 根节点。任何一个书籍都有一个根节点。在创建书籍的时候,系统会自动创建根节点。根节点的名称就是书籍的名称,根节点的ID为0。
    • 回收站。任何一个书籍都有一个回收站。在创建书籍的时候,系统会自动创建回收站。回收站的ID为-1。

    关于节点对象的详细定义,请参考开发人员手册

    书籍内创建节点,创建文件夹和文章,并且给文章设置内容。

    下面是一个例子,用来打开每一个书籍,然后在根节点下面,查找 “I love CyberArticle” 这个文件夹。如果没有找到,则建立这个文件夹。然后在这个文件夹下面创建一个文章,并且用一段HTML文字来设置文章内容。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        //
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
        }
        catch (e)
        {
            continue;
        }
        //…
        var nodeRoot = objBook.RootNode;
        //
        var nodeILoveCyberArticle = null;
        try
        {
            nodeILoveCyberArticle = nodeRoot.FindChildNode(“I love CyberArticle”);  //根节点下面查找文件夹
        }
        catch (e)
        {
            //如果找不到,会有一个异常,我们在这里捕获这个异常。
        }
        //
        if (!nodeILoveCyberArticle || nodeILoveCyberArticle.Type != 0)  //如果没有找到,后者不是文件夹
        {
            nodeILoveCyberArticle = objBook.CreateFolder(nodeRoot, “I love CyberArticle”);  //创建一个新的文件夹
        }
        if (nodeILoveCyberArticle)
        {
            var nodeArticle = objBook.CreateArticle(nodeILoveCyberArticle, “My First SDK Article”);//创建文章
            //文章html
            var htmlText = “<html><head><title>My First SDK Article</title></head><body><h1>My First SDK Article</h1><p>Test text…</p><img src=http://www.wizbrother.com/screenshots/cyberarticle.png></img></body></html>”;
            //创建一个profile
            var objProfile = new ActiveXObject(“CyberArticleBook.CAProfile”);
            objProfile.Name = “Test”;
            objProfile.IncludeImages = true;
            objProfile.DownloadItems = true;
            //使用html文字设置文章内容
            nodeArticle.InitArticle(htmlText, “”, objProfile);
        }
        //…
        objBook.Close();
    }

    从上面的例子可以看到如何通过书籍获得根节点,然后在节点下面查找文件夹,创建子文件夹和文章,并且用一段HTML文字来初始化文章。HTML里面可以用用图片等等资源,CyberArticle会自动将图片也保存到书籍中,就和在浏览器内保存网页是一样的效果。

    结果如下图:

    通过这种方式,如果定义好一个模板,只需要输入一些文字,然后格式化成HTML文件,保存到书籍里面,我们就可以非常容易的批量的生成大量格式相同的文章,例如公文等等。而且由于HTML本身的公开和易用,使得控制格式,也非常简单。如果用C#或者其它高级语言编写一个这样的程序,用于生成公文之类的文章,相信应该非常有用。同时利用CyberArticle WebShare组件,将文章发布出去,就是一个简单易用的文档生成和发布系统。

     

  • CyberArticle二次开发手册 – 3、CyberArticle 书籍

    发表于 2009年06月3日 魏 拾俊 没有评论

    CyberArticle的资料,都保存在一个一个的书籍中。一个书籍,对应于一个数据库。CyberArticle的书籍,分为本地书籍和远程书籍。

    • 本地书籍:使用桌面数据库系统,例如Access,SQL Server Express或者SQLite数据库。书籍的文件,保存在安装CyberArticle的电脑上面。每一个书籍,对应一个(Access/SQLite)或者多个书籍文件(SQL Server Express)。
    • 远程书籍:使用大型数据库,例如SQL Server,MySQL数据库。数据保存在数据库服务器上面(当然也可以保存在本机)。

    CyberArticle通过OLEDB方式连接这些数据库。同样,您也可以使用其它软件,例如各种数据库软件的管理工具,来打开相应的数据库。

    CyberArticle通过ICABook对象,来封装了各种数据库的链接,打开和关闭等操作。使用ICABook,您不需要关心不同数据库之间的区别,甚至您根本不需要关心数据库。

    ICABookCollection对象

    CyberArticle把所有的书籍的一些数据库信息,都保存在Books.xml文件里面(数据库连接串被加密,以防用户名,密码等信息泄露)。同时,CyberArticle提供了ICABookCollection这个对象来访问这个文件。

    下面的代码,创建了一个ICABookCollection对象,然后通过循环,显示了书籍列表里面,每一个书籍的名称。将下面的脚本保存成*.js文件,然后双击运行,就可以看到效果。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);    //ICABookCollection
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var bookname = objBookCollection.BookName(i);    //获得书籍名称
        jsAlert(bookname);
    }

    通过ICABookCollection对象,您可以获得每一个书籍的相关信息,例如GUID(用来标示每一个书籍),数据库连接串,书籍名称,书籍文件名(如果有的话),图标索引,分类等信息。

    同时,通过ICABookCollection,你还可以添加书籍和删除书籍。具体功能,请参看开发人员手册

    ICABook对象

    ICABook对象,提供了大量的属性和方法,主要有以下几类:

    • 打开和关闭书籍
    • 书籍属性,例如GUID,名称,图标索引
    • 节点信息,例如获得根节点,回收站,创建文件夹,文章,获得某一个指定的节点,获得某一类节点等等
    • 搜索书籍
    • 获得书籍内其它的元素,例如附件,图标,标签等等
    • 其它操作,例如压缩,备份等等

    打开和关闭书籍

    下面的代码,演示了如何打开书籍。通过循环,获得每一个书籍的GUID,然后调用ICABook对象的Open函数来打开书籍。如果无法打开,则显示一个对话框,提示不能打开某一个书籍。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
            
    //…
            objBook.Close();
        }
        catch (e)
        {
            var bookname = objBookCollection.BookName(i); //打开失败
            jsAlert(“不能打开书籍:” + bookname);
        }
    }

    获得书籍属性

    下面的代码,可以显示每一个书籍的名称:通过ICABook对象获得,而不是在Books.xml文件里面保存的书籍名称(ICABookCollection)。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
            jsAlert(objBook.Name);
            //…
            objBook.Close();
        }
        catch (e)
        {
            var bookname = objBookCollection.BookName(i); //打开失败
            jsAlert(“不能打开书籍:” + bookname);
        }
    }

    节点信息

    下面的代码,显示了每一个书籍的节点数量,同时在每一个书籍的根节点下面,创建了一个叫做 “I love CyberArticle”的文件夹。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
            //…
            jsAlert(objBook.Nodes.Count);
            var objNewNode = objBook.CreateFolder(objBook.RootNode, “I love CyberArticle”);  //在书籍根节点下面,创建一个新的节点。
            //…
            objBook.Close();
        }
        catch (e)
        {
            var bookname = objBookCollection.BookName(i); //打开失败
            jsAlert(“不能打开书籍:” + bookname);
        }
    }

    搜索书籍

    下面的代码,在每一个书籍中,搜索”CyberArticle”,然后显示出搜索结果的一个节点标题(如果有的话):

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
            //…
            var objResult = objBook.Search(“CyberArticle”, 1 + 2, 100); //搜索书籍
            if (objResult && objResult.Count > 0)   //如果搜索到
            {
                jsAlert(objResult.Item(0).Title);   //显示第一个节点的标题
            }
            //…
            objBook.Close();
        }
        catch (e)
        {
            var bookname = objBookCollection.BookName(i); //打开失败
            jsAlert(“不能打开书籍:” + bookname);
        }
    }

    获得书籍其它元素信息

    下面的代码,可以显示出,每一个书籍里面,附件的数量。如果有附件的话,显示第一个附件的名称。

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
            //…
            var objAttachments = objBook.Attachments;   //获得书籍内所有附件
            if (objAttachments)
            {
                jsAlert(objAttachments.Count); //显示书籍数量
                if (objAttachments.Count > 0)
                {
                    jsAlert(objAttachments.Item(0).Name);   //显示第一个附件的名称
                }
            }
            //…
            objBook.Close();
        }
        catch (e)
        {
            var bookname = objBookCollection.BookName(i); //打开失败
            jsAlert(“不能打开书籍:” + bookname);
        }
    }

    压缩/备份书籍

    下面的代码,可以压缩每一个书籍

    var objShell = new ActiveXObject(“WScript.Shell”);
    function jsAlert(msg)
    {
        return objShell.Popup(msg, 10000, “CyberArticle”, 0);
    }
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
            //…
            objBook.Compress();
            //…
            objBook.Close();
        }
        catch (e)
        {
            var bookname = objBookCollection.BookName(i); //打开失败
            jsAlert(“不能打开书籍:” + bookname);
        }
    }

    从上面的例子可以看出,只要获得了ICABook对象,您可以对书籍做任何操作。关于书籍的其它操作,请参考开发人员手册。

     

  • CyberArticle二次开发手册 – 2、CyberArticle COM对象

    发表于 2009年06月3日 魏 拾俊 没有评论

    要对CyberArticle进行二次开发,主要的方式,就是通过调用COM对象,而二次开发的核心内容,也就是COM对象的使用。

    CyberArticle的COM对象主要分为以下几类:

    1、书籍和节点相关的对象

    CyberArticle的数据,都保存在书籍中,而书籍里面的基本元素就是节点。

    • 书籍:ICABook
    • 节点:ICANode
    • 文章:ICAArticle

    通过ICABook,可以打开,关闭一个书籍,或者获得书籍里面的节点等信息。

    ICANode是书籍里面的节点。文件夹,文章,统一称为节点。无论是文件夹,还是文章,都是一个节点。通过ICANode的相关信息,可以获得节点的信息,例如类型,标题等等。

    ICAArticle则是文章节点所包含的文章数据对象。通过ICAArticle,可以将文章保存成HTML文件,或者更新一个文章等等。通过ICANode可以获得ICAArticle。

    其他相关对象:

    • ICALabel:标签
    • ICAAttachment:附件
    • ICAArticleResource:文章资源。CyberArticle文章是一个HTML文件。HTML文件不但有HTML代码本身,还包括里面引用的CSS,图片,Flash等等资源。
    • ICAProfile:用来保存文章的配置文件,可以设置是否包含图片,包含脚本等等。
    • ICABookmark:书签。一个书签可以代表一个书签文件夹或者一篇文章
    • ICAIcon:图标。书籍内的自定义图标。
    • ICACommand:保存网页的命令。
    • ICADatabase:CyberArticle数据库对象
    • ICADBError:CyberArticle数据库操作错误对象
    • ICANodeHistory:结点历史纪录对象

    2、集合对象

    通常节点,书籍等等,都可能需要一个类似数组的集合,例如获得一个文件夹下面的文章,就需要一个集合。CyberArticle里面,对象的集合,都是ICAXXXCollection这样的对象。

    • ICABookCollection:书籍集合
    • ICANodeCollection:节点集合
    • ICALabelCollection:标签集合
    • ICAAttachmentCollection:附件集合
    • ICAArticleResourceCollection:文章资源集合
    • ICAProfileCollection:配置文件集合
    • ICABookmarkCollection:书签集合
    • ICAIconCollection:图标集合
    • ICANodeHistoryCollection:节点历史数据集合

    每一个Collection对象,都至少具有以下两个属性:

        [propget, id(1), helpstring("property Count")] HRESULT Count([out, retval] LONG* pVal); 
        [propget, id(2), helpstring("property Item")] HRESULT Item([in] LONG nIndex, [out, retval] IDispatch** pVal);
    • 属性Count:返回集合的元素数量。
    • 属性Item:获得某一个元素。

    下面是一个使用的例子:

    C++ 例子

    ICANodeCollection* pNodeCollection(pDisp);
    //
    long nCount = 0;
    pNodeCollection->get_Count(&nCount);//获得节点数量
    //
    for (long i = 0; i < nCount; i++)
    {
        CComPtr<IDispatch> spDispNode = NULL;
        if (FAILED(pNodeCollection->get_Item(i, &spDispNode)))//获得一个节点
            continue;
        //
        CComQIPtr<ICANode> spNode(spNodeDisp);//转换为ICANode
        //
        CComBSTR bstrTitle;
        spNode->get_Title(&bstrTitle);//获得标题
        AfxMessageBox(CString(bstrTitle));//显示标题
    }

    VBScript 例子

    For i = 0 To objNodeCollection.Count - 1 Step 1
        Dim objNode
        Set objNode = objNodeCollection.item(i)
        MsgBox(objNode.Title)
    Next

    JavaScript例子

    objBook.Open(guidBook);
    var childNodes = objBook.RootNode.Children;
    for (var i = 0; i < childNodes.Count; i++)
    {
       jsAlert(childNodes.Item(i).Title);
    }

    3、UI相关对象

    • ICABookTools:书籍工具,可以显示创建/打开书籍对话框等等
    • ICACommonUI:通用UI,可以显示书籍,节点属性等对话框。
    • ICAHelper:可以用来在IE里面保存网页,并显示保存网页对话框
    • ICAContextMenu:IE右键菜单
    • ICAToolButton:IE工具栏按钮
    • ICAImportHTML,ICAImportHTMLData,ICAImportHTMLDataCollection:用来批量导入文件

    4、CyberArticle用户交互

    • ICAAutomationApp:可以获得正在正在运行的CyberArticle的一些相关信息,例如用户正在打开的文章,选中的节点等等。

    5、BookBuilder批量下载保存网页

    • ICABookBuilderAutomationApp:可以调用BookBuilder,批量下载网页。

    6、通用对象,和CyberArticle没有关系,可以在任何地方使用

    • IWizBubbleWnd:一个消息框,通常用来显示一个信息。如果用户没有操作,一段时间后,自动消失
    • IWizURLDownloader:可以用来下载文件并获得下载后的文件
    • IWizProgressWnd:一个进度对话框
    • IWizRtf2Html:RTF2HTML,将RTF转换为HTML
    • IWizMessageBoxWnd:一个消息对话框,可以显示“不再提示”复选框。
    • IWizCommonUI:可以显示一些常用的对话框,例如输入文字对话框等等。
    • IWizMimeMessage:用来打开,保存,转换mime文件的工具。

    以上这些,就是CyberArticle公开的COM对象。这些COM对象,全部都可以通过脚本语言(JsvaScript/VBScript),高级语言(C/C++/Delphi),.NET语言(C#/VB.NET)等等调用,只要这些语言支持COM自动化技术即可。

    CyberArticle,也可以看作一个Shell程序,通过调用这些对象,来实现某些特定的功能。

  • CyberArticle二次开发手册 – 1、前言

    发表于 2009年06月2日 魏 拾俊 没有评论

    CyberArticle具有超强的二次开发能力,在这里,我将会不定期的写一些文章,来介绍如何利用CyberArticle进行一些二次开发。

    为什么要对CyberArticle做二次开发?

    如果您是开发人员,或者您具有一定的开发能力,在您使用CyberArticle的时候,可能会有一些不能满足您的需求的地方;或者您希望将CyberArticle的某些功能加入您的软件;或者您希望开发CyberArticle的其它功能,提供给其它用户使用,甚至对这个功能进行收费等等,您都可以对CyberArticle进行二次开发。

    利用CyberArticle接口,可以完成什么功能?

    • 更容易的开发一个更好的CyberArticle:CyberArticle保存网页,存储数据,管理数据等等功能,都通过COM自动化方式提供接口。CyberArticle主程序,也是通过调用这些接口来实现各种功能的。因此,理论上,利用这些接口,您完全可以更容易的编写另外一个CyberArticle。
    • 编写CyberArticle插件。CyberArticle各种节点管理功能,都是通过插件来实现的,例如移动/复制节点,排序,合并,批量重命名,发布文章到Blog,书籍同步,编辑文章里面的插入连接,源代码着色,批量插入图片等等功能,全部都是通过插件来实现的。因此,您完全可以写一些功能更强的CyberArticle插件,来实现更多的功能。
    • 编写CyberArticle宏。通过CyberArticle宏,同样可以扩展CyberArticle功能,例如保存为模板,标记文字,就是通过CyberArticle宏来实现的。
    • 提供工具,例如转换MyBase数据到CyberArticle,就是通过C#编写的一个小工具,调用CyberArticle功能来实现的。
    • 整合某些功能到您的软件。您可以利用CyberArticle提供的某些功能,例如Mime文件转换为html等等,来增强您的软件。
    • 处理书籍文章。可以通过插件,来编写HTML处理程序,批量处理保存后的文章,例如去处广告等等
    • 导入其它格式文件,例如导入pdf文件
    • 导出其它格式文件,例如经过处理的html等等
    • 发布资料。CyberArticle WebShare就是利用C#编写的一个通过iis发布文章的程序。
    • 其它更多功能

    技术准备

    以下具备其一就可以了:

    • 熟悉VBScript或者JavaScript
    • 熟悉C/C++或者Delphi或者其它高级语言
    • 熟悉C#或者VB.net或者其他.NET语言

    熟悉VBScript或者JavaScript,您就可以开发CyberArticle宏,或者写一段自动化脚本,来完成一些特定的功能。

    熟悉C/C++或者Delphi,您就可以开发CyberArticle插件,使您的插件运行在CyberArticle内部(同一进程),还可以在CyberArticle里面加入您的菜单。当然,您也可以编写独立进程的程序,通过COM/自动化方式,调用CyberArticle。

    熟悉C#/VB.net等语言,您可以通过COM自动化技术,来调用CyberArticle提供的接口,来实现各种功能扩展。

    软件准备

    • CyberArticle 5.3或者更高的版本
    • 相关开发工具,例如记事本,Visual Studio,Delphi等等。
    • CyberArticle开发人员手册。里面包含了CyberArticle的接口定义,还有一些插件/宏例子。下载