Annotation of kupu/doc/CUSTOMIZING.txt, revision 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>