• No results found

hantering av BibTeX-databaser

N/A
N/A
Protected

Academic year: 2021

Share "hantering av BibTeX-databaser"

Copied!
37
0
0

Loading.... (view fulltext now)

Full text

(1)

EXAMENSARBETE

2005:19 HIP

STEFAN SILVERPLATS

Webbaserad lösning för

hantering av BibTeX-databaser

HÖGSKOLEINGENJÖRSPROGRAMMET Datateknik

Luleå tekniska universitet

Institutionen för Systemteknik • Avdelningen för Datalogi

(2)

Förord

Detta examensarbete omfattar 10 poäng och är den avslutande delen i min treåriga dataingenjörsutbildning vid Luleå Tekniska Universitet. Examensarbetet utfördes för avdelningen för datorkommunikation och datalogi vid Luleå Tekniska Universitet. Jag vill tacka min handledare Johan Karlsson, alla lärare jag haft och inte minst alla de studiekamrater som förgyllt tillvaron under mina studieår.

Stefan Silverplats

(3)

Sammanfattning

Som avslutande del i högskoleingenjörsutbildningar ingår ofta ett examensarbete. Denna rapport behandlar ett examensarbete som utförts för avdelningen för datorkommunikation och datalogi vid Luleå Tekniska Universitet.

Avdelningen för datorkommunikation och datalogi har sedan tidigare använt sig av ett

webbaserat system för hantering av BibTeX-databaser. Systemet var skrivet i Perl och bestod av tre skript och ett BibTeX-bibliotek. Med senare versioner av Perl och användandet av BibTeX-biblioteket uppstod vissa problem, den nya versionen av Perl var inte längre

kompatibelt med BibTeX-biblioteket. Uppgiften som tilldelades detta examensarbete var att konstruera en ny lösning för hanteringen av BibTeX-databaser. Arbetet bestod av att designa och sedan implementera denna nya lösning i programmeringsspråket PHP.

Rapporten tar upp bakgrundsfakta om PHP och BibTeX-databaser. Vidare behandlas arbetet mot en fungerande system samt resultatet av det färdiga systemet.

(4)

Abstract

As a final part in most engineering programs a degree project is included. This report is the result of a degree project that is performed for the department of computer science and networking at Luleå University of Technology.

The department of computer science and networking have previously used a webb based computersystem that manage BibTeX databases. The computersystem was written in Perl and consisted of three scripts and one BibTeX library. With later versions of Perl some problems occurred. The new version of Perl was no longer compatible with the BibTeX library. The assignment of this degree project was to develop a new solution of a computersystem to manage BibTeX-databases. The work of this degree project included to design the new system and implement it in the computerlanguage PHP.

This report discusses background facts about PHP and BibTeX-databases. Furthermore it describes the development of the computersystem and the result of the solution.

(5)

Innehållsförteckning

Förord

Sammanfattning Abstract

1 Inledning ……….…...……1

1.1 Motivet för arbetet ……….1

1.2 Syftet med arbetet ……….……….1

2 Bakgrund ………...……….……...2

2.1 PHP ………...………...…2

2.2 BibTeX-databaser …...……….…..………3

3 Analys ...………..7

4 Design av BibTeX-paketet ...………..8

4.1 Bibfile-klassen ……...………..8

4.2 SetOfEntry-klassen ………..10

4.3 Entry-klassen ………..………..12

4.4 Article-klassen ………..16

4.5 Stack-klassen ……...………...……..17

5 Skript……….20

5.1 smbib-skriptet ……….………..20

5.2 mkbib-skriptet ………..22

6 Förbättringar ………...30

7 Disskusion …..……….……….31

8 Referenser ………32

8.1 Litteratur …..………...……….32

8.2 Internet ………...………...32

(6)

1 Inledning

I akademiska publikationer är det snarare regel än undantag med litteraturförteckningar eller en lista av referenser. Det är inte ovanligt att man använder sig av samma referens i en text flera gånger. Ofta förekommer det också att vitt skilda publikationer som berör liknande ämnen använder sig av samma referens.

För att förenkla dokumentskrivande finns det system som hanterar referenser. Ett sådant system kan fungera på följande sätt. Istället för att skriva samma referens flera gånger, sparar man undan den specifika referensen. Genom att sedan använda sig av ett enkelt kommando i dokumenttexten som man arbetar med, kan man importera denna referens. För att det ska vara möjligt att använda samma referens i flera skilda dokument måste man spara undan referensens information i en databas. Denna databas används senare för att importera den önskade referensen till sitt dokument.

Hur en referens sparas undan varierar beroende på vilket system som används. Ett

existerande system med ovan nämnda egenskaper använder sig av BibTeX-databaser. För att enkelt kunna söka, hantera eller ändra informationen i dessa databaser skulle det underlätta om man kunde göra detta från en webbläsare. Det är hanteringen av dessa databaser med hjälp av olika webbsidor som är grunden för mitt arbete. Mitt arbete kommer att beskrivas i denna rapport.

1.1 Motivet för arbetet

Avdelningen för datorkommunikation och datalogi vid Luleå Tekniska Universitet använder sig av BibTeX-databaser. Syftet med BibTeX-databaserna är att hantera publikationslistor.

Dessa BibTeX-databaser modifieras och presenteras med hjälp av olika webbsidor. Det har används tre olika Perl-skript för hanteringen av dessa databaser, ett för att modifiera, och två för att presentera och söka publikationsreferenser. Det Perl-skript som användes för att modifiera, och ett av de två för att presentera/söka, använde sig i sin tur av ett Perl-paket kallat Text::BibTeX.

Med senare versioner av Perl tillsammans med Text::BibTeX-paketet uppstod vissa problem.

