type_station 0.4.7 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/type_station/editables/admin_bar.js.coffee +2 -0
- data/lib/type_station/version.rb +2 -2
- data/spec/dummy/log/development.log +403 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-1/-10rQme50p6Wweb3Wq6CrJWl6V6adB8FUd-QGx37n-Y.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-E/-EnK7iHIgtrb6US5s9rqFOOp7Xe30iBs8b8TVubIWO8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-_/-_vP4UrvVxIRNll7qrd5MMD6fVyIoqLiVWFJPJQxT-k.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-d/-dFcvM4RhMIQSz7CYdi0GDXPHyVCoxHFJRGr5W4r9EY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-Xfzrb5ZpAgU7nq8xMib9ad1o3oOuOE25Vo4aII5fb4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-xVryxrtaDdzxDYNjnC4VmQB9g6g5b1NvjTz9mMa-io.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/06/06dJumVHqstRhdIeTOqyATaRHdBGujn7s6nOXweTvN0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0X/0XEtcbBJIfbhytXfuesQektnrA0CwdWRLDAC-iVmwss.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0_/0_szgaMxxOSt83yeibDRDbvtc3YKgf89jF3ksplGmGs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0g/0gnIJzElqH6mTZ2BkYWSQ_L7bkhOl3pNpFEeU1l3Pdk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1B/1BRaQZ9YrnzELpmWduuFBUoY5eGH4Q6yI-l1-YfoYLk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1C/1CNztfUU44hV3JDVFULBbBPDhs30n2cr7mpAq3ObPV4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1F/1FW3JoQWdW7lBwY0JY2fn8UuYycxSGptLf1deCT3uU8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/21/21Gr6eOJ8GXD790upLual16rQqQnI_4lH5dbsIy1ufk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2K/2Km33P_YXYBOTwzlcImlHFNz9t5-o_Vw4Mq1SFLm_8Q.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2u/2ublvlfkT634ytTQmjIYBwtnC0rhivD1ketIrrQ6CU8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/32/320BromjZqZdZ7wyjOmVVo18t52xt4JpAXNURQYa0jw.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3J/3JcRTve3gt1KOnGy3p2PmZkMgmD6Fua5oCvuiofReOc.cache +5 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3T/3T7Re1TRKeatfec64qlG3QkOkww7JaeR8hIfbJFu5mc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3_/3_ImLijvfNRP8So1cLL4cy7JadLPUbiHFJdmn_5NjJc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3k/3kBBxXro4BowZhaPIwPc3zV3q45-0dWVFsP2_X8WZ2U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3l/3lGXO34nSiCirzB8LWIaPeeRvP4P8IyP7JzdhUI9A4U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4d/4dUNLfIQ0DKP3Wvb1nbw4uDuMOwOCqRJ_DCE_r-Jh3o.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4j/4jrlN6WljXx-hRZscgz9YAzRk2w4MPUTCmwSDDy0AzQ.cache +5 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4k/4kQbacDL0TNocHDAw13KxFkQ_DSjwY6jKPGrdoJWlk8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4u/4u_VmkqsowTVo9LQoexdUHBUVm9GwcnZLBZbtzCh2Yo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/57/574hwjRz-ekbl1ZH5_R-oqPkevbZR4h3Et_ImyVKuJo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5M/5MPskXp3t9FXleqjoNo4_EJvNjLIIpu7F7cHyNkgDNU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5Z/5Z9bweNefjqm4beRWuRMP_xmZnJ_USwS7Pw0Uz0FoJM.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5q/5qHrWnJz5DtepM21QDxfHhyDK0N4WXhlU8W0yyb7m4w.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6-/6-FoMmlvvYjq5v2LIssZJtaYGm_QQwbd5ssHoSFrcjY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/69/69rHH1VMRR3mpGyh9DAV0n6mmjTNtjkPLhjsMWTEHHc.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6m/6m-pr002PuDw2yTU5yFMHZr_Yrccz60ji4gNVHFEkAg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7G/7Gly1atK83fTrN51FSQGTgnfn97DjgF8SBQR1Bd3U-o.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7e/7eF40Rm_qyH_4Nm_68U1-tDsetTS9nMq8YE9yIyXckw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7e/7ebo33Vd-l__3L9Fxb70DEROgy8a74Ej0vpx68vELLs.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/86/86TK63TT3eKKPtgVOilhedFmln3GU_gNl8SLwnYUpVQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8N/8NBHtc1wobpJfiL3tQjpLu8BMvUA4zKT4txyVqj2y50.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8U/8UoDUqI-BUttTAhww61lOM_rkXVyvKOGT3T3VKoG5tY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8X/8XKLpGd9EuzDeOGXNoQhjx_O_l7g5PNGEfgQQ3B7RmU.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8t/8twZMW-FUpP8p_OEa9QreZAxiMMdK9HkBXmNeXP52S8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9K/9KbuswPTMS7PawTuPAvnzj0MWDhLamr9MZs9NB8LbF4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9N/9N9UzZTf_8cp-J0Y5mJNBEv-q6deiDxWz3qFhAVyEDY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9t/9t-rXGMpFphptuPIUcuZ9cuhRjg5hgzMR5l8B_Ldr68.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Aa/AaFwiOQMywTIyc3a1hlGpA2c5iHODYmUtUo6zjWEV7c.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Aa/aAkEUPRPYtYYF3E-1WG70JrvxCvm8MgfxNnxUqUhSp8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Am/AmVg_Jj2o4JM_UGqemT3K8XI_PDuZPFEph-nXP4KoH4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/As/AsL4XHrP4VKkEKkO_MnQnc_SJHe22utc2-lTOHTzCig.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/B2/B2HuSfJz1cPCkvjRca5XDAvsZf-1Njnsg6eqwit2yyQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BE/BEBiuAKKv_b5JU2nAsuDuxKSzxeNVm65zCUpMTaXuIQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BE/be_8pDtyM3BfBjCqSUO1VXxHrUBEfr0TOBKXSOCU0RM.cache +7 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C7/C7xwxKSOmqUwd7QVyJnosVPYIJyWuWOznENeca7n4v4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ck/Ck14ZIbAAZVzvFCo_i-wOcxvZ-sPWGAPjJrSN0ktCZ0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DT/DTzkFbkAtx008DAK3DZuvHWHmEe8YVl_DnYs0DyL8GI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D_/D_Z1zIyT7v84IIMEZo6Js1wyN3zJOtu0XdDVBn-K3H4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/E7/E7iV-VCGhKOb9ALHXIp0x_n4iInQ_Nb-kC94j5RtvTI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/E8/E8PPnVqWdHywt7FoP_EQijQkkTuDxAaW1TVURKYMyG8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EZ/EZdj1Bl4liC1AHdINp1S9EW1eQBzMuRt32WLRRNYtXo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ed/EDsKjKgBzcSckInqeRWc8HrA3ge785W1ays_6sgf7Hc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ed/EdgdBZrG0e9RH-iHerASLLjfp13_RvY9Lvx4RIVBNq4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ev/Ev3oOkLEmQubGb-eCdBSmjscsqJhLYoX-o_i-ZFSOzU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FE/FEdryRZiKVEuoH0iH3nGUYxkM7Sa23yajyYWzrsbHjY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FX/FXxWz10FR_us4RdWWUBML-E7OENaRWEPpwMcLhfO_Fo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FY/FYqN2Ac1j7BMyNogLx_cteuh7_1dBaxhWd-_c_Wo2E0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fc/FcYQnFc4I3un07fEZ5l0F1_SxepCRCRKKKj-jKCYFZ0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fo/FoSMs5aq7Xv-kvf1WuRifL92pz-Fgfi8LRPfiu5FHYU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/G6/G6MikivBUN2KUBjrHGGIC3wENlINFcIVCw6Gn-ddCdw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/G6/G6yucKm37FVAIuk9tbwva8kBbP43R8BbWIqUH07erVc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/G9/G9HZWSg_gU5oyY0JQ6Ey0mPQD7z9dyvm5Se7bMZv44U.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gb/GbXpghlwxL3-D34h-js5lxV-Zcg5mVVIuSbABCNUG4k.cache +54 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gk/Gk3FEPItxd0G8f_9qMSIUELpMBd316BhlZv0BKjMg9w.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gp/GpuHwTT4pDxN3wYMqvJUaQieM4usp4K6aLosDOSHeh4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gs/GsCFFBB7vqOuUIwK2R7ojH-h0easzXhEik8PPwK0rbA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/H8/H89KGYfXFNK9mUxAJqaq9z4-ZKjQebFZvNuMiKv639Q.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HS/HShYUosSZKIUMEo8BEq2R4hFcf8H1_BDJUSs4dlFP6k.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HT/HT2kN19u1OcyfoZO7XYbF4WJzw0fiCgKu0dn47x2jPo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HT/HThMz-Cjbn-rFt8whApH3ZTUgYA4FYAwMzeAYd_RlvM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/I8/I8DnWLuQhuhWpbPrnCz1fphFbItKDnf55C_wHzY8LYo.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IW/IWIrxSp8b0ijG9WhjHUcI4ItxST45hha3_y-qcCIqMY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/In/INZ3M6aJG1VyG0dAE9RRhZg8HJFTrna7H4hAW6Htkxg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/In/IntFFrdNm3Z9thZKc1TukosqhX3kTubxyKDi4LgGJdg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Iv/Iv1eMKXC6HYUPOM6s5lWfGSpquaXSOjB46LeddlLEa0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Iz/Izk1nqGo8c-jzgUhOIesyTu1mSJMEFNvhy0X98X4N_I.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JN/JNdbDdWZkpmHrs-l_DtWYVoBZgYFfk-NO9JDhFL07MY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/K2/K28WZ7CVE4r2FcrzlB3LwdMKA3LrPIaaCfDvO3pUMCE.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kb/KbtPuR6P0LmOAkE2MX-taOFtwj0Guc_JWZAjwowJsuQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kd/KdKTsxUH-rphnRhirijVLW9KRM2uGKUOvjIulnLI2tY.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Kn/Kn3GTp-awnb2ge3KQkMJP8bOTW7m0V37vAhd0x-6P20.cache +73 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/L-/L-P7DErCeB11t9VDUaotF9wkPDAOeyvrG0d5sII281w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LO/LOIw_QrLu6EqRv2po1AhlmvJ5T0AcIZuJV0rK15RRx0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lb/Lb-EGRk7E0qDE9p8Hqjkx6MpCebFJOvPxPkfqu-ITng.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MK/MKSn3iii8fftCls3xw4XwTGICzZh2OfVqxKiwo6psTQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MK/mKYeqBhwhMfHnyIshyjiIYfk3cgRWGS-BqkqE48T_xg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MT/MTc4quu6XDggHl_641Gv2UFv55Kttrhx49TkYDhmEH8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mc/Mcd2DhI9dXIrZ2qk3vyeqp8MlR3-uhumgu7L1lZq84o.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nr/Nr_lRFccJIQhRupPc0IYXf7_0K85m3XNcOQ26s01wdg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nr/nrLpo0Li-lZKBQgFvoYBYk6oVgbgDKpiy1zgT0cthlc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/O8/O8akbUwAbmIKY-AhITimq-JDQ6IgsO3Hvq2v5etufFw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/OZ/OZRjc9y3CedBSOBSwEsGIEcaz8rJcSHucMyKrlKRzvA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/O_/O_LQ9rTo-ySqWYbC7zLFnus7phfUOitpjyLozLTHb6k.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oi/Oi1nr81Bfmxe3X2tEmifRFoGnXev1CbJYKTYal8365A.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ow/OwccXl1Ic3lqgRBGIYGM5tadia8IdkfUeJMmP4n1tTM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oy/OYMZbkT20G0_iILqjfr63sCmV_trlMdxLp1WoltE8AQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oy/OyVt39k9qOctveYmFl-STXKJKNeueCyOEbGZ2_B4ZD0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Oy/oyFBxJ8Z8i2Xb2Lll4uH6W2A3f9vSVhA9oXM2r-0R7w.cache +5 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/P3/P3WVCvTrDc2yHhngtC9uXOAewMmWcXdPi7ASSDrV5lo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PC/PCjtAJWBdT0swUVHaAWwI3bojT1phBdmw9HQisn_pbM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Q8/Q8A_ahhm51CmbHk4WpTRCpwtI9mxcu2bW6NqhYdcfwM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QX/QX0JH72se01xT2fNmLyg-sUtrk7DlLmkxNV01s_MEfg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qv/QvrJG0y21_i6f_tzu-nClfX01QyRZF4QIkZ-4um5r_U.cache +104 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R9/R9NVbLRnVzczRdRyD2VV5x97VrIowtBQLyypSZBQt90.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RE/RE53knr2hrEvDFyr33gwJBL7twGjHEmN6s6FwGtyKFs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RM/RMsrl8AKW4-xiwQlQyHKpF51XeuKQGv6VcSj6lpC-gg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RQ/RQUnHc8WheunBLgn7V-Yrrm9cdYxr1fqAp9jNkexDrg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RU/RUWGCr1p2-QM0JD8NwJpLrWrH3UwTw8ypOEEnyaHRgM.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S-/S-vKRdJnmmIzYIa4KShhx689AY-lTdGFd44UYa-DLFc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S0/S0weHOttlNPgxahIyNUKB3qj2vN71d526XRHMxMje9Q.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S7/S7lL2J7tx5oHCtsOvZuBoNGOeOoe4n7qJgZCQGHXfYQ.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SM/SMlFyPb3qixKxxPQ6XSkdrOSDxOFptdM4jt1AK4Mync.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SP/SP1YDfGWTQNPPbv4TlimqUvdr1n3QAj3ceHunawMq88.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Se/Se8yKp4PKGEiDiwrH_AL_pSzl6CRnCa2VyaOv5zUj1o.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tf/TfIQqzFTX0vKu3IJM4C9An0gkeY0WFFZebfDYcQKQ60.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tj/TjiJSeh-VRpcoiI0Z_JvKlg2jE3lGsKkLwCvGsxTVhg.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tw/Tw4qTe4pikph13nkN4d8AZjSb8F9Z8zVlmNjfMNiDMo.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/U2/U2Gr71iJOUl-Ydg0rMZBlsTM07x5MlSWPokr1lBwF-E.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UA/UASYkjJr9XL3Lmr0L5lWqDRLPJ7Ap9rk_VKVTkM3Q3Q.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UG/UGa0U-476ZNYV3aEVKwnEUoTXohti_85esgeDAtC_BA.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UO/UOPeDrSCvYLR_Fyw4iPO7bsBQqo8-BpzBB5GlJBopZM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UY/UYcoe2gw7Ke7pEASDPCU4GSnL8fzo8QS5k5xOVJCk3U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ud/UdxiCBYFzfE8nB_w-gcXpjYo9RQN5bhe6iwmsvNoMhE.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V-/V-7ZMoSNgEgBzS6M_LwBK_4N7MxPjyvUYchxsVCmBDM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V3/V3VGAxQ3BvryMb_SnWDEYPMHj9zs5FzSD641sbWPjSo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VB/VBrI6MZEfEAzYQj1PQbGjhxHf4TaI3VrxO2bqpfTjj0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VK/VKGnil96gVh9Kck5z8wxfQ-9msIJjkjLnQZ2b8XMhfY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V_/V_2BcaJttZWkKJHdfrM2v04okvdAGSxW0SQ3rkwxJvM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vs/Vspr6E12ZPcDDrfEFKL6ba5UK_SbpQi07kyw2ILTBNk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W_/W_dL_pApK43bcE2g5lXwOf3ZHkFUmaNTnWceZz1CHo0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W_/w_sXspjWODK2ApqfRBF_sKQi5hFIVuZuWqISpnxTefE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wi/WiPaSahUX5qyQtuSi4aWFHUY4RRbTpleVQBJWsqvDFg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wu/WuHL0qKgH6ZWO0xi1N0_F-L9chmMwlEws29DipzK7i4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XP/XPG0OQg_5xBL7_XGSAB6ruND4NZRsicqwGihb7QfgKA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X_/X_bRAdkpQIWNFyBCdNXCJqteo2utcpaQpv9V4YQE3OQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xi/XimxZHdFWVLh8hQab9TCpu4t7DTp8MBGP1_SEZ6Cnxs.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Y4/Y4PclklRbbVX6Acy3DA_YzrhNt3WEQkRqZ677XpiLRc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YG/YGdG9wrRMRcR_iITaLv__Abu-IoHqhdPZfP5k4s6T2A.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YO/YOADM86O0eaqQpwNTmvhU1ArE_pJ2l3pQ-tsCDYZLec.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YO/YOrKIrDaBMyp989-0d7RjAOGcCESA8wZhtagnByGmVc.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YR/YRS1gAx6MWMkF04LBtqmFEb47i6X3i1nwRTHi8u-Je4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yd/Yd3_dnSRf8H7Df3u1spB2vUso6M0WDutGEqXUOwZDWI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yd/ydw1ho6l1Elu8E4sv2Pn65RmkgGhDQ0OlujSJlGFgPo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ye/Ye9C84pAvhKWoqAduD9R7jiiUfpO1_5MfwPHPQyMSQs.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ys/YsRjDc40EirSbmV2_PUdU5IsK6XvVgyfnpwJNPz1Pwk.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zk/ZkIfGkcCJSiftkYYunIxnzDnAamuZaL9x5ulbwiKrIE.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zo/ZofRNaIwOcCjvdrVkwSlvhd9jRO3QapQl9xH08DGz-w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_3/_34TKSBAHO8RGnZnJy37nrGK8p3P4EG2rI65OW2ZH78.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_d/_dA_64XleYGAVMcz6Ge-7Yb9__m9Hf3ZQ_jZHN6-f_0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_g/_glx-WMt43JuezTWAI-GM6HieDwxOsrSzqYwcLerQDY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_t/_t1tLqXmi1lHiSlwmU-zSZVbcBPJ3j9rRBbHSutcgpo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aE/aEAkRAdMBJp7IrmAyKIzkh6UUsm6OaeRzQ-T5CHP2PA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bd/bdRhpZ6VD7GNUv40StMsfowJEjlZCvAVLNW6q99Zzhw.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bw/bwQdQakeOA80sOssAi0AL0eCbN7jTYZdMWZY-7ghdmA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/c8/c8D39zSpjZ9lxfWJLahsQcz7AvIzZmZ7bSYEo85dxzo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cO/cOBeuOQojpWO_MSC_nk_O-OfC-tCXz1V4d4xXcu_QwQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cg/cgXlwVggiz17racws5jMBrsSPqIWMY9mDl9enuvFCUM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ch/chbXFl4E9bqZVTpC3IxzIUCkGDMX8pvm8Pxjs2LYSrM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/d0/d0rr17-3lWfRQ0Wo55j8e6YNQ9itz_RBh-3RqCYlcM0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/d3/d3wnBf2fkXxkR8-XxMzkRCr1oyarxSOC0L9fH6LKbv8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/d5/d5ppfzn29-UhjtDhCsMsdotk_GVxTYT0xg-DEHIcYwo.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/e-/e-kcN4_NtWHjaNUnMJoSiqwEz4dirmu2QiGwblFRk-I.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ec/ecdv8EaiQV_ma8QCsB7U88kjF-tTfZQb7bLiWnro5us.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fD/fDQxtoKk9UP8CxHIDc1841LNAFdH7Sda9GwhYqiKWxo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fS/fSD-q4iDT__seP_fNO7tq5w6RX1QUA7Kyj4lH8zmHhU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fz/fzgRkEKX9VfGmqVCl2cdeuc8BzxtZsh4Wi2HEbCqyZI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g2/g2Wl8vGAQHSJ00zXGw74Ywrw161dkkv75rySfk6TF1s.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g7/g7ctztTZ8C8Og4cjS0esPTqZRMrYHawSQoylHFuq5Tk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gH/gHZ91xw-QZ6XiSYGHx-zvUaMvj1jRHv32OXYWGesyzY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g_/g_AyDddrdALmJv_racfhwX-MXCzhMhSiJqBBhkOXJSI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h0/h0C5r1YmxeWZ7xmvBZWPFnske5XtWCy8IHKEhYxz1GY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h4/h48kbOdKbM4E10Vs0wVgEhr4-FhMTf18RB1lLBm1LUQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hu/hu3COgettdZo3gMm8DPcQBAUu3l0zxDiLm84wQt5Kwg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/i4/i4pF9Bmmu2_lS3v48TNP2C1MUPf7EiXjedNwl7_X8D4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ib/ibRU-oP7ekrNYNIM0ERyOPouLBngmxnDaHp14QYNCQM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jD/jDPIMat4OMQzKLeqRF3Nb4kY9HLS4usXrYZWerxFUho.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jF/jFxYi7n0kw3Ev0DMfVbN0BYm7i9ZAWb-5lrTgQLkzkw.cache +4 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jr/jrOrf3u-MWeBtMvmEPyVhHjRRDWY60ycXP3G9S6PxH8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kK/kKUwBWRfsfIkHyKBuznJcpd5W2quP1WG0Qvm8SIong0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kL/kLvC5Jztau9WmLo1_LQBFT9R6XnmXYSuQHTmhVwLBnU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/l7/l73JBt8d21O2R5jHuAoSF1t3yac5sUyTRinAHEA7Nro.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lL/lLc5z7qdJY4WfFBzyGhJnOF31wBBqJoD4OAxYPy23oI.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lZ/lZxqodqscAFPbLUWfizriuYB0LstFAJEmIZIknQGjf4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m4/m4qnz1XKKl5TmVc_nfNUxnDOcWIF3vjCrybysx5S5dE.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ml/mlDzBJPZseI3ONA4G-cFVXRf67T5l11vzlCZuXNLCqg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mq/mqM2btO-0T9M5u_Apb-hnetpL9Ot0Za1lmhmbkazXJo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nK/nKQZUwnWgjgSHJRzgMX6T1rS0o5OXmCUNf7kOwDWt-Q.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nq/nq-FMjeOP3ccPBV3KIWlsIXz00Y-DxcZLDbMy41w0ns.cache +5 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nv/nvMFDG0qM90wst7hl2gCp72SUCmYoFYvoZfxyk7F3-w.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oA/oA0wFKJ3fV76DLsMuI5FYOv7KArBhjcmuMEBUVh-IEI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oG/oGWbT11h9CntgsRYeHVvRUSRM_pXctuvso5bD1E-_Rg.cache +75 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oJ/oJf6gvISJUzPzOZfzlm0RPXE8pkRsk4Liou1wiR4bwU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oS/oSsCcH0Y1Pb72IewPEMMZgthmjZ-aBCsmPRDQY6IsWE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oc/ocCdznCTiDsf5SnX-XbzboHKIsa5N_0JJvcFaIa0v4k.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pZ/pZs_OT7KhpWl5Bw2QXAZBUJv4L4B0ZvjroNOOVNYHew.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pi/piPpAsxRDhkhXCpgy5rNfwev2FCllQeOpv2T46jFlgk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q4/q4iH6hAaHRsNLtNNQwjyuV1nrRqUqSvOP2tOLHUWmw0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qB/qBoVS2DfU2y1_uaxk__lSg4q7qgpRjZ0yCRA62ViaSk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qG/qG4Hk7ZYCV4GcPgAVWFnzBPzGUXMjsPNlWAxzXFDIzY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qh/qhdWM55QpY_1Wel6alhcgtJJ1o1i_pvD5m4pR7Gf2H8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qi/qiZJ4AD7a-JZBnkgliJipAqlqobsszSWew-8qJMEBuc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qn/qnxANHDXRgytq0YwdMMqTCjJkR_7u-AIYodo6H2yWZk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r2/r2wUxqXPZGyL8yJQ8xQKBW62cJs1uE_kUeiDnjOt3eI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rI/rI8pww981NHG22krf5FbLsuRHjYf85Nlom5uxJQwoqY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ra/rahIaRydDKWOwY0mWr9MsvBG5ia5q8RgLBZsVUS1Z-k.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rd/RdfB0OzMfmjFAubT3THbRNJY7_LwFJZJKrUGU8q3708.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rd/rdiz0vLTLXOjXgmyGaa9Rtn9U1rxIR70X39htU2l0uM.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rg/rgsvMxrjiJSAFeE_Rawd4cjIlNniYQ2LLMr-WfHcEmE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ro/ron72ZitBqwTzm-mJk-_TnXub4HXPM6x0Cv4FSERVJA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rw/rwAUBS6_7P7KsaV-huzkfaoGbbPCL_TLREXtEGxNGto.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sR/sR2TAOkCQmj-R7OEG_CPlIBvcf5qxFqq5uwJ3n7GHyQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sX/sX4wwS_efcIabnhLoa6LYb_lRY5Zv2E_coiw4-cgESg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sb/sbIfIYytasmqOfY26ylrPhJnvWLmgYauZ6XOjXMjssU.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sj/sjeKBH2T__mODBuQr0RqtBnDJeyDutqYZ1fssGam_rs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tN/tNZQPVNwKhR_JK2mlhPvLHQxlrN8Fk5prdVXg5x7CLs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tP/tPF6H9NRpGO3whu2y5_e_R_1EACKdCwu5437D83qJT0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tY/tYhhOTVTALHMYiY0UZ1-mTCJDNXZ_a8SB9nDvb4fZKs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tu/tu6UFqTPo1b-UrtPhSJXYAfv2t3ba3adAGKGi-RaEuI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tx/tXTuLOynyl3e0YWQyhD3E50mipG6rWV5rJh7DUIJZmY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tx/tXbf5ehiC_jNJ1nYVORlPm8XC5mukmFnPBDopf4ds3U.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tx/tx4eRwuD66QCa9fWI5DpiQsC6TjXTndahVzhzsqxezU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/u0/u0t4_vnTeokERX9UCHD5W7IMs8CV2wE5Y2Zh8ozQtd4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/u3/u3Jt2hHm68soUkdfP4pUF2RbuciMhpJMZaye7golzjk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/u4/u4UmICDQX9_TmlF9dagNGljgWQwWxyJcjHARwcmhgXs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ur/uRZ3Og-L4J6uWe9e35T_tOklxCVrd94Ke4q8fVELXX4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ur/urq6cvvM8i1tBGilXO29tzaeGpWTgFWe8wgrQyBGQco.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uv/uv3cZO4PygxIjlJsSwYJwyHrVVqObs2ACSK1ZDpciXg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v6/v64K6Lupt6J92uk_MwUXTfGMobanMksIxKX-zamg8IU.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vN/vNGzkJNd8jZKUpldX9gm2gb3QR8CJRHo72vHHMHPVYU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vf/vf6pS83AJcKYSl-DcY_ScZeYkB0yDhbxKl_jnVPColY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vo/voUX3N1PGX-aokkt4gRSJMc0ZaWrL0i2pGo-9--xDvA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vv/vvmwM1iU3kXTcgVdOcdKSaTOp5RCXRv_xvb7AZkL594.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w5/w5QMt63TSr_XbGyWPix58UVdQew5zaVFIls9Q05leCU.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w9/w9EGr404Ec8iWX-TW5NwtOX7CZFxbLuJrLrPXegwie4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wK/wKaiZcrtqWwNr8hquK3JBngxCtsqbKMMPfUlBZB4FAo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wQ/wQdUXI6R5rwkq8dRFsjrgiJ0E6eF_0M75B_SxoMK8-w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wV/Wv-6bVwsTp_LqZ1ZD4iZR8kOhuIO4M5yCctID5n98Q8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wV/wVjAOidZ-lZqani0lwAeuul_ma2e9nNZfuEQgaqZ6N8.cache +78 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wg/wgvpP2Zxu3BaOgAP1nz0MTp3TnSPZLLD7njzJyTAY0k.cache +5 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x-/X-GTjAJs0k4DdFqoUzfRXbSpu0lHkC7WuXFo6i9mtcQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x-/x-n_OHI0W_PinN8NC6kdtfkflbqTvZTEzWLZBGotSvQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xs/xsz1Xli1rjewlmkdAsFaTqU1QF1bAZ9r2VABTS63a-E.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yH/yHR_S3o-CR62iV2PhE_BBYQANZqqn1Hun_xVebhOx0k.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yM/yMGwsY99j5fPgf5LWsCwNt4JJdvIJ8T1A9tnEgiNG3k.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z4/z4R50-aot5DTt3qdrnIv3L7tzYF5Ts_OZ_UBkdgZQew.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z9/z9RyRiOc7eWfq0AQht0-e2T8BCDWGxuElTNRNyF-i60.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zQ/Zqlhmo8u-4j5v6Js-q3mxfbqc-DM0nZ3rQUiMMdtQnQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zQ/zQpUaxTk07z9j0wKNLDhvRU1cCHLOPsB8nftF3rwGTg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zyyLbt3lCJcXlGtjIxh7PoGOlX3t6Sr00yVzT6jhtx4.cache +81 -0
- data/spec/dummy/tmp/pids/server.pid +1 -1
- data/vendor/assets/javascripts/medium-editor.js +443 -114
- data/vendor/assets/stylesheets/medium-editor/medium-editor.css +15 -5
- data/vendor/assets/stylesheets/medium-editor/medium-editor.min.css +1 -1
- data/vendor/assets/stylesheets/medium-editor/themes/flat.css +1 -1
- data/vendor/assets/stylesheets/medium-editor/themes/flat.min.css +1 -1
- metadata +523 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
259
|
|
@@ -385,7 +385,8 @@ if (!("classList" in document.createElement("_"))) {
|
|
|
385
385
|
|
|
386
386
|
(function (root, factory) {
|
|
387
387
|
'use strict';
|
|
388
|
-
|
|
388
|
+
var isElectron = typeof module === 'object' && typeof process !== 'undefined' && process && process.versions && process.versions.electron;
|
|
389
|
+
if (!isElectron && typeof module === 'object') {
|
|
389
390
|
module.exports = factory;
|
|
390
391
|
} else if (typeof define === 'function' && define.amd) {
|
|
391
392
|
define(function () {
|
|
@@ -628,11 +629,10 @@ MediumEditor.extensions = {};
|
|
|
628
629
|
splitEndNodeIfNeeded: function (currentNode, newNode, matchEndIndex, currentTextIndex) {
|
|
629
630
|
var textIndexOfEndOfFarthestNode,
|
|
630
631
|
endSplitPoint;
|
|
631
|
-
textIndexOfEndOfFarthestNode = currentTextIndex +
|
|
632
|
-
(newNode ?
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
(textIndexOfEndOfFarthestNode + 1 - matchEndIndex);
|
|
632
|
+
textIndexOfEndOfFarthestNode = currentTextIndex + currentNode.nodeValue.length +
|
|
633
|
+
(newNode ? newNode.nodeValue.length : 0) - 1;
|
|
634
|
+
endSplitPoint = matchEndIndex - currentTextIndex -
|
|
635
|
+
(newNode ? currentNode.nodeValue.length : 0);
|
|
636
636
|
if (textIndexOfEndOfFarthestNode >= matchEndIndex &&
|
|
637
637
|
currentTextIndex !== textIndexOfEndOfFarthestNode &&
|
|
638
638
|
endSplitPoint !== 0) {
|
|
@@ -1019,6 +1019,11 @@ MediumEditor.extensions = {};
|
|
|
1019
1019
|
}
|
|
1020
1020
|
},
|
|
1021
1021
|
|
|
1022
|
+
/*
|
|
1023
|
+
* this function adds one or several classes on an a element.
|
|
1024
|
+
* if el parameter is not an a, it will look for a children of el.
|
|
1025
|
+
* if no a children are found, it will look for the a parent.
|
|
1026
|
+
*/
|
|
1022
1027
|
addClassToAnchors: function (el, buttonClass) {
|
|
1023
1028
|
var classes = buttonClass.split(' '),
|
|
1024
1029
|
i,
|
|
@@ -1028,7 +1033,13 @@ MediumEditor.extensions = {};
|
|
|
1028
1033
|
el.classList.add(classes[j]);
|
|
1029
1034
|
}
|
|
1030
1035
|
} else {
|
|
1031
|
-
|
|
1036
|
+
var aChildren = el.getElementsByTagName('a');
|
|
1037
|
+
if (aChildren.length === 0) {
|
|
1038
|
+
var parentAnchor = Util.getClosestTag(el, 'a');
|
|
1039
|
+
el = parentAnchor ? [parentAnchor] : [];
|
|
1040
|
+
} else {
|
|
1041
|
+
el = aChildren;
|
|
1042
|
+
}
|
|
1032
1043
|
for (i = 0; i < el.length; i += 1) {
|
|
1033
1044
|
for (j = 0; j < classes.length; j += 1) {
|
|
1034
1045
|
el[i].classList.add(classes[j]);
|
|
@@ -1429,11 +1440,15 @@ MediumEditor.extensions = {};
|
|
|
1429
1440
|
},
|
|
1430
1441
|
|
|
1431
1442
|
cleanupTags: function (el, tags) {
|
|
1432
|
-
tags.
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1443
|
+
if (tags.indexOf(el.nodeName.toLowerCase()) !== -1) {
|
|
1444
|
+
el.parentNode.removeChild(el);
|
|
1445
|
+
}
|
|
1446
|
+
},
|
|
1447
|
+
|
|
1448
|
+
unwrapTags: function (el, tags) {
|
|
1449
|
+
if (tags.indexOf(el.nodeName.toLowerCase()) !== -1) {
|
|
1450
|
+
MediumEditor.util.unwrap(el, document);
|
|
1451
|
+
}
|
|
1437
1452
|
},
|
|
1438
1453
|
|
|
1439
1454
|
// get the closest parent
|
|
@@ -1653,6 +1668,19 @@ MediumEditor.extensions = {};
|
|
|
1653
1668
|
*/
|
|
1654
1669
|
setInactive: undefined,
|
|
1655
1670
|
|
|
1671
|
+
/* getInteractionElements: [function ()]
|
|
1672
|
+
*
|
|
1673
|
+
* If the extension renders any elements that the user can interact with,
|
|
1674
|
+
* this method should be implemented and return the root element or an array
|
|
1675
|
+
* containing all of the root elements. MediumEditor will call this function
|
|
1676
|
+
* during interaction to see if the user clicked on something outside of the editor.
|
|
1677
|
+
* The elements are used to check if the target element of a click or
|
|
1678
|
+
* other user event is a descendant of any extension elements.
|
|
1679
|
+
* This way, the editor can also count user interaction within editor elements as
|
|
1680
|
+
* interactions with the editor, and thus not trigger 'blur'
|
|
1681
|
+
*/
|
|
1682
|
+
getInteractionElements: undefined,
|
|
1683
|
+
|
|
1656
1684
|
/************************ Helpers ************************
|
|
1657
1685
|
* The following are helpers that are either set by MediumEditor
|
|
1658
1686
|
* during initialization, or are helper methods which either
|
|
@@ -2416,6 +2444,26 @@ MediumEditor.extensions = {};
|
|
|
2416
2444
|
(function () {
|
|
2417
2445
|
'use strict';
|
|
2418
2446
|
|
|
2447
|
+
function isElementDescendantOfExtension(extensions, element) {
|
|
2448
|
+
return extensions.some(function (extension) {
|
|
2449
|
+
if (typeof extension.getInteractionElements !== 'function') {
|
|
2450
|
+
return false;
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
var extensionElements = extension.getInteractionElements();
|
|
2454
|
+
if (!extensionElements) {
|
|
2455
|
+
return false;
|
|
2456
|
+
}
|
|
2457
|
+
|
|
2458
|
+
if (!Array.isArray(extensionElements)) {
|
|
2459
|
+
extensionElements = [extensionElements];
|
|
2460
|
+
}
|
|
2461
|
+
return extensionElements.some(function (el) {
|
|
2462
|
+
return MediumEditor.util.isDescendant(el, element, true);
|
|
2463
|
+
});
|
|
2464
|
+
});
|
|
2465
|
+
}
|
|
2466
|
+
|
|
2419
2467
|
var Events = function (instance) {
|
|
2420
2468
|
this.base = instance;
|
|
2421
2469
|
this.options = this.base.options;
|
|
@@ -2431,7 +2479,10 @@ MediumEditor.extensions = {};
|
|
|
2431
2479
|
// Helpers for event handling
|
|
2432
2480
|
|
|
2433
2481
|
attachDOMEvent: function (targets, event, listener, useCapture) {
|
|
2434
|
-
|
|
2482
|
+
var win = this.base.options.contentWindow,
|
|
2483
|
+
doc = this.base.options.ownerDocument;
|
|
2484
|
+
|
|
2485
|
+
targets = MediumEditor.util.isElement(targets) || [win, doc].indexOf(targets) > -1 ? [targets] : targets;
|
|
2435
2486
|
|
|
2436
2487
|
Array.prototype.forEach.call(targets, function (target) {
|
|
2437
2488
|
target.addEventListener(event, listener, useCapture);
|
|
@@ -2440,16 +2491,21 @@ MediumEditor.extensions = {};
|
|
|
2440
2491
|
},
|
|
2441
2492
|
|
|
2442
2493
|
detachDOMEvent: function (targets, event, listener, useCapture) {
|
|
2443
|
-
var index, e
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2494
|
+
var index, e,
|
|
2495
|
+
win = this.base.options.contentWindow,
|
|
2496
|
+
doc = this.base.options.ownerDocument;
|
|
2497
|
+
|
|
2498
|
+
if (targets !== null) {
|
|
2499
|
+
targets = MediumEditor.util.isElement(targets) || [win, doc].indexOf(targets) > -1 ? [targets] : targets;
|
|
2500
|
+
|
|
2501
|
+
Array.prototype.forEach.call(targets, function (target) {
|
|
2502
|
+
index = this.indexOfListener(target, event, listener, useCapture);
|
|
2503
|
+
if (index !== -1) {
|
|
2504
|
+
e = this.events.splice(index, 1)[0];
|
|
2505
|
+
e[0].removeEventListener(e[1], e[2], e[3]);
|
|
2506
|
+
}
|
|
2507
|
+
}.bind(this));
|
|
2508
|
+
}
|
|
2453
2509
|
},
|
|
2454
2510
|
|
|
2455
2511
|
indexOfListener: function (target, event, listener, useCapture) {
|
|
@@ -2609,23 +2665,23 @@ MediumEditor.extensions = {};
|
|
|
2609
2665
|
|
|
2610
2666
|
// Helper method to call all listeners to execCommand
|
|
2611
2667
|
var callListeners = function (args, result) {
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
});
|
|
2668
|
+
if (doc.execCommand.listeners) {
|
|
2669
|
+
doc.execCommand.listeners.forEach(function (listener) {
|
|
2670
|
+
listener({
|
|
2671
|
+
command: args[0],
|
|
2672
|
+
value: args[2],
|
|
2673
|
+
args: args,
|
|
2674
|
+
result: result
|
|
2620
2675
|
});
|
|
2621
|
-
}
|
|
2622
|
-
}
|
|
2676
|
+
});
|
|
2677
|
+
}
|
|
2678
|
+
},
|
|
2623
2679
|
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2680
|
+
// Create a wrapper method for execCommand which will:
|
|
2681
|
+
// 1) Call document.execCommand with the correct arguments
|
|
2682
|
+
// 2) Loop through any listeners and notify them that execCommand was called
|
|
2683
|
+
// passing extra info on the call
|
|
2684
|
+
// 3) Return the result
|
|
2629
2685
|
wrapper = function () {
|
|
2630
2686
|
var result = doc.execCommand.orig.apply(this, arguments);
|
|
2631
2687
|
|
|
@@ -2755,6 +2811,8 @@ MediumEditor.extensions = {};
|
|
|
2755
2811
|
// Detecting drop on the contenteditables
|
|
2756
2812
|
this.attachToEachElement('drop', this.handleDrop);
|
|
2757
2813
|
break;
|
|
2814
|
+
// TODO: We need to have a custom 'paste' event separate from 'editablePaste'
|
|
2815
|
+
// Need to think about the way to introduce this without breaking folks
|
|
2758
2816
|
case 'editablePaste':
|
|
2759
2817
|
// Detecting paste on the contenteditables
|
|
2760
2818
|
this.attachToEachElement('paste', this.handlePaste);
|
|
@@ -2792,21 +2850,16 @@ MediumEditor.extensions = {};
|
|
|
2792
2850
|
},
|
|
2793
2851
|
|
|
2794
2852
|
updateFocus: function (target, eventObj) {
|
|
2795
|
-
var
|
|
2796
|
-
toolbarEl = toolbar ? toolbar.getToolbarElement() : null,
|
|
2797
|
-
anchorPreview = this.base.getExtensionByName('anchor-preview'),
|
|
2798
|
-
previewEl = (anchorPreview && anchorPreview.getPreviewElement) ? anchorPreview.getPreviewElement() : null,
|
|
2799
|
-
hadFocus = this.base.getFocusedElement(),
|
|
2853
|
+
var hadFocus = this.base.getFocusedElement(),
|
|
2800
2854
|
toFocus;
|
|
2801
2855
|
|
|
2802
|
-
// For clicks, we need to know if the mousedown that caused the click happened inside the existing focused element
|
|
2803
|
-
// If so, we don't want to focus another element
|
|
2856
|
+
// For clicks, we need to know if the mousedown that caused the click happened inside the existing focused element
|
|
2857
|
+
// or one of the extension elements. If so, we don't want to focus another element
|
|
2804
2858
|
if (hadFocus &&
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
MediumEditor.util.isDescendant(previewEl, this.lastMousedownTarget, true))) {
|
|
2859
|
+
eventObj.type === 'click' &&
|
|
2860
|
+
this.lastMousedownTarget &&
|
|
2861
|
+
(MediumEditor.util.isDescendant(hadFocus, this.lastMousedownTarget, true) ||
|
|
2862
|
+
isElementDescendantOfExtension(this.base.extensions, this.lastMousedownTarget))) {
|
|
2810
2863
|
toFocus = hadFocus;
|
|
2811
2864
|
}
|
|
2812
2865
|
|
|
@@ -2822,10 +2875,9 @@ MediumEditor.extensions = {};
|
|
|
2822
2875
|
}, this);
|
|
2823
2876
|
}
|
|
2824
2877
|
|
|
2825
|
-
// Check if the target is external (not part of the editor, toolbar, or
|
|
2878
|
+
// Check if the target is external (not part of the editor, toolbar, or any other extension)
|
|
2826
2879
|
var externalEvent = !MediumEditor.util.isDescendant(hadFocus, target, true) &&
|
|
2827
|
-
|
|
2828
|
-
!MediumEditor.util.isDescendant(previewEl, target, true);
|
|
2880
|
+
!isElementDescendantOfExtension(this.base.extensions, target);
|
|
2829
2881
|
|
|
2830
2882
|
if (toFocus !== hadFocus) {
|
|
2831
2883
|
// If element has focus, and focus is going outside of editor
|
|
@@ -3310,6 +3362,14 @@ MediumEditor.extensions = {};
|
|
|
3310
3362
|
contentDefault: '<b>image</b>',
|
|
3311
3363
|
contentFA: '<i class="fa fa-picture-o"></i>'
|
|
3312
3364
|
},
|
|
3365
|
+
'html': {
|
|
3366
|
+
name: 'html',
|
|
3367
|
+
action: 'html',
|
|
3368
|
+
aria: 'evaluate html',
|
|
3369
|
+
tagNames: ['iframe', 'object'],
|
|
3370
|
+
contentDefault: '<b>html</b>',
|
|
3371
|
+
contentFA: '<i class="fa fa-code"></i>'
|
|
3372
|
+
},
|
|
3313
3373
|
'orderedlist': {
|
|
3314
3374
|
name: 'orderedlist',
|
|
3315
3375
|
action: 'insertorderedlist',
|
|
@@ -3471,6 +3531,7 @@ MediumEditor.extensions = {};
|
|
|
3471
3531
|
};
|
|
3472
3532
|
|
|
3473
3533
|
})();
|
|
3534
|
+
|
|
3474
3535
|
(function () {
|
|
3475
3536
|
'use strict';
|
|
3476
3537
|
|
|
@@ -3703,8 +3764,8 @@ MediumEditor.extensions = {};
|
|
|
3703
3764
|
// figure out how to deprecate? also consider `fa-` icon default implcations.
|
|
3704
3765
|
template.push(
|
|
3705
3766
|
'<div class="medium-editor-toolbar-form-row">',
|
|
3706
|
-
'<input type="checkbox" class="medium-editor-toolbar-anchor-target">',
|
|
3707
|
-
'<label>',
|
|
3767
|
+
'<input type="checkbox" class="medium-editor-toolbar-anchor-target" id="medium-editor-toolbar-anchor-target-field-' + this.getEditorId() + '">',
|
|
3768
|
+
'<label for="medium-editor-toolbar-anchor-target-field-' + this.getEditorId() + '">',
|
|
3708
3769
|
this.targetCheckboxText,
|
|
3709
3770
|
'</label>',
|
|
3710
3771
|
'</div>'
|
|
@@ -3824,19 +3885,61 @@ MediumEditor.extensions = {};
|
|
|
3824
3885
|
this.base.checkSelection();
|
|
3825
3886
|
},
|
|
3826
3887
|
|
|
3888
|
+
ensureEncodedUri: function (str) {
|
|
3889
|
+
return str === decodeURI(str) ? encodeURI(str) : str;
|
|
3890
|
+
},
|
|
3891
|
+
|
|
3892
|
+
ensureEncodedUriComponent: function (str) {
|
|
3893
|
+
return str === decodeURIComponent(str) ? encodeURIComponent(str) : str;
|
|
3894
|
+
},
|
|
3895
|
+
|
|
3896
|
+
ensureEncodedParam: function (param) {
|
|
3897
|
+
var split = param.split('='),
|
|
3898
|
+
key = split[0],
|
|
3899
|
+
val = split[1];
|
|
3900
|
+
|
|
3901
|
+
return key + (val === undefined ? '' : '=' + this.ensureEncodedUriComponent(val));
|
|
3902
|
+
},
|
|
3903
|
+
|
|
3904
|
+
ensureEncodedQuery: function (queryString) {
|
|
3905
|
+
return queryString.split('&').map(this.ensureEncodedParam.bind(this)).join('&');
|
|
3906
|
+
},
|
|
3907
|
+
|
|
3827
3908
|
checkLinkFormat: function (value) {
|
|
3828
3909
|
// Matches any alphabetical characters followed by ://
|
|
3829
3910
|
// Matches protocol relative "//"
|
|
3830
3911
|
// Matches common external protocols "mailto:" "tel:" "maps:"
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3912
|
+
// Matches relative hash link, begins with "#"
|
|
3913
|
+
var urlSchemeRegex = /^([a-z]+:)?\/\/|^(mailto|tel|maps):|^\#/i,
|
|
3914
|
+
hasScheme = urlSchemeRegex.test(value),
|
|
3915
|
+
scheme = '',
|
|
3916
|
+
// telRegex is a regex for checking if the string is a telephone number
|
|
3917
|
+
telRegex = /^\+?\s?\(?(?:\d\s?\-?\)?){3,20}$/,
|
|
3918
|
+
urlParts = value.match(/^(.*?)(?:\?(.*?))?(?:#(.*))?$/),
|
|
3919
|
+
path = urlParts[1],
|
|
3920
|
+
query = urlParts[2],
|
|
3921
|
+
fragment = urlParts[3];
|
|
3922
|
+
|
|
3834
3923
|
if (telRegex.test(value)) {
|
|
3835
3924
|
return 'tel:' + value;
|
|
3836
|
-
} else {
|
|
3837
|
-
// Check for URL scheme and default to http:// if none found
|
|
3838
|
-
return (urlSchemeRegex.test(value) ? '' : 'http://') + encodeURI(value);
|
|
3839
3925
|
}
|
|
3926
|
+
|
|
3927
|
+
if (!hasScheme) {
|
|
3928
|
+
var host = path.split('/')[0];
|
|
3929
|
+
// if the host part of the path looks like a hostname
|
|
3930
|
+
if (host.match(/.+(\.|:).+/) || host === 'localhost') {
|
|
3931
|
+
scheme = 'http://';
|
|
3932
|
+
}
|
|
3933
|
+
}
|
|
3934
|
+
|
|
3935
|
+
return scheme +
|
|
3936
|
+
// Ensure path is encoded
|
|
3937
|
+
this.ensureEncodedUri(path) +
|
|
3938
|
+
// Ensure query is encoded
|
|
3939
|
+
(query === undefined ? '' : '?' + this.ensureEncodedQuery(query)) +
|
|
3940
|
+
// Include fragment unencoded as encodeUriComponent is too
|
|
3941
|
+
// heavy handed for the many characters allowed in a fragment
|
|
3942
|
+
(fragment === undefined ? '' : '#' + fragment);
|
|
3840
3943
|
},
|
|
3841
3944
|
|
|
3842
3945
|
doFormCancel: function () {
|
|
@@ -3948,6 +4051,11 @@ MediumEditor.extensions = {};
|
|
|
3948
4051
|
*/
|
|
3949
4052
|
showWhenToolbarIsVisible: false,
|
|
3950
4053
|
|
|
4054
|
+
/* showOnEmptyLinks: [boolean]
|
|
4055
|
+
* determines whether the anchor tag preview shows up on links with href="" or href="#something"
|
|
4056
|
+
*/
|
|
4057
|
+
showOnEmptyLinks: true,
|
|
4058
|
+
|
|
3951
4059
|
init: function () {
|
|
3952
4060
|
this.anchorPreview = this.createPreview();
|
|
3953
4061
|
|
|
@@ -3956,6 +4064,11 @@ MediumEditor.extensions = {};
|
|
|
3956
4064
|
this.attachToEditables();
|
|
3957
4065
|
},
|
|
3958
4066
|
|
|
4067
|
+
getInteractionElements: function () {
|
|
4068
|
+
return this.getPreviewElement();
|
|
4069
|
+
},
|
|
4070
|
+
|
|
4071
|
+
// TODO: Remove this function in 6.0.0
|
|
3959
4072
|
getPreviewElement: function () {
|
|
3960
4073
|
return this.anchorPreview;
|
|
3961
4074
|
},
|
|
@@ -3988,7 +4101,9 @@ MediumEditor.extensions = {};
|
|
|
3988
4101
|
},
|
|
3989
4102
|
|
|
3990
4103
|
hidePreview: function () {
|
|
3991
|
-
this.anchorPreview
|
|
4104
|
+
if (this.anchorPreview) {
|
|
4105
|
+
this.anchorPreview.classList.remove('medium-editor-anchor-preview-active');
|
|
4106
|
+
}
|
|
3992
4107
|
this.activeAnchor = null;
|
|
3993
4108
|
},
|
|
3994
4109
|
|
|
@@ -4020,13 +4135,15 @@ MediumEditor.extensions = {};
|
|
|
4020
4135
|
|
|
4021
4136
|
positionPreview: function (activeAnchor) {
|
|
4022
4137
|
activeAnchor = activeAnchor || this.activeAnchor;
|
|
4023
|
-
var
|
|
4138
|
+
var containerWidth = this.window.innerWidth,
|
|
4139
|
+
buttonHeight = this.anchorPreview.offsetHeight,
|
|
4024
4140
|
boundary = activeAnchor.getBoundingClientRect(),
|
|
4025
|
-
middleBoundary = (boundary.left + boundary.right) / 2,
|
|
4026
4141
|
diffLeft = this.diffLeft,
|
|
4027
4142
|
diffTop = this.diffTop,
|
|
4028
|
-
|
|
4029
|
-
|
|
4143
|
+
elementsContainer = this.getEditorOption('elementsContainer'),
|
|
4144
|
+
elementsContainerAbsolute = ['absolute', 'fixed'].indexOf(window.getComputedStyle(elementsContainer).getPropertyValue('position')) > -1,
|
|
4145
|
+
relativeBoundary = {},
|
|
4146
|
+
halfOffsetWidth, defaultLeft, middleBoundary, elementsContainerBoundary, top;
|
|
4030
4147
|
|
|
4031
4148
|
halfOffsetWidth = this.anchorPreview.offsetWidth / 2;
|
|
4032
4149
|
var toolbarExtension = this.base.getExtensionByName('toolbar');
|
|
@@ -4036,12 +4153,35 @@ MediumEditor.extensions = {};
|
|
|
4036
4153
|
}
|
|
4037
4154
|
defaultLeft = diffLeft - halfOffsetWidth;
|
|
4038
4155
|
|
|
4039
|
-
|
|
4156
|
+
// If container element is absolute / fixed, recalculate boundaries to be relative to the container
|
|
4157
|
+
if (elementsContainerAbsolute) {
|
|
4158
|
+
elementsContainerBoundary = elementsContainer.getBoundingClientRect();
|
|
4159
|
+
['top', 'left'].forEach(function (key) {
|
|
4160
|
+
relativeBoundary[key] = boundary[key] - elementsContainerBoundary[key];
|
|
4161
|
+
});
|
|
4162
|
+
|
|
4163
|
+
relativeBoundary.width = boundary.width;
|
|
4164
|
+
relativeBoundary.height = boundary.height;
|
|
4165
|
+
boundary = relativeBoundary;
|
|
4166
|
+
|
|
4167
|
+
containerWidth = elementsContainerBoundary.width;
|
|
4168
|
+
|
|
4169
|
+
// Adjust top position according to container scroll position
|
|
4170
|
+
top = elementsContainer.scrollTop;
|
|
4171
|
+
} else {
|
|
4172
|
+
// Adjust top position according to window scroll position
|
|
4173
|
+
top = this.window.pageYOffset;
|
|
4174
|
+
}
|
|
4175
|
+
|
|
4176
|
+
middleBoundary = boundary.left + boundary.width / 2;
|
|
4177
|
+
top += buttonHeight + boundary.top + boundary.height - diffTop - this.anchorPreview.offsetHeight;
|
|
4178
|
+
|
|
4179
|
+
this.anchorPreview.style.top = Math.round(top) + 'px';
|
|
4040
4180
|
this.anchorPreview.style.right = 'initial';
|
|
4041
4181
|
if (middleBoundary < halfOffsetWidth) {
|
|
4042
4182
|
this.anchorPreview.style.left = defaultLeft + halfOffsetWidth + 'px';
|
|
4043
4183
|
this.anchorPreview.style.right = 'initial';
|
|
4044
|
-
} else if ((
|
|
4184
|
+
} else if ((containerWidth - middleBoundary) < halfOffsetWidth) {
|
|
4045
4185
|
this.anchorPreview.style.left = 'auto';
|
|
4046
4186
|
this.anchorPreview.style.right = 0;
|
|
4047
4187
|
} else {
|
|
@@ -4077,7 +4217,7 @@ MediumEditor.extensions = {};
|
|
|
4077
4217
|
this.base.delay(function () {
|
|
4078
4218
|
if (activeAnchor) {
|
|
4079
4219
|
var opts = {
|
|
4080
|
-
|
|
4220
|
+
value: activeAnchor.attributes.href.value,
|
|
4081
4221
|
target: activeAnchor.getAttribute('target'),
|
|
4082
4222
|
buttonClass: activeAnchor.getAttribute('class')
|
|
4083
4223
|
};
|
|
@@ -4106,7 +4246,8 @@ MediumEditor.extensions = {};
|
|
|
4106
4246
|
// Detect empty href attributes
|
|
4107
4247
|
// The browser will make href="" or href="#top"
|
|
4108
4248
|
// into absolute urls when accessed as event.target.href, so check the html
|
|
4109
|
-
if (
|
|
4249
|
+
if (!this.showOnEmptyLinks &&
|
|
4250
|
+
(!/href=["']\S+["']/.test(target.outerHTML) || /href=["']#\S+["']/.test(target.outerHTML))) {
|
|
4110
4251
|
return true;
|
|
4111
4252
|
}
|
|
4112
4253
|
|
|
@@ -4200,7 +4341,8 @@ MediumEditor.extensions = {};
|
|
|
4200
4341
|
var WHITESPACE_CHARS,
|
|
4201
4342
|
KNOWN_TLDS_FRAGMENT,
|
|
4202
4343
|
LINK_REGEXP_TEXT,
|
|
4203
|
-
KNOWN_TLDS_REGEXP
|
|
4344
|
+
KNOWN_TLDS_REGEXP,
|
|
4345
|
+
LINK_REGEXP;
|
|
4204
4346
|
|
|
4205
4347
|
WHITESPACE_CHARS = [' ', '\t', '\n', '\r', '\u00A0', '\u2000', '\u2001', '\u2002', '\u2003',
|
|
4206
4348
|
'\u2028', '\u2029'];
|
|
@@ -4222,6 +4364,8 @@ MediumEditor.extensions = {};
|
|
|
4222
4364
|
|
|
4223
4365
|
KNOWN_TLDS_REGEXP = new RegExp('^(' + KNOWN_TLDS_FRAGMENT + ')$', 'i');
|
|
4224
4366
|
|
|
4367
|
+
LINK_REGEXP = new RegExp(LINK_REGEXP_TEXT, 'gi');
|
|
4368
|
+
|
|
4225
4369
|
function nodeIsNotInsideAnchorTag(node) {
|
|
4226
4370
|
return !MediumEditor.util.getClosestTag(node, 'a');
|
|
4227
4371
|
}
|
|
@@ -4403,12 +4547,11 @@ MediumEditor.extensions = {};
|
|
|
4403
4547
|
},
|
|
4404
4548
|
|
|
4405
4549
|
findLinkableText: function (contenteditable) {
|
|
4406
|
-
var
|
|
4407
|
-
textContent = contenteditable.textContent,
|
|
4550
|
+
var textContent = contenteditable.textContent,
|
|
4408
4551
|
match = null,
|
|
4409
4552
|
matches = [];
|
|
4410
4553
|
|
|
4411
|
-
while ((match =
|
|
4554
|
+
while ((match = LINK_REGEXP.exec(textContent)) !== null) {
|
|
4412
4555
|
var matchOk = true,
|
|
4413
4556
|
matchEnd = match.index + match[0].length;
|
|
4414
4557
|
// If the regexp detected something as a link that has text immediately preceding/following it, bail out.
|
|
@@ -5027,13 +5170,13 @@ MediumEditor.extensions = {};
|
|
|
5027
5170
|
[new RegExp(/<br class="Apple-interchange-newline">/g), '<br>'],
|
|
5028
5171
|
|
|
5029
5172
|
// replace google docs italics+bold with a span to be replaced once the html is inserted
|
|
5030
|
-
[new RegExp(/<span[^>]*(font-style:italic;font-weight:bold|font-weight:bold;font-style:italic)[^>]*>/gi), '<span class="replace-with italic bold">'],
|
|
5173
|
+
[new RegExp(/<span[^>]*(font-style:italic;font-weight:(bold|700)|font-weight:(bold|700);font-style:italic)[^>]*>/gi), '<span class="replace-with italic bold">'],
|
|
5031
5174
|
|
|
5032
5175
|
// replace google docs italics with a span to be replaced once the html is inserted
|
|
5033
5176
|
[new RegExp(/<span[^>]*font-style:italic[^>]*>/gi), '<span class="replace-with italic">'],
|
|
5034
5177
|
|
|
5035
5178
|
//[replace google docs bolds with a span to be replaced once the html is inserted
|
|
5036
|
-
[new RegExp(/<span[^>]*font-weight:bold[^>]*>/gi), '<span class="replace-with bold">'],
|
|
5179
|
+
[new RegExp(/<span[^>]*font-weight:(bold|700)[^>]*>/gi), '<span class="replace-with bold">'],
|
|
5037
5180
|
|
|
5038
5181
|
// replace manually entered b/i/a tags with real ones
|
|
5039
5182
|
[new RegExp(/<(\/?)(i|b|a)>/gi), '<$1$2>'],
|
|
@@ -5129,15 +5272,31 @@ MediumEditor.extensions = {};
|
|
|
5129
5272
|
*/
|
|
5130
5273
|
cleanTags: ['meta'],
|
|
5131
5274
|
|
|
5275
|
+
/* unwrapTags: [Array]
|
|
5276
|
+
* list of element tag names to unwrap (remove the element tag but retain its child elements)
|
|
5277
|
+
* during paste when __cleanPastedHTML__ is `true` or when
|
|
5278
|
+
* calling `cleanPaste(text)` or `pasteHTML(html, options)` helper methods.
|
|
5279
|
+
*/
|
|
5280
|
+
unwrapTags: [],
|
|
5281
|
+
|
|
5132
5282
|
init: function () {
|
|
5133
5283
|
MediumEditor.Extension.prototype.init.apply(this, arguments);
|
|
5134
5284
|
|
|
5135
5285
|
if (this.forcePlainText || this.cleanPastedHTML) {
|
|
5136
|
-
this.subscribe('editablePaste', this.handlePaste.bind(this));
|
|
5137
5286
|
this.subscribe('editableKeydown', this.handleKeydown.bind(this));
|
|
5287
|
+
// We need access to the full event data in paste
|
|
5288
|
+
// so we can't use the editablePaste event here
|
|
5289
|
+
this.getEditorElements().forEach(function (element) {
|
|
5290
|
+
this.on(element, 'paste', this.handlePaste.bind(this));
|
|
5291
|
+
}, this);
|
|
5292
|
+
this.subscribe('addElement', this.handleAddElement.bind(this));
|
|
5138
5293
|
}
|
|
5139
5294
|
},
|
|
5140
5295
|
|
|
5296
|
+
handleAddElement: function (event, editable) {
|
|
5297
|
+
this.on(editable, 'paste', this.handlePaste.bind(this));
|
|
5298
|
+
},
|
|
5299
|
+
|
|
5141
5300
|
destroy: function () {
|
|
5142
5301
|
// Make sure pastebin is destroyed in case it's still around for some reason
|
|
5143
5302
|
if (this.forcePlainText || this.cleanPastedHTML) {
|
|
@@ -5214,6 +5373,12 @@ MediumEditor.extensions = {};
|
|
|
5214
5373
|
event.preventDefault();
|
|
5215
5374
|
this.removePasteBin();
|
|
5216
5375
|
this.doPaste(pastedHTML, pastedPlain, editable);
|
|
5376
|
+
|
|
5377
|
+
// The event handling code listens for paste on the editable element
|
|
5378
|
+
// in order to trigger the editablePaste event. Since this paste event
|
|
5379
|
+
// is happening on the pastebin, the event handling code never knows about it
|
|
5380
|
+
// So, we have to trigger editablePaste manually
|
|
5381
|
+
this.trigger('editablePaste', { currentTarget: editable, target: editable }, editable);
|
|
5217
5382
|
return;
|
|
5218
5383
|
}
|
|
5219
5384
|
|
|
@@ -5231,6 +5396,12 @@ MediumEditor.extensions = {};
|
|
|
5231
5396
|
|
|
5232
5397
|
// Handle the paste with the html from the paste bin
|
|
5233
5398
|
this.doPaste(pastedHTML, pastedPlain, editable);
|
|
5399
|
+
|
|
5400
|
+
// The event handling code listens for paste on the editable element
|
|
5401
|
+
// in order to trigger the editablePaste event. Since this paste event
|
|
5402
|
+
// is happening on the pastebin, the event handling code never knows about it
|
|
5403
|
+
// So, we have to trigger editablePaste manually
|
|
5404
|
+
this.trigger('editablePaste', { currentTarget: editable, target: editable }, editable);
|
|
5234
5405
|
}.bind(this), 0);
|
|
5235
5406
|
},
|
|
5236
5407
|
|
|
@@ -5391,7 +5562,8 @@ MediumEditor.extensions = {};
|
|
|
5391
5562
|
pasteHTML: function (html, options) {
|
|
5392
5563
|
options = MediumEditor.util.defaults({}, options, {
|
|
5393
5564
|
cleanAttrs: this.cleanAttrs,
|
|
5394
|
-
cleanTags: this.cleanTags
|
|
5565
|
+
cleanTags: this.cleanTags,
|
|
5566
|
+
unwrapTags: this.unwrapTags
|
|
5395
5567
|
});
|
|
5396
5568
|
|
|
5397
5569
|
var elList, workEl, i, fragmentBody, pasteBlock = this.document.createDocumentFragment();
|
|
@@ -5413,6 +5585,7 @@ MediumEditor.extensions = {};
|
|
|
5413
5585
|
|
|
5414
5586
|
MediumEditor.util.cleanupAttrs(workEl, options.cleanAttrs);
|
|
5415
5587
|
MediumEditor.util.cleanupTags(workEl, options.cleanTags);
|
|
5588
|
+
MediumEditor.util.unwrapTags(workEl, options.unwrapTags);
|
|
5416
5589
|
}
|
|
5417
5590
|
|
|
5418
5591
|
MediumEditor.util.insertHTMLCommand(this.document, fragmentBody.innerHTML.replace(/ /g, ' '));
|
|
@@ -5523,37 +5696,61 @@ MediumEditor.extensions = {};
|
|
|
5523
5696
|
},
|
|
5524
5697
|
|
|
5525
5698
|
initPlaceholders: function () {
|
|
5526
|
-
this.getEditorElements().forEach(
|
|
5527
|
-
|
|
5528
|
-
|
|
5529
|
-
|
|
5530
|
-
|
|
5531
|
-
|
|
5699
|
+
this.getEditorElements().forEach(this.initElement, this);
|
|
5700
|
+
},
|
|
5701
|
+
|
|
5702
|
+
handleAddElement: function (event, editable) {
|
|
5703
|
+
this.initElement(editable);
|
|
5704
|
+
},
|
|
5705
|
+
|
|
5706
|
+
initElement: function (el) {
|
|
5707
|
+
if (!el.getAttribute('data-placeholder')) {
|
|
5708
|
+
el.setAttribute('data-placeholder', this.text);
|
|
5709
|
+
}
|
|
5710
|
+
this.updatePlaceholder(el);
|
|
5532
5711
|
},
|
|
5533
5712
|
|
|
5534
5713
|
destroy: function () {
|
|
5535
|
-
this.getEditorElements().forEach(
|
|
5536
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
5539
|
-
|
|
5714
|
+
this.getEditorElements().forEach(this.cleanupElement, this);
|
|
5715
|
+
},
|
|
5716
|
+
|
|
5717
|
+
handleRemoveElement: function (event, editable) {
|
|
5718
|
+
this.cleanupElement(editable);
|
|
5719
|
+
},
|
|
5720
|
+
|
|
5721
|
+
cleanupElement: function (el) {
|
|
5722
|
+
if (el.getAttribute('data-placeholder') === this.text) {
|
|
5723
|
+
el.removeAttribute('data-placeholder');
|
|
5724
|
+
}
|
|
5540
5725
|
},
|
|
5541
5726
|
|
|
5542
5727
|
showPlaceholder: function (el) {
|
|
5543
5728
|
if (el) {
|
|
5544
|
-
|
|
5729
|
+
// https://github.com/yabwe/medium-editor/issues/234
|
|
5730
|
+
// In firefox, styling the placeholder with an absolutely positioned
|
|
5731
|
+
// pseudo element causes the cursor to appear in a bad location
|
|
5732
|
+
// when the element is completely empty, so apply a different class to
|
|
5733
|
+
// style it with a relatively positioned pseudo element
|
|
5734
|
+
if (MediumEditor.util.isFF && el.childNodes.length === 0) {
|
|
5735
|
+
el.classList.add('medium-editor-placeholder-relative');
|
|
5736
|
+
el.classList.remove('medium-editor-placeholder');
|
|
5737
|
+
} else {
|
|
5738
|
+
el.classList.add('medium-editor-placeholder');
|
|
5739
|
+
el.classList.remove('medium-editor-placeholder-relative');
|
|
5740
|
+
}
|
|
5545
5741
|
}
|
|
5546
5742
|
},
|
|
5547
5743
|
|
|
5548
5744
|
hidePlaceholder: function (el) {
|
|
5549
5745
|
if (el) {
|
|
5550
5746
|
el.classList.remove('medium-editor-placeholder');
|
|
5747
|
+
el.classList.remove('medium-editor-placeholder-relative');
|
|
5551
5748
|
}
|
|
5552
5749
|
},
|
|
5553
5750
|
|
|
5554
5751
|
updatePlaceholder: function (el, dontShow) {
|
|
5555
5752
|
// If the element has content, hide the placeholder
|
|
5556
|
-
if (el.querySelector('img, blockquote, ul, ol') || (el.textContent.replace(/^\s+|\s+$/g, '') !== '')) {
|
|
5753
|
+
if (el.querySelector('img, blockquote, ul, ol, table') || (el.textContent.replace(/^\s+|\s+$/g, '') !== '')) {
|
|
5557
5754
|
return this.hidePlaceholder(el);
|
|
5558
5755
|
}
|
|
5559
5756
|
|
|
@@ -5573,6 +5770,10 @@ MediumEditor.extensions = {};
|
|
|
5573
5770
|
|
|
5574
5771
|
// When the editor loses focus, check if the placeholder should be visible
|
|
5575
5772
|
this.subscribe('blur', this.handleBlur.bind(this));
|
|
5773
|
+
|
|
5774
|
+
// Need to know when elements are added/removed from the editor
|
|
5775
|
+
this.subscribe('addElement', this.handleAddElement.bind(this));
|
|
5776
|
+
this.subscribe('removeElement', this.handleRemoveElement.bind(this));
|
|
5576
5777
|
},
|
|
5577
5778
|
|
|
5578
5779
|
handleInput: function (event, element) {
|
|
@@ -5789,6 +5990,10 @@ MediumEditor.extensions = {};
|
|
|
5789
5990
|
|
|
5790
5991
|
// Toolbar accessors
|
|
5791
5992
|
|
|
5993
|
+
getInteractionElements: function () {
|
|
5994
|
+
return this.getToolbarElement();
|
|
5995
|
+
},
|
|
5996
|
+
|
|
5792
5997
|
getToolbarElement: function () {
|
|
5793
5998
|
if (!this.toolbar) {
|
|
5794
5999
|
this.toolbar = this.createToolbar();
|
|
@@ -6212,35 +6417,66 @@ MediumEditor.extensions = {};
|
|
|
6212
6417
|
}
|
|
6213
6418
|
}
|
|
6214
6419
|
|
|
6215
|
-
var
|
|
6216
|
-
middleBoundary = (boundary.left + boundary.right) / 2,
|
|
6420
|
+
var containerWidth = this.window.innerWidth,
|
|
6217
6421
|
toolbarElement = this.getToolbarElement(),
|
|
6218
6422
|
toolbarHeight = toolbarElement.offsetHeight,
|
|
6219
6423
|
toolbarWidth = toolbarElement.offsetWidth,
|
|
6220
6424
|
halfOffsetWidth = toolbarWidth / 2,
|
|
6221
6425
|
buttonHeight = 50,
|
|
6222
|
-
defaultLeft = this.diffLeft - halfOffsetWidth
|
|
6426
|
+
defaultLeft = this.diffLeft - halfOffsetWidth,
|
|
6427
|
+
elementsContainer = this.getEditorOption('elementsContainer'),
|
|
6428
|
+
elementsContainerAbsolute = ['absolute', 'fixed'].indexOf(window.getComputedStyle(elementsContainer).getPropertyValue('position')) > -1,
|
|
6429
|
+
positions = {},
|
|
6430
|
+
relativeBoundary = {},
|
|
6431
|
+
middleBoundary, elementsContainerBoundary;
|
|
6432
|
+
|
|
6433
|
+
// If container element is absolute / fixed, recalculate boundaries to be relative to the container
|
|
6434
|
+
if (elementsContainerAbsolute) {
|
|
6435
|
+
elementsContainerBoundary = elementsContainer.getBoundingClientRect();
|
|
6436
|
+
['top', 'left'].forEach(function (key) {
|
|
6437
|
+
relativeBoundary[key] = boundary[key] - elementsContainerBoundary[key];
|
|
6438
|
+
});
|
|
6439
|
+
|
|
6440
|
+
relativeBoundary.width = boundary.width;
|
|
6441
|
+
relativeBoundary.height = boundary.height;
|
|
6442
|
+
boundary = relativeBoundary;
|
|
6443
|
+
|
|
6444
|
+
containerWidth = elementsContainerBoundary.width;
|
|
6445
|
+
|
|
6446
|
+
// Adjust top position according to container scroll position
|
|
6447
|
+
positions.top = elementsContainer.scrollTop;
|
|
6448
|
+
} else {
|
|
6449
|
+
// Adjust top position according to window scroll position
|
|
6450
|
+
positions.top = this.window.pageYOffset;
|
|
6451
|
+
}
|
|
6452
|
+
|
|
6453
|
+
middleBoundary = boundary.left + boundary.width / 2;
|
|
6454
|
+
positions.top += boundary.top - toolbarHeight;
|
|
6223
6455
|
|
|
6224
6456
|
if (boundary.top < buttonHeight) {
|
|
6225
6457
|
toolbarElement.classList.add('medium-toolbar-arrow-over');
|
|
6226
6458
|
toolbarElement.classList.remove('medium-toolbar-arrow-under');
|
|
6227
|
-
|
|
6459
|
+
positions.top += buttonHeight + boundary.height - this.diffTop;
|
|
6228
6460
|
} else {
|
|
6229
6461
|
toolbarElement.classList.add('medium-toolbar-arrow-under');
|
|
6230
6462
|
toolbarElement.classList.remove('medium-toolbar-arrow-over');
|
|
6231
|
-
|
|
6463
|
+
positions.top += this.diffTop;
|
|
6232
6464
|
}
|
|
6233
6465
|
|
|
6234
6466
|
if (middleBoundary < halfOffsetWidth) {
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
} else if ((
|
|
6238
|
-
|
|
6239
|
-
|
|
6467
|
+
positions.left = defaultLeft + halfOffsetWidth;
|
|
6468
|
+
positions.right = 'initial';
|
|
6469
|
+
} else if ((containerWidth - middleBoundary) < halfOffsetWidth) {
|
|
6470
|
+
positions.left = 'auto';
|
|
6471
|
+
positions.right = 0;
|
|
6240
6472
|
} else {
|
|
6241
|
-
|
|
6242
|
-
|
|
6473
|
+
positions.left = defaultLeft + middleBoundary;
|
|
6474
|
+
positions.right = 'initial';
|
|
6243
6475
|
}
|
|
6476
|
+
|
|
6477
|
+
['top', 'left', 'right'].forEach(function (key) {
|
|
6478
|
+
toolbarElement.style[key] = positions[key] + (isNaN(positions[key]) ? '' : 'px');
|
|
6479
|
+
});
|
|
6244
6480
|
}
|
|
6245
6481
|
});
|
|
6246
6482
|
|
|
@@ -6447,6 +6683,31 @@ MediumEditor.extensions = {};
|
|
|
6447
6683
|
// then pressing backspace key should change the <blockquote> to a <p> tag
|
|
6448
6684
|
event.preventDefault();
|
|
6449
6685
|
MediumEditor.util.execFormatBlock(this.options.ownerDocument, 'p');
|
|
6686
|
+
} else if (MediumEditor.util.isKey(event, MediumEditor.util.keyCode.ENTER) &&
|
|
6687
|
+
(MediumEditor.util.getClosestTag(node, 'blockquote') !== false) &&
|
|
6688
|
+
MediumEditor.selection.getCaretOffsets(node).right === 0) {
|
|
6689
|
+
|
|
6690
|
+
// when cursor is at the end of <blockquote>,
|
|
6691
|
+
// then pressing enter key should create <p> tag, not <blockquote>
|
|
6692
|
+
p = this.options.ownerDocument.createElement('p');
|
|
6693
|
+
p.innerHTML = '<br>';
|
|
6694
|
+
node.parentElement.insertBefore(p, node.nextSibling);
|
|
6695
|
+
|
|
6696
|
+
// move the cursor into the new paragraph
|
|
6697
|
+
MediumEditor.selection.moveCursor(this.options.ownerDocument, p);
|
|
6698
|
+
|
|
6699
|
+
event.preventDefault();
|
|
6700
|
+
} else if (MediumEditor.util.isKey(event, MediumEditor.util.keyCode.BACKSPACE) &&
|
|
6701
|
+
MediumEditor.util.isMediumEditorElement(node.parentElement) &&
|
|
6702
|
+
!node.previousElementSibling &&
|
|
6703
|
+
node.nextElementSibling &&
|
|
6704
|
+
isEmpty.test(node.innerHTML)) {
|
|
6705
|
+
|
|
6706
|
+
// when cursor is in the first element, it's empty and user presses backspace,
|
|
6707
|
+
// do delete action instead to get rid of the first element and move caret to 2nd
|
|
6708
|
+
event.preventDefault();
|
|
6709
|
+
MediumEditor.selection.moveCursor(this.options.ownerDocument, node.nextSibling);
|
|
6710
|
+
node.parentElement.removeChild(node);
|
|
6450
6711
|
}
|
|
6451
6712
|
}
|
|
6452
6713
|
|
|
@@ -6642,17 +6903,17 @@ MediumEditor.extensions = {};
|
|
|
6642
6903
|
return !this.options.extensions['imageDragging'];
|
|
6643
6904
|
}
|
|
6644
6905
|
|
|
6645
|
-
function createContentEditable(textarea
|
|
6646
|
-
var div =
|
|
6906
|
+
function createContentEditable(textarea) {
|
|
6907
|
+
var div = this.options.ownerDocument.createElement('div'),
|
|
6647
6908
|
now = Date.now(),
|
|
6648
|
-
uniqueId = 'medium-editor-' + now
|
|
6909
|
+
uniqueId = 'medium-editor-' + now,
|
|
6649
6910
|
atts = textarea.attributes;
|
|
6650
6911
|
|
|
6651
6912
|
// Some browsers can move pretty fast, since we're using a timestamp
|
|
6652
6913
|
// to make a unique-id, ensure that the id is actually unique on the page
|
|
6653
|
-
while (
|
|
6914
|
+
while (this.options.ownerDocument.getElementById(uniqueId)) {
|
|
6654
6915
|
now++;
|
|
6655
|
-
uniqueId = 'medium-editor-' + now
|
|
6916
|
+
uniqueId = 'medium-editor-' + now;
|
|
6656
6917
|
}
|
|
6657
6918
|
|
|
6658
6919
|
div.className = textarea.className;
|
|
@@ -6669,6 +6930,16 @@ MediumEditor.extensions = {};
|
|
|
6669
6930
|
}
|
|
6670
6931
|
}
|
|
6671
6932
|
|
|
6933
|
+
// If textarea has a form, listen for reset on the form to clear
|
|
6934
|
+
// the content of the created div
|
|
6935
|
+
if (textarea.form) {
|
|
6936
|
+
this.on(textarea.form, 'reset', function (event) {
|
|
6937
|
+
if (!event.defaultPrevented) {
|
|
6938
|
+
this.resetContent(this.options.ownerDocument.getElementById(uniqueId));
|
|
6939
|
+
}
|
|
6940
|
+
}.bind(this));
|
|
6941
|
+
}
|
|
6942
|
+
|
|
6672
6943
|
textarea.classList.add('medium-editor-hidden');
|
|
6673
6944
|
textarea.parentNode.insertBefore(
|
|
6674
6945
|
div,
|
|
@@ -6678,10 +6949,10 @@ MediumEditor.extensions = {};
|
|
|
6678
6949
|
return div;
|
|
6679
6950
|
}
|
|
6680
6951
|
|
|
6681
|
-
function initElement(element,
|
|
6952
|
+
function initElement(element, editorId) {
|
|
6682
6953
|
if (!element.getAttribute('data-medium-editor-element')) {
|
|
6683
6954
|
if (element.nodeName.toLowerCase() === 'textarea') {
|
|
6684
|
-
element = createContentEditable(
|
|
6955
|
+
element = createContentEditable.call(this, element);
|
|
6685
6956
|
|
|
6686
6957
|
// Make sure we only attach to editableInput once for <textarea> elements
|
|
6687
6958
|
if (!this.instanceHandleEditableInput) {
|
|
@@ -6709,10 +6980,18 @@ MediumEditor.extensions = {};
|
|
|
6709
6980
|
this.on(element, 'keyup', handleKeyup.bind(this));
|
|
6710
6981
|
}
|
|
6711
6982
|
|
|
6983
|
+
var elementId = MediumEditor.util.guid();
|
|
6984
|
+
|
|
6712
6985
|
element.setAttribute('data-medium-editor-element', true);
|
|
6986
|
+
element.classList.add('medium-editor-element');
|
|
6713
6987
|
element.setAttribute('role', 'textbox');
|
|
6714
6988
|
element.setAttribute('aria-multiline', true);
|
|
6715
|
-
element.setAttribute('medium-editor-index',
|
|
6989
|
+
element.setAttribute('data-medium-editor-editor-index', editorId);
|
|
6990
|
+
// TODO: Merge data-medium-editor-element and medium-editor-index attributes for 6.0.0
|
|
6991
|
+
// medium-editor-index is not named correctly anymore and can be re-purposed to signify
|
|
6992
|
+
// whether the element has been initialized or not
|
|
6993
|
+
element.setAttribute('medium-editor-index', elementId);
|
|
6994
|
+
initialContent[elementId] = element.innerHTML;
|
|
6716
6995
|
|
|
6717
6996
|
this.events.attachAllEventsToElement(element);
|
|
6718
6997
|
}
|
|
@@ -6870,6 +7149,11 @@ MediumEditor.extensions = {};
|
|
|
6870
7149
|
return this.options.ownerDocument.execCommand('insertImage', false, src);
|
|
6871
7150
|
}
|
|
6872
7151
|
|
|
7152
|
+
if (action === 'html') {
|
|
7153
|
+
var html = this.options.contentWindow.getSelection().toString().trim();
|
|
7154
|
+
return MediumEditor.util.insertHTMLCommand(this.options.ownerDocument, html);
|
|
7155
|
+
}
|
|
7156
|
+
|
|
6873
7157
|
/* Issue: https://github.com/yabwe/medium-editor/issues/595
|
|
6874
7158
|
* If the action is to justify the text */
|
|
6875
7159
|
if (justifyAction.exec(action)) {
|
|
@@ -6931,6 +7215,8 @@ MediumEditor.extensions = {};
|
|
|
6931
7215
|
}
|
|
6932
7216
|
}
|
|
6933
7217
|
|
|
7218
|
+
var initialContent = {};
|
|
7219
|
+
|
|
6934
7220
|
MediumEditor.prototype = {
|
|
6935
7221
|
// NOT DOCUMENTED - exposed for backwards compatability
|
|
6936
7222
|
init: function (elements, options) {
|
|
@@ -6949,6 +7235,7 @@ MediumEditor.extensions = {};
|
|
|
6949
7235
|
return;
|
|
6950
7236
|
}
|
|
6951
7237
|
|
|
7238
|
+
addToEditors.call(this, this.options.contentWindow);
|
|
6952
7239
|
this.events = new MediumEditor.Events(this);
|
|
6953
7240
|
this.elements = [];
|
|
6954
7241
|
|
|
@@ -6959,7 +7246,6 @@ MediumEditor.extensions = {};
|
|
|
6959
7246
|
}
|
|
6960
7247
|
|
|
6961
7248
|
this.isActive = true;
|
|
6962
|
-
addToEditors.call(this, this.options.contentWindow);
|
|
6963
7249
|
|
|
6964
7250
|
// Call initialization helpers
|
|
6965
7251
|
initExtensions.call(this);
|
|
@@ -6991,9 +7277,11 @@ MediumEditor.extensions = {};
|
|
|
6991
7277
|
element.removeAttribute('contentEditable');
|
|
6992
7278
|
element.removeAttribute('spellcheck');
|
|
6993
7279
|
element.removeAttribute('data-medium-editor-element');
|
|
7280
|
+
element.classList.remove('medium-editor-element');
|
|
6994
7281
|
element.removeAttribute('role');
|
|
6995
7282
|
element.removeAttribute('aria-multiline');
|
|
6996
7283
|
element.removeAttribute('medium-editor-index');
|
|
7284
|
+
element.removeAttribute('data-medium-editor-editor-index');
|
|
6997
7285
|
|
|
6998
7286
|
// Remove any elements created for textareas
|
|
6999
7287
|
if (element.getAttribute('medium-editor-textarea-id')) {
|
|
@@ -7452,11 +7740,38 @@ MediumEditor.extensions = {};
|
|
|
7452
7740
|
}
|
|
7453
7741
|
},
|
|
7454
7742
|
|
|
7743
|
+
getContent: function (index) {
|
|
7744
|
+
index = index || 0;
|
|
7745
|
+
|
|
7746
|
+
if (this.elements[index]) {
|
|
7747
|
+
return this.elements[index].innerHTML.trim();
|
|
7748
|
+
}
|
|
7749
|
+
return null;
|
|
7750
|
+
},
|
|
7751
|
+
|
|
7455
7752
|
checkContentChanged: function (editable) {
|
|
7456
7753
|
editable = editable || MediumEditor.selection.getSelectionElement(this.options.contentWindow);
|
|
7457
7754
|
this.events.updateInput(editable, { target: editable, currentTarget: editable });
|
|
7458
7755
|
},
|
|
7459
7756
|
|
|
7757
|
+
resetContent: function (element) {
|
|
7758
|
+
// For all elements that exist in the this.elements array, we can assume:
|
|
7759
|
+
// - Its initial content has been set in the initialContent object
|
|
7760
|
+
// - It has a medium-editor-index attribute which is the key value in the initialContent object
|
|
7761
|
+
|
|
7762
|
+
if (element) {
|
|
7763
|
+
var index = this.elements.indexOf(element);
|
|
7764
|
+
if (index !== -1) {
|
|
7765
|
+
this.setContent(initialContent[element.getAttribute('medium-editor-index')], index);
|
|
7766
|
+
}
|
|
7767
|
+
return;
|
|
7768
|
+
}
|
|
7769
|
+
|
|
7770
|
+
this.elements.forEach(function (el, idx) {
|
|
7771
|
+
this.setContent(initialContent[el.getAttribute('medium-editor-index')], idx);
|
|
7772
|
+
}, this);
|
|
7773
|
+
},
|
|
7774
|
+
|
|
7460
7775
|
addElements: function (selector) {
|
|
7461
7776
|
// Convert elements into an array
|
|
7462
7777
|
var elements = createElementsArray(selector, this.options.ownerDocument, true);
|
|
@@ -7468,10 +7783,13 @@ MediumEditor.extensions = {};
|
|
|
7468
7783
|
|
|
7469
7784
|
elements.forEach(function (element) {
|
|
7470
7785
|
// Initialize all new elements (we check that in those functions don't worry)
|
|
7471
|
-
element = initElement.call(this, element);
|
|
7786
|
+
element = initElement.call(this, element, this.id);
|
|
7472
7787
|
|
|
7473
7788
|
// Add new elements to our internal elements array
|
|
7474
7789
|
this.elements.push(element);
|
|
7790
|
+
|
|
7791
|
+
// Trigger event so extensions can know when an element has been added
|
|
7792
|
+
this.trigger('addElement', { target: element, currentTarget: element }, element);
|
|
7475
7793
|
}, this);
|
|
7476
7794
|
},
|
|
7477
7795
|
|
|
@@ -7494,12 +7812,23 @@ MediumEditor.extensions = {};
|
|
|
7494
7812
|
if (element.getAttribute('medium-editor-textarea-id')) {
|
|
7495
7813
|
cleanupTextareaElement(element);
|
|
7496
7814
|
}
|
|
7815
|
+
// Trigger event so extensions can clean-up elements that are being removed
|
|
7816
|
+
this.trigger('removeElement', { target: element, currentTarget: element }, element);
|
|
7497
7817
|
return false;
|
|
7498
7818
|
}
|
|
7499
7819
|
return true;
|
|
7500
7820
|
}, this);
|
|
7501
7821
|
}
|
|
7502
7822
|
};
|
|
7823
|
+
|
|
7824
|
+
MediumEditor.getEditorFromElement = function (element) {
|
|
7825
|
+
var index = element.getAttribute('data-medium-editor-editor-index'),
|
|
7826
|
+
win = element && element.ownerDocument && (element.ownerDocument.defaultView || element.ownerDocument.parentWindow);
|
|
7827
|
+
if (win && win._mediumEditors && win._mediumEditors[index]) {
|
|
7828
|
+
return win._mediumEditors[index];
|
|
7829
|
+
}
|
|
7830
|
+
return null;
|
|
7831
|
+
};
|
|
7503
7832
|
}());
|
|
7504
7833
|
|
|
7505
7834
|
(function () {
|
|
@@ -7540,7 +7869,7 @@ MediumEditor.parseVersionString = function (release) {
|
|
|
7540
7869
|
|
|
7541
7870
|
MediumEditor.version = MediumEditor.parseVersionString.call(this, ({
|
|
7542
7871
|
// grunt-bump looks for this:
|
|
7543
|
-
'version': '5.
|
|
7872
|
+
'version': '5.23.1'
|
|
7544
7873
|
}).version);
|
|
7545
7874
|
|
|
7546
7875
|
return MediumEditor;
|