]> _ Git - cubeextranet.git/commitdiff
wip #2116 @8
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Tue, 3 Jul 2018 18:51:24 +0000 (18:51 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Tue, 3 Jul 2018 18:51:24 +0000 (18:51 +0000)
fluidbook/tools/fwstk/.idea/misc.xml
fluidbook/tools/fwstk/.idea/workspace.xml
fluidbook/tools/fwstk/out/artifacts/fwstk_jar/fwstk.jar
inc/ws/Util/class.ws.util.php
inc/ws/Util/html5/advancedseo/class.ws.html5.compiler.php
inc/ws/Util/html5/advancedseo/class.ws.html5.seo.php [new file with mode: 0644]
inc/ws/Util/html5/class.ws.html5.php

index ac8680147188d987f01caee606b897e54c222415..91ce3bc2157b8cf4df90c825711b4e4265b13762 100644 (file)
           <value>
             <SvnBranchConfiguration>
               <option name="trunkUrl" value="svn+ssh://svn.cubedesigners.com/java" />
-              <option name="userinfoInUrl" value="true" />
             </SvnBranchConfiguration>
           </value>
         </entry>
           <value>
             <SvnBranchConfiguration>
               <option name="trunkUrl" value="svn+ssh://svn.cubedesigners.com/projects/cubeExtranet/fluidbook/tools/fwstk" />
-              <option name="userinfoInUrl" value="true" />
             </SvnBranchConfiguration>
           </value>
         </entry>
           <value>
             <SvnBranchConfiguration>
               <option name="trunkUrl" value="svn+ssh://svn.cubedesigners.com/java/com/fluidbook/fwstk" />
-              <option name="userinfoInUrl" value="true" />
             </SvnBranchConfiguration>
           </value>
         </entry>
index db45a241ec02e23c738c5be5bfaacc66284b271c..b8ae44ecd8a488fef39961add45d5dd82a8cb577 100644 (file)
@@ -8,6 +8,8 @@
   <component name="ChangeListManager">
     <list default="true" readonly="true" id="f146bc67-2578-4de3-9db2-94d2d43e9e83" name="Default" comment="">
       <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/out/artifacts/fwstk_jar/fwstk.jar" beforeDir="false" afterPath="$PROJECT_DIR$/out/artifacts/fwstk_jar/fwstk.jar" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java" afterDir="false" />
     </list>
     <ignored path="fwstk.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -31,7 +33,7 @@
       <file leaf-file-name="Word.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Word.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="323">
+            <state relative-caret-position="255">
               <caret line="24" column="97" selection-start-line="24" selection-start-column="97" selection-end-line="24" selection-end-column="97" />
               <folding>
                 <element signature="imports" expanded="true" />
@@ -52,7 +54,7 @@
       <file leaf-file-name="Main.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/Main.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="678">
+            <state relative-caret-position="3536">
               <caret line="250" column="32" selection-start-line="250" selection-start-column="32" selection-end-line="250" selection-end-column="32" />
             </state>
           </provider>
       <file leaf-file-name="Page.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Page.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="364">
-              <caret line="88" column="39" selection-start-line="88" selection-start-column="39" selection-end-line="88" selection-end-column="39" />
-              <folding>
-                <element signature="e#2787#2795#0" expanded="true" />
-              </folding>
+            <state relative-caret-position="714">
+              <caret line="130" column="5" lean-forward="true" selection-start-line="130" selection-start-column="5" selection-end-line="130" selection-end-column="5" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="fwstk.iml" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/fwstk.iml">
+      <file leaf-file-name="commons_lang3_3_7.xml" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/.idea/libraries/commons_lang3_3_7.xml">
+          <provider selected="true" editor-type-id="text-editor" />
+        </entry>
+      </file>
+      <file leaf-file-name="CustomStripper.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="425">
-              <caret line="25" column="43" selection-start-line="25" selection-start-column="43" selection-end-line="25" selection-end-column="43" />
+            <state relative-caret-position="310">
+              <caret line="27" column="50" selection-start-line="27" selection-start-column="50" selection-end-line="27" selection-end-column="50" />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="fwstk_jar.xml" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/.idea/artifacts/fwstk_jar.xml">
+      <file leaf-file-name="PDFTextStripper.java" pinned="false" current-in-tab="false">
+        <entry file="jar://$USER_HOME$/.ideaLibSources/pdfbox-1.8.13-sources.jar!/org/apache/pdfbox/util/PDFTextStripper.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="187">
-              <caret line="11" column="68" selection-start-line="11" selection-start-column="68" selection-end-line="11" selection-end-column="68" />
+            <state relative-caret-position="321">
+              <caret line="345" column="32" selection-start-line="345" selection-start-column="15" selection-end-line="345" selection-end-column="32" />
+              <folding>
+                <element signature="e#51764#51765#0" expanded="true" />
+                <element signature="e#51820#51821#0" expanded="true" />
+                <element signature="e#59179#59180#0" expanded="true" />
+                <element signature="e#59223#59224#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="commons_lang3_3_7.xml" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/.idea/libraries/commons_lang3_3_7.xml">
-          <provider selected="true" editor-type-id="text-editor" />
-        </entry>
-      </file>
-      <file leaf-file-name="CustomStripper.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java">
+      <file leaf-file-name="TextsThread.java" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/TextsThread.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="21">
-              <caret line="11" column="42" selection-start-line="11" selection-start-column="42" selection-end-line="11" selection-end-column="42" />
+            <state relative-caret-position="2537">
+              <caret line="196" column="61" lean-forward="true" selection-start-line="196" selection-start-column="61" selection-end-line="196" selection-end-column="61" />
             </state>
           </provider>
         </entry>
       <file leaf-file-name="Line.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Line.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="637">
+            <state relative-caret-position="867">
               <caret line="61" column="34" selection-start-line="61" selection-start-column="34" selection-end-line="61" selection-end-column="34" />
               <folding>
                 <element signature="imports" expanded="true" />
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Group.java" pinned="false" current-in-tab="true">
+      <file leaf-file-name="Group.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Group.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="243">
-              <caret line="25" column="32" lean-forward="true" selection-start-line="25" selection-start-column="32" selection-end-line="25" selection-end-column="32" />
+            <state relative-caret-position="617">
+              <caret line="47" column="25" lean-forward="true" selection-start-line="47" selection-start-column="25" selection-end-line="47" selection-end-column="25" />
             </state>
           </provider>
         </entry>
       <find>add</find>
       <find>extractTexts</find>
       <find>layout</find>
+      <find>CustomStripper</find>
+      <find>&lt;/div&gt;</find>
+      <find>getPageEnd</find>
+      <find>writePageStart</find>
+      <find>addMoreFormatting</find>
     </findStrings>
     <dirStrings>
-      <dir>H:\Works\cubeExtranet\fluidbook\tools\fwstk\src</dir>
       <dir>H:\Works\cubeExtranet\fluidbook\tools\fwstk\src\com\fluidbook\fwstk\layout</dir>
       <dir>H:\Works\cubeExtranet\fluidbook\tools\fwstk</dir>
+      <dir>H:\Works\cubeExtranet\fluidbook\tools\fwstk\src</dir>
     </dirStrings>
   </component>
   <component name="GradleLocalSettings">
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/LayoutElement.java" />
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/Link.java" />
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/LayoutStripper.java" />
-        <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java" />
         <option value="$PROJECT_DIR$/src/cube/util/StringUtil.java" />
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/Main.java" />
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Page.java" />
         <option value="$PROJECT_DIR$/.idea/artifacts/fwstk_jar.xml" />
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Word.java" />
         <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Group.java" />
+        <option value="$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java" />
       </list>
     </option>
   </component>
     <detection-done>true</detection-done>
     <sorting>DEFINITION_ORDER</sorting>
   </component>
+  <component name="NodePackageJsonFileManager">
+    <packageJsonPaths />
+  </component>
   <component name="PhpServers">
     <servers />
   </component>
   <component name="ProjectFrameBounds" extendedState="6">
-    <option name="x" value="-8" />
+    <option name="x" value="-1928" />
     <option name="y" value="-8" />
     <option name="width" value="1936" />
     <option name="height" value="1176" />
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
+      <pane id="Scope" />
+      <pane id="AndroidView" />
       <pane id="ProjectPane">
         <subPane>
           <expand>
               <item name="fwstk" type="462c0819:PsiDirectoryNode" />
               <item name="lib" type="462c0819:PsiDirectoryNode" />
             </path>
+            <path>
+              <item name="fwstk" type="b2602c69:ProjectViewProjectNode" />
+              <item name="fwstk" type="462c0819:PsiDirectoryNode" />
+              <item name="out" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="fwstk" type="b2602c69:ProjectViewProjectNode" />
+              <item name="fwstk" type="462c0819:PsiDirectoryNode" />
+              <item name="out" type="462c0819:PsiDirectoryNode" />
+              <item name="artifacts" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="fwstk" type="b2602c69:ProjectViewProjectNode" />
+              <item name="fwstk" type="462c0819:PsiDirectoryNode" />
+              <item name="out" type="462c0819:PsiDirectoryNode" />
+              <item name="artifacts" type="462c0819:PsiDirectoryNode" />
+              <item name="fwstk_jar" type="462c0819:PsiDirectoryNode" />
+            </path>
             <path>
               <item name="fwstk" type="b2602c69:ProjectViewProjectNode" />
               <item name="fwstk" type="462c0819:PsiDirectoryNode" />
           <select />
         </subPane>
       </pane>
-      <pane id="AndroidView" />
       <pane id="PackagesPane" />
-      <pane id="Scope" />
     </panes>
   </component>
   <component name="PropertiesComponent">
       <properties />
       <listeners />
     </configuration>
-    <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android App">
-      <module name="" />
-      <option name="DEPLOY" value="true" />
-      <option name="ARTIFACT_NAME" value="" />
-      <option name="PM_INSTALL_OPTIONS" value="" />
-      <option name="ACTIVITY_EXTRA_FLAGS" value="" />
-      <option name="MODE" value="default_activity" />
-      <option name="TARGET_SELECTION_MODE" value="SHOW_DIALOG" />
-      <option name="PREFERRED_AVD" value="" />
-      <option name="CLEAR_LOGCAT" value="false" />
-      <option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
-      <option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
-      <option name="FORCE_STOP_RUNNING_APP" value="true" />
-      <option name="DEBUGGER_TYPE" value="Java" />
-      <option name="USE_LAST_SELECTED_DEVICE" value="false" />
-      <option name="PREFERRED_AVD" value="" />
-      <Java />
-      <Profilers>
-        <option name="ENABLE_ADVANCED_PROFILING" value="true" />
-        <option name="GAPID_ENABLED" value="false" />
-        <option name="GAPID_DISABLE_PCS" value="false" />
-        <option name="SUPPORT_LIB_ENABLED" value="true" />
-        <option name="INSTRUMENTATION_ENABLED" value="true" />
-      </Profilers>
-      <option name="DEEP_LINK" value="" />
-      <option name="ACTIVITY_CLASS" value="" />
-      <method />
-    </configuration>
     <configuration default="true" type="AndroidRunConfigurationType" factoryName="Android Application">
       <module name="" />
       <option name="DEPLOY" value="true" />
       </Profilers>
       <method />
     </configuration>
-    <configuration default="true" type="Application" factoryName="Application">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="MAIN_CLASS_NAME" value="" />
-      <option name="VM_PARAMETERS" value="" />
-      <option name="PROGRAM_PARAMETERS" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="" />
-      <envs />
-    </configuration>
-    <configuration default="true" type="BashConfigurationType" factoryName="Bash">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="INTERPRETER_PATH" value="C:\Windows\system32\bash.exe" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <option name="SCRIPT_NAME" value="" />
-      <option name="PARAMETERS" value="" />
-      <module name="" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="BatchConfigurationType" factoryName="Batch">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs />
-      <module name="" />
-      <option name="SCRIPT_NAME" value="" />
-      <option name="PARAMETERS" value="" />
-      <method />
-    </configuration>
-    <configuration default="true" type="Cold Fusion runner description" factoryName="Cold Fusion" custom_browser="" web_path="">
-      <method />
-    </configuration>
-    <configuration default="true" type="CucumberJavaRunConfigurationType" factoryName="Cucumber java">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="myFilePath" />
-      <option name="GLUE" />
-      <option name="myNameFilter" />
-      <option name="myGeneratedName" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="VM_PARAMETERS" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="CucumberRunConfigurationType" factoryName="Cucumber">
-      <predefined_log_file id="RUBY_CUCUMBER" enabled="true" />
-      <module name="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
-      <envs />
-      <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
-      <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
-      <EXTENSION ID="RubyCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" track_test_folders="true" runner="rcov" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*.feature" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_TAGS_FILTER" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_NAME_FILTER" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="CUCUMBER_ARGS" VALUE="--color -r features" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="VERBOSE_OPTION" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="CUCUMBER_RUNNER_PATH" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_RUNNER" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="SETTINGS_VERSION" VALUE="2" />
-      <method />
-    </configuration>
-    <configuration default="true" type="DjangoTestsConfigurationType" factoryName="Django tests">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs>
-        <env name="PYTHONUNBUFFERED" value="1" />
-      </envs>
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <option name="ADD_CONTENT_ROOTS" value="true" />
-      <option name="ADD_SOURCE_ROOTS" value="true" />
-      <module name="fwstk" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <option name="TARGET" value="" />
-      <option name="SETTINGS_FILE" value="" />
-      <option name="CUSTOM_SETTINGS" value="false" />
-      <option name="USE_OPTIONS" value="false" />
-      <option name="OPTIONS" value="" />
-      <method />
-    </configuration>
     <configuration default="true" type="FlashRunConfigurationType" factoryName="Flash App">
       <option name="BCName" value="" />
       <option name="IOSSimulatorSdkPath" value="" />
       <option name="trusted" value="true" />
       <method />
     </configuration>
-    <configuration default="true" type="GradleRunConfiguration" factoryName="Gradle">
-      <ExternalSystemSettings>
-        <option name="executionName" />
-        <option name="externalProjectPath" />
-        <option name="externalSystemIdString" value="GRADLE" />
-        <option name="scriptParameters" />
-        <option name="taskDescriptions">
-          <list />
-        </option>
-        <option name="taskNames">
-          <list />
-        </option>
-        <option name="vmOptions" />
-      </ExternalSystemSettings>
-      <method />
-    </configuration>
-    <configuration default="true" type="JRubyCucumberRunConfigurationType" factoryName="JRuby Cucumber">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="VM_PARAMETERS" value="-Dforce.jruby.jit=true -Djruby.debug.fullTrace=true" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="" />
-      <envs />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*.feature" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_TAGS_FILTER" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="TEST_NAME_FILTER" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="CUCUMBER_ARGS" VALUE="--color -r features" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="VERBOSE_OPTION" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="CUCUMBER_RUNNER_PATH" VALUE="" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_RUNNER" VALUE="false" />
-      <CUCUMBER_RUN_CONFIG_SETTINGS_ID NAME="SETTINGS_VERSION" VALUE="2" />
-      <method />
-    </configuration>
-    <configuration default="true" type="Java Scratch" factoryName="Java Scratch">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="SCRATCH_FILE_ID" value="0" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="VM_PARAMETERS" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="ENABLE_SWING_INSPECTOR" value="false" />
-      <option name="ENV_VARIABLES" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="JavaScriptTestRunnerProtractor" factoryName="Protractor">
-      <config-file value="" />
-      <node-interpreter value="project" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
-      <method />
-    </configuration>
-    <configuration default="true" type="JetRunConfigurationType" factoryName="Kotlin">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="MAIN_CLASS_NAME" />
-      <option name="VM_PARAMETERS" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="WORKING_DIRECTORY" />
-      <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
-      <option name="ALTERNATIVE_JRE_PATH" />
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <module name="fwstk" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="KotlinStandaloneScriptRunConfigurationType" factoryName="Kotlin script">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <option name="filePath" />
-      <option name="vmParameters" />
-      <option name="alternativeJrePath" />
-      <option name="programParameters" />
-      <option name="passParentEnvs" value="true" />
-      <option name="workingDirectory" />
-      <option name="isAlternativeJrePathEnabled" value="false" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="NodeJSConfigurationType" factoryName="Node.js" path-to-node="project" working-dir="">
-      <method />
-    </configuration>
-    <configuration default="true" type="PHPUnitRunConfigurationType" factoryName="PHPUnit">
-      <TestRunner />
-      <method />
-    </configuration>
-    <configuration default="true" type="PhpLocalRunConfigurationType" factoryName="PHP Console">
-      <method />
-    </configuration>
-    <configuration default="true" type="PyBehaveRunConfigurationType" factoryName="Behave">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs />
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <option name="ADD_CONTENT_ROOTS" value="true" />
-      <option name="ADD_SOURCE_ROOTS" value="true" />
-      <module name="fwstk" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <option name="ADDITIONAL_ARGS" value="" />
-      <method />
-    </configuration>
-    <configuration default="true" type="PyLettuceRunConfigurationType" factoryName="Lettuce">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs />
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <option name="ADD_CONTENT_ROOTS" value="true" />
-      <option name="ADD_SOURCE_ROOTS" value="true" />
-      <module name="fwstk" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <option name="ADDITIONAL_ARGS" value="" />
-      <method />
-    </configuration>
-    <configuration default="true" type="PythonConfigurationType" factoryName="Python">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs>
-        <env name="PYTHONUNBUFFERED" value="1" />
-      </envs>
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <option name="ADD_CONTENT_ROOTS" value="true" />
-      <option name="ADD_SOURCE_ROOTS" value="true" />
-      <module name="fwstk" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <option name="SCRIPT_NAME" value="" />
-      <option name="PARAMETERS" value="" />
-      <option name="SHOW_COMMAND_LINE" value="false" />
-      <option name="EMULATE_TERMINAL" value="false" />
-      <method />
-    </configuration>
-    <configuration default="true" type="Remote" factoryName="Remote">
-      <option name="USE_SOCKET_TRANSPORT" value="true" />
-      <option name="SERVER_MODE" value="false" />
-      <option name="SHMEM_ADDRESS" value="javadebug" />
-      <option name="HOST" value="localhost" />
-      <option name="PORT" value="5005" />
-    </configuration>
-    <configuration default="true" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
-      <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
-      <module name="" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="TestUnitRunConfigurationType" factoryName="Test::Unit/Shoulda/Minitest">
-      <predefined_log_file id="RUBY_TESTUNIT" enabled="true" />
-      <module name="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
-      <envs />
-      <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
-      <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
-      <EXTENSION ID="RubyCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" track_test_folders="true" runner="rcov" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_METHOD_NAME" VALUE="" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
-      <RTEST_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_OPTIONS" VALUE="" />
-      <method />
-    </configuration>
-    <configuration default="true" type="Tox" factoryName="Tox">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs />
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <option name="ADD_CONTENT_ROOTS" value="true" />
-      <option name="ADD_SOURCE_ROOTS" value="true" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <module name="fwstk" />
-      <method />
-    </configuration>
-    <configuration default="true" type="#PerlConfigurationType" factoryName="Perl" show_console_on_std_err="false" show_console_on_std_out="false">
-      <option name="alternativeSdkPath" />
-      <option name="compileTimeBreakpointsEnabled" value="false" />
-      <option name="consoleCharset" />
-      <option name="envs">
-        <map />
-      </option>
-      <option name="nonInteractiveModeEnabled" value="false" />
-      <option name="passParentEnvs" value="true" />
-      <option name="perlParameters" value="" />
-      <option name="programParameters" />
-      <option name="scriptPath" />
-      <option name="useAlternativeSdk" value="false" />
-      <option name="workingDirectory" />
-      <option name="SCRIPT_PATH" />
-      <option name="PROGRAM_PARAMETERS" />
-      <option name="PERL_PARAMETERS" value="" />
-      <option name="WORKING_DIRECTORY" />
-      <option name="ENVS">
-        <map />
-      </option>
-      <option name="PASS_PARENT_ENVS" value="true" />
-      <option name="CHARSET" />
-      <option name="USE_ALTERNATIVE_SDK" value="false" />
-      <option name="ALTERNATIVE_SDK_PATH" />
-      <option name="scriptCharset" value="utf8" />
-      <option name="startMode" value="RUN" />
-      <option name="isNonInteractiveModeEnabled" value="false" />
-      <option name="isCompileTimeBreakpointsEnabled" value="false" />
-      <option name="initCode" value="" />
-      <method />
-    </configuration>
-    <configuration default="true" type="#org.jetbrains.idea.devkit.run.PluginConfigurationType" factoryName="Plugin">
-      <module name="" />
-      <option name="VM_PARAMETERS" value="-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea" />
-      <option name="PROGRAM_PARAMETERS" />
-      <predefined_log_file id="idea.log" enabled="true" />
-    </configuration>
-    <configuration default="true" type="js.build_tools.npm" factoryName="npm">
-      <command value="run" />
-      <scripts />
-      <node-interpreter value="project" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="mocha-javascript-test-runner" factoryName="Mocha">
-      <node-interpreter>project</node-interpreter>
-      <node-options />
-      <working-directory />
-      <pass-parent-env>true</pass-parent-env>
-      <envs />
-      <ui />
-      <extra-mocha-options />
-      <test-kind>DIRECTORY</test-kind>
-      <test-directory />
-      <recursive>false</recursive>
-      <method />
-    </configuration>
-    <configuration default="true" type="osgi.bnd.run" factoryName="Run Launcher">
-      <method />
-    </configuration>
-    <configuration default="true" type="osgi.bnd.run" factoryName="Test Launcher (JUnit)">
-      <method />
-    </configuration>
     <configuration default="true" type="tests" factoryName="Attests">
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
       <option name="USE_PATTERN" value="false" />
       <method />
     </configuration>
-    <configuration default="true" type="tests" factoryName="Doctests">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <envs />
-      <option name="SDK_HOME" value="" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="IS_MODULE_SDK" value="false" />
-      <option name="ADD_CONTENT_ROOTS" value="true" />
-      <option name="ADD_SOURCE_ROOTS" value="true" />
-      <module name="fwstk" />
-      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
-      <option name="SCRIPT_NAME" value="" />
-      <option name="CLASS_NAME" value="" />
-      <option name="METHOD_NAME" value="" />
-      <option name="FOLDER_NAME" value="" />
-      <option name="TEST_TYPE" value="TEST_SCRIPT" />
-      <option name="PATTERN" value="" />
-      <option name="USE_PATTERN" value="false" />
-      <method />
-    </configuration>
     <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
       <node-interpreter>project</node-interpreter>
       <node-options />
       <workItem from="1515419571657" duration="12314000" />
       <workItem from="1515494590332" duration="6979000" />
       <workItem from="1522337389921" duration="866000" />
+      <workItem from="1530632372632" duration="1612000" />
     </task>
     <task id="LOCAL-00001" summary="wip #1111 @0.5">
       <created>1487172253077</created>
     <servers />
   </component>
   <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="75291000" />
+    <option name="totallyTimeSpent" value="76903000" />
   </component>
   <component name="TodoView">
     <todo-panel id="selected-file">
     </todo-panel>
   </component>
   <component name="ToolWindowManager">
-    <frame x="-8" y="-8" width="1936" height="1176" extended-state="6" />
+    <frame x="-1928" y="-8" width="1936" height="1176" extended-state="6" />
     <editor active="true" />
     <layout>
       <window_info anchor="right" id="Palette" order="4" />
-      <window_info anchor="bottom" id="TODO" order="6" weight="0.32934782" />
-      <window_info id="Palette&#9;" order="1" />
-      <window_info id="Image Layers" order="2" />
-      <window_info anchor="right" id="Capture Analysis" order="5" />
       <window_info anchor="bottom" id="Event Log" order="7" sideWeight="0.52132195" side_tool="true" weight="0.32934782" />
       <window_info anchor="right" id="Maven Projects" order="6" />
-      <window_info anchor="bottom" id="Database Changes" show_stripe_button="false" />
-      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.47867805" weight="0.32934782" />
-      <window_info anchor="bottom" id="Version Control" order="8" weight="0.32934782" />
-      <window_info anchor="bottom" id="Terminal" order="9" weight="0.32934782" />
+      <window_info anchor="bottom" id="Database Changes" order="8" show_stripe_button="false" />
       <window_info id="Capture Tool" order="3" />
-      <window_info anchor="right" id="Remote Host" order="7" visible="true" weight="0.32995737" />
+      <window_info anchor="right" id="Remote Host" order="7" visible="true" weight="0.21108742" />
       <window_info anchor="right" id="Designer" order="8" />
-      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.1609808" />
       <window_info anchor="right" id="Database" order="9" />
-      <window_info anchor="right" id="SciView" order="0" />
       <window_info anchor="right" id="Structure" order="13" side_tool="true" weight="0.25" />
       <window_info anchor="right" id="Ant Build" order="2" weight="0.25" />
       <window_info id="UI Designer" order="4" />
-      <window_info anchor="right" id="Theme Preview" order="10" />
       <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" weight="0.32934782" />
+      <window_info anchor="bottom" id="Messages" order="10" sideWeight="0.48720682" weight="0.32755297" />
+      <window_info id="Palette&#9;" order="1" />
+      <window_info id="Image Layers" order="2" />
+      <window_info anchor="right" id="Capture Analysis" order="5" />
+      <window_info anchor="bottom" id="File Transfer" order="11" visible="true" weight="0.32851636" />
+      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.47867805" weight="0.32934782" />
+      <window_info anchor="bottom" id="Version Control" order="8" weight="0.32934782" />
+      <window_info anchor="bottom" id="Terminal" order="9" weight="0.32934782" />
+      <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.16257995" />
+      <window_info anchor="bottom" id="Find" order="1" sideWeight="0.49573562" weight="0.32934782" />
+      <window_info anchor="right" id="SciView" order="0" />
+      <window_info anchor="right" id="Theme Preview" order="10" />
       <window_info id="Favorites" order="5" side_tool="true" />
-      <window_info anchor="bottom" id="Messages" order="10" sideWeight="0.48720682" weight="0.32826087" />
       <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
       <window_info anchor="right" id="Commander" internal_type="SLIDING" order="1" type="SLIDING" weight="0.4" />
-      <window_info anchor="bottom" id="Find" order="1" sideWeight="0.49573562" weight="0.32934782" />
+      <window_info anchor="right" id="Data View" order="12" />
       <window_info id="Nl-Palette" order="6" />
       <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
-      <window_info anchor="right" id="Properties" order="11" />
       <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="right" content_ui="combo" id="Hierarchy" order="3" weight="0.25" />
-      <window_info anchor="right" id="Data View" order="12" />
-      <window_info anchor="bottom" id="File Transfer" order="11" weight="0.32934782" />
+      <window_info anchor="right" id="Properties" order="11" />
     </layout>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
         </state>
       </provider>
     </entry>
-    <entry file="jar://$USER_HOME$/.ideaLibSources/pdfbox-1.8.13-sources.jar!/org/apache/pdfbox/util/PDFTextStripper.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state>
-          <caret line="468" column="13" selection-start-line="468" selection-start-column="13" selection-end-line="468" selection-end-column="13" />
-        </state>
-      </provider>
-    </entry>
     <entry file="jar://C:/Program Files/Java/jdk1.8.0_152/src.zip!/java/util/ArrayList.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="7140">
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/TextsThread.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="121">
-          <caret line="183" column="52" selection-start-line="183" selection-start-column="52" selection-end-line="183" selection-end-column="52" />
-          <folding>
-            <element signature="e#6626#6627#0" />
-            <element signature="e#6671#6672#0" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
     <entry file="jar://C:/Program Files/Java/jdk1.8.0_152/src.zip!/java/lang/Object.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="197">
           <caret line="147" column="19" selection-start-line="147" selection-start-column="19" selection-end-line="147" selection-end-column="19" />
-          <folding>
-            <element signature="e#5748#5749#0" />
-            <element signature="e#5784#5785#0" />
-          </folding>
         </state>
       </provider>
     </entry>
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="374">
           <caret line="25" column="47" selection-start-line="25" selection-start-column="47" selection-end-line="25" selection-end-column="47" />
-          <folding>
-            <element signature="e#729#730#0" expanded="true" />
-            <element signature="e#752#753#0" expanded="true" />
-          </folding>
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/.idea/libraries/commons_lang3_3_7.xml">
       <provider selected="true" editor-type-id="text-editor" />
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="21">
-          <caret line="11" column="42" selection-start-line="11" selection-start-column="42" selection-end-line="11" selection-end-column="42" />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/Main.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="678">
+        <state relative-caret-position="3536">
           <caret line="250" column="32" selection-start-line="250" selection-start-column="32" selection-end-line="250" selection-end-column="32" />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Page.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="364">
-          <caret line="88" column="39" selection-start-line="88" selection-start-column="39" selection-end-line="88" selection-end-column="39" />
-          <folding>
-            <element signature="e#2787#2795#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Line.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="637">
+        <state relative-caret-position="867">
           <caret line="61" column="34" selection-start-line="61" selection-start-column="34" selection-end-line="61" selection-end-column="34" />
           <folding>
             <element signature="imports" expanded="true" />
     </entry>
     <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Word.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="323">
+        <state relative-caret-position="255">
           <caret line="24" column="97" selection-start-line="24" selection-start-column="97" selection-end-line="24" selection-end-column="97" />
           <folding>
             <element signature="imports" expanded="true" />
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Group.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="617">
+          <caret line="47" column="25" lean-forward="true" selection-start-line="47" selection-start-column="25" selection-end-line="47" selection-end-column="25" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/TextsThread.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2537">
+          <caret line="196" column="61" lean-forward="true" selection-start-line="196" selection-start-column="61" selection-end-line="196" selection-end-column="61" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Page.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="714">
+          <caret line="130" column="5" lean-forward="true" selection-start-line="130" selection-start-column="5" selection-end-line="130" selection-end-column="5" />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/LayoutStripper.java">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="850">
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/layout/Group.java">
+    <entry file="jar://$USER_HOME$/.ideaLibSources/pdfbox-1.8.13-sources.jar!/org/apache/pdfbox/util/PDFTextStripper.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="321">
+          <caret line="345" column="32" selection-start-line="345" selection-start-column="15" selection-end-line="345" selection-end-column="32" />
+          <folding>
+            <element signature="e#51764#51765#0" expanded="true" />
+            <element signature="e#51820#51821#0" expanded="true" />
+            <element signature="e#59179#59180#0" expanded="true" />
+            <element signature="e#59223#59224#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/com/fluidbook/fwstk/CustomStripper.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="243">
-          <caret line="25" column="32" lean-forward="true" selection-start-line="25" selection-start-column="32" selection-end-line="25" selection-end-column="32" />
+        <state relative-caret-position="310">
+          <caret line="27" column="50" selection-start-line="27" selection-start-column="50" selection-end-line="27" selection-end-column="50" />
         </state>
       </provider>
     </entry>
index da2f5dcf6f2fb34d590826468fe81a27ba3998a4..4be76c959e54f85b9dcb9a74d18046fe0c884b76 100644 (file)
Binary files a/fluidbook/tools/fwstk/out/artifacts/fwstk_jar/fwstk.jar and b/fluidbook/tools/fwstk/out/artifacts/fwstk_jar/fwstk.jar differ
index 209bffb0f526f24ed2fcf880b4697cea848c3da6..6bcfb94a5bf15692c8e34a7703302cd20eafa1cc 100644 (file)
@@ -51,9 +51,9 @@ class wsUtil
                                }\r
 \r
                                if ($assoc) {\r
-                                       $worksheets[$title] = $worksheet->toArray(null, true, true);\r
-                               } else {\r
                                        $worksheets[$title] = self::_assocSheet($worksheet->toArray(null, true, true));\r
+                               } else {\r
+                                       $worksheets[$title] = $worksheet->toArray(null, true, true);\r
                                }\r
                        }\r
                        file_put_contents($cacheFile, json_encode($worksheets));\r
