From 674cbb69a4ac3d6ae5d45119a85a76b97378feb9 Mon Sep 17 00:00:00 2001 From: Mike Andrzejewski Date: Fri, 1 May 2015 17:07:16 +0200 Subject: [PATCH] Complete implementation --- .jshintrc | 3 +- Brocfile.js | 2 + app/app.js | 9 +- app/controllers/.gitkeep | 0 app/controllers/application.js | 12 +++ app/index.html | 2 +- app/routes/.gitkeep | 0 app/routes/application.js | 12 +++ app/styles/app.css | 0 app/styles/app.sass | 32 ++++++ app/templates/application.hbs | 16 ++- app/views/application.js | 1 + chrome-extension/content-script.js | 5 - chrome-extension/icon.png | Bin 13821 -> 0 bytes chrome-extension/manifest.json | 26 ----- chrome-extension/popup.html | 3 - chrome-files/manifest.json | 26 ----- package.json | 1 + public/content-script.js | 141 ++++++++++++++++++++++++++- public/manifest.json | 37 +++++++ tests/unit/views/application-test.js | 5 +- vendor/.gitkeep | 0 vendor/c2l-settings.js | 35 +++++++ 23 files changed, 292 insertions(+), 76 deletions(-) delete mode 100644 app/controllers/.gitkeep create mode 100644 app/controllers/application.js delete mode 100644 app/routes/.gitkeep create mode 100644 app/routes/application.js delete mode 100644 app/styles/app.css create mode 100644 app/styles/app.sass delete mode 100644 chrome-extension/content-script.js delete mode 100644 chrome-extension/icon.png delete mode 100644 chrome-extension/manifest.json delete mode 100644 chrome-extension/popup.html delete mode 100644 chrome-files/manifest.json create mode 100644 public/manifest.json delete mode 100644 vendor/.gitkeep create mode 100644 vendor/c2l-settings.js diff --git a/.jshintrc b/.jshintrc index 08096ef..fa89582 100644 --- a/.jshintrc +++ b/.jshintrc @@ -2,7 +2,8 @@ "predef": [ "document", "window", - "-Promise" + "-Promise", + "C2LSettings" ], "browser": true, "boss": true, diff --git a/Brocfile.js b/Brocfile.js index a69fc99..38855aa 100644 --- a/Brocfile.js +++ b/Brocfile.js @@ -17,4 +17,6 @@ var app = new EmberApp(); // please specify an object with the list of modules as keys // along with the exports of each module as its value. +app.import('vendor/c2l-settings.js'); + module.exports = app.toTree(); diff --git a/app/app.js b/app/app.js index 89c65b4..91ba2aa 100644 --- a/app/app.js +++ b/app/app.js @@ -11,14 +11,7 @@ var App = Ember.Application.extend({ Resolver: Resolver, ready: function () { - var doc = Ember.$(document); - - var elts = doc.find('*'); - - alert('ELs:', elts.length); - elts.toArray().forEach(function (el) { - alert('EL: #' + el.toString()); - }); + console.log('READY'); } }); diff --git a/app/controllers/.gitkeep b/app/controllers/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/controllers/application.js b/app/controllers/application.js new file mode 100644 index 0000000..bacd447 --- /dev/null +++ b/app/controllers/application.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + isActive: false, + + isActiveChanged: Ember.observer('isActive', function () { + var active = this.get('isActive'); + C2LSettings.setActive(active, function () { + console.log('C2L extension is now ' + (active ? 'enabled' : 'disabled')); + }); + }) +}); diff --git a/app/index.html b/app/index.html index eb4356c..6d52b9b 100644 --- a/app/index.html +++ b/app/index.html @@ -10,7 +10,7 @@ {{content-for 'head'}} - + {{content-for 'head-footer'}} diff --git a/app/routes/.gitkeep b/app/routes/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/routes/application.js b/app/routes/application.js new file mode 100644 index 0000000..d256166 --- /dev/null +++ b/app/routes/application.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + + setupController: function (controller, context) { + this._super(controller, context); + + C2LSettings.loadActive(function (active) { + controller.set('isActive', active); + }); + } +}); diff --git a/app/styles/app.css b/app/styles/app.css deleted file mode 100644 index e69de29..0000000 diff --git a/app/styles/app.sass b/app/styles/app.sass new file mode 100644 index 0000000..2ca5f46 --- /dev/null +++ b/app/styles/app.sass @@ -0,0 +1,32 @@ + +* + color: rgba(80, 80, 80, 1) + +body + margin: 0 + + +.c2l-main + min-width: 250px + + + .c2l-header + padding: 5px 10px 20px 10px + background-color: rgba(192, 192, 192, 0.2) + border-bottom: solid 1px rgba(192, 192, 192, 0.4) + + h4 + margin: 5px 0px; + font-size: 120% + + .c2l-legend + font-style: italic + font-size: 90% + color: rgba(128, 128, 128, 1) + font-weight: 200; + + + .c2l-settings + padding: 10px + + .c2l-active diff --git a/app/templates/application.hbs b/app/templates/application.hbs index c940bac..2e9cf15 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -1,4 +1,18 @@ -

