突出显示重音字符
我正在使用 jquery.highlight 插件: http://code.google.com/p/gce-empire/source/browse/trunk/jquery.highlight.js?r=2
当我搜索带重音的单词时,例如“café”,它不会突出显示“cafe”匹配...不过,“cafe”效果很好...所以,我希望能够突出显示重音单词...知道如何使用此插件执行此操作吗?
谢谢!
编辑 好的,这是有效的,但是我必须在 'pattern' 和 'patternNoAccents' 变量上的第一个“(”和最后一个“)”之间添加一个空格,因为如果在开头或结尾有重音字符单词,它不起作用(例如“café”)。
问题是它突出显示了单词以及前后的空格。还有其他解决办法吗?
jQuery.extend({
highlight: function (node, re, nodeName, className) {
if (node.nodeType === 3) {
var match = node.data.match(re);
if (match) {
var highlight = document.createElement(nodeName || 'span');
highlight.className = className || 'highlight';
var wordNode = node.splitText(match.index);
wordNode.splitText(match[0].length);
var wordClone = wordNode.cloneNode(true);
highlight.appendChild(wordClone);
wordNode.parentNode.replaceChild(highlight, wordNode);
return 1; //skip added node in parent
}
} else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children
!/(script|style)/i.test(node.tagName) && // ignore script and style nodes
!(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted
for (var i = 0; i < node.childNodes.length; i++) {
i += jQuery.highlight(node.childNodes[i], re, nodeName, className);
}
}
return 0;
}
});
jQuery.fn.unhighlight = function (options) {
var settings = { className: 'highlight', element: 'span' };
jQuery.extend(settings, options);
return this.find(settings.element + "." + settings.className).each(function () {
var parent = this.parentNode;
parent.replaceChild(this.firstChild, this);
parent.normalize();
}).end();
};
function stripAccents(str) {
var rExps=[
{re:/[\xC0-\xC6]/g, ch:'A'},
{re:/[\xE0-\xE6]/g, ch:'a'},
{re:/[\xC8-\xCB]/g, ch:'E'},
{re:/[\xE8-\xEB]/g, ch:'e'},
{re:/[\xCC-\xCF]/g, ch:'I'},
{re:/[\xEC-\xEF]/g, ch:'i'},
{re:/[\xD2-\xD6]/g, ch:'O'},
{re:/[\xF2-\xF6]/g, ch:'o'},
{re:/[\xD9-\xDC]/g, ch:'U'},
{re:/[\xF9-\xFC]/g, ch:'u'},
{re:/[\xD1]/g, ch:'N'},
{re:/[\xF1]/g, ch:'n'} ];
for(var i=0, len=rExps.length; i<len; i++)
str=str.replace(rExps[i].re, rExps[i].ch);
return str;
};
jQuery.fn.highlight = function (words, options) {
var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };
jQuery.extend(settings, options);
if (words.constructor === String) {
words = [words];
}
words = jQuery.grep(words, function(word, i){
return word != '';
});
words = jQuery.map(words, function(word, i) {
return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
});
wordsNoAccents = jQuery.map(words, function(word, i) {
return stripAccents(word);
});
if (words.length == 0) { return this; };
var flag = settings.caseSensitive ? "" : "i";
var pattern = "( " + words.join("|") + " )";
if (settings.wordsOnly) {
pattern = "\\b" + pattern + "\\b";
}
var patternNoAccents = "( " + wordsNoAccents.join("|") + " )";
if (settings.wordsOnly) {
patternNoAccents = "\\b" + patternNoAccents + "\\b";
}
var re = new RegExp(pattern, flag);
var reNA = new RegExp(patternNoAccents, flag);
console.log(re);
console.log(reNA);
return this.each(function () {
jQuery.highlight(this, re, settings.element, settings.className);
jQuery.highlight(this, reNA, settings.element, settings.className);
});
};
I'm using the jquery.highlight plugin: http://code.google.com/p/gce-empire/source/browse/trunk/jquery.highlight.js?r=2
When I search an accented word, e.g. "café", it won't highlight the "café" matches... With "cafe" works fine, though.. So, I want to be able to highlight accented words... Any idea on how to do this with this plugin?
Thanks!
EDIT
Ok, this is working, but I had to add a space between the first "(" and the last ")" on the 'pattern' and 'patternNoAccents' vars, because if there was an accented character at the beggining or end of the word, it wouldn't work (e.g. 'café')
The problem with this is that it highlights the word AND a space before and after. Is there any other solution?
jQuery.extend({
highlight: function (node, re, nodeName, className) {
if (node.nodeType === 3) {
var match = node.data.match(re);
if (match) {
var highlight = document.createElement(nodeName || 'span');
highlight.className = className || 'highlight';
var wordNode = node.splitText(match.index);
wordNode.splitText(match[0].length);
var wordClone = wordNode.cloneNode(true);
highlight.appendChild(wordClone);
wordNode.parentNode.replaceChild(highlight, wordNode);
return 1; //skip added node in parent
}
} else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children
!/(script|style)/i.test(node.tagName) && // ignore script and style nodes
!(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted
for (var i = 0; i < node.childNodes.length; i++) {
i += jQuery.highlight(node.childNodes[i], re, nodeName, className);
}
}
return 0;
}
});
jQuery.fn.unhighlight = function (options) {
var settings = { className: 'highlight', element: 'span' };
jQuery.extend(settings, options);
return this.find(settings.element + "." + settings.className).each(function () {
var parent = this.parentNode;
parent.replaceChild(this.firstChild, this);
parent.normalize();
}).end();
};
function stripAccents(str) {
var rExps=[
{re:/[\xC0-\xC6]/g, ch:'A'},
{re:/[\xE0-\xE6]/g, ch:'a'},
{re:/[\xC8-\xCB]/g, ch:'E'},
{re:/[\xE8-\xEB]/g, ch:'e'},
{re:/[\xCC-\xCF]/g, ch:'I'},
{re:/[\xEC-\xEF]/g, ch:'i'},
{re:/[\xD2-\xD6]/g, ch:'O'},
{re:/[\xF2-\xF6]/g, ch:'o'},
{re:/[\xD9-\xDC]/g, ch:'U'},
{re:/[\xF9-\xFC]/g, ch:'u'},
{re:/[\xD1]/g, ch:'N'},
{re:/[\xF1]/g, ch:'n'} ];
for(var i=0, len=rExps.length; i<len; i++)
str=str.replace(rExps[i].re, rExps[i].ch);
return str;
};
jQuery.fn.highlight = function (words, options) {
var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };
jQuery.extend(settings, options);
if (words.constructor === String) {
words = [words];
}
words = jQuery.grep(words, function(word, i){
return word != '';
});
words = jQuery.map(words, function(word, i) {
return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\amp;");
});
wordsNoAccents = jQuery.map(words, function(word, i) {
return stripAccents(word);
});
if (words.length == 0) { return this; };
var flag = settings.caseSensitive ? "" : "i";
var pattern = "( " + words.join("|") + " )";
if (settings.wordsOnly) {
pattern = "\\b" + pattern + "\\b";
}
var patternNoAccents = "( " + wordsNoAccents.join("|") + " )";
if (settings.wordsOnly) {
patternNoAccents = "\\b" + patternNoAccents + "\\b";
}
var re = new RegExp(pattern, flag);
var reNA = new RegExp(patternNoAccents, flag);
console.log(re);
console.log(reNA);
return this.each(function () {
jQuery.highlight(this, re, settings.element, settings.className);
jQuery.highlight(this, reNA, settings.element, settings.className);
});
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
看看这个例子。 http://jsfiddle.net/bNPjQ/ 如果您经过 Café,它会突出显示 Cafe 和 Café。不确定这是否是您想要的功能,但如果您希望它仅突出显示 Café,我可以帮助您。
我从原始插件开始,添加了 stripAccents 函数,更改了一行,并在突出显示函数中添加了对 stripAccents 的调用。我用评论标记了我更改的所有内容。
当你运行它时,它会在没有 WordsOnly 的情况下进行突出显示,然后 2 秒后取消突出显示并使用 WordsOnly 进行另一个突出显示。
Check out this example. http://jsfiddle.net/bNPjQ/ It will highlight both Cafe and Café if you pass in Café. Not sure if this is the desired function, but I can help you out if you want it to only highlight Café.
I started with the original plugin, added your stripAccents function, changed one line, and added a call to stripAccents in the highlight function. I marked everything I changed with a comment.
When you run it, it will do a highlight without wordsOnly, then 2 seconds later unhighlight and do another highlight with wordsOnly.
您必须在文本正文中输入 HTML 特殊字符代码。
例如:
然后在下面的突出显示插件示例的选择器中:
刚刚测试了一下,它突出显示了文档中 Café 的所有实例。
You have to put in the HTML special character code in the body of the text.
For example:
Then in the selector for the highlight plugin example below:
Just tested it out and it highlights all instances of Café in the document.
使用 http://highlightjs.org/ 易于使用,并且有许多可用于突出显示的选项
Use http://highlightjs.org/ Easy to use and have many options available for highlighting