[dots/remove-assistant: 21/38] table_editor: input validation



commit 84dae5a8b961e39bd0bdb96760950d063a14e9f2
Author: Fernando Herrera <fherrera onirica com>
Date:   Mon Jul 12 16:59:25 2010 +0200

    table_editor: input validation

 dots/table_editor.py |   49 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 45 insertions(+), 4 deletions(-)
---
diff --git a/dots/table_editor.py b/dots/table_editor.py
index 2606e20..868cb3c 100755
--- a/dots/table_editor.py
+++ b/dots/table_editor.py
@@ -17,10 +17,18 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# TODO:
+#	* Handle special length opcodes
+#	* operands validation
+#	* saving
+#	* translate non UTF-8 entries
+
+
 import os
 from sys import exit
 import host_settings
 import gtk
+import re
 
 opcodes = {
   "include": ["filename"],
@@ -86,11 +94,11 @@ opcodes = {
   "comp6": ["character", "dots"],
   "class": ["name", "character"],
 #Special ons using opcode!
-  "after": ["after", "class", "opcode"],
-  "before": ["after", "class", "opcode"],
+  "after": ["class", "opcode"],
+  "before": ["class", "opcode"],
   "noback": ["opcode"],
   "nofor": ["opcode"],
-  "swapcc": ["name", "characters", "dots,..."],
+  "swapcc": ["name", "characters", "dots..."],
   "swapcd": ["name", "dots...", "dotpattern..."],
   "swapdd": ["name", "characters", "characters"],
   "space": ["character", "dots"],
@@ -105,7 +113,7 @@ opcodes = {
   "uplow": ["characters", "dots[,dots]"],
   "litdigit": ["character", "dots"],
   "display": ["character", "dots"],
-  "replace": ["characters", "{characters}"],
+  "replace": ["characters", "characters"],
   "context": ["test", "action"],
   "correct": ["test", "action"],
   "pass2": ["test", "action"],
@@ -194,6 +202,22 @@ class OpDialog(gtk.Dialog):
 
 class EditDialog(gtk.Dialog):
 	def __init__(self, opcode=None, operands=None):
+		self.opcode_valid_regexs = {
+			"character" : re.compile(r".|\\|\\f|\\n|\\r|\\s|\\t|\\v|\\e|\\(a|b|c|d|e|f|A|B|C|D|E|F){1,8}"),
+			"characters" : re.compile(r"(.|\\|\\f|\\n|\\r|\\s|\\t|\\v|\\e|\\(a|b|c|d|e|f|A|B|C|D|E|F){1,8})+"),
+			"filename" : re.compile(r".*"),
+			"dots" : re.compile(r"(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+"),
+			"name" : re.compile(r"([a-z]*[A-Z]*)*"),
+			"class" : re.compile(r"([a-z]*[A-Z]*)*"),
+			"test" : re.compile(r".*"),
+			"after" : re.compile(r"([a-z]*[A-Z]*)*"),
+			"letters" : re.compile(r"([a-z]*[A-Z]*)*"),
+			"number" : re.compile(r"[0-9]*"),
+			"dots,dots" : re.compile(r"(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+,(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+"),
+			"dots..." : re.compile(r"(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+(,(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+)*"),
+			"dotpattern..." : re.compile(r"(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+(,(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+)*"),
+			"dots[,dots]" : re.compile(r"(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+(,(0|1|2|3|4|5|6|7|8|9|-|a|b|c|d|e|f)+)?"),
+		}
 		self.opcode = opcode
 		self.entries = []
 		if self.opcode is None:
@@ -220,6 +244,8 @@ class EditDialog(gtk.Dialog):
 			hbox = gtk.HBox (False, 6)
 			label = gtk.Label (s)
 			entry = gtk.Entry()
+			entry.set_data("opcode", s)
+			entry.connect("insert-text", self.validate_text)
 			self.entries.append(entry)
 			if len(operands_list) > 0:
 				operand = ""
@@ -233,6 +259,7 @@ class EditDialog(gtk.Dialog):
 			hbox = gtk.HBox (False, 6)
 			label = gtk.Label ("Comments")
 			entry = gtk.Entry()
+			entry.set_data("opcode", "comments")
 			self.entries.append(entry)
 			operands_list.reverse()
 			entry.set_text (" ".join (operands_list).lstrip(" "))
@@ -253,6 +280,20 @@ class EditDialog(gtk.Dialog):
 			operands += e.get_text() + " " 
 		return operands
 
+	def validate_text(self, entry, string, len, position):
+		opcode = entry.get_data("opcode")
+		text = entry.get_text() + string
+		print text
+		if opcode == "opcode":
+			for o in opcodes.keys():
+				if o.find(text):
+					return
+		else:
+			m = self.opcode_valid_regexs[opcode].match(text)
+			if m and m.group() == text:
+				return
+
+		entry.emit_stop_by_name("insert-text")
 
 def row_clicked(view, event):
 	if event.type != gtk.gdk._2BUTTON_PRESS:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]