małe i duze litery

w dziale Dostosowywanie Opery do własnych potrzeb
Cr3dO napisał(a):

W nawiązaniu do tematu: http://my.opera.com/polski/forums/topic.dml?id=874862

Zrobiłem skrypt który zmienia znaki, na razie taki prymitywny ale to dla tego ze nie znam JavaScript smile
Wstawię, może komuś się przyda, na dniach się poduczę JS i zrobię OK.

kod JS ( zapisujemy jako: change-case.js w katalogu swoich skryptów )

kod:

opera.toUpperCase = function () {

	for (i = 0 ; i < 100 ; i++) {
		var textArea = document.getElementsByTagName('textarea')[i];
		textArea.value = textArea.value.toUpperCase();

	}

}


opera.toLowerCase = function () {

	for (i = 0 ; i < 100 ; i++) {
		var textArea = document.getElementsByTagName('textarea')[i];
		textArea.value = textArea.value.toLowerCase();
	}

}


a w menu.ini w sekcji: Edit Widget Popup Menu Spellcheck Word dodajemy:

Item, "NA WIELKIE LITERY" = "Go to page, "javascript:opera.toUpperCase()""
Item, "NA MAŁE LITERY" = "Go to page, "javascript:opera.toLowerCase()""



u mnie:

[Edit Widget Popup Menu Spellcheck Word]
Include, Internal Spellcheck Suggestions
Item, M_INTERNAL_SPELLCHECK_ADD_WORD	= Add word
Item, M_INTERNAL_SPELLCHECK_IGNORE_WORD	= Ignore word
Item, M_INTERNAL_SPELLCHECK_REMOVE_WORD	= Remove word
Item, "NA WIELKIE LITERY" = "Go to page, "javascript:opera.toUpperCase()""
Item, "NA MAŁE LITERY" = "Go to page, "javascript:opera.toLowerCase()""
--------------------2
Include, Edit Widget Popup Menu Spellcheck Enabled





[edit]
kod zapisał się bez nawiasów kwadratowych, do pobrania: http://sgasiewski.pl/change-case.js

[edit2]
zapisanie kodu w znacznikach BBCode - czytelniej i nawiasy kwadratowe są smile

Medium napisał(a):

Do wstawiania kodu na forum używaj znaczników [ CODE ] [ /CODE ] (spacje celowe)

Cr3dO napisał(a):

zapomniałem o bibikode, już lepiej, dziękuję smile

nowotny napisał(a):

Oj zaraz dostaniesz błędami po oczach... smile
Tak powinno być:

opera.toUpperCase = function () {
	var textArea = document.getElementsByTagName('textarea');

	for (i = 0 ; i < textArea.length ; i++) {
		textArea[i].value = textArea[i].value.toUpperCase();
	}

}


opera.toLowerCase = function () {
	var textArea = document.getElementsByTagName('textarea');

	for (i = 0 ; i < textArea.length ; i++) {
		textArea[i].value = textArea[i].value.toLowerCase();
	}

}

Cr3dO napisał(a):

Originally posted by nowotny:

Oj zaraz dostaniesz błędami po oczach... smile
Tak powinno być:

opera.toUpperCase = function () {
	var textArea = document.getElementsByTagName('textarea');

	for (i = 0 ; i < textArea.length ; i++) {
		textArea.value = textArea.value.toUpperCase();
}

}


opera.toLowerCase = function () {
var textArea = document.getElementsByTagName('textarea');

for (i = 0 ; i < textArea.length ; i++) {
textArea
.value = textArea.value.toLowerCase();
}

}



Mówiłem że nie znam się na JS smile
ale masz racje, znacznie lepiej, dzięki.

p.s.
@nowotny a wiesz jak operować TYLKO na zaznaczonym tekście?

Medium napisał(a):

Ja się nie znam JavaScript, ale podejrzewam, że nie jest to aż takie proste, skoro nie każdy edytor tę właściwość posiada.

Cr3dO napisał(a):

Może nie proste ale da się, podobne: http://www.mozilla.org/editor/midasdemo/

p.s.
Medium sprawdzałaś, to chcesz? smile

