diff --git a/.gitignore b/.gitignore
index ecddf57..588695f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ Install/*
*.DS_Store
*.sublime-project
pylintrc
+*.sublime-*
diff --git a/chrome-plugin/basic.js b/chrome-plugin/basic.js
new file mode 100644
index 0000000..dd46d10
--- /dev/null
+++ b/chrome-plugin/basic.js
@@ -0,0 +1,30 @@
+var languages = [
+ {
+ ext : "c",
+ name : "C"
+ },
+ {
+ ext : "cpp",
+ name : "C++"
+ },
+ {
+ ext : "java",
+ name : "Java"
+ },
+ {
+ ext : "py",
+ name : "Python"
+ }
+];
+
+//Getting the URL of the HTMl Page
+var url = document.URL;
+
+//Removing the trailing punctuation marks
+while(url[url.length - 1] === "/" || url[url.length - 1] === "#")
+{
+ url = url.slice(0, url.length - 1);
+}
+
+//Spliting the URL to get path
+var us = url.split("/");
diff --git a/chrome-plugin/code_later.js b/chrome-plugin/code_later.js
deleted file mode 100644
index 6ae56a9..0000000
--- a/chrome-plugin/code_later.js
+++ /dev/null
@@ -1,225 +0,0 @@
-//Getting the URL of the HTMl Page
-var url = document.URL
-
-//Removing the trailing punctuation marks
-while(url[url.length - 1] === "/" || url[url.length - 1] === "#")
-{
- url = url.slice(0, url.length - 1);
-}
-
-//Spliting the URL to get path
-var us = url.split("/");
-
-var website = us[2].split(".")
-for(i = 0; i < website.length; i++)
-{
- if (website[i] === "codechef" || website[i] === "spoj" || website[i] === "codeforces" || website[i] === "hackerearth")
- {
- website = website[i];
- }
-}
-
-function click_codechef(language)
-{
- console.log(language + " Code Now Clicked. Opening " + language + " IDE");
- var prob_name = document.title.split("|")[0].trim();
- var prob_url = url;
- var user_code = document.getElementById("user-bar").getElementsByTagName('span')[0];
- var u_name = "";
- //Checking if User is LoggedIn
- if(user_code.innerHTML.search("logout") == -1)
- {
- //No Logged In User Detected
- u_name = "No User";
- }
- else
- {
- //A user is logged in
- u_name = user_code.textContent.replace("Hello ", "").trim().split('!')[0];
- }
- //Sending Message to the native host with a json object of problem details
- chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
-}
-
-function click_spoj(language)
-{
- console.log(language + " Code Now Clicked. Opening " + language + " IDE");
- var prob_name = document.getElementsByClassName("prob")[0].getElementsByTagName("h2")[0].innerHTML;
- prob_name = prob_name.split('-')[1].slice(1);
- // prog.py throws encoding error if spaces are not removed
- prob_name = prob_name.replace(/\s/g, '-');
-
- var prob_url = url;
- var u_name = "";
- if(document.getElementsByClassName("text-success")[0].innerText.search("sign in")!=-1)
- {
- u_name = "No User";
- }
- else
- {
- u_name = document.getElementsByClassName("username_dropdown")[0].innerText.trim();
- }
- chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
-}
-
-function click_codeforces(language)
-{
- console.log(language + " Code Now Clicked. Opening " + language + " IDE");
- var prob_name = document.getElementById('pageContent').getElementsByClassName('title')[0].innerHTML.split('.')[1].trim();
- var prob_url = url;
- var u_name = "";
- var head_div = document.getElementById('header').getElementsByClassName('lang-chooser')[0].getElementsByTagName('div')[1];
- var reg_link = head_div.getElementsByTagName('a')[1].innerHTML.toLowerCase();
- if(reg_link == "register")
- {
- u_name = "No User";
- }
- else
- {
- u_name = head_div.getElementsByTagName('a')[0].innerHTML.toLowerCase();
- }
- chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
-}
-
-function click_hackerearth(language)
-{
- console.log(language + " Code Now Clicked. Opening " + language + " IDE");
- var prob_name = document.getElementsByClassName('problem-title')[0].innerHTML;
- var prob_url = url;
- var u_name = "";
- var login_link = document.getElementsByClassName('track-header-login show-modal');
-
- // If login link exists
- if(login_link.length !== 0)
- {
- u_name = "No User";
- }
- else
- {
- u_name = document.getElementsByClassName('track-header-profile-box')[0].getAttribute('href').split('@')[1];
- }
- chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
-
-}
-
-
-// Helper function to add codechef buttons
-var codechef_interval = null;
-function add_codechef_buttons()
-{
- if (document.getElementById('problem-page-top') == null) return;
- else {
- document.getElementById('problem-page-top').getElementsByTagName('ul').item(0).innerHTML = document.getElementById('problem-page-top').getElementsByTagName('ul').item(0).innerHTML
- +"
Code in Java"
- +"Code in C"
- +"Code in C++"
- +"Code in Python";
-
- console.log("Code Now Button Added !! ~ Code Now Extension");
- //Adding listener for Java Button
- document.getElementById("code_now_id_java_button").onclick = function(){ click_codechef("java"); };
-
- //Adding Listener for C Button
- document.getElementById("code_now_id_c_button").onclick = function(){ click_codechef("c"); };
-
- //Adding Button for C++ Button
- document.getElementById("code_now_id_c++_button").onclick = function(){ click_codechef("cpp"); };
-
- //Adding Button for Python Button
- document.getElementById("code_now_id_python_button").onclick = function(){ click_codechef("py"); };
-
- clearInterval(codechef_interval);
- }
-}
-
-//Checking if it is CodeChef Problem Page
-if(us.length > 4 && website === "codechef" && us[us.length - 2] === "problems")
-{
- //Excluding the Special Codes in CodeChef Problem Regex - These url indicate a list of problems rather than a particular problem
- var code = us[us.length - 1];
- if(code !== "easy" && code !== "medium" && code !== "hard" && code !== "challenge" && code !== "extcontest" && code !== "school")
- {
- // Adding A little sleep here because codechef mutates DOM to add all elements dynamically
- codechef_interval = window.setInterval(add_codechef_buttons, 5000);
- }
-}
-
-//Checking for Spoj Problem Pages
-else if(us.length > 4 && website === "spoj" && us[us.length - 2] === "problems")
-{
- //Again Avoiding Special URLs
- var code = us[us.length - 2];
- if(code !== "classical" && code !== "challenge" && code !== "partial" && code !== "tutorial" && code !== "riddle")
- {
- document.getElementById("problem-btn-submit-box").innerHTML+=
- ""
- + ""
- + ""
- + "";
-
- console.log("Code Now Button Added !! ~ Code Now Extension");
-
- document.getElementById("code_now_id_java_button").onclick = function(){ click_spoj("java"); };
- document.getElementById("code_now_id_c_button").onclick = function(){ click_spoj("c"); };
- document.getElementById("code_now_id_c++_button").onclick = function(){ click_spoj("cpp"); };
- document.getElementById("code_now_id_python_button").onclick = function(){ click_spoj("py"); };
- }
-}
-
-//Checking for Codeforces Problem Page
-else if(us.length > 4 && website === "codeforces" && (us[us.length - 2] === "problem" || us[us.length - 3] === "problem"))
-{
- //Creating and Adding A whole new Sidebox with 3 buttons
- var sidebar = document.getElementById('sidebar')
- sidebar.innerHTML =
- ''
- + '
'
- + '
'
- + '
'
- + ''
- + 'Code Now |
'
- + ''
- + ''
- + ' '
- + '
'
- + '
'
- + '
'
- + '
'
- + ' '
- + ' | '
- + '
'
- + ''
- + '
'
- + '
'
- + sidebar.innerHTML;
-
- console.log("Code Now Button Added !! ~ Code Now Extension");
-
- document.getElementById("code_now_id_java_button").onclick = function() { click_codeforces("java"); };
- document.getElementById("code_now_id_c_button").onclick = function(){ click_codeforces("c"); };
- document.getElementById("code_now_id_c++_button").onclick = function(){ click_codeforces("cpp"); };
- document.getElementById("code_now_id_python_button").onclick = function(){ click_codeforces("py"); };
-}
-
-//Checking page for hackerearth problem page
-else if (us.length > 4 && website === 'hackerearth' && us[3] === "problem") {
- // base DOM element to which buttons are appended
- var base = document.getElementsByClassName("editor-utility content medium-margin")[0];
- var add_button = document.createElement("div");
-
- add_button.innerHTML =
- ""
- + ""
- + ""
- + "";
-
- //Add buttons to base element
- base.appendChild(add_button);
-
- console.log("Code Now Button Added !! ~ Code Now Extension");
-
- document.getElementById("code_now_id_java_button").onclick = function(){ click_hackerearth("java"); };
- document.getElementById("code_now_id_c_button").onclick = function(){ click_hackerearth("c"); };
- document.getElementById("code_now_id_c++_button").onclick = function(){ click_hackerearth("cpp"); };
- document.getElementById("code_now_id_python_button").onclick = function(){ click_hackerearth("py"); };
-}
diff --git a/chrome-plugin/codechef_problem.js b/chrome-plugin/codechef_problem.js
new file mode 100644
index 0000000..f5e6f12
--- /dev/null
+++ b/chrome-plugin/codechef_problem.js
@@ -0,0 +1,63 @@
+//Helper function to get click_functions
+function click_codechef(language)
+{
+ return function () {
+ console.log(language + " Code Now Clicked. Opening " + language + " IDE");
+ var prob_name = $('title')[0].text.split('|')[0].trim();
+ var prob_url = url;
+ var u_name = "";
+ //Checking if User is LoggedIn
+ if($('#user-bar span.login-box').length > 0)
+ {
+ //No Logged In User Detected
+ u_name = "No User";
+ }
+ else
+ {
+ //A user is logged in
+ u_name = $('#user-bar span').text().split('!')[0].replace('Hello', '').trim();
+ }
+ //Sending Message to the native host with a json object of problem details
+ chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
+ };
+}
+
+// Helper function to add codechef buttons
+var codechef_interval = null;
+function add_codechef_buttons()
+{
+ if ($('#problem-page-top').length === 0)
+ {
+ // This means that the page hasn't loaded completely yet. So Wait
+ return;
+ }
+ else
+ {
+ // Dynamic DOM Created by codechef
+ var button_list = $("#problem-page-top").find("ul");
+ var html = button_list.html();
+ // Adding Language Button
+ for (var i = 0; i < languages.length; i++)
+ {
+ html += "Code in " + languages[i].name + "";
+ }
+ button_list.html(html);
+
+ //Adding Listeners
+ for(var j = 0; j < languages.length; j++)
+ {
+ $("#code_now_id_" + languages[j].ext + "_button").click(click_codechef(languages[j].ext));
+ }
+ console.log("Code Now Button Added !! ~ Code Now Extension");
+
+ // Clear interval, so that buttons are not added repeatedly
+ clearInterval(codechef_interval);
+ }
+}
+
+var code = us[us.length - 1];
+if(us[us.length - 2] === "problems" && code !== "easy" && code !== "medium" && code !== "hard" && code !== "challenge" && code !== "extcontest" && code !== "school")
+{
+ // Adding A little sleep here because codechef mutates DOM to add all elements dynamically
+ codechef_interval = window.setInterval(add_codechef_buttons, 5000);
+}
diff --git a/chrome-plugin/codeforces_problem.js b/chrome-plugin/codeforces_problem.js
new file mode 100644
index 0000000..3167d7a
--- /dev/null
+++ b/chrome-plugin/codeforces_problem.js
@@ -0,0 +1,53 @@
+function click_codeforces(language)
+{
+ return function() {
+ console.log(language + " Code Now Clicked. Opening " + language + " IDE");
+ var prob_name = $('#pageContent .title').html().split('.')[1].trim();
+ var prob_url = url;
+ var u_name = "";
+ var reg_link = $('#header .lang-chooser div')[1].children[1].text.toLowerCase();
+ if(reg_link == "register")
+ {
+ u_name = "No User";
+ }
+ else
+ {
+ u_name = $('#header .lang-chooser div')[1].children[0].text.toLowerCase();
+ }
+ chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
+ };
+}
+
+if(us.length > 4 && (us[us.length - 2] === "problem" || us[us.length - 3] === "problem"))
+{
+ //Creating and Adding A whole new Sidebox with 3 buttons
+ $('#sidebar').html(
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ 'Code Now |
' +
+ '' +
+ '' +
+ ' ' +
+ ' ' +
+ ' | ' +
+ '
' +
+ '' +
+ '
' +
+ '
' +
+ $('#sidebar').html);
+
+ for(var i = 0; i < languages.length; i++)
+ {
+ var button = $('', {
+ text : 'Code in ' + languages[i].name,
+ click : click_codeforces(languages[i].ext)
+ });
+ $('#code_now_button_box').append(button);
+ $('#code_now_button_box').append($('
'));
+ $('#code_now_button_box').append($('
'));
+ }
+ console.log("Code Now Button Added !! ~ Code Now Extension");
+}
diff --git a/chrome-plugin/hackerearth.js b/chrome-plugin/hackerearth.js
new file mode 100644
index 0000000..faceb2e
--- /dev/null
+++ b/chrome-plugin/hackerearth.js
@@ -0,0 +1,39 @@
+function click_hackerearth(language)
+{
+ return function() {
+ console.log(language + " Code Now Clicked. Opening " + language + " IDE");
+ var prob_name = $('.problem-title').first().text().trim();
+ var prob_url = url;
+ var u_name = "";
+ var login_link = document.getElementsByClassName('track-header-login show-modal');
+
+ // If login link exists
+ if($('.track-header-login.show-modal').length !== 0)
+ {
+ u_name = "No User";
+ }
+ else
+ {
+ u_name = $('a.track-header-profile-box')[0].href.split('@')[1];
+ }
+ chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
+ };
+}
+
+if (us[3] === "problem") {
+ var new_div = $('.editor-header').first().clone(false);
+ new_div.html('');
+ console.log(languages);
+ for(var i = 0; i < languages.length; i++)
+ {
+ var button = $('', {
+ class : 'button btn-blue',
+ text : 'Code In ' + languages[i].name,
+ style : 'margin: 5px 5px 0px 0px;',
+ click : click_hackerearth(languages[i].ext)
+ });
+ new_div.append(button);
+ }
+ $('.editor-header').first().after(new_div);
+ console.log("Code Now Button Added !! ~ Code Now Extension");
+}
diff --git a/chrome-plugin/manifest.json b/chrome-plugin/manifest.json
index ab79427..83aebdd 100644
--- a/chrome-plugin/manifest.json
+++ b/chrome-plugin/manifest.json
@@ -8,8 +8,23 @@
"content_scripts": [
{
"run_at" : "document_end",
- "matches" : ["https://www.codechef.com/*", "http://www.spoj.com/*", "http://codeforces.com/*", "https://www.hackerearth.com/*"],
- "js" : ["code_later.js"]
+ "matches" : ["https://www.codechef.com/*"],
+ "js" : ["jquery.js", "basic.js", "codechef_problem.js"]
+ },
+ {
+ "run_at" : "document_end",
+ "matches" : ["http://www.spoj.com/problems/*"],
+ "js" : ["jquery.js", "basic.js", "spoj_problem.js"]
+ },
+ {
+ "run_at" : "document_end",
+ "matches" : ["http://codeforces.com/*"],
+ "js" : ["jquery.js", "basic.js", "codeforces_problem.js"]
+ },
+ {
+ "run_at" : "document_end",
+ "matches" : ["https://www.hackerearth.com/problem/*"],
+ "js" : ["jquery.js", "basic.js", "hackerearth.js"]
}
],
"background": {
diff --git a/chrome-plugin/spoj_problem.js b/chrome-plugin/spoj_problem.js
new file mode 100644
index 0000000..15e9f80
--- /dev/null
+++ b/chrome-plugin/spoj_problem.js
@@ -0,0 +1,43 @@
+function click_spoj(language)
+{
+ return function() {
+ console.log(language + " Code Now Clicked. Opening " + language + " IDE");
+ var prob_name = $('.prob h2').html().split('-')[1].trim();
+ var prob_url = url;
+ var u_name = "";
+ if($('.submenu .navbar-right')[0].children.length == 2)
+ {
+ u_name = "No User";
+ }
+ else
+ {
+ u_name = $('.submenu .navbar-right a')[0].href.split(',')[1].replace('/', '');
+ }
+ chrome.runtime.sendMessage({problem_name: prob_name, problem_url: prob_url, user_name: u_name, lang : language});
+ };
+}
+
+var spoj_interval = null;
+function add_spoj_buttons()
+{
+ var submit_box = $('#problem-btn-submit-box');
+ for(var i = 0; i < languages.length; i++)
+ {
+ var button = $('', {
+ text : 'Code in ' + languages[i].name,
+ class : 'btn btn-default',
+ style : 'width: 100%; margin-top: 20px;',
+ click : click_spoj(languages[i].ext)
+ });
+ submit_box.append(button);
+ }
+ console.log("Code Now Button Added !! ~ Code Now Extension");
+ clearInterval(spoj_interval);
+}
+
+//Again Avoiding Special URLs
+var code = us[us.length - 2];
+if(code !== "classical" && code !== "challenge" && code !== "partial" && code !== "tutorial" && code !== "riddle")
+{
+ spoj_interval = setInterval(add_spoj_buttons, 200);
+}