Co zrobiłem, a co nie - bilans ostatnich dwóch dni Michał Moroz

Jeden. Pisałem, że PHP ssie. Wreszcie ruszyłem do przodu z moimi podbojami tego języka i doszedłem do wniosku, że PCRE nie zostało zaprojektowane zbyt fortunnie, nadal zawiera kilka błędów, skutecznie utrudniających pracę. Na przykład: Niemożność użycia back references w patternie dla preg_replace. Lub zmuszanie do niezrozumiałego przeze mnie użycia nawiasów okrągłych (inaczej regexp nie zadziała). Mimo to mój prosty kod generujący strony w oparciu o szablony podobne do joggerowych jako tako działa, będę musiał jeszcze posprawdzać czasy wykonania. I przerobić po raz następny skrypty mojej strony. Możliwe też, żeby dorobić jakieś małe API. Nie chce mi się za każdym razem kopiować tego samego. W wolnej chwili może wystawię kod, bo w końcu taki zły nie jest. :)

Dwa. Zmusiłem mój skrypt javaskryptowy do działania w Internet Explorerze, dzięki czemu pozwoliłem sobie na zmianę wersji szablonu na 1.5pre1. Ostatniego błędu szukałem dobre dwadzieścia minut, okazało się, że skoro na stronie jest już element o id='toc', to nie wolno używać na nim getElementById(). Szczerze powiem, że chyba nigdy bym na to nie wpadł. Mimo to, jednak nie wszystko wygląda tak, jak powinno. Na oko IE nie pokazuje niektórych divów lub nie wyświetla ich css'a. Niestety, nie mogę określić, o co dokładnie chodzi, bo nie ma (albo nic o tym nie wiem) żadnego wyświetlania struktury drzewa DOM, przez co mogę jedynie się domyślać przyczyn.

Trzy. Właściwie niezbyt jest czym się chwalić, ale skoro już siedziałem na tym ze dwie godzinki, to chociaż się zareklamuję. :) Expert. Utwór Potwór jest w formacie ogg.

Cztery. Może niedługo ruszy coś z JeMeNem. Projekt stoi już od bardzo długiego czasu, ale wydaje nam się (mnie i Zimnemu) że jednak warto się zabrać za coś takiego, chociażby dla przyjemności. Tak więc możliwe, że coś kiedyś w końcu... I to chyba wszystko, czym się zajmowałem przez ostatnie dwa dni.

Skrypt: commlink-toc.js

Skrypt, do którego odsyła ten wpis, w całości - z gista:

// Old script for a jogger.pl blog that builds
// table of contents for comment section

var nickclass = 'commentNick';
var headclass = 'commhead';
var tocid = 'toc';
var tocmenuid = 'tocmenu';
var newcommid = 'newcomm';
var oldcommid = 'oldcomm';
var itemsclass = 'items';
var menuitemclass = 'menuitem';

function setCookie(name, value)
{
        expires = new Date();
        time = new Date();
        expires.setTime(time.getTime() + 3600000*24*7);
        document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString();
}

function getElementsByClassName(className) {
        var children = document.getElementsByTagName('*') || document.all;
        var elements = new Array();

        for (var i = 0; i < children.length; i++) {
                var child = children[i];
                var classNames = child.className.split(' ');
                for (var j = 0; j < classNames.length; j++) {
                        if (classNames[j] == className) {
                                elements.push(child);
                                break;
                        }
                }
        }
        return elements;
}

function getCookie(name)
{
        var dc = document.cookie;
        var prefix = name + "=";
        var begin = dc.indexOf("; " + prefix);
        if (begin == -1) {
                begin = dc.indexOf(prefix);
                if (begin != 0) return 0;
        }
        else {
                begin += 2;
        }
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
                end = dc.length;
        }
        return unescape(dc.substring(begin + prefix.length, end));
}

