The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
// requires humane and pagedown

// General functions

function sendViaWS (url, payload, success, failure) {
  var serialized = JSON.stringify(payload);
  var ws;
  if ( "WebSocket" in window ) {
    ws = new WebSocket(url);
  } else {
    humane.log( 'Error: Your browser does not support websockets.' );
    return;
  }
  ws.onmessage = function (evt) {
    var data = JSON.parse(evt.data);
    //console.log( data );

    if ( data.message ) {
      humane.log( data.message );
    }

    // handle success or failure callbacks
    if ( data.success && success ) {
      success( data );
    } else if ( !data.success && failure) {
      failure( data );
    }

    ws.close();
  };
  ws.onopen = function () {
    //console.log( "Sending ==> " + serialized );
    ws.send( serialized );
  };
}

// Editor class

function Editor (name, url, sanitize, pagedown_extra_options) {
  this.url = url;   
  var data = {
    name  : name,
    md    : "",
    html  : "",
    title : ""
  };
  this.data = data;

  // setup the pagedown editor

  // be sure to default to sanitizing
  sanitize = (typeof sanitize === "undefined") ? true : sanitize;

  var converter = sanitize
    ? Markdown.getSanitizingConverter()
    : new Markdown.Converter();
  var extra = Markdown.Extra.init(converter, pagedown_extra_options);

  var editor = new Markdown.Editor(converter);
  converter.hooks.chain("preConversion", function (text) {
    data.md = text;
    return text; 
  });
  converter.hooks.chain("postConversion", function (text) {
    // codeblock of original pagedown looks little differ rather than
    // fenced code block of pagedown-extra so need little fix
    var preclass = extra.googleCodePrettify ? ' class="prettyprint"' : extra.highlightJs ? ' class="hljs"' : '';
    text = text.replace(/<pre><code>/g, "<pre" + preclass + "><code>");

    data.html = text;
    return text; 
  });
  editor.run();

  this.converter = converter;
}

Editor.prototype.save = function (title) {
  this.data.title = title;
  sendViaWS(this.url, this.data);
};