Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.05.2019, 15:57
Интересующийся
Отправить личное сообщение для MashaDo Посмотреть профиль Найти все сообщения от MashaDo
 
Регистрация: 29.05.2019
Сообщений: 10

Не воспринимается кириллица.
Добрый день. Помогите,пожалуйста, советом. Пишу расширение для хрома, которое бы заменяло слова на сайтах на те, которые прописаны у меня в файле.
В файле 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();

})();

Последний раз редактировалось MashaDo, 29.05.2019 в 17:01.
Ответить с цитированием
  #2 (permalink)  
Старый 29.05.2019, 15:59
Интересующийся
Отправить личное сообщение для MashaDo Посмотреть профиль Найти все сообщения от MashaDo
 
Регистрация: 29.05.2019
Сообщений: 10

Вопрос в следующем: что нужно прописать дополнительно, чтобы "ру на ру" так же менялось?
Ответить с цитированием
  #3 (permalink)  
Старый 29.05.2019, 16:30
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от MashaDo
Вопрос в следующем: что нужно прописать дополнительно, чтобы "ру на ру" так же менялось?
А где у вас, собственно говоря, эта замена происходит?
Ответить с цитированием
  #4 (permalink)  
Старый 29.05.2019, 16:31
Интересующийся
Отправить личное сообщение для MashaDo Посмотреть профиль Найти все сообщения от MashaDo
 
Регистрация: 29.05.2019
Сообщений: 10

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);

})();

Последний раз редактировалось MashaDo, 29.05.2019 в 16:58.
Ответить с цитированием
  #5 (permalink)  
Старый 29.05.2019, 16:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Сообщение от MashaDo
new RegExp('\\b' + original_escaped + '\\b'
new RegExp('(^|\\s)' + original_escaped + '($|\\s)')
Ответить с цитированием
  #6 (permalink)  
Старый 29.05.2019, 16:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

MashaDo,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #7 (permalink)  
Старый 29.05.2019, 16:52
Интересующийся
Отправить личное сообщение для MashaDo Посмотреть профиль Найти все сообщения от MashaDo
 
Регистрация: 29.05.2019
Сообщений: 10

не работает так( хром делает RegExp('(^|\\s)' + original_escaped + '($|\\s)')
как ошибку синтаксиса. Замена слов не происходит.
Ответить с цитированием
  #8 (permalink)  
Старый 29.05.2019, 16:59
Интересующийся
Отправить личное сообщение для MashaDo Посмотреть профиль Найти все сообщения от MashaDo
 
Регистрация: 29.05.2019
Сообщений: 10

спасибо, что сказали)не знала о такой возможности.
Ответить с цитированием
  #9 (permalink)  
Старый 29.05.2019, 17:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

MashaDo,
regex = new RegExp('(^|\\s)' + original_escaped + '($|\\s)', 'gi');
Ответить с цитированием
  #10 (permalink)  
Старый 29.05.2019, 17:15
Интересующийся
Отправить личное сообщение для MashaDo Посмотреть профиль Найти все сообщения от MashaDo
 
Регистрация: 29.05.2019
Сообщений: 10

так тоже не работает..
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кириллица в Windows и команды cmd -VenoM- Node.JS 0 23.02.2017 13:28
sockjs кириллица faecker AJAX и COMET 0 07.06.2015 21:19
Utf 8 и кириллица l-liava-l AJAX и COMET 7 02.04.2012 16:06
Не проходит запрос в базу если в поле кириллица Sadist_dead Серверные языки и технологии 1 26.11.2011 17:12
POST запрос воспринимается как OPTIONS neshta AJAX и COMET 0 29.03.2011 23:34