Medium napisał(a):

Originally posted by Cr3dO:

Medium sprawdzałaś, to chcesz?

Twój skrypt? Nie, nie sprawdzałam.

Originally posted by Cr3dO:

Może nie proste ale da się, podobne: http://www.mozilla.org/editor/midasdemo/

Nie znajduję w tym edytorze możliwości zamiany.

Saskatchewan napisał(a):

Originally posted by Cr3dO:

podobne: http://www.mozilla.org/editor/midasdemo/

"Podobne" to bardzo dobre określenie w tym przypadku, bo zamiast pola tekstowego jest tam ramka pływająca iframe, więc jest to tylko "podobne".

Jeśli chcesz pracować na zaznaczeniu z pola tekstowego, to możesz zobaczyć jak to jest np. na tym forum przy wstawianiu BBCode'u: http://static.myopera.com/community/js/postform.js , funkcja code i najbardziej istotny jej fragment:
    var sel = false;
    var selText = "";

    //(...)

    var textarea = document.forms['postform'].postcontent;
    textarea.focus();
    if ( textarea.selectionStart != textarea.selectionEnd ) {
        selText = textarea.value.substring(textarea.selectionStart, textarea.selectionEnd);
        sel = selText.length != 0;
    }//(...)

Cr3dO napisał(a):

Originally posted by Saskatchewan:

"Podobne" to bardzo dobre określenie w tym przypadku, bo zamiast pola tekstowego jest tam ramka pływająca iframe, więc jest to tylko "podobne"...



Nie ważne że to ifram. Interakcje daje JS, nie jest to w HTMLu czy PHP. Może se być iframem gdyż to tylko osadzenie smile

Originally posted by Saskatchewan:

    var sel = false;
    var selText = "";

    //(...)

    var textarea = document.forms['postform'].postcontent;
    textarea.focus();
    if ( textarea.selectionStart != textarea.selectionEnd ) {
        selText = textarea.value.substring(textarea.selectionStart, textarea.selectionEnd);
        sel = selText.length != 0;
    }//(...)



a to nie wprowadza tego co chce.


p.s.

Medium chciałaś to, więc dlaczego nie sprawdziłaś?

http://my.opera.com/polski/forums/topic.dml?id=874862

Originally posted by Medium:


Też bym tak chciała! bigsmile

Medium napisał(a):

Originally posted by Cr3dO:

Medium chciałaś to, więc dlaczego nie sprawdziłaś?

Bo tylko czasem odczuwam taką potrzebę...
Zwykle jednak szybciej wychodzi wyłączyć capslok i wpisać pól linijki od nowa.

Saskatchewan napisał(a):

Originally posted by Cr3dO:

a to nie wprowadza tego co chce.

Ale pobiera zaznaczenie z textarea, a chyba tego chciałeś?

nowotny napisał(a):

Ok... po paru dniach główkowania mam coś takiego:

// ==UserScript==
// @name				Simple text formatter
// @author			nowotny
// @version 		0.1
// @include       *
// ==/UserScript==

var modify_text;

document.addEventListener('DOMContentLoaded', function(){
		
	var clear_selection = function (){
		var elems = get_elems();
		for(i=0;i<elems.length;i++){
			if(this!=elems[i]) elems[i].selectionStart=elems[i].selectionEnd;
		}
	};
	
	
	var elems = get_elems();
	
	for(i=0;i<elems.length;i++){		
		elems[i].addEventListener('mousedown',clear_selection,false);
		//tas[i].addEventListener('mouseup',clear_selection,false);
		elems[i].addEventListener('keydown',clear_selection,false);
		//tas[i].addEventListener('keyup',clear_selection,false);
	}
	
	
	
	function get_elems(){
		var tas = document.getElementsByTagName('textarea').toArray();
		var ins = document.getElementsByTagName('input').toArray();
		ins = ins.filter(function(el,i,a){return (el.type=='text')});
		
		elems=tas.concat(ins);
		return elems;
	}
	
	function mod(type,text){
		switch(type){
			case 'upper':
				return text.toUpperCase();break;
			case 'lower':
				return text.toLowerCase();break;
			default:
				return text;
		}
	}
	
	modify_text = function (type){
		var elems=get_elems();		
		for(i=0;i<elems.length;i++){
			if(elems[i].selectionStart != elems[i].selectionEnd){
				var star = elems[i].selectionStart;
				var end = elems[i].selectionEnd;
				var val = elems[i].value.substring(star,end);

				val = mod(type,val);
  				elems[i].value = elems[i].value.substr(0, star) + val + elems[i].value.substr(end, elems[i].textLength);
 			 	elems[i].selectionStart = star;
  				elems[i].selectionEnd = end;
  				elems[i].focus();
			}
		}
	}

},false);
	
