From 7a6a0573c9aae410b13bcba3fab75404029541cc Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Thu, 27 Apr 2017 19:04:37 +0200 Subject: [PATCH 1/4] Code format --- background.js | 44 ++++++------ content.js | 194 ++++++++++++++++++++++---------------------------- 2 files changed, 106 insertions(+), 132 deletions(-) diff --git a/background.js b/background.js index 2ef5cc8..901a7f2 100644 --- a/background.js +++ b/background.js @@ -1,7 +1,7 @@ -chrome.tabs.onUpdated.addListener(function(tabId, changedInfo, tab){ +chrome.tabs.onUpdated.addListener(function (tabId, changedInfo, tab) { console.log('TAB ID = ' + tabId); - if (changedInfo.status == 'complete') { + if (changedInfo.status === 'complete') { var GITHUB_URL = "github.com"; var tabUrl = tab.url; if (tabUrl.indexOf(GITHUB_URL) > -1) { @@ -21,8 +21,7 @@ chrome.tabs.onUpdated.addListener(function(tabId, changedInfo, tab){ var packageNameWithSlashes = result[len - 2]; var packageName = packageNameWithSlashes.replace(/\//g, "."); console.log("Package Name : " + packageName); - console.log("Class Name : " + className); - + console.log("Class Name : " + className); var messagePayload = { task: "activate_class_links", @@ -36,15 +35,14 @@ chrome.tabs.onUpdated.addListener(function(tabId, changedInfo, tab){ packageName: packageName } - /* - https://github.com/NewsInShorts/inshortsapp/blob/master/mobile/src/main/java/com/nis/app/agents/AppAgent.java - Now from a URL like above extract out the current package we are in, for example - Package Name = com.nis.app.agents - Class Name = AppAgent - - */ - chrome.tabs.sendMessage(tab.id, messagePayload, - doStuffWithDOM); + /* + https://github.com/NewsInShorts/inshortsapp/blob/master/mobile/src/main/java/com/nis/app/agents/AppAgent.java + Now from a URL like above extract out the current package we are in, for example + Package Name = com.nis.app.agents + Class Name = AppAgent + */ + chrome.tabs.sendMessage(tab.id, messagePayload, + doStuffWithDOM); } } @@ -54,16 +52,14 @@ chrome.tabs.onUpdated.addListener(function(tabId, changedInfo, tab){ /* A function creator for callbacks */ function doStuffWithDOM(dataToBeLogged) { - // console.log("I received the following DOM content:\n" + dataToBeLogged); - if (jQuery) { - console.log('Jquery Loaded'); - // jQuery loaded - console.log(dataToBeLogged); - - } else { - // jQuery not loaded - console.log('Jquery Not Loaded Yet'); - } - + // console.log("I received the following DOM content:\n" + dataToBeLogged); + if (jQuery) { + console.log('Jquery Loaded'); + // jQuery loaded + console.log(dataToBeLogged); + } else { + // jQuery not loaded + console.log('Jquery Not Loaded Yet'); + } } diff --git a/content.js b/content.js index 7c378c3..beac071 100644 --- a/content.js +++ b/content.js @@ -1,11 +1,11 @@ /* Listen for messages */ -var REGEX_IMPORT = /^(import )/ -var REGEX_PACKAGE_NAME_EXCLUDING_CLASS_NAME = /(.*\.)/ +var REGEX_IMPORT = /^(import )/; +var REGEX_PACKAGE_NAME_EXCLUDING_CLASS_NAME = /(.*\.)/; var REGEX_BASE_PACKAGE; // This will help us determine the line from which the actual code begins. var INDEX_OF_LAST_IMPORT_STATEMENT = -1; -var arrayOfBroweseableClasses = new Array(); +var arrayOfBroweseableClasses = []; var PROTOCOL; var DOMAIN; var USER_NAME; @@ -16,130 +16,109 @@ var SOURCE_FOLDER_ROOT; var ANDROID_REFERENCE_URL_BASE = "https://developer.android.com/reference/"; -chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { - /* If the received message has the expected format... */ - if (msg.task && (msg.task == "activate_class_links")) { - PROTOCOL = msg.protocol; - DOMAIN = msg.domain; - USER_NAME = msg.userName; - REPOSITORY_NAME = msg.repositoryName; - BRANCH = msg.branchName; - MODULE_NAME = msg.modulename; - SOURCE_FOLDER_ROOT = msg.sourceCodeFolder; - - var packageNameFolders = msg.packageName.split("."); - - REGEX_BASE_PACKAGE = new RegExp('('+packageNameFolders[0] + '\.' + packageNameFolders[1] + ')'); - - var tableRows = $('div.blob-wrapper tr'); - $(tableRows).each(function(index){ - var sourceCodeLine = $(this).find(':nth-child(2)').text(); - if (itIsAnImportStatement(sourceCodeLine)) { - var packageName = getPackageName(sourceCodeLine); - if (packageBelongsToOurSourceCode(packageName) || packageBelongsToAndroid(packageName)) { - var className = getClassName(packageName); - if (className !== 'R') { - var browseableClass = new BrowseableClass(className, packageName); - arrayOfBroweseableClasses.push(browseableClass); - // console.log(browseableClass.getGithubUrl()); - } +chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { + /* If the received message has the expected format... */ + if (msg.task && (msg.task === "activate_class_links")) { + PROTOCOL = msg.protocol; + DOMAIN = msg.domain; + USER_NAME = msg.userName; + REPOSITORY_NAME = msg.repositoryName; + BRANCH = msg.branchName; + MODULE_NAME = msg.modulename; + SOURCE_FOLDER_ROOT = msg.sourceCodeFolder; + + var packageNameFolders = msg.packageName.split("."); + + REGEX_BASE_PACKAGE = new RegExp('(' + packageNameFolders[0] + '\.' + packageNameFolders[1] + ')'); + + var tableRows = $('div.blob-wrapper tr'); + $(tableRows).each(function (index) { + var sourceCodeLine = $(this).find(':nth-child(2)').text(); + if (itIsAnImportStatement(sourceCodeLine)) { + var packageName = getPackageName(sourceCodeLine); + if (packageBelongsToOurSourceCode(packageName) || packageBelongsToAndroid(packageName)) { + var className = getClassName(packageName); + if (className !== 'R') { + var browseableClass = new BrowseableClass(className, packageName); + arrayOfBroweseableClasses.push(browseableClass); + // console.log(browseableClass.getGithubUrl()); } + } - if (INDEX_OF_LAST_IMPORT_STATEMENT < index) { - INDEX_OF_LAST_IMPORT_STATEMENT = index; - } + if (INDEX_OF_LAST_IMPORT_STATEMENT < index) { + INDEX_OF_LAST_IMPORT_STATEMENT = index; } - }); - - for (var i=0;i'); - } else if (code.length == arrayOfBroweseableClasses[i].className.length) { - $(el[j]).wrapInner(''); - } + } + }); + + for (var i = 0; i < arrayOfBroweseableClasses.length; i++) { + var el = $('td :contains(' + arrayOfBroweseableClasses[i].className + ')'); + for (var j = 0; j < el.length; j++) { + var code = $(el[j]).text(); + var result = code.match(REGEX_VALID_USAGE_OF_CLASS_NAME); + if (result) { + if (~code.indexOf('List') || ~code.indexOf('ArrayList') || ~code.indexOf('Set') || ~code.indexOf('Iterator')) { + // Handle more collections stuff probably wrapped inside a fucking function. + $(el[j]).wrapInner(''); + } else if (code.length === arrayOfBroweseableClasses[i].className.length) { + $(el[j]).wrapInner(''); } } } - } + + } }); /** -* Checks if this line of code is an import statement. -* @param {String} lineOfCode -* @return (Boolean) true if it is an import statement and false otherwise -*/ + * Checks if this line of code is an import statement. + * @param {String} lineOfCode + * @return (Boolean) true if it is an import statement and false otherwise + */ function itIsAnImportStatement(lineOfCode) { - var result = lineOfCode.match(REGEX_IMPORT); - if (result) { - return true; - } else { - return false; - } - + return !!result; } /** -* Checks if this package lies in our source code or not, by checking the first -* two folder names in the package. Like if com.ishankhanna.example.app is the -* is a package to be tested if it belongs to us or not, we will check if -* com.ishankhanna.example is there in this package name or not. -* @param {String} packageNameToBeValidated -* @returns {Boolean} true if it belongs to our source code and false otherwise -*/ + * Checks if this package lies in our source code or not, by checking the first + * two folder names in the package. Like if com.ishankhanna.example.app is the + * is a package to be tested if it belongs to us or not, we will check if + * com.ishankhanna.example is there in this package name or not. + * @param {String} packageNameToBeValidated + * @returns {Boolean} true if it belongs to our source code and false otherwise + */ function packageBelongsToOurSourceCode(packageNameToBeValidated) { - - var result = packageNameToBeValidated.match(REGEX_BASE_PACKAGE) - if (result) { - return true; - } else { - return false; - } - + return !!packageNameToBeValidated.match(REGEX_BASE_PACKAGE); } /** -* Checks if the package belongs to android - simply checks if it starts with "android.*" -*/ + * Checks if the package belongs to android - simply checks if it starts with "android.*" + */ function packageBelongsToAndroid(packageNameToBeValidated) { - - if (packageNameToBeValidated.startsWith("android.")) { - return true; - } else { - return false; - } - + return packageNameToBeValidated.startsWith("android."); } /** -* Extracts the package name from the import statement of the source code. -* @param {String} importStatement -* @return {String} packageName -*/ + * Extracts the package name from the import statement of the source code. + * @param {String} importStatement + * @return {String} packageName + */ function getPackageName(importStatement) { // TODO : Figure out why the hell are we doing this split twice. var codes = importStatement.split(" "); - var packageName = codes[1].split(";")[0]; - return packageName; + return codes[1].split(";")[0]; } /** -* Extracts the class name from the package name. -* @param {String} packageName -* @return {String} className -*/ + * Extracts the class name from the package name. + * @param {String} packageName + * @return {String} className + */ function getClassName(packageName) { var elementsOfPackageName = packageName.split("."); - var className = elementsOfPackageName[elementsOfPackageName.length-1]; - return className; + return elementsOfPackageName[elementsOfPackageName.length - 1]; } function BrowseableClass(className, packageName) { @@ -147,18 +126,17 @@ function BrowseableClass(className, packageName) { this.packageName = packageName; } -BrowseableClass.prototype.getLinkedUrl = function() { - - if(packageBelongsToAndroid(this.packageName)) { - var packageNameWithSlashes = this.packageName.replace(/\./g, "\/"); - return ANDROID_REFERENCE_URL_BASE+packageNameWithSlashes+".html"; - } else if(packageBelongsToOurSourceCode(this.packageName)) { - var result = this.packageName.match(REGEX_PACKAGE_NAME_EXCLUDING_CLASS_NAME); - var packageNameWithSlashes = result[0].replace(/\./g, "\/"); - return PROTOCOL + "://" + DOMAIN + "/" + USER_NAME + "/" + REPOSITORY_NAME + - "/blob/" + BRANCH + "/" + MODULE_NAME + "/" + SOURCE_FOLDER_ROOT + "/" - + packageNameWithSlashes + this.className + '.java'; +BrowseableClass.prototype.getLinkedUrl = function () { + if (packageBelongsToAndroid(this.packageName)) { + var packageNameWithSlashes = this.packageName.replace(/\./g, "\/"); + return ANDROID_REFERENCE_URL_BASE + packageNameWithSlashes + ".html"; + } else if (packageBelongsToOurSourceCode(this.packageName)) { + var result = this.packageName.match(REGEX_PACKAGE_NAME_EXCLUDING_CLASS_NAME); + var packageNameWithSlashes = result[0].replace(/\./g, "\/"); + return PROTOCOL + "://" + DOMAIN + "/" + USER_NAME + "/" + REPOSITORY_NAME + + "/blob/" + BRANCH + "/" + MODULE_NAME + "/" + SOURCE_FOLDER_ROOT + "/" + + packageNameWithSlashes + this.className + '.java'; } -} +}; -var REGEX_VALID_USAGE_OF_CLASS_NAME = /^(\s+)?[A-Z]{1}[\S]+(\(|\.|>|\s|$)/; +var REGEX_VALID_USAGE_OF_CLASS_NAME = /^(\s+)?[A-Z][\S]+(\(|\.|>|\s|$)/; From 2cc82f8afbfe0adf2e76056742b8f6a793fa27ef Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Sun, 7 May 2017 17:08:14 +0200 Subject: [PATCH 2/4] [WIP] Kotlin support Something not working @L58 --- background.js | 13 +++++++------ content.js | 21 ++++++++++++--------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/background.js b/background.js index 901a7f2..7df6155 100644 --- a/background.js +++ b/background.js @@ -5,8 +5,8 @@ chrome.tabs.onUpdated.addListener(function (tabId, changedInfo, tab) { var GITHUB_URL = "github.com"; var tabUrl = tab.url; if (tabUrl.indexOf(GITHUB_URL) > -1) { - var JAVA_SOURCE_REGEX = /^(https?):\/\/(github\.com)\/([\w]+)\/([\S]+)\/blob\/([\w]+)\/(.*)\/(src\/main\/java)\/(.*)\/([\w]+\.java)/; - var result = tabUrl.match(JAVA_SOURCE_REGEX); + var SOURCE_REGEX = /^(https?):\/\/(github\.com)\/([\w]+)\/([\S]+)\/blob\/([\w]+)\/(.*)\/(src\/main\/(?:java|kotlin))\/(.*)\/([\w]+\.(?:java|kt))/; + var result = tabUrl.match(SOURCE_REGEX); if (result) { var len = result.length; console.log(result); @@ -18,6 +18,7 @@ chrome.tabs.onUpdated.addListener(function (tabId, changedInfo, tab) { var modulename = result[6]; // gradle project module name. for example : mobile var sourceCodeFolder = result[7]; // root folder java packages are stored. for example: src/main/java var className = result[len - 1]; + var ext = className.split(".")[1]; var packageNameWithSlashes = result[len - 2]; var packageName = packageNameWithSlashes.replace(/\//g, "."); console.log("Package Name : " + packageName); @@ -32,8 +33,9 @@ chrome.tabs.onUpdated.addListener(function (tabId, changedInfo, tab) { branchName: result[5], // current branch. for example: master modulename: result[6], // gradle project module name. for example : mobile sourceCodeFolder: result[7], // root folder java packages are stored. for example: src/main/java - packageName: packageName - } + packageName: packageName, + ext: ext + }; /* https://github.com/NewsInShorts/inshortsapp/blob/master/mobile/src/main/java/com/nis/app/agents/AppAgent.java @@ -41,8 +43,7 @@ chrome.tabs.onUpdated.addListener(function (tabId, changedInfo, tab) { Package Name = com.nis.app.agents Class Name = AppAgent */ - chrome.tabs.sendMessage(tab.id, messagePayload, - doStuffWithDOM); + chrome.tabs.sendMessage(tab.id, messagePayload, doStuffWithDOM); } } diff --git a/content.js b/content.js index beac071..8f06577 100644 --- a/content.js +++ b/content.js @@ -1,6 +1,7 @@ /* Listen for messages */ var REGEX_IMPORT = /^(import )/; +var REGEX_VALID_USAGE_OF_CLASS_NAME = /^(\s+)?[A-Z][\S]+(\(|\.|>|\s|$)/; var REGEX_PACKAGE_NAME_EXCLUDING_CLASS_NAME = /(.*\.)/; var REGEX_BASE_PACKAGE; // This will help us determine the line from which the actual code begins. @@ -11,12 +12,12 @@ var DOMAIN; var USER_NAME; var REPOSITORY_NAME; var BRANCH; -var MODULE_NAME; // gadle based projects have modules +var MODULE_NAME; // gradle based projects have modules var SOURCE_FOLDER_ROOT; var ANDROID_REFERENCE_URL_BASE = "https://developer.android.com/reference/"; -chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { +chrome.runtime.onMessage.addListener(function (msg) { /* If the received message has the expected format... */ if (msg.task && (msg.task === "activate_class_links")) { PROTOCOL = msg.protocol; @@ -39,7 +40,7 @@ chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { if (packageBelongsToOurSourceCode(packageName) || packageBelongsToAndroid(packageName)) { var className = getClassName(packageName); if (className !== 'R') { - var browseableClass = new BrowseableClass(className, packageName); + var browseableClass = new BrowseableClass(className, packageName, msg.ext); arrayOfBroweseableClasses.push(browseableClass); // console.log(browseableClass.getGithubUrl()); } @@ -51,8 +52,11 @@ chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { } }); + console.dir(arrayOfBroweseableClasses); + for (var i = 0; i < arrayOfBroweseableClasses.length; i++) { var el = $('td :contains(' + arrayOfBroweseableClasses[i].className + ')'); + console.dir(el); for (var j = 0; j < el.length; j++) { var code = $(el[j]).text(); var result = code.match(REGEX_VALID_USAGE_OF_CLASS_NAME); @@ -121,9 +125,10 @@ function getClassName(packageName) { return elementsOfPackageName[elementsOfPackageName.length - 1]; } -function BrowseableClass(className, packageName) { +function BrowseableClass(className, packageName, ext) { this.className = className; this.packageName = packageName; + this.ext = ext; } BrowseableClass.prototype.getLinkedUrl = function () { @@ -134,9 +139,7 @@ BrowseableClass.prototype.getLinkedUrl = function () { var result = this.packageName.match(REGEX_PACKAGE_NAME_EXCLUDING_CLASS_NAME); var packageNameWithSlashes = result[0].replace(/\./g, "\/"); return PROTOCOL + "://" + DOMAIN + "/" + USER_NAME + "/" + REPOSITORY_NAME + - "/blob/" + BRANCH + "/" + MODULE_NAME + "/" + SOURCE_FOLDER_ROOT + "/" - + packageNameWithSlashes + this.className + '.java'; + "/blob/" + BRANCH + "/" + MODULE_NAME + "/" + SOURCE_FOLDER_ROOT + "/" + + packageNameWithSlashes + this.className + "." + this.ext; } -}; - -var REGEX_VALID_USAGE_OF_CLASS_NAME = /^(\s+)?[A-Z][\S]+(\(|\.|>|\s|$)/; +}; \ No newline at end of file From d0a3ab6127d4bd39e8889136619e0e8481824f2f Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Mon, 8 May 2017 16:07:59 +0200 Subject: [PATCH 3/4] Kotlin support Workaround for Kotlin. It gets the first char of a class (first index); it checks if before the class name there's another char, if true skip this line; calculates the used lenght, adding to the first index, the length of class name, plus a special char (like . ( ). At the end it checks if the substring matches with a valid usage of class name, so replace it with the URL. PROS: it works. CONS: if exists a string with " Main(", the workaround detects it like a code line. --- content.js | 53 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/content.js b/content.js index 8f06577..e0fbc3e 100644 --- a/content.js +++ b/content.js @@ -17,6 +17,10 @@ var SOURCE_FOLDER_ROOT; var ANDROID_REFERENCE_URL_BASE = "https://developer.android.com/reference/"; +String.prototype.replaceBetween = function (start, end, what) { + return this.substring(0, start) + what + this.substring(end); +}; + chrome.runtime.onMessage.addListener(function (msg) { /* If the received message has the expected format... */ if (msg.task && (msg.task === "activate_class_links")) { @@ -52,20 +56,47 @@ chrome.runtime.onMessage.addListener(function (msg) { } }); - console.dir(arrayOfBroweseableClasses); - for (var i = 0; i < arrayOfBroweseableClasses.length; i++) { - var el = $('td :contains(' + arrayOfBroweseableClasses[i].className + ')'); - console.dir(el); + var clazz = arrayOfBroweseableClasses[i]; + // Skip line number + var el = $('td[id*=LC]' + ( msg.ext === "java" ? " " : "") + ':contains(' + clazz.className + ')'); for (var j = 0; j < el.length; j++) { var code = $(el[j]).text(); - var result = code.match(REGEX_VALID_USAGE_OF_CLASS_NAME); - if (result) { - if (~code.indexOf('List') || ~code.indexOf('ArrayList') || ~code.indexOf('Set') || ~code.indexOf('Iterator')) { - // Handle more collections stuff probably wrapped inside a fucking function. - $(el[j]).wrapInner(''); - } else if (code.length === arrayOfBroweseableClasses[i].className.length) { - $(el[j]).wrapInner(''); + + // The workaround for Kotlin highlights imports too. Skip them, both Kotlin and Java (faster loop) + if (code.startsWith("import ")) continue; + + if (msg.ext === "java") { + var result = code.match(REGEX_VALID_USAGE_OF_CLASS_NAME); + if (result) { + if (~code.indexOf('List') || ~code.indexOf('ArrayList') || ~code.indexOf('Set') || ~code.indexOf('Iterator')) { + // Handle more collections stuff probably wrapped inside a fucking function. + $(el[j]).wrapInner(''); + } else if (code.length === clazz.className.length) { + $(el[j]).wrapInner(''); + } + } + } else if (msg.ext === "kt") { + /* + Workaround for Kotlin. It gets the first char of a class (first index); it checks if before the class name there's another char, if true skip this line; + it calculates the used length, adding to the first index, the length of class name, plus a special char (like . ( < >). + At the end it checks if the substring matches with a valid usage of class name, so replace it with the URL + */ + var index = code.indexOf(clazz.className); + switch (code.charAt(index - 1)) { + case "<": + case " ": + case "(": + break; + default: + continue; + } + + var classUsage = index + clazz.className.length + 1; + var result = code.substr(index, classUsage).match(REGEX_VALID_USAGE_OF_CLASS_NAME); + + if (result) { + $(el[j]).html(code.replaceBetween(index, classUsage - 1, '' + clazz.className + '')); } } } From ff1788dcc31ead724dcae8a392ec2a181134050c Mon Sep 17 00:00:00 2001 From: dvdandroid Date: Mon, 8 May 2017 18:21:10 +0200 Subject: [PATCH 4/4] Fix issue with Kotlin --- content.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/content.js b/content.js index e0fbc3e..3d9977d 100644 --- a/content.js +++ b/content.js @@ -55,18 +55,16 @@ chrome.runtime.onMessage.addListener(function (msg) { } } }); - for (var i = 0; i < arrayOfBroweseableClasses.length; i++) { var clazz = arrayOfBroweseableClasses[i]; // Skip line number var el = $('td[id*=LC]' + ( msg.ext === "java" ? " " : "") + ':contains(' + clazz.className + ')'); for (var j = 0; j < el.length; j++) { - var code = $(el[j]).text(); - - // The workaround for Kotlin highlights imports too. Skip them, both Kotlin and Java (faster loop) - if (code.startsWith("import ")) continue; if (msg.ext === "java") { + var code = $(el[j]).text(); + if (code.startsWith("import ")) continue; + var result = code.match(REGEX_VALID_USAGE_OF_CLASS_NAME); if (result) { if (~code.indexOf('List') || ~code.indexOf('ArrayList') || ~code.indexOf('Set') || ~code.indexOf('Iterator')) { @@ -77,14 +75,20 @@ chrome.runtime.onMessage.addListener(function (msg) { } } } else if (msg.ext === "kt") { + var codeHtml = $(el[j]).html(); + var codeText = $(el[j]).text(); + /* Workaround for Kotlin. It gets the first char of a class (first index); it checks if before the class name there's another char, if true skip this line; it calculates the used length, adding to the first index, the length of class name, plus a special char (like . ( < >). At the end it checks if the substring matches with a valid usage of class name, so replace it with the URL */ - var index = code.indexOf(clazz.className); - switch (code.charAt(index - 1)) { + var indexHtml = codeHtml.indexOf(clazz.className); + var indexText = codeText.indexOf(clazz.className); + + switch (codeText.charAt(indexText - 1)) { case "<": + case ">": case " ": case "(": break; @@ -92,11 +96,13 @@ chrome.runtime.onMessage.addListener(function (msg) { continue; } - var classUsage = index + clazz.className.length + 1; - var result = code.substr(index, classUsage).match(REGEX_VALID_USAGE_OF_CLASS_NAME); + var classUsage = indexHtml + clazz.className.length + 1; + if (codeHtml.charAt(classUsage - 1) >= 'A' || 'Z' <= codeHtml.charAt(classUsage - 1)) continue; + + var result = codeHtml.substr(indexHtml, classUsage).match(REGEX_VALID_USAGE_OF_CLASS_NAME); if (result) { - $(el[j]).html(code.replaceBetween(index, classUsage - 1, '' + clazz.className + '')); + $(el[j]).html(codeHtml.replaceBetween(indexHtml, classUsage - 1, '' + clazz.className + '')); } } }