Не воспринимается кириллица.
Добрый день. Помогите,пожалуйста, советом. Пишу расширение для хрома, которое бы заменяло слова на сайтах на те, которые прописаны у меня в файле.
В файле dictionaries содержатся слова: 1 колонка - что заменить, 2 колонка -на что заменить. Пример: var dictionary={ "replacements": { "TEX1" : "arb", "Opera" : "Не опера", "Маша" : "Мария" и т.д. Так вот, с нахождением англ слов и заменой на англ - расширение справляется. С нахождением англ слов и заменой на ру - тоже. Но "Маша" : "Мария" он заменять отказывается, как и другие слова "ру на ру". Привожу пример кода background.HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- Тег meta для указания кодировки -->
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<head>
<title>Background Page</title>
<script src="dictionaries/original.js"></script>
<script src="background.js"></script>
</head>
<body>
</body>
</html>
___ dictionaries/original.js - тут лежат слова для замены с заменой. __ файл background.js" показан ниже:
(function() {
var ONE_DAY = 1000 * 60 * 60 * 24;
var KEY_LAST_CHANGED_AT = 'lastChangedAt';
var KEY_OPTIONS = 'options';
var KEY_PAUSED = 'paused';
var _alreadyQueued = false;
function now() {
return new Date().getTime();
}
function checkForRandomSwap() {
var lastChangedAt, pollTimeout;
var options = JSON.parse(localStorage.getItem(KEY_OPTIONS));
if(options && options.checkDaily) {
lastChangedAt = parseInt(localStorage.getItem(KEY_LAST_CHANGED_AT), 10);
//не вносились изменения
if(isNaN(lastChangedAt) || lastChangedAt + ONE_DAY < now()) {
var pause = Math.random() > 0.5; // Flip a coin!
lastChangedAt = setPaused(pause);
}
// Set up the next check.
if(!_alreadyQueued) {
pollTimeout = (lastChangedAt + ONE_DAY) - now();
setTimeout(function() {
_alreadyQueued = false;
checkForRandomSwap();
}, pollTimeout);
_alreadyQueued = true;
}
}
}
function updateBadge(paused) {
var badgeText = paused ? "OFF" : "";
chrome.browserAction.setBadgeText( { text: badgeText } );
}
function isPaused() {
return (localStorage.getItem(KEY_PAUSED) == 'true');
}
function setPaused(paused) {
var lastChangedAt = now();
localStorage.setItem(KEY_PAUSED, paused);
chrome.storage.sync.set( { 'paused': paused } );
updateBadge(paused);
localStorage.setItem(KEY_LAST_CHANGED_AT, lastChangedAt);
return lastChangedAt;
}
function togglePause(tab) {
setPaused(!isPaused());
// Reload the current tab.
chrome.tabs.update(tab.id, {url: tab.url});
}
function getExcluded() {
var opts = JSON.parse(localStorage.getItem(KEY_OPTIONS));
return opts ? opts['excluded'] : [];
}
function onMessage(request, sender, sendResponse) {
var requestId = request.id;
if(requestId == 'isPaused?') {
// TODO: Convert to boolean.
sendResponse({value: isPaused()});
}
else if(requestId == 'getExcluded') {
sendResponse({value: getExcluded()});
}
else if(requestId == 'setOptions') {
localStorage.setItem(KEY_OPTIONS, request.options);
}
else if(requestId == 'getDictionary') {
sendResponse(dictionary);
}
}
chrome.browserAction.onClicked.addListener(togglePause);
chrome.extension.onRequest.addListener(onMessage);
updateBadge(isPaused());
checkForRandomSwap();
})();
|
Вопрос в следующем: что нужно прописать дополнительно, чтобы "ру на ру" так же менялось?
|
Цитата:
|
function() {
var _self = this;
var _dictionary;
function getDictionary(callback) {
chrome.extension.sendRequest({id: "getDictionary"}, function(response) {
_dictionary = response; // Store the dictionary for later use аа
callback.apply(_self, arguments);
});
}
function handleText(textNode) {
var replacements = _dictionary.replacements;
var expressions = _dictionary.expressions;
var v = textNode.nodeValue;
var matchFound = false;
var regex, original;
//text replacements
for(original in replacements) {
original_escaped = original;
regex_for_question_mark = /\?/g
regex_for_period = /\./g
original_escaped = original_escaped.replace(regex_for_question_mark, "\\?");
original_escaped = original_escaped.replace(regex_for_period, "\\.");
regex = new RegExp('\\b' + original_escaped + '\\b', "gi");
if (v.match(regex)) {
v = v.replace(regex, replacements[original]);
matchFound = true;
}
}
// regex replacements
for(original in expressions) {
regex = new RegExp(original, "g");
if (v.match(regex)) {
v = v.replace(regex, expressions[original]);
matchFound = true;
}
}
// Меняем только в случае изменения текста
if (matchFound) {
textNode.nodeValue = v;
}
}
function walk(node) {
// не удалять. связан с осн узлом
var child, next;
switch(node.nodeType) {
case 1: // Element
case 9: // Document
case 11: // Document fragment
child = node.firstChild;
while(child) {
next = child.nextSibling;
walk(child);
child = next;
}
break;
case 3: // Text
handleText(node);
break;
}
}
var running = true;
function work() {
running = true;
walk(document.body);
running = false;
}
chrome.extension.sendRequest({id: 'isPaused?'}, function(response) {
var isPaused = response.value;
if(isPaused) {
return;
}
chrome.extension.sendRequest({id: 'getExcluded'}, function (r2) {
var ex = r2.value;
for (x in ex) {
if (window.location.href.indexOf(ex[x]) != -1) {
return;
}
}
getDictionary(function() {
work();
});
});
});
var timeout = null;
document.addEventListener('DOMSubtreeModified', function(){
if (running) {
return;
}
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(work, 500);
}, false);
})();
|
Цитата:
new RegExp('(^|\\s)' + original_escaped + '($|\\s)')
|
MashaDo,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
не работает так( хром делает RegExp('(^|\\s)' + original_escaped + '($|\\s)')
как ошибку синтаксиса. Замена слов не происходит. |
спасибо, что сказали)не знала о такой возможности.
|
MashaDo,
regex = new RegExp('(^|\\s)' + original_escaped + '($|\\s)', 'gi');
|
так тоже не работает..
|
| Часовой пояс GMT +3, время: 20:24. |