Således blev min uppgift att översätta skripten och Text::BibTeX-paketet till PHP så att hanteringen av dessa databaser ska fungera tillfredställande.

1.2 Syftet med arbetet

Uppgiften är att skapa ett system med hjälp av programmeringsspråket PHP. Systemets syfte är att göra det enkelt att hantera och presentera publikationsreferenser i en webbaserad miljö.

Detta arbete inkluderar att göra en design av systemet samt att implementera programvaran.

(7)

2 Bakgrund

Bakgrunden till projektet var att man skulle kunna hantera BibTeX-databaser från en webbläsare på ett enkelt sätt. För att genomföra detta projekt kan ett skriptspråk användas.

Handledaren föreslog att använda programmeringsspråket PHP. I denna del av rapporten beskrivs skriptspråket PHP och BibTeX-databaser övergripande.

2.1 PHP

Förkortningen PHP står för ”PHP Hypertext Preprocessor” och är ett vida spritt Open Source- skriptspråk. Detta skriptspråk lämpar sig speciellt bra för webbutveckling. Skillnaden mellan ett skript i PHP gentemot C eller Perl är bland annat att man kan bädda in PHP-kod i HTML.

I programmeringsspråken C och Perl måste man skriva kommandon som i sin tur skriver ut HTML-kod. PHP-koden omsluts av speciella start- och sluttaggar, dessa taggar gör det möjligt att alternera mellan HTML och PHP-kod. Skriptet är alltså det som finns mellan taggarna, <?php och ?>. Nedan följer ett exempel på hur ett enkelt PHP-skript kan se ut

<html>

<head>

<title>Example</title>

</head>

<body>

<?php

echo "<p>Hi I'm a PHP script!</p>";

?>

</body>

</html>

Exemplet ovan kommer att generera följande resultat till användarens webbläsare.

<html>

<head>

<title>Example</title>

</head>

<body>

<p>Hi I'm a PHP script!</p>

</body>

</html>

Det som finns mellan <?php och ?> ersätts med html-text som bestäms när PHP-koden exekveras.

Det finns många fördelar med PHP. Några av dessa är:

• PHP är lätt att lära sig men erbjuder ändå avancerade funktioner för professionella programmerare.

• PHP kan användas på alla större operativsystem; Linux, många Unix-varianter, Microsoft Windows, Mac OS X, RISC OS med flera. PHP har dessutom stöd för de

(8)

Microsoft Internet Information Server, Personal Web Server, Netscape- och iPlanet- servrar.

• PHP, till skillnad från exempelvis JavaScript, exekveras koden på servern istället för hos klienten. Fördelen med detta är att användaren får resultatet av exekveringen men utan någon möjlighet att ta reda på vilken kod som ligger bakom resultatet.

• PHP ger användaren möjlighet att använda sig av objekt-orienterad-programmering eller procedur-programmering, eller en mix av dessa.

Med PHP finns möjligheten att välja bland både operativsystem och webbservrar. Vidare kan man även välja om man vill använda procedur-programmering eller objekt-orienterad

programmering, eller en mix av dem. Det bästa med PHP är att det är oerhört enkelt att lära sig, men att det ändå erbjuder avancerade funktioner.

2.2 BibTeX-databaser

I Akademiska publikationer är det idag vanligt med litteraturförteckningar eller en lista av referenser. Man kan i dessa publikationer hänvisa till någon referens, både en eller flera gånger i samma text. Istället för att formatera en referens (kallat entry), för varje tillfälle som denna behövs i texten, vore det fördelaktigt om man kunde spara alla entrys i en databas som man senare kan hänvisa till.

Med hjälp av programmet BibTeX som tillhandahålls med LaTeX är ett sådant databassystem möjligt. BibTeX är ett hjälpprogram till LaTeX som automatiskt konstruerar, genom att söka i en eller flera databaser, en litteraturförteckning för dokument skrivna i LaTeX.

Informationen från olika publikationer sparas i en eller flera filer med ändelsen ”.bib”.

Varje entry i filen tilldelas en unik nyckel som identifierar den. Nyckeln som tilldelats ett specifikt entry kan man senare använda sig av för att i kommande dokument hänvisa till entryt i databasen.

Nedan ser man ett exempel på hur ett entry kan vara utformat.

@Book{e:x:e:m:p:e:l,

author = {Exempel Exempelsson}, title = {Exemplet som visade vägen}, publisher ={Exempelorganisationen}, year = 2004

}

Första ordet som kommer efter @-tecknet bestämmer entry-typen, i exemplet ovan är det typen Book. Därefter följer entryts information, vilken är innesluten mellan den första vänsterklammern och den matchande högerklammern. Det första i entryts information är den unika nyckel som varje entry måste ha. Därefter kommer referensens huvudsakliga

information, detta i form av olika fält som åtskiljs med kommatecknet.

(9)

Den generella syntaxen för ett entry i den bibliografiska databasen är som följer.

@entry_type{key,

field_name={field_text},

…………

field_name={field_text}, }

Namnen för entry_type och field_name kan skrivas med antingen stora eller små bokstäver. En kombination av dessa fungerar också bra. entry_type talar om vilken typ av entry det är.

Värdet av ett field_name är field_text. Värdet måste inneslutas av antingen klamrar eller citattecken. Inneslutningen av dessa citattecken eller klamrar ses som en sträng. Det bör även nämnas att det är möjligt att sammankoppla flera olika strängar med tecknet #.

Exemplen nedan har samma värde:

Field1 = {Detta är ett exempel};

eller

Feild2 = {Detta är}#”ett exempel”;

Ett undantag där inneslutning av klamrar eller citattecken kan undvaras är om texten bara består av siffror, exempelvis årtal. Detta gäller även för macros. Macros är förkortningar av ett namn eller liknande och vars betydelse finns lagrat på annat ställe.

