Przeglądaj źródła

增加代码高亮编辑器,一些业务流程界面调整

Chente 10 lat temu
rodzic
commit
05efaff8a6

+ 0 - 6
.idea/vcs.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>

+ 128 - 164
.idea/workspace.xml

@@ -21,84 +21,11 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="add-formver.html" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/add-formver.html">
+      <file leaf-file-name="edit-formpoj.html" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/edit-formpoj.html">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="22">
-              <caret line="16" column="32" selection-start-line="16" selection-start-column="32" selection-end-line="16" selection-end-column="32" />
-              <folding>
-                <element signature="n#style#0;n#div#0;n#div#0;n#div#2;n#div#0;n#div#0;n#div#1;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-                <element signature="n#style#0;n#textarea#0;n#div#0;n#div#0;n#div#2;n#div#0;n#div#0;n#div#1;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="test.js" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/test.js">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="0">
-              <caret line="1" column="66" selection-start-line="1" selection-start-column="66" selection-end-line="1" selection-end-column="66" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="xml.js" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/xml.js">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="22">
-              <caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="index.html" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/htmlmixed/index.html">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="105">
-              <caret line="59" column="24" selection-start-line="59" selection-start-column="15" selection-end-line="59" selection-end-column="24" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="codemirror.css" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/css/codemirror/codemirror.css">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="660">
-              <caret line="30" column="24" selection-start-line="30" selection-start-column="24" selection-end-line="30" selection-end-column="24" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="add-form.html" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/add-form.html">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="831">
-              <caret line="54" column="20" selection-start-line="54" selection-start-column="20" selection-end-line="54" selection-end-column="20" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="edit-formver.html" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/edit-formver.html">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="325">
-              <caret line="42" column="30" selection-start-line="42" selection-start-column="30" selection-end-line="42" selection-end-column="30" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="form-list.html" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/form-list.html">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="484">
-              <caret line="73" column="23" selection-start-line="73" selection-start-column="23" selection-end-line="73" selection-end-column="23" />
+            <state relative-caret-position="289">
+              <caret line="41" column="40" selection-start-line="41" selection-start-column="40" selection-end-line="41" selection-end-column="40" />
               <folding />
             </state>
           </provider>
@@ -115,19 +42,21 @@
   <component name="IdeDocumentHistory">
     <option name="CHANGED_PATHS">
       <list>
-        <option value="$PROJECT_DIR$/edit-form.html" />
         <option value="$PROJECT_DIR$/../ynqdshujuku/censor-pojManage - list2.html" />
         <option value="$PROJECT_DIR$/../ynqdshujuku/report-myPoj - list.html" />
         <option value="$PROJECT_DIR$/../cost/officialPrice.html" />
-        <option value="$PROJECT_DIR$/edit-formcate.html" />
-        <option value="$PROJECT_DIR$/edit-formpoj.html" />
         <option value="$USER_HOME$/Desktop/codepress/codepress.html" />
         <option value="$PROJECT_DIR$/css/codemirror/dracula.css" />
-        <option value="$PROJECT_DIR$/add-form.html" />
-        <option value="$PROJECT_DIR$/form-list.html" />
+        <option value="$PROJECT_DIR$/css/codemirror/material.css" />
         <option value="$PROJECT_DIR$/css/codemirror/codemirror.css" />
         <option value="$PROJECT_DIR$/add-formver.html" />
         <option value="$PROJECT_DIR$/edit-formver.html" />
+        <option value="$PROJECT_DIR$/formver-list.html" />
+        <option value="$PROJECT_DIR$/edit-formcate.html" />
+        <option value="$PROJECT_DIR$/edit-form.html" />
+        <option value="$PROJECT_DIR$/add-form.html" />
+        <option value="$PROJECT_DIR$/form-list.html" />
+        <option value="$PROJECT_DIR$/edit-formpoj.html" />
       </list>
     </option>
   </component>
@@ -168,6 +97,8 @@
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
+      <pane id="Scratches" />
+      <pane id="Scope" />
       <pane id="ProjectPane">
         <subPane>
           <PATH>
@@ -220,12 +151,10 @@
           </PATH>
         </subPane>
       </pane>
-      <pane id="Scope" />
-      <pane id="Scratches" />
     </panes>
   </component>
   <component name="PropertiesComponent">
-    <property name="settings.editor.selected.configurable" value="reference.settingsdialog.IDE.editor.colors" />
+    <property name="settings.editor.selected.configurable" value="vcs.Git" />
     <property name="settings.editor.splitter.proportion" value="0.66111654" />
     <property name="last_opened_file_path" value="$PROJECT_DIR$" />
     <property name="WebServerToolWindowFactoryState" value="false" />
@@ -306,17 +235,24 @@
       <workItem from="1468912371617" duration="2156000" />
       <workItem from="1469590209416" duration="4445000" />
       <workItem from="1469599259465" duration="4506000" />
+      <workItem from="1469669412904" duration="9596000" />
+      <workItem from="1469687849476" duration="4415000" />
+      <workItem from="1469758848273" duration="776000" />
+      <workItem from="1469772985507" duration="961000" />
+      <workItem from="1470033171148" duration="684000" />
+      <workItem from="1470037226564" duration="1099000" />
+      <workItem from="1470362153416" duration="618000" />
     </task>
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="23053000" />
+    <option name="totallyTimeSpent" value="43970000" />
   </component>
   <component name="ToolWindowManager">
     <frame x="1912" y="71" width="1456" height="886" extended-state="6" />
-    <editor active="true" />
+    <editor active="false" />
     <layout>
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.14587738" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.14587738" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32980132" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
@@ -353,11 +289,59 @@
     <watches-manager />
   </component>
   <component name="editorHistoryManager">
+    <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/htmlmixed/index.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="105">
+          <caret line="59" column="24" selection-start-line="59" selection-start-column="15" selection-end-line="59" selection-end-column="24" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/test.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="1" column="66" selection-start-line="1" selection-start-column="66" selection-end-line="1" selection-end-column="66" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/xml.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="22">
+          <caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/add-formver.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="22">
+          <caret line="16" column="32" selection-start-line="16" selection-start-column="32" selection-end-line="16" selection-end-column="32" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/css/codemirror/codemirror.css">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="660">
+          <caret line="30" column="24" selection-start-line="30" selection-start-column="24" selection-end-line="30" selection-end-column="24" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/add-form.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1188">
+          <caret line="54" column="20" selection-start-line="54" selection-start-column="20" selection-end-line="54" selection-end-column="20" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/edit-formver.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-371">
+          <caret line="42" column="30" selection-start-line="42" selection-start-column="30" selection-end-line="42" selection-end-column="30" />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$USER_HOME$/Desktop/codepress/index.html">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -365,10 +349,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding>
-            <element signature="n#style#0;n#div#0;n#div#0;n#div#2;n#div#0;n#div#0;n#div#1;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#textarea#0;n#div#0;n#div#0;n#div#2;n#div#0;n#div#0;n#div#1;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
         </state>
       </provider>
     </entry>
@@ -376,7 +356,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="594">
           <caret line="27" column="0" selection-start-line="27" selection-start-column="0" selection-end-line="36" selection-end-column="13" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -391,7 +370,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -413,7 +391,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="1100">
           <caret line="50" column="44" selection-start-line="50" selection-start-column="44" selection-end-line="50" selection-end-column="44" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -438,18 +415,11 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/edit-form.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1760">
-          <caret line="80" column="12" selection-start-line="80" selection-start-column="12" selection-end-line="80" selection-end-column="12" />
-        </state>
-      </provider>
-    </entry>
+    <entry file="file://$PROJECT_DIR$/edit-form.html" />
     <entry file="file://$PROJECT_DIR$/form-list.html">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="1474">
           <caret line="67" column="26" selection-start-line="67" selection-start-column="26" selection-end-line="67" selection-end-column="26" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -457,7 +427,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="1100">
           <caret line="50" column="44" selection-start-line="50" selection-start-column="44" selection-end-line="50" selection-end-column="44" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -475,18 +444,11 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/edit-form.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1760">
-          <caret line="80" column="12" selection-start-line="80" selection-start-column="12" selection-end-line="80" selection-end-column="12" />
-        </state>
-      </provider>
-    </entry>
+    <entry file="file://$PROJECT_DIR$/edit-form.html" />
     <entry file="file://$PROJECT_DIR$/form-list.html">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="1474">
           <caret line="67" column="26" selection-start-line="67" selection-start-column="26" selection-end-line="67" selection-end-column="26" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -540,20 +502,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/edit-form.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1760">
-          <caret line="80" column="12" selection-start-line="80" selection-start-column="12" selection-end-line="80" selection-end-column="12" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/edit-formcate.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="531">
-          <caret line="126" column="28" selection-start-line="126" selection-start-column="28" selection-end-line="126" selection-end-column="28" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$USER_HOME$/Desktop/codepress/codepress.html">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="421">
@@ -561,18 +509,10 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/edit-formpoj.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1550">
-          <caret line="88" column="46" selection-start-line="88" selection-start-column="46" selection-end-line="88" selection-end-column="46" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/index.html">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="594">
           <caret line="27" column="0" selection-start-line="27" selection-start-column="0" selection-end-line="36" selection-end-column="13" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -580,7 +520,6 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="132">
           <caret line="15" column="6" selection-start-line="15" selection-start-column="6" selection-end-line="15" selection-end-column="13" />
-          <folding />
         </state>
       </provider>
     </entry>
@@ -588,15 +527,13 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/form-list.html">
+    <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/css/gss.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="484">
-          <caret line="73" column="23" selection-start-line="73" selection-start-column="23" selection-end-line="73" selection-end-column="23" />
-          <folding />
+        <state relative-caret-position="0">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
         </state>
       </provider>
     </entry>
@@ -604,7 +541,13 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="105">
           <caret line="59" column="24" selection-start-line="59" selection-start-column="15" selection-end-line="59" selection-end-column="24" />
-          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/xml.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="22">
+          <caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
         </state>
       </provider>
     </entry>
@@ -612,49 +555,70 @@
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="0">
           <caret line="1" column="66" selection-start-line="1" selection-start-column="66" selection-end-line="1" selection-end-column="66" />
-          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$USER_HOME$/Desktop/codemirror/codemirror-5.17.0/mode/xml/xml.js">
+    <entry file="file://$PROJECT_DIR$/css/codemirror/material.css">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="22">
-          <caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="374">
+          <caret line="17" column="32" selection-start-line="17" selection-start-column="32" selection-end-line="17" selection-end-column="32" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/add-formver.html">
+    <entry file="file://$PROJECT_DIR$/css/codemirror/codemirror.css">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="22">
-          <caret line="16" column="32" selection-start-line="16" selection-start-column="32" selection-end-line="16" selection-end-column="32" />
-          <folding>
-            <element signature="n#style#0;n#div#0;n#div#0;n#div#2;n#div#0;n#div#0;n#div#1;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-            <element signature="n#style#0;n#textarea#0;n#div#0;n#div#0;n#div#2;n#div#0;n#div#0;n#div#1;n#div#0;n#div#1;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
+        <state relative-caret-position="110">
+          <caret line="5" column="14" selection-start-line="5" selection-start-column="14" selection-end-line="5" selection-end-column="14" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/css/codemirror/codemirror.css">
+    <entry file="file://$PROJECT_DIR$/edit-formver.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="660">
-          <caret line="30" column="24" selection-start-line="30" selection-start-column="24" selection-end-line="30" selection-end-column="24" />
-          <folding />
+        <state relative-caret-position="347">
+          <caret line="175" column="35" selection-start-line="175" selection-start-column="35" selection-end-line="175" selection-end-column="35" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/formver-list.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="267">
+          <caret line="47" column="38" selection-start-line="47" selection-start-column="38" selection-end-line="47" selection-end-column="38" />
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/add-form.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="831">
-          <caret line="54" column="20" selection-start-line="54" selection-start-column="20" selection-end-line="54" selection-end-column="20" />
-          <folding />
+        <state relative-caret-position="-173">
+          <caret line="51" column="84" selection-start-line="51" selection-start-column="84" selection-end-line="51" selection-end-column="84" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/edit-formver.html">
+    <entry file="file://$PROJECT_DIR$/edit-form.html" />
+    <entry file="file://$PROJECT_DIR$/form-list.html">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="325">
-          <caret line="42" column="30" selection-start-line="42" selection-start-column="30" selection-end-line="42" selection-end-column="30" />
+        <state relative-caret-position="413">
+          <caret line="206" column="80" selection-start-line="206" selection-start-column="80" selection-end-line="206" selection-end-column="80" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/edit-formcate.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="286">
+          <caret line="118" column="99" selection-start-line="118" selection-start-column="80" selection-end-line="118" selection-end-column="99" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/add-formver.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="421">
+          <caret line="90" column="41" selection-start-line="90" selection-start-column="41" selection-end-line="90" selection-end-column="41" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/edit-formpoj.html">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="289">
+          <caret line="41" column="40" selection-start-line="41" selection-start-column="40" selection-end-line="41" selection-end-column="40" />
           <folding />
         </state>
       </provider>

