2015-05-03 21:50:25 -07:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
(function main() {
|
|
|
|
// DOM elements
|
|
|
|
var markdown = document.getElementById("markdown");
|
|
|
|
var markup = document.getElementById("markup");
|
|
|
|
var numbered = document.getElementById("numbered");
|
|
|
|
var violations = document.getElementById("violations");
|
|
|
|
var form = document.getElementsByTagName("form")[0];
|
|
|
|
var openFile = document.getElementById("openFile");
|
|
|
|
|
2015-05-05 00:00:04 -07:00
|
|
|
// Variables
|
2015-05-03 21:50:25 -07:00
|
|
|
var markdownit = window.markdownit();
|
|
|
|
var newLineRe = /\r\n|\r|\n/;
|
2015-05-05 00:00:04 -07:00
|
|
|
var rulesMd = "https://github.com/DavidAnson/markdownlint" +
|
|
|
|
"/blob/master/doc/Rules.md";
|
2015-05-03 21:50:25 -07:00
|
|
|
|
|
|
|
// Handle input
|
|
|
|
function onMarkdownInput() {
|
|
|
|
// Markdown
|
|
|
|
var content = markdown.value;
|
|
|
|
// Markup
|
|
|
|
markup.innerHTML = markdownit.render(content);
|
|
|
|
// Numbered
|
2015-05-05 00:00:04 -07:00
|
|
|
var lines = content.split(newLineRe);
|
|
|
|
var padding = lines.length.toString().replace(/\d/g, " ");
|
|
|
|
numbered.innerHTML = lines
|
2015-05-03 21:50:25 -07:00
|
|
|
.map(function mapNumberedLine(line, index) {
|
2015-05-05 00:00:04 -07:00
|
|
|
index++;
|
|
|
|
var paddedIndex = (padding + index).slice(-padding.length);
|
|
|
|
return "<span id='l" + index + "'><em>" + paddedIndex + "</em>: " +
|
|
|
|
line + "</span>";
|
2015-05-03 21:50:25 -07:00
|
|
|
}).join("\n");
|
|
|
|
// Violations
|
|
|
|
var options = {
|
|
|
|
"strings": {
|
|
|
|
"content": content
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var results = window.markdownlint.sync(options).toString();
|
2015-05-05 00:00:04 -07:00
|
|
|
violations.innerHTML = results.split(newLineRe)
|
2015-05-03 21:50:25 -07:00
|
|
|
.map(function mapResultLine(line) {
|
2015-05-05 00:00:04 -07:00
|
|
|
return line.replace(/^content: (\d+): (MD\d\d\d) (.*)$/,
|
|
|
|
function replacer(match, p1, p2, p3) {
|
|
|
|
var ruleRef = rulesMd + "#" + p2.toLowerCase() + "---" +
|
|
|
|
p3.toLowerCase().replace(/ /g, "-");
|
2015-05-06 09:16:24 -07:00
|
|
|
return " <a href='#" + p1 + "'><em>" + p1 + "</em></a> - " +
|
2015-05-05 00:00:04 -07:00
|
|
|
"<a href='" + ruleRef + "' target='_blank'>" + p2 + "</a> " + p3;
|
|
|
|
});
|
|
|
|
}).join("<br/>");
|
2015-05-03 21:50:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Load from a string or File object
|
|
|
|
function loadMarkdown(source) {
|
|
|
|
// Reset input element
|
|
|
|
form.reset();
|
|
|
|
if (typeof source === "string") {
|
|
|
|
// Update from string
|
|
|
|
markdown.value = source;
|
|
|
|
onMarkdownInput();
|
|
|
|
} else {
|
|
|
|
// Update from File object
|
|
|
|
var reader = new FileReader();
|
|
|
|
reader.onload = function readerOnload(e) {
|
|
|
|
markdown.value = e.target.result;
|
|
|
|
onMarkdownInput();
|
|
|
|
};
|
|
|
|
reader.readAsText(source);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle drag-and-drop
|
|
|
|
function onDragOver(e) {
|
|
|
|
if (e.dataTransfer && e.dataTransfer.dropEffect) {
|
|
|
|
e.dataTransfer.dropEffect = "link";
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function onDrop(e) {
|
|
|
|
if (e.dataTransfer && e.dataTransfer.files) {
|
|
|
|
loadMarkdown(e.dataTransfer.files[0]);
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle file open
|
|
|
|
function onOpenFileChange(e) {
|
|
|
|
if (e.target && e.target.files) {
|
|
|
|
loadMarkdown(e.target.files[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-05 00:00:04 -07:00
|
|
|
// Handle violation navigation
|
|
|
|
function onLineNumberClick(e) {
|
|
|
|
var line = document.getElementById("l" + e.target.innerText);
|
|
|
|
if (line) {
|
|
|
|
var highlighted = document.getElementsByClassName("highlight");
|
|
|
|
Array.prototype.forEach.call(highlighted, function forElement(element) {
|
|
|
|
element.classList.remove("highlight");
|
|
|
|
});
|
|
|
|
line.classList.add("highlight");
|
|
|
|
line.scrollIntoView();
|
|
|
|
e.preventDefault();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-03 21:50:25 -07:00
|
|
|
// Add event listeners
|
|
|
|
document.body.addEventListener("dragover", onDragOver);
|
|
|
|
document.body.addEventListener("drop", onDrop);
|
|
|
|
openFile.addEventListener("change", onOpenFileChange);
|
|
|
|
markdown.addEventListener("input", onMarkdownInput);
|
2015-05-05 00:00:04 -07:00
|
|
|
violations.addEventListener("click", onLineNumberClick, true);
|
2015-05-03 21:50:25 -07:00
|
|
|
}());
|