Hvordan fungerer wikien internt?

Ettersom wikien er ment å forbedre ITKs dokumentasjon, burde vi kanskje gå foran med et godt eksempel her.

Generell oversikt

Ettersom det er meg (Steinar) som har laget ITKs wiki, er den selvsagt skrevet i vårt alles favorittspråk Perl (verdens nest mest utskjelte språk etter C++, antageligvis :-) ). Vi bruker diff3 og wdiff til å gjøre grovarbeidet for oss, så det er relativt lite kode. (Eller dvs., snart bruker vi diff3. For øyeblikket støttes ikke merging, tidligere brukte vi CVS til dette, og lagring.)

Saken er stort sett ganske rent og ryddig programmert (og har strict, warnings og taint på overalt), bortsett fra noen relativt onde regexes – mer om dette seinere.

Datalagring

All tekst er lagret i PostgreSQL, i databasen itkwiki. All kode ligger i itk/felles/git/itkwiki. Databaseskjemaet går som følger (finnes også i itkwiki.sql):

SET check_function_bodies = false;
SET client_min_messages = warning;

–CREATE USER itkwiki ENCRYPTED PASSWORD 'password';
–CREATE DATABASE itkwiki WITH OWNER itkwiki;

–- c itkwiki

CREATE TABLE fts (
    word character varying(255) NOT NULL,
    node character varying(64) NOT NULL
);
ALTER TABLE public.fts OWNER TO itkwiki;

CREATE TABLE links (
    from_node character varying(64) NOT NULL,
    to_node character varying(64) NOT NULL
);
ALTER TABLE public.links OWNER TO itkwiki;

CREATE TABLE nodes (
    name character varying(64) NOT NULL,
    revision integer NOT NULL,
    date timestamp with time zone NOT NULL,
    author character varying(64),
    "comment" character varying(255),
    contents text,
    origin inet
);
ALTER TABLE public.nodes OWNER TO itkwiki;

ALTER TABLE ONLY fts
    ADD CONSTRAINT fts_pkey PRIMARY KEY (word, node);
ALTER TABLE ONLY links
    ADD CONSTRAINT links_pkey PRIMARY KEY (from_node, to_node);
ALTER TABLE ONLY nodes
    ADD CONSTRAINT nodes_pkey PRIMARY KEY (name, revision);

GRANT ALL ON TABLE fts TO itkwiki;
GRANT INSERT,SELECT,UPDATE,DELETE ON TABLE fts TO itkwiki;

GRANT ALL ON TABLE links TO itkwiki;
GRANT INSERT,SELECT,UPDATE,DELETE ON TABLE links TO itkwiki;

GRANT ALL ON TABLE nodes TO itkwiki;
GRANT INSERT,SELECT,UPDATE,DELETE ON TABLE nodes TO itkwiki;

Dataformat

Ting ligger som tekst i databasen, og oversettes til HTML etter behov (se neste avsnitt). Formatet (se Wiki for en innføring) er med vilje laget så nærme phpWiki som mulig; standardisering er bra, og det ser ut til å matche relativt fint med f.eks. det man får hvis man paster en HTML-side fra Mozilla over i ren tekst (som er fint hvis man vil overføre gammel dokumentasjon inn).

Visning

Ordinær visning av en node gjøres via scriptet show.pl (mod_rewrite, satt opp i /home/cassarossa/itk/web/dok/.htaccess) sørger for at /dok/Node blir oversatt til /dok/show.pl/Node). Oversettelsen fra tekstformatet i databasen til HTML gjøres utelukkende via regexes – dette fører til at man slipper å skrive en full parser osv., men fører til gjengjeld til en del ganske stygge regexes. Den definitivt styggeste delen av koden ligger her. :-)

Editering

Editering er så trivielt som det er mulig å få det ATM; alt gjøres i en eneste stor transaksjon (satt som SERIALIZABLE for å unngå at man først henter ut høyeste ID og så sniker det seg innom en ny post i mellomtiden før man får satt inn sin egen – så lenge vi vil ha en jevn sekvens på revisjonsnumrene kan vi ikke bruke sequences). I edit-formen brukeren får, sendes det med et skjult parameter som viser hvilken revisjon brukeren editerer; dersom det i løpet av editeringen (dvs. mellom brukeren får editformen og han/hun submitter den), brukes diff3 for å merge endringer inn (ala CVS/Subversion). Dersom det er konflikter, sendes siden tilbake til brukeren, som må løse opp i disse selv.

Detaljert oversikt

Les koden. :-P (Den er stort sett ganske godt kommentert og ment å være lesbar og vedlikeholdbar. :-) )

RSS-feed

RSS feed over endringer er tilgjengelig på http://itk.samfundet.no/dok/rss.pl og kan abonneres på ved å melde seg på itk-itkwiki-rss@samfundet.no i AMSIT. Denne kjører rss2mail, som også kan kjøres personlig og man ikke ønsker å melde seg på epostlisten. Dette gjøres ved:

r2e new <email@host.com>
r2e add http://example.com/rss
r2e run

Hvor den siste kommandoen kjøres i crontab -e.

Lenker: Start, itkwiki, wikioppsett

Epost: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2015-12-18 18:05 | Revisjon: 41 (historie, blame) | Totalt: 1880 kB | Rediger