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

Mambo CMS 文章控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (5投票s)

2011年10月16日

CPOL

13分钟阅读

viewsIcon

27480

downloadIcon

1785

该代码实现了一个使用 MS-Word 创建文章以供 Mambo CMS 使用的系统。大部分代码是一个 C# 项目,用于读取和解析使用 MS Word 创建的 HTML 文本。支持项目是用于创建所需 HTML 的 VBA 宏以及用于本地主机导入/导出的系统。

Mambo2Text application snapshot

引言

我正在用我自制的探险卡车穿越非洲。我曾想发布一篇关于此行的日记。为此,我使用了 Mambo 内容管理系统 (CMS)。Mambo 以及例如 WordPress 的麻烦在于,要发布文章,必须使用这些软件项目提供的相当笨拙的发布界面。特别是当需要在文本中包含图片时,这会变得非常耗费精力。还有其他缺点,但这也不是抱怨其他项目,让我们专注于解决方案。

我想要做的是使用 MS-Word 文档作为文章的基础,然后通过 Mambo CMS 发布。这有以下优点:

  • 使用 MS-Word 的拼写检查器和同义词库。
  • 图片可以在 MS-Word 中进行修改:裁剪、缩放、旋转、调整亮度对比度等。
  • 文档可用于多种目的,例如,也可以打印。
  • 轻松备份网站的源文件。

另外,由于我大部分时间没有互联网接入,我必须离线工作。因此,我本地有一个精确的网站副本在运行。打算发布的文章首先加载到本地系统,然后必须导出,传输到托管站点,然后导入。可以直接创建一个导入文件而不使用本地安装,但我更喜欢本地预览。那么工作流程是什么?

  • 创建一个 MS-Word 文档,包含文章文本和图片。
  • 将 MS-Word 文档保存为“过滤后的 HTML”文件。
  • 此软件(Text2Mambo)解析该 HTML,并将文本注入到本地 Mambo 系统中,图片被复制到本地主机的正确位置,并相应地更改图片路径。
  • 本地主机文本得到审查。
  • Mambo 系统的一个选定部分(我们刚刚添加或编辑的部分)被导出到 XML 文件。
  • XML 文件通过 FTP 传输到远程托管站点,包括属于该文本部分的图片。
  • XML 文件在远程站点导入。

除前两项和最后一项外,所有这些任务都由 Text2Mambo 完成。第一项您必须自己完成;第二项,我创建了一个 MS-Word 宏,包含在下载文件中;第三项,我制作了一个 PHP 导入脚本,也作为下载提供。

但是,为了能够将文本注入 Mambo 系统,文本有一些要求。

Mambo 要求

Mambo 的文章必须具备以下最低特征:

  • 标题
  • 作者(必须是 Mambo 系统上的注册用户)
  • 版块
  • 分类
  • 创建日期

还有其他特征:

  • 修改日期,最初与创建日期相同;之后,当文本被 Text2Mambo 处理时,会设置为当前的日期/时间。修改 ID 不会以任何方式设置。
  • 标题别名,Text2Mambo 将其设置为与标题相同。
  • 过期日期。Text2Mambo 不实现此功能,文章永不过期。但可以轻松地将其编程到 Text2Mambo 中。
  • 有一个切换开关,可以使文章成为首页文章或否。
  • 版本号设置为 1 且从不更改。要使用此功能,必须更改 Text2Mambo,并更新修改日期。
  • 排序。使用发布日期确定。

Text2Mambo(项目名称)有两个系统用于为文章分配特征:

  • 默认选项(作者、版块和分类),在 `MamboCtrl` 界面中选择。
  • 可以在文章标题(标题由 `h2` 样式指示)中提供信息的可能性。文章标题可以这样写:
  • Driving through Africa[a:John Janssen][c:Side stories][d:June 12, 2011][fp:yes]

    这意味着以下内容:

    • 文章标题:“驾驶穿越非洲”。
    • 作者:John Janssen。
    • 分类:附篇(相应版块自动找到)。
    • 发布日期:2011 年 6 月 12 日。
    • 文章被放到首页。

文章标题的可能性和格式的完整描述在附带的手册中有说明。

数据库

Mambo 使用 MySQL 作为数据库运行。Text2Mambo 将文本注入本地主机数据库。出于安全原因,从远程站点访问托管的 MySQL 数据库通常被阻止。要编译代码,我们必须安装 MySQL .NET 连接器,它不包含在源代码下载中。请查看 MySQL 下载站点 获取正确的下载。