NodeList.prototype.toArray = function(){
	var ary = [];
	for(var i=0, len = this.length; i < len; i++)
	{
		ary.push(this[i]);
	}
	return ary;
};


Do menu kontekstowego trzeba dodać wpisy w takiej postaci:
Item, "NA WIELKIE LITERY" = "Go to page, "javascript:modify_text('upper')""
Item, "NA MAŁE LITERY" = "Go to page, "javascript:modify_text('lower')""


Inne funkcje modyfikujące tekst można dodawać w switchu w funkcji mod()...

nowotny napisał(a):

Albo bardziej kompaktowy skrypt:

// ==UserScript==
// @name				Simple text formatter
// @author			nowotny
// @version 		0.2
// @include       *
// ==/UserScript==

var modify_text;

document.addEventListener('DOMContentLoaded', function(){
		
	var elementClicked;
	document.addEventListener('contextmenu', function(e){
		elementClicked = e.target;
	}, false);
			
	function mod(type,text){
		switch(type){
			case 'upper':
				return text.toUpperCase();break;
			case 'lower':
				return text.toLowerCase();break;
			default:
				return text;
		}
	}
	
	modify_text = function (type){
		if(elementClicked.selectionStart != elementClicked.selectionEnd){
			var star = elementClicked.selectionStart;
			var end = elementClicked.selectionEnd;
			var val = elementClicked.value.substring(star,end);
	
			val = mod(type,val);
			elementClicked.value = elementClicked.value.substr(0, star) + val + elementClicked.value.substr(end, elementClicked.textLength);
		 	elementClicked.selectionStart = star;
			elementClicked.selectionEnd = end;
			elementClicked.focus();
		}
		
	}

},false);

Medium napisał(a):

A odwróć małe/duże?

daroc napisał(a):

No i jeszcze "title case" i "sentence case". (Duże początki każdego wyrazu i zdania)
W końcu nie damy spokoju, zanim nie będzie tak dobre jak chociażby ten prościutki Notepad2. smile
Tutaj pewnie konieczna będzie pętla po wszystkich literkach. W pętli
- zamiana duże <-> małe
- zamiana na duże gdy literka jest pierwsza po jakimś białym znaku
- zamiana na duże gdy literka jest pierwsza po jakimś białym znaku poprzedzonym znakiem interpunkcyjnym (lub gdy biały znak jest pierwszy w zaznaczonym ciągu)
Chyba że jakiś prostszy pomysł?

Cr3dO napisał(a):

Originally posted by daroc:

No i jeszcze "title case" i "sentence case". (Duże początki każdego wyrazu i zdania)
W końcu nie damy spokoju, zanim nie będzie tak dobre jak chociażby ten prościutki Notepad2. smile
Tutaj pewnie konieczna będzie pętla po wszystkich literkach. W pętli
- zamiana duże <-> małe
- zamiana na duże gdy literka jest pierwsza po jakimś białym znaku
- zamiana na duże gdy literka jest pierwsza po jakimś białym znaku poprzedzonym znakiem interpunkcyjnym (lub gdy biały znak jest pierwszy w zaznaczonym ciągu)
Chyba że jakiś prostszy pomysł?



tak jak piszesz - operacje na białych znakach, ale zamiast pętli RegExp da rade chyba smile

[edit]

@nowotny dziękuje za kod, działa jak chce, przerobie zaraz by miał zdania, odwrotność, etc - pisał o tym daroc

