Gebruiker:Sanderd17/WSBN bot

Uit Wikibooks
Naar navigatie springen Naar zoeken springen

Installatie WSBN bot[bewerken]

Werkt enkel bij Linux

Voor de installatie van WSBN bot heb je eerst de pywikipedia bibliotheek nodig en volledig geïnstalleerd. Hoe je dat doet kan je op de uitleg pagina vinden.

Nadat je Pywikipedia bibliotheek werkt kan je het jar bestand van google code downloaden:

http://code.google.com/p/wsbnlist/downloads/list

Dan moet je enkel het jar bestand uitpakken en de code

java WsbnList basePath

uitvoeren met basePath het pad naar je pywikipedia bibliotheek. Je kan ook het basepath aanpassen in het bronbestand WsbnList.java en daarna dat bestand opnieuw compileren. Dan moet je de optie basePath niet meer geven.

Het resultaat is een bestand table.txt in je pywikipedia bibliotheek met als inhoud wiki syntax voor een tabel met alles wikibooks.

Code[bewerken]

Hieronder volgt de meest recente code.

WsbnList.java[bewerken]

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;

/**
 * Deze klasse is heeft een basis main methode.
 * @author sander
 *
 */
public class WsbnList {
	
	private static String basePath;
	
	/**
	 * Deze methode zal de pagina Wikibooks:Infobox/Lijst van boeken met infobox updaten,
	 * van alle boeken in die lijst de infoboxen downloaden en
	 * vanuit die infoboxen een tabel generen en die opslaan in het bestand "table.txt" in de basePath directory.
	 * 
	 * De basePath directory kan  je opgeven als argument, 
	 * deze moet de directory naar je pywikipedia bibliotheek zijn.
	 * 
	 * @param args de directory van de pywikipedia installatie.
	 */
	public static void main(String[] args){
		//Zet een ander standaard pad als deze als argument wordt gedefinieerd.
		if (args.length == 0){
			basePath =  "/home/sander/pywikipedia/";
		} else {
			basePath = args[0]; 
		}
		
		System.out.println("De lijst van de boeken in kwestie wordt bekeken...");
		
		try {
			Process p = Runtime.getRuntime().exec(new String[] { "sh", "-c", 
					"python category.py listify -from:'Boeken met infobox' " +
					"-to:'Wikibooks:Infobox/Lijst van boeken met infobox' -overwrite"} );
			p.waitFor();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		
		
		ArrayList<String> alIBoxList = new InfoboxPages(basePath).getList();		
		
		String table = makeTable(alIBoxList);
		
		
        setInhoud("table.txt",table);
	}

	/**
	 * maak een tabel uit de arraylist van alle boeknamen. Hierin wordt de opmaak gedefiniëerd.
	 * @param alIBoxList
	 * @return
	 */
	public static String makeTable(ArrayList<String> alIBoxList) {
		String table = "{|{{prettytable}}";
		
		ArrayList<Book> boeken = new ArrayList<Book>();
		
		System.out.println("De informatie van alle boeken wordt gedownloaded...");
		
		for (String bookName:alIBoxList){
			Book book = new Book(bookName,basePath,new String[] {"WSBNcat","WSBN","titel"});
			boeken.add(book);
			System.out.println(bookName);
		}
		
		Collections.sort(boeken);
		
		ArrayList<String> rijen = new ArrayList<String>();
		String temp;
		
		for (Book book:boeken){
			
			temp = "";
			temp = temp+"|{{klik|Afbeelding=Information icon.svg|Grootte=20px|Link=Wikibooks:Infobox/"
			+book.getTitel()+"}}";
	
			if(book.getWSBN().length()!=0){
				temp = temp+"\n|<div id='WSBN "+book.getWSBN()+"'> "+book.getWSBN()+"</div>";
			} else {
				temp = temp+"\n| Onbekend";
			}
			temp = temp+"\n| [["+book.getTitel().replace("_", " ")+"]]";
			temp = temp+"{{"+book.getVoortgang()+"|Datum=volgens infobox}}"; 
			temp = temp+"\n|"+book.getAuteurs();
			
			rijen.add(temp);
		}
		
		
		for (String rij:rijen){
			table = table+"\n"+rij+"\n|-";
		}
		
		table=table+"\n|}";
		
		return table;
	}
	
	/**
	 * methode om een string weg te schrijven naar een bestand
	 * @param bestandsnaam
	 * @param inhoud
	 */
	public static void setInhoud(String bestandsnaam, String inhoud){
		File bestand = new File(basePath+bestandsnaam);//vul hier het pad naar je bestand in  
        
	    try{  
	        FileWriter schrijver = new FileWriter(bestand);  
	        Writer output = new BufferedWriter(schrijver);  
	        try {  
	            output.write( inhoud );  
	        }  
	        finally {  
	            output.close();  
	        }  
	    }  
	    catch(IOException ex){  
	        ex.printStackTrace();  
	    }  
	}  

	
}

InfboxPages.java[bewerken]

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


public class InfoboxPages {