要使 Text2Mambo 工作,我们需要知道 Mambo 运行的 MySQL 实例的用户名/密码组合。

连接 Mambo 数据库的主要类是 `static public class MamboConnection`,它是一个静态类,所有方法都是静态的,因为我只需要一个连接,所以不必维护类的实例。`MamboConnection` 使用与 Mambo 源代码相同的方法来灵活处理表名,每个表名都以“#__”开头,在运行时会替换为前缀 `ProgramSettings.MamboDatabasePrefix`。此设置只能在代码中修改。

使用这个灵活的前缀,从 Mambo 的角度来看,多个 Mambo 实例可以在同一个数据库上运行,但使用单独的表。要让 Text2Mambo 控制多个 Mambo 实例,我们必须将 `ProgramSettings.MamboDatabasePrefix` 设置为用户可更改的。

用户界面

用户界面是一个选项卡控件集合。每个选项卡页面都在运行时创建,并在运行时用单个用户控件填充。这些用户控件都派生自 `class MyUserControl`,这是一个抽象类,有两个虚方法 `Closing()` 和 `Loading()`。前者在 Text2Mambo 终止时被调用,用于选项卡页面中的所有 `MyUserControl` 派生用户控件,从而使这些控件能够保存其数据。

选项卡页面的顺序是我开发它们的顺序,不是很合乎逻辑,但它有效。

  • 第一个选项卡页面是数据库登录控件;一旦输入了正确的凭据,Text2Mambo 就开始显示第二个页面。
  • 第二个页面是最重要的,它控制 HTML 文档的导入。有一个最近文档列表下拉菜单,一个包含大量设置的属性页,更多设置,以及神奇的“处理文件”按钮,只需按一下即可查看结果。
  • “高级设置”处理“文档标签”,文本中某处有一个关于此的章节。
  • “文本导出”控件负责创建 `.XML` 导出文件,并用适当的文件填充“同步在线”控件文件列表。
  • “其他工具”目前作用不大。
  • “同步在线”基本上是一个 FTP 上传,不同之处在于它只上传“导出”控件设置的文件。
  • “FTP 登录”控件用于输入 FTP 登录凭据并进行测试。“同步在线”控件使用这些凭据进行登录。
  • “Codeproject 文本”是这段文本。它是一个 `WebBrowser` 控件,从嵌入式资源读取要显示的文本,也就是这段文本。

安全

实际上:没有。该系统旨在由网站所有者使用。唯一的要求是您知道 Mambo 系统运行的 MySQL 帐户的用户名和密码。必须知道本地主机和远程 MySQL 的凭据。

一个警告:Text2mambo 将 MySQL 和 FTP 的用户名/密码以未加密的方式存储在注册表中,路径为 `HKCU\Software\TravelisFun\Text2Mambo`。

编码实践

在这个项目开始时,我对 C# 的了解很少,所以这个项目变成了一种训练练习。我尽可能多地使用了 C# 的功能,这些功能可以对项目有所帮助。这意味着该项目看起来有点混乱和过度。

MS-Word 导出宏

我使用 MS-Word 来创建文本,但直接读取 `.DOC` 或 `.DOCX` 文件很困难。然而,MS-Word 有将文档导出为 HTML 的选项,它是纯 ASCII,易于解析。但是,在 MS-Word 中将文件导出为 HTML 需要大量的鼠标点击,因此制作了一个宏来完成这项工作(稍后在源代码中查看)。使用“过滤后的 HTML”输出的另一个优点是,图片是单独存储的,尺寸和格式与文档中可见的一致。图片可以是 `.JPG` 或 `.PNG`;当编辑器对图片进行裁剪、调整大小或颜色更改之外的其他操作时,MS-Word 会创建一个 `.PNG`(它比 `.JPG` 大得多)。图片存储在 HTML 导出文档所在文件夹的子文件夹中。使用英文版的 MS-Word,此文件夹称为“`_files`”,因此如果文档名为“Juni2008”,则包含图片的文件夹名为“`Juni2008_files`”。使用其他语言版本的 MS-Word,此图片文件夹的名称不同;例如,荷兰语版本的 MS-Word 将此文件夹称为“`_bestanden`”。当 Text2Mambo 尝试查找图片时,它会查找一个名为“`_*`”的子目录;如果找到多个,则会显示一个选择框。这是将 MS-Word 文档另存为“过滤后的 HTML”的宏。

