Annotation of kupuMPIWG/doc/CUSTOMIZING.txt, revision 1.1.1.1
1.1 dwinter 1: ================
2: Customizing Kupu
3: ================
4:
5: XXX - cover customizing a feature (templating system)
6:
7: Abstract
8: --------
9:
10: This is a document describing in detail how to customize Kupu on
11: different levels: using CSS and HTML to change or remove parts of the
12: UI, overriding initKupu() to reduce or extend the amount of tools used
13: and hook in custom tools, writing tools and overriding default Kupu
14: behaviour.
15:
16: Sidenote: in the Kupu package there's a subdirectory called 'silva'
17: which contains the customizing code used for a Zope based CMS (well,
18: not strictly but anyway ;) called 'Silva'. This code uses all the
19: customization techniques described below, and can serve as an example
20: for how to perform heavy customizations.
21:
22: Integration and customization
23: -----------------------------
24:
25: Kupu is a feature-rich WYSIWYG editor and will provide a lot of
26: ready-to-use features out-of-the-box. When one takes the default
27: generated file kupu.html one doesn't have to change anything to use
28: those features, but in a real-life situation, where issues like the
29: available amount of real-estate, the capabilites of the back-end or
30: even the expected knowledge of the users can play important roles,
31: integrators will most likely want to perform some customization. The
32: Kupu developers have tried to make customization clean and clear, and
33: to provide different ways of doing customization, either changing the
34: HTML or CSS for small customization (we understand most people
35: deploying a tool like Kupu will usually not want to hack JavaScript,
36: so in most cases customizing Kupu should not involve any programming)
37: or overriding core Kupu functionality using JavaScript.
38:
39: Configuration
40: -------------
41:
42: Even though it really doesn't belong in this document, we would like
43: to mention configuration options as well, since they can be really
44: useful for people who want to perform customizations, and we don't
45: want to overlook them, ending up doing things from JavaScript that can
46: easily be changed in the configuration... ;) Unless special features
47: are included, Kupu has a very limited set of configuration options,
48: which can all be set through inline XML 'islands' within the document
49: containing Kupu.
50:
51: ===================== ================================================
52: Directive Possible values
53: ===================== ================================================
54: src the source URL of the document
55: dst the URL to PUT to (not used for POST setups)
56: use_css whether Kupu should try to (it will succeed in
57: Mozilla use CSS for bold, italic etc. rather
58: then plain <b>, <i> or <strong>, <em> tags
59: reload_after_save whether Kupu should reload the iframe's content
60: after saving, or keep it in tact, retaining
61: cursor position, selection etc. (the last is
62: obviously the nicest)
63:
64: strict_output when set to 1, Kupu will send a full XHTML
65: compliant document, including document type
66: declaration and xmlns namespace declaration to
67: the server
68: ===================== ================================================
69:
70: CSS customization
71: -----------------
72:
73: If an integrator wants to customize small issues, like the image of a
74: toolbar button, the font of a toolbox but also whether a toolbox or a
75: button should appear in the client's page, he can modify the
76: CSS. There's one main CSS, kupustyles.css, which contains classnames
77: or ids for each button and toolbar. To change a color, image or font
78: of that element, just override the CSS for the class or id that points
79: to that element (note that classes are sometimes chosen where ids seem
80: more appropriate, this is because one can do more with CSS classes
81: from JavaScript: when dynamically changing an id of an element, any
82: CSS directives connected to that id will not be performed, when doing
83: so with a class instead the CSS directives *will* be performed),
84: perferrably in another CSS file (having a seperate CSS file for
85: overriding CSS will improve maintainability: when you upgrade from an
86: already customized Kupu to a newer version you don't have to modify
87: the core's CSS).
88:
89: To remove an element from the page easily, you can add 'display: none'
90: as a style directive for the element, it will be hidden from
91: view. Note that it is also possible to remove the complete tool from
92: the view using JavaScript, which has the advantage that less data has
93: to be sent to the client and the HTML will become a bit smaller, but
94: is a bit harder.
95:
96: Changing initKupu
97: -----------------
98:
99: In one of the JavaScript files, kupuinit.js, there's a function called
100: initKupu(). Here's where the bootstrapping takes place: the editor is
101: instantiated and configuration and a logger are fed to it, the
102: contextmenu and the tools are instantiated and registered etc. If you
103: want to override or completely remove tools and context menu etc. from
104: Kupu, you will need to override (probably copy and change) this
105: function. When you want to remove a tool from Kupu, remove the lines
106: in which it is instantiated and registered from your custom
107: initKupu. When you subclass an existing tool or want to plug in your
108: own, copy the lines of code used to instantiate an existing tool and
109: change them. Since Kupu is still in development (even thought we
110: passed 1.0 a while ago, unfortunatly it showed things aren't
111: completely the way they should be, hopefully at some point the API and
112: core will be frozen for a while) you can expect customized initKupu's
113: need modification after an Kupu upgrade. For instance, in 1.0.1 a
114: toolbox was reflected by 1 JavaScript class, nowadays there's a
115: seperate class for the functionality of that tool and one for the UI
116: elements. The initKupu functions that are written for 1.0.1 need to be
117: modified to reflect this change. If you override this function, before
118: starting an upgrade be sure to check out the documentation or the
119: mailinglist, where changes that break customized initKupu functions
120: will be mentioned.
121:
122: Removing or changing tools
123: --------------------------
124:
125: As mentioned in the previous paragraph, to remove a tool from Kupu
126: completely you can just remove the lines in which it (and it's UI
127: element) is instantiated. However, in some cases you will want to use
128: or re-use the functionality of the tool class and get rid of or
129: override the UI element. If you don't want the UI toolbox element of
130: the TableTool to be part of the HTML, but *do* want the contextmenu's
131: table functionality available (which is also provided via the tools),
132: the UI element shouldn't be visible but the tool itself should be
133: available. This case could be solved using CSS (display: none) but if
134: you have an overridden initKupu anyway, or if you really appreciate
135: clean HTML it can be done using initKupu as well, by just not
136: registering the UI element (TableToolBox) to the tool (TableTool).
137: When you want to change the UI part of a tool, or want to override
138: such a toolbox you can just register it to the tool in a similar way.
139:
140: The KupuTool and KupuToolBox APIs
141: ---------------------------------
142:
143: For a reference of the KupuTool and KupuToolBox API's, see
144: JSAPI.txt. For a description of how to write them, see EXTENDING.txt.
145:
146: Overriding KupuEditor methods
147: -----------------------------
148:
149: To override methods on the KupuEditor object, you can either attach a
150: method with the name of the one to override to the prototype of the
151: class or create a subclass. We did our best to make the API available
152: on this core object clean and small, and to keep the methods single
153: operations as much as possible, so overriding a method on this object
154: usually won't involve much code duplication. Note: unfortunately this
155: is not really the case for saveDocument (although I guess the need for
156: overriding this is a lot smaller now that prepareForm is available ;)
157: and especially not for insertNodeAtSelection (if someone wants to
158: rewrite that to something a bit more compact, please do! ;).
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>