+ 2 - 2
add-form.html

@@ -58,7 +58,7 @@
                 <div class="row">
                   <div class="col-xs-5">
                     <a href="form-list.html" class="btn btn-default">返回</a>
-                    <a href="form-list.html" class="btn btn-info">确认添加</a>
+                    <a href="formver-list.html" class="btn btn-info">确认添加</a>
                   </div>
                 </div>
               </div>
@@ -92,7 +92,7 @@
                 <div class="row">
                   <div class="col-xs-5">
                     <a href="form-list.html" class="btn btn-default">返回</a>
-                    <a href="form-list.html" class="btn btn-info">确认添加</a>
+                    <a href="formver-list.html" class="btn btn-info">确认添加</a>
                   </div>
                 </div>
               </div>

+ 115 - 135
add-formver.html

@@ -15,7 +15,7 @@
   <script src="js/codemirror/codemirror.js"></script>
   <link rel="stylesheet" href="css/codemirror/codemirror.css">
   <script src="js/codemirror/xml.js"></script>
-  <link rel="stylesheet" href="css/codemirror/dracula.css">
+  <link rel="stylesheet" href="css/codemirror/material.css">
 </head>
 <body>
   <div class="side-nav">
@@ -35,148 +35,60 @@
         <div class="col-md-12">
           <div class="tc-section">
               <div class="form-group">
-                <label>版本时间</label>
+                <label>版本</label>
                 <div class="row">
                   <div class="col-xs-5">
                     <input type="text" class="form-control input-sm" value="2016-07-21" disabled>
                   </div>
                 </div>
               </div>
-            <div class="form-group">
-              <label>版本信息</label>
-              <div class="row">
-                <div class="col-xs-5">
-                  <textarea class="form-control"></textarea>
-                </div>
+              <div class="form-group">
+                  <label>版本内容</label>
+                  <div class="row">
+                      <div class="col-xs-5">
+                          <textarea class="form-control"></textarea>
+                      </div>
+                  </div>
+              </div>
+              <div class="form-group">
+                  <label>报表信息</label>
+                  <div class="row">
+                      <div class="col-xs-8">
+                          <table class="table table-bordered">
+                              <tr><th width="100">报表类型</th><td>通用报表</td><th width="100">报表分类</th><td>6.结算表 / 子分类</td></tr>
+                              <tr><th>定制项目</th><td colspan="3"></td></tr>
+                              <tr><th>报表名称</th><td>【结算】封面3</td><th>报表ID</th><td>4</td></tr>
+                          </table>
+                      </div>
+                  </div>
               </div>
-            </div>
-            <div class="form-group">
-              <label>报表代码</label>
-              <div class="row">
-                <div class="col-xs-12" style="font-size:14px">
+              <div class="form-group">
+                  <label><报表>代码&nbsp;<a data-toggle="modal" href="#code-help"><i class="glyphicon glyphicon-info-sign" data-toggle="tooltip" data-placement="right" data-original-title="<报表>怎么填"></i></a></label>
+                  <div class="row">
+                      <div class="col-xs-12" style="font-size:14px">
                   <textarea  id="editor" name="editor" style="height:1000px">
 <?xml version="1.0" encoding="gb2312" ?>
