# What to Do with TinyMCE in Melange

  * Issue 306 (on Google Code) TinyMCE editor fails to meet **many** user needs, consider replacing with wiki (this issue contains many merged issues)

TinyMCE in Melange is horked as detailed in [Issue 306](http://code.google.com/p/soc/issues/detail?id=306). Let's talk about:

  1. options for replacing it
  1. feasibility of those options

It has been suggested that the most beneficial thing to do would be to make Melange accept wiki markup and dispense with other text editing functionality.

## Alternatives

  * HtmlBox
  * MarkDown
  * A wiki (using our own code and/or wikimarkup, wikimarkup is already in our libs).
  * _...add other alternatives considered here_

## Editing Requirements

_...to be agreed/confirmed_

The editor needs:

  * Standard formatting such as bold/italic/bullet-list/horizontal rule/tables.
  * Diffs for revision history
  * Images? (for screenshots)
  * Html links? (for links to supporting documentation)


## Diffs


diffs/versioning - is important for proposal changes, documentation changes

  * Diff would be possible whether or not we stay with TinyMCE
  * Ready made python diff code exists.  It's used in Rietveld. See also [difflib module](http://docs.python.org/library/difflib.html)
  * It would also be possible to write a diff that works in javascript, client side. See, for example [JSdifflib](http://snowtide.com/jsdifflib) and [John Resig's Diff algorithm](http://ejohn.org/files/jsdiff.js)

## Tiny?

TinyMCE is not so very tiny, and accounts for some of the initial start up time when the first page on melange is opened.  Thereafter most browsers re-use the existing cached files, so it is probably not slowing down the app on subsequent pages.

## Security?

Wiki, i.e. having python creating the html rather than storing the html directly might make it easier to overcome some kinds of scripting 'attacks'

  * Issue 448 (on Google Code) Mentor impersonation in proposal comments

However it is also possible (though possibly difficult to get 100% right) to strip 'bad html' from html.  Wiki and TinyMCE (or similar) are not mutually exclusive, and which to use could be a [UserPreferences](UserPreferences.md) option.  Clearly it is easier to support just one.