[dots/remove-assistant: 21/38] table_editor: input validation
- From: Fernando Herrera de las Heras <fherrera src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dots/remove-assistant: 21/38] table_editor: input validation
- Date: Thu, 15 Jul 2010 21:08:45 +0000 (UTC)
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]