prettier/website/static/playground.js

298 lines
7.9 KiB
JavaScript
Raw Normal View History

/* eslint-env browser */
/* eslint no-var: off, strict: off, prefer-arrow-callback: off */
2017-09-14 01:14:35 +03:00
/* global Clipboard CodeMirror formatMarkdown */
var prettierVersion = "?";
var inputEditor;
var docEditor;
var astEditor;
var outputEditor;
var output2Editor;
2017-09-13 22:14:51 +03:00
var OPTIONS = [
"printWidth",
"tabWidth",
"singleQuote",
"trailingComma",
"bracketSpacing",
"jsxBracketSameLine",
"parser",
"semi",
"useTabs",
"doc",
"ast",
"output2"
2017-09-13 22:14:51 +03:00
];
var IDEMPOTENT_MESSAGE = "✓ Second format is unchanged.";
var state = (function loadState(hash) {
try {
return JSON.parse(hash);
} catch (error) {
return {
options: undefined,
content:
'hello ( "world"\n);\n\n' +
'[ "lorem", "ipsum", \'dolor\', sit("amet"), consectetur[ \'adipiscing\' ] + "elit" ].reduce(\n (first, second) => first + second,\n "")\n\n' +
"const Foo = ({ bar, baz, things }) => {\n" +
' return <div style={{\ncolor: "papayawhip"}}>\n' +
" <br/>{things.map(thing => reallyLongPleaseDontPutOnOneLine(thing) ? <p>{ok}</p> : <Quax bar={bar} baz={ baz } {...thing}></Quax>)\n" +
" }</div>}"
};
}
})(decodeURIComponent(location.hash.slice(1)));
var worker = new Worker("/worker.js");
worker.onmessage = function(message) {
if (prettierVersion === "?") {
prettierVersion = message.data.version;
2017-09-13 22:14:51 +03:00
document.getElementById("version").textContent = prettierVersion;
}
if (outputEditor && docEditor && astEditor) {
outputEditor.setValue(message.data.formatted);
docEditor.setValue(message.data.doc || "");
astEditor.setValue(message.data.ast || "");
output2Editor.setValue(
message.data.formatted === ""
? ""
: message.data.formatted2 === message.data.formatted
? IDEMPOTENT_MESSAGE
: message.data.formatted2 || ""
);
2017-09-13 22:14:51 +03:00
document.getElementById("button-report-issue").search =
2017-09-14 01:14:35 +03:00
"body=" + encodeURIComponent(createMarkdown(true));
}
};
// Warm up the worker (load the current parser while CodeMirror loads)
worker.postMessage({ text: "", options: state.options });
window.onload = function() {
state.options && setOptions(state.options);
CodeMirror.modeURL =
"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.26.0/mode/%N/%N.js";
2017-09-12 21:59:23 +03:00
var theme = "neat";
var editorOptions = {
lineNumbers: true,
keyMap: "sublime",
autoCloseBrackets: true,
matchBrackets: true,
showCursorWhenSelecting: true,
2017-09-12 21:59:23 +03:00
theme: theme,
tabWidth: 2
};
inputEditor = CodeMirror.fromTextArea(
document.getElementById("input-editor"),
editorOptions
);
inputEditor.on("change", formatAsync);
docEditor = CodeMirror.fromTextArea(document.getElementById("doc-editor"), {
readOnly: true,
lineNumbers: false,
theme: theme
});
astEditor = CodeMirror.fromTextArea(document.getElementById("ast-editor"), {
readOnly: true,
lineNumbers: false,
theme: theme
});
outputEditor = CodeMirror.fromTextArea(
document.getElementById("output-editor"),
2017-09-12 21:59:23 +03:00
{ readOnly: true, lineNumbers: true, theme: theme }
);
output2Editor = CodeMirror.fromTextArea(
document.getElementById("output2-editor"),
{ readOnly: true, lineNumbers: true, theme: theme }
);
2017-09-12 21:59:23 +03:00
setCodemirrorMode(docEditor, "javascript");
setCodemirrorMode(astEditor, "javascript");
2017-09-13 22:14:51 +03:00
var editors = document.querySelectorAll(".editor");
for (var i = 0; i < editors.length; i++) {
editors[i].classList.remove("loading");
}
inputEditor.setValue(state.content);
document.querySelector(".options-container").onchange = formatAsync;
2017-09-13 22:14:51 +03:00
document.getElementById("button-clear").onclick = function() {
inputEditor.setValue("");
};
var clipboard = new Clipboard("#button-copy-link, #button-copy-markdown", {
text: function(trigger) {
switch (trigger.id) {
case "button-copy-link":
return window.location.href;
case "button-copy-markdown":
return createMarkdown();
default:
return "";
}
}
});
clipboard.on("success", function(e) {
showTooltip(e.trigger, "Copied!");
});
clipboard.on("error", function(e) {
showTooltip(e.trigger, "Press ctrl+c to copy");
});
};
2017-09-13 22:14:51 +03:00
function setOptions(options) {
OPTIONS.forEach(function(option) {
var elem = document.getElementById(option);
if (elem.tagName === "SELECT") {
elem.value = options[option];
} else if (elem.type === "number") {
elem.value = options[option];
} else {
var isInverted = elem.hasAttribute("data-inverted");
elem.checked = isInverted ? !options[option] : options[option];
}
});
}
function getOptions() {
var options = {};
OPTIONS.forEach(function(option) {
var elem = document.getElementById(option);
if (elem.tagName === "SELECT") {
options[option] = elem.value;
} else if (elem.type === "number") {
options[option] = Number(elem.value);
} else {
var isInverted = elem.hasAttribute("data-inverted");
options[option] = isInverted ? !elem.checked : elem.checked;
}
});
return options;
}
function getCLIOptions() {
return OPTIONS.sort()
.map(function(option) {
var elem = document.getElementById(option);
var match = elem.parentNode.textContent.match(/--\S+/);
if (!match) {
return null;
}
var name = match[0];
if (elem.tagName === "SELECT") {
if (elem.value === elem.options[0].value) {
return null;
}
return [name, elem.value];
} else if (elem.type === "number") {
if (elem.value === elem.getAttribute("value")) {
return null;
}
return [name, elem.value];
} else if (elem.type === "checkbox") {
if (!elem.checked) {
return null;
}
return [name, true];
}
return null;
})
.filter(Boolean);
}
function replaceHash(hash) {
if (
typeof URL === "function" &&
typeof history === "object" &&
typeof history.replaceState === "function"
) {
var url = new URL(location);
url.hash = hash;
history.replaceState(null, null, url);
} else {
location.hash = hash;
}
}
function setCodemirrorMode(editor, mode) {
editor.setOption("mode", mode);
CodeMirror.autoLoadMode(editor, mode);
}
2017-09-14 01:14:35 +03:00
function getCodemirrorMode(options) {
switch (options.parser) {
case "postcss":
return "css";
default:
return "javascript";
}
}
2017-09-13 22:14:51 +03:00
function formatAsync() {
var options = getOptions();
2017-09-14 01:14:35 +03:00
var mode = getCodemirrorMode(options);
2017-09-13 22:14:51 +03:00
setCodemirrorMode(inputEditor, mode);
setCodemirrorMode(outputEditor, mode);
setCodemirrorMode(output2Editor, mode);
2017-09-13 22:14:51 +03:00
[outputEditor, output2Editor].forEach(function(editor) {
editor.setOption("rulers", [
{ column: options.printWidth, color: "#444444" }
]);
});
2017-09-13 22:14:51 +03:00
document.querySelector(".ast").style.display = options.ast ? "" : "none";
document.querySelector(".doc").style.display = options.doc ? "" : "none";
document.querySelector(".output2").style.display = options.output2
? ""
: "none";
2017-09-13 22:14:51 +03:00
var value = encodeURIComponent(
JSON.stringify(
Object.assign({ content: inputEditor.getValue(), options: options })
)
);
replaceHash(value);
worker.postMessage({
text: inputEditor.getValue(),
options: options,
ast: options.ast,
doc: options.doc,
formatted2: options.output2
2017-09-13 22:14:51 +03:00
});
}
2017-09-14 01:14:35 +03:00
function createMarkdown(full) {
2017-09-13 22:14:51 +03:00
var input = inputEditor.getValue();
var output = outputEditor.getValue();
var output2 = output2Editor.getValue();
2017-09-13 22:14:51 +03:00
var options = getOptions();
var cliOptions = getCLIOptions();
2017-09-14 01:14:35 +03:00
var markdown = formatMarkdown(
2017-09-13 22:14:51 +03:00
input,
output,
2017-09-14 01:14:35 +03:00
output2 === IDEMPOTENT_MESSAGE ? "" : output2,
2017-09-13 22:14:51 +03:00
prettierVersion,
window.location.href,
options,
2017-09-14 01:14:35 +03:00
cliOptions,
full
2017-09-13 22:14:51 +03:00
);
return markdown;
}
function showTooltip(elem, text) {
var tooltip = document.createElement("span");
tooltip.className = "tooltip";
tooltip.textContent = text;
elem.appendChild(tooltip);
window.setTimeout(function() {
elem.removeChild(tooltip);
}, 2000);
}