zim-wiki team mailing list archive
-
zim-wiki team
-
Mailing list archive
-
Message #00785
Ideas about embedding custom objects in PageView
Hi everybody.
I have some ideas about embedding custom objects in PageView, but I'm a beginner in Python and I don't have any experiences with the whole TextView stuff. I wonder if somebody could try to implement it. A custom object is a object which can't be rendered directly by TextView, inserting a GTK widget into TextView is needed. See examples bellow.
I. Wiki syntax
Example 1: tables
{{{Table:
| foo | bar | baz |
| foo | bar | baz |
}}}
* Example 2: source code snippets
{{{Source: lang="python" linenumbers="true"
import gtk
w=gtk.Window()
...
w.show_all()
gtk.main()
}}}
* Example 3: LaTeX without external *.tex file
{{{LaTeX:
\bold{moo}
}}}
* Example 4: Dummy object for further explanation
{{{AnotherObject: name="foo" attr2="bar" attr3="baz"
some data
}}}
II. ParseTree representation
In ParseTree it could be represented by element 'object':
builder.start('object', {'objectname':'AnotherObject', 'name':'foo', 'attr2':'bar', 'attr3':'baz'})
builder.data('some data')
builder.end('object')
III. Rendering and manipulating with data
Rendering and manipulating with object's data is provided by ObjectManager class.
class AnotherObjectManager(ObjectManagerClass):
# ObjectManagerClass is an abstract class
def __init__(self, attrs):
self.attrs=attrs
# initiate gui
self.entry=gtk.Entry()
def set_data(self, data):
# parse data and fill the gui
self.entry.set_text(data)
def get_data(self):
#get data from gui and dump them
return self.entry.get_text()
def get_widget(self):
# return widget to be
# included in PageView
return self.entry
def export(self, format):
# exporting object,
# returns None if format is not
# supported by this ObjectManager
# and the fallback should be verbatim
# paragraph
if format == 'html':
return '<input name="'+
self.attrs['name']+
'" value="'+self.get_data()+'">'
else: return None
IV. Registering of ObjectManager
It should be some mechanism to register ObjectManager easily by plugins.
# zim/plugins/anotherobject.py
class AnotherObjectPlugin(PluginClass):
def __init__(self, ui):
PluginClass.__init__(self, ui)
...
ui.register_object_manager('AnotherObject', AnotherObjectManager)
...
The fallback for unknown object could be verbatim paragraph.
V. Insertion into PageView
if ObjectManager for current object is registered:
manager = ObjectManager(attrs)
manager.set_data(data)
widget=manager.get_widget()
Insert widget into PageView
else:
Fallback to verbatim paragraph
(whole {{{ }}} block to preserve
objectname and attrs)
VI. Conclusion
This feature is very complex, but it will allow to write variety of new plugins.
Best regards
-- Jiří Janoušek
Attachment:
pgpE6WRiY5o9T.pgp
Description: PGP signature
Follow ups