Prośba o wstawienie regexu do rozszerzenia

0

Mam wielką prośbę o małe rozwinięcie rozszerzenia dla Google Chrome.

Chodzi o rozszerzenie [url="http://userscripts.org/scripts/review/108011"]Speakable Textareas[/url], które pozwala na konwersję głosu do tekstu we wszystkich polach tekstowych w Internecie. Można więc dyktować, zamiast wpisywać wiadomości. Rozpoznawanie to jest całkiem OK, choć popełnia kilka typowych błędów, które chciałbym poprawić używając regexu lub czegoś w tym stylu. Rozszerzenie używa Javasriptu i jQuery, których nie znam. Znam natomiast wyrażenia regularne.

Prosiłbym więc, żeby ktoś życzliwy podał mi wzór wstawiania regexu do tego rozszerzenia tak, żeby zmiana dokonywała się "w locie" - zaraz po odbiorze stringu, który odsyła serwer Google'a. Powiedzmy, że przykładowo chciałbym, żeby wyraz "kot" był zawsze zamieniany na "płot", a wyraz "mama", żeby automatycznie zamieniało na "tata".

Kod rozszerzenia:

// ==UserScript==
// @name		 Speakable Textareas
// @namespace	speakable
// @include	  *
// @author	   Josh Mandel
// @description  Allow speech input in any textarea (Google Chrome). super quick and dirty because I broke my arm, so don't mind the awful hacked-together javascript.
// ==/UserScript==


function jq(callback) {
	var script = document.createElement("script");
	script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
	script.addEventListener('load', function () {

		var script = document.createElement("script");
		script.textContent = "(" + callback.toString() + ")();";
		document.body.appendChild(script);

	}, false);
	document.body.appendChild(script);
}

function main() {
	jQuery.noConflict();

	var lastblur = {
		ss: 0,
		se: 0
	};

	setInterval(function () {

		jQuery("input").each(function (i) {

			if (!jQuery(this).attr("taed")) {
				jQuery(this).attr("taed", "true");
				jQuery(this).attr("x-webkit-speech", "true");
			}

		});

		jQuery("textarea:visible, *[g_editable='true']").each(function (i) {

			if (!jQuery(this).attr("taed") ) {
				var t = jQuery(this);

				t.blur(function () {
					lastblur = {
						time: new Date().getTime(),
						elt: t[0],
						ss: t[0].selectionStart,
						se: t[0].selectionEnd
					};
				});

				t.attr("taed", "true");
				var b = jQuery("<input type='text' size='1' x-webkit-speech>.</input>");
				b.css({
					"position": "absolute",
					"left": t.offset().left + t.width() - 30,
					"top": t.offset().top,
					"width": 15, border: "0px"
				});


				jQuery('body').append(b);
				b.click(function () {
					if (t[0] != lastblur.elt || (new Date().getTime() - t.time > 100)) {
						lastblur.ss = lastblur.se = t.val().length;
					}
				});

				setInterval(function () {

					b.css({
						"left": t.offset().left + t.width() - 30,
						"top": t.offset().top
					});

					if (b.val() == "") return;
					b.val(b.val()+" ");
					 if (t[0].tagName.toLowerCase()==="textarea") {
					var ot = t.val();
					t.val(ot.substr(0, lastblur.ss) + b.val() + ot.substr(lastblur.se));

					t.focus();
					var bl = b.val().length;

					if (lastblur.se == lastblur.ss) {
						t[0].selectionStart = t[0].selectionEnd = lastblur.ss + bl;
					} else {

						t[0].selectionStart = lastblur.ss;
						t[0].selectionEnd = lastblur.ss + bl;
					}

					} else if (t.attr("g_editable")) {
					  t.html(t.html() + b.val());	 
					}
					b.val("");


				}, 100);
			}
		});

	}, 1000);
}

// load jQuery and execute the main function
jq(main);
0

Ten skrypt nic nie wysyła do Googla, nie ma w ogóle połączeń z siecią!

Czytnik jest wbudowany w przeglądarkę, ten dodatek tylko aktywuje go na wszystkich elementach textarea - całość czytania jednak odbywa się w "core" przeglądarki i musiałbyś ściągać kod źródłowy całej przeglądarki i tam coś grzebać.

0
dzek69 napisał(a):

całość czytania jednak odbywa się w "core" przeglądarki

Może skrypt sam nie wysyła nic na serwer, ale transformacja mowy do tekstu na pewno odbywa się gdzieś na serwerach Google, bo po odłączeniu Internetu rozpoznanie mowy nie następuje.

Mniejsza o to. Czyli nie da się (bez rekompilacji przeglądarki) zlecić prostych zmian regexowych, które operowałyby na zawierającej już rozpoznany tekst zmiennej? Ten tekst w ogóle nie przechodzi przez zmienne, na których może operować javascript lub coś podobnego?

0

AAA, hola, źle przeczytałem jak to w ogóle działa, tj. myślałem, że oczekujesz czytania tekstu przez przeglądarkę (nie używam Chrome, nie wiem), a nie odwrotnie. Ty potrzebujesz poprawić tekst już przetłumaczony.

Nie chce mi się instalować Googla wraz z jego szpiegowskimi programikami, więc strzelam:

// to:
else if (t.attr("g_editable")) {
   t.html(t.html() + b.val());         
}
// zamień na:
else if (t.attr("g_editable")) {
   t.html(t.html() + 'to wcale nie jest rozpoznany tekst');
}
// jeżeli zamiast rozpoznanego tekstu będzie doklejał wyżej widoczny tekst, to znaczy, że to jest to. i potem:
else if (t.attr("g_editable")) {
   var text = b.val();
   var new_text = text.replace(/(kot|mama)/, 'pies'); // zamienia `kot` oraz `mama` na `pies`
   t.html(t.html() + new_text);
}
0

Dzięki za próbę, ale niestety nie zadziałało u mnie.

Jeśli chodzi o kwestie inwigilacji przez Google Brother, to używam SR Ware Iron, czyli forka Chrome pozbawionego dodatków szpiegowskich:

http://www.srware.net/en/software_srware_iron_chrome_vs_iron.php

Instalacja rozszerzeń spoza Chrome Web Store:

Download the extension file from the website and save it to your computer.
Click the wrench icon on the browser toolbar.
Select Tools > Extensions.
Locate the extension file on your computer and drag the file onto the Extensions page.
Review the list of permissions in the dialog that appears. If you would like to proceed, click Install.

Typowa ścieżka do katalogu rozszerzeń SR Ware Iron w Windows XP:

C:\Documents and Settings\Twoja_Nazwa\Ustawienia lokalne\Dane aplikacji\Chromium\User Data\Default\Extensions\

1 użytkowników online, w tym zalogowanych: 0, gości: 1