blob: bbe67d3cb78f4bff6d10526122316b2bd5d91b6e [file] [log] [blame]
attachDocumentEditor = function (editorElement, commitDialogElement)
{
var edit = require("./prosemirror/dist/edit")
require("./prosemirror/dist/inputrules/autoinput")
require("./prosemirror/dist/menu/menubar")
require("./prosemirror/dist/markdown")
var _menu = require("./prosemirror/dist/menu/menu")
var content = document.querySelector('#editor');
content.style.display = "none";
var gitblitCommands = new _menu.MenuCommandGroup("gitblitCommands");
var viewCommands = new _menu.MenuCommandGroup("viewCommands");
var textCommands = new _menu.MenuCommandGroup("textCommands");
var insertCommands = new _menu.MenuCommandGroup("insertCommands");
var menuItems = [gitblitCommands, viewCommands, textCommands, _menu.inlineGroup, _menu.blockGroup, _menu.historyGroup, insertCommands];
const updateCmd = Object.create(null);
updateCmd["GitblitCommit"] = {
label: "GitblitCommit",
run: function() {
commitDialogElement.modal({show:true});
editorElement.value = pm.getContent('markdown');
},
menu: {
group: "gitblitCommands", rank: 10,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-save"); }
}
}
};
updateCmd["FullScreen"] = {
label: "Toggle Fullscreen",
derive: "toggle",
run: function(pm) {
//Maintain the scroll context
var initialScroll = window.scrollY;
var navs = [document.querySelector("div.repositorynavbar"), document.querySelector("div.navbar"), document.querySelector("div.docnav")];
var offset = navs.reduce(function(p, c) { return p + c.offsetHeight; }, 0);
navs.forEach(function(e) { e.classList.toggle("forceHide"); });
if (!toggleFullScreen(document.documentElement)) {
offset = 60;
} else {
offset -= 60;
}
pm.signal("commandsChanged");
//Browsers don't seem to accept a scrollTo straight after a full screen
setTimeout(function(){window.scrollTo(0, Math.max(0,initialScroll - offset));}, 100);
},
menu: {
group: "viewCommands", rank: 11,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-arrows-alt"); }
}
},
active: function active(pm) { return getFullScreenElement() ? true : false; }
};
updateCmd["heading1"] = {
derive: "toggle",
run: function(pm) {
var selection = pm.selection;
var from = selection.from;
var to = selection.to;
var attr = {name:"make", level:"1"};
var node = pm.doc.resolve(from).parent;
if (node && node.hasMarkup(pm.schema.nodes.heading, attr)) {
return pm.tr.setBlockType(from, to, pm.schema.defaultTextblockType(), {}).apply(pm.apply.scroll);
} else {
return pm.tr.setBlockType(from, to, pm.schema.nodes.heading, attr).apply(pm.apply.scroll);
}
},
active: function active(pm) {
var node = pm.doc.resolve(pm.selection.from).parent;
if (node && node.hasMarkup(pm.schema.nodes.heading, {name:"make", level:"1"})) {
return true;
}
return false;
},
menu: {
group: "textCommands", rank: 1,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-header fa-header-x fa-header-1"); }
},
},
select: function(){return true;}
};
updateCmd["heading2"] = {
derive: "toggle",
run: function(pm) {
var selection = pm.selection;
var from = selection.from;
var to = selection.to;
var attr = {name:"make", level:"2"};
var node = pm.doc.resolve(from).parent;
if (node && node.hasMarkup(pm.schema.nodes.heading, attr)) {
return pm.tr.setBlockType(from, to, pm.schema.defaultTextblockType(), {}).apply(pm.apply.scroll);
} else {
return pm.tr.setBlockType(from, to, pm.schema.nodes.heading, attr).apply(pm.apply.scroll);
}
},
active: function active(pm) {
var node = pm.doc.resolve(pm.selection.from).parent;
if (node && node.hasMarkup(pm.schema.nodes.heading, {name:"make", level:"2"})) {
return true;
}
return false;
},
menu: {
group: "textCommands", rank: 2,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-header fa-header-x fa-header-2"); }
},
},
select: function(){return true;}
};
updateCmd["heading3"] = {
derive: "toggle",
run: function(pm) {
var selection = pm.selection;
var from = selection.from;
var to = selection.to;
var attr = {name:"make", level:"3"};
var node = pm.doc.resolve(from).parent;
if (node && node.hasMarkup(pm.schema.nodes.heading, attr)) {
return pm.tr.setBlockType(from, to, pm.schema.defaultTextblockType(), {}).apply(pm.apply.scroll);
} else {
return pm.tr.setBlockType(from, to, pm.schema.nodes.heading, attr).apply(pm.apply.scroll);
}
},
active: function active(pm) {
var node = pm.doc.resolve(pm.selection.from).parent;
if (node && node.hasMarkup(pm.schema.nodes.heading, {name:"make", level:"3"})) {
return true;
}
return false;
},
menu: {
group: "textCommands", rank: 3,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-header fa-header-x fa-header-3"); }
},
},
select: function(){return true;}
};
updateCmd["strong:toggle"] = {
menu: {
group: "textCommands", rank: 4,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-bold"); }
}
},
select: function(){return true;}
};
updateCmd["em:toggle"] = {
menu: {
group: "textCommands", rank: 5,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-italic"); }
}
},
select: function(){return true;}
};
updateCmd["code:toggle"] = {
menu: {
group: "textCommands", rank: 6,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-code"); }
}
},
select: function(){return true;}
};
updateCmd["image:insert"] = {
menu: {
group: "insertCommands", rank: 1,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-picture-o"); }
}
}
};
updateCmd["selectParentNode"] = {
menu: {
group: "insertCommands", rank: 10,
display: {
render: function(cmd, pm) { return renderFontAwesomeIcon(cmd, pm, "fa-arrow-circle-o-left"); }
}
}
};
var pm = window.pm = new edit.ProseMirror({
place: document.querySelector('#visualEditor'),
autoInput: true,
doc: content.value,
menuBar: { float:true, content: menuItems},
commands: edit.CommandSet.default.update(updateCmd),
docFormat: "markdown"
});
var scrollStart = document.querySelector(".ProseMirror").offsetTop;
var ticking = false;
window.addEventListener("scroll", function() {
var scrollPosition = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(function() {
if (!getFullScreenElement() && (scrollPosition > scrollStart)) {
document.querySelector(".ProseMirror-menubar").classList.add("scrolling");
} else {
document.querySelector(".ProseMirror-menubar").classList.remove("scrolling");
}
ticking = false;
});
}
ticking = true;
});
}
function renderFontAwesomeIcon(cmd, pm, classNames) {
var node = document.createElement("div");
node.className = "ProseMirror-icon";
var icon = document.createElement("i");
icon.setAttribute("class", "fa fa-fw " + classNames);
var active = cmd.active(pm);
if (active || cmd.spec.invert) node.classList.add("ProseMirror-menu-active");
node.appendChild(icon);
return node;
}
function getFullScreenElement() {
return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
}
function toggleFullScreen(e) {
if (getFullScreenElement()) {
if (document.exitFullscreen) { document.exitFullscreen(); }
else if (document.msExitFullscreen) { document.msExitFullscreen(); }
else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); }
else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); }
return true;
} else {
if (e.requestFullscreen) { e.requestFullscreen(); }
else if (e.msRequestFullscreen) { e.msRequestFullscreen(); }
else if (e.mozRequestFullScreen) { e.mozRequestFullScreen(); }
else if (e.webkitRequestFullscreen) { e.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); }
}
return false;
}
commitChanges = function() {
document.querySelector('form#documentEditor').submit();
}