Init from svn. The wxpython is the final one.
authorviric@llimona
Thu, 18 May 2006 22:59:47 +0200
changeset 0 6371497b4e53
child 1 d89c6e7de299
Init from svn. The wxpython is the final one.
add2db.py
change-tables-mysql.sh
forigi-korektitajn-frazojn.py
frazoj2mysql
taula-mysql.sql
tkinter/lingvigilo.py
txt2db.py
vortoj-ru-ca.txt
vortoj2mysql
web/getdb.inc
web/index.html
web/lingvigilo-korekti.php
web/lingvigilo-montri.php
web/toserver.sh
wxpython/lingvigilo.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/add2db.py	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+
+import sys,shelve
+
+dbase = shelve.open('vortoj-ru-ca.sdb')
+
+print "Showing keys:"
+for a in dbase.keys():
+	print a
+
+print("Tajpu vorton por aldoni al la listo:"),
+key = raw_input()
+
+if key == "":
+	print "Fino."
+	sys.exit()
+
+print("Tajpu tradukon por %s:" % key),
+traduko = raw_input()
+
+dbase[key] = traduko
+
+print "Showing new keys:"
+for a in dbase.keys():
+	print a
+dbase.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/change-tables-mysql.sh	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,2 @@
+#!/bin/bash
+mysql -u lingvigilouser -p -h vicerveza lingvigilo < taula-mysql.sql
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/forigi-korektitajn-frazojn.py	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import MySQLdb,sys
+
+database = 'lingvigilo'
+dbuser = 'lingvigilouser'
+dbpass = 'carrinclo'
+dbtable = 'frazoj_ru_ca'
+
+if (len(sys.argv) != 2):
+	print "Uzo: " + sys.argv[0] + " <numero>"
+	print "Parametro <numero>:"
+	print " 0    Ne korektitaj"
+	print " 1    Ĝustaj"
+	print " 2    Malĝustaj"
+	print " 3    Nekutimaj"
+	sys.exit(1)
+else:
+	korekteco=sys.argv[1]
+
+db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,db=database)
+
+cursor = db.cursor()
+
+cursor.execute('DELETE FROM ' + dbtable + ' WHERE korekta='+sys.argv[1])
+
+db.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frazoj2mysql	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import sys,string,os,MySQLdb,re
+
+database = 'lingvigilo'
+dbuser = 'lingvigilouser'
+dbpass = 'carrinclo'
+dbtable = 'frazoj_ru_ca'
+
+db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,db=database)
+
+cursor = db.cursor()
+
+if (len(sys.argv) != 2):
+	print "Diru nomon de dosiero."
+	sys.exit()
+else:
+	sourcefile=sys.argv[1]
+
+
+# Read txt
+file = open(sourcefile, 'r')
+
+for line in file:
+	# Traiem l'INTRO final
+	line = line.rstrip('\n')
+
+	# Arreglem cometes simples per a sql
+	line = re.sub(r"'",r"\'", line)
+
+	# Separem per \t
+	words = string.split(line, '\t')
+
+	print "Aldonante:", words[0], '=>', words[1]
+
+	cursor.execute('INSERT INTO ' + dbtable +
+		' (vorto,frazo) '+
+		'VALUES(\'%s\',\'%s\');' % (words[0], words[1]))
+
+db.close()
+
+file.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/taula-mysql.sql	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,27 @@
+drop table if exists vortoj_ru_ca;
+
+create table vortoj_ru_ca (
+	id int not null auto_increment,
+	vorto tinytext not null,
+	tipo tinytext not null,
+	traduko tinytext default NULL,
+	param1 tinytext default NULL,
+	param2 tinytext default NULL,
+	primary key (id)
+) TYPE=MyISAM;
+
+drop table if exists frazoj_ru_ca;
+
+create table frazoj_ru_ca (
+	id int not null auto_increment,
+	vorto tinytext not null,
+	frazo tinytext not null,
+	korekta integer not null default 0,
+	klarigo tinytext default null,
+	korektisto tinytext default null,
+	-- 0 = nekorektita
+	-- 1 = gxusta
+	-- 2 = malgxusta
+	-- 3 = nekutima
+	primary key (id)
+) TYPE=MyISAM;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tkinter/lingvigilo.py	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,112 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+
+from Tkinter import *
+from tkSimpleDialog import *
+import sys,time,random,string,MySQLdb
+
+# Configuració
+legi_el = 'mysql'
+
+# Conf - mysql
+database = 'lingvigilo'
+dbuser = 'lingvigilouser'
+dbpass = 'carrinclo'
+dbtable_vortoj = 'vortoj_ru_ca'
+dbtable_frazoj = 'frazoj_ru_ca'
+
+# Conf - fitxer
+dbasefile = 'vortoj-ru-ca.txt'
+frazodosiero = 'frazoj.txt'
+
+# Prendre les paraules d'una base de dades MySQL
+def getMySQL():
+	db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,
+		db=database)
+	cursor = db.cursor()
+	cursor.execute("SELECT * FROM "+dbtable_vortoj)
+	res_vortoj = cursor.fetchall()
+	res_vortoj_unicode = []
+	for vorto in res_vortoj:
+		vorto_vorto = unicode(vorto[1],'utf8')
+		vorto_tipo = unicode(vorto[2],'utf8')
+		vorto_traduko = unicode(vorto[3],'utf8')
+		
+		# Paràmetres opcionals
+		if vorto[4] == None:
+			vorto_param1 = ''
+		else:
+			vorto_param1 = unicode(vorto[4],'utf8')
+
+		if vorto[5] == None:
+			vorto_param2 = ''
+		else:
+			vorto_param2 = unicode(vorto[5],'utf8')
+
+		res_vortoj_unicode.append(
+			(vorto_vorto, vorto_tipo, vorto_traduko,
+			vorto_param1, vorto_param2))
+	db.close()
+	return res_vortoj_unicode
+
+# Prendre les paraules d'un fitxer
+def getFile():
+	dbase = open(dbasefile,"r")
+
+	lines = dbase.readlines()
+	dbase.close()
+
+	res_vortoj = []
+	for line in lines:
+		line = line.rstrip('\n')
+		vortoj = string.split(unicode(line.rstrip('\n'),'utf8'),'\t')
+		res_vortoj.append(vortoj)
+
+	return res_vortoj
+
+if legi_el == 'file':
+	print "Legante vortojn el dosiero..."
+	vortoj = getFile()
+else:
+	print "Legante vortojn el MySQLa datumbazo..."
+	vortoj = getMySQL()
+
+print "Legitaj", len(vortoj), "vortoj."
+
+def AldoniFrazonDosieren(vorto,teksto):
+	outfile = open(frazodosiero,"a")
+
+	lineout = vorto + "\t" + teksto +"\n"
+	outfile.write(lineout.encode('utf8'))
+	
+	outfile.close()
+
+def AldoniFrazonDatumbazen(vorto,teksto):
+	db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,
+		db=database)
+	cursor = db.cursor()
+	print ("INSERT INTO "+dbtable_frazoj+" (vorto, frazo)"
+		" VALUES('%s', '%s');" % (vorto, teksto))
+	cursor.execute("INSERT INTO "+dbtable_frazoj+" (vorto, frazo)"+
+		" VALUES('%s', '%s');" % (vorto.encode('utf8'),
+		teksto.encode('utf8')))
+	db.close()
+
+
+def LoopFunction():
+	index = random.randint(0, len(vortoj)-1)
+	vorto = vortoj[index][0]
+	teksto = askstring("Frazilon", "Skribu frazon por vorto '%s'" % vorto)
+	if teksto == None:
+		print 'Fi del programa'
+		sys.exit()
+	AldoniFrazonDatumbazen(vorto, teksto)
+	root.after(1*1000,LoopFunction)
+
+
+# Main program
+root=Tk()
+root.after(10,LoopFunction)
+Message(root, text='Programo por lerni lingvon').pack();
+root.mainloop()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/txt2db.py	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,29 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import shelve,string,os
+
+
+sourcefile = 'vortoj-ru-ca.txt'
+dbfile = 'vortoj-ru-ca.sdb'
+try:
+	os.remove(dbfile)
+except:
+	print "File '%s' doesn't exist. Creating..." % dbfile
+else:
+	print "File '%s' exist. Wipping..." % dbfile
+
+dbase = shelve.open(dbfile)
+
+# Read txt
+file = open(sourcefile, 'r')
+
+for line in file:
+	line = line.rstrip('\n')
+	words = string.split(line, '\t')
+	print "Adding:", words[0], '=>', words[2]
+	dbase[words[0]] = words[2]
+
+file.close()
+	
+dbase.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vortoj-ru-ca.txt	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,256 @@
+шкаф	nom	armari
+спать	nom	dormir	нсв	
+с друзья'ми	exp	amb amics
+по'сле+gen	prep	després
+нра'виться	verb	agradar	нсв	понра'вится
+ла'дно	adv	d'acord
+понра'виться	verb	agradar	св	нра'вится
+дари'ть	verb	regalar	нсв	подари'ть
+подари'ть	verb	regalar	нсв	дари'ть
+подаро'к	nom	regal
+ску'чный	adj	avorrit
+сеа'нс	nom	sessió
+вини'тельный паде'ж	exp	acusatiu
+да'тельный паде'ж	exp	datiu
+чемода'н	nom	maleta
+о'коло+gen	nom	a prop de
+дава'ть	verb	donar	нсв	дать
+дать	verb	donar	св	дава'ть
+сове'товать	verb	aconsellar	нсв	посове'товать
+посове'товать	verb	aconsellar	нсв	сове'товать
+похо'д	nom	excursió
+спроси'ть	verb	demanar	св	спра'шивать
+спра'шивать	verb	demanar	нсв	спраси'ть
+весь,вся,всё	nom	tot el / sencer
+настрое'ние	nom	humor
+лёгкий	adj	fàcil
+бассе'йн	nom	piscina
+симпати'чный	adj	guapo (físicament)
+мо'дный	adj	de moda
+совреме'нный	adj	modern, actual
+улы'бка	nom	somriure
+улыба'ться	verb	somriure	нсв
+стро'ить	verb	construir	нсв	постро'ить
+не совсе'м	exp	no exactament
+совсе'м не	exp	en absolut (no)
+прие'хать	verb	arribar	нсв
+бо'льше всего'	exp	el que més
+наро'д	nom	poble (gent)
+наро'дный	nom	popular
+как и я	nom	com jo. La 'i' emfatitza
+зато'	exp	en canvi / compensant
+за то	exp	per això / per lo que
+стака'н	nom	vas, got
+по'эзд	nom	tren
+де'ло	nom	negoci
+село	nom	poble, vila
+кре'сло	nom	sofà
+перо'	nom	bolígraf, ploma
+мя'со	nom	carn
+ма'льчик	nom	noi
+шля'па	nom	barret
+ле'рево	nom	arbre, fusta
+оте'чество	nom	pàtria, terra del pare
+бумага	nom	paper
+картина	nom	dibuix
+жела'ть	verb	voler, desitjar	нсв
+отвеча'ть	verb	respondre	нсв
+ча'сто	nom	sovint
+учени'к	nom	alumne (escola)
+конто'ра	nom	oficina
+что'-то	nom	alguna cosa
+для+gen	exp	per a
+без+gen	exp	sense
+рад	exp	estar encantat
+забыва'ть	verb	oblidar	нсв
+ме'дленно	adv	a poc a poc
+осёл	nom	ase
+счёт	nom	factura, compta
+конь	nom	cavall
+кора'бль	nom	vaixell
+сара'й	nom	cabanya
+из+gen	nom	fora de, lluny de
+тётя	nom	tieta
+а'рмия	nom	exercit
+исто'рия	nom	història
+ста'нция	nom	estació
+вещь	nom	cosa (f)
+ночь	nom	nit (f)
+крова'ть	nom	llit (f)
+по'ле	nom	camp
+зда'ние	nom	edifici
+жела'ние	nom	desig
+пла'тье	nom	roba, vestit
+от+gen	exp	lluny de
+за+acc	exp	després, darrera, més enllà (moviment)
+море	nom	mar
+ча'шка	nom	tassa
+благодари'ть	verb	agrair	нсв
+по'мнить	verb	recordar	нсв
+учи'ть	verb	aprendre, estudiar	нсв
+жаль	exp	llàstima, (+dat, saber greu)
+держать	verb	mantenir	нсв
+дорого'й	adj	valuós, car
+молодо'й	adj	jove
+сад	nom	jardí
+наве'рно	adv	probablement
+ти'хо	adv	silenciosament, suaument
+свобо'дно	adv	lliurement, amb fluïdesa
+соль	nom	sal (f)
+масло	nom	mantega
+зуб	nom	dent
+щётка	nom	raspall
+зеркало	nom	lent, vidre per mirar
+запреща'ть	verb	prohibir	нсв
+слы'шать	verb	sentir (oïda)	нсв
+по-мо'ему	exp	en la meva opinió
+поэ'тому	exp	per tant
+по+dat	exp	al llarg de, mitjançant, d'acord amb
+по+prep	exp	quan, a l'hora que, després
+наро'чно	adv	expressament
+неча'янно	adv	sense voler
+проси'ть	verb	demanar (algo)	нсв
+ждать	verb	esperar (algo)	нсв
+почти'	adv	quasi
+всё	nom	tot
+все	nom	tothom
+жи'тель	nom	habitant (m)
+пло'шадь	nom	plaça (f)
+ку'ртка	nom	jaqueta d'home
+карма'н	nom	butxaca
+ла'вка	nom	botiga
+ла'вочник	nom	botiguer
+шу'тка	nom	acudit
+обы'чно	adv	normalment
+редко	adv	poc sovint, rarament
+меша'ть	verb	molestar	нсв
+скуча'ть	verb	avorrir-se	нсв
+быва'ть	verb	freqüentar, passar de tant en tant	нсв
+шути'ть	verb	fer broma	нсв
+весна'	nom	primavera
+ле'то	nom	estiu
+о'сень	nom	tardor (f)
+зима'	nom	hivern
+день	nom	dia (m)
+столи'ца	nom	capital (ciutat)
+земля'	nom	terra
+река'	nom	riu
+бежа'ть	verb	córrer	нсв
+жить	verb	viure	нсв
+есть	verb	menjar	нсв
+хоте'ть	verb	voler	нсв
+рука'	nom	braç, mà
+голова'	nom	cap
+ум	nom	ment, intel·lecte
+у'мный	adjectiu	espavilat, intel·ligent
+нау'ка	nom	ciència
+жизнь	nom	vida (f)
+терпе'ние	nom	paciència
+разгово'р	nom	conversa
+разгова'ривать	verb	conversar, parlar (+ins)	нсв
+прекра'сный	adj	bonic
+краси'вый	adj	maco, guapo
+холо'дный	adj	fred
+тёрплый	adj	calentet
+дешёвый	adj	barat
+пусто'й	adj	buit
+бара'н	nom	xai
+поколе'ние	nom	generació
+дово'льно	adv	suficient
+дёшево	adv	de manera barata
+да'же	exp	malgrat
+прекра'сно	adv	esplèndit, excel·lent
+коне'чно	adv	evidentment
+мо'жно	adv	hom pot
+нельзя'	adv	hom no pot
+сто'ить	verb	costar	нсв
+не сто'ить!	exp	de res
+си'ний	adj	blau fosc
+зде'шний	adj	local
+после'дний	adj	últim
+вне'шний	adj	extern
+вече'рний	adj	del vespre
+у'трений	adj	del matí
+пере'дний	adj	frontal
+да'льний	adj	distant
+сре'дний	adj	del mig, central
+сосе'дний	adj	del costat, veïnal
+ра'нний	adj	d'aviat
+по'здний	adj	tardà
+ни'жнний	adj	de baix
+ве'рхний	adj	de dalt
+пре'жний	adj	anterior
+о'бщий	adj	general, comú
+не'бо	nom	cel
+вид	nom	aspecte, aparença
+торго'вля	nom	comerç
+звезда'	nom	estel, estrella
+часть	nom	part d'alguna cosa
+за+ins	exp	darrera, més enllà, després, per
+ме'жду+ins	exp	entre
+над+ins	exp	sobre
+пе'ред+ins	exp	abans (temps o espai)
+под+ins	exp	sota
+c+ins	exp	amb
+при+prep	exp	en presència, a l'hora de, a tal ocasió
+сунду'к	nom	barril
+пансион	nom	pensió
+тамо'жная	nom	botiga de vestits
+дождь	nom	pluja (m)
+снег	nom	neu
+доро'га	nom	carretera
+сухо'й	adj	sec
+ма'ленький	adj	petit
+желе'зо	nom	ferro
+желе'зный	adj	de ferro
+ра'но	adv	aviat
+по'здно	adv	tard
+жа'рко	adv	fa calor
+ве'трено	adv	fa vent
+су'хо	adv	fa sequetat
+тепло'	adv	s'està calentet
+сы'ро	adv	hi ha humitat
+пра'здник	nom	dia de festa
+писа'тель	nom	escriptor
+мета'лл	nom	metall
+мост	nom	pont
+зал	nom	rebedor
+ма'ло+gen	exp	poc de
+весде'	adv	a tot arreu
+ва'жно	adv	és important
+нева'жно	adv	no té importància, pobrement
+переводи'ть	verb	traduir	нсв
+задава'ть	verb	fer, posar (~ вопрос, fer una pregunta)	нсв
+сиде'ть	verb	seure	нсв
+те'ло	nom	cos
+блю'до	nom	plat
+колесо'	nom	roda
+село'	nom	vila
+о'зеро	nom	llac
+яйцо'	nom	ou
+черн'ила	nom	tinta (n pl)
+усе'рдный	adj	gelós
+учи'лище	nom	escola
+чудо'вище	nom	monstre
+изве'стие	nom	notícies, informació
+уче'ние	nom	estudis, ensenyament
+содержа'ние	nom	continguts
+изве'стно, что	exp	és ben sabut que
+чудо'вищно!	exp	monstruós!
+мне'ние	nom	opinió
+брать	verb	prendre, agafar	нсв
+жале'ть	verb	saber greu per (+gen)	нсв
+сро'чно	adv	urgentment
+сро'чный	adj	urgent
+свеча'	nom	espelma
+откры'тка	nom	postal
+поду'шка	nom	coixí
+ма'рка	nom	segell
+посте'ль	nom	llit? (f)
+о'чередь	nom	torn, cua
+откры'тый	adj	obert
+закры'тый	adj	tancat
+быть без ума' от+gen	exp	ser boig (d'algo)
+уме'ть	verb	saber fer	нсв
+на'до	exp	és necessari (+dat)
+рисова'ть	verb	dibuixar	нсв
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vortoj2mysql	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import shelve,string,os,MySQLdb,re
+
+database = 'lingvigilo'
+dbuser = 'lingvigilouser'
+dbpass = 'carrinclo'
+dbtable = 'vortoj_ru_ca'
+
+db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,db=database)
+
+cursor = db.cursor()
+
+sourcefile = 'vortoj-ru-ca.txt'
+
+# Connexió base de dades
+
+
+# Read txt
+file = open(sourcefile, 'r')
+
+cursor.execute('DELETE FROM ' + dbtable);
+
+for line in file:
+	# Traiem l'INTRO final
+	line = line.rstrip('\n')
+
+	# Arreglem cometes simples per a sql
+	line = re.sub(r"'",r"\'", line)
+
+	# Separem per \t
+	words = string.split(line, '\t')
+
+	print "Aldonante:", words[0], '=>', words[2]
+
+	if words[1] == "verb":
+		#print ('INSERT INTO ' + dbtable +
+		#	' (vorto,tipo,traduko,param1,param2) '+
+		#	'VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\');' %
+		#	(words[0], words[1], words[2], words[3], words[4]))
+		if (len(words) == 5):
+			cursor.execute('INSERT INTO ' + dbtable +
+				' (vorto,tipo,traduko,param1,param2) '+
+				'VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\');' %
+				(words[0], words[1], words[2], words[3],
+				words[4]))
+		else:
+			cursor.execute('INSERT INTO ' + dbtable +
+				' (vorto,tipo,traduko,param1) '+
+				'VALUES(\'%s\',\'%s\',\'%s\',\'%s\');' %
+				(words[0], words[1], words[2], words[3]))
+	else:
+		#print ('INSERT INTO ' + dbtable +
+		#	' (vorto,tipo,traduko) '+
+		#	'VALUES(\'%s\',\'%s\',\'%s\');' % (words[0], words[1],
+		#	words[2]))
+		cursor.execute('INSERT INTO ' + dbtable +
+			' (vorto,tipo,traduko) '+
+			'VALUES(\'%s\',\'%s\',\'%s\');' % (words[0], words[1],
+			words[2]))
+
+db.close()
+
+file.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/getdb.inc	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,59 @@
+<?php
+$mysql_server = "localhost";
+$mysql_user = "lingvigilouser";
+$mysql_password = "carrinclo";
+$mysql_db = "lingvigilo";
+$frazotablo = "frazoj_ru_ca";
+
+function konekti()
+{
+	global $mysql_server, $mysql_user, $mysql_password, $mysql_db;
+	$connexio = mysql_connect($mysql_server, $mysql_user, $mysql_password);
+	mysql_select_db($mysql_db, $connexio);
+	return $connexio;
+}
+
+
+function strtosql($cadena)
+{
+	return ereg_replace("\'", "\'", $cadena);
+}
+
+
+function preni_frazojn($konekto,$fraztipo=0)
+{
+	global $frazotablo;
+	$resultat = mysql_query(
+		"SELECT id,vorto,frazo,korekta,klarigo,korektisto FROM " .
+		$frazotablo . " WHERE korekta=" . $fraztipo . ";",
+		$konekto);
+
+	echo mysql_error();
+
+	while ($fila = mysql_fetch_row($resultat))
+	{
+		$frazoj[$fila[0]] = array(
+				"vorto" => $fila[1],
+				"frazo" => $fila[2],
+				"korekta" => $fila[3],
+				"klarigo" => $fila[4],
+				"korektisto" => $fila[5]);
+	}
+
+	if (!isset($frazoj))
+		$frazoj=0;
+
+	return $frazoj;
+}
+
+function teksto_korekto($korekteco)
+{
+	switch($korekteco)
+	{
+	case 0: return "Ne korektita"; break;
+	case 1: return "Ĝusta"; break;
+	case 2: return "Malĝusta"; break;
+	case 3: return "Nekutima"; break;
+	}
+}
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/index.html	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head>
+	<title>Lingvigilo - Reta Parto</title>
+	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+</head>
+
+<body>
+
+<h1>Programo <em>lingvigilo</em>: reta parto</h1>
+
+<h2>Metodo</h2>
+<p>Tiu ĉi estas metodo por plibonigi konon de lingvo rusa. Ĝi estas simplega. La
+studanto havas programon, kiu demandas al li/ŝi:</p>
+<p>- Skribu frazon per vorto "..."</p>
+<p>Studanto devas skribi ĝustan frazon kun tiu vorto. Do, la studanto kreas
+frazaron, po unu frazon por ĉiu vorto.</p>
+<p>La korektisto povas vidi liston de korektendaj frazoj. Li/Ŝi devas certigi ĉu
+la studanto skribis ĝustan frazon por ĉiu vorto. Kompreneble, la korektisto
+povas elekti kiom da frazoj korekti. </p>
+
+<h2>Programeroj</h2>
+<UL>
+<LI><A href="lingvigilo-korekti">Korektilo</a>, por korektistoj
+<LI><A href="lingvigilo-montri">Montrilo</a>, por studanto aŭ scivolemulo
+</UL>
+
+</BODY>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lingvigilo-korekti.php	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head>
+	<title>Lingvigilo - Korekta kvizo</title>
+	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+	<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+	<META HTTP-EQUIV="Expires" CONTENT="-1">
+</head>
+
+<body>
+
+<?php
+include('./getdb.inc');
+
+$konekto=konekti();
+
+$frazoj = preni_frazojn($konekto,0)
+?>
+
+<h1>Korektilo por programo <em>lingvigilo</em></h1>
+
+<?php
+if (isset($_POST["korektu"]))
+{
+
+	// Konservi datumojn.
+	
+	$body = "";
+	// OJU!!!! Aquí falla indentació per mantenir 80 columnes.
+	if ($frazoj != 0)
+	{
+	foreach($frazoj as $key => $f)
+	{
+		//echo "<p> Key: $key. ";
+		if(isset($_POST["korekto"][$key]))
+			//echo "farita.";
+			if($_POST["korekto"][$key] != 0)
+			{
+				$query = "UPDATE " . $frazotablo .
+					" SET korekta=" .
+					$_POST["korekto"][$key] .
+					",klarigo='" .
+					strtosql($_POST["klarigo"][$key]) .
+					"',korektisto='" .
+					strtosql($_POST["korektisto"]) .
+					"' WHERE id=".  $key . ";";
+				mysql_query($query, $konekto);
+				// Por retletero
+				$body = $body .
+					"Vorto: " . $f["vorto"] . "\n" .
+					"Frazo: " . $f["frazo"] . "\n" .
+					"Korekteco: " .
+					teksto_korekto($_POST["korekto"][$key])
+					. "\n" .
+					"Klarigo: " . $_POST["klarigo"][$key] .
+					"\n" .  "Korektist(in)o: " .
+					$_POST["korektisto"] .
+					"\n\n";
+
+				
+
+			}
+		//echo "</p>\n";
+	}
+	// Sendi retleteron
+	mail("viric@vicerveza.homeunix.net","Korektado de frazoj", $body,
+	"Content-Type: text/plain; charset=utf-8\r\n" .
+	"Content-Transfer-Encoding: 8bit");
+	}
+	
+?>
+	<p>Dankon pro la korektado!<p>
+	<p>Vi povas reiri al frazaro korektenda alitage, ĉiam je la
+	<a HREF="http://vicerveza.homeunix.net/~viric/lingvigilo/lingvigilo-korekti">Sama
+	adreso</a>.</p>
+<?php
+}
+else
+{
+?>
+
+<h2>Frazoj korektendaj</h2>
+
+<form action="lingvigilo-korekti" method="post">
+
+<TABLE BORDER=1>
+<TR>
+        <TH>ID
+        <TH>Vorto
+        <TH>Frazo
+        <TH>Korekto
+        <TH>Klarigo
+
+<?php
+
+function select_korekto($id_frazo)
+{
+	echo "<SELECT name=\"korekto[$id_frazo]\">\n";
+	echo "<OPTION value=0 selected>Ne korektita\n";
+	echo "<OPTION value=1>Ĝusta\n";
+	echo "<OPTION value=2>Malĝusta\n";
+	echo "<OPTION value=3>Nekutima\n";
+	echo "</SELECT>\n";
+}
+
+$numfrazoj = 0;
+if ($frazoj != 0)
+	foreach($frazoj as $key => $f)
+	{
+		echo "<tr>\n";
+		echo "\t<td>". $key . "\n";
+		echo "\t<td>". $f["vorto"] . "\n";
+		echo "\t<td>". $f["frazo"] . "\n";
+		echo "\t<td>";
+		select_korekto($key);
+		echo "\t<td><input type=text name=\"klarigo[$key]\" size=30 " .
+			"maxlength=254>";
+		$numfrazoj++;
+	}
+?>
+</table>
+
+<p><strong>Estas <?php echo $numfrazoj;?> nekorektitaj frazoj en datumbazo.
+</strong></p>
+
+<h2>Prepari sendon</h2>
+
+<p>Alklaku <em>Sendu korektaĵojn</em> por sendi ilin. Vi povas igi ĉiujn frazojn
+al elekto <em>Ne korektita</em> kaj forviŝi ĉiujn klarigojn, alklakante butonon
+<em>Forgesu</em>.</p>
+
+<p>Antaŭ enmetu datumojn, bonvolu skribi ian nomon por ke mi sciu kiu korektis
+tion ĉi (t.e. kiun demandi)</p>
+
+<p><strong>Korektist(in)o:</strong>
+<input type=text name=korektisto size=10 maxlength=30>
+</p>
+
+<input type=submit value="Sendu korektaĵojn" name=korektu>
+<input type=reset value="Forgesu">
+</form>
+
+<?php
+} // Fino de normala paĝo
+?>
+
+<p>Iru al <a href="index">ĉefa paĝo</a>.</p>
+
+</body>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lingvigilo-montri.php	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head>
+	<title>Lingvigilo - Frazomontrilo</title>
+	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+	<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+	<META HTTP-EQUIV="Expires" CONTENT="-1">
+</head>
+
+<body>
+
+<?php
+include('./getdb.inc');
+
+?>
+
+<h1>Montrilo por programo <em>lingvigilo</em></h1>
+
+<?php
+if (isset($_POST["nova_korekteco"]))
+	$korekteco=$_POST["korekteco"];
+else
+	// Default
+	$korekteco=-2
+?>
+
+<h2>Agordo</h2>
+
+<form action="lingvigilo-montri" method="post">
+<p>Montru frazojn
+<select name="korekteco">
+<option value=0 <?php if ($korekteco==0) echo "selected" ?>>Nekorektitajn
+<option value=1 <?php if ($korekteco==1) echo "selected" ?>>Ĝustajn
+<option value=2 <?php if ($korekteco==2) echo "selected" ?>>Malĝustajn
+<option value=3 <?php if ($korekteco==3) echo "selected" ?>>Nekutimajn
+<option value="-2" <?php if ($korekteco==-2) echo "selected" ?>>Malĝustajn kaj
+nekutimajn
+<option value="-1" <?php if ($korekteco==-1) echo "selected" ?>>Ĉiajn
+</select>
+
+<input type=submit value="Ŝanĝi" name=nova_korekteco>
+</p>
+</form>
+
+<h2>Frazoj</h2>
+
+<?php
+
+if($korekteco >= 0)
+	$korektecoj = array($korekteco);
+elseif ($korekteco == -1)
+	$korektecoj = array(0,1,2,3);
+elseif ($korekteco == -2)
+	$korektecoj = array(2,3);
+
+?>
+<TABLE BORDER=1>
+<TR>
+        <TH>ID
+        <TH>Vorto
+        <TH>Frazo
+	<TH>Korektist(in)o
+        <TH>Korekto
+        <TH>Ekspliko
+
+<?
+
+$konekto=konekti();
+
+foreach($korektecoj as $k)
+{
+	$frazoj = preni_frazojn($konekto,$k);
+	if ($frazoj != 0)
+		foreach($frazoj as $key => $f)
+		{
+			echo "<tr>\n";
+			echo "\t<td>". $key . "\n";
+			echo "\t<td>". $f["vorto"] . "\n";
+			echo "\t<td>". $f["frazo"] . "\n";
+			echo "\t<td>" . $f["korektisto"] . "\n";
+			echo "\t<td>" . teksto_korekto($f["korekta"]) . "\n";
+			echo "\t<td>" . $f["klarigo"] . "\n";
+		}
+}
+
+?>
+</table>
+
+<p>Iru al <a href="index">ĉefa paĝo</a>.</p>
+
+</body>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/toserver.sh	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,2 @@
+#!/bin/bash
+scp *.{php,inc,html} vicerveza:~/public_html/lingvigilo/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wxpython/lingvigilo.py	Thu May 18 22:59:47 2006 +0200
@@ -0,0 +1,245 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import sys,time,random,string,MySQLdb,re
+from wxPython.wx import *
+
+# Configuració
+legi_el = 'mysql'
+
+# Conf - mysql
+database = 'lingvigilo'
+dbuser = 'lingvigilouser'
+dbpass = 'carrinclo'
+dbtable_vortoj = 'vortoj_ru_ca'
+dbtable_frazoj = 'frazoj_ru_ca'
+
+# Conf - fitxer
+dbasefile = 'vortoj-ru-ca.txt'
+frazodosiero = 'frazoj.txt'
+frazoj_al = 'mysql'
+
+# Si s'especifica fitxer, l'origen és el fitxer.
+if (len(sys.argv) > 1):
+	dbasefile = sys.argv[1]
+	legi_el = 'file'
+
+def StringForSQL(str):
+	return re.sub(r"'",r"\'", str)
+
+# Prendre les paraules d'una base de dades MySQL
+def getMySQL():
+	db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,
+		db=database)
+	cursor = db.cursor()
+	cursor.execute("SELECT * FROM "+dbtable_vortoj)
+	res_vortoj = cursor.fetchall()
+	res_vortoj_unicode = []
+	for vorto in res_vortoj:
+		vorto_vorto = unicode(vorto[1],'utf8')
+		vorto_tipo = unicode(vorto[2],'utf8')
+		vorto_traduko = unicode(vorto[3],'utf8')
+		
+		# Paràmetres opcionals
+		if vorto[4] == None:
+			vorto_param1 = ''
+		else:
+			vorto_param1 = unicode(vorto[4],'utf8')
+
+		if vorto[5] == None:
+			vorto_param2 = ''
+		else:
+			vorto_param2 = unicode(vorto[5],'utf8')
+
+		res_vortoj_unicode.append(
+			(vorto_vorto, vorto_tipo, vorto_traduko,
+			vorto_param1, vorto_param2))
+	db.close()
+	return res_vortoj_unicode
+
+# Prendre les paraules d'un fitxer
+def getFile():
+	dbase = open(dbasefile,"r")
+
+	lines = dbase.readlines()
+	dbase.close()
+
+	res_vortoj = []
+	for line in lines:
+		line = line.rstrip('\n')
+		vortoj = string.split(unicode(line.rstrip('\n'),'utf8'),'\t')
+		res_vortoj.append(vortoj)
+
+	return res_vortoj
+
+if legi_el == 'dosiero':
+	print "Legante vortojn el dosiero..."
+	vortoj = getFile()
+elif legi_el == 'mysql':
+	print "Legante vortojn el MySQLa datumbazo..."
+	vortoj = getMySQL()
+
+print "Legitaj", len(vortoj), "vortoj."
+
+def AldoniFrazonDosieren(vorto,teksto):
+	outfile = open(frazodosiero,"a")
+
+	lineout = vorto + "\t" + teksto +"\n"
+	outfile.write(lineout.encode('utf8'))
+	
+	outfile.close()
+
+def AldoniFrazonDatumbazen(vorto,teksto):
+	db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,
+		db=database)
+	cursor = db.cursor()
+	cursor.execute("INSERT INTO "+
+		StringForSQL(dbtable_frazoj)+
+		" (vorto, frazo) VALUES('%s', '%s');" %
+		(StringForSQL(vorto.encode('utf8')),
+		StringForSQL(teksto.encode('utf8'))))
+	db.close()
+
+def AldoniFrazon(vorto,teksto):
+	if (frazoj_al == 'mysql'):
+		AldoniFrazonDatumbazen(vorto,teksto)
+	elif (frazoj_al == 'dosiero'):
+		AldoniFrazonDosieren(vorto,teksto)
+
+
+
+#def LoopFunction():
+#	index = random.randint(0, len(vortoj)-1)
+#	vorto = vortoj[index][0]
+#	teksto = askstring("Frazilon", "Skribu frazon por vorto '%s'" % vorto)
+#	if teksto == None:
+#		print 'Fi del programa'
+#		sys.exit()
+#	AldoniFrazonDatumbazen(vorto, teksto)
+
+def Senakcentigi(vorto):
+	return re.sub(r"'",r"", vorto)
+
+class main_window(wxFrame):
+	def __init__(self, parent, id, title):
+		wxFrame.__init__(self, parent, -1, title, size=(200,100),
+			style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
+
+		# Variables de la classe
+		# (sino no tira)
+		self.vorto = ("", "")
+
+		# Sizer vertical
+		self.topsizer = wxBoxSizer(wxVERTICAL)
+
+		# Agefim la pregunta i la textbox
+		self.label = wxStaticText(self, -1,
+			label="Skribu frazon per vorto\n 'provo'",
+			style=wxALIGN_CENTER)
+		self.textbox = wxTextCtrl(self, -1)
+		self.topsizer.Add(self.label, 1, wxALIGN_CENTER,
+			wxALL, 10)
+		self.topsizer.Add(self.textbox, 0, wxEXPAND, wxALL, 10)
+
+		# Afegim botons
+		self.buttonsizer = wxBoxSizer(wxHORIZONTAL)
+		okid = wxNewId()
+		cancelid = wxNewId()
+		helpid = wxNewId()
+		okbutton = wxButton(self, okid, "Konservu")
+		# Botó per defecte (resposta a l'intro)
+		okbutton.SetDefault()
+		self.buttonsizer.Add(okbutton, 0, wxALL, 10)
+		cancelbutton = wxButton(self, cancelid, "Forgesu")
+		self.buttonsizer.Add(cancelbutton, 0, wxALL, 10)
+		helpbutton = wxButton(self, helpid, "Helpo")
+		self.buttonsizer.Add(helpbutton, 0, wxALL, 10)
+		self.topsizer.Add(self.buttonsizer, 0, wxALIGN_CENTER)
+
+		# EVENTS DE BOTONS
+		EVT_BUTTON(okbutton, okid, self.KonservuFrazon )
+		EVT_BUTTON(cancelbutton, cancelid, self.ForgesuFrazon )
+		EVT_BUTTON(helpbutton, helpid, self.MontruHelpon )
+
+		# Key events
+		EVT_KEY_DOWN(self,self.KeyManager)
+
+		# Activem el sizer principal
+		self.SetSizer(self.topsizer)
+		# Mida mínima de finestra.
+		self.topsizer.SetSizeHints(self)
+
+		# Focus al text
+		self.textbox.SetFocus()
+		
+		self.Show(true)
+
+		# Actualitzem paraula.
+		self.RenovuVorton()
+
+	def RenovuVorton(self):
+		index = random.randint(0, len(vortoj)-1)
+		
+		self.vorto = vortoj[index]
+		#print("Elektita vorto: %s" % self.vorto[0])
+		self.label.SetLabel("Skribu frazon per vorto\n'%s'" %
+			Senakcentigi(self.vorto[0]))
+
+
+	#	if teksto == None:
+	#		print 'Fi del programa'
+	#		sys.exit()
+	#	AldoniFrazonDatumbazen(vorto, teksto)
+
+	def MontruHelpon(self,event):
+		mesagxo = ("Vorto: " + self.vorto[0] + "\n" +
+			"Tipo: " + self.vorto[1] + "\n" +
+			"Traduko: " + self.vorto[2] + "\n")
+
+		if (self.vorto[1] == "verb"):
+			mesagxo = (mesagxo + "Aspekto: " + self.vorto[3] + "\n")
+			aspekto = self.vorto[3]
+			if (self.vorto[3] == u"нсв"):
+				aliaaspekto = u"Св"
+			else:
+				aliaaspekto = u"Нсв"
+			mesagxo = (mesagxo + aliaaspekto + ": " +
+				self.vorto[4] + "\n")
+
+		wxMessageDialog(self, mesagxo, "Helpo", style=wxOK).ShowModal()
+
+	def KonservuFrazon(self,event):
+		# No guardem cadenes buides
+		if (self.textbox.GetValue() != ""):
+			AldoniFrazon(Senakcentigi(self.vorto[0]),
+				self.textbox.GetValue())
+			self.RenovuVorton()
+			self.textbox.Clear()
+
+	def ForgesuFrazon(self,event):
+		self.textbox.Clear()
+		self.RenovuVorton()
+
+	def KeyManager(self,event):
+		key = event.GetKeyCode()
+		if (key == WXK_ESCAPE):
+			print("Elirante...")
+			sys.exit()
+		elif (key == WXK_TAB):
+			# Igual que ForgesuFrazon(self,event)
+			# Puc fer-ho passant un event buit?
+			self.ForgesuFrazon(0)
+		elif (key == WXK_F1):
+			self.MontruHelpon(0)
+
+class App(wxApp):
+	def OnInit(self):
+		frame = main_window(None, -1, "Lingvigilo")
+		self.SetTopWindow(frame)
+		return true
+
+#def DemandiAlUzanto():
+
+# Main program
+app=App(0)
+app.MainLoop()