function commids()
{
        sigs = getElementsByClassName(nickclass);
        headers = getElementsByClassName(headclass);
        tocel = document.getElementById(tocid);
        if(sigs.length == 0) {
                return null;
        }
        tocmenu = document.createElement('div');
        tocmenu.setAttribute('id', tocmenuid);
        tocel.appendChild(tocmenu);

        tocmenu = document.getElementById(tocmenuid);

        url = document.URL;
        eidbegin = url.indexOf("eid=");
        eidend = url.indexOf("&", eidbegin);
        if (eidend == -1) {
                eidend = url.length;
        }
        eid = url.substring(eidbegin + 4, eidend);
        lastcomm = getCookie(eid);

        toctab = false;
        comm = null;

        for(i=0; i < sigs.length; i++) {
                if(i < lastcomm && !toctab)
                {
                        itemsel = document.createElement('div')
                        itemsel.setAttribute('class', itemsclass);
                        itemsel.setAttribute('id', oldcommid);

                        comm = document.createElement('div');
                        comm.setAttribute('class', menuitemclass);
                        comm.appendChild(document.createTextNode('Widziane:'));
                        comm.appendChild(itemsel);
                        tocmenu.appendChild(comm);
                        comm = document.getElementById(oldcommid);
                        toctab = true;
                }
                else if(i == lastcomm)
                {
                        itemsel = document.createElement('div')
                        itemsel.setAttribute('class', itemsclass);
                        itemsel.setAttribute('id', newcommid);

                        comm = document.createElement('div');
                        comm.setAttribute('class', menuitemclass);
                        comm.appendChild(document.createTextNode('Nowe:'));
                        comm.appendChild(itemsel);
                        tocmenu.appendChild(comm);
                        comm = document.getElementById(newcommid);
                }

                y = i + 1;

                sigs[i].setAttribute("id", "comm" + (y));

                newlink = document.createElement('a');
                newlink.setAttribute('href', '#comm' + (y));
                newlink.setAttribute('title', 'Komentarz numer ' + y);
                newlink.appendChild(document.createTextNode('#'));

                if(sigs[i].firstChild.firstChild){
                        nodename = sigs[i].firstChild.firstChild.data;
                }
                else {
                        nodename = sigs[i].firstChild.data;
                }

                if(nodename.length > 10) {
                        nodename = nodename.substring(0, 10) + "...";
                }

                toclink = document.createElement('a');
                toclink.setAttribute('href', '#comm' + (y));
                toclink.appendChild(document.createTextNode(nodename));

                newspan = document.createElement('span');
                newspan.appendChild(document.createTextNode(" | "));
                newspan.appendChild(newlink);

                headers[i].appendChild(newspan);
                comm.appendChild(document.createElement('br'));
                comm.appendChild(toclink);
        }
        setCookie(eid, y);
}

//*** This code is copyright 2003 by Gavin Kistner, gavin@refinery.com
//*** It is covered under the license viewable at http://phrogz.net/JS/_ReuseLicense.txt

function AttachEvent(obj,evt,fnc,useCapture){
        if (!useCapture) useCapture=false;
        if (obj.addEventListener){
                obj.addEventListener(evt,fnc,useCapture);
                return true;
        } else if (obj.attachEvent) return obj.attachEvent("on"+evt,fnc);
        else{
                MyAttachEvent(obj,evt,fnc);
                obj['on'+evt]=function(){ MyFireEvent(obj,evt) };
        }
}

function MyAttachEvent(obj,evt,fnc){
        if (!obj.myEvents) obj.myEvents={};
        if (!obj.myEvents[evt]) obj.myEvents[evt]=[];
        var evts = obj.myEvents[evt];
        evts[evts.length]=fnc;
}
function MyFireEvent(obj,evt){
        if (!obj || !obj.myEvents || !obj.myEvents[evt]) return;
        var evts = obj.myEvents[evt];
        for (var i=0,len=evts.length;i<len;i++) evts[i]();
}