-<报表 名称="【09】材料暂估价清单计价表" 主版本="招投标版" 调价前="是" 分类="7" 编号格式="标准编号" 分类名称="重庆(2016)">
-  <主表信息
-          版本信息="[0][8]"
-          名称="【09】材料暂估价清单计价表"
-          页面信息="[A4][纵]"
-          单位="CM"
-          页边距="[1.0][1.0][1.0][1.0]"
-          显示调整参数="[分栏数量^1][缩放比例^1][空行提上^F][空行显示^T]"
-          临时目录="D:\TEMP"
-          数据库信息="[驱动^4][ADO^Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\PrintCom_Demo\AccessDB\项目文件.mdb;Persist Security Info=True]"
-  ></主表信息>
-  <查询语句>
-    <流水查询对象 SQL语句="SELECT B1.ChapterID, B1.FullCode, B1.Name, B1.TotalPrice,
-                           B1.SerialNo, B1.Units,B1.Quantity,B1.UnitPrice,''
-                           FROM Bills AS B1
-                           WHERE (B1.InterimType=1) AND (B1.IsSpecialInterim=true) and (B1.isleaf=true)
-                           ORDER BY B1.SerialNO">
-      <指标对象 内容="[名称^清单编号][ID^1][数据类型^3]"></指标对象>
-      <指标对象 内容="[名称^细目号][ID^2][数据类型^8]"></指标对象>
-      <指标对象 内容="[名称^@名称][ID^3][数据类型^8]"></指标对象>
-      <指标对象 内容="[名称^估计金额][ID^4][数据类型^5]"></指标对象>
-      <指标对象 内容="[名称^序号][ID^5][数据类型^3]"></指标对象>
-      <指标对象 内容="[名称^单位][ID^6][数据类型^8]"></指标对象>
-      <指标对象 内容="[名称^数量][ID^7][数据类型^8]"></指标对象>
-      <指标对象 内容="[名称^单价][ID^8][数据类型^5]"></指标对象>
-      <指标对象 内容="[名称^备注][ID^9][数据类型^8]"></指标对象>
-   </流水查询对象>
-  </查询语句>
-  <表题信息 高度="1.2" 层数="2">
-     <标题 内容="[名称^材料暂估价清单计价表][ID^1][内容^材料暂估价清单计价表][字体^黑体|32|0|400|0|0|0|0][对齐^中][上下层^2|1][左右位置^0|100]"></标题>
-  </表题信息>
-  <表头信息 高度="1.2" 层数="2">
-	<表头信息 内容="[名称^单位工程名称][ID^1][前缀^项目名称: ][默认值^][字体^宋体|16|0|400|0|0|0|0.00][指标ID^1001][参数ID^-1][对齐^左][上下层^1.00|1.00][左右位置^0.00|70.00]"/>
-	<表头信息 内容="[名称^单位工程名称][ID^2][前缀^合 同 段: ][默认值^][字体^宋体|16|0|400|0|0|0|0.00][指标ID^1002][参数ID^-1][对齐^左][上下层^1.00|1.00][左右位置^70|100.00]"/>
-	<表头信息 内容="[名称^单位工程名称][ID^2][前缀^合 同 段: ][默认值^][字体^宋体|16|0|400|0|0|0|0.00][指标ID^1002][参数ID^-1][对齐^左][上下层^1.00|1.00][左右位置^70|100.00]"/>
-  </表头信息>
-  <表尾信息 高度="0.60" 层数="1">
-	<表尾信息 内容="[名称^单位工程名称][ID^1][前缀^编制: ][默认值^][字体^宋体|16|0|400|0|0|0|0.00][指标ID^1006][参数ID^-1][对齐^左][上下层^1.00|1.00][左右位置^10.00|25.00]"/>
-	<表尾信息 内容="[名称^单位工程名称][ID^2][前缀^复核: ][默认值^][字体^宋体|16|0|400|0|0|0|0.00][指标ID^1008][参数ID^-1][对齐^左][上下层^1.00|1.00][左右位置^40.00|65.00]"/>
-	<表尾信息 内容="[名称^单位工程名称][ID^3][前缀^编制日期: ][默认值^][字体^宋体|16|0|400|0|0|0|0.00][指标ID^-1][参数ID^-1][对齐^左][上下层^1.00|1.00][左右位置^70.00|100.00]"/>
-  </表尾信息>
-  <栏头信息 高度="1.0" 层数="1">
-     <栏头 内容="[ID^1][名称^序号][内容^序号][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^0|10][边框^0,0,0|1,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-     <栏头 内容="[ID^2][名称^名称][内容^名称][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^10|40][边框^1,0,0|1,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-     <栏头 内容="[ID^3][名称^单位][内容^单位][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^40|50][边框^1,0,0|1,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-     <栏头 内容="[ID^4][名称^数量][内容^数量][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^50|60][边框^1,0,0|0,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-     <栏头 内容="[ID^5][名称^单价][内容^单价][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^60|70][边框^1,0,0|0,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-     <栏头 内容="[ID^6][名称^合价][内容^合价][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^70|80][边框^1,0,0|0,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-     <栏头 内容="[ID^7][名称^备注][内容^备注][字体^Arial|14|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^80|100][边框^1,0,0|0,0,0|0,0,0|1,0,0][分栏^F]"></栏头>
-  </栏头信息>
-  <流水显示对象信息 层高="0.8">
-     <显示对象 内容="[名称^][指标ID^201][字体^Arial|12|0|400|0|0|0|0][对齐^中下][合并^F][上下层^0|100][表栏ID^1][边框^0,0,0|1,0,0|1,0,0|1,0,0][缩放^T][显示0^F][精度^0][前缀^]"></显示对象>
-     <显示对象 内容="[名称^][指标ID^3][字体^Arial|12|0|400|0|0|0|0][对齐^左下][合并^F][上下层^0|100][表栏ID^2][边框^1,0,0|1,0,0|1,0,0|1,0,0][缩放^T][显示0^F][精度^0][前缀^]"></显示对象>
-     <显示对象 内容="[名称^][指标ID^6][字体^Arial|12|0|400|0|0|0|0][对齐^中下][合并^F][上下层^0|100][表栏ID^3][边框^1,0,0|1,0,0|1,0,0|1,0,0][缩放^T][显示0^T][精度^0][前缀^]"></显示对象>
-     <显示对象 内容="[名称^][指标ID^7][字体^Arial|12|0|400|0|0|0|0][对齐^右下][合并^F][上下层^0|100][表栏ID^4][边框^1,0,0|0,0,0|1,0,0|1,0,0][缩放^T][显示0^T][精度^3][前缀^]"></显示对象>
-     <显示对象 内容="[名称^][指标ID^8][字体^Arial|12|0|400|0|0|0|0][对齐^右下][合并^F][上下层^0|100][表栏ID^5][边框^1,0,0|0,0,0|1,0,0|1,0,0][缩放^T][显示0^T][精度^2][前缀^]"></显示对象>
-     <显示对象 内容="[名称^][指标ID^4][字体^Arial|12|0|400|0|0|0|0][对齐^右下][合并^F][上下层^0|100][表栏ID^6][边框^1,0,0|0,0,0|1,0,0|1,0,0][缩放^T][显示0^T][精度^0][前缀^]"></显示对象>
-     <显示对象 内容="[名称^][指标ID^9][字体^Arial|12|0|400|0|0|0|0][对齐^左下][合并^F][上下层^0|100][表栏ID^7][边框^1,0,0|0,0,0|1,0,0|1,0,0][缩放^T][显示0^T][精度^0][前缀^]"></显示对象>
-  </流水显示对象信息>
-  <页码信息>
-	<页码 内容="[名称^当前页码][ID^1][所属区域^表头|F|70,90.00,2.00,1.00][类型^1][字体^宋体|12|0|400|0|0|0|0.00][对齐^中][前缀^第][后缀^页][启始页码^0][显示^T]"></页码>
-	<页码 内容="[名称^总页码数][ID^2][所属区域^表头|F|90.00,100.00,2.00,1.00][类型^0][字体^宋体|12|0|400|0|0|0|0.00][对齐^左][前缀^共][后缀^页][启始页码^0][显示^T]"></页码>
-  </页码信息>
-  <合计信息 高度="0.8" 层数="1">
-     <合计 内容="[名称^材料暂估价小计(计入&quot;暂估价汇总表&quot;)][ID^1][指标ID^-1][类型^1][字体^Arial|12|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^0|70][边框^0,0,0|0.3,0,0|0,0,0|0.3,0,0][缩放^T][显示0^F][精度^0][后缀^]"></合计>
-     <合计 内容="[名称^][ID^1][指标ID^4][类型^1][字体^Arial|12|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^70|80][边框^0,0,0|0.3,0,0|0,0,0|0.3,0,0][缩放^T][显示0^F][精度^0][后缀^]"></合计>
-     <合计 内容="[名称^][ID^1][指标ID^-1][类型^1][字体^Arial|12|0|400|0|0|0|0][对齐^中][上下层^1|1][左右位置^80|100][边框^0,0,0|0,0,0|0,0,0|0.3,0,0][缩放^T][显示0^F][精度^0][后缀^]"></合计>
-  </合计信息>
-  <图形信息>
-     <图形对象 内容="[名称^线1][ID^1][所属区域^流水|T|0,0,0,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-     <图形对象 内容="[名称^线2][ID^2][所属区域^流水|T|100,100,0,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-
-     <图形对象 内容="[名称^线3][ID^3][所属区域^栏头|T|0,0,0,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-     <图形对象 内容="[名称^线4][ID^4][所属区域^栏头|T|100,100,0,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-     <图形对象 内容="[名称^线3][ID^3][所属区域^栏头|T|0,100,0,0][类型^1][画笔^1|0|0][图形^]"></图形对象>
+<报表 报表ID="4" 版本="2016-07-21" 名称="【结算】封面3"  分类="1"  分类名称="6.结算表"  ></textarea>
+                      </div>
+                  </div>
+              </div>
+              <div class="form-group">
+                  <label>其他代码</label>
+                  <div class="row">
+                      <div class="col-xs-12" style="font-size:14px">
+                  <textarea  id="editor2" name="editor2" style="height:1000px">
 
-     <图形对象 内容="[名称^线3][ID^3][所属区域^合计|T|0,0,0,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-     <图形对象 内容="[名称^线4][ID^4][所属区域^合计|T|100,100,0,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-     <图形对象 内容="[名称^线4][ID^4][所属区域^合计|T|0,100,100,100][类型^1][画笔^1|0|0][图形^]"></图形对象>
-  </图形信息>
-  <参数图形信息>
-  </参数图形信息>
-  <独立参数信息>
-     <参数对象 内容="[名称^@C][ID^12][条件类型^0][数据类型^8][默认值^]"></参数对象>
-     <参数对象 内容="[名称^@D][ID^13][条件类型^0][数据类型^8][默认值^]"></参数对象>
-     <参数对象 内容="[名称^@A][ID^1018][条件类型^0][数据类型^8][默认值^2000-01-01]"></参数对象>
-     <参数对象 内容="[名称^@表编号][ID^1017][条件类型^0][数据类型^8][默认值^标表1-1]"></参数对象>
-     <参数对象 内容="[名称^@表头表尾SQL][ID^1000][条件类型^0][数据类型^8][默认值^SELECT BuildProjectName,ProjectLocation,BuildUnit,Author,AuthorCertificate,Auditor,AuditorCertificate,BudgetProjectName,EditRange,EditDate,Bidder FROM ProjData ]"></参数对象>
-     <参数对象 内容="[名称^][ID^3001][条件类型^0][数据类型^8][默认值^1]"></参数对象>
-  </独立参数信息>
-  <独立字段信息>
-     <指标对象 内容="[名称^@BF][ID^201][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@建设项目名称][ID^1001][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@单位工程名称][ID^1002][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@工程地点][ID^1003][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@建设单位][ID^1004][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@投标人][ID^1005][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@编制][ID^1006][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@编制人证号][ID^1007][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@复核][ID^1008][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@复核人证号][ID^1009][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@编制范围][ID^1010][数据类型^8]"></指标对象>
-     <指标对象 内容="[名称^@编制时间(年月日)][ID^1011][数据类型^10]"></指标对象>
-  </独立字段信息>
-  <计算式信息>
-     <计算式 内容="[名称^取序号][ID^8][表达式^SetSerialno(@BF,@名称,0,@C,@D,1)]"></计算式>
-     <计算式 内容="[名称^取当前时间][ID^1][表达式^@A:=Now(0)]"></计算式>
-     <计算式 内容="[名称^取序号][ID^17][表达式^ExtractInteger(f(1),f(6))]"></计算式>
-     <计算式 内容="[名称^表头尾SQL][ID^1000][表达式^SQL(4,10,f(1),0,P(1000),0,11,F(1001),F(1003),F(1004),F(1006),F(1007),F(1008),F(1009),F(1002),F(1010),F(1011),F(1005))]"></计算式>
-  </计算式信息>
-</报表>
-                  </textarea>
-                </div>
+</报表></textarea>
+                      </div>
+                  </div>
               </div>
-            </div>
               <div class="form-group ">
                 <label></label>
                 <div class="row">
                   <div class="col-xs-12">
-                    <a href="form-list.html" class="btn btn-default">返回</a>
-                    <a href="form-list.html" class="btn btn-info">确认添加</a>
+                      <a href="formver-list.html" class="btn btn-default">返回</a>
+                      <a href="" class="btn btn-default">保存草稿</a>
+                    <a href="formver-list.html" class="btn btn-info">添加并发布</a>
                   </div>
                 </div>
               </div>
@@ -186,12 +98,80 @@
     </div>
   </div>
 <script>
-  var myTextarea = document.getElementById('editor');
-  var myCodeMirror = CodeMirror.fromTextArea(myTextarea, {
-    mode: "text/html",
-    lineNumbers: true,
-    theme:"dracula"
-  });
-  editor.setSize('auto', 'auto');
+
+    var editor = CodeMirror.fromTextArea(document.getElementById("editor"), {
+        mode: "text/html",
+        lineNumbers: true,
+        theme:"material"
+    });
+    editor.setSize('auto','auto');
+    var editor = CodeMirror.fromTextArea(document.getElementById("editor2"), {
+        mode: "text/html",
+        lineNumbers: true,
+        theme:"material"
+    });
+    editor.setSize('auto','500px');
 </script>
+  <!--编辑类别-->
+  <div class="modal fade " tabindex="-1" role="dialog" aria-hidden="true" id="code-help">
+      <div class="modal-dialog ">
+          <div class="modal-content">
+              <div class="modal-header">
+                  <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
+                  <h4 class="modal-title" ><报表>怎么填</h4>
+              </div>
+              <div class="modal-body">
+                  <p><报表>由系统自动生成,但你还是需要按实际需求补充其它信息。带<b class="text-danger">*</b>为系统默认生成,请慎重修改。</p>
+                  <table class="table table-bordered">
+                      <thead>
+                      <tr><th width="100">选项</th><th>参数</th></tr>
+                      </thead>
+                      <tr>
+                          <td>报表ID&nbsp;<b class="text-danger">*</b></td><td>该ID与系统中ID必须保持一致。</td>
+                      </tr>
+                      <tr>
+                          <td>版本&nbsp;<b class="text-danger">*</b></td><td>报表的版本代号(默认为创建时间)。与系统中的"版本"必须保持一致</td>
+                      </tr>
+                      <tr>
+                          <td>名称&nbsp;<b class="text-danger">*</b></td><td>在软件中显示的报表名称,建议与系统保持一致。</td>
+                      </tr>
+                      <tr>
+                          <td>分类名称&nbsp;<b class="text-danger">*</b></td><td>在软件中显示的分类名称,建议与系统保持一致。</td>
+                      </tr>
+                      <tr>
+                          <td>分类</td><td>在软件中用于分类排序,越小越靠前。<br>例:<code>分类="1"</code></td>
+                      </tr>
+                      <tr>
+                          <td>子分类名称&nbsp;<b class="text-danger">*</b></td><td>在软件中显示的分类名称,建议与系统保持一致。</td>
+                      </tr>
+                      <tr>
+                          <td>子分类</td><td>在软件中,在分类下用于子分类排序,越小越靠前。<br>例:<code>子分类="2"</code></td>
+                      </tr>
+                      <tr>
+                          <td>多表筛选</td><td></td>
+                      </tr>
+                      <tr>
+                          <td>数据准备</td><td>查询清单汇总窗口所有数据。<br>启用:<code>数据准备="1"</code></td>
+                      </tr>
+                      <tr>
+                          <td>含附件</td><td></td>
+                      </tr>
+                      <tr>
+                          <td>交互类型</td><td></td>
+                      </tr>
+                      <tr>
+                          <td>交互子类型</td><td></td>
+                      </tr>
+                      <tr>
+                          <td>自主格式</td><td></td>
+                      </tr>
+                      <tr>
+                          <td>数据库</td><td>查询多项目汇总数据,无需内存表。<br>启用:<code>数据库="1"</code></td>
+                      </tr>
+                  </table>
+              </div>
+          </div>
+      </div>
+  </div>
+  <!--编辑类别-->
 </body>

+ 1 - 1
css/codemirror/codemirror.css

@@ -3,7 +3,7 @@
 .CodeMirror {
   /* Set height, width, borders, and global font properties here */
   font-family: monospace;
-  height:500px;
+  height:300px;
   color: black;
 }
 

+ 54 - 0
css/codemirror/material.css

@@ -0,0 +1,54 @@
+/*
+
+    Name:       material
+    Author:     Michael Kaminsky (http://github.com/mkaminsky11)
+
+    Original material color scheme by Mattia Astorino (https://github.com/equinusocio/material-theme)
+
+*/
+
+.cm-s-material {
+  background-color: #263238;
+  color: rgba(233, 237, 237, 1);
+}
+.cm-s-material .CodeMirror-gutters {
+  background: #263238;
+  color: rgb(83,127,126);
+  border: none;
+  border-right:1px solid #334047
+}
+.cm-s-material .CodeMirror-guttermarker, .cm-s-material .CodeMirror-guttermarker-subtle, .cm-s-material .CodeMirror-linenumber { color: rgb(83,127,126); }
+.cm-s-material .CodeMirror-cursor { border-left: 1px solid #f8f8f0; }
+.cm-s-material div.CodeMirror-selected { background: rgba(255, 255, 255, 0.15); }
+.cm-s-material.CodeMirror-focused div.CodeMirror-selected { background: rgba(255, 255, 255, 0.10); }
+.cm-s-material .CodeMirror-line::selection, .cm-s-material .CodeMirror-line > span::selection, .cm-s-material .CodeMirror-line > span > span::selection { background: rgba(255, 255, 255, 0.10); }
+.cm-s-material .CodeMirror-line::-moz-selection, .cm-s-material .CodeMirror-line > span::-moz-selection, .cm-s-material .CodeMirror-line > span > span::-moz-selection { background: rgba(255, 255, 255, 0.10); }
+
+.cm-s-material .CodeMirror-activeline-background { background: rgba(0, 0, 0, 0); }
+.cm-s-material .cm-keyword { color: rgba(199, 146, 234, 1); }
+.cm-s-material .cm-operator { color: rgba(233, 237, 237, 1); }
+.cm-s-material .cm-variable-2 { color: #80CBC4; }
+.cm-s-material .cm-variable-3 { color: #82B1FF; }
+.cm-s-material .cm-builtin { color: #DECB6B; }
+.cm-s-material .cm-atom { color: #F77669; }
+.cm-s-material .cm-number { color: #F77669; }
+.cm-s-material .cm-def { color: rgba(233, 237, 237, 1); }
+.cm-s-material .cm-string { color: #C3E88D; }
+.cm-s-material .cm-string-2 { color: #80CBC4; }
+.cm-s-material .cm-comment { color: #546E7A; }
+.cm-s-material .cm-variable { color: #82B1FF; }
+.cm-s-material .cm-tag { color: #80CBC4; }
+.cm-s-material .cm-meta { color: #80CBC4; }
+.cm-s-material .cm-attribute { color: #FFCB6B; }
+.cm-s-material .cm-property { color: #80CBAE; }
+.cm-s-material .cm-qualifier { color: #DECB6B; }
+.cm-s-material .cm-variable-3 { color: #DECB6B; }
+.cm-s-material .cm-tag { color: rgba(255, 83, 112, 1); }
+.cm-s-material .cm-error {
+  color: rgba(255, 255, 255, 1.0);
+  background-color: #EC5F67;
+}
+.cm-s-material .CodeMirror-matchingbracket {
+  text-decoration: underline;
+  color: white !important;
+}

+ 0 - 84
edit-form.html

@@ -1,84 +0,0 @@
-<!DOCTYPE html>
-<html lang=zh-cn> 
-<head>
-  <meta charset=utf-8> 
-  <title>VC</title> 
-  <meta name=description content="VC">   
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="renderer" content="webkit">
-  <meta name=copyright content=smartcost.com.cn> 
-  <link rel=stylesheet href=css/bootstrap.css> 
-  <link rel=stylesheet href=css/style.css> 
-  <script src=js/jquery-1.9.1.min.js></script> 
-  <script src=js/bootstrap.js></script> 
-  <script src=js/global.js></script> 
-</head>
-<body>
-  <div class="side-nav">
-    <h1>VC</h1>
-    <ul>
-      <li data-toggle="tooltip" data-placement="right" title="客户机列表"><a href="server-list.html"><i class="glyphicon glyphicon-list"></i></a></li>
-      <li data-toggle="tooltip" data-placement="right" title="报表库"><a href="form-list.html" class="active"><i class="glyphicon glyphicon-list-alt"></i></a></li>
-      <li data-toggle="tooltip" data-placement="right" title="退出登录"><a href="login.html"><i class="glyphicon glyphicon-off"></i></a></li>
-    </ul>
-  </div>
-  <div class="warp-content">
-    <div class="container">
-      <div class="page-header">
-        <h2 id="basis-info">编辑报表信息</h2>
-      </div>
-      <!--通用报表信息-->
-      <div class="form-group ">
-        <label>报表类别</label>
-        <div class="row">
-          <div class="col-xs-3"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
-          <div class="col-xs-3"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
-          <div class="col-xs-3"><a href="edit-formcate.html" class="btn btn-link" target="_blank">类别管理</a></div>
-        </div>
-      </div>
-      <div class="form-group">
-        <label>报表名</label>
-        <div class="row">
-          <div class="col-xs-5">
-            <input type="text" class="form-control input-sm" placeholder="">
-          </div>
-        </div>
-      </div>
-      <!--通用报表信息-->
-      <!--定制报表信息-->
-      <div class="form-group ">
-        <label>所在项目</label>
-        <div class="row">
-          <div class="col-xs-4"><select class="form-control input-sm"><option>选择类别</option><option>佛青从</option></select></div>
-          <div class="col-xs-3"><a href="edit-formpoj.html" class="btn btn-link" target="_blank">项目管理</a></div>
-        </div>
-      </div>      
-      <div class="form-group ">
-        <label>报表类别</label>
-        <div class="row">
-          <div class="col-xs-3"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
-          <div class="col-xs-3"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
-          <div class="col-xs-3"><a href="edit-formcate.html" class="btn btn-link" target="_blank">类别管理</a></div>
-        </div>
-      </div>
-      <div class="form-group">
-        <label>报表名</label>
-        <div class="row">
-          <div class="col-xs-5">
-            <input type="text" class="form-control input-sm" placeholder="">
-          </div>
-        </div>
-      </div>
-      <!--定制报表信息-->
-      <div class="form-group ">
-        <label></label>
-        <div class="row">
-          <div class="col-xs-5">
-            <a href="form-list.html" class="btn btn-default">返回</a>
-            <a href="form-list.html" class="btn btn-info">确认修改</a>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-</body>

+ 18 - 18
edit-formcate.html

@@ -52,14 +52,14 @@
                 <table class="table table-hover">
                     <thead><tr><th>类别名称</th><th>父级类别</th><th width="70">报表</th><th width="110">操作</th></tr></thead>
                     <tbody>
-                    <tr><td>类别1</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别2</td><td></td><td>2</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别3</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别4</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别5</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别6</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别7</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别8</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别1</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别2</td><td></td><td>2</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别3</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别4</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别5</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别6</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别7</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别8</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
                     </tbody>
                 </table>
                 <nav>
@@ -116,14 +116,14 @@
                 <table class="table table-hover">
                     <thead><tr><th>类别名称</th><th>父级类别</th><th width="70">报表</th><th width="110">操作</th></tr></thead>
                     <tbody>
-                    <tr><td>类别1</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别2</td><td></td><td>2</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别3</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别4</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别5</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别6</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别7</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>类别8</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别1</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别2</td><td></td><td>2</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别3</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别4</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别5</td><td>类别3</td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别6</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别7</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>类别8</td><td></td><td>0</td><td><a href="#edit-cate" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-cate" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
                     </tbody>
                 </table>
                 <nav>
@@ -192,7 +192,7 @@
       </div>
   </div>
   <!--编辑类别-->
-  <!--编辑类别-->
+  <!--删除类别-->
   <div class="modal fade " tabindex="-1" role="dialog" aria-hidden="true" id="del-cate">
       <div class="modal-dialog ">
           <div class="modal-content">
@@ -211,5 +211,5 @@
           </div>
       </div>
   </div>
-  <!--编辑类别-->
+  <!--删除类别-->
 </body>

+ 8 - 8
edit-formpoj.html

@@ -41,14 +41,14 @@
                 <table class="table table-hover">
                     <thead><tr><th>项目名称</th><th width="70">类别</th><th width="70">报表</th><th width="110">操作</th></tr></thead>
                     <tbody>
-                    <tr><td>项目1</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目2</td><td>2</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目3</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目4</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目5</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目6</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目7</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
-                    <tr><td>项目8</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-info btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目1</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目2</td><td>2</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目3</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目4</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目5</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目6</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目7</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
+                    <tr><td>项目8</td><td>0</td><td>0</td><td><a href="#edit-poj" data-toggle="modal" class="btn btn-xs">编辑</a>&nbsp;<a href="#del-poj" data-toggle="modal"  class="btn btn-xs text-danger">删除</a></td></tr>
                     </tbody>
                 </table>
                 <nav>

Plik diff jest za duży
+ 173 - 56
edit-formver.html


+ 70 - 10
form-list.html

@@ -59,22 +59,22 @@
             <td>6.结算表</td>
             <td>【结算】封面</td>
             <td>2016-04-03</td>
-            <td><a href="edit-formver.html">23</a></td>
-            <td><a href="edit-form.html">编辑(点我)</a>&nbsp;<a href="#delform"  data-toggle="modal" class="text-danger">删除(点我)</a></td>
+            <td><a href="formver-list.html">23</a></td>
+            <td><a href="#edit-form" class="btn btn-xs" data-toggle="modal">编辑(点我)</a><a class="btn btn-xs text-danger" href="#delform"  data-toggle="modal">删除(点我)</a></td>
           </tr>
           <tr>
             <td>6.结算表</td>
             <td>【结算】封面2</td>
             <td>2016-04-03</td>
-            <td><a href="edit-formver.html">23</a></td>
-            <td><a href="#">编辑</a>&nbsp;<a href="" class="text-danger">删除</a></td>
+            <td><a href="formver-list.html">23</a></td>
+            <td><a class="btn btn-xs" href="#">编辑</a><a class="btn btn-xs text-danger">删除</a></td>
           </tr>
           <tr>
             <td>6.结算表</td>
             <td>【结算】封面3</td>
             <td>2016-04-03</td>
-            <td><a href="edit-formver.html">0</a></td>
-            <td><a href="#">编辑</a>&nbsp;<a href="" class="text-danger">删除</a></td>
+            <td><a href="formver-list.html">0</a></td>
+            <td><a class="btn btn-xs" href="#">编辑</a><a class="btn btn-xs text-danger" href="">删除</a></td>
           </tr>
         </tobdy>
       </table>
@@ -109,16 +109,16 @@
             <td>类别</td>
             <td>【结算】封面</td>
             <td>2016-04-05</td>
-            <td><a href="edit-formver.html">23</a></td>
-            <td><a href="#">编辑</a>&nbsp;<a href="" class="text-danger">删除</a></td>
+            <td><a href="formver-list.html">23</a></td>
+            <td><a class="btn btn-xs" href="#">编辑</a><a class="btn btn-xs text-danger" href="">删除</a></td>
           </tr>
           <tr>
             <td>佛青从</td>
             <td>类别</td>
             <td>【结算】表名</td>
             <td>2016-04-05</td>
-            <td><a href="edit-formver.html">23</a></td>
-            <td><a href="#">编辑</a>&nbsp;<a href="" class="text-danger">删除</a></td>
+            <td><a href="formver-list.html">23</a></td>
+            <td><a class="btn btn-xs" href="#">编辑</a><a class="btn btn-xs text-danger" href="">删除</a></td>
           </tr>
         </tobdy>
       </table>
@@ -182,4 +182,64 @@
     </div>
   </div>
   <!--弹框-结束-->
+  <!--编辑报表-->
+  <div class="modal fade " tabindex="-1" role="dialog" aria-hidden="true" id="edit-form">
+    <div class="modal-dialog ">
+      <div class="modal-content">
+        <div class="modal-header">
+          <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
+          <h4 class="modal-title" >编辑报表</h4>
+        </div>
+        <div class="modal-body">
+          <!--通用报表信息-->
+          <div class="form-group ">
+            <label>报表类别</label>
+            <div class="row">
+              <div class="col-xs-4"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
+              <div class="col-xs-4"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
+              <div class="col-xs-2"><a href="edit-formcate.html" class="btn btn-link" target="_blank">类别管理</a></div>
+            </div>
+          </div>
+          <div class="form-group">
+            <label>报表名</label>
+            <div class="row">
+              <div class="col-xs-6">
+                <input type="text" class="form-control input-sm" placeholder="">
+              </div>
+            </div>
+          </div>
+          <!--通用报表信息-->
+          <!--定制报表信息-->
+          <div class="form-group ">
+            <label>所在项目</label>
+            <div class="row">
+              <div class="col-xs-6"><select class="form-control input-sm"><option>选择类别</option><option>佛青从</option></select></div>
+              <div class="col-xs-3"><a href="edit-formpoj.html" class="btn btn-link" target="_blank">项目管理</a></div>
+            </div>
+          </div>
+          <div class="form-group ">
+            <label>报表类别</label>
+            <div class="row">
+              <div class="col-xs-4"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
+              <div class="col-xs-4"><select class="form-control input-sm"><option>选择类别</option><option>6.结算表</option></select></div>
+              <div class="col-xs-2"><a href="edit-formcate.html" class="btn btn-link" target="_blank">类别管理</a></div>
+            </div>
+          </div>
+          <div class="form-group">
+            <label>报表名</label>
+            <div class="row">
+              <div class="col-xs-6">
+                <input type="text" class="form-control input-sm" placeholder="">
+              </div>
+            </div>
+          </div>
+          <!--定制报表信息-->
+        </div>
+        <div class="modal-footer">
+          <a type="button" class="btn btn-info" href="#">保存</a>
+        </div>
+      </div>
+    </div>
+  </div>
+  <!--编辑报表-->
 </body>

+ 82 - 0
formver-list.html

@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang=zh-cn> 
+<head>
+  <meta charset=utf-8> 
+  <title>VC</title> 
+  <meta name=description content="VC">   
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="renderer" content="webkit">
+  <meta name=copyright content=smartcost.com.cn> 
+  <link rel=stylesheet href=css/bootstrap.css> 
+  <link rel=stylesheet href=css/style.css> 
+  <script src=js/jquery-1.9.1.min.js></script> 
+  <script src=js/bootstrap.js></script> 
+  <script src=js/global.js></script> 
+</head>
+<body>
+  <div class="side-nav">
+    <h1>VC</h1>
+    <ul>
+      <li data-toggle="tooltip" data-placement="right" title="客户机列表"><a href="server-list.html"><i class="glyphicon glyphicon-list"></i></a></li>
+      <li data-toggle="tooltip" data-placement="right" title="报表库"><a href="form-list.html" class="active"><i class="glyphicon glyphicon-list-alt"></i></a></li>
+      <li data-toggle="tooltip" data-placement="right" title="退出登录"><a href="login.html"><i class="glyphicon glyphicon-off"></i></a></li>
+    </ul>
+  </div>
+  <div class="warp-content">
+    <div class="container">
+      <div class="page-header">
+        <a href="add-formver.html" class="btn btn-info pull-right">添加新版本</a>
+        <h2 id="basis-info">报表历史版本</h2>
+      </div>
+      <table class="table table-hover">
+        <thead>
+          <tr>
+            <th>版本时间</th>
+            <th>版本内容</th>
+            <th>操作</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>2016-04-03(草稿)</td>
+            <td>内容文本</td>
+            <td><a class="btn btn-xs" href="edit-formver.html">编辑</a>&nbsp;<a href="#delver" class="btn btn-xs text-danger"  data-toggle="modal">删除(点我)</a></td>
+          </tr>
+          <tr>
+            <td>2016-03-15</td>
+            <td>内容文本</td>
+            <td><a class="btn btn-xs" href="edit-formver.html">编辑</a>&nbsp;<a href="#" class="btn btn-xs text-danger">删除</a></td>
+          </tr>
+          <tr>
+            <td>2016-03-15</td>
+            <td>内容文本</td>
+            <td><a class="btn btn-xs" href="edit-formver.html">编辑</a>&nbsp;<a href="#" class="btn btn-xs text-danger">删除</a></td>
+          </tr>
+          <tr>
+            <td>2016-03-15</td>
+            <td>内容文本</td>
+            <td><a class="btn btn-xs" href="edit-formver.html">编辑</a>&nbsp;<a href="#" class="btn btn-xs text-danger">删除</a></td>
+          </tr>
+        </tobdy>
+      </table>
+    </div>
+  </div>
+<!--弹框-删除版本-->
+<div class="modal fade " tabindex="-1" role="dialog" aria-hidden="true" id="delver">
+  <div class="modal-dialog ">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
+        <h4 class="modal-title" >删除版本</h4>
+      </div>
+      <div class="modal-body">
+        <h3 class="text-center">是否删除版本 <b>2016-04-03</b> ?</h3>
+      </div>
+      <div class="modal-footer">
+        <a type="button" class="btn btn-danger" href="#">确认删除</a>
+      </div>
+    </div>
+  </div>
+</div>
+<!--弹框-结束-->
+</body>

+ 825 - 0
js/codemirror/css.js

@@ -0,0 +1,825 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("css", function(config, parserConfig) {
+  var inline = parserConfig.inline
+  if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");
+
+  var indentUnit = config.indentUnit,
+      tokenHooks = parserConfig.tokenHooks,
+      documentTypes = parserConfig.documentTypes || {},
+      mediaTypes = parserConfig.mediaTypes || {},
+      mediaFeatures = parserConfig.mediaFeatures || {},
+      mediaValueKeywords = parserConfig.mediaValueKeywords || {},
+      propertyKeywords = parserConfig.propertyKeywords || {},
+      nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},
+      fontProperties = parserConfig.fontProperties || {},
+      counterDescriptors = parserConfig.counterDescriptors || {},
+      colorKeywords = parserConfig.colorKeywords || {},
+      valueKeywords = parserConfig.valueKeywords || {},
+      allowNested = parserConfig.allowNested,
+      supportsAtComponent = parserConfig.supportsAtComponent === true;
+
+  var type, override;
+  function ret(style, tp) { type = tp; return style; }
+
+  // Tokenizers
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (tokenHooks[ch]) {
+      var result = tokenHooks[ch](stream, state);
+      if (result !== false) return result;
+    }
+    if (ch == "@") {
+      stream.eatWhile(/[\w\\\-]/);
+      return ret("def", stream.current());
+    } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) {
+      return ret(null, "compare");
+    } else if (ch == "\"" || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    } else if (ch == "#") {
+      stream.eatWhile(/[\w\\\-]/);
+      return ret("atom", "hash");
+    } else if (ch == "!") {
+      stream.match(/^\s*\w*/);
+      return ret("keyword", "important");
+    } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
+      stream.eatWhile(/[\w.%]/);
+      return ret("number", "unit");
+    } else if (ch === "-") {
+      if (/[\d.]/.test(stream.peek())) {
+        stream.eatWhile(/[\w.%]/);
+        return ret("number", "unit");
+      } else if (stream.match(/^-[\w\\\-]+/)) {
+        stream.eatWhile(/[\w\\\-]/);
+        if (stream.match(/^\s*:/, false))
+          return ret("variable-2", "variable-definition");
+        return ret("variable-2", "variable");
+      } else if (stream.match(/^\w+-/)) {
+        return ret("meta", "meta");
+      }
+    } else if (/[,+>*\/]/.test(ch)) {
+      return ret(null, "select-op");
+    } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
+      return ret("qualifier", "qualifier");
+    } else if (/[:;{}\[\]\(\)]/.test(ch)) {
+      return ret(null, ch);
+    } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) ||
+               (ch == "d" && stream.match("omain(")) ||
+               (ch == "r" && stream.match("egexp("))) {
+      stream.backUp(1);
+      state.tokenize = tokenParenthesized;
+      return ret("property", "word");
+    } else if (/[\w\\\-]/.test(ch)) {
+      stream.eatWhile(/[\w\\\-]/);
+      return ret("property", "word");
+    } else {
+      return ret(null, null);
+    }
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, ch;
+      while ((ch = stream.next()) != null) {
+        if (ch == quote && !escaped) {
+          if (quote == ")") stream.backUp(1);
+          break;
+        }
+        escaped = !escaped && ch == "\\";
+      }
+      if (ch == quote || !escaped && quote != ")") state.tokenize = null;
+      return ret("string", "string");
+    };
+  }
+
+  function tokenParenthesized(stream, state) {
+    stream.next(); // Must be '('
+    if (!stream.match(/\s*[\"\')]/, false))
+      state.tokenize = tokenString(")");
+    else
+      state.tokenize = null;
+    return ret(null, "(");
+  }
+
+  // Context management
+
+  function Context(type, indent, prev) {
+    this.type = type;
+    this.indent = indent;
+    this.prev = prev;
+  }
+
+  function pushContext(state, stream, type, indent) {
+    state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context);
+    return type;
+  }
+
+  function popContext(state) {
+    if (state.context.prev)
+      state.context = state.context.prev;
+    return state.context.type;
+  }
+
+  function pass(type, stream, state) {
+    return states[state.context.type](type, stream, state);
+  }
+  function popAndPass(type, stream, state, n) {
+    for (var i = n || 1; i > 0; i--)
+      state.context = state.context.prev;
+    return pass(type, stream, state);
+  }
+
+  // Parser
+
+  function wordAsValue(stream) {
+    var word = stream.current().toLowerCase();
+    if (valueKeywords.hasOwnProperty(word))
+      override = "atom";
+    else if (colorKeywords.hasOwnProperty(word))
+      override = "keyword";
+    else
+      override = "variable";
+  }
+
+  var states = {};
+
+  states.top = function(type, stream, state) {
+    if (type == "{") {
+      return pushContext(state, stream, "block");
+    } else if (type == "}" && state.context.prev) {
+      return popContext(state);
+    } else if (supportsAtComponent && /@component/.test(type)) {
+      return pushContext(state, stream, "atComponentBlock");
+    } else if (/^@(-moz-)?document$/.test(type)) {
+      return pushContext(state, stream, "documentTypes");
+    } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) {
+      return pushContext(state, stream, "atBlock");
+    } else if (/^@(font-face|counter-style)/.test(type)) {
+      state.stateArg = type;
+      return "restricted_atBlock_before";
+    } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {
+      return "keyframes";
+    } else if (type && type.charAt(0) == "@") {
+      return pushContext(state, stream, "at");
+    } else if (type == "hash") {
+      override = "builtin";
+    } else if (type == "word") {
+      override = "tag";
+    } else if (type == "variable-definition") {
+      return "maybeprop";
+    } else if (type == "interpolation") {
+      return pushContext(state, stream, "interpolation");
+    } else if (type == ":") {
+      return "pseudo";
+    } else if (allowNested && type == "(") {
+      return pushContext(state, stream, "parens");
+    }
+    return state.context.type;
+  };
+
+  states.block = function(type, stream, state) {
+    if (type == "word") {
+      var word = stream.current().toLowerCase();
+      if (propertyKeywords.hasOwnProperty(word)) {
+        override = "property";
+        return "maybeprop";
+      } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
+        override = "string-2";
+        return "maybeprop";
+      } else if (allowNested) {
+        override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag";
+        return "block";
+      } else {
+        override += " error";
+        return "maybeprop";
+      }
+    } else if (type == "meta") {
+      return "block";
+    } else if (!allowNested && (type == "hash" || type == "qualifier")) {
+      override = "error";
+      return "block";
+    } else {
+      return states.top(type, stream, state);
+    }
+  };
+
+  states.maybeprop = function(type, stream, state) {
+    if (type == ":") return pushContext(state, stream, "prop");
+    return pass(type, stream, state);
+  };
+
+  states.prop = function(type, stream, state) {
+    if (type == ";") return popContext(state);
+    if (type == "{" && allowNested) return pushContext(state, stream, "propBlock");
+    if (type == "}" || type == "{") return popAndPass(type, stream, state);
+    if (type == "(") return pushContext(state, stream, "parens");
+
+    if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) {
+      override += " error";
+    } else if (type == "word") {
+      wordAsValue(stream);
+    } else if (type == "interpolation") {
+      return pushContext(state, stream, "interpolation");
+    }
+    return "prop";
+  };
+
+  states.propBlock = function(type, _stream, state) {
+    if (type == "}") return popContext(state);
+    if (type == "word") { override = "property"; return "maybeprop"; }
+    return state.context.type;
+  };
+
+  states.parens = function(type, stream, state) {
+    if (type == "{" || type == "}") return popAndPass(type, stream, state);
+    if (type == ")") return popContext(state);
+    if (type == "(") return pushContext(state, stream, "parens");
+    if (type == "interpolation") return pushContext(state, stream, "interpolation");
+    if (type == "word") wordAsValue(stream);
+    return "parens";
+  };
+
+  states.pseudo = function(type, stream, state) {
+    if (type == "word") {
+      override = "variable-3";
+      return state.context.type;
+    }
+    return pass(type, stream, state);
+  };
+
+  states.documentTypes = function(type, stream, state) {
+    if (type == "word" && documentTypes.hasOwnProperty(stream.current())) {
+      override = "tag";
+      return state.context.type;
+    } else {
+      return states.atBlock(type, stream, state);
+    }
+  };
+
+  states.atBlock = function(type, stream, state) {
+    if (type == "(") return pushContext(state, stream, "atBlock_parens");
+    if (type == "}" || type == ";") return popAndPass(type, stream, state);
+    if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");
+
+    if (type == "interpolation") return pushContext(state, stream, "interpolation");
+
+    if (type == "word") {
+      var word = stream.current().toLowerCase();
+      if (word == "only" || word == "not" || word == "and" || word == "or")
+        override = "keyword";
+      else if (mediaTypes.hasOwnProperty(word))
+        override = "attribute";
+      else if (mediaFeatures.hasOwnProperty(word))
+        override = "property";
+      else if (mediaValueKeywords.hasOwnProperty(word))
+        override = "keyword";
+      else if (propertyKeywords.hasOwnProperty(word))
+        override = "property";
+      else if (nonStandardPropertyKeywords.hasOwnProperty(word))
+        override = "string-2";
+      else if (valueKeywords.hasOwnProperty(word))
+        override = "atom";
+      else if (colorKeywords.hasOwnProperty(word))
+        override = "keyword";
+      else
+        override = "error";
+    }
+    return state.context.type;
+  };
+
+  states.atComponentBlock = function(type, stream, state) {
+    if (type == "}")
+      return popAndPass(type, stream, state);
+    if (type == "{")
+      return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false);
+    if (type == "word")
+      override = "error";
+    return state.context.type;
+  };
+
+  states.atBlock_parens = function(type, stream, state) {
+    if (type == ")") return popContext(state);
+    if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
+    return states.atBlock(type, stream, state);
+  };
+
+  states.restricted_atBlock_before = function(type, stream, state) {
+    if (type == "{")
+      return pushContext(state, stream, "restricted_atBlock");
+    if (type == "word" && state.stateArg == "@counter-style") {
+      override = "variable";
+      return "restricted_atBlock_before";
+    }
+    return pass(type, stream, state);
+  };
+
+  states.restricted_atBlock = function(type, stream, state) {
+    if (type == "}") {
+      state.stateArg = null;
+      return popContext(state);
+    }
+    if (type == "word") {
+      if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) ||
+          (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase())))
+        override = "error";
+      else
+        override = "property";
+      return "maybeprop";
+    }
+    return "restricted_atBlock";
+  };
+
+  states.keyframes = function(type, stream, state) {
+    if (type == "word") { override = "variable"; return "keyframes"; }
+    if (type == "{") return pushContext(state, stream, "top");
+    return pass(type, stream, state);
+  };
+
+  states.at = function(type, stream, state) {
+    if (type == ";") return popContext(state);
+    if (type == "{" || type == "}") return popAndPass(type, stream, state);
+    if (type == "word") override = "tag";
+    else if (type == "hash") override = "builtin";
+    return "at";
+  };
+
+  states.interpolation = function(type, stream, state) {
+    if (type == "}") return popContext(state);
+    if (type == "{" || type == ";") return popAndPass(type, stream, state);
+    if (type == "word") override = "variable";
+    else if (type != "variable" && type != "(" && type != ")") override = "error";
+    return "interpolation";
+  };
+
+  return {
+    startState: function(base) {
+      return {tokenize: null,
+              state: inline ? "block" : "top",
+              stateArg: null,
+              context: new Context(inline ? "block" : "top", base || 0, null)};
+    },
+
+    token: function(stream, state) {
+      if (!state.tokenize && stream.eatSpace()) return null;
+      var style = (state.tokenize || tokenBase)(stream, state);
+      if (style && typeof style == "object") {
+        type = style[1];
+        style = style[0];
+      }
+      override = style;
+      state.state = states[state.state](type, stream, state);
+      return override;
+    },
+
+    indent: function(state, textAfter) {
+      var cx = state.context, ch = textAfter && textAfter.charAt(0);
+      var indent = cx.indent;
+      if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev;
+      if (cx.prev) {
+        if (ch == "}" && (cx.type == "block" || cx.type == "top" ||
+                          cx.type == "interpolation" || cx.type == "restricted_atBlock")) {
+          // Resume indentation from parent context.
+          cx = cx.prev;
+          indent = cx.indent;
+        } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") ||
+            ch == "{" && (cx.type == "at" || cx.type == "atBlock")) {
+          // Dedent relative to current context.
+          indent = Math.max(0, cx.indent - indentUnit);
+          cx = cx.prev;
+        }
+      }
+      return indent;
+    },
+
+    electricChars: "}",
+    blockCommentStart: "/*",
+    blockCommentEnd: "*/",
+    fold: "brace"
+  };
+});
+
+  function keySet(array) {
+    var keys = {};
+    for (var i = 0; i < array.length; ++i) {
+      keys[array[i]] = true;
+    }
+    return keys;
+  }
+
+  var documentTypes_ = [
+    "domain", "regexp", "url", "url-prefix"
+  ], documentTypes = keySet(documentTypes_);
+
+  var mediaTypes_ = [
+    "all", "aural", "braille", "handheld", "print", "projection", "screen",
+    "tty", "tv", "embossed"
+  ], mediaTypes = keySet(mediaTypes_);
+
+  var mediaFeatures_ = [
+    "width", "min-width", "max-width", "height", "min-height", "max-height",
+    "device-width", "min-device-width", "max-device-width", "device-height",
+    "min-device-height", "max-device-height", "aspect-ratio",
+    "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio",
+    "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
+    "max-color", "color-index", "min-color-index", "max-color-index",
+    "monochrome", "min-monochrome", "max-monochrome", "resolution",
+    "min-resolution", "max-resolution", "scan", "grid", "orientation",
+    "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio",
+    "pointer", "any-pointer", "hover", "any-hover"
+  ], mediaFeatures = keySet(mediaFeatures_);
+
+  var mediaValueKeywords_ = [
+    "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover",
+    "interlace", "progressive"
+  ], mediaValueKeywords = keySet(mediaValueKeywords_);
+
+  var propertyKeywords_ = [
+    "align-content", "align-items", "align-self", "alignment-adjust",
+    "alignment-baseline", "anchor-point", "animation", "animation-delay",
+    "animation-direction", "animation-duration", "animation-fill-mode",
+    "animation-iteration-count", "animation-name", "animation-play-state",
+    "animation-timing-function", "appearance", "azimuth", "backface-visibility",
+    "background", "background-attachment", "background-blend-mode", "background-clip",
+    "background-color", "background-image", "background-origin", "background-position",
+    "background-repeat", "background-size", "baseline-shift", "binding",
+    "bleed", "bookmark-label", "bookmark-level", "bookmark-state",
+    "bookmark-target", "border", "border-bottom", "border-bottom-color",
+    "border-bottom-left-radius", "border-bottom-right-radius",
+    "border-bottom-style", "border-bottom-width", "border-collapse",
+    "border-color", "border-image", "border-image-outset",
+    "border-image-repeat", "border-image-slice", "border-image-source",
+    "border-image-width", "border-left", "border-left-color",
+    "border-left-style", "border-left-width", "border-radius", "border-right",
+    "border-right-color", "border-right-style", "border-right-width",
+    "border-spacing", "border-style", "border-top", "border-top-color",
+    "border-top-left-radius", "border-top-right-radius", "border-top-style",
+    "border-top-width", "border-width", "bottom", "box-decoration-break",
+    "box-shadow", "box-sizing", "break-after", "break-before", "break-inside",
+    "caption-side", "clear", "clip", "color", "color-profile", "column-count",
+    "column-fill", "column-gap", "column-rule", "column-rule-color",
+    "column-rule-style", "column-rule-width", "column-span", "column-width",
+    "columns", "content", "counter-increment", "counter-reset", "crop", "cue",
+    "cue-after", "cue-before", "cursor", "direction", "display",
+    "dominant-baseline", "drop-initial-after-adjust",
+    "drop-initial-after-align", "drop-initial-before-adjust",
+    "drop-initial-before-align", "drop-initial-size", "drop-initial-value",
+    "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
+    "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
+    "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings",
+    "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust",
+    "font-stretch", "font-style", "font-synthesis", "font-variant",
+    "font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
+    "font-variant-ligatures", "font-variant-numeric", "font-variant-position",
+    "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow",
+    "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-gap",
+    "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-gap",
+    "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns",
+    "grid-template-rows", "hanging-punctuation", "height", "hyphens",
+    "icon", "image-orientation", "image-rendering", "image-resolution",
+    "inline-box-align", "justify-content", "left", "letter-spacing",
+    "line-break", "line-height", "line-stacking", "line-stacking-ruby",
+    "line-stacking-shift", "line-stacking-strategy", "list-style",
+    "list-style-image", "list-style-position", "list-style-type", "margin",
+    "margin-bottom", "margin-left", "margin-right", "margin-top",
+    "marker-offset", "marks", "marquee-direction", "marquee-loop",
+    "marquee-play-count", "marquee-speed", "marquee-style", "max-height",
+    "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index",
+    "nav-left", "nav-right", "nav-up", "object-fit", "object-position",
+    "opacity", "order", "orphans", "outline",
+    "outline-color", "outline-offset", "outline-style", "outline-width",
+    "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y",
+    "padding", "padding-bottom", "padding-left", "padding-right", "padding-top",
+    "page", "page-break-after", "page-break-before", "page-break-inside",
+    "page-policy", "pause", "pause-after", "pause-before", "perspective",
+    "perspective-origin", "pitch", "pitch-range", "play-during", "position",
+    "presentation-level", "punctuation-trim", "quotes", "region-break-after",
+    "region-break-before", "region-break-inside", "region-fragment",
+    "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness",
+    "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang",
+    "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin",
+    "shape-outside", "size", "speak", "speak-as", "speak-header",
+    "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
+    "tab-size", "table-layout", "target", "target-name", "target-new",
+    "target-position", "text-align", "text-align-last", "text-decoration",
+    "text-decoration-color", "text-decoration-line", "text-decoration-skip",
+    "text-decoration-style", "text-emphasis", "text-emphasis-color",
+    "text-emphasis-position", "text-emphasis-style", "text-height",
+    "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow",
+    "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position",
+    "text-wrap", "top", "transform", "transform-origin", "transform-style",
+    "transition", "transition-delay", "transition-duration",
+    "transition-property", "transition-timing-function", "unicode-bidi",
+    "vertical-align", "visibility", "voice-balance", "voice-duration",
+    "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
+    "voice-volume", "volume", "white-space", "widows", "width", "word-break",
+    "word-spacing", "word-wrap", "z-index",
+    // SVG-specific
+    "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
+    "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
+    "color-interpolation", "color-interpolation-filters",
+    "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
+    "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
+    "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
+    "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
+    "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
+    "glyph-orientation-vertical", "text-anchor", "writing-mode"
+  ], propertyKeywords = keySet(propertyKeywords_);
+
+  var nonStandardPropertyKeywords_ = [
+    "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color",
+    "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color",
+    "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside",
+    "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
+    "searchfield-results-decoration", "zoom"
+  ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);
+
+  var fontProperties_ = [
+    "font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
+    "font-stretch", "font-weight", "font-style"
+  ], fontProperties = keySet(fontProperties_);
+
+  var counterDescriptors_ = [
+    "additive-symbols", "fallback", "negative", "pad", "prefix", "range",
+    "speak-as", "suffix", "symbols", "system"
+  ], counterDescriptors = keySet(counterDescriptors_);
+
+  var colorKeywords_ = [
+    "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
+    "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
+    "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue",
+    "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod",
+    "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen",
+    "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
+    "darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
+    "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
+    "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
+    "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
+    "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
+    "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
+    "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
+    "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray",
+    "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta",
+    "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple",
+    "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise",
+    "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin",
+    "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered",
+    "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred",
+    "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue",
+    "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown",
+    "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue",
+    "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan",
+    "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white",
+    "whitesmoke", "yellow", "yellowgreen"
+  ], colorKeywords = keySet(colorKeywords_);
+
+  var valueKeywords_ = [
+    "above", "absolute", "activeborder", "additive", "activecaption", "afar",
+    "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate",
+    "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
+    "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page",
+    "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
+    "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
+    "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel",
+    "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian",
+    "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
+    "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch",
+    "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
+    "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse",
+    "compact", "condensed", "contain", "content",
+    "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop",
+    "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal",
+    "decimal-leading-zero", "default", "default-button", "dense", "destination-atop",
+    "destination-in", "destination-out", "destination-over", "devanagari", "difference",
+    "disc", "discard", "disclosure-closed", "disclosure-open", "document",
+    "dot-dash", "dot-dot-dash",
+    "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
+    "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
+    "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
+    "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
+    "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
+    "ethiopic-halehame-gez", "ethiopic-halehame-om-et",
+    "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
+    "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig",
+    "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed",
+    "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes",
+    "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove",
+    "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew",
+    "help", "hidden", "hide", "higher", "highlight", "highlighttext",
+    "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore",
+    "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
+    "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
+    "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert",
+    "italic", "japanese-formal", "japanese-informal", "justify", "kannada",
+    "katakana", "katakana-iroha", "keep-all", "khmer",
+    "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal",
+    "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten",
+    "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem",
+    "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
+    "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
+    "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d",
+    "media-controls-background", "media-current-time-display",
+    "media-fullscreen-button", "media-mute-button", "media-play-button",
+    "media-return-to-realtime-button", "media-rewind-button",
+    "media-seek-back-button", "media-seek-forward-button", "media-slider",
+    "media-sliderthumb", "media-time-remaining-display", "media-volume-slider",
+    "media-volume-slider-container", "media-volume-sliderthumb", "medium",
+    "menu", "menulist", "menulist-button", "menulist-text",
+    "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
+    "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize",
+    "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
+    "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
+    "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
+    "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
+    "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
+    "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter",
+    "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d",
+    "progress", "push-button", "radial-gradient", "radio", "read-only",
+    "read-write", "read-write-plaintext-only", "rectangle", "region",
+    "relative", "repeat", "repeating-linear-gradient",
+    "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse",
+    "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY",
+    "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running",
+    "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen",
+    "scroll", "scrollbar", "se-resize", "searchfield",
+    "searchfield-cancel-button", "searchfield-decoration",
+    "searchfield-results-button", "searchfield-results-decoration",
+    "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
+    "simp-chinese-formal", "simp-chinese-informal", "single",
+    "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal",
+    "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
+    "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali",
+    "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square",
+    "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub",
+    "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table",
+    "table-caption", "table-cell", "table-column", "table-column-group",
+    "table-footer-group", "table-header-group", "table-row", "table-row-group",
+    "tamil",
+    "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
+    "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
+    "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
+    "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
+    "trad-chinese-formal", "trad-chinese-informal",
+    "translate", "translate3d", "translateX", "translateY", "translateZ",
+    "transparent", "ultra-condensed", "ultra-expanded", "underline", "up",
+    "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
+    "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
+    "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
+    "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
+    "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor",
+    "xx-large", "xx-small"
+  ], valueKeywords = keySet(valueKeywords_);
+
+  var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_)
+    .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_)
+    .concat(valueKeywords_);
+  CodeMirror.registerHelper("hintWords", "css", allWords);
+
+  function tokenCComment(stream, state) {
+    var maybeEnd = false, ch;
+    while ((ch = stream.next()) != null) {
+      if (maybeEnd && ch == "/") {
+        state.tokenize = null;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ["comment", "comment"];
+  }
+
+  CodeMirror.defineMIME("text/css", {
+    documentTypes: documentTypes,
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    mediaValueKeywords: mediaValueKeywords,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    fontProperties: fontProperties,
+    counterDescriptors: counterDescriptors,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    tokenHooks: {
+      "/": function(stream, state) {
+        if (!stream.eat("*")) return false;
+        state.tokenize = tokenCComment;
+        return tokenCComment(stream, state);
+      }
+    },
+    name: "css"
+  });
+
+  CodeMirror.defineMIME("text/x-scss", {
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    mediaValueKeywords: mediaValueKeywords,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    fontProperties: fontProperties,
+    allowNested: true,
+    tokenHooks: {
+      "/": function(stream, state) {
+        if (stream.eat("/")) {
+          stream.skipToEnd();
+          return ["comment", "comment"];
+        } else if (stream.eat("*")) {
+          state.tokenize = tokenCComment;
+          return tokenCComment(stream, state);
+        } else {
+          return ["operator", "operator"];
+        }
+      },
+      ":": function(stream) {
+        if (stream.match(/\s*\{/))
+          return [null, "{"];
+        return false;
+      },
+      "$": function(stream) {
+        stream.match(/^[\w-]+/);
+        if (stream.match(/^\s*:/, false))
+          return ["variable-2", "variable-definition"];
+        return ["variable-2", "variable"];
+      },
+      "#": function(stream) {
+        if (!stream.eat("{")) return false;
+        return [null, "interpolation"];
+      }
+    },
+    name: "css",
+    helperType: "scss"
+  });
+
+  CodeMirror.defineMIME("text/x-less", {
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    mediaValueKeywords: mediaValueKeywords,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    fontProperties: fontProperties,
+    allowNested: true,
+    tokenHooks: {
+      "/": function(stream, state) {
+        if (stream.eat("/")) {
+          stream.skipToEnd();
+          return ["comment", "comment"];
+        } else if (stream.eat("*")) {
+          state.tokenize = tokenCComment;
+          return tokenCComment(stream, state);
+        } else {
+          return ["operator", "operator"];
+        }
+      },
+      "@": function(stream) {
+        if (stream.eat("{")) return [null, "interpolation"];
+        if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false;
+        stream.eatWhile(/[\w\\\-]/);
+        if (stream.match(/^\s*:/, false))
+          return ["variable-2", "variable-definition"];
+        return ["variable-2", "variable"];
+      },
+      "&": function() {
+        return ["atom", "atom"];
+      }
+    },
+    name: "css",
+    helperType: "less"
+  });
+
+  CodeMirror.defineMIME("text/x-gss", {
+    documentTypes: documentTypes,
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    fontProperties: fontProperties,
+    counterDescriptors: counterDescriptors,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    supportsAtComponent: true,
+    tokenHooks: {
+      "/": function(stream, state) {
+        if (!stream.eat("*")) return false;
+        state.tokenize = tokenCComment;
+        return tokenCComment(stream, state);
+      }
+    },
+    name: "css",
+    helperType: "gss"
+  });
+
+});

+ 743 - 0
js/codemirror/javascript.js

@@ -0,0 +1,743 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+// TODO actually recognize syntax of TypeScript constructs
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+function expressionAllowed(stream, state, backUp) {
+  return /^(?:operator|sof|keyword c|case|new|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
+    (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))
+}
+
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var statementIndent = parserConfig.statementIndent;
+  var jsonldMode = parserConfig.jsonld;
+  var jsonMode = parserConfig.json || jsonldMode;
+  var isTS = parserConfig.typescript;
+  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
+
+  // Tokenizer
+
+  var keywords = function(){
+    function kw(type) {return {type: type, style: "keyword"};}
+    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+
+    var jsKeywords = {
+      "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+      "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C,
+      "var": kw("var"), "const": kw("var"), "let": kw("var"),
+      "function": kw("function"), "catch": kw("catch"),
+      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+      "in": operator, "typeof": operator, "instanceof": operator,
+      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
+      "this": kw("this"), "class": kw("class"), "super": kw("atom"),
+      "yield": C, "export": kw("export"), "import": kw("import"), "extends": C,
+      "await": C, "async": kw("async")
+    };
+
+    // Extend the 'normal' keywords with the TypeScript language extensions
+    if (isTS) {
+      var type = {type: "variable", style: "variable-3"};
+      var tsKeywords = {
+        // object-like things
+        "interface": kw("class"),
+        "implements": C,
+        "namespace": C,
+        "module": kw("module"),
+        "enum": kw("module"),
+
+        // scope modifiers
+        "public": kw("modifier"),
+        "private": kw("modifier"),
+        "protected": kw("modifier"),
+        "abstract": kw("modifier"),
+
+        // operators
+        "as": operator,
+
+        // types
+        "string": type, "number": type, "boolean": type, "any": type
+      };
+
+      for (var attr in tsKeywords) {
+        jsKeywords[attr] = tsKeywords[attr];
+      }
+    }
+
+    return jsKeywords;
+  }();
+
+  var isOperatorChar = /[+\-*&%=<>!?|~^]/;
+  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;
+
+  function readRegexp(stream) {
+    var escaped = false, next, inSet = false;
+    while ((next = stream.next()) != null) {
+      if (!escaped) {
+        if (next == "/" && !inSet) return;
+        if (next == "[") inSet = true;
+        else if (inSet && next == "]") inSet = false;
+      }
+      escaped = !escaped && next == "\\";
+    }
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+  function ret(tp, style, cont) {
+    type = tp; content = cont;
+    return style;
+  }
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
+      return ret("number", "number");
+    } else if (ch == "." && stream.match("..")) {
+      return ret("spread", "meta");
+    } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
+      return ret(ch);
+    } else if (ch == "=" && stream.eat(">")) {
+      return ret("=>", "operator");
+    } else if (ch == "0" && stream.eat(/x/i)) {
+      stream.eatWhile(/[\da-f]/i);
+      return ret("number", "number");
+    } else if (ch == "0" && stream.eat(/o/i)) {
+      stream.eatWhile(/[0-7]/i);
+      return ret("number", "number");
+    } else if (ch == "0" && stream.eat(/b/i)) {
+      stream.eatWhile(/[01]/i);
+      return ret("number", "number");
+    } else if (/\d/.test(ch)) {
+      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+      return ret("number", "number");
+    } else if (ch == "/") {
+      if (stream.eat("*")) {
+        state.tokenize = tokenComment;
+        return tokenComment(stream, state);
+      } else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "comment");
+      } else if (expressionAllowed(stream, state, 1)) {
+        readRegexp(stream);
+        stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);
+        return ret("regexp", "string-2");
+      } else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", "operator", stream.current());
+      }
+    } else if (ch == "`") {
+      state.tokenize = tokenQuasi;
+      return tokenQuasi(stream, state);
+    } else if (ch == "#") {
+      stream.skipToEnd();
+      return ret("error", "error");
+    } else if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return ret("operator", "operator", stream.current());
+    } else if (wordRE.test(ch)) {
+      stream.eatWhile(wordRE);
+      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+      return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
+                     ret("variable", "variable", word);
+    }
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next;
+      if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){
+        state.tokenize = tokenBase;
+        return ret("jsonld-keyword", "meta");
+      }
+      while ((next = stream.next()) != null) {
+        if (next == quote && !escaped) break;
+        escaped = !escaped && next == "\\";
+      }
+      if (!escaped) state.tokenize = tokenBase;
+      return ret("string", "string");
+    };
+  }
+
+  function tokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "comment");
+  }
+
+  function tokenQuasi(stream, state) {
+    var escaped = false, next;
+    while ((next = stream.next()) != null) {
+      if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      escaped = !escaped && next == "\\";
+    }
+    return ret("quasi", "string-2", stream.current());
+  }
+
+  var brackets = "([{}])";
+  // This is a crude lookahead trick to try and notice that we're
+  // parsing the argument patterns for a fat-arrow function before we
+  // actually hit the arrow token. It only works if the arrow is on
+  // the same line as the arguments and there's no strange noise
+  // (comments) in between. Fallback is to only notice when we hit the
+  // arrow, and not declare the arguments as locals for the arrow
+  // body.
+  function findFatArrow(stream, state) {
+    if (state.fatArrowAt) state.fatArrowAt = null;
+    var arrow = stream.string.indexOf("=>", stream.start);
+    if (arrow < 0) return;
+
+    var depth = 0, sawSomething = false;
+    for (var pos = arrow - 1; pos >= 0; --pos) {
+      var ch = stream.string.charAt(pos);
+      var bracket = brackets.indexOf(ch);
+      if (bracket >= 0 && bracket < 3) {
+        if (!depth) { ++pos; break; }
+        if (--depth == 0) break;
+      } else if (bracket >= 3 && bracket < 6) {
+        ++depth;
+      } else if (wordRE.test(ch)) {
+        sawSomething = true;
+      } else if (/["'\/]/.test(ch)) {
+        return;
+      } else if (sawSomething && !depth) {
+        ++pos;
+        break;
+      }
+    }
+    if (sawSomething && !depth) state.fatArrowAt = pos;
+  }
+
+  // Parser
+
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
+
+  function JSLexical(indented, column, type, align, prev, info) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.prev = prev;
+    this.info = info;
+    if (align != null) this.align = align;
+  }
+
+  function inScope(state, varname) {
+    for (var v = state.localVars; v; v = v.next)
+      if (v.name == varname) return true;
+    for (var cx = state.context; cx; cx = cx.prev) {
+      for (var v = cx.vars; v; v = v.next)
+        if (v.name == varname) return true;
+    }
+  }
+
+  function parseJS(state, style, type, content, stream) {
+    var cc = state.cc;
+    // Communicate our context to the combinators.
+    // (Less wasteful than consing up a hundred closures on every call.)
+    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;
+
+    if (!state.lexical.hasOwnProperty("align"))
+      state.lexical.align = true;
+
+    while(true) {
+      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+      if (combinator(type, content)) {
+        while(cc.length && cc[cc.length - 1].lex)
+          cc.pop()();
+        if (cx.marked) return cx.marked;
+        if (type == "variable" && inScope(state, content)) return "variable-2";
+        return style;
+      }
+    }
+  }
+
+  // Combinator utils
+
+  var cx = {state: null, column: null, marked: null, cc: null};
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+  function register(varname) {
+    function inList(list) {
+      for (var v = list; v; v = v.next)
+        if (v.name == varname) return true;
+      return false;
+    }
+    var state = cx.state;
+    cx.marked = "def";
+    if (state.context) {
+      if (inList(state.localVars)) return;
+      state.localVars = {name: varname, next: state.localVars};
+    } else {
+      if (inList(state.globalVars)) return;
+      if (parserConfig.globalVars)
+        state.globalVars = {name: varname, next: state.globalVars};
+    }
+  }
+
+  // Combinators
+
+  var defaultVars = {name: "this", next: {name: "arguments"}};
+  function pushcontext() {
+    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+    cx.state.localVars = defaultVars;
+  }
+  function popcontext() {
+    cx.state.localVars = cx.state.context.vars;
+    cx.state.context = cx.state.context.prev;
+  }
+  function pushlex(type, info) {
+    var result = function() {
+      var state = cx.state, indent = state.indented;
+      if (state.lexical.type == "stat") indent = state.lexical.indented;
+      else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
+        indent = outer.indented;
+      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
+    };
+    result.lex = true;
+    return result;
+  }
+  function poplex() {
+    var state = cx.state;
+    if (state.lexical.prev) {
+      if (state.lexical.type == ")")
+        state.indented = state.lexical.indented;
+      state.lexical = state.lexical.prev;
+    }
+  }
+  poplex.lex = true;
+
+  function expect(wanted) {
+    function exp(type) {
+      if (type == wanted) return cont();
+      else if (wanted == ";") return pass();
+      else return cont(exp);
+    };
+    return exp;
+  }
+
+  function statement(type, value) {
+    if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
+    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+    if (type == "{") return cont(pushlex("}"), block, poplex);
+    if (type == ";") return cont();
+    if (type == "if") {
+      if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
+        cx.state.cc.pop()();
+      return cont(pushlex("form"), expression, statement, poplex, maybeelse);
+    }
+    if (type == "function") return cont(functiondef);
+    if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
+    if (type == "variable") return cont(pushlex("stat"), maybelabel);
+    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+                                      block, poplex, poplex);
+    if (type == "case") return cont(expression, expect(":"));
+    if (type == "default") return cont(expect(":"));
+    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+                                     statement, poplex, popcontext);
+    if (type == "class") return cont(pushlex("form"), className, poplex);
+    if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
+    if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
+    if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex)
+    if (type == "async") return cont(statement)
+    return pass(pushlex("stat"), expression, expect(";"), poplex);
+  }
+  function expression(type) {
+    return expressionInner(type, false);
+  }
+  function expressionNoComma(type) {
+    return expressionInner(type, true);
+  }
+  function expressionInner(type, noComma) {
+    if (cx.state.fatArrowAt == cx.stream.start) {
+      var body = noComma ? arrowBodyNoComma : arrowBody;
+      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
+      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
+    }
+
+    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
+    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
+    if (type == "function") return cont(functiondef, maybeop);
+    if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
+    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);
+    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
+    if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
+    if (type == "{") return contCommasep(objprop, "}", null, maybeop);
+    if (type == "quasi") return pass(quasi, maybeop);
+    if (type == "new") return cont(maybeTarget(noComma));
+    return cont();
+  }
+  function maybeexpression(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expression);
+  }
+  function maybeexpressionNoComma(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expressionNoComma);
+  }
+
+  function maybeoperatorComma(type, value) {
+    if (type == ",") return cont(expression);
+    return maybeoperatorNoComma(type, value, false);
+  }
+  function maybeoperatorNoComma(type, value, noComma) {
+    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
+    var expr = noComma == false ? expression : expressionNoComma;
+    if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
+    if (type == "operator") {
+      if (/\+\+|--/.test(value)) return cont(me);
+      if (value == "?") return cont(expression, expect(":"), expr);
+      return cont(expr);
+    }
+    if (type == "quasi") { return pass(quasi, me); }
+    if (type == ";") return;
+    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
+    if (type == ".") return cont(property, me);
+    if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
+  }
+  function quasi(type, value) {
+    if (type != "quasi") return pass();
+    if (value.slice(value.length - 2) != "${") return cont(quasi);
+    return cont(expression, continueQuasi);
+  }
+  function continueQuasi(type) {
+    if (type == "}") {
+      cx.marked = "string-2";
+      cx.state.tokenize = tokenQuasi;
+      return cont(quasi);
+    }
+  }
+  function arrowBody(type) {
+    findFatArrow(cx.stream, cx.state);
+    return pass(type == "{" ? statement : expression);
+  }
+  function arrowBodyNoComma(type) {
+    findFatArrow(cx.stream, cx.state);
+    return pass(type == "{" ? statement : expressionNoComma);
+  }
+  function maybeTarget(noComma) {
+    return function(type) {
+      if (type == ".") return cont(noComma ? targetNoComma : target);
+      else return pass(noComma ? expressionNoComma : expression);
+    };
+  }
+  function target(_, value) {
+    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
+  }
+  function targetNoComma(_, value) {
+    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }
+  }
+  function maybelabel(type) {
+    if (type == ":") return cont(poplex, statement);
+    return pass(maybeoperatorComma, expect(";"), poplex);
+  }
+  function property(type) {
+    if (type == "variable") {cx.marked = "property"; return cont();}
+  }
+  function objprop(type, value) {
+    if (type == "async") return cont(objprop);
+    if (type == "variable" || cx.style == "keyword") {
+      cx.marked = "property";
+      if (value == "get" || value == "set") return cont(getterSetter);
+      return cont(afterprop);
+    } else if (type == "number" || type == "string") {
+      cx.marked = jsonldMode ? "property" : (cx.style + " property");
+      return cont(afterprop);
+    } else if (type == "jsonld-keyword") {
+      return cont(afterprop);
+    } else if (type == "modifier") {
+      return cont(objprop)
+    } else if (type == "[") {
+      return cont(expression, expect("]"), afterprop);
+    } else if (type == "spread") {
+      return cont(expression);
+    }
+  }
+  function getterSetter(type) {
+    if (type != "variable") return pass(afterprop);
+    cx.marked = "property";
+    return cont(functiondef);
+  }
+  function afterprop(type) {
+    if (type == ":") return cont(expressionNoComma);
+    if (type == "(") return pass(functiondef);
+  }
+  function commasep(what, end) {
+    function proceed(type, value) {
+      if (type == ",") {
+        var lex = cx.state.lexical;
+        if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
+        return cont(function(type, value) {
+          if (type == end || value == end) return pass()
+          return pass(what)
+        }, proceed);
+      }
+      if (type == end || value == end) return cont();
+      return cont(expect(end));
+    }
+    return function(type, value) {
+      if (type == end || value == end) return cont();
+      return pass(what, proceed);
+    };
+  }
+  function contCommasep(what, end, info) {
+    for (var i = 3; i < arguments.length; i++)
+      cx.cc.push(arguments[i]);
+    return cont(pushlex(end, info), commasep(what, end), poplex);
+  }
+  function block(type) {
+    if (type == "}") return cont();
+    return pass(statement, block);
+  }
+  function maybetype(type) {
+    if (isTS && type == ":") return cont(typeexpr);
+  }
+  function maybedefault(_, value) {
+    if (value == "=") return cont(expressionNoComma);
+  }
+  function typeexpr(type) {
+    if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);}
+  }
+  function afterType(type, value) {
+    if (value == "<") return cont(commasep(typeexpr, ">"), afterType)
+    if (type == "[") return cont(expect("]"), afterType)
+  }
+  function vardef() {
+    return pass(pattern, maybetype, maybeAssign, vardefCont);
+  }
+  function pattern(type, value) {
+    if (type == "modifier") return cont(pattern)
+    if (type == "variable") { register(value); return cont(); }
+    if (type == "spread") return cont(pattern);
+    if (type == "[") return contCommasep(pattern, "]");
+    if (type == "{") return contCommasep(proppattern, "}");
+  }
+  function proppattern(type, value) {
+    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
+      register(value);
+      return cont(maybeAssign);
+    }
+    if (type == "variable") cx.marked = "property";
+    if (type == "spread") return cont(pattern);
+    if (type == "}") return pass();
+    return cont(expect(":"), pattern, maybeAssign);
+  }
+  function maybeAssign(_type, value) {
+    if (value == "=") return cont(expressionNoComma);
+  }
+  function vardefCont(type) {
+    if (type == ",") return cont(vardef);
+  }
+  function maybeelse(type, value) {
+    if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
+  }
+  function forspec(type) {
+    if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
+  }
+  function forspec1(type) {
+    if (type == "var") return cont(vardef, expect(";"), forspec2);
+    if (type == ";") return cont(forspec2);
+    if (type == "variable") return cont(formaybeinof);
+    return pass(expression, expect(";"), forspec2);
+  }
+  function formaybeinof(_type, value) {
+    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
+    return cont(maybeoperatorComma, forspec2);
+  }
+  function forspec2(type, value) {
+    if (type == ";") return cont(forspec3);
+    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
+    return pass(expression, expect(";"), forspec3);
+  }
+  function forspec3(type) {
+    if (type != ")") cont(expression);
+  }
+  function functiondef(type, value) {
+    if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
+    if (type == "variable") {register(value); return cont(functiondef);}
+    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext);
+  }
+  function funarg(type) {
+    if (type == "spread") return cont(funarg);
+    return pass(pattern, maybetype, maybedefault);
+  }
+  function className(type, value) {
+    if (type == "variable") {register(value); return cont(classNameAfter);}
+  }
+  function classNameAfter(type, value) {
+    if (value == "extends") return cont(expression, classNameAfter);
+    if (type == "{") return cont(pushlex("}"), classBody, poplex);
+  }
+  function classBody(type, value) {
+    if (type == "variable" || cx.style == "keyword") {
+      if (value == "static") {
+        cx.marked = "keyword";
+        return cont(classBody);
+      }
+      cx.marked = "property";
+      if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody);
+      return cont(functiondef, classBody);
+    }
+    if (value == "*") {
+      cx.marked = "keyword";
+      return cont(classBody);
+    }
+    if (type == ";") return cont(classBody);
+    if (type == "}") return cont();
+  }
+  function classGetterSetter(type) {
+    if (type != "variable") return pass();
+    cx.marked = "property";
+    return cont();
+  }
+  function afterExport(_type, value) {
+    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
+    if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
+    return pass(statement);
+  }
+  function afterImport(type) {
+    if (type == "string") return cont();
+    return pass(importSpec, maybeFrom);
+  }
+  function importSpec(type, value) {
+    if (type == "{") return contCommasep(importSpec, "}");
+    if (type == "variable") register(value);
+    if (value == "*") cx.marked = "keyword";
+    return cont(maybeAs);
+  }
+  function maybeAs(_type, value) {
+    if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }
+  }
+  function maybeFrom(_type, value) {
+    if (value == "from") { cx.marked = "keyword"; return cont(expression); }
+  }
+  function arrayLiteral(type) {
+    if (type == "]") return cont();
+    return pass(expressionNoComma, commasep(expressionNoComma, "]"));
+  }
+
+  function isContinuedStatement(state, textAfter) {
+    return state.lastType == "operator" || state.lastType == "," ||
+      isOperatorChar.test(textAfter.charAt(0)) ||
+      /[,.]/.test(textAfter.charAt(0));
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      var state = {
+        tokenize: tokenBase,
+        lastType: "sof",
+        cc: [],
+        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+        localVars: parserConfig.localVars,
+        context: parserConfig.localVars && {vars: parserConfig.localVars},
+        indented: basecolumn || 0
+      };
+      if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
+        state.globalVars = parserConfig.globalVars;
+      return state;
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        if (!state.lexical.hasOwnProperty("align"))
+          state.lexical.align = false;
+        state.indented = stream.indentation();
+        findFatArrow(stream, state);
+      }
+      if (state.tokenize != tokenComment && stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
+      return parseJS(state, style, type, content, stream);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize == tokenComment) return CodeMirror.Pass;
+      if (state.tokenize != tokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
+      // Kludge to prevent 'maybelse' from blocking lexical scope pops
+      if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
+        var c = state.cc[i];
+        if (c == poplex) lexical = lexical.prev;
+        else if (c != maybeelse) break;
+      }
+      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
+      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
+        lexical = lexical.prev;
+      var type = lexical.type, closing = firstChar == type;
+
+      if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
+      else if (type == "form" && firstChar == "{") return lexical.indented;
+      else if (type == "form") return lexical.indented + indentUnit;
+      else if (type == "stat")
+        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);
+      else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
+        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+      else return lexical.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
+    blockCommentStart: jsonMode ? null : "/*",
+    blockCommentEnd: jsonMode ? null : "*/",
+    lineComment: jsonMode ? null : "//",
+    fold: "brace",
+    closeBrackets: "()[]{}''\"\"``",
+
+    helperType: jsonMode ? "json" : "javascript",
+    jsonldMode: jsonldMode,
+    jsonMode: jsonMode,
+
+    expressionAllowed: expressionAllowed,
+    skipExpression: function(state) {
+      var top = state.cc[state.cc.length - 1]
+      if (top == expression || top == expressionNoComma) state.cc.pop()
+    }
+  };
+});
+
+CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/);
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("text/ecmascript", "javascript");
+CodeMirror.defineMIME("application/javascript", "javascript");
+CodeMirror.defineMIME("application/x-javascript", "javascript");
+CodeMirror.defineMIME("application/ecmascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
+CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
+CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
+
+});