'build'
|
@ -0,0 +1,600 @@
|
|||
{
|
||||
"./static/js/0.b26c77b7.chunk.js": "/build/./static/js/0.b26c77b7.chunk.js",
|
||||
"./static/js/1.4a924e00.chunk.js": "/build/./static/js/1.4a924e00.chunk.js",
|
||||
"./static/js/2.25240ef8.chunk.js": "/build/./static/js/2.25240ef8.chunk.js",
|
||||
"./static/js/3.aff98d9d.chunk.js": "/build/./static/js/3.aff98d9d.chunk.js",
|
||||
"./static/js/4.2f13b054.chunk.js": "/build/./static/js/4.2f13b054.chunk.js",
|
||||
"./static/js/5.baf226cf.chunk.js": "/build/./static/js/5.baf226cf.chunk.js",
|
||||
"./static/js/6.9bf7dd91.chunk.js": "/build/./static/js/6.9bf7dd91.chunk.js",
|
||||
"./static/js/7.b3a58fcc.chunk.js": "/build/./static/js/7.b3a58fcc.chunk.js",
|
||||
"static/css/8.8bdeed6f.chunk.css": "/build/static/css/8.8bdeed6f.chunk.css",
|
||||
"./static/js/8.411c88ff.chunk.js": "/build/./static/js/8.411c88ff.chunk.js",
|
||||
"static/css/9.c0e03858.chunk.css": "/build/static/css/9.c0e03858.chunk.css",
|
||||
"./static/js/9.10a727a3.chunk.js": "/build/./static/js/9.10a727a3.chunk.js",
|
||||
"static/css/10.f7228588.chunk.css": "/build/static/css/10.f7228588.chunk.css",
|
||||
"./static/js/10.99988b84.chunk.js": "/build/./static/js/10.99988b84.chunk.js",
|
||||
"static/css/11.1c5f3a58.chunk.css": "/build/static/css/11.1c5f3a58.chunk.css",
|
||||
"./static/js/11.e74abe4f.chunk.js": "/build/./static/js/11.e74abe4f.chunk.js",
|
||||
"static/css/12.a2914384.chunk.css": "/build/static/css/12.a2914384.chunk.css",
|
||||
"./static/js/12.49fbdd73.chunk.js": "/build/./static/js/12.49fbdd73.chunk.js",
|
||||
"./static/js/13.2d48a370.chunk.js": "/build/./static/js/13.2d48a370.chunk.js",
|
||||
"./static/js/14.8e87787f.chunk.js": "/build/./static/js/14.8e87787f.chunk.js",
|
||||
"./static/js/15.986b6025.chunk.js": "/build/./static/js/15.986b6025.chunk.js",
|
||||
"./static/js/16.489cb93e.chunk.js": "/build/./static/js/16.489cb93e.chunk.js",
|
||||
"./static/js/17.250784aa.chunk.js": "/build/./static/js/17.250784aa.chunk.js",
|
||||
"./static/js/18.a1ce0247.chunk.js": "/build/./static/js/18.a1ce0247.chunk.js",
|
||||
"./static/js/19.0f4190f5.chunk.js": "/build/./static/js/19.0f4190f5.chunk.js",
|
||||
"./static/js/20.1ac253a3.chunk.js": "/build/./static/js/20.1ac253a3.chunk.js",
|
||||
"./static/js/21.fe7031fa.chunk.js": "/build/./static/js/21.fe7031fa.chunk.js",
|
||||
"static/css/22.c232713f.chunk.css": "/build/static/css/22.c232713f.chunk.css",
|
||||
"./static/js/22.5a90402c.chunk.js": "/build/./static/js/22.5a90402c.chunk.js",
|
||||
"./static/js/23.0dceea05.chunk.js": "/build/./static/js/23.0dceea05.chunk.js",
|
||||
"static/css/24.d2ddda53.chunk.css": "/build/static/css/24.d2ddda53.chunk.css",
|
||||
"./static/js/24.95c9e4d0.chunk.js": "/build/./static/js/24.95c9e4d0.chunk.js",
|
||||
"./static/js/25.232bade1.chunk.js": "/build/./static/js/25.232bade1.chunk.js",
|
||||
"static/css/26.9f579fa1.chunk.css": "/build/static/css/26.9f579fa1.chunk.css",
|
||||
"./static/js/26.c27513ac.chunk.js": "/build/./static/js/26.c27513ac.chunk.js",
|
||||
"./static/js/27.f2a5f30d.chunk.js": "/build/./static/js/27.f2a5f30d.chunk.js",
|
||||
"./static/js/28.3b2f8715.chunk.js": "/build/./static/js/28.3b2f8715.chunk.js",
|
||||
"./static/js/29.af6dddc8.chunk.js": "/build/./static/js/29.af6dddc8.chunk.js",
|
||||
"./static/js/30.144d0aff.chunk.js": "/build/./static/js/30.144d0aff.chunk.js",
|
||||
"./static/js/31.74318f67.chunk.js": "/build/./static/js/31.74318f67.chunk.js",
|
||||
"./static/js/32.b600b9e3.chunk.js": "/build/./static/js/32.b600b9e3.chunk.js",
|
||||
"static/css/33.557eaa2f.chunk.css": "/build/static/css/33.557eaa2f.chunk.css",
|
||||
"./static/js/33.7fde5fc0.chunk.js": "/build/./static/js/33.7fde5fc0.chunk.js",
|
||||
"static/css/34.551e5fab.chunk.css": "/build/static/css/34.551e5fab.chunk.css",
|
||||
"./static/js/34.dbeb4770.chunk.js": "/build/./static/js/34.dbeb4770.chunk.js",
|
||||
"static/css/35.be4e1d7d.chunk.css": "/build/static/css/35.be4e1d7d.chunk.css",
|
||||
"./static/js/35.46695d2e.chunk.js": "/build/./static/js/35.46695d2e.chunk.js",
|
||||
"./static/js/36.b9db1aac.chunk.js": "/build/./static/js/36.b9db1aac.chunk.js",
|
||||
"static/css/37.8531cf67.chunk.css": "/build/static/css/37.8531cf67.chunk.css",
|
||||
"./static/js/37.69e6f062.chunk.js": "/build/./static/js/37.69e6f062.chunk.js",
|
||||
"./static/js/38.34fc6343.chunk.js": "/build/./static/js/38.34fc6343.chunk.js",
|
||||
"static/css/39.e0764343.chunk.css": "/build/static/css/39.e0764343.chunk.css",
|
||||
"./static/js/39.496b9c8d.chunk.js": "/build/./static/js/39.496b9c8d.chunk.js",
|
||||
"static/css/40.6417fb3d.chunk.css": "/build/static/css/40.6417fb3d.chunk.css",
|
||||
"./static/js/40.0b491691.chunk.js": "/build/./static/js/40.0b491691.chunk.js",
|
||||
"static/css/41.6f3ab3c8.chunk.css": "/build/static/css/41.6f3ab3c8.chunk.css",
|
||||
"./static/js/41.47dca887.chunk.js": "/build/./static/js/41.47dca887.chunk.js",
|
||||
"static/css/42.8bdeed6f.chunk.css": "/build/static/css/42.8bdeed6f.chunk.css",
|
||||
"./static/js/42.ccd08181.chunk.js": "/build/./static/js/42.ccd08181.chunk.js",
|
||||
"static/css/43.3262fb19.chunk.css": "/build/static/css/43.3262fb19.chunk.css",
|
||||
"./static/js/43.1ca32157.chunk.js": "/build/./static/js/43.1ca32157.chunk.js",
|
||||
"static/css/44.5fc996d6.chunk.css": "/build/static/css/44.5fc996d6.chunk.css",
|
||||
"./static/js/44.eb2c6b47.chunk.js": "/build/./static/js/44.eb2c6b47.chunk.js",
|
||||
"static/css/45.abf6bb9b.chunk.css": "/build/static/css/45.abf6bb9b.chunk.css",
|
||||
"./static/js/45.61c26e0d.chunk.js": "/build/./static/js/45.61c26e0d.chunk.js",
|
||||
"./static/js/46.18bbd415.chunk.js": "/build/./static/js/46.18bbd415.chunk.js",
|
||||
"static/css/47.20969d43.chunk.css": "/build/static/css/47.20969d43.chunk.css",
|
||||
"./static/js/47.f9bec50b.chunk.js": "/build/./static/js/47.f9bec50b.chunk.js",
|
||||
"./static/js/48.5d67a7ec.chunk.js": "/build/./static/js/48.5d67a7ec.chunk.js",
|
||||
"./static/js/49.fa20e1ec.chunk.js": "/build/./static/js/49.fa20e1ec.chunk.js",
|
||||
"static/css/50.acffe7d4.chunk.css": "/build/static/css/50.acffe7d4.chunk.css",
|
||||
"./static/js/50.19fa6a67.chunk.js": "/build/./static/js/50.19fa6a67.chunk.js",
|
||||
"static/css/51.4323f278.chunk.css": "/build/static/css/51.4323f278.chunk.css",
|
||||
"./static/js/51.001ff30b.chunk.js": "/build/./static/js/51.001ff30b.chunk.js",
|
||||
"static/css/52.8897a42f.chunk.css": "/build/static/css/52.8897a42f.chunk.css",
|
||||
"./static/js/52.6833c261.chunk.js": "/build/./static/js/52.6833c261.chunk.js",
|
||||
"static/css/53.ec1571c8.chunk.css": "/build/static/css/53.ec1571c8.chunk.css",
|
||||
"./static/js/53.34c607c1.chunk.js": "/build/./static/js/53.34c607c1.chunk.js",
|
||||
"static/css/54.a8e7b652.chunk.css": "/build/static/css/54.a8e7b652.chunk.css",
|
||||
"./static/js/54.9e6251ef.chunk.js": "/build/./static/js/54.9e6251ef.chunk.js",
|
||||
"static/css/55.458347c6.chunk.css": "/build/static/css/55.458347c6.chunk.css",
|
||||
"./static/js/55.11ee5370.chunk.js": "/build/./static/js/55.11ee5370.chunk.js",
|
||||
"./static/js/56.74cced0f.chunk.js": "/build/./static/js/56.74cced0f.chunk.js",
|
||||
"./static/js/57.080d0056.chunk.js": "/build/./static/js/57.080d0056.chunk.js",
|
||||
"static/css/58.b1c46d31.chunk.css": "/build/static/css/58.b1c46d31.chunk.css",
|
||||
"./static/js/58.56e6009b.chunk.js": "/build/./static/js/58.56e6009b.chunk.js",
|
||||
"static/css/59.db767247.chunk.css": "/build/static/css/59.db767247.chunk.css",
|
||||
"./static/js/59.900f52e1.chunk.js": "/build/./static/js/59.900f52e1.chunk.js",
|
||||
"static/css/60.95c8fd70.chunk.css": "/build/static/css/60.95c8fd70.chunk.css",
|
||||
"./static/js/60.c22d0927.chunk.js": "/build/./static/js/60.c22d0927.chunk.js",
|
||||
"static/css/61.3144ed07.chunk.css": "/build/static/css/61.3144ed07.chunk.css",
|
||||
"./static/js/61.a53804aa.chunk.js": "/build/./static/js/61.a53804aa.chunk.js",
|
||||
"./static/js/62.fabeb5f2.chunk.js": "/build/./static/js/62.fabeb5f2.chunk.js",
|
||||
"static/css/63.9cb5574e.chunk.css": "/build/static/css/63.9cb5574e.chunk.css",
|
||||
"./static/js/63.1514d0a5.chunk.js": "/build/./static/js/63.1514d0a5.chunk.js",
|
||||
"static/css/64.909d3daf.chunk.css": "/build/static/css/64.909d3daf.chunk.css",
|
||||
"./static/js/64.26904b69.chunk.js": "/build/./static/js/64.26904b69.chunk.js",
|
||||
"static/css/65.306147eb.chunk.css": "/build/static/css/65.306147eb.chunk.css",
|
||||
"./static/js/65.2f51c43c.chunk.js": "/build/./static/js/65.2f51c43c.chunk.js",
|
||||
"./static/js/66.a9a60764.chunk.js": "/build/./static/js/66.a9a60764.chunk.js",
|
||||
"static/css/67.f4704690.chunk.css": "/build/static/css/67.f4704690.chunk.css",
|
||||
"./static/js/67.ba5721fa.chunk.js": "/build/./static/js/67.ba5721fa.chunk.js",
|
||||
"static/css/68.3dea4405.chunk.css": "/build/static/css/68.3dea4405.chunk.css",
|
||||
"./static/js/68.99b49880.chunk.js": "/build/./static/js/68.99b49880.chunk.js",
|
||||
"static/css/69.2317255e.chunk.css": "/build/static/css/69.2317255e.chunk.css",
|
||||
"./static/js/69.0d062c15.chunk.js": "/build/./static/js/69.0d062c15.chunk.js",
|
||||
"./static/js/70.1a1b9fb1.chunk.js": "/build/./static/js/70.1a1b9fb1.chunk.js",
|
||||
"./static/js/71.ccef6f3c.chunk.js": "/build/./static/js/71.ccef6f3c.chunk.js",
|
||||
"static/css/72.bfe97be1.chunk.css": "/build/static/css/72.bfe97be1.chunk.css",
|
||||
"./static/js/72.b2199a90.chunk.js": "/build/./static/js/72.b2199a90.chunk.js",
|
||||
"./static/js/73.b335ce14.chunk.js": "/build/./static/js/73.b335ce14.chunk.js",
|
||||
"static/css/74.6a13e222.chunk.css": "/build/static/css/74.6a13e222.chunk.css",
|
||||
"./static/js/74.fd963c32.chunk.js": "/build/./static/js/74.fd963c32.chunk.js",
|
||||
"static/css/75.0c76283e.chunk.css": "/build/static/css/75.0c76283e.chunk.css",
|
||||
"./static/js/75.6376f871.chunk.js": "/build/./static/js/75.6376f871.chunk.js",
|
||||
"static/css/76.746d3b5f.chunk.css": "/build/static/css/76.746d3b5f.chunk.css",
|
||||
"./static/js/76.04279520.chunk.js": "/build/./static/js/76.04279520.chunk.js",
|
||||
"static/css/77.a65c9d2d.chunk.css": "/build/static/css/77.a65c9d2d.chunk.css",
|
||||
"./static/js/77.4dfd49d3.chunk.js": "/build/./static/js/77.4dfd49d3.chunk.js",
|
||||
"./static/js/78.bb7a4b5f.chunk.js": "/build/./static/js/78.bb7a4b5f.chunk.js",
|
||||
"static/css/79.a8369a12.chunk.css": "/build/static/css/79.a8369a12.chunk.css",
|
||||
"./static/js/79.14d639b1.chunk.js": "/build/./static/js/79.14d639b1.chunk.js",
|
||||
"static/css/80.1587d9f3.chunk.css": "/build/static/css/80.1587d9f3.chunk.css",
|
||||
"./static/js/80.de51e78b.chunk.js": "/build/./static/js/80.de51e78b.chunk.js",
|
||||
"./static/js/81.4f0af52e.chunk.js": "/build/./static/js/81.4f0af52e.chunk.js",
|
||||
"./static/js/82.0b8f0dcf.chunk.js": "/build/./static/js/82.0b8f0dcf.chunk.js",
|
||||
"static/css/83.16f611d2.chunk.css": "/build/static/css/83.16f611d2.chunk.css",
|
||||
"./static/js/83.9d32d150.chunk.js": "/build/./static/js/83.9d32d150.chunk.js",
|
||||
"static/css/84.285c512b.chunk.css": "/build/static/css/84.285c512b.chunk.css",
|
||||
"./static/js/84.d2326074.chunk.js": "/build/./static/js/84.d2326074.chunk.js",
|
||||
"static/css/85.bcb1f451.chunk.css": "/build/static/css/85.bcb1f451.chunk.css",
|
||||
"./static/js/85.cd887c24.chunk.js": "/build/./static/js/85.cd887c24.chunk.js",
|
||||
"static/css/86.17d1bb70.chunk.css": "/build/static/css/86.17d1bb70.chunk.css",
|
||||
"./static/js/86.655f4d6c.chunk.js": "/build/./static/js/86.655f4d6c.chunk.js",
|
||||
"static/css/87.c713331c.chunk.css": "/build/static/css/87.c713331c.chunk.css",
|
||||
"./static/js/87.5f5e124e.chunk.js": "/build/./static/js/87.5f5e124e.chunk.js",
|
||||
"static/css/88.fff00769.chunk.css": "/build/static/css/88.fff00769.chunk.css",
|
||||
"./static/js/88.4db267f0.chunk.js": "/build/./static/js/88.4db267f0.chunk.js",
|
||||
"static/css/89.0a9590f5.chunk.css": "/build/static/css/89.0a9590f5.chunk.css",
|
||||
"./static/js/89.9991edcc.chunk.js": "/build/./static/js/89.9991edcc.chunk.js",
|
||||
"static/css/90.d077de88.chunk.css": "/build/static/css/90.d077de88.chunk.css",
|
||||
"./static/js/90.861874e9.chunk.js": "/build/./static/js/90.861874e9.chunk.js",
|
||||
"static/css/91.834ebd5d.chunk.css": "/build/static/css/91.834ebd5d.chunk.css",
|
||||
"./static/js/91.b8d44d1c.chunk.js": "/build/./static/js/91.b8d44d1c.chunk.js",
|
||||
"static/css/92.72bd9d4a.chunk.css": "/build/static/css/92.72bd9d4a.chunk.css",
|
||||
"./static/js/92.d7f18353.chunk.js": "/build/./static/js/92.d7f18353.chunk.js",
|
||||
"./static/js/93.1d6fcf7b.chunk.js": "/build/./static/js/93.1d6fcf7b.chunk.js",
|
||||
"static/css/94.7cc79b14.chunk.css": "/build/static/css/94.7cc79b14.chunk.css",
|
||||
"./static/js/94.25615e79.chunk.js": "/build/./static/js/94.25615e79.chunk.js",
|
||||
"static/css/95.0cea9315.chunk.css": "/build/static/css/95.0cea9315.chunk.css",
|
||||
"./static/js/95.1aef208d.chunk.js": "/build/./static/js/95.1aef208d.chunk.js",
|
||||
"static/css/96.89efd2d4.chunk.css": "/build/static/css/96.89efd2d4.chunk.css",
|
||||
"./static/js/96.aab77732.chunk.js": "/build/./static/js/96.aab77732.chunk.js",
|
||||
"static/css/97.b374ea9c.chunk.css": "/build/static/css/97.b374ea9c.chunk.css",
|
||||
"./static/js/97.335799a0.chunk.js": "/build/./static/js/97.335799a0.chunk.js",
|
||||
"./static/js/98.ba4f9a9d.chunk.js": "/build/./static/js/98.ba4f9a9d.chunk.js",
|
||||
"static/css/99.ade1d045.chunk.css": "/build/static/css/99.ade1d045.chunk.css",
|
||||
"./static/js/99.26338c37.chunk.js": "/build/./static/js/99.26338c37.chunk.js",
|
||||
"static/css/100.db767247.chunk.css": "/build/static/css/100.db767247.chunk.css",
|
||||
"./static/js/100.e0bb646f.chunk.js": "/build/./static/js/100.e0bb646f.chunk.js",
|
||||
"static/css/101.02c763e8.chunk.css": "/build/static/css/101.02c763e8.chunk.css",
|
||||
"./static/js/101.5a4f72ae.chunk.js": "/build/./static/js/101.5a4f72ae.chunk.js",
|
||||
"./static/js/102.fa2370be.chunk.js": "/build/./static/js/102.fa2370be.chunk.js",
|
||||
"./static/js/103.fab7d6e6.chunk.js": "/build/./static/js/103.fab7d6e6.chunk.js",
|
||||
"static/css/104.4c8c6a11.chunk.css": "/build/static/css/104.4c8c6a11.chunk.css",
|
||||
"./static/js/104.503e393e.chunk.js": "/build/./static/js/104.503e393e.chunk.js",
|
||||
"static/css/105.d4e40697.chunk.css": "/build/static/css/105.d4e40697.chunk.css",
|
||||
"./static/js/105.c1bc4d4a.chunk.js": "/build/./static/js/105.c1bc4d4a.chunk.js",
|
||||
"static/css/106.89bc1500.chunk.css": "/build/static/css/106.89bc1500.chunk.css",
|
||||
"./static/js/106.10233678.chunk.js": "/build/./static/js/106.10233678.chunk.js",
|
||||
"static/css/107.f392094f.chunk.css": "/build/static/css/107.f392094f.chunk.css",
|
||||
"./static/js/107.2ce9ab05.chunk.js": "/build/./static/js/107.2ce9ab05.chunk.js",
|
||||
"./static/js/108.6bc045f6.chunk.js": "/build/./static/js/108.6bc045f6.chunk.js",
|
||||
"./static/js/109.c9b42c0b.chunk.js": "/build/./static/js/109.c9b42c0b.chunk.js",
|
||||
"./static/js/110.89a79b3a.chunk.js": "/build/./static/js/110.89a79b3a.chunk.js",
|
||||
"static/css/111.4054f41b.chunk.css": "/build/static/css/111.4054f41b.chunk.css",
|
||||
"./static/js/111.2d55c1b9.chunk.js": "/build/./static/js/111.2d55c1b9.chunk.js",
|
||||
"static/css/112.6cf7864c.chunk.css": "/build/static/css/112.6cf7864c.chunk.css",
|
||||
"./static/js/112.1f78fee1.chunk.js": "/build/./static/js/112.1f78fee1.chunk.js",
|
||||
"./static/js/113.e7de6572.chunk.js": "/build/./static/js/113.e7de6572.chunk.js",
|
||||
"./static/js/114.c3bfba52.chunk.js": "/build/./static/js/114.c3bfba52.chunk.js",
|
||||
"./static/js/115.3252add0.chunk.js": "/build/./static/js/115.3252add0.chunk.js",
|
||||
"static/css/116.4e686135.chunk.css": "/build/static/css/116.4e686135.chunk.css",
|
||||
"./static/js/116.e47abfb6.chunk.js": "/build/./static/js/116.e47abfb6.chunk.js",
|
||||
"./static/js/117.25f1c1b4.chunk.js": "/build/./static/js/117.25f1c1b4.chunk.js",
|
||||
"./static/js/118.503770a9.chunk.js": "/build/./static/js/118.503770a9.chunk.js",
|
||||
"static/css/119.41b8aabd.chunk.css": "/build/static/css/119.41b8aabd.chunk.css",
|
||||
"./static/js/119.69413fb9.chunk.js": "/build/./static/js/119.69413fb9.chunk.js",
|
||||
"static/css/120.b7b78777.chunk.css": "/build/static/css/120.b7b78777.chunk.css",
|
||||
"./static/js/120.1861529e.chunk.js": "/build/./static/js/120.1861529e.chunk.js",
|
||||
"static/css/121.177bb0f3.chunk.css": "/build/static/css/121.177bb0f3.chunk.css",
|
||||
"./static/js/121.f4490ade.chunk.js": "/build/./static/js/121.f4490ade.chunk.js",
|
||||
"./static/js/122.01941469.chunk.js": "/build/./static/js/122.01941469.chunk.js",
|
||||
"static/css/123.2411548c.chunk.css": "/build/static/css/123.2411548c.chunk.css",
|
||||
"./static/js/123.a2542ea9.chunk.js": "/build/./static/js/123.a2542ea9.chunk.js",
|
||||
"./static/js/124.c7a5f92c.chunk.js": "/build/./static/js/124.c7a5f92c.chunk.js",
|
||||
"./static/js/125.dccaaa6b.chunk.js": "/build/./static/js/125.dccaaa6b.chunk.js",
|
||||
"./static/js/126.44695327.chunk.js": "/build/./static/js/126.44695327.chunk.js",
|
||||
"static/css/127.54bd5dfb.chunk.css": "/build/static/css/127.54bd5dfb.chunk.css",
|
||||
"./static/js/127.6e6e726e.chunk.js": "/build/./static/js/127.6e6e726e.chunk.js",
|
||||
"static/css/128.41b8aabd.chunk.css": "/build/static/css/128.41b8aabd.chunk.css",
|
||||
"./static/js/128.ac7ce709.chunk.js": "/build/./static/js/128.ac7ce709.chunk.js",
|
||||
"static/css/129.95547330.chunk.css": "/build/static/css/129.95547330.chunk.css",
|
||||
"./static/js/129.f3d7ba5c.chunk.js": "/build/./static/js/129.f3d7ba5c.chunk.js",
|
||||
"static/css/130.41b8aabd.chunk.css": "/build/static/css/130.41b8aabd.chunk.css",
|
||||
"./static/js/130.5a946590.chunk.js": "/build/./static/js/130.5a946590.chunk.js",
|
||||
"static/css/131.41b8aabd.chunk.css": "/build/static/css/131.41b8aabd.chunk.css",
|
||||
"./static/js/131.ba4f798b.chunk.js": "/build/./static/js/131.ba4f798b.chunk.js",
|
||||
"static/css/132.ea81d4f1.chunk.css": "/build/static/css/132.ea81d4f1.chunk.css",
|
||||
"./static/js/132.6b3df827.chunk.js": "/build/./static/js/132.6b3df827.chunk.js",
|
||||
"static/css/133.56776e6e.chunk.css": "/build/static/css/133.56776e6e.chunk.css",
|
||||
"./static/js/133.a61fec97.chunk.js": "/build/./static/js/133.a61fec97.chunk.js",
|
||||
"./static/js/134.faf46f99.chunk.js": "/build/./static/js/134.faf46f99.chunk.js",
|
||||
"./static/js/135.3a42ba90.chunk.js": "/build/./static/js/135.3a42ba90.chunk.js",
|
||||
"./static/js/136.ee5c0e4b.chunk.js": "/build/./static/js/136.ee5c0e4b.chunk.js",
|
||||
"./static/js/137.ab2546f8.chunk.js": "/build/./static/js/137.ab2546f8.chunk.js",
|
||||
"./static/js/138.e4a82cf9.chunk.js": "/build/./static/js/138.e4a82cf9.chunk.js",
|
||||
"static/css/139.de5ed58f.chunk.css": "/build/static/css/139.de5ed58f.chunk.css",
|
||||
"./static/js/139.bc094754.chunk.js": "/build/./static/js/139.bc094754.chunk.js",
|
||||
"static/css/140.c041974c.chunk.css": "/build/static/css/140.c041974c.chunk.css",
|
||||
"./static/js/140.df17eb58.chunk.js": "/build/./static/js/140.df17eb58.chunk.js",
|
||||
"./static/js/141.1be727bd.chunk.js": "/build/./static/js/141.1be727bd.chunk.js",
|
||||
"./static/js/142.f3bc4dd0.chunk.js": "/build/./static/js/142.f3bc4dd0.chunk.js",
|
||||
"static/css/143.83a06073.chunk.css": "/build/static/css/143.83a06073.chunk.css",
|
||||
"./static/js/143.da8821d3.chunk.js": "/build/./static/js/143.da8821d3.chunk.js",
|
||||
"./static/js/144.9e9eff23.chunk.js": "/build/./static/js/144.9e9eff23.chunk.js",
|
||||
"./static/js/145.99cbe99b.chunk.js": "/build/./static/js/145.99cbe99b.chunk.js",
|
||||
"static/css/146.fdd673d6.chunk.css": "/build/static/css/146.fdd673d6.chunk.css",
|
||||
"./static/js/146.868a0a70.chunk.js": "/build/./static/js/146.868a0a70.chunk.js",
|
||||
"static/css/147.e59d7372.chunk.css": "/build/static/css/147.e59d7372.chunk.css",
|
||||
"./static/js/147.f0ca2a27.chunk.js": "/build/./static/js/147.f0ca2a27.chunk.js",
|
||||
"static/css/148.72319a07.chunk.css": "/build/static/css/148.72319a07.chunk.css",
|
||||
"./static/js/148.ba37e18d.chunk.js": "/build/./static/js/148.ba37e18d.chunk.js",
|
||||
"static/css/149.8841b1b9.chunk.css": "/build/static/css/149.8841b1b9.chunk.css",
|
||||
"./static/js/149.d2cbb4bd.chunk.js": "/build/./static/js/149.d2cbb4bd.chunk.js",
|
||||
"static/css/150.1b154d7a.chunk.css": "/build/static/css/150.1b154d7a.chunk.css",
|
||||
"./static/js/150.ae158621.chunk.js": "/build/./static/js/150.ae158621.chunk.js",
|
||||
"static/css/151.65678519.chunk.css": "/build/static/css/151.65678519.chunk.css",
|
||||
"./static/js/151.267f4478.chunk.js": "/build/./static/js/151.267f4478.chunk.js",
|
||||
"static/css/152.ba8f71f0.chunk.css": "/build/static/css/152.ba8f71f0.chunk.css",
|
||||
"./static/js/152.6852d544.chunk.js": "/build/./static/js/152.6852d544.chunk.js",
|
||||
"static/css/153.ba8f71f0.chunk.css": "/build/static/css/153.ba8f71f0.chunk.css",
|
||||
"./static/js/153.9840ba0c.chunk.js": "/build/./static/js/153.9840ba0c.chunk.js",
|
||||
"./static/js/154.f3ceab4a.chunk.js": "/build/./static/js/154.f3ceab4a.chunk.js",
|
||||
"static/css/155.83a06073.chunk.css": "/build/static/css/155.83a06073.chunk.css",
|
||||
"./static/js/155.9d2a74cd.chunk.js": "/build/./static/js/155.9d2a74cd.chunk.js",
|
||||
"./static/js/156.5614d6ee.chunk.js": "/build/./static/js/156.5614d6ee.chunk.js",
|
||||
"./static/js/157.1108fd3f.chunk.js": "/build/./static/js/157.1108fd3f.chunk.js",
|
||||
"static/css/158.4188cd3d.chunk.css": "/build/static/css/158.4188cd3d.chunk.css",
|
||||
"./static/js/158.95d6f950.chunk.js": "/build/./static/js/158.95d6f950.chunk.js",
|
||||
"static/css/159.c232713f.chunk.css": "/build/static/css/159.c232713f.chunk.css",
|
||||
"./static/js/159.fc4d8667.chunk.js": "/build/./static/js/159.fc4d8667.chunk.js",
|
||||
"static/css/160.1b154d7a.chunk.css": "/build/static/css/160.1b154d7a.chunk.css",
|
||||
"./static/js/160.2d1c312f.chunk.js": "/build/./static/js/160.2d1c312f.chunk.js",
|
||||
"static/css/161.b92181f7.chunk.css": "/build/static/css/161.b92181f7.chunk.css",
|
||||
"./static/js/161.9dc81fa5.chunk.js": "/build/./static/js/161.9dc81fa5.chunk.js",
|
||||
"static/css/162.1b154d7a.chunk.css": "/build/static/css/162.1b154d7a.chunk.css",
|
||||
"./static/js/162.4d1de144.chunk.js": "/build/./static/js/162.4d1de144.chunk.js",
|
||||
"static/css/163.4cedb0b7.chunk.css": "/build/static/css/163.4cedb0b7.chunk.css",
|
||||
"./static/js/163.a7178a03.chunk.js": "/build/./static/js/163.a7178a03.chunk.js",
|
||||
"./static/js/164.d8cb2a98.chunk.js": "/build/./static/js/164.d8cb2a98.chunk.js",
|
||||
"./static/js/165.aa5bdbde.chunk.js": "/build/./static/js/165.aa5bdbde.chunk.js",
|
||||
"./static/js/166.38613a2f.chunk.js": "/build/./static/js/166.38613a2f.chunk.js",
|
||||
"static/css/167.0a2b06f0.chunk.css": "/build/static/css/167.0a2b06f0.chunk.css",
|
||||
"./static/js/167.8d1fbbe0.chunk.js": "/build/./static/js/167.8d1fbbe0.chunk.js",
|
||||
"./static/js/168.f2635dbf.chunk.js": "/build/./static/js/168.f2635dbf.chunk.js",
|
||||
"./static/js/169.80945d2f.chunk.js": "/build/./static/js/169.80945d2f.chunk.js",
|
||||
"./static/js/170.3554c095.chunk.js": "/build/./static/js/170.3554c095.chunk.js",
|
||||
"static/css/171.5a0bfe2e.chunk.css": "/build/static/css/171.5a0bfe2e.chunk.css",
|
||||
"./static/js/171.8f107773.chunk.js": "/build/./static/js/171.8f107773.chunk.js",
|
||||
"static/css/172.5a0bfe2e.chunk.css": "/build/static/css/172.5a0bfe2e.chunk.css",
|
||||
"./static/js/172.da3cca4a.chunk.js": "/build/./static/js/172.da3cca4a.chunk.js",
|
||||
"static/css/173.8ddbb070.chunk.css": "/build/static/css/173.8ddbb070.chunk.css",
|
||||
"./static/js/173.4463b409.chunk.js": "/build/./static/js/173.4463b409.chunk.js",
|
||||
"static/css/174.e6754f94.chunk.css": "/build/static/css/174.e6754f94.chunk.css",
|
||||
"./static/js/174.f36c8264.chunk.js": "/build/./static/js/174.f36c8264.chunk.js",
|
||||
"static/css/175.a8369a12.chunk.css": "/build/static/css/175.a8369a12.chunk.css",
|
||||
"./static/js/175.3712bfba.chunk.js": "/build/./static/js/175.3712bfba.chunk.js",
|
||||
"static/css/176.d34dec6c.chunk.css": "/build/static/css/176.d34dec6c.chunk.css",
|
||||
"./static/js/176.6bf10460.chunk.js": "/build/./static/js/176.6bf10460.chunk.js",
|
||||
"static/css/177.53604072.chunk.css": "/build/static/css/177.53604072.chunk.css",
|
||||
"./static/js/177.3ed0cb97.chunk.js": "/build/./static/js/177.3ed0cb97.chunk.js",
|
||||
"static/css/178.c041974c.chunk.css": "/build/static/css/178.c041974c.chunk.css",
|
||||
"./static/js/178.683215f4.chunk.js": "/build/./static/js/178.683215f4.chunk.js",
|
||||
"static/css/179.c041974c.chunk.css": "/build/static/css/179.c041974c.chunk.css",
|
||||
"./static/js/179.eba55c8f.chunk.js": "/build/./static/js/179.eba55c8f.chunk.js",
|
||||
"static/css/180.e4e6348b.chunk.css": "/build/static/css/180.e4e6348b.chunk.css",
|
||||
"./static/js/180.dd74ce86.chunk.js": "/build/./static/js/180.dd74ce86.chunk.js",
|
||||
"static/css/181.0235d756.chunk.css": "/build/static/css/181.0235d756.chunk.css",
|
||||
"./static/js/181.de985d7d.chunk.js": "/build/./static/js/181.de985d7d.chunk.js",
|
||||
"static/css/182.46fb7389.chunk.css": "/build/static/css/182.46fb7389.chunk.css",
|
||||
"./static/js/182.e29fb64c.chunk.js": "/build/./static/js/182.e29fb64c.chunk.js",
|
||||
"static/css/183.ae767d6d.chunk.css": "/build/static/css/183.ae767d6d.chunk.css",
|
||||
"./static/js/183.e8d87699.chunk.js": "/build/./static/js/183.e8d87699.chunk.js",
|
||||
"./static/js/184.1093278d.chunk.js": "/build/./static/js/184.1093278d.chunk.js",
|
||||
"static/css/185.d4ed71fa.chunk.css": "/build/static/css/185.d4ed71fa.chunk.css",
|
||||
"./static/js/185.ce36a111.chunk.js": "/build/./static/js/185.ce36a111.chunk.js",
|
||||
"static/css/186.4ad9941b.chunk.css": "/build/static/css/186.4ad9941b.chunk.css",
|
||||
"./static/js/186.9076df83.chunk.js": "/build/./static/js/186.9076df83.chunk.js",
|
||||
"static/css/187.bb3f7513.chunk.css": "/build/static/css/187.bb3f7513.chunk.css",
|
||||
"./static/js/187.d4d58b02.chunk.js": "/build/./static/js/187.d4d58b02.chunk.js",
|
||||
"static/css/188.95547330.chunk.css": "/build/static/css/188.95547330.chunk.css",
|
||||
"./static/js/188.ccce7cb1.chunk.js": "/build/./static/js/188.ccce7cb1.chunk.js",
|
||||
"static/css/189.41b8aabd.chunk.css": "/build/static/css/189.41b8aabd.chunk.css",
|
||||
"./static/js/189.15b14820.chunk.js": "/build/./static/js/189.15b14820.chunk.js",
|
||||
"./static/js/190.06ee4343.chunk.js": "/build/./static/js/190.06ee4343.chunk.js",
|
||||
"./static/js/191.4a7c5dd1.chunk.js": "/build/./static/js/191.4a7c5dd1.chunk.js",
|
||||
"static/css/192.a4e6c551.chunk.css": "/build/static/css/192.a4e6c551.chunk.css",
|
||||
"./static/js/192.faad7840.chunk.js": "/build/./static/js/192.faad7840.chunk.js",
|
||||
"./static/js/193.80b4acdb.chunk.js": "/build/./static/js/193.80b4acdb.chunk.js",
|
||||
"static/css/194.87b2f83c.chunk.css": "/build/static/css/194.87b2f83c.chunk.css",
|
||||
"./static/js/194.1180e40d.chunk.js": "/build/./static/js/194.1180e40d.chunk.js",
|
||||
"static/css/195.6d12ef9c.chunk.css": "/build/static/css/195.6d12ef9c.chunk.css",
|
||||
"./static/js/195.a4f2059a.chunk.js": "/build/./static/js/195.a4f2059a.chunk.js",
|
||||
"./static/js/196.f83c2513.chunk.js": "/build/./static/js/196.f83c2513.chunk.js",
|
||||
"./static/js/197.bc4b64b0.chunk.js": "/build/./static/js/197.bc4b64b0.chunk.js",
|
||||
"./static/js/198.eb51f5f6.chunk.js": "/build/./static/js/198.eb51f5f6.chunk.js",
|
||||
"./static/js/199.34ee37ad.chunk.js": "/build/./static/js/199.34ee37ad.chunk.js",
|
||||
"./static/js/200.43bc2631.chunk.js": "/build/./static/js/200.43bc2631.chunk.js",
|
||||
"./static/js/201.e0f642c5.chunk.js": "/build/./static/js/201.e0f642c5.chunk.js",
|
||||
"./static/js/202.667a7de6.chunk.js": "/build/./static/js/202.667a7de6.chunk.js",
|
||||
"./static/js/203.b15cb798.chunk.js": "/build/./static/js/203.b15cb798.chunk.js",
|
||||
"./static/js/204.8eaa10b2.chunk.js": "/build/./static/js/204.8eaa10b2.chunk.js",
|
||||
"./static/js/205.3461238d.chunk.js": "/build/./static/js/205.3461238d.chunk.js",
|
||||
"./static/js/206.be1878e8.chunk.js": "/build/./static/js/206.be1878e8.chunk.js",
|
||||
"./static/js/207.d113dd91.chunk.js": "/build/./static/js/207.d113dd91.chunk.js",
|
||||
"./static/js/208.f1e0da34.chunk.js": "/build/./static/js/208.f1e0da34.chunk.js",
|
||||
"./static/js/209.8cb83987.chunk.js": "/build/./static/js/209.8cb83987.chunk.js",
|
||||
"./static/js/210.f84ede04.chunk.js": "/build/./static/js/210.f84ede04.chunk.js",
|
||||
"./static/js/211.2f1393c9.chunk.js": "/build/./static/js/211.2f1393c9.chunk.js",
|
||||
"./static/js/212.8bdeef11.chunk.js": "/build/./static/js/212.8bdeef11.chunk.js",
|
||||
"./static/js/213.f1622259.chunk.js": "/build/./static/js/213.f1622259.chunk.js",
|
||||
"./static/js/214.8e7dbb29.chunk.js": "/build/./static/js/214.8e7dbb29.chunk.js",
|
||||
"./static/js/215.789f7bf0.chunk.js": "/build/./static/js/215.789f7bf0.chunk.js",
|
||||
"./static/js/216.4281d5ce.chunk.js": "/build/./static/js/216.4281d5ce.chunk.js",
|
||||
"./static/js/217.ca24093e.chunk.js": "/build/./static/js/217.ca24093e.chunk.js",
|
||||
"./static/js/218.5a45951e.chunk.js": "/build/./static/js/218.5a45951e.chunk.js",
|
||||
"./static/js/219.27cc1ecb.chunk.js": "/build/./static/js/219.27cc1ecb.chunk.js",
|
||||
"./static/js/220.acb7ab55.chunk.js": "/build/./static/js/220.acb7ab55.chunk.js",
|
||||
"./static/js/221.d8294163.chunk.js": "/build/./static/js/221.d8294163.chunk.js",
|
||||
"./static/js/222.9088cfd4.chunk.js": "/build/./static/js/222.9088cfd4.chunk.js",
|
||||
"./static/js/223.ed691371.chunk.js": "/build/./static/js/223.ed691371.chunk.js",
|
||||
"./static/js/224.9f6b6a4a.chunk.js": "/build/./static/js/224.9f6b6a4a.chunk.js",
|
||||
"./static/js/225.943befca.chunk.js": "/build/./static/js/225.943befca.chunk.js",
|
||||
"./static/js/226.43408ecc.chunk.js": "/build/./static/js/226.43408ecc.chunk.js",
|
||||
"./static/js/227.2963daae.chunk.js": "/build/./static/js/227.2963daae.chunk.js",
|
||||
"./static/js/228.9738bc6d.chunk.js": "/build/./static/js/228.9738bc6d.chunk.js",
|
||||
"./static/js/229.f3398f7e.chunk.js": "/build/./static/js/229.f3398f7e.chunk.js",
|
||||
"./static/js/230.8296374b.chunk.js": "/build/./static/js/230.8296374b.chunk.js",
|
||||
"./static/js/231.a2ac319b.chunk.js": "/build/./static/js/231.a2ac319b.chunk.js",
|
||||
"./static/js/232.96480116.chunk.js": "/build/./static/js/232.96480116.chunk.js",
|
||||
"./static/js/233.e02130a2.chunk.js": "/build/./static/js/233.e02130a2.chunk.js",
|
||||
"./static/js/234.4db5c335.chunk.js": "/build/./static/js/234.4db5c335.chunk.js",
|
||||
"./static/js/235.d84f75f2.chunk.js": "/build/./static/js/235.d84f75f2.chunk.js",
|
||||
"./static/js/236.35cfb0f0.chunk.js": "/build/./static/js/236.35cfb0f0.chunk.js",
|
||||
"./static/js/237.33fdaf9a.chunk.js": "/build/./static/js/237.33fdaf9a.chunk.js",
|
||||
"./static/js/238.9ab0eae7.chunk.js": "/build/./static/js/238.9ab0eae7.chunk.js",
|
||||
"./static/js/239.8f07290e.chunk.js": "/build/./static/js/239.8f07290e.chunk.js",
|
||||
"./static/js/240.53956ffc.chunk.js": "/build/./static/js/240.53956ffc.chunk.js",
|
||||
"./static/js/241.1213bfc2.chunk.js": "/build/./static/js/241.1213bfc2.chunk.js",
|
||||
"./static/js/242.3947fffa.chunk.js": "/build/./static/js/242.3947fffa.chunk.js",
|
||||
"./static/js/243.fb9f1b03.chunk.js": "/build/./static/js/243.fb9f1b03.chunk.js",
|
||||
"./static/js/244.eac3e57c.chunk.js": "/build/./static/js/244.eac3e57c.chunk.js",
|
||||
"./static/js/245.4280d2cd.chunk.js": "/build/./static/js/245.4280d2cd.chunk.js",
|
||||
"./static/js/246.a1741b45.chunk.js": "/build/./static/js/246.a1741b45.chunk.js",
|
||||
"./static/js/247.c8b111dc.chunk.js": "/build/./static/js/247.c8b111dc.chunk.js",
|
||||
"./static/js/248.74044371.chunk.js": "/build/./static/js/248.74044371.chunk.js",
|
||||
"./static/js/249.a58b8848.chunk.js": "/build/./static/js/249.a58b8848.chunk.js",
|
||||
"./static/js/250.a9a6a15e.chunk.js": "/build/./static/js/250.a9a6a15e.chunk.js",
|
||||
"./static/js/251.a5ebfdaf.chunk.js": "/build/./static/js/251.a5ebfdaf.chunk.js",
|
||||
"./static/js/252.a423ddb9.chunk.js": "/build/./static/js/252.a423ddb9.chunk.js",
|
||||
"./static/js/253.feb737b5.chunk.js": "/build/./static/js/253.feb737b5.chunk.js",
|
||||
"./static/js/254.6596f120.chunk.js": "/build/./static/js/254.6596f120.chunk.js",
|
||||
"./static/js/255.b1c9e338.chunk.js": "/build/./static/js/255.b1c9e338.chunk.js",
|
||||
"./static/js/256.7a24c82f.chunk.js": "/build/./static/js/256.7a24c82f.chunk.js",
|
||||
"./static/js/257.8bd67482.chunk.js": "/build/./static/js/257.8bd67482.chunk.js",
|
||||
"./static/js/258.b7fc7746.chunk.js": "/build/./static/js/258.b7fc7746.chunk.js",
|
||||
"./static/js/259.fce0a7e2.chunk.js": "/build/./static/js/259.fce0a7e2.chunk.js",
|
||||
"./static/js/260.b3b15045.chunk.js": "/build/./static/js/260.b3b15045.chunk.js",
|
||||
"./static/js/261.5bf52151.chunk.js": "/build/./static/js/261.5bf52151.chunk.js",
|
||||
"./static/js/262.eb68764c.chunk.js": "/build/./static/js/262.eb68764c.chunk.js",
|
||||
"./static/js/263.87e3c9ab.chunk.js": "/build/./static/js/263.87e3c9ab.chunk.js",
|
||||
"./static/js/264.708414cd.chunk.js": "/build/./static/js/264.708414cd.chunk.js",
|
||||
"./static/js/265.c8b44404.chunk.js": "/build/./static/js/265.c8b44404.chunk.js",
|
||||
"./static/js/266.fec9786e.chunk.js": "/build/./static/js/266.fec9786e.chunk.js",
|
||||
"./static/js/267.8f65000c.chunk.js": "/build/./static/js/267.8f65000c.chunk.js",
|
||||
"./static/js/268.1623f7d1.chunk.js": "/build/./static/js/268.1623f7d1.chunk.js",
|
||||
"./static/js/269.414e56f3.chunk.js": "/build/./static/js/269.414e56f3.chunk.js",
|
||||
"./static/js/270.efe20e74.chunk.js": "/build/./static/js/270.efe20e74.chunk.js",
|
||||
"./static/js/271.3ab3a289.chunk.js": "/build/./static/js/271.3ab3a289.chunk.js",
|
||||
"./static/js/272.c0102a51.chunk.js": "/build/./static/js/272.c0102a51.chunk.js",
|
||||
"./static/js/273.31be1441.chunk.js": "/build/./static/js/273.31be1441.chunk.js",
|
||||
"./static/js/274.56798539.chunk.js": "/build/./static/js/274.56798539.chunk.js",
|
||||
"main.css": "/build/static/css/main.34f8b4f8.chunk.css",
|
||||
"main.js": "/build/./static/js/main.32a56dba.chunk.js",
|
||||
"runtime~main.js": "/build/./static/js/runtime~main.7eb5721b.js",
|
||||
"./static/js/10.99988b84.chunk.js.LICENSE.txt": "/build/./static/js/10.99988b84.chunk.js.LICENSE.txt",
|
||||
"./static/js/269.414e56f3.chunk.js.LICENSE.txt": "/build/./static/js/269.414e56f3.chunk.js.LICENSE.txt",
|
||||
"./static/js/36.b9db1aac.chunk.js.LICENSE.txt": "/build/./static/js/36.b9db1aac.chunk.js.LICENSE.txt",
|
||||
"./static/js/39.496b9c8d.chunk.js.LICENSE.txt": "/build/./static/js/39.496b9c8d.chunk.js.LICENSE.txt",
|
||||
"./static/js/93.1d6fcf7b.chunk.js.LICENSE.txt": "/build/./static/js/93.1d6fcf7b.chunk.js.LICENSE.txt",
|
||||
"./static/js/main.32a56dba.chunk.js.LICENSE.txt": "/build/./static/js/main.32a56dba.chunk.js.LICENSE.txt",
|
||||
"css.worker.js": "/build/css.worker.js",
|
||||
"editor.worker.js": "/build/editor.worker.js",
|
||||
"html.worker.js": "/build/html.worker.js",
|
||||
"index.html": "/build/index.html",
|
||||
"json.worker.js": "/build/json.worker.js",
|
||||
"static/media/Index.scss": "/build/static/media/typebg.b2b0ea32.png",
|
||||
"static/media/2-2-1.afd0f2f5.png": "/build/static/media/2-2-1.afd0f2f5.png",
|
||||
"static/media/2-2-2.26bc3301.png": "/build/static/media/2-2-2.26bc3301.png",
|
||||
"static/media/2-2-3.6d6ce99c.png": "/build/static/media/2-2-3.6d6ce99c.png",
|
||||
"static/media/2-2-head.5e69dbb2.png": "/build/static/media/2-2-head.5e69dbb2.png",
|
||||
"static/media/2-3-1.bcb33d47.png": "/build/static/media/2-3-1.bcb33d47.png",
|
||||
"static/media/2-3-2.57ef08ae.png": "/build/static/media/2-3-2.57ef08ae.png",
|
||||
"static/media/2-3-3.52733627.png": "/build/static/media/2-3-3.52733627.png",
|
||||
"static/media/2-3-4.339b2f1c.png": "/build/static/media/2-3-4.339b2f1c.png",
|
||||
"static/media/2-6-1.302b729e.png": "/build/static/media/2-6-1.302b729e.png",
|
||||
"static/media/2-6-2.b262b91e.png": "/build/static/media/2-6-2.b262b91e.png",
|
||||
"static/media/3-1.9fdda521.png": "/build/static/media/3-1.9fdda521.png",
|
||||
"static/media/3-2.47050941.png": "/build/static/media/3-2.47050941.png",
|
||||
"static/media/3-3.c767aae7.png": "/build/static/media/3-3.c767aae7.png",
|
||||
"static/media/3-4.92820cbc.png": "/build/static/media/3-4.92820cbc.png",
|
||||
"static/media/34@2x.ed8e5910.png": "/build/static/media/34@2x.ed8e5910.png",
|
||||
"static/media/35@2x.33462edc.png": "/build/static/media/35@2x.33462edc.png",
|
||||
"static/media/36@2x.8f54f5ba.png": "/build/static/media/36@2x.8f54f5ba.png",
|
||||
"static/media/37@2x.97a40a2a.png": "/build/static/media/37@2x.97a40a2a.png",
|
||||
"static/media/38@2x.f072fe68.png": "/build/static/media/38@2x.f072fe68.png",
|
||||
"static/media/39@2x.ee1af05a.png": "/build/static/media/39@2x.ee1af05a.png",
|
||||
"static/media/4-1.79fa159d.png": "/build/static/media/4-1.79fa159d.png",
|
||||
"static/media/4-2.9c066e75.png": "/build/static/media/4-2.9c066e75.png",
|
||||
"static/media/4-3.a1487a5b.png": "/build/static/media/4-3.a1487a5b.png",
|
||||
"static/media/4-4.5eb40734.png": "/build/static/media/4-4.5eb40734.png",
|
||||
"static/media/40@2x.f10a55e2.png": "/build/static/media/40@2x.f10a55e2.png",
|
||||
"static/media/42@2x.25d6b5fd.png": "/build/static/media/42@2x.25d6b5fd.png",
|
||||
"static/media/44@2x.1374baf9.png": "/build/static/media/44@2x.1374baf9.png",
|
||||
"static/media/46@2x.e272d43e.png": "/build/static/media/46@2x.e272d43e.png",
|
||||
"static/media/48@2x.3bde4de9.png": "/build/static/media/48@2x.3bde4de9.png",
|
||||
"static/media/49.b03e6efe.png": "/build/static/media/49.b03e6efe.png",
|
||||
"static/media/50@2x.69b76634.png": "/build/static/media/50@2x.69b76634.png",
|
||||
"static/media/52@2x.41805cbb.png": "/build/static/media/52@2x.41805cbb.png",
|
||||
"static/media/55@2x.83486b73.png": "/build/static/media/55@2x.83486b73.png",
|
||||
"static/media/57@2x.8dc6b0b8.png": "/build/static/media/57@2x.8dc6b0b8.png",
|
||||
"static/media/59@2x.b0884ef0.png": "/build/static/media/59@2x.b0884ef0.png",
|
||||
"static/media/61@2x.99d3cc3e.png": "/build/static/media/61@2x.99d3cc3e.png",
|
||||
"static/media/63@2x.49f389b9.png": "/build/static/media/63@2x.49f389b9.png",
|
||||
"static/media/65@2x.ef33e2f9.png": "/build/static/media/65@2x.ef33e2f9.png",
|
||||
"static/media/67@2x.4a4f4b6c.png": "/build/static/media/67@2x.4a4f4b6c.png",
|
||||
"static/media/69@2x.379c6a82.png": "/build/static/media/69@2x.379c6a82.png",
|
||||
"static/media/70.df160b27.png": "/build/static/media/70.df160b27.png",
|
||||
"static/media/BJHKHT.f065403a.png": "/build/static/media/BJHKHT.f065403a.png",
|
||||
"static/media/CEC.3b748059.png": "/build/static/media/CEC.3b748059.png",
|
||||
"static/media/GFKJ.eb30c414.png": "/build/static/media/GFKJ.eb30c414.png",
|
||||
"static/media/HSKY.2e76ba44.png": "/build/static/media/HSKY.2e76ba44.png",
|
||||
"static/media/ISCAS.851fcfda.png": "/build/static/media/ISCAS.851fcfda.png",
|
||||
"static/media/KYRJLM.2d659e5c.png": "/build/static/media/KYRJLM.2d659e5c.png",
|
||||
"static/media/katex.css": "/build/static/media/KaTeX_Typewriter-Regular.d3c8e68f.woff",
|
||||
"static/media/LC.f247fdb8.png": "/build/static/media/LC.f247fdb8.png",
|
||||
"static/media/LSLM.99387946.png": "/build/static/media/LSLM.99387946.png",
|
||||
"static/media/ML.08d278e2.png": "/build/static/media/ML.08d278e2.png",
|
||||
"static/media/NJDX.bb34b326.png": "/build/static/media/NJDX.bb34b326.png",
|
||||
"static/media/QH.b57a0131.png": "/build/static/media/QH.b57a0131.png",
|
||||
"static/media/SHJT.426bf0c7.png": "/build/static/media/SHJT.426bf0c7.png",
|
||||
"static/media/TX.b703476c.png": "/build/static/media/TX.b703476c.png",
|
||||
"static/media/WXYJY.21e40191.png": "/build/static/media/WXYJY.21e40191.png",
|
||||
"static/media/XH.a0a88f17.png": "/build/static/media/XH.a0a88f17.png",
|
||||
"static/media/XJY.b4c57bf1.png": "/build/static/media/XJY.b4c57bf1.png",
|
||||
"static/media/YKD.4f7e2766.png": "/build/static/media/YKD.4f7e2766.png",
|
||||
"static/media/ZC.ad056aa5.png": "/build/static/media/ZC.ad056aa5.png",
|
||||
"static/media/achievements.f20b7e39.png": "/build/static/media/achievements.f20b7e39.png",
|
||||
"static/media/index.scss": "/build/static/media/visionBackActive.14814f28.png",
|
||||
"static/media/back1.png": "/build/static/media/back1.1f20bd0a.png",
|
||||
"static/media/back2.png": "/build/static/media/back2.0041bb9e.png",
|
||||
"static/media/back3.png": "/build/static/media/back3.16134f64.png",
|
||||
"static/media/ball.24214b6e.png": "/build/static/media/ball.24214b6e.png",
|
||||
"static/media/banner-interim.c50ff667.png": "/build/static/media/banner-interim.c50ff667.png",
|
||||
"static/media/banner-interim1.bc583d0a.png": "/build/static/media/banner-interim1.bc583d0a.png",
|
||||
"static/media/AboutUs.scss": "/build/static/media/teambanner.fad350dd.png",
|
||||
"static/media/banner.png": "/build/static/media/banner.84187e6e.png",
|
||||
"static/media/banner.f7da2db1.png": "/build/static/media/banner.f7da2db1.png",
|
||||
"static/media/banner2024.65b24d59.jpg": "/build/static/media/banner2024.65b24d59.jpg",
|
||||
"static/media/banner_list.e02c5e16.jpg": "/build/static/media/banner_list.e02c5e16.jpg",
|
||||
"static/media/beijing.bfcd5b0e.png": "/build/static/media/beijing.bfcd5b0e.png",
|
||||
"static/media/LoginRegisterPage.scss": "/build/static/media/rightBg.55f14f0c.png",
|
||||
"static/media/bgPng.png": "/build/static/media/bgPng.ed010245.png",
|
||||
"static/media/ccf_logo.a54fdc70.png": "/build/static/media/ccf_logo.a54fdc70.png",
|
||||
"static/media/ccf_logo1.be10ead7.png": "/build/static/media/ccf_logo1.be10ead7.png",
|
||||
"static/media/codeafter.c3088c74.png": "/build/static/media/codeafter.c3088c74.png",
|
||||
"static/media/color1.png": "/build/static/media/color1.5ec57881.png",
|
||||
"static/media/color2.png": "/build/static/media/color2.a71ab734.png",
|
||||
"static/media/color3.png": "/build/static/media/color3.76d404ab.png",
|
||||
"static/media/color4.png": "/build/static/media/color4.e0954f96.png",
|
||||
"static/media/indexZone1.scss": "/build/static/media/vipTitleBg.64d456e6.png",
|
||||
"static/media/computer.4fe86b12.png": "/build/static/media/computer.4fe86b12.png",
|
||||
"static/media/devops.39983f5b.png": "/build/static/media/devops.39983f5b.png",
|
||||
"static/media/earth.050b1435.png": "/build/static/media/earth.050b1435.png",
|
||||
"static/media/educoder.png": "/build/static/media/educoder.c918f385.png",
|
||||
"static/media/emp.png": "/build/static/media/emp.35f6c709.png",
|
||||
"static/media/freeBanner.292dbf56.png": "/build/static/media/freeBanner.292dbf56.png",
|
||||
"static/media/fun1.c99ffa49.png": "/build/static/media/fun1.c99ffa49.png",
|
||||
"static/media/fun2.12f22bca.png": "/build/static/media/fun2.12f22bca.png",
|
||||
"static/media/fun3.75c280e6.png": "/build/static/media/fun3.75c280e6.png",
|
||||
"static/media/fun4.f499794e.png": "/build/static/media/fun4.f499794e.png",
|
||||
"static/media/fun5.96b44942.png": "/build/static/media/fun5.96b44942.png",
|
||||
"static/media/gitlink-gz.d351910b.png": "/build/static/media/gitlink-gz.d351910b.png",
|
||||
"static/media/gitlink-qq.90d5ac1b.png": "/build/static/media/gitlink-qq.90d5ac1b.png",
|
||||
"static/media/gitlink1.4bf0ed96.png": "/build/static/media/gitlink1.4bf0ed96.png",
|
||||
"static/media/gitlink2.0ec0ec22.png": "/build/static/media/gitlink2.0ec0ec22.png",
|
||||
"static/media/green_nodata.be7b538b.png": "/build/static/media/green_nodata.be7b538b.png",
|
||||
"static/media/head.52aa3fc8.png": "/build/static/media/head.52aa3fc8.png",
|
||||
"static/media/help.0bfb2587.png": "/build/static/media/help.0bfb2587.png",
|
||||
"static/media/help_bg.d2bb4c18.png": "/build/static/media/help_bg.d2bb4c18.png",
|
||||
"static/media/huake.63b6a34d.png": "/build/static/media/huake.63b6a34d.png",
|
||||
"static/media/huawei.73ec7c22.png": "/build/static/media/huawei.73ec7c22.png",
|
||||
"static/media/icon.1322725f.svg": "/build/static/media/icon.1322725f.svg",
|
||||
"static/media/ideLogo.svg": "/build/static/media/ideLogo.0dca8d76.svg",
|
||||
"static/media/Teaching.scss": "/build/static/media/image22.6ff2b063.svg",
|
||||
"static/media/img1.png": "/build/static/media/img1.676de78a.png",
|
||||
"static/media/img1.8560258f.png": "/build/static/media/img1.8560258f.png",
|
||||
"static/media/img1.e0beda57.png": "/build/static/media/img1.e0beda57.png",
|
||||
"static/media/img1.fc155528.png": "/build/static/media/img1.fc155528.png",
|
||||
"static/media/img10.64149a3d.png": "/build/static/media/img10.64149a3d.png",
|
||||
"static/media/img15.87a3556c.png": "/build/static/media/img15.87a3556c.png",
|
||||
"static/media/img16.32badab9.png": "/build/static/media/img16.32badab9.png",
|
||||
"static/media/img17.c25d5edc.png": "/build/static/media/img17.c25d5edc.png",
|
||||
"static/media/img18.4963efc1.png": "/build/static/media/img18.4963efc1.png",
|
||||
"static/media/img2.789fbbfe.png": "/build/static/media/img2.789fbbfe.png",
|
||||
"static/media/img2.9e713c6e.png": "/build/static/media/img2.9e713c6e.png",
|
||||
"static/media/img2.ae303051.png": "/build/static/media/img2.ae303051.png",
|
||||
"static/media/img3.cee3ac5b.png": "/build/static/media/img3.cee3ac5b.png",
|
||||
"static/media/img4.53c937cb.png": "/build/static/media/img4.53c937cb.png",
|
||||
"static/media/img5.ca3a2287.png": "/build/static/media/img5.ca3a2287.png",
|
||||
"static/media/img6.8f81bf78.png": "/build/static/media/img6.8f81bf78.png",
|
||||
"static/media/img7.e4a68e6e.png": "/build/static/media/img7.e4a68e6e.png",
|
||||
"static/media/img8.10500e00.png": "/build/static/media/img8.10500e00.png",
|
||||
"static/media/img9.d25372ba.png": "/build/static/media/img9.d25372ba.png",
|
||||
"static/media/importNone.5bada960.png": "/build/static/media/importNone.5bada960.png",
|
||||
"static/media/introduce.30b50cda.png": "/build/static/media/introduce.30b50cda.png",
|
||||
"static/media/jijinhui.041fb524.png": "/build/static/media/jijinhui.041fb524.png",
|
||||
"static/media/lightspot1.9214f0ae.png": "/build/static/media/lightspot1.9214f0ae.png",
|
||||
"static/media/lightspot2.b7053786.png": "/build/static/media/lightspot2.b7053786.png",
|
||||
"static/media/lightspot3.2f8af8da.png": "/build/static/media/lightspot3.2f8af8da.png",
|
||||
"static/media/lightspot4.93769763.png": "/build/static/media/lightspot4.93769763.png",
|
||||
"static/media/logo.png": "/build/static/media/logo.62af9fee.png",
|
||||
"static/media/logo.f0d4927b.svg": "/build/static/media/logo.f0d4927b.svg",
|
||||
"static/media/logo1.77949f0b.png": "/build/static/media/logo1.77949f0b.png",
|
||||
"static/media/logo1.ec3c2e67.png": "/build/static/media/logo1.ec3c2e67.png",
|
||||
"static/media/logo2.b04c07f2.png": "/build/static/media/logo2.b04c07f2.png",
|
||||
"static/media/mainbanner.659efd27.png": "/build/static/media/mainbanner.659efd27.png",
|
||||
"static/media/mulan.690d2289.png": "/build/static/media/mulan.690d2289.png",
|
||||
"static/media/newsBg.66918645.png": "/build/static/media/newsBg.66918645.png",
|
||||
"static/media/nodata.png": "/build/static/media/nodata.e34b5912.png",
|
||||
"static/media/TPMIndex.css": "/build/static/media/nps2.d5d0b666.png",
|
||||
"static/media/phone.14961064.svg": "/build/static/media/phone.14961064.svg",
|
||||
"static/media/qqChat.9e56cc22.png": "/build/static/media/qqChat.9e56cc22.png",
|
||||
"static/media/resultBanner2.c3095c5d.png": "/build/static/media/resultBanner2.c3095c5d.png",
|
||||
"static/media/resultBanner3.e11193de.png": "/build/static/media/resultBanner3.e11193de.png",
|
||||
"static/media/resultBanner4.6eda6ee5.png": "/build/static/media/resultBanner4.6eda6ee5.png",
|
||||
"static/media/slick-theme.css": "/build/static/media/slick.c94f7671.ttf",
|
||||
"static/media/sponsor11.5e9da48d.png": "/build/static/media/sponsor11.5e9da48d.png",
|
||||
"static/media/sponsor21.8a655acc.png": "/build/static/media/sponsor21.8a655acc.png",
|
||||
"static/media/sponsor22.96e2b643.png": "/build/static/media/sponsor22.96e2b643.png",
|
||||
"static/media/sponsor31.0fd95bcb.png": "/build/static/media/sponsor31.0fd95bcb.png",
|
||||
"static/media/sponsor33.27be3b2d.png": "/build/static/media/sponsor33.27be3b2d.png",
|
||||
"static/media/sponsor42.cac8770a.png": "/build/static/media/sponsor42.cac8770a.png",
|
||||
"static/media/sponsor43.9e4a3afb.png": "/build/static/media/sponsor43.9e4a3afb.png",
|
||||
"static/media/studentProject.f5bd2481.png": "/build/static/media/studentProject.f5bd2481.png",
|
||||
"static/media/studentProject2.78fd5476.png": "/build/static/media/studentProject2.78fd5476.png",
|
||||
"static/media/subtitle.5019e086.png": "/build/static/media/subtitle.5019e086.png",
|
||||
"static/media/teacher1.ee492a9b.png": "/build/static/media/teacher1.ee492a9b.png",
|
||||
"static/media/teacher10.9298db29.png": "/build/static/media/teacher10.9298db29.png",
|
||||
"static/media/teacher11.8a0d8669.png": "/build/static/media/teacher11.8a0d8669.png",
|
||||
"static/media/teacher12.47e02224.png": "/build/static/media/teacher12.47e02224.png",
|
||||
"static/media/teacher13.f7886e36.png": "/build/static/media/teacher13.f7886e36.png",
|
||||
"static/media/teacher14.83b48396.png": "/build/static/media/teacher14.83b48396.png",
|
||||
"static/media/teacher15.5d777604.png": "/build/static/media/teacher15.5d777604.png",
|
||||
"static/media/teacher2.b2b9919d.png": "/build/static/media/teacher2.b2b9919d.png",
|
||||
"static/media/teacher3.20cb800b.png": "/build/static/media/teacher3.20cb800b.png",
|
||||
"static/media/teacher4.c15a0bda.png": "/build/static/media/teacher4.c15a0bda.png",
|
||||
"static/media/teacher5.9397d078.png": "/build/static/media/teacher5.9397d078.png",
|
||||
"static/media/teacher6.06b6f465.png": "/build/static/media/teacher6.06b6f465.png",
|
||||
"static/media/teacher7.4102dcc1.png": "/build/static/media/teacher7.4102dcc1.png",
|
||||
"static/media/teacher8.5d3f117e.png": "/build/static/media/teacher8.5d3f117e.png",
|
||||
"static/media/teacher9.69b0adae.png": "/build/static/media/teacher9.69b0adae.png",
|
||||
"static/media/title.132e93bf.png": "/build/static/media/title.132e93bf.png",
|
||||
"static/media/vision-fw.feb9fd4c.png": "/build/static/media/vision-fw.feb9fd4c.png",
|
||||
"static/media/vision-jz.a991d471.png": "/build/static/media/vision-jz.a991d471.png",
|
||||
"static/media/vision-yj.8ca7b113.png": "/build/static/media/vision-yj.8ca7b113.png",
|
||||
"static/media/vision-zy.e4ac356e.png": "/build/static/media/vision-zy.e4ac356e.png",
|
||||
"static/media/vision0.c7dbea1d.png": "/build/static/media/vision0.c7dbea1d.png",
|
||||
"static/media/vision1.072e7be4.png": "/build/static/media/vision1.072e7be4.png",
|
||||
"static/media/vision2.024daa92.png": "/build/static/media/vision2.024daa92.png",
|
||||
"static/media/vision3.fee43e80.png": "/build/static/media/vision3.fee43e80.png",
|
||||
"static/media/xigongye.d51231d3.png": "/build/static/media/xigongye.d51231d3.png",
|
||||
"static/media/xiuos.67682257.png": "/build/static/media/xiuos.67682257.png",
|
||||
"static/media/xjy.6e62f4d6.png": "/build/static/media/xjy.6e62f4d6.png",
|
||||
"static/media/浙江大学.3c545e69.png": "/build/static/media/浙江大学.3c545e69.png",
|
||||
"ts.worker.js": "/build/ts.worker.js",
|
||||
"ts.worker.js.LICENSE.txt": "/build/ts.worker.js.LICENSE.txt"
|
||||
}
|
|
@ -0,0 +1,239 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
imagedirectupload:'本地图片',
|
||||
more: '切换到更多功能',
|
||||
less: '切换到简单功能',
|
||||
source : 'HTML代码',
|
||||
preview : '预览',
|
||||
undo : '后退(Ctrl+Z)',
|
||||
redo : '前进(Ctrl+Y)',
|
||||
cut : '剪切(Ctrl+X)',
|
||||
copy : '复制(Ctrl+C)',
|
||||
paste : '粘贴(Ctrl+V)',
|
||||
plainpaste : '粘贴为无格式文本',
|
||||
wordpaste : '从Word粘贴',
|
||||
selectall : '全选(Ctrl+A)',
|
||||
justifyleft : '左对齐',
|
||||
justifycenter : '居中',
|
||||
justifyright : '右对齐',
|
||||
justifyfull : '两端对齐',
|
||||
insertorderedlist : '编号',
|
||||
insertunorderedlist : '项目符号',
|
||||
indent : '增加缩进',
|
||||
outdent : '减少缩进',
|
||||
subscript : '下标',
|
||||
superscript : '上标',
|
||||
formatblock : '段落',
|
||||
fontname : '字体',
|
||||
fontsize : '文字大小',
|
||||
forecolor : '文字颜色',
|
||||
hilitecolor : '文字背景',
|
||||
bold : '粗体(Ctrl+B)',
|
||||
italic : '斜体(Ctrl+I)',
|
||||
underline : '下划线(Ctrl+U)',
|
||||
strikethrough : '删除线',
|
||||
removeformat : '删除格式',
|
||||
image : '图片',
|
||||
multiimage : '批量图片上传',
|
||||
flash : 'Flash',
|
||||
media : '视音频',
|
||||
table : '表格',
|
||||
tablecell : '单元格',
|
||||
hr : '插入横线',
|
||||
emoticons : '插入表情',
|
||||
link : '超级链接',
|
||||
unlink : '取消超级链接',
|
||||
fullscreen : '全屏显示',
|
||||
about : '关于',
|
||||
print : '打印(Ctrl+P)',
|
||||
filemanager : '文件空间',
|
||||
code : '插入程序代码',
|
||||
map : 'Google地图',
|
||||
baidumap : '百度地图',
|
||||
lineheight : '行距',
|
||||
clearhtml : '清理HTML代码',
|
||||
pagebreak : '插入分页符',
|
||||
quickformat : '一键排版',
|
||||
insertfile : '插入文件',
|
||||
template : '插入模板',
|
||||
anchor : '锚点',
|
||||
yes : '确定',
|
||||
no : '取消',
|
||||
close : '关闭',
|
||||
editImage : '图片属性',
|
||||
deleteImage : '删除图片',
|
||||
editFlash : 'Flash属性',
|
||||
deleteFlash : '删除Flash',
|
||||
editMedia : '视音频属性',
|
||||
deleteMedia : '删除视音频',
|
||||
editLink : '超级链接属性',
|
||||
deleteLink : '取消超级链接',
|
||||
editAnchor : '锚点属性',
|
||||
deleteAnchor : '删除锚点',
|
||||
tableprop : '表格属性',
|
||||
tablecellprop : '单元格属性',
|
||||
tableinsert : '插入表格',
|
||||
tabledelete : '删除表格',
|
||||
tablecolinsertleft : '左侧插入列',
|
||||
tablecolinsertright : '右侧插入列',
|
||||
tablerowinsertabove : '上方插入行',
|
||||
tablerowinsertbelow : '下方插入行',
|
||||
tablerowmerge : '向下合并单元格',
|
||||
tablecolmerge : '向右合并单元格',
|
||||
tablerowsplit : '拆分行',
|
||||
tablecolsplit : '拆分列',
|
||||
tablecoldelete : '删除列',
|
||||
tablerowdelete : '删除行',
|
||||
noColor : '无颜色',
|
||||
pleaseSelectFile : '请选择文件。',
|
||||
invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",
|
||||
invalidMedia : "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
|
||||
invalidWidth : "宽度必须为数字。",
|
||||
invalidHeight : "高度必须为数字。",
|
||||
invalidBorder : "边框必须为数字。",
|
||||
invalidUrl : "请输入有效的URL地址。",
|
||||
invalidRows : '行数为必选项,只允许输入大于0的数字。',
|
||||
invalidCols : '列数为必选项,只允许输入大于0的数字。',
|
||||
invalidPadding : '边距必须为数字。',
|
||||
invalidSpacing : '间距必须为数字。',
|
||||
invalidJson : '服务器发生故障。',
|
||||
uploadSuccess : '上传成功。',
|
||||
cutError : '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。',
|
||||
copyError : '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。',
|
||||
pasteError : '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。',
|
||||
ajaxLoading : '加载中,请稍候 ...',
|
||||
uploadLoading : '上传中,请稍候 ...',
|
||||
uploadError : '上传错误',
|
||||
'plainpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
|
||||
'wordpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
|
||||
'code.pleaseInput' : '请输入程序代码。',
|
||||
'link.url' : 'URL',
|
||||
'link.linkType' : '打开类型',
|
||||
'link.newWindow' : '新窗口',
|
||||
'link.selfWindow' : '当前窗口',
|
||||
'flash.url' : 'URL',
|
||||
'flash.width' : '宽度',
|
||||
'flash.height' : '高度',
|
||||
'flash.upload' : '上传',
|
||||
'flash.viewServer' : '文件空间',
|
||||
'media.url' : 'URL',
|
||||
'media.width' : '宽度',
|
||||
'media.height' : '高度',
|
||||
'media.autostart' : '自动播放',
|
||||
'media.upload' : '上传',
|
||||
'media.viewServer' : '文件空间',
|
||||
'image.remoteImage' : '网络图片',
|
||||
'image.localImage' : '本地上传',
|
||||
'image.remoteUrl' : '图片地址',
|
||||
'image.localUrl' : '上传文件',
|
||||
'image.size' : '图片大小',
|
||||
'image.width' : '宽',
|
||||
'image.height' : '高',
|
||||
'image.resetSize' : '重置大小',
|
||||
'image.align' : '对齐方式',
|
||||
'image.defaultAlign' : '默认方式',
|
||||
'image.leftAlign' : '左对齐',
|
||||
'image.rightAlign' : '右对齐',
|
||||
'image.imgTitle' : '图片说明',
|
||||
'image.upload' : '浏览...',
|
||||
'image.viewServer' : '图片空间',
|
||||
'multiimage.uploadDesc' : '允许用户同时上传<%=uploadLimit%>张图片,单张图片容量不超过<%=sizeLimit%>',
|
||||
'multiimage.startUpload' : '开始上传',
|
||||
'multiimage.clearAll' : '全部清空',
|
||||
'multiimage.insertAll' : '全部插入',
|
||||
'multiimage.queueLimitExceeded' : '文件数量超过限制。',
|
||||
'multiimage.fileExceedsSizeLimit' : '文件大小超过限制。',
|
||||
'multiimage.zeroByteFile' : '无法上传空文件。',
|
||||
'multiimage.invalidFiletype' : '文件类型不正确。',
|
||||
'multiimage.unknownError' : '发生异常,无法上传。',
|
||||
'multiimage.pending' : '等待上传',
|
||||
'multiimage.uploadError' : '上传失败',
|
||||
'filemanager.emptyFolder' : '空文件夹',
|
||||
'filemanager.moveup' : '移到上一级文件夹',
|
||||
'filemanager.viewType' : '显示方式:',
|
||||
'filemanager.viewImage' : '缩略图',
|
||||
'filemanager.listImage' : '详细信息',
|
||||
'filemanager.orderType' : '排序方式:',
|
||||
'filemanager.fileName' : '名称',
|
||||
'filemanager.fileSize' : '大小',
|
||||
'filemanager.fileType' : '类型',
|
||||
'insertfile.url' : 'URL',
|
||||
'insertfile.title' : '文件说明',
|
||||
'insertfile.upload' : '上传',
|
||||
'insertfile.viewServer' : '文件空间',
|
||||
'table.cells' : '单元格数',
|
||||
'table.rows' : '行数',
|
||||
'table.cols' : '列数',
|
||||
'table.size' : '大小',
|
||||
'table.width' : '宽度',
|
||||
'table.height' : '高度',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : '边距间距',
|
||||
'table.padding' : '边距',
|
||||
'table.spacing' : '间距',
|
||||
'table.align' : '对齐方式',
|
||||
'table.textAlign' : '水平对齐',
|
||||
'table.verticalAlign' : '垂直对齐',
|
||||
'table.alignDefault' : '默认',
|
||||
'table.alignLeft' : '左对齐',
|
||||
'table.alignCenter' : '居中',
|
||||
'table.alignRight' : '右对齐',
|
||||
'table.alignTop' : '顶部',
|
||||
'table.alignMiddle' : '中部',
|
||||
'table.alignBottom' : '底部',
|
||||
'table.alignBaseline' : '基线',
|
||||
'table.border' : '边框',
|
||||
'table.borderWidth' : '边框',
|
||||
'table.borderColor' : '颜色',
|
||||
'table.backgroundColor' : '背景颜色',
|
||||
'map.address' : '地址: ',
|
||||
'map.search' : '搜索',
|
||||
'baidumap.address' : '地址: ',
|
||||
'baidumap.search' : '搜索',
|
||||
'baidumap.insertDynamicMap' : '插入动态地图',
|
||||
'anchor.name' : '锚点名称',
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : '标题 1',
|
||||
h2 : '标题 2',
|
||||
h3 : '标题 3',
|
||||
h4 : '标题 4',
|
||||
p : '正 文'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'SimSun' : '宋体',
|
||||
'NSimSun' : '新宋体',
|
||||
'FangSong_GB2312' : '仿宋_GB2312',
|
||||
'KaiTi_GB2312' : '楷体_GB2312',
|
||||
'SimHei' : '黑体',
|
||||
'Microsoft YaHei' : '微软雅黑',
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Courier New' : 'Courier New',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : '单倍行距'},
|
||||
{'1.5' : '1.5倍行距'},
|
||||
{'2' : '2倍行距'},
|
||||
{'2.5' : '2.5倍行距'},
|
||||
{'3' : '3倍行距'}
|
||||
],
|
||||
'template.selectTemplate' : '可选模板',
|
||||
'template.replaceContent' : '替换当前内容',
|
||||
'template.fileList' : {
|
||||
'1.html' : '图片和文字',
|
||||
'2.html' : '表格',
|
||||
'3.html' : '项目编号'
|
||||
}
|
||||
}, 'zh_CN');
|
|
@ -0,0 +1,71 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.plugin('autoheight', function(K) {
|
||||
var self = this;
|
||||
//self.autoHeightMode = true;
|
||||
if (!self.autoHeightMode) {
|
||||
return;
|
||||
}
|
||||
|
||||
var minHeight;
|
||||
|
||||
function hideScroll() {
|
||||
var edit = self.edit;
|
||||
var body = edit.doc.body;
|
||||
edit.iframe[0].scroll = 'no';
|
||||
body.style.overflowY = 'hidden';
|
||||
}
|
||||
|
||||
function resetHeight() {
|
||||
var edit = self.edit;
|
||||
var body = edit.doc.body;
|
||||
edit.iframe.height(minHeight);
|
||||
|
||||
//最高418 超过用滚动条
|
||||
self.resize(null, Math.max(
|
||||
(K.IE ? body.scrollHeight : body.offsetHeight) > 385 ? 385+33 : (K.IE ? body.scrollHeight : body.offsetHeight)
|
||||
+ 33, minHeight));
|
||||
|
||||
if( self.height == "418px" ){
|
||||
edit.iframe[0].scroll = 'yes';
|
||||
body.style.overflowY = 'auto';
|
||||
}
|
||||
else{
|
||||
hideScroll();
|
||||
}
|
||||
}
|
||||
|
||||
function init() {
|
||||
minHeight = K.removeUnit(self.height);
|
||||
|
||||
self.edit.afterChange(resetHeight);
|
||||
hideScroll();
|
||||
var edit = self.edit;
|
||||
var body = edit.doc.body;
|
||||
edit.iframe.height(minHeight);
|
||||
self.resize(null, Math.max(
|
||||
((K.IE ? body.scrollHeight : body.offsetHeight) > 250 ? 250 : (K.IE ? body.scrollHeight : body.offsetHeight)) //限制初始化太高的情况
|
||||
+ 33, minHeight));
|
||||
}
|
||||
|
||||
if (self.isCreated) {
|
||||
init();
|
||||
} else {
|
||||
self.afterCreate(init);
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* 如何实现真正的自动高度?
|
||||
* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。
|
||||
* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。
|
||||
* 由此就实现了真正的自动高度
|
||||
* 测试:chrome、firefox、IE9、IE8
|
||||
* */
|
|
@ -0,0 +1,56 @@
|
|||
.ke-content {
|
||||
font-family: "微软雅黑","宋体";
|
||||
}
|
||||
.ke-content pre {
|
||||
font-size:9pt;
|
||||
font-family:Courier New,Arial;
|
||||
border:1px solid #ddd;
|
||||
border-left:5px solid #6CE26C;
|
||||
background:#f6f6f6;
|
||||
padding:5px;
|
||||
}
|
||||
|
||||
.ke-content code {
|
||||
margin: 0 2px;
|
||||
padding: 0 5px;
|
||||
white-space: nowrap;
|
||||
border: 1px solid #DDD;
|
||||
background-color: #F6F6F6;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.ke-content pre>code {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: pre;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.ke-content pre code {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.ke-content p {
|
||||
/*margin: 0 0 15px 0;*/
|
||||
/*margin-bottom:15pt;*/
|
||||
line-height:1.5;
|
||||
/*letter-spacing: 1px;*/
|
||||
}
|
||||
|
||||
.ke-content div.ref {border:1px solid #ddd;margin:0 0 10px 0;padding:2px;font-size:9pt;background:#ffe;}
|
||||
.ke-content div.ref h4 {margin:0;padding:1px 3px;background:#CC9966;color:#fff;font-size:9pt;font-weight:normal;}
|
||||
.ke-content div.ref .ref_body {margin:0;padding:2px;line-height:20px;color:#666;font-size:9pt;}
|
||||
|
||||
|
||||
.ke-content blockquote{background: none;border: none;padding: 0px;margin: 0 0 0 40px;}
|
||||
span.at {color:#269ac9;}
|
||||
span.at a{color:#269ac9;text-decoration: none;}
|
||||
|
||||
/*yk*/
|
||||
.ke-content ol li{list-style-type: decimal;}
|
||||
.ke-content ul li{list-style-type: disc;}
|
||||
.ke-content ol,.ke-content ul,.ke-content h1,.ke-content h2,.ke-content h3,.ke-content h4{margin-top:0;margin-bottom: 0;}
|
||||
.ke-content a{color: #136ec2;}
|
||||
.ke-content a:link,.ke-content a:visited{text-decoration:none;}
|
|
@ -0,0 +1,361 @@
|
|||
// Generated by CoffeeScript 1.9.0
|
||||
|
||||
/*
|
||||
paste.js is an interface to read data ( text / image ) from clipboard in different browsers. It also contains several hacks.
|
||||
https://github.com/layerssss/paste.js
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var $, Paste, createHiddenEditable, dataURLtoBlob;
|
||||
|
||||
$ = window.jQuery;
|
||||
|
||||
$.paste = function(pasteContainer) {
|
||||
var pm;
|
||||
if (typeof console !== "undefined" && console !== null) {
|
||||
console.log("DEPRECATED: This method is deprecated. Please use $.fn.pastableNonInputable() instead.");
|
||||
}
|
||||
pm = Paste.mountNonInputable(pasteContainer);
|
||||
return pm._container;
|
||||
};
|
||||
|
||||
$.fn.pastableNonInputable = function() {
|
||||
var el, _i, _len;
|
||||
for (_i = 0, _len = this.length; _i < _len; _i++) {
|
||||
el = this[_i];
|
||||
Paste.mountNonInputable(el);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
$.fn.pastableTextarea = function() {
|
||||
var el, _i, _len;
|
||||
for (_i = 0, _len = this.length; _i < _len; _i++) {
|
||||
el = this[_i];
|
||||
Paste.mountTextarea(el);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
$.fn.pastableContenteditable = function() {
|
||||
var el, _i, _len;
|
||||
for (_i = 0, _len = this.length; _i < _len; _i++) {
|
||||
el = this[_i];
|
||||
Paste.mountContenteditable(el);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
dataURLtoBlob = function(dataURL, sliceSize) {
|
||||
var b64Data, byteArray, byteArrays, byteCharacters, byteNumbers, contentType, i, m, offset, slice, _ref;
|
||||
if (sliceSize == null) {
|
||||
sliceSize = 512;
|
||||
}
|
||||
if (!(m = dataURL.match(/^data\:([^\;]+)\;base64\,(.+)$/))) {
|
||||
return null;
|
||||
}
|
||||
_ref = m, m = _ref[0], contentType = _ref[1], b64Data = _ref[2];
|
||||
byteCharacters = atob(b64Data);
|
||||
byteArrays = [];
|
||||
offset = 0;
|
||||
while (offset < byteCharacters.length) {
|
||||
slice = byteCharacters.slice(offset, offset + sliceSize);
|
||||
byteNumbers = new Array(slice.length);
|
||||
i = 0;
|
||||
while (i < slice.length) {
|
||||
byteNumbers[i] = slice.charCodeAt(i);
|
||||
i++;
|
||||
}
|
||||
byteArray = new Uint8Array(byteNumbers);
|
||||
byteArrays.push(byteArray);
|
||||
offset += sliceSize;
|
||||
}
|
||||
return new Blob(byteArrays, {
|
||||
type: contentType
|
||||
});
|
||||
};
|
||||
|
||||
createHiddenEditable = function() {
|
||||
return $(document.createElement('div')).attr('contenteditable', true).css({
|
||||
width: 1,
|
||||
height: 1,
|
||||
position: 'fixed',
|
||||
left: -100,
|
||||
overflow: 'hidden'
|
||||
});
|
||||
};
|
||||
|
||||
Paste = (function() {
|
||||
Paste.prototype._target = null;
|
||||
|
||||
Paste.prototype._container = null;
|
||||
|
||||
Paste.mountNonInputable = function(nonInputable) {
|
||||
var paste;
|
||||
paste = new Paste(createHiddenEditable().appendTo(nonInputable), nonInputable);
|
||||
$(nonInputable).on('click', (function(_this) {
|
||||
return function() {
|
||||
return paste._container.focus();
|
||||
};
|
||||
})(this));
|
||||
paste._container.on('focus', (function(_this) {
|
||||
return function() {
|
||||
return $(nonInputable).addClass('pastable-focus');
|
||||
};
|
||||
})(this));
|
||||
return paste._container.on('blur', (function(_this) {
|
||||
return function() {
|
||||
return $(nonInputable).removeClass('pastable-focus');
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
Paste.mountTextarea = function(textarea) {
|
||||
var ctlDown, paste;
|
||||
if (-1 !== navigator.userAgent.toLowerCase().indexOf('chrome')) {
|
||||
return this.mountContenteditable(textarea);
|
||||
}
|
||||
paste = new Paste(createHiddenEditable().insertBefore(textarea), textarea);
|
||||
ctlDown = false;
|
||||
$(textarea).on('keyup', function(ev) {
|
||||
var _ref;
|
||||
if ((_ref = ev.keyCode) === 17 || _ref === 224) {
|
||||
return ctlDown = false;
|
||||
}
|
||||
});
|
||||
$(textarea).on('keydown', function(ev) {
|
||||
var _ref;
|
||||
if ((_ref = ev.keyCode) === 17 || _ref === 224) {
|
||||
ctlDown = true;
|
||||
}
|
||||
if (ctlDown && ev.keyCode === 86) {
|
||||
return paste._container.focus();
|
||||
}
|
||||
});
|
||||
$(paste._target).on('pasteImage', (function(_this) {
|
||||
return function() {
|
||||
return $(textarea).focus();
|
||||
};
|
||||
})(this));
|
||||
$(paste._target).on('pasteText', (function(_this) {
|
||||
return function() {
|
||||
return $(textarea).focus();
|
||||
};
|
||||
})(this));
|
||||
$(textarea).on('focus', (function(_this) {
|
||||
return function() {
|
||||
return $(textarea).addClass('pastable-focus');
|
||||
};
|
||||
})(this));
|
||||
return $(textarea).on('blur', (function(_this) {
|
||||
return function() {
|
||||
return $(textarea).removeClass('pastable-focus');
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
Paste.mountContenteditable = function(contenteditable) {
|
||||
var paste;
|
||||
paste = new Paste(contenteditable, contenteditable);
|
||||
$(contenteditable).on('focus', (function(_this) {
|
||||
return function() {
|
||||
return $(contenteditable).addClass('pastable-focus');
|
||||
};
|
||||
})(this));
|
||||
return $(contenteditable).on('blur', (function(_this) {
|
||||
return function() {
|
||||
return $(contenteditable).removeClass('pastable-focus');
|
||||
};
|
||||
})(this));
|
||||
};
|
||||
|
||||
function Paste(_at__container, _at__target) {
|
||||
this._container = _at__container;
|
||||
this._target = _at__target;
|
||||
this._container = $(this._container);
|
||||
this._target = $(this._target).addClass('pastable');
|
||||
this._container.on('paste', (function(_this) {
|
||||
return function(ev) {
|
||||
var clipboardData, file, item, reader, text, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3, _results;
|
||||
if (((_ref = ev.originalEvent) != null ? _ref.clipboardData : void 0) != null) {
|
||||
clipboardData = ev.originalEvent.clipboardData;
|
||||
if (clipboardData.items) {
|
||||
_ref1 = clipboardData.items;
|
||||
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
||||
item = _ref1[_i];
|
||||
if (item.type.match(/^image\//)) {
|
||||
reader = new FileReader();
|
||||
reader.onload = function(event) {
|
||||
return _this._handleImage(event.target.result);
|
||||
};
|
||||
reader.readAsDataURL(item.getAsFile());
|
||||
}
|
||||
if (item.type === 'text/plain') {
|
||||
item.getAsString(function(string) {
|
||||
return _this._target.trigger('pasteText', {
|
||||
text: string
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (-1 !== Array.prototype.indexOf.call(clipboardData.types, 'text/plain')) {
|
||||
text = clipboardData.getData('Text');
|
||||
_this._target.trigger('pasteText', {
|
||||
text: text
|
||||
});
|
||||
}
|
||||
_this._checkImagesInContainer(function(src) {
|
||||
return _this._handleImage(src);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (clipboardData = window.clipboardData) {
|
||||
if ((_ref2 = (text = clipboardData.getData('Text'))) != null ? _ref2.length : void 0) {
|
||||
return _this._target.trigger('pasteText', {
|
||||
text: text
|
||||
});
|
||||
} else {
|
||||
_ref3 = clipboardData.files;
|
||||
_results = [];
|
||||
for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {
|
||||
file = _ref3[_j];
|
||||
_this._handleImage(URL.createObjectURL(file));
|
||||
_results.push(_this._checkImagesInContainer(function() {}));
|
||||
}
|
||||
return _results;
|
||||
}
|
||||
}
|
||||
};
|
||||
})(this));
|
||||
}
|
||||
|
||||
Paste.prototype._handleImage = function(src) {
|
||||
var loader;
|
||||
loader = new Image();
|
||||
loader.onload = (function(_this) {
|
||||
return function() {
|
||||
var blob, canvas, ctx, dataURL;
|
||||
canvas = document.createElement('canvas');
|
||||
canvas.width = loader.width;
|
||||
canvas.height = loader.height;
|
||||
ctx = canvas.getContext('2d');
|
||||
ctx.drawImage(loader, 0, 0, canvas.width, canvas.height);
|
||||
dataURL = null;
|
||||
try {
|
||||
dataURL = canvas.toDataURL('image/png');
|
||||
blob = dataURLtoBlob(dataURL);
|
||||
} catch (_error) {}
|
||||
if (dataURL) {
|
||||
return _this._target.trigger('pasteImage', {
|
||||
blob: blob,
|
||||
dataURL: dataURL,
|
||||
width: loader.width,
|
||||
height: loader.height
|
||||
});
|
||||
}
|
||||
};
|
||||
})(this);
|
||||
return loader.src = src;
|
||||
};
|
||||
|
||||
Paste.prototype._checkImagesInContainer = function(cb) {
|
||||
var img, timespan, _i, _len, _ref;
|
||||
timespan = Math.floor(1000 * Math.random());
|
||||
_ref = this._container.find('img');
|
||||
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||
img = _ref[_i];
|
||||
img["_paste_marked_" + timespan] = true;
|
||||
}
|
||||
return setTimeout((function(_this) {
|
||||
return function() {
|
||||
var _j, _len1, _ref1, _results;
|
||||
_ref1 = _this._container.find('img');
|
||||
_results = [];
|
||||
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
||||
img = _ref1[_j];
|
||||
if (!img["_paste_marked_" + timespan]) {
|
||||
cb(img.src);
|
||||
}
|
||||
//firefox问题处理,因为采用了 pastableContenteditable 模式,故只需要删除默认的粘贴
|
||||
if ($(img).attr('src').startsWith('data:image/')) {
|
||||
_results.push($(img).remove());
|
||||
};
|
||||
}
|
||||
return _results;
|
||||
};
|
||||
})(this), 1);
|
||||
};
|
||||
|
||||
return Paste;
|
||||
|
||||
})();
|
||||
|
||||
}).call(this);
|
||||
|
||||
KindEditor.plugin('paste', function(K) {
|
||||
var editor = this,
|
||||
name = 'paste';
|
||||
if(editor.edit == undefined || editor.edit.iframe == undefined){
|
||||
return;
|
||||
}
|
||||
var contentWindow = editor.edit.iframe[0].contentWindow;
|
||||
//var contentWindow = editor.iframeDoc;
|
||||
//var contentWindow = document.getElementsByTagName('iframe')[0].contentWindow;
|
||||
var nodeBody = contentWindow.document.getElementsByTagName('body')[0];
|
||||
console.log(nodeBody);
|
||||
$(nodeBody).pastableContenteditable();
|
||||
|
||||
dataURItoBlob = function(dataURI) {
|
||||
// convert base64/URLEncoded data component to raw binary data held in a string
|
||||
var byteString;
|
||||
if (dataURI.split(',')[0].indexOf('base64') >= 0)
|
||||
byteString = atob(dataURI.split(',')[1]);
|
||||
else
|
||||
byteString = unescape(dataURI.split(',')[1]);
|
||||
|
||||
// separate out the mime component
|
||||
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
|
||||
|
||||
// write the bytes of the string to a typed array
|
||||
var ia = new Uint8Array(byteString.length);
|
||||
for (var i = 0; i < byteString.length; i++) {
|
||||
ia[i] = byteString.charCodeAt(i);
|
||||
}
|
||||
|
||||
return new Blob([ia], {type:mimeString});
|
||||
};
|
||||
|
||||
$(nodeBody).on('pasteImage', function(ev, data) {
|
||||
console.log('pasteImage');
|
||||
console.log("dataURL: " + data.dataURL);
|
||||
console.log("width: " + data.width);
|
||||
console.log("height: " + data.height);
|
||||
var blob = dataURItoBlob(data.dataURL);
|
||||
if (data.blob !== null) {
|
||||
var data = new FormData();
|
||||
// data.append("imgFile",blob, "imageFilename.png");
|
||||
data.append("file",blob, "imageFilename.png");
|
||||
console.log(data);
|
||||
$.ajax({
|
||||
url: '/kindeditor/upload?dir=image',
|
||||
url: '/api/attachments.json',
|
||||
contentType: false,
|
||||
type: 'POST',
|
||||
data: data,
|
||||
processData: false,
|
||||
success: function(data) {
|
||||
console.log(data);
|
||||
// editor.exec('insertimage', JSON.parse(data).url);
|
||||
|
||||
// /api/attachments/227362
|
||||
editor.exec('insertimage', '/api/attachments/' + data.id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
return;
|
||||
|
||||
});
|
||||
|
|
@ -0,0 +1,539 @@
|
|||
/* Logo 字体 */
|
||||
@font-face {
|
||||
font-family: "iconfont logo";
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-family: "iconfont logo";
|
||||
font-size: 160px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
/* tabs */
|
||||
.nav-tabs {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-more {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
#tabs {
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
#tabs li {
|
||||
cursor: pointer;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
border-bottom: 2px solid transparent;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
margin-bottom: -1px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
|
||||
#tabs .active {
|
||||
border-bottom-color: #f00;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.tab-container .content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* 页面布局 */
|
||||
.main {
|
||||
padding: 30px 100px;
|
||||
width: 960px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.main .logo {
|
||||
color: #333;
|
||||
text-align: left;
|
||||
margin-bottom: 30px;
|
||||
line-height: 1;
|
||||
height: 110px;
|
||||
margin-top: -50px;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.main .logo a {
|
||||
font-size: 160px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.helps {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.helps pre {
|
||||
padding: 20px;
|
||||
margin: 10px 0;
|
||||
border: solid 1px #e7e1cd;
|
||||
background-color: #fffdef;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.icon_lists {
|
||||
width: 100% !important;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.icon_lists li {
|
||||
width: 100px;
|
||||
margin-bottom: 10px;
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
list-style: none !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.icon_lists li .code-name {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.icon_lists .icon {
|
||||
display: block;
|
||||
height: 100px;
|
||||
line-height: 100px;
|
||||
font-size: 42px;
|
||||
margin: 10px auto;
|
||||
color: #333;
|
||||
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
-moz-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
transition: font-size 0.25s linear, width 0.25s linear;
|
||||
}
|
||||
|
||||
.icon_lists .icon:hover {
|
||||
font-size: 100px;
|
||||
}
|
||||
|
||||
.icon_lists .svg-icon {
|
||||
/* 通过设置 font-size 来改变图标大小 */
|
||||
width: 1em;
|
||||
/* 图标和文字相邻时,垂直对齐 */
|
||||
vertical-align: -0.15em;
|
||||
/* 通过设置 color 来改变 SVG 的颜色/fill */
|
||||
fill: currentColor;
|
||||
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
|
||||
normalize.css 中也包含这行 */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.icon_lists li .name,
|
||||
.icon_lists li .code-name {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* markdown 样式 */
|
||||
.markdown {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.markdown img {
|
||||
vertical-align: middle;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
color: #404040;
|
||||
font-weight: 500;
|
||||
line-height: 40px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown h2,
|
||||
.markdown h3,
|
||||
.markdown h4,
|
||||
.markdown h5,
|
||||
.markdown h6 {
|
||||
color: #404040;
|
||||
margin: 1.6em 0 0.6em 0;
|
||||
font-weight: 500;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.markdown h2 {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.markdown h3 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.markdown h4 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.markdown h5 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown h6 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown hr {
|
||||
height: 1px;
|
||||
border: 0;
|
||||
background: #e9e9e9;
|
||||
margin: 16px 0;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown>p,
|
||||
.markdown>blockquote,
|
||||
.markdown>.highlight,
|
||||
.markdown>ol,
|
||||
.markdown>ul {
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.markdown ul>li {
|
||||
list-style: circle;
|
||||
}
|
||||
|
||||
.markdown>ul li,
|
||||
.markdown blockquote ul>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown>ul li p,
|
||||
.markdown>ol li p {
|
||||
margin: 0.6em 0;
|
||||
}
|
||||
|
||||
.markdown ol>li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.markdown>ol li,
|
||||
.markdown blockquote ol>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown code {
|
||||
margin: 0 3px;
|
||||
padding: 0 5px;
|
||||
background: #eee;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown strong,
|
||||
.markdown b {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0px;
|
||||
empty-cells: show;
|
||||
border: 1px solid #e9e9e9;
|
||||
width: 95%;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
white-space: nowrap;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table th,
|
||||
.markdown>table td {
|
||||
border: 1px solid #e9e9e9;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
background: #F7F7F7;
|
||||
}
|
||||
|
||||
.markdown blockquote {
|
||||
font-size: 90%;
|
||||
color: #999;
|
||||
border-left: 4px solid #e9e9e9;
|
||||
padding-left: 0.8em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown blockquote p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.markdown .anchor {
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.markdown .waiting {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.markdown h1:hover .anchor,
|
||||
.markdown h2:hover .anchor,
|
||||
.markdown h3:hover .anchor,
|
||||
.markdown h4:hover .anchor,
|
||||
.markdown h5:hover .anchor,
|
||||
.markdown h6:hover .anchor {
|
||||
opacity: 1;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.markdown>br,
|
||||
.markdown>p>br {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
background: white;
|
||||
padding: 0.5em;
|
||||
color: #333333;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-meta {
|
||||
color: #969896;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-strong,
|
||||
.hljs-emphasis,
|
||||
.hljs-quote {
|
||||
color: #df5000;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-type {
|
||||
color: #a71d5d;
|
||||
}
|
||||
|
||||
.hljs-literal,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-attribute {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-name {
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.hljs-tag {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-attr,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo {
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
color: #55a532;
|
||||
background-color: #eaffea;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
color: #bd2c00;
|
||||
background-color: #ffecec;
|
||||
}
|
||||
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* 代码高亮 */
|
||||
/* PrismJS 1.15.0
|
||||
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
|
||||
/**
|
||||
* prism.js default theme for JavaScript, CSS and HTML
|
||||
* Based on dabblet (http://dabblet.com)
|
||||
* @author Lea Verou
|
||||
*/
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: black;
|
||||
background: none;
|
||||
text-shadow: 0 1px white;
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::-moz-selection,
|
||||
pre[class*="language-"] ::-moz-selection,
|
||||
code[class*="language-"]::-moz-selection,
|
||||
code[class*="language-"] ::-moz-selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection,
|
||||
pre[class*="language-"] ::selection,
|
||||
code[class*="language-"]::selection,
|
||||
code[class*="language-"] ::selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"] {
|
||||
padding: 1em;
|
||||
margin: .5em 0;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
:not(pre)>code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
background: #f5f2f0;
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
:not(pre)>code[class*="language-"] {
|
||||
padding: .1em;
|
||||
border-radius: .3em;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: slategray;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #905;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #690;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #9a6e3a;
|
||||
background: hsla(0, 0%, 100%, .5);
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.keyword {
|
||||
color: #07a;
|
||||
}
|
||||
|
||||
.token.function,
|
||||
.token.class-name {
|
||||
color: #DD4A68;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important,
|
||||
.token.variable {
|
||||
color: #e90;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
13
css/font.css
|
@ -1,13 +0,0 @@
|
|||
@font-face {
|
||||
font-family: Alimama ShuHeiTi;
|
||||
src: url(../font/AlimamaShuHeiTi-Bold.ttf);
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Alibaba PuHuiTi;
|
||||
src: url(../font/ALIBABA-PUHUITI-MEDIUM.TTF);
|
||||
}
|
||||
@font-face {
|
||||
font-family: YouSheBiaoTiHei;
|
||||
src: url(../font/YouSheBiaoTiHei-2.ttf);
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
@import url(./reset.css);
|
||||
@import url(./font.css);
|
||||
|
||||
.task-hide {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.task-hide-2 {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
}
|
||||
|
||||
.task-hide-6 {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 12;
|
||||
}
|
||||
.ant-spin-spinning {
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.markdown-body {
|
||||
box-sizing: border-box;
|
||||
min-width: 200px;
|
||||
margin: 0 auto;
|
||||
background-color: #F8F9FF;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.markdown-body {
|
||||
padding: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.empty {
|
||||
width: 276px;
|
||||
height: 276px;
|
||||
display: block;
|
||||
margin: auto;
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
|
||||
.CodeMirror-merge {
|
||||
position: relative;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.CodeMirror-merge, .CodeMirror-merge .CodeMirror {
|
||||
min-height:50px;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 48%; }
|
||||
.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 4%; }
|
||||
.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }
|
||||
.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }
|
||||
|
||||
.CodeMirror-merge-pane {
|
||||
display: inline-block;
|
||||
white-space: normal;
|
||||
vertical-align: top;
|
||||
}
|
||||
.CodeMirror-merge-pane-rightmost {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-gap {
|
||||
z-index: 2;
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
background: #515151;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-scrolllock-wrap {
|
||||
position: absolute;
|
||||
bottom: 0; left: 50%;
|
||||
}
|
||||
.CodeMirror-merge-scrolllock {
|
||||
position: relative;
|
||||
left: -50%;
|
||||
cursor: pointer;
|
||||
color: #d8d8d8;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {
|
||||
position: absolute;
|
||||
left: 0; top: 0;
|
||||
right: 0; bottom: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copy {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
color: #ce374b;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copy-reverse {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
color: #44c;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
|
||||
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }
|
||||
|
||||
.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);
|
||||
background-position: bottom left;
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);
|
||||
background-position: bottom left;
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-r-chunk { background: #9a6868; }
|
||||
.CodeMirror-merge-r-chunk-start { /*border-top: 1px solid #ee8; */}
|
||||
.CodeMirror-merge-r-chunk-end {/* border-bottom: 1px solid #ee8; */}
|
||||
.CodeMirror-merge-r-connect { fill:#9a6868;}
|
||||
|
||||
.CodeMirror-merge-l-chunk { background: #eef; }
|
||||
.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }
|
||||
.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }
|
||||
.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }
|
||||
|
||||
.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }
|
||||
.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }
|
||||
.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }
|
||||
|
||||
.CodeMirror-merge-collapsed-widget:before {
|
||||
content: "(...)";
|
||||
}
|
||||
.CodeMirror-merge-collapsed-widget {
|
||||
cursor: pointer;
|
||||
color: #88b;
|
||||
background: #eef;
|
||||
border: 1px solid #ddf;
|
||||
font-size: 90%;
|
||||
padding: 0 3px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; }
|
|
@ -1,64 +0,0 @@
|
|||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||
article, aside, canvas, details, embed,
|
||||
figure, figcaption, footer, header, hgroup,
|
||||
menu, nav, output, ruby, section, summary,
|
||||
time, mark, audio, video {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-size: 100%;
|
||||
font: inherit;
|
||||
vertical-align: baseline;
|
||||
text-decoration: none;
|
||||
}
|
||||
/* HTML5 display-role reset for older browsers */
|
||||
article, aside, details, figcaption, figure,
|
||||
footer, header, hgroup, menu, nav, section {
|
||||
display: block;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote, q {
|
||||
quotes: none;
|
||||
}
|
||||
blockquote:before, blockquote:after,
|
||||
q:before, q:after {
|
||||
content: '';
|
||||
content: none;
|
||||
}
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
a {
|
||||
color: unset;
|
||||
}
|
||||
|
||||
|
||||
/*清除浮动*/
|
||||
.clearfix:before,
|
||||
.clearfix:after{
|
||||
content:"";
|
||||
display:block;
|
||||
visibility:hidden;
|
||||
clear:both;
|
||||
}
|
||||
|
||||
/*容器*/
|
||||
.container {
|
||||
margin: 10px auto 0px;
|
||||
width: 95%;
|
||||
}
|
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 9.4 KiB |
BIN
favicon.png
Before Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 434 KiB |
BIN
image/arraw.png
Before Width: | Height: | Size: 1.1 KiB |
BIN
image/beian.png
Before Width: | Height: | Size: 19 KiB |
BIN
image/empty.png
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 157 KiB |
Before Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 236 KiB |
Before Width: | Height: | Size: 1.6 MiB |
Before Width: | Height: | Size: 412 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 11 MiB |
Before Width: | Height: | Size: 1.8 MiB |
Before Width: | Height: | Size: 319 KiB |
Before Width: | Height: | Size: 147 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 344 B |
Before Width: | Height: | Size: 895 B |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 139 KiB |
Before Width: | Height: | Size: 365 KiB |
Before Width: | Height: | Size: 189 KiB |
BIN
image/qr-bg.png
Before Width: | Height: | Size: 4.9 KiB |
BIN
image/views.png
Before Width: | Height: | Size: 398 B |
BIN
image/w_qr.png
Before Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 154 KiB |
12
index.html
|
@ -1,11 +1 @@
|
|||
<!DOCTYPE html><html><head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<meta name="viewport" content="">
|
||||
<link rel="shortcut icon" href="/favicon.png">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script src="/umi.7d2ecdc7.js"></script>
|
||||
|
||||
</body></html>
|
||||
<!doctype html><html lang="zh-hans-CN" class="notranslate translated-ltr" translate="no"><head><title>GitLink | 新一代开源创新服务平台</title><meta charset="utf-8"><meta name="Keywords" content="GitLink, git, 开源, 代码托管, 项目管理, 版本控制, 代码分享, 项目协作, 协同开发平台"><meta name="description" content="GitLink 是一个新一代的开源创新服务平台,提供分布式协作开发、流水线运维、代码分析等功能,基于 Git 打造分布式代码托管环境。"><meta property="og:title" content="GitLink | 确实开源"/><meta property="og:type" content="website"/><meta property="og:url" content="https://gitlink.org.cn/"/><meta property="og:image" content="https://www.gitlink.org.cn/images/logo.png"/><meta property="og:image:alt" content="GitLink | 确实开源"/><meta property="og:site_name" content="GitLink"/><meta property="og:description" content="GitLink 是一个新一代的开源创新服务平台,提供分布式协作开发、流水线运维、代码分析等功能,基于 Git 打造分布式代码托管环境。"/><meta name="hostname" content="gitlink.org.cn"><meta name="keyboard-shortcuts-preference" content="all"><meta name="expected-hostname" content="gitlink.org.cn"><meta name="go-import" content="gitlink.org.cn git https://gitlink.org.cn"><meta name="octolytics-dimension-user_login" content="GitLink"><meta name="octolytics-dimension-repository_nwo" content="GitLink"><meta name="octolytics-dimension-repository_network_root_nwo" content="GitLink"><meta name="theme-color" content="#000000"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="referrer" content="always"><meta name="google-site-verification" content="rGWc47_e6dmJlLtT6ngl3WSiXMsY8FCcll2dbdlNHm0"/><meta name="viewport" content=""><link rel="canonical" href="https://gitlink.org.cn" data-turbo-transient=""><link rel="fluid-icon" href="https://www.gitlink.org.cn/images/logo.png" title="GitLink"><link rel="manifest" href="/build//manifest.json"><link rel="stylesheet" href="/build/css/alex/alex.all.global.min.css"><link rel="stylesheet" href="/build/css/iconfont.css"><link rel="stylesheet" href="/build/css/editormd.min.css"><link rel="stylesheet" href="/build/css/gitlink.min.css"><link href="/build/static/css/main.34f8b4f8.chunk.css" rel="stylesheet"></head><body><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit widthunit"></div><div id="picture_display" style="display:none"></div><script src="https://gw.alipayobjects.com/os/lib/react/16.14.0/umd/react.production.min.js"></script><script src="https://gw.alipayobjects.com/os/lib/react-dom/16.14.0/umd/react-dom.production.min.js"></script><script src="/build/js/jquery-1.8.3.min.js"></script><script src="/build/js/js_min_all.js"></script><script src="/build/js/codemirror/codemirror.js"></script><script src="/build/js/editormd/editormd.min.js"></script><script src="/build/js/codemirror/merge/merge.js"></script><script src="/build/js/alex/moment.js"></script><script src="https://gw.alipayobjects.com/os/lib/alipay/alex/2.0.19/bundle/alex.all.global.min.js"></script><script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script><script src="/build/./static/js/runtime~main.7eb5721b.js"></script><script src="/build/./static/js/main.32a56dba.chunk.js"></script><script>var _hmt=_hmt||[];!function(){var t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?7e2def1fe918f15f9f1c5c061f69b256";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)}(),window.onload=function(){$(".newContainer").delegate("a.anchors","click",(function(){let t=$(this).offset().top-180;return $("html,body").animate({scrollTop:t},10),window.location.hash=$(this).attr("name"),!1}))}</script></body></html>
|
|
@ -0,0 +1,113 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<!-- <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="theme-color" content="#000000">
|
||||
<!--
|
||||
manifest.json provides metadata used when your web app is added to the
|
||||
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
|
||||
-->
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
|
||||
<!-- <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">-->
|
||||
<!--
|
||||
Notice the use of %PUBLIC_URL% in the tags above.
|
||||
It will be replaced with the URL of the `public` folder during the build.
|
||||
Only files inside the `public` folder can be referenced from the HTML.
|
||||
|
||||
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
||||
work correctly both with client-side routing and a non-root public URL.
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<!-- <title>Educoder</title>-->
|
||||
<!--react-ssr-head-->
|
||||
<script type="text/javascript">
|
||||
window.__isR = true;
|
||||
</script>
|
||||
|
||||
|
||||
<!-- <link rel="stylesheet" type="text/css" href="/css/edu-common.css">
|
||||
<link rel="stylesheet" type="text/css" href="/css/edu-public.css">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/taskstyle.css">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/font-awesome.css">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/editormd.min.css">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/merge.css"> -->
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/css_min_all.css">
|
||||
|
||||
<link href="/stylesheets/educoder/edu-all.css" rel="stylesheet" type="text/css">
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/font_653600_qa9lwwv74z.css">
|
||||
|
||||
|
||||
<!-- <link rel="stylesheet" type="text/css" href="https://www.educoder.net/stylesheets/css/font-awesome.css?1510652321"> -->
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
You need to enable JavaScript to run this app.
|
||||
</noscript>
|
||||
<!--用于markdown转html -->
|
||||
<div id="md_div" style="display: none;"></div>
|
||||
<div id="root" class="page -layout-v -fit">
|
||||
</div>
|
||||
<div id="picture_display" style="display: none;"></div>
|
||||
<!--
|
||||
This HTML file is a template.
|
||||
If you open it directly in the browser, you will see an empty page.
|
||||
|
||||
You can add webfonts, meta tags, or analytics to this file.
|
||||
The build step will place the bundled scripts into the <body> tag.
|
||||
|
||||
To begin the development, run `npm start` or `yarn start`.
|
||||
To create a production bundle, use `npm run build` or `yarn build`.
|
||||
-->
|
||||
|
||||
<!-- js css合并 文件优先级的问题 -->
|
||||
|
||||
<!---->
|
||||
<script type="text/javascript" src="/js/jquery-1.8.3.min.js"></script>
|
||||
|
||||
|
||||
<script type="text/javascript" src="/js/editormd/lib/underscore.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/js/editormd/lib/marked.min.js"></script>
|
||||
<script type="text/javascript" src="/js/editormd/lib/prettify.min.js"></script>
|
||||
<script type="text/javascript" src="/js/editormd/lib/raphael.min.js"></script>
|
||||
<script type="text/javascript" src="/js/editormd/sequence-diagram.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/js/editormd/flowchart.min.js"></script>
|
||||
<script type="text/javascript" src="/js/editormd/jquery.flowchart.min.js"></script>
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript" src="/js/editormd/editormd.min.js"></script>
|
||||
|
||||
<!-- codemirror addon -->
|
||||
<script type="text/javascript" src="/js/codemirror/codemirror.js"></script>
|
||||
|
||||
<!--hint-->
|
||||
<script type="text/javascript" src="/js/codemirror/lib/fuzzysort.js"></script>
|
||||
<script type="text/javascript" src="/js/codemirror/addon/hint/show-hint.js"></script>
|
||||
<!-- <script type="text/javascript" src="/js/codemirror/addon/hint/javascript-hint.js"></script> -->
|
||||
<script type="text/javascript" src="/js/codemirror/addon/hint/anyword-hint.js"></script>
|
||||
<script type="text/javascript" src="/js/codemirror/mode/javascript.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/js/diff_match_patch.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/js/merge.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/js/edu_tpi.js"></script>
|
||||
<script type="text/javascript" src="http://localhost:3000/javascripts/application.js"></script>
|
||||
|
||||
<script type="text/javascript" src="http://localhost:3000/assets/kindeditor/kindeditor.js"></script>
|
||||
|
||||
<!-- // <script type="text/javascript" src="http://localhost:3000/javascripts/create_kindeditor.js"></script> -->
|
||||
<script type="text/javascript" src="/js/create_kindeditor.js"></script>
|
||||
<script type="text/javascript" src="http://localhost:3000/javascripts/educoder/edu_application.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,70 @@
|
|||
|
||||
(function(mod) {
|
||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||
mod(require("../../lib/codemirror"));
|
||||
else if (typeof define == "function" && define.amd) // AMD
|
||||
define(["../../lib/codemirror"], mod);
|
||||
else // Plain browser env
|
||||
mod(CodeMirror);
|
||||
})(function(CodeMirror) {
|
||||
"use strict";
|
||||
var WRAP_CLASS = "CodeMirror-activeline";
|
||||
var BACK_CLASS = "CodeMirror-activeline-background";
|
||||
var GUTT_CLASS = "CodeMirror-activeline-gutter";
|
||||
|
||||
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
|
||||
var prev = old == CodeMirror.Init ? false : old;
|
||||
if (val == prev) return
|
||||
if (prev) {
|
||||
cm.off("beforeSelectionChange", selectionChange);
|
||||
clearActiveLines(cm);
|
||||
delete cm.state.activeLines;
|
||||
}
|
||||
if (val) {
|
||||
cm.state.activeLines = [];
|
||||
updateActiveLines(cm, cm.listSelections());
|
||||
cm.on("beforeSelectionChange", selectionChange);
|
||||
}
|
||||
});
|
||||
|
||||
function clearActiveLines(cm) {
|
||||
for (var i = 0; i < cm.state.activeLines.length; i++) {
|
||||
cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
|
||||
cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
|
||||
cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
|
||||
}
|
||||
}
|
||||
|
||||
function sameArray(a, b) {
|
||||
if (a.length != b.length) return false;
|
||||
for (var i = 0; i < a.length; i++)
|
||||
if (a[i] != b[i]) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function updateActiveLines(cm, ranges) {
|
||||
var active = [];
|
||||
for (var i = 0; i < ranges.length; i++) {
|
||||
var range = ranges[i];
|
||||
var option = cm.getOption("styleActiveLine");
|
||||
if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())
|
||||
continue
|
||||
var line = cm.getLineHandleVisualStart(range.head.line);
|
||||
if (active[active.length - 1] != line) active.push(line);
|
||||
}
|
||||
if (sameArray(cm.state.activeLines, active)) return;
|
||||
cm.operation(function() {
|
||||
clearActiveLines(cm);
|
||||
for (var i = 0; i < active.length; i++) {
|
||||
cm.addLineClass(active[i], "wrap", WRAP_CLASS);
|
||||
cm.addLineClass(active[i], "background", BACK_CLASS);
|
||||
cm.addLineClass(active[i], "gutter", GUTT_CLASS);
|
||||
}
|
||||
cm.state.activeLines = active;
|
||||
});
|
||||
}
|
||||
|
||||
function selectionChange(cm, sel) {
|
||||
updateActiveLines(cm, sel.ranges);
|
||||
}
|
||||
});
|
|
@ -0,0 +1,43 @@
|
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||
|
||||
(function(mod) {
|
||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||
mod(require("../../lib/codemirror"));
|
||||
else if (typeof define == "function" && define.amd) // AMD
|
||||
define(["../../lib/codemirror"], mod);
|
||||
else // Plain browser env
|
||||
mod(CodeMirror);
|
||||
})(function(CodeMirror) {
|
||||
"use strict";
|
||||
|
||||
// var WORD = /[\w$]+/
|
||||
var WORD = /[A-z]+/
|
||||
, RANGE = 500;
|
||||
|
||||
CodeMirror.registerHelper("hint", "anyword", function(editor, options) {
|
||||
var word = options && options.word || WORD;
|
||||
var range = options && options.range || RANGE;
|
||||
var cur = editor.getCursor(), curLine = editor.getLine(cur.line);
|
||||
var end = cur.ch, start = end;
|
||||
while (start && word.test(curLine.charAt(start - 1))) --start;
|
||||
var curWord = start != end && curLine.slice(start, end);
|
||||
|
||||
var list = options && options.list || [], seen = {};
|
||||
var re = new RegExp(word.source, "g");
|
||||
for (var dir = -1; dir <= 1; dir += 2) {
|
||||
var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;
|
||||
for (; line != endLine; line += dir) {
|
||||
var text = editor.getLine(line), m;
|
||||
while (m = re.exec(text)) {
|
||||
if (line == cur.line && m[0] === curWord) continue;
|
||||
if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {
|
||||
seen[m[0]] = true;
|
||||
list.push(m[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};
|
||||
});
|
||||
});
|
|
@ -0,0 +1,188 @@
|
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||
|
||||
(function(mod) {
|
||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||
mod(require("../../lib/codemirror"));
|
||||
else if (typeof define == "function" && define.amd) // AMD
|
||||
define(["../../lib/codemirror"], mod);
|
||||
else // Plain browser env
|
||||
mod(CodeMirror);
|
||||
})(function(CodeMirror) {
|
||||
var Pos = CodeMirror.Pos;
|
||||
|
||||
function forEach(arr, f) {
|
||||
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
|
||||
}
|
||||
|
||||
function arrayContains(arr, item) {
|
||||
if (!Array.prototype.indexOf) {
|
||||
var i = arr.length;
|
||||
while (i--) {
|
||||
if (arr[i] === item) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return arr.indexOf(item) != -1;
|
||||
}
|
||||
|
||||
function scriptHint(editor, keywords, getToken, options) {
|
||||
// Find the token at the cursor
|
||||
var cur = editor.getCursor(), token = getToken(editor, cur);
|
||||
if (/\b(?:string|comment)\b/.test(token.type)) return;
|
||||
token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;
|
||||
|
||||
// If it's not a 'word-style' token, ignore the token.
|
||||
if (!/^[\w$_]*$/.test(token.string)) {
|
||||
token = {start: cur.ch, end: cur.ch, string: "", state: token.state,
|
||||
type: token.string == "." ? "property" : null};
|
||||
} else if (token.end > cur.ch) {
|
||||
token.end = cur.ch;
|
||||
token.string = token.string.slice(0, cur.ch - token.start);
|
||||
}
|
||||
|
||||
var tprop = token;
|
||||
// If it is a property, find out what it is a property of.
|
||||
while (tprop.type == "property") {
|
||||
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
||||
if (tprop.string != ".") return;
|
||||
tprop = getToken(editor, Pos(cur.line, tprop.start));
|
||||
if (!context) var context = [];
|
||||
context.push(tprop);
|
||||
}
|
||||
// 发消息让其他组件注入 其他hint
|
||||
CodeMirror.signal(editor, "hinting");
|
||||
var myhints = editor.state.myhints
|
||||
var needToClearJSHint = editor.state.needToClearJSHint
|
||||
if (needToClearJSHint) { // 不使用js的hint,可能注入了其他语言的hint
|
||||
keywords = []
|
||||
editor.state.needToClearJSHint = false;
|
||||
}
|
||||
myhints && myhints.forEach(function(item) {
|
||||
if (!arrayContains(keywords, item)) keywords.push(item)
|
||||
})
|
||||
|
||||
return {list: getCompletions(token, context, keywords, options),
|
||||
from: Pos(cur.line, token.start),
|
||||
to: Pos(cur.line, token.end)};
|
||||
}
|
||||
|
||||
function javascriptHint(editor, options) {
|
||||
return scriptHint(editor, javascriptKeywords,
|
||||
function (e, cur) {return e.getTokenAt(cur);},
|
||||
options);
|
||||
};
|
||||
CodeMirror.registerHelper("hint", "javascript", javascriptHint);
|
||||
|
||||
function getCoffeeScriptToken(editor, cur) {
|
||||
// This getToken, it is for coffeescript, imitates the behavior of
|
||||
// getTokenAt method in javascript.js, that is, returning "property"
|
||||
// type and treat "." as indepenent token.
|
||||
var token = editor.getTokenAt(cur);
|
||||
if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
|
||||
token.end = token.start;
|
||||
token.string = '.';
|
||||
token.type = "property";
|
||||
}
|
||||
else if (/^\.[\w$_]*$/.test(token.string)) {
|
||||
token.type = "property";
|
||||
token.start++;
|
||||
token.string = token.string.replace(/\./, '');
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
function coffeescriptHint(editor, options) {
|
||||
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
|
||||
}
|
||||
CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
|
||||
|
||||
/* var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
|
||||
"toUpperCase toLowerCase split concat match replace search").split(" ");
|
||||
var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " +
|
||||
"lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
|
||||
var funcProps = "prototype apply call bind".split(" ");*/
|
||||
var javascriptKeywords = ("double float int long short null true false enum super this void auto for register static const friend mutable explicit virtual template typename printf " +
|
||||
"break continue return do while if else for instanceof switch case default try catch finally throw throws assert import package boolean byte char delete private " +
|
||||
"inline struct union signed unsigned export extern namespace using operator sizeof typedef typeid and del from not as elif or with pass except " +
|
||||
"print exec raise is def lambda private protected public abstract class extends final implements interface native new static strictfp synchronized transient main " +
|
||||
"String string System println vector bool boolean FALSE TRUE function").split(" ");
|
||||
/*
|
||||
var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
|
||||
"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
|
||||
*/
|
||||
|
||||
function forAllProps(obj, callback) {
|
||||
if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {
|
||||
for (var name in obj) callback(name)
|
||||
} else {
|
||||
for (var o = obj; o; o = Object.getPrototypeOf(o))
|
||||
Object.getOwnPropertyNames(o).forEach(callback)
|
||||
}
|
||||
}
|
||||
|
||||
function getCompletions(token, context, keywords, options) {
|
||||
var found = [], start = token.string, global = options && options.globalScope || window;
|
||||
function maybeAdd(str) {
|
||||
// var results = fuzzysort.go(start, [str])
|
||||
// if ( results.total && !arrayContains(found, str) ) found.push(str);
|
||||
|
||||
if (fuzzysort && fuzzysort.single) {
|
||||
// 使用模糊搜索
|
||||
var results = fuzzysort.single(start, str)
|
||||
if ( results && results.score <= 0 && !arrayContains(found, str)) found.push(str);
|
||||
} else {
|
||||
if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str);
|
||||
}
|
||||
}
|
||||
function gatherCompletions(obj) {
|
||||
if (typeof obj == "string") forEach(stringProps, maybeAdd);
|
||||
else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
|
||||
else if (obj instanceof Function) forEach(funcProps, maybeAdd);
|
||||
forAllProps(obj, maybeAdd)
|
||||
}
|
||||
|
||||
// 不启用context context强制要求了lib的调用才提示,比如Math.a 就会提示 Math.abs
|
||||
if (false && context && context.length) {
|
||||
// If this is a property, see if it belongs to some object we can
|
||||
// find in the current environment.
|
||||
var obj = context.pop(), base;
|
||||
if (obj.type && obj.type.indexOf("variable") === 0) {
|
||||
if (options && options.additionalContext)
|
||||
base = options.additionalContext[obj.string];
|
||||
if (!options || options.useGlobalScope !== false)
|
||||
base = base || global[obj.string];
|
||||
} else if (obj.type == "string") {
|
||||
base = "";
|
||||
} else if (obj.type == "atom") {
|
||||
base = 1;
|
||||
} else if (obj.type == "function") {
|
||||
if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
|
||||
(typeof global.jQuery == 'function'))
|
||||
base = global.jQuery();
|
||||
else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))
|
||||
base = global._();
|
||||
}
|
||||
while (base != null && context.length)
|
||||
base = base[context.pop().string];
|
||||
if (base != null) gatherCompletions(base);
|
||||
} else {
|
||||
// If not, just look in the global object and any local scope
|
||||
// (reading into JS mode internals to get at the local and global variables)
|
||||
/* for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);*/
|
||||
/* for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
|
||||
if (!options || options.useGlobalScope !== false)
|
||||
gatherCompletions(global);*/
|
||||
|
||||
// forEach(keywords, maybeAdd);
|
||||
|
||||
var result = fuzzysort.go(start, keywords)
|
||||
result && result.forEach(function(item) {
|
||||
found.push(item.target)
|
||||
})
|
||||
}
|
||||
return found;
|
||||
}
|
||||
});
|
|
@ -0,0 +1,36 @@
|
|||
.CodeMirror-hints {
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
list-style: none;
|
||||
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
-webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
|
||||
-moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
|
||||
box-shadow: 2px 3px 5px rgba(0,0,0,.2);
|
||||
border-radius: 3px;
|
||||
border: 1px solid silver;
|
||||
|
||||
background: white;
|
||||
font-size: 90%;
|
||||
font-family: monospace;
|
||||
|
||||
max-height: 20em;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.CodeMirror-hint {
|
||||
margin: 0;
|
||||
padding: 0 4px;
|
||||
border-radius: 2px;
|
||||
white-space: pre;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li.CodeMirror-hint-active {
|
||||
background: #08f;
|
||||
color: white;
|
||||
}
|
|
@ -0,0 +1,458 @@
|
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
||||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
||||
|
||||
(function(mod) {
|
||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
||||
mod(require("../../lib/codemirror"));
|
||||
else if (typeof define == "function" && define.amd) // AMD
|
||||
define(["../../lib/codemirror"], mod);
|
||||
else // Plain browser env
|
||||
mod(CodeMirror);
|
||||
})(function(CodeMirror) {
|
||||
"use strict";
|
||||
|
||||
var HINT_ELEMENT_CLASS = "CodeMirror-hint";
|
||||
var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active";
|
||||
|
||||
// This is the old interface, kept around for now to stay
|
||||
// backwards-compatible.
|
||||
CodeMirror.showHint = function(cm, getHints, options) {
|
||||
if (!getHints) return cm.showHint(options);
|
||||
if (options && options.async) getHints.async = true;
|
||||
var newOpts = {hint: getHints};
|
||||
if (options) for (var prop in options) newOpts[prop] = options[prop];
|
||||
return cm.showHint(newOpts);
|
||||
};
|
||||
|
||||
CodeMirror.defineExtension("showHint", function(options) {
|
||||
options = parseOptions(this, this.getCursor("start"), options);
|
||||
var selections = this.listSelections()
|
||||
if (selections.length > 1) return;
|
||||
// By default, don't allow completion when something is selected.
|
||||
// A hint function can have a `supportsSelection` property to
|
||||
// indicate that it can handle selections.
|
||||
if (this.somethingSelected()) {
|
||||
if (!options.hint.supportsSelection) return;
|
||||
// Don't try with cross-line selections
|
||||
for (var i = 0; i < selections.length; i++)
|
||||
if (selections[i].head.line != selections[i].anchor.line) return;
|
||||
}
|
||||
|
||||
if (this.state.completionActive) this.state.completionActive.close();
|
||||
var completion = this.state.completionActive = new Completion(this, options);
|
||||
if (!completion.options.hint) return;
|
||||
|
||||
CodeMirror.signal(this, "startCompletion", this);
|
||||
completion.update(true);
|
||||
});
|
||||
|
||||
function Completion(cm, options) {
|
||||
this.cm = cm;
|
||||
this.options = options;
|
||||
this.widget = null;
|
||||
this.debounce = 0;
|
||||
this.tick = 0;
|
||||
this.startPos = this.cm.getCursor("start");
|
||||
this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
|
||||
|
||||
var self = this;
|
||||
cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
|
||||
}
|
||||
|
||||
var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
|
||||
return setTimeout(fn, 1000/60);
|
||||
};
|
||||
var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
|
||||
|
||||
Completion.prototype = {
|
||||
close: function() {
|
||||
if (!this.active()) return;
|
||||
this.cm.state.completionActive = null;
|
||||
this.tick = null;
|
||||
this.cm.off("cursorActivity", this.activityFunc);
|
||||
|
||||
if (this.widget && this.data) CodeMirror.signal(this.data, "close");
|
||||
if (this.widget) this.widget.close();
|
||||
CodeMirror.signal(this.cm, "endCompletion", this.cm);
|
||||
},
|
||||
|
||||
active: function() {
|
||||
return this.cm.state.completionActive == this;
|
||||
},
|
||||
|
||||
pick: function(data, i) {
|
||||
var completion = data.list[i];
|
||||
if (completion.hint) completion.hint(this.cm, data, completion);
|
||||
else this.cm.replaceRange(getText(completion), completion.from || data.from,
|
||||
completion.to || data.to, "complete");
|
||||
CodeMirror.signal(data, "pick", completion);
|
||||
this.close();
|
||||
},
|
||||
|
||||
cursorActivity: function() {
|
||||
if (this.debounce) {
|
||||
cancelAnimationFrame(this.debounce);
|
||||
this.debounce = 0;
|
||||
}
|
||||
|
||||
var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);
|
||||
if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
|
||||
pos.ch < this.startPos.ch || this.cm.somethingSelected() ||
|
||||
(pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
|
||||
this.close();
|
||||
} else {
|
||||
var self = this;
|
||||
this.debounce = requestAnimationFrame(function() {self.update();});
|
||||
if (this.widget) this.widget.disable();
|
||||
}
|
||||
},
|
||||
|
||||
update: function(first) {
|
||||
if (this.tick == null) return
|
||||
var self = this, myTick = ++this.tick
|
||||
fetchHints(this.options.hint, this.cm, this.options, function(data) {
|
||||
if (self.tick == myTick) self.finishUpdate(data, first)
|
||||
})
|
||||
},
|
||||
|
||||
finishUpdate: function(data, first) {
|
||||
if (this.data) CodeMirror.signal(this.data, "update");
|
||||
|
||||
var picked = (this.widget && this.widget.picked) // || (first && this.options.completeSingle);
|
||||
if (this.widget) this.widget.close();
|
||||
|
||||
if (data && this.data && isNewCompletion(this.data, data)) return;
|
||||
this.data = data;
|
||||
|
||||
if (data && data.list.length) {
|
||||
if (picked && data.list.length == 1) {
|
||||
this.pick(data, 0);
|
||||
} else {
|
||||
// 使得输入完后,刚好输入和hint一样,则不再显示hint
|
||||
if (data.list.length == 1 && data.to.ch - data.from.ch === data.list[0].length) {
|
||||
return;
|
||||
}
|
||||
this.widget = new Widget(this, data);
|
||||
CodeMirror.signal(data, "shown");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function isNewCompletion(old, nw) {
|
||||
var moved = CodeMirror.cmpPos(nw.from, old.from)
|
||||
return moved > 0 && old.to.ch - old.from.ch != nw.to.ch - nw.from.ch
|
||||
}
|
||||
|
||||
function parseOptions(cm, pos, options) {
|
||||
var editor = cm.options.hintOptions;
|
||||
var out = {};
|
||||
for (var prop in defaultOptions) out[prop] = defaultOptions[prop];
|
||||
if (editor) for (var prop in editor)
|
||||
if (editor[prop] !== undefined) out[prop] = editor[prop];
|
||||
if (options) for (var prop in options)
|
||||
if (options[prop] !== undefined) out[prop] = options[prop];
|
||||
if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)
|
||||
return out;
|
||||
}
|
||||
|
||||
function getText(completion) {
|
||||
if (typeof completion == "string") return completion;
|
||||
else return completion.text;
|
||||
}
|
||||
|
||||
function buildKeyMap(completion, handle) {
|
||||
var baseMap = {
|
||||
Up: function() {handle.moveFocus(-1);},
|
||||
Down: function() {handle.moveFocus(1);},
|
||||
PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},
|
||||
PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},
|
||||
Home: function() {handle.setFocus(0);},
|
||||
End: function() {handle.setFocus(handle.length - 1);},
|
||||
Enter: handle.pick,
|
||||
Tab: handle.pick,
|
||||
Esc: handle.close
|
||||
};
|
||||
var custom = completion.options.customKeys;
|
||||
var ourMap = custom ? {} : baseMap;
|
||||
function addBinding(key, val) {
|
||||
var bound;
|
||||
if (typeof val != "string")
|
||||
bound = function(cm) { return val(cm, handle); };
|
||||
// This mechanism is deprecated
|
||||
else if (baseMap.hasOwnProperty(val))
|
||||
bound = baseMap[val];
|
||||
else
|
||||
bound = val;
|
||||
ourMap[key] = bound;
|
||||
}
|
||||
if (custom)
|
||||
for (var key in custom) if (custom.hasOwnProperty(key))
|
||||
addBinding(key, custom[key]);
|
||||
var extra = completion.options.extraKeys;
|
||||
if (extra)
|
||||
for (var key in extra) if (extra.hasOwnProperty(key))
|
||||
addBinding(key, extra[key]);
|
||||
return ourMap;
|
||||
}
|
||||
|
||||
function getHintElement(hintsElement, el) {
|
||||
while (el && el != hintsElement) {
|
||||
if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el;
|
||||
el = el.parentNode;
|
||||
}
|
||||
}
|
||||
|
||||
function Widget(completion, data) {
|
||||
this.completion = completion;
|
||||
this.data = data;
|
||||
this.picked = false;
|
||||
var widget = this, cm = completion.cm;
|
||||
|
||||
var hints = this.hints = document.createElement("ul");
|
||||
hints.className = "CodeMirror-hints";
|
||||
this.selectedHint = data.selectedHint || 0;
|
||||
|
||||
var completions = data.list;
|
||||
for (var i = 0; i < completions.length; ++i) {
|
||||
var elt = hints.appendChild(document.createElement("li")), cur = completions[i];
|
||||
var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS);
|
||||
if (cur.className != null) className = cur.className + " " + className;
|
||||
elt.className = className;
|
||||
if (cur.render) cur.render(elt, data, cur);
|
||||
else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));
|
||||
elt.hintId = i;
|
||||
}
|
||||
|
||||
var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);
|
||||
var left = pos.left, top = pos.bottom, below = true;
|
||||
hints.style.left = left + "px";
|
||||
hints.style.top = top + "px";
|
||||
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
|
||||
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
|
||||
var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
|
||||
(completion.options.container || document.body).appendChild(hints);
|
||||
var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH;
|
||||
var scrolls = hints.scrollHeight > hints.clientHeight + 1
|
||||
var startScroll = cm.getScrollInfo();
|
||||
|
||||
if (overlapY > 0) {
|
||||
var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);
|
||||
if (curTop - height > 0) { // Fits above cursor
|
||||
hints.style.top = (top = pos.top - height) + "px";
|
||||
below = false;
|
||||
} else if (height > winH) {
|
||||
hints.style.height = (winH - 5) + "px";
|
||||
hints.style.top = (top = pos.bottom - box.top) + "px";
|
||||
var cursor = cm.getCursor();
|
||||
if (data.from.ch != cursor.ch) {
|
||||
pos = cm.cursorCoords(cursor);
|
||||
hints.style.left = (left = pos.left) + "px";
|
||||
box = hints.getBoundingClientRect();
|
||||
}
|
||||
}
|
||||
}
|
||||
var overlapX = box.right - winW;
|
||||
if (overlapX > 0) {
|
||||
if (box.right - box.left > winW) {
|
||||
hints.style.width = (winW - 5) + "px";
|
||||
overlapX -= (box.right - box.left) - winW;
|
||||
}
|
||||
hints.style.left = (left = pos.left - overlapX) + "px";
|
||||
}
|
||||
if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)
|
||||
node.style.paddingRight = cm.display.nativeBarWidth + "px"
|
||||
|
||||
cm.addKeyMap(this.keyMap = buildKeyMap(completion, {
|
||||
moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },
|
||||
setFocus: function(n) { widget.changeActive(n); },
|
||||
menuSize: function() { return widget.screenAmount(); },
|
||||
length: completions.length,
|
||||
close: function() { completion.close(); },
|
||||
pick: function() { widget.pick(); },
|
||||
data: data
|
||||
}));
|
||||
|
||||
if (completion.options.closeOnUnfocus) {
|
||||
var closingOnBlur;
|
||||
cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });
|
||||
cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); });
|
||||
}
|
||||
|
||||
cm.on("scroll", this.onScroll = function() {
|
||||
var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();
|
||||
var newTop = top + startScroll.top - curScroll.top;
|
||||
var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);
|
||||
if (!below) point += hints.offsetHeight;
|
||||
if (point <= editor.top || point >= editor.bottom) return completion.close();
|
||||
hints.style.top = newTop + "px";
|
||||
hints.style.left = (left + startScroll.left - curScroll.left) + "px";
|
||||
});
|
||||
|
||||
CodeMirror.on(hints, "dblclick", function(e) {
|
||||
var t = getHintElement(hints, e.target || e.srcElement);
|
||||
if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}
|
||||
});
|
||||
|
||||
CodeMirror.on(hints, "click", function(e) {
|
||||
var t = getHintElement(hints, e.target || e.srcElement);
|
||||
if (t && t.hintId != null) {
|
||||
widget.changeActive(t.hintId);
|
||||
if (completion.options.completeOnSingleClick) widget.pick();
|
||||
}
|
||||
});
|
||||
|
||||
CodeMirror.on(hints, "mousedown", function() {
|
||||
setTimeout(function(){cm.focus();}, 20);
|
||||
});
|
||||
|
||||
CodeMirror.signal(data, "select", completions[0], hints.firstChild);
|
||||
return true;
|
||||
}
|
||||
|
||||
Widget.prototype = {
|
||||
close: function() {
|
||||
if (this.completion.widget != this) return;
|
||||
this.completion.widget = null;
|
||||
this.hints.parentNode.removeChild(this.hints);
|
||||
this.completion.cm.removeKeyMap(this.keyMap);
|
||||
|
||||
var cm = this.completion.cm;
|
||||
if (this.completion.options.closeOnUnfocus) {
|
||||
cm.off("blur", this.onBlur);
|
||||
cm.off("focus", this.onFocus);
|
||||
}
|
||||
cm.off("scroll", this.onScroll);
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
this.completion.cm.removeKeyMap(this.keyMap);
|
||||
var widget = this;
|
||||
this.keyMap = {Enter: function() { widget.picked = true; }};
|
||||
this.completion.cm.addKeyMap(this.keyMap);
|
||||
},
|
||||
|
||||
pick: function() {
|
||||
this.completion.pick(this.data, this.selectedHint);
|
||||
},
|
||||
|
||||
changeActive: function(i, avoidWrap) {
|
||||
if (i >= this.data.list.length)
|
||||
i = avoidWrap ? this.data.list.length - 1 : 0;
|
||||
else if (i < 0)
|
||||
i = avoidWrap ? 0 : this.data.list.length - 1;
|
||||
if (this.selectedHint == i) return;
|
||||
var node = this.hints.childNodes[this.selectedHint];
|
||||
node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, "");
|
||||
node = this.hints.childNodes[this.selectedHint = i];
|
||||
node.className += " " + ACTIVE_HINT_ELEMENT_CLASS;
|
||||
if (node.offsetTop < this.hints.scrollTop)
|
||||
this.hints.scrollTop = node.offsetTop - 3;
|
||||
else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
|
||||
this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;
|
||||
CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
|
||||
},
|
||||
|
||||
screenAmount: function() {
|
||||
return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
|
||||
}
|
||||
};
|
||||
|
||||
function applicableHelpers(cm, helpers) {
|
||||
if (!cm.somethingSelected()) return helpers
|
||||
var result = []
|
||||
for (var i = 0; i < helpers.length; i++)
|
||||
if (helpers[i].supportsSelection) result.push(helpers[i])
|
||||
return result
|
||||
}
|
||||
|
||||
function fetchHints(hint, cm, options, callback) {
|
||||
if (hint.async) {
|
||||
hint(cm, callback, options)
|
||||
} else {
|
||||
var result = hint(cm, options)
|
||||
if (result && result.then) result.then(callback)
|
||||
else callback(result)
|
||||
}
|
||||
}
|
||||
|
||||
function resolveAutoHints(cm, pos) {
|
||||
var helpers = cm.getHelpers(pos, "hint"), words
|
||||
if (helpers.length) {
|
||||
var resolved = function(cm, callback, options) {
|
||||
var app = applicableHelpers(cm, helpers);
|
||||
function run(i) {
|
||||
if (i == app.length) return callback(null)
|
||||
fetchHints(app[i], cm, options, function(result) {
|
||||
if (result && result.list.length > 0) callback(result)
|
||||
else run(i + 1)
|
||||
})
|
||||
}
|
||||
run(0)
|
||||
}
|
||||
resolved.async = true
|
||||
resolved.supportsSelection = true
|
||||
return resolved
|
||||
} else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
|
||||
// 发消息让其他组件注入 其他hint
|
||||
CodeMirror.signal(cm, "hinting", words);
|
||||
var myhints = cm.state.myhints
|
||||
var wordsTemp = words.slice(0)
|
||||
myhints && myhints.forEach(function(item) {
|
||||
if (words.indexOf(item) === -1) wordsTemp.push(item)
|
||||
})
|
||||
return function(cm) {
|
||||
return CodeMirror.hint.fromList(cm, {words: wordsTemp})
|
||||
}
|
||||
} else if (CodeMirror.hint.anyword) {
|
||||
return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }
|
||||
} else {
|
||||
return function() {}
|
||||
}
|
||||
}
|
||||
|
||||
CodeMirror.registerHelper("hint", "auto", {
|
||||
resolve: resolveAutoHints
|
||||
});
|
||||
|
||||
CodeMirror.registerHelper("hint", "fromList", function(cm, options) {
|
||||
var cur = cm.getCursor(), token = cm.getTokenAt(cur);
|
||||
var to = CodeMirror.Pos(cur.line, token.end);
|
||||
if (token.string && /\w/.test(token.string[token.string.length - 1])) {
|
||||
var term = token.string, from = CodeMirror.Pos(cur.line, token.start);
|
||||
} else {
|
||||
var term = "", from = to;
|
||||
}
|
||||
var found = [];
|
||||
|
||||
if (fuzzysort && fuzzysort.go) {
|
||||
var result = fuzzysort.go(term, options.words)
|
||||
result && result.forEach(function(item) {
|
||||
found.push(item.target)
|
||||
})
|
||||
} else {
|
||||
for (var i = 0; i < options.words.length; i++) {
|
||||
var word = options.words[i];
|
||||
if (word.slice(0, term.length) == term)
|
||||
found.push(word);
|
||||
}
|
||||
}
|
||||
if (found.length) return {list: found, from: from, to: to};
|
||||
});
|
||||
|
||||
CodeMirror.commands.autocomplete = CodeMirror.showHint;
|
||||
|
||||
var defaultOptions = {
|
||||
hint: CodeMirror.hint.auto,
|
||||
completeSingle: true,
|
||||
alignWithWord: true,
|
||||
closeCharacters: /[\s()\[\]{};:>,]/,
|
||||
closeOnUnfocus: true,
|
||||
completeOnSingleClick: true,
|
||||
container: null,
|
||||
customKeys: null,
|
||||
extraKeys: null
|
||||
};
|
||||
|
||||
CodeMirror.defineOption("hintOptions", null);
|
||||
});
|
|
@ -0,0 +1,603 @@
|
|||
/*
|
||||
WHAT: SublimeText-like Fuzzy Search
|
||||
USAGE:
|
||||
fuzzysort.single('fs', 'Fuzzy Search') // {score: -16}
|
||||
fuzzysort.single('test', 'test') // {score: 0}
|
||||
fuzzysort.single('doesnt exist', 'target') // null
|
||||
fuzzysort.go('mr', ['Monitor.cpp', 'MeshRenderer.cpp'])
|
||||
// [{score: -18, target: "MeshRenderer.cpp"}, {score: -6009, target: "Monitor.cpp"}]
|
||||
fuzzysort.highlight(fuzzysort.single('fs', 'Fuzzy Search'), '<b>', '</b>')
|
||||
// <b>F</b>uzzy <b>S</b>earch
|
||||
|
||||
https://github.com/farzher/fuzzysort
|
||||
*/
|
||||
|
||||
// UMD (Universal Module Definition) for fuzzysort
|
||||
;(function(root, UMD) {
|
||||
if(typeof define === 'function' && define.amd) define([], UMD)
|
||||
else if(typeof module === 'object' && module.exports) module.exports = UMD()
|
||||
else root.fuzzysort = UMD()
|
||||
})(this, function UMD() { function fuzzysortNew(instanceOptions) {
|
||||
|
||||
var fuzzysort = {
|
||||
|
||||
single: function(search, target, options) {
|
||||
if(!search) return null
|
||||
if(!isObj(search)) search = fuzzysort.getPreparedSearch(search)
|
||||
|
||||
if(!target) return null
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
var allowTypo = options && options.allowTypo!==undefined ? options.allowTypo
|
||||
: instanceOptions && instanceOptions.allowTypo!==undefined ? instanceOptions.allowTypo
|
||||
: true
|
||||
var algorithm = allowTypo ? fuzzysort.algorithm : fuzzysort.algorithmNoTypo
|
||||
return algorithm(search, target, search[0])
|
||||
// var threshold = options && options.threshold || instanceOptions && instanceOptions.threshold || -9007199254740991
|
||||
// var result = algorithm(search, target, search[0])
|
||||
// if(result === null) return null
|
||||
// if(result.score < threshold) return null
|
||||
// return result
|
||||
},
|
||||
|
||||
go: function(search, targets, options) {
|
||||
if(!search) return noResults
|
||||
search = fuzzysort.prepareSearch(search)
|
||||
var searchLowerCode = search[0]
|
||||
|
||||
var threshold = options && options.threshold || instanceOptions && instanceOptions.threshold || -9007199254740991
|
||||
var limit = options && options.limit || instanceOptions && instanceOptions.limit || 9007199254740991
|
||||
var allowTypo = options && options.allowTypo!==undefined ? options.allowTypo
|
||||
: instanceOptions && instanceOptions.allowTypo!==undefined ? instanceOptions.allowTypo
|
||||
: true
|
||||
var algorithm = allowTypo ? fuzzysort.algorithm : fuzzysort.algorithmNoTypo
|
||||
var resultsLen = 0; var limitedCount = 0
|
||||
var targetsLen = targets.length
|
||||
|
||||
// This code is copy/pasted 3 times for performance reasons [options.keys, options.key, no keys]
|
||||
|
||||
// options.keys
|
||||
if(options && options.keys) {
|
||||
var scoreFn = options.scoreFn || defaultScoreFn
|
||||
var keys = options.keys
|
||||
var keysLen = keys.length
|
||||
for(var i = targetsLen - 1; i >= 0; --i) { var obj = targets[i]
|
||||
var objResults = new Array(keysLen)
|
||||
for (var keyI = keysLen - 1; keyI >= 0; --keyI) {
|
||||
var key = keys[keyI]
|
||||
var target = getValue(obj, key)
|
||||
if(!target) { objResults[keyI] = null; continue }
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
objResults[keyI] = algorithm(search, target, searchLowerCode)
|
||||
}
|
||||
objResults.obj = obj // before scoreFn so scoreFn can use it
|
||||
var score = scoreFn(objResults)
|
||||
if(score === null) continue
|
||||
if(score < threshold) continue
|
||||
objResults.score = score
|
||||
if(resultsLen < limit) { q.add(objResults); ++resultsLen }
|
||||
else {
|
||||
++limitedCount
|
||||
if(score > q.peek().score) q.replaceTop(objResults)
|
||||
}
|
||||
}
|
||||
|
||||
// options.key
|
||||
} else if(options && options.key) {
|
||||
var key = options.key
|
||||
for(var i = targetsLen - 1; i >= 0; --i) { var obj = targets[i]
|
||||
var target = getValue(obj, key)
|
||||
if(!target) continue
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
var result = algorithm(search, target, searchLowerCode)
|
||||
if(result === null) continue
|
||||
if(result.score < threshold) continue
|
||||
|
||||
// have to clone result so duplicate targets from different obj can each reference the correct obj
|
||||
result = {target:result.target, _targetLowerCodes:null, _nextBeginningIndexes:null, score:result.score, indexes:result.indexes, obj:obj} // hidden
|
||||
|
||||
if(resultsLen < limit) { q.add(result); ++resultsLen }
|
||||
else {
|
||||
++limitedCount
|
||||
if(result.score > q.peek().score) q.replaceTop(result)
|
||||
}
|
||||
}
|
||||
|
||||
// no keys
|
||||
} else {
|
||||
for(var i = targetsLen - 1; i >= 0; --i) { var target = targets[i]
|
||||
if(!target) continue
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
var result = algorithm(search, target, searchLowerCode)
|
||||
if(result === null) continue
|
||||
if(result.score < threshold) continue
|
||||
if(resultsLen < limit) { q.add(result); ++resultsLen }
|
||||
else {
|
||||
++limitedCount
|
||||
if(result.score > q.peek().score) q.replaceTop(result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(resultsLen === 0) return noResults
|
||||
var results = new Array(resultsLen)
|
||||
for(var i = resultsLen - 1; i >= 0; --i) results[i] = q.poll()
|
||||
results.total = resultsLen + limitedCount
|
||||
return results
|
||||
},
|
||||
|
||||
goAsync: function(search, targets, options) {
|
||||
var canceled = false
|
||||
var p = new Promise(function(resolve, reject) {
|
||||
if(!search) return resolve(noResults)
|
||||
search = fuzzysort.prepareSearch(search)
|
||||
var searchLowerCode = search[0]
|
||||
|
||||
var q = fastpriorityqueue()
|
||||
var iCurrent = targets.length - 1
|
||||
var threshold = options && options.threshold || instanceOptions && instanceOptions.threshold || -9007199254740991
|
||||
var limit = options && options.limit || instanceOptions && instanceOptions.limit || 9007199254740991
|
||||
var allowTypo = options && options.allowTypo!==undefined ? options.allowTypo
|
||||
: instanceOptions && instanceOptions.allowTypo!==undefined ? instanceOptions.allowTypo
|
||||
: true
|
||||
var algorithm = allowTypo ? fuzzysort.algorithm : fuzzysort.algorithmNoTypo
|
||||
var resultsLen = 0; var limitedCount = 0
|
||||
function step() {
|
||||
if(canceled) return reject('canceled')
|
||||
|
||||
var startMs = Date.now()
|
||||
|
||||
// This code is copy/pasted 3 times for performance reasons [options.keys, options.key, no keys]
|
||||
|
||||
// options.keys
|
||||
if(options && options.keys) {
|
||||
var scoreFn = options.scoreFn || defaultScoreFn
|
||||
var keys = options.keys
|
||||
var keysLen = keys.length
|
||||
for(; iCurrent >= 0; --iCurrent) { var obj = targets[iCurrent]
|
||||
var objResults = new Array(keysLen)
|
||||
for (var keyI = keysLen - 1; keyI >= 0; --keyI) {
|
||||
var key = keys[keyI]
|
||||
var target = getValue(obj, key)
|
||||
if(!target) { objResults[keyI] = null; continue }
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
objResults[keyI] = algorithm(search, target, searchLowerCode)
|
||||
}
|
||||
objResults.obj = obj // before scoreFn so scoreFn can use it
|
||||
var score = scoreFn(objResults)
|
||||
if(score === null) continue
|
||||
if(score < threshold) continue
|
||||
objResults.score = score
|
||||
if(resultsLen < limit) { q.add(objResults); ++resultsLen }
|
||||
else {
|
||||
++limitedCount
|
||||
if(score > q.peek().score) q.replaceTop(objResults)
|
||||
}
|
||||
|
||||
if(iCurrent%1000/*itemsPerCheck*/ === 0) {
|
||||
if(Date.now() - startMs >= 10/*asyncInterval*/) {
|
||||
isNode?setImmediate(step):setTimeout(step)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// options.key
|
||||
} else if(options && options.key) {
|
||||
var key = options.key
|
||||
for(; iCurrent >= 0; --iCurrent) { var obj = targets[iCurrent]
|
||||
var target = getValue(obj, key)
|
||||
if(!target) continue
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
var result = algorithm(search, target, searchLowerCode)
|
||||
if(result === null) continue
|
||||
if(result.score < threshold) continue
|
||||
|
||||
// have to clone result so duplicate targets from different obj can each reference the correct obj
|
||||
result = {target:result.target, _targetLowerCodes:null, _nextBeginningIndexes:null, score:result.score, indexes:result.indexes, obj:obj} // hidden
|
||||
|
||||
if(resultsLen < limit) { q.add(result); ++resultsLen }
|
||||
else {
|
||||
++limitedCount
|
||||
if(result.score > q.peek().score) q.replaceTop(result)
|
||||
}
|
||||
|
||||
if(iCurrent%1000/*itemsPerCheck*/ === 0) {
|
||||
if(Date.now() - startMs >= 10/*asyncInterval*/) {
|
||||
isNode?setImmediate(step):setTimeout(step)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// no keys
|
||||
} else {
|
||||
for(; iCurrent >= 0; --iCurrent) { var target = targets[iCurrent]
|
||||
if(!target) continue
|
||||
if(!isObj(target)) target = fuzzysort.getPrepared(target)
|
||||
|
||||
var result = algorithm(search, target, searchLowerCode)
|
||||
if(result === null) continue
|
||||
if(result.score < threshold) continue
|
||||
if(resultsLen < limit) { q.add(result); ++resultsLen }
|
||||
else {
|
||||
++limitedCount
|
||||
if(result.score > q.peek().score) q.replaceTop(result)
|
||||
}
|
||||
|
||||
if(iCurrent%1000/*itemsPerCheck*/ === 0) {
|
||||
if(Date.now() - startMs >= 10/*asyncInterval*/) {
|
||||
isNode?setImmediate(step):setTimeout(step)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(resultsLen === 0) return resolve(noResults)
|
||||
var results = new Array(resultsLen)
|
||||
for(var i = resultsLen - 1; i >= 0; --i) results[i] = q.poll()
|
||||
results.total = resultsLen + limitedCount
|
||||
resolve(results)
|
||||
}
|
||||
|
||||
isNode?setImmediate(step):step()
|
||||
})
|
||||
p.cancel = function() { canceled = true }
|
||||
return p
|
||||
},
|
||||
|
||||
highlight: function(result, hOpen, hClose) {
|
||||
if(result === null) return null
|
||||
if(hOpen === undefined) hOpen = '<b>'
|
||||
if(hClose === undefined) hClose = '</b>'
|
||||
var highlighted = ''
|
||||
var matchesIndex = 0
|
||||
var opened = false
|
||||
var target = result.target
|
||||
var targetLen = target.length
|
||||
var matchesBest = result.indexes
|
||||
for(var i = 0; i < targetLen; ++i) { var char = target[i]
|
||||
if(matchesBest[matchesIndex] === i) {
|
||||
++matchesIndex
|
||||
if(!opened) { opened = true
|
||||
highlighted += hOpen
|
||||
}
|
||||
|
||||
if(matchesIndex === matchesBest.length) {
|
||||
highlighted += char + hClose + target.substr(i+1)
|
||||
break
|
||||
}
|
||||
} else {
|
||||
if(opened) { opened = false
|
||||
highlighted += hClose
|
||||
}
|
||||
}
|
||||
highlighted += char
|
||||
}
|
||||
|
||||
return highlighted
|
||||
},
|
||||
|
||||
prepare: function(target) {
|
||||
if(!target) return
|
||||
return {target:target, _targetLowerCodes:fuzzysort.prepareLowerCodes(target), _nextBeginningIndexes:null, score:null, indexes:null, obj:null} // hidden
|
||||
},
|
||||
prepareSlow: function(target) {
|
||||
if(!target) return
|
||||
return {target:target, _targetLowerCodes:fuzzysort.prepareLowerCodes(target), _nextBeginningIndexes:fuzzysort.prepareNextBeginningIndexes(target), score:null, indexes:null, obj:null} // hidden
|
||||
},
|
||||
prepareSearch: function(search) {
|
||||
if(!search) return
|
||||
return fuzzysort.prepareLowerCodes(search)
|
||||
},
|
||||
|
||||
|
||||
|
||||
// Below this point is only internal code
|
||||
// Below this point is only internal code
|
||||
// Below this point is only internal code
|
||||
// Below this point is only internal code
|
||||
|
||||
|
||||
|
||||
getPrepared: function(target) {
|
||||
if(target.length > 999) return fuzzysort.prepare(target) // don't cache huge targets
|
||||
var targetPrepared = preparedCache.get(target)
|
||||
if(targetPrepared !== undefined) return targetPrepared
|
||||
targetPrepared = fuzzysort.prepare(target)
|
||||
preparedCache.set(target, targetPrepared)
|
||||
return targetPrepared
|
||||
},
|
||||
getPreparedSearch: function(search) {
|
||||
if(search.length > 999) return fuzzysort.prepareSearch(search) // don't cache huge searches
|
||||
var searchPrepared = preparedSearchCache.get(search)
|
||||
if(searchPrepared !== undefined) return searchPrepared
|
||||
searchPrepared = fuzzysort.prepareSearch(search)
|
||||
preparedSearchCache.set(search, searchPrepared)
|
||||
return searchPrepared
|
||||
},
|
||||
|
||||
algorithm: function(searchLowerCodes, prepared, searchLowerCode) {
|
||||
var targetLowerCodes = prepared._targetLowerCodes
|
||||
var searchLen = searchLowerCodes.length
|
||||
var targetLen = targetLowerCodes.length
|
||||
var searchI = 0 // where we at
|
||||
var targetI = 0 // where you at
|
||||
var typoSimpleI = 0
|
||||
var matchesSimpleLen = 0
|
||||
|
||||
// very basic fuzzy match; to remove non-matching targets ASAP!
|
||||
// walk through target. find sequential matches.
|
||||
// if all chars aren't found then exit
|
||||
for(;;) {
|
||||
var isMatch = searchLowerCode === targetLowerCodes[targetI]
|
||||
if(isMatch) {
|
||||
matchesSimple[matchesSimpleLen++] = targetI
|
||||
++searchI; if(searchI === searchLen) break
|
||||
searchLowerCode = searchLowerCodes[typoSimpleI===0?searchI : (typoSimpleI===searchI?searchI+1 : (typoSimpleI===searchI-1?searchI-1 : searchI))]
|
||||
}
|
||||
|
||||
++targetI; if(targetI >= targetLen) { // Failed to find searchI
|
||||
// Check for typo or exit
|
||||
// we go as far as possible before trying to transpose
|
||||
// then we transpose backwards until we reach the beginning
|
||||
for(;;) {
|
||||
if(searchI <= 1) return null // not allowed to transpose first char
|
||||
if(typoSimpleI === 0) { // we haven't tried to transpose yet
|
||||
--searchI
|
||||
var searchLowerCodeNew = searchLowerCodes[searchI]
|
||||
if(searchLowerCode === searchLowerCodeNew) continue // doesn't make sense to transpose a repeat char
|
||||
typoSimpleI = searchI
|
||||
} else {
|
||||
if(typoSimpleI === 1) return null // reached the end of the line for transposing
|
||||
--typoSimpleI
|
||||
searchI = typoSimpleI
|
||||
searchLowerCode = searchLowerCodes[searchI + 1]
|
||||
var searchLowerCodeNew = searchLowerCodes[searchI]
|
||||
if(searchLowerCode === searchLowerCodeNew) continue // doesn't make sense to transpose a repeat char
|
||||
}
|
||||
matchesSimpleLen = searchI
|
||||
targetI = matchesSimple[matchesSimpleLen - 1] + 1
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var searchI = 0
|
||||
var typoStrictI = 0
|
||||
var successStrict = false
|
||||
var matchesStrictLen = 0
|
||||
|
||||
var nextBeginningIndexes = prepared._nextBeginningIndexes
|
||||
if(nextBeginningIndexes === null) nextBeginningIndexes = prepared._nextBeginningIndexes = fuzzysort.prepareNextBeginningIndexes(prepared.target)
|
||||
var firstPossibleI = targetI = matchesSimple[0]===0 ? 0 : nextBeginningIndexes[matchesSimple[0]-1]
|
||||
|
||||
// Our target string successfully matched all characters in sequence!
|
||||
// Let's try a more advanced and strict test to improve the score
|
||||
// only count it as a match if it's consecutive or a beginning character!
|
||||
if(targetI !== targetLen) for(;;) {
|
||||
if(targetI >= targetLen) {
|
||||
// We failed to find a good spot for this search char, go back to the previous search char and force it forward
|
||||
if(searchI <= 0) { // We failed to push chars forward for a better match
|
||||
// transpose, starting from the beginning
|
||||
++typoStrictI; if(typoStrictI > searchLen-2) break
|
||||
if(searchLowerCodes[typoStrictI] === searchLowerCodes[typoStrictI+1]) continue // doesn't make sense to transpose a repeat char
|
||||
targetI = firstPossibleI
|
||||
continue
|
||||
}
|
||||
|
||||
--searchI
|
||||
var lastMatch = matchesStrict[--matchesStrictLen]
|
||||
targetI = nextBeginningIndexes[lastMatch]
|
||||
|
||||
} else {
|
||||
var isMatch = searchLowerCodes[typoStrictI===0?searchI : (typoStrictI===searchI?searchI+1 : (typoStrictI===searchI-1?searchI-1 : searchI))] === targetLowerCodes[targetI]
|
||||
if(isMatch) {
|
||||
matchesStrict[matchesStrictLen++] = targetI
|
||||
++searchI; if(searchI === searchLen) { successStrict = true; break }
|
||||
++targetI
|
||||
} else {
|
||||
targetI = nextBeginningIndexes[targetI]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{ // tally up the score & keep track of matches for highlighting later
|
||||
if(successStrict) { var matchesBest = matchesStrict; var matchesBestLen = matchesStrictLen }
|
||||
else { var matchesBest = matchesSimple; var matchesBestLen = matchesSimpleLen }
|
||||
var score = 0
|
||||
var lastTargetI = -1
|
||||
for(var i = 0; i < searchLen; ++i) { var targetI = matchesBest[i]
|
||||
// score only goes down if they're not consecutive
|
||||
if(lastTargetI !== targetI - 1) score -= targetI
|
||||
lastTargetI = targetI
|
||||
}
|
||||
if(!successStrict) {
|
||||
score *= 1000
|
||||
if(typoSimpleI !== 0) score += -20/*typoPenalty*/
|
||||
} else {
|
||||
if(typoStrictI !== 0) score += -20/*typoPenalty*/
|
||||
}
|
||||
score -= targetLen - searchLen
|
||||
prepared.score = score
|
||||
prepared.indexes = new Array(matchesBestLen); for(var i = matchesBestLen - 1; i >= 0; --i) prepared.indexes[i] = matchesBest[i]
|
||||
|
||||
return prepared
|
||||
}
|
||||
},
|
||||
|
||||
algorithmNoTypo: function(searchLowerCodes, prepared, searchLowerCode) {
|
||||
var targetLowerCodes = prepared._targetLowerCodes
|
||||
var searchLen = searchLowerCodes.length
|
||||
var targetLen = targetLowerCodes.length
|
||||
var searchI = 0 // where we at
|
||||
var targetI = 0 // where you at
|
||||
var matchesSimpleLen = 0
|
||||
|
||||
// very basic fuzzy match; to remove non-matching targets ASAP!
|
||||
// walk through target. find sequential matches.
|
||||
// if all chars aren't found then exit
|
||||
for(;;) {
|
||||
var isMatch = searchLowerCode === targetLowerCodes[targetI]
|
||||
if(isMatch) {
|
||||
matchesSimple[matchesSimpleLen++] = targetI
|
||||
++searchI; if(searchI === searchLen) break
|
||||
searchLowerCode = searchLowerCodes[searchI]
|
||||
}
|
||||
++targetI; if(targetI >= targetLen) return null // Failed to find searchI
|
||||
}
|
||||
|
||||
var searchI = 0
|
||||
var successStrict = false
|
||||
var matchesStrictLen = 0
|
||||
|
||||
var nextBeginningIndexes = prepared._nextBeginningIndexes
|
||||
if(nextBeginningIndexes === null) nextBeginningIndexes = prepared._nextBeginningIndexes = fuzzysort.prepareNextBeginningIndexes(prepared.target)
|
||||
var firstPossibleI = targetI = matchesSimple[0]===0 ? 0 : nextBeginningIndexes[matchesSimple[0]-1]
|
||||
|
||||
// Our target string successfully matched all characters in sequence!
|
||||
// Let's try a more advanced and strict test to improve the score
|
||||
// only count it as a match if it's consecutive or a beginning character!
|
||||
if(targetI !== targetLen) for(;;) {
|
||||
if(targetI >= targetLen) {
|
||||
// We failed to find a good spot for this search char, go back to the previous search char and force it forward
|
||||
if(searchI <= 0) break // We failed to push chars forward for a better match
|
||||
|
||||
--searchI
|
||||
var lastMatch = matchesStrict[--matchesStrictLen]
|
||||
targetI = nextBeginningIndexes[lastMatch]
|
||||
|
||||
} else {
|
||||
var isMatch = searchLowerCodes[searchI] === targetLowerCodes[targetI]
|
||||
if(isMatch) {
|
||||
matchesStrict[matchesStrictLen++] = targetI
|
||||
++searchI; if(searchI === searchLen) { successStrict = true; break }
|
||||
++targetI
|
||||
} else {
|
||||
targetI = nextBeginningIndexes[targetI]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{ // tally up the score & keep track of matches for highlighting later
|
||||
if(successStrict) { var matchesBest = matchesStrict; var matchesBestLen = matchesStrictLen }
|
||||
else { var matchesBest = matchesSimple; var matchesBestLen = matchesSimpleLen }
|
||||
var score = 0
|
||||
var lastTargetI = -1
|
||||
for(var i = 0; i < searchLen; ++i) { var targetI = matchesBest[i]
|
||||
// score only goes down if they're not consecutive
|
||||
if(lastTargetI !== targetI - 1) score -= targetI
|
||||
lastTargetI = targetI
|
||||
}
|
||||
if(!successStrict) score *= 1000
|
||||
score -= targetLen - searchLen
|
||||
prepared.score = score
|
||||
prepared.indexes = new Array(matchesBestLen); for(var i = matchesBestLen - 1; i >= 0; --i) prepared.indexes[i] = matchesBest[i]
|
||||
|
||||
return prepared
|
||||
}
|
||||
},
|
||||
|
||||
prepareLowerCodes: function(str) {
|
||||
var strLen = str.length
|
||||
var lowerCodes = [] // new Array(strLen) sparse array is too slow
|
||||
var lower = str.toLowerCase()
|
||||
for(var i = 0; i < strLen; ++i) lowerCodes[i] = lower.charCodeAt(i)
|
||||
return lowerCodes
|
||||
},
|
||||
prepareBeginningIndexes: function(target) {
|
||||
var targetLen = target.length
|
||||
var beginningIndexes = []; var beginningIndexesLen = 0
|
||||
var wasUpper = false
|
||||
var wasAlphanum = false
|
||||
for(var i = 0; i < targetLen; ++i) {
|
||||
var targetCode = target.charCodeAt(i)
|
||||
var isUpper = targetCode>=65&&targetCode<=90
|
||||
var isAlphanum = isUpper || targetCode>=97&&targetCode<=122 || targetCode>=48&&targetCode<=57
|
||||
var isBeginning = isUpper && !wasUpper || !wasAlphanum || !isAlphanum
|
||||
wasUpper = isUpper
|
||||
wasAlphanum = isAlphanum
|
||||
if(isBeginning) beginningIndexes[beginningIndexesLen++] = i
|
||||
}
|
||||
return beginningIndexes
|
||||
},
|
||||
prepareNextBeginningIndexes: function(target) {
|
||||
var targetLen = target.length
|
||||
var beginningIndexes = fuzzysort.prepareBeginningIndexes(target)
|
||||
var nextBeginningIndexes = [] // new Array(targetLen) sparse array is too slow
|
||||
var lastIsBeginning = beginningIndexes[0]
|
||||
var lastIsBeginningI = 0
|
||||
for(var i = 0; i < targetLen; ++i) {
|
||||
if(lastIsBeginning > i) {
|
||||
nextBeginningIndexes[i] = lastIsBeginning
|
||||
} else {
|
||||
lastIsBeginning = beginningIndexes[++lastIsBeginningI]
|
||||
nextBeginningIndexes[i] = lastIsBeginning===undefined ? targetLen : lastIsBeginning
|
||||
}
|
||||
}
|
||||
return nextBeginningIndexes
|
||||
},
|
||||
|
||||
cleanup: cleanup,
|
||||
new: fuzzysortNew,
|
||||
}
|
||||
return fuzzysort
|
||||
} // fuzzysortNew
|
||||
|
||||
// This stuff is outside fuzzysortNew, because it's shared with instances of fuzzysort.new()
|
||||
var isNode = typeof require !== 'undefined' && typeof window === 'undefined'
|
||||
// var MAX_INT = Number.MAX_SAFE_INTEGER
|
||||
// var MIN_INT = Number.MIN_VALUE
|
||||
var preparedCache = new Map()
|
||||
var preparedSearchCache = new Map()
|
||||
var noResults = []; noResults.total = 0
|
||||
var matchesSimple = []; var matchesStrict = []
|
||||
function cleanup() { preparedCache.clear(); preparedSearchCache.clear(); matchesSimple = []; matchesStrict = [] }
|
||||
function defaultScoreFn(a) {
|
||||
var max = -9007199254740991
|
||||
for (var i = a.length - 1; i >= 0; --i) {
|
||||
var result = a[i]; if(result === null) continue
|
||||
var score = result.score
|
||||
if(score > max) max = score
|
||||
}
|
||||
if(max === -9007199254740991) return null
|
||||
return max
|
||||
}
|
||||
|
||||
// prop = 'key' 2.5ms optimized for this case, seems to be about as fast as direct obj[prop]
|
||||
// prop = 'key1.key2' 10ms
|
||||
// prop = ['key1', 'key2'] 27ms
|
||||
function getValue(obj, prop) {
|
||||
var tmp = obj[prop]; if(tmp !== undefined) return tmp
|
||||
var segs = prop
|
||||
if(!Array.isArray(prop)) segs = prop.split('.')
|
||||
var len = segs.length
|
||||
var i = -1
|
||||
while (obj && (++i < len)) obj = obj[segs[i]]
|
||||
return obj
|
||||
}
|
||||
|
||||
function isObj(x) { return typeof x === 'object' } // faster as a function
|
||||
|
||||
// Hacked version of https://github.com/lemire/FastPriorityQueue.js
|
||||
var fastpriorityqueue=function(){var r=[],o=0,e={};function n(){for(var e=0,n=r[e],c=1;c<o;){var f=c+1;e=c,f<o&&r[f].score<r[c].score&&(e=f),r[e-1>>1]=r[e],c=1+(e<<1)}for(var a=e-1>>1;e>0&&n.score<r[a].score;a=(e=a)-1>>1)r[e]=r[a];r[e]=n}return e.add=function(e){var n=o;r[o++]=e;for(var c=n-1>>1;n>0&&e.score<r[c].score;c=(n=c)-1>>1)r[n]=r[c];r[n]=e},e.poll=function(){if(0!==o){var e=r[0];return r[0]=r[--o],n(),e}},e.peek=function(e){if(0!==o)return r[0]},e.replaceTop=function(o){r[0]=o,n()},e};
|
||||
var q = fastpriorityqueue() // reuse this, except for async, it needs to make its own
|
||||
|
||||
return fuzzysortNew()
|
||||
}) // UMD
|
||||
|
||||
// TODO: (performance) wasm version!?
|
||||
|
||||
// TODO: (performance) layout memory in an optimal way to go fast by avoiding cache misses
|
||||
|
||||
// TODO: (performance) preparedCache is a memory leak
|
||||
|
||||
// TODO: (like sublime) backslash === forwardslash
|
||||
|
||||
// TODO: (performance) i have no idea how well optizmied the allowing typos algorithm is
|
|
@ -0,0 +1,111 @@
|
|||
|
||||
.CodeMirror-merge {
|
||||
position: relative;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.CodeMirror-merge, .CodeMirror-merge .CodeMirror {
|
||||
min-height:50px;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 48%; }
|
||||
.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 4%; }
|
||||
.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }
|
||||
.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }
|
||||
|
||||
.CodeMirror-merge-pane {
|
||||
display: inline-block;
|
||||
white-space: normal;
|
||||
vertical-align: top;
|
||||
}
|
||||
.CodeMirror-merge-pane-rightmost {
|
||||
position: absolute;
|
||||
right: 0px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-gap {
|
||||
z-index: 2;
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
background: #515151;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-scrolllock-wrap {
|
||||
position: absolute;
|
||||
bottom: 0; left: 50%;
|
||||
}
|
||||
.CodeMirror-merge-scrolllock {
|
||||
position: relative;
|
||||
left: -50%;
|
||||
cursor: pointer;
|
||||
color: #d8d8d8;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {
|
||||
position: absolute;
|
||||
left: 0; top: 0;
|
||||
right: 0; bottom: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copy {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
color: #ce374b;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copy-reverse {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
color: #44c;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
|
||||
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }
|
||||
|
||||
.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);
|
||||
background-position: bottom left;
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);
|
||||
background-position: bottom left;
|
||||
background-repeat: repeat-x;
|
||||
}
|
||||
|
||||
.CodeMirror-merge-r-chunk { background: #9a6868; }
|
||||
.CodeMirror-merge-r-chunk-start { /*border-top: 1px solid #ee8; */}
|
||||
.CodeMirror-merge-r-chunk-end {/* border-bottom: 1px solid #ee8; */}
|
||||
.CodeMirror-merge-r-connect { fill:#9a6868;}
|
||||
|
||||
.CodeMirror-merge-l-chunk { background: #eef; }
|
||||
.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }
|
||||
.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }
|
||||
.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }
|
||||
|
||||
.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }
|
||||
.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }
|
||||
.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }
|
||||
|
||||
.CodeMirror-merge-collapsed-widget:before {
|
||||
content: "(...)";
|
||||
}
|
||||
.CodeMirror-merge-collapsed-widget {
|
||||
cursor: pointer;
|
||||
color: #88b;
|
||||
background: #eef;
|
||||
border: 1px solid #ddf;
|
||||
font-size: 90%;
|
||||
padding: 0 3px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; }
|