index 559a8ba8868c40db0b089b4e0b176c124330216a..852ac734dded1bc1da3a81852870a963f35e010f 100644 (file)
@@ -2,7 +2,7 @@
 
 class wsHTML5Compiler
 {
-       protected static $resolutions = array(150, 300);
+       public static $resolutions = array(150, 300);
        public $maxRes = 300;
 
        public $jsFiles = array(
@@ -98,17 +98,17 @@ class wsHTML5Compiler
        public $pluginCSS = array();
        public $pluginJs = array();
        public $htmlmultimedia = array();
-       protected $cssX = array();
-       protected $cssY = array();
-       protected $cssWidths = array();
-       protected $pdf2htmlRatio;
-       protected $scale;
-       protected $multiply;
-       protected $div = array();
-       protected $numerotation;
-       protected $fontDocs = array();
-       protected $dir;
-       protected $z = 3;
+       public $cssX = array();
+       public $cssY = array();
+       public $cssWidths = array();
+       public $pdf2htmlRatio;
+       public $scale;
+       public $multiply;
+       public $div = array();
+       public $numerotation;
+       public $fontDocs = array();
+       public $dir;
+       public $z = 3;
        public $vdir;
        public $wdir;
 
@@ -117,52 +117,55 @@ class wsHTML5Compiler
         * @var wsBook
         */
        public $book;
-       protected $pages;
-       protected $theme;
+       public $pages;
+       public $theme;
        public $version;
        public $book_id;
-       protected $themeRoot;
+       public $themeRoot;
 
        /**
         *
         * @var wsDAOBook
         */
-       protected $daoBook;
-       protected $needToRecompileContents = true;
-       protected $needToRecompileSettings = true;
+       public $daoBook;
+       public $needToRecompileContents = true;
+       public $needToRecompileSettings = true;
        public $width;
        public $height;
-       protected $cssWidth;
-       protected $cssHeight;
-       protected $cssOneWidth;
-       protected $cssOneHeight;
-       protected $cssScale;
-       protected $cssSVGScale;
-       protected $optimalWidth = 567;
-       protected $optimalHeight = 709;
-       protected $additionalConfig = array();
-       protected $fontScale = 1;
-       protected $cache = array();
-       protected $backgroundsPrefix = array();
-       protected $svg = true;
-       protected $config = array();
-       protected $assets = '';
-       protected $phonegap = false;
-       protected $phonegapVersion;
-       protected $standalone = false;
-       protected $hiddenContents = array();
-       protected $appcache;
-       protected $home;
-       protected $widget = true;
-       protected $multiApp = false;
-       protected $pageLabels = array();
-       protected $stylesheets = array();
-       protected $logfp = null;
-       protected $logtime = null;
-       protected $beginBody = array();
-       protected $seoArticles = [];
-       protected $securityPolicyWhitelist = ['*.google-analytics.com', '*.youtube.com', '*.ytimg.com'];
-       protected $seoAdvanced = null;
+       public $cssWidth;
+       public $cssHeight;
+       public $cssOneWidth;
+       public $cssOneHeight;
+       public $cssScale;
+       public $cssSVGScale;
+       public $optimalWidth = 567;
+       public $optimalHeight = 709;
+       public $additionalConfig = array();
+       public $fontScale = 1;
+       public $cache = array();
+       public $backgroundsPrefix = array();
+       public $svg = true;
+       public $config = array();
+       public $assets = '';
+       public $phonegap = false;
+       public $phonegapVersion;
+       public $standalone = false;
+       public $hiddenContents = array();
+       public $appcache;
+       public $home;
+       public $widget = true;
+       public $multiApp = false;
+       public $pageLabels = array();
+       public $stylesheets = array();
+       public $logfp = null;
+       public $logtime = null;
+       public $beginBody = array();
+       public $seoArticles = [];
+       public $securityPolicyWhitelist = ['*.google-analytics.com', '*.youtube.com', '*.ytimg.com'];
+       /**
+        * @var wsHTML5Seo
+        */
+       public $seo = null;
 
 
        function __construct($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false, $appcache = false, $home = false)
@@ -358,6 +361,7 @@ class wsHTML5Compiler
                $this->log('CSS written');
                $this->writeLangs();
                $this->log('Langs written');
+               $this->writeSEO();
                $this->writeIndex();
                $this->log('Index written');
                $this->writeSounds();
@@ -368,7 +372,6 @@ class wsHTML5Compiler
                $this->log('Extras written');
                $this->writeJs();
                $this->log('Js written');
-               $this->writeSEO();
                $this->vdir->sync($delete);
                $this->log('Files Synced');
        }
@@ -478,12 +481,11 @@ class wsHTML5Compiler
        {
                global $core;
 
-               $html = file_get_contents($this->assets . '/_index.html');
+               $html = $this->seo->pages[1]->getHTML();
                $uhtml = $html;
 
                $titre = $this->book->parametres->title;
 
-
                $daoSignature = new wsDAOSignature($core->con);
                $signature = $daoSignature->selectById($this->book->parametres->signature);
 
@@ -502,19 +504,6 @@ class wsHTML5Compiler
 
                $bgcolor = $this->theme->parametres->loadingBackColor;
 
-               // Google analytics
-               $ga = '';
-               if ($this->book->parametres->googleAnalytics != '') {
-                       $ga = cubePage::googleAnalytics($this->book->parametres->googleAnalytics);
-               }
-               if ($this->book->parametres->googleAnalyticsCustom != '') {
-                       $ga .= $this->book->parametres->googleAnalyticsCustom;
-               }
-
-               $statsfooter = '';
-               if ($this->book->parametres->statsCustom != '') {
-                       $statsfooter = $this->book->parametres->statsCustom;
-               }
                // Feuilles de style
                $sheets = array_merge($this->stylesheets, $this->specialCSS);
 
@@ -551,7 +540,6 @@ class wsHTML5Compiler
                        $script .= '<script type="text/javascript" charset="utf-8" src="' . $p . '"></script>' . "\n";
                }
                $script .= $iscript;
-               $description = '<meta name="description" content="' . html::escapeHTML(isset($this->book->parametres->seoDescription) && $this->book->parametres->seoDescription ? $this->book->parametres->seoDescription : $titre . ' - Powered by Fluidbook') . '">';
 
                $socialTitle = $this->book->parametres->facebook_title ? $this->book->parametres->facebook_title : $titre;
                $socialDescription = $this->book->parametres->seoDescription ? $this->book->parametres->seoDescription : $this->book->parametres->seoDescription;
@@ -630,7 +618,7 @@ class wsHTML5Compiler
                if ($this->phonegap) {
                        $csp = "<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self' data: gap: 'unsafe-inline' *; style-src 'self' 'unsafe-inline'; font-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' " . implode(' ', array_unique($this->securityPolicyWhitelist)) . "; img-src * data:\">";
                }
-               $vars = array('titre', 'credits', 'statsfooter', 'ga', 'style', 'script', 'pagesContents', 'description', 'print', 'hiddenContents', 'splash', 'cache', 'bgcolor', 'message', 'favicon', 'svg', 'beginbody', 'csp', 'opengraph', 'twittercard');
+               $vars = array('credits', 'style', 'script', 'pagesContents', 'print', 'hiddenContents', 'splash', 'cache', 'bgcolor', 'message', 'favicon', 'svg', 'beginbody', 'csp', 'opengraph', 'twittercard');
                foreach ($vars as $v) {
                        if (isset($$v)) {
                                $html = str_replace('<!-- $' . $v . ' -->', $$v, $html);
@@ -663,13 +651,13 @@ class wsHTML5Compiler
 
                $thtml = $uhtml;
 
-               $vars = array('titre', 'credits', 'statsfooter', 'ga', 'style', 'script', 'pagesContents', 'print', 'hiddenContents', 'splash', 'cache', 'bgcolor', 'message', 'favicon');
+               $vars = array('credits', 'style', 'script', 'pagesContents', 'print', 'hiddenContents', 'splash', 'cache', 'bgcolor', 'message', 'favicon');
                foreach ($vars as $v) {
                        $uhtml = str_replace('<!-- $' . $v . ' -->', $$v, $uhtml);
                }
 
                $script .= "\n\t\t" . '<script type="text/javascript" charset="utf-8">window.tester = true;</script>';
-               $vars = array('titre', 'credits', 'statsfooter', 'ga', 'style', 'script', 'print', 'hiddenContents', 'splash', 'message');
+               $vars = array('credits', 'style', 'script', 'print', 'hiddenContents', 'splash', 'message');
                foreach ($vars as $v) {
                        $thtml = str_replace('<!-- $' . $v . ' -->', $$v, $thtml);
                }
@@ -711,19 +699,7 @@ class wsHTML5Compiler
                        }
                        $this->vdir->file_put_contents('p/' . $seoArticle['url'], $html);
                }
-
-               // Define default seo contents
-               $seoContents = [];
-
-               foreach ($this->pages as $page => $infos) {
-                       $c = ['page' => $page,
-                               'text' => file_get_contents(wsDocument::getDir($infos['document_id']) . 'h' . $infos['document_page'] . '.txt')];
-                       $seoContents[$page] = $c;
-               }
-
-               if ($this->book->parametres->seoAdvanced) {
-                       $this->seoAdvanced = wsUtil::excelToArray($this->wdir . '/' . $this->book->parametres->seoAdvanced,true);
-               }
+               $this->seo = new wsHTML5Seo($this);
        }
 
        protected function writeScorm()
