2

作为用户类型,我需要在 ASPX 页面上的 Telerik RadEditor 控件内实现自动大写。

这可以是 IE 特定的解决方案 (IE6+)。

我目前在用户键入时捕获每个击键(向下/向上)以支持称为“宏”的单独功能,该功能本质上是扩展为格式化文本的短关键字。即宏“so”可以在点击空格键时自动扩展为“stackoverflow”。

也就是说,我可以访问 keyCode 信息,并且我正在使用 TextRange 方法来选择一个单词(“so”)并将其扩展为“stackoverflow”。因此,我有一些上下文。

但是,我需要检查此上下文以了解是否应该自动大写。无论是否涉及宏,这也需要工作。

由于我正在监视宏的击键,我应该只监视标点符号(不仅仅是表示大写字母的句点)并自动限制输入的下一个字母,还是应该使用 TextRange 并分析上下文?

4

4 回答 4

4

您是否尝试将text-transform CSS 样式应用于您的控件?

于 2008-09-20T08:33:13.207 回答
4

我不确定这是否是你想要做的,但这里有一个函数(参考)将给定的字符串转换为标题大小写:

function toTitleCase(str) {
    return str.replace(/([\w&`'‘’"“.@:\/\{\(\[<>_]+-? *)/g, function(match, p1, index, title){ // ' fix syntax highlighting
        if (index > 0 && title.charAt(index - 2) != ":" && 
            match.search(/^(a(nd?|s|t)?|b(ut|y)|en|for|i[fn]|o[fnr]|t(he|o)|vs?\.?|via)[ -]/i) > -1)
            return match.toLowerCase();
        if (title.substring(index - 1, index + 1).search(/['"_{([]/) > -1)
            return match.charAt(0) + match.charAt(1).toUpperCase() + match.substr(2);
        if (match.substr(1).search(/[A-Z]+|&|[\w]+[._][\w]+/) > -1 ||
            title.substring(index - 1, index + 1).search(/[\])}]/) > -1)
            return match;
        return match.charAt(0).toUpperCase() + match.substr(1);
    });
}
于 2008-09-20T08:48:33.250 回答
2

有时,不这样做是编码问题的正确答案。

我真的不会这样做,除非你觉得你可以编写一个脚本来正确设置以下句子中的大小写,如果你首先将其转换为小写并将其传递给脚本。

Jean-Luc “The King” O'Brien MacHenry van d'Graaf IIV (PhD, OBE) 与他的朋友 MacIntosh 和 MacDonald 一起将他的 Macintosh 留在了 Macdonald's。耶稣在圣乔治街的 AT&T 的“艾滋病防治”演出中给了他的 Atari ST,范海伦在范亨利的面包车里表演暴风雨。

通过尝试创建自然语言解析器,您已经为自己做好了准备。您永远无法像用户那样做到这一点。充其量,您可以进行近似,并让用户能够在您出错时进行编辑和强制更正。但通常在这种情况下,编辑工作比一开始就手动完成要多。

也就是说,如果您有足够的空间和能力来存储和搜索一个包含适当大写单词的大型 n-gram 语料库,那么您至少能够在最可能需要的情况下进行疯狂的尝试。

于 2012-02-13T09:42:34.110 回答
0

你提出了一个有趣的问题。对每次按键进行操作可能会受到更多限制,因为您将不知道在给定键码之后会立即发生什么(撤消结果不正确的反应的复杂性可能意味着无论如何都必须转到基于 TextRange 的例程)。诚然,迄今为止我还没有与这个问题的代码搏斗,所以这是我脑海中的一个假设。

无论如何,这里有一个 Title Casing 函数(受 John Gruber 博客自动化启发的 java 实现)在处理实际的套管代码时可能会激发一些想法:

http://individed.com/code/to-title-case/

于 2008-09-20T09:04:13.290 回答