1 from xml
.dom
import Node
, minidom
3 import rox
, os
, pango
, sys
, textwrap
11 RESPONSE_SAVE_AND_TEST
= 0
13 gladefile
= os
.path
.join(rox
.app_dir
, '0publish-gui.glade')
16 tree
= gtk
.glade
.XML(gladefile
, 'no_file_specified')
17 box
= tree
.get_widget('no_file_specified')
18 tree
.get_widget('new_button').grab_focus()
22 chooser
= g
.FileChooserDialog('Choose a location for the new feed',
23 None, g
.FILE_CHOOSER_ACTION_SAVE
)
24 chooser
.set_current_name('MyProg.xml')
25 chooser
.add_button(g
.STOCK_CANCEL
, g
.RESPONSE_CANCEL
)
26 chooser
.add_button(g
.STOCK_NEW
, g
.RESPONSE_OK
)
28 chooser
= g
.FileChooserDialog('Choose the feed to edit',
29 None, g
.FILE_CHOOSER_ACTION_OPEN
)
30 chooser
.add_button(g
.STOCK_CANCEL
, g
.RESPONSE_CANCEL
)
31 chooser
.add_button(g
.STOCK_OPEN
, g
.RESPONSE_OK
)
34 chooser
.set_default_response(g
.RESPONSE_OK
)
35 if chooser
.run() != g
.RESPONSE_OK
:
37 path
= chooser
.get_filename()
39 return FeedEditor(path
)
41 emptyFeed
= """<?xml version='1.0'?>
42 <interface xmlns="%s">
45 """ % (XMLNS_INTERFACE
)
48 def __init__(self
, pathname
):
49 self
.pathname
= pathname
51 self
.wTree
= gtk
.glade
.XML(gladefile
, 'main')
52 self
.window
= self
.wTree
.get_widget('main')
53 self
.window
.connect('destroy', rox
.toplevel_unref
)
55 help = gtk
.glade
.XML(gladefile
, 'main_help')
56 help_box
= help.get_widget('main_help')
57 help_box
.set_default_size(g
.gdk
.screen_width() / 4,
58 g
.gdk
.screen_height() / 4)
59 help_box
.connect('delete-event', lambda box
, ev
: True)
60 help_box
.connect('response', lambda box
, resp
: box
.hide())
63 if resp
== g
.RESPONSE_HELP
:
65 elif resp
== RESPONSE_SAVE_AND_TEST
:
67 elif resp
== RESPONSE_SAVE
:
71 self
.window
.connect('response', resp
)
74 keys
= signing
.get_secret_keys()
75 key_menu
= self
.wTree
.get_widget('feed_key')
76 key_model
= g
.ListStore(str, str)
77 key_menu
.set_model(key_model
)
78 cell
= g
.CellRendererText()
79 cell
.set_property('ellipsize', pango
.ELLIPSIZE_MIDDLE
)
80 key_menu
.pack_start(cell
)
81 key_menu
.add_attribute(cell
, 'text', 1)
83 key_model
.append((None, '(unsigned)'))
87 if os
.path
.exists(self
.pathname
):
88 data
, _
, self
.key
= signing
.check_signature(self
.pathname
)
89 self
.doc
= minidom
.parseString(data
)
92 self
.doc
= minidom
.parseString(emptyFeed
)
94 key_menu
.set_active(0)
96 def update_fields(self
):
97 root
= self
.doc
.documentElement
100 value
= singleton_text(root
, name
)
102 self
.wTree
.get_widget('feed_' + name
).set_text(value
)
107 for icon
in children(root
, 'icon'):
108 if icon
.getAttribute('type') == 'image/png':
109 href
= icon
.getAttribute('href')
110 self
.wTree
.get_widget('feed_icon').set_text(href
)
113 description
= singleton_text(root
, 'description') or ''
114 paragraphs
= [format_para(p
) for p
in description
.split('\n\n')]
115 buffer = self
.wTree
.get_widget('feed_description').get_buffer()
116 buffer.delete(buffer.get_start_iter(), buffer.get_end_iter())
117 buffer.insert_at_cursor('\n'.join(paragraphs
))
119 key_menu
= self
.wTree
.get_widget('feed_key')
120 model
= key_menu
.get_model()
124 if line
[0] == self
.key
:
128 model
.append((self
.key
, 'Missing key (%s)' % self
.key
))
129 key_menu
.set_active(i
)
131 key_menu
.set_active(0)
133 def update_doc(self
):
134 root
= self
.doc
.documentElement
135 def update(name
, required
= False, attrs
= {}, value_attr
= None):
136 widget
= self
.wTree
.get_widget('feed_' + name
)
137 if isinstance(widget
, g
.TextView
):
138 buffer = widget
.get_buffer()
139 text
= buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter())
140 paras
= ['\n'.join(textwrap
.wrap(para
, 80)) for para
in text
.split('\n') if para
.strip()]
141 value
= '\n' + '\n\n'.join(paras
)
143 value
= widget
.get_text()
144 elems
= list(children(root
, name
, attrs
= attrs
))
149 elem
= create_element(root
, name
,
150 before
= ['group', 'implementation', 'requires'])
152 elem
.setAttribute(x
, attrs
[x
])
154 elem
.setAttribute(value_attr
, value
)
157 set_data(elem
, value
)
160 raise Exception('Missing required field "%s"' % name
)
165 update('summary', True)
166 update('description', True)
168 update('icon', attrs
= {'type': 'image/png'}, value_attr
= 'href')
170 uri
= self
.wTree
.get_widget('feed_url').get_text()
172 root
.setAttribute('uri', uri
)
173 elif root
.hasAttribute('uri'):
174 root
.removeAttribute('uri')
179 sign
= signing
.sign_xml
181 sign
= signing
.sign_unsigned
182 data
= self
.doc
.toxml()
183 sign(self
.pathname
, data
, self
.key
)