From bb1f4a210e2c9045f5bdf785ad398ad7d8437872 Mon Sep 17 00:00:00 2001 From: Csaba Okrona Date: Sat, 13 Dec 2014 15:10:55 +0100 Subject: [PATCH 1/3] Initial version, please review --- .gitignore | 5 +++++ README.md | 6 ++++++ project.clj | 23 +++++++++++++++++++++ resources/html/popup.html | 0 resources/images/icon128.png | Bin 0 -> 27874 bytes resources/images/icon16.png | Bin 0 -> 1171 bytes resources/images/icon48.png | Bin 0 -> 5766 bytes resources/js/background.js | 1 + resources/js/content.js | 1 + resources/js/manifest.json | 18 +++++++++++++++++ src/clojurifier/clojurifier.cljs | 33 +++++++++++++++++++++++++++++++ src/clojurifier/content.cljs | 12 +++++++++++ src/clojurifier/mutant.cljs | 33 +++++++++++++++++++++++++++++++ 13 files changed, 132 insertions(+) create mode 100644 .gitignore create mode 100644 project.clj create mode 100644 resources/html/popup.html create mode 100644 resources/images/icon128.png create mode 100644 resources/images/icon16.png create mode 100644 resources/images/icon48.png create mode 100644 resources/js/background.js create mode 100644 resources/js/content.js create mode 100644 resources/js/manifest.json create mode 100644 src/clojurifier/clojurifier.cljs create mode 100644 src/clojurifier/content.cljs create mode 100644 src/clojurifier/mutant.cljs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..075d642 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.lein-repl-history +target +.repl +out +.nrepl-port diff --git a/README.md b/README.md index df73c65..5bbb0b0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ # Clojurifier A Chrome extension that replaces occurrences of the words "scala" and "haskell" to "Clojure" in web pages text nodes. + +## how to build +``` +lein chromebuild once +``` +Te unpacked extension will be in target/unpacked diff --git a/project.clj b/project.clj new file mode 100644 index 0000000..0dcbe01 --- /dev/null +++ b/project.clj @@ -0,0 +1,23 @@ +(defproject clojurifier "0.2.0-SNAPSHOT" + :license {:name "Eclipse Public License" + :url "http://www.eclipse.org/legal/epl-v10.html"} + :dependencies [[org.clojure/clojure "1.5.1"] + [org.clojure/clojurescript "0.0-2156"] + [org.clojure/core.async "0.1.242.0-44b1e3-alpha"] + [khroma "0.0.2"] + [prismatic/dommy "0.1.2"]] + :source-paths ["src"] + :profiles {:dev {:plugins [[com.cemerick/austin "0.1.3"] + [lein-cljsbuild "1.0.1"] + [lein-resource "0.3.6"] + [lein-chromebuild "0.1.0"]] + :cljsbuild {:builds {:main + {:source-paths ["src"] + :compiler {:output-to "target/unpacked/clojurifier.js" + :output-dir "target/js" + :optimizations :whitespace + :pretty-print true}}}} + :chromebuild {:resource-paths ["resources/js" "resources/html" "resources/images"] + :target-path "target/unpacked"} + } + }) diff --git a/resources/html/popup.html b/resources/html/popup.html new file mode 100644 index 0000000..e69de29 diff --git a/resources/images/icon128.png b/resources/images/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..60702176a67a7c3ec7f0fa0c6be0dd90ccba25a9 GIT binary patch literal 27874 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 E01Wu|1ONa4 literal 0 HcmV?d00001 diff --git a/resources/images/icon48.png b/resources/images/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f0dcf5fa6b60e200e9dda23535549f29fd17c4 GIT binary patch literal 5766 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 CVEBLl literal 0 HcmV?d00001 diff --git a/resources/js/background.js b/resources/js/background.js new file mode 100644 index 0000000..7158f1c --- /dev/null +++ b/resources/js/background.js @@ -0,0 +1 @@ +clojurifier.background.init(); diff --git a/resources/js/content.js b/resources/js/content.js new file mode 100644 index 0000000..a01ee14 --- /dev/null +++ b/resources/js/content.js @@ -0,0 +1 @@ +clojurifier.content.init(); diff --git a/resources/js/manifest.json b/resources/js/manifest.json new file mode 100644 index 0000000..6b25bf1 --- /dev/null +++ b/resources/js/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Clojurifier", + "version": "0.2", + "icons": { + "16": "icon16.png", + "48": "icon48.png", + "128": "icon128.png" + }, + "content_scripts": [ + { + "matches": ["*://*/*"], + "js": ["clojurifier.js", "content.js"], + "run_at": "document_end" + } + ], + "manifest_version": 2 +} + diff --git a/src/clojurifier/clojurifier.cljs b/src/clojurifier/clojurifier.cljs new file mode 100644 index 0000000..c154f5d --- /dev/null +++ b/src/clojurifier/clojurifier.cljs @@ -0,0 +1,33 @@ +(ns clojurifier.clojurifier + (:require [clojure.string :as s] + [khroma.log :as console])) + + +; the strings we want to replace +(def mapping {(js/RegExp. "haskell" "i") "Clojure" + (js/RegExp. "scala" "i") "Clojure"}) + + +(defn clojurize + "Replaces all matched strings by 'mapping' in the element" + [element] + (doseq [[k v] mapping] + (set! (.-textContent element) (.replace (.-textContent element) k v)))) + + +(defn- clojurable? + "Decides if we want to try finding matching strings in the element. + Script and textarea elements are out of our scope." + [node] + (and (= (.-nodeType node) 1) (not (#{"script" "textarea"} (.-nodeName node))))) + + +(defn clojurify + "Replaces all matched strings by 'mapping' in the element and its children if the element is a text element" + [element] + (let [nn (s/lower-case (.-nodeName element))] + (if (= nn "#text") + (clojurize element) + (when (clojurable? element) + (dotimes [i (.-length (.-childNodes element))] + (clojurify (.item (.-childNodes element) i) clojurize)))))) diff --git a/src/clojurifier/content.cljs b/src/clojurifier/content.cljs new file mode 100644 index 0000000..94ab0e8 --- /dev/null +++ b/src/clojurifier/content.cljs @@ -0,0 +1,12 @@ +(ns clojurifier.content + (:require [clojurifier.mutant :refer [observe-body]] + [clojurifier.clojurifier :refer [clojurify]]) + (:require-macros [dommy.macros :refer [sel1]])) + +(defn init + "Clojurifies everything on the page and starts observing the body element for changes" + [] + (clojurify (sel1 :body)) + (observe-body)) + + diff --git a/src/clojurifier/mutant.cljs b/src/clojurifier/mutant.cljs new file mode 100644 index 0000000..1adb2dc --- /dev/null +++ b/src/clojurifier/mutant.cljs @@ -0,0 +1,33 @@ +(ns clojurifier.mutant + (:require [khroma.log :as console] + [clojurifier.clojurifier :refer [clojurify]])) + + +; so we can use the circular dependency between observe-element and handle-mutation +(declare observe-element) + +(defn handle-mutation + "Handles the change of an element. Clojurifies it and starts observing its children." + [mutation] + (clojurify (.-target mutation)) + (doseq [child (-> mutation .-target .-childNodes (array-seq 0))] + (observe-element child))) + +(defn handle-mutations + "Handles the incoming mutations one by one" + [mutations] + (doseq [m (js->clj mutations)] + (handle-mutation m))) + +(defn observe-element + "Starts observing an element, calling handle-mutations on every attribute, child or text data change" + [elem] + (let [observer (js/MutationObserver. handle-mutations)] + (.observe observer elem + (clj->js {:attributes true :childList true :characterData true})))) + +(defn observe-body + "Observes the body element for changes, indirectly watches all of it's children too" + [] + (observe-element js/document.body)) + From 4b4d72d72491dc39a2d9f879714dadfd80a0f05a Mon Sep 17 00:00:00 2001 From: Csaba Okrona Date: Sat, 13 Dec 2014 15:11:24 +0100 Subject: [PATCH 2/3] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5bbb0b0..aefd9cc 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,4 @@ A Chrome extension that replaces occurrences of the words "scala" and "haskell" ``` lein chromebuild once ``` -Te unpacked extension will be in target/unpacked +The unpacked extension will be in target/unpacked From b1ff656cefb417a4a37621215f895e778ee3425c Mon Sep 17 00:00:00 2001 From: Csaba Okrona Date: Sun, 14 Dec 2014 07:08:39 +0100 Subject: [PATCH 3/3] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index aefd9cc..19101f0 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,7 @@ A Chrome extension that replaces occurrences of the words "scala" and "haskell" ``` lein chromebuild once ``` +_It requires JDK 1.7+_ The unpacked extension will be in target/unpacked + +###[how to install a Chrome extension](http://superuser.com/questions/247651/how-does-one-install-an-extension-for-chrome-browser-from-the-local-file-system/247654#247654)