Annotation of kupu/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>