För varje entrytyp är vissa fält obligatoriska och andra valfria. Förekommer ytterligare fält utöver dessa ignoreras de av BibTeX. Om ett obligatoriskt fält utelämnas kommer BibTeX att generera ett felmeddelande under dess exekvering. De obligatoriska och valfria fält som finns inkluderade i entryt kommer att presenteras i litteraturförteckningen. Fält utöver valfria och obligatoriska kommer dock inte att presenteras av BibTeX men dom kan finnas med i databaser för att inkludera extra information.

2.2.1 Entrytyper

Det finns ett antal standardiserade entrytyper, närmare bestämt fjorton stycken. Nedan

kommer en översikt, till vilken typ av dokument de passar samt vilka fält som är obligatoriska (required) och valfria (optional).

@article Entry för en artikel från en tidskrift eller ett magasin.

required fields: author, title, journal, year.

optional fields: volume, number, pages, month, note.

(10)

@book Entry för en bok med fastställd utgivare.

required fields: author eller editor, title, publisher, year.

optional fields: volume eller number, series, address, edition, month, note.

@booklet Entry för tryckt arbete utan namn på utgivare eller sponsrande organisation.

required fields: title.

optional fields: author, howpublished, address, month, year, note.

@conference Samma som @inproceedings.

@inbook Entry för en del (kapitel, stycke, vissa sidor) av en bok.

required fields: author eller editor, title, chapter och/eller pages, publisher, year.

optional fields: volume eller number, series, type, address, edition, month, note.

@incollection Entry för en del av en bok som har en egen titel.

required fields: author, title, booktitle, publisher, year.

optional fields: editor, volume eller number, series, type, chapter, pages, address, edition, month, note.

@inproceedings Entry för en artikel från ett konferens protokoll required fields: author, title, booktitle, year.

optional fields: editor, volume eller number, series, pages, address, edition, month, organization, publisher, note.

@manual Entry för teknisk dokumentation.

required fields: title.

optional fields: author, organization, address, edition, month, year, note

@mastersthesis Entry för examensarbeten

required fields: author, title, school, year.

optional fields: type, address, month, note.

@misc Entry för arbeten som inte passar in under någon annan entry-typ required fields: inga obligatoriska fält.

optional fields: author, title, howpublished, month, year, note

@phdtheses Entry för doktorsavhandlingar

required fields: author, title, school, year.

optional fields: type, address, month, note.

(11)

@proceedings Entry för konferenshandlingar.

required fields: title, year.

optional fields: editor, volume eller number, series, address, month, organization, publisher, note

@teachreport Entry för lärarrapporter.

required fields: author, title, institution, year.

optional fields: type, number, address, month, note.

@unpubliched Entry för opublicerade verk.

required fields: author, title, note.

optional fields: month, year.

Det finns även regler för hur värden i ett fält ska formateras, detta kommer inte att tas upp i denna rapport.

(12)

3 Analys

För att få förståelse och idéer om det arbete jag skulle utföra började jag med att sätta mig in i det existerande Text::BibTeX-paketet och de skript som användes vid början av mitt

examensarbete. Den skrivna Perl-koden var väldigt svår att överskåda och därför skulle det behövas ett nytt och bättre strukturerat bibliotek. Jag valde att använda mig av två skript istället för tre som i den tidigare Perl-versionen. Ett skript som ska sköta sökningen av referenser och sedan presentera dessa på ett vettigt sett i en webbläsare. Det andra skripet används för att ändra, ta bort eller skapa nya referenser i databasen.

Det finns vissa funktionaliteter som jag i samråd med min handledare har valt att inte implementera i mitt arbete. Bland annat så kommer inte macros att skrivas ut till dess fullständiga värde när man presenterar ett entry i webbläsaren. Macrot kommer däremot att presenteras i samma format som entryts fältvärde tillhandahåller. Vidare kommer det inte att finnas någon sorteringsalgoritm för att sortera entrys efter författare, år, titel, och så vidare.

Kommentarer förekommande i BibTeX-databaser kommer inte att sparas undan när inläsning av data görs. Kontentan av detta är att dessa kommentarer kommer att försvinna när systemet gör ändringar i dessa databasfiler. Till sist så förutsätts att entrys är korrekta. Det vill säga att alla regler gällande fält och dess fältvärden följs när dessa läses in från databasfilerna.

(13)

4 Design av BibTeX-paketet

BibTeX-paketet består av ett antal klasser, närmare bestämt 18 stycken. Dessa klasser är Bibfile, SetOfEntrys, Entry-klassen samt en klass för varje standardtyp av entrys som finns, såsom Article och Proceedings. Dessutom finns en hjälpklass som heter Stack. Dessa klasser används för kommunikation med BibTeX-filer och hantering av dess tillhörande entrys. Klasserna innehåller bland annat funktionalitet för att kunna modifiera samt att skapa nya entrys. Nedan kommer en övergripande beskrivning av klasserna samt deras metoder och klassvariabler. Eftersom alla entrytyp-klasser är uppbyggda på liknande sätt kommer endast klassen Article att beskrivas.

fig 4.1 Klassdiagram över BibTeX-paketet. I denna figur finns inte alla entrytypklasser med pga att alla dessa är uppbyggda på samma sätt. Här är bara Article och Book av

entrytypklasserna.

4.1 Bibfile-klassen

Bibfile är den klass som sköter kommunikationen med BibTeX-databasen. Den

tillhandahåller bland annat funktioner för att skriva och läsa data från en BibTeX-databas. De funktioner och den variabel som finns i klassen beskrivs övergripande nedan.

(14)