Sub SaveAsHtml()
' SaveAsHtml Macro
' Save a document as filtered HTML in a HTML sub-folder of the source folder.
  If Application.Documents.Count < 1 Then
    MsgBox "No documents are open"
    Return
  End If
  OrgFileName = ActiveDocument.Name
  OrgFolder = ActiveDocument.Path
  NewPath = OrgFolder & Application.PathSeparator & "HTML"
  Set fs = CreateObject("Scripting.FileSystemObject")
  If Not fs.FolderExists(NewPath) Then
    MkDir NewPath
  End If
  NewPath = NewPath & Application.PathSeparator
  NewFilename = Left(OrgFileName, InStr(1, OrgFileName, ".") - 1)
  NewFilename = NewFilename & ".html"
  ActiveDocument.Save ' save the active document
  ChangeFileOpenDirectory NewPath
  Application.DisplayAlerts = wdAlertsNone
  ActiveDocument.WebOptions.AllowPNG = False
  ActiveDocument.WebOptions.TargetBrowser = msoTargetBrowserIE6
  ActiveDocument.SaveAs FileName:=NewFilename, _
      FileFormat:=wdFormatFilteredHTML, _
      LockComments:=False, _
      Password:="", _
      AddToRecentFiles:=False, _
      WritePassword:="", _
      ReadOnlyRecommended:=False, _
      EmbedTrueTypeFonts:=False, _
      SaveNativePictureFormat:=False, _
      SaveFormsData:=False, _
      SaveAsAOCELetter:=False
  ActiveWindow.View.Type = wdWebView
  ActiveDocument.Close ' close the create HTML document
  Application.DisplayAlerts = wdAlertsAll
  ChangeFileOpenDirectory OrgFolder
  RecentFiles(1).Open ' reopen original document
End Sub

此宏会在当前文档所在文件夹下创建一个 HTML 文件夹(如果尚不存在),并将 HTML 导出文档放置在该文件夹中。请注意,HTML 导出文件不会显示在“最近文档”列表中,导出后原始文档会再次打开。

由于 Text2Mambo 具有命令行接口,因此可以从宏内部调用 Text2Mambo,并将导出的文本立即注入到您的 Mambo CMS 中。例如:

RetVal = Shell("D:\Dev\Text2Mambo\bin\Release\Text2Mambo.exe " & NewFilename,  vbNormalNoFocus)

在我的 MS-Word 中,此宏被分配给 Alt-F2 键盘组合。

文档标签

我需要在文本中添加一些额外的功能/格式化可能性,因此我添加了“文档标签”。这是一个系统,可以将文本片段或图片赋予特定的样式,然后 Text2Mambo 解析器可以识别该样式。我需要这四种:

  • 对象:在文本中插入 HTML 源片段的可能性。例如,插入 YouTube 视频。
  • 地图:插入 GPS 坐标并将其链接到地图网站(例如 `maps.google.com`)的可能性。
  • 链接:轻松将特定文本链接到外部源(例如 `Wikipedia.org`)的可能性。
  • 图库:将各种图片组合成幻灯片放映的可能性。

例如:我在文本中使用了“nuclear”一词,并且我希望这个词成为指向 Wikipedia 的超链接。要做到这一点,我必须在 Text2Mambo 中设置一个链接类型的文档标签样式,我选择样式名称为 AMWikiEN。在 MS-Word 中,我必须创建一个名为 AMWikiEN 的样式,该样式基于 Normal 样式,并且是“Linked”类型。特别是最后一个设置很重要;如果 MS-Word 中的样式是“Paragraph”,那么我们就不能只选择段落中的一个词来应用不同的样式。

Text2Mambo document tag setup.

MS-Word style setup.

现在,“Nuclear”一词可以被选中并应用 AMWikiEN 样式。当 Text2Mambo 解析文本时,它会识别 AMWikiEN 样式,并将该词转换为 Text2Mambo 中设置好的超链接。

其他文档标签的作用是什么?

  • 对象:将文本标记为 HTML 源代码。我们甚至可以使用此标签将 Java 或 PHP 代码注入文本中。
  • 地图:此标签将 GPS 坐标(格式为“N47 45.558 E54 23.457”)转换为 maps.google 可理解的坐标,例如:“47.7593,54.3910”,并将其放在超链接中。
  • 图库:在文章中以 Gallery 样式标记的任何图片都会被收集起来,并在文章底部显示为幻灯片放映。为此,一些 Java 代码会被插入到文本中。Java 代码如下所示:
