Dlús:爱尔兰语文字处理器






4.98/5 (11投票s)
用 C# 编写的完全功能性的爱尔兰语文字处理器
引言
虽然我自己不会说盖尔语,但我很自豪能被 Seanán Ó Coistín 邀请为他构建这个应用程序,在他读了我之前的文章《创意作家文字处理器》之后。(我在这篇文章中可能写的糟糕的笑话不能怪他,但你应该感谢他构思了这项计划,从而诞生了这款出色的爱尔兰语文字处理器。)由于我之前写过几个类似的项目,我很高兴地告诉他,我可以将其实现(不夸海口)。我们起草了他想要的内容大纲,而我不得不在他构思出关于语法正确的句子之前就扼杀掉任何想法(我的 AI 编码经验仅限于一次 井字棋 Mini-Max 无递归 实验,这使得我缺乏盖尔语技能在这方面无关紧要)。我同意帮助推广爱尔兰语并编写此应用程序的唯一条件是,完成后必须免费提供给开源开发者。
所以,我们就在这里。
启动应用程序
当你下载 Dlús 并打算启动应用程序时,你需要在硬盘上找到可执行文件。下载“Dlús Word processor”文件,然后将它们解压到你的硬盘上。完成后,你需要找到应用程序的可执行文件(也就是那个带有爱尔兰国旗图案并且带有 .exe 文件扩展名的文件,如下图所示),然后双击它。我建议你在 Windows 文件管理器中选择此文件,然后右键单击鼠标并选择“创建快捷方式”。这将在你的桌面上放置一个图标,你可以通过它更轻松地启动应用程序。
下图应有助于你在硬盘上找到可执行文件。请记住,在本例中,下载的文件直接解压到 C:\ 根目录,这可能与你选择解压文件的位置不同。
Dlús 如何编写和编辑文本:用户指南
主工作区
Dlús 文字处理器是为普通到初学者计算机用户设计的。我们不想用过多的选项来烦扰用户,以免弄乱工作区。因此,界面易于使用且简洁明了。
编辑文本所需的所有工具都可在上下文菜单(下图所示)中找到,通过在主工作区中单击鼠标右键即可调出。
在下图所示的图像中,你可以看到位于工作文本区上方的工具栏和标尺。两者都与现有的文字处理器非常相似,这使得从 MS-Word 过渡到 Dlús 尽可能地轻松。工具栏包含了从拼写检查和同义词库到文件选项和字体样式的所有重要命令。Dlús 与其他写作应用程序的唯一区别在于它使 Dlús 成为一款出色的爱尔兰语写作应用程序,即位于主工作区右侧的盖尔语单词列表。
当你开始在主工作区键入时,单词列表将找到你正在寻找的确切单词。一旦在单词列表中找到所需的单词,你就可以通过单击此单词列表中的单词来将其插入到你的文本中,此时你的鼠标光标会变成“插入单词”图标 。如果你键入的单词是单词列表中完整的一个单词,那么在你停止输入片刻后,其定义将出现在应用程序的右上角。或者,如果你希望阅读通过鼠标滚轮或单词列表滚动条在列表中滚动的单词的定义,只需将鼠标光标悬停在单词上,并在该单词上单击鼠标,此时你的鼠标光标会变成“查看”图标
。如果你想查找已经写在文本中的单词,你可以将鼠标光标移到该单词上并单击鼠标按钮,以调出该单词的定义。所有这些定义都来自爱尔兰政府的 Teanglann.ie 网站,Foclóir Gaeilge-Béarla,即使你离线也可以在你的家用电脑上访问它们。
输入带音标的元音
即使你的个人电脑键盘无法轻松访问这些特殊字符,你也可以输入爱尔兰语中的带音标元音。虽然欧洲键盘更有可能提供此功能,但北美和其他许多国家的键盘则不然。因此,由于 Dlús 旨在让所有用户都能使用,该应用程序使你能够轻松地在写作项目中包含所有爱尔兰带音标的元音。要将带音标的元音输入文本,只需在该元音前加上反斜杠字符,文字处理器将识别“反斜杠 + 元音”的组合,并将这两个字符替换为你打算写入的单个带音标元音。
例如,如果你想写单词 Tá
你实际上会输入 T\a
并立即看到文本被替换为正确带音标的单词 Tá。
单词建议
当你键入时,单词建议选项会为你提供单词建议。它只会建议已包含在你文本中的单词,并且不限于爱尔兰词典中的单词。使用向上/向下箭头键选择要插入的单词,选择后按 Tab 键,选定的单词将被插入到你的文本中。按 Escape 键可以暂时隐藏单词建议列表,直到下一个单词的开始。
使用同义词库
同义词库还具有快速访问功能。你只需将文本框光标放在文本中的单词上,然后按 Ctrl-T 组合键即可。你也可以使用工作区顶部标尺附近的工具栏中的同义词库按钮 。单词的同义词库条目可能源自你单击的单词的词根拼写,并将出现在应用程序右下角的区域。但是,请注意,有些单词在同义词库中没有条目,并且不会出现在同义词库框中。如果你在同义词库中找到一个想要插入到文本中的单词,你可以单击同义词库框中的该单词,它将出现在文本框光标所在的位置,就在你的工作项目中。
拼写检查
使用 Dlús 进行拼写检查非常重要且易于操作。随时准备拼写检查你的工作,只需按 F7,单击工具栏中的拼写检查图标 ,或者使用鼠标右键调出上下文菜单并选择那里的拼写检查器选项。你将有“忽略”、“全部忽略”、“添加”或“替换”等选项来帮助你。我们努力重新创建常见的现有拼写检查产品,以便用户可以轻松上手并熟悉此工具的外观和功能。拼写检查器在完成文本检查后会自动退出,因此如果你调用拼写检查器并且文本中没有检测到拼写错误,它将简单地退出并让你继续工作。
注意: 每当你“添加”一个单词到拼写检查器时,你实际上是在将其添加到屏幕主工作区右侧的单词列表中。拼写检查器只接受其单词列表中的单词为正确拼写的单词。所有这些单词都来自词典,并附有解释性的“单词信息”标签,解释了单词的词根以及单词的类型,但当你使用拼写检查器“添加”一个单词时,Dlús 不会有该单词的任何单词信息,即使它被接受为正确拼写的单词并出现在单词列表中。
如下面的示例所示
单词“teaghaisí”是词头“teaghais”的复数形式。你可以在上面的词典条目和下面单词列表中附加的浅蓝色“单词信息”标签中看到该信息。
编辑单词列表
如果你发现 Dlús 的单词列表中有不正确的条目想要更改、修正或删除,只需单击上方工具栏中的词典编辑器图标 。当你选择这样做时,一个新的表单将出现,其中屏幕左上角有一个绿色(有时是红色)的文本框,下方是单词列表。你将看到两个复选框,询问是否要查看已删除的信息。这很重要,因为当你勾选这些复选框时,已从单词列表中删除的单词将按字母顺序以红色显示,并划掉。此处的单词列表中的每个单词都可以通过选中它,然后取消选中上方文本框中其拼写旁边的复选框来从正确拼写的单词列表中删除。这样,如果你认为单词拼写不正确或不合适,就可以从单词列表中删除它们。你还可以使用词典编辑器添加单词,方法是在左上角附近的绿色文本框中键入它们(请注意,此文本框的颜色会根据该单词是否已是正确拼写的单词而从绿色变为红色)。当你确定在此文本框中键入的新单词条目拼写正确后(如果尚未包含在单词列表中,它将显示为红色),请勾选它旁边的复选框(复选框将变为绿色),然后它将被添加到单词列表和拼写检查器。
同样,在此表单的中间,你将看到与此特定单词的此特定拼写关联的单词信息标签列表。位于“查看已删除单词信息”复选框右侧的“新建”按钮将为该单词添加一个未选中的条目到单词信息列表中。你可以使用它为该单词添加一个新的“单词信息”标签,然后通过在应用程序的词典目录中选择 FGB 文件来填写适合该拼写的信息。所选文件将是该特定拼写的“词根”(或“词头”),因此当你选择单词列表中的此单词时,定义将出现在 Dlús 主表单的右上角词典区域。单词信息标签旁边的组合框允许你选择单词的类型,当你确定信息正确时,勾选右侧的框,你刚创建的单词的新信息标签将被添加到单词列表中。
- 观看一个简短的视频,解释如何使用 词典编辑器。
关于代码:用户无需关心的事情
我为什么没有使用 HunSpell(或 Gaelspell)
Gaelspell 恨我。我说出来了。它就是恨我。我下载了十几种不同的版本,尝试了各种文件,它们都告诉我“去你妈的”。这真的很烦人。我不知道为什么会这样,因为我在几个不同的项目中使用过 HunSpell,并且它以前从未给我带来任何问题。
所以,我做了我自己的拼写检查器。
起初,我想使用流行的 扩展富文本框版本 (RichTextBoxEx),它具有构建文字处理器所需的所有功能,但我却无法弄清楚如何更改语言文件,在我使用在线词典创建了自己的拼写检查器之后(我稍后会告诉你),这个扩展富文本框突然出现系统性心脏衰竭,并且在我应用程序的 'program.cs' 文件中持续渲染出幽灵般的形象,就像一个廉价 Dollarama 电池驱动的转世婆罗门娃娃。这非常令人失望,因为它使得在不深入研究 .DLL 的Visual Basic 源代码的情况下,无法调试崩溃。我非常不愿意这样做。
所以,我做了我自己的扩展富文本框。
然后,我饿了。我好几个小时没吃东西了,除了吃一块干的 Wonderbread 面包皮。当地的 Subway 餐厅关门了,超市又远又远……
所以,我做了我自己的三明治。
词典 - Foclóir Gaeilge-Béarla (Ó Dónaill, 1977)
抓取无广告网站
如果你想创建一个拼写检查器,你需要大量的单词。非常多的单词。尽可能多地获取。实际上是所有的单词。然后你把它们放在一起,告诉你的拼写检查器找出文本中不在你收集的“宇宙中所有单词”列表中的单词。
“如果不在那里,那它就不是单词。” ~拼写检查器
这基本上就是拼写检查器的工作原理。
所以……我需要获取大量的单词。为此,我去了 Teanglann.ie 网站。征服它,抓取它,然后离开。
我来,我看见,我征服。~尤利乌斯·凯撒
如果你想了解更多关于如何抓取网站的信息,请看我之前写的一篇关于《我如何抓取 Merriam Webster's Dictionary》的文章。
没有任何法律禁止任何人通过电子手段获取互联网上的信息。只有当你绕过密码、窃取登录信息并发布 Ashley Madison 客户的姓名以及他们出轨行为时,才会违反法律。但那是以后的事了……
我不会写第二篇关于抓取网站的文章,但如果你有兴趣查看我为该项目编写的源代码,请在这里 Foclair_Gaeilg_Bearla_ScrapingTool.zip。
……我确实给他们发了电子邮件告诉他们我抓取的事……我甚至给他们发了一个链接,里面有从他们网站上获取的 RTF 文件的副本,这些文件现在包含在我的《创意作家文字处理器》中。
这一切都是为了 Gaeilge。
将源文件从 HTML 转换为可用的 RTF
我从 FGB 网站抓取的源文件是 HTML 文件。除非我打算将网页浏览器集成到这个文字处理器中,否则它们需要被解析并重写为 RichTextFile 格式。这可能是一个困难而艰巨的过程。例如,你现在正在查看的这个网站。如果你右键单击并调出你的网页浏览器的上下文菜单(至少是我的),然后单击“查看页面源代码”菜单项,你将看到页面的标记语言是什么样的。通用 HTML 代码旨在被任何计算机上的任何浏览器使用任何操作系统来解释。它本质上是由指令组成的,告诉你正在使用的浏览器如何绘制此页面。使用什么字体,在哪里使用等等。HTML 之所以好用,就是因为它具有普遍性。但现在,想象一下从中挑选信息,并试图弄清楚如何自己绘制它,然后用该信息生成 RichTextFiles。
这就是我所做的。
我使用了一个我为 Merriam Webster 文件编写的工具,这些文件现在都已成功转换并被“洗礼”进入 RTF 祈祷殿堂。你可以在这里查看源代码 HTML-ator_20210329_2333.zip。
一旦我弄清楚了哪些 HTML 标签可以分离出词典单词条目文件中的不同部分,并且知道如何格式化文本,我就编写了将所有 HTML 文件转换为 RTF 的应用程序。编写这个特定的工具大约需要一周时间,然后处理所有文件大约需要另外 10-12 小时(至少在我的缓慢且情绪不稳定的笔记本电脑上)。这不得不进行了 3 到 4 次,因为在最终输出的 RTF 文件中发现了错误,并且需要修改代码来纠正输出文件中出现的缺陷。
RTF 文件使用一种特定颜色的绿色很重要,这种颜色对于文件中的每个“弹出提示”都是唯一的(所有提示都使用相同的唯一颜色),这可以在以后用户鼠标悬停在文字处理器中的词典条目上时用来识别“提示”,并为词典定义中的每个缩写提供“弹出”解释。
这是我编写的用于将 HTML 文件转换为 RTF 格式的源代码 Foclair_Gaeilg_Bearla_HTML_to_RTF.zip。
通过生成变体单词拼写创建数据库
所以,真正的 Gaeilge 就生活在这里。或者你会这么认为,但实际上并非如此。我不需要了解任何爱尔兰语知识来解释英语定义。 Nor did I have to understand the grammatical usage of any words and their variant spellings to generate these aberrant lexicographic logophilious transmographications. It was relatively easy. Having acquainted myself with the website's source files in those ten days it took me to sift through the HTML in order to produce the long sought out RTF files, I had a better idea of how to pick out the information I needed in order to transform those files into a database of all the variant spellings.
首先,我搜遍了所有文件,寻找标识“单词类型”信息的特定 HTML 标签。找到了所有这些标签并将它们存储在一个文件中以备后用 TipList.zip。这些都是在 Teanglann.ie 网站上“弹出”的缩写及其完整拼写。
由于变体拼写(在此在线词典中)在圆括号内描述,我编写了一个应用程序,该应用程序使用每个文件的“词头”作为起始模具,然后隔离定义中的圆括号。然后,将测试这些圆括号中的每一个是否为“弹出”缩写。当找到“弹出”缩写时,就找到了变体拼写的单词类型。此网站上的波浪号(~)和连字符(-)符号被解释为“替换为词头”或“替换词头末尾”,分别表示。
由于我知道运行所有 53,104 个单词条目将导致许多“圆括号”无法被此数据库创建应用程序解释,所以我让它询问我想要它如何处理它不知道如何解释的文本(词典中所有非变体拼写的圆括号以及一些其他格式错误的条目都使此算法感到困惑)。但这将意味着我必须每次重新开始时都告诉它如何处理每个有疑问的括号,而且我知道这会发生……很多次。事实也确实如此。因此,我让它记录下它发现的任何令人困惑的文本以及我关于如何处理它们的说明,并将其放入一个单独的“数据库构建数据库”中,因此,当我处理所有文件时,每次它感到困惑时都明确地告诉它该怎么做,它就会记录我的说明,并且再也不会打扰我,直到最后,它 all figured out (or memorized) and left me alone (with few exceptions recurring regardless of my best efforts to train it to leave me alone).
一些 Beta 测试人员一直在使用该应用程序并提供他们想要看到的更改,但这些更改均未涉及任何单词列表条目,因此我认为这个过程进行得相当好。
这是我编写的用于生成词典完整单词列表的代码 Foclair_Gaeilg_Bearla_-_Alt-Spellings_20210330_0012.zip。
使用数据库查找“被遮蔽”的单词
虽然在线词典提供了生成每个单词的变体拼写所需要的所有信息,但你必须认识到,当我们说所有……“所有”这个词可能需要解释。你看,问题在于,爱尔兰人在写他们的语言时倾向于搞砸。这只是为了让你保持诚实。我不会开关于醉酒口齿不清或爱尔兰男人说话时嘴唇被打肿、流血或变肥而扭曲他们说话声音的玩笑,因为真正的爱尔兰共和军可能会来问我是天主教无神论者还是新教无神论者,我真的不知道该如何选择。
但是,正如我之前所说,爱尔兰语在拼写方面有点模糊。他们有一种叫做“遮蔽”的东西,这意味着他们有时会在单词的第一个字符之前或之后插入一个字母,这取决于它在句子中的用法。拉丁语有变格,法语有变位,而爱尔兰语则用扭曲的拼写变化来遮蔽它们,只是为了让你感到困惑。
这是一个例子,“Séimhiú”遮蔽在“b”、“c”或……(有很多)之后插入“h”以软化发音,因为……为什么不呢?
有几种“Séimhiú”、“Urú”以及一些我称之为“其他”的神秘东西。
为了管理这一点并仍有一个可用的拼写检查器,我不得不编写方法,每次在应用程序的单词列表中找不到用户输入的单词时,都测试第二个和第一个字母。
这是检测遮蔽的方法,它在单词的首字母前添加一个或两个字符。
static string RootWord_PeelEclipse_Urú(string strWord)
{
string[] arrEclipses =
{
"n-a",
"mb",
"gc",
"nd",
"n-e",
"bhf",
"ng",
"n-i",
"n-o",
"bp",
"dt",
"n-u"
};
if (strWord.Length > 2)
{
for (int intEclipseCounter = 0;
intEclipseCounter < arrEclipses.Length;
intEclipseCounter++)
{
string strEclipse = arrEclipses[intEclipseCounter];
if (strWord.Length > strEclipse.Length
&&
string.Compare(strWord.Substring(0, strEclipse.Length), strEclipse) == 0)
return strWord.Substring(strEclipse.Length - 1);
}
}
return "";
}
此方法会剥离开头的“遮蔽”并返回单词的自然拼写,然后将其与应用程序的单词列表进行测试,以查看它是否是可接受的拼写。有三种这样的方法,它们位于classDlús_BinaryTree.cs 文件中。当单词在单词列表中找不到时,就会使用它们,因为它们的拼写可能会被类似的爱尔兰词典学家的噩梦扭曲。如果这些方法都无法生成有效的拼写,则它会停止尝试并返回一个null
“未找到”结果,表明该单词不在单词列表中,因此被假定为拼写错误。
将交互式单词列表显示到屏幕上
我用来绘制单词列表的代码有点乱,我一直在努力处理一段时间了。它最初是源于我需要减少我的 Animation Editor 项目中 Microsoft 原生 C# 语言对象的数量(自上次发布以来已取得巨大飞跃,并且在准备向世界展示我所创造的怪物之前还需要更多关注)。屏幕上有太多供用户交互的对象,我确信这就是它运行速度如此缓慢的原因(后来我发现了一些其他原因并修复了它们)。目标是通过使用 Sweep-and-Prune 算法将图形用户界面绘制到单个 MS PictureBox 上,从而减少因拥有所有那些占用了大量内存、加载了过多事件的对象而造成的不必要的开销,这些对象我认为正在充斥着我的项目,将其精简到一个 PictureBox。
这是我说的关于杂乱工作区的一个例子……
上图是 Animation Editor 的 UI 的一小部分,它允许用户从起始大小和位置采样源图像的矩形区域到结束大小和位置,然后在给定的起始和结束帧处,为任何数量的动画帧在动画项目中从起始大小/位置到结束大小/位置绘制该采样图像(这会产生一个滚动效果,相机会在图像或视频上平移/缩放)。这些对象有 87 个,每个对象都有事件、方法和属性,而这个应用程序实际上从未使用过其中的 95%。C# 原生对象是经过测试的,功能多样且(大部分)无错误,但它们会带来很多开销(至少我是这么认为的)。我的解决方案旨在减少内存开销并减轻处理器在处理它们时的负担(目标是否实现还有待观察)。但是,SPObjects
类已经增长,发生了过度的变化。我已经调试并修改了它太多次,以至于我过去一年的所有项目中都有这个相同类的不同版本,并且它一直在改进(尽管我的 SPObjects.TextBox
是一个彻头彻尾的灾难,可能还需要很长时间才能正确驯化,然后才能带它出去和别人一起玩,而不会让我太尴尬)。
这个类太难用了,我有时会借酒消愁。
我最终会写一篇关于它的文章并向世界展示,但现在我只想说……哎哟。这是我给自己设定的最困难的挑战之一,尽管我对结果很满意,但它远未完成(那个 TextBox
确实没有希望了)……
但是 SPObjects
类确实有其优点。
不深入探讨……基本上,有一个假想的矩形区域定义了对象可以放置的空间。该区域可以任意大,形状也可以任意(只要是矩形),可以在笛卡尔坐标系中的任何位置。“可见区域”也可以放置在笛卡尔坐标系中的任何位置,并且根据当时要显示给用户的内容,如果需要,会自动出现滚动条。这意味着,对于这个文字处理器,我可以创建一个足够大的空间来容纳爱尔兰词典的整个单词列表,让用户移动滚动条,然后在可见区域发生变化时,在它绘制自身之前中断 SPContainer,并将大约十几个正在循环使用的 SPObjects.Labels
移到屏幕上,以便在可见区域中显示它们,并带有适合它们舞蹈表演的文本和颜色。
听懂了吗?
好的,我再试一次。
我为 SPContainer(Sweep'n'Prune 区域)创建了一个高大的矩形区域,它比用户在屏幕上看到的矩形空间大得多。当需要绘制此可见区域时,SPContainer 中已有的任何标签都会被移除并保存在一个侧边列表中以供重复使用。然后,将可见区域与单词列表进行比较,单词列表有一个升序的排名顺序,用作索引。然后查阅这个索引的单词列表来确定屏幕上需要绘制的内容,现有的标签从侧边列表中取出(刚才我们把它们放在那里),告诉它们要穿什么服装和化妆,当它们准备好下一次表演时,它们就会跑到 SPContainer 中预定的位置,以便在屏幕上以用户应看到的方式显示。
绘制单词列表的方式有些曲折,因为通常我只会将所有对象添加到 SPContainer 中它们应在的位置,而不必担心在可见区域变化时进行重复利用,因为这是使用此类的少数优点之一,但由于词典中有超过 74,000 个独特的单词拼写,如果这样做,在加载时 Dlús 会停滞,因为它需要构建 SPContainer
的区域,然后因不必要的内存需求而受到影响,这些需求最好保存在硬盘的二进制文件中。
SPObjects.cs 类包含在此项目的源代码中,它是最新最好的,确实可以减少使用 Microsoft 为每个对象提供的所有通用功能所带来的内存开销,但它在使用方便性方面仍然不足(或者说缺乏)。你确实需要努力才能让它发挥作用,尽管它具有创建任意比例的可滚动容器并自动添加滚动条的优点……但如果你没有亲身经历过实现它的自虐式乐趣,它仍然是一件很麻烦的事。
将字典单词条目显示到屏幕上
为了将 RTF 文件加载到屏幕顶部的词典窗口中,我所做的是将两个 RichTextBox
放在同一个面板中,然后像动画师在将图纸放到屏幕上之前在侧盘上绘制一样,在它们之间切换。有两个属性名称……
RichTextBox RTX_Next { get { return rtx[(RTXCounter + 1) % 2]; } }
RichTextBox RTX_Current { get { return rtx[RTXCounter]; } }
……我通过一个更改其中一个引用的当前 RichTextBox
的值的方法来在它们之间循环。
void RTX_Cycle()
{
intRtxCounter = (intRtxCounter + 1) % 2;
RTX_Current.BringToFront();
if (formDlús.Debugging)
RTX_Current.ContextMenu = cmnu;
}
然后,当我想要加载一个新定义时,RTX_Next
RichTextBox
就是实际加载文件的那个,然后再调用 RTX_Cycle()
方法将其放在前一个前面。
设置一个计时器来测试用户的鼠标是否悬停在词典显示区域。每当鼠标移动时,此计时器就会重置,当鼠标离开屏幕的该部分时,计时器就会完全停止。在 CK_Objects.cs 文件中有一个方法,我用它来测量相对于应用程序中任何控件的通用“屏幕上”MousePosition
。它会询问 Windows 鼠标在屏幕上的位置,然后减去每个父控件的Location
,直到包含应用程序的表单。看看
public class classMouseOnControl
{
public static Point MouseRelTo(Control ctrl)
{
Point ptRetVal = System.Windows.Forms.Control.MousePosition;
while (ctrl != null && ctrl.Parent != null)
{
ptRetVal.X -= ctrl.Location.X;
ptRetVal.Y -= ctrl.Location.Y;
ctrl = ctrl.Parent;
}
return ptRetVal;
}
}
如果用户将鼠标光标足够长地停留在词典显示区域的任何位置,计时器事件就会被触发。这会告诉应用程序检查鼠标光标下方的单词是什么,然后显示相应的信息,并将其显示在屏幕上鼠标光标所在位置附近的弹出文本框中。
弹出文本框中显示的内容取决于鼠标光标下的内容。它首先询问“这个文本的颜色是什么”,因为如果是前面提到的用于绘制所有缩写“提示”的“独特绿色”,那么它就知道鼠标光标下的文本是一个缩写,它需要显示的是该缩写的完整拼写。否则,它会搜索单词列表数据库(确保测试前面部分提到的遮蔽)。如果在鼠标光标下找到与单词列表中的单词匹配的内容,它就会将其显示在屏幕上。
最初,我曾主张包含与我添加到《创意作家文字处理器》中的 Merriam-Webster's English Dictionary 文件相同的英文词典文件,但“保持爱尔兰特色”的意图破坏了那个计划,我移除了 MW 词典。
void PopUpText()
{
string strPopUp = "";
if (intIndex_Start <= intIndex_End && intIndex_Start >= 0)
{
RTX_Current.Select(intIndex_Start, intIndex_End - intIndex_Start+1);
if (RTX_Current.SelectionColor.R == clrTip.R
&& RTX_Current.SelectionColor.G == clrTip.G
&& RTX_Current.SelectionColor.B == clrTip.B)
{
// this is an abbreviation and needs to be matched with its 'tip'
strPopUp = classTip.Search_PopUpKey(_strWordUnderMouse);
panelPopUpDefinition.Abbreviation(strPopUp);
}
else
{
List<classDlús_LLItem> lstLL = classDlús_BinaryTree.Search(WordUnderMouse);
if (lstLL != null && lstLL.Count > 0)
{
panelPopUpDefinition.Definition(lstLL);
}
}
}
}
同义词库 - Líonra Séimeantach na Gaeilge (行家都知道是 LSG)
将一个 PDF 文件转换为 32,728 个 RTF 文件
我去了他们的网站,查看了他们提供的 XML 格式的文件。
我不喜欢它。
尝试使用他们的 Latex_Source 文件
不喜欢……
GaelSpell,,,
不喜欢……
基本上,我决定不再依赖别人,也不再寻找第三方的东西,这些东西根本没按我希望的那样工作……所以我下载了 LSG 的 PDF 文件,想着可以用它来生成同义词库数据库。我在网上搜索了一个(免费)应用程序来将 PDF 转换为 RTF,结果向两家公司提供了我的信用卡信息,它们都承诺可以做到。我依次登录了我的新账户,发现 Gaeilge 不是一种常用语言,它们也不知道如何处理这个文件。幸运的是,这两个账户都是“免费试用”账户,而且我还没有在我的(透支的)银行对账单上看到任何钱进账……目前还没有。
所以,我手里拿着一个漂亮的 PDF,却没有前进的动力……嗯,让我想想这在我身上发生过多少次。
嗯,无论如何我们玩得很开心。
请允许我介绍我的约会对象,她的名字叫“剪切 N 粘贴”。我们玩了好几个小时。生了 21 个孩子,并给他们都起了从 A 到 Z 的名字。
让我给你看一张全家福
我本该也入镜的,但我得拿着相机。
接下来,我开始处理孙辈们。
由于孩子们都像他们的妈妈,我知道每个单词条目都以粗体字体开头。所以,通过逐个字符扫描,寻找粗体字母(并忽略粗体数字样本),我就可以将每个 RTF 文件分割成单独的单词条目,并将它们单独保存以生成所有“孙辈”。我就是这么做的。我花了大约一个小时写代码,9 小时处理所有文件,10 分钟决定小睡一下,而我们的其他后代则在 Ancestry.com 上查找他们的历史,找到了这张骄傲的全家福。
所以,这时,我已经有了构建同义词库所需的所有RichText
文件。
这是我编写的用于生成所有 RTF 同义词文件应用程序 Dl_s_Thesaurus_Build_RTF_Files_20210330_0806.zip。
在同义词库中为用户查找单词
要为用户提供给定单词的同义词信息,将请求单词的拼写用于在相应的 LSG 子目录中搜索文件名。如果找到与请求单词拼写完全一致的文件,则该文件的内容将显示在屏幕上。当请求单词的变体拼写时,应用程序需要遍历二进制树来查找请求的单词,然后报告单词的词根拼写,然后将其用作文件名,再次搜索硬盘,找到文件并将其内容显示在屏幕上。跳过此过程的第一步可能会简化算法,但既然它按我写的在工作,为什么还要费心修复呢?当我决定它在我写好的那样工作时……我就继续前进,不再考虑它。
这是代码
public void Thesaurus_Search()
{
RichTextBox rtx = rtxMain.rtx;
string strWordUnderMouse = TextAtCursor(ref rtx);
if (strWordUnderMouse.Length > 0)
{
string strDir = classDlús_BinaryTree.WorkingDirectory + "lsg\\Letter" +
StringLibrary.classStringLibrary.Deaccent(strWordUnderMouse)[0] +
"\\" + strWordUnderMouse + ".rtf";
if (System.IO.File.Exists(strDir))
{
Thesaurus_Show(strDir);
return;
}
bool bolValid = false;
classDlús_BinaryTree.classBTLeaf cBTLeaf =
classDlús_BinaryTree.classBTLeaf.Get(strWordUnderMouse, ref bolValid, true);
strDir = classDlús_BinaryTree.WorkingDirectory + "lsg\\Letter" +
StringLibrary.classStringLibrary.Deaccent(cBTLeaf.key)[0] +
"\\" + cBTLeaf.key + ".rtf";
if (System.IO.File.Exists(strDir))
{
Thesaurus_Show(strDir);
}
}
}
结论
我从一月初开始从事这个项目。由于我一次总是有十几二十个项目在缓慢进行,所以我很难完成任何事情,而不被其他事情分心。我的 Still 一直是我的分心。我的 Animation Editor 项目经常让我花时间制作动画视频,在此过程中,我经常发现我的 Sprite Editor 的问题。我玩微控制器,现在我正在写我的下一本小说,这引起了我对我 Creative Writer's Word Processor 的修复和新功能的关注。所有这些分心都非常有趣且耗时,但由于 Dlús 是我受委托编写的项目,我付出了额外的努力,确保它得到妥善完成,并且尽可能用户友好。未来可能仍会有更新……但目前“tá sé iomlán”(它已完成)。
历史
- 2021年5月16日:初始版本
- 2021年6月7日:修复了“保存”菜单选项(被当作“另存为”处理)
- 2022年1月15日:添加了单词建议,将绿色改为蓝色,更改了 Flash 图像,创建了 885 个在原始发布中丢失的词典文件
- 2022年1月17日:对外观进行了微小更改,并更改了 Flash 图像
- 2022年1月20日:微小的美学更改 - 重新构建了同义词库文件以将 n/a/f 缩写更改为实际文本