// ==UserScript==
// @name Fiddle-ify!
// @author Cameron Bernhardt (AstroCB)
// @version 0.1.0
// @namespace http://github.com/AstroCB
// @description Converts code blocks on Stack Overflow into JSFiddles with a few clicks
// @include http://stackoverflow.com/*
// @downloadURL https://update.greasyfork.icu/scripts/3879/Fiddle-ify%21.user.js
// @updateURL https://update.greasyfork.icu/scripts/3879/Fiddle-ify%21.meta.js
// ==/UserScript==
var tags = document.getElementsByClassName("post-taglist")[0].children;
var tagged = false,
jQuery = false;
var index = 0;
var html, css, javascript; //store contents of selected code blocks
var blocks = document.getElementsByClassName("default prettyprint prettyprinted"); //get code blocks
for (var i = 0; i < tags.length; i++) {
var tagName = tags[i].innerHTML;
if (tagName === "html" || tagName === "css" || tagName === "javascript") { //check if tagged HTML, CSS, or JavaScript
tagged = true;
}
if (tagName === "jQuery") {
jQuery = true;
}
}
if (tagged && blocks) { //only display button if tagged HTML, CSS, or JavaScript and has code blocks
//(TODO: add jQuery support (toggle menu in Fiddle))
var question = document.getElementsByClassName("vt")[0];
question.innerHTML += " "; //inject "Fiddle-ify" button
document.getElementById("fiddleify").addEventListener("click", function () { //listen for "enter" keypresses for skipping
alert("Click a code block for HTML or press enter to skip.");
document.addEventListener("keyup", function (e) {
if (e.which === 37) {
e.preventDefault();
assign(null, index);
index++;
}
});
for (var j = 0; j < blocks.length; j++) {
blocks[j].addEventListener("click", function () { //listen for clicks on code blocks
if (index === 0) {
this.style.backgroundColor = "orange";
} else if (index == 1) {
this.style.backgroundColor = "blue";
} else if (index == 2) {
this.style.backgroundColor = "yellow";
}
assign(this.children[0].children, index);
index++;
});
}
});
}
function assign(element, num) {
//TODO: add visual cue that code block has been selected
switch (num) { //instructions for each click: HTML -> CSS -> JavaScript (runs for both "enter" keypresses and block clicks)
case 0:
html = element;
alert("Click a code block for CSS or press enter to skip.");
break;
case 1:
css = element;
alert("Click a code block for JavaScript or press enter to skip.");
break;
case 2:
javascript = element;
run();
break;
default:
console.log("Finished");
}
}
function run() { //unwrap text from code blocks (each word is in its own span)
confirm("Loading JSFiddle...");
var htmlText = "",
cssText = "",
jsText = "";
for (var x = 0; x < html.length; x++) {
htmlText += html[x].innerHTML;
}
for (var y = 0; y < css.length; y++) {
cssText += css[y].innerHTML;
}
for (var z = 0; z < javascript.length; z++) {
jsText += javascript[z].innerHTML;
}
var url = "//jsfiddle.net/api/post/";
if (jQuery) { //determine whether to use jQuery
url += "jquery/2.1.0";
} else {
url += "library/pure";
}
var data = {
"html": html,
"css": css,
"js": javascript,
}
function load() {
console.log(post);
}
var post = new GM_xmlhttpRequest({
data: data,
method: "POST",
url: url,
onload: function () {
console.log(post);
}
}); //create POST request for Fiddle
}