<script type="text/javascript"> 
var image1=new Image() ;
image1.src="images/April2011_files/image001.jpg";
var image2=new Image();
image2.src="images/April2011_files/image002.jpg";
var image3=new Image();
image3.src="images/April2011_files/image003.jpg";
</script>
<br clear="left">
<img align="left" vspace="5" hspace="5" 
   src="images/April2011_files/image001.jpg" name="slide"/>
<script type="text/javascript">
/* variable that will increment through the images */ 
var step=1;
function slideit() 
{   
  /*if browser does not support the image object, exit.*/   
  if (!document.images)     
    return  ; 
  document.images.slide.src=eval("image"+step+".src");
  if (step < 3)     
    step++;
  else     
    step = 1;
  setTimeout("slideit()",2500)
} 
slideit()
</script>

链接样式是最通用的,您不仅可以从选定的文本创建超链接,还可以使用它来用特定样式(来自 Mambo 样式表)标记文本。例如:您希望文本中的单词用 `.componentheading` 样式进行标记。要做到这一点,在 Text2Mambo 中创建一个类型为 Link 的文档标签,样式名称为“AMComponent”,并将处理字符串设置为:“`

{1}

`”。然后,在 MS-Word 中,创建 AMComponet 样式(基于 Normal 样式,类型为 Linked)。选择需要用 .componentheading 标记的单词,然后处理文档。

解析源 HTML

如果我们查看 MS-Word 创建的 HTML,我们会发现很多垃圾。Text2Mambo 只解析 `

© . All rights reserved.
` 标签之间的内容。例如,所有 MS-Word 插入到文本中的 ` lang=` 标签都会被清理。 `HTMLProcessor` 类负责所有处理。

在远程系统上导入

我在下载中提供了执行该任务的 PHP 脚本。

该软件的作用是获取 Text2Mambo 创建的包含 Mambo 部分内容的 `mamboexport.xml` 文件,并将其导入到远程数据库中。由于此导入脚本 **不** 创建用户、版块或分类,因此我们必须确保导出内容中存在的用户、版块和分类已在远程系统上创建。导入脚本根据 `mos_users.name` 属性匹配用户,根据 `mos_sections.name` 匹配版块,根据 `mos_categories.name` 属性匹配分类,而不是根据 ID。因此,导出 XML 中包含了导出上下文中使用的每个用户、版块和分类的记录。

您需要查看脚本才能了解其工作原理。

此导入功能假定它安装在 Mambo 根目录的子文件夹中。因此,如果 Mambo 安装在“`/htdocs`”中,则此导入脚本必须安装在“`/htdocs/import`”中。调用此导入脚本需要输入地址,例如:`http://yoursitename/import/import.php`。 `import.php` 脚本像这样使用 Mambo 的 `configuration.php`:`include_once("../configuration.php");`。

使用代码

您需要安装 Mambo 系统,仅此而已。

要运行此软件,您需要安装 MySQL .NET 连接器并安装 .NET 3.5。

该项目是 MS-Visual Studio 2010 项目。抱歉,对于较旧的 MS-VS 用户,我不知道有任何项目可以转换回较旧的 MS-VS 系统。

系统中涉及大量参数,尤其是在相对路径部分。要聪明点,您会弄清楚的。如果您是第一次运行该软件,将设置许多默认路径,它们可能不符合您的系统,因此请修改它们。

关注点

如果您浏览代码,您可能会注意到使用了各种编码风格和实践,这些风格和实践可能过于夸张或不适合当前情况,这是故意的。由于该项目是我/正在学习 C#,所以我尽可能多地使用了控件和技术。所以,我使用了:

  • 一个工具 DLL
  • 用户控件
  • LINQ 语句
  • 集合、字典和列表
  • `WebBrowser`,内容从嵌入式资源读取
  • 委托(Delegates)
  • 多线程
  • 属性表
  • 扩展方法
  • Lambda 表达式
  • .NET MySQL
  • FTP 功能
  • 去看看,发现更多

历史

由于我正在非洲旅行,我无法经常更新软件或本文。但我会尽力而为。

软件维护在此处:http://software.travelisfun.org/text2mambo

如果您想阅读使用此系统制作的故事(仅荷兰语,但谷歌可以翻译),请参见此处:http://stories.travelisfun.org

  • 2011 年 10 月 23 日:更新了源代码,并添加了手册下载。
© . All rights reserved.