daroc napisał(a):

Może i wygodniej regexpem, ale czy szybciej? Regexp też "za darmo" (bez użycia procesora) nie chodzi. wink Ale do takich zastosowań to w sumie jak komu wygodnie.

andol napisał(a):

Originally posted by daroc:

No i jeszcze "title case"



„Title case” w języku angielskim nie polega na zamianie pierwszych liter wszystkich wyrazów na wielki litery. Obowiązują tu ściśle określone zasady, które można łatwo znaleźć w sieci. W języku polskim w ogóle się tego nie stosuje.

Tutaj dali sobie radę, to i wy dacie. smile

daroc napisał(a):

Masz rację, na przykład prepositions (a, an, the) i przyimki (on, in itp) nie powinny być pisane wielką literą (chyba że są na początku zdania). Jednak w wielu programach tak to właśnie funkcjonuje. Przykładem jest chociażby Notepad2, czy program Directory Opus. W tym ostatnim do zmiany nazw plików został stworzony skrypt w VBScript o nazwie "True title case", który robi to tak jak trzeba. Jednak ze względu na duży stopień skomplikowania w programach oryginalnie tego nie ma, zresztą w języku polskim zestaw znaków [w zasadzie wyrazów - update], które jednak chcielibyśmy zostawić małe, jest inny, więc programy straciłyby na przenośności (brak tłumaczenia na wszystkie języki, zresztą wprowadzanie takich zasad dla różnych języków to już w ogóle masakra trochę). wink

andol napisał(a):

Originally posted by daroc:

zresztą w języku polskim zestaw znaków, które jednak chcielibyśmy zostawić małe


W języku polskim w ogóle nie ma czegoś takiego jak „title case”.

Cr3dO napisał(a):

W total komanderze w narzędziu: Narzędzie wielokrotnej zmiany do zmian liter są 4 ustawienia:

- Wszystkie z małej
- Wszystkie z DUŻEJ
- Pierwsza litera duża
- Pierwsza W Słowie Z Dużej

p.s.
w podstawówce na lekcjach języka polskiego uczono mnie że nie ma dużych liter tylko są to wielkie.

daroc napisał(a):

Uczyli też że mówi się "do stołówki", ale jakoś nie słyszałem takiego wyrażenia w życiu codziennym chyba nigdy (zresztą raczej wywołałoby uśmiech na twarzach ludzi), przynajmniej sobie takiego faktu teraz nie przypominam. wink

Originally posted by andol:

W języku polskim w ogóle nie ma czegoś takiego jak „title case”.


Mam na myśli na przykład tytuły piosenek, które chcielibyśmy mieć wyświetlane w programie muzycznym. Czy wielką literą powinien być napisany tylko pierwszy wyraz tytułu, czy wszystkie wyrazy wielką?

andol napisał(a):

Originally posted by daroc:

Mam na myśli na przykład tytuły piosenek, które chcielibyśmy mieć wyświetlane w programie muzycznym. Czy wielką literą powinien być napisany tylko pierwszy wyraz tytułu, czy wszystkie wyrazy wielką?



W przypadku polskich tytułów - tylko pierwsze wyrazy (oraz wszystkie te, które zawsze piszemy wielką literą). W przypadku anglojęzycznych - zgodnie zasadami obowiązującymi w języku angielskim, a więc „title case”.

daroc napisał(a):

Dobrze wiedzieć. Jednak takie rozróżnienie powoduje, że w programie jest takie wrażenie chaosu - raz słowa z wielkiej, raz z małej. Z ciekawości wpisałem pierwszy lepszy tytuł piosenki do Googli, aby sprawdzić na ile osoby dodające utwory muzyczne do różnych serwisów trzymają się tej zasady... i raczej wyszło to dość kiepsko... Po wpisaniu samego tytułu wychodzi to trochę lepiej, ale też można znaleźć pisanie wszystkich słów z wielkiej. Może wynika to z faktu, że programy do masowej zmiany tytułów piosenek w postaci plików często zmieniają właśnie na "title case" (bo niepolskie programy).