fig 4.2 Klassdiagram för Bibfile-klassen 4.1.1 Variabel

$bibfile

Klassvariabeln $bibfile är en hashtabell som bland annat innehåller filnamnet till den fil man vill arbeta mot. Filens resurshanterare sparas även undan i denna hashtabell när den blivit definierad av funktionen open().

4.1.2 Funktioner

open($filename, $opt)

Funktionen tar strängarna $filename och $opt som argument. $filename är den fil man vill öppna. Det andra argumentet $opt används för att välja hur man vill öppna filen.

Man kan öppna filen med skriv och/eller läsrättigheter.

Metoden open() används för att tilldela den önskade filen en filhanterare. Då finns

möjlighet att läsa in och skriva data till en fil. För att öppna en stream till en fil används PHP- funktionen fopen(). Den binder en resurs, specificerad av filnamnet, till en stream. Om php-funktionen fopen() kan öppna den önskade filen returneras dess filhanterare, annars false.

Nedan ser man hur open()-metoden ser ut och hur man på hur man öppnar önskad fil och sparar undan dess filhanterare i hashtabellen.

function open($filename, $opt){

$this->bibfile['filename'] = $filename;

$this->bibfile['handle'] = fopen($filename,$opt);

}

(15)

close()

Stänger ner den fil som klassens filhanterare pekar på.

eof()

Om klassens filpekare har kommit till slutet av dess fil så returneras true, annars false

read($warn)

Läser in en bibfil från början till slut och returnerar ett objekt av typen SetOfEntrys. I stora drag fungerar funktionen på följande sett:

Funktionen tar bort alla rader med kommentarer som är skrivna i BibTeX-databasen. Dessa rader börjar med %-tecknet. Funktionen läser vidare in entryt, från @-tecknet till avslutande högerklammer. Se exempel nedan.

@Book{…….}

Sedan används tillhörande entrytyp-klass för att skapa, i detta exempel ett Book-objekt. Detta objekt läggs sedan till i objektet SetOfEntrys. Denna procedur upprepar sig till dess att alla entrys i filen är inlästa och objektet SetOfEntrys returneras. Funktionen undersöker även så att filen inte innehåller några otillåtna tecken. Bland annat undersöks så att alla entrys i filen har ett jämt antal grupperingssymboler. En vänsterklammer eller citattecken måste ha en avslutande högerklammer respektive citattecken.

write($SetOfEntrys)

Tar objektet SetOfEntrys som argument. Funktionen write()skriver alla entrys som finns i SetOfEntrys-objektet till den bibfil som klassens filpekare använder sig av. När man använder sig av write() sätts filpekaren till början av filen. Om det finns data i den önskade filen så kommer denna att skrivas över av de entry-strängar som skickas till filen av denna funktion.

append($entry)

Tar ett entry-objekt som argument. Detta entry kommer att formateras om till en entry-sträng och skrivs sedan till klassens definierade fil. Entry-strängen kommer att läggas till i slutet på filen.

4.2 SetOfEntrys-klassen

Klassen SetOfEntrys är ett objekt som innehåller ett eller en mängd av entrys. Detta är en klass som har funktionalitet för att lagra olika typer av entryobjekt på ett enkelt sätt. Man kan

(16)

fig 4.3 Klassdiagram för SetOfEntrys-klassen 4.2.1 Variabel

$entrylist

Denna variabel är en hashtabell som innehåller en eller flera entrys.

4.2.2 Funktioner

entry($entry_key)

Tar en sträng som argumentet ($entry_key), denna sträng är ett entrys unika nyckel. Om entryt med denna unika nyckel existerar i klassens hashtabell $entrylist, kommer dess entry-objekt att returneras.

entrys()

Returnerar en array innehållande alla de entry-objekt som finns sparade i klassens hashtabell ($entrylist).

delete_entry($entry_key, $warn)

Denna funktion tar strängen $entry_key och $warn (true eller false) som argument. För att radera ett entryobjekt från klassens hashtabell ($entrylist) används denna metod.

Argumentet $entry_key är ett entrys unika nyckel. Om entryt med denna tillhörande nyckel finns i hashtabellen kommer detta entry att raderas. Om $warn är tilldelat värdet true kommer en varning genereras om något entry i hashtabellen inte kan förknippas med den angivna unika nyckeln, när $warn är satt till false händer däremot ingenting om önskat entry inte existerar och därigenom inte kan raderas.

add($entry_key,$entry)

Denna funktion används för att lägga till ett entry i hashtabellen. Funktionen tar två argument,

(17)

4.3 Entry-klassen

Entry-klassen är en huvudklass till alla de olika entrytyper som finns. Denna klass innehåller funktioner för att definiera alla värden ett entry kan tänkas ha. Den innehåller även funktioner som returnerar dessa värden. Klassen innehåller även funktioner för att undersöka så att entryts regler följs. Exempelvis att alla obligatoriska fält finns specificerade och att värdena till fälten i entryt inte har några otillåtna tecken.

Den information som sparas undan i klassens hashtabell är bland annat entryts unika nyckel, en lista med fält och tillhörande värde, entrytyp, obligatoriska fält, valfria fält och vilka restriktioner som finns fält emellan.

fig 4.4 Klassdiagram för Entry-klassen

(18)

4.3.1 Variabler

$entry_array

Är en hashtabell där all information om entryt sparas undan.

4.3.2 Funktioner

parse_entry($entry_string,$warn)

Tar argumenten $entry_string och $warn. Argumentet $entry_string måste ha formatet:

key,field1=value1, field2=value2....fieldN=valueN

Den här funktionen har som uppgift att från en sträng, enligt formatet ovan, sätta