	private ArrayList<String> alIBoxList;
	private String basePath;
	
	/**
	 * Haal de namen van boeken met infoboxen van het internet en sla ze op in het bestand infoboxPages.txt
	 * @param theBasePath
	 */
	public InfoboxPages(String theBasePath){
		this.basePath=theBasePath;
		try {
			Process p = Runtime.getRuntime().exec(new String[] { "sh", "-c", 
					"python "+basePath+"get.py 'Wikibooks:Infobox/Lijst van boeken met infobox' > "
					+basePath+"infoboxPages.txt"} );
			p.waitFor();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		File iBoxList = new File(basePath+"infoboxPages.txt");//vul hier het pad naar je bestand in  
        StringBuilder toParse= new StringBuilder(getInhoud(iBoxList)); 
        //System.out.println(toParse.toString());
        alIBoxList = parse(toParse);
	}
	
	/**
	 * geef de lijst van alle boeken met een infobox terug.
	 * @return
	 */
	public ArrayList<String> getList(){
		return alIBoxList;
	}
	
	/**
	 * De invoer is de tekst op de pagina Wikibooks:Infobox/Lijst van boeken met een infobox,
	 * de uitvoer is een arraylist van alle boeknamen als strings.
	 * @param toParse
	 * @return
	 */
	private static ArrayList<String> parse(StringBuilder toParse) {
		ArrayList <String> list = new ArrayList<String>();
		int i1, i2;
		while (toParse.indexOf("*[[")>-1) {
			i1 = toParse.indexOf("*[[")+3;
			i2 = toParse.indexOf("]]");
			String sub = toParse.substring(i1, i2);
			toParse.replace(0, i2+2, "");
			sub=sub.replace(' ', '_');
			list.add(sub);
			//System.out.println(sub);
		}
		return list;
		
	}

	/**
	 * methode om de inhoud van een bestand als String weer te geven.
	 * @param bestand
	 * @return
	 */
	public static String getInhoud(File bestand){
	    String inhoud = "";
	    /*omdat we niet weten als het bestand wel bestaat
	     * zijn we verplicht om een try te gebruiken. 
	     * Dit wordt uitgelegd in de volgende sectie
	     */
	    try {
			/*
		 	 * maak eerst een bestandslezer en een bufferedReader
		 	 * om de inhoud van het bestand te kunnen lezen
			 */
			FileReader bestandsLezer = new FileReader(bestand);
			BufferedReader input =  new BufferedReader(bestandsLezer);
			try {
		    	String line = null; 
		    	/*
		    	 * zolang het bestand niet ten einde is zal
		    	 * de methode readLine() iedere keer de volgende
		    	 * regel lezen, bij het lezen van die regels laat hij wel
		    	 * het regeleinde weg, dit moeten we dus zelf aanvullen
		    	 */
		    	while (( line = input.readLine()) != null){
					inhoud += line;
					inhoud += System.getProperty("line.separator");
		    	}
			}
			/*
			 * Gelijk wat er gebeurt, de input moet altijd 
			 * weer gesloten worden.  het finally commando 
			 * wordt ook in de volgende sectie uitgelegd
			 */
			finally {
		  		input.close();
			}
	    }
	    /*
	     * het catch commando wordt ook in de volgende sectie uitgelegd
	     */
	    catch (IOException ex){
	      ex.printStackTrace();
	    }
	    
	    return inhoud;
	}

	
}

Book.java[bewerken]

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * Klasse die een boek van de wikibooks site voorstelt. 
 * Om deze klasse te gebruiken moet de bibliotheek "pywikipedia" 
 * (http://nl.wikibooks.org/wiki/Handleiding_moderatoren/Pywikipedia_bot) 
 * geïnstalleerd en werkend zijn .
 * 
 * Deze klasse haalt informatie uit de infoboxen van boeken. Ze werkt dus enkel voor boeken met infoboxen.
 * @author sander
 *
 * 
 *
 */
public class Book implements Comparable<Book> {
	
	private String bookName;
	private String basePath;
	private String[] sortOrder;
	
	/**
	 * Creëer een instantie van een wikibook met opgegeven naam
	 * @param name: naam van het boek (met spaties vervangen door '_')
	 * @param basePath: pad van de pywikipedia bibliotheek
	 */
	public Book(String name, String basePath){
		this(name, basePath,new String[] {"titel"},true);
		
	}

	/**
	 * Creëer een instantie van een wikibook met opgegeven naam
	 * @param name: naam van het boek (met spaties vervangen door '_')
	 * @param basePath: pad van de pywikipedia bibliotheek
	 * @param reload: true als de informatie opnieuw moet geupdated worden.
	 */
	public Book(String name, String basePath, boolean reload){
		this(name, basePath,new String[] {"titel"},reload);
		
	}
	
	/**
	 * Creëer een instantie van een boek met de opgegeven naam en sorteervolgorde.
	 * @param name: naam van het boek (met spaties vervangen door '_')
	 * @param basePath: pad naar de pywikipedia bibliotheek
	 * @param sortBy: Sorteervolgorde als een array van Strings die de eigenschappen van het boek voorstellen.
	 */
	public Book(String name, String basePath, String[] sortBy){
		this(name, basePath,sortBy,true);
		
	}
	
	/**
	 * Creëer een instantie van een boek met de opgegeven naam en sorteervolgorde.
	 * @param name: naam van het boek (met spaties vervangen door '_')
	 * @param basePath: pad naar de pywikipedia bibliotheek
	 * @param sortBy: Sorteervolgorde als een array van Strings die de eigenschappen van het boek voorstellen.
	 * @param reload: true als de informatie opnieuw moet geupdated worden, werkt anders met locale info.
	 */
	public Book(String name, String basePath, String[] sortBy,boolean reload){
		bookName = name;
		this.basePath = basePath;
		//Haal informatie van het internet. Deze stap kan even duren, afhankelijk van de internet snelheid.
		if (reload) {
			reload();
		}
		//zet de sorteer volgorde.
		setSortOrder(sortBy);
		
	}
	
	
	/**
	 * Haal de informatie (opnieuw) van het internet.
	 */
	public void reload(){
		//Haal van het boek de infobox op en sla ze lokaal als tekstbestand op
		try {
			Process p = Runtime.getRuntime().exec(new String[] { "sh", "-c", 
					"python "+basePath+"get.py 'Wikibooks:Infobox/"+bookName+
					"' > '"+basePath+bookName.replace('/', '#')+".txt'"} );
			p.waitFor();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Vraag het attribuut op van een ingelezen boek. Het attribuut wordt gegeven 
	 * als een string met de waarde van een variabele in het infobox sjabloon.
	 * De String "WSBNcat" geeft het eerste cijfer van het WSBN terug en een "9" als het WSBN niet bestaat.
	 * De string "WSBNsubcat" geeft de tweecijferige subcategorie van het WSBN, 
	 * een "99" als het WSBN niet bestaat.
	 * @param attr: de naam van het opgevraagde attribuut
	 * @return Een getrimde string met de waarde van de gevraagde variabelen.
	 */
	public String getAttribute(String attr){
		
		if(attr.equals("titel")) return bookName;
		
		boolean cat = false;
		boolean subcat = false;
		
		if(attr.equals("WSBNcat")){
			attr="WSBN";
			cat=true;
		}
		
		if(attr.equals("WSBNsubcat")){
			attr="WSBN";
			subcat=true;
		}
		
		File iBox = new File(basePath+bookName.replace('/', '#')+".txt");//vul hier het pad naar je bestand in  
        StringBuilder toParse= new StringBuilder(getInhoud(iBox)); 
        
        String value;
        
        int i1=toParse.indexOf(attr);
        i1=toParse.indexOf("=",i1+1);
        int i2=toParse.indexOf("\n",i1);
        
        if (i1 < 0 || i2 < 0) return "";
        
        value = toParse.substring(i1+1, i2);
        value = value.trim();
        
        if (cat){
        	if (value.length()<6){//zeker geen geldige WSBN
        		return "9";
        	}
        	return value.substring(3, 4);
        }
        
        if (subcat){
        	if (value.length()<9){//zeker geen geldige WSBN
        		return getWSBNcat()+"9";
        	}
        	return value.substring(5, 7);
        }
        
        return value;
	}
	
	/**
	 * toon de integer die de hoofdcategorie voorstelt (9 indien onbekend).
	 * @return
	 */
	public int getWSBNsubcat(){
		String cat = getAttribute("WSBNsubcat");
		int i = Integer.parseInt(cat);
		return i;
	}
	
	/**
	 * toon de integer die de hoofdcategorie voorstelt (9 indien onbekend).
	 * @return
	 */
	public int getWSBNcat(){
		System.out.println(bookName+getWSBN());
		String cat = getAttribute("WSBNcat");
		int i = Integer.parseInt(cat);
		return i;
	}
	
	/**
	 * toon het volledige WSBN nummer zoals het staat in de infobox.
	 * @return
	 */
	public String getWSBN(){
		return getAttribute("WSBN");
	}

	/**
	 * toon de auteurs zoals ze vermeld staan in de infobox.
	 * @return
	 */
	public String getAuteurs(){
		return getAttribute("auteurs");
	}
	
	/**
	 * toon de titel van het boek. 
	 * Niet zoals het in de infobox vermeld staat maar zoals de titel gegeven is in de boeknaam.
	 * In de infobox wordt namelijk veel het Sjabloon {{BASEPAGE}} 
	 * gebruikt wat niet meer werkt in een andere pagina.
	 * @return
	 */
	public String getTitel(){
		return bookName;
	}
	
	public String getVoortgang() {
		return getAttribute("voortgang");
	}
	
	//TODO voor iederer attribuut een getter schrijven. zeker voor de veelgebruikte.
	
	/**
	 * geef een array strings die de volgorde bepalen waarin de boeken gesorteerd worden.
	 * @param newSortOrder
	 */
	public void setSortOrder(String[] newSortOrder){
		sortOrder = newSortOrder;
	}
	
	/**
	 * vraag de array waarin je kan zien hoe de boeken gesorteerd worden.
	 * @return
	 */
	public String[] getSortOrder(){
		return sortOrder;
	}

	/**
	 * vergelijk volgens de array uit getSortOrder() 
	 */
	public int compareTo(Book other) {
		for (int i=0; i<getSortOrder().length;i++){
			if (this.getAttribute(getSortOrder()[i]).compareTo(other.getAttribute(getSortOrder()[i]))!=0){
				return this.getAttribute(getSortOrder()[i]).compareTo(other.getAttribute(getSortOrder()[i]));
			}
		}
		return 0;
	}
	
	/**
	 * Methode om de inhoud van een bestand als String terug te krijgen.
	 * @param bestand
	 * @return
	 */
	public static String getInhoud(File bestand){
	    String inhoud = "";
	    /*omdat we niet weten als het bestand wel bestaat
	     * zijn we verplicht om een try te gebruiken. 
	     * Dit wordt uitgelegd in de volgende sectie
	     */
	    try {
			/*
		 	 * maak eerst een bestandslezer en een bufferedReader
		 	 * om de inhoud van het bestand te kunnen lezen
			 */
			FileReader bestandsLezer = new FileReader(bestand);
			BufferedReader input =  new BufferedReader(bestandsLezer);
			try {
		    	String line = null; 
		    	/*
		    	 * zolang het bestand niet ten einde is zal
		    	 * de methode readLine() iedere keer de volgende
		    	 * regel lezen, bij het lezen van die regels laat hij wel
		    	 * het regeleinde weg, dit moeten we dus zelf aanvullen
		    	 */
		    	while (( line = input.readLine()) != null){
					inhoud += line;
					inhoud += System.getProperty("line.separator");
		    	}
			}
			/*
			 * Gelijk wat er gebeurt, de input moet altijd 
			 * weer gesloten worden.  het finally commando 
			 * wordt ook in de volgende sectie uitgelegd
			 */
			finally {
		  		input.close();
			}
	    }
	    /*
	     * het catch commando wordt ook in de volgende sectie uitgelegd
	     */
	    catch (IOException ex){
	      ex.printStackTrace();
	    }
	    
	    return inhoud;
	}

	
}
Informatie afkomstig van http://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.