1 from xml
.dom
import XMLNS_NAMESPACE
, XML_NAMESPACE
2 from constants
import DOME_NS
3 from Ft
.Xml
.XPath
import FT_EXT_NAMESPACE
8 fixed_ns
= {'xml': XML_NAMESPACE
, 'xmlns': XMLNS_NAMESPACE
,
9 'ext': FT_EXT_NAMESPACE
,
12 common_ns
= {'http://www.w3.org/1999/xhtml': 'xhtml',
13 'http://www.w3.org/1999/02/22-rdf-syntax-ns#': 'rdf',
14 'http://xmlns.4suite.org/ext': 'ft',
15 'http://www.w3.org/1999/XSL/Transform': 'xsl',
16 'http://www.w3.org/2001/XMLSchema': 'xsd',
17 'http://www.w3.org/1999/XMLSchema-instance': 'xsi',
18 'http://schemas.xmlsoap.org/soap/envelope/': 'env',
19 'http://www.w3.org/1999/xlink': 'xlink'}
21 class Namespaces(g
.GenericTreeModel
):
23 g
.GenericTreeModel
.__init
__(self
)
24 self
.uri
= dict(fixed_ns
)
27 def update_list(self
):
28 self
.list = self
.uri
.keys()
30 pre
= self
.prefix
= {}
31 for p
, u
in self
.uri
.iteritems():
34 def on_get_n_columns(self
):
37 def on_get_iter(self
, path
):
41 def on_get_value(self
, iter, column
):
43 return self
.list[iter]
44 return self
.uri
[self
.list[iter]]
46 def on_iter_nth_child(self
, iter, n
):
51 def on_get_column_type(self
, col
):
54 def on_iter_has_child(self
, iter):
57 def on_iter_next(self
, iter):
58 if iter < len(self
.list) - 1:
61 def __setitem__(self
, prefix
, uri
):
62 if prefix
in self
.uri
and self
.uri
[prefix
] == uri
:
66 if prefix
in fixed_ns
:
67 raise Exception('That namespace prefix cannot be changed')
68 if uri
in self
.prefix
:
69 raise Exception('That namespace already has a prefix (%s)' % self
.prefix
[uri
])
71 modifed
= prefix
in self
.uri
73 self
.uri
[prefix
] = uri
75 path
= (self
.list.index(prefix
),)
78 self
.emit('row-changed', path
, self
.get_iter(path
))
80 self
.emit('row-inserted', path
, self
.get_iter(path
))
82 def __delitem__(self
, iter):
83 prefix
= self
[iter][0]
84 if prefix
in fixed_ns
:
85 raise Exception('This is a built-in namespace and cannot be deleted')
86 path
= (self
.list.index(prefix
),)
89 self
.emit('row-deleted', path
)
91 def ensure_ns(self
, suggested_prefix
, uri
):
92 """Return the prefix for this URI. If none is set choose one (using suggested_prefix
95 return self
.prefix
[uri
]
97 if not suggested_prefix
:
98 suggested_prefix
= common_ns
.get(uri
, 'ns')
99 if suggested_prefix
in self
.uri
:
101 while suggested_prefix
+ `x`
in self
.uri
: x
+= 1
102 suggested_prefix
+= `x`
103 self
[suggested_prefix
] = uri
104 #print "Added", suggested_prefix, uri
105 return suggested_prefix
107 def to_xml(self
, doc
):
108 node
= doc
.createElementNS(DOME_NS
, 'dome:namespaces')
109 for prefix
, uri
in self
.uri
.iteritems():
110 if prefix
in fixed_ns
: continue
111 ns
= doc
.createElementNS(DOME_NS
, 'dome:ns')
112 ns
.setAttributeNS(None, 'prefix', prefix
)
113 ns
.setAttributeNS(None, 'uri', uri
)
117 class GUI(rox
.Dialog
):
118 def __init__(self
, model
):
119 rox
.Dialog
.__init
__(self
)
122 self
.add_button(g
.STOCK_ADD
, 1)
123 self
.add_button(g
.STOCK_DELETE
, 2)
124 self
.add_button(g
.STOCK_CLOSE
, g
.RESPONSE_OK
)
126 tree
= g
.TreeView(model
.namespaces
)
128 def response(dialog
, resp
):
130 dialog
.add_new(model
.namespaces
)
132 dialog
.delete_selected(tree
.get_selection())
135 self
.connect('response', response
)
136 self
.set_position(g
.WIN_POS_MOUSE
)
137 self
.set_title('Namespaces for ' + `model
.uri`
)
141 frame
.set_shadow_type(g
.SHADOW_IN
)
143 cell
= g
.CellRendererText()
144 column
= g
.TreeViewColumn('Prefix', cell
, text
= 0)
145 tree
.append_column(column
)
147 column
= g
.TreeViewColumn('URI', cell
, text
= 1)
148 tree
.append_column(column
)
152 self
.vbox
.pack_start(frame
, True, True)
153 self
.set_default_size(400, 200)
155 self
.set_has_separator(False)
157 def delete_selected(self
, sel
):
158 model
, iter = sel
.get_selected()
160 rox
.alert('Select a namespace binding to delete')
165 rox
.report_exception()
167 def add_new(self
, ns
):
170 hbox
= g
.HBox(False, 2)
171 d
.vbox
.pack_start(hbox
, False, True)
172 hbox
.pack_start(g
.Label('Prefix:'), False, True, 0)
174 hbox
.pack_start(prefix
, True, True, 0)
176 def check_prefix(entry
):
177 if not uri
.get_text():
178 pre
= prefix
.get_text()
179 for u
, p
in common_ns
.iteritems():
185 prefix
.connect('activate', check_prefix
)
187 hbox
= g
.HBox(False, 2)
188 d
.vbox
.pack_start(hbox
, False, True)
189 hbox
.pack_start(g
.Label('Namespace URI:'), False, True, 0)
191 hbox
.pack_start(uri
, True, True, 0)
192 uri
.set_activates_default(True)
195 d
.set_position(g
.WIN_POS_MOUSE
)
199 d
.add_button(g
.STOCK_CANCEL
, g
.RESPONSE_CANCEL
)
200 d
.add_button(g
.STOCK_OK
, g
.RESPONSE_OK
)
202 d
.set_default_response(g
.RESPONSE_OK
)
205 if d
.run() != g
.RESPONSE_OK
:
209 ns
[prefix
.get_text()] = uri
.get_text()
212 rox
.report_exception()