Browse Source

微商城,机构信息

zhengchengwu 5 years ago
parent
commit
404f6a696b
100 changed files with 7525 additions and 55 deletions
  1. 8 1
      config/dev.env.js
  2. 2 2
      config/index.js
  3. 8 1
      config/prod.env.js
  4. 8 1
      config/sit.env.js
  5. 7 1
      index.html
  6. 23 8
      package-lock.json
  7. 9 0
      src/api/district.js
  8. 9 0
      src/api/fxlink.js
  9. 32 0
      src/api/org/orginfo.js
  10. 80 0
      src/components/Neditor/index.vue
  11. 25 1
      src/router/index.js
  12. 2 2
      src/store/getters.js
  13. 2 2
      src/store/index.js
  14. 0 0
      src/store/modules/data.js.txt
  15. 55 1
      src/store/modules/xt_user.js
  16. 49 16
      src/views/layout/components/Navbar.vue
  17. 15 2
      src/wsc_pages/distribution/index.vue
  18. 15 2
      src/wsc_pages/home/index.vue
  19. 17 0
      src/wsc_pages/index/index.vue
  20. 35 0
      src/wsc_pages/index/verify_token.vue
  21. 604 0
      src/wsc_pages/org/orginfo.vue
  22. 16 2
      src/wsc_pages/personal/index.vue
  23. 13 13
      src/xt_permission.js
  24. 168 0
      static/neditor/README.md
  25. 40 0
      static/neditor/dialogs/anchor/anchor.html
  26. 682 0
      static/neditor/dialogs/attachment/attachment.css
  27. 60 0
      static/neditor/dialogs/attachment/attachment.html
  28. 775 0
      static/neditor/dialogs/attachment/attachment.js
  29. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_chm.gif
  30. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_default.png
  31. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_doc.gif
  32. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_exe.gif
  33. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_jpg.gif
  34. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_mp3.gif
  35. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_mv.gif
  36. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_pdf.gif
  37. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_ppt.gif
  38. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_psd.gif
  39. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_rar.gif
  40. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_txt.gif
  41. BIN
      static/neditor/dialogs/attachment/fileTypeImages/icon_xls.gif
  42. BIN
      static/neditor/dialogs/attachment/images/alignicon.gif
  43. BIN
      static/neditor/dialogs/attachment/images/alignicon.png
  44. BIN
      static/neditor/dialogs/attachment/images/bg.png
  45. BIN
      static/neditor/dialogs/attachment/images/file-icons.gif
  46. BIN
      static/neditor/dialogs/attachment/images/file-icons.png
  47. BIN
      static/neditor/dialogs/attachment/images/icons.gif
  48. BIN
      static/neditor/dialogs/attachment/images/icons.png
  49. BIN
      static/neditor/dialogs/attachment/images/image.png
  50. BIN
      static/neditor/dialogs/attachment/images/progress.png
  51. BIN
      static/neditor/dialogs/attachment/images/success.gif
  52. BIN
      static/neditor/dialogs/attachment/images/success.png
  53. 97 0
      static/neditor/dialogs/background/background.css
  54. 56 0
      static/neditor/dialogs/background/background.html
  55. 376 0
      static/neditor/dialogs/background/background.js
  56. BIN
      static/neditor/dialogs/background/images/bg.png
  57. BIN
      static/neditor/dialogs/background/images/success.png
  58. 65 0
      static/neditor/dialogs/charts/chart.config.js
  59. 165 0
      static/neditor/dialogs/charts/charts.css
  60. 89 0
      static/neditor/dialogs/charts/charts.html
  61. 519 0
      static/neditor/dialogs/charts/charts.js
  62. BIN
      static/neditor/dialogs/charts/images/charts0.png
  63. BIN
      static/neditor/dialogs/charts/images/charts1.png
  64. BIN
      static/neditor/dialogs/charts/images/charts2.png
  65. BIN
      static/neditor/dialogs/charts/images/charts3.png
  66. BIN
      static/neditor/dialogs/charts/images/charts4.png
  67. BIN
      static/neditor/dialogs/charts/images/charts5.png
  68. 43 0
      static/neditor/dialogs/emotion/emotion.css
  69. 54 0
      static/neditor/dialogs/emotion/emotion.html
  70. 186 0
      static/neditor/dialogs/emotion/emotion.js
  71. BIN
      static/neditor/dialogs/emotion/images/0.gif
  72. BIN
      static/neditor/dialogs/emotion/images/bface.gif
  73. BIN
      static/neditor/dialogs/emotion/images/cface.gif
  74. BIN
      static/neditor/dialogs/emotion/images/fface.gif
  75. BIN
      static/neditor/dialogs/emotion/images/jxface2.gif
  76. BIN
      static/neditor/dialogs/emotion/images/neweditor-tab-bg.png
  77. BIN
      static/neditor/dialogs/emotion/images/tface.gif
  78. BIN
      static/neditor/dialogs/emotion/images/wface.gif
  79. BIN
      static/neditor/dialogs/emotion/images/yface.gif
  80. 272 0
      static/neditor/dialogs/fonts/buttoniconex.css
  81. BIN
      static/neditor/dialogs/fonts/iconfont.eot
  82. 398 0
      static/neditor/dialogs/fonts/iconfont.svg
  83. BIN
      static/neditor/dialogs/fonts/iconfont.ttf
  84. BIN
      static/neditor/dialogs/fonts/iconfont.woff
  85. 1 0
      static/neditor/dialogs/fonts/images/addfile.svg
  86. 1 0
      static/neditor/dialogs/fonts/images/selected.svg
  87. 106 0
      static/neditor/dialogs/gmap/gmap.html
  88. 7 0
      static/neditor/dialogs/help/help.css
  89. 82 0
      static/neditor/dialogs/help/help.html
  90. 56 0
      static/neditor/dialogs/help/help.js
  91. 936 0
      static/neditor/dialogs/image/image.css
  92. 127 0
      static/neditor/dialogs/image/image.html
  93. 1130 0
      static/neditor/dialogs/image/image.js
  94. BIN
      static/neditor/dialogs/image/images/alignicon.jpg
  95. BIN
      static/neditor/dialogs/image/images/bg.png
  96. BIN
      static/neditor/dialogs/image/images/icons.gif
  97. BIN
      static/neditor/dialogs/image/images/icons.png
  98. BIN
      static/neditor/dialogs/image/images/image.png
  99. BIN
      static/neditor/dialogs/image/images/progress.png
  100. 0 0
      static/neditor/dialogs/image/images/success.gif

+ 8 - 1
config/dev.env.js View File

@@ -6,5 +6,12 @@
6 6
 module.exports = {
7 7
   NODE_ENV: '"development"',
8 8
   ENV_CONFIG: '"dev"',
9
-  BASE_API: '"http://112.74.16.180:9527"',//'"http://localhost:9529"', // //http://api.xt.test.sgjyun.com http://112.74.16.180:9527
9
+  BASE_API: '"http://api.mall.test.sgjyun.com"',//'"http://localhost:9529"', // //http://api.mall.test.sgjyun.com http://112.74.16.180:9527
10
+
11
+  
12
+  SSO_HOST: '"http://testsso.sgjyun.com"',
13
+  SRCM_HOST: '"http://test1.sgjyun.com"',
14
+  XT_HOST: '"http://xt.test.sgjyun.com"',
15
+  MIRCO_MALL_HOST: '"http://mall.test.sgjyun.com"',
16
+  CDM_HOST: '"http://cdm.test.sgjyun.com"',
10 17
 }

+ 2 - 2
config/index.js View File

@@ -19,8 +19,8 @@ module.exports = {
19 19
 
20 20
     // host: 'xt.test.sgjyun.com',
21 21
     // host: 'xt.kuyicloud.com',
22
-    host: 'localhost',
23
-    port:9528, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
22
+    host: 'mall.test.sgjyun.com',
23
+    port:9530, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
24 24
     autoOpenBrowser: true,
25 25
     errorOverlay: true,
26 26
     notifyOnErrors: false,

+ 8 - 1
config/prod.env.js View File

@@ -1,5 +1,12 @@
1 1
 module.exports = {
2 2
   NODE_ENV: '"production"',
3 3
   ENV_CONFIG: '"prod"',
4
-  BASE_API: '"http://api.xt.kuyicloud.com"'
4
+  BASE_API: '"http://api.mall.kuyicloud.com"',
5
+
6
+  
7
+  SSO_HOST: '"http://sso.kuyicloud.com"',
8
+  SRCM_HOST: '"http://jk.kuyicloud.com"',
9
+  XT_HOST: '"http://xt.kuyicloud.com"',
10
+  MIRCO_MALL_HOST: '"http://mall.kuyicloud.com"',
11
+  CDM_HOST: '"http://cdm.kuyicloud.com"',
5 12
 }

+ 8 - 1
config/sit.env.js View File

@@ -1,5 +1,12 @@
1 1
 module.exports = {
2 2
   NODE_ENV: '"production"',
3 3
   ENV_CONFIG: '"sit"',
4
-  BASE_API: '"http://api.xt.test.sgjyun.com"'
4
+  BASE_API: '"http://api.mall.test.sgjyun.com"',
5
+
6
+  
7
+  SSO_HOST: '"http://testsso.sgjyun.com"',
8
+  SRCM_HOST: '"http://test1.sgjyun.com"',
9
+  XT_HOST: '"http://xt.test.sgjyun.com"',
10
+  MIRCO_MALL_HOST: '"http://mall.test.sgjyun.com"',
11
+  CDM_HOST: '"http://cdm.test.sgjyun.com"',
5 12
 }

+ 7 - 1
index.html View File

@@ -8,7 +8,13 @@
8 8
     <title>分销商城-酷医云</title>
9 9
   </head>
10 10
   <body>
11
-    <script src=<%= htmlWebpackPlugin.options.path %>/tinymce4.7.5/tinymce.min.js></script>
11
+    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
12
+    <script src="<%= htmlWebpackPlugin.options.path %>/tinymce4.7.5/tinymce.min.js"></script>
13
+  <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.config.js"></script>
14
+  <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.all.min.js"></script>
15
+  <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.service.js"></script>
16
+  <script src="<%= htmlWebpackPlugin.options.path %>/neditor/i18n/zh-cn/zh-cn.js"></script>
17
+  <script src="<%= htmlWebpackPlugin.options.path %>/neditor/neditor.parse.min.js"></script>
12 18
     <div id="app"></div>
13 19
     <!-- built files will be auto injected -->
14 20
   </body>

+ 23 - 8
package-lock.json View File

@@ -4751,12 +4751,14 @@
4751 4751
         "balanced-match": {
4752 4752
           "version": "1.0.0",
4753 4753
           "bundled": true,
4754
-          "dev": true
4754
+          "dev": true,
4755
+          "optional": true
4755 4756
         },
4756 4757
         "brace-expansion": {
4757 4758
           "version": "1.1.11",
4758 4759
           "bundled": true,
4759 4760
           "dev": true,
4761
+          "optional": true,
4760 4762
           "requires": {
4761 4763
             "balanced-match": "^1.0.0",
4762 4764
             "concat-map": "0.0.1"
@@ -4771,17 +4773,20 @@
4771 4773
         "code-point-at": {
4772 4774
           "version": "1.1.0",
4773 4775
           "bundled": true,
4774
-          "dev": true
4776
+          "dev": true,
4777
+          "optional": true
4775 4778
         },
4776 4779
         "concat-map": {
4777 4780
           "version": "0.0.1",
4778 4781
           "bundled": true,
4779
-          "dev": true
4782
+          "dev": true,
4783
+          "optional": true
4780 4784
         },
4781 4785
         "console-control-strings": {
4782 4786
           "version": "1.1.0",
4783 4787
           "bundled": true,
4784
-          "dev": true
4788
+          "dev": true,
4789
+          "optional": true
4785 4790
         },
4786 4791
         "core-util-is": {
4787 4792
           "version": "1.0.2",
@@ -4898,7 +4903,8 @@
4898 4903
         "inherits": {
4899 4904
           "version": "2.0.3",
4900 4905
           "bundled": true,
4901
-          "dev": true
4906
+          "dev": true,
4907
+          "optional": true
4902 4908
         },
4903 4909
         "ini": {
4904 4910
           "version": "1.3.5",
@@ -4910,6 +4916,7 @@
4910 4916
           "version": "1.0.0",
4911 4917
           "bundled": true,
4912 4918
           "dev": true,
4919
+          "optional": true,
4913 4920
           "requires": {
4914 4921
             "number-is-nan": "^1.0.0"
4915 4922
           }
@@ -4924,6 +4931,7 @@
4924 4931
           "version": "3.0.4",
4925 4932
           "bundled": true,
4926 4933
           "dev": true,
4934
+          "optional": true,
4927 4935
           "requires": {
4928 4936
             "brace-expansion": "^1.1.7"
4929 4937
           }
@@ -4931,12 +4939,14 @@
4931 4939
         "minimist": {
4932 4940
           "version": "0.0.8",
4933 4941
           "bundled": true,
4934
-          "dev": true
4942
+          "dev": true,
4943
+          "optional": true
4935 4944
         },
4936 4945
         "minipass": {
4937 4946
           "version": "2.3.5",
4938 4947
           "bundled": true,
4939 4948
           "dev": true,
4949
+          "optional": true,
4940 4950
           "requires": {
4941 4951
             "safe-buffer": "^5.1.2",
4942 4952
             "yallist": "^3.0.0"
@@ -4955,6 +4965,7 @@
4955 4965
           "version": "0.5.1",
4956 4966
           "bundled": true,
4957 4967
           "dev": true,
4968
+          "optional": true,
4958 4969
           "requires": {
4959 4970
             "minimist": "0.0.8"
4960 4971
           }
@@ -5035,7 +5046,8 @@
5035 5046
         "number-is-nan": {
5036 5047
           "version": "1.0.1",
5037 5048
           "bundled": true,
5038
-          "dev": true
5049
+          "dev": true,
5050
+          "optional": true
5039 5051
         },
5040 5052
         "object-assign": {
5041 5053
           "version": "4.1.1",
@@ -5047,6 +5059,7 @@
5047 5059
           "version": "1.4.0",
5048 5060
           "bundled": true,
5049 5061
           "dev": true,
5062
+          "optional": true,
5050 5063
           "requires": {
5051 5064
             "wrappy": "1"
5052 5065
           }
@@ -5168,6 +5181,7 @@
5168 5181
           "version": "1.0.2",
5169 5182
           "bundled": true,
5170 5183
           "dev": true,
5184
+          "optional": true,
5171 5185
           "requires": {
5172 5186
             "code-point-at": "^1.0.0",
5173 5187
             "is-fullwidth-code-point": "^1.0.0",
@@ -6543,7 +6557,8 @@
6543 6557
     },
6544 6558
     "js-yaml": {
6545 6559
       "version": "3.7.0",
6546
-      "resolved": "",
6560
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
6561
+      "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
6547 6562
       "dev": true,
6548 6563
       "requires": {
6549 6564
         "argparse": "^1.0.7",

+ 9 - 0
src/api/district.js View File

@@ -0,0 +1,9 @@
1
+import request from '@/utils/request'
2
+
3
+export function GetDistrictsByUpid(params){
4
+    return request({
5
+        url:'/api/district/getdistrictsbyupid',
6
+        method:'get',
7
+        params: params
8
+    })
9
+}

+ 9 - 0
src/api/fxlink.js View File

@@ -0,0 +1,9 @@
1
+import request from '@/utils/request'
2
+
3
+export function GetFxlink(params){
4
+    return request({
5
+        url:'/api/getfxlink',
6
+        method:'get',
7
+        params: params
8
+    })
9
+}

+ 32 - 0
src/api/org/orginfo.js View File

@@ -0,0 +1,32 @@
1
+import request from '@/utils/request'
2
+
3
+export function GetOrgInfo(){
4
+    return request({
5
+        url:'/api/orginfo/getinfo',
6
+        method:'get',
7
+    })
8
+}
9
+
10
+export function SaveOrgGallery(data){
11
+    return request({
12
+        url:'/api/orginfo/savegallery',
13
+        method:'Post',
14
+        data:data,
15
+    })
16
+}
17
+
18
+export function EditOrgInfo(data){
19
+    return request({
20
+        url:'/api/orginfo/edit',
21
+        method:'Post',
22
+        data:data,
23
+    })
24
+}
25
+
26
+export function DeleteOrgGallery(id){
27
+    return request({
28
+        url:'/api/orginfo/deletegallery',
29
+        method:'delete',
30
+        params:{id:id},
31
+    })
32
+}

+ 80 - 0
src/components/Neditor/index.vue View File

@@ -0,0 +1,80 @@
1
+<template>
2
+    <div>
3
+        <div :id="this.id"></div>
4
+    </div>
5
+</template>
6
+
7
+<script>
8
+
9
+
10
+export default {
11
+    name:"Neditor",
12
+    props: ['id','r_content'],
13
+    data() {
14
+        return {
15
+            ue: '', //ueditor实例
16
+            content: '', //编辑器内容
17
+        }
18
+    },
19
+    methods: {
20
+        //初始化编辑器
21
+        initEditor() {
22
+            this.ue = UE.getEditor(this.id, {
23
+                initialFrameWidth: '100%',
24
+                initialFrameHeight: '350',
25
+                topOffset:'110',
26
+                // scaleEnabled: true,
27
+            })
28
+            //编辑器准备就绪后会触发该事件
29
+            this.ue.addListener('ready',()=>{
30
+                //设置可以编辑
31
+                this.ue.setEnabled()
32
+                this.ue.setContent(this.r_content)
33
+            })
34
+            //编辑器内容修改时
35
+            this.selectionchange()
36
+        },
37
+        
38
+        //编辑器内容修改时
39
+        selectionchange() {
40
+            this.ue.addListener('selectionchange', () => {
41
+                this.content = this.ue.getContent()
42
+            })
43
+        },
44
+
45
+    },
46
+
47
+    activated() {
48
+        //初始化编辑器
49
+        this.initEditor()
50
+    },
51
+    deactivated() {
52
+        //销毁编辑器实例,使用textarea代替
53
+        this.ue.destroy()
54
+        //重置编辑器,可用来做多个tab使用同一个编辑器实例
55
+        //this.ue.reset()
56
+        //如果要使用同一个实例,请注释destroy()方法
57
+    },
58
+
59
+    computed:{
60
+        // 利用计算属性返回prop里传过来的内容
61
+        revecive:function(){
62
+            return this.r_content
63
+        }
64
+    },
65
+
66
+    watch:{
67
+        // !!! 这里需要注意,需要一个watch来实时更新编辑器的内容
68
+        revecive:function(){
69
+            this.ue.setContent(this.r_content)
70
+        }
71
+    }
72
+}
73
+</script>
74
+
75
+
76
+<style>
77
+  .edui-editor {
78
+      z-index: 60 !important;
79
+  }
80
+</style>

+ 25 - 1
src/router/index.js View File

@@ -26,7 +26,7 @@ import Layout from '@/views/layout/Layout'
26 26
 **/
27 27
 export const xt_constantRouterMap = [
28 28
   // { path: '/login', component: () => import('@/views/login/index'), hidden: true },
29
-  // { path: '/token/verify', component: () => import('@/wsc_pages/index/verify_token'), hidden: true },
29
+  { path: '/token/verify', component: () => import('@/wsc_pages/index/verify_token'), hidden: true },
30 30
   { path: '/404', component: () => import('@/views/errorPage/404'), hidden: true },
31 31
   { path: '/401', component: () => import('@/views/errorPage/401'), hidden: true },
32 32
   {
@@ -61,6 +61,30 @@ export const xt_constantRouterMap = [
61 61
       name: 'personal',
62 62
       meta: { title: 'personal', icon: 'personal', noCache: true }
63 63
     }]
64
+  }, 
65
+  {
66
+    path: '/orginfo',
67
+    component: Layout,
68
+    hidden: true,
69
+    is_menu: false,
70
+    meta: {
71
+        title: 'orginfo',
72
+        icon: 'shebei'
73
+    },
74
+    children: [
75
+        {
76
+            path: '/orginfo',
77
+            component: () => import('@/wsc_pages/org/orginfo'),
78
+            hidden: true,
79
+            is_menu: false,
80
+            name: 'orginfo',
81
+            meta: {
82
+                title: '机构信息',
83
+                icon: 'shebei',
84
+                noCache: true
85
+            }
86
+        }
87
+    ]
64 88
   }
65 89
 ]
66 90
 

+ 2 - 2
src/store/getters.js View File

@@ -15,8 +15,8 @@ const getters = {
15 15
   permission_routers: state => state.xt_permission.routers,
16 16
   addRouters: state => state.xt_permission.addRouters,
17 17
   errorLogs: state => state.errorLog.logs,
18
-  data: state => state.data,
19
-  configlist: state => state.data.configlist,
18
+  // data: state => state.data,
19
+  // configlist: state => state.data.configlist,
20 20
 
21 21
   xt_permission: state => state.xt_permission,
22 22
   xt_user: state => state.xt_user,

+ 2 - 2
src/store/index.js View File

@@ -11,7 +11,7 @@ import xt_role_temps from './modules/role_temps'
11 11
 import global_config from './modules/globalConfig'
12 12
 
13 13
 import getters from './getters'
14
-import data from './modules/data'
14
+// import data from './modules/data'
15 15
 import temp_params from './modules/temp_params'
16 16
 
17 17
 Vue.use(Vuex)
@@ -24,7 +24,7 @@ const store = new Vuex.Store({
24 24
     tagsView,
25 25
     user,
26 26
     xt_user,
27
-    data,
27
+    // data,
28 28
     xt_permission,
29 29
     xt_role_temps,
30 30
     global_config,

src/store/modules/data.js → src/store/modules/data.js.txt View File


+ 55 - 1
src/store/modules/xt_user.js View File

@@ -36,6 +36,10 @@ const xt_user = {
36 36
       patients:20, //患者数
37 37
     },
38 38
 
39
+    xt_role_exist: false,
40
+    scrm_role_exist: false,
41
+    cdm_role_exist: false,
42
+    mall_role_exist: false,
39 43
     // 示例: ['', '',]
40 44
     urlfors: []
41 45
   },
@@ -68,6 +72,12 @@ const xt_user = {
68 72
       state.subscibe.period_start = cur_info.subscibe.period_start
69 73
       state.subscibe.period_end = cur_info.subscibe.period_end
70 74
       state.subscibe.state = cur_info.subscibe.state
75
+
76
+      
77
+      state.scrm_role_exist = cur_info.scrm_role_exist
78
+      state.cdm_role_exist = cur_info.cdm_role_exist
79
+      state.mall_role_exist = cur_info.mall_role_exist
80
+      state.xt_role_exist = cur_info.xt_role_exist
71 81
     },
72 82
 
73 83
     SET_URLFORS: (state, payload) => {
@@ -78,6 +88,10 @@ const xt_user = {
78 88
       state.user.user_name = payload.user_name
79 89
       state.user.avatar = payload.avatar
80 90
     },
91
+    MODIFY_ORG_INFO:(state, payload) => {
92
+      state.org.org_name = payload.org_name
93
+      state.org.org_short_name = payload.org_short_name
94
+    },
81 95
 
82 96
     SET_SUBSCIBE_PATIENT:(state)=>{
83 97
       state.subscibe.patients += 1;
@@ -109,6 +123,11 @@ const xt_user = {
109 123
       state.subscibe.period_end = 0
110 124
       state.subscibe.state = 3
111 125
       state.subscibe.patients = 0
126
+      
127
+      state.scrm_role_exist = false
128
+      state.cdm_role_exist = false
129
+      state.mall_role_exist = false
130
+      state.xt_role_exist = false
112 131
 
113 132
       state.urlfors = []
114 133
     }
@@ -139,6 +158,10 @@ const xt_user = {
139 158
             cur_app_id: infoJSON.current_app_id,
140 159
             org: infoJSON.org,
141 160
             subscibe: infoJSON.subscibe,
161
+            scrm_role_exist: infoJSON.scrm_role_exist,
162
+            cdm_role_exist: infoJSON.cdm_role_exist,
163
+            mall_role_exist: infoJSON.mall_role_exist,
164
+            xt_role_exist:infoJSON.xt_role_exist,
142 165
           })
143 166
 
144 167
           commit('SET_URLFORS', {
@@ -156,7 +179,11 @@ const xt_user = {
156 179
                 cur_org_id: data.current_org_id,
157 180
                 cur_app_id: data.current_app_id,
158 181
                 org: data.org,
159
-                subscibe: data.subscibe
182
+                subscibe: data.subscibe,
183
+                scrm_role_exist: data.scrm_role_exist,
184
+                cdm_role_exist: data.cdm_role_exist,
185
+                mall_role_exist: data.mall_role_exist,
186
+                xt_role_exist: data.xt_role_exist,
160 187
               })
161 188
 
162 189
               this.commit('SET_URLFORS', {
@@ -184,6 +211,33 @@ const xt_user = {
184 211
           current_app_id: state.app_id, 
185 212
           urlfors: state.urlfors,
186 213
           subscibe: state.subscibe,
214
+          scrm_role_exist: state.scrm_role_exist,
215
+          cdm_role_exist: state.cdm_role_exist,
216
+          mall_role_exist: state.mall_role_exist,
217
+          xt_role_exist: state.xt_role_exist,
218
+        })
219
+      )
220
+    },
221
+    ModifyOrgInfo({
222
+      commit,
223
+      state
224
+    }, params) {
225
+      commit('MODIFY_ORG_INFO', {
226
+        org_name: params.org_name,
227
+        org_short_name: params.org_short_name
228
+      })
229
+      cacheAdminUserInfo(
230
+        JSON.stringify({
231
+          user: state.user,
232
+          org: state.org,
233
+          current_org_id: state.org_id,
234
+          current_app_id: state.app_id,
235
+          urlfors: state.urlfors,
236
+          subscibe: state.subscibe,
237
+          scrm_role_exist: state.scrm_role_exist,
238
+          cdm_role_exist: state.cdm_role_exist,
239
+          mall_role_exist: state.mall_role_exist,
240
+          xt_role_exist:state.xt_role_exist,
187 241
         })
188 242
       )
189 243
     },

+ 49 - 16
src/views/layout/components/Navbar.vue View File

@@ -11,54 +11,54 @@
11 11
         </span>
12 12
         <!-- </el-dropdown> -->
13 13
       </div>
14
-      <div class="system-nav">
14
+      <div class="system-nav" v-if="this.$store.getters.xt_user.xt_role_exist">
15 15
         <div class="system-nav-menu ">
16
-          <a>
16
+          <a :href="XTWebsit()">
17 17
             <span><i class="icon iconfont icon-jiankangshuidi"></i> 血透管理</span>
18 18
           </a>
19 19
         </div>
20
-        <div class="system-nav-menu">
21
-          <a href="http://cdm.kuyicloud.com/">
20
+        <div class="system-nav-menu" v-if="this.$store.getters.xt_user.cdm_role_exist">
21
+          <a :href="CDMWebsit()">
22 22
           <!-- <a href=" http://cdm.test.sgjyun.com/"> -->
23 23
             <span><i class="icon iconfont icon-manbing-xuanzhong"></i> 慢病管理</span>
24 24
           </a>
25 25
         </div>
26
-         <div class="system-nav-menu">
27
-          <a  href="http://jk.kuyicloud.com/">
28
-          <!-- <a href="http://test1.sgjyun.com/"> -->
26
+         <div class="system-nav-menu" v-if="this.$store.getters.xt_user.scrm_role_exist">
27
+          <a :href="SCRMWebsit()">
29 28
             <span><i class="iconfont icon-pengyou"></i> SCRM</span>
30 29
           </a>
31 30
         </div>
32 31
         <div class="system-nav-menu active">
33
-          <a href="http://mall.kuyicloud.com/">
34
-          <!-- <a href="http://mall.test.sgjyun.com/"> -->
32
+          <a >
35 33
             <span><i class="icon iconfont icon-service_fill"></i> 微商城</span>
36 34
           </a>
37 35
         </div>
38 36
         <div class="system-nav-menu">
39
-          <a href="http://sso.kuyicloud.com/org/app/create">
40
-          <!-- <a href="http://testsso.sgjyun.com/org/app/create"> -->
37
+          <a :href="APPManageWebsit()">
41 38
             <span><i class="icon iconfont icon-suoyou"></i> 应用</span>
42 39
           </a>
43 40
         </div>
44 41
       </div>
45 42
 
46 43
       <div class="right-menu">
47
-        <el-dropdown class="avatar-container right-menu-item" trigger="click">
44
+        <el-dropdown class="avatar-container right-menu-item" trigger="click"   @command="handleCommand">
48 45
           <div class="avatar-wrapper">
49 46
             <img class="user-avatar" :src="avater">
50 47
             <span class="user-title">{{ this.$store.getters.xt_user.user.user_name }}</span>
51 48
             <i class="el-icon-caret-bottom"></i>
52 49
           </div>
53 50
           <el-dropdown-menu slot="dropdown">
54
-            <el-dropdown-item>
55
-              <span @click="modifyUserInfoAction">修改个人信息</span>
51
+            <el-dropdown-item command="modifyUserInfoAction">
52
+              修改个人信息
56 53
             </el-dropdown-item>
54
+            <el-dropdown-item command="modifyOrgInfoAction">
55
+              机构信息
56
+            </el-dropdown-item >
57 57
             <!-- <el-dropdown-item divided>
58 58
               <span @click="myServe">我的服务</span>
59 59
             </el-dropdown-item> -->
60
-            <el-dropdown-item divided>
61
-              <span @click="logout" style="display:block;">{{$t('navbar.logOut')}}</span>
60
+            <el-dropdown-item  divided command="logout">
61
+              {{$t('navbar.logOut')}}
62 62
             </el-dropdown-item>
63 63
           </el-dropdown-menu>
64 64
         </el-dropdown>
@@ -103,10 +103,43 @@
103 103
       // toggleSideBar() {
104 104
       //   this.$store.dispatch("toggleSideBar");
105 105
       // },
106
+      XTWebsit(){
107
+        return process.env.XT_HOST
108
+      },
109
+      SCRMWebsit() {
110
+        return process.env.SRCM_HOST
111
+      },
112
+      MircoMallWebsit() {
113
+        return process.env.MIRCO_MALL_HOST
114
+      },
115
+      CDMWebsit() {
116
+        return process.env.CDM_HOST
117
+      },
118
+      APPManageWebsit() {
119
+        return process.env.SSO_HOST + '/org/admin/apps?org=' + this.$store.getters.xt_user.org_id
120
+      },
121
+      handleCommand(command){
122
+        switch (command) {
123
+          case 'modifyUserInfoAction':
124
+            this.modifyUserInfoAction();
125
+            break;
126
+          case 'modifyOrgInfoAction':
127
+            this.modifyOrgInfoAction();
128
+            break;
129
+          case 'logout':
130
+            this.logout();
131
+            break;
132
+        }
133
+      },
106 134
       logout() {
107 135
         this.$store.dispatch('FrontendLogout')
108 136
         window.location.href = process.env.BASE_API + '/logout'
109 137
       },
138
+      modifyOrgInfoAction() {
139
+        // this.$refs.modify_org_info_dialog.show()
140
+        this.$router.push('/orginfo')
141
+        return false
142
+      },
110 143
       modifyUserInfoAction() {
111 144
         this.$refs.modify_user_info_dialog.show()
112 145
       },

+ 15 - 2
src/wsc_pages/distribution/index.vue View File

@@ -7,14 +7,27 @@
7 7
 </template>
8 8
 
9 9
 <script>
10
+import { GetFxlink } from '@/api/fxlink';
10 11
 export default {
11 12
   name: "distribution",
12 13
   data() {
13 14
     return {
14
-      iframeUrl:
15
-        "http://shop.kuyicloud.com/app/index.php?i=2&c=entry&m=ewei_shopv2&do=mobile&r=commission&fxtoken=c74cf4e1feacce0a363632927cd0e430&fxorgid=3877&timestamp=1559804081&fxadmin=185"
15
+      iframeUrl: ""
16 16
     };
17 17
   },
18
+  created() {
19
+    this.GetFxlink();
20
+  },
21
+  methods:{
22
+    GetFxlink() {
23
+      GetFxlink({link:"fxlink"}).then(response=>{
24
+        var res = response.data;
25
+        if(res.state==1) {
26
+          this.iframeUrl = res.data.fxlink
27
+        }
28
+      }).catch(e=>{});
29
+    },
30
+  },
18 31
   mounted() {
19 32
     const oIframe = document.getElementById("fxifram");
20 33
     const deviceHeight = document.documentElement.clientHeight;

+ 15 - 2
src/wsc_pages/home/index.vue View File

@@ -6,14 +6,27 @@
6 6
   </div>
7 7
 </template>
8 8
 <script>
9
+import { GetFxlink } from '@/api/fxlink';
9 10
 export default {
10 11
   name: "Home",
11 12
   data() {
12 13
     return {
13
-      iframeUrl:
14
-        "http://shop.kuyicloud.com/app/index.php?i=2&c=entry&m=ewei_shopv2&do=mobile&fxtoken=c1f5980c3cc4edc6f7f374af35045b88&fxorgid=3877&timestamp=1559787967&fxadmin=185"
14
+      iframeUrl: ""
15 15
     };
16 16
   },
17
+  created() {
18
+    this.GetFxlink();
19
+  },
20
+  methods:{
21
+    GetFxlink() {
22
+      GetFxlink({link:"sylink"}).then(response=>{
23
+        var res = response.data;
24
+        if(res.state==1) {
25
+          this.iframeUrl = res.data.fxlink
26
+        }
27
+      }).catch(e=>{});
28
+    },
29
+  },
17 30
   mounted() {
18 31
     const oIframe = document.getElementById("fxifram");
19 32
     const deviceHeight = document.documentElement.clientHeight;

+ 17 - 0
src/wsc_pages/index/index.vue View File

@@ -0,0 +1,17 @@
1
+<template>
2
+  <div>
3
+    <el-input v-model='msg' placeholder='输入'></el-input>
4
+    <p>{{ msg }}</p>
5
+  </div>
6
+</template>
7
+
8
+<script>
9
+export default {
10
+  name: 'index',
11
+  data: function() {
12
+    return {
13
+      msg: ''
14
+    }
15
+  }
16
+}
17
+</script>

+ 35 - 0
src/wsc_pages/index/verify_token.vue View File

@@ -0,0 +1,35 @@
1
+<template>
2
+  <div>
3
+    <h2 style="text-align:center;">加载中...</h2>
4
+  </div>
5
+</template>
6
+
7
+<script>
8
+export default {
9
+  created() {
10
+    // alert(this.$route.query.token)
11
+    this.$store.dispatch('VerifyToken', this.$route.query.token).then(() => {
12
+      this.$store.dispatch('xt_GenerateRoutes', this.$store.getters.current_role_urls).then(() => {
13
+        // this.$store.dispatch('VerifyConfigList').then(() => {
14
+          // alert('token 验证成功')
15
+          // console.log(this.$store.getters.xt_permission.addRouters)
16
+          this.$router.addRoutes(this.$store.getters.xt_permission.addRouters) // 动态添加可访问路由表
17
+  //        next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
18
+          this.$router.replace({ path: '/' })
19
+        // })
20
+      })
21
+    }).catch((error) => {
22
+      // alert('token 验证失败' + error)
23
+      if (error.code == 6016 || error.code == 6017) {
24
+        window.location.href = process.env.BASE_API + "/handle_error?code=" + error.code 
25
+      } else if (error.code == 6008) { // 令牌无效
26
+        window.location.href = process.env.BASE_API + '/login?relogin=true'
27
+      } else {
28
+        this.$message.error("token 验证失败: " + error.msg)
29
+        // alert('token 验证失败' + error.msg)
30
+        // window.location.href = process.env.BASE_API + '/login'
31
+      }
32
+    })
33
+  }
34
+}
35
+</script>

+ 604 - 0
src/wsc_pages/org/orginfo.vue View File

@@ -0,0 +1,604 @@
1
+<template>
2
+    <div class="app-container orginfo-container" >
3
+      <el-form ref="form" :model="form" label-width="90px" id="edit-org-info-form" v-loading="formloading" :element-loading-text="loadingText" class="clearfix" :popper-append-to-body="false" >
4
+        <el-row >
5
+          <el-col :span="24"  >
6
+            <el-form-item label="机构名称:" prop="org_name">
7
+                <el-input v-model="form.org_name" placeholder="机构名称" ></el-input>
8
+            </el-form-item>
9
+            <el-form-item label="联系人姓名:" prop="contact_name">
10
+                <el-input v-model="form.contact_name" placeholder="联系人姓名" ></el-input>
11
+            </el-form-item>
12
+            <el-form-item label="机构介绍:" prop="org_introduction">
13
+                <!-- <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" placeholder="机构介绍" v-model="form.org_introduction">  </el-input> -->
14
+                <keep-alive>
15
+                <neditor ref="neditor" 
16
+                    id="editor" 
17
+                    v-bind:r_content="form.org_introduction">
18
+                </neditor>
19
+            </keep-alive>
20
+            </el-form-item>
21
+            <el-form-item label="机构头像:" prop="org_logo">
22
+                <el-upload
23
+                    v-loading="uploading"
24
+                    :element-loading-text="loadingText"
25
+                    class="avatar-uploader"
26
+                    :data="uploadData"
27
+                    action="https://upload.qiniup.com"
28
+                    :show-file-list="false"
29
+                    :on-error="handleAvatarError"
30
+                    :on-success="handleAvatarSuccess"
31
+                    :before-upload="beforeAvatarUpload">
32
+                    <img v-if="form.org_logo" :src="form.org_logo" class="avatar">
33
+                    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
34
+                </el-upload>
35
+            </el-form-item>
36
+            <el-form-item label="机构地区:" prop="org_area">
37
+                <el-select v-model="form.province" clearable filterable placeholder="请选择" @change="changeProvince">
38
+                    <el-option
39
+                    v-for="item in provinces"
40
+                    :key="item.id"
41
+                    :label="item.name"
42
+                    :value="item.id">
43
+                    </el-option>
44
+                </el-select>
45
+                <el-select v-model="form.city" v-show="form.province&&citys.length>0" clearable filterable placeholder="请选择" @change="changeCity">
46
+                    <el-option
47
+                    v-for="item in citys"
48
+                    :key="item.id"
49
+                    :label="item.name"
50
+                    :value="item.id">
51
+                    </el-option>
52
+                </el-select>
53
+                <el-select v-model="form.district" v-show="form.city&&districts.length>0" clearable filterable placeholder="请选择">
54
+                    <el-option
55
+                    v-for="item in districts"
56
+                    :key="item.id"
57
+                    :label="item.name"
58
+                    :value="item.id">
59
+                    </el-option>
60
+                </el-select>
61
+            </el-form-item>
62
+            <el-form-item label="机构地址:" prop="address">
63
+                <el-input v-model="form.address" placeholder="机构地址" ></el-input>
64
+            </el-form-item>
65
+            <el-form-item label="机构类型:" prop="org_type">
66
+                <el-select v-model="form.parent_type" clearable placeholder="请选择" @change="changeParentType" >
67
+                    <el-option
68
+                    v-for="item in orgtypes"
69
+                    :key="item.id"
70
+                    :label="item.name"
71
+                    :value="item.id">
72
+                    </el-option>
73
+                </el-select>
74
+                <el-select v-model="form.child_type" v-show="form.parent_type&&childtypes.length>0" clearable placeholder="请选择" @change="changeChildType">
75
+                    <el-option
76
+                    v-for="item in childtypes"
77
+                    :key="item.id"
78
+                    :label="item.name"
79
+                    :value="item.id">
80
+                    </el-option>
81
+                </el-select>
82
+            </el-form-item>
83
+            <el-form-item label="机构电话:" prop="telephone">
84
+                <el-input v-model="form.telephone" placeholder="机构电话" ></el-input>
85
+            </el-form-item>
86
+            <el-form-item label="营业状态:" prop="operating_state">
87
+                <el-radio-group v-model="form.operating_state" >
88
+                    <el-radio v-for="item in operatingStateOptions" :key="item.value" :label="item.value" :value="item.value" >{{item.label}}</el-radio>
89
+                </el-radio-group>
90
+            </el-form-item>
91
+            <el-form-item label="营业时间:" prop="business_time">
92
+                <el-input v-model="form.business_week" placeholder="营业时间" style="width:48%"></el-input> 
93
+                <el-input v-model="form.business_time" placeholder="营业时间" style="width:48%"></el-input>
94
+            </el-form-item>
95
+            <el-form-item label="" prop="business_time">
96
+                <el-checkbox-group v-model="form.business_week_select"   @change="handleChangeWeek">
97
+                    <el-checkbox v-for="(item, index) in weekOptions" :label="item" :key="index" :value="item" >{{item}}</el-checkbox>
98
+                </el-checkbox-group>
99
+            </el-form-item>
100
+            
101
+            <el-form-item label="上午:" prop="business_time">
102
+                <el-radio-group v-model="form.business_time_shange" @change="handleChangeTime">
103
+                    <el-radio v-for="(item, index)  in shangOptions" :key="index" :label="item" :value="item" >{{item}}</el-radio>
104
+                </el-radio-group>
105
+            </el-form-item>
106
+            
107
+            <el-form-item label="下午:" prop="business_time_xia">
108
+                <el-radio-group v-model="form.business_time_xia" @change="handleChangeTime">
109
+                    <el-radio v-for="(item, index)  in xiaOptions" :key="index" :label="item" :value="item" >{{item}}</el-radio>
110
+                </el-radio-group>
111
+            </el-form-item>
112
+
113
+            <el-form-item label="服务病种:" prop="illness">
114
+                <el-checkbox-group v-model="form.illness_list"  @change="handleChangeIllness">
115
+                    <el-checkbox v-for="item in illnessOptions" :label="item.id" :key="item.id" :value="item.id" >{{item.illness_name}}</el-checkbox>
116
+                </el-checkbox-group>
117
+            </el-form-item>
118
+            <el-form-item label="机构图册:" prop="gallery">
119
+                <el-upload
120
+                    v-loading="guploading"
121
+                    :data="uploadData"
122
+                    action="https://upload.qiniup.com"
123
+                    list-type="picture-card"
124
+                    :file-list="fileList"
125
+                    :on-remove="handleRemove"
126
+                    :on-error="handleGalleryError"
127
+                    :on-success="handleGallerySuccess"
128
+                    :before-upload="beforeGalleryUpload">
129
+                    <i class="el-icon-plus"></i>
130
+                </el-upload>
131
+            </el-form-item>
132
+          </el-col>
133
+        </el-row>
134
+
135
+        <el-row :span="24">
136
+          <el-col :span="24" align="right" >
137
+            <el-form-item>
138
+                <el-button @click="$router.back(-1)" icon="el-icon-refresh" size="small">取消</el-button>
139
+                <el-button  @click="submitForm"  size="small" type="primary" icon="el-icon-setting" >保存</el-button>
140
+            </el-form-item>
141
+          </el-col>
142
+        </el-row>
143
+
144
+      </el-form>
145
+
146
+    </div>
147
+</template>
148
+
149
+<script>
150
+import { getToken } from '@/api/qiniu'
151
+import {GetOrgInfo,SaveOrgGallery,DeleteOrgGallery,EditOrgInfo} from '@/api/org/orginfo';
152
+import {GetDistrictsByUpid} from '@/api/district';
153
+import { getFileExtension} from '@/utils/tools'
154
+import Neditor from '@/components/Neditor'
155
+  export default {
156
+    name: 'orginfo',
157
+    data() {
158
+      return {
159
+        crumbs: [
160
+          { path: false, name: '机构信息' },
161
+        ],
162
+        qiniuDomain: 'https://images.shengws.com/',
163
+        formloading:false,
164
+        uploading:false,
165
+        guploading:false,
166
+        formsubmit:false,
167
+        loadingText:'',
168
+        illnessList:[],
169
+        fileList:[],
170
+        provinces:[],
171
+        citys:[],
172
+        districts:[],
173
+        orgtypes:[],
174
+        orgtypesMap:{},
175
+        childtypes:[],
176
+        uploadData: { token: '', key: '' },
177
+        operatingStateOptions: [{ value: 1, label: '正常营业' }, { value: 2, label: '暂未营业' }],
178
+        weekOptions:["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"],
179
+        shangOptions:['1:00','2:00','3:00','4:00','5:00','6:00','7:00','8:00','9:00','10:00','11:00','12:00'],
180
+        xiaOptions:['13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00'],
181
+        illnessOptions:[],
182
+        form:{
183
+            org_name:'',
184
+            contact_name:'',
185
+            org_introduction:'',
186
+            org_logo:'',
187
+            province:'',
188
+            city:'',
189
+            district:'',
190
+            address:'',
191
+            parent_type:'',
192
+            child_type:'',
193
+            org_type:'',
194
+            telephone:'',
195
+            operating_state:'',
196
+            business_week:'',
197
+            business_week_select:[],
198
+            business_time_shange:'',
199
+            business_time_xia:'',
200
+            business_time:'',
201
+            illness:'',
202
+            illness_list:[],
203
+            org_gallery:[],
204
+        },
205
+            myConfig: {
206
+            // 如果需要上传功能,找后端小伙伴要服务器接口地址
207
+            serverUrl: '/api/web/upload/ueditor',
208
+            // 你的UEditor资源存放的路径,相对于打包后的index.html
209
+            UEDITOR_HOME_URL: '/NEditor/',
210
+            // 编辑器不自动被内容撑高
211
+            autoHeightEnabled: false,
212
+            // 初始容器高度
213
+            initialFrameHeight: 240,
214
+            // 初始容器宽度
215
+            initialFrameWidth: '100%',
216
+            // 关闭自动保存
217
+            enableAutoSave: false
218
+        },
219
+        
220
+      }
221
+    },
222
+    components: {
223
+        Neditor,
224
+    },
225
+    computed: {
226
+      
227
+    },
228
+    created() {
229
+        this.formloading = true;
230
+        this.loadingText = '加载中...';
231
+        this.GetOrgInfo();
232
+    },
233
+    methods: {
234
+        
235
+        handleChangeIllness(values){
236
+            this.form.illness = values.join(',');
237
+        },
238
+        handleChangeWeek(values) {
239
+            var selectweek = [];
240
+            for (const index in values) {
241
+                var item = {id:this.weekOptions.indexOf(values[index]), name:values[index]};
242
+                selectweek.push(item);
243
+            }
244
+            
245
+            if(selectweek.length==0) {
246
+                this.form.business_week = '';
247
+            }else if(selectweek.length==1) {
248
+                this.form.business_week = selectweek[0];
249
+            }else {
250
+                selectweek = selectweek.sort(function (a,b) {
251
+                    return a.id-b.id;
252
+                });
253
+                var blen = selectweek.length;
254
+                if (blen == (selectweek[blen-1].id - selectweek[0].id + 1)) {
255
+                    this.form.business_week = selectweek[0]["name"] + ' — ' + selectweek[blen-1]["name"];
256
+                }else {
257
+                    var tem = [];
258
+                    for (const index in selectweek) {
259
+                        tem.push(selectweek[index].name);
260
+                    }
261
+                    this.form.business_week = tem.join("、")
262
+                }
263
+               
264
+            }
265
+        },
266
+        handleChangeTime(t){
267
+            if(this.form.business_time_shange.length>0 && this.form.business_time_xia.length>0) {
268
+                this.form.business_time = '上午'+this.form.business_time_shange+"—下午"+this.form.business_time_xia;
269
+            }else if (this.form.business_time_shange.length>0) {
270
+                this.form.business_time = '上午'+this.form.business_time_shange;
271
+            }else if (this.form.business_time_xia.length>0) {
272
+                this.form.business_time = "下午"+this.form.business_time_xia;
273
+            }else {
274
+                this.form.business_time = '';
275
+            }
276
+        },
277
+        handleAvatarError(err, file, fileList) {
278
+            this.$message.error(err);
279
+            this.uploading = false;
280
+            return false
281
+        },
282
+        handleAvatarSuccess(res, file) {
283
+            this.form.org_logo = this.qiniuDomain + res.url;
284
+            this.uploading = false;
285
+        },
286
+        beforeAvatarUpload(file) {
287
+            var fileType = file.type
288
+            const isJPG = fileType.indexOf('image') > -1
289
+            const isLt2M = file.size / 1024 / 1024 < 2
290
+
291
+            if (!isJPG) {
292
+                this.$message.error('只能上传图片')
293
+                return false
294
+            }
295
+            if (!isLt2M) {
296
+                this.$message.error('上传头像图片大小不能超过 2MB!')
297
+                return false
298
+            }
299
+
300
+            var date = new Date()
301
+            var ext = getFileExtension(file.name)
302
+            var key = "" + date.getFullYear() + (date.getMonth() + 1) + date.getDate() + date.getHours()  + date.getMinutes()  + date.getSeconds()  +'_o_' + file.uid + '.' + ext;
303
+            this.uploading = true;
304
+            this.loadingText = '机构头像上传中'
305
+
306
+            const _self = this
307
+            return new Promise((resolve, reject) => {
308
+                getToken().then(response => {
309
+                    const token = response.data.data.uptoken
310
+                    _self._data.uploadData.token = token
311
+                    _self._data.uploadData.key = key
312
+                    resolve(true)
313
+                }).catch(err => {
314
+                    reject(false)
315
+                    this.uploading = false;
316
+                })
317
+            })
318
+        },
319
+        handleGalleryError(err, file, fileList) {
320
+            this.$message.error(err);
321
+            this.guploading = false;
322
+            return false
323
+        },
324
+        handleGallerySuccess(res, file) {
325
+            var data = {type:1, url: this.qiniuDomain + res.url};
326
+            SaveOrgGallery(data).then(response=>{
327
+                var res = response.data;
328
+                if (res.state==1) {
329
+                    this.$message.success('上传成功');
330
+                }else {
331
+                    this.$message.error('上传失败');
332
+                }
333
+            }).catch(e=>{});
334
+            this.guploading = false;
335
+        },
336
+        beforeGalleryUpload(file) {
337
+            var fileType = file.type
338
+            const isJPG = fileType.indexOf('image') > -1
339
+            const isLt100M = file.size / 1024 / 1024 < 100
340
+
341
+            if (!isJPG) {
342
+                this.$message.error('只能上传图片')
343
+                return false
344
+            }
345
+            if (!isLt100M) {
346
+                this.$message.error('上传图片大小不能超过 100MB!')
347
+                return false
348
+            }
349
+
350
+            var date = new Date()
351
+            var ext = getFileExtension(file.name)
352
+            var key = ""+date.getFullYear() + (date.getMonth() + 1) + date.getDate() + date.getHours()  + date.getMinutes()  + date.getSeconds()  +'_g_' + file.uid + '.' + ext;
353
+            this.guploading = true;
354
+            this.loadingText = '机构图册上传中'
355
+
356
+            const _self = this
357
+            return new Promise((resolve, reject) => {
358
+                getToken().then(response => {
359
+                    const token = response.data.data.uptoken
360
+                    _self._data.uploadData.token = token
361
+                    _self._data.uploadData.key = key
362
+                    resolve(true)
363
+                }).catch(err => {
364
+                    reject(false)
365
+                    this.guploading = false;
366
+                })
367
+            })
368
+        },
369
+
370
+        handleRemove(file, fileList) {
371
+            DeleteOrgGallery(file.id).then(response=>{
372
+                var res = response.data;
373
+                if(res.state==1) {
374
+                    this.$message.success('删除成功');
375
+                }else {
376
+                    this.$message.error('删除失败');
377
+                }
378
+            }).catch(e=>{});
379
+            console.log("handleRemove",file, fileList);
380
+        },
381
+        GetOrgInfo(){
382
+            GetOrgInfo().then(response=>{
383
+                var res = response.data;
384
+                if (res.state === 1) {
385
+                    this.form.org_name = res.data.orginfo.org_name;
386
+                    this.form.contact_name = res.data.orginfo.contact_name;
387
+                    this.form.org_introduction = res.data.orginfo.org_introduction;
388
+                    this.form.org_logo = res.data.orginfo.org_logo;
389
+                    this.form.province = res.data.orginfo.province;
390
+                    this.form.city = res.data.orginfo.city;
391
+                    this.form.district = res.data.orginfo.district;
392
+                    this.form.address = res.data.orginfo.address;
393
+                    this.form.org_type = res.data.orginfo.org_type;
394
+                    this.form.telephone = res.data.orginfo.telephone;
395
+                    this.form.operating_state = res.data.orginfo.operating_state;
396
+                    this.form.business_week = res.data.orginfo.business_week;
397
+                    this.form.business_week_select = [];
398
+                    this.form.business_time = res.data.orginfo.business_time;
399
+                    this.form.business_time_shange = '';
400
+                    this.form.business_time_xia = '';
401
+                    this.form.illness = res.data.orginfo.illness;
402
+                    this.form.illness_list = [];
403
+                    this.form.org_gallery = res.data.orginfo.org_gallery;
404
+                    this.fileList = [];
405
+                    for (const index in this.form.org_gallery) {
406
+                        var image = {id:this.form.org_gallery[index].id, name:this.form.org_gallery[index].id, url: this.form.org_gallery[index].type==1?this.form.org_gallery[index].url:this.form.org_gallery[index].url+'?vframe/jpg/offset/0/w/100/h/100'};
407
+                        this.fileList.push(image);
408
+                    }
409
+
410
+                    var illness = res.data.orginfo.illness.split(',');
411
+                    for (const index in illness) {
412
+                        var iid = parseInt(illness[index]);
413
+                        if (isNaN(iid) || iid<=0) {
414
+                            continue;
415
+                        }
416
+                        this.form.illness_list.push(iid);
417
+                    }
418
+                    var business_week = this.form.business_week;
419
+                    var business_week_tem = business_week.split(" — ");
420
+                    if(business_week_tem.length==2) {
421
+                        var fromIndex = this.weekOptions.indexOf(business_week_tem[0]);
422
+                        var toIndex = this.weekOptions.indexOf(business_week_tem[1]);
423
+                        if(fromIndex>=0 && toIndex>=0) {
424
+                            for (const index in this.weekOptions) {
425
+                                if(index>=fromIndex && index <= toIndex) {
426
+                                    this.form.business_week_select.push(this.weekOptions[index]);
427
+                                }
428
+                            }
429
+                        }
430
+                    }else {
431
+                        business_week_tem = business_week.split("、");
432
+                        for (const index in business_week_tem) {
433
+                            if(business_week_tem[index].length>0) {
434
+                                this.form.business_week_select.push(business_week_tem[index]);
435
+                            }
436
+                        }
437
+                    }
438
+                    var business_time = this.form.business_time;
439
+                    var business_time_tem = business_time.split("—");
440
+                    if(business_time_tem.length==2) {
441
+                        this.form.business_time_shange = business_time_tem[0].substring(2);
442
+                        this.form.business_time_xia = business_time_tem[1].substring(2);
443
+                    }else {
444
+                        var selectTime = business_time_tem[0].substring(2);
445
+                        if(this.shangOptions.indexOf(selectTime)>-1) {
446
+                            this.form.business_time_shange = selectTime;
447
+                        }else if(this.xiaOptions.indexOf(selectTime)>-1) {
448
+                            this.form.business_time_xia = selectTime;
449
+                        }
450
+                    }
451
+
452
+                    this.provinces = res.data.provinces;
453
+                    this.citys = res.data.citys?res.data.citys:[];
454
+                    this.districts = res.data.districts?res.data.districts:[];
455
+
456
+                    this.orgtypes = [];
457
+                    this.orgtypesMap ={},
458
+                    this.childtypes = [];
459
+                    var orgtypes = res.data.orgtypes;
460
+                    for (const index in orgtypes) {
461
+                        if(orgtypes[index].pid>0) {
462
+                            if(!(orgtypes[index].pid in this.orgtypesMap)) {
463
+                                this.orgtypesMap[orgtypes[index].pid] = [];
464
+                            }
465
+                            this.orgtypesMap[orgtypes[index].pid].push(orgtypes[index]);
466
+                            if(orgtypes[index].id == this.form.org_type) {
467
+                                this.form.child_type = orgtypes[index].id;
468
+                                this.form.parent_type = orgtypes[index].pid;
469
+                            }
470
+                        }else {
471
+                            this.orgtypes.push(orgtypes[index]);
472
+                            if(orgtypes[index].id == this.form.org_type) {
473
+                                this.form.parent_type = orgtypes[index].id;
474
+                            }
475
+                        }
476
+                    }
477
+                    if (this.form.parent_type in this.orgtypesMap) {
478
+                        this.childtypes = this.orgtypesMap[this.form.parent_type];
479
+                    }else {
480
+                        this.childtypes = [];
481
+                    }
482
+                    this.illnessOptions = res.data.illness?res.data.illness:[];
483
+                    this.formloading = false;
484
+                } else {
485
+                    this.$message.error(resp.msg)
486
+                }
487
+            }).catch(e=>{
488
+
489
+            })
490
+        },
491
+         myTrim(x) {
492
+            return x.replace(/^\s+|\s+$/gm,'');
493
+        },
494
+        changeProvince(id) {
495
+            this.citys = [];
496
+            this.districts = [];
497
+            this.form.city = '';
498
+            this.form.district = '';
499
+            var upid = parseInt(id);
500
+            if (isNaN(upid) || upid<=0) {
501
+                return false;
502
+            }
503
+            GetDistrictsByUpid({id:upid}).then(response=>{
504
+                var res = response.data;
505
+                if(res.state===1) {
506
+                    this.citys = res.data.citys?res.data.citys:[];
507
+                }
508
+            }).catch(e=>{
509
+
510
+            })
511
+        },
512
+        changeCity(id) {
513
+            this.districts = [];
514
+            this.form.district = '';
515
+            var upid = parseInt(id);
516
+            if (isNaN(upid) || upid<=0) {
517
+                return false;
518
+            }
519
+            GetDistrictsByUpid({id:upid}).then(response=>{
520
+                var res = response.data;
521
+                if(res.state===1) {
522
+                    this.districts = res.data.citys?res.data.citys:[];
523
+                }
524
+            }).catch(e=>{
525
+
526
+            })
527
+        },
528
+        changeParentType(id) {
529
+            id = parseInt(id);
530
+            this.childtypes = [];
531
+            this.form.child_type = '';
532
+            this.form.org_type = 0;
533
+
534
+            if (isNaN(id) || id<=0) {
535
+                return false;
536
+            }
537
+            if(id in this.orgtypesMap) {
538
+                this.childtypes = this.orgtypesMap[id];
539
+            }else{
540
+                this.childtypes = [];
541
+            }
542
+            
543
+            this.form.org_type = id;
544
+
545
+        },
546
+        changeChildType(id) {
547
+            this.form.org_type = id;
548
+        },
549
+        submitForm(){
550
+            this.form.org_introduction = this.$refs.neditor.content;
551
+            this.formloading = true;
552
+            this.formsubmit = true;
553
+            this.loadingText = '正在保存...';
554
+            EditOrgInfo(this.form).then(response=>{
555
+                var res = response.data;
556
+                if(res.state==1) {
557
+                    this.$store.dispatch("ModifyOrgInfo", { org_name: this.form.org_name, contact_name: this.form.org_name })
558
+                    
559
+                    this.$message.success("修改成功");
560
+                }else {
561
+                    this.$message.error(res.msg);
562
+                }
563
+                
564
+                this.formloading = false;
565
+                this.formsubmit = false;
566
+            }).catch(e=>{
567
+
568
+                this.formloading = false;
569
+                this.formsubmit = false;
570
+            })
571
+        },
572
+    }
573
+  }
574
+</script>
575
+
576
+<style rel="stylesheet/scss" >
577
+    .orginfo-container{
578
+        padding:10px;
579
+    }
580
+  #edit-org-info-form .avatar-uploader .el-upload {
581
+    border: 1px dashed #d9d9d9;
582
+    border-radius: 6px;
583
+    cursor: pointer;
584
+    position: relative;
585
+    overflow: hidden;
586
+  }
587
+  #edit-org-info-form .avatar-uploader .el-upload:hover {
588
+    border-color: #409EFF;
589
+  }
590
+  #edit-org-info-form .avatar-uploader-icon {
591
+    font-size: 28px;
592
+    color: #8c939d;
593
+    width: 178px;
594
+    height: 178px;
595
+    line-height: 178px;
596
+    text-align: center;
597
+  }
598
+  #edit-org-info-form .avatar {
599
+    width: 178px;
600
+    height: 178px;
601
+    display: block;
602
+  }
603
+</style>
604
+

+ 16 - 2
src/wsc_pages/personal/index.vue View File

@@ -7,14 +7,28 @@
7 7
 </template>
8 8
 
9 9
 <script>
10
+
11
+import { GetFxlink } from '@/api/fxlink';
10 12
 export default {
11 13
   name: "personal",
12 14
   data() {
13 15
     return {
14
-      iframeUrl:
15
-        "http://shop.kuyicloud.com/app/index.php?i=2&c=entry&m=ewei_shopv2&do=mobile&r=member&fxtoken=dd18b40b6c78a3240d77695c756758e7&fxorgid=3877&timestamp=1559804962&fxadmin=185"
16
+      iframeUrl: ""
16 17
     };
17 18
   },
19
+  created() {
20
+    this.GetFxlink();
21
+  },
22
+  methods:{
23
+    GetFxlink() {
24
+      GetFxlink({link:"zxlink"}).then(response=>{
25
+        var res = response.data;
26
+        if(res.state==1) {
27
+          this.iframeUrl = res.data.fxlink
28
+        }
29
+      }).catch(e=>{});
30
+    },
31
+  },
18 32
   mounted() {
19 33
     const oIframe = document.getElementById("fxifram");
20 34
     const deviceHeight = document.documentElement.clientHeight;

+ 13 - 13
src/xt_permission.js View File

@@ -10,19 +10,19 @@ const permissionWhiteList = loginWhiteList.concat(['/']) // 权限验证白名
10 10
 
11 11
 router.beforeEach((to, from, next) => {
12 12
   // 线上注释
13
-  if (!store.getters.configlist || store.getters.configlist === undefined || store.getters.configlist.length <= 0) {
14
-    store.dispatch('VerifyConfigList', []).then(() => {
15
-      next()
16
-    })
17
-  }
18
-  if (store.getters.permission_routers === undefined) {
19
-    store.dispatch('xt_GenerateRoutes', []).then(() => {
20
-      next()
21
-    })
22
-  } else {
23
-    next()
24
-  }
25
-  return
13
+  // if (!store.getters.configlist || store.getters.configlist === undefined || store.getters.configlist.length <= 0) {
14
+  //   store.dispatch('VerifyConfigList', []).then(() => {
15
+  //     next()
16
+  //   })
17
+  // }
18
+  // if (store.getters.permission_routers === undefined) {
19
+  //   store.dispatch('xt_GenerateRoutes', []).then(() => {
20
+  //     next()
21
+  //   })
22
+  // } else {
23
+  //   next()
24
+  // }
25
+  // return
26 26
   // 线上注释
27 27
 
28 28
   NProgress.start()

+ 168 - 0
static/neditor/README.md View File

@@ -0,0 +1,168 @@
1
+
2
+<p align="center">
3
+<a href="https://jq.qq.com/?_wv=1027&k=5qVzRh4" title="Notadd 官方技术交流群"><img src="https://img.shields.io/badge/QQ%20Group-321735506-6782d6.svg?style=flat-square"></a>
4
+<a href="https://travis-ci.org/notadd/neditor" title="Build Status"><img src="https://img.shields.io/travis/notadd/neditor/master.svg?style=flat-square"></a>
5
+</p>
6
+
7
+## 新版发布
8
+
9
+2.1 发布,此次版本移除了后端相关代码,纯 ajax 提交,请配置 `neditor.config.js` `neditor.service.js`,支持各种后端或者云存储。
10
+
11
+## 捐赠
12
+
13
+该项目需要您的支持, [捐赠](https://gitee.com/notadd/neditor?donate=true)  以支持此项目的发展。
14
+
15
+
16
+## 第一步:下载编辑器
17
+
18
+**方式一:完整安装包 (推荐)**
19
+
20
+* [Neditor.tar.xz](https://www.notadd.com/download/neditor/Neditor-next-master.tar.xz)
21
+
22
+**方式二: npm安装**
23
+
24
+`npm i @notadd/neditor -S`
25
+
26
+**方式三:编译安装**
27
+
28
+```shell
29
+git clone https://github.com/notadd/neditor.git
30
+npm install
31
+npm run build
32
+```
33
+
34
+### 第二步:在浏览器打开 index.html ###
35
+
36
+进入到目录 `dist` , 使用浏览器打开文件 `index.html` 。
37
+
38
+如果看到了下面这样的编辑器,恭喜你,初次部署成功!
39
+
40
+![部署成功](https://www.notadd.com/src/neditor-demo.webp)
41
+
42
+## 相关版本
43
+
44
+[Angular 版 Neditor](https://github.com/notadd/ngx-neditor)    
45
+
46
+[Vue 版 Neditor](https://github.com/caiya/vue-neditor-wrap)   【第三方维护】
47
+
48
+## 技术支持
49
+
50
+该项目基于 MIT 协议开源,任何组织/企业以及个人都可以免费使用(保留版权)。    
51
+如果您需要额外商业技术支持或者定制编辑器,请联系 QQ:1256985886
52
+
53
+
54
+
55
+其他版本待添加
56
+
57
+### 自定义的参数
58
+
59
+编辑器有很多可自定义的参数项,在实例化的时候可以传入给编辑器:
60
+
61
+```javascript
62
+var ue = UE.getEditor('container', {
63
+    autoHeight: false
64
+});
65
+```
66
+
67
+配置项也可以通过 `neditor.config.js` 文件修改,具体的配置方法请看 [前端配置项说明](http://fex.baidu.com/ueditor/#start-config1.4 前端配置项说明.md)、[后端配置项说明](http://fex.baidu.com/ueditor/#server-config)
68
+
69
+### 编辑器图片、视频、涂鸦、附件上传service
70
+
71
+编辑器上传逻辑单独在 `neditor.service.js` 文件配置,具体的配置方法见注释
72
+
73
+### 设置和读取编辑器的内容
74
+
75
+通 getContent 和 setContent 方法可以设置和读取编辑器的内容
76
+
77
+```javascript
78
+var ue = UE.getContent();
79
+ue.ready(function(){
80
+    //设置编辑器的内容
81
+    ue.setContent('hello');
82
+    //获取html内容,返回: <p>hello</p>
83
+    var html = ue.getContent();
84
+    //获取纯文本内容,返回: hello
85
+    var txt = ue.getContentTxt();
86
+});
87
+```
88
+
89
+Ueditor 的更多API请看[API 文档](http://ueditor.baidu.com/doc "ueditor API 文档")
90
+
91
+##  下载地址
92
+
93
+Neditor 码云: [http://gitee.com/notadd/neditor](http://gitee.com/notadd/neditor "Neditor github 地址")
94
+
95
+Neditor github 地址:[http://github.com/notadd/neditor](http://github.com/notadd/neditor "Neditor github 地址")
96
+
97
+## 相关链接
98
+
99
+Ueditor 官网:[http://ueditor.baidu.com](http://ueditor.baidu.com "ueditor 官网")
100
+
101
+Ueditor API 文档:[http://ueditor.baidu.com/doc](http://ueditor.baidu.com/doc "ueditor API 文档")
102
+
103
+## 详细文档
104
+
105
+Ueditor 文档:[http://fex.baidu.com/ueditor/](http://fex.baidu.com/ueditor/)
106
+
107
+注: 对IE8以下版本不再承诺兼容
108
+
109
+
110
+### 关于 HTTPS
111
+
112
+使用了 [又拍云CDN](https://console.upyun.com/register/?invite=r17EYO3BW) 服务,支持跨域 和 https。
113
+
114
+如果有需要,也可将下面域名改成自己的。
115
+```
116
+imgbaidu.b0.upaiyun.com
117
+tingapi.b0.upaiyun.com
118
+```
119
+
120
+## 联系我们 ##
121
+
122
+Neditor官方交流群:257753500
123
+
124
+QQ 群: 321735506
125
+
126
+[issue](http://github.com/notadd/neditor/issues)
127
+
128
+
129
+
130
+## Todo
131
+
132
+### 2.1
133
+
134
+- [x] 将上传封装为 service ,支持非 GraphQL 接口。
135
+- [x] 细节样式修改(美化)
136
+
137
+### 2.2
138
+
139
+- [ ] word 内图片自动上传
140
+- [x] 粘贴图片转为本地图片(图片本地化)
141
+
142
+### 2.3
143
+
144
+- [ ] 上传文件/图片无需后端
145
+
146
+### 3.0
147
+
148
+- [ ] 使用 Typescript 重构
149
+- [ ] 草稿箱功能与离线保存
150
+- [ ] service worker 特性
151
+- [ ] 实现 2.0 的大部分功能
152
+
153
+## 其他项目:Notadd
154
+
155
+https://github.com/notadd/notadd
156
+
157
+
158
+ ## 感谢提供赞助:
159
+ 
160
+ 
161
+ <a href="https://www.ucloud.cn/site/active/gift.html?ytag=notadd"><img src="https://www.notadd.com/src/ucloud_logo.svg" width="150" /></a> &nbsp;
162
+
163
+**UCloud 云服务器限时优惠 — Notadd 项目用户福利**
164
+
165
+[【基础型】1核2G 1M带宽 50GB SSD数据盘 低至250元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd )    
166
+
167
+[【标准型】2核4G 1M带宽 50GB SSD数据盘 低至550元/年](https://www.ucloud.cn/site/active/gift.html?ytag=notadd )
168
+

+ 40 - 0
static/neditor/dialogs/anchor/anchor.html View File

@@ -0,0 +1,40 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+    "http://www.w3.org/TR/html4/loose.dtd">
3
+<html>
4
+    <head>
5
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+        <title></title>
7
+        <style type="text/css">
8
+            *{color: #838383;margin: 0;padding: 0}
9
+            html,body {font-size: 12px;overflow: hidden; }
10
+            .content{padding:15px 0 0 15px;}
11
+            input{width:210px;height:28px;line-height:28px;margin-left: 4px;border-radius: 5px;border: 1px solid #ccc;}
12
+        </style>
13
+    </head>
14
+    <body>
15
+        <div class="content">
16
+            <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
17
+        </div>
18
+        <script type="text/javascript" src="../internal.js"></script>
19
+        <script type="text/javascript">
20
+            var anchorInput = $G('anchorName'),
21
+                node = editor.selection.getRange().getClosedNode();
22
+            if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
23
+                anchorInput.value = node;
24
+            }
25
+            anchorInput.onkeydown = function(evt){
26
+                evt = evt || window.event;
27
+                if(evt.keyCode == 13){
28
+                    editor.execCommand('anchor', anchorInput.value);
29
+                    dialog.close();
30
+                    domUtils.preventDefault(evt)
31
+                }
32
+            };
33
+            dialog.onok = function (){
34
+                editor.execCommand('anchor', anchorInput.value);
35
+                dialog.close();
36
+            };
37
+            $focus(anchorInput);
38
+        </script>
39
+    </body>
40
+</html>

+ 682 - 0
static/neditor/dialogs/attachment/attachment.css View File

@@ -0,0 +1,682 @@
1
+@charset "utf-8";
2
+/* dialog样式 */
3
+.wrapper {
4
+    zoom: 1;
5
+    width: 630px;
6
+    *width: 626px;
7
+    height: 380px;
8
+    margin: 0 auto;
9
+    padding: 10px;
10
+    position: relative;
11
+    font-family: sans-serif;
12
+}
13
+
14
+/*tab样式框大小*/
15
+.tabhead {
16
+    float:left;
17
+}
18
+.tabbody {
19
+    width: 100%;
20
+    height: 346px;
21
+    position: relative;
22
+    clear: both;
23
+}
24
+
25
+.tabbody .panel {
26
+    position: absolute;
27
+    width: 0;
28
+    height: 0;
29
+    background: #fff;
30
+    overflow: hidden;
31
+    display: none;
32
+}
33
+
34
+.tabbody .panel.focus {
35
+    width: 100%;
36
+    height: 346px;
37
+    display: block;
38
+}
39
+
40
+/* 上传附件 */
41
+.tabbody #upload.panel {
42
+    width: 0;
43
+    height: 0;
44
+    overflow: hidden;
45
+    position: absolute !important;
46
+    clip: rect(1px, 1px, 1px, 1px);
47
+    background: #fff;
48
+    display: block;
49
+}
50
+
51
+.tabbody #upload.panel.focus {
52
+    width: 100%;
53
+    height: 346px;
54
+    display: block;
55
+    clip: auto;
56
+}
57
+
58
+#upload .queueList {
59
+    margin: 0;
60
+    width: 100%;
61
+    height: 100%;
62
+    position: absolute;
63
+    overflow: hidden;
64
+}
65
+
66
+#upload p {
67
+    margin: 0;
68
+}
69
+
70
+.element-invisible {
71
+    width: 0 !important;
72
+    height: 0 !important;
73
+    border: 0;
74
+    padding: 0;
75
+    margin: 0;
76
+    overflow: hidden;
77
+    position: absolute !important;
78
+    clip: rect(1px, 1px, 1px, 1px);
79
+}
80
+
81
+#upload .placeholder {
82
+    margin: 10px;
83
+    /*border: 2px dashed #e6e6e6;*/
84
+    height: 172px;
85
+    padding-top: 150px;
86
+    text-align: center;
87
+    /*background: url(./images/image.png) center 70px no-repeat;*/
88
+    background-color: #f3f3f3;
89
+    color: #cccccc;
90
+    font-size: 18px;
91
+    position: relative;
92
+    top:0;
93
+    *top: 10px;
94
+}
95
+
96
+#upload .placeholder .webuploader-pick {
97
+    font-size: 16px;
98
+    background: #f3f3f3;
99
+    border-radius: 3px;
100
+    line-height: 44px;
101
+    padding: 0 30px;
102
+    color: #646464;
103
+    display: inline-block;
104
+    margin: 0 auto 20px auto;
105
+    cursor: pointer;
106
+    /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */
107
+    border: 1px solid #ccc;
108
+}
109
+
110
+#upload .placeholder .webuploader-pick-hover {
111
+    border: 1px solid #00a2d4;
112
+    color: #00a2d4;
113
+}
114
+
115
+
116
+#filePickerContainer {
117
+    text-align: center;
118
+}
119
+
120
+#upload .placeholder .flashTip {
121
+    color: #666666;
122
+    font-size: 12px;
123
+    position: absolute;
124
+    width: 100%;
125
+    text-align: center;
126
+    bottom: 20px;
127
+}
128
+
129
+#upload .placeholder .flashTip a {
130
+    color: #0785d1;
131
+    text-decoration: none;
132
+}
133
+
134
+#upload .placeholder .flashTip a:hover {
135
+    text-decoration: underline;
136
+}
137
+
138
+#upload .placeholder.webuploader-dnd-over {
139
+    border-color: #999999;
140
+}
141
+
142
+#upload .filelist {
143
+    list-style: none;
144
+    margin: 0;
145
+    padding: 0;
146
+    overflow-x: hidden;
147
+    overflow-y: auto;
148
+    position: relative;
149
+    height: 300px;
150
+}
151
+
152
+#upload .filelist:after {
153
+    content: '';
154
+    display: block;
155
+    width: 0;
156
+    height: 0;
157
+    overflow: hidden;
158
+    clear: both;
159
+}
160
+
161
+#upload .filelist li {
162
+    width: 113px;
163
+    height: 113px;
164
+    background: url(./images/bg.png);
165
+    text-align: center;
166
+    margin: 9px 0 0 9px;
167
+    *margin: 6px 0 0 6px;
168
+    position: relative;
169
+    display: block;
170
+    float: left;
171
+    overflow: hidden;
172
+    font-size: 12px;
173
+}
174
+
175
+#upload .filelist li p.log {
176
+    position: relative;
177
+    top: -45px;
178
+}
179
+
180
+#upload .filelist li p.title {
181
+    position: absolute;
182
+    top: 0;
183
+    left: 0;
184
+    width: 100%;
185
+    overflow: hidden;
186
+    white-space: nowrap;
187
+    text-overflow: ellipsis;
188
+    top: 5px;
189
+    text-indent: 5px;
190
+    text-align: left;
191
+}
192
+
193
+#upload .filelist li p.progress {
194
+    position: absolute;
195
+    width: 100%;
196
+    bottom: 0;
197
+    left: 0;
198
+    height: 8px;
199
+    overflow: hidden;
200
+    z-index: 50;
201
+    margin: 0;
202
+    border-radius: 0;
203
+    background: none;
204
+    -webkit-box-shadow: 0 0 0;
205
+}
206
+
207
+#upload .filelist li p.progress span {
208
+    display: none;
209
+    overflow: hidden;
210
+    width: 0;
211
+    height: 100%;
212
+    background: #1483d8 url(./images/progress.png) repeat-x;
213
+
214
+    -webit-transition: width 200ms linear;
215
+    -moz-transition: width 200ms linear;
216
+    -o-transition: width 200ms linear;
217
+    -ms-transition: width 200ms linear;
218
+    transition: width 200ms linear;
219
+
220
+    -webkit-animation: progressmove 2s linear infinite;
221
+    -moz-animation: progressmove 2s linear infinite;
222
+    -o-animation: progressmove 2s linear infinite;
223
+    -ms-animation: progressmove 2s linear infinite;
224
+    animation: progressmove 2s linear infinite;
225
+
226
+    -webkit-transform: translateZ(0);
227
+}
228
+
229
+@-webkit-keyframes progressmove {
230
+    0% {
231
+        background-position: 0 0;
232
+    }
233
+    100% {
234
+        background-position: 17px 0;
235
+    }
236
+}
237
+
238
+@-moz-keyframes progressmove {
239
+    0% {
240
+        background-position: 0 0;
241
+    }
242
+    100% {
243
+        background-position: 17px 0;
244
+    }
245
+}
246
+
247
+@keyframes progressmove {
248
+    0% {
249
+        background-position: 0 0;
250
+    }
251
+    100% {
252
+        background-position: 17px 0;
253
+    }
254
+}
255
+
256
+#upload .filelist li p.imgWrap {
257
+    position: relative;
258
+    z-index: 2;
259
+    line-height: 113px;
260
+    vertical-align: middle;
261
+    overflow: hidden;
262
+    width: 113px;
263
+    height: 113px;
264
+
265
+    -webkit-transform-origin: 50% 50%;
266
+    -moz-transform-origin: 50% 50%;
267
+    -o-transform-origin: 50% 50%;
268
+    -ms-transform-origin: 50% 50%;
269
+    transform-origin: 50% 50%;
270
+
271
+    -webit-transition: 200ms ease-out;
272
+    -moz-transition: 200ms ease-out;
273
+    -o-transition: 200ms ease-out;
274
+    -ms-transition: 200ms ease-out;
275
+    transition: 200ms ease-out;
276
+}
277
+#upload .filelist li p.imgWrap.notimage {
278
+    margin-top: 0;
279
+    width: 111px;
280
+    height: 111px;
281
+    border: 1px #eeeeee solid;
282
+}
283
+#upload .filelist li p.imgWrap.notimage i.file-preview {
284
+    margin-top: 15px;
285
+}
286
+
287
+#upload .filelist li img {
288
+    width: 100%;
289
+}
290
+
291
+#upload .filelist li p.error {
292
+    background: #f43838;
293
+    color: #fff;
294
+    position: absolute;
295
+    bottom: 0;
296
+    left: 0;
297
+    height: 28px;
298
+    line-height: 28px;
299
+    width: 100%;
300
+    z-index: 100;
301
+    display:none;
302
+}
303
+
304
+#upload .filelist li .success {
305
+    display: block;
306
+    position: absolute;
307
+    left: 0;
308
+    bottom: 0;
309
+    height: 40px;
310
+    width: 100%;
311
+    z-index: 200;
312
+    background: url(./images/success.png) no-repeat right bottom;
313
+    background-image: url(./images/success.gif) \9;
314
+}
315
+
316
+#upload .filelist li.filePickerBlock {
317
+    width: 113px;
318
+    height: 113px;
319
+    background: url(../fonts/images/addfile.svg) no-repeat center;
320
+    border: 1px solid #eeeeee;
321
+    border-radius: 0;
322
+}
323
+#upload .filelist li.filePickerBlock div.webuploader-pick  {
324
+    width: 100%;
325
+    height: 100%;
326
+    margin: 0;
327
+    padding: 0;
328
+    opacity: 0;
329
+    background: none;
330
+    font-size: 0;
331
+}
332
+
333
+#upload .filelist div.file-panel {
334
+    position: absolute;
335
+    height: 0;
336
+    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
337
+    background: rgba(0, 0, 0, 0.5);
338
+    width: 100%;
339
+    top: 0;
340
+    left: 0;
341
+    overflow: hidden;
342
+    z-index: 300;
343
+}
344
+
345
+#upload .filelist div.file-panel span {
346
+    width: 24px;
347
+    height: 24px;
348
+    display: inline;
349
+    float: right;
350
+    text-indent: -9999px;
351
+    overflow: hidden;
352
+    background: url(./images/icons.png) no-repeat;
353
+    background: url(./images/icons.gif) no-repeat \9;
354
+    margin: 5px 1px 1px;
355
+    cursor: pointer;
356
+    -webkit-tap-highlight-color: rgba(0,0,0,0);
357
+    -webkit-user-select: none;
358
+    -moz-user-select: none;
359
+    -ms-user-select: none;
360
+    user-select: none;
361
+}
362
+
363
+#upload .filelist div.file-panel span.rotateLeft {
364
+    display:none;
365
+    background-position: 0 -24px;
366
+}
367
+
368
+#upload .filelist div.file-panel span.rotateLeft:hover {
369
+    background-position: 0 0;
370
+}
371
+
372
+#upload .filelist div.file-panel span.rotateRight {
373
+    display:none;
374
+    background-position: -24px -24px;
375
+}
376
+
377
+#upload .filelist div.file-panel span.rotateRight:hover {
378
+    background-position: -24px 0;
379
+}
380
+
381
+#upload .filelist div.file-panel span.cancel {
382
+    background-position: -48px -24px;
383
+}
384
+
385
+#upload .filelist div.file-panel span.cancel:hover {
386
+    background-position: -48px 0;
387
+}
388
+
389
+#upload .statusBar {
390
+    height: 45px;
391
+    border-bottom: 1px solid #dadada;
392
+    margin: 0 10px;
393
+    padding: 0;
394
+    line-height: 45px;
395
+    vertical-align: middle;
396
+    position: relative;
397
+}
398
+
399
+#upload .statusBar .progress {
400
+    border: 1px solid #1483d8;
401
+    width: 198px;
402
+    background: #fff;
403
+    height: 18px;
404
+    position: absolute;
405
+    top: 12px;
406
+    display: none;
407
+    text-align: center;
408
+    line-height: 18px;
409
+    color: #6dbfff;
410
+    margin: 0 10px 0 0;
411
+}
412
+#upload .statusBar .progress span.percentage {
413
+    width: 0;
414
+    height: 100%;
415
+    left: 0;
416
+    top: 0;
417
+    background: #1483d8;
418
+    position: absolute;
419
+}
420
+#upload .statusBar .progress span.text {
421
+    position: relative;
422
+    z-index: 10;
423
+}
424
+
425
+#upload .statusBar .info {
426
+    display: inline-block;
427
+    font-size: 14px;
428
+    color: #666666;
429
+}
430
+
431
+#upload .statusBar .btns {
432
+    position: absolute;
433
+    top: 7px;
434
+    right: 0;
435
+    line-height: 30px;
436
+}
437
+
438
+#filePickerBtn {
439
+    display: inline-block;
440
+    float: left;
441
+}
442
+#upload .statusBar .btns .webuploader-pick,
443
+#upload .statusBar .btns .uploadBtn,
444
+#upload .statusBar .btns .uploadBtn.state-uploading,
445
+#upload .statusBar .btns .uploadBtn.state-paused {
446
+    background: #ffffff;
447
+    border: 1px solid #cfcfcf;
448
+    color: #565656;
449
+    padding: 0 18px;
450
+    display: inline-block;
451
+    border-radius: 3px;
452
+    margin-left: 10px;
453
+    cursor: pointer;
454
+    font-size: 14px;
455
+    float: left;
456
+    -webkit-user-select: none;
457
+    -moz-user-select: none;
458
+    -ms-user-select: none;
459
+    user-select: none;
460
+}
461
+#upload .statusBar .btns .webuploader-pick-hover,
462
+#upload .statusBar .btns .uploadBtn:hover,
463
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
464
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
465
+    background: #f0f0f0;
466
+}
467
+
468
+#upload .statusBar .btns .uploadBtn,
469
+#upload .statusBar .btns .uploadBtn.state-paused{
470
+    background: #00b7ee;
471
+    color: #fff;
472
+    border-color: transparent;
473
+}
474
+#upload .statusBar .btns .uploadBtn:hover,
475
+#upload .statusBar .btns .uploadBtn.state-paused:hover{
476
+    background: #00a2d4;
477
+}
478
+
479
+#upload .statusBar .btns .uploadBtn.disabled {
480
+    pointer-events: none;
481
+    filter:alpha(opacity=60);
482
+    -moz-opacity:0.6;
483
+    -khtml-opacity: 0.6;
484
+    opacity: 0.6;
485
+}
486
+
487
+
488
+
489
+/* 图片管理样式 */
490
+#online {
491
+    width: 100%;
492
+    height: 336px;
493
+    padding: 10px 0 0 0;
494
+}
495
+#online #fileList{
496
+    width: 100%;
497
+    height: 100%;
498
+    overflow-x: hidden;
499
+    overflow-y: auto;
500
+    position: relative;
501
+}
502
+#online ul {
503
+    display: block;
504
+    list-style: none;
505
+    margin: 0;
506
+    padding: 0;
507
+}
508
+#online li {
509
+    float: left;
510
+    display: block;
511
+    list-style: none;
512
+    padding: 0;
513
+    width: 113px;
514
+    height: 113px;
515
+    margin: 0 0 9px 9px;
516
+    *margin: 0 0 6px 6px;
517
+    background-color: #eee;
518
+    overflow: hidden;
519
+    cursor: pointer;
520
+    position: relative;
521
+}
522
+#online li.clearFloat {
523
+    float: none;
524
+    clear: both;
525
+    display: block;
526
+    width:0;
527
+    height:0;
528
+    margin: 0;
529
+    padding: 0;
530
+}
531
+#online li img {
532
+    cursor: pointer;
533
+}
534
+#online li div.file-wrapper {
535
+    cursor: pointer;
536
+    position: absolute;
537
+    display: block;
538
+    width: 111px;
539
+    height: 111px;
540
+    border: 1px solid #eee;
541
+    background: url("./images/bg.png") repeat;
542
+}
543
+#online li div span.file-title{
544
+    display: block;
545
+    padding: 0 3px;
546
+    margin: 3px 0 0 0;
547
+    font-size: 12px;
548
+    height: 15px;
549
+    color: #555555;
550
+    text-align: center;
551
+    width: 107px;
552
+    white-space: nowrap;
553
+    word-break: break-all;
554
+    overflow: hidden;
555
+    text-overflow: ellipsis;
556
+}
557
+#online li .icon {
558
+    cursor: pointer;
559
+    width: 113px;
560
+    height: 113px;
561
+    position: absolute;
562
+    top: 0;
563
+    left: 0;
564
+    z-index: 2;
565
+    border: 0;
566
+    background-repeat: no-repeat;
567
+}
568
+#online li .icon:hover {
569
+    width: 107px;
570
+    height: 107px;
571
+    border: 3px solid #1094fa;
572
+}
573
+#online li.selected .icon {
574
+    background-image: url(images/success.png);
575
+    background-image: url(images/success.gif) \9;
576
+    background-position: 75px 75px;
577
+}
578
+#online li.selected .icon:hover {
579
+    width: 107px;
580
+    height: 107px;
581
+    border: 3px solid #1094fa;
582
+    background-position: 72px 72px;
583
+}
584
+
585
+
586
+/* 在线文件的文件预览图标 */
587
+i.file-preview {
588
+    display: block;
589
+    margin: 10px auto;
590
+    width: 70px;
591
+    height: 70px;
592
+    background-image: url("./images/file-icons.png");
593
+    background-image: url("./images/file-icons.gif") \9;
594
+    background-position: -140px center;
595
+    background-repeat: no-repeat;
596
+}
597
+i.file-preview.file-type-dir{
598
+    background-position: 0 center;
599
+}
600
+i.file-preview.file-type-file{
601
+    background-position: -140px center;
602
+}
603
+i.file-preview.file-type-filelist{
604
+    background-position: -210px center;
605
+}
606
+i.file-preview.file-type-zip,
607
+i.file-preview.file-type-rar,
608
+i.file-preview.file-type-7z,
609
+i.file-preview.file-type-tar,
610
+i.file-preview.file-type-gz,
611
+i.file-preview.file-type-bz2{
612
+    background-position: -280px center;
613
+}
614
+i.file-preview.file-type-xls,
615
+i.file-preview.file-type-xlsx{
616
+    background-position: -350px center;
617
+}
618
+i.file-preview.file-type-doc,
619
+i.file-preview.file-type-docx{
620
+    background-position: -420px center;
621
+}
622
+i.file-preview.file-type-ppt,
623
+i.file-preview.file-type-pptx{
624
+    background-position: -490px center;
625
+}
626
+i.file-preview.file-type-vsd{
627
+    background-position: -560px center;
628
+}
629
+i.file-preview.file-type-pdf{
630
+    background-position: -630px center;
631
+}
632
+i.file-preview.file-type-txt,
633
+i.file-preview.file-type-md,
634
+i.file-preview.file-type-json,
635
+i.file-preview.file-type-htm,
636
+i.file-preview.file-type-xml,
637
+i.file-preview.file-type-html,
638
+i.file-preview.file-type-js,
639
+i.file-preview.file-type-css,
640
+i.file-preview.file-type-php,
641
+i.file-preview.file-type-jsp,
642
+i.file-preview.file-type-asp{
643
+    background-position: -700px center;
644
+}
645
+i.file-preview.file-type-apk{
646
+    background-position: -770px center;
647
+}
648
+i.file-preview.file-type-exe{
649
+    background-position: -840px center;
650
+}
651
+i.file-preview.file-type-ipa{
652
+    background-position: -910px center;
653
+}
654
+i.file-preview.file-type-mp4,
655
+i.file-preview.file-type-swf,
656
+i.file-preview.file-type-mkv,
657
+i.file-preview.file-type-avi,
658
+i.file-preview.file-type-flv,
659
+i.file-preview.file-type-mov,
660
+i.file-preview.file-type-mpg,
661
+i.file-preview.file-type-mpeg,
662
+i.file-preview.file-type-ogv,
663
+i.file-preview.file-type-webm,
664
+i.file-preview.file-type-rm,
665
+i.file-preview.file-type-rmvb{
666
+    background-position: -980px center;
667
+}
668
+i.file-preview.file-type-ogg,
669
+i.file-preview.file-type-wav,
670
+i.file-preview.file-type-wmv,
671
+i.file-preview.file-type-mid,
672
+i.file-preview.file-type-mp3{
673
+    background-position: -1050px center;
674
+}
675
+i.file-preview.file-type-jpg,
676
+i.file-preview.file-type-jpeg,
677
+i.file-preview.file-type-gif,
678
+i.file-preview.file-type-bmp,
679
+i.file-preview.file-type-png,
680
+i.file-preview.file-type-psd{
681
+    background-position: -140px center;
682
+}

+ 60 - 0
static/neditor/dialogs/attachment/attachment.html View File

@@ -0,0 +1,60 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+    <meta charset="UTF-8">
5
+    <title>neditor图片对话框</title>
6
+    <script type="text/javascript" src="../internal.js"></script>
7
+
8
+    <!-- jquery -->
9
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
10
+
11
+    <!-- webuploader -->
12
+    <script src="../../third-party/webuploader/webuploader.js"></script>
13
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
14
+
15
+    <!-- attachment dialog -->
16
+    <link rel="stylesheet" href="attachment.css" type="text/css" />
17
+</head>
18
+<body>
19
+
20
+    <div class="wrapper">
21
+        <div id="tabhead" class="tabhead">
22
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
23
+            <!-- <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span> -->
24
+        </div>
25
+        <div id="tabbody" class="tabbody">
26
+            <!-- 上传图片 -->
27
+            <div id="upload" class="panel focus">
28
+                <div id="queueList" class="queueList">
29
+                    <div class="statusBar element-invisible">
30
+                        <div class="progress">
31
+                            <span class="text">0%</span>
32
+                            <span class="percentage"></span>
33
+                        </div><div class="info"></div>
34
+                        <div class="btns">
35
+                            <div id="filePickerBtn"></div>
36
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
37
+                        </div>
38
+                    </div>
39
+                    <div id="dndArea" class="placeholder">
40
+                        <div class="filePickerContainer">
41
+                            <div id="filePickerReady"></div>
42
+                        </div>
43
+                    </div>
44
+                    <ul class="filelist element-invisible">
45
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
46
+                    </ul>
47
+                </div>
48
+            </div>
49
+
50
+            <!-- 在线图片 -->
51
+            <div id="online" class="panel">
52
+                <div id="fileList"><var id="lang_imgLoading"></var></div>
53
+            </div>
54
+
55
+        </div>
56
+    </div>
57
+    <script type="text/javascript" src="attachment.js"></script>
58
+
59
+</body>
60
+</html>

+ 775 - 0
static/neditor/dialogs/attachment/attachment.js View File

@@ -0,0 +1,775 @@
1
+/**
2
+ * User: Jinqn
3
+ * Date: 14-04-08
4
+ * Time: 下午16:34
5
+ * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
6
+ */
7
+
8
+(function () {
9
+
10
+    var uploadFile,
11
+        onlineFile;
12
+
13
+    window.onload = function () {
14
+        initTabs();
15
+        initButtons();
16
+    };
17
+
18
+    /* 初始化tab标签 */
19
+    function initTabs() {
20
+        var tabs = $G('tabhead').children;
21
+        for (var i = 0; i < tabs.length; i++) {
22
+            domUtils.on(tabs[i], "click", function (e) {
23
+                var target = e.target || e.srcElement;
24
+                setTabFocus(target.getAttribute('data-content-id'));
25
+            });
26
+        }
27
+
28
+        setTabFocus('upload');
29
+    }
30
+
31
+    /* 初始化tabbody */
32
+    function setTabFocus(id) {
33
+        if(!id) return;
34
+        var i, bodyId, tabs = $G('tabhead').children;
35
+        for (i = 0; i < tabs.length; i++) {
36
+            bodyId = tabs[i].getAttribute('data-content-id')
37
+            if (bodyId == id) {
38
+                domUtils.addClass(tabs[i], 'focus');
39
+                domUtils.addClass($G(bodyId), 'focus');
40
+            } else {
41
+                domUtils.removeClasses(tabs[i], 'focus');
42
+                domUtils.removeClasses($G(bodyId), 'focus');
43
+            }
44
+        }
45
+        switch (id) {
46
+            case 'upload':
47
+                uploadFile = uploadFile || new UploadFile('queueList');
48
+                break;
49
+            case 'online':
50
+                onlineFile = onlineFile || new OnlineFile('fileList');
51
+                break;
52
+        }
53
+    }
54
+
55
+    /* 初始化onok事件 */
56
+    function initButtons() {
57
+
58
+        dialog.onok = function () {
59
+            var list = [], id, tabs = $G('tabhead').children;
60
+            for (var i = 0; i < tabs.length; i++) {
61
+                if (domUtils.hasClass(tabs[i], 'focus')) {
62
+                    id = tabs[i].getAttribute('data-content-id');
63
+                    break;
64
+                }
65
+            }
66
+
67
+            switch (id) {
68
+                case 'upload':
69
+                    list = uploadFile.getInsertList();
70
+                    var count = uploadFile.getQueueCount();
71
+                    if (count) {
72
+                        $('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
73
+                        return false;
74
+                    }
75
+                    break;
76
+                case 'online':
77
+                    list = onlineFile.getInsertList();
78
+                    break;
79
+            }
80
+
81
+            editor.execCommand('insertfile', list);
82
+        };
83
+    }
84
+
85
+
86
+    /* 上传附件 */
87
+    function UploadFile(target) {
88
+        this.$wrap = target.constructor == String ? $('#' + target) : $(target);
89
+        this.init();
90
+    }
91
+    UploadFile.prototype = {
92
+        init: function () {
93
+            this.fileList = [];
94
+            this.initContainer();
95
+            this.initUploader();
96
+        },
97
+        initContainer: function () {
98
+            this.$queue = this.$wrap.find('.filelist');
99
+        },
100
+        /* 初始化容器 */
101
+        initUploader: function () {
102
+            var _this = this,
103
+                $ = jQuery,    // just in case. Make sure it's not an other libaray.
104
+                $wrap = _this.$wrap,
105
+            // 图片容器
106
+                $queue = $wrap.find('.filelist'),
107
+            // 状态栏,包括进度和控制按钮
108
+                $statusBar = $wrap.find('.statusBar'),
109
+            // 文件总体选择信息。
110
+                $info = $statusBar.find('.info'),
111
+            // 上传按钮
112
+                $upload = $wrap.find('.uploadBtn'),
113
+            // 上传按钮
114
+                $filePickerBtn = $wrap.find('.filePickerBtn'),
115
+            // 上传按钮
116
+                $filePickerBlock = $wrap.find('.filePickerBlock'),
117
+            // 没选择文件之前的内容。
118
+                $placeHolder = $wrap.find('.placeholder'),
119
+            // 总体进度条
120
+                $progress = $statusBar.find('.progress').hide(),
121
+            // 添加的文件数量
122
+                fileCount = 0,
123
+            // 添加的文件总大小
124
+                fileSize = 0,
125
+            // 优化retina, 在retina下这个值是2
126
+                ratio = window.devicePixelRatio || 1,
127
+            // 缩略图大小
128
+                thumbnailWidth = 113 * ratio,
129
+                thumbnailHeight = 113 * ratio,
130
+            // 可能有pedding, ready, uploading, confirm, done.
131
+                state = '',
132
+            // 所有文件的进度信息,key为file id
133
+                percentages = {},
134
+                supportTransition = (function () {
135
+                    var s = document.createElement('p').style,
136
+                        r = 'transition' in s ||
137
+                            'WebkitTransition' in s ||
138
+                            'MozTransition' in s ||
139
+                            'msTransition' in s ||
140
+                            'OTransition' in s;
141
+                    s = null;
142
+                    return r;
143
+                })(),
144
+            // WebUploader实例
145
+                uploader,
146
+                actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
147
+                fileMaxSize = editor.getOpt('fileMaxSize'),
148
+                acceptExtensions = (editor.getOpt('fileAllowFiles') || 
149
+                    [".txt",".doc",".docs",".xls",".xlsx",".ppt",".pdf",".odt",".ott",".fodt",".uot",".xml",".dot",".htm",".html",".rtf",".docm",".zip",".rar",".tar",".7z",".tar.gz",".tar.bz",".tar.xz"]).join('').replace(/\./g, ',').replace(/^[,]/, '');;
150
+            if (!WebUploader.Uploader.support()) {
151
+                $('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
152
+                return;
153
+            } else if (!editor.getOpt('fileActionName')) {
154
+                $('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
155
+                return;
156
+            }
157
+
158
+            uploader = _this.uploader = WebUploader.create({
159
+                pick: {
160
+                    id: '#filePickerReady',
161
+                    label: lang.uploadSelectFile
162
+                },
163
+                swf: '../../third-party/webuploader/Uploader.swf',
164
+                server: actionUrl,
165
+                fileVal: editor.getOpt('fileFieldName'),
166
+                duplicate: true,
167
+                fileSingleSizeLimit: fileMaxSize,
168
+                compress: false
169
+            });
170
+            uploader.addButton({
171
+                id: '#filePickerBlock'
172
+            });
173
+            uploader.addButton({
174
+                id: '#filePickerBtn',
175
+                label: lang.uploadAddFile
176
+            });
177
+
178
+            setState('pedding');
179
+
180
+            // 当有文件添加进来时执行,负责view的创建
181
+            function addFile(file) {
182
+                var $li = $('<li id="' + file.id + '">' +
183
+                        '<p class="title">' + file.name + '</p>' +
184
+                        '<p class="imgWrap"></p>' +
185
+                        '<p class="progress"><span></span></p>' +
186
+                        '</li>'),
187
+
188
+                    $btns = $('<div class="file-panel">' +
189
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
190
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
191
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
192
+                    $prgress = $li.find('p.progress span'),
193
+                    $wrap = $li.find('p.imgWrap'),
194
+                    $info = $('<p class="error"></p>').hide().appendTo($li),
195
+
196
+                    showError = function (code) {
197
+                        switch (code) {
198
+                            case 'exceed_size':
199
+                                text = lang.errorExceedSize;
200
+                                break;
201
+                            case 'interrupt':
202
+                                text = lang.errorInterrupt;
203
+                                break;
204
+                            case 'http':
205
+                                text = lang.errorHttp;
206
+                                break;
207
+                            case 'not_allow_type':
208
+                                text = lang.errorFileType;
209
+                                break;
210
+                            default:
211
+                                text = lang.errorUploadRetry;
212
+                                break;
213
+                        }
214
+                        $info.text(text).show();
215
+                    };
216
+
217
+                if (file.getStatus() === 'invalid') {
218
+                    showError(file.statusText);
219
+                } else {
220
+                    $wrap.text(lang.uploadPreview);
221
+                    if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
222
+                        $wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
223
+                        '<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
224
+                    } else {
225
+                        if (browser.ie && browser.version <= 7) {
226
+                            $wrap.text(lang.uploadNoPreview);
227
+                        } else {
228
+                            uploader.makeThumb(file, function (error, src) {
229
+                                if (error || !src) {
230
+                                    $wrap.text(lang.uploadNoPreview);
231
+                                } else {
232
+                                    var $img = $('<img src="' + src + '">');
233
+                                    $wrap.empty().append($img);
234
+                                    $img.on('error', function () {
235
+                                        $wrap.text(lang.uploadNoPreview);
236
+                                    });
237
+                                }
238
+                            }, thumbnailWidth, thumbnailHeight);
239
+                        }
240
+                    }
241
+                    percentages[ file.id ] = [ file.size, 0 ];
242
+                    file.rotation = 0;
243
+
244
+                    /* 检查文件格式 */
245
+                    if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
246
+                        showError('not_allow_type');
247
+                        uploader.removeFile(file);
248
+                    }
249
+                }
250
+
251
+                file.on('statuschange', function (cur, prev) {
252
+                    if (prev === 'progress') {
253
+                        $prgress.hide().width(0);
254
+                    } else if (prev === 'queued') {
255
+                        $li.off('mouseenter mouseleave');
256
+                        $btns.remove();
257
+                    }
258
+                    // 成功
259
+                    if (cur === 'error' || cur === 'invalid') {
260
+                        showError(file.statusText);
261
+                        percentages[ file.id ][ 1 ] = 1;
262
+                    } else if (cur === 'interrupt') {
263
+                        showError('interrupt');
264
+                    } else if (cur === 'queued') {
265
+                        percentages[ file.id ][ 1 ] = 0;
266
+                    } else if (cur === 'progress') {
267
+                        $info.hide();
268
+                        $prgress.css('display', 'block');
269
+                    } else if (cur === 'complete') {
270
+                    }
271
+
272
+                    $li.removeClass('state-' + prev).addClass('state-' + cur);
273
+                });
274
+
275
+                $li.on('mouseenter', function () {
276
+                    $btns.stop().animate({height: 30});
277
+                });
278
+                $li.on('mouseleave', function () {
279
+                    $btns.stop().animate({height: 0});
280
+                });
281
+
282
+                $btns.on('click', 'span', function () {
283
+                    var index = $(this).index(),
284
+                        deg;
285
+
286
+                    switch (index) {
287
+                        case 0:
288
+                            uploader.removeFile(file);
289
+                            return;
290
+                        case 1:
291
+                            file.rotation += 90;
292
+                            break;
293
+                        case 2:
294
+                            file.rotation -= 90;
295
+                            break;
296
+                    }
297
+
298
+                    if (supportTransition) {
299
+                        deg = 'rotate(' + file.rotation + 'deg)';
300
+                        $wrap.css({
301
+                            '-webkit-transform': deg,
302
+                            '-mos-transform': deg,
303
+                            '-o-transform': deg,
304
+                            'transform': deg
305
+                        });
306
+                    } else {
307
+                        $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
308
+                    }
309
+
310
+                });
311
+
312
+                $li.insertBefore($filePickerBlock);
313
+            }
314
+
315
+            // 负责view的销毁
316
+            function removeFile(file) {
317
+                var $li = $('#' + file.id);
318
+                delete percentages[ file.id ];
319
+                updateTotalProgress();
320
+                $li.off().find('.file-panel').off().end().remove();
321
+            }
322
+
323
+            function updateTotalProgress() {
324
+                var loaded = 0,
325
+                    total = 0,
326
+                    spans = $progress.children(),
327
+                    percent;
328
+
329
+                $.each(percentages, function (k, v) {
330
+                    total += v[ 0 ];
331
+                    loaded += v[ 0 ] * v[ 1 ];
332
+                });
333
+
334
+                percent = total ? loaded / total : 0;
335
+
336
+                spans.eq(0).text(Math.round(percent * 100) + '%');
337
+                spans.eq(1).css('width', Math.round(percent * 100) + '%');
338
+                updateStatus();
339
+            }
340
+
341
+            function setState(val, files) {
342
+
343
+                if (val != state) {
344
+
345
+                    var stats = uploader.getStats();
346
+
347
+                    $upload.removeClass('state-' + state);
348
+                    $upload.addClass('state-' + val);
349
+
350
+                    switch (val) {
351
+
352
+                        /* 未选择文件 */
353
+                        case 'pedding':
354
+                            $queue.addClass('element-invisible');
355
+                            $statusBar.addClass('element-invisible');
356
+                            $placeHolder.removeClass('element-invisible');
357
+                            $progress.hide(); $info.hide();
358
+                            uploader.refresh();
359
+                            break;
360
+
361
+                        /* 可以开始上传 */
362
+                        case 'ready':
363
+                            $placeHolder.addClass('element-invisible');
364
+                            $queue.removeClass('element-invisible');
365
+                            $statusBar.removeClass('element-invisible');
366
+                            $progress.hide(); $info.show();
367
+                            $upload.text(lang.uploadStart);
368
+                            uploader.refresh();
369
+                            break;
370
+
371
+                        /* 上传中 */
372
+                        case 'uploading':
373
+                            $progress.show(); $info.hide();
374
+                            $upload.text(lang.uploadPause);
375
+                            break;
376
+
377
+                        /* 暂停上传 */
378
+                        case 'paused':
379
+                            $progress.show(); $info.hide();
380
+                            $upload.text(lang.uploadContinue);
381
+                            break;
382
+
383
+                        case 'confirm':
384
+                            $progress.show(); $info.hide();
385
+                            $upload.text(lang.uploadStart);
386
+
387
+                            stats = uploader.getStats();
388
+                            if (stats.successNum && !stats.uploadFailNum) {
389
+                                setState('finish');
390
+                                return;
391
+                            }
392
+                            break;
393
+
394
+                        case 'finish':
395
+                            $progress.hide(); $info.show();
396
+                            if (stats.uploadFailNum) {
397
+                                $upload.text(lang.uploadRetry);
398
+                            } else {
399
+                                $upload.text(lang.uploadStart);
400
+                            }
401
+                            break;
402
+                    }
403
+
404
+                    state = val;
405
+                    updateStatus();
406
+
407
+                }
408
+
409
+                if (!_this.getQueueCount()) {
410
+                    $upload.addClass('disabled')
411
+                } else {
412
+                    $upload.removeClass('disabled')
413
+                }
414
+
415
+            }
416
+
417
+            function updateStatus() {
418
+                var text = '', stats;
419
+
420
+                if (state === 'ready') {
421
+                    text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
422
+                } else if (state === 'confirm') {
423
+                    stats = uploader.getStats();
424
+                    if (stats.uploadFailNum) {
425
+                        text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
426
+                    }
427
+                } else {
428
+                    stats = uploader.getStats();
429
+                    text = lang.updateStatusFinish.replace('_', fileCount).
430
+                        replace('_KB', WebUploader.formatSize(fileSize)).
431
+                        replace('_', stats.successNum);
432
+
433
+                    if (stats.uploadFailNum) {
434
+                        text += lang.updateStatusError.replace('_', stats.uploadFailNum);
435
+                    }
436
+                }
437
+
438
+                $info.html(text);
439
+            }
440
+
441
+            uploader.on('fileQueued', function (file) {
442
+                /* 选择文件后设置上传相关的url和自定义参数 */
443
+                editor.getOpt("fileUploadService")(_this, editor).setUploadData(file);
444
+
445
+                if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
446
+                    fileCount++;
447
+                    fileSize += file.size;
448
+                }
449
+
450
+                if (fileCount === 1) {
451
+                    $placeHolder.addClass('element-invisible');
452
+                    $statusBar.show();
453
+                }
454
+
455
+                addFile(file);
456
+            });
457
+
458
+            uploader.on('fileDequeued', function (file) {
459
+                if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
460
+                    fileCount--;
461
+                    fileSize -= file.size;
462
+                }
463
+
464
+                removeFile(file);
465
+                updateTotalProgress();
466
+            });
467
+
468
+            uploader.on('filesQueued', function (file) {
469
+                if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
470
+                    setState('ready');
471
+                }
472
+                updateTotalProgress();
473
+            });
474
+
475
+            uploader.on('all', function (type, files) {
476
+                switch (type) {
477
+                    case 'uploadFinished':
478
+                        setState('confirm', files);
479
+                        break;
480
+                    case 'startUpload':
481
+                        /* 设置Uploader配置项 */
482
+                        editor.getOpt("fileUploadService")(_this, editor).setUploaderOptions(uploader);
483
+                        setState('uploading', files);
484
+                        break;
485
+                    case 'stopUpload':
486
+                        setState('paused', files);
487
+                        break;
488
+                }
489
+            });
490
+
491
+            uploader.on('uploadBeforeSend', function (object, data, headers) {
492
+                //这里可以通过data对象添加POST参数
493
+                editor.getOpt("fileUploadService")(_this, editor).setFormData(object, data, headers);
494
+            });
495
+
496
+            uploader.on('uploadProgress', function (file, percentage) {
497
+                var $li = $('#' + file.id),
498
+                    $percent = $li.find('.progress span');
499
+
500
+                $percent.css('width', percentage * 100 + '%');
501
+                percentages[ file.id ][ 1 ] = percentage;
502
+                updateTotalProgress();
503
+            });
504
+
505
+            uploader.on('uploadSuccess', function (file, res) {
506
+                var $file = $('#' + file.id);
507
+                try {
508
+                    if (editor.getOpt("fileUploadService")(_this, editor).getResponseSuccess(res)) {
509
+                        _this.fileList.push(res);
510
+                        $file.append('<span class="success"></span>');
511
+                    } else {
512
+                        $file.find('.error').text(res.message).show();
513
+                    }
514
+                } catch (e) {
515
+                    $file.find('.error').text(lang.errorServerUpload).show();
516
+                }
517
+            });
518
+
519
+            uploader.on('uploadError', function (file, code) {
520
+            });
521
+            uploader.on('error', function (code, file) {
522
+                if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
523
+                    addFile(file);
524
+                }
525
+            });
526
+            uploader.on('uploadComplete', function (file, ret) {
527
+            });
528
+
529
+            $upload.on('click', function () {
530
+                if ($(this).hasClass('disabled')) {
531
+                    return false;
532
+                }
533
+
534
+                if (state === 'ready') {
535
+                    uploader.upload();
536
+                } else if (state === 'paused') {
537
+                    uploader.upload();
538
+                } else if (state === 'uploading') {
539
+                    uploader.stop();
540
+                }
541
+            });
542
+
543
+            $upload.addClass('state-' + state);
544
+            updateTotalProgress();
545
+        },
546
+        getQueueCount: function () {
547
+            var file, i, status, readyFile = 0, files = this.uploader.getFiles();
548
+            for (i = 0; file = files[i++]; ) {
549
+                status = file.getStatus();
550
+                if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
551
+            }
552
+            return readyFile;
553
+        },
554
+        getInsertList: function () {
555
+            var i, link, data, list = [],
556
+                prefix = editor.getOpt('fileUrlPrefix'),
557
+                fileSrcField = editor.getOpt("fileUploadService")(this, editor).fileSrcField || 'url',
558
+                fileSrc = '',
559
+                fileSrcFieldKeys = fileSrcField.split('.');
560
+
561
+            for (i = 0; i < this.fileList.length; i++) {
562
+                data = this.fileList[i];
563
+                if(fileSrcFieldKeys.length > 1) {
564
+                    function setFileSrc(obj, keys, index) {
565
+                        obj = obj[keys[index]];
566
+                        if (index < keys.length - 1) {
567
+                            setFileSrc(obj, keys, index += 1)
568
+                        } else {
569
+                            fileSrc = obj;
570
+                        }
571
+                    }
572
+    
573
+                    setFileSrc(data, fileSrcFieldKeys, 0);
574
+                } else {
575
+                    fileSrc = data[fileSrcField];
576
+                }
577
+                link = fileSrc;
578
+                list.push({
579
+                    title: data.original || link.substr(link.lastIndexOf('/') + 1),
580
+                    url: prefix + link
581
+                });
582
+            }
583
+            return list;
584
+        }
585
+    };
586
+
587
+
588
+    /* 在线附件 */
589
+    function OnlineFile(target) {
590
+        this.container = utils.isString(target) ? document.getElementById(target) : target;
591
+        this.init();
592
+    }
593
+    OnlineFile.prototype = {
594
+        init: function () {
595
+            this.initContainer();
596
+            this.initEvents();
597
+            this.initData();
598
+        },
599
+        /* 初始化容器 */
600
+        initContainer: function () {
601
+            this.container.innerHTML = '';
602
+            this.list = document.createElement('ul');
603
+            this.clearFloat = document.createElement('li');
604
+
605
+            domUtils.addClass(this.list, 'list');
606
+            domUtils.addClass(this.clearFloat, 'clearFloat');
607
+
608
+            this.list.appendChild(this.clearFloat);
609
+            this.container.appendChild(this.list);
610
+        },
611
+        /* 初始化滚动事件,滚动到地步自动拉取数据 */
612
+        initEvents: function () {
613
+            var _this = this;
614
+
615
+            /* 滚动拉取图片 */
616
+            domUtils.on($G('fileList'), 'scroll', function(e){
617
+                var panel = this;
618
+                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
619
+                    _this.getFileData();
620
+                }
621
+            });
622
+            /* 选中图片 */
623
+            domUtils.on(this.list, 'click', function (e) {
624
+                var target = e.target || e.srcElement,
625
+                    li = target.parentNode;
626
+
627
+                if (li.tagName.toLowerCase() == 'li') {
628
+                    if (domUtils.hasClass(li, 'selected')) {
629
+                        domUtils.removeClasses(li, 'selected');
630
+                    } else {
631
+                        domUtils.addClass(li, 'selected');
632
+                    }
633
+                }
634
+            });
635
+        },
636
+        /* 初始化第一次的数据 */
637
+        initData: function () {
638
+
639
+            /* 拉取数据需要使用的值 */
640
+            this.state = 0;
641
+            this.listSize = editor.getOpt('fileManagerListSize');
642
+            this.listIndex = 0;
643
+            this.listEnd = false;
644
+
645
+            /* 第一次拉取数据 */
646
+            this.getFileData();
647
+        },
648
+        /* 向后台拉取图片列表数据 */
649
+        getFileData: function () {
650
+            var _this = this;
651
+
652
+            if(!_this.listEnd && !this.isLoadingData) {
653
+                this.isLoadingData = true;
654
+                ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
655
+                    timeout: 100000,
656
+                    data: utils.extend({
657
+                            start: this.listIndex,
658
+                            size: this.listSize
659
+                        }, editor.queryCommandValue('serverparam')),
660
+                    method: 'get',
661
+                    onsuccess: function (r) {
662
+                        try {
663
+                            var json = eval('(' + r.responseText + ')');
664
+                            if (json.state == 'SUCCESS') {
665
+                                _this.pushData(json.list);
666
+                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
667
+                                if(_this.listIndex >= json.total) {
668
+                                    _this.listEnd = true;
669
+                                }
670
+                                _this.isLoadingData = false;
671
+                            }
672
+                        } catch (e) {
673
+                            if(r.responseText.indexOf('ue_separate_ue') != -1) {
674
+                                var list = r.responseText.split(r.responseText);
675
+                                _this.pushData(list);
676
+                                _this.listIndex = parseInt(list.length);
677
+                                _this.listEnd = true;
678
+                                _this.isLoadingData = false;
679
+                            }
680
+                        }
681
+                    },
682
+                    onerror: function () {
683
+                        _this.isLoadingData = false;
684
+                    }
685
+                });
686
+            }
687
+        },
688
+        /* 添加图片到列表界面上 */
689
+        pushData: function (list) {
690
+            var i, item, img, filetype, preview, icon, _this = this,
691
+                urlPrefix = editor.getOpt('fileManagerUrlPrefix');
692
+            for (i = 0; i < list.length; i++) {
693
+                if(list[i] && list[i].url) {
694
+                    item = document.createElement('li');
695
+                    icon = document.createElement('span');
696
+                    filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
697
+
698
+                    if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) {
699
+                        preview = document.createElement('img');
700
+                        domUtils.on(preview, 'load', (function(image){
701
+                            return function(){
702
+                                _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
703
+                            };
704
+                        })(preview));
705
+                        preview.width = 113;
706
+                        preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
707
+                    } else {
708
+                        var ic = document.createElement('i'),
709
+                            textSpan = document.createElement('span');
710
+                        textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
711
+                        preview = document.createElement('div');
712
+                        preview.appendChild(ic);
713
+                        preview.appendChild(textSpan);
714
+                        domUtils.addClass(preview, 'file-wrapper');
715
+                        domUtils.addClass(textSpan, 'file-title');
716
+                        domUtils.addClass(ic, 'file-type-' + filetype);
717
+                        domUtils.addClass(ic, 'file-preview');
718
+                    }
719
+                    domUtils.addClass(icon, 'icon');
720
+                    item.setAttribute('data-url', urlPrefix + list[i].url);
721
+                    if (list[i].original) {
722
+                        item.setAttribute('data-title', list[i].original);
723
+                    }
724
+
725
+                    item.appendChild(preview);
726
+                    item.appendChild(icon);
727
+                    this.list.insertBefore(item, this.clearFloat);
728
+                }
729
+            }
730
+        },
731
+        /* 改变图片大小 */
732
+        scale: function (img, w, h, type) {
733
+            var ow = img.width,
734
+                oh = img.height;
735
+
736
+            if (type == 'justify') {
737
+                if (ow >= oh) {
738
+                    img.width = w;
739
+                    img.height = h * oh / ow;
740
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
741
+                } else {
742
+                    img.width = w * ow / oh;
743
+                    img.height = h;
744
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
745
+                }
746
+            } else {
747
+                if (ow >= oh) {
748
+                    img.width = w * ow / oh;
749
+                    img.height = h;
750
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
751
+                } else {
752
+                    img.width = w;
753
+                    img.height = h * oh / ow;
754
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
755
+                }
756
+            }
757
+        },
758
+        getInsertList: function () {
759
+            var i, lis = this.list.children, list = [];
760
+            for (i = 0; i < lis.length; i++) {
761
+                if (domUtils.hasClass(lis[i], 'selected')) {
762
+                    var url = lis[i].getAttribute('data-url');
763
+                    var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
764
+                    list.push({
765
+                        title: title,
766
+                        url: url
767
+                    });
768
+                }
769
+            }
770
+            return list;
771
+        }
772
+    };
773
+
774
+
775
+})();

BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_chm.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_default.png View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_doc.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_exe.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_jpg.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_mp3.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_mv.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_pdf.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_ppt.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_psd.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_rar.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_txt.gif View File


BIN
static/neditor/dialogs/attachment/fileTypeImages/icon_xls.gif View File


BIN
static/neditor/dialogs/attachment/images/alignicon.gif View File


BIN
static/neditor/dialogs/attachment/images/alignicon.png View File


BIN
static/neditor/dialogs/attachment/images/bg.png View File


BIN
static/neditor/dialogs/attachment/images/file-icons.gif View File


BIN
static/neditor/dialogs/attachment/images/file-icons.png View File


BIN
static/neditor/dialogs/attachment/images/icons.gif View File


BIN
static/neditor/dialogs/attachment/images/icons.png View File


BIN
static/neditor/dialogs/attachment/images/image.png View File


BIN
static/neditor/dialogs/attachment/images/progress.png View File


BIN
static/neditor/dialogs/attachment/images/success.gif View File


BIN
static/neditor/dialogs/attachment/images/success.png View File


+ 97 - 0
static/neditor/dialogs/background/background.css View File

@@ -0,0 +1,97 @@
1
+.wrapper{ width: 424px;margin: 20px; zoom:1;position: relative}
2
+.tabbody{height:225px;}
3
+.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
4
+.tabbody .focus { display: block;}
5
+
6
+body{font-size: 12px;color: #888;overflow: hidden;}
7
+input,label{vertical-align:middle}
8
+.clear{clear: both;}
9
+.pl{padding-left: 18px;padding-left: 23px\9;}
10
+
11
+#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
12
+#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
13
+#imageList img {cursor: pointer;border: 2px solid white;}
14
+
15
+.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;border-radius: 4px;}
16
+.content div{margin: 10px 0 10px 5px;}
17
+.content .iptradio{margin: 0px 5px 5px 0px;}
18
+.txt{width:280px; margin-left: 10px;height: 26px;line-height: 26px; border-radius: 5px;border: 1px solid #ccc;}
19
+
20
+.wrapcolor{height: 19px;}
21
+div.color{float: left;margin: 0;}
22
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0 0 0 10px;float: left;}
23
+div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
24
+#custom input{height: 15px;min-height: 15px;width:20px;}
25
+#repeatType{width:100px;
26
+    margin-left: 10px;
27
+    border-radius: 4px;
28
+    height: 23px;}
29
+
30
+
31
+/* 图片管理样式 */
32
+#imgManager {
33
+    width: 100%;
34
+    height: 225px;
35
+}
36
+#imgManager #imageList{
37
+    width: 100%;
38
+    overflow-x: hidden;
39
+    overflow-y: auto;
40
+}
41
+#imgManager ul {
42
+    display: block;
43
+    list-style: none;
44
+    margin: 0;
45
+    padding: 0;
46
+}
47
+#imgManager li {
48
+    float: left;
49
+    display: block;
50
+    list-style: none;
51
+    padding: 0;
52
+    width: 113px;
53
+    height: 113px;
54
+    margin: 9px 0 0 19px;
55
+    background-color: #eee;
56
+    overflow: hidden;
57
+    cursor: pointer;
58
+    position: relative;
59
+}
60
+#imgManager li.clearFloat {
61
+    float: none;
62
+    clear: both;
63
+    display: block;
64
+    width:0;
65
+    height:0;
66
+    margin: 0;
67
+    padding: 0;
68
+}
69
+#imgManager li img {
70
+    cursor: pointer;
71
+}
72
+#imgManager li .icon {
73
+    cursor: pointer;
74
+    width: 113px;
75
+    height: 113px;
76
+    position: absolute;
77
+    top: 0;
78
+    left: 0;
79
+    z-index: 2;
80
+    border: 0;
81
+    background-repeat: no-repeat;
82
+}
83
+#imgManager li .icon:hover {
84
+    width: 107px;
85
+    height: 107px;
86
+    border: 3px solid #1094fa;
87
+}
88
+#imgManager li.selected .icon {
89
+    background-image: url(images/success.png);
90
+    background-position: 75px 75px;
91
+}
92
+#imgManager li.selected .icon:hover {
93
+    width: 107px;
94
+    height: 107px;
95
+    border: 3px solid #1094fa;
96
+    background-position: 72px 72px;
97
+}

+ 56 - 0
static/neditor/dialogs/background/background.html View File

@@ -0,0 +1,56 @@
1
+<!DOCTYPE HTML>
2
+<html>
3
+<head>
4
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
5
+    <script type="text/javascript" src="../internal.js"></script>
6
+    <link rel="stylesheet" type="text/css" href="background.css">
7
+</head>
8
+<body>
9
+    <div id="bg_container" class="wrapper">
10
+        <div id="tabHeads" class="tabhead">
11
+            <span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
12
+            <!-- <span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span> -->
13
+        </div>
14
+        <div id="tabBodys" class="tabbody">
15
+            <div id="normal" class="panel focus">
16
+                <fieldset class="bgarea">
17
+                    <legend><var id="lang_background_set"></var></legend>
18
+                    <div class="content">
19
+                        <div>
20
+                            <label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
21
+                            <label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
22
+                        </div>
23
+                        <div class="wrapcolor pl">
24
+                            <div class="color">
25
+                                <var id="lang_background_color"></var>:
26
+                            </div>
27
+                            <div id="colorPicker"></div>
28
+                            <div class="clear"></div>
29
+                        </div>
30
+                        <div class="wrapcolor pl">
31
+                            <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
32
+                        </div>
33
+                        <div id="alignment" class="alignment">
34
+                            <var id="lang_background_align"></var>:<select id="repeatType">
35
+                                <option value="center"></option>
36
+                                <option value="repeat-x"></option>
37
+                                <option value="repeat-y"></option>
38
+                                <option value="repeat"></option>
39
+                                <option value="self"></option>
40
+                            </select>
41
+                        </div>
42
+                        <div id="custom" >
43
+                            <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
44
+                        </div>
45
+                    </div>
46
+                </fieldset>
47
+
48
+            </div>
49
+            <div id="imgManager" class="panel">
50
+                <div id="imageList" style=""></div>
51
+            </div>
52
+        </div>
53
+    </div>
54
+    <script type="text/javascript" src="background.js"></script>
55
+</body>
56
+</html>

+ 376 - 0
static/neditor/dialogs/background/background.js View File

@@ -0,0 +1,376 @@
1
+(function () {
2
+
3
+    var onlineImage,
4
+        backupStyle = editor.queryCommandValue('background');
5
+
6
+    window.onload = function () {
7
+        initTabs();
8
+        initColorSelector();
9
+    };
10
+
11
+    /* 初始化tab标签 */
12
+    function initTabs(){
13
+        var tabs = $G('tabHeads').children;
14
+        for (var i = 0; i < tabs.length; i++) {
15
+            domUtils.on(tabs[i], "click", function (e) {
16
+                var target = e.target || e.srcElement;
17
+                for (var j = 0; j < tabs.length; j++) {
18
+                    if(tabs[j] == target){
19
+                        tabs[j].className = "focus";
20
+                        var contentId = tabs[j].getAttribute('data-content-id');
21
+                        $G(contentId).style.display = "block";
22
+                        if(contentId == 'imgManager') {
23
+                            initImagePanel();
24
+                        }
25
+                    }else {
26
+                        tabs[j].className = "";
27
+                        $G(tabs[j].getAttribute('data-content-id')).style.display = "none";
28
+                    }
29
+                }
30
+            });
31
+        }
32
+    }
33
+
34
+    /* 初始化颜色设置 */
35
+    function initColorSelector () {
36
+        var obj = editor.queryCommandValue('background');
37
+        if (obj) {
38
+            var color = obj['background-color'],
39
+                repeat = obj['background-repeat'] || 'repeat',
40
+                image = obj['background-image'] || '',
41
+                position = obj['background-position'] || 'center center',
42
+                pos = position.split(' '),
43
+                x = parseInt(pos[0]) || 0,
44
+                y = parseInt(pos[1]) || 0;
45
+
46
+            if(repeat == 'no-repeat' && (x || y)) repeat = 'self';
47
+
48
+            image = image.match(/url[\s]*\(([^\)]*)\)/);
49
+            image = image ? image[1]:'';
50
+            updateFormState('colored', color, image, repeat, x, y);
51
+        } else {
52
+            updateFormState();
53
+        }
54
+
55
+        var updateHandler = function () {
56
+            updateFormState();
57
+            updateBackground();
58
+        }
59
+        domUtils.on($G('nocolorRadio'), 'click', updateBackground);
60
+        domUtils.on($G('coloredRadio'), 'click', updateHandler);
61
+        domUtils.on($G('url'), 'keyup', function(){
62
+            if($G('url').value && $G('alignment').style.display == "none") {
63
+                utils.each($G('repeatType').children, function(item){
64
+                    item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);
65
+                });
66
+            }
67
+            updateHandler();
68
+        });
69
+        domUtils.on($G('repeatType'), 'change', updateHandler);
70
+        domUtils.on($G('x'), 'keyup', updateBackground);
71
+        domUtils.on($G('y'), 'keyup', updateBackground);
72
+
73
+        initColorPicker();
74
+    }
75
+
76
+    /* 初始化颜色选择器 */
77
+    function initColorPicker() {
78
+        var me = editor,
79
+            cp = $G("colorPicker");
80
+
81
+        /* 生成颜色选择器ui对象 */
82
+        var popup = new UE.ui.Popup({
83
+            content: new UE.ui.ColorPicker({
84
+                noColorText: me.getLang("clearColor"),
85
+                editor: me,
86
+                onpickcolor: function (t, color) {
87
+                    updateFormState('colored', color);
88
+                    updateBackground();
89
+                    UE.ui.Popup.postHide();
90
+                },
91
+                onpicknocolor: function (t, color) {
92
+                    updateFormState('colored', 'transparent');
93
+                    updateBackground();
94
+                    UE.ui.Popup.postHide();
95
+                }
96
+            }),
97
+            editor: me,
98
+            onhide: function () {
99
+            }
100
+        });
101
+
102
+        /* 设置颜色选择器 */
103
+        domUtils.on(cp, "click", function () {
104
+            popup.showAnchor(this);
105
+        });
106
+        domUtils.on(document, 'mousedown', function (evt) {
107
+            var el = evt.target || evt.srcElement;
108
+            UE.ui.Popup.postHide(el);
109
+        });
110
+        domUtils.on(window, 'scroll', function () {
111
+            UE.ui.Popup.postHide();
112
+        });
113
+    }
114
+
115
+    /* 初始化在线图片列表 */
116
+    function initImagePanel() {
117
+        onlineImage = onlineImage || new OnlineImage('imageList');
118
+    }
119
+
120
+    /* 更新背景色设置面板 */
121
+    function updateFormState (radio, color, url, align, x, y) {
122
+        var nocolorRadio = $G('nocolorRadio'),
123
+            coloredRadio = $G('coloredRadio');
124
+
125
+        if(radio) {
126
+            nocolorRadio.checked = (radio == 'colored' ? false:'checked');
127
+            coloredRadio.checked = (radio == 'colored' ? 'checked':false);
128
+        }
129
+        if(color) {
130
+            domUtils.setStyle($G("colorPicker"), "background-color", color);
131
+        }
132
+
133
+        if(url && /^\//.test(url)) {
134
+            var a = document.createElement('a');
135
+            a.href = url;
136
+            browser.ie && (a.href = a.href);
137
+            url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
138
+        }
139
+
140
+        if(url || url === '') {
141
+            $G('url').value = url;
142
+        }
143
+        if(align) {
144
+            utils.each($G('repeatType').children, function(item){
145
+                item.selected = (align == item.getAttribute('value') ? 'selected':false);
146
+            });
147
+        }
148
+        if(x || y) {
149
+            $G('x').value = parseInt(x) || 0;
150
+            $G('y').value = parseInt(y) || 0;
151
+        }
152
+
153
+        $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';
154
+        $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';
155
+    }
156
+
157
+    /* 更新背景颜色 */
158
+    function updateBackground () {
159
+        if ($G('coloredRadio').checked) {
160
+            var color = domUtils.getStyle($G("colorPicker"), "background-color"),
161
+                bgimg = $G("url").value,
162
+                align = $G("repeatType").value,
163
+                backgroundObj = {
164
+                    "background-repeat": "no-repeat",
165
+                    "background-position": "center center"
166
+                };
167
+
168
+            if (color) backgroundObj["background-color"] = color;
169
+            if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
170
+            if (align == 'self') {
171
+                backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
172
+            } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
173
+                backgroundObj["background-repeat"] = align;
174
+            }
175
+
176
+            editor.execCommand('background', backgroundObj);
177
+        } else {
178
+            editor.execCommand('background', null);
179
+        }
180
+    }
181
+
182
+
183
+    /* 在线图片 */
184
+    function OnlineImage(target) {
185
+        this.container = utils.isString(target) ? document.getElementById(target) : target;
186
+        this.init();
187
+    }
188
+    OnlineImage.prototype = {
189
+        init: function () {
190
+            this.reset();
191
+            this.initEvents();
192
+        },
193
+        /* 初始化容器 */
194
+        initContainer: function () {
195
+            this.container.innerHTML = '';
196
+            this.list = document.createElement('ul');
197
+            this.clearFloat = document.createElement('li');
198
+
199
+            domUtils.addClass(this.list, 'list');
200
+            domUtils.addClass(this.clearFloat, 'clearFloat');
201
+
202
+            this.list.id = 'imageListUl';
203
+            this.list.appendChild(this.clearFloat);
204
+            this.container.appendChild(this.list);
205
+        },
206
+        /* 初始化滚动事件,滚动到地步自动拉取数据 */
207
+        initEvents: function () {
208
+            var _this = this;
209
+
210
+            /* 滚动拉取图片 */
211
+            domUtils.on($G('imageList'), 'scroll', function(e){
212
+                var panel = this;
213
+                if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
214
+                    _this.getImageData();
215
+                }
216
+            });
217
+            /* 选中图片 */
218
+            domUtils.on(this.container, 'click', function (e) {
219
+                var target = e.target || e.srcElement,
220
+                    li = target.parentNode,
221
+                    nodes = $G('imageListUl').childNodes;
222
+
223
+                if (li.tagName.toLowerCase() == 'li') {
224
+                    updateFormState('nocolor', null, '');
225
+                    for (var i = 0, node; node = nodes[i++];) {
226
+                        if (node == li && !domUtils.hasClass(node, 'selected')) {
227
+                            domUtils.addClass(node, 'selected');
228
+                            updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
229
+                        } else {
230
+                            domUtils.removeClasses(node, 'selected');
231
+                        }
232
+                    }
233
+                    updateBackground();
234
+                }
235
+            });
236
+        },
237
+        /* 初始化第一次的数据 */
238
+        initData: function () {
239
+
240
+            /* 拉取数据需要使用的值 */
241
+            this.state = 0;
242
+            this.listSize = editor.getOpt('imageManagerListSize');
243
+            this.listIndex = 0;
244
+            this.listEnd = false;
245
+
246
+            /* 第一次拉取数据 */
247
+            this.getImageData();
248
+        },
249
+        /* 重置界面 */
250
+        reset: function() {
251
+            this.initContainer();
252
+            this.initData();
253
+        },
254
+        /* 向后台拉取图片列表数据 */
255
+        getImageData: function () {
256
+            var _this = this;
257
+
258
+            if(!_this.listEnd && !this.isLoadingData) {
259
+                this.isLoadingData = true;
260
+                var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
261
+                    isJsonp = utils.isCrossDomainUrl(url);
262
+                ajax.request(url, {
263
+                    'timeout': 100000,
264
+                    'dataType': isJsonp ? 'jsonp':'',
265
+                    'data': utils.extend({
266
+                            start: this.listIndex,
267
+                            size: this.listSize
268
+                        }, editor.queryCommandValue('serverparam')),
269
+                    'method': 'get',
270
+                    'onsuccess': function (r) {
271
+                        try {
272
+                            var json = isJsonp ? r:eval('(' + r.responseText + ')');
273
+                            if (json.state == 'SUCCESS') {
274
+                                _this.pushData(json.list);
275
+                                _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
276
+                                if(_this.listIndex >= json.total) {
277
+                                    _this.listEnd = true;
278
+                                }
279
+                                _this.isLoadingData = false;
280
+                            }
281
+                        } catch (e) {
282
+                            if(r.responseText.indexOf('ue_separate_ue') != -1) {
283
+                                var list = r.responseText.split(r.responseText);
284
+                                _this.pushData(list);
285
+                                _this.listIndex = parseInt(list.length);
286
+                                _this.listEnd = true;
287
+                                _this.isLoadingData = false;
288
+                            }
289
+                        }
290
+                    },
291
+                    'onerror': function () {
292
+                        _this.isLoadingData = false;
293
+                    }
294
+                });
295
+            }
296
+        },
297
+        /* 添加图片到列表界面上 */
298
+        pushData: function (list) {
299
+            var i, item, img, icon, _this = this,
300
+                urlPrefix = editor.getOpt('imageManagerUrlPrefix');
301
+            for (i = 0; i < list.length; i++) {
302
+                if(list[i] && list[i].url) {
303
+                    item = document.createElement('li');
304
+                    img = document.createElement('img');
305
+                    icon = document.createElement('span');
306
+
307
+                    domUtils.on(img, 'load', (function(image){
308
+                        return function(){
309
+                            _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
310
+                        }
311
+                    })(img));
312
+                    img.width = 113;
313
+                    img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
314
+                    img.setAttribute('_src', urlPrefix + list[i].url);
315
+                    domUtils.addClass(icon, 'icon');
316
+
317
+                    item.appendChild(img);
318
+                    item.appendChild(icon);
319
+                    this.list.insertBefore(item, this.clearFloat);
320
+                }
321
+            }
322
+        },
323
+        /* 改变图片大小 */
324
+        scale: function (img, w, h, type) {
325
+            var ow = img.width,
326
+                oh = img.height;
327
+
328
+            if (type == 'justify') {
329
+                if (ow >= oh) {
330
+                    img.width = w;
331
+                    img.height = h * oh / ow;
332
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
333
+                } else {
334
+                    img.width = w * ow / oh;
335
+                    img.height = h;
336
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
337
+                }
338
+            } else {
339
+                if (ow >= oh) {
340
+                    img.width = w * ow / oh;
341
+                    img.height = h;
342
+                    img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
343
+                } else {
344
+                    img.width = w;
345
+                    img.height = h * oh / ow;
346
+                    img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
347
+                }
348
+            }
349
+        },
350
+        getInsertList: function () {
351
+            var i, lis = this.list.children, list = [], align = getAlign();
352
+            for (i = 0; i < lis.length; i++) {
353
+                if (domUtils.hasClass(lis[i], 'selected')) {
354
+                    var img = lis[i].firstChild,
355
+                        src = img.getAttribute('_src');
356
+                    list.push({
357
+                        src: src,
358
+                        _src: src,
359
+                        floatStyle: align
360
+                    });
361
+                }
362
+
363
+            }
364
+            return list;
365
+        }
366
+    };
367
+
368
+    dialog.onok = function () {
369
+        updateBackground();
370
+        editor.fireEvent('saveScene');
371
+    };
372
+    dialog.oncancel = function () {
373
+        editor.execCommand('background', backupStyle);
374
+    };
375
+
376
+})();

BIN
static/neditor/dialogs/background/images/bg.png View File


BIN
static/neditor/dialogs/background/images/success.png View File


+ 65 - 0
static/neditor/dialogs/charts/chart.config.js View File

@@ -0,0 +1,65 @@
1
+/*
2
+ * 图表配置文件
3
+ * */
4
+
5
+
6
+//不同类型的配置
7
+var typeConfig = [
8
+    {
9
+        chart: {
10
+            type: 'line'
11
+        },
12
+        plotOptions: {
13
+            line: {
14
+                dataLabels: {
15
+                    enabled: false
16
+                },
17
+                enableMouseTracking: true
18
+            }
19
+        }
20
+    }, {
21
+        chart: {
22
+            type: 'line'
23
+        },
24
+        plotOptions: {
25
+            line: {
26
+                dataLabels: {
27
+                    enabled: true
28
+                },
29
+                enableMouseTracking: false
30
+            }
31
+        }
32
+    }, {
33
+        chart: {
34
+            type: 'area'
35
+        }
36
+    }, {
37
+        chart: {
38
+            type: 'bar'
39
+        }
40
+    }, {
41
+        chart: {
42
+            type: 'column'
43
+        }
44
+    }, {
45
+        chart: {
46
+            plotBackgroundColor: null,
47
+            plotBorderWidth: null,
48
+            plotShadow: false
49
+        },
50
+        plotOptions: {
51
+            pie: {
52
+                allowPointSelect: true,
53
+                cursor: 'pointer',
54
+                dataLabels: {
55
+                    enabled: true,
56
+                    color: '#000000',
57
+                    connectorColor: '#000000',
58
+                    formatter: function() {
59
+                        return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
60
+                    }
61
+                }
62
+            }
63
+        }
64
+    }
65
+];

+ 165 - 0
static/neditor/dialogs/charts/charts.css View File

@@ -0,0 +1,165 @@
1
+html, body {
2
+    width: 100%;
3
+    height: 100%;
4
+    margin: 0;
5
+    padding: 0;
6
+    overflow-x: hidden;
7
+}
8
+
9
+.main {
10
+    width: 100%;
11
+    overflow: hidden;
12
+}
13
+
14
+.table-view {
15
+    height: 100%;
16
+    float: left;
17
+    margin: 20px;
18
+    width: 40%;
19
+}
20
+
21
+.table-view .table-container {
22
+    width: 100%;
23
+    margin-bottom: 50px;
24
+    overflow: scroll;
25
+}
26
+
27
+.table-view th {
28
+    padding: 5px 10px;
29
+    background-color: #F7F7F7;
30
+}
31
+
32
+.table-view td {
33
+    width: 50px;
34
+    text-align: center;
35
+    padding:0;
36
+}
37
+
38
+.table-container input {
39
+    width: 40px;
40
+    padding: 5px;
41
+    border: none;
42
+    outline: none;
43
+}
44
+
45
+.table-view caption {
46
+    font-size: 18px;
47
+    text-align: left;
48
+}
49
+
50
+.charts-view {
51
+    /*margin-left: 49%!important;*/
52
+    width: 50%;
53
+    margin-left: 49%;
54
+    height: 400px;
55
+}
56
+
57
+.charts-container {
58
+    border-left: 1px solid #c3c3c3;
59
+}
60
+
61
+.charts-format fieldset {
62
+    padding-left: 20px;
63
+    margin-bottom: 50px;
64
+}
65
+
66
+.charts-format legend {
67
+    padding-left: 10px;
68
+    padding-right: 10px;
69
+}
70
+
71
+.format-item-container {
72
+    padding: 20px;
73
+}
74
+
75
+.format-item-container label {
76
+    display: block;
77
+    margin: 10px 0;
78
+}
79
+
80
+.charts-format .data-item {
81
+    border: 1px solid black;
82
+    outline: none;
83
+    padding: 2px 3px;
84
+}
85
+
86
+/* 图表类型 */
87
+
88
+.charts-type {
89
+    margin-top: 50px;
90
+    height: 300px;
91
+}
92
+
93
+.scroll-view {
94
+    border: 1px solid #c3c3c3;
95
+    border-left: none;
96
+    border-right: none;
97
+    overflow: hidden;
98
+}
99
+
100
+.scroll-container {
101
+    margin: 20px;
102
+    width: 100%;
103
+    overflow: hidden;
104
+}
105
+
106
+.scroll-bed {
107
+    width: 10000px;
108
+    _margin-top: 20px;
109
+    -webkit-transition: margin-left .5s ease;
110
+    -moz-transition: margin-left .5s ease;
111
+    transition: margin-left .5s ease;
112
+}
113
+
114
+.view-box {
115
+    display: inline-block;
116
+    *display: inline;
117
+    *zoom: 1;
118
+    margin-right: 20px;
119
+    border: 2px solid white;
120
+    line-height: 0;
121
+    overflow: hidden;
122
+    cursor: pointer;
123
+}
124
+
125
+.view-box img {
126
+    border: 1px solid #cecece;
127
+}
128
+
129
+.view-box.selected {
130
+    border-color: #7274A7;
131
+}
132
+
133
+.button-container {
134
+    margin-bottom: 20px;
135
+    text-align: center;
136
+}
137
+
138
+.button-container a {
139
+    display: inline-block;
140
+    width: 100px;
141
+    height: 25px;
142
+    line-height: 25px;
143
+    border: 1px solid #c2ccd1;
144
+    margin-right: 30px;
145
+    text-decoration: none;
146
+    color: black;
147
+    -webkit-border-radius: 2px;
148
+    -moz-border-radius: 2px;
149
+    border-radius: 2px;
150
+}
151
+
152
+.button-container a:HOVER {
153
+    background: #fcfcfc;
154
+}
155
+
156
+.button-container a:ACTIVE {
157
+    border-top-color: #c2ccd1;
158
+    box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);
159
+}
160
+
161
+.edui-charts-not-data {
162
+    height: 100px;
163
+    line-height: 100px;
164
+    text-align: center;
165
+}

+ 89 - 0
static/neditor/dialogs/charts/charts.html View File

@@ -0,0 +1,89 @@
1
+<!DOCTYPE html>
2
+<html>
3
+    <head>
4
+        <title>chart</title>
5
+        <meta chartset="utf-8">
6
+        <link rel="stylesheet" type="text/css" href="charts.css">
7
+        <script type="text/javascript" src="../internal.js"></script>
8
+    </head>
9
+    <body>
10
+        <div class="main">
11
+            <div class="table-view">
12
+                <h3><var id="lang_data_source"></var></h3>
13
+                <div id="tableContainer" class="table-container"></div>
14
+                <h3><var id="lang_chart_format"></var></h3>
15
+                <form name="data-form">
16
+                    <div class="charts-format">
17
+                        <fieldset>
18
+                            <legend><var id="lang_data_align"></var></legend>
19
+                            <div class="format-item-container">
20
+                                <label>
21
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
22
+                                    <var id="lang_chart_align_same"></var>
23
+                                </label>
24
+                                <label>
25
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
26
+                                    <var id="lang_chart_align_reverse"></var>
27
+                                </label>
28
+                                <br>
29
+                            </div>
30
+                        </fieldset>
31
+                        <fieldset>
32
+                            <legend><var id="lang_chart_title"></var></legend>
33
+                            <div class="format-item-container">
34
+                                <label>
35
+                                    <var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
36
+                                </label>
37
+                                <label>
38
+                                    <var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
39
+                                </label>
40
+                                <label>
41
+                                    <var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
42
+                                </label>
43
+                                <label>
44
+                                    <var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
45
+                                </label>
46
+                            </div>
47
+                        </fieldset>
48
+                        <fieldset>
49
+                            <legend><var id="lang_chart_tip"></var></legend>
50
+                            <div class="format-item-container">
51
+                                <label>
52
+                                    <var id="lang_cahrt_tip_prefix"></var>
53
+                                    <input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
54
+                                </label>
55
+                                <p><var id="lang_cahrt_tip_description"></var></p>
56
+                            </div>
57
+                        </fieldset>
58
+                        <fieldset>
59
+                            <legend><var id="lang_chart_data_unit"></var></legend>
60
+                            <div class="format-item-container">
61
+                                <label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
62
+                                <p><var id="lang_chart_data_unit_description"></var></p>
63
+                            </div>
64
+                        </fieldset>
65
+                    </div>
66
+                </form>
67
+            </div>
68
+            <div class="charts-view">
69
+                <div id="chartsContainer" class="charts-container"></div>
70
+                <div id="chartsType" class="charts-type">
71
+                    <h3><var id="lang_chart_type"></var></h3>
72
+                    <div class="scroll-view">
73
+                        <div class="scroll-container">
74
+                            <div id="scrollBed" class="scroll-bed"></div>
75
+                        </div>
76
+                        <div id="buttonContainer" class="button-container">
77
+                            <a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
78
+                            <a href="#" data-title="next"><var id="lang_next_btn"></var></a>
79
+                        </div>
80
+                    </div>
81
+                </div>
82
+            </div>
83
+        </div>
84
+        <script src="../../third-party/jquery-1.10.2.min.js"></script>
85
+        <script src="../../third-party/highcharts/highcharts.js"></script>
86
+        <script src="chart.config.js"></script>
87
+        <script src="charts.js"></script>
88
+    </body>
89
+</html>

+ 519 - 0
static/neditor/dialogs/charts/charts.js View File

@@ -0,0 +1,519 @@
1
+/*
2
+ * 图片转换对话框脚本
3
+ **/
4
+
5
+var tableData = [],
6
+    //编辑器页面table
7
+    editorTable = null,
8
+    chartsConfig = window.typeConfig,
9
+    resizeTimer = null,
10
+    //初始默认图表类型
11
+    currentChartType = 0;
12
+
13
+window.onload = function () {
14
+
15
+    editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
16
+
17
+    //未找到表格, 显示错误页面
18
+    if ( !editorTable ) {
19
+        document.body.innerHTML = "<div class='edui-charts-not-data'>未找到数据</div>";
20
+        return;
21
+    }
22
+
23
+    //初始化图表类型选择
24
+    initChartsTypeView();
25
+    renderTable( editorTable );
26
+    initEvent();
27
+    initUserConfig( editorTable.getAttribute( "data-chart" ) );
28
+    $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
29
+    updateViewType( currentChartType );
30
+
31
+    dialog.addListener( "resize", function () {
32
+
33
+        if ( resizeTimer != null ) {
34
+            window.clearTimeout( resizeTimer );
35
+        }
36
+
37
+        resizeTimer = window.setTimeout( function () {
38
+
39
+            resizeTimer = null;
40
+
41
+            renderCharts();
42
+
43
+        }, 500 );
44
+
45
+    } );
46
+
47
+};
48
+
49
+function initChartsTypeView () {
50
+
51
+    var contents = [];
52
+
53
+    for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {
54
+
55
+        contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
56
+
57
+    }
58
+
59
+    $( "#scrollBed" ).html( contents.join( "" ) );
60
+
61
+}
62
+
63
+//渲染table, 以便用户修改数据
64
+function renderTable ( table ) {
65
+
66
+    var tableHtml = [];
67
+
68
+    //构造数据
69
+    for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
70
+
71
+        tableData[ i ] = [];
72
+        tableHtml[ i ] = [];
73
+
74
+        for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
75
+
76
+            var value = getCellValue( cell );
77
+
78
+            if ( i > 0 && j > 0 ) {
79
+                value = +value;
80
+            }
81
+
82
+            if ( i === 0 || j === 0 ) {
83
+                tableHtml[ i ].push( '<th>'+ value +'</th>' );
84
+            } else {
85
+                tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
86
+            }
87
+
88
+            tableData[ i ][ j ] = value;
89
+
90
+        }
91
+
92
+        tableHtml[ i ] = tableHtml[ i ].join( "" );
93
+
94
+    }
95
+
96
+    //draw 表格
97
+    $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
98
+
99
+}
100
+
101
+/*
102
+ * 根据表格已有的图表属性初始化当前图表属性
103
+ */
104
+function initUserConfig ( config ) {
105
+
106
+    var parsedConfig = {};
107
+
108
+    if ( !config ) {
109
+        return;
110
+    }
111
+
112
+    config = config.split( ";" );
113
+
114
+    $.each( config, function ( index, item ) {
115
+
116
+        item = item.split( ":" );
117
+        parsedConfig[ item[ 0 ] ] = item[ 1 ];
118
+
119
+    } );
120
+
121
+    setUserConfig( parsedConfig );
122
+
123
+}
124
+
125
+function initEvent () {
126
+
127
+    var cacheValue = null,
128
+        //图表类型数
129
+        typeViewCount = chartsConfig.length- 1,
130
+        $chartsTypeViewBox = $( '#scrollBed .view-box' );
131
+
132
+    $( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
133
+
134
+        renderCharts();
135
+
136
+    } )
137
+
138
+    $( ".table-view" ).delegate( ".data-item", "focus", function () {
139
+
140
+        cacheValue = this.value;
141
+
142
+    } ).delegate( ".data-item", "blur", function () {
143
+
144
+        if ( this.value !== cacheValue ) {
145
+            renderCharts();
146
+        }
147
+
148
+        cacheValue = null;
149
+
150
+    } );
151
+
152
+    $( "#buttonContainer" ).delegate( "a", "click", function (e) {
153
+
154
+        e.preventDefault();
155
+
156
+        if ( this.getAttribute( "data-title" ) === 'prev' ) {
157
+
158
+            if ( currentChartType > 0 ) {
159
+                currentChartType--;
160
+                updateViewType( currentChartType );
161
+            }
162
+
163
+        } else {
164
+
165
+            if ( currentChartType < typeViewCount ) {
166
+                currentChartType++;
167
+                updateViewType( currentChartType );
168
+            }
169
+
170
+        }
171
+
172
+    } );
173
+
174
+    //图表类型变化
175
+    $( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
176
+
177
+        var index = $( this ).attr( "data-chart-type" );
178
+        $chartsTypeViewBox.removeClass( "selected" );
179
+        $( $chartsTypeViewBox[ index ] ).addClass( "selected" );
180
+
181
+        currentChartType = index | 0;
182
+
183
+        //饼图, 禁用部分配置
184
+        if ( currentChartType === chartsConfig.length - 1 ) {
185
+
186
+            disableNotPieConfig();
187
+
188
+        //启用完整配置
189
+        } else {
190
+
191
+            enableNotPieConfig();
192
+
193
+        }
194
+
195
+        renderCharts();
196
+
197
+    } );
198
+
199
+}
200
+
201
+function renderCharts () {
202
+
203
+    var data = collectData();
204
+
205
+    $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
206
+
207
+        credits: {
208
+            enabled: false
209
+        },
210
+        exporting: {
211
+            enabled: false
212
+        },
213
+        title: {
214
+            text: data.title,
215
+            x: -20 //center
216
+        },
217
+        subtitle: {
218
+            text: data.subTitle,
219
+            x: -20
220
+        },
221
+        xAxis: {
222
+            title: {
223
+                text: data.xTitle
224
+            },
225
+            categories: data.categories
226
+        },
227
+        yAxis: {
228
+            title: {
229
+                text: data.yTitle
230
+            },
231
+            plotLines: [{
232
+                value: 0,
233
+                width: 1,
234
+                color: '#808080'
235
+            }]
236
+        },
237
+        tooltip: {
238
+            enabled: true,
239
+            valueSuffix: data.suffix
240
+        },
241
+        legend: {
242
+            layout: 'vertical',
243
+            align: 'right',
244
+            verticalAlign: 'middle',
245
+            borderWidth: 1
246
+        },
247
+        series: data.series
248
+
249
+    } ));
250
+
251
+}
252
+
253
+function updateViewType ( index ) {
254
+
255
+    $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
256
+
257
+}
258
+
259
+function collectData () {
260
+
261
+    var form = document.forms[ 'data-form' ],
262
+        data = null;
263
+
264
+    if ( currentChartType !== chartsConfig.length - 1 ) {
265
+
266
+        data = getSeriesAndCategories();
267
+        $.extend( data, getUserConfig() );
268
+
269
+    //饼图数据格式
270
+    } else {
271
+        data = getSeriesForPieChart();
272
+        data.title = form[ 'title' ].value;
273
+        data.suffix = form[ 'unit' ].value;
274
+    }
275
+
276
+    return data;
277
+
278
+}
279
+
280
+/**
281
+ * 获取用户配置信息
282
+ */
283
+function getUserConfig () {
284
+
285
+    var form = document.forms[ 'data-form' ],
286
+        info = {
287
+            title: form[ 'title' ].value,
288
+            subTitle: form[ 'sub-title' ].value,
289
+            xTitle: form[ 'x-title' ].value,
290
+            yTitle: form[ 'y-title' ].value,
291
+            suffix: form[ 'unit' ].value,
292
+            //数据对齐方式
293
+            tableDataFormat: getTableDataFormat (),
294
+            //饼图提示文字
295
+            tip: $( "#tipInput" ).val()
296
+        };
297
+
298
+    return info;
299
+
300
+}
301
+
302
+function setUserConfig ( config ) {
303
+
304
+    var form = document.forms[ 'data-form' ];
305
+
306
+    config.title && ( form[ 'title' ].value = config.title );
307
+    config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
308
+    config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
309
+    config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
310
+    config.suffix && ( form[ 'unit' ].value = config.suffix );
311
+    config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
312
+    config.tip && ( form[ 'tip' ].value = config.tip );
313
+    currentChartType = config.chartType || 0;
314
+
315
+}
316
+
317
+function getSeriesAndCategories () {
318
+
319
+    var form = document.forms[ 'data-form' ],
320
+        series = [],
321
+        categories = [],
322
+        tmp = [],
323
+        tableData = getTableData();
324
+
325
+    //反转数据
326
+    if ( getTableDataFormat() === "-1" ) {
327
+
328
+        for ( var i = 0, len = tableData.length; i < len; i++ ) {
329
+
330
+            for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
331
+
332
+                if ( !tmp[ j ] ) {
333
+                    tmp[ j ] = [];
334
+                }
335
+
336
+                tmp[ j ][ i ] = tableData[ i ][ j ];
337
+
338
+            }
339
+
340
+        }
341
+
342
+        tableData = tmp;
343
+
344
+    }
345
+
346
+    categories = tableData[0].slice( 1 );
347
+
348
+    for ( var i = 1, data; data = tableData[ i ]; i++ ) {
349
+
350
+        series.push( {
351
+            name: data[ 0 ],
352
+            data: data.slice( 1 )
353
+        } );
354
+
355
+    }
356
+
357
+    return {
358
+        series: series,
359
+        categories: categories
360
+    };
361
+
362
+}
363
+
364
+/*
365
+ * 获取数据源数据对齐方式
366
+ */
367
+function getTableDataFormat () {
368
+
369
+    var form = document.forms[ 'data-form' ],
370
+        items = form['charts-format'];
371
+
372
+    return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
373
+
374
+}
375
+
376
+/*
377
+ * 禁用非饼图类型的配置项
378
+ */
379
+function disableNotPieConfig() {
380
+
381
+    updateConfigItem( 'disable' );
382
+
383
+}
384
+
385
+/*
386
+ * 启用非饼图类型的配置项
387
+ */
388
+function enableNotPieConfig() {
389
+
390
+    updateConfigItem( 'enable' );
391
+
392
+}
393
+
394
+function updateConfigItem ( value ) {
395
+
396
+    var table = $( "#showTable" )[ 0 ],
397
+        isDisable = value === 'disable' ? true : false;
398
+
399
+    //table中的input处理
400
+    for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
401
+
402
+        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
403
+
404
+            $( "input", cell ).attr( "disabled", isDisable );
405
+
406
+        }
407
+
408
+    }
409
+
410
+    //其他项处理
411
+    $( "input.not-pie-item" ).attr( "disabled", isDisable );
412
+    $( "#tipInput" ).attr( "disabled", !isDisable )
413
+
414
+}
415
+
416
+/*
417
+ * 获取饼图数据
418
+ * 饼图的数据只取第一行的
419
+ **/
420
+function getSeriesForPieChart () {
421
+
422
+    var series = {
423
+            type: 'pie',
424
+            name: $("#tipInput").val(),
425
+            data: []
426
+        },
427
+        tableData = getTableData();
428
+
429
+
430
+    for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
431
+
432
+        var title = tableData[ 0 ][ j ],
433
+            val = tableData[ 1 ][ j ];
434
+
435
+        series.data.push( [ title, val ] );
436
+
437
+    }
438
+
439
+    return {
440
+        series: [ series ]
441
+    };
442
+
443
+}
444
+
445
+function getTableData () {
446
+
447
+    var table = document.getElementById( "showTable" ),
448
+        xCount = table.rows[0].cells.length - 1,
449
+        values = getTableInputValue();
450
+
451
+    for ( var i = 0, value; value = values[ i ]; i++ ) {
452
+
453
+        tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
454
+
455
+    }
456
+
457
+    return tableData;
458
+
459
+}
460
+
461
+function getTableInputValue () {
462
+
463
+    var table = document.getElementById( "showTable" ),
464
+        inputs = table.getElementsByTagName( "input" ),
465
+        values = [];
466
+
467
+    for ( var i = 0, input; input = inputs[ i ]; i++ ) {
468
+        values.push( input.value | 0 );
469
+    }
470
+
471
+    return values;
472
+
473
+}
474
+
475
+function getCellValue ( cell ) {
476
+
477
+    var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
478
+
479
+    return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
480
+
481
+}
482
+
483
+
484
+//dialog确认事件
485
+dialog.onok = function () {
486
+
487
+    //收集信息
488
+    var form = document.forms[ 'data-form' ],
489
+        info = getUserConfig();
490
+
491
+    //添加图表类型
492
+    info.chartType = currentChartType;
493
+
494
+    //同步表格数据到编辑器
495
+    syncTableData();
496
+
497
+    //执行图表命令
498
+    editor.execCommand( 'charts', info );
499
+
500
+};
501
+
502
+/*
503
+ * 同步图表编辑视图的表格数据到编辑器里的原始表格
504
+ */
505
+function syncTableData () {
506
+
507
+    var tableData = getTableData();
508
+
509
+    for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
510
+
511
+        for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
512
+
513
+            cell.innerHTML = tableData[ i ] [ j ];
514
+
515
+        }
516
+
517
+    }
518
+
519
+}

BIN
static/neditor/dialogs/charts/images/charts0.png View File


BIN
static/neditor/dialogs/charts/images/charts1.png View File


BIN
static/neditor/dialogs/charts/images/charts2.png View File


BIN
static/neditor/dialogs/charts/images/charts3.png View File


BIN
static/neditor/dialogs/charts/images/charts4.png View File


BIN
static/neditor/dialogs/charts/images/charts5.png View File


+ 43 - 0
static/neditor/dialogs/emotion/emotion.css View File

@@ -0,0 +1,43 @@
1
+.jd img{
2
+    background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
3
+    cursor:pointer;width:35px;height:35px;display:block;
4
+}
5
+.pp img{
6
+    background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
7
+    cursor:pointer;width:25px;height:25px;display:block;
8
+}
9
+.ldw img{
10
+    background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
11
+    cursor:pointer;width:35px;height:35px;display:block;
12
+}
13
+.tsj img{
14
+    background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
15
+    cursor:pointer;width:35px;height:35px;display:block;
16
+}
17
+.cat img{
18
+    background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
19
+    cursor:pointer;width:35px;height:35px;display:block;
20
+}
21
+.bb img{
22
+    background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
23
+    cursor:pointer;width:35px;height:35px;display:block;
24
+}
25
+.youa img{
26
+    background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
27
+    cursor:pointer;width:35px;height:35px;display:block;
28
+}
29
+
30
+.smileytable td {height: 37px;}
31
+#tabPanel{margin-left:5px;overflow: hidden;}
32
+#tabContent {float:left;background:#FFFFFF;}
33
+#tabContent div{display: none;width:480px;overflow:hidden;}
34
+#tabIconReview.show{left:17px;display:block;}
35
+.menuFocus{background:#ACCD3C;}
36
+.menuDefault{background:#FFFFFF;}
37
+#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
38
+img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
39
+
40
+.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
41
+.tabbody table{width: 100%;}
42
+.tabbody td{border:1px solid #BAC498;}
43
+.tabbody td span{display: block;zoom:1;padding:0 4px;}

+ 54 - 0
static/neditor/dialogs/emotion/emotion.html View File

@@ -0,0 +1,54 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
2
+<html xmlns="http://www.w3.org/1999/xhtml">
3
+<head>
4
+    <title></title>
5
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+    <meta name="robots" content="noindex, nofollow"/>
7
+    <script type="text/javascript" src="../internal.js"></script>
8
+    <link rel="stylesheet" type="text/css" href="emotion.css">
9
+</head>
10
+<body>
11
+<div id="tabPanel" class="wrapper">
12
+    <div id="tabHeads" class="tabhead">
13
+        <span><var id="lang_input_choice"></var></span>
14
+        <span><var id="lang_input_Tuzki"></var></span>
15
+        <span><var id="lang_input_lvdouwa"></var></span>
16
+        <span><var id="lang_input_BOBO"></var></span>
17
+        <span><var id="lang_input_babyCat"></var></span>
18
+        <span><var id="lang_input_bubble"></var></span>
19
+        <span><var id="lang_input_youa"></var></span>
20
+    </div>
21
+    <div id="tabBodys" class="tabbody">
22
+        <div id="tab0"></div>
23
+        <div id="tab1"></div>
24
+        <div id="tab2"></div>
25
+        <div id="tab3"></div>
26
+        <div id="tab4"></div>
27
+        <div id="tab5"></div>
28
+        <div id="tab6"></div>
29
+    </div>
30
+</div>
31
+<div id="tabIconReview">
32
+    <img id='faceReview' class='review' src="../../themes/notadd/images/spacer.gif"/>
33
+</div>
34
+<script type="text/javascript" src="emotion.js"></script>
35
+<script type="text/javascript">
36
+    var emotion = {
37
+        tabNum:7, //切换面板数量
38
+        SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
39
+        imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
40
+        imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
41
+        imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
42
+        SmileyInfor:{
43
+            tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
44
+            tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
45
+            tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
46
+            tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
47
+            tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
48
+            tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
49
+            tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
50
+        }
51
+    };
52
+</script>
53
+</body>
54
+</html>

+ 186 - 0
static/neditor/dialogs/emotion/emotion.js View File

@@ -0,0 +1,186 @@
1
+window.onload = function () {
2
+    editor.setOpt({
3
+        emotionLocalization:false
4
+    });
5
+
6
+    emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "//imgbaidu.b0.upaiyun.com/hi/";
7
+    emotion.SmileyBox = createTabList( emotion.tabNum );
8
+    emotion.tabExist = createArr( emotion.tabNum );
9
+
10
+    initImgName();
11
+    initEvtHandler( "tabHeads" );
12
+};
13
+
14
+function initImgName() {
15
+    for ( var pro in emotion.SmilmgName ) {
16
+        var tempName = emotion.SmilmgName[pro],
17
+                tempBox = emotion.SmileyBox[pro],
18
+                tempStr = "";
19
+
20
+        if ( tempBox.length ) return;
21
+        for ( var i = 1; i <= tempName[1]; i++ ) {
22
+            tempStr = tempName[0];
23
+            if ( i < 10 ) tempStr = tempStr + '0';
24
+            tempStr = tempStr + i + '.gif';
25
+            tempBox.push( tempStr );
26
+        }
27
+    }
28
+}
29
+
30
+function initEvtHandler( conId ) {
31
+    var tabHeads = $G( conId );
32
+    for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {
33
+        var tabObj = tabHeads.childNodes[i];
34
+        if ( tabObj.nodeType == 1 ) {
35
+            domUtils.on( tabObj, "click", (function ( index ) {
36
+                return function () {
37
+                    switchTab( index );
38
+                };
39
+            })( j ) );
40
+            j++;
41
+        }
42
+    }
43
+    switchTab( 0 );
44
+    $G( "tabIconReview" ).style.display = 'none';
45
+}
46
+
47
+function InsertSmiley( url, evt ) {
48
+    var obj = {
49
+        src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
50
+    };
51
+    obj._src = obj.src;
52
+    editor.execCommand( 'insertimage', obj );
53
+    if ( !evt.ctrlKey ) {
54
+        dialog.popup.hide();
55
+    }
56
+}
57
+
58
+function switchTab( index ) {
59
+
60
+    autoHeight( index );
61
+    if ( emotion.tabExist[index] == 0 ) {
62
+        emotion.tabExist[index] = 1;
63
+        createTab( 'tab' + index );
64
+    }
65
+    //获取呈现元素句柄数组
66
+    var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ),
67
+            tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ),
68
+            i = 0, L = tabHeads.length;
69
+    //隐藏所有呈现元素
70
+    for ( ; i < L; i++ ) {
71
+        tabHeads[i].className = "";
72
+        tabBodys[i].style.display = "none";
73
+    }
74
+    //显示对应呈现元素
75
+    tabHeads[index].className = "focus";
76
+    tabBodys[index].style.display = "block";
77
+}
78
+
79
+function autoHeight( index ) {
80
+    var iframe = dialog.getDom( "iframe" ),
81
+            parent = iframe.parentNode.parentNode;
82
+    switch ( index ) {
83
+        case 0:
84
+            iframe.style.height = "380px";
85
+            parent.style.height = "392px";
86
+            break;
87
+        case 1:
88
+            iframe.style.height = "220px";
89
+            parent.style.height = "232px";
90
+            break;
91
+        case 2:
92
+            iframe.style.height = "260px";
93
+            parent.style.height = "272px";
94
+            break;
95
+        case 3:
96
+            iframe.style.height = "300px";
97
+            parent.style.height = "312px";
98
+            break;
99
+        case 4:
100
+            iframe.style.height = "140px";
101
+            parent.style.height = "152px";
102
+            break;
103
+        case 5:
104
+            iframe.style.height = "260px";
105
+            parent.style.height = "272px";
106
+            break;
107
+        case 6:
108
+            iframe.style.height = "230px";
109
+            parent.style.height = "242px";
110
+            break;
111
+        default:
112
+
113
+    }
114
+}
115
+
116
+
117
+function createTab( tabName ) {
118
+    var faceVersion = "?v=1.1", //版本号
119
+            tab = $G( tabName ), //获取将要生成的Div句柄
120
+            imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
121
+            positionLine = 11 / 2, //中间数
122
+            iWidth = iHeight = 35, //图片长宽
123
+            iColWidth = 3, //表格剩余空间的显示比例
124
+            tableCss = emotion.imageCss[tabName],
125
+            cssOffset = emotion.imageCssOffset[tabName],
126
+            textHTML = ['<table class="smileytable">'],
127
+            i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
128
+            sUrl, realUrl, posflag, offset, infor;
129
+
130
+    for ( ; i < imgNum; ) {
131
+        textHTML.push( '<tr>' );
132
+        for ( var j = 0; j < imgColNum; j++, i++ ) {
133
+            faceImage = emotion.SmileyBox[tabName][i];
134
+            if ( faceImage ) {
135
+                sUrl = imagePath + faceImage + faceVersion;
136
+                realUrl = imagePath + faceImage;
137
+                posflag = j < positionLine ? 0 : 1;
138
+                offset = cssOffset * i * (-1) - 1;
139
+                infor = emotion.SmileyInfor[tabName][i];
140
+
141
+                textHTML.push( '<td  class="' + tableCss + '"   border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center"  bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
142
+                textHTML.push( '<span>' );
143
+                textHTML.push( '<img  style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
144
+                textHTML.push( '</span>' );
145
+            } else {
146
+                textHTML.push( '<td width="' + iColWidth + '%"   bgcolor="#FFFFFF">' );
147
+            }
148
+            textHTML.push( '</td>' );
149
+        }
150
+        textHTML.push( '</tr>' );
151
+    }
152
+    textHTML.push( '</table>' );
153
+    textHTML = textHTML.join( "" );
154
+    tab.innerHTML = textHTML;
155
+}
156
+
157
+function over( td, srcPath, posFlag ) {
158
+    td.style.backgroundColor = "#ACCD3C";
159
+    $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")";
160
+    if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show";
161
+    $G( "tabIconReview" ).style.display = 'block';
162
+}
163
+
164
+function out( td ) {
165
+    td.style.backgroundColor = "transparent";
166
+    var tabIconRevew = $G( "tabIconReview" );
167
+    tabIconRevew.className = "";
168
+    tabIconRevew.style.display = 'none';
169
+}
170
+
171
+function createTabList( tabNum ) {
172
+    var obj = {};
173
+    for ( var i = 0; i < tabNum; i++ ) {
174
+        obj["tab" + i] = [];
175
+    }
176
+    return obj;
177
+}
178
+
179
+function createArr( tabNum ) {
180
+    var arr = [];
181
+    for ( var i = 0; i < tabNum; i++ ) {
182
+        arr[i] = 0;
183
+    }
184
+    return arr;
185
+}
186
+

BIN
static/neditor/dialogs/emotion/images/0.gif View File


BIN
static/neditor/dialogs/emotion/images/bface.gif View File


BIN
static/neditor/dialogs/emotion/images/cface.gif View File


BIN
static/neditor/dialogs/emotion/images/fface.gif View File


BIN
static/neditor/dialogs/emotion/images/jxface2.gif View File


BIN
static/neditor/dialogs/emotion/images/neweditor-tab-bg.png View File


BIN
static/neditor/dialogs/emotion/images/tface.gif View File


BIN
static/neditor/dialogs/emotion/images/wface.gif View File


BIN
static/neditor/dialogs/emotion/images/yface.gif View File


File diff suppressed because it is too large
+ 272 - 0
static/neditor/dialogs/fonts/buttoniconex.css


BIN
static/neditor/dialogs/fonts/iconfont.eot View File


+ 398 - 0
static/neditor/dialogs/fonts/iconfont.svg View File

@@ -0,0 +1,398 @@
1
+<?xml version="1.0" standalone="no"?>
2
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+<!--
4
+2013-9-30: Created.
5
+-->
6
+<svg>
7
+<metadata>
8
+Created by iconfont
9
+</metadata>
10
+<defs>
11
+
12
+<font id="edui-notadd" horiz-adv-x="1024" >
13
+  <font-face
14
+    font-family="edui-notadd"
15
+    font-weight="500"
16
+    font-stretch="normal"
17
+    units-per-em="1024"
18
+    ascent="896"
19
+    descent="-128"
20
+  />
21
+    <missing-glyph />
22
+    
23
+    <glyph glyph-name="close" unicode="&#58964;" d="M960 742.4l-89.6 89.6-358.4-358.4-358.4 358.4-89.6-89.6 358.4-358.4-358.4-358.4 89.6-89.6 358.4 358.4 358.4-358.4 89.6 89.6-358.4 358.4 358.4 358.4z"  horiz-adv-x="1024" />
24
+
25
+    
26
+    <glyph glyph-name="searchreplace" unicode="&#59151;" d="M437.771654 317.01890000000003h82.93098L299.553354 896H219.181972L0.080371 317.01890000000003h80.883302L136.762912 476.225905h241.626065zM160.823135 541.751617l87.026337 241.114145A222.173119 222.173119 0 0 1 256.040186 823.307413a274.388921 274.388921 0 0 1 9.214553-40.441651l90.097855-241.114145h-194.529459z m825.214441-403.904587a146.920933 146.920933 0 0 1-94.705131 44.537008 145.897094 145.897094 0 0 1 74.740266 51.191963 138.730219 138.730219 0 0 1 27.13174 84.466738 117.741515 117.741515 0 0 1-45.560847 96.75281 189.922182 189.922182 0 0 1-122.348791 36.346294h-170.469237V-127.83925699999998h175.076513a204.767851 204.767851 0 0 1 137.70638 46.072766 153.575889 153.575889 0 0 1 53.751561 121.324952 136.170621 136.170621 0 0 1-35.322454 98.288569z m-255.959814 250.840618h74.740266q109.550801 0 109.5508-81.907141a91.121694 91.121694 0 0 0-30.715178-73.204506 126.956068 126.956068 0 0 0-84.978658-26.619821h-68.59723V388.687648z m180.707629-421.821774a136.682541 136.682541 0 0 0-90.609775-27.13174h-90.097854v204.767851h77.299864q135.146782 0 135.146782-99.824327a93.681292 93.681292 0 0 0-31.739017-78.323704zM460.808037 94.33386199999995a176.100352 176.100352 0 0 0-85.490578 40.95357 178.148031 178.148031 0 0 0-38.905892 219.613521L282.148087 384.080371A241.114145 241.114145 0 0 1 460.808037 29.32006899999999v-42.489329l112.110399 77.811783L460.808037 142.966226v-51.191963z"  horiz-adv-x="1024" />
27
+
28
+    
29
+    <glyph glyph-name="italic" unicode="&#58925;" d="M384 832v-64h128L384 0H256v-64h384v64H512l128 768h128V832z"  horiz-adv-x="1024" />
30
+
31
+    
32
+    <glyph glyph-name="insertcaption" unicode="&#58967;" d="M568.25 834v-393.75h393.75V834z m337.5-225h-112.5v-112.5h-56.25V609h-112.5V665.25h112.5V777.75h56.25v-112.5h112.5zM938.375 440.25H62v-506.25h900V440.25zM114.875-9.75v225H343.25v-225z m423.5625 0H399.5v225h225v-225z m370.6875 0H680.75v225h228.375zM455.75 834H62v-56.25h168.75v-337.5h56.25V777.75h168.75V834z"  horiz-adv-x="1024" />
33
+
34
+    
35
+    <glyph glyph-name="insertparagraph" unicode="&#58926;" d="M997.12 896h-997.12v-576h1024v576zM60.16 384v256h259.84v-256zM542.080 384h-158.080v256h256v-256zM963.84 384h-259.84v256h259.84zM448 320h-448v-64h192v-384h64v384h192v64z"  horiz-adv-x="1024" />
36
+
37
+    
38
+    <glyph glyph-name="inserttitlecol" unicode="&#58969;" d="M64-64v128h-64v-192h192v64h-128zM448-128h576v1024h-576zM960 192v-256h-192v256zM704 192v-256h-192v256zM960 512v-256h-192v256zM704 512v-256h-192v256zM960 832v-256h-192v256zM704 832v-256h-192v256zM64 384h128v64h-192v-192h64v128zM384 384v-128h64v192h-192v-64h128zM384-64h-128v-64h192v192h-64v-128zM64-64v128h-64v-192h192v64h-128zM448-128h576v1024h-576zM960 192v-256h-192v256zM704 192v-256h-192v256zM960 512v-256h-192v256zM704 512v-256h-192v256zM960 832v-256h-192v256zM704 832v-256h-192v256zM64 384h128v64h-192v-192h64v128zM384 384v-128h64v192h-192v-64h128zM384-64h-128v-64h192v192h-64v-128zM0 448h448v448h-448zM256 832v-128h128v-64h-128v-128h-64v128h-128v64h128v128z"  horiz-adv-x="1024" />
39
+
40
+    
41
+    <glyph glyph-name="insertimage" unicode="&#58903;" d="M350.080 360.96l128-192 263.68 430.080 156.16-256v-23.040h64v458.88c0 0.010 0 0.023 0 0.035 0 29.337-23.783 53.12-53.12 53.12-0.675 0-1.347-0.013-2.017-0.038l-853.663 0.003c-29.337 0-53.12-23.783-53.12-53.12v-727.040c0-28.63 23.21-51.84 51.84-51.84 0 0 0 0 0 0h588.16v64h-485.12zM296.96 711.68c-0.034-0-0.033-0-0.032-0-118.007-53.154-65.211-0.36 0 0zM1024 192h-192v192h-64v-192h-192v-64h192v-192h64v192h192v64z"  horiz-adv-x="1024" />
42
+
43
+    
44
+    <glyph glyph-name="previousstep" unicode="&#58928;" d="M483.84 0c-9.271 0.086-17.958 2.506-25.527 6.698l-3.273-0.298-368 332.8c-13.235 9.399-22.074 24.243-23.235 41.197 0.134-1.173 0.1-0.024 0.1 1.134 0 18.444 8.766 34.84 22.359 45.25l371.336 328.42c8.13 7.803 19.143 12.656 31.289 12.811-0.567-0.011-0.565-0.011-0.563-0.011 15.34 0 28.71-8.432 35.728-20.914 4.536-8.376 7.142-18.094 7.146-28.419l-0-191.946h29.44c34.754-0.054 68.438-4.531 100.552-12.9 60.101-15.232 114.839-46.015 159.094-87.786 24.409-12.831 74.63-78.825 101.032-155.877 11.808-7.806 39.215-98.972 43.624-196.13-3.497 49.062-2.666 43.42-2.666 37.584 0-13.892-4.709-26.684-12.617-36.868-7.167-8.081-17.718-13.251-29.479-13.305-18.37 1.665-34.085 12.269-42.803 27.412-24.444 39.773-60.939 71.608-104.398 90.375-0.074 8.386-50.308 30.081-105.051 37.675 15.832 0.434-31.071 8.408-79.837 8.408-1.776 0-3.549-0.011-5.32-0.032l-48.371 0.003v-161.28c0.493-3.088 0.775-6.648 0.775-10.274 0-15.423-5.098-29.655-13.702-41.102-7.798-8.019-18.891-13.106-31.173-13.106-2.28 0-4.519 0.175-6.704 0.513zM145.28 384l312.96-281.6v148.48c7.245 27.987 32.273 48.324 62.050 48.324 2.264 0 4.501-0.118 6.705-0.347l52.844 0.023c1.379 0.014 3.008 0.021 4.64 0.021 58.359 0 114.417-9.85 166.603-27.978 61.993-22.007 117.34-60.173 160.325-109.408l-43.568 42.646c-22.699 92.319-79.174 168.698-155.264 216.901-21.633 14.132-81.989 33.984-146.982 33.984-0.617 0-1.233-0.002-1.849-0.005-4.98 0.383-10.897 0.6-16.865 0.6-5.968 0-11.885-0.218-17.744-0.646l-12.016 0.046c-0.636-0.025-1.382-0.040-2.131-0.040-19.528 0-36.761 9.827-47.023 24.805-5.559 8.317-8.91 18.241-9.215 28.927l0.13 152.388z"  horiz-adv-x="1024" />
45
+
46
+    
47
+    <glyph glyph-name="nextstep" unicode="&#58929;" d="M506.88 15.36c-8.477 11.272-13.575 25.504-13.575 40.926 0 3.626 0.282 7.186 0.825 10.66l-0.050 159.614h-48.64c-1.501 0.019-3.275 0.029-5.051 0.029-48.766 0-95.669-7.974-139.477-22.689-50.006-17.279-94.98-47.496-130.256-86.627 4.899 12.591-24.587-25.889-40.469-70.797 10.925 27.391-5.086 17.214-23.542 16.13-10.253 0.213-20.784 5.419-27.986 13.621-9.722 10.595-15.716 24.869-15.716 40.544 0 3.971 0.385 7.852 1.119 11.608 13.646 97.38 48.926 184.899 100.832 260.053 10.486 22.71 71.898 78.958 145.81 112.475-16.158-3.265 43.015 19.543 107.047 25.738-22.32-1.169 11.377 3.266 46.109 3.274l28.94-0v192c0.014 10.328 2.629 20.042 7.223 28.527 7.288 10.538 19.676 17.6 33.714 17.6 0.683 0 1.363-0.017 2.038-0.050 12.071-0.314 23.014-5.3 31.061-13.22l370.124-327.897c13.729-10.51 22.495-26.906 22.495-45.35 0-1.157-0.035-2.307-0.103-3.447-1.522-16.856-10.584-31.479-23.778-40.507l-366.614-329.256h-3.84c-7.316-4.007-16.024-6.375-25.284-6.402-0.212-0.022-0.839-0.035-1.47-0.035-12.377 0-23.547 5.166-31.471 13.46zM565.12 661.12v-154.24c-0.823-10.739-4.61-20.458-10.535-28.506-8.813-12.907-26.046-22.734-45.574-22.734-0.75 0-1.496 0.014-2.238 0.043l-9.493-0.003c-5.075 0.382-10.992 0.6-16.96 0.6-5.968 0-11.885-0.218-17.744-0.646 0.263 0.049-0.353 0.051-0.97 0.051-64.993 0-125.349-19.852-175.335-53.823-70.569-55.034-119.949-136.478-133.177-229.562l15.866 40.18c50.614 39.788 112.633 67.349 180.391 77.216-20.185 0.726 36.912 11.038 96.409 11.112l50.881-0.008c1.928 0.206 4.165 0.324 6.43 0.324 29.778 0 54.806-20.337 61.952-47.879l0.098-150.845 313.6 281.6z"  horiz-adv-x="1024" />
48
+
49
+    
50
+    <glyph glyph-name="scaleboard" unicode="&#58930;" d="M374.935 244.376c-6.461 7.093-15.736 11.526-26.046 11.526-0.291 0-0.581-0.004-0.87-0.011l-308.991 0.001c-21.495-0.701-38.694-18.129-39.029-39.649l-0-24.333c2.003-21.281 19.78-37.802 41.416-37.802 0.736 0 1.467 0.019 2.194 0.057l163.053-0.004-186.828-190.667c-9.538-9.598-15.433-22.825-15.433-37.43s5.895-27.832 15.436-37.432c9.39-9.462 22.404-15.321 36.787-15.321 14.383 0 27.397 5.859 36.787 15.32l186.831 188.111v-165.074c-0.014-0.383-0.022-0.833-0.022-1.285 0-20.631 16.551-37.397 37.099-37.744l26.905-0c0.983-0.094 2.125-0.148 3.279-0.148 19.293 0 35.087 14.981 36.384 33.945l0.006 309.786c0.069 0.841 0.108 1.82 0.108 2.809 0 9.24-3.436 17.677-9.1 24.104zM383.893 570.045v291.758c-0.898 19.073-16.579 34.196-35.793 34.196-1.592 0-3.16-0.104-4.697-0.305l-27.971 0.019c-0.015 0-0.032 0-0.050 0-20.495 0-37.11-16.615-37.11-37.11 0-0.675 0.018-1.346 0.054-2.012l-0.004-166.261-184.269 184.269c-9.289 9.429-22.197 15.27-36.47 15.27s-27.18-5.841-36.464-15.264c-9.318-9.469-15.067-22.461-15.067-36.796 0-14.335 5.749-27.327 15.067-36.797l184.262-184.262h-161.875c-0.387 0.013-0.842 0.020-1.298 0.020-22.879 0-41.508-18.195-42.208-40.904l-0.002-26.937c1.642-20.273 18.063-36.222 38.394-37.111l310.308 0.001c0.233-0.006 0.508-0.009 0.784-0.009 10.002 0 19.029 4.173 25.436 10.873 5.684 6.325 9.152 14.716 9.152 23.917 0 1.271-0.066 2.526-0.195 3.763l0.013 19.040zM648.779 523.338c6.421-6.724 15.456-10.905 25.467-10.905 0.494 0 0.986 0.010 1.475 0.030l308.964-0.002c21.282 0.686 38.357 17.77 39.028 38.991l0.001 24.351c-2.003 21.281-19.78 37.802-41.416 37.802-0.736 0-1.467-0.019-2.194-0.057l-163.053 0.004 186.828 187.468c9.538 9.598 15.433 22.825 15.433 37.43s-5.895 27.832-15.436 37.432c-9.39 9.462-22.404 15.321-36.787 15.321-14.383 0-27.397-5.859-36.787-15.32l-186.831-184.912v165.074c0.032 0.579 0.050 1.257 0.050 1.94 0 20.416-16.207 37.047-36.457 37.728l-26.935 0.002c-1.164 0.132-2.513 0.207-3.879 0.207-19.539 0-35.49-15.366-36.426-34.673l-0.003-309.757c-0.069-0.841-0.108-1.82-0.108-2.809 0-9.24 3.436-17.677 9.1-24.104zM639.821 197.669v-291.119c0.998-18.987 16.637-34.005 35.784-34.005 0.917 0 1.826 0.034 2.726 0.102l28.032-0.007c0.015-0 0.032-0 0.050-0 20.495 0 37.11 16.615 37.11 37.11 0 0.675-0.018 1.346-0.054 2.012l0.004 166.261 185.548-184.269c9.289-9.429 22.197-15.27 36.47-15.27s27.18 5.841 36.464 15.264c9.318 9.469 15.067 22.461 15.067 36.796 0 14.335-5.749 27.327-15.067 36.797l-183.622 183.622h161.875c0.387-0.013 0.842-0.020 1.298-0.020 22.879 0 41.508 18.195 42.208 40.904l0.002 26.937c-0.666 21.074-17.41 38.028-38.335 39.027l-309.728 0.002c-0.233 0.006-0.508 0.009-0.784 0.009-10.002 0-19.029-4.173-25.436-10.873-5.651-6.317-9.098-14.684-9.098-23.857 0-1.066 0.047-2.121 0.138-3.164l-0.010-19.059z"  horiz-adv-x="1024" />
51
+
52
+    
53
+    <glyph glyph-name="brush" unicode="&#58931;" d="M986.879 611.21l-247.031 249.591c-22.153 21.757-52.546 35.188-86.077 35.188s-63.924-13.431-86.095-35.206l-474.845-476.765c-18.637-14.716-31.089-36.552-33.229-61.336l-59.567-342.489c-0.021-0.846-0.034-1.842-0.034-2.841 0-29.481 10.66-56.473 28.336-77.331 16.942-17.233 40.717-28.021 67.013-28.021 0.915 0 1.826 0.013 2.734 0.039l13.946-0.003 344.308 63.998c24.036 2.986 44.69 15.459 58.416 33.491l472.125 472.091c22.918 21.123 37.224 51.289 37.224 84.797 0 33.508-14.306 63.674-37.144 84.724zM448.018 27.551l-348.788-63.998 60.798 348.148 347.508 351.347 288.63-287.35zM922.881 507.534l-63.998-70.397-291.19 286.71 63.998 63.998c5.716 4.344 12.952 6.96 20.799 6.96s15.083-2.615 20.885-7.022l246.306-249.529c5.572-5.706 9.258-13.277 10.035-21.691 1.485 0.571-3.635-4.548-8.115-9.028z"  horiz-adv-x="1024" />
54
+
55
+    
56
+    <glyph glyph-name="background" unicode="&#58973;" d="M988.16 448h-568.32c-19.794 0-35.84-16.046-35.84-35.84 0 0 0 0 0 0v-504.32c0-19.794 16.046-35.84 35.84-35.84h568.96c0 0 0 0 0 0 19.794 0 35.84 16.046 35.84 35.84 0 0 0 0 0 0v504.32c0 0.002 0 0.004 0 0.006 0 19.794-16.046 35.84-35.84 35.84-0.225 0-0.45-0.002-0.674-0.006zM664.32 283.52c-1.074-43.349-36.469-78.080-79.977-78.080-44.183 0-80 35.817-80 80 0 44.175 35.804 79.987 79.976 80 44.338-0.719 80.004-36.829 80.004-81.27 0-0.229-0.001-0.457-0.003-0.685zM929.28-64h-467.84l131.2 205.44 85.12-133.12 177.28 298.24 104.96-178.56v-163.2c-1.040-16.12-14.369-28.8-30.66-28.8-0.021 0-0.042 0-0.063 0zM320 64h-96c-17.673 0-32-14.327-32-32s14.327-32 32-32h96zM320 256h-192c-35.346 0-64 28.654-64 64v448c0 35.346 28.654 64 64 64h640c35.346 0 64-28.654 64-64v-256h64v320c0 35.346-28.654 64-64 64h-768c-35.346 0-64-28.654-64-64v-576c0-35.346 28.654-64 64-64h256z"  horiz-adv-x="1024" />
57
+
58
+    
59
+    <glyph glyph-name="strikethrough" unicode="&#58892;" d="M994.56 224c-23.431-29.473-59.162-48.299-99.302-48.649-73.498 0.009-122.138 57.609-127.258 150.409h236.8v52.48h-236.8c7.68 92.8 58.24 150.4 132.48 150.4 35.063-0.422 66.321-16.357 87.286-41.248l28.554 35.488c-28.874 32.657-70.869 53.143-117.65 53.143-0.939 0-1.876-0.008-2.811-0.025-100.339 0.002-176.499-74.238-186.739-197.758h-100.48c26.76 17.48 44.197 47.29 44.197 81.173 0 0.938-0.013 1.873-0.040 2.804 0.003 76.023-59.517 105.463-146.557 105.463h-128v-192h-110.72l-64 192h-58.88l-64-192h-58.24v-52.48h41.6l-64-192h54.4l41.6 136.32h155.52l40.32-131.84h56.96l-64 192h95.36v-192h135.68c95.36 0 161.28 41.6 161.28 128 0.031 0.938 0.048 2.041 0.048 3.148 0 22.888-7.462 44.033-20.087 61.134l52.679-0.282c9.6-126.080 84.48-199.68 186.24-199.68 52.305 0.631 98.632 25.674 128.197 64.243zM433.92 524.8h64c64 0 100.48-18.56 100.48-69.76s-28.16-71.040-101.12-71.040h-64zM172.16 524.8c14.080-49.92 26.88-96.64 42.88-145.28h-87.040c17.28 47.36 31.36 93.44 44.16 144zM236.16 312.32h-128l4.48 14.72h120.96zM620.16 264.96c0-58.24-42.88-85.12-115.84-85.12h-70.4v145.92h154.88c21.122-10.749 35.339-32.326 35.339-57.224 0-1.484-0.050-2.955-0.15-4.414z"  horiz-adv-x="1024" />
60
+
61
+    
62
+    <glyph glyph-name="spechars" unicode="&#58883;" d="M954.24-128l-158.72 160c-74.993-63.304-172.734-101.779-279.462-101.779-1.427 0-2.852 0.007-4.275 0.021-2.434-0.062-5.559-0.096-8.691-0.096-105.177 0-201.348 38.558-275.15 102.309l-158.182-160.455-69.76 72.32 160.64 155.52c-60.013 78.679-96.281 178.281-96.653 286.339-0.087 1.262-0.144 5.312-0.144 9.374 0 103.089 36.542 197.643 97.38 271.415l-161.223 156.712 69.76 72.32 158.72-160c77.817 61.889 177.407 99.439 285.753 99.854-0.643 0.007 1.234 0.019 3.114 0.019 105.383 0 201.953-37.734 276.935-100.428l159.958 160.555 69.76-72.32-161.92-157.44c61.004-73.69 98.013-169.18 98.013-273.313 0-3.139-0.034-6.27-0.101-9.393 0.012-0.237 0.014-1.069 0.014-1.901 0-106.863-37.416-204.987-99.861-281.987l163.855-155.326zM512 736c-2.049 0.045-4.464 0.070-6.885 0.070-95.58 0-181.874-39.758-243.247-103.638-62.592-62.161-101.269-148.112-101.269-243.098 0-1.876 0.015-3.748 0.045-5.617-0.010-0.497-0.014-1.417-0.014-2.338 0-96.943 40.213-184.494 104.868-246.882 62.121-65.122 149.43-105.554 246.182-105.554 96.752 0 184.061 40.432 245.952 105.321 64.513 62.767 104.458 150.238 104.458 247.038 0 0.948-0.004 1.895-0.011 2.842 0.048 1.936 0.074 4.389 0.074 6.847 0 95.909-40.57 182.342-105.486 243.074-61.899 63.002-147.752 101.939-242.699 101.939-0.692 0-1.384-0.002-2.075-0.006z"  horiz-adv-x="1024" />
63
+
64
+    
65
+    <glyph glyph-name="clearboard" unicode="&#58932;" d="M704 768v128h-384v-128h-320v-64h64v-832h896v832h64v64zM384 832h256v-64h-256zM320-64h-192v576h192zM640-64h-256v576h256zM896-64h-192v576h192zM896 576h-768v128h768z"  horiz-adv-x="1024" />
66
+
67
+    
68
+    <glyph glyph-name="bold" unicode="&#58884;" d="M876.8 185.60000000000002c-6.4 51.2-25.6 102.4-57.6 140.8-32 38.4-83.2 70.4-128 76.8 44.8 12.8 76.8 38.4 102.4 76.8 32 38.4 38.4 83.2 38.4 134.4 0 57.6-25.6 121.6-70.4 166.4C710.4 819.2 640 832 576 832H192v-896h384c76.8-6.4 140.8 12.8 211.2 51.2 57.6 44.8 96 121.6 89.6 198.4zM288 742.4h262.4c44.8 0 96-6.4 134.4-38.4 32-25.6 51.2-57.6 44.8-96 0-44.8-12.8-83.2-44.8-115.2-38.4-32-89.6-44.8-134.4-38.4H288V742.4zM768 192c0-51.2-25.6-102.4-70.4-134.4-44.8-25.6-89.6-38.4-140.8-38.4H288V352h275.2c51.2 0 102.4-6.4 147.2-38.4 44.8-25.6 64-76.8 57.6-121.6z"  horiz-adv-x="1024" />
69
+
70
+    
71
+    <glyph glyph-name="fullscreen" unicode="&#58966;" d="M960 896h-896c-35.346 0-64-28.654-64-64v-704c0-35.346 28.654-64 64-64h320v-128h-96c-17.673 0-32-14.327-32-32s14.327-32 32-32h448c17.673 0 32 14.327 32 32s-14.327 32-32 32h-96v128h320c35.346 0 64 28.654 64 64v704c0 35.346-28.654 64-64 64zM576-64h-128v128h128zM960 192c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v576c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
72
+
73
+    
74
+    <glyph glyph-name="formatmatch" unicode="&#58893;" d="M128 448v-448l108.8 300.8L396.8 0H896V448zM128 640h768v-64H128zM384 768h256v-128H384z"  horiz-adv-x="1024" />
75
+
76
+    
77
+    <glyph glyph-name="underline" unicode="&#58885;" d="M192 0h640v-64H192zM704 832v-384c0-102.4-83.2-192-192-192-102.4 0-192 83.2-192 192V832H192v-384c0-179.2 147.2-320 320-320s320 147.2 320 320V832h-128z"  horiz-adv-x="1024" />
78
+
79
+    
80
+    <glyph glyph-name="removeformat" unicode="&#58894;" d="M682.88 832l-682.88-704 170.88-192h398.080l455.040 512zM528 64h-288l-48 56.96 192 227.2 192-227.84z"  horiz-adv-x="1024" />
81
+
82
+    
83
+    <glyph glyph-name="blockquote" unicode="&#58895;" d="M401.92 1.7279999999999518v292.48H248.064c-7.36 187.392 65.92 344.96 219.648 472.448L401.856 834.112C218.88 706.56 127.36 511.616 127.36 249.27999999999997v-247.552h274.56z m428.16 0v292.48h-153.728c-7.36 187.392 65.92 344.96 219.648 472.448L830.08 834.112c-182.976-127.616-274.432-322.496-274.432-584.832v-247.552h274.496z"  horiz-adv-x="1024" />
84
+
85
+    
86
+    <glyph glyph-name="anchor" unicode="&#58904;" d="M722.56 227.84l76.8-72.32c-69.066-57.593-157.186-94.491-253.698-100.167l30.338 404.167c75.21 27.154 128 97.922 128 181.019 0 106.039-85.961 192-192 192-106.039 0-192-85.961-192-192 0-83.098 52.79-153.865 126.663-180.597l1.337-400.423c-96.583 9.193-182.742 47.773-250.98 106.575l101.86 61.745-298.88 42.88 45.44-280.96 79.36 74.24c103.19-79.877 234.444-128.040 376.947-128.040 2.48 0 4.957 0.015 7.43 0.044 2.030-0.038 4.87-0.058 7.715-0.058 142.963 0 274.192 50.241 376.992 134.031l85.956-82.776 44.16 283.52zM384 640c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-70.692 0-128 57.308-128 128z"  horiz-adv-x="1024" />
87
+
88
+    
89
+    <glyph glyph-name="help" unicode="&#58905;" d="M512 896c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512 0 282.77-229.23 512-512 512zM512-64c-247.424 0-448 200.576-448 448s200.576 448 448 448c247.424 0 448-200.576 448-448 0-247.424-200.576-448-448-448zM512 256h-64v27.52c4.886 52.070 35.44 96.057 78.726 119.583q60.794 45.537 60.794 88.417c-3.36 32.484-30.587 57.601-63.679 57.601-0.113 0-0.225-0-0.338-0.001q-76.783 0-95.343-87.68l-108.16 20.48c15.836 91.427 94.565 160.079 189.328 160.079 9.749 0 19.329-0.727 28.687-2.129q152.545-7.55 165.985-135.55c-0.314-62.091-36.817-115.582-89.483-140.485-79.833-53.479-142.936-124.653-185.13-208.189zM448 192h128v-128h-128z"  horiz-adv-x="1024" />
90
+
91
+    
92
+    <glyph glyph-name="horizontal" unicode="&#58936;" d="M0 448h1024v-128h-1024z"  horiz-adv-x="1024" />
93
+
94
+    
95
+    <glyph glyph-name="simpleupload" unicode="&#58906;" d="M128 64l160 320 160-320h-320zM514.56 64l254.72 512 254.72-512h-509.44zM960 832h-896c-35.346 0-64-28.654-64-64v-768c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v768c0 35.346-28.654 64-64 64zM960 64c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v640c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
96
+
97
+    
98
+    <glyph glyph-name="indent" unicode="&#58907;" d="M896 480L768 576v-384l128 96L1024 384zM32 768h960c19.2 0 32 12.8 32 32s-12.8 32-32 32H32c-19.2 0-32-12.8-32-32s12.8-32 32-32zM32-64h960c19.2 0 32 12.8 32 32s-12.8 32-32 32H32c-19.2 0-32-12.8-32-32s12.8-32 32-32zM64 448h512c32 0 64 25.6 64 64 0 32-25.6 64-64 64H64c-38.4 0-64-25.6-64-64s25.6-64 64-64zM64 192h512c32 0 64 25.6 64 64 0 32-25.6 64-64 64H64c-32 0-64-25.6-64-64s25.6-64 64-64z"  horiz-adv-x="1024" />
99
+
100
+    
101
+    <glyph glyph-name="justifycenter" unicode="&#58908;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800 640h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800 256h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800-128h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM800 256h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
102
+
103
+    
104
+    <glyph glyph-name="justifyleft" unicode="&#58909;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM608 640h-576C12.8 640 0 652.8 0 672S12.8 704 32 704h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM608-128h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM608 256h-576c-19.2 0-32 12.8-32 32S12.8 320 32 320h576c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
105
+
106
+    
107
+    <glyph glyph-name="justifyjustify" unicode="&#58910;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 640H32C12.8 640 0 652.8 0 672S12.8 704 32 704h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992-128H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 256H32c-19.2 0-32 12.8-32 32S12.8 320 32 320h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
108
+
109
+    
110
+    <glyph glyph-name="justifyright" unicode="&#58911;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 640h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 64H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992-128h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 256h-576c-19.2 0-32 12.8-32 32s12.8 32 32 32h576c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
111
+
112
+    
113
+    <glyph glyph-name="link" unicode="&#58912;" d="M759.040 128v124.16c73.167 0 132.48 59.313 132.48 132.48 0 73.167-59.313 132.48-132.48 132.48l-150.4-0c-0.384 0.004-0.839 0.006-1.294 0.006-73.908 0-133.948-59.373-135.025-133.025l-128.001-0.101c2.862 142.002 118.651 256.020 261.070 256.020 1.143 0 2.284-0.007 3.423-0.022l150.227 0.002c1.157 0.018 2.522 0.029 3.89 0.029 142.422 0 258.213-114.023 261.066-255.763-2.853-142.272-118.644-256.295-261.066-256.295-1.368 0-2.733 0.011-4.095 0.031zM415.36 128h-150.4c-1.157-0.018-2.522-0.029-3.89-0.029-142.422 0-258.213 114.023-261.066 255.763 2.853 142.272 118.644 256.295 261.066 256.295 1.368 0 2.733-0.011 4.095-0.031l-0.206-124.158c-0 0-0 0-0 0-73.167 0-132.48-59.313-132.48-132.48 0-73.167 59.313-132.48 132.48-132.48 0 0 0 0 0 0h150.4c0.575-0.009 1.254-0.014 1.933-0.014 73.91 0 133.952 59.378 135.025 133.033l128.001 0.101c-2.857-142.006-118.648-256.029-261.070-256.029-1.368 0-2.733 0.011-4.095 0.031z"  horiz-adv-x="1024" />
114
+
115
+    
116
+    <glyph glyph-name="cleardoc" unicode="&#58913;" d="M895.91 639.939h-191.955v199.633c-3.964 31.88-30.89 56.308-63.523 56.308-0.162 0-0.325-0.001-0.487-0.002l-502.257 0c-1.216 0.076-2.637 0.119-4.068 0.119-36.533 0-66.506-28.090-69.498-63.85l-0.017-896.043c3.010-36.014 32.982-64.104 69.515-64.104 1.431 0 2.852 0.043 4.261 0.128l748.43-0.009c1.216-0.076 2.637-0.119 4.068-0.119 36.533 0 66.506 28.090 69.498 63.85l0.017 647.142c-3.664 32.179-30.738 56.948-63.597 56.948-0.136 0-0.273-0-0.409-0.001zM895.91-55.577c-0-4.594-3.724-8.318-8.318-8.318h-749.903c-5.301 0-9.598 4.297-9.598 9.598 0 0 0 0 0 0v877.873c0 4.594 3.724 8.318 8.318 8.318h491.404c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-191.985c3.573-30.12 28.96-53.257 59.75-53.257 1.49 0 2.968 0.054 4.431 0.161l180.242-0.011c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-620.684z"  horiz-adv-x="1024" />
117
+
118
+    
119
+    <glyph glyph-name="drafts" unicode="&#58896;" d="M832 576v160c0 17.673-14.327 32-32 32h-224v64c0 35.346-28.654 64-64 64h-128c-35.346 0-64-28.654-64-64v-64h-224c-17.673 0-32-14.327-32-32v-640c0-17.673 14.327-32 32-32h288v-192h448l192 192v512zM384 832h128v-64h-128zM192 704h512v-64h-512zM832-37.76v101.76h101.76zM960 128h-192v-192h-320v576h512z"  horiz-adv-x="1024" />
120
+
121
+    
122
+    <glyph glyph-name="subscript" unicode="&#58897;" d="M716.8 76.79999999999995v29.696c0 99.328 160.256 135.68 160.256 179.2 0 16.896-10.752 27.136-32.768 27.136a116.736 116.736 0 0 1-74.24-35.84l-47.104 51.2A170.496 170.496 0 0 0 852.992 384c76.288 0 119.808-40.448 119.808-93.184 0-74.752-95.232-94.72-142.848-141.312H972.8V76.79999999999995zM72.192 175.61599999999999l494.592 494.592a56.832 56.832 0 0 0 78.848 8.704l7.68-7.68a56.832 56.832 0 0 0-8.704-78.848l-494.592-494.592a56.832 56.832 0 0 0-78.848-8.704l-7.68 7.68a56.832 56.832 0 0 0 8.704 78.848zM566.784 97.79200000000003L72.192 592.384a56.832 56.832 0 0 0-8.704 78.848l7.68 7.68a56.832 56.832 0 0 0 78.848-8.704l494.592-494.592a56.832 56.832 0 0 0 8.704-78.848l-7.68-7.68a56.832 56.832 0 0 0-78.848 8.704z"  horiz-adv-x="1024" />
123
+
124
+    
125
+    <glyph glyph-name="unlink" unicode="&#58914;" d="M539.417 447.988v127.976c1.652-0.102 3.582-0.16 5.526-0.16 49.558 0 90.285 37.811 94.905 86.159l0.030 19.581c-4.65 48.732-45.377 86.544-94.935 86.544-1.944 0-3.874-0.058-5.789-0.173l-310.717 0.013c-1.652 0.102-3.582 0.16-5.526 0.16-49.558 0-90.285-37.811-94.905-86.159l-0.030-18.942c4.338-49.025 45.209-87.18 94.992-87.18 1.924 0 3.835 0.057 5.73 0.169l-0.261-127.988c-1.945-0.061-4.233-0.096-6.528-0.096-119.961 0-217.703 95.133-221.897 214.072l-0.011 19.58c4.205 119.322 101.947 214.455 221.908 214.455 2.296 0 4.583-0.035 6.862-0.104l310.647 0.008c1.945 0.061 4.233 0.096 6.528 0.096 119.961 0 217.703-95.133 221.897-214.072l0.011-18.94c-3.859-119.604-101.743-215.094-221.929-215.094-2.288 0-4.568 0.035-6.84 0.103zM795.368-127.902h-310.981c-1.945-0.061-4.233-0.096-6.528-0.096-119.961 0-217.703 95.133-221.897 214.072l-0.011 18.94c3.859 119.604 101.743 215.094 221.929 215.094 2.288 0 4.568-0.035 6.84-0.103l-0.333-127.968c-1.652 0.102-3.582 0.16-5.526 0.16-49.558 0-90.285-37.811-94.905-86.159l-0.030-18.942c4.338-49.025 45.209-87.18 94.992-87.18 1.924 0 3.835 0.057 5.73 0.169l311.359-0.012c1.46-0.080 3.169-0.125 4.889-0.125 49.546 0 90.265 37.792 94.902 86.123l0.030 18.943c-4.338 49.025-45.209 87.18-94.992 87.18-1.924 0-3.835-0.057-5.73-0.169l0.261 127.988c1.945 0.061 4.233 0.096 6.528 0.096 119.961 0 217.703-95.133 221.897-214.072l0.011-18.94c-3.859-119.604-101.743-215.094-221.929-215.094-2.288 0-4.568 0.035-6.84 0.103z"  horiz-adv-x="1024" />
126
+
127
+    
128
+    <glyph glyph-name="superscript" unicode="&#58898;" d="M716.8 384v29.696c0 99.328 160.256 135.68 160.256 179.2 0 16.896-10.752 27.136-32.768 27.136a116.736 116.736 0 0 1-74.24-35.84l-47.104 51.2A170.496 170.496 0 0 0 852.992 691.2C929.28 691.2 972.8 650.752 972.8 598.0160000000001c0-74.752-95.232-94.72-142.848-141.312H972.8V384zM72.192 175.61599999999999l494.592 494.592a56.832 56.832 0 0 0 78.848 8.704l7.68-7.68a56.832 56.832 0 0 0-8.704-78.848l-494.592-494.592a56.832 56.832 0 0 0-78.848-8.704l-7.68 7.68a56.832 56.832 0 0 0 8.704 78.848zM566.784 97.79200000000003L72.192 592.384a56.832 56.832 0 0 0-8.704 78.848l7.68 7.68a56.832 56.832 0 0 0 78.848-8.704l494.592-494.592a56.832 56.832 0 0 0 8.704-78.848l-7.68-7.68a56.832 56.832 0 0 0-78.848 8.704z"  horiz-adv-x="1024" />
129
+
130
+    
131
+    <glyph glyph-name="forecolor" unicode="&#58938;" d="M588.8 832H428.8L192 128h108.8l57.6 166.4h275.2l57.6-166.4H832L588.8 832zM390.4 396.8l102.4 313.6 102.4-313.6H390.4zM192 0h640v-64H192z"  horiz-adv-x="1024" />
132
+
133
+    
134
+    <glyph glyph-name="backcolor" unicode="&#58965;" d="M910.594 232.538s-105.392-190.467-105.392-246.973c-0.202-2.447-0.317-5.297-0.317-8.174 0-58.206 47.186-105.392 105.392-105.392 58.206 0 105.392 47.186 105.392 105.392 0 2.877-0.115 5.727-0.341 8.545 0.659 58.674-104.733 246.601-104.733 246.601zM412.839 795.052l-24.126-26.031-121.899 126.978-97.138-100.313 121.899-126.978-291.415-299.034 412.679-426.012 412.679 426.012zM138.566 369.675l275.543 283.797 274.908-283.797z"  horiz-adv-x="1024" />
135
+
136
+    
137
+    <glyph glyph-name="touppercase" unicode="&#58915;" d="M295.68 768l-295.68-768h113.28l74.24 192h328.96l71.040-192h116.48l-295.68 768zM242.56 320l92.16 250.88c11.787 26.52 19.084 57.373 20.096 89.81 0.577-50.126 8.010-77.346 19.81-102.083l86.814-238.607zM996.48 83.84v115.84q1.92 120.32-131.2 120.32t-152.32-92.16l67.84-17.92q8.32 55.68 82.56 51.84t64-53.76c-27.154-12.564-58.932-19.893-92.421-19.893-1.709 0-3.413 0.019-5.112 0.057q-122.627-12.164-127.747-101.764t118.4-86.4c3.66-0.341 7.916-0.536 12.216-0.536 40.397 0 76.785 17.169 102.263 44.608 0.399-15.437 7.943-29.137 19.476-37.823l69.565 0.151c-17.207 18.277-27.781 42.967-27.781 70.127 0 2.573 0.095 5.124 0.281 7.65zM926.72 128q-6.4-64-95.36-71.68-56.96 0-55.040 32t67.84 44.16c0.513-0.006 1.118-0.010 1.724-0.010 30.022 0 57.98 8.834 81.418 24.044zM949.76 512h74.24c-15.36 106.88-232.32 128-311.040 128v128l-200.96-160 200.32-160v120.96c2.461 0.045 5.363 0.070 8.271 0.070 83.861 0 162.791-21.112 231.766-58.31z"  horiz-adv-x="1024" />
138
+
139
+    
140
+    <glyph glyph-name="tolowercase" unicode="&#58916;" d="M295.68 768l-295.68-768h113.28l74.24 192h328.96l71.040-192h116.48l-295.68 768zM242.56 320l92.16 250.88c11.787 26.52 19.084 57.373 20.096 89.81 0.577-50.126 8.010-77.346 19.81-102.083l86.814-238.607zM996.48 83.84v115.84q1.92 120.32-131.2 120.32t-152.32-92.16l67.84-17.92q8.32 55.68 82.56 51.84t64-53.76c-27.154-12.564-58.932-19.893-92.421-19.893-1.709 0-3.413 0.019-5.112 0.057q-122.627-12.164-127.747-101.764t118.4-86.4c3.66-0.341 7.916-0.536 12.216-0.536 40.397 0 76.785 17.169 102.263 44.608 0.399-15.437 7.943-29.137 19.476-37.823l69.565 0.151c-17.207 18.277-27.781 42.967-27.781 70.127 0 2.573 0.095 5.124 0.281 7.65zM926.72 128q-6.4-64-95.36-71.68-56.96 0-55.040 32t67.84 44.16c0.513-0.006 1.118-0.010 1.724-0.010 30.022 0 57.98 8.834 81.418 24.044zM586.24 512h-74.24c15.36 106.88 232.32 128 311.040 128v128l200.96-160-200.96-160v120.96c-2.276 0.038-4.96 0.060-7.65 0.060-83.854 0-162.777-21.108-231.747-58.3z"  horiz-adv-x="1024" />
141
+
142
+    
143
+    <glyph glyph-name="insertvideo" unicode="&#58919;" d="M384 128l256 256-256 256v-512zM960 832h-896c-35.346 0-64-28.654-64-64v-768c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v768c0 35.346-28.654 64-64 64zM960 0h-896v768h896z"  horiz-adv-x="1024" />
144
+
145
+    
146
+    <glyph glyph-name="emotion" unicode="&#58886;" d="M512 896c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512 0 282.77-229.23 512-512 512zM512-64c-247.424 0-448 200.576-448 448s200.576 448 448 448c247.424 0 448-200.576 448-448 0-247.424-200.576-448-448-448zM256 512c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64zM640 512c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64zM512 64c141.385 0 256 114.615 256 256h-512c0-141.385 114.615-256 256-256z"  horiz-adv-x="1024" />
147
+
148
+    
149
+    <glyph glyph-name="pasteplain" unicode="&#58899;" d="M640 640v128h-64v64c0 35.346-28.654 64-64 64h-192c-35.346 0-64-28.654-64-64v-64h-64v-128zM320 832h192v-64h-192zM832 512v224c-0.704 17.824-15.323 32.007-33.256 32.007-0.234 0-0.467-0.002-0.699-0.007l-94.045 0.001v-64h64v-64h-64v-64h-576v192h-94.080c-0.198 0.004-0.431 0.007-0.664 0.007-17.932 0-32.552-14.183-33.254-31.943l-0.002-736.064h384v-128h640v640zM448-64v512h512v-512zM576 320h320v-64h-320zM704 256h64v-256h-64zM704 704h64v-128h-64z"  horiz-adv-x="1024" />
150
+
151
+    
152
+    <glyph glyph-name="preview" unicode="&#58939;" d="M895.91 639.939h-191.955v199.633c-3.964 31.88-30.89 56.308-63.523 56.308-0.162 0-0.325-0.001-0.487-0.002l-502.257 0c-1.216 0.076-2.637 0.119-4.068 0.119-36.533 0-66.506-28.090-69.498-63.85l-0.017-896.043c3.010-36.014 32.982-64.104 69.515-64.104 1.431 0 2.852 0.043 4.261 0.128l748.43-0.009c1.216-0.076 2.637-0.119 4.068-0.119 36.533 0 66.506 28.090 69.498 63.85l0.017 647.142c-3.664 32.179-30.738 56.948-63.597 56.948-0.136 0-0.273-0-0.409-0.001zM895.91-55.577c-0-4.594-3.724-8.318-8.318-8.318h-749.903c-5.301 0-9.598 4.297-9.598 9.598 0 0 0 0 0 0v877.873c0 4.594 3.724 8.318 8.318 8.318h491.404c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-191.985c3.573-30.12 28.96-53.257 59.75-53.257 1.49 0 2.968 0.054 4.431 0.161l180.242-0.011c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-620.684zM767.94 45.519l-173.399 172.759c11.267 14.903 21.003 31.929 28.429 50.141l99.541-268.33zM256.060 352.007c-0 88.345 71.618 159.962 159.962 159.962s159.962-71.618 159.962-159.962c0-88.345-71.618-159.962-159.962-159.962-88.345 0-159.962 71.618-159.962 159.962z"  horiz-adv-x="1024" />
153
+
154
+    
155
+    <glyph glyph-name="print" unicode="&#58940;" d="M320.006 448h384v-64h-384zM320.006 320h384v-64h-384zM988.806 716.8h-156.8v179.2h-640v-179.2h-156.8c-0.002 0-0.004 0-0.006 0-19.44 0-35.2-15.76-35.2-35.2 0-0.225 0.002-0.45 0.006-0.674l-0-443.486h192v-45.44l256-256h384v301.44h192v311.68c0.032 0.574 0.051 1.245 0.051 1.92s-0.018 1.346-0.055 2.013l0.004 127.907c0.004 0.19 0.006 0.415 0.006 0.64 0 19.44-15.76 35.2-35.2 35.2-0.002 0-0.004-0-0.006-0zM256.006 832h512v-115.2h-512zM896.006 320h-56.96v120.32h-71.040v-440.32h-296.96v199.040h-215.040v241.28h-68.48v-120.32h-59.52v192h768zM928.006 594.56c-0.19-0.004-0.415-0.006-0.64-0.006-18.027 0-32.64 14.613-32.64 32.64 0 18.027 14.613 32.64 32.64 32.64 18.024 0 32.636-14.61 32.64-32.633 0.004-0.191 0.006-0.415 0.006-0.64 0-17.673-14.327-32-32-32-0.002 0-0.005 0-0.007 0z"  horiz-adv-x="1024" />
156
+
157
+    
158
+    <glyph glyph-name="selectall" unicode="&#58900;" d="M184.32 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM113.92 752l-113.92-113.92v-40.32l113.92 113.92v40.32zM144 896l-144-144v-40.32l184.32 184.32h-40.32zM30.72 896l-30.72-30.72v-40.32l71.040 71.040h-40.32zM527.36 782.080l113.92 113.92h-40.32l-113.28-113.92h39.68zM113.92 408.32l-113.92-113.28v-40.32l113.92 113.92v39.68zM113.92 522.24l-113.92-113.92v-39.68l113.92 113.28v40.32zM414.080 782.080l113.28 113.92h-39.68l-113.92-113.92h40.32zM300.16 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM113.92 636.16l-113.92-113.92v-40.32l113.92 113.92v40.32zM113.92 60.8l-113.92-113.28v-40.32l113.92 113.28v40.32zM875.52 782.080l113.28 113.92h-40.32l-113.28-113.92h40.32zM113.92 174.72l-113.92-113.92v-40.32l113.92 113.92v40.32zM761.6 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM113.92 288.64l-113.92-113.92v-40.32l113.92 113.92v40.32zM647.68 782.080l113.92 113.92h-40.32l-113.92-113.92h40.32zM910.080 476.8l113.92 113.92v40.32l-113.92-113.92v-40.32zM378.88-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 590.72l113.92 113.28v40.32l-113.92-113.28v-40.32zM264.96-14.080l-113.28-113.92h40.32l113.28 113.92h-40.32zM151.68-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 744.32v-40.32l113.92 113.92v40.32l-113.92-113.92zM910.080 136.96l113.92 113.92v40.32l-113.92-113.92v-40.32zM718.72-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 250.88l113.92 113.92v40.32l-113.92-113.92v-40.32zM604.8-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM490.88-14.080l-113.92-113.92h40.32l113.92 113.92h-40.32zM910.080 364.8l113.92 113.92v40.32l-113.92-113.92v-40.32zM988.16-128l35.84 35.84v40.32l-76.16-76.16h40.32zM874.24-128l149.76 149.76v40.32l-190.080-190.080h40.32zM833.92-14.080l-113.28-113.92h39.68l113.92 113.92h-40.32zM910.080 21.76l113.92 113.92v39.68l-113.92-113.28v-40.32zM256 265.6q7.040-137.6 186.24-137.6c5.836-0.542 12.621-0.851 19.478-0.851 64.527 0 122.663 27.362 163.439 71.117 0.443-24.781 12.479-46.819 30.964-60.763l111.879 0.097c-27.64 29.266-44.63 68.846-44.63 112.395 0 4.366 0.171 8.692 0.506 12.971l-0.036 185.034q3.2 192-211.84 192t-242.56-147.2l108.8-28.8q13.44 89.6 133.76 83.2 112 6.4 101.76-86.4c-43.614-20.262-94.671-32.082-148.489-32.082-2.697 0-5.387 0.030-8.070 0.089q-198-19.207-201.2-163.207zM611.84 377.6v-44.8q-10.24-105.6-152.32-115.2-91.52 0-88.32 51.2-6.4 60.8 108.8 70.4c0.479-0.003 1.045-0.005 1.611-0.005 48.398 0 93.45 14.326 131.147 38.969z"  horiz-adv-x="1024" />
159
+
160
+    
161
+    <glyph glyph-name="mergecells" unicode="&#58941;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM320 576h-256v256h256zM384 832h256v-256h-256zM960-64h-576v576h576zM960 576h-256v256h256z"  horiz-adv-x="1024" />
162
+
163
+    
164
+    <glyph glyph-name="deletecol" unicode="&#58942;" d="M1024 588.16v307.84h-256v-576h256zM832 640v192h128v-192zM832 384v192h128v-192zM448 588.16v307.84h-448v-576h448zM64 640v192h128v-192zM256 640v192h128v-192zM64 384v192h128v-192zM256 384v192h128v-192zM640 192v68.48l-69.76-68.48h69.76zM593.28 187.52zM640 384v-136.32l64 34.56v357.76h-192v-352l64-32v128zM576 448v128h64v-128zM734.72-128l96.64 92.8-127.36 122.24 128 122.88-96 92.16-32-19.84v-154.24h-192v160l-32 14.080-96-92.16 128-122.88-127.36-122.24 96-92.8 127.36 122.24 126.72-122.24zM512 192h76.8l-76.8 74.24v-74.24z"  horiz-adv-x="1024" />
165
+
166
+    
167
+    <glyph glyph-name="deleterow" unicode="&#58943;" d="M307.84 896h-307.84v-256h576v256zM256 704h-192v128h192zM512 704h-192v128h192zM307.84 320h-307.84v-448h576v448zM256-64h-192v128h192zM256 128h-192v128h192zM512-64h-192v128h192zM512 128h-192v128h192zM716.8 535.68h-68.48l68.48-70.4v70.4zM708.48 465.28zM520.96 551.040h128l-34.56 35.84h-358.4v-219.52h352l32 35.84h-119.040zM448 448h-131.84v64h131.84zM1024 607.36l-92.8 96-122.24-127.36-122.88 128-92.16-96 19.84-21.12h137.6v-219.52h-143.36l-14.080-15.36 92.16-96 122.88 128 122.24-127.36 92.8 96.64-122.24 126.72 122.24 127.36zM716.8 403.2v76.8l-74.24-76.8h74.24z"  horiz-adv-x="1024" />
168
+
169
+    
170
+    <glyph glyph-name="attachment" unicode="&#58920;" d="M972.16 523.52l-520.32-512c-40.168-39.518-95.315-63.917-156.16-63.917-60.845 0-115.992 24.399-156.19 63.947-40.076 39.269-64.939 93.994-64.939 154.525 0 60.216 24.604 114.685 64.307 153.904l468.502 460.822c26.767 26.283 63.489 42.507 104 42.507s77.233-16.224 104.022-42.529c26.612-26.227 43.112-62.696 43.112-103.018 0-40.323-16.5-76.791-43.117-103.023l-467.857-463.377c-13.401-13.236-31.826-21.411-52.16-21.411s-38.759 8.175-52.168 21.418c-13.309 13.117-21.559 31.351-21.559 51.513 0 20.161 8.25 38.396 21.558 51.511l416.649 411.529-51.84 51.2-416-411.52c-26.634-26.249-43.134-62.717-43.134-103.040s16.5-76.791 43.117-103.023c26.785-26.3 63.506-42.524 104.017-42.524 40.511 0 77.233 16.224 104.022 42.529l468.458 463.338c39.758 39.343 64.377 93.916 64.377 154.24s-24.619 114.897-64.358 154.222c-40.254 39.917-95.659 64.572-156.823 64.572-60.843 0-115.989-24.397-156.186-63.943l-491.49-488.931c-37.461-48.505-60.045-110.166-60.045-177.101 0-80.906 32.995-154.105 86.262-206.877 53.349-51.49 126.039-83.2 206.136-83.2 67.624 0 129.969 22.604 179.89 60.668l547.756 535.151-51.84 51.2z"  horiz-adv-x="1024" />
171
+
172
+    
173
+    <glyph glyph-name="music" unicode="&#58944;" d="M991.14 895.112h-7.673c-2.402 0.564-5.16 0.887-7.993 0.887s-5.591-0.323-8.239-0.935l-747.266-134.875c-15.608-1.932-27.64-14.874-28.137-30.724-0.026-0.447-0.041-1.006-0.041-1.568 0-0.562 0.015-1.121 0.046-1.676l-0.003-616.348c-18.531 11.177-40.89 17.823-64.795 17.91-69.781-0.006-127.038-57.264-127.038-127.895 0-70.631 57.258-127.889 127.889-127.889 70.631 0 127.889 57.258 127.889 127.889l-0 511.556c2.687-0.709 5.772-1.116 8.952-1.116s6.265 0.407 9.206 1.172l685.232 123.996v-457.203c-18.531 11.177-40.89 17.823-64.795 17.91-69.747-0.051-126.96-57.291-126.96-127.895 0-70.631 57.258-127.889 127.889-127.889 69.057 0 125.33 54.734 127.804 123.187l0.006 799.532c0 17.658-14.314 31.972-31.972 31.972z"  horiz-adv-x="1024" />
174
+
175
+    
176
+    <glyph glyph-name="gmap" unicode="&#58921;" d="M543.36 323.84h128v-144.64c-27.042-18.911-60.614-30.218-96.827-30.218-2.41 0-4.808 0.050-7.194 0.149-135.339-0.011-207.659 89.589-207.659 236.789s83.84 233.6 206.080 233.6c1.985 0.077 4.316 0.121 6.658 0.121 51.625 0 98.258-21.372 131.535-55.751l56.368 63.95c-48.672 47.215-115.142 76.321-188.411 76.321-3.288 0-6.562-0.059-9.822-0.175-2.247 0.102-5.444 0.153-8.653 0.153-164.713 0-298.24-133.527-298.24-298.24 0-7.707 0.292-15.345 0.866-22.905-0.061-201.235 127.939-318.995 303.939-318.995 2.993-0.105 6.51-0.164 10.041-0.164 75.665 0 144.927 27.412 198.397 72.848l-0.438 267.157h-224.64zM896 896h-768c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h768c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM896 0c0-35.346-28.654-64-64-64h-640c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h640c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
177
+
178
+    
179
+    <glyph glyph-name="insertframe" unicode="&#58949;" d="M448 512c-141.385 0-256-114.615-256-256s114.615-256 256-256c141.385 0 256 114.615 256 256 0 141.385-114.615 256-256 256zM643.84 341.12c11.26-25.164 17.818-54.536 17.818-85.44s-6.558-60.276-18.358-86.801l-96.099 1.361c4.638 25.688 7.29 55.254 7.29 85.44 0 30.186-2.652 59.752-7.736 88.479zM384 256c-0.006 0.936-0.009 2.043-0.009 3.15 0 28.938 2.331 57.331 6.815 85.002l114.795-3.032c4.079-24.639 6.409-53.032 6.409-81.97 0-1.108-0.003-2.214-0.010-3.32 0.007-0.766 0.010-1.872 0.010-2.98 0-28.938-2.331-57.331-6.815-85.002l-114.795 3.032c-4.079 24.639-6.409 53.032-6.409 81.97 0 1.108 0.003 2.214 0.010 3.32zM618.88 384h-81.28c-11.121 41.020-32.662 76.060-61.625 103.299 78.384-37.794 124.984-72.611 153.982-119.469zM448 448c19.2 0 35.84-24.96 48-64h-96c12.16 39.040 28.8 64 48 64zM398.080 463.36c-24.403-30.724-40.833-68.802-45.587-110.426l-75.373 31.066c33.569 44.293 83.219 74.881 140.108 83.067zM252.16 341.12h96c-4.638-25.688-7.29-55.254-7.29-85.44 0-30.186 2.652-59.752 7.736-88.479l-96.446 3.039c-11.26 25.164-17.818 54.536-17.818 85.44s6.558 60.276 18.358 86.801zM277.12 128h81.28c11.121-41.020 32.662-76.060 61.625-103.299-78.384 37.794-124.984 72.611-153.982 119.469zM448 64c-19.2 0-35.84 24.96-48 64h96c-12.16-39.040-28.8-64-48-64zM497.92 48.64c24.403 30.724 40.833 68.802 45.587 110.426l75.373-31.066c-33.569-44.293-83.219-74.881-140.108-83.067zM597.76 896h-533.76v-1024h896v693.76zM896 540.16v-604.16h-768v896h448v-256h320z"  horiz-adv-x="1024" />
180
+
181
+    
182
+    <glyph glyph-name="pdfformat" unicode="&#58927;" d="M597.76 896h-533.76v-1024h896v693.76zM896-64h-768v896h448v-291.2h320zM213.76 280.32h-47.36v-133.12h49.28c58.24 0 85.76 21.76 85.76 69.76s-30.72 63.36-87.68 63.36zM486.4 273.92h-32.64v-268.8h32.64c77.44 0 119.040 45.44 119.040 135.68s-40.96 133.12-119.040 133.12zM64 448v-576h874.24v576zM239.36 95.36h-54.4v-136.96h-56.96v361.6h109.44c82.56 0 138.24-27.52 138.24-108.8s-55.68-115.84-136.32-115.84zM495.36-41.6h-98.56v361.6h93.44c5.013 0.56 10.826 0.879 16.713 0.879 88.012 0 159.36-71.348 159.36-159.36 0-7.305-0.492-14.496-1.443-21.54 1.076-5.861 1.638-13.575 1.638-21.42 0-88.719-71.921-160.64-160.64-160.64-4.374 0-8.707 0.175-12.992 0.518zM906.88 272h-158.72v-110.72h133.76v-48h-133.76v-155.52h-56.96v362.24h214.4z"  horiz-adv-x="1024" />
183
+
184
+    
185
+    <glyph glyph-name="word" unicode="&#58950;" d="M718.080 350.080c-12.16-60.16-21.12-117.76-32-177.28h-3.84c-12.8 58.88-23.68 117.12-36.48 177.28l-78.080 337.92h-106.24l-77.44-337.92c-12.8-58.88-23.68-117.76-35.84-177.28h-2.56c-9.6 58.88-18.56 117.12-29.44 177.28l-72.96 337.92h-115.2l147.84-624h131.84l64 307.2c14.080 58.88 23.68 117.12 34.56 181.76h5.76c12.16-64 21.76-121.6 34.56-180.48l71.68-308.48h136.96l140.8 624h-106.88zM960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM960 0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
186
+
187
+    
188
+    <glyph glyph-name="excel" unicode="&#58951;" d="M960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM960 0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64zM816.64 768h-155.52l-74.88-154.88c-19.2-41.6-40.32-85.12-59.52-128h-5.12c-23.040 43.52-46.72 86.4-67.2 128l-85.12 154.88h-160.64l213.76-367.36-230.4-400.64h156.16l82.56 161.92c21.76 47.36 44.16 93.44 64 136.96h6.4c25.6-43.52 50.56-90.88 73.6-136.96l96-161.92h161.28l-229.12 384z"  horiz-adv-x="1024" />
189
+
190
+    
191
+    <glyph glyph-name="time" unicode="&#58954;" d="M839.71 665.392l21.719 21.719 43.439-43.439 54.298 53.659-127.76 127.76-54.937-54.298 43.439-43.439-21.719-21.719c-75.422 67.785-173.222 112.028-281.079 120.458 35.914 34.385 3.15 64.831-36.725 64.831-39.875 0-72.639-30.446-76.313-69.359-53.727-9.585-101.81-26.59-145.709-50.339l109.274-52.815c33.919 10.918 72.943 17.223 113.435 17.25 210.674-0.002 382.275-171.603 382.275-383.283 0-211.68-171.601-383.281-383.281-383.281-211.68 0-383.281 171.601-383.281 383.281-0 0.065-0 0.141-0 0.218 0 67.637 17.52 131.182 48.269 186.345l-80.209 52.35c-40.161-67.975-63.89-149.791-63.89-237.149 0-1.069 0.004-2.137 0.011-3.204-0.001-264.436 214.5-478.938 479.101-478.938 264.601 0 479.102 214.501 479.102 479.102-0.017 120.866-45.332 231.144-119.891 314.787zM480.065 640.479c-0.001 0-0.003 0-0.004 0-25.53 0-46.268-20.516-46.628-45.96l-0-182.093c-18.945-13.991-31.096-36.239-31.096-61.325s12.151-47.334 30.889-61.179l0.207-64.027c2.821-23.303 22.479-41.184 46.313-41.184s43.492 17.881 46.291 40.96l0.022 64.104c18.945 13.991 31.096 36.239 31.096 61.325s-12.151 47.334-30.889 61.179l-0.207 184.76c-1.708 24.169-21.601 43.165-45.99 43.439zM252.651 896l-109.235-251.049 274.685-5.11-50.465 77.934-51.104 79.85-63.88 98.376z"  horiz-adv-x="1024" />
192
+
193
+    
194
+    <glyph glyph-name="snapscreen" unicode="&#58960;" d="M665.6 503.040l-204.8-155.52-204.8 233.6v-389.12h512v155.52l-102.4 155.52zM1024 64h-128v704h-704v128h-64v-128h-128v-64h128v-704h704v-128h64v128h128zM192 64v640h640v-640z"  horiz-adv-x="1024" />
195
+
196
+    
197
+    <glyph glyph-name="wordimage" unicode="&#58962;" d="M988.16 448h-568.32c-19.794 0-35.84-16.046-35.84-35.84 0 0 0 0 0 0v-504.32c0-19.794 16.046-35.84 35.84-35.84h568.96c0 0 0 0 0 0 19.794 0 35.84 16.046 35.84 35.84 0 0 0 0 0 0v504.32c0 0.002 0 0.004 0 0.006 0 19.794-16.046 35.84-35.84 35.84-0.225 0-0.45-0.002-0.674-0.006zM664.32 283.52c-1.074-43.349-36.469-78.080-79.977-78.080-44.183 0-80 35.817-80 80 0 44.175 35.804 79.987 79.976 80 44.338-0.719 80.004-36.829 80.004-81.27 0-0.229-0.001-0.457-0.003-0.685zM929.28-64h-467.84l131.2 205.44 85.12-133.12 177.28 298.24 104.96-178.56v-163.2c-1.040-16.12-14.369-28.8-30.66-28.8-0.021 0-0.042 0-0.063 0zM960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h256v64h-192c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64v-256h64v320c0 35.346-28.654 64-64 64zM320 341.76l-78.72 362.24h-118.4l151.68-640h45.44v266.24zM858.88 512l43.52 192h-116.48l-40.32-192h113.28zM501.76 512c0 26.88 4.48 40.32 7.040 64h3.2c0-23.68 7.68-64 7.68-64h97.28l-44.8 192h-115.84l-42.88-192z"  horiz-adv-x="1024" />
198
+
199
+    
200
+    <glyph glyph-name="edittd" unicode="&#58970;" d="M576 128c0-106.039 85.961-192 192-192s192 85.961 192 192c0 106.039-85.961 192-192 192-106.039 0-192-85.961-192-192zM448 128c0.094 176.66 143.327 319.835 320 319.835 46.3 0 90.303-9.833 130.036-27.525l-2.036 347.69h-768v-768h346.88c-16.972 37.769-26.865 81.866-26.88 128.273zM0 896v-1024h576c-46.418 35.069-82.504 81.491-104.415 135.203l-407.585-71.203v896h896v-448c46.418-35.069 82.504-81.491 104.415-135.203l-40.415 647.203z"  horiz-adv-x="1024" />
201
+
202
+    
203
+    <glyph glyph-name="lineheight" unicode="&#58922;" d="M380.8 128h-380.8l190.72-254.72 190.080 254.72zM512 128h512v-64h-512v64zM512 320h512v-64h-512v64zM512 512h512v-64h-512v64zM512 704h512v-64h-512v64zM2.56 640h380.8l-190.080 254.72-190.72-254.72z"  horiz-adv-x="1024" />
204
+
205
+    
206
+    <glyph glyph-name="rowspacingbottom" unicode="&#58923;" d="M704 128H320l192-256zM672 256H32c-19.2 0-32 12.8-32 32S12.8 320 32 320h640c19.2 0 32-12.8 32-32s-12.8-32-32-32zM864 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h832c19.2 0 32-12.8 32-32s-12.8-32-32-32zM480 640h-448C12.8 640 0 652.8 0 672S12.8 704 32 704h448c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
207
+
208
+    
209
+    <glyph glyph-name="rowspacingtop" unicode="&#58924;" d="M320 640h384L512 896zM352 512h640c19.2 0 32-12.8 32-32s-12.8-32-32-32h-640c-19.2 0-32 12.8-32 32s12.8 32 32 32zM160 320h832c19.2 0 32-12.8 32-32s-12.8-32-32-32h-832c-19.2 0-32 12.8-32 32s12.8 32 32 32zM544 128h448c19.2 0 32-12.8 32-32s-12.8-32-32-32h-448c-19.2 0-32 12.8-32 32s12.8 32 32 32zM32-64h960c19.2 0 32-12.8 32-32s-12.8-32-32-32H32c-19.2 0-32 12.8-32 32s12.8 32 32 32z"  horiz-adv-x="1024" />
210
+
211
+    
212
+    <glyph glyph-name="scrawl" unicode="&#58902;" d="M1018.284 618.88c-3.741 3.949-9.022 6.406-14.878 6.406-0.17 0-0.339-0.002-0.507-0.006-18.281-3.25-33.767-13.388-43.958-27.584l-387.377-385.216c-97.674-132.446-170.577-289.537-208.303-459.854l130.863 340.174 14.080 8.96c3.84 0 90.24 56.96 104.96 71.040l390.4 389.12c16.64 14.080 29.44 41.6 14.72 56.96zM774.444 497.92c-1.065-30.621-26.145-55.040-56.928-55.040-31.458 0-56.96 25.502-56.96 56.96 0 31.447 25.483 56.942 56.926 56.96 31.613-0.715 56.965-26.51 56.965-58.226 0-0.23-0.001-0.46-0.004-0.689zM173.484 292.48c-0.572-0.020-1.245-0.031-1.92-0.031-32.519 0-58.88 26.361-58.88 58.88 0 32.519 26.361 58.88 58.88 58.88 32.508 0 58.862-26.344 58.88-58.847 0.002-0.196 0.004-0.426 0.004-0.656 0-31.716-25.352-57.511-56.897-58.225zM256.684 497.92c1.065 30.621 26.145 55.040 56.928 55.040 31.458 0 56.96-25.502 56.96-56.96 0-31.447-25.483-56.942-56.926-56.96-31.613 0.715-56.965 26.51-56.965 58.226 0 0.23 0.001 0.46 0.004 0.689zM459.564 556.8c1.065 30.621 26.145 55.040 56.928 55.040 31.458 0 56.96-25.502 56.96-56.96 0-31.447-25.483-56.942-56.926-56.96-31.613 0.715-56.965 26.51-56.965 58.226 0 0.23 0.001 0.46 0.004 0.689zM902.444 357.76c-31.114-198.424-199.103-348.964-402.953-352.649-44.127 0.133-86.562 8.912-125.365 24.752-35.522 14.937-52.802 33.497-56.642 45.657s-3.84 13.44-5.12 20.48c-7.834 36.146-22.479 67.979-42.623 95.538 5.698-5.462-21.312 11.988-52.397 11.988-0.345 0-0.689-0.002-1.033-0.006-3.886 0.48-8.445 0.754-13.068 0.754-4.623 0-9.182-0.274-13.662-0.806-12.472-3.188-27.415-5.056-42.792-5.072-27.705 0.004-76.345 7.684-77.625 60.164-8.32 266.88 206.080 412.16 421.76 437.76 7.269 0.45 15.764 0.706 24.32 0.706 8.556 0 17.051-0.256 25.48-0.762-0.547 0.058 0.179 0.060 0.905 0.060 61.978 0 121.325-11.266 176.105-31.862 7.43-3.343 13.19-5.903 41.35-19.983 45.5-22.593 82.418-56.579 107.926-98.3l0.234 108.54c-39.591 39.065-89.533 67.734-145.34 81.521 39.74-11.761 32.060-7.921 18.62-2.161-57.675 21.514-124.314 33.964-193.861 33.964-2.496 0-4.989-0.016-7.477-0.048-8.039 0.525-17.876 0.822-27.782 0.822-9.906 0-19.744-0.297-29.503-0.882-141.37-14.839-266.964-78.425-360.631-173.541-66.027-62.45-121.268-181.419-121.268-313.291 0-8.831 0.248-17.603 0.737-26.312-0.056 0.957-0.057 0.66-0.057 0.363 0-38.985 18.155-73.73 46.471-96.241 26.281-19.448 59.014-31.013 94.449-31.013 1.984 0 3.961 0.036 5.927 0.108 20.847 0.167 41.263 2.875 60.785 7.826l7.41-0.794c13.44 0 19.2-11.52 30.72-57.6 0-7.68 3.84-15.36 5.76-23.040 18.972-47.312 59.266-82.528 108.663-94.1 33.53-14.445 83.337-24.315 135.45-24.315 1.254 0 2.507 0.006 3.758 0.017 0.225-0.003 0.719-0.004 1.212-0.004 63.695 0 124.367 12.941 179.531 36.338 81.727 34.251 151.681 90.814 202.313 162.068 5.358-6.858 54.273 74.77 77.563 166.616-8.168-44.029 10.698 24.185 13.446 96.526l-3.217-20.585z"  horiz-adv-x="1024" />
213
+
214
+    
215
+    <glyph glyph-name="redo" unicode="&#58889;" d="M900.608 421.888c-51.2 51.2-260.608 261.632-291.84 292.352-11.806 10.097-27.254 16.241-44.137 16.241-18.488 0-35.255-7.368-47.525-19.327-11.992-12.987-19.355-30.431-19.355-49.596 0-9.601 1.848-18.77 5.208-27.172 12.114-17.938 187.73-199.186 187.73-199.186h-520.704c-1.707 0.167-3.691 0.262-5.696 0.262-34.215 0-61.952-27.737-61.952-61.952 0-0.993 0.023-1.98 0.070-2.961 1.872-36.617 31.37-65.906 68.041-67.444l517.682-0.001-173.056-172.032c-11.419-12.149-18.435-28.551-18.435-46.592s7.016-34.443 18.468-46.628c12.029-13.522 29.523-22.020 49.001-22.020 15.841 0 30.37 5.621 41.7 14.976 24.977 22.951 255.889 252.839 297.873 296.359s-3.072 94.72-3.072 94.72z"  horiz-adv-x="1024" />
216
+
217
+    
218
+    <glyph glyph-name="undo" unicode="&#58880;" d="M128.512 419.84c51.2 51.2 260.608 261.632 291.84 292.352 11.806 10.097 27.254 16.241 44.137 16.241 18.488 0 35.255-7.368 47.525-19.327 11.777-12.935 18.997-30.227 18.997-49.205 0-9.749-1.905-19.053-5.364-27.559-13.648-17.942-187.216-197.142-187.216-197.142h520.192c1.125 0.073 2.44 0.114 3.764 0.114 34.215 0 61.952-27.737 61.952-61.952 0-1.662-0.065-3.309-0.194-4.938-1.863-36.541-31.361-65.829-68.033-67.368l-517.682-0.001 173.568-173.056c11.419-12.149 18.435-28.551 18.435-46.592s-7.016-34.443-18.468-46.628c-12.029-13.522-29.523-22.020-49.001-22.020-15.841 0-30.37 5.621-41.7 14.976-24.977 22.951-255.889 252.839-297.873 296.359s5.12 95.744 5.12 95.744z"  horiz-adv-x="1024" />
219
+
220
+    
221
+    <glyph glyph-name="inserttitle" unicode="&#58971;" d="M512 379.904v153.6h-51.2v-102.4h-102.4v-51.2h-153.6v51.2h-102.4v102.4h-51.2v-614.4h921.6v460.8zM338.944-29.696h-240.64v167.936h238.592zM338.944 189.44h-240.64v139.264h238.592zM636.416-29.696h-248.32v167.936h246.272zM636.416 189.44h-248.32v139.264h246.272zM919.552-29.696h-233.984v167.936h231.936zM919.552 189.44h-233.984v139.264h231.936zM512 430.592v-51.2h460.8v465.408h-460.8v-307.2zM563.2 635.392h153.6v153.6h51.2v-153.6h153.6v-51.2h-153.6v-153.6h-51.2v153.6h-153.6zM99.328 787.968h102.4v51.2h-153.6v-153.6h51.2v102.4zM512.512 791.040v51.2h-153.6v-51.2h102.4v-102.4h51.2v102.4z"  horiz-adv-x="1024" />
222
+
223
+    
224
+    <glyph glyph-name="insertparagraphtrue" unicode="&#58976;" d="M997.12 448h-997.12v-576h1024v576zM60.16-64v256h259.84v-256zM542.080-64h-158.080v256h256v-256zM963.84-64h-259.84v256h259.84zM448 896h-448v-64h192v-384h64v384h192v64z"  horiz-adv-x="1024" />
225
+
226
+    
227
+    <glyph glyph-name="aligntable" unicode="&#58978;" d="M992 832H32C12.8 832 0 844.8 0 864S12.8 896 32 896h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32C12.8 640 0 652.8 0 672S12.8 704 32 704h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-384H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32c-19.2 0-32 12.8-32 32s12.8 32 32 32h960c19.2 0 32-12.8 32-32s-12.8-32-32-32zM992 448H32C12.8 448 0 460.8 0 480S12.8 512 32 512h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z m0-192H32c-19.2 0-32 12.8-32 32S12.8 320 32 320h960c19.2 0 32-12.8 32-32s-12.8-32-32-32z"  horiz-adv-x="1024" />
228
+
229
+    
230
+    <glyph glyph-name="table" unicode="&#58980;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM640-64h-256v256h256zM640 256h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-896v256h896z"  horiz-adv-x="1024" />
231
+
232
+    
233
+    <glyph glyph-name="tablealignment-left" unicode="&#58979;" d="M51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 640l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 332.79999999999995l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 25.600000000000023l614.4 0 0-51.2-614.4 0 0 51.2Z"  horiz-adv-x="1024" />
234
+
235
+    
236
+    <glyph glyph-name="tablealignment-center" unicode="&#58981;" d="M51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 640l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 332.79999999999995l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 25.600000000000023l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2Z"  horiz-adv-x="1024" />
237
+
238
+    
239
+    <glyph glyph-name="tablealignment-right" unicode="&#58982;" d="M51.2 793.6l921.6 0 0-51.2-921.6 0 0 51.2ZM358.4 640l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 486.4l921.6 0 0-51.2-921.6 0 0 51.2ZM358.4 332.79999999999995l614.4 0 0-51.2-614.4 0 0 51.2ZM51.2 179.20000000000005l921.6 0 0-51.2-921.6 0 0 51.2ZM358.4 25.600000000000023l614.4 0 0-51.2-614.4 0 0 51.2Z"  horiz-adv-x="1024" />
240
+
241
+    
242
+    <glyph glyph-name="paste" unicode="&#58983;" d="M832 576v160c0 17.673-14.327 32-32 32h-224v64c0 35.346-28.654 64-64 64h-128c-35.346 0-64-28.654-64-64v-64h-224c-17.673 0-32-14.327-32-32v-640c0-17.673 14.327-32 32-32h288v-192h448l192 192v512zM384 832h128v-64h-128zM192 704h512v-64h-512zM832-37.76v101.76h101.76zM960 128h-192v-192h-320v576h512z"  horiz-adv-x="1024" />
243
+
244
+    
245
+    <glyph glyph-name="map" unicode="&#58984;" d="M375.424 564.176c-2.432-6.96-7.856-24.704-3.152-40.208 9.232-34.672 39.424-36.24 39.424-36.24h43.264V593.632h-46.4c-20.864-6.24-30.944-22.432-33.136-29.456z m129.072-119.072H397.008c-46.448 9.28-64.896 40.992-67.28 46.368-2.288 5.456-15.504 30.944-8.464 74.256 20.032 64.976 77.28 69.616 77.28 69.616h57.248v70.368l48.704-0.8v-259.808z m200.272 0.768H581.04c-47.92 12.368-50.176 46.496-50.176 46.496V629.184L581.04 630v-123.024c3.008-13.024 19.376-15.44 19.376-15.44h50.912V629.232h53.456v-183.36h-0.016zM512-125.45c-11.203 0-21.563 6-27.172 15.688L208.375 368.274c-30.803 53.1-47.11 113.662-47.11 175.084 0 193.047 157.35 350.094 350.75 350.094 193.391 0 350.72-157.047 350.72-350.094 0-61.421-16.298-121.975-47.126-175.115l-276.437-478.007c-5.61-9.687-15.953-15.687-27.172-15.687z m0.016 956.138c-158.788 0-287.985-128.907-287.985-287.329 0-50.375 13.375-100.037 38.663-143.615l249.303-431.1 249.297 431.062c25.297 43.616 38.656 93.281 38.656 143.656 0 158.42-129.172 287.325-287.934 287.325z"  horiz-adv-x="1024" />
246
+
247
+    
248
+    <glyph glyph-name="directionalityrtl" unicode="&#58881;" d="M960 62.080l-384 320 384 320.64v-640.64zM64 704v64h448v-64h-192v-640h192v-64h-448v64h192v640h-192z"  horiz-adv-x="1024" />
249
+
250
+    
251
+    <glyph glyph-name="imagecenter" unicode="&#58882;" d="M0 896h1024v-64h-1024zM128 704h768v-448h-768v448zM0 128h1024v-64h-1024zM0-64h1024v-64h-1024z"  horiz-adv-x="1024" />
252
+
253
+    
254
+    <glyph glyph-name="imagenone" unicode="&#58887;" d="M52.736 788.992l921.6 0 0-51.2-921.6 0 0 51.2ZM52.736 635.392l409.6 0 0-512-409.6 0 0 512ZM564.736 174.592l409.6 0 0-51.2-409.6 0 0 51.2ZM54.784 20.992l921.6 0 0-51.2-921.6 0 0 51.2ZM564.736 328.192l409.6 0 0-51.2-409.6 0 0 51.2Z"  horiz-adv-x="1024" />
255
+
256
+    
257
+    <glyph glyph-name="fontborder" unicode="&#58888;" d="M345.6 64l44.8 153.6h224l44.8-153.6H768L576 704H448L256 64h89.6z m153.6 531.2l83.2-288H416l83.2 288zM896 832H64v-896h896V832h-64z m0-832H128V768h768v-768z"  horiz-adv-x="1024" />
258
+
259
+    
260
+    <glyph glyph-name="edittable" unicode="&#58890;" d="M993.92 47.36l-144 144.64c8.659 23.774 13.667 51.219 13.667 79.833 0 132.548-107.452 240-240 240-33.832 0-66.029-7-95.221-19.632l-16.365-6.441v-2.56c-2.225-2.205-3.603-5.261-3.603-8.64s1.378-6.435 3.602-8.639l134.401-134.401-81.92-80.64-131.84 133.12c-2.579 2.775-6.249 4.505-10.323 4.505-6.183 0-11.434-3.985-13.327-9.526l-4.509-10.339c-12.032-27.638-19.033-59.835-19.033-93.667 0-132.548 107.452-240 240-240 28.614 0 56.059 5.008 81.505 14.194l142.328-144.527c18.54-18.584 44.175-30.081 72.496-30.081 0.163 0 0.326 0 0.489 0.001 56.695 0.247 102.579 46.285 102.579 103.039 0 28.187-11.318 53.73-29.656 72.333zM960-64c-10.303-10.282-24.526-16.64-40.234-16.64-0.030 0-0.061 0-0.091 0-0.021-0-0.051-0-0.082-0-15.708 0-29.93 6.358-40.235 16.641l-165.119 165.119-14.080-6.4c-23.254-10.787-50.473-17.079-79.162-17.079-106.039 0-192 85.961-192 192 0 16.288 2.028 32.103 5.846 47.205l120.676-124.846c2.359-1.847 5.369-2.963 8.64-2.963s6.281 1.115 8.671 2.986l127.969 127.977c2.168 2.464 3.491 5.718 3.491 9.28s-1.323 6.816-3.504 9.296l-120.306 122.864c14.813 4.102 31.821 6.459 49.381 6.459 106.039 0 192-85.961 192-192 0-30.528-7.125-59.393-19.803-85.021l-5.898-12.958 163.84-162.56c9.956-10.245 16.095-24.246 16.095-39.68s-6.139-29.435-16.108-39.694zM832 896h-832v-832h320v512h512zM256 128h-192v192h192zM256 384h-192v192h192zM256 640h-192v192h192zM512 640h-192v192h192zM576 640v192h192v-192z"  horiz-adv-x="1024" />
261
+
262
+    
263
+    <glyph glyph-name="imageleft" unicode="&#58891;" d="M50.688 794.624l921.6 0 0-51.2-921.6 0 0 51.2ZM50.688 641.024l409.6 0 0-512-409.6 0 0 512ZM562.688 180.224l409.6 0 0-51.2-409.6 0 0 51.2ZM52.736 26.624l921.6 0 0-51.2-921.6 0 0 51.2ZM562.688 333.824l409.6 0 0-51.2-409.6 0 0 51.2ZM562.688 487.424l409.6 0 0-51.2-409.6 0 0 51.2ZM562.688 641.024l409.6 0 0-51.2-409.6 0 0 51.2Z"  horiz-adv-x="1024" />
264
+
265
+    
266
+    <glyph glyph-name="imageright" unicode="&#58901;" d="M0 896h1024v-64h-1024zM512 704h512v-640h-512v640zM0 128h448v-64h-448zM0-64h1024v-64h-1024zM0 320h448v-64h-448zM0 512h448v-64h-448zM0 704h448v-64h-448z"  horiz-adv-x="1024" />
267
+
268
+    
269
+    <glyph glyph-name="insertcol" unicode="&#58917;" d="M256 640l-256-256 256-256v512zM1024-128v1024h-640v-1024zM768 832h192v-256h-192zM768 512h192v-256h-192zM768 192h192v-256h-192zM448 832h192v-256h-192zM448 512h192v-256h-192zM448 192h192v-256h-192z"  horiz-adv-x="1024" />
270
+
271
+    
272
+    <glyph glyph-name="insertcolnext" unicode="&#58918;" d="M768 128l256 256-256 256v-512zM0 896v-1024h640v1024zM256-64h-192v256h192zM256 256h-192v256h192zM256 576h-192v256h192zM576-64h-192v256h192zM576 256h-192v256h192zM576 576h-192v256h192z"  horiz-adv-x="1024" />
273
+
274
+    
275
+    <glyph glyph-name="insertorderedlist" unicode="&#58933;" d="M319.956 832.009h703.902v-127.982h-703.902v127.982zM319.956 448.062h703.902v-127.982h-703.902v127.982zM319.956 64.115h703.902v-127.982h-703.902v127.982zM191.973 896v-255.964h-127.982v255.964zM0 256.089v30.716c0 103.666 159.978 141.42 159.978 186.854 0 17.918-10.878 28.156-33.275 28.156-31.301-3-58.565-18.191-77.352-40.702l-43.591 57.98c30.879 35.002 75.835 56.965 125.921 56.965 0.725 0 1.448-0.005 2.171-0.014 78.599 0.001 122.113-42.233 122.113-97.265 0-78.069-95.347-98.546-142.7-147.18h142.7v-75.51zM127.982-127.858c-2.045-0.090-4.443-0.142-6.854-0.142-47.758 0-90.798 20.2-121.042 52.521l48.547 49.366c18.682-18.147 44.020-29.531 72.013-30.151 25.894 0.076 39.332 14.154 39.332 33.351 0 17.278-12.158 26.236-36.475 26.236h-24.317v52.473h24.957c23.037 0 36.475 6.399 36.475 26.876 0 19.837-12.798 31.356-38.395 31.356-26.139-0.731-49.26-13.049-64.502-31.98l-47.483 49.257c29.161 33.898 72.108 55.232 120.038 55.232 2.794 0 5.572-0.073 8.33-0.216 72.564 5.775 117.357-35.819 117.357-82.533v-5.119c0-0.034 0-0.075 0-0.115 0-35.341-28.65-63.991-63.991-63.991-1.351 0-2.692 0.042-4.022 0.124 50.735-7.048 70.572-33.284 70.572-67.2v-3.839c-2.56-53.113-54.392-91.507-130.542-91.507z"  horiz-adv-x="1024" />
276
+
277
+    
278
+    <glyph glyph-name="insertparagraphbeforetable" unicode="&#58934;" d="M256 512v-640h768v640zM512-64h-192v512h192zM960-64h-384v128h384zM960 128h-384v128h384zM960 320h-384v128h384zM384 320h64v-256h-64zM0 896v-64h128v-384h64v384h128v64h-320z"  horiz-adv-x="1024" />
279
+
280
+    
281
+    <glyph glyph-name="insertrow" unicode="&#58935;" d="M768 640l-256 256-256-256h512zM0-128h1024v640h-1024zM960 128v-192h-256v192zM640 128v-192h-256v192zM320 128v-192h-256v192zM960 448v-192h-256v192zM640 448v-192h-256v192zM320 448v-192h-256v192z"  horiz-adv-x="1024" />
282
+
283
+    
284
+    <glyph glyph-name="insertrownext" unicode="&#58937;" d="M256 128l256-256 256 256h-512zM1024 896h-1024v-640h1024zM64 640v192h256v-192zM384 640v192h256v-192zM704 640v192h256v-192zM64 320v192h256v-192zM384 320v192h256v-192zM704 320v192h256v-192z"  horiz-adv-x="1024" />
285
+
286
+    
287
+    <glyph glyph-name="insertunorderedlist" unicode="&#58945;" d="M960 704H256c-38.4 0-64 25.6-64 64s25.6 64 64 64h704c38.4 0 64-25.6 64-64s-25.6-64-64-64zM64 704c-38.4 0-64 25.6-64 64s25.6 64 64 64 64-25.6 64-64-25.6-64-64-64zM960 320H256c-38.4 0-64 25.6-64 64s25.6 64 64 64h704c38.4 0 64-25.6 64-64s-25.6-64-64-64zM64 320c-38.4 0-64 25.6-64 64s25.6 64 64 64 64-25.6 64-64-25.6-64-64-64zM960-64H256c-38.4 0-64 25.6-64 64s25.6 64 64 64h704c38.4 0 64-25.6 64-64s-25.6-64-64-64zM64-64c-38.4 0-64 25.6-64 64s25.6 64 64 64 64-25.6 64-64-25.6-64-64-64z"  horiz-adv-x="1024" />
288
+
289
+    
290
+    <glyph glyph-name="mergeright" unicode="&#58946;" d="M0 896v-1024h1024v1024zM384 832h256v-256h-256zM384 448h320v64l192-128-192-128v64h-320zM320-64h-256v256h256zM320 256h-256v256h256zM320 576h-256v256h256zM640-64h-256v256h256zM960-64h-256v256h256zM960 576h-256v256h256z"  horiz-adv-x="1024" />
291
+
292
+    
293
+    <glyph glyph-name="mergedown" unicode="&#58947;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM320 576h-256v256h256zM512 0l-128 192h64v320h128v-320h64zM640 576h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-256v256h256z"  horiz-adv-x="1024" />
294
+
295
+    
296
+    <glyph glyph-name="inserttable" unicode="&#58948;" d="M0 896v-1024h1024v1024zM320-64h-256v256h256zM320 256h-256v256h256zM640-64h-256v256h256zM640 256h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-896v256h896z"  horiz-adv-x="1024" />
297
+
298
+    
299
+    <glyph glyph-name="pagebreak" unicode="&#58952;" d="M384-64h512v-64h-512zM0 576v-384l256 192-256 192zM320 768h576v-64h-576zM384 64h256v-64h-256zM192 192v-320h64v256h704v-256h64v320h-832zM1022.72 896h-62.72v-256h-704v256h-64v-320h832v320h-1.28z"  horiz-adv-x="1024" />
300
+
301
+    
302
+    <glyph glyph-name="source" unicode="&#58953;" d="M170.88 384h-113.92v128h-56.96v-320h56.96v128h113.92v-128h56.96v320h-56.96v-128zM284.16 448h56.96v-256h56.96v256h56.96v64h-170.88v-64zM738.56 510.72l-84.48-250.24-84.48 251.52-2.56-1.28h-55.040v-316.8h56.96v140.16l47.36-140.8h72.96l2.56-1.28 48 140.8v-139.52h56.32v316.8h-55.040l-2.56 0.64zM910.080 256v256h-56.96v-320h170.88v64h-113.92z"  horiz-adv-x="1024" />
303
+
304
+    
305
+    <glyph glyph-name="splittorows" unicode="&#58955;" d="M0 896h1024v-64H0zM960 896v-320h-128V896h-64v-320H256V896H192v-320H64V896H0v-1024h1024V896z m-192-384v-256H256V512zM64 512h128v-256H64z m0-576v256h128v-256z m192 0v256h512v-256z m704 0h-128v256h128z m0 320h-128V512h128z"  horiz-adv-x="1024" />
306
+
307
+    
308
+    <glyph glyph-name="splittocols" unicode="&#58956;" d="M1024 896h-1024v-1024h1024zM960 512v-256h-128v256zM960 832v-256h-128v256zM64 576v256h128v-256zM64 256v256h128v-256zM64-64v256h128v-256zM256-64v896h128v-896zM448-64v896h128v-896zM640-64v896h128v-896zM832-64v256h128v-256z"  horiz-adv-x="1024" />
309
+
310
+    
311
+    <glyph glyph-name="splittocells" unicode="&#58957;" d="M0 896v-1024h1024v1024zM320-64h-256v576h256zM640-64h-256v256h256zM640 256h-256v256h256zM960-64h-256v256h256zM960 256h-256v256h256zM960 576h-576v256h576z"  horiz-adv-x="1024" />
312
+
313
+    
314
+    <glyph glyph-name="arrow" unicode="&#58959;" d="M513.024 230.4l204.8 204.8h-409.6l204.8-204.8z"  horiz-adv-x="1024" />
315
+
316
+    
317
+    <glyph glyph-name="aligntd" unicode="&#58961;" d="M256.061 128.061h511.877v-63.985h-511.877v63.985zM256.061 320.015h511.877v-63.985h-511.877v63.985zM256.061 511.969h511.877v-63.985h-511.877v63.985zM256.061 703.923h511.877v-63.985h-511.877v63.985zM863.916-127.878h-703.832c-1.402-0.077-3.043-0.121-4.695-0.121-48.324 0-87.898 37.462-91.266 84.928l-0.017 853.847c3.384 47.758 42.959 85.22 91.282 85.22 1.651 0 3.292-0.044 4.922-0.13l703.604 0.010c1.402 0.077 3.043 0.121 4.695 0.121 48.324 0 87.898-37.462 91.266-84.928l0.017-853.847c-3.384-47.758-42.959-85.22-91.282-85.22-1.651 0-3.292 0.044-4.922 0.13zM160.084 831.892c-0.591 0.041-1.281 0.065-1.977 0.065-15.956 0-29.010-12.427-30.011-28.131l-0.004-839.567c1.005-15.791 14.059-28.218 30.016-28.218 0.696 0 1.386 0.024 2.069 0.070l703.739-0.005c0.591-0.041 1.281-0.065 1.977-0.065 15.956 0 29.010 12.427 30.011 28.131l0.004 839.567c-1.005 15.791-14.059 28.218-30.016 28.218-0.696 0-1.386-0.024-2.069-0.070z"  horiz-adv-x="1024" />
318
+
319
+    
320
+    <glyph glyph-name="autotypeset" unicode="&#58963;" d="M192 704h384v-320h-384v320zM640 704h192v-64h-192v64zM640 512h192v-64h-192v64zM192 320h640v-64h-640v64zM192 128h640v-64h-640v64zM960 896h-896c-35.346 0-64-28.654-64-64v-896c0-35.346 28.654-64 64-64h896c35.346 0 64 28.654 64 64v896c0 35.346-28.654 64-64 64zM960 0c0-35.346-28.654-64-64-64h-768c-35.346 0-64 28.654-64 64v768c0 35.346 28.654 64 64 64h768c35.346 0 64-28.654 64-64z"  horiz-adv-x="1024" />
321
+
322
+    
323
+    <glyph glyph-name="charts" unicode="&#58968;" d="M0 832v-896h1024v896zM960 0h-896v768h896zM704 640h128v-512h-128zM448 320h128v-192h-128zM192 512h128v-384h-128z"  horiz-adv-x="1024" />
324
+
325
+    
326
+    <glyph glyph-name="closeerror" unicode="&#58972;" d="M512 896c-282.77 0-512-229.23-512-512s229.23-512 512-512c282.77 0 512 229.23 512 512 0 282.77-229.23 512-512 512zM796.16 225.92l-128-128-156.16 158.080-158.080-156.16-128 128 158.080 156.16-156.16 158.080 128 128 156.16-158.080 158.080 158.080 128-128-158.080-158.080z"  horiz-adv-x="1024" />
327
+
328
+    
329
+    <glyph glyph-name="copy" unicode="&#58975;" d="M256.060 511.97h511.879v-63.985h-511.879v63.985zM256.060 320.015h511.879v-63.985h-511.879v63.985zM256.060 128.060h511.879v-63.985h-511.879v63.985zM256.060 703.924h255.94v-63.985h-255.94v63.985zM895.91 639.939h-191.955v199.633c-3.964 31.88-30.89 56.308-63.523 56.308-0.162 0-0.325-0.001-0.487-0.002l-502.257 0c-1.216 0.076-2.637 0.119-4.068 0.119-36.533 0-66.506-28.090-69.498-63.85l-0.017-896.043c3.010-36.014 32.982-64.104 69.515-64.104 1.431 0 2.852 0.043 4.261 0.128l748.43-0.009c1.216-0.076 2.637-0.119 4.068-0.119 36.533 0 66.506 28.090 69.498 63.85l0.017 647.142c-3.664 32.179-30.738 56.948-63.597 56.948-0.136 0-0.273-0-0.409-0.001zM895.91-55.577c-0-4.594-3.724-8.318-8.318-8.318h-749.903c-5.301 0-9.598 4.297-9.598 9.598 0 0 0 0 0 0v877.873c0 4.594 3.724 8.318 8.318 8.318h491.404c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-191.985c3.573-30.12 28.96-53.257 59.75-53.257 1.49 0 2.968 0.054 4.431 0.161l180.242-0.011c0.196 0.012 0.426 0.019 0.657 0.019 6.142 0 11.162-4.808 11.499-10.866l0.001-620.684z"  horiz-adv-x="1024" />
330
+
331
+    
332
+    <glyph glyph-name="date" unicode="&#58977;" d="M896 768v-64h64v-704h-896v704h64v64h-128v-832h1024v832h-128zM832 832h-192v-255.36l192-0.64v256zM576 192h256v-64h-256zM576 384h256v-64h-256zM448 768h128v-64h-128zM192 192h256v-64h-256zM192 384h256v-64h-256zM384 832h-192v-256l192 0.64v255.36z"  horiz-adv-x="1024" />
333
+
334
+    
335
+    <glyph glyph-name="deletetable" unicode="&#58985;" d="M576 896v-448h448v448zM1003.52 558.72l-90.24-90.24-113.28 113.28-113.28-113.28-90.24 90.24 113.28 113.28-113.28 113.28 90.24 90.24 113.28-113.28 113.28 113.28 90.88-90.88-113.92-112.64zM960 256h-256v192h-64v-192h-256v256h192v64h-512v256h512v64h-576v-1024h1024v576h-64zM320-64h-256v256h256zM320 256h-256v256h256zM640-64h-256v256h256zM960-64h-256v256h256z"  horiz-adv-x="1024" />
336
+
337
+    
338
+    <glyph glyph-name="directionalityltr" unicode="&#58986;" d="M64 64l384 320-384 320v-640zM960 704v64h-448v-64h192v-640h-192v-64h448v64h-192v640h192z"  horiz-adv-x="1024" />
339
+
340
+    
341
+    <glyph glyph-name="arrowright" unicode="&#58987;" d="M615.424 384l-204.8 204.8v-409.6l204.8 204.8z"  horiz-adv-x="1024" />
342
+
343
+    
344
+    <glyph glyph-name="tableleft" unicode="&#58988;" d="M960 832v-896H64V832h896m64 64H0v-1024h1024V896zM192 704h640v-64H192zM192 512h640v-64H192zM192 320h256v-64H192z"  horiz-adv-x="1024" />
345
+
346
+    
347
+    <glyph glyph-name="tableright" unicode="&#58989;" d="M960 832v-896H64V832h896m64 64H0v-1024h1024V896zM188.8 704.64h640v-64h-640zM188.8 512.64h640v-64h-640zM576 320.64h256v-64H576z"  horiz-adv-x="1024" />
348
+
349
+    
350
+    <glyph glyph-name="tablecenter" unicode="&#58990;" d="M960 832v-896H64V832h896m64 64H0v-1024h1024V896zM188.8 703.36h640v-64h-640zM188.8 511.36h640v-64h-640zM383.36 319.36h256v-64h-256z"  horiz-adv-x="1024" />
351
+
352
+    
353
+    <glyph glyph-name="videoleft" unicode="&#58991;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM704 192l224 0 0-32-224 0 0 32ZM704 288l224 0 0-32-224 0 0 32ZM704 384l224 0 0-32-224 0 0 32ZM704 480l224 0 0-32-224 0 0 32ZM704 576l224 0 0-32-224 0 0 32ZM256 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM640 576H128a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L544 448l-162.24-208.64L304 332.8 186.56 192H160a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
354
+
355
+    
356
+    <glyph glyph-name="videocenter" unicode="&#58992;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM96 192l96 0 0-32-96 0 0 32ZM96 288l96 0 0-32-96 0 0 32ZM96 384l96 0 0-32-96 0 0 32ZM96 480l96 0 0-32-96 0 0 32ZM96 576l96 0 0-32-96 0 0 32ZM832 288l96 0 0-32-96 0 0 32ZM832 192l96 0 0-32-96 0 0 32ZM832 384l96 0 0-32-96 0 0 32ZM832 480l96 0 0-32-96 0 0 32ZM832 576l96 0 0-32-96 0 0 32ZM384 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM768 576H256a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L672 448l-162.24-208.64-77.76 93.44L314.56 192H288a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
357
+
358
+    
359
+    <glyph glyph-name="videonone" unicode="&#58993;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM704 192l224 0 0-32-224 0 0 32ZM704 288l224 0 0-32-224 0 0 32ZM256 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM640 576H128a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L544 448l-162.24-208.64L304 332.8 186.56 192H160a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
360
+
361
+    
362
+    <glyph glyph-name="videoright" unicode="&#58994;" d="M96 800l832 0 0-32-832 0 0 32ZM96 704l832 0 0-32-832 0 0 32ZM96 96l832 0 0-32-832 0 0 32ZM96 0l399.36 0 0-32-399.36 0 0 32ZM96 192l224 0 0-32-224 0 0 32ZM96 288l224 0 0-32-224 0 0 32ZM96 384l224 0 0-32-224 0 0 32ZM96 480l224 0 0-32-224 0 0 32ZM96 576l224 0 0-32-224 0 0 32ZM512 416m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM896 576H384a32 32 0 0 1-32-32v-352a32 32 0 0 1 32-32h512a32 32 0 0 1 32 32V544a32 32 0 0 1-32 32z m0-251.52L800 448l-162.24-208.64-77.76 93.44-117.44-140.8H416a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32zM992 864v-960H32V864h960m0 32H32a32 32 0 0 1-32-32v-960a32 32 0 0 1 32-32h960a32 32 0 0 1 32 32V864a32 32 0 0 1-32 32z"  horiz-adv-x="1024" />
363
+
364
+    
365
+    <glyph glyph-name="template" unicode="&#58958;" d="M0 832v-896h1024v896zM960 0h-896v768h896zM192 640h320v-192h-320zM640 640h192v-512h-192zM192 320h320v-192h-320z"  horiz-adv-x="1024" />
366
+
367
+    
368
+    <glyph glyph-name="addfile" unicode="&#58995;" d="M1024 416H544V896h-64v-480H0v-64h480v-480h64V352h480v64z"  horiz-adv-x="1024" />
369
+
370
+    
371
+    <glyph glyph-name="selected" unicode="&#58996;" d="M914.24 278.72a32 32 0 0 1-45.12 0l-221.44-221.12-112.96 112.96a32 32 0 1 1-45.12-45.12l135.68-135.68a32 32 0 0 1 45.44 0l243.52 243.52a32 32 0 0 1 0 45.44zM0-128h1024V896z m914.24 361.28L672-10.24a32 32 0 0 0-45.44 0l-135.68 135.68a32 32 0 1 0 45.12 45.12l112.96-112.96 221.12 221.12a32 32 0 1 0 45.12-45.12z"  horiz-adv-x="1024" />
372
+
373
+    
374
+    <glyph glyph-name="pickarea" unicode="&#58997;" d="M977.454545 802.909091h-46.545454v-791.272727a46.545455 46.545455 0 0 0-46.545455-46.545455H93.090909v-46.545454a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V756.363636a46.545455 46.545455 0 0 1-46.545455 46.545455zM46.545455 849.454545l837.818181 0 0-837.818181-837.818181 0 0 837.818181ZM884.363636 896H46.545455a46.545455 46.545455 0 0 1-46.545455-46.545455v-837.818181a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V849.454545a46.545455 46.545455 0 0 1-46.545455 46.545455z m0-837.818182a46.545455 46.545455 0 0 0-46.545454-46.545454H93.090909a46.545455 46.545455 0 0 0-46.545454 46.545454V802.909091a46.545455 46.545455 0 0 0 46.545454 46.545454h744.727273a46.545455 46.545455 0 0 0 46.545454-46.545454z"  horiz-adv-x="1024" />
375
+
376
+    
377
+    <glyph glyph-name="overlay" unicode="&#58998;" d="M977.454545 802.909091h-46.545454v-791.272727a46.545455 46.545455 0 0 0-46.545455-46.545455H93.090909v-46.545454a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V756.363636a46.545455 46.545455 0 0 1-46.545455 46.545455zM46.545455 849.454545l837.818181 0 0-837.818181-837.818181 0 0 837.818181ZM884.363636 896H46.545455a46.545455 46.545455 0 0 1-46.545455-46.545455v-837.818181a46.545455 46.545455 0 0 1 46.545455-46.545455h837.818181a46.545455 46.545455 0 0 1 46.545455 46.545455V849.454545a46.545455 46.545455 0 0 1-46.545455 46.545455z m0-837.818182a46.545455 46.545455 0 0 0-46.545454-46.545454H93.090909a46.545455 46.545455 0 0 0-46.545454 46.545454V802.909091a46.545455 46.545455 0 0 0 46.545454 46.545454h744.727273a46.545455 46.545455 0 0 0 46.545454-46.545454z"  horiz-adv-x="1024" />
378
+
379
+    
380
+    <glyph glyph-name="preitem" unicode="&#58999;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM175.542857 764.342857h497.371429v-58.514286H175.542857zM175.542857 384h438.857143v-29.257143H175.542857zM175.542857 501.028571h906.971429v-29.257142H175.542857zM175.542857 618.057143h234.057143v-29.257143H175.542857zM175.542857 266.971429h1111.771429v-29.257143H175.542857zM175.542857 149.942857h292.571429v-29.257143H175.542857zM175.542857 32.914286h760.685714v-29.257143H175.542857z"  horiz-adv-x="1462" />
381
+
382
+    
383
+    <glyph glyph-name="preitem1" unicode="&#59000;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM117.028571 720.457143h351.085715v-29.257143H117.028571z"  horiz-adv-x="1462" />
384
+
385
+    
386
+    <glyph glyph-name="preitem2" unicode="&#59001;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM175.542857 778.971429h497.371429v-58.514286H175.542857zM848.457143 340.114286h438.857143v-29.257143H848.457143zM848.457143 457.142857h438.857143v-29.257143H848.457143zM848.457143 574.171429h438.857143v-29.257143H848.457143zM175.542857 223.085714h1111.771429v-29.257143H175.542857zM175.542857 106.057143h702.171429v-29.257143H175.542857zM175.542857-10.971429h702.171429v-29.257142H175.542857zM731.428571 544.914286v-204.8H204.8V544.914286h526.628571m29.257143 29.257143H175.542857v-263.314286h585.142857V574.171429zM1258.057143 106.057143v-117.028572H994.742857v117.028572h263.314286m29.257143 29.257143H965.485714v-175.542857h321.828572V135.314286z"  horiz-adv-x="1462" />
387
+
388
+    
389
+    <glyph glyph-name="preitem3" unicode="&#59002;" d="M0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM482.742857 720.457143h497.371429v-58.514286H482.742857zM643.657143 603.428571h175.542857v-29.257142H643.657143zM175.542857 427.885714h1111.771429v-29.257143H175.542857zM175.542857 310.857143h1111.771429v-29.257143H175.542857zM175.542857 193.828571h1111.771429v-29.257142H175.542857zM175.542857 76.8h1111.771429v-29.257143H175.542857z"  horiz-adv-x="1462" />
390
+
391
+    
392
+    <glyph glyph-name="preitem4" unicode="&#59003;" d="M1258.057143 632.685714v-204.8H204.8V632.685714h1053.257143m29.257143 29.257143H175.542857v-263.314286h1111.771429V661.942857zM0 896v-1024h1462.857143V896z m1433.6-994.742857H29.257143V866.742857h1404.342857zM175.542857 778.971429h497.371429v-58.514286H175.542857zM175.542857 340.114286h351.085714v-29.257143H175.542857zM175.542857 223.085714h1111.771429v-29.257143H175.542857zM175.542857 106.057143h702.171429v-29.257143H175.542857zM175.542857-10.971429h1111.771429v-29.257142H175.542857z"  horiz-adv-x="1462" />
393
+
394
+    
395
+
396
+
397
+  </font>
398
+</defs></svg>

BIN
static/neditor/dialogs/fonts/iconfont.ttf View File


BIN
static/neditor/dialogs/fonts/iconfont.woff View File


+ 1 - 0
static/neditor/dialogs/fonts/images/addfile.svg View File

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1488001777589" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5327" xmlns:xlink="http://www.w3.org/1999/xlink" width="50" height="50"><defs><style type="text/css"></style></defs><path d="M1024 480H544V0h-64v480H0v64h480v480h64V544h480v-64z" fill="#E5E5E5" p-id="5328"></path></svg>

+ 1 - 0
static/neditor/dialogs/fonts/images/selected.svg View File

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1488001207278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5218" xmlns:xlink="http://www.w3.org/1999/xlink" width="40" height="40"><defs><style type="text/css"></style></defs><path d="M914.24 617.28a32 32 0 0 0-45.12 0l-221.44 221.12-112.96-112.96a32 32 0 1 0-45.12 45.12l135.68 135.68a32 32 0 0 0 45.44 0l243.52-243.52a32 32 0 0 0 0-45.44z" fill="#FFFFFF" p-id="5219"></path><path d="M0 1024h1024V0z m914.24-361.28L672 906.24a32 32 0 0 1-45.44 0l-135.68-135.68a32 32 0 1 1 45.12-45.12l112.96 112.96 221.12-221.12a32 32 0 1 1 45.12 45.12z" fill="#1094FA" p-id="5220"></path></svg>

+ 106 - 0
static/neditor/dialogs/gmap/gmap.html View File

@@ -0,0 +1,106 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+        "http://www.w3.org/TR/html4/loose.dtd">
3
+<html>
4
+<head>
5
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+    <title></title>
7
+    <script type="text/javascript" src="../internal.js"></script>
8
+    <style type="text/css">
9
+        .content{
10
+            width: 600px;
11
+            height: 412px;
12
+            margin: 20px;
13
+        }
14
+        .content table{width: 100%}
15
+        .content table td{vertical-align: middle;}
16
+        #address{width:405px;height:28px;background: #FFF;border:1px solid #ccc; line-height: 28px;border-radius: 5px;margin-left: 10px;}
17
+        #container {margin-top: 10px;}
18
+        #doSearch {
19
+            display: block;
20
+            text-align: center;
21
+            line-height: 30px;
22
+            text-decoration: none;
23
+            height: 30px;
24
+            width: 78px;
25
+            border: 0;
26
+            background-color: #3498db;
27
+            border-radius: 5px;
28
+            color: #fff;
29
+        }
30
+    </style>
31
+    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
32
+</head>
33
+<body>
34
+<div class="content">
35
+    <table>
36
+        <tr>
37
+            <td><label for="address"><var id="lang_input_address"></var></label></td>
38
+            <td><input id="address" type="text" /></td>
39
+            <td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
40
+        </tr>
41
+    </table>
42
+    <div id="container" style="width: 100%; height: 362px;margin-top: 20px;"></div>
43
+</div>
44
+<script type="text/javascript">
45
+    domUtils.on(window,"load",function(){
46
+        var map = new google.maps.Map(document.getElementById('container'), {
47
+                zoom: 3,
48
+                streetViewControl: false,
49
+                scaleControl: true,
50
+                mapTypeId: google.maps.MapTypeId.ROADMAP
51
+            });
52
+            var imgcss;
53
+            var marker = new google.maps.Marker({
54
+                map: map,
55
+                draggable: true
56
+            });
57
+            function doSearch(){
58
+                var address = document.getElementById('address').value;
59
+                var geocoder = new google.maps.Geocoder();
60
+                geocoder.geocode( { 'address': address}, function (results, status) {
61
+                    if (status == google.maps.GeocoderStatus.OK) {
62
+                        var bounds = results[0].geometry.viewport;
63
+                        map.fitBounds(bounds);
64
+                        marker.setPosition(results[0].geometry.location);
65
+                        marker.setTitle(address);
66
+                    } else alert(lang.searchError);
67
+                });
68
+            }
69
+            $G('address').onkeydown = function (evt){
70
+                evt = evt || event;
71
+                if (evt.keyCode == 13) {
72
+                    doSearch();
73
+                }
74
+            };
75
+            $G("doSearch").onclick = doSearch;
76
+            dialog.onok = function (){
77
+                var center = map.getCenter();
78
+                var point = marker.getPosition();
79
+                var url = "https://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
80
+                editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
81
+            };
82
+
83
+            function getPars(str,par){
84
+                var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
85
+                return reg.exec(str)[1];
86
+            }
87
+            var img = editor.selection.getRange().getClosedNode();
88
+            if(img && img.src.indexOf("https://maps.googleapis.com/maps/api/staticmap")!=-1){
89
+                var url = img.getAttribute("src");
90
+                var centers = getPars(url,"center").split(",");
91
+                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
92
+                map.setCenter(point);
93
+                map.setZoom(Number(getPars(url,"zoom")));
94
+                centers = getPars(url,"markers").split(",");
95
+                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
96
+                imgcss = img.style.cssText;
97
+            }else{
98
+                setTimeout(function(){
99
+                    doSearch();
100
+                },30)
101
+            }
102
+    });
103
+
104
+</script>
105
+</body>
106
+</html>

+ 7 - 0
static/neditor/dialogs/help/help.css View File

@@ -0,0 +1,7 @@
1
+.wrapper{width: 370px;margin: 10px auto;zoom: 1;}
2
+.tabbody{height: 360px;}
3
+.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;}
4
+.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;}
5
+.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;}
6
+.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;}
7
+.tabbody table thead{font-weight: bold;line-height: 25px;}

+ 82 - 0
static/neditor/dialogs/help/help.html View File

@@ -0,0 +1,82 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+        "http://www.w3.org/TR/html4/loose.dtd">
3
+<html>
4
+<head>
5
+    <title>帮助</title>
6
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
7
+    <script type="text/javascript" src="../internal.js"></script>
8
+    <link rel="stylesheet" type="text/css" href="help.css">
9
+</head>
10
+<body>
11
+<div class="wrapper" id="helptab">
12
+    <div id="tabHeads" class="tabhead">
13
+        <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
14
+        <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
15
+    </div>
16
+    <div id="tabBodys" class="tabbody">
17
+        <div id="about" class="panel">
18
+            <h1>UEditor</h1>
19
+            <p id="version"></p>
20
+            <p><var id="lang_input_introduction"></var></p>
21
+        </div>
22
+        <div id="shortcuts" class="panel">
23
+            <table>
24
+                <thead>
25
+                <tr>
26
+                    <td><var id="lang_Txt_shortcuts"></var></td>
27
+                    <td><var id="lang_Txt_func"></var></td>
28
+                </tr>
29
+                </thead>
30
+                <tbody>
31
+                <tr>
32
+                    <td>ctrl+b</td>
33
+                    <td><var id="lang_Txt_bold"></var></td>
34
+                </tr>
35
+                <tr>
36
+                    <td>ctrl+c</td>
37
+                    <td><var id="lang_Txt_copy"></var></td>
38
+                </tr>
39
+                <tr>
40
+                    <td>ctrl+x</td>
41
+                    <td><var id="lang_Txt_cut"></var></td>
42
+                </tr>
43
+                <tr>
44
+                    <td>ctrl+v</td>
45
+                    <td><var id="lang_Txt_Paste"></var></td>
46
+                </tr>
47
+                <tr>
48
+                    <td>ctrl+y</td>
49
+                    <td><var id="lang_Txt_undo"></var></td>
50
+                </tr>
51
+                <tr>
52
+                    <td>ctrl+z</td>
53
+                    <td><var id="lang_Txt_redo"></var></td>
54
+                </tr>
55
+                <tr>
56
+                    <td>ctrl+i</td>
57
+                    <td><var id="lang_Txt_italic"></var></td>
58
+                </tr>
59
+                <tr>
60
+                    <td>ctrl+u</td>
61
+                    <td><var id="lang_Txt_underline"></var></td>
62
+                </tr>
63
+                <tr>
64
+                    <td>ctrl+a</td>
65
+                    <td><var id="lang_Txt_selectAll"></var></td>
66
+                </tr>
67
+                <tr>
68
+                    <td>shift+enter</td>
69
+                    <td><var id="lang_Txt_visualEnter"></var></td>
70
+                </tr>
71
+                <tr>
72
+                    <td>alt+z</td>
73
+                    <td><var id="lang_Txt_fullscreen"></var></td>
74
+                </tr>
75
+                </tbody>
76
+            </table>
77
+        </div>
78
+    </div>
79
+</div>
80
+<script type="text/javascript" src="help.js"></script>
81
+</body>
82
+</html>

+ 56 - 0
static/neditor/dialogs/help/help.js View File

@@ -0,0 +1,56 @@
1
+/**
2
+ * Created with JetBrains PhpStorm.
3
+ * User: xuheng
4
+ * Date: 12-9-26
5
+ * Time: 下午1:06
6
+ * To change this template use File | Settings | File Templates.
7
+ */
8
+/**
9
+ * tab点击处理事件
10
+ * @param tabHeads
11
+ * @param tabBodys
12
+ * @param obj
13
+ */
14
+function clickHandler( tabHeads,tabBodys,obj ) {
15
+    //head样式更改
16
+    for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
17
+        tabHeads[k].className = "";
18
+    }
19
+    obj.className = "focus";
20
+    //body显隐
21
+    var tabSrc = obj.getAttribute( "tabSrc" );
22
+    for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
23
+        var body = tabBodys[j],
24
+            id = body.getAttribute( "id" );
25
+        body.onclick = function(){
26
+            this.style.zoom = 1;
27
+        };
28
+        if ( id != tabSrc ) {
29
+            body.style.zIndex = 1;
30
+        } else {
31
+            body.style.zIndex = 200;
32
+        }
33
+    }
34
+
35
+}
36
+
37
+/**
38
+ * TAB切换
39
+ * @param tabParentId  tab的父节点ID或者对象本身
40
+ */
41
+function switchTab( tabParentId ) {
42
+    var tabElements = $G( tabParentId ).children,
43
+        tabHeads = tabElements[0].children,
44
+        tabBodys = tabElements[1].children;
45
+
46
+    for ( var i = 0, length = tabHeads.length; i < length; i++ ) {
47
+        var head = tabHeads[i];
48
+        if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head );
49
+        head.onclick = function () {
50
+            clickHandler(tabHeads,tabBodys,this);
51
+        }
52
+    }
53
+}
54
+switchTab("helptab");
55
+
56
+document.getElementById('version').innerHTML = parent.UE.version;

+ 936 - 0
static/neditor/dialogs/image/image.css View File

@@ -0,0 +1,936 @@
1
+@charset "utf-8";
2
+/* dialog样式 */
3
+.wrapper {
4
+    zoom: 1;
5
+    width: 600px;
6
+    height: 412px;
7
+    margin: 0 auto;
8
+    padding: 20px;
9
+    position: relative;
10
+    font-family: sans-serif;
11
+}
12
+
13
+/*tab样式框大小*/
14
+.tabhead {
15
+    float:left;
16
+}
17
+.tabbody {
18
+    width: 100%;
19
+    height: 346px;
20
+    position: relative;
21
+    clear: both;
22
+}
23
+
24
+.tabbody .panel {
25
+    position: absolute;
26
+    width: 0;
27
+    height: 0;
28
+    background: #fff;
29
+    overflow: hidden;
30
+    display: none;
31
+}
32
+
33
+.tabbody .panel.focus {
34
+    width: 100%;
35
+    height: 380px;
36
+    display: block;
37
+}
38
+
39
+/* 图片对齐方式 */
40
+.alignBar{
41
+    float:right;
42
+    margin-top: 5px;
43
+    position: relative;
44
+}
45
+
46
+.alignBar .algnLabel{
47
+    float:left;
48
+    height: 20px;
49
+    line-height: 20px;
50
+}
51
+
52
+.alignBar #alignIcon{
53
+    zoom:1;
54
+    _display: inline;
55
+    display: inline-block;
56
+    position: relative;
57
+}
58
+.alignBar #alignIcon span{
59
+    float: left;
60
+    cursor: pointer;
61
+    display: block;
62
+    width: 19px;
63
+    height: 17px;
64
+    margin-right: 3px;
65
+    margin-left: 3px;
66
+    background-image: url(./images/alignicon.jpg);
67
+}
68
+.alignBar #alignIcon .none-align{
69
+    background-position: 0 -18px;
70
+}
71
+.alignBar #alignIcon .left-align{
72
+    background-position: -20px -18px;
73
+}
74
+.alignBar #alignIcon .right-align{
75
+    background-position: -40px -18px;
76
+}
77
+.alignBar #alignIcon .center-align{
78
+    background-position: -60px -18px;
79
+}
80
+.alignBar #alignIcon .none-align.focus{
81
+    background-position: 0 0;
82
+}
83
+.alignBar #alignIcon .left-align.focus{
84
+    background-position: -20px 0;
85
+}
86
+.alignBar #alignIcon .right-align.focus{
87
+    background-position: -40px 0;
88
+}
89
+.alignBar #alignIcon .center-align.focus{
90
+    background-position: -60px 0;
91
+}
92
+
93
+
94
+
95
+
96
+/* 远程图片样式 */
97
+#remote {
98
+    z-index: 200;
99
+}
100
+
101
+#remote .top{
102
+    width: 100%;
103
+    margin-top: 20px;
104
+}
105
+#remote .left{
106
+    display: block;
107
+    float: left;
108
+    width: 240px;
109
+    height:10px;
110
+}
111
+#remote .right{
112
+    display: block;
113
+    float: right;
114
+    width: 345px;
115
+    height:10px;
116
+}
117
+#remote .row{
118
+    /*margin-left: 20px;*/
119
+    display: flex;
120
+    clear: both;
121
+    height: 30px;
122
+    line-height: 30px;
123
+    margin-bottom: 20px;
124
+}
125
+
126
+#remote .row label{
127
+    text-align: center;
128
+    width: 50px;
129
+    zoom:1;
130
+    _display: inline;
131
+    display:inline-block;
132
+    vertical-align: middle;
133
+    margin-right: 10px;
134
+}
135
+#remote .row label.algnLabel{
136
+    float: left;
137
+
138
+}
139
+
140
+#remote input.text{
141
+    height: 28px;
142
+    width: 150px;
143
+    font-size: 14px;
144
+    line-height: 1.42857143;
145
+    color: #555;
146
+    background-color: #fff;
147
+    background-image: none;
148
+    border: 1px solid #ccc;
149
+    border-radius: 4px;
150
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
151
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
152
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
153
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
154
+}
155
+#remote input.text:focus {
156
+    border-color: #66afe9;
157
+    outline: 0;
158
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
159
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
160
+}
161
+#remote textarea.text{
162
+    width: 160px;
163
+    height: 120px;
164
+    font-size: 14px;
165
+    line-height: 1.42857143;
166
+    color: #555;
167
+    background-color: #fff;
168
+    background-image: none;
169
+    border: 1px solid #ccc;
170
+    border-radius: 4px;
171
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
172
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
173
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
174
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
175
+    resize: none;
176
+}
177
+#remote textarea.text:focus {
178
+    border-color: #66afe9;
179
+    outline: 0;
180
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
181
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
182
+}
183
+#remote #url{
184
+    width: 537px;
185
+    height: 28px;
186
+}
187
+#remote #width,
188
+#remote #height{
189
+    width: 60px;
190
+    height: 28px;
191
+    margin-left: 8px;
192
+    margin-right: 8px;
193
+}
194
+#remote .top .row:nth-child(2) span:nth-child(1) ,
195
+#remote .top .row:nth-child(2) span:nth-child(2) {
196
+    display: block;
197
+    margin-right: 18px;
198
+}
199
+
200
+#remote .top .row:nth-child(2) span:last-child {
201
+    margin-left: 15px;
202
+}
203
+#remote #border,
204
+#remote #vhSpace,
205
+#remote #title{
206
+    width: 145px;
207
+    margin-right: 8px;
208
+}
209
+#remote #lock{
210
+    margin-top: 11px;
211
+}
212
+#remote #lockicon{
213
+    zoom: 1;
214
+    _display:inline;
215
+    display: inline-block;
216
+    height: 20px;
217
+    background: url("../../themes/notadd/images/lock.gif") -13px -13px no-repeat;
218
+    vertical-align: middle;
219
+}
220
+#remote #preview{
221
+    clear: both;
222
+    width: 345px;
223
+    height: 261px;
224
+    z-index: 9999;
225
+    background-color: #f3f3f3;
226
+    overflow: hidden;
227
+}
228
+
229
+/* 上传图片 */
230
+.tabbody #upload.panel {
231
+    width: 0;
232
+    height: 0;
233
+    overflow: hidden;
234
+    position: absolute !important;
235
+    clip: rect(1px, 1px, 1px, 1px);
236
+    background: #fff;
237
+    display: block;
238
+}
239
+
240
+.tabbody #upload.panel.focus {
241
+    width: 100%;
242
+    height: 373px;
243
+    display: block;
244
+    clip: auto;
245
+    margin-top: 12px;
246
+}
247
+
248
+#upload .queueList {
249
+    margin: 0;
250
+    width: 100%;
251
+    height: 100%;
252
+    position: absolute;
253
+    overflow: hidden;
254
+}
255
+
256
+#upload p {
257
+    margin: 0;
258
+}
259
+
260
+.element-invisible {
261
+    width: 0 !important;
262
+    height: 0 !important;
263
+    border: 0;
264
+    padding: 0;
265
+    margin: 0;
266
+    overflow: hidden;
267
+    position: absolute !important;
268
+    clip: rect(1px, 1px, 1px, 1px);
269
+}
270
+
271
+#upload .placeholder {
272
+    margin: 10px;
273
+    height: 212px;
274
+    padding-top: 160px;
275
+    text-align: center;
276
+    /*background: url(./images/image.png) center 130px no-repeat #f3f3f3;*/
277
+    background-color: #f3f3f3;
278
+    color: #cccccc;
279
+    font-size: 18px;
280
+    position: relative;
281
+    top: 0;
282
+}
283
+
284
+#upload .placeholder .webuploader-pick {
285
+    font-size: 16px;
286
+    background: #f3f3f3;
287
+    border-radius: 3px;
288
+    line-height: 44px;
289
+    padding: 0 30px;
290
+    color: #646464;
291
+    display: inline-block;
292
+    margin: 0 auto 20px auto;
293
+    cursor: pointer;
294
+    /* box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); */
295
+    border: 1px solid #ccc;
296
+}
297
+
298
+#upload .placeholder .webuploader-pick-hover {
299
+    border: 1px solid #00a2d4;
300
+    color: #00a2d4;
301
+}
302
+
303
+
304
+#filePickerContainer {
305
+    text-align: center;
306
+}
307
+
308
+#upload .placeholder .flashTip {
309
+    color: #666666;
310
+    font-size: 12px;
311
+    position: absolute;
312
+    width: 100%;
313
+    text-align: center;
314
+    bottom: 20px;
315
+}
316
+
317
+#upload .placeholder .flashTip a {
318
+    color: #0785d1;
319
+    text-decoration: none;
320
+}
321
+
322
+#upload .placeholder .flashTip a:hover {
323
+    text-decoration: underline;
324
+}
325
+
326
+#upload .placeholder.webuploader-dnd-over {
327
+    border-color: #999999;
328
+}
329
+
330
+#upload .filelist {
331
+    list-style: none;
332
+    margin: 0;
333
+    padding: 0;
334
+    overflow-x: hidden;
335
+    overflow-y: auto;
336
+    position: relative;
337
+    height: 300px;
338
+}
339
+
340
+#upload .filelist:after {
341
+    content: '';
342
+    display: block;
343
+    width: 0;
344
+    height: 0;
345
+    overflow: hidden;
346
+    clear: both;
347
+    position: relative;
348
+}
349
+
350
+#upload .filelist li {
351
+    width: 135px;
352
+    height: 135px;
353
+    background: url(./images/bg.png);
354
+    text-align: center;
355
+    margin: 9px 0 0 9px;
356
+    *margin: 6px 0 0 6px;
357
+    position: relative;
358
+    display: block;
359
+    float: left;
360
+    overflow: hidden;
361
+    font-size: 12px;
362
+}
363
+
364
+#upload .filelist li p.log {
365
+    position: relative;
366
+    top: -45px;
367
+}
368
+
369
+#upload .filelist li p.title {
370
+    position: absolute;
371
+    top: 0;
372
+    left: 0;
373
+    width: 100%;
374
+    overflow: hidden;
375
+    white-space: nowrap;
376
+    text-overflow: ellipsis;
377
+    top: 5px;
378
+    text-indent: 5px;
379
+    text-align: left;
380
+}
381
+
382
+#upload .filelist li p.progress {
383
+    position: absolute;
384
+    width: 100%;
385
+    bottom: 0;
386
+    left: 0;
387
+    height: 8px;
388
+    overflow: hidden;
389
+    z-index: 50;
390
+    margin: 0;
391
+    border-radius: 0;
392
+    background: none;
393
+    -webkit-box-shadow: 0 0 0;
394
+}
395
+
396
+#upload .filelist li p.progress span {
397
+    display: none;
398
+    overflow: hidden;
399
+    width: 0;
400
+    height: 100%;
401
+    background: #1483d8 url(./images/progress.png) repeat-x;
402
+
403
+    -webit-transition: width 200ms linear;
404
+    -moz-transition: width 200ms linear;
405
+    -o-transition: width 200ms linear;
406
+    -ms-transition: width 200ms linear;
407
+    transition: width 200ms linear;
408
+
409
+    -webkit-animation: progressmove 2s linear infinite;
410
+    -moz-animation: progressmove 2s linear infinite;
411
+    -o-animation: progressmove 2s linear infinite;
412
+    -ms-animation: progressmove 2s linear infinite;
413
+    animation: progressmove 2s linear infinite;
414
+
415
+    -webkit-transform: translateZ(0);
416
+}
417
+
418
+@-webkit-keyframes progressmove {
419
+    0% {
420
+        background-position: 0 0;
421
+    }
422
+    100% {
423
+        background-position: 17px 0;
424
+    }
425
+}
426
+
427
+@-moz-keyframes progressmove {
428
+    0% {
429
+        background-position: 0 0;
430
+    }
431
+    100% {
432
+        background-position: 17px 0;
433
+    }
434
+}
435
+
436
+@keyframes progressmove {
437
+    0% {
438
+        background-position: 0 0;
439
+    }
440
+    100% {
441
+        background-position: 17px 0;
442
+    }
443
+}
444
+
445
+#upload .filelist li p.imgWrap {
446
+    position: relative;
447
+    z-index: 2;
448
+    line-height: 135px;
449
+    vertical-align: middle;
450
+    overflow: hidden;
451
+    width: 135px;
452
+    height: 135px;
453
+
454
+    -webkit-transform-origin: 50% 50%;
455
+    -moz-transform-origin: 50% 50%;
456
+    -o-transform-origin: 50% 50%;
457
+    -ms-transform-origin: 50% 50%;
458
+    transform-origin: 50% 50%;
459
+
460
+    -webit-transition: 200ms ease-out;
461
+    -moz-transition: 200ms ease-out;
462
+    -o-transition: 200ms ease-out;
463
+    -ms-transition: 200ms ease-out;
464
+    transition: 200ms ease-out;
465
+}
466
+
467
+#upload .filelist li img {
468
+    width: 100%;
469
+}
470
+
471
+#upload .filelist li p.error {
472
+    background: #f43838;
473
+    color: #fff;
474
+    position: absolute;
475
+    bottom: 0;
476
+    left: 0;
477
+    height: 28px;
478
+    line-height: 28px;
479
+    width: 100%;
480
+    z-index: 100;
481
+    display:none;
482
+}
483
+
484
+#upload .filelist li .success {
485
+    display: block;
486
+    position: absolute;
487
+    left: 0;
488
+    bottom: 0;
489
+    height: 40px;
490
+    width: 100%;
491
+    z-index: 200;
492
+    background: url(../fonts/images/selected.svg) no-repeat right bottom;
493
+}
494
+
495
+#upload .filelist li.filePickerBlock {
496
+    width: 135px;
497
+    height: 135px;
498
+    background: url(../fonts/images/addfile.svg) no-repeat center;
499
+    border: 1px solid #eeeeee;
500
+    border-radius: 0;
501
+}
502
+#upload .filelist li.filePickerBlock div.webuploader-pick  {
503
+    width: 100%;
504
+    height: 100%;
505
+    margin: 0;
506
+    padding: 0;
507
+    opacity: 0;
508
+    background: none;
509
+    font-size: 0;
510
+}
511
+
512
+#upload .filelist div.file-panel {
513
+    position: absolute;
514
+    height: 0;
515
+    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
516
+    background: rgba(0, 0, 0, 0.5);
517
+    width: 100%;
518
+    top: 0;
519
+    left: 0;
520
+    overflow: hidden;
521
+    z-index: 300;
522
+}
523
+
524
+#upload .filelist div.file-panel span {
525
+    width: 24px;
526
+    height: 24px;
527
+    display: inline;
528
+    float: right;
529
+    text-indent: -9999px;
530
+    overflow: hidden;
531
+    background: url(./images/icons.png) no-repeat;
532
+    background: url(./images/icons.gif) no-repeat \9;
533
+    margin: 5px 1px 1px;
534
+    cursor: pointer;
535
+    -webkit-tap-highlight-color: rgba(0,0,0,0);
536
+    -webkit-user-select: none;
537
+    -moz-user-select: none;
538
+    -ms-user-select: none;
539
+    user-select: none;
540
+}
541
+
542
+#upload .filelist div.file-panel span.rotateLeft {
543
+    display:none;
544
+    background-position: 0 -24px;
545
+}
546
+
547
+#upload .filelist div.file-panel span.rotateLeft:hover {
548
+    background-position: 0 0;
549
+}
550
+
551
+#upload .filelist div.file-panel span.rotateRight {
552
+    display:none;
553
+    background-position: -24px -24px;
554
+}
555
+
556
+#upload .filelist div.file-panel span.rotateRight:hover {
557
+    background-position: -24px 0;
558
+}
559
+
560
+#upload .filelist div.file-panel span.cancel {
561
+    background-position: -48px -24px;
562
+}
563
+
564
+#upload .filelist div.file-panel span.cancel:hover {
565
+    background-position: -48px 0;
566
+}
567
+
568
+#upload .statusBar {
569
+    height: 45px;
570
+    border-bottom: 1px solid #dadada;
571
+    margin: 0 10px;
572
+    padding: 0;
573
+    line-height: 45px;
574
+    vertical-align: middle;
575
+    position: relative;
576
+}
577
+
578
+#upload .statusBar .progress {
579
+    border: 1px solid #1483d8;
580
+    width: 198px;
581
+    background: #fff;
582
+    height: 18px;
583
+    position: absolute;
584
+    top: 12px;
585
+    display: none;
586
+    text-align: center;
587
+    line-height: 18px;
588
+    color: #6dbfff;
589
+    margin: 0 10px 0 0;
590
+}
591
+#upload .statusBar .progress span.percentage {
592
+    width: 0;
593
+    height: 100%;
594
+    left: 0;
595
+    top: 0;
596
+    background: #1483d8;
597
+    position: absolute;
598
+}
599
+#upload .statusBar .progress span.text {
600
+    position: relative;
601
+    z-index: 10;
602
+}
603
+
604
+#upload .statusBar .info {
605
+    display: inline-block;
606
+    font-size: 14px;
607
+    color: #666666;
608
+}
609
+
610
+#upload .statusBar .btns {
611
+    position: absolute;
612
+    top: 7px;
613
+    right: 0;
614
+    line-height: 30px;
615
+}
616
+
617
+#filePickerBtn {
618
+    display: inline-block;
619
+    float: left;
620
+}
621
+#upload .statusBar .btns .webuploader-pick,
622
+#upload .statusBar .btns .uploadBtn,
623
+#upload .statusBar .btns .uploadBtn.state-uploading,
624
+#upload .statusBar .btns .uploadBtn.state-paused {
625
+    background: #ffffff;
626
+    border: 1px solid #cfcfcf;
627
+    color: #565656;
628
+    padding: 0 18px;
629
+    display: inline-block;
630
+    border-radius: 3px;
631
+    margin-left: 10px;
632
+    cursor: pointer;
633
+    font-size: 14px;
634
+    float: left;
635
+    -webkit-user-select: none;
636
+    -moz-user-select: none;
637
+    -ms-user-select: none;
638
+    user-select: none;
639
+}
640
+#upload .statusBar .btns .webuploader-pick-hover,
641
+#upload .statusBar .btns .uploadBtn:hover,
642
+#upload .statusBar .btns .uploadBtn.state-uploading:hover,
643
+#upload .statusBar .btns .uploadBtn.state-paused:hover {
644
+    background: #f0f0f0;
645
+}
646
+
647
+#upload .statusBar .btns .uploadBtn,
648
+#upload .statusBar .btns .uploadBtn.state-paused{
649
+    background: #00b7ee;
650
+    color: #fff;
651
+    border-color: transparent;
652
+}
653
+#upload .statusBar .btns .uploadBtn:hover,
654
+#upload .statusBar .btns .uploadBtn.state-paused:hover{
655
+    background: #00a2d4;
656
+}
657
+
658
+#upload .statusBar .btns .uploadBtn.disabled {
659
+    pointer-events: none;
660
+    filter:alpha(opacity=60);
661
+    -moz-opacity:0.6;
662
+    -khtml-opacity: 0.6;
663
+    opacity: 0.6;
664
+}
665
+
666
+
667
+
668
+/* 图片管理样式 */
669
+#online {
670
+    width: 100%;
671
+    height: 336px;
672
+    padding: 10px 0 0 0;
673
+}
674
+#online #imageList{
675
+    width: 100%;
676
+    height: 100%;
677
+    overflow-x: hidden;
678
+    overflow-y: auto;
679
+    position: relative;
680
+}
681
+#online ul {
682
+    display: block;
683
+    list-style: none;
684
+    margin: 0;
685
+    padding: 0;
686
+}
687
+#online li {
688
+    float: left;
689
+    display: block;
690
+    list-style: none;
691
+    padding: 0;
692
+    width: 135px;
693
+    height: 135px;
694
+    margin: 0 0 9px 9px;
695
+    *margin: 0 0 6px 6px;
696
+    background-color: #eee;
697
+    overflow: hidden;
698
+    cursor: pointer;
699
+    position: relative;
700
+}
701
+#online li.clearFloat {
702
+    float: none;
703
+    clear: both;
704
+    display: block;
705
+    width:0;
706
+    height:0;
707
+    margin: 0;
708
+    padding: 0;
709
+}
710
+#online li img {
711
+    cursor: pointer;
712
+    width: 135px !important;
713
+    height: 135px !important;
714
+    margin-top: 0px !important;
715
+}
716
+#online li .icon {
717
+    cursor: pointer;
718
+    width: 135px;
719
+    height: 135px;
720
+    position: absolute;
721
+    top: 0;
722
+    left: 0;
723
+    z-index: 2;
724
+    border: 0;
725
+    background-repeat: no-repeat;
726
+}
727
+#online li .icon:hover {
728
+    width: 129px;
729
+    height: 129px;
730
+    border: 3px solid #1094fa;
731
+}
732
+#online li.selected .icon {
733
+    background-image: url(images/success.png);
734
+    background-image: url(images/success.gif)\9;
735
+    background-position: 95px 95px;
736
+}
737
+#online li.selected .icon:hover {
738
+    width: 129px;
739
+    height: 129px;
740
+    border: 3px solid #1094fa;
741
+    background-position: 92px 92px;
742
+}
743
+
744
+
745
+/* 图片搜索样式 */
746
+#search .searchBar {
747
+    width: 100%;
748
+    height: 30px;
749
+    margin: 10px 0 5px 0;
750
+    padding: 0;
751
+}
752
+
753
+#search input.text{
754
+    width: 150px;
755
+    padding: 3px 6px;
756
+    font-size: 14px;
757
+    line-height: 1.42857143;
758
+    color: #555;
759
+    background-color: #fff;
760
+    background-image: none;
761
+    border: 1px solid #ccc;
762
+    border-radius: 4px;
763
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
764
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
765
+    -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
766
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
767
+}
768
+#search input.text:focus {
769
+    border-color: #66afe9;
770
+    outline: 0;
771
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
772
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
773
+}
774
+#search input.searchTxt {
775
+    margin-left:5px;
776
+    padding-left: 5px;
777
+    background: #FFF;
778
+    width: 300px;
779
+    *width: 260px;
780
+    height: 21px;
781
+    line-height: 21px;
782
+    float: left;
783
+    dislay: block;
784
+}
785
+#search .pagination{
786
+    margin-top: 5px;
787
+}
788
+#search input.num{
789
+    width: 80px;
790
+}
791
+
792
+#search .searchType {
793
+    width: 95px;
794
+    height: 28px;
795
+    padding:0;
796
+    line-height: 28px;
797
+    border: 1px solid #d7d7d7;
798
+    border-radius: 0;
799
+    vertical-align: top;
800
+    margin-left: 5px;
801
+    float: left;
802
+    dislay: block;
803
+}
804
+
805
+#search #searchBtn,
806
+#search #searchReset {
807
+    display: inline-block;
808
+    margin-bottom: 0;
809
+    margin-right: 5px;
810
+    padding: 4px 10px;
811
+    font-weight: 400;
812
+    text-align: center;
813
+    vertical-align: middle;
814
+    cursor: pointer;
815
+    background-image: none;
816
+    border: 1px solid transparent;
817
+    white-space: nowrap;
818
+    font-size: 14px;
819
+    border-radius: 4px;
820
+    -webkit-user-select: none;
821
+    -moz-user-select: none;
822
+    -ms-user-select: none;
823
+    user-select: none;
824
+    vertical-align: top;
825
+    float: right;
826
+}
827
+
828
+#search #searchBtn {
829
+    color: white;
830
+    border-color: #285e8e;
831
+    background-color: #3b97d7;
832
+}
833
+#search #searchReset {
834
+    color: #333;
835
+    border-color: #ccc;
836
+    background-color: #fff;
837
+}
838
+#search #searchBtn:hover {
839
+    background-color: #3276b1;
840
+}
841
+#search #searchReset:hover {
842
+    background-color: #eee;
843
+}
844
+
845
+#search .msg {
846
+    margin-left: 5px;
847
+}
848
+
849
+#search .searchList{
850
+    width: 100%;
851
+    height: 300px;
852
+    overflow: hidden;
853
+    clear: both;
854
+}
855
+#search .searchList ul{
856
+    margin:0;
857
+    padding:0;
858
+    list-style:none;
859
+    clear: both;
860
+    width: 100%;
861
+    height: 100%;
862
+    overflow-x: hidden;
863
+    overflow-y: auto;
864
+    zoom: 1;
865
+    position: relative;
866
+}
867
+
868
+#search .searchList li {
869
+    list-style:none;
870
+    float: left;
871
+    display: block;
872
+    width: 115px;
873
+    margin: 5px 10px 5px 20px;
874
+    *margin: 5px 10px 5px 15px;
875
+    padding:0;
876
+    font-size: 12px;
877
+    box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
878
+    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
879
+    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
880
+    position: relative;
881
+    vertical-align: top;
882
+    text-align: center;
883
+    overflow: hidden;
884
+    cursor: pointer;
885
+    filter: alpha(Opacity=100);
886
+    -moz-opacity: 1;
887
+    opacity: 1;
888
+    border: 2px solid #eee;
889
+}
890
+
891
+#search .searchList li.selected {
892
+    filter: alpha(Opacity=40);
893
+    -moz-opacity: 0.4;
894
+    opacity: 0.4;
895
+    border: 2px solid #00a0e9;
896
+}
897
+
898
+#search .searchList li p {
899
+    background-color: #eee;
900
+    margin: 0;
901
+    padding: 0;
902
+    position: relative;
903
+    width:100%;
904
+    height:115px;
905
+    overflow: hidden;
906
+}
907
+
908
+#search .searchList li p img {
909
+    cursor: pointer;
910
+    border: 0;
911
+}
912
+
913
+#search .searchList li a {
914
+    color: #999;
915
+    border-top: 1px solid #F2F2F2;
916
+    background: #FAFAFA;
917
+    text-align: center;
918
+    display: block;
919
+    padding: 0 5px;
920
+    width: 105px;
921
+    height:32px;
922
+    line-height:32px;
923
+    white-space:nowrap;
924
+    text-overflow:ellipsis;
925
+    text-decoration: none;
926
+    overflow: hidden;
927
+    word-break: break-all;
928
+}
929
+
930
+#search .searchList a:hover {
931
+    text-decoration: underline;
932
+    color: #333;
933
+}
934
+#search .searchList .clearFloat{
935
+    clear: both;
936
+}

+ 127 - 0
static/neditor/dialogs/image/image.html View File

@@ -0,0 +1,127 @@
1
+<!doctype html>
2
+<html>
3
+<head>
4
+    <meta charset="UTF-8">
5
+    <title>neditor图片对话框</title>
6
+    <script type="text/javascript" src="../internal.js"></script>
7
+
8
+    <!-- jquery -->
9
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
10
+
11
+    <!-- webuploader -->
12
+    <script src="../../third-party/webuploader/webuploader.js"></script>
13
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
14
+
15
+    <!-- image dialog -->
16
+    <link rel="stylesheet" href="image.css" type="text/css" />
17
+    <!--<link rel="stylesheet" href="../fonts/buttoniconex.css">-->
18
+</head>
19
+<body>
20
+
21
+    <div class="wrapper">
22
+        <div id="tabhead" class="tabhead">
23
+            <span class="tab" data-content-id="remote"><var id="lang_tab_remote"></var></span>
24
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
25
+            <!-- <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span> -->
26
+            <!-- <span class="tab" data-content-id="search"><var id="lang_tab_search"></var></span> -->
27
+        </div>
28
+        <div class="alignBar">
29
+            <label class="algnLabel"><var id="lang_input_align"></var></label>
30
+                <span id="alignIcon">
31
+                    <span id="noneAlign" class="none-align focus" data-align="none">
32
+                        <!--<i class="icon edui-icon"></i>-->
33
+                    </span>
34
+                    <span id="leftAlign" class="left-align" data-align="left"></span>
35
+                    <span id="rightAlign" class="right-align" data-align="right"></span>
36
+                    <span id="centerAlign" class="center-align" data-align="center"></span>
37
+                </span>
38
+            <input id="align" name="align" type="hidden" value="none"/>
39
+        </div>
40
+        <div id="tabbody" class="tabbody">
41
+
42
+            <!-- 远程图片 -->
43
+            <div id="remote" class="panel">
44
+                <div class="top">
45
+                    <div class="row">
46
+                        <label for="url"><var id="lang_input_url"></var></label>
47
+                        <span><input class="text" id="url" type="text"/></span>
48
+                    </div>
49
+                    <div class="row">
50
+                        <label><var id="lang_input_size"></var></label>
51
+                        <span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text" id="width"/>px </span>
52
+                        <span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
53
+                        <span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
54
+                    </div>
55
+                </div>
56
+                <div class="left">
57
+                    <div class="row">
58
+                        <label><var id="lang_input_border"></var></label>
59
+                        <span><input class="text" type="text" id="border"/>px </span>
60
+                    </div>
61
+                    <div class="row">
62
+                        <label><var id="lang_input_vhspace"></var></label>
63
+                        <span><input class="text" type="text" id="vhSpace"/>px </span>
64
+                    </div>
65
+                    <div class="row">
66
+                        <label><var id="lang_input_title"></var></label>
67
+                        <span><textarea class="text" id="title" cols="30" rows="3"></textarea></span>
68
+                    </div>
69
+                </div>
70
+                <div class="right"><div id="preview"></div></div>
71
+            </div>
72
+
73
+            <!-- 上传图片 -->
74
+            <div id="upload" class="panel focus">
75
+                <div id="queueList" class="queueList">
76
+                    <div class="statusBar element-invisible">
77
+                        <div class="progress">
78
+                            <span class="text">0%</span>
79
+                            <span class="percentage"></span>
80
+                        </div><div class="info"></div>
81
+                        <div class="btns">
82
+                            <div id="filePickerBtn"></div>
83
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
84
+                        </div>
85
+                    </div>
86
+                    <div id="dndArea" class="placeholder">
87
+                        <div class="filePickerContainer">
88
+                            <div id="filePickerReady"></div>
89
+                        </div>
90
+                    </div>
91
+                    <ul class="filelist element-invisible">
92
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
93
+                    </ul>
94
+                </div>
95
+            </div>
96
+
97
+            <!-- 在线图片 -->
98
+            <div id="online" class="panel">
99
+                <div id="imageList"><var id="lang_imgLoading"></var></div>
100
+            </div>
101
+
102
+            <!-- 搜索图片 -->
103
+            <div id="search" class="panel">
104
+                <div class="searchBar">
105
+                    <input id="searchTxt" class="searchTxt text" type="text" />
106
+                    <select id="searchType" class="searchType">
107
+                        <option value="&lm=-1&st=-1&face=0&s="></option>
108
+                        <option value="&lm=-1&st=-1&face=0&s=3"></option>
109
+                        <option value="&lm=-1&st=-1&face=1&s="></option>
110
+                        <option value="&lm=-1&st=1&face=0&s="></option>
111
+                        <option value="&lm=-1&st=2&face=0&s="></option>
112
+                        <option value="&lm=6&st=-1&face=0&s="></option>
113
+                        <option value="&lm=7&st=-1&face=0&s="></option>
114
+                    </select>
115
+                    <input id="searchReset" type="button"  />
116
+                    <input id="searchBtn" type="button"  />
117
+                </div>
118
+                <div id="searchList" class="searchList"><ul id="searchListUl"></ul></div>
119
+                <div class="pagination">每页显示 <input type="number" id="pageNum" class="text num" value="50"/> 条</div>
120
+            </div>
121
+
122
+        </div>
123
+    </div>
124
+    <script type="text/javascript" src="image.js"></script>
125
+
126
+</body>
127
+</html>

File diff suppressed because it is too large
+ 1130 - 0
static/neditor/dialogs/image/image.js


BIN
static/neditor/dialogs/image/images/alignicon.jpg View File


BIN
static/neditor/dialogs/image/images/bg.png View File


BIN
static/neditor/dialogs/image/images/icons.gif View File


BIN
static/neditor/dialogs/image/images/icons.png View File


BIN
static/neditor/dialogs/image/images/image.png View File


BIN
static/neditor/dialogs/image/images/progress.png View File


+ 0 - 0
static/neditor/dialogs/image/images/success.gif View File


Some files were not shown because too many files changed in this diff