view wiki.js @ 10:ec3ec75a8d16

The user can now 'zoom out' while editing by shift-clicking the edit field.
author Atul Varma <varmaa@toolness.com>
date Sun, 01 Feb 2009 16:04:18 -0800
parents 20ed90d10dee
children 98a77c9b13ea
line wrap: on
line source

var App = {
  eventHandlers: {}
};

App.eventHandlers.editPart = function editPart(aEvt) {
  if (!aEvt.shiftKey)
    return;

  aEvt.preventDefault();

  App.enterEditMode([this], 1);
};

App.enterEditMode = function enterEditMode(parts, level) {
  var partsMarkup = [];
  $(".creole-markup", parts).each(
    function(i) { partsMarkup.push($(this).text()); }
  );

  var editablePart = $('<textarea class="wiki-edit"></textarea>');
  $(editablePart).attr("value", partsMarkup.join("\n\n"));

  function setScrollHeight() {
    $(this).height(this.scrollHeight);
  }

  function exitEditMode() {
      var markup = $(this).attr("value");
      $(this).replaceWith(App.createParts(markup));
  }

  function editSiblings(aEvt) {
    if (!aEvt.shiftKey || level == 0)
      return;

    aEvt.preventDefault();

    var allSiblings = this.parentNode.childNodes;
    exitEditMode.apply(this);

    App.enterEditMode(allSiblings, level-1);
  }

  $(editablePart).blur(exitEditMode);
  $(editablePart).mousedown(editSiblings);
  $(editablePart).keyup(setScrollHeight);
  $(parts).filter(":not(:first)").remove();
  $(parts).replaceWith(editablePart);
  setScrollHeight.apply(editablePart);

  $(editablePart).focus();
};

App.createPart = function createPart(markup) {
  var partDiv = $('<div class="part"></div>');
  var markupDiv = $('<div class="creole-markup"></div>');
  markupDiv.text(markup);
  App.creole.parse(partDiv.get(0), markup);
  partDiv.mousedown(App.eventHandlers.editPart);
  partDiv.append(markupDiv);
  return partDiv.get(0);
};

App.createParts = function createParts(text) {
  var parts = [];

  var partsMarkup = text.split("\n\n");
  jQuery.each(
    partsMarkup,
    function(i) {
      var partMarkup = this.toString();
      if (partMarkup)
        parts.push(App.createPart(partMarkup));
    }
  );

  return parts;
};

App.eventHandlers.onLoad = function onLoad() {
  var creole = new Parse.Simple.Creole(
    {interwiki: {
       WikiCreole: 'http://www.wikicreole.org/wiki/',
       Wikipedia: 'http://en.wikipedia.org/wiki/'
     },
     linkFormat: ''
    });

  App.creole = creole;

  jQuery.get("wiki.txt",
             {},
             function(text) {
               $("#content").append(App.createParts(text));
             },
             "text");
};

$(window).ready(App.eventHandlers.onLoad);