Merriam-Websters Dictionary : HTML 转 RTF





3.00/5 (1投票)
帮助您动态编辑富文本框的工具,避免了导致在当地沃尔玛发生随机武装恐怖主义行为的挫败感。
第一部分: 我如何抓取 Merriam-Webster's Dictionary
第三部分: 创意写作者的文字处理器
引言
在上一篇文章中,我讨论了一种可以用来抓取公共网站文件的方法。由于这些文件需要服务器上的支持性引用才能显示它们应有的样子,因此仅从自己的硬盘驱动器中使用您喜欢的网络浏览器加载 HTML 文件,会使它们看起来像是在 1991 年您时髦的父母还在听 Cranberries 的音乐时的样子。您现在可能脑海里有一首很酷的歌曲,但您脑中的浏览器看起来应该比来自 bygone BBS 的文本好不了多少。
因此,所有 255,000 个 HTML 文件都必须通过大量的超文本剪切和拼接进行解析和美化,以使用颜色、制表符、字体以及只有豆腐、坚果和夏威夷混合口味的混合坚果才能提供的整体幸福感来格式化它们。
Using the Code
我尝试压缩以非字母字符开头的单词的 974 个 HTML 文档,文件大小为 14MB(太大,无法在此上传),而这类文件还有四分之一百万个……所以,您无法获得副本。您仍然可以下载您想要在此应用程序上运行的文件,并在应用程序主屏幕上设置源目录输入值以查看结果。
所以,这里是一个典型的在线定义的样子。它们有大量的开销来帮助您导航,以及广告来支付所有费用。
这是您离线加载 HTML 时的样子。看起来很糟糕,所有开销都分散注意力且丑陋。
在所有内容都被解析和清理后,RTF 文件看起来是这样的
RTF 文件中没有广告或开销。只有您正在查找的单词的定义和相关信息。如果您查看代码,您会注意到源文件名反映了 HTML 文件定义的单词,而 RTF 文件名是计算机生成的统一大小的文件名。文件名(除了扩展名之外)更改的原因是为了以后制作搜索引擎时,我可以更轻松地将文件名包含在二进制随机访问文件中。
Unicode
HTML 文件都包含称为 Unicode 的内容,它允许全球任何计算机读取它们,然后将它们转换为适当的字体并显示在您的屏幕上。为了将它们从 HTML Unicode 转换为可读文本,我采取了老式的逐一比较方法。列出源文件中找到的 Unicode 字符组合,并将其与适当的输出字符匹配,然后在进行任何解析之前将它们全部替换。那里有一些问题,我可能还会发现更多问题,但现在最突出的是 MS 中缺少上标字符。上标中唯一可用的数字是 {0, 1, 2 & 3},因此在加载诸如 **Angstrom** 这个单词的定义需要上标字符时,它们不可用。除了在背景上绘制图像或在 RichTextBox
上方粘贴一个较小字体的标签外,没有简单的方法可以在 RichTextBox
中显示 1010。因此,当这种情况发生时,文本会被重写为“10^10”,这不太优雅,但大多数有数学常识的用户仍然可以理解。
Unicode 转换非常直接,您可以在 classStringLibrary
中查看它。
//
public static string Unicode_ConvertToString(string strHTML)
//
获取下一个
GetNext
函数是这个项目的主力。您提供您正在查找的 HTML 开/闭参数,它将为您提供您提供的源材料中包含的所有内容。您可以在 classStringLibrary
中找到它。
//
public static string HTML_GetNext(string strHTML, string str_Start, string str_End)
//
HTML 文件必须被分解成小的片段。每个文本片段都必须被标记一个枚举类型标签以及它在源文件中的索引位置。代码使用一个 for
循环来遍历文件中找到的所有不同类型的文本,然后定位、隔离并将它们编译到一个列表中。当它完成查找所有不同格式的查找后,它会按照源文件中每个文本的索引位置的顺序重新排序编译列表,然后将其粘贴到 RichTextBox
中。完成后,它会再次遍历整个列表,设置字体大小和颜色,然后再将所有内容保存到硬盘。
这里是一些这类格式的示例。您可以在 classFontDefinition
类中找到它们,每个类都有其格式信息定义。
//
public enum enuDefinitionContentType
{
// stuff that gets cut out first
ExamplesInSentence,
SynonymDiscussion,
Note,
// all the other schlop
altSpellings,
altWords,
Antonyms,
AntonymSynonymSubHeading,
Definition,
DefinitionQualifier_1,
DefinitionQualifier_2,
DefinitionQualifier_3,
DefinitionQualifier_4,
dialectal,
Etymology,
ExampleAuthorName,
//
这里是如何定义其中一种格式的示例
// Antonyms
{
classRTX.classRTX_FontInfo cFntAntonyms = new classRTX.classRTX_FontInfo();
cFntAntonyms.clrFore = Color.DarkGray;
cFntAntonyms.fnt = new Font(strFontFamily, intFontSize, FontStyle.Regular);
cFntAntonyms.intIndent = intTabs[0];
cRtxFont[(int)enuDefinitionContentType.Antonyms] = cFntAntonyms;
}
解析 HTML 文本本身需要大量搜索标记,然后删除所需内容,再删除 MarkUpLanguage
并使其看起来像正确的英文文本。通常,它会搜索一个标记,使用 HTML_GetNext()
和它刚找到的标记的索引来获取文本。之所以不能简单地说“查找下一个以 <span class="dtText"> </span>
开头的 HTML 代码”,是因为 GetNext()
函数将搜索开头的标记(<span class="dtText">
)并忽略所有其他标记,但在找到第一个结尾标记(</span>
)时会停止。由于在到达您想要的结尾标记之前,很可能还有其他 <span ...>
开头标记,因此它会在找到第一个结尾标记后停止,而不管沿途找到多少个正确的 <span ...>
开头标记。为了避免这种情况,开头和结尾标记是更广泛、更通用的标记 <span
& </span>
。由于 GetNext()
还提供了先前定位的起始索引,它将从预期的起始标记开始,并在到达其正确结尾时停止。
这是一个典型的例子
//
case enuDefinitionContentType.ExamplesInSentence:
{
int intExamplesInSentence_Find =
strHTML.IndexOf(strContentTags[(int)eDefConType], StringComparison.Ordinal);
while (intExamplesInSentence_Find > 0)
{
string strExamplesInSentence =
GetNext(strHTML, "<div ", "</div>", intExamplesInSentence_Find);
strHTML = strHTML.Replace(strExamplesInSentence, "".PadRight
(strExamplesInSentence.Length, '.'));
if (strExamplesInSentence.Length > 0)
lstDefCont.AddRange(ParseHTML_MerriamWebster_ExamplesInSentence
(intExamplesInSentence_Find, strExamplesInSentence));
intExamplesInSentence_Find = strHTML.IndexOf(strContentTags[(int)eDefConType],
intExamplesInSentence_Find + 1, StringComparison.Ordinal);
}
bolLoop = false;
}
break;
//
有些比其他更复杂,但总的来说都很基础。在上面的例子中,文本被替换为“.”字符,因为一些例句与其他内容冲突,通过在此处删除它们,消除了文本被重复报告的问题。
我包含了我的 **HTML-ator** 项目的代码,因为它在帮助我解析和切割 HTML 文件以创建看起来像样的 .rtf 文件方面给了我很大的帮助。在我之前的文章 How I Scraped Merriam-Webster's Dictionary 中有关于该应用程序的更多信息。
整个项目都是一个“ hack”,当然可以改进,但我对结果和我新 incorporated 到文字处理器中的 Merriam-Webster 词典很满意,我将在下一篇文章中介绍。
历史
- 2019年9月20日:初始版本