diff --git a/inc/ws/Util/html5/advancedseo/class.ws.html5.seo.php b/inc/ws/Util/html5/advancedseo/class.ws.html5.seo.php
new file mode 100644 (file)
index 0000000..4f8661f
--- /dev/null
@@ -0,0 +1,183 @@
+<?php\r
+\r
+class wsHTML5Seo\r
+{\r
+       /**\r
+        * @var wsHTML5Compiler\r
+        */\r
+       public $compiler;\r
+       public $pages;\r
+       protected $_nav = null;\r
+\r
+\r
+       public function __construct($compiler)\r
+       {\r
+               $this->compiler = $compiler;\r
+               // Define default seo contents\r
+               $this->pages = [];\r
+\r
+               foreach ($compiler->pages as $page => $infos) {\r
+                       $p = new wsHTML5SeoPage($this);\r
+                       $p->page = $page;\r
+                       $p->title = $this->_getPageLabel($page);\r
+                       $p->text = $this->getTextContent($infos);\r
+                       $p->description = $this->compiler->book->parametres->seoDescription ? $this->compiler->book->parametres->seoDescription : $this->compiler->book->parametres->title . ' - Powered by Fluidbook';\r
+                       $p->keywords = $this->compiler->book->parametres->seoKeywords;\r
+                       $p->robots = $this->compiler->book->parametres->seoRobots ? 'index,follow' : 'noindex,nofollow';\r
+\r
+                       // Google analytics\r
+                       $p->ua = '';\r
+                       if ($this->compiler->book->parametres->googleAnalytics != '') {\r
+                               $p->ua .= cubePage::googleAnalytics($this->compiler->book->parametres->googleAnalytics);\r
+                       }\r
+                       if ($this->compiler->book->parametres->googleAnalyticsCustom != '') {\r
+                               $p->ua .= $this->compiler->book->parametres->googleAnalyticsCustom;\r
+                       }\r
+\r
+                       if ($this->compiler->book->parametres->statsCustom != '') {\r
+                               $p->footer = $this->compiler->book->parametres->statsCustom;\r
+                       }\r
+\r
+                       $this->pages[$page] = $p;\r
+               }\r
+\r
+\r
+               if ($compiler->book->parametres->seoAdvanced) {\r
+                       $sheets = wsUtil::excelToArray($compiler->wdir . '/' . $compiler->book->parametres->seoAdvanced, true);\r
+                       foreach ($sheets as $sheet) {\r
+                               $a = $sheet;\r
+                               break;\r
+                       }\r
+                       $minPage = 100000000;\r
+                       foreach ($a as $item) {\r
+                               $minPage = min($minPage, $item['page']);\r
+                       }\r
+                       $offsetPage = -($minPage - 1);\r
+\r
+                       foreach ($a as $item) {\r
+                               $page = $item['page'] + $offsetPage;\r
+                               foreach ($item as $k => $v) {\r
+                                       if ($k == 'page') {\r
+                                               continue;\r
+                                       }\r
+                                       $this->pages[$page]->$k = $v;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       public function getTextContent($infos)\r
+       {\r
+               switch ($this->compiler->book->parametres->textExtraction) {\r
+                       case 'poppler':\r
+                               $prefix = 'p';\r
+                               break;\r
+                       case 'fluidbook':\r
+                               $prefix = 'f';\r
+                               break;\r
+                       default:\r
+                               $prefix = '';\r
+                               break;\r
+               }\r
+\r
+               return file_get_contents(wsDocument::getDir($infos['document_id']) . $prefix . 'h' . $infos['document_page'] . '.txt');\r
+       }\r
+\r
+       public function _getPageLabel($page)\r
+       {\r
+               $res = $this->compiler->book->parametres->title;\r
+               foreach ($this->compiler->book->chapters as $chapter) {\r
+                       $p = $this->compiler->virtualToPhysical($chapter->page);\r
+                       if ($page < $p) {\r
+                               continue;\r
+                       }\r
+                       if ($page >= $p) {\r
+                               $res = $chapter->label;\r
+                       }\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public function getNav()\r
+       {\r
+               if (null == $this->_nav) {\r
+                       $this->_nav = '<nav>';\r
+                       foreach ($this->pages as $page => $p) {\r
+                               $this->_nav .= '<a href="' . $p->getUrl() . '">' . $p->title . '</a>';\r
+                       }\r
+                       $this->_nav .= '</nav>';\r
+               }\r
+               return $this->_nav;\r
+       }\r
+}\r
+\r
+class wsHTML5SeoPage\r
+{\r
+       public $page;\r
+       public $text;\r
+       public $title;\r
+       public $description;\r
+       public $url = null;\r
+       public $h1;\r
+       public $ua;\r
+       public $canonical;\r
+       public $prev;\r
+       public $next;\r
+       public $keywords;\r
+       public $robots;\r
+       public $footer;\r
+\r
+       /**\r
+        * @var wsHTML5Seo\r
+        */\r
+       public $_container;\r
+\r
+\r
+       public function __construct($container)\r
+       {\r
+               $this->_container = $container;\r
+       }\r
+\r
+       public function getHTML()\r
+       {\r
+               $compiler = $this->_container->compiler;\r
+               $html = file_get_contents($this->_container->compiler->assets . '/_index.html');\r
+\r
+\r
+               $vars = ['description' => $this->description ? '<meta name="description" content="' . $this->description . '">' : '',\r
+                       'keywords' => $this->keywords ? '<meta name="keywords" content="' . $this->keywords . '">' : '',\r
+                       'titre' => $this->title,\r
+                       'canonical' => $this->canonical ? '<link rel="canonical" href="' . $this->canonical . '">' : '',\r
+                       'prev' => $this->prev ? '<meta name="prev" href="' . $this->prev . '">' : '',\r
+                       'next' => $this->next ? '<meta name="next" href="' . $this->next . '">' : '',\r
+                       'robots' => $this->robots ? '<meta name="robots" content="' . $this->robots . '">' : '',\r
+                       'statsfooter' => $this->footer,\r
+                       'ga' => $this->ua,\r
+                       'seoContent' => $this->getSEOContent()];\r
+\r
+               foreach ($vars as $k => $var) {\r
+                       $html = str_replace('<!-- $' . $k . ' -->', $var, $html);\r
+               }\r
+\r
+               return $html;\r
+       }\r
+\r
+       public function getSEOContent()\r
+       {\r
+               $res = '';\r
+               if (null !== $this->h1) {\r
+                       $res .= '<h1>' . htmlentities($this->h1) . '</h1>';\r
+               }\r
+               $res .= $this->text;\r
+               $res .= $this->_container->getNav();\r
+               return $res;\r
+       }\r
+\r
+       public function getURL()\r
+       {\r
+               if (null === $this->url) {\r
+                       return $this->page . '-' . CubeIT_Text::str2URL($this->title);\r
+               }\r
+               return $this->url;\r
+       }\r
+}
\ No newline at end of file
index 38cc1bc01f001167d9846b2aaf993860471201a4..a221c296107b5745b620fccbe7b9cbaea634ee71 100644 (file)
@@ -1,9 +1,11 @@
 <?php\r
 \r
-class wsHTML5 {\r
+class wsHTML5\r
+{\r
        protected static $uaPrefixes = array('-moz-', '-webkit-', '-o-', '-ms-', '');\r
 \r
-       public static function compilerFactory($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false, $appcache = false, $home = false) {\r
+       public static function compilerFactory($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false, $appcache = false, $home = false)\r
+       {\r
                if (is_null($version)) {\r
                        global $core;\r
                        $dao = new wsDAOBook($core->con);\r
@@ -20,13 +22,13 @@ class wsHTML5 {
 \r
                $branchDir = __DIR__ . '/' . $branch . '/';\r
                $masterDir = __DIR__ . '/master/';\r
-               $files = array('class.ws.html5.compiler.php', 'class.ws.html5.links.php');\r
+               $files = array('class.ws.html5.compiler.php', 'class.ws.html5.links.php', 'class.ws.html5.seo.php');\r
 \r
                if (!class_exists('wsHTML5Compiler', false)) {\r
                        foreach ($files as $file) {\r
                                if (file_exists($branchDir . $file)) {\r
                                        require_once $branchDir . $file;\r
-                               } else {\r
+                               } else if (file_exists($masterDir . $file)) {\r
                                        require_once $masterDir . $file;\r
                                }\r
                        }\r
@@ -35,7 +37,8 @@ class wsHTML5 {
                return new wsHTML5Compiler($book_id, $version, $phonegap, $phonegapVersion, $dir, $standalone, $appcache, $home);\r
        }\r
 \r
-       public static function getPhonegapVersion($v = 'latest') {\r
+       public static function getPhonegapVersion($v = 'latest')\r
+       {\r
                if ($v != 'latest') {\r
                        return $v;\r
                }\r
@@ -44,7 +47,8 @@ class wsHTML5 {
                return array_pop($versions);\r
        }\r
 \r
-       public static function getPhonegapVersions() {\r
+       public static function getPhonegapVersions()\r
+       {\r
                $versions = array();\r
                $phonegap_dir = WS_COMPILE_ASSETS . '/_html5/js/libs/phonegap';\r
 \r
@@ -62,7 +66,8 @@ class wsHTML5 {
                return $versions;\r
        }\r
 \r
-       public static function writeCSSUA($property, $value) {\r
+       public static function writeCSSUA($property, $value)\r
+       {\r
                $res = array();\r
                foreach (self::$uaPrefixes as $prefix) {\r
                        $res[] = $prefix . $property . ':' . $value;\r
@@ -70,7 +75,8 @@ class wsHTML5 {
                return implode(';', $res);\r
        }\r
 \r
-       public static function colorToArray($color, $forceAlpha = null) {\r
+       public static function colorToArray($color, $forceAlpha = null)\r
+       {\r
                $color = ltrim($color, '#');\r
                if (strlen($color) == 6) {\r
                        $hex = $color;\r
@@ -87,7 +93,8 @@ class wsHTML5 {
                return array('hex' => strtoupper($hex), 'opacity' => number_format($alpha, 3, '.', ''));\r
        }\r
 \r
-       public static function colorToCSS($color, $forceAlpha = null) {\r
+       public static function colorToCSS($color, $forceAlpha = null)\r
+       {\r
                return CubeIT_Graphics_Color::colorToCSS($color, $forceAlpha);\r
        }\r
 }
\ No newline at end of file