entryobjektets variabler. Det vill säga, sätta entryts unika nyckel och spara undan entryts olika fält med tillhörande värden. Utöver detta undersöker funktionen så att tecknen i fältvärdet är korrekta, bland annat så att citattecken och klamrar är satta korrekt och har avslutande citat- respektive klammertecken. Funktionen kommer att generera false om någon av reglerna rörande fältvärdets tecken inte är korrekta.

Några exempel på när denna funktion returnerar false är om ett fält ser ut som följer Title = {Value;

eller

Title = Value};

eller

Title = ”Value;

Om argumentet $warn är tilldelat värdet true kommer ett felmeddelande dessutom att genereras om reglerna rörande fältvärdets tecken inte är korrekta.

exist($field)

Tar en sträng, med ett fälts namn, som argument ($field). Metoden returnerar true om fältet finns, annars false.

get($field)

Tar en sträng, med ett fälts namn, som argument ($field). Värdet av det fältet, om värdet existerar, returneras.

(19)

type()

Returnerar en sträng med vilken typ av entry det är, exempelvis book, article eller proceedings.

entry_key()

Returnerar entryts unika nyckel som en sträng.

fieldlist()

Returnerar en lista med entry-objektets alla fält och tillhörande värden.

required()

Returnerar en lista med de fält som det specifika entry-objektet måste ha.

optional()

Returnerar en lista med de fält som är valfria för det specifika entry-objektet.

set_type($type)

Funktionen tar en sträng som argument ($type), strängen ska ha värdet av vilken entry-typ som entry-objektet önskas vara.

set_key($key)

Funktionen tilldelar entry-objektet dess unika nyckel. Som argument tar funktionen en sträng med värdet på nyckeln.

set($field, $value)

Funktionen tar två strängar som argument, $field respektive $value. För att tilldela ett specifikt fält dess värde används denna metod.

set_req($req_fields), set_opt($opt_fields),

Funktionerna set_req() och set_opt() används för att tilldela entryt de fält som är obligatoriska respektive valfria för entry-objektet. Dessa två funktioner tar en array av strängar som argument. Varje sträng i arrayen är ett namn på fältet som det berör.

(20)

set_constraints($constraints)

Funktionen set_constrants() tilldelar restriktioner emellan fälten i entryobjektet.

delete_field($field)

Denna funktion används för att radera ett fält. Funktionen tar en sträng som argument.

Argumentvärdet är namnet på det fält som man vill radera.

check_required_fields($warn)

Denna funktion undersöker om de fält i entryt-objektet som tilldelats obligatoriska av metoden set_req() har blivit tilldelade ett värde. Om något av entryts obligatoriska fält inte existerar eller om dess tillhörande värde inte är definierat returneras false, annars returneras true. Om funktionens argument ($warn) dessutom har värdet true kommer ett felmeddelande att genereras om något obligatoriskt fält inte existerar.

check_field_constraints($warn)

Undersöker så att de fältrestriktioner som tilldelats av metoden set_constraints() följs.

full_check($warn)

Har till uppgift att kontrollera så att alla obligatoriska fält finns definierade och att de regler, vad gäller restriktioner fält emellan, följs. Funktionen kontrollerar även så att alla tecken i fältvärdet är korrekta. Om något av dessa krav inte uppfylls returneras false, annars true. Om argumentet $warn har värdet true kommer ett felmeddelande att genereras om dessa krav inte uppfylls.

htmlfy($string)

För att skriva några specifika bokstäver i LaTeX används vissa teckenkombinationer.

Några bokstavskombinationer i LaTeX fungerar som alias för andra tecken. Exempelvis bokstäverna å, ä och ö. I LaTeX har teckenkombinationen {\\”A} samma betydelse som bokstaven Ä

.

Funktionens uppgift är att översätta dessa format till html-kod. När teckenkombinationen {\\”A} existerar formateras detta om till html-koden &Auml;.

value_strip($value)

Funktionen tar en sträng med ett fälts värde som argument ($value).

Denna funktion tar bort alla citattecken och klamrar i ett fälts värde. Funktionen tar även bort tecknet # som används för att binda ihop flera strängar i ett fälts värde.

(21)

Exempel på hur funktionen fungerar följer nedan:

