// ==UserScript== // @name Fiddle-ify! // @author Cameron Bernhardt (AstroCB) // @version 0.1.0 // @namespace http://github.com/CameronBernhardt // @description Converts code blocks into JSFiddles with the click of a button // @include http://stackoverflow.com/* // @downloadURL none // ==/UserScript== var tags = document.getElementsByClassName("post-taglist")[0].children; var tagged = false; var index = 0; var html, css, javascript; //store contents of selected 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(tagged){ //only display button if tagged HTML, CSS, or JavaScript (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++; } }); var blocks = document.getElementsByClassName("default prettyprint prettyprinted"); for(var j = 0; j < blocks.length; j++){ blocks[j].addEventListener("click", function(){ //listen for clicks on code blocks 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 fiddleWin = window.open("//jsfiddle.net"); //load Fiddle fiddleWin.document.onload = function(){ var textboxes = fiddleWin.document.getElementsByTagName("textarea"); //these are dependent on JSFiddle's layout: may need to change if design changes (currently no other way to reference them) var htmlWin = textboxes[2]; var jsWin = textboxes[4]; var cssWin = textboxes[6]; htmlWin.innerHTML = htmlText; cssWin.innerHTML = cssText; jsWin.innerHTML = jsText; }