Nowe posty

Autor Wątek: Oprawa w "code" - skrypt dla Greasemonkey  (Przeczytany 6006 razy)

arctgx

  • Gość
Oprawa w "code" - skrypt dla Greasemonkey
« dnia: 2008-07-01, 17:13:17 »
Próbuję z własnych i gotowych pomysłów złożyć łatę, która dodaje link pod formularzem odpowiedzi w tym forum. Ma on działać tak, że zaznaczamy kawałek tekstu lub nawet puste miejsce i pojawiają się nam znaczniki code z BBCode z obu stron.

Trafiłem jednak na problem. Zdefiniowane funkcje giną po zakończeniu skryptu i trzeba by je (na moje nędzne pojęcie) jakoś podpiąć do okna czy dokumentu, by można z nich później korzystać.

Problem jest opisany w http://diveintogreasemonkey.org/helloworld/code.html  . Jako że nie znam programowania obiektowego, próbowałem bez pełnego zrozumienia wykorzystać tamtejsze wskazówki.

// ==UserScript==
// @name           KOD
// @description    Wstaw CODE - nie działający skrypt JS dla Greasemonkey mający dodawać link do oprawy zaznaczenia wewnątrz formularza w tag "code".
// @include        http://forum.linux.pl/*
// ==/UserScript==

//******************** begin ********************************
/* Copyright "phpBB modified by Przemo" http://www.przemo.org/phpBB2/
 * This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

 */
window.wrapSelection = function wrapSelection(h, strFore, strAft) {
h.focus();
if (h.setSelectionRange)
{
var selStart = h.selectionStart, selEnd = h.selectionEnd;
h.value = h.value.substring(0, selStart) + strFore + h.value.substring(selStart, selEnd) + strAft + h.value.substring(selEnd);
h.setSelectionRange(selStart + strFore.length, selEnd + strFore.length);
}
else if (document.selection)
{
var oRange = document.selection.createRange();
var numLen = oRange.text.length;
oRange.text = strFore + oRange.text + strAft;
//moveSelectionRange(oRange, -numLen, -strAft.length);
}
else
{
h.value += strFore + strAft;
}
}

window.bbcode = function bbcode(strFore, strAft) {
f_post = document.getElementById("post");
window.wrapSelection(f_post.req_message, strFore, strAft);
}

// **************************** end **************************
//
window.kod = function kod(tag) {
this.tytul = "Kod";
this.id_formularza = "post";
this.formularz = document.getElementById(id_formularza);
//lepszy sposób znalezienia listy by się przydał
this.ul = formularz.getElementsByTagName("ul")[0];
this.li = document.createElement("li");
this.a = document.createElement("a");
a.appendChild(document.createTextNode(tytul));
a.setAttribute("id","kod_on");
a.setAttribute("onclick","window.bbcode('[" + tag + "]', '[/" + tag + "]')");
a.setAttribute("title","Oklej znznaczenie w znacznik CODE");
li.appendChild(a);
ul.appendChild(li);
};
window.kod('code');
Wynik w konsoli błędów: "window.bbcode is not a function" - po kliknięciu na nowy link - czyli jakby window.bbcode istniało, ale źle określone. Wcześniej po słowie function nie było, zgodnie ze wskazówką, nazwy funkcji i efekt ten sam.

Z jednej strony chciałbym umieć zrobić działającą łatę, z drugiej nie wiem czy komuś z Was uda mi się (i czy oczywiście ktoś ma ochotę...)  wytłumaczyć w czym mój błąd siedzi.

Być może niebawem ZipoKing dołączy ten (z phpBB, używany choćby na debian.linux.pl) kod na stale do kodu Forum, ale tak czy tak chciałbym zrozumieć swój błąd.

edycja: zły link do artykułu podałem wcześniej

ZipoKing

  • Gość
Oprawa w "code" - skrypt dla Greasemonkey
« Odpowiedź #1 dnia: 2008-07-01, 18:14:56 »
A próbowałeś zamiast window.spam = function spam(foo, bar){...} napisać to jako window.spam = function(foo,bar){...} ? Ten zapis jest bardziej poprawny.

BTW, jeżeli już bawisz się w JavaScript, zainstaluj sobie Firebuga (http://www.getfirebug.com)

arctgx

  • Gość
Oprawa w "code" - skrypt dla Greasemonkey
« Odpowiedź #2 dnia: 2008-07-01, 18:33:13 »
Cytat: ZipoKing
A próbowałeś zamiast window.spam = function spam(foo, bar){...} napisać to jako window.spam = function(foo,bar){...} ? Ten zapis jest bardziej poprawny.
Cytat: arctgx
Wcześniej po słowie function nie było, zgodnie ze wskazówką, nazwy funkcji i efekt ten sam.
Jeśli chodzi o Firebuga, to mam go i zaraz zerknę czy będę w stanie wyciągnąć z niego więcej niż z konsoli błędów.