value_strip(”{Detta}#”visar”#{hur det}#{blir.}”);

Anropet ovan returnerar strängen:

”Detta visar hur det blir”

toString()

Formaterar om entryt till en sträng som sedan returneras.

toHtml()

Formaterar entryt till ett lättläst format. Strängen som returneras innehåller html-taggar för att enkelt kunna presenteras i en webbläsare.

4.4 Article-klassen

Klassen Article är en underklass till Entry-klassen. Denna klass har till uppgift att definiera de specifika regler som gäller för ett entry av typen Article. Reglerna avser vilka fält som är obligatoriska, valfria samt vilka restriktioner som gäller fält emellan. Klassen skriver

dessutom över funktionerna toString() och toHtml() från Entry-klassen för att passa Entry-typen Article bättre.

fig 4.5 Klassdiagram för Article-klassen.

4.4.1 Klass variabler

$constraints

Denna variabel är en tom array i denna klass. Denna variabel finns med på grund av att

(22)

$req_fields

En array av strängar som innehåller de fält som är obligatoriska för entrytypen Article. De värden som sparas i denna variabel är, author, title, journal och year.

$opt_fields

En array av strängar som innehåller de fält som är valfria för entrytypen Article. De värden som sparas i denna variabel är volume, number, pages, month och note.

$type

Denna variabel innehåller namnet på den typ av entry som denna klass berör. I detta fall har variabeln strängen article som värde.

4.4.2 Konstruktor Article()

Denna konstruktor använder sig av klassvariablerna och entry-klassens funktioner för att definiera objektets obligatoriska fält, valfria fält och dess restriktioner sinsemellan. Dessutom definieras vilken typ av entry detta objekt är.

4.4.3 Funktioner toString()

Returnerar entryt som en sträng.

toHtml()

Returnerar entryt i ett format så att entryt kan presenteras i ett lättläst format i en webbläsare.

4.5 Stack-klassen

Stackklassen är en hjälpklass vars funktionalitet används i de övriga biblioteksklasserna, bland annat vid kontroll av fältvärden. Denna klass består av fyra funktioner och fungerar som en vanlig stack.

(23)

4.6 Klassdiagram för Stack-klassen.

4.5.1 Variabler

$stack

En array som används som stack.

$pointer

Används som en stackpekare. Variabeln hänvisar till den sista positionen i $stack- variabeln.

4.5.2 Funktioner push($char)

Lägger till det tecken som man skickar med i argumentet. Samtidigt som stackpekaren ökas på med värdet 1.

pop()

Tar bort värdet från stacken som stackpekaren pekar på och minskar stackpekaren med värdet 1.

top()

Funktionen returnerar värdet på det sista insatta värdet i stacken. Värdet som returneras är det värde som stackpekaren hänvisar till.

(24)

is_empty()

Denna funktion returnerar true om stacken är tom, annars false.

(25)

5 Skript

För att kunna hantera en BibTeX-databas från en webbläsare används två skript. Det ena skriptet används för att söka publikationer i databasen samt att presentera resultatet i en webbläsare i ett lättläst format. Det andra skriptet används för att ändra/modifiera existerande entrys i BibTeX-databaser samt att skapa nya entrys. Det första skriptet heter smbib.php och det andra mkbib.php. Båda dessa skript använder sig av BibTeX-bibliotekets funktionaliteter gällande hantering av bibfiler och entrys.

5.1 Smbib-skriptet

Smbib-skripet används för att söka publikationer i en eller flera BibTeX-databaser och sedan presentera resultatet i ett lättläst format på en webbsida. När detta skript anropas från en html- sidas formulär måste några parametrar definieras och tilldelas ett värde. Beroende på vilka värden dessa parametrar tillhandahåller utför skriptet olika uppgifter. De parametrar som måste kunna läsas in av skriptet är:

• term-parametern som innehåller den sökterm som ska användas vid sökning i entrys.

• field-parametern som bestämmer vilka fält i entryt som sökning ska utföras i.

• type-parametern som bestämmer vilken typ av sökning som ska utföras. De värden som denna parameter kan tillhandahålla är regexp, substr eller exact.

• files-parametern som innehåller namn på de databasfiler som användaren vill arbeta mot.

Söktermen som tilldelats ett värde i term-parametern har formatet av antingen ett ord/namn eller ett reguljärt PHP-uttryck. Sökning av denna sökterm genomförs i de fält som är

specificerade i field-parametern. Vilken typ av sökning som ska genomföras beror på värdet av type-parametern. Den typ av sökning skriptet kan utföra är antingen att använda sig av ett reguljärt uttryck, leta söktermen som en delsträng eller att söka efter den exakta söktermen.

På grund av säkerhetsskäl tilldelas files-parametern inte dess absoluta sökväg till den databasfil man önskar arbeta med. Detta är en säkerhetsåtgärd för att dessa filer inte ska vara tillgängliga i html-sidans källkod.

Det finns en statisk variabel i skriptet där sökvägen från hemkatalogen till filen definieras.

Med hjälp av några rader kod sammansätts absoluta sökvägen till hemkatalogen, variabelvärdet och filnamnet. Detta resulterar i filens absoluta sökväg. Exempel:

~stesil/bibfil.bib

När filparametern ovan omformaterats kan sökvägen till bibfilen se ut på följande sätt.

home/……/~stesil/shtml/bibfil.bib

(26)

Den absoluta sökvägen till användarens hemkatalog är det som kommer före ~stesil. Det som kommer mellan ~stesil och bibfil.bib är sökvägen till databasfilen. Det är denna sökväg som är definierad i skriptets statiska variabel. Dessa olika sökvägar läggs ihop med databasfilens namn och bildar den absoluta sökvägen till önskad databasfil.

5.1.1 Resultat

Hur fungerar då detta skript? Här följer en övergripande beskrivning av skripet:

Det börjar med att skriptet läser in de parametrar som skickas från det anropande html- formuläret. Formulärets parametervärden sparas undan i en variabel ($in) för att vid senare tillfälle kunna användas i skriptet. Om filnamn på de databaser man önskar söka i eller sökterm inte är definierade kommer ett felmeddelande visas i webbläsaren. Om dessa två parametrar däremot är definierade, läser skriptet in alla de entrys som finns i de specificerade filerna. Därefter filtrerar en funktion ut de entrys som överensstämmer med den sökterm och typ av sökning man angett i html-sidans formulär. De entrys som funktionen filtrerat ut formateras sedan om till ett lättläst format, som presenteras i webbläsaren. Om skriptet har filtrerat ut ett entry som har ett crossentry definierat i sin information presenteras också detta crossentry. Skriptet använder sig av BibTeX-biblioteket för all hantering av bibfilerna och dess entrys. Figurerna 5.1-5.2 visar ett exempel på hur användningen av detta skript kan se ut i en webbläsare.

fig 5.1. Exempel på hur ett formulär kan se ut i en webbläsare.

(27)

fig 5.2. Exempel på hur resultatet av en sökning presenteras på en webbsida.

5.2 mkbib-skriptet

Skriptet mkbib.php används för att på ett enkelt sätt hantera BibTeX-databaser från en

webbläsare. Med hantering av databaserna menas, att ändra/modifiera existerande entrys samt att skapa nya entrys i en definierad databasfil.

mkbib-skriptet anropas, precis som smbib-skriptet, från en webbsida och dess html-formulär.

Det finns ett antal parametrar som skriptet behöver och använder sig av för att kunna utföra önskad uppgift. De parametrar som skriptet använder sig av är:

• outfile-parameterninnehåller namnet på den databasfil som användaren vill skriva ett modifierat eller nyskapat entry till.

• infile-parametern innehåller namn på databasfiler och behövs för att kunna hämta och modifiera existerande entrys. Denna parameter behövs också för kontroll av ett entrys unika nyckel. Detta för att undvika skapandet av ett nytt entry med en

entrynyckel som förknippas med ett existerande entry. Det är önskvärt att åtminstone ha det filnamn som outfile-parametern tillhandahåller som värde i denna

parameter.

• task-parametern innehåller vad skriptet ska utföra för uppgift. Några värden som denna parameter kan innehålla är new, edit, check och append.

• type-parametern är vilken typ av entry man arbetar med, exempelvis book,

(28)

• key-parametern innehåller entryts unika nyckel.

• fields-parametern innehåller entryts fält med tillhörande värde.

• extrafields-parametern innehåller ett entrys extra fält.

Två av de ovannämnda parametrarna måste definieras i det anropande html-formuläret, dessa är outfile- och infile-parametern. Om dessa parametrar inte är definierade kommer ett felmeddelande att visas.

Skriptet är uppbyggt av ett antal if-satser som, beroende på vilket värde task- parametern tillhandahåller, utför olika uppgifter. Dessa uppgifter är bland annat att hämta ett existerande entry, skapa nytt entry, editera ett entry och skriva ett entry till den definierade filen

($outfile). När if-satserna har kommit till dess sista rader och slutfört sin specifika uppgift anropas skriptet rekursivt, med ett nytt värde på taskparameter, och nästa uppgift genomförs.

De uppgifter som utförs i de olika if-satserna använder sig av ett antal hjälpfunktioner som finns definierade i skriptet. En kort beskrivning av dessa hjälpfunktioner följer nedan.

get_path()

Samma funktion som i smbib-skriptet, se ovan.

read_file()

Funktionen tar två strängar som argument. Det första argumentet är den fil man vill läsa in och det andra beskriver hur man vill öppna filen. Funktionen läser in de entrys som finns i den definierade databasfilen.

read_all_files()

Denna funktion använder sig av read_file()-funktionen för att läsa in alla filer som är definierade i infile-parametern.

append_to_file()

Tar objektet entry och en sträng med namnet på den fil man vill skriva entrys till som argument. append_to_file() formaterar om entry-objektet till en sträng och skriver sedan entry-strängen till bibfilen.

delete_from_file()

Tar ett entryobjekt och en sträng på ett filnamn som argument. Funktionen tar bort det entry man angett från den specificerade filen.

(29)

overwrite_in_file()

Funktionen tar ett entryobjekt och en sträng på ett filnamn som argument. Entryt i den definierade filen som har samma unika nyckel som entryt som skickats med i funktionens argument skrivs över.

form_head()

Funktionen skapar starttaggar till ett html-formulär.

form_foot()

Funktionen tar två strängar som argument. Denna funktion skapar sluttaggarna på ett formulär. Värdet som det första argumentet tillhandahåller blir texten på sändknappen. Det andra argumentets värde blir texten på reset-knappen.

show_field()

Skapar en rad i ett formulär med ett entrys fält. Beroende på om argumentet $hidden är satt till true eller false vissas denna rad i webbläsaren. Övriga argument är strängar med fältnamn ($field), fältvärde ($value) samt extratecken ($extra).

hidden_entry_help()

Funktionen tar objektet entry som argument. Detta entry formateras om och sätts in i html- formulärets parametrar.

hidden_entry()

Funktionen tar tre stycken argument. Argumenten är ett entry-objekt, en sträng på vilken task som ska utföras och vilken text sändknappen ska visa. Entryts värden sätts in i html-

formulärets parametrar.

entry_from_infields()

Funktionen formaterar om skriptets entry-parametrar till ett entry-objekt. Den använder sig av parametrarna type, key, fields och extrafields för att skapa detta entry.

5.2.1 Användning av mkbib

Genom ett html-formulär skickas några parametrar till skriptet. De parametrar som måste vara definierade är outfile- och infile-parametern. Om dessa parametrar inte är definierade kommer ett felmeddelande att visas. Förutsatt att dessa två parametrar är definierade väljer användaren att antingen skapa ett nytt entry eller arbeta med ett existerande.

(30)

5.2.1.1 Skapa nytt Entry

Vill användaren skapa ett nytt entry får denne välja vilken typ av entry han vill skapa.

Exempelvis book eller article.

Den valda entrytypens fält visas i webbläsaren. De fält som visas är de obligatoriska, valfria och ytterligare några fält. Genom att fylla i textrutor i webbläsaren tilldelar användaren entryts specifika värden. Dessa värden är entryts unika nyckel och de fältvärden som krävs.

När de önskade värdena fyllts i kontrolleras entryt. Det kontrolleras så att entryts regler gällande de obligatoriska fälten och restriktionerna fälten emellan följs. Dessutom kontrolleras att entryts unika nyckel inte förknippas med ett existerande entry. Nyckeln kontrolleras mot de entrys som finns i filerna definierade av infile-parametern. Om denna unika nyckeln redan förknippas med ett entry finns tre olika alternativ.

1 Användaren kan välja att ändra den unika nyckeln i sitt nyskapade eller modifierade entry.

2 Om entryt finns i en databasfil definierad av infile-parametern, bortsätt från filnamnet i outfile-parametern, kan användaren välja att skriva sitt entry till den definierade filen (outfile).

3 Om ett existerande entry finns i samma fil som man skriver till (outfile), kan man välja att skriva över detta redan existerande med det nya entryt.

När entryts alla regler är uppfyllda och man har valt att skriva entryt till den fördefinierade filen (outfile) upprepar sig samma process igen. Figurerna 5.3-5.8 visar ett exempel på hur skapandet av ett entry kan se ut i en webbläsare.

fig 5.3. Html-sidans formulär.

(31)

fig 5.4. I menysystemet väljer användaren mellan fetch och new. I detta fall väljs new för att skapa ett nytt entry.

fig 5.5. Användaren väljer vilken typ av entry som ska skapas. I detta fall proceedings.

(32)

fig 5.6. Användaren fyller i önskade värden i entryt.

fig 5.7. Om entryt uppfyller dess regler kan användaren välja att göra ytterligare tillägg i entryt. Andra alternativet är att skriva entryt till den definierade filen (outfile).

(33)

fig 5.8. När ett entry har skrivits till den definierade filen kan användaren välja att börja om igen.

5.2.1.2 Modifikation av ett entry

Om användaren vill ändra/modifiera ett redan befintligt entry måste han veta dess unika nyckel. Användaren anger entryts unika nyckel i ett textfält i webbläsaren. Om entryt med den specifika nyckeln existerar, i de databasfiler man angett i infile-parametern, läser skriptet in dess värden. När entryts värden är inlästa kan man modifiera/ändra entryt med hjälp av textrutor i webbläsaren. När användaren gjort de ändringar som önskas följer samma procedur som när man skapar ett nytt entry. Med andra ord så undersöker skriptet så att alla regler följs.

Är entryt korrekt kan entryt skrivas till den databasfil som är definierat i outfile-

parametern. Om det önskade entryt finns i den definierade filen (outfile) finns möjligheten för användaren, utöver möjlighet att modifiera denna, att radera denna från databasfilen.

Figur 5.9-5.12 visar hur detta skript kan se ut i en webbläsare när det önskade entryt finns i den definierade utfilen (outfile).

fig 5.9. I menysystemet väljer användaren mellan fetch och new. I detta fall väljs fetch för att modifiera ett existerande entry.

(34)

fig 5.10. Användaren fyller i nyckeln på det entry som han önskar jobba med.

fig 5.11. När det önskade entryt är inläst från databasfilen kan användaren radera entryt från filen.

fig 5.12. När entryt raderats från databasfilen kan användaren välja att börja om från början.

(35)

6 Förbättringar

På grund av att detta projekt har haft en tidsram att följa så har viss funktionalitet inte implementerats. Detta system är inget undantag från de flesta andra system och det finns givetvis utrymme till förbättringar av detta system. Några funktionaliteter som man i framtiden kan implementera är:

• Sortering av entrys efter årtal, författare, titel.

• Presentera macron i dess egentliga mening.

• Att kunna söka efter entrys och presentera dessa i samma format som de är representerade i databasen.

(36)

7 Disskusion

Syftet med examensarbetet var att skapa ett system för att underlätta hanteringen av en eller flera BibTeX-databasfiler med hjälp av olika webbsidor. Jag har implementerat ett fungerande system som hanterar just detta.

Inledningsvis spenderade jag mycket tid för att införskaffa kunskap om det dåvarande systemet som användes. Det innefattade ett BibTeX-bibliotek samt tre skript. Eftersom jag inte tidigare arbetat med varken Perl, BibTeX-databaser eller programmeringsspråket PHP var jag tvungen att lära mig dessa språk/format från grunden.

Det jag känner har varit jobbigast med detta examensarbete var att gå igenom den PERL-kod som det gamla systemet var implementerat i. Som brukligt har det uppstått småproblem under programmeringen men det har oftast varit småfel som varit lätta att justera.

De erfarenheter jag fått från detta examensarbete tycker jag är positivt. Att arbeta

självständigt och lösa problem som har uppstått under resans gång har varit givande. Den kunskap jag införskaffat av de olika programmeringsspråken ser jag också som något positivt.

(37)

8 Referenser

8.1 Litteratur

Kopka, H. & Daly, P. (1999) “A guide to LaTeX”, Harlow: Addison-Wesley, cop.

Schwart R (1993), “Learning Perl”, Sebastopol: O'Reilly.

Ledorf, R & Tatroe, K (2002), "Programming PHP", Sebastopol: O'Reilly & Associates &

London: International Thomson.

8.2 Internet

PHP, http://www.php.net/, (2004) Perl, http://www.perl.org/, (2004)

Htmlturtorial, http://www.html-tutorial.org/, (2004)

References

Related documents

Thus, we can hypothesize that children attending receiving special tuition will hold higher levels of academic self-concept than their peers in mainstream classes..

Following this definition, we can classify the educational fields we are considering in our analysis: Teaching methods and teacher education, Humanities and arts and Healthcare

Taken the previous research and problem discussion into account, the purpose of this study is to deepen the discussion about Affiliate marketing and how the marketing technique can be

En tanke skulle kunna vara att tandvårdspersonalen som visade ett intresse för ämnet Functional food även kanske hade provat dessa livsmedel själva samt skulle vilja

företagets  val  av  inträdesform  (Brouthers  2002;  Morschett  et  al  2010).  Legala  restriktioner  kan  därmed  reducera  den  uppsättning  av  entry 

The results show that the intensity of the second-order replica is three to four times stronger than expected from the adiabatic Huang-Rhys theory, indicating that the

Scalado,
 the
 object
 of
 this
 study,
 was
 founded
 in
 Lund
 in
 2000
 and
 is
 today


The authors tried to use the case of SKF figure out what kind of strategy used when the Swedish company entered China and the successful factors impact the Swedish company