SBrOwse

+
+

C2L

+
+ Cyrillic to Latin alphabet transcoding +
+
+ +
+
+ {{input id="c2l-is-active" type="checkbox" checked=controller.isActive}} + +
+
{{outlet}} diff --git a/app/views/application.js b/app/views/application.js index 3885ee0..3e0328d 100644 --- a/app/views/application.js +++ b/app/views/application.js @@ -1,4 +1,5 @@ import Ember from 'ember'; export default Ember.View.extend({ + classNames: 'c2l-main'.w() }); diff --git a/chrome-extension/content-script.js b/chrome-extension/content-script.js deleted file mode 100644 index a4ee346..0000000 --- a/chrome-extension/content-script.js +++ /dev/null @@ -1,5 +0,0 @@ - -if (document.location.host === 'wol.jw.org') { - - debugger; -} diff --git a/chrome-extension/icon.png b/chrome-extension/icon.png deleted file mode 100644 index 8e9e776ff36b5de4e189ad102034b5558598c42c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13821 zcmbVzWl$a4x-FjI?(XjH?iwJt!@_mp1b26LCpZfU!QF$qySoIJm%Yz<_wIM<-aoIa zTITr1n4ip^U0pq^BUF^65#jLQz`(!|Wo0B(|C~Mk+CM}5IsSkt2>EjYcUF}a1FM-J zIR4Xsb(GO|1_Ogf|7!;a%gn|B1B0TlQrB|PQdHnGb+BVHHghlmFnQQH{$YcG33%}R zxwHeg7?XI|+1fkvc?gpI&EWfU{TIwkM)Ehs#YT`!OHqYH+yMw6;bh`qVj&ZPBOxIX z0GgTesY*!wTmGjdNM`Bc;>gF$?C$Q)lpNW?^GyV`KcoV08AhcQN*0 zw09=|S113s9|?f7DbUK%#md2+O&nZZ1j)$$a`a!@zv6VUGXHN+_RjxK>raBr ze_5DWnOKVJ{_W%*xaW~Tp@m7^=r_V1j`Oql_;06T!ai}N2H>;LHPPi_B8 z`2PgyVeI%XXMY#*U%3hV6*-?Oz}dmp^{*0qwYPE+Viov1q5p*cyCVNmi96Ui0s+p> ze`G?O|Cam{`%k{sf4dRlX8X6`pWuHAlz~=%GBy4yuK$YZpV)u$wf`pv{{;Ub_^b4M zDpno|FHZ+ zX=cjj>}p~SFm?IIc>Ni*zwdrAV+-bgzyi$wBU|9ly}+mFU}k0RDPima5MpCtogy66VKih$Uu>xf!MAbdO&wW0n>kXt_Am%t!4SK&|eM^#MOYM;&flL%h zOmW7u;_&q1J6wC%cv$QZtiH&-$RM(sdg**Pwx08GSg%m~>X*akdNNmTt%Cw}vhur! zyxaRqTW>6Y#1ZkRvj5Yfe<#e{SFtTRfOAYyEx1n#%1^mvz1<@l5kpF-8da`Eo@cx% zP1u0SMu6GXZPH3YfVVIHaQ6#<30(JUpul8-ISnjE3nB;BlL}8 z(B-JwsGdga1Wg;+aA;Mfwwf2sGiiQjCa)Dk%bk2;I-5JPcRFfx!6Z(C`Z1*`x4k3*OH%5yZTN>nh1Z-QStSs2s z>KtV^S9$iRRyKe*hB9;Yf)1bKE-!_jJ5SfXsjpP3TFqHktCl2=4VM741^cFsS_LTk zJ(zk2fO;%xV`gl}E^Ha$<~$m97vC>CJME?`?j`B78FM)I`EY4b2_jmRR&-M9DKvET%Az5~jMDG7)0S{S{lB6lB(nTF}JK+69_khtryBv(tnB0dNx#P|HqmxmN)RJu#!K*{A z#3WtziAqN7i=3(>Zo4`wkozflY(H_ti~e;&Zes;jP(f{;3fKv1G&RODfWA zyqb}bp1(#Z2GmL(0^-w4yKGwY7Zw*HJcu@uD?KVA_%QT9=jD!Djg7gv>1xjOF}T|y zJLdC`ap7_xQ(1#S<$M6cagk=}H!}BQ;z*R3!L{57m23mg2XuVlXW6fmPcZXjgwD&E zUa;iy>7)A@=e6(wUw$|{fu=}8q;tOFMH=5?f={8F*5eCteG-A+HhONJoNl48k_w45 z->2Xgk_OBiNpOtU(dm<=wQUKVMClfsy&O$qxuAWZCwvHYS(;Gom_N7we+W#R4 z%tNjufxG`32}(PUFQ8cd=xV1~RTZJC4z4EZPG8#Qq5${FdIh=!V?fX1{V zA?RgVIQ-aM=GfkqnE>v5$i}qPJc*BSh9(OB(B%XWgYKxYwIjwmhoF#$8wj{uP&w_FgXg>KpZHQZ+ z=P`Flk(xbagsts|+A@uun+h8lsXUX61@yDabO|JYQg(HeUAZxSDO*|UQKGh=f;>5BHK$7aP z6_#?@l!Rm=UZgXyD(EBajCAb+z4gw8@^eJV-JEeQ7T|z{rf~e7c!17IoA-mCpyy+? zCT&S9e*17v&~1Yn&d$sEr@WuEzXHOYm}Z zxUO%f6Dr)sX4I?S#olC@vi-KC49jbY-Z+u2SpsiG!jXJ(L&uJAh^MypE<>s@kfp|XT zpsrI$N7)2bXe=!Rty_ro2n9Dij$H!fdf;O#&o=XGjQ0)=W2oY1=Ckaf^L4n^X&h&n56th5F-i~SdejfzRSGdaTSq4Se z>(e}jSry@)!Sc8f^RE}C=puT>V2OwEfKya6QS6L(&~b9{xsh_@B3}9(A`dwWBn{sL zXfeeWz-NYi*X&t<)%pq?tTJZQ(Gppviqa|5;LuU`iqWH_u1D*`z$J@HFCT18k%U}h z8DIrI-Nl4QNAvv#-CCF=05V(6L0o}6XV@uVnS)c3Pvgj`0M>ESYPBm9wB>b&89JTP z*$%`;+#9)S-7StJLjS7=2tL@p=U!|CRchXWbFpgpgA+4=y^+02=W zCC&tsA!scUc=TSuT-{QnB(>3a8B&y*#a`HUZ+^d8?b#qhX@fJD(=_8M!JK&o`cL z=tn&CYU0IZ6aB>*Vck@^hW&0tv}lpz!xQIVeoEq{Hpb4egok=k)~M5^OzaJ|gLerx zwn(qe=U1|q?@i&;(&cPRLCQMtxOy?5%3U+nidgNT@acpoRIAdlvJAs=iZFm!P$q$T zY$*}cYTGi2k!3ok>CiDNHB#ahL7?^Wpy5Ei*kNp`wPuFaa=@_;oSMXUFB4OfaFbR| z5aVnHCl!eCsS_ff*4kKFH#ET*RlXeYhfMa2`k)1?9Q#1G}C@4h7#2^_Q2|Mi#7j%4^ z20kXyW8{}kTh8GjuE0YDaQ?&>h{eMak+}GYV#1bH;>s+Mv?1pscA{XWkdvKOcq$UV z9dt)>-OE@QplJeUgGyTg;(Ouwy&g}FZqp|zebM^ed5&(Cd%^Eag%(j|*wyKl zENk^8S(}n3N`QyQV~EflDyZlA*(({-ApoKdK1@tLmHFeI-Ot9Ar(0j6!=Ox+eqT)? zR&tL-WoFryEGhTO3z?X&-F>kp?c+`O%vH&;RS)SGW;foI?B~Le;zV+_V3`N3N=$B5 zsF^7go^p(SK{9cJh#PEE;s~(l5{jSTA4Lx&@OMOJLHO#VSTUp-tHdsd`rfbP+(#*y zX7UeNmlpy)XW!NL77f0gPw-zd(7huxYr-{3Y#h6+oV$I7QYQ_-ys^9+9B&qSdb-cuDSo{7;E$lQmFZ(%AhzHN)(<=k0m}d=*5)&1SBO+eG zOMs|r(S|Jp>-YT+S2rD7t|D9*iEtY-RhD03)|5N2c|+$;ZOTM~UfXvW3T#$Do<=@G z>j3!kNIen8q>)&KpGn8jvu1T#zqWk$LiQLL8IPvsZB*XP?fu^;+&gdAoF_RsIRgaz zg?ygxYWl(usMM6z*m;TtCNuNEAMzI)+#hnw@*eS|bc!Ku3~-zz(P`lzNu&L>D+(rL z7IpzpHg%Mb+!-?77xIQD`YrV>O#@&p%%ipnAr#eU=imzy5i=B!12FlAJbvB6Y#c7n zdn1Ia%?^I1x*fCS+;}5bB419q?ONYMV=N2aZx0RM<36Cq1BK$F$1&U+ z{$Sc5laT&tu;<5a$*}1?jvY_K;NM7@F{UCj9>sRKI^3{v=u+o2-k&Q^u5J@|D zd|UlN?0Z{YI^nrxD1xv6185P0jX^0_LGUIL@IZ;7lpSMJ#U!q@Zo)Lxgoo<)2#LO? zO@XZ9MjRD>J62w-(!RawL)IkM`W*HMb!s#Wv24qAhA!TQEy z%|jBd`!;8NJw4iGVSW-0P%PlitRvKnZzUo%vwdJVNY`Hv!oR04Xu;@TwtN24BanDX=zhm;5g!O4} z&OMH48o+Q$qy}>e6-1keNcq`0IBd2!AKtl)ZcHFfkvw-pBL7^sml3i0nGgJmXx`>_ zF6LeSHNPeq^ZOZVszT?>L6#$oxS({$Hsb9aTLF4)wv98uvf`SkdgJt8RHk(8I!E=Yjfgf%PCg6Ud=kET{>GPrjZ6#76 zWo-SJ4eqmQ*Bl~7N+X3fm7rp2ZLTWg=jXTmRrG}^IC-5w$lJ`;@^c52b0n8*#eBKN zlqQ^ti9ykH`rO$l40t4X;qN?tY^0E}@MOW**jW3upH6+Dh}6ot4Bx(baGc&Tq|)Bd zKOm^wdvzE-jcWRSylmDQbhM&W-)HecdOh9jySlo@+gSQ_7!Y51RboOE7F~^6Q?~YV zEHdZ%ZD<=JkKlw;I-E|M8mRZy1d?c0vJzFDPrZ<_PC0RLWD7W%;01d8zG%CYL+yO% zxKu=+&7bxVG~gg=MZ%#$`TTk$Eu2a9eph>dU}<*SRO>?siCuyCh(sWu#kjk$pm97u zt1PU~7>nUs)Ahm4-0qJHB}K6*@%XHS4&CM$kTW2IVE$TV+bO;a-$%??HhmmRz{4WA zyuEEq+e=^D9!N1yW(wSNzefOutsR}7e!E|`u$W7zNDzC}gLs<~&jV`?d_jQelV|SK zV$`GwoT+s1z0I26k=dRUxK*&w#4dK`%hFvO<*$Ce`R(jPG)eO{MhZG*K!WPi{=+=B zp@JFvtV$@TC#f`0!LsLo>B zc~XcUwMKv`plk|fHW{;iCn1a|b8{Yg&Zx%5+*CgEZoVBqKiCM@Rl9*JQ6}gm-{$?) zc~VjQH5A`Ie#5#+Cu>}T@!*Buy|>Zd6CC62^l*G7Qbo#*DPXWB6Q9fWr^Bta9}UFs z_v&ih&E;$Ru5V-+OgF>~V_l=<2W%`9cHg=7w5ytUFj|5VsBfB6tMZM^1i3;UHneZE|@DAE06Pi$CXMMq)Jtjv5J2 zRKhXZ*=@crxR9Ry*RdP5>1TDlWA9k9xLa;xtJh)dBd^OJ?O4a26|JQ`XY_^= zZZs(?fEp)NXlkmG_6eDgr_SMl=vNy{sd1GuMdIN^jNpr7hd8w+&zYT~F1bSiNZ~LiGW>;iDKMP4Ym51v|HWE9;h9oRq3^ zRidAzlfF`UWCfP*&WImVl=jQ+nMP0LG$H~a%OZ0yf9u*Dfh*z5-1=#3HsRaT0(#WJ zqVD;BW?h<-QRuZwGE*TT%&ByIW5J>T8LkXC#Wj!N%9SbJ$z3L9=df7()@HmR+#_?ZLt(b>PL4&ENr#tYd zzq^Q%(A%Cmt?jtq?Rv+r?DKW&e~HPeicxA%DC!B`v~0{3aQg8Os*Up!<(vUIy)D!* z&g(E<;t4h0|NNuRRH|gU^JbwyS@2Cha)y&bx6zt%p%(50!@gUH2JT6@orJc^fSR4x zfo%K*-G=X|?c2CK9%lvv^0^{_D`{AZUbYy`#XO?M!od0RQt4GLegtpNEsqXT>X2ko zyr;+L;FS3Z>uxS71#LP664qJkr!0k0x5<9w#0ArpE-4a<7Eq_{LhkE|16Cxkf~iX^JBc#;+)U26wD@U%Yy{^R{=qV)hqhDMBFFM^ao zs(H1{fq=@sfx{*w_q_rPv0oY1Zv?)J`xZvx!SuN2yN|cMqCX-0yBve?A`KAw_E3;ght4>F! zZJjQRPE5-t1g^(!mq5D1&4XF=5G&5UVb!28@qcMRga^oH=iy&eoZF6I~`{tP054gE~#d_ z6a1?@3Y4dlv(a?eaV^LIHv^N=!JlTSsz-Z4TOu7ok+LzL2b@tq2|BQxGy)Kf_4 zpO3L?K9_ccm%^W~vn|dO3m2YA;0$`_G1;) zsxmqAA{|FiDA;i0@^2%*X706n)A_^mUI_VIy}omskYbYuRhyc_gC~d32_rl|Xn7ihynslRisK9MR9JMS9sXKk$xs?+D81;|x1XvPcg)ZWx z*XkglWrf7buHy@4-^!g;>wrIDaFy9K!h~Rb^NMPz*TMQ+#!7dyOpzkr3ZvAvp1bga ztD}da?+cTJ9m#LfcBStDO-l+CJZ|2TQzH+%Ux*i8VAqmdsl0WDKYfm{H&B@=jQHij z!g&zY)|+vAv3CtZ7yuJtl8D0wmofM27Ax;+Y03lu*Q6plz$HIL z>f34}2m4i2n!)D%0dXpmL0w&CHR=VO+t29ZaVbIiFl4$PadnFHTq}pn_jiQ&r~GKJ z3f-H~Rd7L80s|#%%SH_7;iZBF#r(+vo}?$F5Qa@&AV6QmldfBiqZS9E5~II3zeogE zpR{atVmP8~`u*C}Bl5>^hnGfq!ZC|9_3o!nVU*c@Y+f6#=E{zDJOYf< zAPNl{byz`W>|nWT2Y+g@&NOkaZafa)_L&c| zpVP;*a|oOaH&#cl3D(8D-E@n-#=od)QS|>*N$vmGOx5O zxL2#B2*i>ip>ycFW~Qe6A1!gTI;MSprjeu`^-)t`0tvr4L@AVquu~=A%Lx`u?NtW3 zbwlressU^peQYd-A%BD>RQ6D+0=;+MjvPM@K0r+crlO>dgIV&&7SVK)GNDokgq0R} zkdmx1dD6a9WObHM9+8F4+MnY-B(mhSx6qSkd9bDvCk$vKWR`VvR9si(cW~j z*Sn8`OEAdvl67#W63VS`l^Rq~FsAfzG?L&*Okp+BKYE5|dtdd?#ApY?fLI+kar4LHGHjB3#2L^TBOXO@6LGmFn^o% zlEVzOYlACNQMIURf07{FW{+ywAI!Rhqjc)m-rz=fCDSnM25S0!^hbR>ULCA*Td>i> zP$B2&7qE_f^^$>(l=Oa#lJAgv?zh4MmBu#V8WPeKByt%*b-B- zVFJ_wsE$cSOQJYPCn$PodT+xFpQj}@zp+tX?}|R{T!#bZ5A7e9ESLszkL?ePJJQA0 z7Hc`V)fqIL8tY%IM~t&-(%tOP>vFUUYJ* z#S2&yd~+gHX}?E<={%1WNr{r-tJk3$uR-S2oA~D_=kZ+tt-9uUR5)ET>V@(!1u#`Xf{d)e-mh9O$l%18oO|e8Q zl8j66bd${^*l1ys>*W{n>I-4Z?+%II)Q2yrMqQ63^EH=a`$(lsYUCYADe3qyrdS>& z3#ZFPATv7~%DR518Sd1x;6`GnPGTAz%1ex0$nlYl4m!(UyaJgN+x=9CKX=qW&I(UJ zSbnxlnc&lHAvI@?e>d1C%coJFeA{I&GDQa{#9%PGmb!2FrUgFIwAAezDwk}#a*eon zMCs=09yY!dmWxA@Yw^*j^eM7nyxowyyZ*ZDb)iy*O%=c$Y^IYz-|yg1%bn$PJ*g(d zp_jD>ILJq8ZWknLgnUj5WQ*_@3sDqJ6SMB>YtOe%5uwcL_}F##q%tz5@2Vp`Ff`nd zDv_J46j`;*R`)K(fX^JI_&8R+jP(6z=z3dfeYSnwy7GX)Hy_|^fIpmk-`5llt9E)q z$hV~#9@aQV``tqO6%$H#2yTgxbir(=9C1ET88HufipL)7w&eIKQ?3(545ye*%{0)W zK9lJ6X#C2Ip|~6IfL6R{W2o&L&4UVU=@j3bdg-GUeEmu{a^6U~?dXK3`-bQ2y@OEe zsj`Fm09hC_5}}aiy?kDKTXj)UdJgUrM^KF8F-iIk1Z?2KiU>ky%bG26RW|gL89_S0 zkCu*NL9T)u&C7@Fx$I$sRp5g5&fR6AsBgEe(`8Xp*qQhckJMTNln-VlCF*2}bG9Gs zDKtR%tbg%H@(4C)c{F?#v{HBc?4#^^P|hi+$M)QhE&O$KVpj2_|6LOn_fb8ufiT2{ z%CvFPUetyQ9m_=vK~C*i4K;Ii!vtPPyAB1h7=UU#D^I;pZ9s(hvpm-PCb1Mb=3A_Q z*Gs)CJ;+EY20G(Fjbp)YA1CIE8iNq4SZ2Xs>})lCxri|L0rnD>n=v&lY2;_(EEl#g zNFdF#15u0f^iA%Qeol8@@xVYG0+O+WYlU7Ro$3=K6o*u=1etxgO+{iW@XFR7Cgdcf zQlXOqL!o-FK}9l3iUloT&;@3u@1o95r;82eurAcc@z>kJ(89qNDny3K3n8VESQaTt zy9Ra*>gw5BoDVBTpZECqc{O0AjJjA@=qxS6SmTDo^|%R7d>S-P)OJuy znUE=bavF&lT(TBwZ+=RJ*j|)>bC}rarYeWrMwbRwxGLx(ueJpLSfRzmQ-Huej=W|p zi?PU+pFRo9&)3F`Ew0Ffx-UBZJfkqj4%U^_nyZKj%;d7fDikkwF5Uspfz$aiAE=b2 z`A*5G*)sxjmf#1&`h_$=uI_sodcX&8GAx-(9wvt{T!iXGA-X7nfD*bU`)gY74bz(T zDfMJc(9~3~doqXZ05H-^W`J9jWNt`(jr#~5O2c<=!D{ELHz$0o2L5Rx>O+bX2Q6gm zVMs^m_aAk6iok4czdJ=5m0cl)K zg%@6YZhS*Eq?((pEQ!dMY1k4-TRQj%ENwHwK{?iUI*ju5hwX5xj?3;jtR;cUiu!dhR1pC zsJe8k@M?kr-eAcIj@oAqkP2NGjx5?lfTpZXa3eUci4V~NEX$nNAy7L79>gn4GTb#ORusj0$>*IaftDEKP3vO!h( zjt|kGJDPao|L4`@c$3q`Vf5j-KAZUvwF?()vl=aGWj99<47g`)$vVX*`wGkFCUJPyRrS)2_X2p4%5XGsL-^s2_(Gv^807tGV{emU5D&yV2vQR6ZWQ?6O6`U7esgO!Cb zuB1jyI1ZVuhiUJ(wqFxZbmUJF!l)SK>drT^-HD|M63t`u_|Qt&hXE>Oq{I=}{N~)M z#EcR@*Vwu*=`j%%v*&rSD-m3w=`xxP%%Z(W@dAXTpQ8P+g?!}7fJ7|Nn$TV56>VatUj%Q}!9uvgg?k_!dwPr~*HD9@#762v^U4YaXSxALl;JLJI?v&SXeFSWcKF@9XevyXBOdq z!RiyGCdv)>V)kMpa3}QS#*xh>z5zvp9j-gPx{t`xFXz;P%!9y;L!jBCiDwcaps<(q zNnn{G@d-^bvA2>H=`hQZ@t#(64~Zk_`oIh~( zXJ}ui%qpFHb%*FWiV~6<`h%l{0uW1f?C5em7ffAXs)_-@<;dA+SRyd+0`<-sB)HLvl8|ZjI}a!VaVUu! z!e5MDck8WQ*+|owvLYZ2>th+N*r1gx=Y~_PN$8VgeUJOEG!<|UM48g=V{;MWkoDJY z@uK!k6WDeLc{r6YTr7{50;$jmxT5+hf-+Rdz_EIios94m8E}b@oCTjXCv_Q>j1Z?4 zRW5uc5eDwU+h8`grDt2X&Y1Lz(1Z z;#=2uJ_aaglZ{XSQD0hhsUhjTCk3b4{9fcUWYhcz7tfWpmX<88W@7a< z!_@@#vqW!-EXY|5nCOk54o1KDll{Pf#G{~9N9aZsm?o<0Dld3k=rp`byXqB*} zEKR|vm9MSXh|r#jT>!*m-U{Dc!}I$ou4qwl>lWvT?R9v}D8fRQ8yP`14>jMV3e$UX z?;FPk3}Ph*)xK%LNIU%;sGO(jfFOm=0AsS!bxs;#RW4_R5G`jhak?c7-1uDGoR)p%v*|A{g>i&RoX=bMBDFL3}pqEdRG%9irl~^*Gf-RxDJCmQd0;dc` z3x^4wRMW-TWKwtOGH4=pfbcB2x1bwAqh5A13`3E#wq4eud{Gwn}#d~n% zQ~Q>sC%Fga)zPOgkxM$G2HrWL#h03Sk~QwC9}hd5b{ynKf6U8LBql^NP^~`$K@Ox^ z&9q}2V?pDnZuhy{!nbWA1`gdxprGMSusgj6IE;ITF6luK!g>r&w3o6nf{m4P@KpnE zhV?ys#`ebP9U7Zz;w!f`v8btK^L5ddRTPDOk**YePuN3z&iwfq?18@?g9NFem;!3M zT>_0C&d#PKHVAFk9XiY@-4xnS^p)n*l4n0A#}d|^{ZG5Woe9dRvWE_GHNJi}_&txY zcGWO#tyZf6J3Ldu<>I&;Ej*wellJ_?_Cw|H&3%cS0qvb+dLVa1LO7{yl>RG};St&+ zIxFp`W(*ofnAB4|EGK!jFArdOiicTdY*-nHaAE}f6GO^EkLR1pFv<^tX(D-E4wVXP zwf-ZO>s5oDW_t*{l~X!ZcI#BszWfG_8c~)q*^(78($i%k98)6W{v|N%uC(R>V-<@5 zj+E1`BYfya1JubfN2GfwzsU~q#Ul13gsfYjh~(+&qBxm8uC{VDquiYfJ(d(;>>P~d zEF9Vju-v3V|140lVG;4aeJY84Z4aKe4(w&f?Nx^983be*ouc>&bt>>FYv6+!BQr#j zgYfNder`#LQGaCnF}r%+(89>XK|kK8L>i_+iEX=%a|>7iCzOZY?A65i4y5H1fjx(q r)YVgs!r2JV(nLNt!qyZIe&9&FHhd`KWBq^qlO-#uBvB(~6!?Dt2i~O+ diff --git a/chrome-extension/manifest.json b/chrome-extension/manifest.json deleted file mode 100644 index fd691be..0000000 --- a/chrome-extension/manifest.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "manifest_version": 2, - - "name": "sbrowse", - "description": "This extension transcode cyrilic on the fly for the current page", - "version": "1.0", - "icons": { - "128": "chrome-icon-lg.png" - }, - "permissions": [ - "activeTab", - "https://ajax.googleapis.com/" - ], - - "browser_action": { - "default_icon": "icon.png", - "default_popup": "popup.html", - "default_title": "SBrOwse" - }, - "content_scripts": [{ - "matches": [""], - "js": ["content-script.js"], - "run_at": "document_end", - "all_frames": true - }] -} diff --git a/chrome-extension/popup.html b/chrome-extension/popup.html deleted file mode 100644 index 5eb43d8..0000000 --- a/chrome-extension/popup.html +++ /dev/null @@ -1,3 +0,0 @@ -

SBrOwse

- -On the fly cyrillic transcoding... diff --git a/chrome-files/manifest.json b/chrome-files/manifest.json deleted file mode 100644 index 0fc9501..0000000 --- a/chrome-files/manifest.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "manifest_version": 2, - - "name": "sbrowse", - "description": "This extension transcode cyrilic on the fly for the current page", - "version": "1.0", - "icons": { - "128": "chrome-icon-lg.png" - }, - "permissions": [ - "activeTab", - "https://ajax.googleapis.com/" - ], - - "browser_action": { - "default_icon": "icon.png", - "default_popup": "popup.html", - "default_title": "SBrOwse" - }, - "content_scripts": [{ - "matches": [""], - "js": ["content-script.js", "assets/vendor.js"], - "run_at": "document_end", - "all_frames": true - }] -} diff --git a/package.json b/package.json index 8e0d383..035be2a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "ember-cli-htmlbars": "0.7.4", "ember-cli-inject-live-reload": "^1.3.0", "ember-cli-qunit": "0.3.10", + "ember-cli-sass": "^4.0.0-beta.7", "ember-cli-uglify": "1.0.1", "ember-export-application-global": "^1.0.2" } diff --git a/public/content-script.js b/public/content-script.js index 4a35ff5..29950a4 100644 --- a/public/content-script.js +++ b/public/content-script.js @@ -1,2 +1,141 @@ -console.log('PAF!'); +var dict = Ember.Object.create({ + 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Ђ': 'Đ', 'Ж': 'Ž', 'З': 'Z', 'И': 'I', + 'К': 'K', 'Л': 'L', 'Љ': 'LJ', 'М': 'M', 'Н': 'N', 'Њ': 'NJ', 'П': 'P', 'Р': 'R', + 'С': 'S', 'Т': 'T', 'Ћ': 'Ć', 'У': 'U', 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Č', + 'Џ': 'DŽ', 'Ш': 'Š', + + 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'ђ': 'đ', 'ж': 'ž', 'з': 'z', 'и': 'i', + 'к': 'k', 'л': 'l', 'љ': 'lj', 'м': 'm', 'н': 'n', 'њ': 'nj', 'п': 'p', 'р': 'r', + 'с': 's', 'т': 't', 'ћ': 'ć', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'č', + 'џ': 'dž', 'ш': 'š', + + transcode: function (text) { + return text.split('').map(function (c) { + if (['.'].contains(c)) { + return c; + } + return this.getWithDefault(c, c); + }, this).join(''); + } +}); + +function css (style) { + return Ember.keys(style).map(function (k) { + return '%@: %@;'.fmt(k, style[k]); + }).join(' '); +} + +var progress = Ember.Object.extend({ + el: null, + + init: function () { + var style = { + 'position': 'absolute', + 'left': 0, + 'top': 0, + 'background': ' rgba(255, 255, 255, 0.5)', + 'border': 'solid 1px rgba(0, 0, 0, 0.5)', + 'border-radius': '5px', + 'margin': '10px', + 'font-family': 'sans-serif', + 'font-size': '8pt', + 'z-index': 10000, + 'overflow': 'hidden' + }, + bar = { + 'width': 0, + 'background-color': 'rgba(0, 192, 0, 0.25)', + 'position': 'absolute', + 'height': '100%', + 'z-index': -1 + }; + + var el = Ember.$( + '
'.fmt(css(style)) + + '
'.fmt(css(bar)) + + '
Cyrillic to Latin processing...
' + + '
' + ); + el.appendTo('body'); + this.set('el', el); + }, + + show: function () { + this.get('el').show(); + console.log('C2L processing started...'); + + this.setProperties({ + count: Ember.$('*').contents().filter(function () { return this.nodeType === 3; }).length, + index: 0 + }); + }, + hide: function () { + this.get('el').fadeOut(300); + console.log('C2L processing complete'); + }, + + increment: function () { + this.incrementProperty('index'); + this.get('el').find('.c2l-bar').width('%@%'.fmt(this.get('index') * 100 / this.get('count'))); + } +}).create(); + + +function processElement (el) { + el.contents().each(function (i, content) { + switch (content.nodeName) { + case '#text': + Ember.$(content).replaceWith(dict.transcode(content.wholeText)); + break; + + case 'INPUT': + content.placeholder = dict.transcode(content.placeholder); + content.value = dict.transcode(content.value); + break; + + default: + processElement(Ember.$(content)); + } + }); + progress.increment(); +} + +var alreadyProcessed = false; + +function processPageIf (active) { + if (active) { + console.log('C2L extension is enabled'); + + progress.show(); + processElement(Ember.$(document)); + progress.hide(); + + alreadyProcessed = true; + } else { + console.log('C2L extension is disabled'); + + if (alreadyProcessed) { + window.location.reload(); + } + } +} + +var extensionActive = false; +C2LSettings.loadActive(function (active) { + extensionActive = active; + processPageIf(active); +}); + +C2LSettings.whenActive(function (active) { + extensionActive = active; + processPageIf(active); +}); + +Ember.$(function () { + document.addEventListener('DOMNodeInserted', function (event) { + if (extensionActive) { + processElement(Ember.$(event.target)); + } + }); +}); diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..3dee692 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,37 @@ +{ + "manifest_version": 2, + + "name": "C2L", + "description": "Cyrilic to Latin characters transcoding", + "version": "1.0.0", + "icons": { + "128": "chrome-icon-lg.png" + }, + + "web_accessible_resources": [ + "assets/vendor.map" + ], + + "browser_action": { + "default_icon": "chrome-icon.png", + "default_popup": "index.html", + "default_title": "C2L" + }, + "content_scripts": [{ + "matches": [""], + "js": [ + "assets/vendor.js", + "content-script.js" + ], + "run_at": "document_end", + "all_frames": true + }], + "permissions": [ + "storage", + "tabs", + "bookmarks", + "activeTab", + "", + "https://ajax.googleapis.com/" + ] +} diff --git a/tests/unit/views/application-test.js b/tests/unit/views/application-test.js index 87a9a92..5c5a688 100644 --- a/tests/unit/views/application-test.js +++ b/tests/unit/views/application-test.js @@ -1,7 +1,4 @@ -import { - moduleFor, - test -} from 'ember-qunit'; +import { moduleFor, test } from 'ember-qunit'; moduleFor('view:application'); diff --git a/vendor/.gitkeep b/vendor/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/c2l-settings.js b/vendor/c2l-settings.js new file mode 100644 index 0000000..d2350c3 --- /dev/null +++ b/vendor/c2l-settings.js @@ -0,0 +1,35 @@ +/* global chrome */ + +window.C2LSettings = { + activeByDefault: false, + + loadActive: function (callback) { + var activeByDefault = this.activeByDefault; + + chrome.storage.local.get('c2l', function (data) { + if (data.c2l === undefined) { + callback(activeByDefault); + } else { + callback(data.c2l); + } + }); + }, + + setActive: function (active, callback) { + chrome.storage.local.set({ + 'c2l': active + }, function () { + if (chrome.runtime.lastError) { + throw new Error(chrome.runtime.lastError); + } else { + callback(active); + } + }); + }, + + whenActive: function (callback) { + chrome.storage.onChanged.addListener(function () { + this.loadActive(callback); + }.bind(this)); + } +};