diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /systems/android |
Initial commit
Diffstat (limited to 'systems/android')
135 files changed, 19907 insertions, 0 deletions
diff --git a/systems/android/hktex/HKtex2/.classpath b/systems/android/hktex/HKtex2/.classpath new file mode 100644 index 0000000000..7bc01d9a9c --- /dev/null +++ b/systems/android/hktex/HKtex2/.classpath @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="gen"/> + <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> + <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> + <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/> + <classpathentry kind="output" path="bin/classes"/> +</classpath> diff --git a/systems/android/hktex/HKtex2/.project b/systems/android/hktex/HKtex2/.project new file mode 100644 index 0000000000..75282a5bf6 --- /dev/null +++ b/systems/android/hktex/HKtex2/.project @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>HKtex2</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>com.android.ide.eclipse.adt.ApkBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>com.android.ide.eclipse.adt.AndroidNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/systems/android/hktex/HKtex2/.settings/org.eclipse.jdt.core.prefs b/systems/android/hktex/HKtex2/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..b080d2ddc8 --- /dev/null +++ b/systems/android/hktex/HKtex2/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/systems/android/hktex/HKtex2/AndroidManifest.xml b/systems/android/hktex/HKtex2/AndroidManifest.xml new file mode 100644 index 0000000000..305b41d697 --- /dev/null +++ b/systems/android/hktex/HKtex2/AndroidManifest.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="worker4math.hktex2" + android:versionCode="1" + android:versionName="1.0" > + + <uses-sdk + android:minSdkVersion="8" + android:targetSdkVersion="18" /> + + <application + android:allowBackup="true" + android:icon="@drawable/ic_launcher" + android:label="@string/app_name" + android:theme="@style/AppTheme" > + <activity + android:name="worker4math.hktex2.MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <activity + android:name="worker4math.hktex2.Displayportrait" + android:label="@string/app_name" > + </activity> + <activity + android:name="worker4math.hktex2.Displayportraiterror" + android:label="@string/app_name" > + </activity> + <activity + android:name="worker4math.hktex2.Displaylandscape" + android:label="@string/app_name" > + </activity> + <activity + android:name="worker4math.hktex2.Displaylandscapeerror" + android:label="@string/app_name" > + </activity> + </application> + +</manifest> diff --git a/systems/android/hktex/HKtex2/assets/bitmap/leftarrow.png b/systems/android/hktex/HKtex2/assets/bitmap/leftarrow.png Binary files differnew file mode 100644 index 0000000000..8080626633 --- /dev/null +++ b/systems/android/hktex/HKtex2/assets/bitmap/leftarrow.png diff --git a/systems/android/hktex/HKtex2/assets/bitmap/leftendarrow.png b/systems/android/hktex/HKtex2/assets/bitmap/leftendarrow.png Binary files differnew file mode 100644 index 0000000000..c654fe3fff --- /dev/null +++ b/systems/android/hktex/HKtex2/assets/bitmap/leftendarrow.png diff --git a/systems/android/hktex/HKtex2/assets/bitmap/rightarrow.png b/systems/android/hktex/HKtex2/assets/bitmap/rightarrow.png Binary files differnew file mode 100644 index 0000000000..f1b0cb4a0f --- /dev/null +++ b/systems/android/hktex/HKtex2/assets/bitmap/rightarrow.png diff --git a/systems/android/hktex/HKtex2/assets/bitmap/rightendarrow.png b/systems/android/hktex/HKtex2/assets/bitmap/rightendarrow.png Binary files differnew file mode 100644 index 0000000000..777444aa45 --- /dev/null +++ b/systems/android/hktex/HKtex2/assets/bitmap/rightendarrow.png diff --git a/systems/android/hktex/HKtex2/assets/fonts/asana-math.ttf b/systems/android/hktex/HKtex2/assets/fonts/asana-math.ttf Binary files differnew file mode 100644 index 0000000000..55d54a9f6a --- /dev/null +++ b/systems/android/hktex/HKtex2/assets/fonts/asana-math.ttf diff --git a/systems/android/hktex/HKtex2/bin/AndroidManifest.xml b/systems/android/hktex/HKtex2/bin/AndroidManifest.xml new file mode 100644 index 0000000000..305b41d697 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/AndroidManifest.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="worker4math.hktex2" + android:versionCode="1" + android:versionName="1.0" > + + <uses-sdk + android:minSdkVersion="8" + android:targetSdkVersion="18" /> + + <application + android:allowBackup="true" + android:icon="@drawable/ic_launcher" + android:label="@string/app_name" + android:theme="@style/AppTheme" > + <activity + android:name="worker4math.hktex2.MainActivity" + android:label="@string/app_name" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <activity + android:name="worker4math.hktex2.Displayportrait" + android:label="@string/app_name" > + </activity> + <activity + android:name="worker4math.hktex2.Displayportraiterror" + android:label="@string/app_name" > + </activity> + <activity + android:name="worker4math.hktex2.Displaylandscape" + android:label="@string/app_name" > + </activity> + <activity + android:name="worker4math.hktex2.Displaylandscapeerror" + android:label="@string/app_name" > + </activity> + </application> + +</manifest> diff --git a/systems/android/hktex/HKtex2/bin/HKtex2.apk b/systems/android/hktex/HKtex2/bin/HKtex2.apk Binary files differnew file mode 100644 index 0000000000..eab756c244 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/HKtex2.apk diff --git a/systems/android/hktex/HKtex2/bin/classes.dex b/systems/android/hktex/HKtex2/bin/classes.dex Binary files differnew file mode 100644 index 0000000000..d532827191 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes.dex diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Block.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Block.class Binary files differnew file mode 100644 index 0000000000..bef51315e7 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Block.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/BuildConfig.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/BuildConfig.class Binary files differnew file mode 100644 index 0000000000..4ae971c356 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/BuildConfig.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Colorfile.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Colorfile.class Binary files differnew file mode 100644 index 0000000000..7ebb00c6f4 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Colorfile.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscape$LandscapeView.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscape$LandscapeView.class Binary files differnew file mode 100644 index 0000000000..6b61d8b9cb --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscape$LandscapeView.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscape.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscape.class Binary files differnew file mode 100644 index 0000000000..d4d65cd65d --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscape.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscapeerror$SampleView1.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscapeerror$SampleView1.class Binary files differnew file mode 100644 index 0000000000..fd45a71e50 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscapeerror$SampleView1.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscapeerror.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscapeerror.class Binary files differnew file mode 100644 index 0000000000..46aeebfbaa --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displaylandscapeerror.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportrait$SampleView1.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportrait$SampleView1.class Binary files differnew file mode 100644 index 0000000000..a40d82a669 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportrait$SampleView1.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportrait.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportrait.class Binary files differnew file mode 100644 index 0000000000..df97723c2e --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportrait.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportraiterror$SampleView1.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportraiterror$SampleView1.class Binary files differnew file mode 100644 index 0000000000..33661984af --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportraiterror$SampleView1.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportraiterror.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportraiterror.class Binary files differnew file mode 100644 index 0000000000..4cd878a426 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Displayportraiterror.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/DocumentBitmap.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/DocumentBitmap.class Binary files differnew file mode 100644 index 0000000000..49e0ac7dbf --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/DocumentBitmap.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Drawblock.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Drawblock.class Binary files differnew file mode 100644 index 0000000000..a221255a06 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Drawblock.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Drawdocument.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Drawdocument.class Binary files differnew file mode 100644 index 0000000000..1f6017e86f --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Drawdocument.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Fontfile.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Fontfile.class Binary files differnew file mode 100644 index 0000000000..ca2c1a7e5c --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Fontfile.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Header.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Header.class Binary files differnew file mode 100644 index 0000000000..17490d9f5b --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Header.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Hyphenator.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Hyphenator.class Binary files differnew file mode 100644 index 0000000000..2883c56dd2 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Hyphenator.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Initdraw.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Initdraw.class Binary files differnew file mode 100644 index 0000000000..c13202d891 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Initdraw.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/KnuthLiangTable.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/KnuthLiangTable.class Binary files differnew file mode 100644 index 0000000000..48f40b2b81 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/KnuthLiangTable.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity$1.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity$1.class Binary files differnew file mode 100644 index 0000000000..cf712d35e3 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity$1.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity$Parse.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity$Parse.class Binary files differnew file mode 100644 index 0000000000..1ab3335f12 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity$Parse.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity.class Binary files differnew file mode 100644 index 0000000000..2abecd4329 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/MainActivity.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphBlock.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphBlock.class Binary files differnew file mode 100644 index 0000000000..6f5859ce17 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphBlock.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphFormatting.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphFormatting.class Binary files differnew file mode 100644 index 0000000000..56387b7f5d --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphFormatting.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphFormatting2.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphFormatting2.class Binary files differnew file mode 100644 index 0000000000..620bbb0214 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/ParagraphFormatting2.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsable.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsable.class Binary files differnew file mode 100644 index 0000000000..71c8c3af8e --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsable.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseblock.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseblock.class Binary files differnew file mode 100644 index 0000000000..17345df8a3 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseblock.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsedocument.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsedocument.class Binary files differnew file mode 100644 index 0000000000..1387a73325 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsedocument.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseeqnarray.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseeqnarray.class Binary files differnew file mode 100644 index 0000000000..836e4349e1 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseeqnarray.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseequation.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseequation.class Binary files differnew file mode 100644 index 0000000000..7e5ee5b6d2 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseequation.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsegraphics.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsegraphics.class Binary files differnew file mode 100644 index 0000000000..f28a019205 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsegraphics.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsegraphicstable.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsegraphicstable.class Binary files differnew file mode 100644 index 0000000000..e9c3b6b12b --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsegraphicstable.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsepreparation.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsepreparation.class Binary files differnew file mode 100644 index 0000000000..f1f2614070 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsepreparation.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetable.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetable.class Binary files differnew file mode 100644 index 0000000000..14eda8e8cc --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetable.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetext.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetext.class Binary files differnew file mode 100644 index 0000000000..c270900c65 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetext.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetitle.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetitle.class Binary files differnew file mode 100644 index 0000000000..df39a110b6 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parsetitle.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseverbatim.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseverbatim.class Binary files differnew file mode 100644 index 0000000000..c9e6adb3eb --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Parseverbatim.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$attr.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$attr.class Binary files differnew file mode 100644 index 0000000000..cca39c3e3c --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$attr.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$dimen.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$dimen.class Binary files differnew file mode 100644 index 0000000000..308df33310 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$dimen.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$drawable.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$drawable.class Binary files differnew file mode 100644 index 0000000000..c799bbe3eb --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$drawable.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$id.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$id.class Binary files differnew file mode 100644 index 0000000000..105c89e859 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$id.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$layout.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$layout.class Binary files differnew file mode 100644 index 0000000000..bb7f688494 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$layout.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$menu.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$menu.class Binary files differnew file mode 100644 index 0000000000..bc010a1d97 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$menu.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$string.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$string.class Binary files differnew file mode 100644 index 0000000000..d3dc0b89e3 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$string.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$style.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$style.class Binary files differnew file mode 100644 index 0000000000..7f60ec156e --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R$style.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R.class Binary files differnew file mode 100644 index 0000000000..c1f915877e --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/R.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Separatetext.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Separatetext.class Binary files differnew file mode 100644 index 0000000000..2bf5d0ccb3 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Separatetext.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Source.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Source.class Binary files differnew file mode 100644 index 0000000000..937547aba5 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Source.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/SuperBlock.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/SuperBlock.class Binary files differnew file mode 100644 index 0000000000..4fe5d06ab9 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/SuperBlock.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Symbol.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Symbol.class Binary files differnew file mode 100644 index 0000000000..53c3a22e11 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Symbol.class diff --git a/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Textattributefile.class b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Textattributefile.class Binary files differnew file mode 100644 index 0000000000..4e2e404a57 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/classes/worker4math/hktex2/Textattributefile.class diff --git a/systems/android/hktex/HKtex2/bin/jarlist.cache b/systems/android/hktex/HKtex2/bin/jarlist.cache new file mode 100644 index 0000000000..0565465f22 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/jarlist.cache @@ -0,0 +1,3 @@ +# cache for current jar dependency. DO NOT EDIT. +# format is <lastModified> <length> <SHA-1> <path> +# Encoding is UTF-8 diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-hdpi/ic_launcher.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..efa7c5f150 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-hdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/exit.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/exit.png Binary files differnew file mode 100644 index 0000000000..5ee0f7fd38 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/exit.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/ic_launcher.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..764521c197 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/leftarrow.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/leftarrow.png Binary files differnew file mode 100644 index 0000000000..ecf1785728 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/leftarrow.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/leftendarrow.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/leftendarrow.png Binary files differnew file mode 100644 index 0000000000..419ca283dd --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/leftendarrow.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/rightarrow.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/rightarrow.png Binary files differnew file mode 100644 index 0000000000..58de628f41 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/rightarrow.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/rightendarrow.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/rightendarrow.png Binary files differnew file mode 100644 index 0000000000..20145d589d --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-mdpi/rightendarrow.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-xhdpi/ic_launcher.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..92fc57d00c --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-xhdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/bin/res/crunch/drawable-xxhdpi/ic_launcher.png b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..b6f8f4e9d3 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/res/crunch/drawable-xxhdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/bin/resources.ap_ b/systems/android/hktex/HKtex2/bin/resources.ap_ Binary files differnew file mode 100644 index 0000000000..14529672d3 --- /dev/null +++ b/systems/android/hktex/HKtex2/bin/resources.ap_ diff --git a/systems/android/hktex/HKtex2/gen/worker4math/hktex2/BuildConfig.java b/systems/android/hktex/HKtex2/gen/worker4math/hktex2/BuildConfig.java new file mode 100644 index 0000000000..1883c48475 --- /dev/null +++ b/systems/android/hktex/HKtex2/gen/worker4math/hktex2/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package worker4math.hktex2; + +public final class BuildConfig { + public final static boolean DEBUG = true; +}
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/gen/worker4math/hktex2/R.java b/systems/android/hktex/HKtex2/gen/worker4math/hktex2/R.java new file mode 100644 index 0000000000..741ce10703 --- /dev/null +++ b/systems/android/hktex/HKtex2/gen/worker4math/hktex2/R.java @@ -0,0 +1,75 @@ +/* AUTO-GENERATED FILE. DO NOT MODIFY. + * + * This class was automatically generated by the + * aapt tool from the resource data it found. It + * should not be modified by hand. + */ + +package worker4math.hktex2; + +public final class R { + public static final class attr { + } + public static final class dimen { + /** Default screen margins, per the Android Design guidelines. + + Customize dimensions originally defined in res/values/dimens.xml (such as + screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. + + */ + public static final int activity_horizontal_margin=0x7f040000; + public static final int activity_vertical_margin=0x7f040001; + } + public static final class drawable { + public static final int exit=0x7f020000; + public static final int ic_launcher=0x7f020001; + public static final int leftarrow=0x7f020002; + public static final int leftendarrow=0x7f020003; + public static final int rightarrow=0x7f020004; + public static final int rightendarrow=0x7f020005; + } + public static final class id { + public static final int action_settings=0x7f080002; + public static final int btn2=0x7f080000; + public static final int mylogin=0x7f080001; + } + public static final class layout { + public static final int activity_main=0x7f030000; + } + public static final class menu { + public static final int main=0x7f070000; + } + public static final class string { + public static final int action_settings=0x7f050001; + public static final int app_name=0x7f050000; + public static final int hello_world=0x7f050002; + } + public static final class style { + /** + Base application theme, dependent on API level. This theme is replaced + by AppBaseTheme from res/values-vXX/styles.xml on newer devices. + + + Theme customizations available in newer API levels can go in + res/values-vXX/styles.xml, while customizations related to + backward-compatibility can go here. + + + Base application theme for API 11+. This theme completely replaces + AppBaseTheme from res/values/styles.xml on API 11+ devices. + + API 11 theme customizations can go here. + + Base application theme for API 14+. This theme completely replaces + AppBaseTheme from BOTH res/values/styles.xml and + res/values-v11/styles.xml on API 14+ devices. + + API 14 theme customizations can go here. + */ + public static final int AppBaseTheme=0x7f060000; + /** Application theme. + All customizations that are NOT specific to a particular API-level can go here. + */ + public static final int AppTheme=0x7f060001; + } +} diff --git a/systems/android/hktex/HKtex2/ic_launcher-web.png b/systems/android/hktex/HKtex2/ic_launcher-web.png Binary files differnew file mode 100644 index 0000000000..df509d8bbb --- /dev/null +++ b/systems/android/hktex/HKtex2/ic_launcher-web.png diff --git a/systems/android/hktex/HKtex2/proguard-project.txt b/systems/android/hktex/HKtex2/proguard-project.txt new file mode 100644 index 0000000000..f2fe1559a2 --- /dev/null +++ b/systems/android/hktex/HKtex2/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/systems/android/hktex/HKtex2/project.properties b/systems/android/hktex/HKtex2/project.properties new file mode 100644 index 0000000000..ce39f2d0a0 --- /dev/null +++ b/systems/android/hktex/HKtex2/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-18 diff --git a/systems/android/hktex/HKtex2/res/drawable-hdpi/ic_launcher.png b/systems/android/hktex/HKtex2/res/drawable-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..bee4df9e1b --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-hdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/res/drawable-mdpi/exit.png b/systems/android/hktex/HKtex2/res/drawable-mdpi/exit.png Binary files differnew file mode 100644 index 0000000000..f02bd92200 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-mdpi/exit.png diff --git a/systems/android/hktex/HKtex2/res/drawable-mdpi/ic_launcher.png b/systems/android/hktex/HKtex2/res/drawable-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..ee55c6ec16 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-mdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/res/drawable-mdpi/leftarrow.png b/systems/android/hktex/HKtex2/res/drawable-mdpi/leftarrow.png Binary files differnew file mode 100644 index 0000000000..8080626633 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-mdpi/leftarrow.png diff --git a/systems/android/hktex/HKtex2/res/drawable-mdpi/leftendarrow.png b/systems/android/hktex/HKtex2/res/drawable-mdpi/leftendarrow.png Binary files differnew file mode 100644 index 0000000000..c654fe3fff --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-mdpi/leftendarrow.png diff --git a/systems/android/hktex/HKtex2/res/drawable-mdpi/rightarrow.png b/systems/android/hktex/HKtex2/res/drawable-mdpi/rightarrow.png Binary files differnew file mode 100644 index 0000000000..f1b0cb4a0f --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-mdpi/rightarrow.png diff --git a/systems/android/hktex/HKtex2/res/drawable-mdpi/rightendarrow.png b/systems/android/hktex/HKtex2/res/drawable-mdpi/rightendarrow.png Binary files differnew file mode 100644 index 0000000000..777444aa45 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-mdpi/rightendarrow.png diff --git a/systems/android/hktex/HKtex2/res/drawable-xhdpi/ic_launcher.png b/systems/android/hktex/HKtex2/res/drawable-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..deb677c0d6 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-xhdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/res/drawable-xxhdpi/ic_launcher.png b/systems/android/hktex/HKtex2/res/drawable-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..85a6081587 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/drawable-xxhdpi/ic_launcher.png diff --git a/systems/android/hktex/HKtex2/res/layout/activity_main.xml b/systems/android/hktex/HKtex2/res/layout/activity_main.xml new file mode 100644 index 0000000000..5e0d29a608 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/layout/activity_main.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" > + + <Button + android:id="@+id/btn2" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:layout_alignBottom="@+id/mylogin" + android:layout_gravity="center" + android:textSize="11sp" + android:ellipsize="end" + android:layout_marginTop="-10dp" + android:layout_marginBottom="-10dp" + android:layout_marginRight="-10dp" + android:layout_marginLeft="-10dp" + android:color="#66FF0000" + android:onClick="launchRingDialog" + android:text="Click to start parsing" /> + + +</LinearLayout> diff --git a/systems/android/hktex/HKtex2/res/menu/main.xml b/systems/android/hktex/HKtex2/res/menu/main.xml new file mode 100644 index 0000000000..c002028230 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/menu/main.xml @@ -0,0 +1,9 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" > + + <item + android:id="@+id/action_settings" + android:orderInCategory="100" + android:showAsAction="never" + android:title="@string/action_settings"/> + +</menu> diff --git a/systems/android/hktex/HKtex2/res/values-sw600dp/dimens.xml b/systems/android/hktex/HKtex2/res/values-sw600dp/dimens.xml new file mode 100644 index 0000000000..44f01db75f --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values-sw600dp/dimens.xml @@ -0,0 +1,8 @@ +<resources> + + <!-- + Customize dimensions originally defined in res/values/dimens.xml (such as + screen margins) for sw600dp devices (e.g. 7" tablets) here. + --> + +</resources> diff --git a/systems/android/hktex/HKtex2/res/values-sw720dp-land/dimens.xml b/systems/android/hktex/HKtex2/res/values-sw720dp-land/dimens.xml new file mode 100644 index 0000000000..61e3fa8fbc --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values-sw720dp-land/dimens.xml @@ -0,0 +1,9 @@ +<resources> + + <!-- + Customize dimensions originally defined in res/values/dimens.xml (such as + screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. + --> + <dimen name="activity_horizontal_margin">128dp</dimen> + +</resources> diff --git a/systems/android/hktex/HKtex2/res/values-v11/styles.xml b/systems/android/hktex/HKtex2/res/values-v11/styles.xml new file mode 100644 index 0000000000..3c02242ad0 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values-v11/styles.xml @@ -0,0 +1,11 @@ +<resources> + + <!-- + Base application theme for API 11+. This theme completely replaces + AppBaseTheme from res/values/styles.xml on API 11+ devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Holo.Light"> + <!-- API 11 theme customizations can go here. --> + </style> + +</resources> diff --git a/systems/android/hktex/HKtex2/res/values-v14/styles.xml b/systems/android/hktex/HKtex2/res/values-v14/styles.xml new file mode 100644 index 0000000000..a91fd0372b --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values-v14/styles.xml @@ -0,0 +1,12 @@ +<resources> + + <!-- + Base application theme for API 14+. This theme completely replaces + AppBaseTheme from BOTH res/values/styles.xml and + res/values-v11/styles.xml on API 14+ devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> + <!-- API 14 theme customizations can go here. --> + </style> + +</resources> diff --git a/systems/android/hktex/HKtex2/res/values/dimens.xml b/systems/android/hktex/HKtex2/res/values/dimens.xml new file mode 100644 index 0000000000..55c1e5908c --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values/dimens.xml @@ -0,0 +1,7 @@ +<resources> + + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + +</resources> diff --git a/systems/android/hktex/HKtex2/res/values/strings.xml b/systems/android/hktex/HKtex2/res/values/strings.xml new file mode 100644 index 0000000000..776beedf28 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values/strings.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + + <string name="app_name">HKtex2</string> + <string name="action_settings">Settings</string> + <string name="hello_world">Hello world!</string> + +</resources> diff --git a/systems/android/hktex/HKtex2/res/values/styles.xml b/systems/android/hktex/HKtex2/res/values/styles.xml new file mode 100644 index 0000000000..6ce89c7ba4 --- /dev/null +++ b/systems/android/hktex/HKtex2/res/values/styles.xml @@ -0,0 +1,20 @@ +<resources> + + <!-- + Base application theme, dependent on API level. This theme is replaced + by AppBaseTheme from res/values-vXX/styles.xml on newer devices. + --> + <style name="AppBaseTheme" parent="android:Theme.Light"> + <!-- + Theme customizations available in newer API levels can go in + res/values-vXX/styles.xml, while customizations related to + backward-compatibility can go here. + --> + </style> + + <!-- Application theme. --> + <style name="AppTheme" parent="AppBaseTheme"> + <!-- All customizations that are NOT specific to a particular API-level can go here. --> + </style> + +</resources> diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Block.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Block.java new file mode 100644 index 0000000000..8d23094784 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Block.java @@ -0,0 +1,104 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +package worker4math.hktex2; + +import java.util.ArrayList; +import android.util.SparseArray; +import android.util.SparseBooleanArray; + +public final class Block { + + public static volatile SparseArray<ArrayList<String>> subblock = new SparseArray<ArrayList<String>>(); + public static volatile SparseArray<ArrayList<Float>> subblockwidth = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> subblockheight = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> subblockdepth = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> subblockxpos = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> subblockypos = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<String>> subblockattribute = new SparseArray<ArrayList<String>>(); + + public static volatile SparseArray<ArrayList<Float>> blockwidth = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> blockheight = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> blockdepth = new SparseArray<ArrayList<Float>>(); + + public static volatile SparseArray<ArrayList<String>> subblock2 = new SparseArray<ArrayList<String>>(); + public static volatile SparseArray<ArrayList<Float>> subblockxpos2 = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> subblockypos2 = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<String>> subblockattribute2 = new SparseArray<ArrayList<String>>(); + + public static volatile SparseArray<Float> blockwidth2 = new SparseArray<Float>(); + public static volatile SparseArray<Float> blockheight2 = new SparseArray<Float>(); + public static volatile SparseArray<Float> blockdepth2 = new SparseArray<Float>(); + + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void initerror(int tid){ + error.put(tid, false); + errormessage.put(tid, ""); + return; + } + + public void result(int tid, int blocknumber, ArrayList<ArrayList<String>> sb, ArrayList<ArrayList<Float>> sbw, + ArrayList<ArrayList<Float>> sbh, ArrayList<ArrayList<Float>> sbd, ArrayList<ArrayList<Float>> sbx, + ArrayList<ArrayList<Float>> sby, ArrayList<ArrayList<String>> sba, + ArrayList<Float> bw, ArrayList<Float> bh, ArrayList<Float> bd){ + + int tid2=tid*100; + synchronized(this){ + blockwidth.put(tid, new ArrayList<Float>()); + blockheight.put(tid, new ArrayList<Float>()); + blockdepth.put(tid, new ArrayList<Float>()); + + for (int i=0;i<=blocknumber;i++){ + int index=tid2+i; + subblock.put(index, new ArrayList<String>()); + subblockwidth.put(index, new ArrayList<Float>()); + subblockheight.put(index, new ArrayList<Float>()); + subblockdepth.put(index, new ArrayList<Float>()); + subblockxpos.put(index, new ArrayList<Float>()); + subblockypos.put(index, new ArrayList<Float>()); + subblockattribute.put(index, new ArrayList<String>()); + + for (int ii=0;ii<=sb.get(i).size()-1;ii++){ + subblock.get(index).add(sb.get(i).get(ii)); + subblockwidth.get(index).add(sbw.get(i).get(ii)); + subblockheight.get(index).add(sbh.get(i).get(ii)); + subblockdepth.get(index).add(sbd.get(i).get(ii)); + subblockxpos.get(index).add(sbx.get(i).get(ii)); + subblockypos.get(index).add(sby.get(i).get(ii)); + subblockattribute.get(index).add(sba.get(i).get(ii)); + } + blockwidth.get(tid).add(bw.get(i)); + blockheight.get(tid).add(bh.get(i)); + blockdepth.get(tid).add(bd.get(i)); + } + + int l=subblock.get(tid2).size(); + + subblock2.put(tid, new ArrayList<String>()); + subblockxpos2.put(tid, new ArrayList<Float>()); + subblockypos2.put(tid, new ArrayList<Float>()); + subblockattribute2.put(tid, new ArrayList<String>()); + + for (int i=0;i<=l-1;i++){ + if (!(subblock.get(tid2).get(i).equals("!dno ")) || i==0){ + subblock2.get(tid).add(subblock.get(tid2).get(i)); + subblockxpos2.get(tid).add(subblockxpos.get(tid2).get(i)); + subblockypos2.get(tid).add(subblockypos.get(tid2).get(i)); + subblockattribute2.get(tid).add(subblockattribute.get(tid2).get(i)); + } + } + + blockwidth2.put(tid,blockwidth.get(tid).get(0)); + blockheight2.put(tid,blockheight.get(tid).get(0)); + blockdepth2.put(tid,blockdepth.get(tid).get(0)); + + error.put(tid, false); + errormessage.put(tid, ""); + } + } + }
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Colorfile.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Colorfile.java new file mode 100644 index 0000000000..1fa0c600e6 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Colorfile.java @@ -0,0 +1,173 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + + +import java.util.HashMap; + +public class Colorfile{ + HashMap<String, String> colorinteger = new HashMap<String,String>(); + + + public void colorfile (){ + + + colorinteger.put("aliceblue","0xFFF0F8FF" ); + colorinteger.put("antiquewhite","0xFFFAEBD7" ); + colorinteger.put("aquamarine","0xFF7FFFD4" ); + colorinteger.put("aure","0xFFF0FFFF" ); + colorinteger.put("banana","0xFFE3CF57" ); + colorinteger.put("beige","0xFFF5F5DC" ); + colorinteger.put("bisque","0xFFFFE4C4" ); + colorinteger.put("black","0xFF000000" ); + colorinteger.put("blanchedalmond","0xFFFFEBCD" ); + colorinteger.put("blueviolet","0xFF8A2BE2" ); + colorinteger.put("blue","0xFF0000FF" ); + colorinteger.put("brick","0xFF9C661F" ); + colorinteger.put("brown","0xFFA52A2A" ); + colorinteger.put("burlywood","0xFFDEB887" ); + colorinteger.put("burntsienna","0xFF8A360F" ); + colorinteger.put("burntumber","0xFF8A3324" ); + colorinteger.put("cadetblue","0xFF5F9EA0" ); + colorinteger.put("cadmiumorange","0xFFFF6103" ); + colorinteger.put("cadmiumyellow","0xFFFF9912" ); + colorinteger.put("carrot","0xFFED9121" ); + colorinteger.put("chartreuse","0xFF7FFF00" ); + colorinteger.put("chocolate","0xFFD2691E" ); + colorinteger.put("cobalt","0xFF3D59AB" ); + colorinteger.put("cobaltgreen","0xFF3D9140" ); + colorinteger.put("coldgrey","0xFF808A87" ); + colorinteger.put("cornflowerblue","0xFF6495ED" ); + colorinteger.put("cornsilk","0xFFFFF8DC" ); + colorinteger.put("coral","0xFFFF7F50" ); + colorinteger.put("crimson","0xFFDC143C" ); + colorinteger.put("cyan","0xFF00FFFF" ); + colorinteger.put("darkgoldenrod","0xFFB8860B" ); + colorinteger.put("darkgray","0xFFA9A9A9" ); + colorinteger.put("darkgreen","0xFF006400" ); + colorinteger.put("darkkhaki","0xFFBDB76B" ); + colorinteger.put("darkolivegreen","0xFF556B2F" ); + colorinteger.put("darkorange","0xFFFF8C00" ); + colorinteger.put("darkorchid","0xFF9932CC" ); + colorinteger.put("darksalmon","0xFFE9967A" ); + colorinteger.put("darkseagreen","0xFF8FBC8F" ); + colorinteger.put("darkslateblue","0xFF483D8B" ); + colorinteger.put("darkslategray","0xFF2F4F4F" ); + colorinteger.put("darkturquoise","0xFF00CED1" ); + colorinteger.put("ddarkviolet","0xFF9400D3" ); + colorinteger.put("deeppink","0xFFFF1493" ); + colorinteger.put("deepskyblue","0xFF00BFFF" ); + colorinteger.put("dimgray","0xFF696969" ); + colorinteger.put("dodgerblue","0xFF1E90FF" ); + colorinteger.put("eggshell","0xFFFCE6C9" ); + colorinteger.put("emeraldgreen","0xFF00C957" ); + colorinteger.put("firebrick","0xFFB22222" ); + colorinteger.put("flesh","0xFFFF7D40" ); + colorinteger.put("floralwhite","0xFFFFFAF0" ); + colorinteger.put("forestgreen","0xFF228B22" ); + colorinteger.put("gainsboro","0xFFDCDCDC" ); + colorinteger.put("ghostwhite","0xFFF8F8FF" ); + colorinteger.put("gold","0xFFFFD700" ); + colorinteger.put("goldenrod","0xFFDAA520" ); + colorinteger.put("gray","0xFF808080" ); + colorinteger.put("green","0xFF008000" ); + colorinteger.put("greenyellow","0xFFADFF2F" ); + colorinteger.put("honeydew","0xFFF0FFF0" ); + colorinteger.put("hotpink","0xFFFF69B4" ); + colorinteger.put("indianred","0xFFCD5C5C" ); + colorinteger.put("indigo","0xFF4B0082" ); + colorinteger.put("ivory","0xFFFFFFF0" ); + colorinteger.put("ivoryblack","0xFF292421" ); + colorinteger.put("khaki","0xFFF0E68C" ); + colorinteger.put("lavender","0xFFE6E6FA" ); + colorinteger.put("lavenderblush","0xFFFFF0F5" ); + colorinteger.put("lawngreen","0xFF7CFC00" ); + colorinteger.put("lemonchiffon","0xFFFFFACD" ); + colorinteger.put("lightblue","0xFFADD8E6" ); + colorinteger.put("lightcoral","0xFFF08080" ); + colorinteger.put("lightcyan","0xFFE0FFFF" ); + colorinteger.put("lightgrey","0xFFD3D3D3" ); + colorinteger.put("lightgoldenrod","0xFFFFEC8B" ); + colorinteger.put("lightgoldenrodyellow","0xFFFAFAD2" ); + colorinteger.put("lightpink","0xFFFFB6C1" ); + colorinteger.put("lightsalmon","0xFFFFA07A" ); + colorinteger.put("lightseagreen","0xFF20B2AA" ); + colorinteger.put("lightskyblue","0xFF87CEFA" ); + colorinteger.put("lightslateblue","0xFF8470FF" ); + colorinteger.put("lightslategray","0xFF778899" ); + colorinteger.put("lightsteelblue","0xFFB0C4DE" ); + colorinteger.put("lightyellow","0xFFFFFFE0" ); + colorinteger.put("limegreen","0xFF32CD32" ); + colorinteger.put("linen","0xFFFAF0E6" ); + colorinteger.put("magenta","0xFFFF00FF" ); + colorinteger.put("manganeseblue","0xFF03A89E" ); + colorinteger.put("maroon","0xFF800000" ); + colorinteger.put("mediumorchid","0xFFBA55D3" ); + colorinteger.put("mediumpurple","0xFF9370DB" ); + colorinteger.put("mediumseagreen","0xFF3CB371" ); + colorinteger.put("mediumslateblue","0xFF7B68EE" ); + colorinteger.put("mediumspringgreen","0xFF00FA9A" ); + colorinteger.put("mediumturquoise","0xFF48D1CC" ); + colorinteger.put("mediumvioletred","0xFFC71585" ); + colorinteger.put("melon","0xFFE3A869" ); + colorinteger.put("midnightblue","0xFF191970" ); + colorinteger.put("mint","0xFFBDFCC9" ); + colorinteger.put("mintcream","0xFFF5FFFA" ); + colorinteger.put("mistyrose","0xFFFFE4E1" ); + colorinteger.put("moccasin","0xFFFFE4B5" ); + colorinteger.put("navajowhite","0xFFFFDEAD" ); + colorinteger.put("navy","0xFF000080" ); + colorinteger.put("oldlace","0xFFFDF5E6" ); + colorinteger.put("olivedrab","0xFF6B8E23" ); + colorinteger.put("olive","0xFF808000" ); + colorinteger.put("orange","0xFFFF8000" ); + colorinteger.put("orangered","0xFFFF4500" ); + colorinteger.put("orchid","0xFFDA70D6" ); + colorinteger.put("palegoldenrod","0xFFEEE8AA" ); + colorinteger.put("palegreen","0xFF98FB98" ); + colorinteger.put("palevioletred","0xFFDB7093" ); + colorinteger.put("paleturquoise","0xFFBBFFFF" ); + colorinteger.put("papayawhip","0xFFFFEFD5" ); + colorinteger.put("peachpuff","0xFFFFDAB9" ); + colorinteger.put("peacock","0xFF33A1C9" ); + colorinteger.put("pink","0xFFFFC0CB" ); + colorinteger.put("plum","0xFFDDA0DD" ); + colorinteger.put("powderblue","0xFFB0E0E6" ); + colorinteger.put("purple","0xFF800080" ); + colorinteger.put("raspberry","0xFF872657" ); + colorinteger.put("rawsienna","0xFFC76114" ); + colorinteger.put("red","0xFFFF0000" ); + colorinteger.put("royalblue","0xFF4169E1" ); + colorinteger.put("rosybrown","0xFFBC8F8F" ); + colorinteger.put("salmon","0xFFFA8072" ); + colorinteger.put("sandybrown","0xFFF4A460" ); + colorinteger.put("sapgreen","0xFF308014" ); + colorinteger.put("seashell","0xFFFFF5EE" ); + colorinteger.put("sepia","0xFF5E2612" ); + colorinteger.put("sienna","0xFFA0522D" ); + colorinteger.put("silver","0xFFC0C0C0" ); + colorinteger.put("skyblue","0xFF87CEEB" ); + colorinteger.put("slateblue","0xFF6A5ACD" ); + colorinteger.put("slategray","0xFF708090" ); + colorinteger.put("snow","0xFFFFFAFA" ); + colorinteger.put("springgreen","0xFF00FF7F" ); + colorinteger.put("steelblue","0xFF4682B4" ); + colorinteger.put("teal","0xFF008080" ); + colorinteger.put("thistle","0xFFD8BFD8" ); + colorinteger.put("tomato","0xFFFF6347" ); + colorinteger.put("turquoise","0xFF40E0D0" ); + colorinteger.put("turquoiseblue","0xFF00C78C" ); + colorinteger.put("violet","0xFFEE82EE" ); + colorinteger.put("violetred","0xFFD02090" ); + colorinteger.put("warmgrey","0xFF808069" ); + colorinteger.put("wheat","0xFFF5DEB3" ); + colorinteger.put("white","0xFFFFFFFF" ); + colorinteger.put("whitesmoke","0xFFF5F5F5" ); + colorinteger.put("yellow","0xFFFFFF00" ); +}} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displaylandscape.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displaylandscape.java new file mode 100644 index 0000000000..fce1cca25b --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displaylandscape.java @@ -0,0 +1,141 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import android.os.Bundle; +import android.app.Activity; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.view.MotionEvent; +import android.view.View; + +public class Displaylandscape extends Activity{ + + Canvas canvas = new Canvas(); + Drawdocument drawdocument = new Drawdocument(); + public static int contentViewTop=0; + public static int contentViewBottom= 0; + public static int height=0; + public static int width=0; + public static int tid=0; + public static Bitmap larrow; + public static Bitmap rarrow; + public static Bitmap lendarrow; + public static Bitmap rendarrow; + public int showpage=0; + ArrayList<Typeface> tf = new ArrayList<Typeface>(); + public Integer containerwidth; + public Integer containerheight; + Boolean parsed=false; + Boolean firstdraw=true; + InputStream bitmapstream=null; + DocumentBitmap documentbitmap = new DocumentBitmap(); + Paint rpaint = new Paint(); + Rect rect = new Rect(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new LandscapeView(this)); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + larrow = BitmapFactory.decodeResource(getResources(), R.drawable.leftarrow); + rarrow = BitmapFactory.decodeResource(getResources(), R.drawable.rightarrow); + lendarrow = BitmapFactory.decodeResource(getResources(), R.drawable.leftendarrow); + rendarrow = BitmapFactory.decodeResource(getResources(), R.drawable.rightendarrow); + + documentbitmap.documentbitmap(); + for (int i=0;i<=DocumentBitmap.bitmapname.size()-1;i++){ + try { + bitmapstream=getAssets().open("bitmap/"+DocumentBitmap.bitmapname.get(i)); + DocumentBitmap.bitmap.put(DocumentBitmap.bitmapname.get(i),BitmapFactory.decodeStream(bitmapstream)); + } catch (IOException e) { + e.printStackTrace(); + } } + } + + private class LandscapeView extends View { + public LandscapeView(Context context) { + super(context); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + containerwidth = MeasureSpec.getSize(widthMeasureSpec); + containerheight = MeasureSpec.getSize(heightMeasureSpec); + rect.set(0,0,containerwidth,containerheight); + rpaint.setColor(Color.WHITE); + } + + public boolean onTouchEvent(MotionEvent event) { + + float eventX = event.getX(); + float eventY = event.getY(); + int pagenumber; + if ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)){ + pagenumber=Initdraw.pagenumber/2;} + else { + pagenumber=Initdraw.pagenumber; + } + if(event.getAction()==MotionEvent.ACTION_DOWN){ + if(eventX >= containerwidth/3-larrow.getWidth()/2 && eventX <= containerwidth/3+larrow.getWidth()/2 && eventY >= containerheight-larrow.getHeight() && eventY <= containerheight) { + if (Drawdocument.showpagenumber > 0) { + Drawdocument.showpagenumber--; + invalidate(); + } + } else if (eventX >= containerwidth*2/3-rarrow.getWidth()/2 && eventX <= containerwidth*2/3+rarrow.getWidth()/2 && eventY >= containerheight-rarrow.getHeight() && eventY <= containerheight){ + if (Drawdocument.showpagenumber < pagenumber) { + Drawdocument.showpagenumber++; + invalidate(); + } + }else if (eventX >= 10 && eventX <= lendarrow.getWidth()+10 && eventY >= containerheight-lendarrow.getHeight() && eventY <= containerheight){ + Drawdocument.showpagenumber=0; + invalidate(); + }else if (eventX >= containerwidth-rendarrow.getWidth()-10 && eventX <= containerwidth-10 && eventY >= containerheight-rendarrow.getHeight() && eventY <= containerheight){ + Drawdocument.showpagenumber=pagenumber; + invalidate(); + } + } + + return true; + } +@Override + public void onDraw(Canvas canvas) { + + if (firstdraw){drawdocument.drawinit(containerwidth, containerheight); firstdraw=false;} + + tf.add(Typeface.SERIF); + tf.add(Typeface.create(Typeface.SERIF,Typeface.ITALIC)); + tf.add(Typeface.DEFAULT_BOLD); + tf.add(Typeface.MONOSPACE); + tf.add(Typeface.createFromAsset(getAssets(),"fonts/asana-math.ttf")); // Math symbols + tf.add(Typeface.SERIF); // For the moment, use serif instead + + + canvas.drawRect(rect, rpaint); + drawdocument.drawdocument(canvas, tf,containerwidth); + + canvas.drawBitmap(larrow, containerwidth/3-larrow.getWidth()/2, containerheight-larrow.getHeight(), null); + canvas.drawBitmap(rarrow, containerwidth*2/3-rarrow.getWidth()/2, containerheight-rarrow.getHeight(), null); + canvas.drawBitmap(lendarrow, 10, containerheight-lendarrow.getHeight(), null); + canvas.drawBitmap(rendarrow, containerwidth-rendarrow.getWidth()-10, containerheight-rendarrow.getHeight(), null); + + } } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displaylandscapeerror.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displaylandscapeerror.java new file mode 100644 index 0000000000..3ba9b17615 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displaylandscapeerror.java @@ -0,0 +1,84 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + + +import android.os.Bundle; +import android.app.Activity; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.view.MotionEvent; +import android.view.View; + +public class Displaylandscapeerror extends Activity { + + Canvas canvas = new Canvas(); + public Integer containerwidth; + public Integer containerheight; + public static Bitmap exit; + Paint rpaint = new Paint(); + Rect rect = new Rect(); + Paint tpaint = new Paint(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new SampleView1(this)); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + exit = BitmapFactory.decodeResource(getResources(), R.drawable.exit); + } + + private class SampleView1 extends View { + public SampleView1(Context context) { + super(context); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + containerwidth = MeasureSpec.getSize(widthMeasureSpec); + containerheight = MeasureSpec.getSize(heightMeasureSpec); + rect.set(0,0,containerwidth,containerheight); + rpaint.setColor(Color.WHITE); + } + + public boolean onTouchEvent(MotionEvent event) { + + float eventX = event.getX(); + float eventY = event.getY(); + + if(event.getAction()==MotionEvent.ACTION_DOWN){ + if(eventX >= containerwidth/2-exit.getWidth()/2 && eventX <= containerwidth/2+exit.getWidth()/2 && eventY >= containerheight-exit.getHeight()-5 && eventY <= containerheight-5) { + finish(); + } + } + return true; + } + +@Override + public void onDraw(Canvas canvas) { + + tpaint.setTextSize(12); + tpaint.setColor(Color.RED); + + canvas.drawRect(rect, rpaint); + int i=0; + for (int tid=0;tid<=Header.nthread;tid++){ + if (Parsedocument.errormessage.indexOfKey(tid)>=0 && Parsedocument.errormessage.get(tid)!="") + canvas.drawText(Parsedocument.errormessage.get(tid), 10, containerheight/4+i*12, tpaint); + i++; + } + canvas.drawBitmap(exit, containerwidth/2-exit.getWidth()/2, containerheight-exit.getHeight()-5, null); + } +}} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displayportrait.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displayportrait.java new file mode 100644 index 0000000000..198ebf27a9 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displayportrait.java @@ -0,0 +1,143 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import android.os.Bundle; +import android.app.Activity; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.view.MotionEvent; +import android.view.View; + + +public class Displayportrait extends Activity { + + Canvas canvas = new Canvas(); + Drawdocument drawdocument = new Drawdocument(); + public static int contentViewTop=0; + public static int contentViewBottom= 0; + public static int height=0; + public static int width=0; + public static int tid=0; + public static Bitmap larrow; + public static Bitmap rarrow; + public static Bitmap lendarrow; + public static Bitmap rendarrow; + public int showpage=0; + ArrayList<Typeface> tf = new ArrayList<Typeface>(); + public Integer containerwidth; + public Integer containerheight; + Boolean parsed=false; + Boolean firstdraw=true; + InputStream bitmapstream=null; + DocumentBitmap documentbitmap = new DocumentBitmap(); + Paint rpaint = new Paint(); + Rect rect = new Rect(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new SampleView1(this)); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + larrow = BitmapFactory.decodeResource(getResources(), R.drawable.leftarrow); + rarrow = BitmapFactory.decodeResource(getResources(), R.drawable.rightarrow); + lendarrow = BitmapFactory.decodeResource(getResources(), R.drawable.leftendarrow); + rendarrow = BitmapFactory.decodeResource(getResources(), R.drawable.rightendarrow); + documentbitmap.documentbitmap(); + + for (int i=0;i<=DocumentBitmap.bitmapname.size()-1;i++){ + try { + bitmapstream=getAssets().open("bitmap/"+DocumentBitmap.bitmapname.get(i)); + DocumentBitmap.bitmap.put(DocumentBitmap.bitmapname.get(i),BitmapFactory.decodeStream(bitmapstream)); + } catch (IOException e) { + e.printStackTrace(); + } } + } + + private class SampleView1 extends View { + public SampleView1(Context context) { + super(context); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + containerwidth = MeasureSpec.getSize(widthMeasureSpec); + containerheight = MeasureSpec.getSize(heightMeasureSpec); + rect.set(0,0,containerwidth,containerheight); + rpaint.setColor(Color.WHITE); + } + + public boolean onTouchEvent(MotionEvent event) { + + float eventX = event.getX(); + float eventY = event.getY(); + int pagenumber; + if ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)){ + pagenumber=Initdraw.pagenumber/2;} + else { + pagenumber=Initdraw.pagenumber; + } + if(event.getAction()==MotionEvent.ACTION_DOWN){ + if(eventX >= containerwidth/3-larrow.getWidth()/2 && eventX <= containerwidth/3+larrow.getWidth()/2 && eventY >= containerheight-larrow.getHeight() && eventY <= containerheight) { + if (Drawdocument.showpagenumber > 0) { + Drawdocument.showpagenumber--; + invalidate(); + } + } else if (eventX >= containerwidth*2/3-rarrow.getWidth()/2 && eventX <= containerwidth*2/3+rarrow.getWidth()/2 && eventY >= containerheight-rarrow.getHeight() && eventY <= containerheight){ + if (Drawdocument.showpagenumber < pagenumber) { + Drawdocument.showpagenumber++; + invalidate(); + } + }else if (eventX >= 10 && eventX <= lendarrow.getWidth()+10 && eventY >= containerheight-lendarrow.getHeight() && eventY <= containerheight){ + Drawdocument.showpagenumber=0; + invalidate(); + }else if (eventX >= containerwidth-rendarrow.getWidth()-10 && eventX <= containerwidth-10 && eventY >= containerheight-rendarrow.getHeight() && eventY <= containerheight){ + Drawdocument.showpagenumber=pagenumber; + invalidate(); + } + } + + return true; + } +@Override + public void onDraw(Canvas canvas) { + + if (firstdraw){drawdocument.drawinit(containerwidth, containerheight); firstdraw=false;} + + tf.add(Typeface.SERIF); + tf.add(Typeface.create(Typeface.SERIF,Typeface.ITALIC)); + tf.add(Typeface.DEFAULT_BOLD); + tf.add(Typeface.MONOSPACE); + tf.add(Typeface.createFromAsset(getAssets(),"fonts/asana-math.ttf")); // Math symbols + tf.add(Typeface.SERIF); // For the moment, use serif instead + + + canvas.drawRect(rect, rpaint); + drawdocument.drawdocument(canvas, tf, containerwidth); + + canvas.drawBitmap(larrow, containerwidth/3-larrow.getWidth()/2, containerheight-larrow.getHeight(), null); + canvas.drawBitmap(rarrow, containerwidth*2/3-rarrow.getWidth()/2, containerheight-rarrow.getHeight(), null); + canvas.drawBitmap(lendarrow, 10, containerheight-lendarrow.getHeight(), null); + canvas.drawBitmap(rendarrow, containerwidth-rendarrow.getWidth()-10, containerheight-rendarrow.getHeight(), null); + + } } + +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displayportraiterror.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displayportraiterror.java new file mode 100644 index 0000000000..b03e78153b --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Displayportraiterror.java @@ -0,0 +1,85 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + + +import android.os.Bundle; +import android.app.Activity; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.view.MotionEvent; +import android.view.View; + +public class Displayportraiterror extends Activity { + + Canvas canvas = new Canvas(); + public Integer containerwidth; + public Integer containerheight; + public static Bitmap exit; + Paint rpaint = new Paint(); + Rect rect = new Rect(); + Paint tpaint = new Paint(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(new SampleView1(this)); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + exit = BitmapFactory.decodeResource(getResources(), R.drawable.exit); + } + + private class SampleView1 extends View { + public SampleView1(Context context) { + super(context); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + containerwidth = MeasureSpec.getSize(widthMeasureSpec); + containerheight = MeasureSpec.getSize(heightMeasureSpec); + rect.set(0,0,containerwidth,containerheight); + rpaint.setColor(Color.WHITE); + } + + public boolean onTouchEvent(MotionEvent event) { + + float eventX = event.getX(); + float eventY = event.getY(); + + if(event.getAction()==MotionEvent.ACTION_DOWN){ + if(eventX >= containerwidth/2-exit.getWidth()/2 && eventX <= containerwidth/2+exit.getWidth()/2 && eventY >= containerheight-exit.getHeight()-5 && eventY <= containerheight-5) { + finish(); + } + } + + return true; + } + +@Override + public void onDraw(Canvas canvas) { + + tpaint.setTextSize(12); + tpaint.setColor(Color.RED); + + canvas.drawRect(rect, rpaint); + int i=0; + for (int tid=0;tid<=Header.nthread;tid++){ + if (Parsedocument.errormessage.indexOfKey(tid)>=0 && Parsedocument.errormessage.get(tid)!="") + canvas.drawText(Parsedocument.errormessage.get(tid), 10, containerheight/4+i*12, tpaint); + i++; + } + canvas.drawBitmap(exit, containerwidth/2-exit.getWidth()/2, containerheight-exit.getHeight()-5, null); + } +}} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/DocumentBitmap.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/DocumentBitmap.java new file mode 100644 index 0000000000..0fe9712489 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/DocumentBitmap.java @@ -0,0 +1,29 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import java.util.HashMap; +import android.graphics.Bitmap; + +public class DocumentBitmap { + + public static final ArrayList<String> bitmapname = new ArrayList<String>(); + public static ArrayList<String> usedbitmap = new ArrayList<String>(); + public static HashMap<String,Bitmap> bitmap = new HashMap<String,Bitmap>(); + public static HashMap<String,Float> bitmapwidth = new HashMap<String,Float>(); + public static HashMap<String,Float> bitmapheight = new HashMap<String,Float>(); + + public void documentbitmap(){ + bitmapname.add("leftarrow.png"); + bitmapname.add("rightarrow.png"); + bitmapname.add("leftendarrow.png"); + bitmapname.add("rightendarrow.png"); + } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Drawblock.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Drawblock.java new file mode 100644 index 0000000000..e60e3ad724 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Drawblock.java @@ -0,0 +1,164 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.util.ArrayList; +import java.util.HashMap; + +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.Canvas; +import android.graphics.Paint; + +public class Drawblock { + + float moleculeheight = 0.0f; + float moleculelength = 0.0f; + + public void drawblock(Canvas canvas, + ArrayList<String> block, + ArrayList<Float> xpos, + ArrayList<Float> ypos, + ArrayList<String> attribute, + HashMap<String, String> symbolunicode, HashMap<String, Integer> symboltype, HashMap<String, String> matchsymbol, + ArrayList<Typeface> tf ) { + + int i,j1,ii,i2=0; + int numatom = 0; + int fontcolor=0; + + String key = ""; + + char temp = ' '; + char charExclaim = '!'; + + Colorfile color = new Colorfile(); + color.colorfile(); + + Paint mPaint = new Paint(); + mPaint.setColor(Color.BLACK); + Paint lPaint= new Paint(); + Paint sPaint = new Paint(); + sPaint.setTypeface(tf.get(4)); + + + numatom = block.size(); + + for (i=0;i<=numatom-1;i++){ + if (attribute.get(i).charAt(0)=='g'){ + canvas.drawBitmap(DocumentBitmap.bitmap.get(block.get(i)), xpos.get(i), ypos.get(i), null); + } else if (attribute.get(i).charAt(0)=='G'){ + canvas.drawBitmap(DocumentBitmap.bitmap.get(block.get(i)), xpos.get(i), ypos.get(i), null); + } else if (attribute.get(i).charAt(0)=='1'){ + mPaint.setUnderlineText(false);mPaint.setStrikeThruText(false);mPaint.setTextSkewX(0);mPaint.setAlpha(255);mPaint.setShadowLayer(0,0,0,0); + mPaint.setTextSize(Integer.parseInt(attribute.get(i).substring(1,4))); + + Long il=Long.parseLong(attribute.get(i).substring(9,17),16); + ii=il.intValue(); + mPaint.setColor(ii); + mPaint.setTypeface(tf.get(Integer.parseInt(attribute.get(i).substring(4,7)))); + canvas.drawText(block.get(i), xpos.get(i), ypos.get(i), mPaint); + } else { + String atom = block.get(i); + + Float positionx = xpos.get(i); + Float positiony = ypos.get(i); + String textattribute=attribute.get(i); + + if (textattribute.charAt(0)=='0'){ + if (textattribute.charAt(18) == '1'){mPaint.setUnderlineText(true);sPaint.setUnderlineText(true);} else {mPaint.setUnderlineText(false);sPaint.setUnderlineText(false);}; + if (textattribute.charAt(19) == '1'){mPaint.setStrikeThruText(true);sPaint.setStrikeThruText(true);} else{mPaint.setStrikeThruText(false);sPaint.setStrikeThruText(false);} ; + if (textattribute.substring(20,25)!="+0.00"){mPaint.setTextSkewX(Float.parseFloat(textattribute.substring(20,25)));sPaint.setTextSkewX(Float.parseFloat(textattribute.substring(20,25)));} + else {mPaint.setTextSkewX(0);sPaint.setTextSkewX(0);} ; + if (textattribute.substring(25,29)!="0xFF"){ mPaint.setAlpha(Integer.parseInt(textattribute.substring(27,29),16));sPaint.setAlpha(Integer.parseInt(textattribute.substring(27,29),16));} + else {mPaint.setAlpha(255);sPaint.setAlpha(255);}; + if (textattribute.charAt(29) != '0'){ + Long il=Long.parseLong(color.colorinteger.get(textattribute.substring(32)).substring(2),16); + fontcolor=il.intValue(); + mPaint.setShadowLayer(Float.parseFloat(textattribute.substring(29,30)),Float.parseFloat(textattribute.substring(30,31)), + Float.parseFloat(textattribute.substring(31,32)),fontcolor); + sPaint.setShadowLayer(Float.parseFloat(textattribute.substring(29,30)),Float.parseFloat(textattribute.substring(30,31)), + Float.parseFloat(textattribute.substring(31,32)),fontcolor); + } else { + mPaint.setShadowLayer(0,0,0,0);sPaint.setShadowLayer(0,0,0,0); + }; + } else { + mPaint.setUnderlineText(false);sPaint.setUnderlineText(false);mPaint.setStrikeThruText(false);sPaint.setStrikeThruText(false); + mPaint.setShadowLayer(0,0,0,0);sPaint.setShadowLayer(0,0,0,0);mPaint.setAlpha(255);sPaint.setAlpha(255); + mPaint.setTextSkewX(0);sPaint.setTextSkewX(0); + } + mPaint.setTextSize(Integer.parseInt(attribute.get(i).substring(1,4))); + Long il=Long.parseLong(attribute.get(i).substring(9,17),16); + fontcolor=il.intValue(); + + j1=0; + for (int j=0; j1<=atom.length()-1 && j<1000; j++){ + + temp = atom.charAt(j1); + if (temp != charExclaim) { + + int fontinteger=Integer.parseInt(attribute.get(i).substring(4,7)); + + mPaint.setColor(fontcolor); + mPaint.setTypeface(tf.get(fontinteger)); + canvas.drawText(Character.toString(temp), positionx, positiony, mPaint); + + float tempsize = mPaint.measureText(Character.toString(temp)); + positionx = positionx + tempsize; + j1++; + } else if (temp == charExclaim) { + key =""; + for (i2=j1+1;!(atom.charAt(i2)==' ');i2++){ + key = key + atom.charAt(i2); + } + if (symboltype.containsKey(key) && (symboltype.get(key)<=13 ||symboltype.get(key)>=16) ){ + sPaint.setTextSize(Integer.parseInt(attribute.get(i).substring(1,4))); + sPaint.setColor(fontcolor); + canvas.drawText(symbolunicode.get(key), positionx, positiony, sPaint); + j1=j1+key.length()+2; + }else if (symboltype.containsKey(key) && (symboltype.get(key)==14 || symboltype.get(key)==15)){ + mPaint.setTextSize(Integer.parseInt(attribute.get(i).substring(1,4))); + mPaint.setTypeface(tf.get(5)); + mPaint.setColor(fontcolor); + canvas.drawText(symbolunicode.get(key), positionx, positiony, mPaint); + j1=j1+key.length()+2; + }else if (key.equals("hlin")){ + lPaint.setColor(fontcolor); + int strokewidth=1; + lPaint.setStrokeWidth(strokewidth); + float tempy=Integer.parseInt(attribute.get(i).substring(1,4)); + canvas.drawLine(positionx, positiony, positionx+tempy, positiony, lPaint); + j1+=6; + }else if (key.equals("vlin")){ + lPaint.setColor(fontcolor); + int strokewidth=1; + lPaint.setStrokeWidth(strokewidth); + float tempy=Integer.parseInt(attribute.get(i).substring(1,4)); + canvas.drawLine(positionx, positiony, positionx, positiony-tempy, lPaint); + j1+=6; + }else if (key.equals("dno")){ +// do nothing + j1+=5; + } else if (key.equals("hsp")){ + j1+=5; + } else if (key.equals("vsp")){ + j1+=5; + }else if (key.equals("gho")){ + j1+=5; + }else { + mPaint.setColor(fontcolor); + mPaint.setTypeface(tf.get(0)); + canvas.drawText(symbolunicode.get(key), positionx, positiony, mPaint); + + j1=j1+key.length()+2; } + + } + } }} + } + } + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Drawdocument.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Drawdocument.java new file mode 100644 index 0000000000..8ca8c7ac3e --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Drawdocument.java @@ -0,0 +1,96 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import android.graphics.Typeface; +import android.graphics.Canvas; +import java.util.ArrayList; + +public class Drawdocument { + + public static int ii=0; + public static int showpagenumber=0; + + SuperBlock superblock = new SuperBlock(); + Parsedocument parsedocument = new Parsedocument(); + public static float containerwidth2; + public static float containerheight2; + public static float height=0; + + public void drawinit(float containerwidth,float containerheight){ + containerwidth2=containerwidth; + containerheight2=containerheight; + Initdraw initdraw = new Initdraw(); + initdraw.initdraw(containerwidth, containerheight); + return; + } + + + public void drawdocument(Canvas canvas, ArrayList<Typeface> tf, Integer containerwidth){ + Drawblock draw = new Drawblock(); + int tid=0; + int showpagenumber2; + if ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)){ + showpagenumber2=showpagenumber*2;} + else { + showpagenumber2=showpagenumber; + } + if (Initdraw.pageline.indexOfKey(showpagenumber2)>=0){ + int index=SuperBlock.superblocklinenumber.get(0)+1; + int index2=0; + + for (int ii=0;ii<=Initdraw.pageline.get(showpagenumber2).size()-1;ii++){ + int i=Initdraw.pageline.get(showpagenumber2).get(ii); + while(i>=index){ + tid++;index2=index;index=index+SuperBlock.superblocklinenumber.get(tid)+1;} + int tid2=tid*1000+(i-index2); + +// add page number + if(Header.showpagenumber && i==Initdraw.pageline.get(showpagenumber2).get(Initdraw.pageline.get(showpagenumber2).size()-1)){ + SuperBlock.blockatom.get(tid2).add(Integer.toString(showpagenumber+Header.firstpage)); + SuperBlock.blockxpos.get(tid2).add(containerwidth2/2); + SuperBlock.blockypos.get(tid2).add(containerheight2-Header.bottomsidemargin+10.0f); + SuperBlock.blockattribute.get(tid2).add(Header.defaultattribute); + } + if (SuperBlock.blockatom.get(tid2).size()>0){ + draw.drawblock(canvas, SuperBlock.blockatom.get(tid2), + SuperBlock.blockxpos.get(tid2),SuperBlock.blockypos.get(tid2), + SuperBlock.blockattribute.get(tid2), Symbol.symbolunicode, Symbol.symboltype, + Symbol.matchsymbol, + tf); + } + }} + if ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns) ){ + tid=0; + showpagenumber2=showpagenumber*2+1; + if (Initdraw.pageline.indexOfKey(showpagenumber2)>=0){ + int index=SuperBlock.superblocklinenumber.get(0)+1; + int index2=0; + + for (int ii=0;ii<=Initdraw.pageline.get(showpagenumber2).size()-1;ii++){ + int i=Initdraw.pageline.get(showpagenumber2).get(ii); + while(i>=index){ + tid++;index2=index;index=index+SuperBlock.superblocklinenumber.get(tid)+1;} + int tid2=tid*1000+(i-index2); + + float t=containerwidth/2-Header.leftsidemargin+Header.rightsidemargin/2; + ArrayList<Float> xpos = new ArrayList<Float>(); + for (int iii=0;iii<=SuperBlock.blockxpos.get(tid2).size()-1;iii++){ + xpos.add(SuperBlock.blockxpos.get(tid2).get(iii)+t); + } + if (SuperBlock.blockatom.get(tid2).size()>0){ + draw.drawblock(canvas, SuperBlock.blockatom.get(tid2), + xpos,SuperBlock.blockypos.get(tid2), + SuperBlock.blockattribute.get(tid2), Symbol.symbolunicode, Symbol.symboltype, + Symbol.matchsymbol, + tf); + } + }} + }} + } + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Fontfile.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Fontfile.java new file mode 100644 index 0000000000..97378bf3e9 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Fontfile.java @@ -0,0 +1,24 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; + +public class Fontfile{ + ArrayList<String> fontname = new ArrayList<String>(); + + public void fontfile (){ + + fontname.add("sf"); + fontname.add("it"); + fontname.add("bf"); + fontname.add("mo"); + fontname.add("asana"); + fontname.add("rm"); +}} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Header.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Header.java new file mode 100644 index 0000000000..509d7de767 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Header.java @@ -0,0 +1,59 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.util.HashMap; + +public class Header { + + public static final int topsidemargin=30; + public static final int bottomsidemargin=30; + public static final int leftsidemargin = 30; + public static final int rightsidemargin = 30; + public static final int linegap=5; + public static final int columngap = 2; + public static final int characterheadroom = 2; + public static final int firstpage = 1; + public static final int defaultfont = 0; + public static final int minfontsize = 8; + public static final int maxfontsize = 80; + public static final int indent = 40; + public static final int fontsize = 12; // value between maxfontsize and minfontsize; + public static final float bigopsize = 2.0f; // size factor for big operator + public static final float bigbigopsize=3.0f; // size factor for big big operator + public static final float firstypos=20; + public static final Boolean dohyphenation=false; + public static final Boolean scrollview=false; + public static final Boolean showpagenumber=true; + public static final Boolean phone_orientation_portrait=true; + public static final Boolean tablet_orientation_landscape=false; + public static final int twocolumns_criteria=700; + public static final String defaultattribute="00120000xff00000000+0.000xFF0000xFF000000"; // char(1) to char(3) is the font size + + public static final String defaultcolor="black"; + public static final HashMap<String, Float> sizefactor = new HashMap<String,Float>(); +// +// The following will be changed after launched +// + public static Boolean phone_twocolumns=false; // if container width < twocolumns_criteria, this Boolean will be changed to false; + public static Boolean tablet_twocolumns=false; // if container width < twocolumns_criteria, this Boolean will be changed to false; + public static HashMap<Long,Integer> threadid = new HashMap<Long,Integer>(); + public static int nthread=10; // min is 1, max is 10 + public static Boolean tablet=true; + + public void header(){ + sizefactor.put("Huge",2.0f); + sizefactor.put("huge",1.75f); + sizefactor.put("Large",1.5f); + sizefactor.put("large",1.25f); + sizefactor.put("normalsize",1.0f); + sizefactor.put("small",0.75f); + sizefactor.put("scriptsize",0.6f); + sizefactor.put("tiny",0.5f); + } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Hyphenator.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Hyphenator.java new file mode 100644 index 0000000000..75492a8b2b --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Hyphenator.java @@ -0,0 +1,88 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +public class Hyphenator { + + protected String hyphenate(String word) { + + int i,i2,i3,i4=0; + int ii=0; + int jj=0; + int l=0; + int l2=0; + + + KnuthLiangTable pattern = new KnuthLiangTable(); + pattern.list(); + + + String hyphenatedword = ""; + String wordi=""; + l=word.length(); + if (l > 2){ + for (i=0;i<=l-2;i++){ + wordi=wordi+word.charAt(i)+"0"; + } + wordi=".0"+wordi+word.charAt(l-1)+"0."; + word="."+word+"."; + String word1=""; + String word2=""; + String word3=""; + l=word.length(); + int starti = 0; + for (i2=starti; i2<=l-2; i2++){ + int ll=l-1-i2; + i3=i2+Math.min(ll, 7); + for (i4=i2+2;i4<=i3;i4++){ + word1=word.substring(i2,i4); + if (pattern.pattern2.contains(word1)){ + i=pattern.pattern2.headSet(word1).size(); + word2=pattern.pattern1[i]; + l2=word2.length(); + jj=0; + word3=""; + for (ii=0;jj<=l2-1;ii++){ + if (word2.charAt(jj)== '1' || word2.charAt(jj)== '2' + || word2.charAt(jj)== '3' || word2.charAt(jj)== '4' + || word2.charAt(jj)== '5') + {if (word3.length()>=1){word3=word3.substring(0,word3.length()-1)+word2.charAt(jj);}else{word3=word2.substring(jj,jj+1);}; + jj++; + } + else { + word3=word3+word2.charAt(jj)+"0"; + jj++; + }; + }; + l2=word3.length(); + if (word3.charAt(0) == '1' || word3.charAt(0) == '2' || word3.charAt(0) == '3'|| word3.charAt(0) == '4' || word3.charAt(0) == '5'){ + for (ii=0;ii<=l2-1;ii+=1){ + if(word3.charAt(ii)>wordi.charAt(i2*2+ii-1)){ + wordi=wordi.substring(0,i2*2+ii-1)+word3.charAt(ii)+wordi.substring(i2*2+ii);} + }; + } else { + for (ii=0;ii<=l2-1;ii+=1){ + if(word3.charAt(ii)>wordi.charAt(i2*2+ii)){ + wordi=wordi.substring(0,i2*2+ii)+word3.charAt(ii)+wordi.substring(i2*2+ii+1);} + }; + }; + } + } + }; + l=wordi.length(); + word=wordi.substring(2,3)+wordi.substring(4,5); + for (i=5;i<=l-5;i+=2){ + if (wordi.charAt(i)== '1' || wordi.charAt(i) == '3' || wordi.charAt(i) == '5'){word=word+"-"+wordi.charAt(i+1);} + else {word=word+wordi.charAt(i+1);}; + } + hyphenatedword=word+wordi.substring(l-3,l-2); + } + else { hyphenatedword=word;} + return hyphenatedword; + }} + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Initdraw.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Initdraw.java new file mode 100644 index 0000000000..cdb9f48150 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Initdraw.java @@ -0,0 +1,207 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.util.ArrayList; +import android.util.SparseArray; + +public class Initdraw { + + public static int ii=0; + public static int showpagenumber=0; + + SuperBlock superblock = new SuperBlock(); + Parsedocument parsedocument = new Parsedocument(); + public static SparseArray<ArrayList<Integer>> pageline = new SparseArray<ArrayList<Integer>>(); + public static SparseArray<ArrayList<Integer>> pageline2 = new SparseArray<ArrayList<Integer>>(); + public static Integer pagenumber = -1; + public static Integer totalline=-1; + public static float containerwidth2; + public static float containerheight2; + public static float height=0; + + public void initdraw(float containerwidth,float containerheight){ + containerwidth2=containerwidth; + containerheight2=containerheight; + float ypos=Header.firstypos+Header.topsidemargin+SuperBlock.superblocklineheight.get(0).get(0)-SuperBlock.superblocklinedepth.get(0).get(0); + float viewportheight=containerheight-Header.topsidemargin-Header.bottomsidemargin; + + for (int i=0;i<=Header.nthread-1;i++){ + for (int ii=0;ii<=SuperBlock.superblocklinenumber.get(i);ii++){ + int index=i*1000+ii; + for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){ + float t=SuperBlock.blockypos.get(index).get(iii)+ypos; + SuperBlock.blockypos.get(index).set(iii, t); + } + } + + ypos=ypos+SuperBlock.ypos.get(i); + } + + pagenumber++; + pageline.put(pagenumber, new ArrayList<Integer>()); + ypos=0.0f; + float adjusty=0.0f; + for (int i=0;i<=Header.nthread-1;i++){ + + int i2=i*1000; + int tablenumber=1; + + for (int ii=0;ii<=SuperBlock.superblocklinenumber.get(i);ii++){ + + int index=i2+ii; + if (tablenumber <=SuperBlock.tablenumber.get(i) && ii==SuperBlock.tablestartline.get(tablenumber+i2)){ + float height2=SuperBlock.blockypos.get(index).get(0)-(SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii))+SuperBlock.tableheight.get(i2+tablenumber)-ypos; + + if (height2>viewportheight && !SuperBlock.pagebreak.get(i).contains(ii)){ + +// If there is table which does not fit into current page, move the line behind the table ahead. + + int j=i; + int j2=j*1000; + int jj=SuperBlock.tableendline.get(tablenumber+j2)+1; + + if(jj>SuperBlock.superblocklinenumber.get(j) + &&(tablenumber+1<=SuperBlock.tablenumber.get(j) && jj !=SuperBlock.tablestartline.get(tablenumber+j2+1)) + && j<Header.nthread-1){jj=jj-SuperBlock.superblocklinenumber.get(j);j++;j2=j*1000;} + int totalline2=totalline+(SuperBlock.tableendline.get(j2+tablenumber)-SuperBlock.tablestartline.get(i2+tablenumber))+2; + + if (jj<=SuperBlock.superblocklinenumber.get(j) && (tablenumber+1>SuperBlock.tablenumber.get(j) || jj !=SuperBlock.tablestartline.get(tablenumber+j2+1))){ + + index=j2+jj; + + if (SuperBlock.blockatom.indexOfKey(index)<0){j++;j2=j*1000;jj=0;index=j2+jj;} + while (SuperBlock.blockypos.get(index).size()==0){jj++;index=j2+jj;totalline2++;}; + float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(j).get(jj)-SuperBlock.tableheight.get(i2+tablenumber)-ypos; + + while(height<viewportheight + && (tablenumber+1>SuperBlock.tablenumber.get(j) || jj !=SuperBlock.tablestartline.get(tablenumber+j2+1)) + && !(jj== SuperBlock.superblocklinenumber.get(j) && j==Header.nthread-1) + && !SuperBlock.pagebreak.get(j).contains(jj)){ + + pageline.get(pagenumber).add(totalline2); + if (SuperBlock.blockypos.get(index).size()>0){ + adjusty=SuperBlock.superblocklineheight.get(j).get(jj)+adjusty; + for (int jjj=0;jjj<=SuperBlock.blockatom.get(index).size()-1;jjj++){ + float t=SuperBlock.blockypos.get(index).get(jjj)-ypos-SuperBlock.tableheight.get(i2+tablenumber); + SuperBlock.blockypos.get(index).set(jjj, t); + }} + jj++;if(jj>SuperBlock.superblocklinenumber.get(j) && j<Header.nthread-1){j++;jj=0;j2=j*1000;} + index=j2+jj; + totalline2++; + height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(j).get(jj)-SuperBlock.tableheight.get(i2+tablenumber)-ypos; + } + if(height<viewportheight && (jj== SuperBlock.superblocklinenumber.get(j) && j==Header.nthread-1)){ + pageline.get(pagenumber).add(totalline2); + if (SuperBlock.blockypos.get(index).size()>0){ + adjusty=SuperBlock.superblocklineheight.get(j).get(jj)+adjusty; + for (int jjj=0;jjj<=SuperBlock.blockatom.get(index).size()-1;jjj++){ + float t=SuperBlock.blockypos.get(index).get(jjj)-ypos-SuperBlock.tableheight.get(i2+tablenumber); + SuperBlock.blockypos.get(index).set(jjj, t); + }} + } + } +// Now adjust the table + pagenumber++; + pageline.put(pagenumber,new ArrayList<Integer>()); + index=i2+ii; + float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii); + ypos=SuperBlock.blockypos.get(index).get(0)-t; + if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0);} + + for (ii=SuperBlock.tablestartline.get(i2+tablenumber);ii<=SuperBlock.tableendline.get(i2+tablenumber);ii++){ + index=i2+ii; + totalline++;pageline.get(pagenumber).add(totalline); + for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){ + t=SuperBlock.blockypos.get(index).get(iii)-ypos; + SuperBlock.blockypos.get(index).set(iii, t); + } + } + totalline=totalline2-1; + i=j; + i2=i*1000; + tablenumber++; + if (jj== SuperBlock.superblocklinenumber.get(j) && j==Header.nthread-1) {ii=jj;} else{ii=jj-1;} + index=i2+ii; + if (SuperBlock.pagebreak.get(i).contains(ii)){ + pagenumber++; + if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;}; + pageline.put(pagenumber, new ArrayList<Integer>()); + t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii); + ypos=SuperBlock.blockypos.get(index).get(0)-t; + } else { + ypos=ypos+adjusty; + adjusty=0.0f; + } + + } else if (!SuperBlock.pagebreak.get(i).contains(ii)){ + +// table can fit into current page. + totalline++; + if (SuperBlock.blockypos.get(index).size()>0){ + float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(i).get(ii)-ypos; + if (height>viewportheight && SuperBlock.pagebreak.get(i).contains(ii)){ + pagenumber++; + + if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;}; + pageline.put(pagenumber, new ArrayList<Integer>()); + float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii); + ypos=SuperBlock.blockypos.get(index).get(0)-t; + if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0);} + } + pageline.get(pagenumber).add(totalline); + + for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){ + float t=SuperBlock.blockypos.get(index).get(iii)-ypos; + SuperBlock.blockypos.get(index).set(iii, t); + }} + }else { +// pagebreak, new page for table or graphics + totalline++; + if (SuperBlock.blockypos.get(index).size()>0){ + float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(i).get(ii)-ypos; + + if (height>viewportheight || SuperBlock.pagebreak.get(i).contains(ii)){ + pagenumber++; + if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;}; + pageline.put(pagenumber, new ArrayList<Integer>()); + float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii); + ypos=SuperBlock.blockypos.get(index).get(0)-t; + if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0)-Header.firstypos;} + } + pageline.get(pagenumber).add(totalline); + for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){ + float t=SuperBlock.blockypos.get(index).get(iii)-ypos; + SuperBlock.blockypos.get(index).set(iii, t); + }} + } + } else { +// Not table nor graphics + totalline++; + if (SuperBlock.blockypos.get(index).size()>0){ + float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(i).get(ii)-ypos; + + if (height>viewportheight || SuperBlock.pagebreak.get(i).contains(ii)){ + pagenumber++; + if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;}; + pageline.put(pagenumber, new ArrayList<Integer>()); + float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii); + ypos=SuperBlock.blockypos.get(index).get(0)-t; + if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0)-Header.firstypos;} + } + pageline.get(pagenumber).add(totalline); + for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){ + float t=SuperBlock.blockypos.get(index).get(iii)-ypos; + SuperBlock.blockypos.get(index).set(iii, t); + }} + } + } + } + return; + } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/KnuthLiangTable.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/KnuthLiangTable.java new file mode 100644 index 0000000000..902c2eb4ec --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/KnuthLiangTable.java @@ -0,0 +1,8919 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.*; + +public class KnuthLiangTable { + String pattern1[] = new String[]{ + ".ach4", + ".ad4der", + ".af1t", + ".al3t", + ".am5at", + ".an5c", + ".ang4", + ".ani5m", + ".ant4", + ".an3te", + ".anti5s", + ".ar5s", + ".ar4tie", + ".ar4ty", + ".as3c", + ".as1p", + ".as1s", + ".aster5", + ".atom5", + ".au1d", + ".av4i", + ".awn4", + ".ba4g", + ".ba5na", + ".bas4e", + ".ber4", + ".be5ra", + ".be3sm", + ".be5sto", + ".bri2", + ".but4ti", + ".cam4pe", + ".can5c", + ".capa5b", + ".car5ol", + ".ca4t", + ".ce4la", + ".ch4", + ".chill5i", + ".ci2", + ".cit5r", + ".co3e", + ".co4r", + ".cor5ner", + ".de4moi", + ".de3o", + ".de3ra", + ".de3ri", + ".des4c", + ".dictio5", + ".do4t", + ".du4c", + ".dumb5", + ".earth5", + ".eas3i", + ".eb4", + ".eer4", + ".eg2", + ".el5d", + ".el3em", + ".enam3", + ".en3g", + ".en3s", + ".eq5ui5t", + ".er4ri", + ".es3", + ".eu3", + ".eye5", + ".fes3", + ".for5mer", + ".ga2", + ".ge2", + ".gen3t4", + ".ge5og", + ".gi5a", + ".gi4b", + ".go4r", + ".hand5i", + ".han5k", + ".he2", + ".hero5i", + ".hes3", + ".het3", + ".hi3b", + ".hi3er", + ".hon5ey", + ".hon3o", + ".hov5", + ".id4l", + ".idol3", + ".im3m", + ".im5pin", + ".in1", + ".in3ci", + ".ine2", + ".in2k", + ".in3s", + ".ir5r", + ".is4i", + ".ju3r", + ".la4cy", + ".la4m", + ".lat5er", + ".lath5", + ".le2", + ".leg5e", + ".len4", + ".lep5", + ".lev1", + ".li4g", + ".lig5a", + ".li2n", + ".li3o", + ".li4t", + ".mag5a5", + ".mal5o", + ".man5a", + ".mar5ti", + ".me2", + ".mer3c", + ".me5ter", + ".mis1", + ".mist5i", + ".mon3e", + ".mo3ro", + ".mu5ta", + ".muta5b", + ".ni4c", + ".od2", + ".odd5", + ".of5te", + ".or5ato", + ".or3c", + ".or1d", + ".or3t", + ".os3", + ".os4tl", + ".oth3", + ".out3", + ".ped5al", + ".pe5te", + ".pe5tit", + ".pi4e", + ".pio5n", + ".pi2t", + ".pre3m", + ".ra4c", + ".ran4t", + ".ratio5na", + ".ree2", + ".re5mit", + ".res2", + ".re5stat", + ".ri4g", + ".rit5u", + ".ro4q", + ".ros5t", + ".row5d", + ".ru4d", + ".sci3e", + ".self5", + ".sell5", + ".se2n", + ".se5rie", + ".sh2", + ".si2", + ".sing4", + ".st4", + ".sta5bl", + ".sy2", + ".ta4", + ".te4", + ".ten5an", + ".th2", + ".ti2", + ".til4", + ".tim5o5", + ".ting4", + ".tin5k", + ".ton4a", + ".to4p", + ".top5i", + ".tou5s", + ".trib5ut", + ".un1a", + ".un3ce", + ".under5", + ".un1e", + ".un5k", + ".un5o", + ".un3u", + ".up3", + ".ure3", + ".us5a", + ".ven4de", + ".ve5ra", + ".wil5i", + ".ye4", + "4ab.", + "a5bal", + "a5ban", + "abe2", + "ab5erd", + "abi5a", + "ab5it5ab", + "ab5lat", + "ab5o5liz", + "4abr", + "ab5rog", + "ab3ul", + "a4car", + "ac5ard", + "ac5aro", + "a5ceou", + "ac1er", + "a5chet", + "4a2ci", + "a3cie", + "ac1in", + "a3cio", + "ac5rob", + "act5if", + "ac3ul", + "ac4um", + "a2d", + "ad4din", + "ad5er.", + "2adi", + "a3dia", + "ad3ica", + "adi4er", + "a3dio", + "a3dit", + "a5diu", + "ad4le", + "ad3ow", + "ad5ran", + "ad4su", + "4adu", + "a3duc", + "ad5um", + "ae4r", + "aeri4e", + "a2f", + "aff4", + "a4gab", + "aga4n", + "ag5ell", + "age4o", + "4ageu", + "ag1i", + "4ag4l", + "ag1n", + "a2go", + "3agog", + "ag3oni", + "a5guer", + "ag5ul", + "a4gy", + "a3ha", + "a3he", + "ah4l", + "a3ho", + "ai2", + "a5ia", + "a3ic.", + "ai5ly", + "a4i4n", + "ain5in", + "ain5o", + "ait5en", + "a1j", + "ak1en", + "al5ab", + "al3ad", + "a4lar", + "4aldi", + "2ale", + "al3end", + "a4lenti", + "a5le5o", + "al1i", + "al4ia.", + "ali4e", + "al5lev", + "4allic", + "4alm", + "a5log.", + "a4ly.", + "4alys", + "5a5lyst", + "5alyt", + "3alyz", + "4ama", + "am5ab", + "am3ag", + "ama5ra", + "am5asc", + "a4matis", + "a4m5ato", + "am5era", + "am3ic", + "am5if", + "am5ily", + "am1in", + "ami4no", + "a2mo", + "a5mon", + "amor5i", + "amp5en", + "a2n", + "an3age", + "3analy", + "a3nar", + "an3arc", + "anar4i", + "a3nati", + "4and", + "ande4s", + "an3dis", + "an1dl", + "an4dow", + "a5nee", + "a3nen", + "an5est.", + "a3neu", + "2ang", + "ang5ie", + "an1gl", + "a4n1ic", + "a3nies", + "an3i3f", + "an4ime", + "a5nimi", + "a5nine", + "an3io", + "a3nip", + "an3ish", + "an3it", + "a3niu", + "an4kli", + "5anniz", + "ano4", + "an5ot", + "anoth5", + "an2sa", + "an4sco", + "an4sn", + "an2sp", + "ans3po", + "an4st", + "an4sur", + "antal4", + "an4tie", + "4anto", + "an2tr", + "an4tw", + "an3ua", + "an3ul", + "a5nur", + "4ao", + "apar4", + "ap5at", + "ap5ero", + "a3pher", + "4aphi", + "a4pilla", + "ap5illar", + "ap3in", + "ap3ita", + "a3pitu", + "a2pl", + "apoc5", + "ap5ola", + "apor5i", + "apos3t", + "aps5es", + "a3pu", + "aque5", + "2a2r", + "ar3act", + "a5rade", + "ar5adis", + "ar3al", + "a5ramete", + "aran4g", + "ara3p", + "ar4at", + "a5ratio", + "ar5ativ", + "a5rau", + "ar5av4", + "araw4", + "arbal4", + "ar4chan", + "ar5dine", + "ar4dr", + "ar5eas", + "a3ree", + "ar3ent", + "a5ress", + "ar4fi", + "ar4fl", + "ar1i", + "ar5ial", + "ar3ian", + "a3riet", + "ar4im", + "ar5inat", + "ar3io", + "ar2iz", + "ar2mi", + "ar5o5d", + "a5roni", + "a3roo", + "ar2p", + "ar3q", + "arre4", + "ar4sa", + "ar2sh", + "4as.", + "as4ab", + "as3ant", + "ashi4", + "a5sia.", + "a3sib", + "a3sic", + "5a5si4t", + "ask3i", + "as4l", + "a4soc", + "as5ph", + "as4sh", + "as3ten", + "as1tr", + "asur5a", + "a2ta", + "at3abl", + "at5ac", + "at3alo", + "at5ap", + "ate5c", + "at5ech", + "at3ego", + "at3en.", + "at3era", + "ater5n", + "a5terna", + "at3est", + "at5ev", + "4ath", + "ath5em", + "a5then", + "at4ho", + "ath5om", + "4ati.", + "a5tia", + "at5i5b", + "at1ic", + "at3if", + "ation5ar", + "at3itu", + "a4tog", + "a2tom", + "at5omiz", + "a4top", + "a4tos", + "a1tr", + "at5rop", + "at4sk", + "at4tag", + "at5te", + "at4th", + "a2tu", + "at5ua", + "at5ue", + "at3ul", + "at3ura", + "a2ty", + "au4b", + "augh3", + "au3gu", + "au4l2", + "aun5d", + "au3r", + "au5sib", + "aut5en", + "au1th", + "a2va", + "av3ag", + "a5van", + "ave4no", + "av3era", + "av5ern", + "av5ery", + "av1i", + "avi4er", + "av3ig", + "av5oc", + "a1vor", + "3away", + "aw3i", + "aw4ly", + "aws4", + "ax4ic", + "ax4id", + "ay5al", + "aye4", + "ays4", + "azi4er", + "azz5i", + "5ba.", + "bad5ger", + "ba4ge", + "bal1a", + "ban5dag", + "ban4e", + "ban3i", + "barbi5", + "bari4a", + "bas4si", + "1bat", + "ba4z", + "2b1b", + "b2be", + "b3ber", + "bbi4na", + "4b1d", + "4be.", + "beak4", + "beat3", + "4be2d", + "be3da", + "be3de", + "be3di", + "be3gi", + "be5gu", + "1bel", + "be1li", + "be3lo", + "4be5m", + "be5nig", + "be5nu", + "4bes4", + "be3sp", + "be5str", + "3bet", + "bet5iz", + "be5tr", + "be3tw", + "be3w", + "be5yo", + "2bf", + "4b3h", + "bi2b", + "bi4d", + "3bie", + "bi5en", + "bi4er", + "2b3if", + "1bil", + "bi3liz", + "bina5r4", + "bin4d", + "bi5net", + "bi3ogr", + "bi5ou", + "bi2t", + "3bi3tio", + "bi3tr", + "3bit5ua", + "b5itz", + "b1j", + "bk4", + "b2l2", + "blath5", + "b4le.", + "blen4", + "5blesp", + "b3lis", + "b4lo", + "blun4t", + "4b1m", + "4b3n", + "bne5g", + "3bod", + "bod3i", + "bo4e", + "bol3ic", + "bom4bi", + "bon4a", + "bon5at", + "3boo", + "5bor.", + "4b1ora", + "bor5d", + "5bore", + "5bori", + "5bos4", + "b5ota", + "both5", + "bo4to", + "bound3", + "4bp", + "4brit", + "broth3", + "2b5s2", + "bsor4", + "2bt", + "bt4l", + "b4to", + "b3tr", + "buf4fer", + "bu4ga", + "bu3li", + "bumi4", + "bu4n", + "bunt4i", + "bu3re", + "bus5ie", + "buss4e", + "5bust", + "4buta", + "3butio", + "b5uto", + "b1v", + "4b5w", + "5by.", + "bys4", + "1ca", + "cab3in", + "ca1bl", + "cach4", + "ca5den", + "4cag4", + "2c5ah", + "ca3lat", + "cal4la", + "call5in", + "4calo", + "can5d", + "can4e", + "can4ic", + "can5is", + "can3iz", + "can4ty", + "cany4", + "ca5per", + "car5om", + "cast5er", + "cas5tig", + "4casy", + "ca4th", + "4cativ", + "cav5al", + "c3c", + "ccha5", + "cci4a", + "ccompa5", + "ccon4", + "ccou3t", + "2ce.", + "4ced.", + "4ceden", + "3cei", + "5cel.", + "3cell", + "1cen", + "3cenc", + "2cen4e", + "4ceni", + "3cent", + "3cep", + "ce5ram", + "4cesa", + "3cessi", + "ces5si5b", + "ces5t", + "cet4", + "c5e4ta", + "cew4", + "2ch", + "4ch.", + "4ch3ab", + "5chanic", + "ch5a5nis", + "che2", + "cheap3", + "4ched", + "che5lo", + "3chemi", + "ch5ene", + "ch3er.", + "ch3ers", + "4ch1in", + "5chine.", + "ch5iness", + "5chini", + "5chio", + "3chit", + "chi2z", + "3cho2", + "ch4ti", + "1ci", + "3cia", + "ci2a5b", + "cia5r", + "ci5c", + "4cier", + "5cific.", + "4cii", + "ci4la", + "3cili", + "2cim", + "2cin", + "c4ina", + "3cinat", + "cin3em", + "c1ing", + "c5ing.", + "5cino", + "cion4", + "4cipe", + "ci3ph", + "4cipic", + "4cista", + "4cisti", + "2c1it", + "cit3iz", + "5ciz", + "ck1", + "ck3i", + "1c4l4", + "4clar", + "c5laratio", + "5clare", + "cle4m", + "4clic", + "clim4", + "cly4", + "c5n", + "1co", + "co5ag", + "coe2", + "2cog", + "co4gr", + "coi4", + "co3inc", + "col5i", + "5colo", + "col3or", + "com5er", + "con4a", + "c4one", + "con3g", + "con5t", + "co3pa", + "cop3ic", + "co4pl", + "4corb", + "coro3n", + "cos4e", + "cov1", + "cove4", + "cow5a", + "coz5e", + "co5zi", + "c1q", + "cras5t", + "5crat.", + "5cratic", + "cre3at", + "5cred", + "4c3reta", + "cre4v", + "cri2", + "cri5f", + "c4rin", + "cris4", + "5criti", + "cro4pl", + "crop5o", + "cros4e", + "cru4d", + "4c3s2", + "2c1t", + "cta4b", + "ct5ang", + "c5tant", + "c2te", + "c3ter", + "c4ticu", + "ctim3i", + "ctu4r", + "c4tw", + "cud5", + "c4uf", + "c4ui", + "cu5ity", + "5culi", + "cul4tis", + "3cultu", + "cu2ma", + "c3ume", + "cu4mi", + "3cun", + "cu3pi", + "cu5py", + "cur5a4b", + "cu5ria", + "1cus", + "cuss4i", + "3c4ut", + "cu4tie", + "4c5utiv", + "4cutr", + "1cy", + "cze4", + "1d2a", + "5da.", + "2d3a4b", + "dach4", + "4daf", + "2dag", + "da2m2", + "dan3g", + "dard5", + "dark5", + "4dary", + "3dat", + "4dativ", + "4dato", + "5dav4", + "dav5e", + "5day", + "d1b", + "d5c", + "d1d4", + "2de.", + "deaf5", + "deb5it", + "de4bon", + "decan4", + "de4cil", + "de5com", + "2d1ed", + "4dee.", + "de5if", + "deli4e", + "del5i5q", + "de5lo", + "d4em", + "5dem.", + "3demic", + "dem5ic.", + "de5mil", + "de4mons", + "demor5", + "1den", + "de4nar", + "de3no", + "denti5f", + "de3nu", + "de1p", + "de3pa", + "depi4", + "de2pu", + "d3eq", + "d4erh", + "5derm", + "dern5iz", + "der5s", + "des2", + "d2es.", + "de1sc", + "de2s5o", + "des3ti", + "de3str", + "de4su", + "de1t", + "de2to", + "de1v", + "dev3il", + "4dey", + "4d1f", + "d4ga", + "d3ge4t", + "dg1i", + "d2gy", + "d1h2", + "5di.", + "1d4i3a", + "dia5b", + "di4cam", + "d4ice", + "3dict", + "3did", + "5di3en", + "d1if", + "di3ge", + "di4lato", + "d1in", + "1dina", + "3dine.", + "5dini", + "di5niz", + "1dio", + "dio5g", + "di4pl", + "dir2", + "di1re", + "dirt5i", + "dis1", + "5disi", + "d4is3t", + "d2iti", + "1di1v", + "d1j", + "d5k2", + "4d5la", + "3dle.", + "3dled", + "3dles.", + "4dless", + "2d3lo", + "4d5lu", + "2dly", + "d1m", + "4d1n4", + "1do", + "3do.", + "do5de", + "5doe", + "2d5of", + "d4og", + "do4la", + "doli4", + "do5lor", + "dom5iz", + "do3nat", + "doni4", + "doo3d", + "dop4p", + "d4or", + "3dos", + "4d5out", + "do4v", + "3dox", + "d1p", + "1dr", + "drag5on", + "4drai", + "dre4", + "drea5r", + "5dren", + "dri4b", + "dril4", + "dro4p", + "4drow", + "5drupli", + "4dry", + "2d1s2", + "ds4p", + "d4sw", + "d4sy", + "d2th", + "1du", + "d1u1a", + "du2c", + "d1uca", + "duc5er", + "4duct.", + "4ducts", + "du5el", + "du4g", + "d3ule", + "dum4be", + "du4n", + "4dup", + "du4pe", + "d1v", + "d1w", + "d2y", + "5dyn", + "dy4se", + "dys5p", + "e1a4b", + "e3act", + "ead1", + "ead5ie", + "ea4ge", + "ea5ger", + "ea4l", + "eal5er", + "eal3ou", + "eam3er", + "e5and", + "ear3a", + "ear4c", + "ear5es", + "ear4ic", + "ear4il", + "ear5k", + "ear2t", + "eart3e", + "ea5sp", + "e3ass", + "east3", + "ea2t", + "eat5en", + "eath3i", + "e5atif", + "e4a3tu", + "ea2v", + "eav3en", + "eav5i", + "eav5o", + "2e1b", + "e4bel.", + "e4bels", + "e4ben", + "e4bit", + "e3br", + "e4cad", + "ecan5c", + "ecca5", + "e1ce", + "ec5essa", + "ec2i", + "e4cib", + "ec5ificat", + "ec5ifie", + "ec5ify", + "ec3im", + "eci4t", + "e5cite", + "e4clam", + "e4clus", + "e2col", + "e4comm", + "e4compe", + "e4conc", + "e2cor", + "ec3ora", + "eco5ro", + "e1cr", + "e4crem", + "ec4tan", + "ec4te", + "e1cu", + "e4cul", + "ec3ula", + "2e2da", + "4ed3d", + "e4d1er", + "ede4s", + "4edi", + "e3dia", + "ed3ib", + "ed3ica", + "ed3im", + "ed1it", + "edi5z", + "4edo", + "e4dol", + "edon2", + "e4dri", + "e4dul", + "ed5ulo", + "ee2c", + "eed3i", + "ee2f", + "eel3i", + "ee4ly", + "ee2m", + "ee4na", + "ee4p1", + "ee2s4", + "eest4", + "ee4ty", + "e5ex", + "e1f", + "e4f3ere", + "1eff", + "e4fic", + "5efici", + "efil4", + "e3fine", + "ef5i5nite", + "3efit", + "efor5es", + "e4fuse.", + "4egal", + "eger4", + "eg5ib", + "eg4ic", + "eg5ing", + "e5git5", + "eg5n", + "e4go.", + "e4gos", + "eg1ul", + "e5gur", + "5egy", + "e1h4", + "eher4", + "ei2", + "e5ic", + "ei5d", + "eig2", + "ei5gl", + "e3imb", + "e3inf", + "e1ing", + "e5inst", + "eir4d", + "eit3e", + "ei3th", + "e5ity", + "e1j", + "e4jud", + "ej5udi", + "eki4n", + "ek4la", + "e1la", + "e4la.", + "e4lac", + "elan4d", + "el5ativ", + "e4law", + "elaxa4", + "e3lea", + "el5ebra", + "5elec", + "e4led", + "el3ega", + "e5len", + "e4l1er", + "e1les", + "el2f", + "el2i", + "e3libe", + "e4l5ic.", + "el3ica", + "e3lier", + "el5igib", + "e5lim", + "e4l3ing", + "e3lio", + "e2lis", + "el5ish", + "e3liv3", + "4ella", + "el4lab", + "ello4", + "e5loc", + "el5og", + "el3op.", + "el2sh", + "el4ta", + "e5lud", + "el5ug", + "e4mac", + "e4mag", + "e5man", + "em5ana", + "em5b", + "e1me", + "e2mel", + "e4met", + "em3ica", + "emi4e", + "em5igra", + "em1in2", + "em5ine", + "em3i3ni", + "e4mis", + "em5ish", + "e5miss", + "em3iz", + "5emniz", + "emo4g", + "emoni5o", + "em3pi", + "e4mul", + "em5ula", + "emu3n", + "e3my", + "en5amo", + "e4nant", + "ench4er", + "en3dic", + "e5nea", + "e5nee", + "en3em", + "en5ero", + "en5esi", + "en5est", + "en3etr", + "e3new", + "en5ics", + "e5nie", + "e5nil", + "e3nio", + "en3ish", + "en3it", + "e5niu", + "5eniz", + "4enn", + "4eno", + "eno4g", + "e4nos", + "en3ov", + "en4sw", + "ent5age", + "4enthes", + "en3ua", + "en5uf", + "e3ny.", + "4en3z", + "e5of", + "eo2g", + "e4oi4", + "e3ol", + "eop3ar", + "e1or", + "eo3re", + "eo5rol", + "eos4", + "e4ot", + "eo4to", + "e5out", + "e5ow", + "e2pa", + "e3pai", + "ep5anc", + "e5pel", + "e3pent", + "ep5etitio", + "ephe4", + "e4pli", + "e1po", + "e4prec", + "ep5reca", + "e4pred", + "ep3reh", + "e3pro", + "e4prob", + "ep4sh", + "ep5ti5b", + "e4put", + "ep5uta", + "e1q", + "equi3l", + "e4q3ui3s", + "er1a", + "era4b", + "4erand", + "er3ar", + "4erati.", + "2erb", + "er4bl", + "er3ch", + "er4che", + "2ere.", + "e3real", + "ere5co", + "ere3in", + "er5el.", + "er3emo", + "er5ena", + "er5ence", + "4erene", + "er3ent", + "ere4q", + "er5ess", + "er3est", + "eret4", + "er1h", + "er1i", + "e1ria4", + "5erick", + "e3rien", + "eri4er", + "er3ine", + "e1rio", + "4erit", + "er4iu", + "eri4v", + "e4riva", + "er3m4", + "er4nis", + "4ernit", + "5erniz", + "er3no", + "2ero", + "er5ob", + "e5roc", + "ero4r", + "er1ou", + "er1s", + "er3set", + "ert3er", + "4ertl", + "er3tw", + "4eru", + "eru4t", + "5erwau", + "e1s4a", + "e4sage.", + "e4sages", + "es2c", + "e2sca", + "es5can", + "e3scr", + "es5cu", + "e1s2e", + "e2sec", + "es5ecr", + "es5enc", + "e4sert.", + "e4serts", + "e4serva", + "4esh", + "e3sha", + "esh5en", + "e1si", + "e2sic", + "e2sid", + "es5iden", + "es5igna", + "e2s5im", + "es4i4n", + "esis4te", + "esi4u", + "e5skin", + "es4mi", + "e2sol", + "es3olu", + "e2son", + "es5ona", + "e1sp", + "es3per", + "es5pira", + "es4pre", + "2ess", + "es4si4b", + "estan4", + "es3tig", + "es5tim", + "4es2to", + "e3ston", + "2estr", + "e5stro", + "estruc5", + "e2sur", + "es5urr", + "es4w", + "eta4b", + "eten4d", + "e3teo", + "ethod3", + "et1ic", + "e5tide", + "etin4", + "eti4no", + "e5tir", + "e5titio", + "et5itiv", + "4etn", + "et5ona", + "e3tra", + "e3tre", + "et3ric", + "et5rif", + "et3rog", + "et5ros", + "et3ua", + "et5ym", + "et5z", + "4eu", + "e5un", + "e3up", + "eu3ro", + "eus4", + "eute4", + "euti5l", + "eu5tr", + "eva2p5", + "e2vas", + "ev5ast", + "e5vea", + "ev3ell", + "evel3o", + "e5veng", + "even4i", + "ev1er", + "e5verb", + "e1vi", + "ev3id", + "evi4l", + "e4vin", + "evi4v", + "e5voc", + "e5vu", + "e1wa", + "e4wag", + "e5wee", + "e3wh", + "ewil5", + "ew3ing", + "e3wit", + "1exp", + "5eyc", + "5eye.", + "eys4", + "1fa", + "fa3bl", + "fab3r", + "fa4ce", + "4fag", + "fain4", + "fall5e", + "4fa4ma", + "fam5is", + "5far", + "far5th", + "fa3ta", + "fa3the", + "4fato", + "fault5", + "4f5b", + "4fd", + "4fe.", + "feas4", + "feath3", + "fe4b", + "4feca", + "5fect", + "2fed", + "fe3li", + "fe4mo", + "fen2d", + "fend5e", + "fer1", + "5ferr", + "fev4", + "4f1f", + "f4fes", + "f4fie", + "f5fin.", + "f2f5is", + "f4fly", + "f2fy", + "4fh", + "1fi", + "fi3a", + "2f3ic.", + "4f3ical", + "f3ican", + "4ficate", + "f3icen", + "fi3cer", + "fic4i", + "5ficia", + "5ficie", + "4fics", + "fi3cu", + "fi5del", + "fight5", + "fil5i", + "fill5in", + "4fily", + "2fin", + "5fina", + "fin2d5", + "fi2ne", + "f1in3g", + "fin4n", + "fis4ti", + "f4l2", + "f5less", + "flin4", + "flo3re", + "f2ly5", + "4fm", + "4fn", + "1fo", + "5fon", + "fon4de", + "fon4t", + "fo2r", + "fo5rat", + "for5ay", + "fore5t", + "for4i", + "fort5a", + "fos5", + "4f5p", + "fra4t", + "f5rea", + "fres5c", + "fri2", + "fril4", + "frol5", + "2f3s", + "2ft", + "f4to", + "f2ty", + "3fu", + "fu5el", + "4fug", + "fu4min", + "fu5ne", + "fu3ri", + "fusi4", + "fus4s", + "4futa", + "1fy", + "1ga", + "gaf4", + "5gal.", + "3gali", + "ga3lo", + "2gam", + "ga5met", + "g5amo", + "gan5is", + "ga3niz", + "gani5za", + "4gano", + "gar5n4", + "gass4", + "gath3", + "4gativ", + "4gaz", + "g3b", + "gd4", + "2ge.", + "2ged", + "geez4", + "gel4in", + "ge5lis", + "ge5liz", + "4gely", + "1gen", + "ge4nat", + "ge5niz", + "4geno", + "4geny", + "1geo", + "ge3om", + "g4ery", + "5gesi", + "geth5", + "4geto", + "ge4ty", + "ge4v", + "4g1g2", + "g2ge", + "g3ger", + "gglu5", + "ggo4", + "gh3in", + "gh5out", + "gh4to", + "5gi.", + "1gi4a", + "gia5r", + "g1ic", + "5gicia", + "g4ico", + "gien5", + "5gies.", + "gil4", + "g3imen", + "3g4in.", + "gin5ge", + "5g4ins", + "5gio", + "3gir", + "gir4l", + "g3isl", + "gi4u", + "5giv", + "3giz", + "gl2", + "gla4", + "glad5i", + "5glas", + "1gle", + "gli4b", + "g3lig", + "3glo", + "glo3r", + "g1m", + "g4my", + "gn4a", + "g4na.", + "gnet4t", + "g1ni", + "g2nin", + "g4nio", + "g1no", + "g4non", + "1go", + "3go.", + "gob5", + "5goe", + "3g4o4g", + "go3is", + "gon2", + "4g3o3na", + "gondo5", + "go3ni", + "5goo", + "go5riz", + "gor5ou", + "5gos.", + "gov1", + "g3p", + "1gr", + "4grada", + "g4rai", + "gran2", + "5graph.", + "g5rapher", + "5graphic", + "4graphy", + "4gray", + "gre4n", + "4gress.", + "4grit", + "g4ro", + "gruf4", + "gs2", + "g5ste", + "gth3", + "gu4a", + "3guard", + "2gue", + "5gui5t", + "3gun", + "3gus", + "4gu4t", + "g3w", + "1gy", + "2g5y3n", + "gy5ra", + "h3ab4l", + "hach4", + "hae4m", + "hae4t", + "h5agu", + "ha3la", + "hala3m", + "ha4m", + "han4ci", + "han4cy", + "5hand.", + "han4g", + "hang5er", + "hang5o", + "h5a5niz", + "han4k", + "han4te", + "hap3l", + "hap5t", + "ha3ran", + "ha5ras", + "har2d", + "hard3e", + "har4le", + "harp5en", + "har5ter", + "has5s", + "haun4", + "5haz", + "haz3a", + "h1b", + "1head", + "3hear", + "he4can", + "h5ecat", + "h4ed", + "he5do5", + "he3l4i", + "hel4lis", + "hel4ly", + "h5elo", + "hem4p", + "he2n", + "hena4", + "hen5at", + "heo5r", + "hep5", + "h4era", + "hera3p", + "her4ba", + "here5a", + "h3ern", + "h5erou", + "h3ery", + "h1es", + "he2s5p", + "he4t", + "het4ed", + "heu4", + "h1f", + "h1h", + "hi5an", + "hi4co", + "high5", + "h4il2", + "himer4", + "h4ina", + "hion4e", + "hi4p", + "hir4l", + "hi3ro", + "hir4p", + "hir4r", + "his3el", + "his4s", + "hith5er", + "hi2v", + "4hk", + "4h1l4", + "hlan4", + "h2lo", + "hlo3ri", + "4h1m", + "hmet4", + "2h1n", + "h5odiz", + "h5ods", + "ho4g", + "hoge4", + "hol5ar", + "3hol4e", + "ho4ma", + "home3", + "hon4a", + "ho5ny", + "3hood", + "hoon4", + "hor5at", + "ho5ris", + "hort3e", + "ho5ru", + "hos4e", + "ho5sen", + "hos1p", + "1hous", + "house3", + "hov5el", + "4h5p", + "4hr4", + "hree5", + "hro5niz", + "hro3po", + "4h1s2", + "h4sh", + "h4tar", + "ht1en", + "ht5es", + "h4ty", + "hu4g", + "hu4min", + "hun5ke", + "hun4t", + "hus3t4", + "hu4t", + "h1w", + "h4wart", + "hy3pe", + "hy3ph", + "hy2s", + "2i1a", + "i2al", + "iam4", + "iam5ete", + "i2an", + "4ianc", + "ian3i", + "4ian4t", + "ia5pe", + "iass4", + "i4ativ", + "ia4tric", + "i4atu", + "ibe4", + "ib3era", + "ib5ert", + "ib5ia", + "ib3in", + "ib5it.", + "ib5ite", + "i1bl", + "ib3li", + "i5bo", + "i1br", + "i2b5ri", + "i5bun", + "4icam", + "5icap", + "4icar", + "i4car.", + "i4cara", + "icas5", + "i4cay", + "iccu4", + "4iceo", + "4ich", + "2ici", + "i5cid", + "ic5ina", + "i2cip", + "ic3ipa", + "i4cly", + "i2c5oc", + "4i1cr", + "5icra", + "i4cry", + "ic4te", + "ictu2", + "ic4t3ua", + "ic3ula", + "ic4um", + "ic5uo", + "i3cur", + "2id", + "i4dai", + "id5anc", + "id5d", + "ide3al", + "ide4s", + "i2di", + "id5ian", + "idi4ar", + "i5die", + "id3io", + "idi5ou", + "id1it", + "id5iu", + "i3dle", + "i4dom", + "id3ow", + "i4dr", + "i2du", + "id5uo", + "2ie4", + "ied4e", + "5ie5ga", + "ield3", + "ien5a4", + "ien4e", + "i5enn", + "i3enti", + "i1er.", + "i3esc", + "i1est", + "i3et", + "4if.", + "if5ero", + "iff5en", + "if4fr", + "4ific.", + "i3fie", + "i3fl", + "4ift", + "2ig", + "iga5b", + "ig3era", + "ight3i", + "4igi", + "i3gib", + "ig3il", + "ig3in", + "ig3it", + "i4g4l", + "i2go", + "ig3or", + "ig5ot", + "i5gre", + "igu5i", + "ig1ur", + "i3h", + "4i5i4", + "i3j", + "4ik", + "i1la", + "il3a4b", + "i4lade", + "i2l5am", + "ila5ra", + "i3leg", + "il1er", + "ilev4", + "il5f", + "il1i", + "il3ia", + "il2ib", + "il3io", + "il4ist", + "2ilit", + "il2iz", + "ill5ab", + "4iln", + "il3oq", + "il4ty", + "il5ur", + "il3v", + "i4mag", + "im3age", + "ima5ry", + "imenta5r", + "4imet", + "im1i", + "im5ida", + "imi5le", + "i5mini", + "4imit", + "im4ni", + "i3mon", + "i2mu", + "im3ula", + "2in.", + "i4n3au", + "4inav", + "incel4", + "in3cer", + "4ind", + "in5dling", + "2ine", + "i3nee", + "iner4ar", + "i5ness", + "4inga", + "4inge", + "in5gen", + "4ingi", + "in5gling", + "4ingo", + "4ingu", + "2ini", + "i5ni.", + "i4nia", + "in3io", + "in1is", + "i5nite.", + "5initio", + "in3ity", + "4ink", + "4inl", + "2inn", + "2i1no", + "i4no4c", + "ino4s", + "i4not", + "2ins", + "in3se", + "insur5a", + "2int.", + "2in4th", + "in1u", + "i5nus", + "4iny", + "2io", + "4io.", + "ioge4", + "io2gr", + "i1ol", + "io4m", + "ion3at", + "ion4ery", + "ion3i", + "io5ph", + "ior3i", + "i4os", + "io5th", + "i5oti", + "io4to", + "i4our", + "2ip", + "ipe4", + "iphras4", + "ip3i", + "ip4ic", + "ip4re4", + "ip3ul", + "i3qua", + "iq5uef", + "iq3uid", + "iq3ui3t", + "4ir", + "i1ra", + "ira4b", + "i4rac", + "ird5e", + "ire4de", + "i4ref", + "i4rel4", + "i4res", + "ir5gi", + "ir1i", + "iri5de", + "ir4is", + "iri3tu", + "5i5r2iz", + "ir4min", + "iro4g", + "5iron.", + "ir5ul", + "2is.", + "is5ag", + "is3ar", + "isas5", + "2is1c", + "is3ch", + "4ise", + "is3er", + "3isf", + "is5han", + "is3hon", + "ish5op", + "is3ib", + "isi4d", + "i5sis", + "is5itiv", + "4is4k", + "islan4", + "4isms", + "i2so", + "iso5mer", + "is1p", + "is2pi", + "is4py", + "4is1s", + "is4sal", + "issen4", + "is4ses", + "is4ta.", + "is1te", + "is1ti", + "ist4ly", + "4istral", + "i2su", + "is5us", + "4ita.", + "ita4bi", + "i4tag", + "4ita5m", + "i3tan", + "i3tat", + "2ite", + "it3era", + "i5teri", + "it4es", + "2ith", + "i1ti", + "4itia", + "4i2tic", + "it3ica", + "5i5tick", + "it3ig", + "it5ill", + "i2tim", + "2itio", + "4itis", + "i4tism", + "i2t5o5m", + "4iton", + "i4tram", + "it5ry", + "4itt", + "it3uat", + "i5tud", + "it3ul", + "4itz.", + "i1u", + "2iv", + "iv3ell", + "iv3en.", + "i4v3er.", + "i4vers.", + "iv5il.", + "iv5io", + "iv1it", + "i5vore", + "iv3o3ro", + "i4v3ot", + "4i5w", + "ix4o", + "4iy", + "4izar", + "izi4", + "5izont", + "5ja", + "jac4q", + "ja4p", + "1je", + "jer5s", + "4jestie", + "4jesty", + "jew3", + "jo4p", + "5judg", + "3ka.", + "k3ab", + "k5ag", + "kais4", + "kal4", + "k1b", + "k2ed", + "1kee", + "ke4g", + "ke5li", + "k3en4d", + "k1er", + "kes4", + "k3est.", + "ke4ty", + "k3f", + "kh4", + "k1i", + "5ki.", + "5k2ic", + "k4ill", + "kilo5", + "k4im", + "k4in.", + "kin4de", + "k5iness", + "kin4g", + "ki4p", + "kis4", + "k5ish", + "kk4", + "k1l", + "4kley", + "4kly", + "k1m", + "k5nes", + "1k2no", + "ko5r", + "kosh4", + "k3ou", + "kro5n", + "4k1s2", + "k4sc", + "ks4l", + "k4sy", + "k5t", + "k1w", + "lab3ic", + "l4abo", + "laci4", + "l4ade", + "la3dy", + "lag4n", + "lam3o", + "3land", + "lan4dl", + "lan5et", + "lan4te", + "lar4g", + "lar3i", + "las4e", + "la5tan", + "4lateli", + "4lativ", + "4lav", + "la4v4a", + "2l1b", + "lbin4", + "4l1c2", + "lce4", + "l3ci", + "2ld", + "l2de", + "ld4ere", + "ld4eri", + "ldi4", + "ld5is", + "l3dr", + "l4dri", + "le2a", + "le4bi", + "left5", + "5leg.", + "5legg", + "le4mat", + "lem5atic", + "4len.", + "3lenc", + "5lene.", + "1lent", + "le3ph", + "le4pr", + "lera5b", + "ler4e", + "3lerg", + "3l4eri", + "l4ero", + "les2", + "le5sco", + "5lesq", + "3less", + "5less.", + "l3eva", + "lev4er.", + "lev4era", + "lev4ers", + "3ley", + "4leye", + "2lf", + "l5fr", + "4l1g4", + "l5ga", + "lgar3", + "l4ges", + "lgo3", + "2l3h", + "li4ag", + "li2am", + "liar5iz", + "li4as", + "li4ato", + "li5bi", + "5licio", + "li4cor", + "4lics", + "4lict.", + "l4icu", + "l3icy", + "l3ida", + "lid5er", + "3lidi", + "lif3er", + "l4iff", + "li4fl", + "5ligate", + "3ligh", + "li4gra", + "3lik", + "4l4i4l", + "lim4bl", + "lim3i", + "li4mo", + "l4im4p", + "l4ina", + "1l4ine", + "lin3ea", + "lin3i", + "link5er", + "li5og", + "4l4iq", + "lis4p", + "l1it", + "l2it.", + "5litica", + "l5i5tics", + "liv3er", + "l1iz", + "4lj", + "lka3", + "l3kal", + "lka4t", + "l1l", + "l4law", + "l2le", + "l5lea", + "l3lec", + "l3leg", + "l3lel", + "l3le4n", + "l3le4t", + "ll2i", + "l2lin4", + "l5lina", + "ll4o", + "lloqui5", + "ll5out", + "l5low", + "2lm", + "l5met", + "lm3ing", + "l4mod", + "lmon4", + "2l1n2", + "3lo.", + "lob5al", + "lo4ci", + "4lof", + "3logic", + "l5ogo", + "3logu", + "lom3er", + "5long", + "lon4i", + "l3o3niz", + "lood5", + "5lope.", + "lop3i", + "l3opm", + "lora4", + "lo4rato", + "lo5rie", + "lor5ou", + "5los.", + "los5et", + "5losophiz", + "5losophy", + "los4t", + "lo4ta", + "loun5d", + "2lout", + "4lov", + "2lp", + "lpa5b", + "l3pha", + "l5phi", + "lp5ing", + "l3pit", + "l4pl", + "l5pr", + "4l1r", + "2l1s2", + "l4sc", + "l2se", + "l4sie", + "4lt", + "lt5ag", + "ltane5", + "l1te", + "lten4", + "ltera4", + "lth3i", + "l5ties.", + "ltis4", + "l1tr", + "ltu2", + "ltur3a", + "lu5a", + "lu3br", + "luch4", + "lu3ci", + "lu3en", + "luf4", + "lu5id", + "lu4ma", + "5lumi", + "l5umn.", + "5lumnia", + "lu3o", + "luo3r", + "4lup", + "luss4", + "lus3te", + "1lut", + "l5ven", + "l5vet4", + "2l1w", + "1ly", + "4lya", + "4lyb", + "ly5me", + "ly3no", + "2lys4", + "l5yse", + "1ma", + "2mab", + "ma2ca", + "ma5chine", + "ma4cl", + "mag5in", + "5magn", + "2mah", + "maid5", + "4mald", + "ma3lig", + "ma5lin", + "mal4li", + "mal4ty", + "5mania", + "man5is", + "man3iz", + "4map", + "ma5rine.", + "ma5riz", + "mar4ly", + "mar3v", + "ma5sce", + "mas4e", + "mas1t", + "5mate", + "math3", + "ma3tis", + "4matiza", + "4m1b", + "mba4t5", + "m5bil", + "m4b3ing", + "mbi4v", + "4m5c", + "4me.", + "2med", + "4med.", + "5media", + "me3die", + "m5e5dy", + "me2g", + "mel5on", + "mel4t", + "me2m", + "mem1o3", + "1men", + "men4a", + "men5ac", + "men4de", + "4mene", + "men4i", + "mens4", + "mensu5", + "3ment", + "men4te", + "me5on", + "m5ersa", + "2mes", + "3mesti", + "me4ta", + "met3al", + "me1te", + "me5thi", + "m4etr", + "5metric", + "me5trie", + "me3try", + "me4v", + "4m1f", + "2mh", + "5mi.", + "mi3a", + "mid4a", + "mid4g", + "mig4", + "3milia", + "m5i5lie", + "m4ill", + "min4a", + "3mind", + "m5inee", + "m4ingl", + "min5gli", + "m5ingly", + "min4t", + "m4inu", + "miot4", + "m2is", + "mis4er.", + "mis5l", + "mis4ti", + "m5istry", + "4mith", + "m2iz", + "4mk", + "4m1l", + "m1m", + "mma5ry", + "4m1n", + "mn4a", + "m4nin", + "mn4o", + "1mo", + "4mocr", + "5mocratiz", + "mo2d1", + "mo4go", + "mois2", + "moi5se", + "4mok", + "mo5lest", + "mo3me", + "mon5et", + "mon5ge", + "moni3a", + "mon4ism", + "mon4ist", + "mo3niz", + "monol4", + "mo3ny.", + "mo2r", + "4mora.", + "mos2", + "mo5sey", + "mo3sp", + "moth3", + "m5ouf", + "3mous", + "mo2v", + "4m1p", + "mpara5", + "mpa5rab", + "mpar5i", + "m3pet", + "mphas4", + "m2pi", + "mpi4a", + "mp5ies", + "m4p1in", + "m5pir", + "mp5is", + "mpo3ri", + "mpos5ite", + "m4pous", + "mpov5", + "mp4tr", + "m2py", + "4m3r", + "4m1s2", + "m4sh", + "m5si", + "4mt", + "1mu", + "mula5r4", + "5mult", + "multi3", + "3mum", + "mun2", + "4mup", + "mu4u", + "4mw", + "1na", + "2n1a2b", + "n4abu", + "4nac.", + "na4ca", + "n5act", + "nag5er.", + "nak4", + "na4li", + "na5lia", + "4nalt", + "na5mit", + "n2an", + "nanci4", + "nan4it", + "nank4", + "nar3c", + "4nare", + "nar3i", + "nar4l", + "n5arm", + "n4as", + "nas4c", + "nas5ti", + "n2at", + "na3tal", + "nato5miz", + "n2au", + "nau3se", + "3naut", + "nav4e", + "4n1b4", + "ncar5", + "n4ces.", + "n3cha", + "n5cheo", + "n5chil", + "n3chis", + "nc1in", + "nc4it", + "ncour5a", + "n1cr", + "n1cu", + "n4dai", + "n5dan", + "n1de", + "nd5est.", + "ndi4b", + "n5d2if", + "n1dit", + "n3diz", + "n5duc", + "ndu4r", + "nd2we", + "2ne.", + "n3ear", + "ne2b", + "neb3u", + "ne2c", + "5neck", + "2ned", + "ne4gat", + "neg5ativ", + "5nege", + "ne4la", + "nel5iz", + "ne5mi", + "ne4mo", + "1nen", + "4nene", + "3neo", + "ne4po", + "ne2q", + "n1er", + "nera5b", + "n4erar", + "n2ere", + "n4er5i", + "ner4r", + "1nes", + "2nes.", + "4nesp", + "2nest", + "4nesw", + "3netic", + "ne4v", + "n5eve", + "ne4w", + "n3f", + "n4gab", + "n3gel", + "nge4n4e", + "n5gere", + "n3geri", + "ng5ha", + "n3gib", + "ng1in", + "n5git", + "n4gla", + "ngov4", + "ng5sh", + "n1gu", + "n4gum", + "n2gy", + "4n1h4", + "nha4", + "nhab3", + "nhe4", + "3n4ia", + "ni3an", + "ni4ap", + "ni3ba", + "ni4bl", + "ni4d", + "ni5di", + "ni4er", + "ni2fi", + "ni5ficat", + "n5igr", + "nik4", + "n1im", + "ni3miz", + "n1in", + "5nine.", + "nin4g", + "ni4o", + "5nis.", + "nis4ta", + "n2it", + "n4ith", + "3nitio", + "n3itor", + "ni3tr", + "n1j", + "4nk2", + "n5kero", + "n3ket", + "nk3in", + "n1kl", + "4n1l", + "n5m", + "nme4", + "nmet4", + "4n1n2", + "nne4", + "nni3al", + "nni4v", + "nob4l", + "no3ble", + "n5ocl", + "4n3o2d", + "3noe", + "4nog", + "noge4", + "nois5i", + "no5l4i", + "5nologis", + "3nomic", + "n5o5miz", + "no4mo", + "no3my", + "no4n", + "non4ag", + "non5i", + "n5oniz", + "4nop", + "5nop5o5li", + "nor5ab", + "no4rary", + "4nosc", + "nos4e", + "nos5t", + "no5ta", + "1nou", + "3noun", + "nov3el3", + "nowl3", + "n1p4", + "npi4", + "npre4c", + "n1q", + "n1r", + "nru4", + "2n1s2", + "ns5ab", + "nsati4", + "ns4c", + "n2se", + "n4s3es", + "nsid1", + "nsig4", + "n2sl", + "ns3m", + "n4soc", + "ns4pe", + "n5spi", + "nsta5bl", + "n1t", + "nta4b", + "nter3s", + "nt2i", + "n5tib", + "nti4er", + "nti2f", + "n3tine", + "n4t3ing", + "nti4p", + "ntrol5li", + "nt4s", + "ntu3me", + "nu1a", + "nu4d", + "nu5en", + "nuf4fe", + "n3uin", + "3nu3it", + "n4um", + "nu1me", + "n5umi", + "3nu4n", + "n3uo", + "nu3tr", + "n1v2", + "n1w4", + "nym4", + "nyp4", + "4nz", + "n3za", + "4oa", + "oad3", + "o5a5les", + "oard3", + "oas4e", + "oast5e", + "oat5i", + "ob3a3b", + "o5bar", + "obe4l", + "o1bi", + "o2bin", + "ob5ing", + "o3br", + "ob3ul", + "o1ce", + "och4", + "o3chet", + "ocif3", + "o4cil", + "o4clam", + "o4cod", + "oc3rac", + "oc5ratiz", + "ocre3", + "5ocrit", + "octor5a", + "oc3ula", + "o5cure", + "od5ded", + "od3ic", + "odi3o", + "o2do4", + "odor3", + "od5uct.", + "od5ucts", + "o4el", + "o5eng", + "o3er", + "oe4ta", + "o3ev", + "o2fi", + "of5ite", + "ofit4t", + "o2g5a5r", + "og5ativ", + "o4gato", + "o1ge", + "o5gene", + "o5geo", + "o4ger", + "o3gie", + "1o1gis", + "og3it", + "o4gl", + "o5g2ly", + "3ogniz", + "o4gro", + "ogu5i", + "1ogy", + "2ogyn", + "o1h2", + "ohab5", + "oi2", + "oic3es", + "oi3der", + "oiff4", + "oig4", + "oi5let", + "o3ing", + "oint5er", + "o5ism", + "oi5son", + "oist5en", + "oi3ter", + "o5j", + "2ok", + "o3ken", + "ok5ie", + "o1la", + "o4lan", + "olass4", + "ol2d", + "old1e", + "ol3er", + "o3lesc", + "o3let", + "ol4fi", + "ol2i", + "o3lia", + "o3lice", + "ol5id.", + "o3li4f", + "o5lil", + "ol3ing", + "o5lio", + "o5lis.", + "ol3ish", + "o5lite", + "o5litio", + "o5liv", + "olli4e", + "ol5ogiz", + "olo4r", + "ol5pl", + "ol2t", + "ol3ub", + "ol3ume", + "ol3un", + "o5lus", + "ol2v", + "o2ly", + "om5ah", + "oma5l", + "om5atiz", + "om2be", + "om4bl", + "o2me", + "om3ena", + "om5erse", + "o4met", + "om5etry", + "o3mia", + "om3ic.", + "om3ica", + "o5mid", + "om1in", + "o5mini", + "5ommend", + "omo4ge", + "o4mon", + "om3pi", + "ompro5", + "o2n", + "on1a", + "on4ac", + "o3nan", + "on1c", + "3oncil", + "2ond", + "on5do", + "o3nen", + "on5est", + "on4gu", + "on1ic", + "o3nio", + "on1is", + "o5niu", + "on3key", + "on4odi", + "on3omy", + "on3s", + "onspi4", + "onspir5a", + "onsu4", + "onten4", + "on3t4i", + "ontif5", + "on5um", + "onva5", + "oo2", + "ood5e", + "ood5i", + "oo4k", + "oop3i", + "o3ord", + "oost5", + "o2pa", + "ope5d", + "op1er", + "3opera", + "4operag", + "2oph", + "o5phan", + "o5pher", + "op3ing", + "o3pit", + "o5pon", + "o4posi", + "o1pr", + "op1u", + "opy5", + "o1q", + "o1ra", + "o5ra.", + "o4r3ag", + "or5aliz", + "or5ange", + "ore5a", + "o5real", + "or3ei", + "ore5sh", + "or5est.", + "orew4", + "or4gu", + "4o5ria", + "or3ica", + "o5ril", + "or1in", + "o1rio", + "or3ity", + "o3riu", + "or2mi", + "orn2e", + "o5rof", + "or3oug", + "or5pe", + "3orrh", + "or4se", + "ors5en", + "orst4", + "or3thi", + "or3thy", + "or4ty", + "o5rum", + "o1ry", + "os3al", + "os2c", + "os4ce", + "o3scop", + "4oscopi", + "o5scr", + "os4i4e", + "os5itiv", + "os3ito", + "os3ity", + "osi4u", + "os4l", + "o2so", + "os4pa", + "os4po", + "os2ta", + "o5stati", + "os5til", + "os5tit", + "o4tan", + "otele4g", + "ot3er.", + "ot5ers", + "o4tes", + "4oth", + "oth5esi", + "oth3i4", + "ot3ic.", + "ot5ica", + "o3tice", + "o3tif", + "o3tis", + "oto5s", + "ou2", + "ou3bl", + "ouch5i", + "ou5et", + "ou4l", + "ounc5er", + "oun2d", + "ou5v", + "ov4en", + "over4ne", + "over3s", + "ov4ert", + "o3vis", + "oviti4", + "o5v4ol", + "ow3der", + "ow3el", + "ow5est", + "ow1i", + "own5i", + "o4wo", + "oy1a", + "1pa", + "pa4ca", + "pa4ce", + "pac4t", + "p4ad", + "5pagan", + "p3agat", + "p4ai", + "pain4", + "p4al", + "pan4a", + "pan3el", + "pan4ty", + "pa3ny", + "pa1p", + "pa4pu", + "para5bl", + "par5age", + "par5di", + "3pare", + "par5el", + "p4a4ri", + "par4is", + "pa2te", + "pa5ter", + "5pathic", + "pa5thy", + "pa4tric", + "pav4", + "3pay", + "4p1b", + "pd4", + "4pe.", + "3pe4a", + "pear4l", + "pe2c", + "2p2ed", + "3pede", + "3pedi", + "pedia4", + "ped4ic", + "p4ee", + "pee4d", + "pek4", + "pe4la", + "peli4e", + "pe4nan", + "p4enc", + "pen4th", + "pe5on", + "p4era.", + "pera5bl", + "p4erag", + "p4eri", + "peri5st", + "per4mal", + "perme5", + "p4ern", + "per3o", + "per3ti", + "pe5ru", + "per1v", + "pe2t", + "pe5ten", + "pe5tiz", + "4pf", + "4pg", + "4ph.", + "phar5i", + "phe3no", + "ph4er", + "ph4es.", + "ph1ic", + "5phie", + "ph5ing", + "5phisti", + "3phiz", + "ph2l", + "3phob", + "3phone", + "5phoni", + "pho4r", + "4phs", + "ph3t", + "5phu", + "1phy", + "pi3a", + "pian4", + "pi4cie", + "pi4cy", + "p4id", + "p5ida", + "pi3de", + "5pidi", + "3piec", + "pi3en", + "pi4grap", + "pi3lo", + "pi2n", + "p4in.", + "pind4", + "p4ino", + "3pi1o", + "pion4", + "p3ith", + "pi5tha", + "pi2tu", + "2p3k2", + "1p2l2", + "3plan", + "plas5t", + "pli3a", + "pli5er", + "4plig", + "pli4n", + "ploi4", + "plu4m", + "plum4b", + "4p1m", + "2p3n", + "po4c", + "5pod.", + "po5em", + "po3et5", + "5po4g", + "poin2", + "5point", + "poly5t", + "po4ni", + "po4p", + "1p4or", + "po4ry", + "1pos", + "pos1s", + "p4ot", + "po4ta", + "5poun", + "4p1p", + "ppa5ra", + "p2pe", + "p4ped", + "p5pel", + "p3pen", + "p3per", + "p3pet", + "ppo5site", + "pr2", + "pray4e", + "5preci", + "pre5co", + "pre3em", + "pref5ac", + "pre4la", + "pre3r", + "p3rese", + "3press", + "pre5ten", + "pre3v", + "5pri4e", + "prin4t3", + "pri4s", + "pris3o", + "p3roca", + "prof5it", + "pro3l", + "pros3e", + "pro1t", + "2p1s2", + "p2se", + "ps4h", + "p4sib", + "2p1t", + "pt5a4b", + "p2te", + "p2th", + "pti3m", + "ptu4r", + "p4tw", + "pub3", + "pue4", + "puf4", + "pul3c", + "pu4m", + "pu2n", + "pur4r", + "5pus", + "pu2t", + "5pute", + "put3er", + "pu3tr", + "put4ted", + "put4tin", + "p3w", + "qu2", + "qua5v", + "2que.", + "3quer", + "3quet", + "2rab", + "ra3bi", + "rach4e", + "r5acl", + "raf5fi", + "raf4t", + "r2ai", + "ra4lo", + "ram3et", + "r2ami", + "rane5o", + "ran4ge", + "r4ani", + "ra5no", + "rap3er", + "3raphy", + "rar5c", + "rare4", + "rar5ef", + "4raril", + "r2as", + "ration4", + "rau4t", + "ra5vai", + "rav3el", + "ra5zie", + "r1b", + "r4bab", + "r4bag", + "rbi2", + "rbi4f", + "r2bin", + "r5bine", + "rb5ing.", + "rb4o", + "r1c", + "r2ce", + "rcen4", + "r3cha", + "rch4er", + "r4ci4b", + "rc4it", + "rcum3", + "r4dal", + "rd2i", + "rdi4a", + "rdi4er", + "rdin4", + "rd3ing", + "2re.", + "re1al", + "re3an", + "re5arr", + "5reav", + "re4aw", + "r5ebrat", + "rec5oll", + "rec5ompe", + "re4cre", + "2r2ed", + "re1de", + "re3dis", + "red5it", + "re4fac", + "re2fe", + "re5fer.", + "re3fi", + "re4fy", + "reg3is", + "re5it", + "re1li", + "re5lu", + "r4en4ta", + "ren4te", + "re1o", + "re5pin", + "re4posi", + "re1pu", + "r1er4", + "r4eri", + "rero4", + "re5ru", + "r4es.", + "re4spi", + "ress5ib", + "res2t", + "re5stal", + "re3str", + "re4ter", + "re4ti4z", + "re3tri", + "reu2", + "re5uti", + "rev2", + "re4val", + "rev3el", + "r5ev5er.", + "re5vers", + "re5vert", + "re5vil", + "rev5olu", + "re4wh", + "r1f", + "rfu4", + "r4fy", + "rg2", + "rg3er", + "r3get", + "r3gic", + "rgi4n", + "rg3ing", + "r5gis", + "r5git", + "r1gl", + "rgo4n", + "r3gu", + "rh4", + "4rh.", + "4rhal", + "ri3a", + "ria4b", + "ri4ag", + "r4ib", + "rib3a", + "ric5as", + "r4ice", + "4rici", + "5ricid", + "ri4cie", + "r4ico", + "rid5er", + "ri3enc", + "ri3ent", + "ri1er", + "ri5et", + "rig5an", + "5rigi", + "ril3iz", + "5riman", + "rim5i", + "3rimo", + "rim4pe", + "r2ina", + "5rina.", + "rin4d", + "rin4e", + "rin4g", + "ri1o", + "5riph", + "riph5e", + "ri2pl", + "rip5lic", + "r4iq", + "r2is", + "r4is.", + "ris4c", + "r3ish", + "ris4p", + "ri3ta3b", + "r5ited.", + "rit5er.", + "rit5ers", + "rit3ic", + "ri2tu", + "rit5ur", + "riv5el", + "riv3et", + "riv3i", + "r3j", + "r3ket", + "rk4le", + "rk4lin", + "r1l", + "rle4", + "r2led", + "r4lig", + "r4lis", + "rl5ish", + "r3lo4", + "r1m", + "rma5c", + "r2me", + "r3men", + "rm5ers", + "rm3ing", + "r4ming.", + "r4mio", + "r3mit", + "r4my", + "r4nar", + "r3nel", + "r4ner", + "r5net", + "r3ney", + "r5nic", + "r1nis4", + "r3nit", + "r3niv", + "rno4", + "r4nou", + "r3nu", + "rob3l", + "r2oc", + "ro3cr", + "ro4e", + "ro1fe", + "ro5fil", + "rok2", + "ro5ker", + "5role.", + "rom5ete", + "rom4i", + "rom4p", + "ron4al", + "ron4e", + "ro5n4is", + "ron4ta", + "1room", + "5root", + "ro3pel", + "rop3ic", + "ror3i", + "ro5ro", + "ros5per", + "ros4s", + "ro4the", + "ro4ty", + "ro4va", + "rov5el", + "rox5", + "r1p", + "r4pea", + "r5pent", + "rp5er.", + "r3pet", + "rp4h4", + "rp3ing", + "r3po", + "r1r4", + "rre4c", + "rre4f", + "r4reo", + "rre4st", + "rri4o", + "rri4v", + "rron4", + "rros4", + "rrys4", + "4rs2", + "r1sa", + "rsa5ti", + "rs4c", + "r2se", + "r3sec", + "rse4cr", + "rs5er.", + "rs3es", + "rse5v2", + "r1sh", + "r5sha", + "r1si", + "r4si4b", + "rson3", + "r1sp", + "r5sw", + "rtach4", + "r4tag", + "r3teb", + "rten4d", + "rte5o", + "r1ti", + "rt5ib", + "rti4d", + "r4tier", + "r3tig", + "rtil3i", + "rtil4l", + "r4tily", + "r4tist", + "r4tiv", + "r3tri", + "rtroph4", + "rt4sh", + "ru3a", + "ru3e4l", + "ru3en", + "ru4gl", + "ru3in", + "rum3pl", + "ru2n", + "runk5", + "run4ty", + "r5usc", + "ruti5n", + "rv4e", + "rvel4i", + "r3ven", + "rv5er.", + "r5vest", + "r3vey", + "r3vic", + "rvi4v", + "r3vo", + "r1w", + "ry4c", + "5rynge", + "ry3t", + "sa2", + "2s1ab", + "5sack", + "sac3ri", + "s3act", + "5sai", + "salar4", + "sal4m", + "sa5lo", + "sal4t", + "3sanc", + "san4de", + "s1ap", + "sa5ta", + "5sa3tio", + "sat3u", + "sau4", + "sa5vor", + "5saw", + "4s5b", + "scan4t5", + "sca4p", + "scav5", + "s4ced", + "4scei", + "s4ces", + "sch2", + "s4cho", + "3s4cie", + "5scin4d", + "scle5", + "s4cli", + "scof4", + "4scopy", + "scour5a", + "s1cu", + "4s5d", + "4se.", + "se4a", + "seas4", + "sea5w", + "se2c3o", + "3sect", + "4s4ed", + "se4d4e", + "s5edl", + "se2g", + "seg3r", + "5sei", + "se1le", + "5self", + "5selv", + "4seme", + "se4mol", + "sen5at", + "4senc", + "sen4d", + "s5ened", + "sen5g", + "s5enin", + "4sentd", + "4sentl", + "sep3a3", + "4s1er.", + "s4erl", + "ser4o", + "4servo", + "s1e4s", + "se5sh", + "ses5t", + "5se5um", + "5sev", + "sev3en", + "sew4i", + "5sex", + "4s3f", + "2s3g", + "s2h", + "2sh.", + "sh1er", + "5shev", + "sh1in", + "sh3io", + "3ship", + "shiv5", + "sho4", + "sh5old", + "shon3", + "shor4", + "short5", + "4shw", + "si1b", + "s5icc", + "3side.", + "5sides", + "5sidi", + "si5diz", + "4signa", + "sil4e", + "4sily", + "2s1in", + "s2ina", + "5sine.", + "s3ing", + "1sio", + "5sion", + "sion5a", + "si2r", + "sir5a", + "1sis", + "3sitio", + "5siu", + "1siv", + "5siz", + "sk2", + "4ske", + "s3ket", + "sk5ine", + "sk5ing", + "s1l2", + "s3lat", + "s2le", + "slith5", + "2s1m", + "s3ma", + "small3", + "sman3", + "smel4", + "s5men", + "5smith", + "smol5d4", + "s1n4", + "1so", + "so4ce", + "soft3", + "so4lab", + "sol3d2", + "so3lic", + "5solv", + "3som", + "3s4on.", + "sona4", + "son4g", + "s4op", + "5sophic", + "s5ophiz", + "s5ophy", + "sor5c", + "sor5d", + "4sov", + "so5vi", + "2spa", + "5spai", + "spa4n", + "spen4d", + "2s5peo", + "2sper", + "s2phe", + "3spher", + "spho5", + "spil4", + "sp5ing", + "4spio", + "s4ply", + "s4pon", + "spor4", + "4spot", + "squal4l", + "s1r", + "2ss", + "s1sa", + "ssas3", + "s2s5c", + "s3sel", + "s5seng", + "s4ses.", + "s5set", + "s1si", + "s4sie", + "ssi4er", + "ss5ily", + "s4sl", + "ss4li", + "s4sn", + "sspend4", + "ss2t", + "ssur5a", + "ss5w", + "2st.", + "s2tag", + "s2tal", + "stam4i", + "5stand", + "s4ta4p", + "5stat.", + "s4ted", + "stern5i", + "s5tero", + "ste2w", + "stew5a", + "s3the", + "st2i", + "s4ti.", + "s5tia", + "s1tic", + "5stick", + "s4tie", + "s3tif", + "st3ing", + "5stir", + "s1tle", + "5stock", + "stom3a", + "5stone", + "s4top", + "3store", + "st4r", + "s4trad", + "5stratu", + "s4tray", + "s4trid", + "4stry", + "4st3w", + "s2ty", + "1su", + "su1al", + "su4b3", + "su2g3", + "su5is", + "suit3", + "s4ul", + "su2m", + "sum3i", + "su2n", + "su2r", + "4sv", + "sw2", + "4swo", + "s4y", + "4syc", + "3syl", + "syn5o", + "sy5rin", + "1ta", + "3ta.", + "2tab", + "ta5bles", + "5taboliz", + "4taci", + "ta5do", + "4taf4", + "tai5lo", + "ta2l", + "ta5la", + "tal5en", + "tal3i", + "4talk", + "tal4lis", + "ta5log", + "ta5mo", + "tan4de", + "tanta3", + "ta5per", + "ta5pl", + "tar4a", + "4tarc", + "4tare", + "ta3riz", + "tas4e", + "ta5sy", + "4tatic", + "ta4tur", + "taun4", + "tav4", + "2taw", + "tax4is", + "2t1b", + "4tc", + "t4ch", + "tch5et", + "4t1d", + "4te.", + "tead4i", + "4teat", + "tece4", + "5tect", + "2t1ed", + "te5di", + "1tee", + "teg4", + "te5ger", + "te5gi", + "3tel.", + "teli4", + "5tels", + "te2ma2", + "tem3at", + "3tenan", + "3tenc", + "3tend", + "4tenes", + "1tent", + "ten4tag", + "1teo", + "te4p", + "te5pe", + "ter3c", + "5ter3d", + "1teri", + "ter5ies", + "ter3is", + "teri5za", + "5ternit", + "ter5v", + "4tes.", + "4tess", + "t3ess.", + "teth5e", + "3teu", + "3tex", + "4tey", + "2t1f", + "4t1g", + "2th.", + "than4", + "th2e", + "4thea", + "th3eas", + "the5at", + "the3is", + "3thet", + "th5ic.", + "th5ica", + "4thil", + "5think", + "4thl", + "th5ode", + "5thodic", + "4thoo", + "thor5it", + "tho5riz", + "2ths", + "1tia", + "ti4ab", + "ti4ato", + "2ti2b", + "4tick", + "t4ico", + "t4ic1u", + "5tidi", + "3tien", + "tif2", + "ti5fy", + "2tig", + "5tigu", + "till5in", + "1tim", + "4timp", + "tim5ul", + "2t1in", + "t2ina", + "3tine.", + "3tini", + "1tio", + "ti5oc", + "tion5ee", + "5tiq", + "ti3sa", + "3tise", + "tis4m", + "ti5so", + "tis4p", + "5tistica", + "ti3tl", + "ti4u", + "1tiv", + "tiv4a", + "1tiz", + "ti3za", + "ti3zen", + "2tl", + "t5la", + "tlan4", + "3tle.", + "3tled", + "3tles.", + "t5let.", + "t5lo", + "4t1m", + "tme4", + "2t1n2", + "1to", + "to3b", + "to5crat", + "4todo", + "2tof", + "to2gr", + "to5ic", + "to2ma", + "tom4b", + "to3my", + "ton4ali", + "to3nat", + "4tono", + "4tony", + "to2ra", + "to3rie", + "tor5iz", + "tos2", + "5tour", + "4tout", + "to3war", + "4t1p", + "1tra", + "tra3b", + "tra5ch", + "traci4", + "trac4it", + "trac4te", + "tras4", + "tra5ven", + "trav5es5", + "tre5f", + "tre4m", + "trem5i", + "5tria", + "tri5ces", + "5tricia", + "4trics", + "2trim", + "tri4v", + "tro5mi", + "tron5i", + "4trony", + "tro5phe", + "tro3sp", + "tro3v", + "tru5i", + "trus4", + "4t1s2", + "t4sc", + "tsh4", + "t4sw", + "4t3t2", + "t4tes", + "t5to", + "ttu4", + "1tu", + "tu1a", + "tu3ar", + "tu4bi", + "tud2", + "4tue", + "4tuf4", + "5tu3i", + "3tum", + "tu4nis", + "2t3up.", + "3ture", + "5turi", + "tur3is", + "tur5o", + "tu5ry", + "3tus", + "4tv", + "tw4", + "4t1wa", + "twis4", + "4two", + "1ty", + "4tya", + "2tyl", + "type3", + "ty5ph", + "4tz", + "tz4e", + "4uab", + "uac4", + "ua5na", + "uan4i", + "uar5ant", + "uar2d", + "uar3i", + "uar3t", + "u1at", + "uav4", + "ub4e", + "u4bel", + "u3ber", + "u4bero", + "u1b4i", + "u4b5ing", + "u3ble.", + "u3ca", + "uci4b", + "uc4it", + "ucle3", + "u3cr", + "u3cu", + "u4cy", + "ud5d", + "ud3er", + "ud5est", + "udev4", + "u1dic", + "ud3ied", + "ud3ies", + "ud5is", + "u5dit", + "u4don", + "ud4si", + "u4du", + "u4ene", + "uens4", + "uen4te", + "uer4il", + "3ufa", + "u3fl", + "ugh3en", + "ug5in", + "2ui2", + "uil5iz", + "ui4n", + "u1ing", + "uir4m", + "uita4", + "uiv3", + "uiv4er.", + "u5j", + "4uk", + "u1la", + "ula5b", + "u5lati", + "ulch4", + "5ulche", + "ul3der", + "ul4e", + "u1len", + "ul4gi", + "ul2i", + "u5lia", + "ul3ing", + "ul5ish", + "ul4lar", + "ul4li4b", + "ul4lis", + "4ul3m", + "u1l4o", + "4uls", + "uls5es", + "ul1ti", + "ultra3", + "4ultu", + "u3lu", + "ul5ul", + "ul5v", + "um5ab", + "um4bi", + "um4bly", + "u1mi", + "u4m3ing", + "umor5o", + "um2p", + "unat4", + "u2ne", + "un4er", + "u1ni", + "un4im", + "u2nin", + "un5ish", + "uni3v", + "un3s4", + "un4sw", + "unt3ab", + "un4ter.", + "un4tes", + "unu4", + "un5y", + "un5z", + "u4ors", + "u5os", + "u1ou", + "u1pe", + "uper5s", + "u5pia", + "up3ing", + "u3pl", + "up3p", + "upport5", + "upt5ib", + "uptu4", + "u1ra", + "4ura.", + "u4rag", + "u4ras", + "ur4be", + "urc4", + "ur1d", + "ure5at", + "ur4fer", + "ur4fr", + "u3rif", + "uri4fic", + "ur1in", + "u3rio", + "u1rit", + "ur3iz", + "ur2l", + "url5ing.", + "ur4no", + "uros4", + "ur4pe", + "ur4pi", + "urs5er", + "ur5tes", + "ur3the", + "urti4", + "ur4tie", + "u3ru", + "2us", + "u5sad", + "u5san", + "us4ap", + "usc2", + "us3ci", + "use5a", + "u5sia", + "u3sic", + "us4lin", + "us1p", + "us5sl", + "us5tere", + "us1tr", + "u2su", + "usur4", + "uta4b", + "u3tat", + "4ute.", + "4utel", + "4uten", + "uten4i", + "4u1t2i", + "uti5liz", + "u3tine", + "ut3ing", + "ution5a", + "u4tis", + "5u5tiz", + "u4t1l", + "ut5of", + "uto5g", + "uto5matic", + "u5ton", + "u4tou", + "uts4", + "u3u", + "uu4m", + "u1v2", + "uxu3", + "uz4e", + "1va", + "5va.", + "2v1a4b", + "vac5il", + "vac3u", + "vag4", + "va4ge", + "va5lie", + "val5o", + "val1u", + "va5mo", + "va5niz", + "va5pi", + "var5ied", + "3vat", + "4ve.", + "4ved", + "veg3", + "v3el.", + "vel3li", + "ve4lo", + "v4ely", + "ven3om", + "v5enue", + "v4erd", + "5vere.", + "v4erel", + "v3eren", + "ver5enc", + "v4eres", + "ver3ie", + "vermi4n", + "3verse", + "ver3th", + "v4e2s", + "4ves.", + "ves4te", + "ve4te", + "vet3er", + "ve4ty", + "vi5ali", + "5vian", + "5vide.", + "5vided", + "4v3iden", + "5vides", + "5vidi", + "v3if", + "vi5gn", + "vik4", + "2vil", + "5vilit", + "v3i3liz", + "v1in", + "4vi4na", + "v2inc", + "vin5d", + "4ving", + "vio3l", + "v3io4r", + "vi1ou", + "vi4p", + "vi5ro", + "vis3it", + "vi3so", + "vi3su", + "4viti", + "vit3r", + "4vity", + "3viv", + "5vo.", + "voi4", + "3vok", + "vo4la", + "v5ole", + "5volt", + "3volv", + "vom5i", + "vor5ab", + "vori4", + "vo4ry", + "vo4ta", + "4votee", + "4vv4", + "v4y", + "w5abl", + "2wac", + "wa5ger", + "wag5o", + "wait5", + "w5al.", + "wam4", + "war4t", + "was4t", + "wa1te", + "wa5ver", + "w1b", + "wea5rie", + "weath3", + "wed4n", + "weet3", + "wee5v", + "wel4l", + "w1er", + "west3", + "w3ev", + "whi4", + "wi2", + "wil2", + "will5in", + "win4de", + "win4g", + "wir4", + "3wise", + "with3", + "wiz5", + "w4k", + "wl4es", + "wl3in", + "w4no", + "1wo2", + "wom1", + "wo5ven", + "w5p", + "wra4", + "wri4", + "writa4", + "w3sh", + "ws4l", + "ws4pe", + "w5s4t", + "4wt", + "wy4", + "x1a", + "xac5e", + "x4ago", + "xam3", + "x4ap", + "xas5", + "x3c2", + "x1e", + "xe4cuto", + "x2ed", + "xer4i", + "xe5ro", + "x1h", + "xhi2", + "xhil5", + "xhu4", + "x3i", + "xi5a", + "xi5c", + "xi5di", + "x4ime", + "xi5miz", + "x3o", + "x4ob", + "x3p", + "xpan4d", + "xpecto5", + "xpe3d", + "x1t2", + "x3ti", + "x1u", + "xu3a", + "xx4", + "y5ac", + "3yar4", + "y5at", + "y1b", + "y1c", + "y2ce", + "yc5er", + "y3ch", + "ych4e", + "ycom4", + "ycot4", + "y1d", + "y5ee", + "y1er", + "y4erf", + "yes4", + "ye4t", + "y5gi", + "4y3h", + "y1i", + "y3la", + "ylla5bl", + "y3lo", + "y5lu", + "ymbol5", + "yme4", + "ympa3", + "yn3chr", + "yn5d", + "yn5g", + "yn5ic", + "5ynx", + "y1o4", + "yo5d", + "y4o5g", + "yom4", + "yo5net", + "y4ons", + "y4os", + "y4ped", + "yper5", + "yp3i", + "y3po", + "y4poc", + "yp2ta", + "y5pu", + "yra5m", + "yr5ia", + "y3ro", + "yr4r", + "ys4c", + "y3s2e", + "ys3ica", + "ys3io", + "3ysis", + "y4so", + "yss4", + "ys1t", + "ys3ta", + "ysur4", + "y3thin", + "yt3ic", + "y1w", + "za1", + "z5a2b", + "zar2", + "4zb", + "2ze", + "ze4n", + "ze4p", + "z1er", + "ze3ro", + "zet4", + "2z1i", + "z4il", + "z4is", + "5zl", + "4zm", + "1zo", + "zo4m", + "zo5ol", + "zte4", + "4z1z2", + "z4zy" + }; + + + TreeSet<String> pattern2 = new TreeSet<String>(); + + public void list(){ + + pattern2.add(".ach"); + pattern2.add(".adder"); + pattern2.add(".aft"); + pattern2.add(".alt"); + pattern2.add(".amat"); + pattern2.add(".anc"); + pattern2.add(".ang"); + pattern2.add(".anim"); + pattern2.add(".ant"); + pattern2.add(".ante"); + pattern2.add(".antis"); + pattern2.add(".ars"); + pattern2.add(".artie"); + pattern2.add(".arty"); + pattern2.add(".asc"); + pattern2.add(".asp"); + pattern2.add(".ass"); + pattern2.add(".aster"); + pattern2.add(".atom"); + pattern2.add(".aud"); + pattern2.add(".avi"); + pattern2.add(".awn"); + pattern2.add(".bag"); + pattern2.add(".bana"); + pattern2.add(".base"); + pattern2.add(".ber"); + pattern2.add(".bera"); + pattern2.add(".besm"); + pattern2.add(".besto"); + pattern2.add(".bri"); + pattern2.add(".butti"); + pattern2.add(".campe"); + pattern2.add(".canc"); + pattern2.add(".capab"); + pattern2.add(".carol"); + pattern2.add(".cat"); + pattern2.add(".cela"); + pattern2.add(".ch"); + pattern2.add(".chilli"); + pattern2.add(".ci"); + pattern2.add(".citr"); + pattern2.add(".coe"); + pattern2.add(".cor"); + pattern2.add(".corner"); + pattern2.add(".demoi"); + pattern2.add(".deo"); + pattern2.add(".dera"); + pattern2.add(".deri"); + pattern2.add(".desc"); + pattern2.add(".dictio"); + pattern2.add(".dot"); + pattern2.add(".duc"); + pattern2.add(".dumb"); + pattern2.add(".earth"); + pattern2.add(".easi"); + pattern2.add(".eb"); + pattern2.add(".eer"); + pattern2.add(".eg"); + pattern2.add(".eld"); + pattern2.add(".elem"); + pattern2.add(".enam"); + pattern2.add(".eng"); + pattern2.add(".ens"); + pattern2.add(".equit"); + pattern2.add(".erri"); + pattern2.add(".es"); + pattern2.add(".eu"); + pattern2.add(".eye"); + pattern2.add(".fes"); + pattern2.add(".former"); + pattern2.add(".ga"); + pattern2.add(".ge"); + pattern2.add(".gent"); + pattern2.add(".geog"); + pattern2.add(".gia"); + pattern2.add(".gib"); + pattern2.add(".gor"); + pattern2.add(".handi"); + pattern2.add(".hank"); + pattern2.add(".he"); + pattern2.add(".heroi"); + pattern2.add(".hes"); + pattern2.add(".het"); + pattern2.add(".hib"); + pattern2.add(".hier"); + pattern2.add(".honey"); + pattern2.add(".hono"); + pattern2.add(".hov"); + pattern2.add(".idl"); + pattern2.add(".idol"); + pattern2.add(".imm"); + pattern2.add(".impin"); + pattern2.add(".in"); + pattern2.add(".inci"); + pattern2.add(".ine"); + pattern2.add(".ink"); + pattern2.add(".ins"); + pattern2.add(".irr"); + pattern2.add(".isi"); + pattern2.add(".jur"); + pattern2.add(".lacy"); + pattern2.add(".lam"); + pattern2.add(".later"); + pattern2.add(".lath"); + pattern2.add(".le"); + pattern2.add(".lege"); + pattern2.add(".len"); + pattern2.add(".lep"); + pattern2.add(".lev"); + pattern2.add(".lig"); + pattern2.add(".liga"); + pattern2.add(".lin"); + pattern2.add(".lio"); + pattern2.add(".lit"); + pattern2.add(".maga"); + pattern2.add(".malo"); + pattern2.add(".mana"); + pattern2.add(".marti"); + pattern2.add(".me"); + pattern2.add(".merc"); + pattern2.add(".meter"); + pattern2.add(".mis"); + pattern2.add(".misti"); + pattern2.add(".mone"); + pattern2.add(".moro"); + pattern2.add(".muta"); + pattern2.add(".mutab"); + pattern2.add(".nic"); + pattern2.add(".od"); + pattern2.add(".odd"); + pattern2.add(".ofte"); + pattern2.add(".orato"); + pattern2.add(".orc"); + pattern2.add(".ord"); + pattern2.add(".ort"); + pattern2.add(".os"); + pattern2.add(".ostl"); + pattern2.add(".oth"); + pattern2.add(".out"); + pattern2.add(".pedal"); + pattern2.add(".pete"); + pattern2.add(".petit"); + pattern2.add(".pie"); + pattern2.add(".pion"); + pattern2.add(".pit"); + pattern2.add(".prem"); + pattern2.add(".rac"); + pattern2.add(".rant"); + pattern2.add(".rationa"); + pattern2.add(".ree"); + pattern2.add(".remit"); + pattern2.add(".res"); + pattern2.add(".restat"); + pattern2.add(".rig"); + pattern2.add(".ritu"); + pattern2.add(".roq"); + pattern2.add(".rost"); + pattern2.add(".rowd"); + pattern2.add(".rud"); + pattern2.add(".scie"); + pattern2.add(".self"); + pattern2.add(".sell"); + pattern2.add(".sen"); + pattern2.add(".serie"); + pattern2.add(".sh"); + pattern2.add(".si"); + pattern2.add(".sing"); + pattern2.add(".st"); + pattern2.add(".stabl"); + pattern2.add(".sy"); + pattern2.add(".ta"); + pattern2.add(".te"); + pattern2.add(".tenan"); + pattern2.add(".th"); + pattern2.add(".ti"); + pattern2.add(".til"); + pattern2.add(".timo"); + pattern2.add(".ting"); + pattern2.add(".tink"); + pattern2.add(".tona"); + pattern2.add(".top"); + pattern2.add(".topi"); + pattern2.add(".tous"); + pattern2.add(".tribut"); + pattern2.add(".una"); + pattern2.add(".unce"); + pattern2.add(".under"); + pattern2.add(".une"); + pattern2.add(".unk"); + pattern2.add(".uno"); + pattern2.add(".unu"); + pattern2.add(".up"); + pattern2.add(".ure"); + pattern2.add(".usa"); + pattern2.add(".vende"); + pattern2.add(".vera"); + pattern2.add(".wili"); + pattern2.add(".ye"); + pattern2.add("ab."); + pattern2.add("abal"); + pattern2.add("aban"); + pattern2.add("abe"); + pattern2.add("aberd"); + pattern2.add("abia"); + pattern2.add("abitab"); + pattern2.add("ablat"); + pattern2.add("aboliz"); + pattern2.add("abr"); + pattern2.add("abrog"); + pattern2.add("abul"); + pattern2.add("acar"); + pattern2.add("acard"); + pattern2.add("acaro"); + pattern2.add("aceou"); + pattern2.add("acer"); + pattern2.add("achet"); + pattern2.add("aci"); + pattern2.add("acie"); + pattern2.add("acin"); + pattern2.add("acio"); + pattern2.add("acrob"); + pattern2.add("actif"); + pattern2.add("acul"); + pattern2.add("acum"); + pattern2.add("ad"); + pattern2.add("addin"); + pattern2.add("ader."); + pattern2.add("adi"); + pattern2.add("adia"); + pattern2.add("adica"); + pattern2.add("adier"); + pattern2.add("adio"); + pattern2.add("adit"); + pattern2.add("adiu"); + pattern2.add("adle"); + pattern2.add("adow"); + pattern2.add("adran"); + pattern2.add("adsu"); + pattern2.add("adu"); + pattern2.add("aduc"); + pattern2.add("adum"); + pattern2.add("aer"); + pattern2.add("aerie"); + pattern2.add("af"); + pattern2.add("aff"); + pattern2.add("agab"); + pattern2.add("agan"); + pattern2.add("agell"); + pattern2.add("ageo"); + pattern2.add("ageu"); + pattern2.add("agi"); + pattern2.add("agl"); + pattern2.add("agn"); + pattern2.add("ago"); + pattern2.add("agog"); + pattern2.add("agoni"); + pattern2.add("aguer"); + pattern2.add("agul"); + pattern2.add("agy"); + pattern2.add("aha"); + pattern2.add("ahe"); + pattern2.add("ahl"); + pattern2.add("aho"); + pattern2.add("ai"); + pattern2.add("aia"); + pattern2.add("aic."); + pattern2.add("aily"); + pattern2.add("ain"); + pattern2.add("ainin"); + pattern2.add("aino"); + pattern2.add("aiten"); + pattern2.add("aj"); + pattern2.add("aken"); + pattern2.add("alab"); + pattern2.add("alad"); + pattern2.add("alar"); + pattern2.add("aldi"); + pattern2.add("ale"); + pattern2.add("alend"); + pattern2.add("alenti"); + pattern2.add("aleo"); + pattern2.add("ali"); + pattern2.add("alia."); + pattern2.add("alie"); + pattern2.add("allev"); + pattern2.add("allic"); + pattern2.add("alm"); + pattern2.add("alog."); + pattern2.add("aly."); + pattern2.add("alys"); + pattern2.add("alyst"); + pattern2.add("alyt"); + pattern2.add("alyz"); + pattern2.add("ama"); + pattern2.add("amab"); + pattern2.add("amag"); + pattern2.add("amara"); + pattern2.add("amasc"); + pattern2.add("amatis"); + pattern2.add("amato"); + pattern2.add("amera"); + pattern2.add("amic"); + pattern2.add("amif"); + pattern2.add("amily"); + pattern2.add("amin"); + pattern2.add("amino"); + pattern2.add("amo"); + pattern2.add("amon"); + pattern2.add("amori"); + pattern2.add("ampen"); + pattern2.add("an"); + pattern2.add("anage"); + pattern2.add("analy"); + pattern2.add("anar"); + pattern2.add("anarc"); + pattern2.add("anari"); + pattern2.add("anati"); + pattern2.add("and"); + pattern2.add("andes"); + pattern2.add("andis"); + pattern2.add("andl"); + pattern2.add("andow"); + pattern2.add("anee"); + pattern2.add("anen"); + pattern2.add("anest."); + pattern2.add("aneu"); + pattern2.add("ang"); + pattern2.add("angie"); + pattern2.add("angl"); + pattern2.add("anic"); + pattern2.add("anies"); + pattern2.add("anif"); + pattern2.add("anime"); + pattern2.add("animi"); + pattern2.add("anine"); + pattern2.add("anio"); + pattern2.add("anip"); + pattern2.add("anish"); + pattern2.add("anit"); + pattern2.add("aniu"); + pattern2.add("ankli"); + pattern2.add("anniz"); + pattern2.add("ano"); + pattern2.add("anot"); + pattern2.add("anoth"); + pattern2.add("ansa"); + pattern2.add("ansco"); + pattern2.add("ansn"); + pattern2.add("ansp"); + pattern2.add("anspo"); + pattern2.add("anst"); + pattern2.add("ansur"); + pattern2.add("antal"); + pattern2.add("antie"); + pattern2.add("anto"); + pattern2.add("antr"); + pattern2.add("antw"); + pattern2.add("anua"); + pattern2.add("anul"); + pattern2.add("anur"); + pattern2.add("ao"); + pattern2.add("apar"); + pattern2.add("apat"); + pattern2.add("apero"); + pattern2.add("apher"); + pattern2.add("aphi"); + pattern2.add("apilla"); + pattern2.add("apillar"); + pattern2.add("apin"); + pattern2.add("apita"); + pattern2.add("apitu"); + pattern2.add("apl"); + pattern2.add("apoc"); + pattern2.add("apola"); + pattern2.add("apori"); + pattern2.add("apost"); + pattern2.add("apses"); + pattern2.add("apu"); + pattern2.add("aque"); + pattern2.add("ar"); + pattern2.add("aract"); + pattern2.add("arade"); + pattern2.add("aradis"); + pattern2.add("aral"); + pattern2.add("aramete"); + pattern2.add("arang"); + pattern2.add("arap"); + pattern2.add("arat"); + pattern2.add("aratio"); + pattern2.add("arativ"); + pattern2.add("arau"); + pattern2.add("arav"); + pattern2.add("araw"); + pattern2.add("arbal"); + pattern2.add("archan"); + pattern2.add("ardine"); + pattern2.add("ardr"); + pattern2.add("areas"); + pattern2.add("aree"); + pattern2.add("arent"); + pattern2.add("aress"); + pattern2.add("arfi"); + pattern2.add("arfl"); + pattern2.add("ari"); + pattern2.add("arial"); + pattern2.add("arian"); + pattern2.add("ariet"); + pattern2.add("arim"); + pattern2.add("arinat"); + pattern2.add("ario"); + pattern2.add("ariz"); + pattern2.add("armi"); + pattern2.add("arod"); + pattern2.add("aroni"); + pattern2.add("aroo"); + pattern2.add("arp"); + pattern2.add("arq"); + pattern2.add("arre"); + pattern2.add("arsa"); + pattern2.add("arsh"); + pattern2.add("as."); + pattern2.add("asab"); + pattern2.add("asant"); + pattern2.add("ashi"); + pattern2.add("asia."); + pattern2.add("asib"); + pattern2.add("asic"); + pattern2.add("asit"); + pattern2.add("aski"); + pattern2.add("asl"); + pattern2.add("asoc"); + pattern2.add("asph"); + pattern2.add("assh"); + pattern2.add("asten"); + pattern2.add("astr"); + pattern2.add("asura"); + pattern2.add("ata"); + pattern2.add("atabl"); + pattern2.add("atac"); + pattern2.add("atalo"); + pattern2.add("atap"); + pattern2.add("atec"); + pattern2.add("atech"); + pattern2.add("atego"); + pattern2.add("aten."); + pattern2.add("atera"); + pattern2.add("atern"); + pattern2.add("aterna"); + pattern2.add("atest"); + pattern2.add("atev"); + pattern2.add("ath"); + pattern2.add("athem"); + pattern2.add("athen"); + pattern2.add("atho"); + pattern2.add("athom"); + pattern2.add("ati."); + pattern2.add("atia"); + pattern2.add("atib"); + pattern2.add("atic"); + pattern2.add("atif"); + pattern2.add("ationar"); + pattern2.add("atitu"); + pattern2.add("atog"); + pattern2.add("atom"); + pattern2.add("atomiz"); + pattern2.add("atop"); + pattern2.add("atos"); + pattern2.add("atr"); + pattern2.add("atrop"); + pattern2.add("atsk"); + pattern2.add("attag"); + pattern2.add("atte"); + pattern2.add("atth"); + pattern2.add("atu"); + pattern2.add("atua"); + pattern2.add("atue"); + pattern2.add("atul"); + pattern2.add("atura"); + pattern2.add("aty"); + pattern2.add("aub"); + pattern2.add("augh"); + pattern2.add("augu"); + pattern2.add("aul"); + pattern2.add("aund"); + pattern2.add("aur"); + pattern2.add("ausib"); + pattern2.add("auten"); + pattern2.add("auth"); + pattern2.add("ava"); + pattern2.add("avag"); + pattern2.add("avan"); + pattern2.add("aveno"); + pattern2.add("avera"); + pattern2.add("avern"); + pattern2.add("avery"); + pattern2.add("avi"); + pattern2.add("avier"); + pattern2.add("avig"); + pattern2.add("avoc"); + pattern2.add("avor"); + pattern2.add("away"); + pattern2.add("awi"); + pattern2.add("awly"); + pattern2.add("aws"); + pattern2.add("axic"); + pattern2.add("axid"); + pattern2.add("ayal"); + pattern2.add("aye"); + pattern2.add("ays"); + pattern2.add("azier"); + pattern2.add("azzi"); + pattern2.add("ba."); + pattern2.add("badger"); + pattern2.add("bage"); + pattern2.add("bala"); + pattern2.add("bandag"); + pattern2.add("bane"); + pattern2.add("bani"); + pattern2.add("barbi"); + pattern2.add("baria"); + pattern2.add("bassi"); + pattern2.add("bat"); + pattern2.add("baz"); + pattern2.add("bb"); + pattern2.add("bbe"); + pattern2.add("bber"); + pattern2.add("bbina"); + pattern2.add("bd"); + pattern2.add("be."); + pattern2.add("beak"); + pattern2.add("beat"); + pattern2.add("bed"); + pattern2.add("beda"); + pattern2.add("bede"); + pattern2.add("bedi"); + pattern2.add("begi"); + pattern2.add("begu"); + pattern2.add("bel"); + pattern2.add("beli"); + pattern2.add("belo"); + pattern2.add("bem"); + pattern2.add("benig"); + pattern2.add("benu"); + pattern2.add("bes"); + pattern2.add("besp"); + pattern2.add("bestr"); + pattern2.add("bet"); + pattern2.add("betiz"); + pattern2.add("betr"); + pattern2.add("betw"); + pattern2.add("bew"); + pattern2.add("beyo"); + pattern2.add("bf"); + pattern2.add("bh"); + pattern2.add("bib"); + pattern2.add("bid"); + pattern2.add("bie"); + pattern2.add("bien"); + pattern2.add("bier"); + pattern2.add("bif"); + pattern2.add("bil"); + pattern2.add("biliz"); + pattern2.add("binar"); + pattern2.add("bind"); + pattern2.add("binet"); + pattern2.add("biogr"); + pattern2.add("biou"); + pattern2.add("bit"); + pattern2.add("bitio"); + pattern2.add("bitr"); + pattern2.add("bitua"); + pattern2.add("bitz"); + pattern2.add("bj"); + pattern2.add("bk"); + pattern2.add("bl"); + pattern2.add("blath"); + pattern2.add("ble."); + pattern2.add("blen"); + pattern2.add("blesp"); + pattern2.add("blis"); + pattern2.add("blo"); + pattern2.add("blunt"); + pattern2.add("bm"); + pattern2.add("bn"); + pattern2.add("bneg"); + pattern2.add("bod"); + pattern2.add("bodi"); + pattern2.add("boe"); + pattern2.add("bolic"); + pattern2.add("bombi"); + pattern2.add("bona"); + pattern2.add("bonat"); + pattern2.add("boo"); + pattern2.add("bor."); + pattern2.add("bora"); + pattern2.add("bord"); + pattern2.add("bore"); + pattern2.add("bori"); + pattern2.add("bos"); + pattern2.add("bota"); + pattern2.add("both"); + pattern2.add("boto"); + pattern2.add("bound"); + pattern2.add("bp"); + pattern2.add("brit"); + pattern2.add("broth"); + pattern2.add("bs"); + pattern2.add("bsor"); + pattern2.add("bt"); + pattern2.add("btl"); + pattern2.add("bto"); + pattern2.add("btr"); + pattern2.add("buffer"); + pattern2.add("buga"); + pattern2.add("buli"); + pattern2.add("bumi"); + pattern2.add("bun"); + pattern2.add("bunti"); + pattern2.add("bure"); + pattern2.add("busie"); + pattern2.add("busse"); + pattern2.add("bust"); + pattern2.add("buta"); + pattern2.add("butio"); + pattern2.add("buto"); + pattern2.add("bv"); + pattern2.add("bw"); + pattern2.add("by."); + pattern2.add("bys"); + pattern2.add("ca"); + pattern2.add("cabin"); + pattern2.add("cabl"); + pattern2.add("cach"); + pattern2.add("caden"); + pattern2.add("cag"); + pattern2.add("cah"); + pattern2.add("calat"); + pattern2.add("calla"); + pattern2.add("callin"); + pattern2.add("calo"); + pattern2.add("cand"); + pattern2.add("cane"); + pattern2.add("canic"); + pattern2.add("canis"); + pattern2.add("caniz"); + pattern2.add("canty"); + pattern2.add("cany"); + pattern2.add("caper"); + pattern2.add("carom"); + pattern2.add("caster"); + pattern2.add("castig"); + pattern2.add("casy"); + pattern2.add("cath"); + pattern2.add("cativ"); + pattern2.add("caval"); + pattern2.add("cc"); + pattern2.add("ccha"); + pattern2.add("ccia"); + pattern2.add("ccompa"); + pattern2.add("ccon"); + pattern2.add("ccout"); + pattern2.add("ce."); + pattern2.add("ced."); + pattern2.add("ceden"); + pattern2.add("cei"); + pattern2.add("cel."); + pattern2.add("cell"); + pattern2.add("cen"); + pattern2.add("cenc"); + pattern2.add("cene"); + pattern2.add("ceni"); + pattern2.add("cent"); + pattern2.add("cep"); + pattern2.add("ceram"); + pattern2.add("cesa"); + pattern2.add("cessi"); + pattern2.add("cessib"); + pattern2.add("cest"); + pattern2.add("cet"); + pattern2.add("ceta"); + pattern2.add("cew"); + pattern2.add("ch"); + pattern2.add("ch."); + pattern2.add("chab"); + pattern2.add("chanic"); + pattern2.add("chanis"); + pattern2.add("che"); + pattern2.add("cheap"); + pattern2.add("ched"); + pattern2.add("chelo"); + pattern2.add("chemi"); + pattern2.add("chene"); + pattern2.add("cher."); + pattern2.add("chers"); + pattern2.add("chin"); + pattern2.add("chine."); + pattern2.add("chiness"); + pattern2.add("chini"); + pattern2.add("chio"); + pattern2.add("chit"); + pattern2.add("chiz"); + pattern2.add("cho"); + pattern2.add("chti"); + pattern2.add("ci"); + pattern2.add("cia"); + pattern2.add("ciab"); + pattern2.add("ciar"); + pattern2.add("cic"); + pattern2.add("cier"); + pattern2.add("cific."); + pattern2.add("cii"); + pattern2.add("cila"); + pattern2.add("cili"); + pattern2.add("cim"); + pattern2.add("cin"); + pattern2.add("cina"); + pattern2.add("cinat"); + pattern2.add("cinem"); + pattern2.add("cing"); + pattern2.add("cing."); + pattern2.add("cino"); + pattern2.add("cion"); + pattern2.add("cipe"); + pattern2.add("ciph"); + pattern2.add("cipic"); + pattern2.add("cista"); + pattern2.add("cisti"); + pattern2.add("cit"); + pattern2.add("citiz"); + pattern2.add("ciz"); + pattern2.add("ck"); + pattern2.add("cki"); + pattern2.add("cl"); + pattern2.add("clar"); + pattern2.add("claratio"); + pattern2.add("clare"); + pattern2.add("clem"); + pattern2.add("clic"); + pattern2.add("clim"); + pattern2.add("cly"); + pattern2.add("cn"); + pattern2.add("co"); + pattern2.add("coag"); + pattern2.add("coe"); + pattern2.add("cog"); + pattern2.add("cogr"); + pattern2.add("coi"); + pattern2.add("coinc"); + pattern2.add("coli"); + pattern2.add("colo"); + pattern2.add("color"); + pattern2.add("comer"); + pattern2.add("cona"); + pattern2.add("cone"); + pattern2.add("cong"); + pattern2.add("cont"); + pattern2.add("copa"); + pattern2.add("copic"); + pattern2.add("copl"); + pattern2.add("corb"); + pattern2.add("coron"); + pattern2.add("cose"); + pattern2.add("cov"); + pattern2.add("cove"); + pattern2.add("cowa"); + pattern2.add("coze"); + pattern2.add("cozi"); + pattern2.add("cq"); + pattern2.add("crast"); + pattern2.add("crat."); + pattern2.add("cratic"); + pattern2.add("creat"); + pattern2.add("cred"); + pattern2.add("creta"); + pattern2.add("crev"); + pattern2.add("cri"); + pattern2.add("crif"); + pattern2.add("crin"); + pattern2.add("cris"); + pattern2.add("criti"); + pattern2.add("cropl"); + pattern2.add("cropo"); + pattern2.add("crose"); + pattern2.add("crud"); + pattern2.add("cs"); + pattern2.add("ct"); + pattern2.add("ctab"); + pattern2.add("ctang"); + pattern2.add("ctant"); + pattern2.add("cte"); + pattern2.add("cter"); + pattern2.add("cticu"); + pattern2.add("ctimi"); + pattern2.add("ctur"); + pattern2.add("ctw"); + pattern2.add("cud"); + pattern2.add("cuf"); + pattern2.add("cui"); + pattern2.add("cuity"); + pattern2.add("culi"); + pattern2.add("cultis"); + pattern2.add("cultu"); + pattern2.add("cuma"); + pattern2.add("cume"); + pattern2.add("cumi"); + pattern2.add("cun"); + pattern2.add("cupi"); + pattern2.add("cupy"); + pattern2.add("curab"); + pattern2.add("curia"); + pattern2.add("cus"); + pattern2.add("cussi"); + pattern2.add("cut"); + pattern2.add("cutie"); + pattern2.add("cutiv"); + pattern2.add("cutr"); + pattern2.add("cy"); + pattern2.add("cze"); + pattern2.add("da"); + pattern2.add("da."); + pattern2.add("dab"); + pattern2.add("dach"); + pattern2.add("daf"); + pattern2.add("dag"); + pattern2.add("dam"); + pattern2.add("dang"); + pattern2.add("dard"); + pattern2.add("dark"); + pattern2.add("dary"); + pattern2.add("dat"); + pattern2.add("dativ"); + pattern2.add("dato"); + pattern2.add("dav"); + pattern2.add("dave"); + pattern2.add("day"); + pattern2.add("db"); + pattern2.add("dc"); + pattern2.add("dd"); + pattern2.add("de."); + pattern2.add("deaf"); + pattern2.add("debit"); + pattern2.add("debon"); + pattern2.add("decan"); + pattern2.add("decil"); + pattern2.add("decom"); + pattern2.add("ded"); + pattern2.add("dee."); + pattern2.add("deif"); + pattern2.add("delie"); + pattern2.add("deliq"); + pattern2.add("delo"); + pattern2.add("dem"); + pattern2.add("dem."); + pattern2.add("demic"); + pattern2.add("demic."); + pattern2.add("demil"); + pattern2.add("demons"); + pattern2.add("demor"); + pattern2.add("den"); + pattern2.add("denar"); + pattern2.add("deno"); + pattern2.add("dentif"); + pattern2.add("denu"); + pattern2.add("dep"); + pattern2.add("depa"); + pattern2.add("depi"); + pattern2.add("depu"); + pattern2.add("deq"); + pattern2.add("derh"); + pattern2.add("derm"); + pattern2.add("derniz"); + pattern2.add("ders"); + pattern2.add("des"); + pattern2.add("des."); + pattern2.add("desc"); + pattern2.add("deso"); + pattern2.add("desti"); + pattern2.add("destr"); + pattern2.add("desu"); + pattern2.add("det"); + pattern2.add("deto"); + pattern2.add("dev"); + pattern2.add("devil"); + pattern2.add("dey"); + pattern2.add("df"); + pattern2.add("dga"); + pattern2.add("dget"); + pattern2.add("dgi"); + pattern2.add("dgy"); + pattern2.add("dh"); + pattern2.add("di."); + pattern2.add("dia"); + pattern2.add("diab"); + pattern2.add("dicam"); + pattern2.add("dice"); + pattern2.add("dict"); + pattern2.add("did"); + pattern2.add("dien"); + pattern2.add("dif"); + pattern2.add("dige"); + pattern2.add("dilato"); + pattern2.add("din"); + pattern2.add("dina"); + pattern2.add("dine."); + pattern2.add("dini"); + pattern2.add("diniz"); + pattern2.add("dio"); + pattern2.add("diog"); + pattern2.add("dipl"); + pattern2.add("dir"); + pattern2.add("dire"); + pattern2.add("dirti"); + pattern2.add("dis"); + pattern2.add("disi"); + pattern2.add("dist"); + pattern2.add("diti"); + pattern2.add("div"); + pattern2.add("dj"); + pattern2.add("dk"); + pattern2.add("dla"); + pattern2.add("dle."); + pattern2.add("dled"); + pattern2.add("dles."); + pattern2.add("dless"); + pattern2.add("dlo"); + pattern2.add("dlu"); + pattern2.add("dly"); + pattern2.add("dm"); + pattern2.add("dn"); + pattern2.add("do"); + pattern2.add("do."); + pattern2.add("dode"); + pattern2.add("doe"); + pattern2.add("dof"); + pattern2.add("dog"); + pattern2.add("dola"); + pattern2.add("doli"); + pattern2.add("dolor"); + pattern2.add("domiz"); + pattern2.add("donat"); + pattern2.add("doni"); + pattern2.add("dood"); + pattern2.add("dopp"); + pattern2.add("dor"); + pattern2.add("dos"); + pattern2.add("dout"); + pattern2.add("dov"); + pattern2.add("dox"); + pattern2.add("dp"); + pattern2.add("dr"); + pattern2.add("dragon"); + pattern2.add("drai"); + pattern2.add("dre"); + pattern2.add("drear"); + pattern2.add("dren"); + pattern2.add("drib"); + pattern2.add("dril"); + pattern2.add("drop"); + pattern2.add("drow"); + pattern2.add("drupli"); + pattern2.add("dry"); + pattern2.add("ds"); + pattern2.add("dsp"); + pattern2.add("dsw"); + pattern2.add("dsy"); + pattern2.add("dth"); + pattern2.add("du"); + pattern2.add("dua"); + pattern2.add("duc"); + pattern2.add("duca"); + pattern2.add("ducer"); + pattern2.add("duct."); + pattern2.add("ducts"); + pattern2.add("duel"); + pattern2.add("dug"); + pattern2.add("dule"); + pattern2.add("dumbe"); + pattern2.add("dun"); + pattern2.add("dup"); + pattern2.add("dupe"); + pattern2.add("dv"); + pattern2.add("dw"); + pattern2.add("dy"); + pattern2.add("dyn"); + pattern2.add("dyse"); + pattern2.add("dysp"); + pattern2.add("eab"); + pattern2.add("eact"); + pattern2.add("ead"); + pattern2.add("eadie"); + pattern2.add("eage"); + pattern2.add("eager"); + pattern2.add("eal"); + pattern2.add("ealer"); + pattern2.add("ealou"); + pattern2.add("eamer"); + pattern2.add("eand"); + pattern2.add("eara"); + pattern2.add("earc"); + pattern2.add("eares"); + pattern2.add("earic"); + pattern2.add("earil"); + pattern2.add("eark"); + pattern2.add("eart"); + pattern2.add("earte"); + pattern2.add("easp"); + pattern2.add("eass"); + pattern2.add("east"); + pattern2.add("eat"); + pattern2.add("eaten"); + pattern2.add("eathi"); + pattern2.add("eatif"); + pattern2.add("eatu"); + pattern2.add("eav"); + pattern2.add("eaven"); + pattern2.add("eavi"); + pattern2.add("eavo"); + pattern2.add("eb"); + pattern2.add("ebel."); + pattern2.add("ebels"); + pattern2.add("eben"); + pattern2.add("ebit"); + pattern2.add("ebr"); + pattern2.add("ecad"); + pattern2.add("ecanc"); + pattern2.add("ecca"); + pattern2.add("ece"); + pattern2.add("ecessa"); + pattern2.add("eci"); + pattern2.add("ecib"); + pattern2.add("ecificat"); + pattern2.add("ecifie"); + pattern2.add("ecify"); + pattern2.add("ecim"); + pattern2.add("ecit"); + pattern2.add("ecite"); + pattern2.add("eclam"); + pattern2.add("eclus"); + pattern2.add("ecol"); + pattern2.add("ecomm"); + pattern2.add("ecompe"); + pattern2.add("econc"); + pattern2.add("ecor"); + pattern2.add("ecora"); + pattern2.add("ecoro"); + pattern2.add("ecr"); + pattern2.add("ecrem"); + pattern2.add("ectan"); + pattern2.add("ecte"); + pattern2.add("ecu"); + pattern2.add("ecul"); + pattern2.add("ecula"); + pattern2.add("eda"); + pattern2.add("edd"); + pattern2.add("eder"); + pattern2.add("edes"); + pattern2.add("edi"); + pattern2.add("edia"); + pattern2.add("edib"); + pattern2.add("edica"); + pattern2.add("edim"); + pattern2.add("edit"); + pattern2.add("ediz"); + pattern2.add("edo"); + pattern2.add("edol"); + pattern2.add("edon"); + pattern2.add("edri"); + pattern2.add("edul"); + pattern2.add("edulo"); + pattern2.add("eec"); + pattern2.add("eedi"); + pattern2.add("eef"); + pattern2.add("eeli"); + pattern2.add("eely"); + pattern2.add("eem"); + pattern2.add("eena"); + pattern2.add("eep"); + pattern2.add("ees"); + pattern2.add("eest"); + pattern2.add("eety"); + pattern2.add("eex"); + pattern2.add("ef"); + pattern2.add("efere"); + pattern2.add("eff"); + pattern2.add("efic"); + pattern2.add("efici"); + pattern2.add("efil"); + pattern2.add("efine"); + pattern2.add("efinite"); + pattern2.add("efit"); + pattern2.add("efores"); + pattern2.add("efuse."); + pattern2.add("egal"); + pattern2.add("eger"); + pattern2.add("egib"); + pattern2.add("egic"); + pattern2.add("eging"); + pattern2.add("egit"); + pattern2.add("egn"); + pattern2.add("ego."); + pattern2.add("egos"); + pattern2.add("egul"); + pattern2.add("egur"); + pattern2.add("egy"); + pattern2.add("eh"); + pattern2.add("eher"); + pattern2.add("ei"); + pattern2.add("eic"); + pattern2.add("eid"); + pattern2.add("eig"); + pattern2.add("eigl"); + pattern2.add("eimb"); + pattern2.add("einf"); + pattern2.add("eing"); + pattern2.add("einst"); + pattern2.add("eird"); + pattern2.add("eite"); + pattern2.add("eith"); + pattern2.add("eity"); + pattern2.add("ej"); + pattern2.add("ejud"); + pattern2.add("ejudi"); + pattern2.add("ekin"); + pattern2.add("ekla"); + pattern2.add("ela"); + pattern2.add("ela."); + pattern2.add("elac"); + pattern2.add("eland"); + pattern2.add("elativ"); + pattern2.add("elaw"); + pattern2.add("elaxa"); + pattern2.add("elea"); + pattern2.add("elebra"); + pattern2.add("elec"); + pattern2.add("eled"); + pattern2.add("elega"); + pattern2.add("elen"); + pattern2.add("eler"); + pattern2.add("eles"); + pattern2.add("elf"); + pattern2.add("eli"); + pattern2.add("elibe"); + pattern2.add("elic."); + pattern2.add("elica"); + pattern2.add("elier"); + pattern2.add("eligib"); + pattern2.add("elim"); + pattern2.add("eling"); + pattern2.add("elio"); + pattern2.add("elis"); + pattern2.add("elish"); + pattern2.add("eliv"); + pattern2.add("ella"); + pattern2.add("ellab"); + pattern2.add("ello"); + pattern2.add("eloc"); + pattern2.add("elog"); + pattern2.add("elop."); + pattern2.add("elsh"); + pattern2.add("elta"); + pattern2.add("elud"); + pattern2.add("elug"); + pattern2.add("emac"); + pattern2.add("emag"); + pattern2.add("eman"); + pattern2.add("emana"); + pattern2.add("emb"); + pattern2.add("eme"); + pattern2.add("emel"); + pattern2.add("emet"); + pattern2.add("emica"); + pattern2.add("emie"); + pattern2.add("emigra"); + pattern2.add("emin"); + pattern2.add("emine"); + pattern2.add("emini"); + pattern2.add("emis"); + pattern2.add("emish"); + pattern2.add("emiss"); + pattern2.add("emiz"); + pattern2.add("emniz"); + pattern2.add("emog"); + pattern2.add("emonio"); + pattern2.add("empi"); + pattern2.add("emul"); + pattern2.add("emula"); + pattern2.add("emun"); + pattern2.add("emy"); + pattern2.add("enamo"); + pattern2.add("enant"); + pattern2.add("encher"); + pattern2.add("endic"); + pattern2.add("enea"); + pattern2.add("enee"); + pattern2.add("enem"); + pattern2.add("enero"); + pattern2.add("enesi"); + pattern2.add("enest"); + pattern2.add("enetr"); + pattern2.add("enew"); + pattern2.add("enics"); + pattern2.add("enie"); + pattern2.add("enil"); + pattern2.add("enio"); + pattern2.add("enish"); + pattern2.add("enit"); + pattern2.add("eniu"); + pattern2.add("eniz"); + pattern2.add("enn"); + pattern2.add("eno"); + pattern2.add("enog"); + pattern2.add("enos"); + pattern2.add("enov"); + pattern2.add("ensw"); + pattern2.add("entage"); + pattern2.add("enthes"); + pattern2.add("enua"); + pattern2.add("enuf"); + pattern2.add("eny."); + pattern2.add("enz"); + pattern2.add("eof"); + pattern2.add("eog"); + pattern2.add("eoi"); + pattern2.add("eol"); + pattern2.add("eopar"); + pattern2.add("eor"); + pattern2.add("eore"); + pattern2.add("eorol"); + pattern2.add("eos"); + pattern2.add("eot"); + pattern2.add("eoto"); + pattern2.add("eout"); + pattern2.add("eow"); + pattern2.add("epa"); + pattern2.add("epai"); + pattern2.add("epanc"); + pattern2.add("epel"); + pattern2.add("epent"); + pattern2.add("epetitio"); + pattern2.add("ephe"); + pattern2.add("epli"); + pattern2.add("epo"); + pattern2.add("eprec"); + pattern2.add("epreca"); + pattern2.add("epred"); + pattern2.add("epreh"); + pattern2.add("epro"); + pattern2.add("eprob"); + pattern2.add("epsh"); + pattern2.add("eptib"); + pattern2.add("eput"); + pattern2.add("eputa"); + pattern2.add("eq"); + pattern2.add("equil"); + pattern2.add("equis"); + pattern2.add("era"); + pattern2.add("erab"); + pattern2.add("erand"); + pattern2.add("erar"); + pattern2.add("erati."); + pattern2.add("erb"); + pattern2.add("erbl"); + pattern2.add("erch"); + pattern2.add("erche"); + pattern2.add("ere."); + pattern2.add("ereal"); + pattern2.add("ereco"); + pattern2.add("erein"); + pattern2.add("erel."); + pattern2.add("eremo"); + pattern2.add("erena"); + pattern2.add("erence"); + pattern2.add("erene"); + pattern2.add("erent"); + pattern2.add("ereq"); + pattern2.add("eress"); + pattern2.add("erest"); + pattern2.add("eret"); + pattern2.add("erh"); + pattern2.add("eri"); + pattern2.add("eria"); + pattern2.add("erick"); + pattern2.add("erien"); + pattern2.add("erier"); + pattern2.add("erine"); + pattern2.add("erio"); + pattern2.add("erit"); + pattern2.add("eriu"); + pattern2.add("eriv"); + pattern2.add("eriva"); + pattern2.add("erm"); + pattern2.add("ernis"); + pattern2.add("ernit"); + pattern2.add("erniz"); + pattern2.add("erno"); + pattern2.add("ero"); + pattern2.add("erob"); + pattern2.add("eroc"); + pattern2.add("eror"); + pattern2.add("erou"); + pattern2.add("ers"); + pattern2.add("erset"); + pattern2.add("erter"); + pattern2.add("ertl"); + pattern2.add("ertw"); + pattern2.add("eru"); + pattern2.add("erut"); + pattern2.add("erwau"); + pattern2.add("esa"); + pattern2.add("esage."); + pattern2.add("esages"); + pattern2.add("esc"); + pattern2.add("esca"); + pattern2.add("escan"); + pattern2.add("escr"); + pattern2.add("escu"); + pattern2.add("ese"); + pattern2.add("esec"); + pattern2.add("esecr"); + pattern2.add("esenc"); + pattern2.add("esert."); + pattern2.add("eserts"); + pattern2.add("eserva"); + pattern2.add("esh"); + pattern2.add("esha"); + pattern2.add("eshen"); + pattern2.add("esi"); + pattern2.add("esic"); + pattern2.add("esid"); + pattern2.add("esiden"); + pattern2.add("esigna"); + pattern2.add("esim"); + pattern2.add("esin"); + pattern2.add("esiste"); + pattern2.add("esiu"); + pattern2.add("eskin"); + pattern2.add("esmi"); + pattern2.add("esol"); + pattern2.add("esolu"); + pattern2.add("eson"); + pattern2.add("esona"); + pattern2.add("esp"); + pattern2.add("esper"); + pattern2.add("espira"); + pattern2.add("espre"); + pattern2.add("ess"); + pattern2.add("essib"); + pattern2.add("estan"); + pattern2.add("estig"); + pattern2.add("estim"); + pattern2.add("esto"); + pattern2.add("eston"); + pattern2.add("estr"); + pattern2.add("estro"); + pattern2.add("estruc"); + pattern2.add("esur"); + pattern2.add("esurr"); + pattern2.add("esw"); + pattern2.add("etab"); + pattern2.add("etend"); + pattern2.add("eteo"); + pattern2.add("ethod"); + pattern2.add("etic"); + pattern2.add("etide"); + pattern2.add("etin"); + pattern2.add("etino"); + pattern2.add("etir"); + pattern2.add("etitio"); + pattern2.add("etitiv"); + pattern2.add("etn"); + pattern2.add("etona"); + pattern2.add("etra"); + pattern2.add("etre"); + pattern2.add("etric"); + pattern2.add("etrif"); + pattern2.add("etrog"); + pattern2.add("etros"); + pattern2.add("etua"); + pattern2.add("etym"); + pattern2.add("etz"); + pattern2.add("eu"); + pattern2.add("eun"); + pattern2.add("eup"); + pattern2.add("euro"); + pattern2.add("eus"); + pattern2.add("eute"); + pattern2.add("eutil"); + pattern2.add("eutr"); + pattern2.add("evap"); + pattern2.add("evas"); + pattern2.add("evast"); + pattern2.add("evea"); + pattern2.add("evell"); + pattern2.add("evelo"); + pattern2.add("eveng"); + pattern2.add("eveni"); + pattern2.add("ever"); + pattern2.add("everb"); + pattern2.add("evi"); + pattern2.add("evid"); + pattern2.add("evil"); + pattern2.add("evin"); + pattern2.add("eviv"); + pattern2.add("evoc"); + pattern2.add("evu"); + pattern2.add("ewa"); + pattern2.add("ewag"); + pattern2.add("ewee"); + pattern2.add("ewh"); + pattern2.add("ewil"); + pattern2.add("ewing"); + pattern2.add("ewit"); + pattern2.add("exp"); + pattern2.add("eyc"); + pattern2.add("eye."); + pattern2.add("eys"); + pattern2.add("fa"); + pattern2.add("fabl"); + pattern2.add("fabr"); + pattern2.add("face"); + pattern2.add("fag"); + pattern2.add("fain"); + pattern2.add("falle"); + pattern2.add("fama"); + pattern2.add("famis"); + pattern2.add("far"); + pattern2.add("farth"); + pattern2.add("fata"); + pattern2.add("fathe"); + pattern2.add("fato"); + pattern2.add("fault"); + pattern2.add("fb"); + pattern2.add("fd"); + pattern2.add("fe."); + pattern2.add("feas"); + pattern2.add("feath"); + pattern2.add("feb"); + pattern2.add("feca"); + pattern2.add("fect"); + pattern2.add("fed"); + pattern2.add("feli"); + pattern2.add("femo"); + pattern2.add("fend"); + pattern2.add("fende"); + pattern2.add("fer"); + pattern2.add("ferr"); + pattern2.add("fev"); + pattern2.add("ff"); + pattern2.add("ffes"); + pattern2.add("ffie"); + pattern2.add("ffin."); + pattern2.add("ffis"); + pattern2.add("ffly"); + pattern2.add("ffy"); + pattern2.add("fh"); + pattern2.add("fi"); + pattern2.add("fia"); + pattern2.add("fic."); + pattern2.add("fical"); + pattern2.add("fican"); + pattern2.add("ficate"); + pattern2.add("ficen"); + pattern2.add("ficer"); + pattern2.add("fici"); + pattern2.add("ficia"); + pattern2.add("ficie"); + pattern2.add("fics"); + pattern2.add("ficu"); + pattern2.add("fidel"); + pattern2.add("fight"); + pattern2.add("fili"); + pattern2.add("fillin"); + pattern2.add("fily"); + pattern2.add("fin"); + pattern2.add("fina"); + pattern2.add("find"); + pattern2.add("fine"); + pattern2.add("fing"); + pattern2.add("finn"); + pattern2.add("fisti"); + pattern2.add("fl"); + pattern2.add("fless"); + pattern2.add("flin"); + pattern2.add("flore"); + pattern2.add("fly"); + pattern2.add("fm"); + pattern2.add("fn"); + pattern2.add("fo"); + pattern2.add("fon"); + pattern2.add("fonde"); + pattern2.add("font"); + pattern2.add("for"); + pattern2.add("forat"); + pattern2.add("foray"); + pattern2.add("foret"); + pattern2.add("fori"); + pattern2.add("forta"); + pattern2.add("fos"); + pattern2.add("fp"); + pattern2.add("frat"); + pattern2.add("frea"); + pattern2.add("fresc"); + pattern2.add("fri"); + pattern2.add("fril"); + pattern2.add("frol"); + pattern2.add("fs"); + pattern2.add("ft"); + pattern2.add("fto"); + pattern2.add("fty"); + pattern2.add("fu"); + pattern2.add("fuel"); + pattern2.add("fug"); + pattern2.add("fumin"); + pattern2.add("fune"); + pattern2.add("furi"); + pattern2.add("fusi"); + pattern2.add("fuss"); + pattern2.add("futa"); + pattern2.add("fy"); + pattern2.add("ga"); + pattern2.add("gaf"); + pattern2.add("gal."); + pattern2.add("gali"); + pattern2.add("galo"); + pattern2.add("gam"); + pattern2.add("gamet"); + pattern2.add("gamo"); + pattern2.add("ganis"); + pattern2.add("ganiz"); + pattern2.add("ganiza"); + pattern2.add("gano"); + pattern2.add("garn"); + pattern2.add("gass"); + pattern2.add("gath"); + pattern2.add("gativ"); + pattern2.add("gaz"); + pattern2.add("gb"); + pattern2.add("gd"); + pattern2.add("ge."); + pattern2.add("ged"); + pattern2.add("geez"); + pattern2.add("gelin"); + pattern2.add("gelis"); + pattern2.add("geliz"); + pattern2.add("gely"); + pattern2.add("gen"); + pattern2.add("genat"); + pattern2.add("geniz"); + pattern2.add("geno"); + pattern2.add("geny"); + pattern2.add("geo"); + pattern2.add("geom"); + pattern2.add("gery"); + pattern2.add("gesi"); + pattern2.add("geth"); + pattern2.add("geto"); + pattern2.add("gety"); + pattern2.add("gev"); + pattern2.add("gg"); + pattern2.add("gge"); + pattern2.add("gger"); + pattern2.add("gglu"); + pattern2.add("ggo"); + pattern2.add("ghin"); + pattern2.add("ghout"); + pattern2.add("ghto"); + pattern2.add("gi."); + pattern2.add("gia"); + pattern2.add("giar"); + pattern2.add("gic"); + pattern2.add("gicia"); + pattern2.add("gico"); + pattern2.add("gien"); + pattern2.add("gies."); + pattern2.add("gil"); + pattern2.add("gimen"); + pattern2.add("gin."); + pattern2.add("ginge"); + pattern2.add("gins"); + pattern2.add("gio"); + pattern2.add("gir"); + pattern2.add("girl"); + pattern2.add("gisl"); + pattern2.add("giu"); + pattern2.add("giv"); + pattern2.add("giz"); + pattern2.add("gl"); + pattern2.add("gla"); + pattern2.add("gladi"); + pattern2.add("glas"); + pattern2.add("gle"); + pattern2.add("glib"); + pattern2.add("glig"); + pattern2.add("glo"); + pattern2.add("glor"); + pattern2.add("gm"); + pattern2.add("gmy"); + pattern2.add("gna"); + pattern2.add("gna."); + pattern2.add("gnett"); + pattern2.add("gni"); + pattern2.add("gnin"); + pattern2.add("gnio"); + pattern2.add("gno"); + pattern2.add("gnon"); + pattern2.add("go"); + pattern2.add("go."); + pattern2.add("gob"); + pattern2.add("goe"); + pattern2.add("gog"); + pattern2.add("gois"); + pattern2.add("gon"); + pattern2.add("gona"); + pattern2.add("gondo"); + pattern2.add("goni"); + pattern2.add("goo"); + pattern2.add("goriz"); + pattern2.add("gorou"); + pattern2.add("gos."); + pattern2.add("gov"); + pattern2.add("gp"); + pattern2.add("gr"); + pattern2.add("grada"); + pattern2.add("grai"); + pattern2.add("gran"); + pattern2.add("graph."); + pattern2.add("grapher"); + pattern2.add("graphic"); + pattern2.add("graphy"); + pattern2.add("gray"); + pattern2.add("gren"); + pattern2.add("gress."); + pattern2.add("grit"); + pattern2.add("gro"); + pattern2.add("gruf"); + pattern2.add("gs"); + pattern2.add("gste"); + pattern2.add("gth"); + pattern2.add("gua"); + pattern2.add("guard"); + pattern2.add("gue"); + pattern2.add("guit"); + pattern2.add("gun"); + pattern2.add("gus"); + pattern2.add("gut"); + pattern2.add("gw"); + pattern2.add("gy"); + pattern2.add("gyn"); + pattern2.add("gyra"); + pattern2.add("habl"); + pattern2.add("hach"); + pattern2.add("haem"); + pattern2.add("haet"); + pattern2.add("hagu"); + pattern2.add("hala"); + pattern2.add("halam"); + pattern2.add("ham"); + pattern2.add("hanci"); + pattern2.add("hancy"); + pattern2.add("hand."); + pattern2.add("hang"); + pattern2.add("hanger"); + pattern2.add("hango"); + pattern2.add("haniz"); + pattern2.add("hank"); + pattern2.add("hante"); + pattern2.add("hapl"); + pattern2.add("hapt"); + pattern2.add("haran"); + pattern2.add("haras"); + pattern2.add("hard"); + pattern2.add("harde"); + pattern2.add("harle"); + pattern2.add("harpen"); + pattern2.add("harter"); + pattern2.add("hass"); + pattern2.add("haun"); + pattern2.add("haz"); + pattern2.add("haza"); + pattern2.add("hb"); + pattern2.add("head"); + pattern2.add("hear"); + pattern2.add("hecan"); + pattern2.add("hecat"); + pattern2.add("hed"); + pattern2.add("hedo"); + pattern2.add("heli"); + pattern2.add("hellis"); + pattern2.add("helly"); + pattern2.add("helo"); + pattern2.add("hemp"); + pattern2.add("hen"); + pattern2.add("hena"); + pattern2.add("henat"); + pattern2.add("heor"); + pattern2.add("hep"); + pattern2.add("hera"); + pattern2.add("herap"); + pattern2.add("herba"); + pattern2.add("herea"); + pattern2.add("hern"); + pattern2.add("herou"); + pattern2.add("hery"); + pattern2.add("hes"); + pattern2.add("hesp"); + pattern2.add("het"); + pattern2.add("heted"); + pattern2.add("heu"); + pattern2.add("hf"); + pattern2.add("hh"); + pattern2.add("hian"); + pattern2.add("hico"); + pattern2.add("high"); + pattern2.add("hil"); + pattern2.add("himer"); + pattern2.add("hina"); + pattern2.add("hione"); + pattern2.add("hip"); + pattern2.add("hirl"); + pattern2.add("hiro"); + pattern2.add("hirp"); + pattern2.add("hirr"); + pattern2.add("hisel"); + pattern2.add("hiss"); + pattern2.add("hither"); + pattern2.add("hiv"); + pattern2.add("hk"); + pattern2.add("hl"); + pattern2.add("hlan"); + pattern2.add("hlo"); + pattern2.add("hlori"); + pattern2.add("hm"); + pattern2.add("hmet"); + pattern2.add("hn"); + pattern2.add("hodiz"); + pattern2.add("hods"); + pattern2.add("hog"); + pattern2.add("hoge"); + pattern2.add("holar"); + pattern2.add("hole"); + pattern2.add("homa"); + pattern2.add("home"); + pattern2.add("hona"); + pattern2.add("hony"); + pattern2.add("hood"); + pattern2.add("hoon"); + pattern2.add("horat"); + pattern2.add("horis"); + pattern2.add("horte"); + pattern2.add("horu"); + pattern2.add("hose"); + pattern2.add("hosen"); + pattern2.add("hosp"); + pattern2.add("hous"); + pattern2.add("house"); + pattern2.add("hovel"); + pattern2.add("hp"); + pattern2.add("hr"); + pattern2.add("hree"); + pattern2.add("hroniz"); + pattern2.add("hropo"); + pattern2.add("hs"); + pattern2.add("hsh"); + pattern2.add("htar"); + pattern2.add("hten"); + pattern2.add("htes"); + pattern2.add("hty"); + pattern2.add("hug"); + pattern2.add("humin"); + pattern2.add("hunke"); + pattern2.add("hunt"); + pattern2.add("hust"); + pattern2.add("hut"); + pattern2.add("hw"); + pattern2.add("hwart"); + pattern2.add("hype"); + pattern2.add("hyph"); + pattern2.add("hys"); + pattern2.add("ia"); + pattern2.add("ial"); + pattern2.add("iam"); + pattern2.add("iamete"); + pattern2.add("ian"); + pattern2.add("ianc"); + pattern2.add("iani"); + pattern2.add("iant"); + pattern2.add("iape"); + pattern2.add("iass"); + pattern2.add("iativ"); + pattern2.add("iatric"); + pattern2.add("iatu"); + pattern2.add("ibe"); + pattern2.add("ibera"); + pattern2.add("ibert"); + pattern2.add("ibia"); + pattern2.add("ibin"); + pattern2.add("ibit."); + pattern2.add("ibite"); + pattern2.add("ibl"); + pattern2.add("ibli"); + pattern2.add("ibo"); + pattern2.add("ibr"); + pattern2.add("ibri"); + pattern2.add("ibun"); + pattern2.add("icam"); + pattern2.add("icap"); + pattern2.add("icar"); + pattern2.add("icar."); + pattern2.add("icara"); + pattern2.add("icas"); + pattern2.add("icay"); + pattern2.add("iccu"); + pattern2.add("iceo"); + pattern2.add("ich"); + pattern2.add("ici"); + pattern2.add("icid"); + pattern2.add("icina"); + pattern2.add("icip"); + pattern2.add("icipa"); + pattern2.add("icly"); + pattern2.add("icoc"); + pattern2.add("icr"); + pattern2.add("icra"); + pattern2.add("icry"); + pattern2.add("icte"); + pattern2.add("ictu"); + pattern2.add("ictua"); + pattern2.add("icula"); + pattern2.add("icum"); + pattern2.add("icuo"); + pattern2.add("icur"); + pattern2.add("id"); + pattern2.add("idai"); + pattern2.add("idanc"); + pattern2.add("idd"); + pattern2.add("ideal"); + pattern2.add("ides"); + pattern2.add("idi"); + pattern2.add("idian"); + pattern2.add("idiar"); + pattern2.add("idie"); + pattern2.add("idio"); + pattern2.add("idiou"); + pattern2.add("idit"); + pattern2.add("idiu"); + pattern2.add("idle"); + pattern2.add("idom"); + pattern2.add("idow"); + pattern2.add("idr"); + pattern2.add("idu"); + pattern2.add("iduo"); + pattern2.add("ie"); + pattern2.add("iede"); + pattern2.add("iega"); + pattern2.add("ield"); + pattern2.add("iena"); + pattern2.add("iene"); + pattern2.add("ienn"); + pattern2.add("ienti"); + pattern2.add("ier."); + pattern2.add("iesc"); + pattern2.add("iest"); + pattern2.add("iet"); + pattern2.add("if."); + pattern2.add("ifero"); + pattern2.add("iffen"); + pattern2.add("iffr"); + pattern2.add("ific."); + pattern2.add("ifie"); + pattern2.add("ifl"); + pattern2.add("ift"); + pattern2.add("ig"); + pattern2.add("igab"); + pattern2.add("igera"); + pattern2.add("ighti"); + pattern2.add("igi"); + pattern2.add("igib"); + pattern2.add("igil"); + pattern2.add("igin"); + pattern2.add("igit"); + pattern2.add("igl"); + pattern2.add("igo"); + pattern2.add("igor"); + pattern2.add("igot"); + pattern2.add("igre"); + pattern2.add("igui"); + pattern2.add("igur"); + pattern2.add("ih"); + pattern2.add("ii"); + pattern2.add("ij"); + pattern2.add("ik"); + pattern2.add("ila"); + pattern2.add("ilab"); + pattern2.add("ilade"); + pattern2.add("ilam"); + pattern2.add("ilara"); + pattern2.add("ileg"); + pattern2.add("iler"); + pattern2.add("ilev"); + pattern2.add("ilf"); + pattern2.add("ili"); + pattern2.add("ilia"); + pattern2.add("ilib"); + pattern2.add("ilio"); + pattern2.add("ilist"); + pattern2.add("ilit"); + pattern2.add("iliz"); + pattern2.add("illab"); + pattern2.add("iln"); + pattern2.add("iloq"); + pattern2.add("ilty"); + pattern2.add("ilur"); + pattern2.add("ilv"); + pattern2.add("imag"); + pattern2.add("image"); + pattern2.add("imary"); + pattern2.add("imentar"); + pattern2.add("imet"); + pattern2.add("imi"); + pattern2.add("imida"); + pattern2.add("imile"); + pattern2.add("imini"); + pattern2.add("imit"); + pattern2.add("imni"); + pattern2.add("imon"); + pattern2.add("imu"); + pattern2.add("imula"); + pattern2.add("in."); + pattern2.add("inau"); + pattern2.add("inav"); + pattern2.add("incel"); + pattern2.add("incer"); + pattern2.add("ind"); + pattern2.add("indling"); + pattern2.add("ine"); + pattern2.add("inee"); + pattern2.add("inerar"); + pattern2.add("iness"); + pattern2.add("inga"); + pattern2.add("inge"); + pattern2.add("ingen"); + pattern2.add("ingi"); + pattern2.add("ingling"); + pattern2.add("ingo"); + pattern2.add("ingu"); + pattern2.add("ini"); + pattern2.add("ini."); + pattern2.add("inia"); + pattern2.add("inio"); + pattern2.add("inis"); + pattern2.add("inite."); + pattern2.add("initio"); + pattern2.add("inity"); + pattern2.add("ink"); + pattern2.add("inl"); + pattern2.add("inn"); + pattern2.add("ino"); + pattern2.add("inoc"); + pattern2.add("inos"); + pattern2.add("inot"); + pattern2.add("ins"); + pattern2.add("inse"); + pattern2.add("insura"); + pattern2.add("int."); + pattern2.add("inth"); + pattern2.add("inu"); + pattern2.add("inus"); + pattern2.add("iny"); + pattern2.add("io"); + pattern2.add("io."); + pattern2.add("ioge"); + pattern2.add("iogr"); + pattern2.add("iol"); + pattern2.add("iom"); + pattern2.add("ionat"); + pattern2.add("ionery"); + pattern2.add("ioni"); + pattern2.add("ioph"); + pattern2.add("iori"); + pattern2.add("ios"); + pattern2.add("ioth"); + pattern2.add("ioti"); + pattern2.add("ioto"); + pattern2.add("iour"); + pattern2.add("ip"); + pattern2.add("ipe"); + pattern2.add("iphras"); + pattern2.add("ipi"); + pattern2.add("ipic"); + pattern2.add("ipre"); + pattern2.add("ipul"); + pattern2.add("iqua"); + pattern2.add("iquef"); + pattern2.add("iquid"); + pattern2.add("iquit"); + pattern2.add("ir"); + pattern2.add("ira"); + pattern2.add("irab"); + pattern2.add("irac"); + pattern2.add("irde"); + pattern2.add("irede"); + pattern2.add("iref"); + pattern2.add("irel"); + pattern2.add("ires"); + pattern2.add("irgi"); + pattern2.add("iri"); + pattern2.add("iride"); + pattern2.add("iris"); + pattern2.add("iritu"); + pattern2.add("iriz"); + pattern2.add("irmin"); + pattern2.add("irog"); + pattern2.add("iron."); + pattern2.add("irul"); + pattern2.add("is."); + pattern2.add("isag"); + pattern2.add("isar"); + pattern2.add("isas"); + pattern2.add("isc"); + pattern2.add("isch"); + pattern2.add("ise"); + pattern2.add("iser"); + pattern2.add("isf"); + pattern2.add("ishan"); + pattern2.add("ishon"); + pattern2.add("ishop"); + pattern2.add("isib"); + pattern2.add("isid"); + pattern2.add("isis"); + pattern2.add("isitiv"); + pattern2.add("isk"); + pattern2.add("islan"); + pattern2.add("isms"); + pattern2.add("iso"); + pattern2.add("isomer"); + pattern2.add("isp"); + pattern2.add("ispi"); + pattern2.add("ispy"); + pattern2.add("iss"); + pattern2.add("issal"); + pattern2.add("issen"); + pattern2.add("isses"); + pattern2.add("ista."); + pattern2.add("iste"); + pattern2.add("isti"); + pattern2.add("istly"); + pattern2.add("istral"); + pattern2.add("isu"); + pattern2.add("isus"); + pattern2.add("ita."); + pattern2.add("itabi"); + pattern2.add("itag"); + pattern2.add("itam"); + pattern2.add("itan"); + pattern2.add("itat"); + pattern2.add("ite"); + pattern2.add("itera"); + pattern2.add("iteri"); + pattern2.add("ites"); + pattern2.add("ith"); + pattern2.add("iti"); + pattern2.add("itia"); + pattern2.add("itic"); + pattern2.add("itica"); + pattern2.add("itick"); + pattern2.add("itig"); + pattern2.add("itill"); + pattern2.add("itim"); + pattern2.add("itio"); + pattern2.add("itis"); + pattern2.add("itism"); + pattern2.add("itom"); + pattern2.add("iton"); + pattern2.add("itram"); + pattern2.add("itry"); + pattern2.add("itt"); + pattern2.add("ituat"); + pattern2.add("itud"); + pattern2.add("itul"); + pattern2.add("itz."); + pattern2.add("iu"); + pattern2.add("iv"); + pattern2.add("ivell"); + pattern2.add("iven."); + pattern2.add("iver."); + pattern2.add("ivers."); + pattern2.add("ivil."); + pattern2.add("ivio"); + pattern2.add("ivit"); + pattern2.add("ivore"); + pattern2.add("ivoro"); + pattern2.add("ivot"); + pattern2.add("iw"); + pattern2.add("ixo"); + pattern2.add("iy"); + pattern2.add("izar"); + pattern2.add("izi"); + pattern2.add("izont"); + pattern2.add("ja"); + pattern2.add("jacq"); + pattern2.add("jap"); + pattern2.add("je"); + pattern2.add("jers"); + pattern2.add("jestie"); + pattern2.add("jesty"); + pattern2.add("jew"); + pattern2.add("jop"); + pattern2.add("judg"); + pattern2.add("ka."); + pattern2.add("kab"); + pattern2.add("kag"); + pattern2.add("kais"); + pattern2.add("kal"); + pattern2.add("kb"); + pattern2.add("ked"); + pattern2.add("kee"); + pattern2.add("keg"); + pattern2.add("keli"); + pattern2.add("kend"); + pattern2.add("ker"); + pattern2.add("kes"); + pattern2.add("kest."); + pattern2.add("kety"); + pattern2.add("kf"); + pattern2.add("kh"); + pattern2.add("ki"); + pattern2.add("ki."); + pattern2.add("kic"); + pattern2.add("kill"); + pattern2.add("kilo"); + pattern2.add("kim"); + pattern2.add("kin."); + pattern2.add("kinde"); + pattern2.add("kiness"); + pattern2.add("king"); + pattern2.add("kip"); + pattern2.add("kis"); + pattern2.add("kish"); + pattern2.add("kk"); + pattern2.add("kl"); + pattern2.add("kley"); + pattern2.add("kly"); + pattern2.add("km"); + pattern2.add("knes"); + pattern2.add("kno"); + pattern2.add("kor"); + pattern2.add("kosh"); + pattern2.add("kou"); + pattern2.add("kron"); + pattern2.add("ks"); + pattern2.add("ksc"); + pattern2.add("ksl"); + pattern2.add("ksy"); + pattern2.add("kt"); + pattern2.add("kw"); + pattern2.add("labic"); + pattern2.add("labo"); + pattern2.add("laci"); + pattern2.add("lade"); + pattern2.add("lady"); + pattern2.add("lagn"); + pattern2.add("lamo"); + pattern2.add("land"); + pattern2.add("landl"); + pattern2.add("lanet"); + pattern2.add("lante"); + pattern2.add("larg"); + pattern2.add("lari"); + pattern2.add("lase"); + pattern2.add("latan"); + pattern2.add("lateli"); + pattern2.add("lativ"); + pattern2.add("lav"); + pattern2.add("lava"); + pattern2.add("lb"); + pattern2.add("lbin"); + pattern2.add("lc"); + pattern2.add("lce"); + pattern2.add("lci"); + pattern2.add("ld"); + pattern2.add("lde"); + pattern2.add("ldere"); + pattern2.add("lderi"); + pattern2.add("ldi"); + pattern2.add("ldis"); + pattern2.add("ldr"); + pattern2.add("ldri"); + pattern2.add("lea"); + pattern2.add("lebi"); + pattern2.add("left"); + pattern2.add("leg."); + pattern2.add("legg"); + pattern2.add("lemat"); + pattern2.add("lematic"); + pattern2.add("len."); + pattern2.add("lenc"); + pattern2.add("lene."); + pattern2.add("lent"); + pattern2.add("leph"); + pattern2.add("lepr"); + pattern2.add("lerab"); + pattern2.add("lere"); + pattern2.add("lerg"); + pattern2.add("leri"); + pattern2.add("lero"); + pattern2.add("les"); + pattern2.add("lesco"); + pattern2.add("lesq"); + pattern2.add("less"); + pattern2.add("less."); + pattern2.add("leva"); + pattern2.add("lever."); + pattern2.add("levera"); + pattern2.add("levers"); + pattern2.add("ley"); + pattern2.add("leye"); + pattern2.add("lf"); + pattern2.add("lfr"); + pattern2.add("lg"); + pattern2.add("lga"); + pattern2.add("lgar"); + pattern2.add("lges"); + pattern2.add("lgo"); + pattern2.add("lh"); + pattern2.add("liag"); + pattern2.add("liam"); + pattern2.add("liariz"); + pattern2.add("lias"); + pattern2.add("liato"); + pattern2.add("libi"); + pattern2.add("licio"); + pattern2.add("licor"); + pattern2.add("lics"); + pattern2.add("lict."); + pattern2.add("licu"); + pattern2.add("licy"); + pattern2.add("lida"); + pattern2.add("lider"); + pattern2.add("lidi"); + pattern2.add("lifer"); + pattern2.add("liff"); + pattern2.add("lifl"); + pattern2.add("ligate"); + pattern2.add("ligh"); + pattern2.add("ligra"); + pattern2.add("lik"); + pattern2.add("lil"); + pattern2.add("limbl"); + pattern2.add("limi"); + pattern2.add("limo"); + pattern2.add("limp"); + pattern2.add("lina"); + pattern2.add("line"); + pattern2.add("linea"); + pattern2.add("lini"); + pattern2.add("linker"); + pattern2.add("liog"); + pattern2.add("liq"); + pattern2.add("lisp"); + pattern2.add("lit"); + pattern2.add("lit."); + pattern2.add("litica"); + pattern2.add("litics"); + pattern2.add("liver"); + pattern2.add("liz"); + pattern2.add("lj"); + pattern2.add("lka"); + pattern2.add("lkal"); + pattern2.add("lkat"); + pattern2.add("ll"); + pattern2.add("llaw"); + pattern2.add("lle"); + pattern2.add("llea"); + pattern2.add("llec"); + pattern2.add("lleg"); + pattern2.add("llel"); + pattern2.add("llen"); + pattern2.add("llet"); + pattern2.add("lli"); + pattern2.add("llin"); + pattern2.add("llina"); + pattern2.add("llo"); + pattern2.add("lloqui"); + pattern2.add("llout"); + pattern2.add("llow"); + pattern2.add("lm"); + pattern2.add("lmet"); + pattern2.add("lming"); + pattern2.add("lmod"); + pattern2.add("lmon"); + pattern2.add("ln"); + pattern2.add("lo."); + pattern2.add("lobal"); + pattern2.add("loci"); + pattern2.add("lof"); + pattern2.add("logic"); + pattern2.add("logo"); + pattern2.add("logu"); + pattern2.add("lomer"); + pattern2.add("long"); + pattern2.add("loni"); + pattern2.add("loniz"); + pattern2.add("lood"); + pattern2.add("lope."); + pattern2.add("lopi"); + pattern2.add("lopm"); + pattern2.add("lora"); + pattern2.add("lorato"); + pattern2.add("lorie"); + pattern2.add("lorou"); + pattern2.add("los."); + pattern2.add("loset"); + pattern2.add("losophiz"); + pattern2.add("losophy"); + pattern2.add("lost"); + pattern2.add("lota"); + pattern2.add("lound"); + pattern2.add("lout"); + pattern2.add("lov"); + pattern2.add("lp"); + pattern2.add("lpab"); + pattern2.add("lpha"); + pattern2.add("lphi"); + pattern2.add("lping"); + pattern2.add("lpit"); + pattern2.add("lpl"); + pattern2.add("lpr"); + pattern2.add("lr"); + pattern2.add("ls"); + pattern2.add("lsc"); + pattern2.add("lse"); + pattern2.add("lsie"); + pattern2.add("lt"); + pattern2.add("ltag"); + pattern2.add("ltane"); + pattern2.add("lte"); + pattern2.add("lten"); + pattern2.add("ltera"); + pattern2.add("lthi"); + pattern2.add("lties."); + pattern2.add("ltis"); + pattern2.add("ltr"); + pattern2.add("ltu"); + pattern2.add("ltura"); + pattern2.add("lua"); + pattern2.add("lubr"); + pattern2.add("luch"); + pattern2.add("luci"); + pattern2.add("luen"); + pattern2.add("luf"); + pattern2.add("luid"); + pattern2.add("luma"); + pattern2.add("lumi"); + pattern2.add("lumn."); + pattern2.add("lumnia"); + pattern2.add("luo"); + pattern2.add("luor"); + pattern2.add("lup"); + pattern2.add("luss"); + pattern2.add("luste"); + pattern2.add("lut"); + pattern2.add("lven"); + pattern2.add("lvet"); + pattern2.add("lw"); + pattern2.add("ly"); + pattern2.add("lya"); + pattern2.add("lyb"); + pattern2.add("lyme"); + pattern2.add("lyno"); + pattern2.add("lys"); + pattern2.add("lyse"); + pattern2.add("ma"); + pattern2.add("mab"); + pattern2.add("maca"); + pattern2.add("machine"); + pattern2.add("macl"); + pattern2.add("magin"); + pattern2.add("magn"); + pattern2.add("mah"); + pattern2.add("maid"); + pattern2.add("mald"); + pattern2.add("malig"); + pattern2.add("malin"); + pattern2.add("malli"); + pattern2.add("malty"); + pattern2.add("mania"); + pattern2.add("manis"); + pattern2.add("maniz"); + pattern2.add("map"); + pattern2.add("marine."); + pattern2.add("mariz"); + pattern2.add("marly"); + pattern2.add("marv"); + pattern2.add("masce"); + pattern2.add("mase"); + pattern2.add("mast"); + pattern2.add("mate"); + pattern2.add("math"); + pattern2.add("matis"); + pattern2.add("matiza"); + pattern2.add("mb"); + pattern2.add("mbat"); + pattern2.add("mbil"); + pattern2.add("mbing"); + pattern2.add("mbiv"); + pattern2.add("mc"); + pattern2.add("me."); + pattern2.add("med"); + pattern2.add("med."); + pattern2.add("media"); + pattern2.add("medie"); + pattern2.add("medy"); + pattern2.add("meg"); + pattern2.add("melon"); + pattern2.add("melt"); + pattern2.add("mem"); + pattern2.add("memo"); + pattern2.add("men"); + pattern2.add("mena"); + pattern2.add("menac"); + pattern2.add("mende"); + pattern2.add("mene"); + pattern2.add("meni"); + pattern2.add("mens"); + pattern2.add("mensu"); + pattern2.add("ment"); + pattern2.add("mente"); + pattern2.add("meon"); + pattern2.add("mersa"); + pattern2.add("mes"); + pattern2.add("mesti"); + pattern2.add("meta"); + pattern2.add("metal"); + pattern2.add("mete"); + pattern2.add("methi"); + pattern2.add("metr"); + pattern2.add("metric"); + pattern2.add("metrie"); + pattern2.add("metry"); + pattern2.add("mev"); + pattern2.add("mf"); + pattern2.add("mh"); + pattern2.add("mi."); + pattern2.add("mia"); + pattern2.add("mida"); + pattern2.add("midg"); + pattern2.add("mig"); + pattern2.add("milia"); + pattern2.add("milie"); + pattern2.add("mill"); + pattern2.add("mina"); + pattern2.add("mind"); + pattern2.add("minee"); + pattern2.add("mingl"); + pattern2.add("mingli"); + pattern2.add("mingly"); + pattern2.add("mint"); + pattern2.add("minu"); + pattern2.add("miot"); + pattern2.add("mis"); + pattern2.add("miser."); + pattern2.add("misl"); + pattern2.add("misti"); + pattern2.add("mistry"); + pattern2.add("mith"); + pattern2.add("miz"); + pattern2.add("mk"); + pattern2.add("ml"); + pattern2.add("mm"); + pattern2.add("mmary"); + pattern2.add("mn"); + pattern2.add("mna"); + pattern2.add("mnin"); + pattern2.add("mno"); + pattern2.add("mo"); + pattern2.add("mocr"); + pattern2.add("mocratiz"); + pattern2.add("mod"); + pattern2.add("mogo"); + pattern2.add("mois"); + pattern2.add("moise"); + pattern2.add("mok"); + pattern2.add("molest"); + pattern2.add("mome"); + pattern2.add("monet"); + pattern2.add("monge"); + pattern2.add("monia"); + pattern2.add("monism"); + pattern2.add("monist"); + pattern2.add("moniz"); + pattern2.add("monol"); + pattern2.add("mony."); + pattern2.add("mor"); + pattern2.add("mora."); + pattern2.add("mos"); + pattern2.add("mosey"); + pattern2.add("mosp"); + pattern2.add("moth"); + pattern2.add("mouf"); + pattern2.add("mous"); + pattern2.add("mov"); + pattern2.add("mp"); + pattern2.add("mpara"); + pattern2.add("mparab"); + pattern2.add("mpari"); + pattern2.add("mpet"); + pattern2.add("mphas"); + pattern2.add("mpi"); + pattern2.add("mpia"); + pattern2.add("mpies"); + pattern2.add("mpin"); + pattern2.add("mpir"); + pattern2.add("mpis"); + pattern2.add("mpori"); + pattern2.add("mposite"); + pattern2.add("mpous"); + pattern2.add("mpov"); + pattern2.add("mptr"); + pattern2.add("mpy"); + pattern2.add("mr"); + pattern2.add("ms"); + pattern2.add("msh"); + pattern2.add("msi"); + pattern2.add("mt"); + pattern2.add("mu"); + pattern2.add("mular"); + pattern2.add("mult"); + pattern2.add("multi"); + pattern2.add("mum"); + pattern2.add("mun"); + pattern2.add("mup"); + pattern2.add("muu"); + pattern2.add("mw"); + pattern2.add("na"); + pattern2.add("nab"); + pattern2.add("nabu"); + pattern2.add("nac."); + pattern2.add("naca"); + pattern2.add("nact"); + pattern2.add("nager."); + pattern2.add("nak"); + pattern2.add("nali"); + pattern2.add("nalia"); + pattern2.add("nalt"); + pattern2.add("namit"); + pattern2.add("nan"); + pattern2.add("nanci"); + pattern2.add("nanit"); + pattern2.add("nank"); + pattern2.add("narc"); + pattern2.add("nare"); + pattern2.add("nari"); + pattern2.add("narl"); + pattern2.add("narm"); + pattern2.add("nas"); + pattern2.add("nasc"); + pattern2.add("nasti"); + pattern2.add("nat"); + pattern2.add("natal"); + pattern2.add("natomiz"); + pattern2.add("nau"); + pattern2.add("nause"); + pattern2.add("naut"); + pattern2.add("nave"); + pattern2.add("nb"); + pattern2.add("ncar"); + pattern2.add("nces."); + pattern2.add("ncha"); + pattern2.add("ncheo"); + pattern2.add("nchil"); + pattern2.add("nchis"); + pattern2.add("ncin"); + pattern2.add("ncit"); + pattern2.add("ncoura"); + pattern2.add("ncr"); + pattern2.add("ncu"); + pattern2.add("ndai"); + pattern2.add("ndan"); + pattern2.add("nde"); + pattern2.add("ndest."); + pattern2.add("ndib"); + pattern2.add("ndif"); + pattern2.add("ndit"); + pattern2.add("ndiz"); + pattern2.add("nduc"); + pattern2.add("ndur"); + pattern2.add("ndwe"); + pattern2.add("ne."); + pattern2.add("near"); + pattern2.add("neb"); + pattern2.add("nebu"); + pattern2.add("nec"); + pattern2.add("neck"); + pattern2.add("ned"); + pattern2.add("negat"); + pattern2.add("negativ"); + pattern2.add("nege"); + pattern2.add("nela"); + pattern2.add("neliz"); + pattern2.add("nemi"); + pattern2.add("nemo"); + pattern2.add("nen"); + pattern2.add("nene"); + pattern2.add("neo"); + pattern2.add("nepo"); + pattern2.add("neq"); + pattern2.add("ner"); + pattern2.add("nerab"); + pattern2.add("nerar"); + pattern2.add("nere"); + pattern2.add("neri"); + pattern2.add("nerr"); + pattern2.add("nes"); + pattern2.add("nes."); + pattern2.add("nesp"); + pattern2.add("nest"); + pattern2.add("nesw"); + pattern2.add("netic"); + pattern2.add("nev"); + pattern2.add("neve"); + pattern2.add("new"); + pattern2.add("nf"); + pattern2.add("ngab"); + pattern2.add("ngel"); + pattern2.add("ngene"); + pattern2.add("ngere"); + pattern2.add("ngeri"); + pattern2.add("ngha"); + pattern2.add("ngib"); + pattern2.add("ngin"); + pattern2.add("ngit"); + pattern2.add("ngla"); + pattern2.add("ngov"); + pattern2.add("ngsh"); + pattern2.add("ngu"); + pattern2.add("ngum"); + pattern2.add("ngy"); + pattern2.add("nh"); + pattern2.add("nha"); + pattern2.add("nhab"); + pattern2.add("nhe"); + pattern2.add("nia"); + pattern2.add("nian"); + pattern2.add("niap"); + pattern2.add("niba"); + pattern2.add("nibl"); + pattern2.add("nid"); + pattern2.add("nidi"); + pattern2.add("nier"); + pattern2.add("nifi"); + pattern2.add("nificat"); + pattern2.add("nigr"); + pattern2.add("nik"); + pattern2.add("nim"); + pattern2.add("nimiz"); + pattern2.add("nin"); + pattern2.add("nine."); + pattern2.add("ning"); + pattern2.add("nio"); + pattern2.add("nis."); + pattern2.add("nista"); + pattern2.add("nit"); + pattern2.add("nith"); + pattern2.add("nitio"); + pattern2.add("nitor"); + pattern2.add("nitr"); + pattern2.add("nj"); + pattern2.add("nk"); + pattern2.add("nkero"); + pattern2.add("nket"); + pattern2.add("nkin"); + pattern2.add("nkl"); + pattern2.add("nl"); + pattern2.add("nm"); + pattern2.add("nme"); + pattern2.add("nmet"); + pattern2.add("nn"); + pattern2.add("nne"); + pattern2.add("nnial"); + pattern2.add("nniv"); + pattern2.add("nobl"); + pattern2.add("noble"); + pattern2.add("nocl"); + pattern2.add("nod"); + pattern2.add("noe"); + pattern2.add("nog"); + pattern2.add("noge"); + pattern2.add("noisi"); + pattern2.add("noli"); + pattern2.add("nologis"); + pattern2.add("nomic"); + pattern2.add("nomiz"); + pattern2.add("nomo"); + pattern2.add("nomy"); + pattern2.add("non"); + pattern2.add("nonag"); + pattern2.add("noni"); + pattern2.add("noniz"); + pattern2.add("nop"); + pattern2.add("nopoli"); + pattern2.add("norab"); + pattern2.add("norary"); + pattern2.add("nosc"); + pattern2.add("nose"); + pattern2.add("nost"); + pattern2.add("nota"); + pattern2.add("nou"); + pattern2.add("noun"); + pattern2.add("novel"); + pattern2.add("nowl"); + pattern2.add("np"); + pattern2.add("npi"); + pattern2.add("nprec"); + pattern2.add("nq"); + pattern2.add("nr"); + pattern2.add("nru"); + pattern2.add("ns"); + pattern2.add("nsab"); + pattern2.add("nsati"); + pattern2.add("nsc"); + pattern2.add("nse"); + pattern2.add("nses"); + pattern2.add("nsid"); + pattern2.add("nsig"); + pattern2.add("nsl"); + pattern2.add("nsm"); + pattern2.add("nsoc"); + pattern2.add("nspe"); + pattern2.add("nspi"); + pattern2.add("nstabl"); + pattern2.add("nt"); + pattern2.add("ntab"); + pattern2.add("nters"); + pattern2.add("nti"); + pattern2.add("ntib"); + pattern2.add("ntier"); + pattern2.add("ntif"); + pattern2.add("ntine"); + pattern2.add("nting"); + pattern2.add("ntip"); + pattern2.add("ntrolli"); + pattern2.add("nts"); + pattern2.add("ntume"); + pattern2.add("nua"); + pattern2.add("nud"); + pattern2.add("nuen"); + pattern2.add("nuffe"); + pattern2.add("nuin"); + pattern2.add("nuit"); + pattern2.add("num"); + pattern2.add("nume"); + pattern2.add("numi"); + pattern2.add("nun"); + pattern2.add("nuo"); + pattern2.add("nutr"); + pattern2.add("nv"); + pattern2.add("nw"); + pattern2.add("nym"); + pattern2.add("nyp"); + pattern2.add("nz"); + pattern2.add("nza"); + pattern2.add("oa"); + pattern2.add("oad"); + pattern2.add("oales"); + pattern2.add("oard"); + pattern2.add("oase"); + pattern2.add("oaste"); + pattern2.add("oati"); + pattern2.add("obab"); + pattern2.add("obar"); + pattern2.add("obel"); + pattern2.add("obi"); + pattern2.add("obin"); + pattern2.add("obing"); + pattern2.add("obr"); + pattern2.add("obul"); + pattern2.add("oce"); + pattern2.add("och"); + pattern2.add("ochet"); + pattern2.add("ocif"); + pattern2.add("ocil"); + pattern2.add("oclam"); + pattern2.add("ocod"); + pattern2.add("ocrac"); + pattern2.add("ocratiz"); + pattern2.add("ocre"); + pattern2.add("ocrit"); + pattern2.add("octora"); + pattern2.add("ocula"); + pattern2.add("ocure"); + pattern2.add("odded"); + pattern2.add("odic"); + pattern2.add("odio"); + pattern2.add("odo"); + pattern2.add("odor"); + pattern2.add("oduct."); + pattern2.add("oducts"); + pattern2.add("oel"); + pattern2.add("oeng"); + pattern2.add("oer"); + pattern2.add("oeta"); + pattern2.add("oev"); + pattern2.add("ofi"); + pattern2.add("ofite"); + pattern2.add("ofitt"); + pattern2.add("ogar"); + pattern2.add("ogativ"); + pattern2.add("ogato"); + pattern2.add("oge"); + pattern2.add("ogene"); + pattern2.add("ogeo"); + pattern2.add("oger"); + pattern2.add("ogie"); + pattern2.add("ogis"); + pattern2.add("ogit"); + pattern2.add("ogl"); + pattern2.add("ogly"); + pattern2.add("ogniz"); + pattern2.add("ogro"); + pattern2.add("ogui"); + pattern2.add("ogy"); + pattern2.add("ogyn"); + pattern2.add("oh"); + pattern2.add("ohab"); + pattern2.add("oi"); + pattern2.add("oices"); + pattern2.add("oider"); + pattern2.add("oiff"); + pattern2.add("oig"); + pattern2.add("oilet"); + pattern2.add("oing"); + pattern2.add("ointer"); + pattern2.add("oism"); + pattern2.add("oison"); + pattern2.add("oisten"); + pattern2.add("oiter"); + pattern2.add("oj"); + pattern2.add("ok"); + pattern2.add("oken"); + pattern2.add("okie"); + pattern2.add("ola"); + pattern2.add("olan"); + pattern2.add("olass"); + pattern2.add("old"); + pattern2.add("olde"); + pattern2.add("oler"); + pattern2.add("olesc"); + pattern2.add("olet"); + pattern2.add("olfi"); + pattern2.add("oli"); + pattern2.add("olia"); + pattern2.add("olice"); + pattern2.add("olid."); + pattern2.add("olif"); + pattern2.add("olil"); + pattern2.add("oling"); + pattern2.add("olio"); + pattern2.add("olis."); + pattern2.add("olish"); + pattern2.add("olite"); + pattern2.add("olitio"); + pattern2.add("oliv"); + pattern2.add("ollie"); + pattern2.add("ologiz"); + pattern2.add("olor"); + pattern2.add("olpl"); + pattern2.add("olt"); + pattern2.add("olub"); + pattern2.add("olume"); + pattern2.add("olun"); + pattern2.add("olus"); + pattern2.add("olv"); + pattern2.add("oly"); + pattern2.add("omah"); + pattern2.add("omal"); + pattern2.add("omatiz"); + pattern2.add("ombe"); + pattern2.add("ombl"); + pattern2.add("ome"); + pattern2.add("omena"); + pattern2.add("omerse"); + pattern2.add("omet"); + pattern2.add("ometry"); + pattern2.add("omia"); + pattern2.add("omic."); + pattern2.add("omica"); + pattern2.add("omid"); + pattern2.add("omin"); + pattern2.add("omini"); + pattern2.add("ommend"); + pattern2.add("omoge"); + pattern2.add("omon"); + pattern2.add("ompi"); + pattern2.add("ompro"); + pattern2.add("on"); + pattern2.add("ona"); + pattern2.add("onac"); + pattern2.add("onan"); + pattern2.add("onc"); + pattern2.add("oncil"); + pattern2.add("ond"); + pattern2.add("ondo"); + pattern2.add("onen"); + pattern2.add("onest"); + pattern2.add("ongu"); + pattern2.add("onic"); + pattern2.add("onio"); + pattern2.add("onis"); + pattern2.add("oniu"); + pattern2.add("onkey"); + pattern2.add("onodi"); + pattern2.add("onomy"); + pattern2.add("ons"); + pattern2.add("onspi"); + pattern2.add("onspira"); + pattern2.add("onsu"); + pattern2.add("onten"); + pattern2.add("onti"); + pattern2.add("ontif"); + pattern2.add("onum"); + pattern2.add("onva"); + pattern2.add("oo"); + pattern2.add("oode"); + pattern2.add("oodi"); + pattern2.add("ook"); + pattern2.add("oopi"); + pattern2.add("oord"); + pattern2.add("oost"); + pattern2.add("opa"); + pattern2.add("oped"); + pattern2.add("oper"); + pattern2.add("opera"); + pattern2.add("operag"); + pattern2.add("oph"); + pattern2.add("ophan"); + pattern2.add("opher"); + pattern2.add("oping"); + pattern2.add("opit"); + pattern2.add("opon"); + pattern2.add("oposi"); + pattern2.add("opr"); + pattern2.add("opu"); + pattern2.add("opy"); + pattern2.add("oq"); + pattern2.add("ora"); + pattern2.add("ora."); + pattern2.add("orag"); + pattern2.add("oraliz"); + pattern2.add("orange"); + pattern2.add("orea"); + pattern2.add("oreal"); + pattern2.add("orei"); + pattern2.add("oresh"); + pattern2.add("orest."); + pattern2.add("orew"); + pattern2.add("orgu"); + pattern2.add("oria"); + pattern2.add("orica"); + pattern2.add("oril"); + pattern2.add("orin"); + pattern2.add("orio"); + pattern2.add("ority"); + pattern2.add("oriu"); + pattern2.add("ormi"); + pattern2.add("orne"); + pattern2.add("orof"); + pattern2.add("oroug"); + pattern2.add("orpe"); + pattern2.add("orrh"); + pattern2.add("orse"); + pattern2.add("orsen"); + pattern2.add("orst"); + pattern2.add("orthi"); + pattern2.add("orthy"); + pattern2.add("orty"); + pattern2.add("orum"); + pattern2.add("ory"); + pattern2.add("osal"); + pattern2.add("osc"); + pattern2.add("osce"); + pattern2.add("oscop"); + pattern2.add("oscopi"); + pattern2.add("oscr"); + pattern2.add("osie"); + pattern2.add("ositiv"); + pattern2.add("osito"); + pattern2.add("osity"); + pattern2.add("osiu"); + pattern2.add("osl"); + pattern2.add("oso"); + pattern2.add("ospa"); + pattern2.add("ospo"); + pattern2.add("osta"); + pattern2.add("ostati"); + pattern2.add("ostil"); + pattern2.add("ostit"); + pattern2.add("otan"); + pattern2.add("oteleg"); + pattern2.add("oter."); + pattern2.add("oters"); + pattern2.add("otes"); + pattern2.add("oth"); + pattern2.add("othesi"); + pattern2.add("othi"); + pattern2.add("otic."); + pattern2.add("otica"); + pattern2.add("otice"); + pattern2.add("otif"); + pattern2.add("otis"); + pattern2.add("otos"); + pattern2.add("ou"); + pattern2.add("oubl"); + pattern2.add("ouchi"); + pattern2.add("ouet"); + pattern2.add("oul"); + pattern2.add("ouncer"); + pattern2.add("ound"); + pattern2.add("ouv"); + pattern2.add("oven"); + pattern2.add("overne"); + pattern2.add("overs"); + pattern2.add("overt"); + pattern2.add("ovis"); + pattern2.add("oviti"); + pattern2.add("ovol"); + pattern2.add("owder"); + pattern2.add("owel"); + pattern2.add("owest"); + pattern2.add("owi"); + pattern2.add("owni"); + pattern2.add("owo"); + pattern2.add("oya"); + pattern2.add("pa"); + pattern2.add("paca"); + pattern2.add("pace"); + pattern2.add("pact"); + pattern2.add("pad"); + pattern2.add("pagan"); + pattern2.add("pagat"); + pattern2.add("pai"); + pattern2.add("pain"); + pattern2.add("pal"); + pattern2.add("pana"); + pattern2.add("panel"); + pattern2.add("panty"); + pattern2.add("pany"); + pattern2.add("pap"); + pattern2.add("papu"); + pattern2.add("parabl"); + pattern2.add("parage"); + pattern2.add("pardi"); + pattern2.add("pare"); + pattern2.add("parel"); + pattern2.add("pari"); + pattern2.add("paris"); + pattern2.add("pate"); + pattern2.add("pater"); + pattern2.add("pathic"); + pattern2.add("pathy"); + pattern2.add("patric"); + pattern2.add("pav"); + pattern2.add("pay"); + pattern2.add("pb"); + pattern2.add("pd"); + pattern2.add("pe."); + pattern2.add("pea"); + pattern2.add("pearl"); + pattern2.add("pec"); + pattern2.add("ped"); + pattern2.add("pede"); + pattern2.add("pedi"); + pattern2.add("pedia"); + pattern2.add("pedic"); + pattern2.add("pee"); + pattern2.add("peed"); + pattern2.add("pek"); + pattern2.add("pela"); + pattern2.add("pelie"); + pattern2.add("penan"); + pattern2.add("penc"); + pattern2.add("penth"); + pattern2.add("peon"); + pattern2.add("pera."); + pattern2.add("perabl"); + pattern2.add("perag"); + pattern2.add("peri"); + pattern2.add("perist"); + pattern2.add("permal"); + pattern2.add("perme"); + pattern2.add("pern"); + pattern2.add("pero"); + pattern2.add("perti"); + pattern2.add("peru"); + pattern2.add("perv"); + pattern2.add("pet"); + pattern2.add("peten"); + pattern2.add("petiz"); + pattern2.add("pf"); + pattern2.add("pg"); + pattern2.add("ph."); + pattern2.add("phari"); + pattern2.add("pheno"); + pattern2.add("pher"); + pattern2.add("phes."); + pattern2.add("phic"); + pattern2.add("phie"); + pattern2.add("phing"); + pattern2.add("phisti"); + pattern2.add("phiz"); + pattern2.add("phl"); + pattern2.add("phob"); + pattern2.add("phone"); + pattern2.add("phoni"); + pattern2.add("phor"); + pattern2.add("phs"); + pattern2.add("pht"); + pattern2.add("phu"); + pattern2.add("phy"); + pattern2.add("pia"); + pattern2.add("pian"); + pattern2.add("picie"); + pattern2.add("picy"); + pattern2.add("pid"); + pattern2.add("pida"); + pattern2.add("pide"); + pattern2.add("pidi"); + pattern2.add("piec"); + pattern2.add("pien"); + pattern2.add("pigrap"); + pattern2.add("pilo"); + pattern2.add("pin"); + pattern2.add("pin."); + pattern2.add("pind"); + pattern2.add("pino"); + pattern2.add("pio"); + pattern2.add("pion"); + pattern2.add("pith"); + pattern2.add("pitha"); + pattern2.add("pitu"); + pattern2.add("pk"); + pattern2.add("pl"); + pattern2.add("plan"); + pattern2.add("plast"); + pattern2.add("plia"); + pattern2.add("plier"); + pattern2.add("plig"); + pattern2.add("plin"); + pattern2.add("ploi"); + pattern2.add("plum"); + pattern2.add("plumb"); + pattern2.add("pm"); + pattern2.add("pn"); + pattern2.add("poc"); + pattern2.add("pod."); + pattern2.add("poem"); + pattern2.add("poet"); + pattern2.add("pog"); + pattern2.add("poin"); + pattern2.add("point"); + pattern2.add("polyt"); + pattern2.add("poni"); + pattern2.add("pop"); + pattern2.add("por"); + pattern2.add("pory"); + pattern2.add("pos"); + pattern2.add("poss"); + pattern2.add("pot"); + pattern2.add("pota"); + pattern2.add("poun"); + pattern2.add("pp"); + pattern2.add("ppara"); + pattern2.add("ppe"); + pattern2.add("pped"); + pattern2.add("ppel"); + pattern2.add("ppen"); + pattern2.add("pper"); + pattern2.add("ppet"); + pattern2.add("pposite"); + pattern2.add("pr"); + pattern2.add("praye"); + pattern2.add("preci"); + pattern2.add("preco"); + pattern2.add("preem"); + pattern2.add("prefac"); + pattern2.add("prela"); + pattern2.add("prer"); + pattern2.add("prese"); + pattern2.add("press"); + pattern2.add("preten"); + pattern2.add("prev"); + pattern2.add("prie"); + pattern2.add("print"); + pattern2.add("pris"); + pattern2.add("priso"); + pattern2.add("proca"); + pattern2.add("profit"); + pattern2.add("prol"); + pattern2.add("prose"); + pattern2.add("prot"); + pattern2.add("ps"); + pattern2.add("pse"); + pattern2.add("psh"); + pattern2.add("psib"); + pattern2.add("pt"); + pattern2.add("ptab"); + pattern2.add("pte"); + pattern2.add("pth"); + pattern2.add("ptim"); + pattern2.add("ptur"); + pattern2.add("ptw"); + pattern2.add("pub"); + pattern2.add("pue"); + pattern2.add("puf"); + pattern2.add("pulc"); + pattern2.add("pum"); + pattern2.add("pun"); + pattern2.add("purr"); + pattern2.add("pus"); + pattern2.add("put"); + pattern2.add("pute"); + pattern2.add("puter"); + pattern2.add("putr"); + pattern2.add("putted"); + pattern2.add("puttin"); + pattern2.add("pw"); + pattern2.add("qu"); + pattern2.add("quav"); + pattern2.add("que."); + pattern2.add("quer"); + pattern2.add("quet"); + pattern2.add("rab"); + pattern2.add("rabi"); + pattern2.add("rache"); + pattern2.add("racl"); + pattern2.add("raffi"); + pattern2.add("raft"); + pattern2.add("rai"); + pattern2.add("ralo"); + pattern2.add("ramet"); + pattern2.add("rami"); + pattern2.add("raneo"); + pattern2.add("range"); + pattern2.add("rani"); + pattern2.add("rano"); + pattern2.add("raper"); + pattern2.add("raphy"); + pattern2.add("rarc"); + pattern2.add("rare"); + pattern2.add("raref"); + pattern2.add("raril"); + pattern2.add("ras"); + pattern2.add("ration"); + pattern2.add("raut"); + pattern2.add("ravai"); + pattern2.add("ravel"); + pattern2.add("razie"); + pattern2.add("rb"); + pattern2.add("rbab"); + pattern2.add("rbag"); + pattern2.add("rbi"); + pattern2.add("rbif"); + pattern2.add("rbin"); + pattern2.add("rbine"); + pattern2.add("rbing."); + pattern2.add("rbo"); + pattern2.add("rc"); + pattern2.add("rce"); + pattern2.add("rcen"); + pattern2.add("rcha"); + pattern2.add("rcher"); + pattern2.add("rcib"); + pattern2.add("rcit"); + pattern2.add("rcum"); + pattern2.add("rdal"); + pattern2.add("rdi"); + pattern2.add("rdia"); + pattern2.add("rdier"); + pattern2.add("rdin"); + pattern2.add("rding"); + pattern2.add("re."); + pattern2.add("real"); + pattern2.add("rean"); + pattern2.add("rearr"); + pattern2.add("reav"); + pattern2.add("reaw"); + pattern2.add("rebrat"); + pattern2.add("recoll"); + pattern2.add("recompe"); + pattern2.add("recre"); + pattern2.add("red"); + pattern2.add("rede"); + pattern2.add("redis"); + pattern2.add("redit"); + pattern2.add("refac"); + pattern2.add("refe"); + pattern2.add("refer."); + pattern2.add("refi"); + pattern2.add("refy"); + pattern2.add("regis"); + pattern2.add("reit"); + pattern2.add("reli"); + pattern2.add("relu"); + pattern2.add("renta"); + pattern2.add("rente"); + pattern2.add("reo"); + pattern2.add("repin"); + pattern2.add("reposi"); + pattern2.add("repu"); + pattern2.add("rer"); + pattern2.add("reri"); + pattern2.add("rero"); + pattern2.add("reru"); + pattern2.add("res."); + pattern2.add("respi"); + pattern2.add("ressib"); + pattern2.add("rest"); + pattern2.add("restal"); + pattern2.add("restr"); + pattern2.add("reter"); + pattern2.add("retiz"); + pattern2.add("retri"); + pattern2.add("reu"); + pattern2.add("reuti"); + pattern2.add("rev"); + pattern2.add("reval"); + pattern2.add("revel"); + pattern2.add("rever."); + pattern2.add("revers"); + pattern2.add("revert"); + pattern2.add("revil"); + pattern2.add("revolu"); + pattern2.add("rewh"); + pattern2.add("rf"); + pattern2.add("rfu"); + pattern2.add("rfy"); + pattern2.add("rg"); + pattern2.add("rger"); + pattern2.add("rget"); + pattern2.add("rgic"); + pattern2.add("rgin"); + pattern2.add("rging"); + pattern2.add("rgis"); + pattern2.add("rgit"); + pattern2.add("rgl"); + pattern2.add("rgon"); + pattern2.add("rgu"); + pattern2.add("rh"); + pattern2.add("rh."); + pattern2.add("rhal"); + pattern2.add("ria"); + pattern2.add("riab"); + pattern2.add("riag"); + pattern2.add("rib"); + pattern2.add("riba"); + pattern2.add("ricas"); + pattern2.add("rice"); + pattern2.add("rici"); + pattern2.add("ricid"); + pattern2.add("ricie"); + pattern2.add("rico"); + pattern2.add("rider"); + pattern2.add("rienc"); + pattern2.add("rient"); + pattern2.add("rier"); + pattern2.add("riet"); + pattern2.add("rigan"); + pattern2.add("rigi"); + pattern2.add("riliz"); + pattern2.add("riman"); + pattern2.add("rimi"); + pattern2.add("rimo"); + pattern2.add("rimpe"); + pattern2.add("rina"); + pattern2.add("rina."); + pattern2.add("rind"); + pattern2.add("rine"); + pattern2.add("ring"); + pattern2.add("rio"); + pattern2.add("riph"); + pattern2.add("riphe"); + pattern2.add("ripl"); + pattern2.add("riplic"); + pattern2.add("riq"); + pattern2.add("ris"); + pattern2.add("ris."); + pattern2.add("risc"); + pattern2.add("rish"); + pattern2.add("risp"); + pattern2.add("ritab"); + pattern2.add("rited."); + pattern2.add("riter."); + pattern2.add("riters"); + pattern2.add("ritic"); + pattern2.add("ritu"); + pattern2.add("ritur"); + pattern2.add("rivel"); + pattern2.add("rivet"); + pattern2.add("rivi"); + pattern2.add("rj"); + pattern2.add("rket"); + pattern2.add("rkle"); + pattern2.add("rklin"); + pattern2.add("rl"); + pattern2.add("rle"); + pattern2.add("rled"); + pattern2.add("rlig"); + pattern2.add("rlis"); + pattern2.add("rlish"); + pattern2.add("rlo"); + pattern2.add("rm"); + pattern2.add("rmac"); + pattern2.add("rme"); + pattern2.add("rmen"); + pattern2.add("rmers"); + pattern2.add("rming"); + pattern2.add("rming."); + pattern2.add("rmio"); + pattern2.add("rmit"); + pattern2.add("rmy"); + pattern2.add("rnar"); + pattern2.add("rnel"); + pattern2.add("rner"); + pattern2.add("rnet"); + pattern2.add("rney"); + pattern2.add("rnic"); + pattern2.add("rnis"); + pattern2.add("rnit"); + pattern2.add("rniv"); + pattern2.add("rno"); + pattern2.add("rnou"); + pattern2.add("rnu"); + pattern2.add("robl"); + pattern2.add("roc"); + pattern2.add("rocr"); + pattern2.add("roe"); + pattern2.add("rofe"); + pattern2.add("rofil"); + pattern2.add("rok"); + pattern2.add("roker"); + pattern2.add("role."); + pattern2.add("romete"); + pattern2.add("romi"); + pattern2.add("romp"); + pattern2.add("ronal"); + pattern2.add("rone"); + pattern2.add("ronis"); + pattern2.add("ronta"); + pattern2.add("room"); + pattern2.add("root"); + pattern2.add("ropel"); + pattern2.add("ropic"); + pattern2.add("rori"); + pattern2.add("roro"); + pattern2.add("rosper"); + pattern2.add("ross"); + pattern2.add("rothe"); + pattern2.add("roty"); + pattern2.add("rova"); + pattern2.add("rovel"); + pattern2.add("rox"); + pattern2.add("rp"); + pattern2.add("rpea"); + pattern2.add("rpent"); + pattern2.add("rper."); + pattern2.add("rpet"); + pattern2.add("rph"); + pattern2.add("rping"); + pattern2.add("rpo"); + pattern2.add("rr"); + pattern2.add("rrec"); + pattern2.add("rref"); + pattern2.add("rreo"); + pattern2.add("rrest"); + pattern2.add("rrio"); + pattern2.add("rriv"); + pattern2.add("rron"); + pattern2.add("rros"); + pattern2.add("rrys"); + pattern2.add("rs"); + pattern2.add("rsa"); + pattern2.add("rsati"); + pattern2.add("rsc"); + pattern2.add("rse"); + pattern2.add("rsec"); + pattern2.add("rsecr"); + pattern2.add("rser."); + pattern2.add("rses"); + pattern2.add("rsev"); + pattern2.add("rsh"); + pattern2.add("rsha"); + pattern2.add("rsi"); + pattern2.add("rsib"); + pattern2.add("rson"); + pattern2.add("rsp"); + pattern2.add("rsw"); + pattern2.add("rtach"); + pattern2.add("rtag"); + pattern2.add("rteb"); + pattern2.add("rtend"); + pattern2.add("rteo"); + pattern2.add("rti"); + pattern2.add("rtib"); + pattern2.add("rtid"); + pattern2.add("rtier"); + pattern2.add("rtig"); + pattern2.add("rtili"); + pattern2.add("rtill"); + pattern2.add("rtily"); + pattern2.add("rtist"); + pattern2.add("rtiv"); + pattern2.add("rtri"); + pattern2.add("rtroph"); + pattern2.add("rtsh"); + pattern2.add("rua"); + pattern2.add("ruel"); + pattern2.add("ruen"); + pattern2.add("rugl"); + pattern2.add("ruin"); + pattern2.add("rumpl"); + pattern2.add("run"); + pattern2.add("runk"); + pattern2.add("runty"); + pattern2.add("rusc"); + pattern2.add("rutin"); + pattern2.add("rve"); + pattern2.add("rveli"); + pattern2.add("rven"); + pattern2.add("rver."); + pattern2.add("rvest"); + pattern2.add("rvey"); + pattern2.add("rvic"); + pattern2.add("rviv"); + pattern2.add("rvo"); + pattern2.add("rw"); + pattern2.add("ryc"); + pattern2.add("rynge"); + pattern2.add("ryt"); + pattern2.add("sa"); + pattern2.add("sab"); + pattern2.add("sack"); + pattern2.add("sacri"); + pattern2.add("sact"); + pattern2.add("sai"); + pattern2.add("salar"); + pattern2.add("salm"); + pattern2.add("salo"); + pattern2.add("salt"); + pattern2.add("sanc"); + pattern2.add("sande"); + pattern2.add("sap"); + pattern2.add("sata"); + pattern2.add("satio"); + pattern2.add("satu"); + pattern2.add("sau"); + pattern2.add("savor"); + pattern2.add("saw"); + pattern2.add("sb"); + pattern2.add("scant"); + pattern2.add("scap"); + pattern2.add("scav"); + pattern2.add("sced"); + pattern2.add("scei"); + pattern2.add("sces"); + pattern2.add("sch"); + pattern2.add("scho"); + pattern2.add("scie"); + pattern2.add("scind"); + pattern2.add("scle"); + pattern2.add("scli"); + pattern2.add("scof"); + pattern2.add("scopy"); + pattern2.add("scoura"); + pattern2.add("scu"); + pattern2.add("sd"); + pattern2.add("se."); + pattern2.add("sea"); + pattern2.add("seas"); + pattern2.add("seaw"); + pattern2.add("seco"); + pattern2.add("sect"); + pattern2.add("sed"); + pattern2.add("sede"); + pattern2.add("sedl"); + pattern2.add("seg"); + pattern2.add("segr"); + pattern2.add("sei"); + pattern2.add("sele"); + pattern2.add("self"); + pattern2.add("selv"); + pattern2.add("seme"); + pattern2.add("semol"); + pattern2.add("senat"); + pattern2.add("senc"); + pattern2.add("send"); + pattern2.add("sened"); + pattern2.add("seng"); + pattern2.add("senin"); + pattern2.add("sentd"); + pattern2.add("sentl"); + pattern2.add("sepa"); + pattern2.add("ser."); + pattern2.add("serl"); + pattern2.add("sero"); + pattern2.add("servo"); + pattern2.add("ses"); + pattern2.add("sesh"); + pattern2.add("sest"); + pattern2.add("seum"); + pattern2.add("sev"); + pattern2.add("seven"); + pattern2.add("sewi"); + pattern2.add("sex"); + pattern2.add("sf"); + pattern2.add("sg"); + pattern2.add("sh"); + pattern2.add("sh."); + pattern2.add("sher"); + pattern2.add("shev"); + pattern2.add("shin"); + pattern2.add("shio"); + pattern2.add("ship"); + pattern2.add("shiv"); + pattern2.add("sho"); + pattern2.add("shold"); + pattern2.add("shon"); + pattern2.add("shor"); + pattern2.add("short"); + pattern2.add("shw"); + pattern2.add("sib"); + pattern2.add("sicc"); + pattern2.add("side."); + pattern2.add("sides"); + pattern2.add("sidi"); + pattern2.add("sidiz"); + pattern2.add("signa"); + pattern2.add("sile"); + pattern2.add("sily"); + pattern2.add("sin"); + pattern2.add("sina"); + pattern2.add("sine."); + pattern2.add("sing"); + pattern2.add("sio"); + pattern2.add("sion"); + pattern2.add("siona"); + pattern2.add("sir"); + pattern2.add("sira"); + pattern2.add("sis"); + pattern2.add("sitio"); + pattern2.add("siu"); + pattern2.add("siv"); + pattern2.add("siz"); + pattern2.add("sk"); + pattern2.add("ske"); + pattern2.add("sket"); + pattern2.add("skine"); + pattern2.add("sking"); + pattern2.add("sl"); + pattern2.add("slat"); + pattern2.add("sle"); + pattern2.add("slith"); + pattern2.add("sm"); + pattern2.add("sma"); + pattern2.add("small"); + pattern2.add("sman"); + pattern2.add("smel"); + pattern2.add("smen"); + pattern2.add("smith"); + pattern2.add("smold"); + pattern2.add("sn"); + pattern2.add("so"); + pattern2.add("soce"); + pattern2.add("soft"); + pattern2.add("solab"); + pattern2.add("sold"); + pattern2.add("solic"); + pattern2.add("solv"); + pattern2.add("som"); + pattern2.add("son."); + pattern2.add("sona"); + pattern2.add("song"); + pattern2.add("sop"); + pattern2.add("sophic"); + pattern2.add("sophiz"); + pattern2.add("sophy"); + pattern2.add("sorc"); + pattern2.add("sord"); + pattern2.add("sov"); + pattern2.add("sovi"); + pattern2.add("spa"); + pattern2.add("spai"); + pattern2.add("span"); + pattern2.add("spend"); + pattern2.add("speo"); + pattern2.add("sper"); + pattern2.add("sphe"); + pattern2.add("spher"); + pattern2.add("spho"); + pattern2.add("spil"); + pattern2.add("sping"); + pattern2.add("spio"); + pattern2.add("sply"); + pattern2.add("spon"); + pattern2.add("spor"); + pattern2.add("spot"); + pattern2.add("squall"); + pattern2.add("sr"); + pattern2.add("ss"); + pattern2.add("ssa"); + pattern2.add("ssas"); + pattern2.add("ssc"); + pattern2.add("ssel"); + pattern2.add("sseng"); + pattern2.add("sses."); + pattern2.add("sset"); + pattern2.add("ssi"); + pattern2.add("ssie"); + pattern2.add("ssier"); + pattern2.add("ssily"); + pattern2.add("ssl"); + pattern2.add("ssli"); + pattern2.add("ssn"); + pattern2.add("sspend"); + pattern2.add("sst"); + pattern2.add("ssura"); + pattern2.add("ssw"); + pattern2.add("st."); + pattern2.add("stag"); + pattern2.add("stal"); + pattern2.add("stami"); + pattern2.add("stand"); + pattern2.add("stap"); + pattern2.add("stat."); + pattern2.add("sted"); + pattern2.add("sterni"); + pattern2.add("stero"); + pattern2.add("stew"); + pattern2.add("stewa"); + pattern2.add("sthe"); + pattern2.add("sti"); + pattern2.add("sti."); + pattern2.add("stia"); + pattern2.add("stic"); + pattern2.add("stick"); + pattern2.add("stie"); + pattern2.add("stif"); + pattern2.add("sting"); + pattern2.add("stir"); + pattern2.add("stle"); + pattern2.add("stock"); + pattern2.add("stoma"); + pattern2.add("stone"); + pattern2.add("stop"); + pattern2.add("store"); + pattern2.add("str"); + pattern2.add("strad"); + pattern2.add("stratu"); + pattern2.add("stray"); + pattern2.add("strid"); + pattern2.add("stry"); + pattern2.add("stw"); + pattern2.add("sty"); + pattern2.add("su"); + pattern2.add("sual"); + pattern2.add("sub"); + pattern2.add("sug"); + pattern2.add("suis"); + pattern2.add("suit"); + pattern2.add("sul"); + pattern2.add("sum"); + pattern2.add("sumi"); + pattern2.add("sun"); + pattern2.add("sur"); + pattern2.add("sv"); + pattern2.add("sw"); + pattern2.add("swo"); + pattern2.add("sy"); + pattern2.add("syc"); + pattern2.add("syl"); + pattern2.add("syno"); + pattern2.add("syrin"); + pattern2.add("ta"); + pattern2.add("ta."); + pattern2.add("tab"); + pattern2.add("tables"); + pattern2.add("taboliz"); + pattern2.add("taci"); + pattern2.add("tado"); + pattern2.add("taf"); + pattern2.add("tailo"); + pattern2.add("tal"); + pattern2.add("tala"); + pattern2.add("talen"); + pattern2.add("tali"); + pattern2.add("talk"); + pattern2.add("tallis"); + pattern2.add("talog"); + pattern2.add("tamo"); + pattern2.add("tande"); + pattern2.add("tanta"); + pattern2.add("taper"); + pattern2.add("tapl"); + pattern2.add("tara"); + pattern2.add("tarc"); + pattern2.add("tare"); + pattern2.add("tariz"); + pattern2.add("tase"); + pattern2.add("tasy"); + pattern2.add("tatic"); + pattern2.add("tatur"); + pattern2.add("taun"); + pattern2.add("tav"); + pattern2.add("taw"); + pattern2.add("taxis"); + pattern2.add("tb"); + pattern2.add("tc"); + pattern2.add("tch"); + pattern2.add("tchet"); + pattern2.add("td"); + pattern2.add("te."); + pattern2.add("teadi"); + pattern2.add("teat"); + pattern2.add("tece"); + pattern2.add("tect"); + pattern2.add("ted"); + pattern2.add("tedi"); + pattern2.add("tee"); + pattern2.add("teg"); + pattern2.add("teger"); + pattern2.add("tegi"); + pattern2.add("tel."); + pattern2.add("teli"); + pattern2.add("tels"); + pattern2.add("tema"); + pattern2.add("temat"); + pattern2.add("tenan"); + pattern2.add("tenc"); + pattern2.add("tend"); + pattern2.add("tenes"); + pattern2.add("tent"); + pattern2.add("tentag"); + pattern2.add("teo"); + pattern2.add("tep"); + pattern2.add("tepe"); + pattern2.add("terc"); + pattern2.add("terd"); + pattern2.add("teri"); + pattern2.add("teries"); + pattern2.add("teris"); + pattern2.add("teriza"); + pattern2.add("ternit"); + pattern2.add("terv"); + pattern2.add("tes."); + pattern2.add("tess"); + pattern2.add("tess."); + pattern2.add("tethe"); + pattern2.add("teu"); + pattern2.add("tex"); + pattern2.add("tey"); + pattern2.add("tf"); + pattern2.add("tg"); + pattern2.add("th."); + pattern2.add("than"); + pattern2.add("the"); + pattern2.add("thea"); + pattern2.add("theas"); + pattern2.add("theat"); + pattern2.add("theis"); + pattern2.add("thet"); + pattern2.add("thic."); + pattern2.add("thica"); + pattern2.add("thil"); + pattern2.add("think"); + pattern2.add("thl"); + pattern2.add("thode"); + pattern2.add("thodic"); + pattern2.add("thoo"); + pattern2.add("thorit"); + pattern2.add("thoriz"); + pattern2.add("ths"); + pattern2.add("tia"); + pattern2.add("tiab"); + pattern2.add("tiato"); + pattern2.add("tib"); + pattern2.add("tick"); + pattern2.add("tico"); + pattern2.add("ticu"); + pattern2.add("tidi"); + pattern2.add("tien"); + pattern2.add("tif"); + pattern2.add("tify"); + pattern2.add("tig"); + pattern2.add("tigu"); + pattern2.add("tillin"); + pattern2.add("tim"); + pattern2.add("timp"); + pattern2.add("timul"); + pattern2.add("tin"); + pattern2.add("tina"); + pattern2.add("tine."); + pattern2.add("tini"); + pattern2.add("tio"); + pattern2.add("tioc"); + pattern2.add("tionee"); + pattern2.add("tiq"); + pattern2.add("tisa"); + pattern2.add("tise"); + pattern2.add("tism"); + pattern2.add("tiso"); + pattern2.add("tisp"); + pattern2.add("tistica"); + pattern2.add("titl"); + pattern2.add("tiu"); + pattern2.add("tiv"); + pattern2.add("tiva"); + pattern2.add("tiz"); + pattern2.add("tiza"); + pattern2.add("tizen"); + pattern2.add("tl"); + pattern2.add("tla"); + pattern2.add("tlan"); + pattern2.add("tle."); + pattern2.add("tled"); + pattern2.add("tles."); + pattern2.add("tlet."); + pattern2.add("tlo"); + pattern2.add("tm"); + pattern2.add("tme"); + pattern2.add("tn"); + pattern2.add("to"); + pattern2.add("tob"); + pattern2.add("tocrat"); + pattern2.add("todo"); + pattern2.add("tof"); + pattern2.add("togr"); + pattern2.add("toic"); + pattern2.add("toma"); + pattern2.add("tomb"); + pattern2.add("tomy"); + pattern2.add("tonali"); + pattern2.add("tonat"); + pattern2.add("tono"); + pattern2.add("tony"); + pattern2.add("tora"); + pattern2.add("torie"); + pattern2.add("toriz"); + pattern2.add("tos"); + pattern2.add("tour"); + pattern2.add("tout"); + pattern2.add("towar"); + pattern2.add("tp"); + pattern2.add("tra"); + pattern2.add("trab"); + pattern2.add("trach"); + pattern2.add("traci"); + pattern2.add("tracit"); + pattern2.add("tracte"); + pattern2.add("tras"); + pattern2.add("traven"); + pattern2.add("traves"); + pattern2.add("tref"); + pattern2.add("trem"); + pattern2.add("tremi"); + pattern2.add("tria"); + pattern2.add("trices"); + pattern2.add("tricia"); + pattern2.add("trics"); + pattern2.add("trim"); + pattern2.add("triv"); + pattern2.add("tromi"); + pattern2.add("troni"); + pattern2.add("trony"); + pattern2.add("trophe"); + pattern2.add("trosp"); + pattern2.add("trov"); + pattern2.add("trui"); + pattern2.add("trus"); + pattern2.add("ts"); + pattern2.add("tsc"); + pattern2.add("tsh"); + pattern2.add("tsw"); + pattern2.add("tt"); + pattern2.add("ttes"); + pattern2.add("tto"); + pattern2.add("ttu"); + pattern2.add("tu"); + pattern2.add("tua"); + pattern2.add("tuar"); + pattern2.add("tubi"); + pattern2.add("tud"); + pattern2.add("tue"); + pattern2.add("tuf"); + pattern2.add("tui"); + pattern2.add("tum"); + pattern2.add("tunis"); + pattern2.add("tup."); + pattern2.add("ture"); + pattern2.add("turi"); + pattern2.add("turis"); + pattern2.add("turo"); + pattern2.add("tury"); + pattern2.add("tus"); + pattern2.add("tv"); + pattern2.add("tw"); + pattern2.add("twa"); + pattern2.add("twis"); + pattern2.add("two"); + pattern2.add("ty"); + pattern2.add("tya"); + pattern2.add("tyl"); + pattern2.add("type"); + pattern2.add("typh"); + pattern2.add("tz"); + pattern2.add("tze"); + pattern2.add("uab"); + pattern2.add("uac"); + pattern2.add("uana"); + pattern2.add("uani"); + pattern2.add("uarant"); + pattern2.add("uard"); + pattern2.add("uari"); + pattern2.add("uart"); + pattern2.add("uat"); + pattern2.add("uav"); + pattern2.add("ube"); + pattern2.add("ubel"); + pattern2.add("uber"); + pattern2.add("ubero"); + pattern2.add("ubi"); + pattern2.add("ubing"); + pattern2.add("uble."); + pattern2.add("uca"); + pattern2.add("ucib"); + pattern2.add("ucit"); + pattern2.add("ucle"); + pattern2.add("ucr"); + pattern2.add("ucu"); + pattern2.add("ucy"); + pattern2.add("udd"); + pattern2.add("uder"); + pattern2.add("udest"); + pattern2.add("udev"); + pattern2.add("udic"); + pattern2.add("udied"); + pattern2.add("udies"); + pattern2.add("udis"); + pattern2.add("udit"); + pattern2.add("udon"); + pattern2.add("udsi"); + pattern2.add("udu"); + pattern2.add("uene"); + pattern2.add("uens"); + pattern2.add("uente"); + pattern2.add("ueril"); + pattern2.add("ufa"); + pattern2.add("ufl"); + pattern2.add("ughen"); + pattern2.add("ugin"); + pattern2.add("ui"); + pattern2.add("uiliz"); + pattern2.add("uin"); + pattern2.add("uing"); + pattern2.add("uirm"); + pattern2.add("uita"); + pattern2.add("uiv"); + pattern2.add("uiver."); + pattern2.add("uj"); + pattern2.add("uk"); + pattern2.add("ula"); + pattern2.add("ulab"); + pattern2.add("ulati"); + pattern2.add("ulch"); + pattern2.add("ulche"); + pattern2.add("ulder"); + pattern2.add("ule"); + pattern2.add("ulen"); + pattern2.add("ulgi"); + pattern2.add("uli"); + pattern2.add("ulia"); + pattern2.add("uling"); + pattern2.add("ulish"); + pattern2.add("ullar"); + pattern2.add("ullib"); + pattern2.add("ullis"); + pattern2.add("ulm"); + pattern2.add("ulo"); + pattern2.add("uls"); + pattern2.add("ulses"); + pattern2.add("ulti"); + pattern2.add("ultra"); + pattern2.add("ultu"); + pattern2.add("ulu"); + pattern2.add("ulul"); + pattern2.add("ulv"); + pattern2.add("umab"); + pattern2.add("umbi"); + pattern2.add("umbly"); + pattern2.add("umi"); + pattern2.add("uming"); + pattern2.add("umoro"); + pattern2.add("ump"); + pattern2.add("unat"); + pattern2.add("une"); + pattern2.add("uner"); + pattern2.add("uni"); + pattern2.add("unim"); + pattern2.add("unin"); + pattern2.add("unish"); + pattern2.add("univ"); + pattern2.add("uns"); + pattern2.add("unsw"); + pattern2.add("untab"); + pattern2.add("unter."); + pattern2.add("untes"); + pattern2.add("unu"); + pattern2.add("uny"); + pattern2.add("unz"); + pattern2.add("uors"); + pattern2.add("uos"); + pattern2.add("uou"); + pattern2.add("upe"); + pattern2.add("upers"); + pattern2.add("upia"); + pattern2.add("uping"); + pattern2.add("upl"); + pattern2.add("upp"); + pattern2.add("upport"); + pattern2.add("uptib"); + pattern2.add("uptu"); + pattern2.add("ura"); + pattern2.add("ura."); + pattern2.add("urag"); + pattern2.add("uras"); + pattern2.add("urbe"); + pattern2.add("urc"); + pattern2.add("urd"); + pattern2.add("ureat"); + pattern2.add("urfer"); + pattern2.add("urfr"); + pattern2.add("urif"); + pattern2.add("urific"); + pattern2.add("urin"); + pattern2.add("urio"); + pattern2.add("urit"); + pattern2.add("uriz"); + pattern2.add("url"); + pattern2.add("urling."); + pattern2.add("urno"); + pattern2.add("uros"); + pattern2.add("urpe"); + pattern2.add("urpi"); + pattern2.add("urser"); + pattern2.add("urtes"); + pattern2.add("urthe"); + pattern2.add("urti"); + pattern2.add("urtie"); + pattern2.add("uru"); + pattern2.add("us"); + pattern2.add("usad"); + pattern2.add("usan"); + pattern2.add("usap"); + pattern2.add("usc"); + pattern2.add("usci"); + pattern2.add("usea"); + pattern2.add("usia"); + pattern2.add("usic"); + pattern2.add("uslin"); + pattern2.add("usp"); + pattern2.add("ussl"); + pattern2.add("ustere"); + pattern2.add("ustr"); + pattern2.add("usu"); + pattern2.add("usur"); + pattern2.add("utab"); + pattern2.add("utat"); + pattern2.add("ute."); + pattern2.add("utel"); + pattern2.add("uten"); + pattern2.add("uteni"); + pattern2.add("uti"); + pattern2.add("utiliz"); + pattern2.add("utine"); + pattern2.add("uting"); + pattern2.add("utiona"); + pattern2.add("utis"); + pattern2.add("utiz"); + pattern2.add("utl"); + pattern2.add("utof"); + pattern2.add("utog"); + pattern2.add("utomatic"); + pattern2.add("uton"); + pattern2.add("utou"); + pattern2.add("uts"); + pattern2.add("uu"); + pattern2.add("uum"); + pattern2.add("uv"); + pattern2.add("uxu"); + pattern2.add("uze"); + pattern2.add("va"); + pattern2.add("va."); + pattern2.add("vab"); + pattern2.add("vacil"); + pattern2.add("vacu"); + pattern2.add("vag"); + pattern2.add("vage"); + pattern2.add("valie"); + pattern2.add("valo"); + pattern2.add("valu"); + pattern2.add("vamo"); + pattern2.add("vaniz"); + pattern2.add("vapi"); + pattern2.add("varied"); + pattern2.add("vat"); + pattern2.add("ve."); + pattern2.add("ved"); + pattern2.add("veg"); + pattern2.add("vel."); + pattern2.add("velli"); + pattern2.add("velo"); + pattern2.add("vely"); + pattern2.add("venom"); + pattern2.add("venue"); + pattern2.add("verd"); + pattern2.add("vere."); + pattern2.add("verel"); + pattern2.add("veren"); + pattern2.add("verenc"); + pattern2.add("veres"); + pattern2.add("verie"); + pattern2.add("vermin"); + pattern2.add("verse"); + pattern2.add("verth"); + pattern2.add("ves"); + pattern2.add("ves."); + pattern2.add("veste"); + pattern2.add("vete"); + pattern2.add("veter"); + pattern2.add("vety"); + pattern2.add("viali"); + pattern2.add("vian"); + pattern2.add("vide."); + pattern2.add("vided"); + pattern2.add("viden"); + pattern2.add("vides"); + pattern2.add("vidi"); + pattern2.add("vif"); + pattern2.add("vign"); + pattern2.add("vik"); + pattern2.add("vil"); + pattern2.add("vilit"); + pattern2.add("viliz"); + pattern2.add("vin"); + pattern2.add("vina"); + pattern2.add("vinc"); + pattern2.add("vind"); + pattern2.add("ving"); + pattern2.add("viol"); + pattern2.add("vior"); + pattern2.add("viou"); + pattern2.add("vip"); + pattern2.add("viro"); + pattern2.add("visit"); + pattern2.add("viso"); + pattern2.add("visu"); + pattern2.add("viti"); + pattern2.add("vitr"); + pattern2.add("vity"); + pattern2.add("viv"); + pattern2.add("vo."); + pattern2.add("voi"); + pattern2.add("vok"); + pattern2.add("vola"); + pattern2.add("vole"); + pattern2.add("volt"); + pattern2.add("volv"); + pattern2.add("vomi"); + pattern2.add("vorab"); + pattern2.add("vori"); + pattern2.add("vory"); + pattern2.add("vota"); + pattern2.add("votee"); + pattern2.add("vv"); + pattern2.add("vy"); + pattern2.add("wabl"); + pattern2.add("wac"); + pattern2.add("wager"); + pattern2.add("wago"); + pattern2.add("wait"); + pattern2.add("wal."); + pattern2.add("wam"); + pattern2.add("wart"); + pattern2.add("wast"); + pattern2.add("wate"); + pattern2.add("waver"); + pattern2.add("wb"); + pattern2.add("wearie"); + pattern2.add("weath"); + pattern2.add("wedn"); + pattern2.add("weet"); + pattern2.add("weev"); + pattern2.add("well"); + pattern2.add("wer"); + pattern2.add("west"); + pattern2.add("wev"); + pattern2.add("whi"); + pattern2.add("wi"); + pattern2.add("wil"); + pattern2.add("willin"); + pattern2.add("winde"); + pattern2.add("wing"); + pattern2.add("wir"); + pattern2.add("wise"); + pattern2.add("with"); + pattern2.add("wiz"); + pattern2.add("wk"); + pattern2.add("wles"); + pattern2.add("wlin"); + pattern2.add("wno"); + pattern2.add("wo"); + pattern2.add("wom"); + pattern2.add("woven"); + pattern2.add("wp"); + pattern2.add("wra"); + pattern2.add("wri"); + pattern2.add("writa"); + pattern2.add("wsh"); + pattern2.add("wsl"); + pattern2.add("wspe"); + pattern2.add("wst"); + pattern2.add("wt"); + pattern2.add("wy"); + pattern2.add("xa"); + pattern2.add("xace"); + pattern2.add("xago"); + pattern2.add("xam"); + pattern2.add("xap"); + pattern2.add("xas"); + pattern2.add("xc"); + pattern2.add("xe"); + pattern2.add("xecuto"); + pattern2.add("xed"); + pattern2.add("xeri"); + pattern2.add("xero"); + pattern2.add("xh"); + pattern2.add("xhi"); + pattern2.add("xhil"); + pattern2.add("xhu"); + pattern2.add("xi"); + pattern2.add("xia"); + pattern2.add("xic"); + pattern2.add("xidi"); + pattern2.add("xime"); + pattern2.add("ximiz"); + pattern2.add("xo"); + pattern2.add("xob"); + pattern2.add("xp"); + pattern2.add("xpand"); + pattern2.add("xpecto"); + pattern2.add("xped"); + pattern2.add("xt"); + pattern2.add("xti"); + pattern2.add("xu"); + pattern2.add("xua"); + pattern2.add("xx"); + pattern2.add("yac"); + pattern2.add("yar"); + pattern2.add("yat"); + pattern2.add("yb"); + pattern2.add("yc"); + pattern2.add("yce"); + pattern2.add("ycer"); + pattern2.add("ych"); + pattern2.add("yche"); + pattern2.add("ycom"); + pattern2.add("ycot"); + pattern2.add("yd"); + pattern2.add("yee"); + pattern2.add("yer"); + pattern2.add("yerf"); + pattern2.add("yes"); + pattern2.add("yet"); + pattern2.add("ygi"); + pattern2.add("yh"); + pattern2.add("yi"); + pattern2.add("yla"); + pattern2.add("yllabl"); + pattern2.add("ylo"); + pattern2.add("ylu"); + pattern2.add("ymbol"); + pattern2.add("yme"); + pattern2.add("ympa"); + pattern2.add("ynchr"); + pattern2.add("ynd"); + pattern2.add("yng"); + pattern2.add("ynic"); + pattern2.add("ynx"); + pattern2.add("yo"); + pattern2.add("yod"); + pattern2.add("yog"); + pattern2.add("yom"); + pattern2.add("yonet"); + pattern2.add("yons"); + pattern2.add("yos"); + pattern2.add("yped"); + pattern2.add("yper"); + pattern2.add("ypi"); + pattern2.add("ypo"); + pattern2.add("ypoc"); + pattern2.add("ypta"); + pattern2.add("ypu"); + pattern2.add("yram"); + pattern2.add("yria"); + pattern2.add("yro"); + pattern2.add("yrr"); + pattern2.add("ysc"); + pattern2.add("yse"); + pattern2.add("ysica"); + pattern2.add("ysio"); + pattern2.add("ysis"); + pattern2.add("yso"); + pattern2.add("yss"); + pattern2.add("yst"); + pattern2.add("ysta"); + pattern2.add("ysur"); + pattern2.add("ythin"); + pattern2.add("ytic"); + pattern2.add("yw"); + pattern2.add("za"); + pattern2.add("zab"); + pattern2.add("zar"); + pattern2.add("zb"); + pattern2.add("ze"); + pattern2.add("zen"); + pattern2.add("zep"); + pattern2.add("zer"); + pattern2.add("zero"); + pattern2.add("zet"); + pattern2.add("zi"); + pattern2.add("zil"); + pattern2.add("zis"); + pattern2.add("zl"); + pattern2.add("zm"); + pattern2.add("zo"); + pattern2.add("zom"); + pattern2.add("zool"); + pattern2.add("zte"); + pattern2.add("zz"); + pattern2.add("zzy"); + +}} + + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/MainActivity.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/MainActivity.java new file mode 100644 index 0000000000..fd4be28ab0 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/MainActivity.java @@ -0,0 +1,211 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.util.ArrayList; +import java.io.InputStream; +import java.io.IOException; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Typeface; +import android.os.Bundle; +import android.view.View; +import android.util.DisplayMetrics; +import android.util.SparseArray; + +public class MainActivity extends Activity { + + Canvas canvas = new Canvas(); + public static SparseArray<Thread> thread = new SparseArray<Thread>(); + + public static int contentViewTop=0; + public static int contentViewBottom= 0; + public static int height=0; + public static int width=0; + public static int tid=0; + + public int showpage=0; + Boolean firstdraw=true; + ArrayList<Typeface> tf = new ArrayList<Typeface>(); + + Integer containerwidth=0; + Integer containerheight=0; + Boolean parsed=false; + Boolean error=false; + Boolean tablet=true; + String errormessage=""; + InputStream bitmapstream=null; + DocumentBitmap documentbitmap = new DocumentBitmap(); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } + + public void launchRingDialog(View view) { + final ProgressDialog ringProgressDialog = ProgressDialog.show(MainActivity.this, "Please wait ...", "Start Parsing ...", true); + ringProgressDialog.setCancelable(true); + new Thread(new Runnable() { + @Override + public void run() { + try { + Parse parse = new Parse(); + parse.parse(); + } catch (Exception e) { + + } + ringProgressDialog.dismiss(); + finish(); + } + }).start(); + } + public class Parse{ + public void parse(){ + + Source content = new Source(); + content.content(); + Header header = new Header(); + header.header(); + Symbol symbol = new Symbol(); + symbol.symbol(); + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + + int containerheight = metrics.heightPixels; + int containerwidth = metrics.widthPixels; + int iwidth=Math.max(containerwidth, containerheight); + int iheight=Math.min(containerwidth, containerheight); + + if (iwidth < 900){tablet=false;Header.tablet=false;} else {tablet=true;Header.tablet=true;} + if(tablet){ + if (Header.tablet_orientation_landscape){ + containerheight=iheight; + containerwidth=iwidth; + } else { + containerheight=iwidth; + containerwidth=iheight; + } + if (Header.tablet_twocolumns && containerwidth < Header.twocolumns_criteria){Header.tablet_twocolumns=false;} + } else { + if (!Header.phone_orientation_portrait){ + containerheight=iheight; + containerwidth=iwidth; + } else { + containerheight=iwidth; + containerwidth=iheight; + } + if (Header.phone_twocolumns && containerwidth < Header.twocolumns_criteria){Header.phone_twocolumns=false;} + } + SuperBlock superblock = new SuperBlock(); + Block block= new Block(); + ParagraphBlock paragraphblock = new ParagraphBlock(); + + + tf.add(Typeface.SERIF); + tf.add(Typeface.create(Typeface.SERIF,Typeface.ITALIC)); + tf.add(Typeface.DEFAULT_BOLD); + tf.add(Typeface.MONOSPACE); + tf.add(Typeface.createFromAsset(getAssets(),"fonts/asana-math.ttf")); // Math symbols + tf.add(Typeface.SERIF); // For the moment, use serif instead + + documentbitmap.documentbitmap(); + + for (int i=0;i<=DocumentBitmap.bitmapname.size()-1;i++){ + try { + bitmapstream=getAssets().open("bitmap/"+DocumentBitmap.bitmapname.get(i)); + Bitmap bitmap = BitmapFactory.decodeStream(bitmapstream); + float width=(float)bitmap.getWidth(); + DocumentBitmap.bitmapwidth.put(DocumentBitmap.bitmapname.get(i), width); + float height=(float)bitmap.getHeight(); + DocumentBitmap.bitmapheight.put(DocumentBitmap.bitmapname.get(i), height); + bitmap.recycle(); + } catch (IOException e) { + e.printStackTrace(); + } } + + Runnable task = new Parsable(canvas, header, symbol, superblock, block, paragraphblock, containerwidth, containerheight, 0.0f, tf); + Header.threadid.put(Thread.currentThread().getId(), 0); + + Thread thread0 = new Thread(task); + Thread thread1 = new Thread(task); + Thread thread2 = new Thread(task); + Thread thread3 = new Thread(task); + Thread thread4 = new Thread(task); + Thread thread5 = new Thread(task); + Thread thread6 = new Thread(task); + Thread thread7 = new Thread(task); + Thread thread8 = new Thread(task); + Thread thread9 = new Thread(task); + + thread0.setPriority(Thread.MAX_PRIORITY); + thread1.setPriority(Thread.MAX_PRIORITY-1); + thread2.setPriority(Thread.MAX_PRIORITY-2); + thread3.setPriority(Thread.MAX_PRIORITY-3); + thread4.setPriority(Thread.MAX_PRIORITY-4); + thread5.setPriority(Thread.MAX_PRIORITY-5); + thread6.setPriority(Thread.MAX_PRIORITY-6); + thread7.setPriority(Thread.MAX_PRIORITY-7); + thread8.setPriority(Thread.MAX_PRIORITY-8); + thread9.setPriority(Thread.MAX_PRIORITY-9); + + thread.put(0, thread0); + thread.put(1, thread1); + thread.put(2, thread2); + thread.put(3, thread3); + thread.put(4, thread4); + thread.put(5, thread5); + thread.put(6, thread6); + thread.put(7, thread7); + thread.put(8, thread8); + thread.put(9, thread9); + + for(int i=0;i<=Header.nthread-1;i++){ + thread.get(i).start(); + } + try { + + for(int i=0;i<=Header.nthread-1;i++){ + thread.get(i).join(); + } + for(int i=0;i<=Header.nthread-1;i++){ + if (Parsable.error.indexOfKey(i)>=0){error=true;errormessage=Parsable.errormessage.get(i);} + } + if (error){ + if ((!tablet && Header.phone_orientation_portrait) || (tablet && !Header.tablet_orientation_landscape)){ + Intent intent = new Intent(MainActivity.this,Displayportraiterror.class); + startActivityForResult(intent, 0); + finish(); + } else { + Intent intent = new Intent(MainActivity.this,Displaylandscapeerror.class); + startActivityForResult(intent, 0); + finish(); + } + } else { + if ((!tablet && Header.phone_orientation_portrait) || (tablet && !Header.tablet_orientation_landscape)){ + Intent intent = new Intent(MainActivity.this,Displayportrait.class); + startActivityForResult(intent, 0); + finish(); + } else { + Intent intent = new Intent(MainActivity.this,Displaylandscape.class); + startActivityForResult(intent, 0); + finish(); + } + } + }catch (InterruptedException e){ + e.printStackTrace(); + } + return ; + } + +} }
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphBlock.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphBlock.java new file mode 100644 index 0000000000..07ed0bca84 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphBlock.java @@ -0,0 +1,55 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.util.SparseArray; +import android.util.SparseBooleanArray; + +public class ParagraphBlock { + + public static volatile SparseArray<ArrayList<String>> line = new SparseArray<ArrayList<String>>(); + public static volatile SparseArray<ArrayList<Float>> width = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> height = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> depth = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> xpos = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> ypos = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<String>> attribute = new SparseArray<ArrayList<String>>(); + public static volatile SparseArray<ArrayList<Float>> tlinelength = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<Float> linelength = new SparseArray<Float>(); + public static volatile SparseBooleanArray newfirstline = new SparseBooleanArray(); + + public void init(int tid){ + synchronized(this){ + line.put(tid,new ArrayList<String>()); + width.put(tid,new ArrayList<Float>()); + height.put(tid,new ArrayList<Float>()); + depth.put(tid,new ArrayList<Float>()); + xpos.put(tid,new ArrayList<Float>()); + ypos.put(tid,new ArrayList<Float>()); + attribute.put(tid,new ArrayList<String>()); + tlinelength.put(tid,new ArrayList<Float>()); + }} + + public void add(int tid, ArrayList<String> line2, ArrayList<Float> width2, ArrayList<Float> height2, ArrayList<Float> depth2, ArrayList<Float > xpos2 + ,ArrayList<Float> ypos2, ArrayList<String> attribute2, ArrayList<Float> tlinelength2,Float linelength2,Boolean newfirstline2){ + for (int i=0;i<=line2.size()-1;i++){ + line.get(tid).add(line2.get(i)); + width.get(tid).add(width2.get(i)); + height.get(tid).add(height2.get(i)); + depth.get(tid).add(depth2.get(i)); + xpos.get(tid).add(xpos2.get(i)); + ypos.get(tid).add(ypos2.get(i)); + attribute.get(tid).add(attribute2.get(i)); + tlinelength.get(tid).add(tlinelength2.get(i)); + } + linelength.put(tid,linelength2); + newfirstline.put(tid, newfirstline2); + } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphFormatting.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphFormatting.java new file mode 100644 index 0000000000..2c4e73abf9 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphFormatting.java @@ -0,0 +1,153 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Typeface; + +public class ParagraphFormatting { + + + public void paragraphformatting(Canvas canvas, ParagraphBlock paragraphblock, Float pagelength, String paragraph, Integer tid, Float indent, + String thisattribute, Typeface tf){ + + ArrayList<String> line = new ArrayList<String>(); + ArrayList<Float> width = new ArrayList<Float>(); + ArrayList<Float> height = new ArrayList<Float>(); + ArrayList<Float> depth = new ArrayList<Float>(); + ArrayList<Float> xpos = new ArrayList<Float>(); + ArrayList<Float> ypos = new ArrayList<Float>(); + ArrayList<String> attribute = new ArrayList<String>(); + ArrayList<Float> tlinelength = new ArrayList<Float>(); + Float linelength = 0.0f; + Boolean newfirstline = false; + + int i=0; + int ii=0; + int jj=0; + int j=0; + int linenu=0; + int fontsize = Integer.parseInt(thisattribute.substring(1,4)); + + boolean dohyphenation=true; + + float spacelength = 0.0f; + float newlinelength = 0.0f; + float linelength1=0.0f; + + Paint textpaint = new Paint(); + textpaint.setColor(Color.BLACK); + textpaint.setTextSize(fontsize); + textpaint.setTypeface(tf); + synchronized(this){paragraphblock.init(tid);} + + newfirstline=false; + + spacelength=textpaint.measureText(" "); + Hyphenator hyphenate = new Hyphenator(); + + paragraph=paragraph.trim(); + String words[] = paragraph.split(" "); + String word=""; + int sizej = words.length; + j=0; + line.add("");linenu=0;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(indent);ypos.add(0.0f);attribute.add(thisattribute); + linelength=indent; + for (i=0;j<=sizej-1;i++){ + word=words[j].trim(); + word=words[j]; + if (word.equals("")){j++;} else{ + String line2=line.get(linenu)+word; + linelength1=linelength; + linelength=indent+textpaint.measureText(line2); + if (linelength > pagelength){ + + dohyphenation=true; + linelength=linelength1; + if (word.contains("-")){ + dohyphenation=false; + int sw=word.indexOf("-"); + String tword1=word.substring(0,sw+1); + String tword2=word.substring(sw+1); + + line2=line.get(linenu)+tword1; + linelength1=linelength; + linelength=indent+textpaint.measureText(line2); + if (linelength > pagelength){ + if (linenu==0 && i==0){newfirstline=true;}; + linelength=linelength1; + line.add("");linenu++;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(0.0f);ypos.add(0.0f);attribute.add(thisattribute); + indent=0.0f; + line.set(linenu, word+" "); + linelength=indent+textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength); + ypos.set(linenu, ypos.get(linenu-1)+fontsize); + } + else { + line.set(linenu,line.get(linenu)+tword1); + width.set(linenu, linelength-indent); + line.add("");linenu++;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(0.0f);ypos.add(0.0f);attribute .add(thisattribute); + indent=0.0f; + line.set(linenu, tword2+" "); + linelength=textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength); + ypos.set(linenu, ypos.get(linenu-1)+fontsize+Header.linegap); + }; + j++; + } + if(dohyphenation){ + String hyphenatedword = hyphenate.hyphenate(word); + String splitword[] = hyphenatedword.split("-"); + int sizejj=splitword.length; + if (sizejj-1 >=1 && splitword[sizejj-1].length()<=2){splitword[sizejj-2]=splitword[sizejj-2]+splitword[sizejj-1]; sizejj--;}; + newlinelength=0; + jj=0; + for (ii=0;jj<=sizejj-1;ii++){ + line2=line.get(linenu)+splitword[jj]+"-"; + linelength1=indent+textpaint.measureText(line2); + if (linelength1 > pagelength){ + if (linenu==0 && i==0 && ii==0){newfirstline=true;}; + if (jj!=0){ line.set(linenu,line.get(linenu)+"-");} + line.add("");linenu++;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(0.0f);ypos.add(0.0f);attribute.add(thisattribute); + indent=0.0f; + for (int iii=0;jj<=sizejj-1 && iii<1000;iii++){ + line.set(linenu, line.get(linenu)+splitword[jj]); + newlinelength=textpaint.measureText(line.get(linenu)); + jj++;} + line.set(linenu, line.get(linenu)+" "); + ypos.set(linenu, ypos.get(linenu-1)+fontsize); + }else { + line.set(linenu,line.get(linenu)+splitword[jj]); + linelength=indent+textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength-indent); + jj++; + } + } + linelength=newlinelength+spacelength; + width.set(linenu, linelength-indent); + newlinelength=0; + j++; + } + }else{ + line.set(linenu,line.get(linenu)+word+" "); + linelength=indent+textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength-indent); + j++;} + }} + linelength= linelength+spacelength;width.set(linenu, width.get(linenu)+spacelength); + + for (i=0;i<=linenu;i++){ + tlinelength.add(textpaint.measureText(line.get(i))); + } + synchronized(this){paragraphblock.add(tid, line, width, height, depth, xpos,ypos, attribute, tlinelength, linelength, newfirstline);}; + } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphFormatting2.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphFormatting2.java new file mode 100644 index 0000000000..e5fbbc5e6a --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/ParagraphFormatting2.java @@ -0,0 +1,124 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Typeface; + + +public class ParagraphFormatting2 { + + public void paragraphformatting2(Canvas canvas, ParagraphBlock paragraphblock, Float pagelength, String paragraph, Integer tid, Float indent, String thisattribute, Typeface tf){ + + ArrayList<String> line = new ArrayList<String>(); + ArrayList<Float> width = new ArrayList<Float>(); + ArrayList<Float> height = new ArrayList<Float>(); + ArrayList<Float> depth = new ArrayList<Float>(); + ArrayList<Float> xpos = new ArrayList<Float>(); + ArrayList<Float> ypos = new ArrayList<Float>(); + ArrayList<String> attribute = new ArrayList<String>(); + ArrayList<Float> tlinelength = new ArrayList<Float>(); + Float linelength = 0.0f; + Boolean newfirstline = false; + + int i; + int j=0; + + int linenu=0; + int fontsize = Integer.parseInt(thisattribute.substring(1,4)); + + float linelength2 = 0; + Boolean newfirstline2=false;; + float spacelength = 0; + + float linelength1=0; + Paint textpaint = new Paint(); + textpaint.setColor(Color.BLACK); + textpaint.setTextSize(fontsize); + textpaint.setTypeface(tf); + + synchronized(this){paragraphblock.init(tid);} + spacelength=textpaint.measureText(" "); + + paragraph=paragraph.trim(); + String words[] = paragraph.split(" "); + String word=""; + newfirstline2=false; + int sizej = words.length; + j=0; + line.add("");linenu=0;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(indent);ypos.add(0.0f);attribute.add(thisattribute); + linelength2=indent; + for (i=0;j<=sizej-1;i++){ + word=words[j].trim(); + word=words[j]; + if (word.equals("")){j++;} else{ + String line2=line.get(linenu)+word; + + linelength1=linelength2; + linelength2=indent+textpaint.measureText(line2); + if (linelength2 > pagelength){ + if (linenu==0){newfirstline2=true;}; + linelength2=linelength1; + if (word.contains("-")){ + int sw=word.indexOf("-"); + String tword1=word.substring(0,sw+1); + String tword2=word.substring(sw+1); + + line2=line.get(linenu)+tword1; + linelength1=linelength2; + linelength2=indent+textpaint.measureText(line2); + if (linelength2 > pagelength){ + linelength2=linelength1; + line.add("");linenu++;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(0.0f);ypos.add(0.0f);attribute.add(thisattribute); + indent=0.0f; + line.set(linenu, word+" "); + linelength2=indent+textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength2); + ypos.set(linenu, ypos.get(linenu-1)+fontsize); + } + else { + line.set(linenu,line.get(linenu)+tword1); + width.set(linenu, linelength2-indent); + line.add("");linenu++;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(0.0f);ypos.add(0.0f);attribute.add(thisattribute); + indent=0.0f; + line.set(linenu, tword2+" "); + linelength2=textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength2); + ypos.set(linenu, ypos.get(linenu-1)+fontsize+Header.linegap); + }; + j++; + } else { + linelength2=linelength1; + line.add("");linenu++;width.add(0.0f);height.add((float)fontsize);depth.add(0.0f);xpos.add(0.0f);ypos.add(0.0f);attribute.add(thisattribute); + indent=0.0f; + line.set(linenu, word+" "); + linelength2=indent+textpaint.measureText(line.get(linenu)); + width.set(linenu, linelength2); + ypos.set(linenu, ypos.get(linenu-1)+fontsize); + j++; + } + }else{ + line.set(linenu,line.get(linenu)+word+" "); + linelength2=indent+textpaint.measureText(line.get(linenu)); + if (linenu==0 ){width.set(linenu, linelength2-indent);} else {width.set(linenu, linelength2);}; + j++;} + }} + linelength2=linelength2+spacelength;width.set(linenu, width.get(linenu)+spacelength); + + for (i=0;i<=linenu;i++){ + tlinelength.add(textpaint.measureText(line.get(i))); + } + linelength=linelength2; + newfirstline=newfirstline2; + synchronized(this){paragraphblock.add(tid, line, width, height, depth, xpos,ypos, attribute, tlinelength, linelength, newfirstline);}; + } +} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsable.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsable.java new file mode 100644 index 0000000000..139f80afb9 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsable.java @@ -0,0 +1,110 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseBooleanArray; + +import java.lang.Runnable; + + public class Parsable implements Runnable { + + Canvas canvas; + Header header; + Symbol symbol; + SuperBlock superblock; + Block block; + ParagraphBlock paragraphblock; + String lineblock; + Integer containerwidth; + Integer containerheight; + Boolean twocolumns=false; + float ypos; + ArrayList<Typeface> tf; + + public static SparseBooleanArray error = new SparseBooleanArray(); + public static SparseArray<String> errormessage = new SparseArray<String>(); + + Source content = new Source(); + Parsedocument document = new Parsedocument(); + + public Parsable(Canvas canvas2, Header header2, Symbol symbol2, SuperBlock superblock2, Block block2, ParagraphBlock paragraphblock2, Integer containerwidth2, Integer containerheight2, Float ypos2, ArrayList<Typeface> tf2){ + + if ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)){ + containerwidth=containerwidth2/2+Header.rightsidemargin/2; + containerheight=containerheight2; + twocolumns=true; + }else { + containerwidth=containerwidth2; + containerheight=containerheight2; + twocolumns=false; + } + ypos=ypos2; + tf=tf2; + canvas=canvas2; + header=header2; + symbol=symbol2; + superblock=superblock2; + block=block2; + paragraphblock=paragraphblock2; + } + @Override + public void run(){ + + int startline=-1; + int endline=-1; + int share=0; + int totalline=-1; + int tid; + int nthread=Header.nthread; + + totalline=Source.lineblock.size()-1; + + synchronized(this){ + tid = Thread.currentThread().getPriority(); + Header.threadid.put(Thread.currentThread().getId(),Thread.MAX_PRIORITY-tid); + Thread.currentThread().setPriority(5); + tid=Header.threadid.get(Thread.currentThread().getId());} + + synchronized(this){ + superblock.init(tid); + block.initerror(tid); + } + + if (totalline>=nthread-1){ + share=(totalline+1)/nthread; + startline=share*(tid); + int mod=(totalline+1)%nthread; + for (int i=0;i<=mod-1;i++){ + if (tid==i){startline=startline+i;endline=startline+share;} + } + for (int i=mod;i<=nthread-1;i++){ + if (tid==i){startline=startline+mod;endline=startline+share-1;} + } + } else { + if (tid==0){Header.nthread=totalline+1;} + for (int i=0;i<=totalline;i++){ + if (tid==i){startline=i;endline=i;} + } + for (int i=totalline+1;i<=nthread-1;i++){ + if (tid==i){startline=-1;endline=-1;} + } + } + + if (startline!=-1){ + document.parsedocument(canvas,header,symbol,superblock,block,paragraphblock,tid,startline,endline,containerwidth,containerheight,twocolumns,ypos,tf); + if (Parsedocument.error.get(tid)){error.put(tid, true);errormessage.put(tid,Parsedocument.errormessage.get(tid));}} + return; + } + + } + +
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseblock.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseblock.java new file mode 100644 index 0000000000..19bd8d08df --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseblock.java @@ -0,0 +1,2554 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 27th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseIntArray; + +public class Parseblock { + + private ArrayList<Integer> blockfractionlevel = new ArrayList<Integer>(); + private ArrayList<Integer> blocklevel = new ArrayList<Integer>(); + private ArrayList<Integer> blockenclosurelevel = new ArrayList<Integer>(); + private ArrayList<Integer> blocksuperscriptlevel = new ArrayList<Integer>(); + private ArrayList<Integer> blocksubscriptlevel = new ArrayList<Integer>(); + private ArrayList<Integer> blocktabularlevel = new ArrayList<Integer>(); + private ArrayList<Float> blockwidth = new ArrayList<Float>(); + private ArrayList<Float> blockheight = new ArrayList<Float>(); + private ArrayList<Float> blockdepth = new ArrayList<Float>(); + + private ArrayList<ArrayList<String>> subblock = new ArrayList<ArrayList<String>>(); + private ArrayList<ArrayList<Float>> subblockwidth = new ArrayList<ArrayList<Float>>(); + private ArrayList<ArrayList<Float>> subblockheight = new ArrayList<ArrayList<Float>>(); + private ArrayList<ArrayList<Float>> subblockdepth = new ArrayList<ArrayList<Float>>(); + private ArrayList<ArrayList<Float>> subblockxpos = new ArrayList<ArrayList<Float>>(); + private ArrayList<ArrayList<Float>> subblockypos = new ArrayList<ArrayList<Float>>(); + private ArrayList<ArrayList<String>> subblockattribute = new ArrayList<ArrayList<String>>(); + + public void parseblock(int tid, Canvas canvas, Block block, String molecule, ArrayList<Typeface> tf , String defaultattribute){ + + SparseIntArray subblocknumber = new SparseIntArray(); + subblocknumber.put(tid, -1); + + char charExclam = '!'; + + String stringfra = "fra"; + String stringcnb = "cnb"; + String stringodb = "odb"; + String stringcdb = "cdb"; + String stringosp = "osp"; + String stringcsp = "csp"; + String stringosu = "osu"; + String stringcsu = "csu"; + String stringobx = "obx"; + String stringcbx = "cbx"; + String stringbta = "bta"; + String stringeta = "eta"; + String stringbln = "bln"; + String stringeln = "eln"; + String stringolb = "olb"; + String stringclb = "clb"; + String stringhline = "!hlin "; + String stringdnot = "!dno "; + String key=""; + String key2=""; + String parentkey=""; + String sfontsize=""; + String thisattribute; + String attribute2; + String columnspec=""; + + boolean showcloseenclosure = true; + boolean containfraction = false; + boolean containenclosure = false; + + int i,j = 0; + int ii=0; + int iii=0; + int i3=0; + int j3=0; + int index=0; + int index2=0; + int blocknumber = 0; + int currentblock=0; + int previousblock=0; + int parentblock = 0; + int fontsize = Integer.parseInt(defaultattribute.substring(1,4)); + int thisfontsize = fontsize; + int fontinteger = Integer.parseInt(defaultattribute.substring(4,7)); + + int thisblocklevel = 0; + int thisfractionlevel = 0; + int thisenclosurelevel = -1; + int thissuperscriptlevel = -1; + int thissubscriptlevel = -1; + int thistabularlevel = -1; + int fractionnumber = -1; + int currentfraction = -1; + int previousfraction = -1; + int numeratornumber = -1; + int currentnumerator = -1; + int denominatornumber = -1; + int currentdenominator = -1; + int previousdenominator = -1; + int enclosurenumber = -1; + int currentenclosure = -1; + int previousenclosure = -1; + int tabularnumber = -1; + int currenttabular = -1; + int previoustabular = -1; + int tabularlinenumber = -1; + int currenttabularline = -1; + int previoustabularline = -1; + int tabularlineblocknumber = -1; + int currenttabularlineblock = -1; + int superscriptnumber = -1; + int currentsuperscript = -1; + int subscriptnumber = -1; + int currentsubscript = -1; + int previoussubscript = -1; + int previoussuperscript = -1; + int numcolumn=0; + int column = 0; + + float ypos = 0.0f; + float xpos = 0.0f; + float halfheight=0.0f; + float maxtop=0.0f; + float gap=Header.characterheadroom; + float columngap=Header.columngap; + float strokewidth=0.0f; + float width1 = 0.0f; + float width2 = 0.0f; + float width3 = 0.0f; + float maxwidth = 0.0f; + float maxwidth1=0.0f; + float maxcolumnwidth=0.0f; + float totalcolumnwidth=0.0f; + float tempx=0.0f; + float tempy=0.0f; + float twidth=0.0f; + float twidth2=0.0f; + float case6xmargin=0.0f; + float case7xmargin=0.0f; + float theight=0.0f; + float tdepth=0.0f; + float totaltabularheight=0.0f; + float totaltabulardepth=0.0f; + float spacewidth=0.0f; + float spaceheight=0.0f; + float spacedepth=0.0f; + + ArrayList<Boolean> showopenenclosure = new ArrayList<Boolean>(); + ArrayList<Boolean> aftersuperscript = new ArrayList<Boolean>(); + ArrayList<Boolean> aftersubscript = new ArrayList<Boolean>(); + + ArrayList<Float> numeratorwidth = new ArrayList<Float>(); + ArrayList<Float> numeratorheight = new ArrayList<Float>(); + ArrayList<Float> numeratordepth = new ArrayList<Float>(); + ArrayList<Float> denominatorwidth = new ArrayList<Float>(); + ArrayList<Float> denominatorheight = new ArrayList<Float>(); + ArrayList<Float> denominatordepth = new ArrayList<Float>(); + ArrayList<Float> fractionwidth = new ArrayList<Float>(); + ArrayList<Float> fractionheight = new ArrayList<Float>(); + ArrayList<Float> fractiondepth = new ArrayList<Float>(); + ArrayList<Float> columnwidth = new ArrayList<Float>(); + + ArrayList<Integer> openblock = new ArrayList<Integer>(); + ArrayList<Integer> closeblock = new ArrayList<Integer>(); + ArrayList<Integer> subparentblock = new ArrayList<Integer>(); + ArrayList<Integer> supparentblock = new ArrayList<Integer>(); + ArrayList<Integer> linenu = new ArrayList<Integer>(); + ArrayList<Integer> openfraction = new ArrayList<Integer>(); + ArrayList<Integer> closefraction = new ArrayList<Integer>(); + ArrayList<Integer> opennumerator = new ArrayList<Integer>(); + ArrayList<Integer> closenumerator = new ArrayList<Integer>(); + ArrayList<Integer> opendenominator = new ArrayList<Integer>(); + ArrayList<Integer> closedenominator = new ArrayList<Integer>(); + ArrayList<Integer> homeblock = new ArrayList<Integer>(); + ArrayList<Integer> numeratorindex = new ArrayList<Integer>(); + ArrayList<Integer> denominatorindex = new ArrayList<Integer>(); + ArrayList<Integer> opensubscript = new ArrayList<Integer>(); + ArrayList<Integer> closesubscript = new ArrayList<Integer>(); + ArrayList<Integer> opensuperscript = new ArrayList<Integer>(); + ArrayList<Integer> closesuperscript = new ArrayList<Integer>(); + ArrayList<Integer> openenclosure = new ArrayList<Integer>(); + ArrayList<Integer> closeenclosure = new ArrayList<Integer>(); + ArrayList<Integer> opentabular = new ArrayList<Integer>(); + ArrayList<Integer> closetabular = new ArrayList<Integer>(); + ArrayList<Integer> opentabularline = new ArrayList<Integer>(); + ArrayList<Integer> closetabularline = new ArrayList<Integer>(); + ArrayList<Integer> opentabularlineblock = new ArrayList<Integer>(); + ArrayList<Integer> closetabularlineblock = new ArrayList<Integer>(); + + ArrayList<String> supparentkey = new ArrayList<String>(); + ArrayList<String> subparentkey = new ArrayList<String>(); + + double[] fractionfontfactor = {1.0,0.75,0.5}; + + + Fontfile font = new Fontfile(); + font.fontfile(); + + Colorfile color = new Colorfile(); + color.colorfile(); + + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(fontinteger)); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + spacewidth=textpaint.measureText(" "); + spaceheight=textbounds.height(); + spacedepth=textbounds.bottom; + + Paint textpaint5 = new Paint(); + Rect textbounds5 = new Rect(); + textpaint5.setTextSize(thisfontsize); + textpaint5.setTypeface(tf.get(5)); + + Paint symbolpaint = new Paint(); + Rect symbolbounds = new Rect(); + symbolpaint.setTextSize(thisfontsize); + symbolpaint.setTypeface(tf.get(4)); + + + thisattribute=defaultattribute; + attribute2=defaultattribute; + sfontsize=Integer.toString(thisfontsize); + int ij=sfontsize.length(); + if (ij==1){ + thisattribute=thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4); + } else if (ij==2){ + thisattribute=thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4); + } else if (ij==3){ + thisattribute=thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4); + } + + molecule=molecule.trim(); + molecule = molecule + charExclam + charExclam + charExclam + charExclam + charExclam; + + j=0; + + char temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + + create(tid,blocknumber, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1);add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,0.0f,0.0f,thisattribute); + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + + for (i=0;!((molecule.charAt(j) == charExclam) && (molecule.charAt(j+1)==charExclam)) ; i++) { + + if (temp == charExclam && key.equals("openblock")) { + previousblock=currentblock; + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + + j+=11; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (temp == charExclam && key.equals("closeblock")) { + closeblock.set(currentblock, subblocknumber.get(tid)); + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + insert(tid,previousblock, currentblock,blockwidth.get(previousblock), blockheight.get(previousblock),blockdepth.get(previousblock) ); + + thisblocklevel--; + j+=12; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (temp == charExclam && key.equals(stringfra)) { // open fraction, open numerator + + thisfractionlevel++; + fractionnumber++; + currentfraction=fractionnumber; + + previousblock=currentblock; + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + + create(tid, currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + + openfraction.add(subblocknumber.get(tid)); closefraction.add(-1); + if (thissubscriptlevel ==-1 && thissuperscriptlevel ==-1){ + if (thisfractionlevel<=2){ + thisfontsize=(int)((double)fontsize*fractionfontfactor[thisfractionlevel]); + }else { + thisfontsize=(int)((double)fontsize*fractionfontfactor[2]); + }; + if (thisfontsize<8){thisfontsize=8;}; + }; + numeratornumber++; + currentnumerator=numeratornumber; + + previousblock=currentblock; + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + + create(tid,currentblock, thisblocklevel, thisfractionlevel,thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + + numeratorindex.add(currentblock); numeratorwidth.add(0.0f); numeratorheight.add(0.0f);numeratordepth.add(0.0f); + denominatorindex.add(-1); denominatorwidth.add(0.0f); denominatorheight.add(0.0f);denominatordepth.add(0.0f); + fractionwidth.add(0.0f); fractionheight.add(0.0f); fractiondepth.add(0.0f); + opennumerator.add(subblocknumber.get(tid)); closenumerator.add(-1); + opendenominator.add(-1); closedenominator.add(-1); + linenu.add(currentblock); + + j+=9; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (temp == charExclam && key.equals(stringcnb) ) { // close numerator + + numeratorwidth.set(currentnumerator,blockwidth.get(currentblock)); + numeratorheight.set(currentnumerator,blockheight.get(currentblock)); + numeratordepth.set(currentnumerator,blockdepth.get(currentblock)); + closenumerator.set(currentnumerator, subblocknumber.get(tid)); + closeblock.set(currentblock, subblocknumber.get(tid)); + + containfraction = false; + containenclosure=false; + for (i=currentblock+1;i<=blocknumber && !containfraction && !containenclosure;i++){ + if (blockenclosurelevel.get(i)==thisenclosurelevel && + blocksuperscriptlevel.get(i)==thissuperscriptlevel && + blocksubscriptlevel.get(i)==thissubscriptlevel && + blockfractionlevel.get(i)==thisfractionlevel+1 && + openblock.get(i)> openblock.get(currentblock) && closeblock.get(i) <= closeblock.get(currentblock)){ + containfraction=true; + } + else if (blockenclosurelevel.get(i)==thisenclosurelevel+1 && blocklevel.get(i)==thisblocklevel+1 && openblock.get(i)>openblock.get(currentblock) && closeblock.get(i)<=closeblock.get(currentblock)){ + containenclosure=true; + } + } + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(0)); + textpaint.getTextBounds("1",0,"1".length(),textbounds); + Float off=(float) textbounds.height()/2; + + if (containfraction){ + adjustfraction(tid,currentblock, blocknumber, homeblock,openblock,closeblock,thisfractionlevel, thisblocklevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, off, gap); + } + + strokewidth=(float)thisfontsize/10; if (strokewidth < 1){strokewidth=1;}; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringhline,0.0f,strokewidth,strokewidth,subblockxpos.get(currentblock).get(0),ypos+gap+blockdepth.get(currentblock),thisattribute); + + closenumerator.set(currentnumerator, subblocknumber.get(tid)); + closeblock.set(currentblock, subblocknumber.get(tid));homeblock.add(currentblock); + thisblocklevel--; + + for (i=subblocknumber.get(tid);currentnumerator >=0 && closenumerator.get(currentnumerator)>=0;i--){ + currentnumerator--; + } + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + parentkey=""; + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (temp == charExclam && key.equals(stringcdb)) { // close denominator + +//denominator block + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + closedenominator.set(currentdenominator, subblocknumber.get(tid)); + closeblock.set(currentblock, subblocknumber.get(tid)); + + denominatorwidth.set(currentdenominator,blockwidth.get(currentblock)); + denominatorheight.set(currentdenominator,blockheight.get(currentblock)); + denominatordepth.set(currentdenominator,blockdepth.get(currentblock)); + + fractionwidth.set(currentfraction, Math.max(numeratorwidth.get(currentfraction),denominatorwidth.get(currentdenominator))); + fractionheight.set(currentfraction, numeratorheight.get(currentfraction) + denominatorheight.get(currentdenominator) + gap*2); + fractiondepth.set(currentfraction, denominatorheight.get(currentdenominator) + gap); + + index=numeratorindex.get(currentfraction); + int l=subblockwidth.get(index).size(); + subblockwidth.get(index).set(l-1,fractionwidth.get(currentfraction)); + tempy=fractionwidth.get(currentfraction); + sfontsize=Integer.toString((int)tempy); + ij=sfontsize.length(); + index=numeratorindex.get(currentfraction); + + if (ij==1){ + subblockattribute.get(index).set(l-1,thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (ij==2){ + subblockattribute.get(index).set(l-1,thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (ij==3){ + subblockattribute.get(index).set(l-1,thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + + containfraction = false; + containenclosure=false; + for (i=currentblock+1;i<=blocknumber && !containfraction && !containenclosure;i++){ + if (blockenclosurelevel.get(i)==thisenclosurelevel && + blocksuperscriptlevel.get(i)==thissuperscriptlevel && + blocksubscriptlevel.get(i)==thissubscriptlevel && + blockfractionlevel.get(i)==thisfractionlevel+1 && + openblock.get(i)> openblock.get(currentblock) && closeblock.get(i) <= closeblock.get(currentblock)){ + containfraction=true; + } + else if (blockenclosurelevel.get(i)==thisenclosurelevel+1 && blocklevel.get(i)==thisblocklevel+1 && openblock.get(i)>openblock.get(currentblock) && closeblock.get(i)<=closeblock.get(currentblock)){ + containenclosure=true; + } + } + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(0)); + textpaint.getTextBounds("1",0,"1".length(),textbounds); + Float off=(float) textbounds.height()/2; + + if (containfraction){adjustfraction(tid,currentblock, blocknumber, homeblock,openblock,closeblock,thisfractionlevel, thisblocklevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, off, gap);} + thisblocklevel--; + + // adjust horizontal position of numerator and denominator + + if (numeratorwidth.get(currentfraction) > denominatorwidth.get(currentdenominator)){ + tempx = (numeratorwidth.get(currentfraction) - denominatorwidth.get(currentdenominator))/2; + index=currentblock; + for (i=0;i<=subblock.get(index).size()-1;i++){subblockxpos.get(index).set(i, subblockxpos.get(index).get(i) + tempx);}; + } else if (numeratorwidth.get(currentfraction) < denominatorwidth.get(currentdenominator)){ + tempx = (denominatorwidth.get(currentdenominator) - numeratorwidth.get(currentfraction))/2; + index=numeratorindex.get(currentfraction); + blockwidth.set(numeratorindex.get(currentfraction),numeratorwidth.get(currentfraction)); + for (i=0;i<=subblock.get(index).size()-2;i++){subblockxpos.get(index).set(i, subblockxpos.get(index).get(i) + tempx);}; + } + + // adjust vertical position of denominator + + index=numeratorindex.get(currentfraction); + index2=currentblock; + tempy=subblockypos.get(index).get(subblock.get(index).size()-1)-subblockypos.get(index).get(0); + for (ii=0;ii<=subblock.get(index2).size()-1;ii++){ + subblockypos.get(index2).set(ii,subblockypos.get(index2).get(ii)+tempy+gap+blockheight.get(currentblock)-blockdepth.get(currentblock)); + } + index=0; + + previousdenominator=currentdenominator; + halfheight=(float) 0; + for (i=subblocknumber.get(tid);currentdenominator >=0 && closedenominator.get(currentdenominator)>=0;i--){ + currentdenominator--; + } + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + if (thisfractionlevel == 1){ + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(0)); + textpaint.getTextBounds("a",0,"a".length(),textbounds); + halfheight=textbounds.height()*5/8; + + index=numeratorindex.get(currentfraction); + tempy=subblockypos.get(index).get(subblock.get(index).size()-1)-subblockypos.get(index).get(0); + for (i=1;i<=subblock.get(index).size()-1;i++){ + subblockypos.get(index).set(i, subblockypos.get(index).get(i)-tempy-halfheight); + } + ypos=subblockypos.get(index).get(0); + xpos=subblockxpos.get(index).get(subblock.get(index).size()-1)+fractionwidth.get(currentfraction); + index=previousblock; + for (i=1;i<=subblock.get(index).size()-2;i++){ + subblockypos.get(index).set(i, subblockypos.get(index).get(i)-tempy-halfheight); + } + fractiondepth.set(currentfraction,fractiondepth.get(currentfraction)-halfheight); + } + else if (thisfractionlevel >= 2){ + // adjust position after fraction + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(0)); + textpaint.getTextBounds("a",0,"a".length(),textbounds); + halfheight=textbounds.height()*5/8; + + index=numeratorindex.get(currentfraction); + iii=subblock.get(index).size()-1; + tempy=subblockypos.get(index).get(0); + blockdepth.set(currentblock,blockdepth.get(currentblock)-tempy+ypos); + ypos=tempy; + xpos=subblockxpos.get(index).get(iii)+subblockwidth.get(index).get(iii); + } + + index = numeratorindex.get(currentfraction); + insert(tid,index, currentblock,0.0f,0.0f,0.0f); + insert(tid,previousblock, currentblock,0.0f,0.0f,0.0f); + blockwidth.set(index, numeratorwidth.get(currentfraction)); + maxtop=Math.max(blockheight.get(currentblock)-blockdepth.get(currentblock), blockheight.get(index)-blockdepth.get(index)); + blockdepth.set(currentblock, Math.max(blockdepth.get(currentblock),blockdepth.get(index))); + blockheight.set(currentblock, maxtop+blockdepth.get(currentblock)); + blockwidth.set(previousblock, denominatorwidth.get(currentfraction)); + maxtop=Math.max(blockheight.get(currentblock)-blockdepth.get(currentblock), blockheight.get(previousblock)-blockdepth.get(previousblock)); + blockdepth.set(currentblock, Math.max(blockdepth.get(currentblock),blockdepth.get(previousblock))); + blockheight.set(currentblock, maxtop+blockdepth.get(currentblock)); + +//fraction block + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + closefraction.set(currentfraction, subblocknumber.get(tid)); + closeblock.set(currentblock, subblocknumber.get(tid)); + thisblocklevel--; + thisfractionlevel--; + + if (thissubscriptlevel >= 0 || thissuperscriptlevel >= 0){ + thisfontsize=fontsize/3; + }else if (thisfractionlevel<=2){ + thisfontsize=(int)((double)fontsize*fractionfontfactor[thisfractionlevel]); + }else { + thisfontsize=(int)((double)fontsize*fractionfontfactor[2]); + }; + if (thisfontsize<8){thisfontsize=8;}; + + previousfraction=currentfraction; + for (i=subblocknumber.get(tid);currentfraction >=0 && closefraction.get(currentfraction)>=0;i--){ + currentfraction--; + } + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + blockwidth.set(previousblock, fractionwidth.get(previousfraction)); + blockheight.set(previousblock, fractionheight.get(previousfraction)); + if (thisfractionlevel==0) {blockdepth.set(previousblock,denominatorheight.get(previousdenominator)+gap-halfheight);} + else {blockdepth.set(previousblock, numeratordepth.get(previousfraction)+denominatorheight.get(previousdenominator)+gap*2);}; + + twidth=fractionwidth.get(previousfraction); + theight=fractionheight.get(previousfraction); + tdepth=blockdepth.get(previousblock); + insert(tid,previousblock, currentblock,twidth, theight, tdepth); + + parentkey=""; + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (temp == charExclam && key.equals(stringodb)) { // open denominator + + denominatornumber++; + currentdenominator=denominatornumber; + + previousblock=currentblock; + blocknumber++; + currentblock=blocknumber; + thisblocklevel++; + + index = numeratorindex.get(currentfraction); + ypos=subblockypos.get(index).get(0); + xpos=subblockxpos.get(index).get(subblock.get(index).size()-1); + + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + + denominatorindex.set(currentdenominator,currentblock); + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + + opendenominator.set(currentdenominator, subblocknumber.get(tid)); + + } else if (temp == charExclam && key.equals(stringbta)) { // begin tabular + + thistabularlevel=0; + tabularnumber=0; + currenttabular=tabularnumber; + opentabularline.clear();closetabularline.clear();opentabular.clear();closetabular.clear();opentabularlineblock.clear();closetabularlineblock.clear(); + + if (thisfractionlevel>0){ + synchronized(this){ + Block.error.put(tid, true); + Block.errormessage.put(tid, "Fraction cannot have tabular, parse failed!");} + return; + } + if (thistabularlevel>0){ + synchronized(this){ + Block.error.put(tid, true); + Block.errormessage.put(tid, "Tabular cannot have tabular, parse failed!");} + return; + } + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + opentabular.add(subblocknumber.get(tid)); closetabular.add(-1); + + tabularlinenumber=-1; + j+=5; + int i4=molecule.indexOf("{",j); + numcolumn=0; + for (i=j;i<=i4-2;i++){ + if (molecule.charAt(i)=='l' || molecule.charAt(i)=='c' || molecule.charAt(i)=='r'){ + numcolumn++; + } + } + columnspec=molecule.substring(j,i4-1); + totalcolumnwidth=0; + columnwidth.clear(); + opentabularlineblock.clear(); + + j=i4+1; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + + }else if (temp == charExclam && key.equals(stringeta)) { // end tabular + + thistabularlevel--; + closetabular.set(currenttabular, subblocknumber.get(tid));closeblock.set(currentblock, subblocknumber.get(tid)); + + blockwidth.set(currentblock, totalcolumnwidth); + twidth=0;totalcolumnwidth=0; + + for (i=0;i<=numcolumn-1;i++){ + totalcolumnwidth=totalcolumnwidth+columnwidth.get(i)+columngap; + } + totalcolumnwidth=totalcolumnwidth-columngap; + index2=currentblock; + blockwidth.set(currentblock, totalcolumnwidth); + xpos=subblockxpos.get(index2).get(0)+blockwidth.get(currentblock); + for (iii=0;iii<=currenttabularline;iii++){ + twidth=0; + for (i=0;i<=numcolumn-1;i++){ + for (ii=1;ii<=subblock.get(homeblock.get(opentabularlineblock.get(iii*numcolumn+i))).size()-1;ii++){ + index= opentabularlineblock.get(iii*numcolumn+i)-openblock.get(currentblock)+ii; + + if (columnspec.charAt(i)=='l'){subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(index)+twidth);} + else if (columnspec.charAt(i)=='c'){twidth2=(columnwidth.get(i)-blockwidth.get(homeblock.get(opentabularlineblock.get(iii*numcolumn+i))))/2; subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(index)+twidth+twidth2);} + else if (columnspec.charAt(i)=='r'){twidth2=columnwidth.get(i)-blockwidth.get(homeblock.get(opentabularlineblock.get(iii*numcolumn+i))); subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(index)+twidth+twidth2);}; + } + twidth=twidth+columnwidth.get(i)+columngap; + }} + + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + previoustabular=currenttabular; + for (i=subblocknumber.get(tid);currenttabular >=0 && closeblock.get(currenttabular)>=0;i--){ + currenttabular--; + } + + if (tabularlinenumber>0) { + textpaint.setTextSize(thisfontsize); + textpaint.getTextBounds("a",0,"a".length(),textbounds); + tempy=blockdepth.get(previousblock)-blockheight.get(previousblock)/2+textbounds.height()/2; + for (i=opentabularlineblock.get(0)-opentabular.get(previoustabular);i<=closetabularlineblock.get(currenttabularlineblock)-opentabular.get(previoustabular);i++){ + subblockypos.get(previousblock).set(i, subblockypos.get(previousblock).get(i)-tempy); + } + blockdepth.set(previousblock,blockdepth.get(previousblock)-tempy);} + insert(tid,previousblock, currentblock, blockwidth.get(previousblock), blockheight.get(previousblock),blockdepth.get(previousblock)); + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals(stringbln)) { // begin tabular line + tabularlinenumber++; + previoustabularline=currenttabularline; + currenttabularline=tabularlinenumber; + + blocknumber++; + previousblock=currentblock; + currentblock= blocknumber; + thisblocklevel++; + + if (currenttabularline >=1){xpos=subblockxpos.get(homeblock.get(opentabularline.get(previoustabularline))).get(0);}; + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + opentabularline.add(subblocknumber.get(tid)); closetabularline.add(-1); + + tabularlineblocknumber=-1; + + column=-1; + maxcolumnwidth=0; + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals(stringeln)) { // end tabular line + + closetabularline.set(currenttabularline, subblocknumber.get(tid));closeblock.set(currentblock, subblocknumber.get(tid)); + + float gap2=gap*thisfontsize/fontsize; + index2=currentblock; + if (currenttabularline > 0){ + tempy=totaltabulardepth+blockheight.get(currentblock)-blockdepth.get(currentblock)+gap2; + for (i=1;i<=subblock.get(currentblock).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+tempy); + } + } + + + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + if (currenttabularline >=1) { + totaltabularheight=totaltabularheight+blockheight.get(previousblock)+gap2; + totaltabulardepth=totaltabulardepth+blockheight.get(previousblock)+gap2; + insert(tid,previousblock, currentblock, 0.0f, totaltabularheight, totaltabulardepth); + } else { + insert(tid,previousblock, currentblock, blockwidth.get(previousblock),blockheight.get(previousblock) , blockdepth.get(previousblock)); + totaltabularheight=blockheight.get(previousblock); + totaltabulardepth=blockdepth.get(previousblock); + } + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals(stringolb)) { // begin tabular line block + + tabularlineblocknumber++; + currenttabularlineblock=tabularlineblocknumber; + column++;columnwidth.add(0.0f); + blocknumber++; + previousblock=currentblock; + currentblock= blocknumber; + thisblocklevel++; + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(fontinteger)); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + spacewidth=textpaint.measureText(" "); + spaceheight=textbounds.height(); + spacedepth=textbounds.bottom; + + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,spacewidth,spaceheight,spacedepth,xpos,ypos,thisattribute); + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + opentabularlineblock.add(subblocknumber.get(tid)); closetabularlineblock.add(-1); + xpos=subblockxpos.get(homeblock.get(opentabularline.get(0))).get(0); + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals(stringclb)) { // end tabular line block + + closetabularlineblock.set(currenttabularlineblock, subblocknumber.get(tid));closeblock.set(currentblock, subblocknumber.get(tid)); + + maxcolumnwidth = Math.max(columnwidth.get(column),blockwidth.get(currentblock)); + columnwidth.set(column, maxcolumnwidth); + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + insert(tid,previousblock, currentblock, blockwidth.get(previousblock),blockheight.get(previousblock) , blockdepth.get(previousblock)); + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals("blank")) { + + sfontsize=Integer.toString(thisfontsize); + ij=sfontsize.length(); + if (ij==1){ + thisattribute=thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4); + } else if (ij==2){ + thisattribute=thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4); + } else if (ij==3){ + thisattribute=thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4); + } + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(fontinteger)); + + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock," ",(float)textpaint.measureText(" "),0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + xpos=xpos+textbounds.width(); + + j+=7; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + + }else if (temp == charExclam && key.equals("dno")) { // do nothing + + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals(stringobx)) { // open mbox + + thisattribute=thisattribute.substring(0,4)+"000"+thisattribute.substring(7); + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + }else if (temp == charExclam && key.equals(stringcbx)) { // close mbox + + thisattribute=thisattribute.substring(0,4)+defaultattribute.substring(4,7)+thisattribute.substring(7); + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (temp == charExclam && key.charAt(0) == 'A') { //Begin attribute + + if (key.charAt(1) == 'o'){ + String attribute; + int jj=key.indexOf("("); + if (jj >2){ + attribute = key.substring(2,jj); + } else { + attribute = key.substring(2); + } + if (attribute.equals("underlinetext")){ + thisattribute="0"+thisattribute.substring(1,18)+"1"+thisattribute.substring(19); + } else if (attribute.equals("strikethru")){ + thisattribute="0"+thisattribute.substring(1,19)+'1'+thisattribute.substring(20); + } else if (attribute.equals("skew")){ + if (molecule.charAt(j+attribute.length()+3)=='(' ){ + jj = molecule.indexOf(')',j+attribute.length()+3); + thisattribute="0"+thisattribute.substring(1,20)+molecule.substring(j+attribute.length()+4,jj)+thisattribute.substring(25);; + j=jj-key.length(); + } else { + thisattribute="0"+thisattribute.substring(1,20)+"-0.25"+thisattribute.substring(25); + }; + }else if (attribute.equals("alpha")){ // alpha does not work + synchronized(this){ + Block.error.put(tid, true); + Block.errormessage.put(tid, "Alpha does not work, parse failed!");} + return; + }else if (attribute.equals("shadow")){ + + if (molecule.charAt(j+attribute.length()+3)=='(' ){ + jj = molecule.indexOf(')',j+attribute.length()+3); + thisattribute="0"+thisattribute.substring(1,29)+molecule.substring(j+attribute.length()+4,jj); + j=jj-key.length(); + } else { + thisattribute="0"+thisattribute.substring(1,29)+"222black";} + }; + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (key.charAt(1) == 'c'){ + String attribute; + attribute = key.substring(2); + if (attribute.equals("underlinetext")){ + thisattribute=thisattribute.substring(0,18)+"0"+thisattribute.substring(19); + } else if (attribute.equals("strikethru")){ + thisattribute=thisattribute.substring(0,19)+"0"+thisattribute.substring(20); + } else if (attribute.equals("skew")){ + thisattribute=thisattribute.substring(0,20)+"+0.00"+thisattribute.substring(25); + }else if (attribute.equals("alpha")){ + // thisattribute=thisattribute.substring(0,25)+"0xFF"+thisattribute.substring(29); //alpha not working !! + }else if (attribute.equals("shadow")){ + thisattribute=thisattribute.substring(0,29)+"0000xFF000000"; + }; + + if (thisattribute.substring(1).equals(defaultattribute.substring(1))){ thisattribute='1'+thisattribute.substring(1);}; + + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } + } else if (temp == charExclam && key.charAt(0) == 'F') { //Begin font + + String fontname = key.substring(2); + if (key.charAt(1) == 'o'){ + fontinteger = font.fontname.indexOf(fontname); + + if (Integer.toString(fontinteger).length()==1){ + thisattribute=thisattribute.substring(0,4)+"00"+Integer.toString(fontinteger)+thisattribute.substring(7); + } else if (Integer.toString(fontinteger).length()==2){ + thisattribute=thisattribute.substring(0,4)+"0"+Integer.toString(fontinteger)+thisattribute.substring(7); + } else if (Integer.toString(fontinteger).length()==3){ + thisattribute=thisattribute.substring(0,4)+Integer.toString(fontinteger)+thisattribute.substring(7); + } + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (key.charAt(1) == 'c'){ + fontinteger = Integer.parseInt(defaultattribute.substring(4,7)); + if (Integer.toString(fontinteger).length()==1){ + thisattribute=thisattribute.substring(0,4)+"00"+Integer.toString(fontinteger)+thisattribute.substring(7); + } else if (Integer.toString(fontinteger).length()==2){ + thisattribute=thisattribute.substring(0,4)+"0"+Integer.toString(fontinteger)+thisattribute.substring(7); + } else if (Integer.toString(fontinteger).length()==3){ + thisattribute=thisattribute.substring(0,4)+Integer.toString(fontinteger)+thisattribute.substring(7); + } + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } + } else if (temp == charExclam && key.charAt(0) == 'X') { // Begin size + String sizename = key.substring(2); + if (key.charAt(1) == 'o'){ + thisfontsize= (int)((float)fontsize*Header.sizefactor.get(sizename)); + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (key.charAt(1) == 'c'){ + thisfontsize= fontsize; + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } + } else if (temp == charExclam && key.charAt(0) == 'C') { // Begin color + + String colorname = key.substring(2); + if (key.charAt(1) == 'o'){ + thisattribute=thisattribute.substring(0,7)+color.colorinteger.get(colorname)+thisattribute.substring(17); + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } else if (key.charAt(1) == 'c'){ + + thisattribute=thisattribute.substring(0,7)+defaultattribute.substring(7,17)+thisattribute.substring(17); + j=j+key.length()+2; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!'||molecule.charAt(ii)==')' || molecule.charAt(ii)=='(');ii++){ + key = key + molecule.charAt(ii); + }} + } + }else if (temp == charExclam && key.charAt(0) == 'V') { // open enclosure + key = key.substring(1); + if (Symbol.symboltype.containsKey(key) && + (Symbol.symboltype.get(key) == 1 || Symbol.symboltype.get(key) == 2 ||Symbol.symboltype.get(key) == 3 || Symbol.symboltype.get(key) == 5 || Symbol.symboltype.get(key) == 6 || Symbol.symboltype.get(key) == 7 || Symbol.symboltype.get(key) == 8 || Symbol.symboltype.get(key) == 9)) { // open enclosure + ii=j+key.length()+2; + temp=molecule.charAt(ii); + + if (temp=='{'){ + + enclosurenumber++; + currentenclosure=enclosurenumber; + thisenclosurelevel++; + previousblock=currentblock; + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + synchronized(this){ + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + } + openblock.add(subblocknumber.get(tid)); closeblock.add(-1);homeblock.add(currentblock); + + openenclosure.add(subblocknumber.get(tid)); closeenclosure.add(-1); showopenenclosure.add(true); + index2=+currentblock; + switch(Symbol.symboltype.get(key)){ + case 1: + case 3: + j3=j+key.length()+3; + if ( molecule.charAt(j3)== '!' && molecule.charAt(j3+1)== '.'){ + showopenenclosure.set(currentenclosure, false); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + j=j+2; + } else { + key2="!"+key+" "; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,key2,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + }; + break; + case 5: + case 6: + case 7: + case 8: + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + break; + case 9: + key2="!"+key+" "; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,key2,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + break; + } + parentkey=key; + index2=currentblock; + index = subblocknumber.get(tid)-openblock.get(currentblock); + subblockxpos.get(index2).set(index,xpos); + subblockypos.get(index2).set(index,ypos); + blockwidth.set(currentblock, 0.0f); + blockheight.set(currentblock, 0.0f); + blockdepth.set(currentblock, 0.0f); + + j=j+key.length()+3; + temp = molecule.charAt(j); + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + } + } else if (temp == '}'){ // close enclosure + index2=currentblock; + closeblock.set(currentblock, subblocknumber.get(tid)); + containfraction = false; + containenclosure=false; + for (i=currentblock+1;i<=blocknumber && !containfraction && !containenclosure;i++){ + if (blockenclosurelevel.get(i)==thisenclosurelevel && + blocksuperscriptlevel.get(i)==thissuperscriptlevel && + blocksubscriptlevel.get(i)==thissubscriptlevel && + blockfractionlevel.get(i)==thisfractionlevel+1 && + blocktabularlevel.get(i)==-1 && + openblock.get(i)> openblock.get(currentblock) && closeblock.get(i) <= closeblock.get(currentblock)){ + containfraction=true; + }} + + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(0)); + textpaint.getTextBounds("1",0,"1".length(),textbounds); + Float off=(float) textbounds.height()/2; + if (containfraction){adjustfraction(tid,currentblock, blocknumber, homeblock,openblock,closeblock,thisfractionlevel, thisblocklevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, off, gap);} + containfraction = false; + containenclosure=false; + + switch(Symbol.symboltype.get(key)){ + case 2: + case 3: + j3=j+key.length()+3; + if ( molecule.charAt(j3)== '!' && molecule.charAt(j3+1)== '.'){ + showcloseenclosure=false; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + j=j+2; + } else { + key2="!"+key+" "; + showcloseenclosure=true; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,key2,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + } + closeblock.set(currentblock,subblocknumber.get(tid)); + + closeenclosure.set(currentenclosure,subblocknumber.get(tid)); + twidth=0;theight=0;tdepth=0; + for (i=0; theight<=blockheight.get(currentblock)+1;i++){ + symbolpaint.setTextSize(i+8); + + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + theight = symbolbounds.height(); + i3=i;}; + twidth = symbolpaint.measureText(Symbol.symbolunicode.get(key)); + tdepth = symbolbounds.bottom; + index=subblocknumber.get(tid)-openblock.get(currentblock); + if (showopenenclosure.get(currentenclosure)){ + subblockwidth.get(index2).set(1,twidth); + subblockheight.get(index2).set(1,theight); + subblockdepth.get(index2).set(1,tdepth); + sfontsize=Integer.toString(i3+8); + int is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(1, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(1, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(1, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + + subblockypos.get(index2).set(1, ypos+blockdepth.get(currentblock)-tdepth); + subblockxpos.get(index2).set(1, subblockxpos.get(index2).get(0)); + blockwidth.set(currentblock,blockwidth.get(currentblock)+subblockwidth.get(index2).get(1)); + for (i=2; i<=subblocknumber.get(tid)-openblock.get(currentblock);i++) + {subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+subblockwidth.get(index2).get(1));}; + }; + + if (showcloseenclosure){ + subblockwidth.get(index2).set(index,twidth); + subblockheight.get(index2).set(index,theight); + subblockdepth.get(index2).set(index,tdepth); + + sfontsize=Integer.toString(i3+8); + int is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + subblockypos.get(index2).set(index, ypos+blockdepth.get(currentblock)-tdepth); + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(0)+blockwidth.get(currentblock)); + blockwidth.set(currentblock,blockwidth.get(currentblock)+subblockwidth.get(index2).get(index)); + }; + if (showopenenclosure.get(currentenclosure) || showcloseenclosure){ + blockheight.set(currentblock,Math.max(blockheight.get(currentblock),theight+gap)); + } + if (showcloseenclosure){ + xpos = subblockxpos.get(index2).get(index)+ twidth; + } else { + xpos = subblockxpos.get(index2).get(index); + } + parentkey=key; parentblock=currentblock; + break; + case 5: + case 6 : + j3=j+key.length()+3; + key2="!"+key+" "; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,key2,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + closeblock.set(currentblock,subblocknumber.get(tid)); + closeenclosure.set(currentenclosure,subblocknumber.get(tid)); + + twidth=0;theight=0;tdepth=0; + for (i=0; twidth<=blockwidth.get(currentblock);i++){ + symbolpaint.setTextSize(i+8); + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + twidth=symbolbounds.width(); + i3=i;}; + + theight = symbolbounds.height(); + tdepth = symbolbounds.bottom; + + index2=currentblock; + index=subblock.get(index2).size()-1; + subblockwidth.get(index2).set(index,twidth); + subblockheight.get(index2).set(index, theight); + subblockdepth.get(index2).set(index, tdepth); + if (Symbol.symboltype.get(key)==5){ + subblockypos.get(index2).set(index, subblockypos.get(index2).get(0)-blockheight.get(currentblock)+blockdepth.get(currentblock)-tdepth); + blockheight.set(currentblock,blockheight.get(currentblock)+theight); + blockwidth.set(currentblock, Math.max(blockwidth.get(currentblock),twidth)); + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(0)); + } else if (Symbol.symboltype.get(key)==6){ + blockheight.set(currentblock,blockheight.get(currentblock)+theight+gap); + blockdepth.set(currentblock,blockdepth.get(currentblock)+theight+gap); + subblockypos.get(index2).set(index, subblockypos.get(index2).get(0)+blockdepth.get(currentblock)-tdepth); + case6xmargin=(symbolpaint.measureText(Symbol.symbolunicode.get(key))-twidth)/2; + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(0)-case6xmargin); + } + + sfontsize=Integer.toString(i3+8); + int is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + parentkey=key; + break; + case 7: + + j3=j+key.length()+3; + key2="!"+key+" "; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,key2,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + closeblock.set(currentblock,subblocknumber.get(tid)); + closeenclosure.set(currentenclosure,subblocknumber.get(tid)); + + twidth=0;theight=0;tdepth=0; + if (Symbol.symbolsubtype.get(key)==1){ + i3=thisfontsize-8; + symbolpaint.setTextSize(i3+8); + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + twidth=symbolbounds.width(); + } else if (Symbol.symbolsubtype.get(key)==2){ + for (i=0; twidth<=blockwidth.get(currentblock) ;i++){ + symbolpaint.setTextSize(i+8); + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + twidth=symbolbounds.width(); + i3=i;}; + }; + theight = symbolbounds.height(); + tdepth = symbolbounds.bottom; + + case7xmargin=(blockwidth.get(currentblock)-twidth)/2; + + index2=currentblock; + index=subblock.get(index2).size()-1; + subblockwidth.get(index2).set(index,twidth); + subblockheight.get(index2).set(index, theight); + subblockdepth.get(index2).set(index, tdepth); + if (!key.equals("not") && !key.equals("bar")){ + subblockypos.get(index2).set(index, subblockypos.get(index2).get(0)-blockheight.get(currentblock)+blockdepth.get(currentblock)-tdepth-gap); + blockheight.set(currentblock,blockheight.get(currentblock)+theight+gap); + } else { + subblockypos.get(index2).set(index,subblockypos.get(index2).get(0)); + } + if (Symbol.symbolsubtype.get(key)==1){ + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(0)+twidth+case7xmargin); + } else if (Symbol.symbolsubtype.get(key)==2){ + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(0)+case7xmargin); + } + blockwidth.set(currentblock, Math.max(blockwidth.get(currentblock),twidth)); + + sfontsize=Integer.toString(i3+8); + is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + parentkey=key; + + break; + case 8: + j3=j+key.length()+3; + key2="!"+key+" "; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,key2,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + closeblock.set(currentblock,subblocknumber.get(tid)); + closeenclosure.set(currentenclosure,subblocknumber.get(tid)); + + twidth=0;theight=0;tdepth=0; + for (i=0; twidth<=blockwidth.get(currentblock);i++){ + symbolpaint.setTextSize(i3+8); + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + twidth=symbolbounds.width(); + i3=i;}; + + theight = symbolbounds.height(); + tdepth = symbolbounds.bottom; + + blockheight.set(currentblock,blockheight.get(currentblock)+theight+gap); + blockdepth.set(currentblock,blockdepth.get(currentblock)+theight+gap); + blockwidth.set(currentblock, Math.max(blockwidth.get(currentblock),twidth)); + + index2=currentblock; + index=subblock.get(index2).size()-1; + subblockwidth.get(index2).set(index,blockwidth.get(currentblock)); + subblockheight.get(index2).set(index, theight); + subblockdepth.get(index2).set(index, tdepth); + subblockypos.get(index2).set(index, subblockypos.get(index2).get(0)+blockdepth.get(currentblock)-tdepth); + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(0)); + sfontsize=Integer.toString(i3+8); + is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + + parentkey=key; + break; + + case 9: + j3=j+key.length()+3; + strokewidth=(float)thisfontsize/10; if (strokewidth < 1){strokewidth=1;}; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringhline,0.0f,strokewidth,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + + closeblock.set(currentblock,subblocknumber.get(tid)); + closeenclosure.set(currentenclosure,subblocknumber.get(tid)); + + twidth=0;theight=0;tdepth=0; + for (i=0; theight<=blockheight.get(currentblock)+gap+1;i++){ + symbolpaint.setTextSize(i+8); + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + theight = symbolbounds.height(); + i3=i;}; + twidth = symbolpaint.measureText(Symbol.symbolunicode.get(key)); + tdepth = symbolbounds.bottom; + index2=currentblock; + + subblockwidth.get(index2).set(1,twidth); + subblockheight.get(index2).set(1,theight); + subblockdepth.get(index2).set(1,tdepth); + + index=subblock.get(index2).size()-1; + subblockwidth.get(index2).set(index,blockwidth.get(currentblock)+1); + subblockypos.get(index2).set(index, ypos-blockheight.get(currentblock)-gap+blockdepth.get(currentblock)); + subblockxpos.get(index2).set(index, subblockxpos.get(index2).get(1)+subblockwidth.get(index2).get(1)-1); + + tempy=blockwidth.get(currentblock)+1; + sfontsize=Integer.toString((int)tempy+1); + is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + + blockheight.set(currentblock,blockheight.get(currentblock)+gap+strokewidth); + subblockypos.get(index2).set(1, ypos+blockdepth.get(currentblock)-tdepth); + blockwidth.set(currentblock,blockwidth.get(currentblock)+subblockwidth.get(index2).get(1)); + for (i=2; i<=subblocknumber.get(tid)-openblock.get(currentblock)-1;i++) + {subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+subblockwidth.get(index2).get(1));}; + + sfontsize=Integer.toString(i3+8); + is=sfontsize.length(); + if (is==1){ + subblockattribute.get(index2).set(1, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + subblockattribute.get(index2).set(1, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + subblockattribute.get(index2).set(1, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + + parentkey=""; + break; + } + + + closeblock.set(currentblock, subblocknumber.get(tid)); + closeenclosure.set(currentenclosure,subblocknumber.get(tid)); + thisenclosurelevel--; + previousenclosure = currentenclosure; + for (i=subblocknumber.get(tid);currentenclosure >= 0 && closeenclosure.get(currentenclosure)>=0;i--){ + currentenclosure--; + } + thisblocklevel--; + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + insert(tid,previousblock, currentblock, blockwidth.get(previousblock), blockheight.get(previousblock),blockdepth.get(previousblock)); + + j=j+key.length()+3; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + } }} + else if (temp == charExclam && key.equals(stringosp)) { // open superscript + + thissuperscriptlevel++; + superscriptnumber++; + currentsuperscript=superscriptnumber; + aftersubscript.add(false); + + supparentkey.add(parentkey); + + if (Symbol.symboltype.containsKey(parentkey) && (Symbol.symboltype.get(parentkey)<=3)){ + supparentblock.add(previousblock); + } else if (Symbol.symboltype.containsKey(parentkey) && (Symbol.symboltype.get(parentkey)==5 || Symbol.symboltype.get(parentkey)==7 )){ + supparentblock.add(previousblock); + } else if (supparentkey.get(currentsuperscript).equals("csp")){ + supparentblock.add(parentblock); + } else if (supparentkey.get(currentsuperscript).equals("csu")){ + supparentkey.set(currentsuperscript, subparentkey.get(previoussubscript)); + supparentblock.add(subparentblock.get(previoussubscript)); + aftersubscript.set(currentsuperscript, true); + } else { + supparentblock.add(currentblock); + } + + previousblock=currentblock; + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + thisfractionlevel=0; + + thisenclosurelevel = -1; + synchronized(this){ + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock ,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + } + homeblock.add(currentblock); openblock.add(subblocknumber.get(tid)); closeblock.add(-1); + + opensuperscript.add(subblocknumber.get(tid));closesuperscript.add(-1); + thisfontsize=fontsize*5/12;if (thisfontsize<8){thisfontsize=8;}; + + if (Symbol.symboltype.containsKey(supparentkey.get(currentsuperscript))){ + switch(Symbol.symboltype.get(supparentkey.get(currentsuperscript))){ + case 1 : + case 6 : + case 8 : + case 10 : + case 11 : + case 12 : + case 15 : + case 17 : + synchronized(this){ + Block.error.put(tid, true); + Block.errormessage.put(tid, key+" does not have superscript, parse failed!");} + return; + case 2 : + case 3: + ypos = ypos+blockdepth.get(supparentblock.get(currentsuperscript))-blockheight.get(supparentblock.get(currentsuperscript)); + if (aftersubscript.get(currentsuperscript)){xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(0)+blockwidth.get(supparentblock.get(currentsuperscript));}; + break; + case 5 : + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(subblock.get(supparentblock.get(currentsuperscript)).size()-1); + break ; + case 7 : + xpos=subblockxpos.get(homeblock.get(closeenclosure.get(previousenclosure))).get(0)+blockwidth.get(homeblock.get(closeenclosure.get(previousenclosure))); + break ; + case 13 : + case 14 : + if (aftersubscript.get(currentsuperscript)){xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(0)+blockwidth.get(supparentblock.get(currentsuperscript))-blockwidth.get(homeblock.get(opensubscript.get(previoussubscript)));}; + break ; + case 19 : + case 20 : + case 21 : + if (!aftersubscript.get(currentsuperscript)){ + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(subblock.get(parentblock).size()-1); + } else { + index=subblock.get(supparentblock.get(currentsuperscript)).size()-subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size()-1; + xpos=Math.min(subblockxpos.get(supparentblock.get(currentsuperscript)).get(index), subblockxpos.get(supparentblock.get(currentsuperscript)).get(index+2)); + } + break ; + case 22 : + case 23 : + case 24 : + if (!aftersubscript.get(currentsuperscript)){ + + } else { + index=opensubscript.get(previoussubscript)-openblock.get(supparentblock.get(currentsuperscript))-1; + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(index)+subblockwidth.get(supparentblock.get(currentsuperscript)).get(index);}; + break ; + } + } else if (supparentkey.get(currentsuperscript).equals("csp")){ + ypos = ypos+blockdepth.get(supparentblock.get(currentsuperscript))-blockheight.get(supparentblock.get(currentsuperscript)); + }else { + if (aftersubscript.get(currentsuperscript)){xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(0)+blockwidth.get(supparentblock.get(currentsuperscript))-blockwidth.get(homeblock.get(opensubscript.get(previoussubscript)));}; + } + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (temp == charExclam && key.equals(stringcsp)) { // close superscript; + + index2=currentblock; + closesuperscript.set(currentsuperscript, subblocknumber.get(tid)); + closeblock.set(currentblock, subblocknumber.get(tid)); + parentkey=supparentkey.get(currentsuperscript); + + if (Symbol.symboltype.containsKey(parentkey) + && (Symbol.symboltype.get(parentkey)<=7 || (Symbol.symboltype.get(parentkey)>=19 && Symbol.symboltype.get(parentkey)<=24)) + ){ + switch(Symbol.symboltype.get(parentkey)){ + case 2 : + case 3 : + tempy=(blockheight.get(currentblock)-blockdepth.get(currentblock))/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+tempy); + } + blockheight.set(currentblock, blockheight.get(supparentblock.get(currentsuperscript))+blockheight.get(currentblock)-blockdepth.get(currentblock)-tempy); + blockdepth.set(currentblock, blockdepth.get(supparentblock.get(currentsuperscript))); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + if (!aftersubscript.get(currentsuperscript)){ + insert(tid,previousblock, currentblock,blockwidth.get(previousblock), blockheight.get(previousblock), blockdepth.get(previousblock)); + } else { + width1=blockwidth.get(homeblock.get(opensubscript.get(previoussubscript))); + width2=blockwidth.get(previousblock); + maxwidth=Math.max(width1,width2); + insert(tid,previousblock, currentblock,maxwidth-width1, blockheight.get(previousblock),blockdepth.get(previousblock)); + } + index2=+currentblock; + ypos=subblockypos.get(index2).get(0); + xpos=subblockxpos.get(index2).get(0)+maxwidth; + + break; + case 5 : + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+blockdepth.get(supparentblock.get(currentsuperscript))-blockheight.get(supparentblock.get(currentsuperscript))-blockdepth.get(currentblock)); + } + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1; + maxwidth=Math.max(subblockwidth.get(supparentblock.get(currentsuperscript)).get(index), blockwidth.get(currentblock)); + tempy=(subblockwidth.get(supparentblock.get(currentsuperscript)).get(index)-blockwidth.get(currentblock))/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+tempy); + } + + ypos=subblockypos.get(supparentblock.get(currentsuperscript)).get(0); + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(1)+blockwidth.get(supparentblock.get(currentsuperscript)); + blockdepth.set(currentblock, blockdepth.get(supparentblock.get(currentsuperscript))); + blockheight.set(currentblock, blockheight.get(supparentblock.get(currentsuperscript))+blockheight.get(currentblock)+gap); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + index2=+currentblock; + for (i=1;i<=index;i++){ + subblockxpos.get(index2).set(openblock.get(supparentblock.get(currentsuperscript))-openblock.get(currentblock)+i, subblockxpos.get(supparentblock.get(currentsuperscript)).get(i)); + } + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + + break ; + + case 7 : + tempy=blockdepth.get(supparentblock.get(currentsuperscript))-blockheight.get(supparentblock.get(currentsuperscript))-blockdepth.get(currentblock)+blockheight.get(currentblock)/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+tempy); + } + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1; + maxwidth=Math.max(subblockwidth.get(supparentblock.get(currentsuperscript)).get(index), blockwidth.get(currentblock)); + + ypos=subblockypos.get(supparentblock.get(currentsuperscript)).get(0); + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(1)+blockwidth.get(supparentblock.get(currentsuperscript)); + + blockdepth.set(currentblock, blockdepth.get(supparentblock.get(currentsuperscript))); + blockheight.set(currentblock, blockheight.get(supparentblock.get(currentsuperscript))+blockheight.get(currentblock)/2+gap); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + index2=+currentblock; + for (i=1;i<=index;i++){ + subblockxpos.get(index2).set(openblock.get(supparentblock.get(currentsuperscript))-openblock.get(currentblock)+i, subblockxpos.get(supparentblock.get(currentsuperscript)).get(i)); + } + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock), blockdepth.get(previousblock)); + break ; + + case 19 : + case 20 : + case 21 : + if (!aftersubscript.get(currentsuperscript)){ + for (i=1;i<=subblock.get(index2).size()-1;i++){ + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1; + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i) + -subblockheight.get(supparentblock.get(currentsuperscript)).get(index) + +subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)-gap); + } + } else { + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1-subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size(); + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i) + -subblockheight.get(supparentblock.get(currentsuperscript)).get(index) + +subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)-gap); + } + } + if (!aftersubscript.get(currentsuperscript)){ + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1; + width1=subblockwidth.get(supparentblock.get(currentsuperscript)).get(index); + width2=blockwidth.get(currentblock); + maxwidth=Math.max(width1,width2); + if (width1 > width2){ + float td=(maxwidth-width2)/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+td); + } + ypos=subblockypos.get(supparentblock.get(currentsuperscript)).get(0); + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(index)+subblockwidth.get(supparentblock.get(currentsuperscript)).get(index); + } else { + float td=(maxwidth-width1)/2; + subblockxpos.get(supparentblock.get(currentsuperscript)).set(index, subblockxpos.get(supparentblock.get(currentsuperscript)).get(index)+td); + ypos=subblockypos.get(supparentblock.get(currentsuperscript)).get(0); + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(index)+width1+td; + } + + blockdepth.set(currentblock, subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)); + blockheight.set(currentblock, subblockheight.get(supparentblock.get(currentsuperscript)).get(index)+blockheight.get(currentblock)+gap); + + } else { + index=subblock.get(supparentblock.get(currentsuperscript)).size()-subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size()-1; + width1=subblockwidth.get(supparentblock.get(currentsuperscript)).get(index); + width2=blockwidth.get(homeblock.get(opensubscript.get(previoussubscript))); + width3=blockwidth.get(currentblock); + + // undo the position shift in subscript + + if (width1 > width2) { + + float td=subblockxpos.get(supparentblock.get(currentsuperscript)).get(index+2)-subblockxpos.get(supparentblock.get(currentsuperscript)).get(index); + for (i=index+2;i<=index+subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size();i++){ + subblockxpos.get(supparentblock.get(currentsuperscript)).set(i, subblockxpos.get(supparentblock.get(currentsuperscript)).get(i)-td); + } + }else { + subblockxpos.get(supparentblock.get(currentsuperscript)).set(index, subblockxpos.get(supparentblock.get(currentsuperscript)).get(index+2)); + } + xpos=subblockxpos.get(supparentblock.get(currentsuperscript)).get(index); + + maxwidth1=Math.max(width1,width2);maxwidth=Math.max(maxwidth1, width3); + if (maxwidth > width3){ + float td=(maxwidth-width3)/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+td); + } + } + if (maxwidth > width2){ + float td=(maxwidth-width2)/2; + for (i=index+2;i<=index+subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size();i++){ + subblockxpos.get(supparentblock.get(currentsuperscript)).set(i, subblockxpos.get(supparentblock.get(currentsuperscript)).get(i)+td); + } + } + if (maxwidth > width1){ + float td=(maxwidth-width1)/2; + subblockxpos.get(supparentblock.get(currentsuperscript)).set(index, subblockxpos.get(supparentblock.get(currentsuperscript)).get(index)+td); + } + xpos=xpos+maxwidth; + blockdepth.set(currentblock, blockdepth.get(homeblock.get(opensubscript.get(previoussubscript)))); + blockheight.set(currentblock, blockheight.get(homeblock.get(opensubscript.get(previoussubscript)))+blockheight.get(currentblock)+gap); + } + ypos=subblockypos.get(supparentblock.get(currentsuperscript)).get(0); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + if (!aftersubscript.get(currentsuperscript)){ + if (subblockwidth.get(supparentblock.get(currentsuperscript)).get(index)<blockwidth.get(previousblock)){ + float td=(maxwidth-subblockwidth.get(supparentblock.get(currentsuperscript)).get(index)); + insert(tid,previousblock, currentblock,td, blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + }} else { + if (maxwidth1 > maxwidth){ + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + insert(tid,previousblock, currentblock,maxwidth-maxwidth1, blockheight.get(previousblock), blockdepth.get(previousblock)); + } + } + break ; + + case 22 : + case 23 : + case 24 : + if (!aftersubscript.get(currentsuperscript)){ + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)-subblockheight.get(supparentblock.get(currentsuperscript)).get(index)+subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)); + } + }else { + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1-subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size(); + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)-subblockheight.get(supparentblock.get(currentsuperscript)).get(index)+subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)); + } + } + blockheight.set(currentblock, subblockheight.get(supparentblock.get(currentsuperscript)).get(index)+blockheight.get(currentblock)-blockdepth.get(currentblock)); + blockdepth.set(currentblock, subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)); + + thisblocklevel--; + closeblock.set(currentblock,subblocknumber.get(tid)); + + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + if (!aftersubscript.get(currentsuperscript)){ + insert(tid,previousblock, currentblock,blockwidth.get(previousblock), blockheight.get(previousblock), blockdepth.get(previousblock)); + } else { + symbolpaint.setTextSize(Integer.parseInt(subblockattribute.get(supparentblock.get(currentsuperscript)).get(1).substring(1,4))); + symbolpaint.getTextBounds(Symbol.symbolunicode.get("int"),0,Symbol.symbolunicode.get("int").length(),symbolbounds); + twidth = symbolbounds.width()/3; + tempy=Math.max(blockwidth.get(homeblock.get(opensubscript.get(previoussubscript)))-twidth,0); + tempy=Math.max(blockwidth.get(previousblock),tempy)-tempy; + insert(tid,previousblock, currentblock,tempy, blockheight.get(previousblock), blockdepth.get(previousblock)); + } + index2=+currentblock; + ypos=subblockypos.get(index2).get(0); + xpos=subblockxpos.get(index2).get(0)+blockwidth.get(currentblock); + + break ; + } + }else { + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(fontinteger)); + spacewidth=textpaint.measureText(" ")/2; + + if (!aftersubscript.get(currentsuperscript)){ + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1; + tempx=subblockheight.get(supparentblock.get(currentsuperscript)).get(index)-subblockdepth.get(supparentblock.get(currentsuperscript)).get(index); + tempy=tempx/4-blockdepth.get(currentblock); + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)-tempx+tempy); + subblockxpos.get(index2).set(i,subblockxpos.get(index2).get(i)+spacewidth); + } + }else { + index=subblock.get(supparentblock.get(currentsuperscript)).size()-1-subblock.get(homeblock.get(opensubscript.get(previoussubscript))).size(); + tempx=subblockheight.get(supparentblock.get(currentsuperscript)).get(index)-subblockdepth.get(supparentblock.get(currentsuperscript)).get(index); + tempy=tempx/4-blockdepth.get(currentblock); + for (i=1;i<=subblock.get(currentblock).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)-tempx+tempy); + subblockxpos.get(index2).set(i,subblockxpos.get(index2).get(i)+spacewidth); + } + } + blockheight.set(currentblock, subblockheight.get(supparentblock.get(currentsuperscript)).get(index)+blockheight.get(currentblock)-blockdepth.get(currentblock)-tempy); + blockdepth.set(currentblock, subblockdepth.get(supparentblock.get(currentsuperscript)).get(index)); + blockwidth.set(currentblock, blockwidth.get(currentblock)+spacewidth); + + closeblock.set(currentblock,subblocknumber.get(tid)); + thisblocklevel-=2; + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + if (!aftersubscript.get(currentsuperscript)){ + insert(tid,previousblock, currentblock,blockwidth.get(previousblock), blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + tempy=Math.max(blockwidth.get(previousblock),blockwidth.get(homeblock.get(opensubscript.get(previoussubscript))))-blockwidth.get(homeblock.get(opensubscript.get(previoussubscript))); + insert(tid,previousblock, currentblock,tempy, blockheight.get(previousblock), blockdepth.get(previousblock)); + } + index2=+currentblock; + ypos=subblockypos.get(index2).get(0); + xpos=subblockxpos.get(index2).get(0)+blockwidth.get(currentblock); + } + thisfractionlevel = blockfractionlevel.get(currentblock); + thisenclosurelevel = blockenclosurelevel.get(currentblock); + + previoussuperscript=currentsuperscript;thissuperscriptlevel--; + for (i=subblocknumber.get(tid);currentsuperscript >= 0 && closesuperscript.get(currentsuperscript)>=0;i--){ + currentsuperscript--; + } + + if (thissubscriptlevel >= 0 || thissuperscriptlevel >= 0){ + thisfontsize=fontsize/3; + }else if (thisfractionlevel<=2){ + thisfontsize=(int)((double)fontsize*fractionfontfactor[thisfractionlevel]); + }else { + thisfontsize=(int)((double)fontsize*fractionfontfactor[2]); + }; + if (thisfontsize<8){thisfontsize=8;}; + + j+=5; + temp = molecule.charAt(j); + parentkey="csp";parentblock=previousblock; + + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (temp == charExclam && key.equals(stringosu)) { // open subscript + + thissubscriptlevel++; + subscriptnumber++; + currentsubscript=subscriptnumber; + aftersuperscript.add(false); + + subparentkey.add(parentkey); + + if (Symbol.symboltype.containsKey(parentkey) && (Symbol.symboltype.get(parentkey)<=3)){ + subparentblock.add(previousblock); + } else if (Symbol.symboltype.containsKey(parentkey) && (Symbol.symboltype.get(parentkey)==6 || Symbol.symboltype.get(parentkey)==8 )){ + subparentblock.add(previousblock); + } else if (subparentkey.get(currentsubscript).equals("csu")){ + subparentblock.add(parentblock); + } else if (subparentkey.get(currentsubscript).equals("csp")){ + subparentkey.set(currentsubscript, supparentkey.get(previoussuperscript)); + subparentblock.add(supparentblock.get(previoussuperscript)); + aftersuperscript.set(currentsubscript, true); + } else { + subparentblock.add(currentblock); + } + + previousblock=currentblock; + blocknumber++; + currentblock= blocknumber; + thisblocklevel++; + thisfractionlevel=0; + thisenclosurelevel = -1; + synchronized(this){ + create(tid,currentblock, thisblocklevel, thisfractionlevel, thisenclosurelevel, thissuperscriptlevel, thissubscriptlevel, thistabularlevel); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,0.0f,0.0f,0.0f,xpos,ypos,thisattribute); + } + homeblock.add(currentblock); openblock.add(subblocknumber.get(tid)); closeblock.add(-1); + opensubscript.add(subblocknumber.get(tid));closesubscript.add(-1); + thisfontsize=fontsize*5/12;if (thisfontsize<8){thisfontsize=8;}; + + if (Symbol.symboltype.containsKey(subparentkey.get(currentsubscript))){ + switch(Symbol.symboltype.get(subparentkey.get(currentsubscript))){ + case 1 : + case 5 : + case 7 : + case 10 : + case 11 : + case 12 : + case 17 : + synchronized(this){ + Block.error.put(tid, true); + Block.errormessage.put(tid, key+" does not have subscript, parsing failed!");} + return; + case 2 : + case 3 : + ypos = ypos+blockdepth.get(subparentblock.get(currentsubscript)); + if (aftersuperscript.get(currentsubscript)){xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(0)+blockwidth.get(subparentblock.get(currentsubscript));}; + break; + case 6 : + case 8 : + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(0); + break ; + case 13 : + case 14 : + if (aftersuperscript.get(currentsubscript)){xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(0)+blockwidth.get(subparentblock.get(currentsubscript))-blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript)));}; + break ; + case 15 : + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(subblock.get(parentblock).size()-1); + break ; + case 19 : + case 20 : + case 21 : + if (!aftersuperscript.get(currentsubscript)){ + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(subblock.get(subparentblock.get(currentsubscript)).size()-1); + } else { + index=subblock.get(subparentblock.get(currentsubscript)).size()-subblock.get(homeblock.get(opensuperscript.get(previoussuperscript))).size()-1; + xpos=Math.min(subblockxpos.get(subparentblock.get(currentsubscript)).get(index), subblockxpos.get(subparentblock.get(currentsubscript)).get(index+2)); + } + break; + + case 22 : + case 23 : + case 24 : + symbolpaint.setTextSize(Integer.parseInt(subblockattribute.get(subparentblock.get(currentsubscript)).get(1).substring(1,4))); + symbolpaint.getTextBounds(Symbol.symbolunicode.get("int"),0,Symbol.symbolunicode.get("int").length(),symbolbounds); + twidth = symbolbounds.width()/3; + if (!aftersuperscript.get(currentsubscript)){ + xpos=xpos-twidth; + } else { + index=opensuperscript.get(previoussuperscript)-openblock.get(subparentblock.get(currentsubscript))-1; + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+subblockwidth.get(subparentblock.get(currentsubscript)).get(index)-twidth; + } + ypos = ypos+blockdepth.get(subparentblock.get(currentsubscript)); + + break ; + } + } else if (subparentkey.get(currentsubscript).equals("csu")){ + ypos = ypos+blockdepth.get(subparentblock.get(currentsubscript)); + }else { + if (aftersuperscript.get(currentsubscript)){xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(0)+blockwidth.get(subparentblock.get(currentsubscript))-blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript)));}; + } + + j+=5; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (temp == charExclam && key.equals(stringcsu)) { // close subscript + index2=currentblock; + closesubscript.set(currentsubscript, subblocknumber.get(tid)); + closeblock.set(currentblock, subblocknumber.get(tid)); + parentkey=subparentkey.get(currentsubscript); + + if (Symbol.symboltype.containsKey(parentkey) + && (Symbol.symboltype.get(parentkey)<=8 || Symbol.symboltype.get(parentkey)==15 || (Symbol.symboltype.get(parentkey)>=19 && Symbol.symboltype.get(parentkey)<=24)) + ){ + switch(Symbol.symboltype.get(parentkey)){ + case 2 : + case 3 : + blockheight.set(currentblock, blockheight.get(subparentblock.get(currentsubscript))+blockdepth.get(currentblock)); + blockdepth.set(currentblock, blockdepth.get(subparentblock.get(currentsubscript))+blockdepth.get(currentblock)); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + index2=+currentblock; + if (!aftersuperscript.get(currentsubscript)){ + insert(tid,previousblock, currentblock,blockwidth.get(previousblock), blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + width1=blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript))); + width2=blockwidth.get(previousblock); + maxwidth=Math.max(width1,width2); + insert(tid,previousblock, currentblock,maxwidth-width1, blockheight.get(previousblock), blockdepth.get(previousblock)); + } + + ypos=subblockypos.get(index2).get(0); + xpos=subblockxpos.get(index2).get(0)+maxwidth; + + break; + case 6 : + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+blockdepth.get(subparentblock.get(currentsubscript))+blockheight.get(currentblock)-blockdepth.get(currentblock)); + } + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + maxwidth=Math.max(subblockwidth.get(subparentblock.get(currentsubscript)).get(index), blockwidth.get(currentblock)); + + tempy=(subblockwidth.get(subparentblock.get(currentsubscript)).get(index)-blockwidth.get(currentblock))/2; + for (i=1;i<=subblock.get(currentblock).size()-1;i++){ + subblockxpos.get(currentblock).set(i, subblockxpos.get(currentblock).get(i)+tempy-case6xmargin); + } + ypos=subblockypos.get(subparentblock.get(currentsubscript)).get(0); + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(1)+blockwidth.get(subparentblock.get(currentsubscript)); + + blockdepth.set(currentblock, blockdepth.get(subparentblock.get(currentsubscript))+blockheight.get(currentblock)+gap); + blockheight.set(currentblock, blockheight.get(subparentblock.get(currentsubscript))+blockheight.get(currentblock)+gap); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + index2=+currentblock; + for (i=1;i<=index;i++){ + subblockxpos.get(index2).set(openblock.get(subparentblock.get(currentsubscript))-openblock.get(currentblock)+i, subblockxpos.get(subparentblock.get(currentsubscript)).get(i)); + } + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + + break ; + + case 8 : + float thisgap=gap*fontsize/thisfontsize; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+blockdepth.get(subparentblock.get(currentsubscript))+blockheight.get(currentblock)-blockdepth.get(currentblock)+thisgap); + } + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + maxwidth=Math.max(subblockwidth.get(subparentblock.get(currentsubscript)).get(index), blockwidth.get(currentblock)); + + tempy=(subblockwidth.get(subparentblock.get(currentsubscript)).get(index)-blockwidth.get(currentblock))/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+tempy); + } + ypos=subblockypos.get(subparentblock.get(currentsubscript)).get(0); + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(1)+blockwidth.get(subparentblock.get(currentsubscript)); + + blockdepth.set(currentblock, blockdepth.get(subparentblock.get(currentsubscript))+blockheight.get(currentblock)+gap); + blockheight.set(currentblock, blockheight.get(subparentblock.get(currentsubscript))+blockheight.get(currentblock)+gap); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + index2=+currentblock; + for (i=1;i<=index;i++){ + subblockxpos.get(index2).set(openblock.get(subparentblock.get(currentsubscript))-openblock.get(currentblock)+i, subblockxpos.get(subparentblock.get(currentsubscript)).get(i)); + } + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + + break ; + case 19 : + case 20 : + case 21 : + + if (!aftersuperscript.get(currentsubscript)){ + for (i=1;i<=subblock.get(index2).size()-1;i++){ + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i) + +subblockdepth.get(subparentblock.get(currentsubscript)).get(index) + +blockheight.get(currentblock)-blockdepth.get(currentblock)+gap); + } + } else { + index=subblock.get(subparentblock.get(currentsubscript)).size()-1-subblock.get(homeblock.get(opensuperscript.get(previoussuperscript))).size(); + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i) + +subblockdepth.get(subparentblock.get(currentsubscript)).get(index) + +blockheight.get(currentblock)-blockdepth.get(currentblock)+gap); + } + } + if (!aftersuperscript.get(currentsubscript)){ + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + width1=subblockwidth.get(subparentblock.get(currentsubscript)).get(index); + width2=blockwidth.get(currentblock); + maxwidth=Math.max(width1,width2); + if (width1 > width2){ + float td=(maxwidth-width2)/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+td); + } + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+subblockwidth.get(subparentblock.get(currentsubscript)).get(index); + } else { + float td=(maxwidth-width1)/2; + subblockxpos.get(subparentblock.get(currentsubscript)).set(index, subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+td); + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+width1+td; + } + blockdepth.set(currentblock, subblockdepth.get(subparentblock.get(currentsubscript)).get(index)+blockheight.get(currentblock)+gap); + blockheight.set(currentblock, subblockheight.get(subparentblock.get(currentsubscript)).get(index)+blockheight.get(currentblock)+gap); + } else { + index=subblock.get(subparentblock.get(currentsubscript)).size()-subblock.get(homeblock.get(opensuperscript.get(previoussuperscript))).size()-1; + width1=subblockwidth.get(subparentblock.get(currentsubscript)).get(index); + width2=blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript))); + width3=blockwidth.get(currentblock); + + // undo the position shift in superscript + + if (width1 > width2) { + float td=subblockxpos.get(subparentblock.get(currentsubscript)).get(index+2)-subblockxpos.get(subparentblock.get(currentsubscript)).get(index); + for (i=index+2;i<=index+subblock.get(homeblock.get(opensuperscript.get(previoussuperscript))).size();i++){ + subblockxpos.get(subparentblock.get(currentsubscript)).set(i, subblockxpos.get(subparentblock.get(currentsubscript)).get(i)-td); + } + }else { + subblockxpos.get(subparentblock.get(currentsubscript)).set(index, subblockxpos.get(subparentblock.get(currentsubscript)).get(index+2)); + } + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(index); + maxwidth1=Math.max(width1,width2);maxwidth=Math.max(maxwidth1, width3); + if (maxwidth > width3){ + float td=(maxwidth-width3)/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+td); + } + } + if (maxwidth > width2){ + float td=(maxwidth-width2)/2; + for (i=index+2;i<=index+subblock.get(homeblock.get(opensuperscript.get(previoussuperscript))).size();i++){ + subblockxpos.get(subparentblock.get(currentsubscript)).set(i, subblockxpos.get(subparentblock.get(currentsubscript)).get(i)+td); + } + } + if (maxwidth > width1){ + float td=(maxwidth-width1)/2; + subblockxpos.get(subparentblock.get(currentsubscript)).set(index, subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+td); + } + xpos=xpos+maxwidth; + blockdepth.set(currentblock, blockdepth.get(homeblock.get(opensuperscript.get(previoussuperscript)))+blockheight.get(currentblock)+gap); + blockheight.set(currentblock, blockheight.get(homeblock.get(opensuperscript.get(previoussuperscript)))+blockheight.get(currentblock)+gap); + } + + ypos=subblockypos.get(subparentblock.get(currentsubscript)).get(0); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + if (!aftersuperscript.get(currentsubscript)){ + if (subblockwidth.get(subparentblock.get(currentsubscript)).get(index)<blockwidth.get(previousblock)){ + float td=(maxwidth-subblockwidth.get(subparentblock.get(currentsubscript)).get(index)); + insert(tid,previousblock, currentblock,td, blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + } + } else { + if (maxwidth1 > maxwidth){ + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + insert(tid,previousblock, currentblock,maxwidth-maxwidth1, blockheight.get(previousblock),blockdepth.get(previousblock)); + } + } + break ; + case 22 : + case 23 : + case 24 : + + symbolpaint.setTextSize(Integer.parseInt(subblockattribute.get(subparentblock.get(currentsubscript)).get(1).substring(1,4))); + symbolpaint.getTextBounds(Symbol.symbolunicode.get("int"),0,Symbol.symbolunicode.get("int").length(),symbolbounds); + twidth = symbolbounds.width()/3; + + tempy=(blockheight.get(currentblock)-blockdepth.get(currentblock))/2; + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+tempy); + } + + blockheight.set(currentblock, subblockheight.get(subparentblock.get(currentsubscript)).get(index)+blockdepth.get(currentblock)+tempy); + blockdepth.set(currentblock, subblockdepth.get(subparentblock.get(currentsubscript)).get(index)+blockdepth.get(currentblock)+tempy); + closeblock.set(currentblock,subblocknumber.get(tid)); + thisblocklevel--; + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + if (!aftersuperscript.get(currentsubscript)){ + tempy=Math.max(blockwidth.get(previousblock)-twidth, 0); + insert(tid,previousblock, currentblock,tempy, blockheight.get(previousblock),blockdepth.get(previousblock)); + } else { + tempy=Math.max(blockwidth.get(previousblock)-twidth,blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript))))-blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript))); + insert(tid,previousblock, currentblock,tempy, blockheight.get(previousblock),blockdepth.get(previousblock)); + } + index2=+currentblock; + ypos=subblockypos.get(index2).get(0); + xpos=subblockxpos.get(index2).get(0)+blockwidth.get(currentblock); + break ; + case 15 : + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i) + +subblockdepth.get(subparentblock.get(currentsubscript)).get(subblock.get(subparentblock.get(currentsubscript)).size()-1) + +blockheight.get(currentblock)-blockdepth.get(currentblock)+gap); + } + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + width1=subblockwidth.get(subparentblock.get(currentsubscript)).get(index); + width2=blockwidth.get(currentblock); + maxwidth=Math.max(width1,width2); + if (width1 > width2){ + float td=(maxwidth-width2)/2; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockxpos.get(index2).set(i, subblockxpos.get(index2).get(i)+td); + } + ypos=subblockypos.get(subparentblock.get(currentsubscript)).get(0); + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+subblockwidth.get(subparentblock.get(currentsubscript)).get(index); + } else { + float td=(maxwidth-width1)/2; + subblockxpos.get(subparentblock.get(currentsubscript)).set(index, subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+td); + ypos=subblockypos.get(subparentblock.get(currentsubscript)).get(0); + xpos=subblockxpos.get(subparentblock.get(currentsubscript)).get(index)+width1+td; + } + + blockdepth.set(currentblock, subblockdepth.get(subparentblock.get(currentsubscript)).get(index)+blockheight.get(currentblock)); + blockheight.set(currentblock, subblockheight.get(subparentblock.get(currentsubscript)).get(index)+blockheight.get(currentblock)+gap); + + closeblock.set(currentblock,subblocknumber.get(tid)); + previousblock=currentblock;thisblocklevel--; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + + if (subblockwidth.get(subparentblock.get(currentsubscript)).get(index)<blockwidth.get(previousblock)){ + float td=(maxwidth-subblockwidth.get(subparentblock.get(currentsubscript)).get(index))/2; + insert(tid,previousblock, currentblock,td, blockheight.get(previousblock),blockdepth.get(previousblock)); + } + else { + insert(tid,previousblock, currentblock,0.0f, blockheight.get(previousblock), blockdepth.get(previousblock)); + } + break ; + } + }else { + tempy=(blockheight.get(currentblock)-blockdepth.get(currentblock))/2; + index=subblock.get(subparentblock.get(currentsubscript)).size()-1; + for (i=1;i<=subblock.get(index2).size()-1;i++){ + subblockypos.get(index2).set(i,subblockypos.get(index2).get(i)+tempy); + } + tempy=Math.max(subblockdepth.get(subparentblock.get(currentsubscript)).get(index),(blockdepth.get(currentblock)+ blockheight.get(currentblock))/2); + maxtop=subblockheight.get(subparentblock.get(currentsubscript)).get(index)-subblockdepth.get(subparentblock.get(currentsubscript)).get(index); + blockdepth.set(currentblock, tempy); + blockheight.set(currentblock,maxtop+blockdepth.get(currentblock)); + + closeblock.set(currentblock,subblocknumber.get(tid)); + thisblocklevel-=2; + previousblock=currentblock; + for (i=subblocknumber.get(tid);currentblock >=0 && closeblock.get(currentblock)>=0;i--){ + currentblock--; + } + if (!aftersuperscript.get(currentsubscript)){ + insert(tid,previousblock, currentblock,blockwidth.get(previousblock), blockheight.get(previousblock), blockdepth.get(previousblock)); + } else { + tempy=Math.max(blockwidth.get(previousblock),blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript))))-blockwidth.get(homeblock.get(opensuperscript.get(previoussuperscript))); + insert(tid,previousblock, currentblock,tempy, blockheight.get(previousblock),blockdepth.get(previousblock)); + } + index2=+currentblock; + ypos=subblockypos.get(index2).get(0); + xpos=subblockxpos.get(index2).get(0)+blockwidth.get(currentblock); + } + thisfractionlevel = blockfractionlevel.get(currentblock); + thisenclosurelevel = blockenclosurelevel.get(currentblock); + + previoussubscript=currentsubscript;thissubscriptlevel--; + for (i=subblocknumber.get(tid);currentsubscript >= 0 && closesubscript.get(currentsubscript)>=0;i--){ + currentsubscript--; + } + + if (thissubscriptlevel >= 0 || thissuperscriptlevel >= 0){ + thisfontsize=fontsize/3; + }else if (thisfractionlevel<=2){ + thisfontsize=(int)((double)fontsize*fractionfontfactor[thisfractionlevel]); + }else { + thisfontsize=(int)((double)fontsize*fractionfontfactor[2]); + }; + if (thisfontsize<8){thisfontsize=8;}; + j+=5; + temp = molecule.charAt(j); + parentkey="csu";parentblock=previousblock; + + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (temp == charExclam && key.equals("hsp")){ // hspace + + j+=5; + key=molecule.substring(j,molecule.indexOf("}",j));j=j+key.length()+1; + twidth=Float.parseFloat(key); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stringdnot,twidth,0.0f,0.0f,xpos,ypos,thisattribute); + homeblock.add(currentblock); + xpos=xpos+twidth; + + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + + }else if (temp == charExclam && key.equals("vsp")){ // vspace + + synchronized(this){ + Block.error.put(tid, true); + Block.errormessage.put(tid, "vspace inserted in wrong place, parse failed!");} + return; + + } else { + + for (i = 0 ; (temp != charExclam) || (temp == charExclam && Symbol.symboltype.containsKey(key) + && Symbol.symboltype.get(key) >= 10 ) ; i++) { + + if (temp != charExclam) { // italic text + sfontsize=Integer.toString(thisfontsize); + ij=sfontsize.length(); + if (ij==1){ + thisattribute=thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4); + } else if (ij==2){ + thisattribute=thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4); + } else if (ij==3){ + thisattribute=thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4); + } + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(Integer.parseInt(thisattribute.substring(4,7)))); + + ii=molecule.indexOf('!',j); + String stemp=molecule.substring(j,ii); + textpaint.getTextBounds(stemp,0,stemp.length(),textbounds); + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stemp,textpaint.measureText(stemp),(float)textbounds.height(),(float)textbounds.bottom, xpos,ypos,thisattribute); + homeblock.add(currentblock); + xpos=xpos+textpaint.measureText(stemp); + parentkey=stemp.substring(stemp.length()-1); parentblock=currentblock; + j=ii; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + + } else if (temp == charExclam){ // symbol + + if (Symbol.symboltype.get(key)==20 || Symbol.symboltype.get(key)==23){ + sfontsize=Integer.toString((int) ((float)thisfontsize*Header.bigopsize)); + symbolpaint.setTextSize((int)(float)thisfontsize*Header.bigopsize); + } else if (Symbol.symboltype.get(key)==21 || Symbol.symboltype.get(key)==24){ + sfontsize=Integer.toString((int) ((float)thisfontsize*Header.bigbigopsize)); + symbolpaint.setTextSize((int)(float)thisfontsize*Header.bigbigopsize); + } else { + sfontsize=Integer.toString(thisfontsize); + symbolpaint.setTextSize(thisfontsize); + } + textpaint.setTextSize(thisfontsize); + textpaint.setTypeface(tf.get(fontinteger)); + String stemp="a"; + textpaint.getTextBounds(stemp,0,stemp.length(),textbounds); + Float sizeofa=(float) textbounds.height(); + + if (Symbol.symboltype.get(key)==15 || Symbol.symboltype.get(key)==14) { + ij=sfontsize.length(); + if (ij==1){ + attribute2=thisattribute.substring(0,1)+"00"+sfontsize+"005"+thisattribute.substring(7); + } else if (ij==2){ + attribute2=thisattribute.substring(0,1)+"0"+sfontsize+"005"+thisattribute.substring(7); + } else if (ij==3){ + attribute2=thisattribute.substring(0,1)+sfontsize+"005"+thisattribute.substring(7); + } + + textpaint5.setTextSize(thisfontsize); + textpaint5.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),textbounds5); + twidth = textpaint5.measureText(Symbol.symbolunicode.get(key)); + theight = textbounds5.height(); + tdepth = textbounds5.bottom; + }else { + ij=sfontsize.length(); + if (ij==1){ + attribute2=thisattribute.substring(0,1)+"00"+sfontsize+"004"+thisattribute.substring(7); + } else if (ij==2){ + attribute2=thisattribute.substring(0,1)+"0"+sfontsize+"004"+thisattribute.substring(7); + } else if (ij==3){ + attribute2=thisattribute.substring(0,1)+sfontsize+"004"+thisattribute.substring(7); + } + symbolpaint.getTextBounds(Symbol.symbolunicode.get(key),0,Symbol.symbolunicode.get(key).length(),symbolbounds); + twidth = symbolpaint.measureText(Symbol.symbolunicode.get(key)); + theight = symbolbounds.height(); + tdepth = symbolbounds.bottom; + } + parentkey=key; parentblock=currentblock; + + theight=Math.max(theight, sizeofa); + ii=j+key.length()+1; + stemp=molecule.substring(j,ii).trim()+" "; + subblocknumber.put(tid, subblocknumber.get(tid)+1); add(tid,currentblock,stemp,twidth,theight,tdepth,xpos,ypos,attribute2); + homeblock.add(currentblock); + + xpos=xpos+twidth; + + j=j+key.length()+1; + temp = molecule.charAt(j); + if (temp == charExclam){ + key = ""; + for (ii=j+1;!(molecule.charAt(ii)==' ' ||molecule.charAt(ii)=='}' || molecule.charAt(ii)=='{'|| molecule.charAt(ii)=='!');ii++){ + key = key + molecule.charAt(ii); + }} + if(molecule.charAt(ii)==' ' && molecule.charAt(ii+1)!='!'){j=j+1;} + }; + }; + } + } + synchronized(this){ + block.result(tid, blocknumber, subblock, subblockwidth, subblockheight, subblockdepth, subblockxpos, subblockypos, subblockattribute, blockwidth, blockheight, blockdepth);} + } + + public void add(int tid, int blocknumber, String block, + Float width, Float height, Float depth, Float xpos, Float ypos, String attribute) { + + int index=blocknumber; + subblock.get(index).add(block); + subblockwidth.get(index).add(width); + subblockheight.get(index).add(height); + subblockdepth.get(index).add(depth); + subblockxpos.get(index).add(xpos); + subblockypos.get(index).add(ypos); + subblockattribute.get(index).add(attribute); + + blockwidth.set(blocknumber, blockwidth.get(blocknumber)+width); + float maxtop=Math.max(blockheight.get(blocknumber)-blockdepth.get(blocknumber), height-depth); + blockdepth.set(blocknumber, Math.max(blockdepth.get(blocknumber),depth)); + blockheight.set(blocknumber,maxtop+blockdepth.get(blocknumber)); + return; + } + + public void create(int tid, int blocknumber, int thisblocklevel, int thisfractionlevel, int thisenclosurelevel, int thissuperscriptlevel, int thissubscriptlevel, int thistabularlevel) { + + int index=blocknumber; + subblock.add(index,new ArrayList<String>()); + subblockwidth.add(index,new ArrayList<Float>()); + subblockheight.add(index,new ArrayList<Float>()); + subblockdepth.add(index,new ArrayList<Float>()); + subblockxpos.add(index,new ArrayList<Float>()); + subblockypos.add(index,new ArrayList<Float>()); + subblockattribute.add(index,new ArrayList<String>()); + + blocklevel.add(thisblocklevel); + blockfractionlevel.add(thisfractionlevel); + blockenclosurelevel.add(thisenclosurelevel); + blocksuperscriptlevel.add(thissuperscriptlevel); + blocksubscriptlevel.add(thissubscriptlevel); + blocktabularlevel.add(thistabularlevel); + + blockwidth.add(0.0f); + blockheight.add(0.0f); + blockdepth.add(0.0f); + + return; + } + + public void insert(int tid, int blocknumber1, int blocknumber2 , Float width, Float height, Float depth) { + + int index1=blocknumber1; + int index2=blocknumber2; + int l=subblock.get(index1).size(); + for (int i=0;i<=l-1;i++){ + subblock.get(index2).add(subblock.get(index1).get(i)); + subblockwidth.get(index2).add(subblockwidth.get(index1).get(i)); + subblockheight.get(index2).add(subblockheight.get(index1).get(i)); + subblockdepth.get(index2).add(subblockdepth.get(index1).get(i)); + subblockxpos.get(index2).add(subblockxpos.get(index1).get(i)); + subblockypos.get(index2).add(subblockypos.get(index1).get(i)); + subblockattribute.get(index2).add(subblockattribute.get(index1).get(i)); + } + + float maxtop=Math.max(blockheight.get(blocknumber2)-blockdepth.get(blocknumber2), height-depth); + blockdepth.set(blocknumber2, Math.max(blockdepth.get(blocknumber2),depth)); + blockheight.set(blocknumber2, maxtop+blockdepth.get(blocknumber2)); + blockwidth.set(blocknumber2, blockwidth.get(blocknumber2)+width); + return; + } + + public void adjustfraction(int tid, int blocknumber, int maxblocknumber, ArrayList<Integer> blocklist, ArrayList<Integer> openblock,ArrayList<Integer> closeblock,int thisfractionlevel, int thisblocklevel, int thisenclosurelevel, int thissuperscriptlevel, int thissubscriptlevel, Float off, Float linewidth) { + + ArrayList<Float> liney= new ArrayList<Float>(); + ArrayList<Integer> line = new ArrayList<Integer>(); + int numfrac=0; + + int index2=blocknumber; + int index = openblock.get(blocknumber); + for (int i=index;i<=closeblock.get(blocknumber);i++){ + if(blockenclosurelevel.get(blocklist.get(i)) == thisenclosurelevel && + blocksuperscriptlevel.get(blocklist.get(i)) == thissuperscriptlevel && + blocksubscriptlevel.get(blocklist.get(i)) == thissubscriptlevel && + blockfractionlevel.get(blocklist.get(i))==thisfractionlevel+1 && + subblock.get(index2).get(i-index).equals("!hlin ")){ + numfrac++; + liney.add(subblockypos.get(index2).get(i-index)); + line.add(i-index); + } + } + + ArrayList<Integer> adjustedblock = new ArrayList<Integer>(); + ArrayList<Integer> adjustedfrac = new ArrayList<Integer>(); + int numblock=0; + for (int i=0;i<=numfrac-1;i++){ + adjustedblock.add(blocklist.get(line.get(i)+index)-1); + adjustedfrac.add(i); + numblock++; + } + + float minliney=10000; + for (int i=0;i<=numfrac-1;i++){ + minliney=Math.min(minliney, liney.get(i)); + } + + Float maxtop1=0.0f; + Float maxbottom1=0.0f; + int i=0; + Float top1=0.0f; + Float bottom1 =0.0f; + for (i=0;i<numblock;i++){ + float diff = liney.get(adjustedfrac.get(i))-minliney; + bottom1=blockdepth.get(adjustedblock.get(i))-diff; + top1=blockheight.get(adjustedblock.get(i))-bottom1; + maxtop1=Math.max(maxtop1, top1); + maxbottom1=Math.max(maxbottom1, bottom1); + blockfractionlevel.set(adjustedfrac.get(i), 0); + } + + int lengthofblock=closeblock.get(blocknumber)-openblock.get(blocknumber); + ArrayList<Boolean> adjusted = new ArrayList<Boolean>(); + for (i=0;i<=lengthofblock;i++){ + adjusted.add(false); + } + + for (i=0;i<numblock;i++){ + float diff = liney.get(adjustedfrac.get(i))-minliney; + for (int ii=openblock.get(adjustedblock.get(i));ii<=closeblock.get(adjustedblock.get(i));ii++){ + index=ii-openblock.get(blocknumber); + subblockypos.get(index2).set(index,subblockypos.get(index2).get(index)-diff); + adjusted.set(index, true); + } + } + Float diff=subblockypos.get(index2).get(0)-minliney-off; + Float maxtop2=0.0f; + Float maxbottom2=0.0f; + for (i=1;i<=lengthofblock;i++){ + Float top2=0.0f; + Float bottom2 = 0.0f; + if(!adjusted.get(i)){ + subblockypos.get(index2).set(i, subblockypos.get(index2).get(i)-diff); + bottom2=subblockdepth.get(index2).get(i)-diff; + top2=subblockheight.get(index2).get(i)-bottom2; + maxtop2=Math.max(maxtop2, top2); + maxbottom2=Math.max(maxbottom2, bottom2); + } + } + Float maxtop=Math.max(maxtop1, maxtop2); + Float maxbottom=Math.max(maxbottom1, maxbottom2); + blockheight.set(blocknumber, maxtop+maxbottom); + blockdepth.set(blocknumber, maxbottom); + + maxtop1=0.0f;maxbottom1=0.0f;maxtop2=0.0f;maxbottom2=0.0f;maxtop=0.0f;maxbottom=0.0f; + liney.clear();line.clear(); + return; + } + }
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsedocument.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsedocument.java new file mode 100644 index 0000000000..fcd9b8cbd7 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsedocument.java @@ -0,0 +1,633 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.util.SparseArray; +import android.util.SparseBooleanArray; +import android.graphics.Canvas; +import android.graphics.Typeface; +import android.util.SparseIntArray; + +public class Parsedocument{ + + public static SparseBooleanArray error = new SparseBooleanArray(); + public static SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsedocument(Canvas canvas, Header header, Symbol symbol2, SuperBlock superblock, Block block, ParagraphBlock paragraphblock, Integer tid, Integer startline, Integer endline, Integer containerwidth, Integer containerheight, Boolean twocolumns, Float ypos, ArrayList<Typeface> tf) { + + ArrayList<String> superblocktype = new ArrayList<String>(); + SparseIntArray superblocknumline = new SparseIntArray(); + SparseIntArray superblockstartline = new SparseIntArray(); + SparseIntArray superblockendline = new SparseIntArray(); + SparseArray<ArrayList<String>> superblockline = new SparseArray<ArrayList<String>>(); + + int totalline=-1; + int superblocknumber=-1; + int centerstartline=0; + int alignrightstartline=0; + int centerendline=0; + int alignrightendline=0; + + int ii = 0; + int i=0; + int j=0; + int fontsize=0; + int tid2=tid*1000; + + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + int tablelinenumber=-1; + + float indent=Header.indent; + + String line; + + error.put(tid,false); + errormessage.put(tid,""); + + ArrayList<Integer> tablehlinecounter = new ArrayList<Integer>(); + + Boolean dohyphenation=true; + String columnspec =""; + + ArrayList<String> tblockline = new ArrayList<String>(); + + String sfontsize=Integer.toString(Header.fontsize); + String attribute1=""; + String attribute0=""; + String attribute2=""; + + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+"0000xff00000000+0.000xFF0000xFF000000"; + attribute1 = "000"+sfontsize+"0010xff00000000+0.000xFF0000xFF000000"; + attribute2 = "100"+sfontsize+"0000xff00000000+0.000xFF0000xFF000000"; + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+"0000xff00000000+0.000xFF0000xFF000000"; + attribute1 = "00"+sfontsize+"0010xff00000000+0.000xFF0000xFF000000"; + attribute2 = "10"+sfontsize+"0000xff00000000+0.000xFF0000xFF000000"; + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+"0000xff00000000+0.000xFF0000xFF000000"; + attribute1 = "0"+sfontsize+"0010xff00000000+0.000xFF0000xFF000000"; + attribute2 = "1"+sfontsize+"0000xff00000000+0.000xFF0000xFF000000"; + } + + for (int iii=startline;iii<=endline;iii++){ + + line=Source.lineblock.get(iii); + line.trim(); + if (line.substring(0,17).equals("!begin{lineblock}")){line=line.substring(17); line.trim();}; + j=line.indexOf("!end{lineblock}"); + if(j==-1){error.put(tid,true);errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+"The !end{lineblock} command missing, parse failed!!");return;} + + for (ii=0;j != 0; ii++){ + if (line.length()>=16 && line.substring(0,16).equals("!begin{eqnarray}") && (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + + i=line.indexOf("}",16); + columnspec=line.substring(17,i); + line=line.substring(i+1); line=line.trim(); + superblocknumber++;superblocktype.add("eqnarray");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + } else if (line.length()>=14 && line.substring(0,14).equals("!end{eqnarray}")&& !superblocktype.get(superblocknumber).equals("verbatim")){ + + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + + Parseeqnarray eqnarray = new Parseeqnarray(); + eqnarray.parseeqnarray(canvas, block, tid, containerwidth, containerheight, superblocknumber, superblock, superblockline, superblocknumline, superblockstartline, superblockendline,tf, columnspec, ypos, attribute1); + synchronized(this){error.put(tid, Parseeqnarray.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parseeqnarray.errormessage.get(tid)); return;};} + ypos=Parseeqnarray.thisypos.get(tid); + } + + line=line.substring(14); line=line.trim();superblocktype.set(superblocknumber,"text"); + j=line.indexOf("!end{lineblock}"); + tblockline.clear(); + + } else if (line.length()>=13 && line.substring(0,13).equals("!begin{table}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + synchronized(this){superblock.addtable(tid);} + i=line.indexOf("}",13); + columnspec=line.substring(14,i); + line=line.substring(i+1); line=line.trim(); + + superblocknumber++;superblocktype.add("table");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + tablehlinecounter.add(-1);tablelinenumber++; + + boolean noline=false; + for (int k=0;noline==false && k < 1000;k++){ + if (line.substring(0,6).equals("!hline")){tablehlinecounter.set(tablelinenumber, tablehlinecounter.get(tablelinenumber)+1); line=line.substring(6); line=line.trim();} + else {noline=true;}; + } + + } else if (line.length()>=11 && line.substring(0,11).equals("!end{table}")&& !superblocktype.get(superblocknumber).equals("verbatim")){ + + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + + Parsetable table = new Parsetable(); + + table.parsetable(canvas, block, paragraphblock, tid, containerwidth, containerheight, tablelinenumber, tablehlinecounter, superblocknumber, superblock, superblockline, superblocknumline, superblockstartline, superblockendline,tf, columnspec, ypos, attribute2, attribute0); + error.put(tid, Parsetable.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parsetable.errormessage.get(tid)); return;}; + ypos=Parsetable.thisypos.get(tid); + tablelinenumber=-1; + tablehlinecounter.clear(); + } + synchronized(this){totalline=SuperBlock.superblocklinenumber.get(tid);} + line=line.substring(11); line=line.trim();;superblocktype.set(superblocknumber,"text"); + j=line.indexOf("!end{lineblock}"); + tblockline.clear();tablehlinecounter.clear();tablelinenumber=-1; + + } else if (line.length()>=21 && line.substring(0,21).equals("!begin{graphicstable}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + synchronized(this){superblock.addtable(tid);} + i=line.indexOf("}",21); + columnspec=line.substring(22,i); + line=line.substring(i+1); line=line.trim(); + + superblocknumber++;superblocktype.add("graphicstable");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + tablehlinecounter.add(-1);tablelinenumber++; + + boolean noline=false; + for (int k=0;noline==false && k < 1000;k++){ + if (line.substring(0,6).equals("!hline")){tablehlinecounter.set(tablelinenumber, tablehlinecounter.get(tablelinenumber)+1); line=line.substring(6); line=line.trim();} + else {noline=true;}; + } + + } else if (line.length()>=19 && line.substring(0,19).equals("!end{graphicstable}")&& !superblocktype.get(superblocknumber).equals("verbatim")){ + + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + + Parsegraphicstable graphicstable = new Parsegraphicstable(); + + graphicstable.parsegraphicstable(canvas, block, paragraphblock, tid, containerwidth, containerheight, tablelinenumber, tablehlinecounter, superblocknumber, superblock, superblockline, superblocknumline, superblockstartline, superblockendline,tf, columnspec, ypos, attribute2, attribute0); + error.put(tid, Parsegraphicstable.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parsegraphicstable.errormessage.get(tid)); return;}; + ypos=Parsegraphicstable.thisypos.get(tid); + tablelinenumber=-1; + tablehlinecounter.clear(); + } + synchronized(this){totalline=SuperBlock.superblocklinenumber.get(tid);} + line=line.substring(19); line=line.trim();;superblocktype.set(superblocknumber,"text"); + j=line.indexOf("!end{lineblock}"); + tblockline.clear();tablehlinecounter.clear();tablelinenumber=-1; + + } else if (line.length()>=16 && line.substring(0,16).equals("!begin{equation}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + + line=line.substring(16); line=line.trim(); + superblocknumber++;superblocktype.add("equation");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + } else if (line.length()>=14 && line.substring(0,14).equals("!end{equation}")&& !superblocktype.get(superblocknumber).equals("verbatim")){ + + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + Parseequation equation = new Parseequation(); + equation.parseequation(canvas, block, tid, containerwidth, containerheight, superblocknumber, superblock, superblockline, superblocknumline, superblockstartline, superblockendline,tf, columnspec, ypos, attribute1); + error.put(tid, Parseequation.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parseequation.errormessage.get(tid)); return;}; + ypos=Parseequation.thisypos.get(tid); + } + + line=line.substring(14); line=line.trim();superblocktype.set(superblocknumber,"text"); + j=line.indexOf("!end{lineblock}"); + tblockline.clear(); + } else if (line.length()>=15 && line.substring(0,15).equals("!begin{caption}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(line.substring(0,15));} + else { + tblockline.add(line.substring(0,15)); + } + totalline++; + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(15); line=line.trim(); + + + }else if (line.length()>=13 && line.substring(0,13).equals("!end{caption}")&& !superblocktype.get(superblocknumber).equals("verbatim")) { + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(line.substring(0,13));} + else { + tblockline.add(line.substring(0,13)); + } + totalline++; + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(13); line=line.trim(); + + }else if (line.length()>=10 && line.substring(0,10).equals("!pagebreak")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))){ + + synchronized(this){SuperBlock.pagebreak.get(tid).add(SuperBlock.superblocklinenumber.get(tid)+1);} + line=line.substring(10); line=line.trim(); + + }else if (line.length()>=16 && line.substring(0,16).equals("!begin{verbatim}")) { + indent=0; + line=line.substring(16); + superblocknumber++;superblocktype.add("verbatim");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + } else if (line.length()>=14 && line.substring(0,14).equals("!end{verbatim}")){ + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + Parseverbatim verbatim = new Parseverbatim(); + verbatim.parseverbatim(canvas, block, tid, containerwidth, containerheight, superblocknumber, superblock, superblockline,(float)Header.leftsidemargin , ypos,tf, attribute2); + error.put(tid, Parseverbatim.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parseverbatim.errormessage.get(tid)); return;}; + ypos=Parseverbatim.thisypos.get(tid); + } + line=line.substring(14); line=line.trim();;superblocktype.set(superblocknumber,"text"); + j=line.indexOf("!end{lineblock}"); + tblockline.clear(); + } else if (line.length()>=13 && line.substring(0,13).equals("!begin{title}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + synchronized(this){superblock.addtitle(tid);} + indent=0; + line=line.substring(13); + superblocknumber++;superblocktype.add("title");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + } else if (line.length()>=11 && line.substring(0,11).equals("!end{title}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))){ + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + } + Parsetitle title = new Parsetitle(); + if (twocolumns){Integer containerwidth2=containerwidth*2-Header.rightsidemargin; + title.parsetitle(canvas, block, paragraphblock, tid, containerwidth2, containerheight, superblocknumber, superblock, superblockline, superblocknumline,superblockstartline,superblockendline, ypos, tf, attribute1); + } else { + title.parsetitle(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, superblockline, superblocknumline,superblockstartline,superblockendline, ypos, tf, attribute1); + } + error.put(tid, Parsetitle.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parsetitle.errormessage.get(tid)); return;}; + synchronized(this){totalline=SuperBlock.superblocklinenumber.get(tid);} + superblockendline.put(superblocknumber, totalline); + superblocktype.set(superblocknumber,"text"); + ypos=Parsetitle.thisypos.get(tid); + line=line.substring(11); line=line.trim(); + j=line.indexOf("!end{lineblock}"); + tblockline.clear(); + } else if (line.length()>=16 && line.substring(0,16).equals("!begin{graphics}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))) { + synchronized(this){superblock.addtable(tid);} + indent=0; + line=line.substring(16); + superblocknumber++;superblocktype.add("graphics");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + + } else if (line.length()>=14 && line.substring(0,14).equals("!end{graphics}")&& (superblocknumber==-1 || !superblocktype.get(superblocknumber).equals("verbatim"))){ + superblockendline.put(superblocknumber,totalline); + if (superblockendline.get(superblocknumber)>superblockstartline.get(superblocknumber)){ + superblockstartline.put(superblocknumber,superblockstartline.get(superblocknumber)+1); + } + Parsegraphics graphics = new Parsegraphics(); + graphics.parsegraphics(canvas, block, paragraphblock, tid, containerwidth, containerheight, tablelinenumber, tablehlinecounter, superblocknumber, superblock, superblockline, superblocknumline, superblockstartline, superblockendline,tf, ypos, attribute2, attribute0); + error.put(tid, Parsegraphics.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parsegraphics.errormessage.get(tid)); return;}; + superblockendline.put(superblocknumber, totalline); + superblocktype.set(superblocknumber,"text"); + ypos=Parsegraphics.thisypos.get(tid); + synchronized(this){totalline=SuperBlock.superblocklinenumber.get(tid);} + line=line.substring(14); line=line.trim(); + j=line.indexOf("!end{lineblock}"); + tblockline.clear(); + } else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("eqnarray")){ + i=line.indexOf("!!");totalline++; + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(" "+line.substring(0,i+2));} + else { + tblockline.add(" "+line.substring(0,i+2)); + } + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); line=line.trim(); + + }else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("table")){ + i=line.indexOf("!!");totalline++; + + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(" "+line.substring(0,i+2));} + else { + tblockline.add(" "+line.substring(0,i+2)); + } + superblockline.put(superblocknumber, tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); line=line.trim(); + tablelinenumber++; + tablehlinecounter.add(-1); + boolean noline=false; + for (int k=0;noline==false && k < 1000;k++){ + if (line.substring(0,6).equals("!hline")){tablehlinecounter.set(tablelinenumber, tablehlinecounter.get(tablelinenumber)+1); line=line.substring(6); line=line.trim();} + else {noline=true;}; + } + }else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("graphicstable")){ + i=line.indexOf("!!");totalline++; + + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(" "+line.substring(0,i+2));} + else { + tblockline.add(" "+line.substring(0,i+2)); + } + superblockline.put(superblocknumber, tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); line=line.trim(); + tablelinenumber++; + tablehlinecounter.add(-1); + boolean noline=false; + for (int k=0;noline==false && k < 1000;k++){ + if (line.substring(0,6).equals("!hline")){tablehlinecounter.set(tablelinenumber, tablehlinecounter.get(tablelinenumber)+1); line=line.substring(6); line=line.trim();} + else {noline=true;}; + } + }else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("equation")){ + i=line.indexOf("!!");totalline++; + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(" "+line.substring(0,i+2));} + else { + tblockline.add(" "+line.substring(0,i+2)); + } + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); line=line.trim(); + + }else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("graphics")){ + i=line.indexOf("!!");totalline++; + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(line.substring(0,i+2));} + else { + tblockline.add(line.substring(0,i+2)); + } + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); + } else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("title")){ + i=line.indexOf("!!");totalline++; + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(line.substring(0,i+2));} + else { + tblockline.add(line.substring(0,i+2)); + } + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); + } else if (superblocknumber>=0 && superblocktype.get(superblocknumber).equals("verbatim")){ + i=line.indexOf("!!");totalline++; + if (superblockline.indexOfKey(superblocknumber)>=0){ + tblockline=superblockline.get(superblocknumber); + tblockline.add(line.substring(0,i+2));} + else { + tblockline.add(line.substring(0,i+2)); + } + superblockline.put(superblocknumber,tblockline);superblocknumline.put(superblocknumber,superblocknumline.get(superblocknumber)+1); + line=line.substring(i+2); + } else if (line.length()>=3 && line.substring(0,3).equals("!mo")){ + + attribute2=attribute2.substring(0,4)+"003"+attribute2.substring(7); + line=line.substring(3); line=line.trim(); + j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=3 && line.substring(0,3).equals("!bf")){ + + attribute2=attribute2.substring(0,4)+"002"+attribute2.substring(7); + line=line.substring(3); line=line.trim(); + j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=3 && line.substring(0,3).equals("!it")){ + + attribute2=attribute2.substring(0,4)+"001"+attribute2.substring(7); + line=line.substring(3); line=line.trim(); + j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=3 && line.substring(0,3).equals("!ss")){ + + attribute2=attribute2.substring(0,4)+"000"+attribute2.substring(7); + line=line.substring(3); line=line.trim(); + j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=5 && line.substring(0,5).equals("!Huge")){ + fontsize=(int)(Header.fontsize*Header.sizefactor.get("Huge"));if (fontsize>Header.maxfontsize){fontsize=Header.maxfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(5); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=5 && line.substring(0,5).equals("!huge")){ + + fontsize=(int)(Header.fontsize*Header.sizefactor.get("huge"));if (fontsize>Header.maxfontsize){fontsize=Header.maxfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(5); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=6 && line.substring(0,6).equals("!Large")){ + + fontsize=(int)(Header.fontsize*Header.sizefactor.get("Large"));if (fontsize>Header.maxfontsize){fontsize=Header.maxfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(6); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=6 && line.substring(0,6).equals("!large")){ + + fontsize=(int)(Header.fontsize*Header.sizefactor.get("large"));if (fontsize>Header.maxfontsize){fontsize=Header.maxfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(6); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=6 && line.substring(0,6).equals("!small")){ + + fontsize=(int)(Header.fontsize*Header.sizefactor.get("small"));if (fontsize<Header.minfontsize){fontsize=Header.minfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(6); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=11 && line.substring(0,11).equals("!scriptsize")){ + + fontsize=(int)(Header.fontsize*Header.sizefactor.get("scriptsize"));if (fontsize<Header.minfontsize){fontsize=Header.minfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(11); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=5 && line.substring(0,5).equals("!tiny")){ + + fontsize=(int)(Header.fontsize*Header.sizefactor.get("tiny")); if (fontsize<Header.minfontsize){fontsize=Header.minfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(5); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=11 && line.substring(0,11).equals("!normalsize")){ + + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute0 = "000"+sfontsize+attribute0.substring(4); + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==2){ + attribute0 = "00"+sfontsize+attribute0.substring(4); + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+attribute2.substring(4); + } else if (sfontsize.length()==3){ + attribute0 = "0"+sfontsize+attribute0.substring(4); + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+attribute2.substring(4); + } + line=line.substring(11); line=line.trim();j=line.indexOf("!end{lineblock}"); + } else if (line.length()>=7 && line.substring(0,7).equals("!vspace")){ + + int ij=line.indexOf("}",7); + float vspace=Integer.parseInt(line.substring(8,ij)); + ypos=ypos+vspace; + line=line.substring(ij+1); line=line.trim(); + + } else if (line.length()>=14 && line.substring(0,14).equals("!begin{center}")){ + synchronized(this){centerstartline=SuperBlock.superblocklinenumber.get(tid);} + dohyphenation=false; + line=line.substring(14); line=line.trim();j=line.indexOf("!end{lineblock}"); + indent=0; + } else if (line.length()>=12 && line.substring(0,12).equals("!end{center}")){ + synchronized(this){ + viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + centerendline=SuperBlock.superblocklinenumber.get(tid); + + if (centerendline > centerstartline){centerstartline=centerstartline+1;}; + for (i=centerstartline;i<=centerendline;i++){ + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + } + dohyphenation=true; + line=line.substring(12); line=line.trim();j=line.indexOf("!end{lineblock}"); + indent=Header.indent; + } + } else if (line.length()>=17 && line.substring(0,17).equals("!begin{alignleft}")){ + indent=0; + dohyphenation=false; + line=line.substring(17); line=line.trim(); + + } else if (line.length()>=15 && line.substring(0,15).equals("!end{alignleft}")){ + dohyphenation=true; + line=line.substring(15); line=line.trim();j=line.indexOf("!end{lineblock}"); + + } else if (line.length()>=18 && line.substring(0,18).equals("!begin{alignright}")){ + indent=0; + synchronized(this){alignrightstartline=SuperBlock.superblocklinenumber.get(tid);} + dohyphenation=false; + line=line.substring(18); line=line.trim(); + indent=0; + } else if (line.length()>=16 && line.substring(0,16).equals("!end{alignright}")){ + synchronized(this){ + viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + alignrightendline=SuperBlock.superblocklinenumber.get(tid); + + if (alignrightendline > alignrightstartline){alignrightstartline=alignrightstartline+1;}; + for (i=alignrightstartline;i<=alignrightendline;i++){ + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i)); + for (ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + } + dohyphenation=true; + line=line.substring(16); line=line.trim();j=line.indexOf("!end{lineblock}"); + indent=Header.indent; + } + } else { + i=line.indexOf("!!"); + + tblockline.add(line.substring(0,i)); + totalline++; + superblocknumber++;superblockline.put(superblocknumber,tblockline);superblocktype.add("text");superblocknumline.put(superblocknumber,0); + superblockstartline.put(superblocknumber, totalline); + Parsetext text = new Parsetext(); + text.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, tblockline.get(0), (float)Header.leftsidemargin , ypos, tf, attribute2, attribute1, dohyphenation, indent); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+Parsetext.errormessage.get(tid)); return;}; + synchronized(this){totalline=SuperBlock.superblocklinenumber.get(tid);} + superblockendline.put(superblocknumber, totalline); + ypos=Parsetext.thisypos.get(tid); + + tblockline.clear(); + line=line.substring(i+2); line=line.trim(); + } + j=line.indexOf("!end{lineblock}"); + if (j==0 && !superblocktype.get(superblocknumber).equals("text")){error.put(tid,true);errormessage.put(tid, "Lineblock "+Integer.toString(iii)+" : "+"The !end{"+superblocktype.get(superblocknumber)+"} "+"command missing, parse failed!!");return;} + } + } + + synchronized(this){SuperBlock.ypos.put(tid, ypos);} + return; + + }} diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseeqnarray.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseeqnarray.java new file mode 100644 index 0000000000..05d44a63ed --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseeqnarray.java @@ -0,0 +1,139 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.util.SparseBooleanArray; + +public class Parseeqnarray { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parseeqnarray(Canvas canvas, Block block, Integer tid, Integer containerwidth, Integer containerheight, int superblocknumber, SuperBlock superblock ,SparseArray<ArrayList<String>> superblockline,SparseIntArray superblocknumline,SparseIntArray superblockstartline, SparseIntArray superblockendline, ArrayList<Typeface> tf , String columnspec, Float ypos, String attribute) { + + int i,j,ii; + int numcolumn = columnspec.length(); + int tid2=tid*1000; + + float linegap = Header.linegap; + float columngap=Header.columngap; + float totalwidth=0; + float adjusty=ypos; + float adjustx=0; + float adjustx2=0; + float shiftx=0; + + String blockline = new String(); + String rawblockline = new String(); + String thisattribute=attribute; + + ArrayList<Float> columnwidth = new ArrayList<Float>(); + ArrayList<Float> lineheight = new ArrayList<Float>(); + ArrayList<Float> linedepth = new ArrayList<Float>(); + + ArrayList<Float> blockwidth = new ArrayList<Float>(); + ArrayList<Float> blockheight = new ArrayList<Float>(); + ArrayList<Float> blockdepth = new ArrayList<Float>(); + + columnwidth.clear();lineheight.clear();linedepth.clear(); + error.put(tid,false); + errormessage.put(tid,""); + + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Integer.parseInt(attribute.substring(1,4))); + textpaint.setTypeface(tf.get(Integer.parseInt(attribute.substring(4,7)))); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + float spacewidth=textpaint.measureText(" "); + float spaceheight=textbounds.height(); + float spacedepth=textbounds.bottom; + + for (i=0;i<=superblockendline.get(superblocknumber)-superblockstartline.get(superblocknumber);i++){ + lineheight.add(0.0f); + linedepth.add(0.0f); + synchronized(this){superblock.create(tid);} + + String currentsuperblockline=superblockline.get(superblocknumber).get(i); + + for (ii=0;ii<=numcolumn-1;ii++){ // First parse + if (i==0) columnwidth.add(0.0f); + if (ii<=numcolumn-2){ + j=currentsuperblockline.indexOf("&"); + if (j<0){error.put(tid, true);errormessage.put(tid, "Format error in eqnarray, parse failed !!");return;}; + rawblockline=currentsuperblockline.substring(0,j); currentsuperblockline=currentsuperblockline.substring(j+1); + + if (rawblockline.equals("")){rawblockline="!dno ";}; + } else { + rawblockline=currentsuperblockline; + if (rawblockline.equals("")){rawblockline="!dno ";}; + } + + Parsepreparation prepareblockline = new Parsepreparation(); + blockline=prepareblockline.parsepreparation(rawblockline,Symbol.symboltype,Symbol.matchsymbol); + + Parseblock parseblockline = new Parseblock(); + parseblockline.parseblock(tid,canvas,block,blockline,tf,thisattribute); + if (Block.error.get(tid)==true){error.put(tid, true); errormessage.put(tid,Block.errormessage.get(tid)); return;}; + blockwidth.add(Math.max(Block.blockwidth2.get(tid),spacewidth)); + blockheight.add(Math.max(Block.blockheight2.get(tid),spaceheight)); + blockdepth.add(Math.max(Block.blockdepth2.get(tid),spacedepth)); + + synchronized(this){superblock.add(tid,Block.subblock2, Block.subblockxpos2, Block.subblockypos2, Block.subblockattribute2, blockwidth.get(blockwidth.size()-1), blockheight.get(blockheight.size()-1), blockdepth.get(blockdepth.size()-1),'e',ii);} + columnwidth.set(ii,Math.max(columnwidth.get(ii), blockwidth.get(blockwidth.size()-1))); + } + } + + i=superblockstartline.get(superblocknumber); + int index=tid2+i; + adjusty=adjusty+SuperBlock.superblocklineheight.get(tid).get(i)-SuperBlock.superblocklinedepth.get(tid).get(i); + for (ii=0;ii<=SuperBlock.blockatom.get(index).size()-1;ii++){ + SuperBlock.blockypos.get(index).set(ii, SuperBlock.blockypos.get(index).get(ii)+adjusty); + } + thisypos.put(tid, adjusty+SuperBlock.superblocklinedepth.get(tid).get(i)+linegap); + for (i=superblockstartline.get(superblocknumber)+1;i<=superblockstartline.get(superblocknumber)+superblocknumline.get(superblocknumber)-1;i++){ + index=tid2+i; + adjusty=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-1)+linegap+SuperBlock.superblocklineheight.get(tid).get(i)-SuperBlock.superblocklinedepth.get(tid).get(i); + for (ii=0;ii<=SuperBlock.blockatom.get(index).size()-1;ii++){ + SuperBlock.blockypos.get(index).set(ii, SuperBlock.blockypos.get(index).get(ii)+adjusty); + } + thisypos.put(tid, adjusty+SuperBlock.superblocklinedepth.get(tid).get(i)+linegap); + } + + for (ii=0;ii<=numcolumn-1;ii++){ + totalwidth=totalwidth+columnwidth.get(ii)+columngap; + } + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + + if (viewportwidth>totalwidth){shiftx=(viewportwidth-totalwidth)/2;} + else {shiftx=0;}; + + for (i=superblockstartline.get(superblocknumber);i<=superblockendline.get(superblocknumber);i++){ + adjustx=shiftx+Header.leftsidemargin; + int columnnum=0; + index=tid2+i; + for (ii=0;ii<=SuperBlock.blockatom.get(index).size()-1;ii++){ + if (columnnum != SuperBlock.blockcolumnnum.get(index).get(ii)){ + columnnum=SuperBlock.blockcolumnnum.get(index).get(ii); + adjustx=adjustx+columngap+columnwidth.get(columnnum-1); + }; + + if (columnspec.charAt(columnnum)=='l'){SuperBlock.blockxpos.get(index).set(ii, SuperBlock.blockxpos.get(index).get(ii)+adjustx);} + else if (columnspec.charAt(columnnum)=='c'){adjustx2=(columnwidth.get(columnnum)-blockwidth.get((i-superblockstartline.get(superblocknumber))*numcolumn+columnnum))/2; SuperBlock.blockxpos.get(index).set(ii, SuperBlock.blockxpos.get(index).get(ii)+adjustx+adjustx2);} + else if (columnspec.charAt(columnnum)=='r'){adjustx2=columnwidth.get(columnnum)-blockwidth.get((i-superblockstartline.get(superblocknumber))*numcolumn+columnnum);SuperBlock.blockxpos.get(index).set(ii, SuperBlock.blockxpos.get(index).get(ii)+adjustx+adjustx2);};} + } + +}} + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseequation.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseequation.java new file mode 100644 index 0000000000..b81daea42d --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseequation.java @@ -0,0 +1,89 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.util.SparseBooleanArray; + +public class Parseequation { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parseequation(Canvas canvas, Block block, Integer tid, Integer containerwidth, Integer containerheight, Integer superblocknumber, SuperBlock superblock ,SparseArray<ArrayList<String>> superblockline,SparseIntArray superblocknumline,SparseIntArray superblockstartline, SparseIntArray superblockendline, ArrayList<Typeface> tf ,String columnspec, Float ypos, String attribute) { + + int ii; + + float linegap = Header.linegap; + float adjusty=ypos; + float shiftx=0; + float columnwidth=0; + + String blockline = new String(); + String rawblockline = new String(); + String thisattribute=attribute; + + ArrayList<Float> lineheight = new ArrayList<Float>(); + ArrayList<Float> linedepth = new ArrayList<Float>(); + + error.put(tid,false); + errormessage.put(tid,""); + + float blockwidth = 0.0f; + float blockheight = 0.0f; + float blockdepth = 0.0f; + + lineheight.clear();linedepth.clear(); + + lineheight.add(0.0f); + linedepth.add(0.0f); + synchronized(this){superblock.create(tid);} + + String currentsuperblockline=superblockline.get(superblocknumber).get(0); + + rawblockline=currentsuperblockline; + if (rawblockline.equals("")){rawblockline=" ";}; + + Parsepreparation prepareblockline = new Parsepreparation(); + blockline=prepareblockline.parsepreparation(rawblockline,Symbol.symboltype,Symbol.matchsymbol); + Parseblock parseblockline = new Parseblock(); + parseblockline.parseblock(tid,canvas,block, blockline,tf,thisattribute); + + if (Block.error.get(tid)==true){error.put(tid, true); errormessage.put(tid, Block.errormessage.get(tid)); } + columnwidth=Block.blockwidth2.get(tid); + blockwidth=Block.blockwidth2.get(tid); + blockheight=Block.blockheight2.get(tid)+linegap; + blockdepth=Block.blockdepth2.get(tid)+linegap; + + + adjusty=adjusty+blockheight-blockdepth; + thisypos.put(tid, adjusty+blockdepth+linegap); + for (ii=0;ii<=Block.subblock2.get(tid).size()-1;ii++){ + Block.subblockypos2.get(tid).set(ii, Block.subblockypos2.get(tid).get(ii)+adjusty); + } + + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + + if (viewportwidth>columnwidth){shiftx=(viewportwidth-columnwidth)/2;} + else {shiftx=0;}; + + for (ii=0;ii<=Block.subblock2.get(tid).size()-1;ii++){ + Block.subblockxpos2.get(tid).set(ii, Block.subblockxpos2.get(tid).get(ii)+shiftx+Header.leftsidemargin); + } + synchronized(this){ + superblock.add(tid,Block.subblock2,Block.subblockxpos2, Block.subblockypos2, Block.subblockattribute2, blockwidth, blockheight, blockdepth,'e',0); + } +}} + + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsegraphics.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsegraphics.java new file mode 100644 index 0000000000..0fb5b3108e --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsegraphics.java @@ -0,0 +1,162 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.util.SparseBooleanArray; + +public class Parsegraphics { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsegraphics(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, Integer tablelinenumber, ArrayList<Integer> tablehlinecounter, Integer superblocknumber, SuperBlock superblock ,SparseArray<ArrayList<String>> superblockline,SparseIntArray superblocknumline, SparseIntArray superblockstartline, SparseIntArray superblockendline, ArrayList<Typeface> tf , Float ypos, String attribute2, String attribute) { + + int i,j; + int tid2=tid*1000; + int captionnumline=-1; + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + + float adjusty=ypos; + float adjustx=0.0f; + float thisypos2=0; + + String currentline=""; + String bitmapname=""; + + + ArrayList<String> captionline = new ArrayList<String>(); + + error.put(tid,false); + errormessage.put(tid,""); + + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Integer.parseInt(attribute.substring(1,4))); + textpaint.setTypeface(tf.get(Integer.parseInt(attribute.substring(4,7)))); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + + Boolean captionattop=false; + int tablefirstline=superblockstartline.get(superblocknumber); + int lastline=superblockendline.get(superblocknumber)-superblockstartline.get(superblocknumber); + String sfontsize; + + for (i=0;i<=lastline;i++){ + + currentline=superblockline.get(superblocknumber).get(i); + String line=currentline.trim(); + + if (line.length() >=15 && line.substring(0,15).equals("!begin{caption}")){ + if (i==0){captionattop=true;} else {captionattop=false;}; + + Boolean caption=true; + i++; + currentline=superblockline.get(superblocknumber).get(i); + line=currentline.trim(); + if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;captionnumline++;} + + while(caption){ + j=line.indexOf("!!"); + line=line.substring(0,j); + + captionline.add(line); + i++;captionnumline++; + currentline=superblockline.get(superblocknumber).get(i); + line=currentline.trim(); + if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;} + } + tablelinenumber=tablelinenumber-captionnumline-1; + if(captionattop){tablefirstline=i+tablefirstline; + currentline=superblockline.get(superblocknumber).get(i);} + } } + +// Add top caption + SuperBlock.tablestartline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)+1); + if (captionattop){ + Parsetext caption = new Parsetext(); + for (i=0;i<=captionnumline;i++){ + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + caption.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , adjusty, tf, attribute2, attribute, false, 0.0f); + thisypos2=Parsetext.thisypos.get(tid); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; + for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ + SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); + } + adjusty=Parsetext.thisypos.get(tid); + thisypos.put(tid,adjusty); + }} + + if (!captionattop){ + currentline=superblockline.get(superblocknumber).get(0); + } else { + currentline=superblockline.get(superblocknumber).get(i+captionnumline+1); + } + + currentline=currentline.trim(); + j=currentline.indexOf("!!"); + bitmapname=currentline.substring(0,j); + if (!DocumentBitmap.usedbitmap.contains(bitmapname)){ + DocumentBitmap.usedbitmap.add(bitmapname);} + ArrayList<String> tsubblock = new ArrayList<String>(); + ArrayList<Float> tsubblockxpos = new ArrayList<Float>(); + ArrayList<Float> tsubblockypos = new ArrayList<Float>(); + ArrayList<String> tsubblockattribute = new ArrayList<String>(); + + tsubblock.add(bitmapname); + tsubblockxpos.add((containerwidth-DocumentBitmap.bitmapwidth.get(bitmapname))/2); + tsubblockypos.add(adjusty); + tsubblockattribute.add("g"); + + synchronized(this){ + superblock.create(tid); + superblock.add(tid,tsubblock,tsubblockxpos,tsubblockypos,tsubblockattribute,DocumentBitmap.bitmapwidth.get(bitmapname) , DocumentBitmap.bitmapheight.get(bitmapname), 0.0f,'t',0); + } + thisypos2 = adjusty+DocumentBitmap.bitmapheight.get(bitmapname)+Header.linegap; + thisypos.put(tid,thisypos2); + + if (!captionattop){ + Parsetext caption = new Parsetext(); + for (i=0;i<=captionnumline;i++){ + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + caption.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , thisypos2, tf, attribute2, attribute, false, 0.0f); + thisypos2=Parsetext.thisypos.get(tid); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; + for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ + SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); + } + thisypos.put(tid,Parsetext.thisypos.get(tid)); + }} + SuperBlock.tableendline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)); + SuperBlock.tableheight.put(tid2+SuperBlock.tablenumber.get(tid),thisypos.get(tid)-ypos); +}} + + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsegraphicstable.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsegraphicstable.java new file mode 100644 index 0000000000..881a3ee285 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsegraphicstable.java @@ -0,0 +1,505 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.util.SparseBooleanArray; + +public class Parsegraphicstable { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsegraphicstable(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, Integer tablelinenumber, ArrayList<Integer> tablehlinecounter, Integer superblocknumber, SuperBlock superblock ,SparseArray<ArrayList<String>> superblockline,SparseIntArray superblocknumline,SparseIntArray superblockstartline, SparseIntArray superblockendline, ArrayList<Typeface> tf , String columnspec, Float ypos, String attribute2, String attribute) { + + int i,j,ii; + int k=0; + int tid2=tid*1000; + int captionnumline=-1; + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + int adjustline=0; + + float linegap = Header.linegap; + float columngap=Header.columngap; + float totalwidth=0.0f; + float adjusty=ypos; + float adjustx=0.0f; + float adjustx2=0.0f; + float shiftx=0.0f; + float thisypos2=0; + + String rawblockline = new String(); + String thisattribute=attribute; + String columnspec2=new String(); + String currentline=""; + String bitmapname=""; + + ArrayList<Float> columnwidth = new ArrayList<Float>(); + ArrayList<Float> lineheight = new ArrayList<Float>(); + ArrayList<Float> linedepth = new ArrayList<Float>(); + + ArrayList<Float> blockwidth = new ArrayList<Float>(); + ArrayList<Float> blockheight = new ArrayList<Float>(); + ArrayList<Float> blockdepth = new ArrayList<Float>(); + ArrayList<Integer> tablevlinecounter = new ArrayList<Integer>(); + ArrayList<String> captionline = new ArrayList<String>(); + + ArrayList<String> tatom = new ArrayList<String>(); + ArrayList<Float> txpos = new ArrayList<Float>(); + ArrayList<Float> typos = new ArrayList<Float>(); + ArrayList<String> tattribute = new ArrayList<String>(); + + error.put(tid,false); + errormessage.put(tid,""); + + columnspec2=""; + int tablehlinenumber=-1; + for (i=0;i<=tablelinenumber;i++){ + tablehlinenumber=tablehlinenumber+(tablehlinecounter.get(i)+1); + } + tablevlinecounter.add(-1); + for (i=0;i<=columnspec.length()-1;i++){ + if (columnspec.charAt(i)=='|') {tablevlinecounter.set(tablevlinecounter.size()-1,tablevlinecounter.get(tablevlinecounter.size()-1)+1);} + else if (columnspec.charAt(i)=='l' || columnspec.charAt(i)=='r' || columnspec.charAt(i)=='c'){columnspec2=columnspec2+columnspec.charAt(i); tablevlinecounter.add(-1);} + } + int numcolumn = columnspec2.length(); + + + columnwidth.clear();lineheight.clear();linedepth.clear(); + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Integer.parseInt(attribute.substring(1,4))); + textpaint.setTypeface(tf.get(Integer.parseInt(attribute.substring(4,7)))); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + float spacewidth=textpaint.measureText(" "); + float spaceheight=textbounds.height(); + Boolean captionattop=false; + int tablefirstline=superblockstartline.get(superblocknumber); + int tablelastline=superblockendline.get(superblocknumber); + int lastline=superblockendline.get(superblocknumber)-superblockstartline.get(superblocknumber); + String sfontsize; + + for (i=0;i<=lastline;i++){ + + currentline=superblockline.get(superblocknumber).get(i); + String line=currentline.trim(); + + if (line.length() >=15 && line.substring(0,15).equals("!begin{caption}")){ + if (i==0){captionattop=true;adjustline=2;} else {captionattop=false;adjustline=0;}; + + Boolean caption=true; + i++; + currentline=superblockline.get(superblocknumber).get(i); + line=currentline.trim(); + if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;captionnumline++;} + + while(caption){ + j=line.indexOf("!!"); + line=line.substring(0,j); + + captionline.add(line); + i++;captionnumline++; + currentline=superblockline.get(superblocknumber).get(i); + line=currentline.trim(); + if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;} + } + tablelinenumber=tablelinenumber-captionnumline-1; + if(captionattop){tablefirstline=i+tablefirstline; + currentline=superblockline.get(superblocknumber).get(i);} + else {tablelastline=tablefirstline+tablelinenumber-1;} + } } + +// Add top caption +// SuperBlock.graphicsstartline.put(tid2+SuperBlock.graphicsnumber.get(tid), SuperBlock.superblocklinenumber.get(tid)+1); + SuperBlock.tablestartline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)+1); + if (captionattop){ + Parsetext table = new Parsetext(); + for (i=0;i<=captionnumline;i++){ + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + table.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , adjusty, tf, attribute2, attribute, false, 0.0f); + thisypos2=Parsetext.thisypos.get(tid); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; + for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ + SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); + } + adjusty=Parsetext.thisypos.get(tid); + thisypos.put(tid,adjusty); + }} + Boolean firstline=true; + for (i=tablefirstline;i<=tablelastline;i++){ + + if (!captionattop){ + currentline=superblockline.get(superblocknumber).get(i-tablefirstline); + j=currentline.indexOf("!!"); + if (j!=-1){currentline=currentline.substring(0,j);} + } else { + currentline=superblockline.get(superblocknumber).get(i-tablefirstline+captionnumline+3); + j=currentline.indexOf("!!"); + if (j!=-1){currentline=currentline.substring(0,j);} + } + + lineheight.add(0.0f); + linedepth.add(0.0f); + synchronized(this){superblock.create(tid); } + for (ii=0;ii<=numcolumn-1;ii++){ // First parse + if (firstline) columnwidth.add(0.0f); + if (ii<=numcolumn-2){ + j=currentline.indexOf("&"); + + if (j<0){error.put(tid, true);errormessage.put(tid, "Format error in table, parse failed !!");return;}; + rawblockline=currentline.substring(0,j); currentline=currentline.substring(j+1); + + if (rawblockline.equals("")){rawblockline="!dno ";}; + } else { + rawblockline=currentline; + if (rawblockline.equals("")){rawblockline="!dno ";}; + } + + rawblockline=rawblockline.trim(); + bitmapname=rawblockline; + + ArrayList<String> tsubblock = new ArrayList<String>(); + ArrayList<Float> tsubblockxpos = new ArrayList<Float>(); + ArrayList<Float> tsubblockypos = new ArrayList<Float>(); + ArrayList<String> tsubblockattribute = new ArrayList<String>(); + + + if (!bitmapname.equals("!dno")){ + if (!DocumentBitmap.usedbitmap.contains(bitmapname)){ + DocumentBitmap.usedbitmap.add(bitmapname);} + + tsubblock.add(bitmapname); + tsubblockxpos.add(0.0f); + tsubblockypos.add(-DocumentBitmap.bitmapheight.get(bitmapname)); + tsubblockattribute.add("g"); + float width=Math.max(DocumentBitmap.bitmapwidth.get(bitmapname), spacewidth); + float height=Math.max(DocumentBitmap.bitmapheight.get(bitmapname), spaceheight); + blockwidth.add(width); + blockheight.add(height); + blockdepth.add(0.0f); + columnwidth.set(ii,Math.max(columnwidth.get(ii), width)); + superblock.add(tid,tsubblock,tsubblockxpos,tsubblockypos,tsubblockattribute,width , height, 0.0f,'t',ii); + } else { + tsubblock.add(bitmapname); + tsubblockxpos.add(0.0f); + tsubblockypos.add(0.0f); + tsubblockattribute.add(Header.defaultattribute); + columnwidth.set(ii,Math.max(columnwidth.get(ii), spacewidth)); + synchronized(this){ + superblock.add(tid,tsubblock,tsubblockxpos,tsubblockypos,tsubblockattribute,spacewidth ,spaceheight, 0.0f,'t',0);} + } + } + } + firstline=false; + +// add vertical lines + int totalvline=0; + for (ii=0;ii<=numcolumn;ii++){ + tatom = new ArrayList<String>(); + txpos = new ArrayList<Float>(); + typos = new ArrayList<Float>(); + tattribute = new ArrayList<String>(); + for (k=0;k<=tablevlinecounter.get(ii);k++){ + tatom.add("!vlin "); + txpos.add(0.0f); + typos.add(0.0f); + tattribute.add(attribute); + totalvline++; + } + synchronized(this){ + superblock.add(tid,tatom,txpos, typos, tattribute,0.0f,0.0f,0.0f,'t',numcolumn-1);} + tatom.clear(); + txpos.clear(); + typos.clear(); + tattribute.clear(); + } +// add horizontal lines + int totalhline=0; + if (!captionattop){ + for (ii=0; ii<=tablelastline-tablefirstline+1;ii++){ + tatom = new ArrayList<String>(); + txpos = new ArrayList<Float>(); + typos = new ArrayList<Float>(); + tattribute = new ArrayList<String>(); + for (k=0;k<=tablehlinecounter.get(ii);k++){ + totalhline++; + tatom.add("!hlin "); + txpos.add(0.0f); + typos.add(0.0f); + tattribute.add(attribute); + } + synchronized(this){ + superblock.add(tid,tatom,txpos, typos, tattribute,0.0f,0.0f,0.0f,'t',numcolumn-1);} + tatom.clear(); + txpos.clear(); + typos.clear(); + tattribute.clear(); + } + } else { + for (ii=0;ii<=tablelastline-tablefirstline+captionnumline+2 ;ii++){ + if (!(ii>=1 && ii <=captionnumline+1)){ + tatom = new ArrayList<String>(); + txpos = new ArrayList<Float>(); + typos = new ArrayList<Float>(); + tattribute = new ArrayList<String>(); + for (k=0;k<=tablehlinecounter.get(ii);k++){ + totalhline++; + tatom.add("!hlin "); + txpos.add(0.0f); + typos.add(0.0f); + tattribute.add(attribute); + } + synchronized(this){ + superblock.add(tid,tatom,txpos, typos, tattribute,0.0f,0.0f,0.0f,'t',numcolumn-1);} + tatom.clear(); + txpos.clear(); + typos.clear(); + tattribute.clear(); + } } + for (i=1;i<=tablelastline-tablefirstline+1;i++){tablehlinecounter.set(i,tablehlinecounter.get(i+captionnumline+1));} + } + +// determine vertical height of table and assign ypos of horizontal lines + +// first line + i=tablefirstline-adjustline; + int index=SuperBlock.blockypos.get(tablelastline+tid2-adjustline).size()-(tablehlinenumber+1); + for (k=0;k<=tablehlinecounter.get(0);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, adjusty); + + adjusty=adjusty+linegap; + } + adjusty=adjusty+SuperBlock.superblocklineheight.get(tid).get(i)-SuperBlock.superblocklinedepth.get(tid).get(i); + int l=0; + if(tablefirstline==tablelastline){ + l=totalhline+totalvline; + } + for (ii=0;ii<=SuperBlock.blockatom.get(i+tid2).size()-1-l;ii++){ + SuperBlock.blockypos.get(i+tid2).set(ii, SuperBlock.blockypos.get(i+tid2).get(ii)+adjusty); + } + thisypos2=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i)+linegap; + // middle line + + for (i=tablefirstline+1;i<=tablelastline-1;i++){ + index=index+k; + + for (k=0;k<=tablehlinecounter.get(i-tablefirstline);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, thisypos2); + thisypos2=thisypos2+linegap; + adjusty=adjusty+linegap; + } + + adjusty=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-1-adjustline)+linegap+SuperBlock.superblocklineheight.get(tid).get(i-adjustline)-SuperBlock.superblocklinedepth.get(tid).get(i-adjustline); + for (ii=0;ii<=SuperBlock.blockatom.get(i+tid2-adjustline).size()-1;ii++){ + SuperBlock.blockypos.get(i+tid2-adjustline).set(ii, SuperBlock.blockypos.get(i+tid2-adjustline).get(ii)+adjusty); + } + thisypos2=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-adjustline)+linegap; + } +// last line + if (tablelastline > tablefirstline){ + i=tablelastline-adjustline; + index=index+k; + + for (k=0;k<=tablehlinecounter.get(i-tablefirstline+adjustline);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, thisypos2); + thisypos2=thisypos2+linegap; + adjusty=adjusty+linegap; + } + + adjusty=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-1)+linegap+SuperBlock.superblocklineheight.get(tid).get(i)-SuperBlock.superblocklinedepth.get(tid).get(i); + for (ii=0;ii<=SuperBlock.blockatom.get(i+tid2).size()-1-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length());ii++){ + SuperBlock.blockypos.get(i+tid2).set(ii, SuperBlock.blockypos.get(i+tid2).get(ii)+adjusty); + } + thisypos2=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i); + + if (tablehlinecounter.get(tablelinenumber)>=0) + { + thisypos2=thisypos2+linegap; + index=index+k; + for (k=0;k<=tablehlinecounter.get(tablelinenumber);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, thisypos2); + thisypos2=thisypos2+linegap; + } + } else { + thisypos2=thisypos2+linegap; + } + thisypos2=thisypos2-linegap; + } + +// assign vertical lines height + + index=SuperBlock.blockatom.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length()); + float temp=thisypos2-adjusty; + sfontsize=Integer.toString((int)temp); + int is=sfontsize.length(); + for (k=0;k<=columnspec.length()-columnspec2.length()-1;k++){ + if (is==1){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + } + + +// determine total width of table + + for (ii=0;ii<=numcolumn-1;ii++){ + totalwidth=totalwidth+columnwidth.get(ii)+columngap+(columngap*(tablevlinecounter.get(ii)+1)); + } + if (tablevlinecounter.get(numcolumn)>=0){ + totalwidth=totalwidth+(columngap*(tablevlinecounter.get(numcolumn))); + } + + if (viewportwidth>totalwidth){shiftx=(viewportwidth-totalwidth)/2;} + else {shiftx=0;}; + + for (i=tablefirstline-adjustline;i<=tablelastline-adjustline;i++){ + +// assign xpos of first column + + adjustx=shiftx+Header.leftsidemargin; + int columnnum=0; + int iistart=0; + + index=SuperBlock.blockatom.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length()); + for (k=0; k<=tablevlinecounter.get(0);k++){ + if (i==tablelastline-adjustline){SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index,adjustx);SuperBlock.blockypos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisypos2);} + adjustx=adjustx+columngap; + } + index=index+tablevlinecounter.get(0)+1; + + int index2=i+tid2; + l=0; + if (i==tablelastline-adjustline){l=totalvline+totalhline;} + for (ii=0;SuperBlock.blockcolumnnum.get(index2).size()>= ii+1+l && SuperBlock.blockcolumnnum.get(index2).get(ii)==0;ii++){ + if (columnspec2.charAt(columnnum)=='l'){SuperBlock.blockxpos.get(index2).set(ii, SuperBlock.blockxpos.get(index2).get(ii)+adjustx);} + else if (columnspec2.charAt(columnnum)=='c'){adjustx2=(columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum))/2; + SuperBlock.blockxpos.get(index2).set(ii, SuperBlock.blockxpos.get(index2).get(ii)+adjustx+adjustx2);} + else if (columnspec2.charAt(columnnum)=='r'){adjustx2=columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum); + SuperBlock.blockxpos.get(index2).set(ii, SuperBlock.blockxpos.get(index2).get(ii)+adjustx+adjustx2);}; + columnnum=0; + } + iistart=ii; + + // assign xpos of all columns + + for (columnnum=1;columnnum<=numcolumn-1;columnnum++){ + + boolean endofcolumn=false; + adjustx=adjustx+columngap+columnwidth.get(columnnum-1); + +// assign xpos and ypos of vertical lines + + for (k=0; k<=tablevlinecounter.get(columnnum);k++){ + if (i==tablelastline-adjustline){SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index,adjustx);SuperBlock.blockypos.get(SuperBlock.superblocklinenumber.get(tid)+tid*100).set(k+index, thisypos2);} + adjustx=adjustx+columngap; + } + index=index+tablevlinecounter.get(columnnum)+1; + index2=0; + if (i==SuperBlock.superblocklinenumber.get(tid)){ + index2=SuperBlock.blockcolumnnum.get(i+tid2).size()-1-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length()); + } else { + index2=SuperBlock.blockcolumnnum.get(i+tid2).size()-1; + } + for (ii=iistart;endofcolumn==false && ii <=index2;ii++){ + if (columnnum == SuperBlock.blockcolumnnum.get(i+tid2).get(ii)){ + + if (columnspec2.charAt(columnnum)=='l'){SuperBlock.blockxpos.get(i+tid2).set(ii, SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx);} + else if (columnspec2.charAt(columnnum)=='c'){adjustx2=(columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum))/2; + SuperBlock.blockxpos.get(i+tid2).set(ii, SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx+adjustx2);} + else if (columnspec2.charAt(columnnum)=='r'){adjustx2=columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum); + SuperBlock.blockxpos.get(i+tid2).set(ii, SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx+adjustx2);}; + } else { + endofcolumn=true; + iistart=ii; + } + } + } + +// assign xpos and ypos of last vertical lines +// if (numcolumn > 1){ + adjustx=adjustx+columngap+columnwidth.get(numcolumn-1); + for (k=0; k<=tablevlinecounter.get(numcolumn);k++){ + if (i==tablelastline-adjustline){SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index,adjustx);SuperBlock.blockypos.get(SuperBlock.superblocklinenumber.get(tid)+tid*100).set(k+index, thisypos2);} + adjustx=adjustx+columngap; + } +// } +// assign xpos and width of all horizontal lines + index=SuperBlock.blockcolumnnum.get(i+tid2).size()-(tablehlinenumber+1); + + sfontsize=Integer.toString((int)totalwidth); + is=sfontsize.length(); + for (k=0; k<=tablehlinenumber;k++){ + if (i==tablelastline-adjustline){ + SuperBlock.blockxpos.get(tablelastline+tid2-adjustline).set(index+k,shiftx+Header.leftsidemargin); + if (is==1){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + } + } + } + thisypos2=thisypos2+linegap; + thisypos.put(tid, thisypos2); + columnwidth.clear(); + lineheight.clear(); + linedepth.clear();; + + blockwidth.clear();; + blockheight.clear(); + blockdepth.clear(); + tablevlinecounter.clear(); + + if (!captionattop){ + Parsetext table = new Parsetext(); + for (i=0;i<=captionnumline;i++){ + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + table.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , thisypos2, tf, attribute2, attribute, false, 0.0f); + thisypos2=Parsetext.thisypos.get(tid); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + + adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; + for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ + SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); + } + adjusty=Parsetext.thisypos.get(tid); + thisypos.put(tid,adjusty); + }} + SuperBlock.tableendline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)); + SuperBlock.tableheight.put(tid2+SuperBlock.tablenumber.get(tid),thisypos.get(tid)-ypos); +}} + + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsepreparation.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsepreparation.java new file mode 100644 index 0000000000..c88ec5a914 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsepreparation.java @@ -0,0 +1,143 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import java.util.HashMap; + +public class Parsepreparation { + + public String parsepreparation(String molecule2, HashMap<String, Integer> symboltype, HashMap<String, String> matchsymbol) { + + char temp1,temp2; + int length=0; + int i=0; + int j=-1; + int ii=0; + boolean insidetabular=false; + String molecule = ""; + String key=""; + length = molecule2.length(); + Fontfile font = new Fontfile(); + font.fontfile(); + Textattributefile text = new Textattributefile(); + text.textattributefile(); + Colorfile color = new Colorfile(); + color.colorfile(); + + ArrayList<String> atom = new ArrayList<String>(); + int i2=0; + molecule2 = molecule2+"!!!!"; + for (i=0;i2<=length;i++){ + + temp1=molecule2.charAt(i2); + temp2=molecule2.charAt(i2+1); + + if (temp1=='!' && temp2=='!'){i2=length+1;} + else if (temp1!='!' && temp1 !='}' && temp1 !='{'){molecule=molecule+temp1; i2++;} + else if (temp1=='!'){ + key=""; + for (ii=i2+1;!(molecule2.charAt(ii)==' ' ||molecule2.charAt(ii)=='}' || molecule2.charAt(ii)=='{'|| molecule2.charAt(ii)=='!'|| molecule2.charAt(ii)=='('|| molecule2.charAt(ii)==')');ii++){ + key = key + molecule2.charAt(ii); + } + if (key.equals("frac")){molecule = molecule + "!fra!onb{"; j++; atom.add("onb"); i2=i2+key.length()+2;} + else if (key.equals("odb")){molecule = molecule + "!odb{"; j++; atom.add("odb"); i2=i2+key.length()+2;} + else if (key.equals("tabular")){ + molecule = molecule + "!bta{"; j++; atom.add("bta"); i2=i2+key.length()+2; + int i4=molecule2.indexOf("{",i2); + molecule=molecule+molecule2.substring(i2,i4+1); + for (i=i2;i<=i4-2;i++){ + if (molecule2.charAt(i)=='l' || molecule2.charAt(i)=='c' || molecule2.charAt(i)=='r'){ + } + } + i2=i4+1; + insidetabular=true; + } + else if (key.equals("line")){ + molecule = molecule + "!bln{"; j++; atom.add("bln"); i2=i2+key.length()+2; if (molecule2.charAt(i2)=='}'){molecule=molecule+"!dno"; i2++;}; + } + else if (key.equals("block")){molecule = molecule +"!openblock ";j++; atom.add("block"); i2=i2+key.length()+2;} + else if (key.equals("vspace")){molecule = molecule + "!vsp{"; i2=i2+key.length()+2; + key=""; + for (ii=i2;!(molecule2.charAt(ii)=='}');ii++){ + key = key + molecule2.charAt(ii);} + molecule = molecule + key+"}"; + i2=i2+key.length()+1; + } + else if (key.equals("hspace")){molecule = molecule + "!hsp{" ; i2=i2+key.length()+2; + key=""; + for (ii=i2;!(molecule2.charAt(ii)=='}');ii++){ + key = key + molecule2.charAt(ii);} + molecule = molecule + key+"}"; + i2=i2+key.length()+1; + } + else if (key.equals("^")){molecule = molecule + "!osp{" ; j++; atom.add(key); i2=i2+key.length()+2;} + else if (key.equals("_")){molecule = molecule + "!osu{"; j++; atom.add(key); i2=i2+key.length()+2;} + else if (key.equals("mbox")){molecule = molecule + "!obx{"; j++; atom.add(key); i2=i2+key.length()+2;} + else if (key.equals("dno")){molecule = molecule + "!dno ";i2=i2+key.length()+2;} + else if (key.equals("noindent")){i2=i2+key.length()+2;} + else if (symboltype.containsKey(key) && symboltype.get(key) < 10 ){ + molecule = molecule + "!V" + key +"{"; j++; atom.add(key); i2=i2+key.length()+2; + temp1=molecule2.charAt(i2); + temp2=molecule2.charAt(i2+1); + if (temp1 == '!' && temp2 == '.'){molecule = molecule +"!."; i2=i2+2;}; + } + else if (symboltype.containsKey(key) && symboltype.get(key) >= 10 ){ + i2=i2+key.length()+1; if (molecule2.charAt(i2)==' '){i2++; molecule = molecule + "!" + key +" ";} else if (molecule2.charAt(i2)=='!' || molecule2.charAt(i2)=='}' ){molecule = molecule + "!" + key;} } + else if (text.attribute.contains(key)){ + if (molecule2.charAt(i2+key.length()+1)=='('){molecule = molecule + "!Ao"+key+molecule2.substring(i2+key.length()+1,molecule2.indexOf(")",i2+key.length()+1)+2); j++; atom.add(key); i2=molecule2.indexOf(")",i2+key.length()+1)+2; + } else {molecule = molecule + "!Ao"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;}; + } + else if (Header.sizefactor.containsKey(key)){molecule = molecule + "!Xo"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;} + else if (font.fontname.contains(key)){molecule = molecule + "!Fo"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;} + else if (color.colorinteger.containsKey(key)){molecule = molecule + "!Co"+key+"{"; j++; atom.add(key); i2=i2+key.length()+2;} + } else if (temp1=='{' && insidetabular){ + molecule=molecule+"!olb{"; j++; atom.add("olb"); i2++; + }else if (temp1=='}'){ + key = atom.get(j); atom.remove(j); j--; + if (symboltype.containsKey(key) && symboltype.get(key) == 1){ + molecule = molecule + "!V" + matchsymbol.get(key) +"}"; i2=i2+1; + temp1=molecule2.charAt(i2); + temp2=molecule2.charAt(i2+1); + if (temp1 == '!' && temp2 == '.'){molecule = molecule +"!."; i2=i2+2;}; + } else if (symboltype.containsKey(key) && + symboltype.get(key) < 10){ + molecule = molecule + "!V" + key +"}"; i2=i2+1; + } else if (key.equals("onb")){ + molecule = molecule + "!cnb}!odb{"; j++; atom.add("odb"); i2=i2+2; + } else if (key.equals("odb")){ + molecule = molecule + "!cdb}"; i2=i2+1; + } else if (key.equals("bta")){ + molecule = molecule + "!eta}"; i2=i2+1; insidetabular=false; + } else if (key.equals("bln")){ + molecule = molecule + "!eln}"; i2=i2+1; + } else if (key.equals("^")){ + molecule = molecule + "!csp}"; i2=i2+1; + } else if (key.equals("_")){ + molecule = molecule + "!csu}"; i2=i2+1; + } else if (key.equals("olb")){ + molecule = molecule + "!clb}"; i2=i2+1; + } else if (key.equals("mbox")){ + molecule = molecule + "!cbx}"; i2=i2+1; + } else if (key.equals("block")){ + molecule = molecule +"!closeblock "; i2=i2+1; + } else if (text.attribute.contains(key)){ + molecule = molecule + "!Ac"+key+"}"; i2=i2+1; + } else if (Header.sizefactor.containsKey(key)){ + molecule = molecule + "!Xc"+key+"}"; i2=i2+1; + } else if (font.fontname.contains(key)){ + molecule = molecule + "!Fc"+key+"}"; i2=i2+1; + } else if (color.colorinteger.containsKey(key)){ + molecule = molecule + "!Cc"+key+"}"; i2=i2+1; + } + } + } + return molecule; + }} + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetable.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetable.java new file mode 100644 index 0000000000..9b298daadf --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetable.java @@ -0,0 +1,464 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.util.SparseBooleanArray; + +public class Parsetable { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsetable(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, Integer tablelinenumber, ArrayList<Integer> tablehlinecounter, Integer superblocknumber, SuperBlock superblock ,SparseArray<ArrayList<String>> superblockline,SparseIntArray superblocknumline,SparseIntArray superblockstartline, SparseIntArray superblockendline, ArrayList<Typeface> tf , String columnspec, Float ypos, String attribute2, String attribute) { + + int i,j,ii; + int k=0; + int tid2=tid*1000; + int captionnumline=-1; + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + int adjustline=0; + + float linegap = Header.linegap; + float columngap=Header.columngap; + float totalwidth=0.0f; + float adjusty=ypos; + float adjustx=0.0f; + float adjustx2=0.0f; + float shiftx=0.0f; + float thisypos2=0; + + String blockline = new String(); + String rawblockline = new String(); + String thisattribute=attribute; + String columnspec2=new String(); + String currentline=""; + + ArrayList<Float> columnwidth = new ArrayList<Float>(); + ArrayList<Float> lineheight = new ArrayList<Float>(); + ArrayList<Float> linedepth = new ArrayList<Float>(); + + ArrayList<Float> blockwidth = new ArrayList<Float>(); + ArrayList<Float> blockheight = new ArrayList<Float>(); + ArrayList<Float> blockdepth = new ArrayList<Float>(); + ArrayList<Integer> tablevlinecounter = new ArrayList<Integer>(); + ArrayList<String> captionline = new ArrayList<String>(); + + ArrayList<String> tatom = new ArrayList<String>(); + ArrayList<Float> txpos = new ArrayList<Float>(); + ArrayList<Float> typos = new ArrayList<Float>(); + ArrayList<String> tattribute = new ArrayList<String>(); + + error.put(tid,false); + errormessage.put(tid,""); + thisypos.put(tid,ypos); + columnspec2=""; + int tablehlinenumber=-1; + for (i=0;i<=tablelinenumber;i++){ + tablehlinenumber=tablehlinenumber+(tablehlinecounter.get(i)+1); + } + tablevlinecounter.add(-1); + for (i=0;i<=columnspec.length()-1;i++){ + if (columnspec.charAt(i)=='|') {tablevlinecounter.set(tablevlinecounter.size()-1,tablevlinecounter.get(tablevlinecounter.size()-1)+1);} + else if (columnspec.charAt(i)=='l' || columnspec.charAt(i)=='r' || columnspec.charAt(i)=='c'){columnspec2=columnspec2+columnspec.charAt(i); tablevlinecounter.add(-1);} + } + int numcolumn = columnspec2.length(); + + columnwidth.clear();lineheight.clear();linedepth.clear(); + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Integer.parseInt(attribute.substring(1,4))); + textpaint.setTypeface(tf.get(Integer.parseInt(attribute.substring(4,7)))); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + float spacewidth=textpaint.measureText(" "); + float spaceheight=textbounds.height(); + float spacedepth=textbounds.bottom; + Boolean captionattop=false; + int tablefirstline=superblockstartline.get(superblocknumber); + int tablelastline=superblockendline.get(superblocknumber); + int lastline=superblockendline.get(superblocknumber)-superblockstartline.get(superblocknumber); + String sfontsize; + + for (i=0;i<=lastline;i++){ + + currentline=superblockline.get(superblocknumber).get(i); + String line=currentline.trim(); + + if (line.length() >=15 && line.substring(0,15).equals("!begin{caption}")){ + if (i==0){captionattop=true;adjustline=2;} else {captionattop=false;adjustline=0;}; + + Boolean caption=true; + i++; + currentline=superblockline.get(superblocknumber).get(i); + line=currentline.trim(); + if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;captionnumline++;} + + while(caption){ + j=line.indexOf("!!"); + line=line.substring(0,j); + captionline.add(line); + i++;captionnumline++; + currentline=superblockline.get(superblocknumber).get(i); + line=currentline.trim(); + if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;} + } + tablelinenumber=tablelinenumber-captionnumline-1; + if(captionattop){tablefirstline=i+tablefirstline; + currentline=superblockline.get(superblocknumber).get(i);} + else {tablelastline=tablefirstline+tablelinenumber-1;} + } } + +// Add top caption + + SuperBlock.tablestartline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)+1); + if (captionattop){ + Parsetext table = new Parsetext(); + for (i=0;i<=captionnumline;i++){ + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + table.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , adjusty, tf, attribute2, attribute, false, 0.0f); + thisypos2=Parsetext.thisypos.get(tid); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; + for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ + SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); + } + adjusty=Parsetext.thisypos.get(tid); + thisypos.put(tid,adjusty); + }} + Boolean firstline=true; + for (i=tablefirstline;i<=tablelastline;i++){ + + if (!captionattop){ + currentline=superblockline.get(superblocknumber).get(i-tablefirstline); + } else { + currentline=superblockline.get(superblocknumber).get(i-tablefirstline+captionnumline+3); + } + + lineheight.add(0.0f); + linedepth.add(0.0f); + synchronized(this){superblock.create(tid);} + for (ii=0;ii<=numcolumn-1;ii++){ // First parse + if (firstline) columnwidth.add(0.0f); + if (ii<=numcolumn-2){ + j=currentline.indexOf("&"); + + if (j<0){error.put(tid, true);errormessage.put(tid, "Format error in table, parse failed !!");return;}; + rawblockline=currentline.substring(0,j); currentline=currentline.substring(j+1); + + if (rawblockline.equals("")){rawblockline="!dno ";}; + } else { + rawblockline=currentline; + if (rawblockline.equals("")){rawblockline="!dno ";}; + } + + Parsepreparation prepareblockline = new Parsepreparation(); + blockline=prepareblockline.parsepreparation(rawblockline,Symbol.symboltype,Symbol.matchsymbol); + + Parseblock parseblockline = new Parseblock(); + parseblockline.parseblock(tid,canvas,block, blockline,tf,thisattribute); + if (Block.error.get(tid)==true){error.put(tid, true); errormessage.put(tid, Block.errormessage.get(tid)); return;}; + + blockwidth.add(Math.max(Block.blockwidth2.get(tid),spacewidth)); + blockheight.add(Math.max(Block.blockheight2.get(tid),spaceheight)); + blockdepth.add(Math.max(Block.blockdepth2.get(tid),spacedepth)); + superblock.add(tid,Block.subblock2,Block.subblockxpos2, Block.subblockypos2, Block.subblockattribute2, blockwidth.get(blockwidth.size()-1), blockheight.get(blockheight.size()-1), blockdepth.get(blockdepth.size()-1),'t',ii); + columnwidth.set(ii,Math.max(columnwidth.get(ii), blockwidth.get(blockwidth.size()-1))); + } + } + firstline=false; + +// add vertical lines + int totalvline=0; + for (ii=0;ii<=numcolumn;ii++){ + for (k=0;k<=tablevlinecounter.get(ii);k++){ + tatom.add("!vlin "); + txpos.add(0.0f); + typos.add(0.0f); + tattribute.add(attribute); + totalvline++; + } + synchronized(this){ + superblock.add(tid,tatom,txpos, typos, tattribute,0.0f,0.0f,0.0f,'t',numcolumn-1);} + tatom.clear(); + txpos.clear(); + typos.clear(); + tattribute.clear(); + } + +// add horizontal lines + int totalhline=0; + if (!captionattop){ + for (ii=0; ii<=tablelastline-tablefirstline+1;ii++){ + for (k=0;k<=tablehlinecounter.get(ii);k++){ + totalhline++; + tatom.add("!hlin "); + txpos.add(0.0f); + typos.add(0.0f); + tattribute.add(attribute); + } + synchronized(this){ + superblock.add(tid,tatom,txpos, typos, tattribute,0.0f,0.0f,0.0f,'t',numcolumn-1);} + tatom.clear(); + txpos.clear(); + typos.clear(); + tattribute.clear(); + } + } else { + for (ii=0;ii<=tablelastline-tablefirstline+captionnumline+2 ;ii++){ + if (!(ii>=1 && ii <=captionnumline+1)){ + for (k=0;k<=tablehlinecounter.get(ii);k++){ + totalhline++; + tatom.add("!hlin "); + txpos.add(0.0f); + typos.add(0.0f); + tattribute.add(attribute); + } + synchronized(this){ + superblock.add(tid,tatom,txpos, typos, tattribute,0.0f,0.0f,0.0f,'t',numcolumn-1);} + tatom.clear(); + txpos.clear(); + typos.clear(); + tattribute.clear(); + } } + for (i=1;i<=tablelastline-tablefirstline+1;i++){tablehlinecounter.set(i,tablehlinecounter.get(i+captionnumline+1));} + } + +// determine vertical height of table and assign ypos of horizontal lines + +// first line + i=tablefirstline-adjustline; + int index=SuperBlock.blockypos.get(tablelastline+tid2-adjustline).size()-(tablehlinenumber+1); + for (k=0;k<=tablehlinecounter.get(0);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, adjusty); + + adjusty=adjusty+linegap; + } + adjusty=adjusty+SuperBlock.superblocklineheight.get(tid).get(i)-SuperBlock.superblocklinedepth.get(tid).get(i); + int l=0; + if(tablefirstline==tablelastline){ + l=totalhline+totalvline; + } + for (ii=0;ii<=SuperBlock.blockatom.get(i+tid2).size()-1-l;ii++){ + SuperBlock.blockypos.get(i+tid2).set(ii, SuperBlock.blockypos.get(i+tid2).get(ii)+adjusty); + } + thisypos2=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i)+linegap; + // middle line + + for (i=tablefirstline+1;i<=tablelastline-1;i++){ + index=index+k; + + for (k=0;k<=tablehlinecounter.get(i-tablefirstline);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, thisypos2); + thisypos2=thisypos2+linegap; + adjusty=adjusty+linegap; + } + + adjusty=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-1-adjustline)+linegap+SuperBlock.superblocklineheight.get(tid).get(i-adjustline)-SuperBlock.superblocklinedepth.get(tid).get(i-adjustline); + for (ii=0;ii<=SuperBlock.blockatom.get(i+tid2-adjustline).size()-1;ii++){ + SuperBlock.blockypos.get(i+tid2-adjustline).set(ii, SuperBlock.blockypos.get(i+tid2-adjustline).get(ii)+adjusty); + } + thisypos2=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-adjustline)+linegap; + } +// last line + + if (tablelastline > tablefirstline){ + i=tablelastline-adjustline; + index=index+k; + for (k=0;k<=tablehlinecounter.get(i-tablefirstline+adjustline);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, thisypos2); + thisypos2=thisypos2+linegap; + adjusty=adjusty+linegap; + } + + adjusty=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i-1)+linegap+SuperBlock.superblocklineheight.get(tid).get(i)-SuperBlock.superblocklinedepth.get(tid).get(i); + for (ii=0;ii<=SuperBlock.blockatom.get(i+tid2).size()-1-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length());ii++){ + SuperBlock.blockypos.get(i+tid2).set(ii, SuperBlock.blockypos.get(i+tid2).get(ii)+adjusty); + } + thisypos2=adjusty+SuperBlock.superblocklinedepth.get(tid).get(i); + thisypos2=thisypos2+linegap; + } + + if (tablehlinecounter.get(tablelinenumber)>=0) + { + index=index+k; + for (k=0;k<=tablehlinecounter.get(tablelinenumber);k++){ + SuperBlock.blockypos.get(tablelastline+tid2-adjustline).set(index+k, thisypos2); + thisypos2=thisypos2+linegap; + } + } else { + thisypos2=thisypos2+linegap; + } + thisypos2=thisypos2-linegap; + + +// assign vertical lines height + + index=SuperBlock.blockatom.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length()); + float temp=thisypos2-thisypos.get(tid); + sfontsize=Integer.toString((int)temp); + int is=sfontsize.length(); + for (k=0;k<=columnspec.length()-columnspec2.length()-1;k++){ + if (is==1){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + } + + +// determine total width of table + + for (ii=0;ii<=numcolumn-1;ii++){ + totalwidth=totalwidth+columnwidth.get(ii)+columngap+(columngap*(tablevlinecounter.get(ii)+1)); + } + if (tablevlinecounter.get(numcolumn)>=0){ + totalwidth=totalwidth+(columngap*(tablevlinecounter.get(numcolumn))); + } + + if (viewportwidth>totalwidth){shiftx=(viewportwidth-totalwidth)/2;} + else {shiftx=(viewportwidth-totalwidth)/2;}; + + for (i=tablefirstline-adjustline;i<=tablelastline-adjustline;i++){ + +// assign xpos of first column + + adjustx=shiftx+Header.leftsidemargin; + int columnnum=0; + int iistart=0; + index=SuperBlock.blockatom.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length()); + for (k=0; k<=tablevlinecounter.get(0);k++){ + if (i==tablelastline-adjustline){SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index,adjustx);SuperBlock.blockypos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisypos2);} + adjustx=adjustx+columngap; + } + index=index+tablevlinecounter.get(0)+1; + int index2=i+tid2; + l=0; + if (i==tablelastline-adjustline){l=totalvline+totalhline;} + for (ii=0;SuperBlock.blockcolumnnum.get(index2).size()>= ii+1+l && SuperBlock.blockcolumnnum.get(index2).get(ii)==0;ii++){ + if (columnspec2.charAt(columnnum)=='l'){SuperBlock.blockxpos.get(index2).set(ii, SuperBlock.blockxpos.get(index2).get(ii)+adjustx);} + else if (columnspec2.charAt(columnnum)=='c'){adjustx2=(columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum))/2; + SuperBlock.blockxpos.get(index2).set(ii, SuperBlock.blockxpos.get(index2).get(ii)+adjustx+adjustx2);} + else if (columnspec2.charAt(columnnum)=='r'){adjustx2=columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum); + SuperBlock.blockxpos.get(index2).set(ii, SuperBlock.blockxpos.get(index2).get(ii)+adjustx+adjustx2);}; + columnnum=0; + } + iistart=ii; + + // assign xpos of all columns + for (columnnum=1;columnnum<=numcolumn-1;columnnum++){ + + boolean endofcolumn=false; + adjustx=adjustx+columngap+columnwidth.get(columnnum-1); + +// assign xpos and ypos of vertical lines + + for (k=0; k<=tablevlinecounter.get(columnnum);k++){ + if (i==tablelastline-adjustline){SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index,adjustx);SuperBlock.blockypos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisypos2);} + adjustx=adjustx+columngap; + } + index=index+tablevlinecounter.get(columnnum)+1; + index2=0; + if (i==SuperBlock.superblocklinenumber.get(tid)){ + index2=SuperBlock.blockcolumnnum.get(i+tid2).size()-1-(tablehlinenumber+1)-(columnspec.length()-columnspec2.length()); + } else { + index2=SuperBlock.blockcolumnnum.get(i+tid2).size()-1; + } + for (ii=iistart;endofcolumn==false && ii <=index2;ii++){ + if (columnnum == SuperBlock.blockcolumnnum.get(i+tid2).get(ii)){ + + if (columnspec2.charAt(columnnum)=='l'){SuperBlock.blockxpos.get(i+tid2).set(ii, SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx);} + else if (columnspec2.charAt(columnnum)=='c'){adjustx2=(columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum))/2; + SuperBlock.blockxpos.get(i+tid2).set(ii, SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx+adjustx2);} + else if (columnspec2.charAt(columnnum)=='r'){adjustx2=columnwidth.get(columnnum)-blockwidth.get((i-tablefirstline+adjustline)*numcolumn+columnnum); + SuperBlock.blockxpos.get(i+tid2).set(ii, SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx+adjustx2);}; + } else { + endofcolumn=true; + iistart=ii; + } + } + } + +// assign xpos and ypos of last vertical lines + + adjustx=adjustx+columngap+columnwidth.get(numcolumn-1); + for (k=0; k<=tablevlinecounter.get(numcolumn);k++){ + if (i==tablelastline-adjustline){SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index,adjustx);SuperBlock.blockypos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisypos2);} + adjustx=adjustx+columngap; + } + +// assign xpos and width of all horizontal lines + index=SuperBlock.blockcolumnnum.get(i+tid2).size()-(tablehlinenumber+1); + + sfontsize=Integer.toString((int)totalwidth); + is=sfontsize.length(); + for (k=0; k<=tablehlinenumber;k++){ + if (i==tablelastline-adjustline){ + SuperBlock.blockxpos.get(tablelastline+tid2-adjustline).set(index+k,shiftx+Header.leftsidemargin); + if (is==1){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"00"+sfontsize+thisattribute.substring(4)); + } else if (is==2){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+"0"+sfontsize+thisattribute.substring(4)); + } else if (is==3){ + SuperBlock.blockattribute.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(k+index, thisattribute.substring(0,1)+sfontsize+thisattribute.substring(4)); + } + } + } + } + thisypos2=thisypos2+linegap; + thisypos.put(tid, thisypos2); + columnwidth.clear(); + lineheight.clear(); + linedepth.clear();; + + blockwidth.clear();; + blockheight.clear(); + blockdepth.clear(); + tablevlinecounter.clear(); + + if (!captionattop){ + Parsetext table = new Parsetext(); + for (i=0;i<=captionnumline;i++){ + sfontsize=Integer.toString(Header.fontsize); + if (sfontsize.length()==1){ + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + table.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , thisypos2, tf, attribute2, attribute, false, 0.0f); + thisypos2=Parsetext.thisypos.get(tid); + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; + for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ + SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); + } + thisypos.put(tid,Parsetext.thisypos.get(tid)); + }} + SuperBlock.tableendline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)); + SuperBlock.tableheight.put(tid2+SuperBlock.tablenumber.get(tid),thisypos.get(tid)-ypos); + }} + + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java new file mode 100644 index 0000000000..d61a27701d --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetext.java @@ -0,0 +1,221 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseBooleanArray; + + +public class Parsetext { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsetext(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, int superblocknumber, SuperBlock superblock, String line, + float referencex, float referencey, + ArrayList<Typeface> tf ,String attribute0, String attribute1, Boolean dohyphenation, float indent){ + + float pagewidth = containerwidth-Header.rightsidemargin-Header.leftsidemargin; + float maxheight = 0.0f; + float maxdepth = 0.0f; + + int i,ii; + int nummolecule = 0; + int fontsize = Integer.parseInt(attribute0.substring(1,4)); + + error.put(tid,false); + errormessage.put(tid,""); + + Boolean newline=false; + + String molecule = ""; + + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Integer.parseInt(attribute0.substring(1,4))); + textpaint.setTypeface(tf.get(Integer.parseInt(attribute0.substring(4,7)))); + textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); + referencey=referencey+textbounds.height()-textbounds.bottom; + Float sizeofblank=textpaint.measureText(" "); + + Separatetext line2superblock = new Separatetext(); + + line2superblock = new Separatetext(); + line2superblock.separatetext(line); + nummolecule = line2superblock.nummolecule; + + Float blockheight = 0.0f; + Float blockwidth = 0.0f; + Float blockdepth = 0.0f; + ArrayList<String> subblock = new ArrayList<String>(); + ArrayList<Float> subblockxpos = new ArrayList<Float>(); + ArrayList<Float> subblockypos = new ArrayList<Float>(); + ArrayList<String> subblockattribute = new ArrayList<String>(); + + maxheight = 0.0f; + maxdepth = 0.0f; + synchronized(this){superblock.create(tid);} + + for (ii=0;ii<=nummolecule-1;ii++){ // First parse + molecule = line2superblock.molecule.get(ii); + if (ii==0) {molecule=molecule.trim(); + if (molecule.length()>=9 && molecule.substring(0,9).equals("!noindent")){indent = 0; molecule=molecule.substring(9); molecule=molecule.trim();}} + + if (!line2superblock.text.get(ii)){ + Parsepreparation newmolecule = new Parsepreparation(); + molecule=newmolecule.parsepreparation(molecule,Symbol.symboltype,Symbol.matchsymbol); + + Parseblock superblock2block = new Parseblock(); + molecule=molecule.trim(); + + superblock2block.parseblock(tid,canvas, block, molecule,tf,attribute1); + if (Block.error.get(tid)==true){error.put(tid, true); errormessage.put(tid, Block.errormessage.get(tid)); return;}; + blockheight=Block.blockheight2.get(tid); + blockwidth=Block.blockwidth2.get(tid); + blockdepth=Block.blockdepth2.get(tid); + maxheight = Math.max(maxheight,Block.blockheight2.get(tid) ); + maxdepth = Math.max(maxdepth, Block.blockdepth2.get(tid)); + int numatom=Block.subblock2.get(tid).size(); + for (i=0;i<=numatom-1;i++){ + Block.subblockxpos2.get(tid).set(i,Block.subblockxpos2.get(tid).get(i)+referencex+indent); + Block.subblockypos2.get(tid).set(i,Block.subblockypos2.get(tid).get(i)+referencey); + subblock.add(Block.subblock2.get(tid).get(i)); + subblockxpos.add(Block.subblockxpos2.get(tid).get(i)); + subblockypos.add(Block.subblockypos2.get(tid).get(i)); + subblockattribute.add(Block.subblockattribute2.get(tid).get(i)); + } + synchronized(this){ + if (newline && SuperBlock.blockatom.get(tid*1000+SuperBlock.superblocklinenumber.get(tid)).size()>0){ + if (subblock.size()>0){ + superblock.create(tid); + superblock.add(tid,subblock,subblockxpos, subblockypos,subblockattribute, blockwidth, blockheight, blockdepth, 'x',0); + } + }else { + superblock.add(tid,subblock,subblockxpos, subblockypos,subblockattribute,blockwidth, blockheight, blockdepth,'x', 0); + } + } + + if (numatom>0){ + indent =subblockxpos.get(0)+blockwidth-referencex+sizeofblank; + if (indent >= pagewidth && ii<nummolecule-1){ + referencey=subblockypos.get(numatom-1)+(float)fontsize; + indent=0; + }else { + referencey=subblockypos.get(numatom-1); + }} + + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + }else if (!molecule.equals("")){ + if (dohyphenation && Header.dohyphenation){ + + ParagraphFormatting paragraph = new ParagraphFormatting(); + ParagraphBlock.newfirstline.put(tid, false); + paragraph.paragraphformatting(canvas,paragraphblock, pagewidth, molecule, tid, indent, attribute0, tf.get(Integer.parseInt(attribute0.substring(4,7)))); + blockheight=(float)ParagraphBlock.line.size()*(float)fontsize; + blockwidth=ParagraphBlock.linelength.get(tid); + blockdepth=0.0f; + maxheight = Math.max(maxheight,(float)ParagraphBlock.line.get(tid).size()*(float)fontsize ); + int numline=ParagraphBlock.line.get(tid).size(); + for (i=0;i<=numline-1;i++){ + + if (!(ParagraphBlock.line.get(tid).get(i).equals(""))){ + subblock.add(ParagraphBlock.line.get(tid).get(i)); + subblockxpos.add(ParagraphBlock.xpos.get(tid).get(i)+referencex); + subblockypos.add(ParagraphBlock.ypos.get(tid).get(i)+referencey); + subblockattribute.add(ParagraphBlock.attribute.get(tid).get(i)); + ParagraphBlock.xpos.get(tid).set(i,ParagraphBlock.xpos.get(tid).get(i)+referencex); + ParagraphBlock.ypos.get(tid).set(i,ParagraphBlock.ypos.get(tid).get(i)+referencey); + + if (i==0 && !ParagraphBlock.newfirstline.get(tid)){ + synchronized(this){ superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0);} + }else { + synchronized(this){ + if (subblock.size()>0 && SuperBlock.blockatom.get(tid*1000+SuperBlock.superblocklinenumber.get(tid)).size()>0){ + superblock.create(tid); + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } else if (subblock.size()>0) { + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } + } + } + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + } + } + if (numline > 0){indent=ParagraphBlock.xpos.get(tid).get(numline-1)+ParagraphBlock.xpos.get(tid).get(numline-1)-referencex; + if (indent >= pagewidth && ii<nummolecule-1){ + referencey=ParagraphBlock.ypos.get(tid).get(numline-1)+(float)fontsize; + indent=0; + }else { + referencey=ParagraphBlock.ypos.get(tid).get(numline-1); + }}; + } + else { + + ParagraphFormatting2 paragraph2 = new ParagraphFormatting2(); + paragraph2.paragraphformatting2(canvas, paragraphblock, pagewidth, molecule, tid, indent, attribute0, tf.get(Integer.parseInt(attribute0.substring(4,7)))); + blockheight=(float)ParagraphBlock.line.get(tid).size()*(float)fontsize; + blockwidth=ParagraphBlock.linelength.get(tid); + blockdepth=0.0f; + + maxheight = Math.max(maxheight,(float)ParagraphBlock.line.get(tid).size()*(float)fontsize ); + int numline=ParagraphBlock.line.get(tid).size(); + for (i=0;i<=numline-1;i++){ + if (!(ParagraphBlock.line.get(tid).get(i).equals(""))){ + subblock.add(ParagraphBlock.line.get(tid).get(i)); + subblockxpos.add(ParagraphBlock.xpos.get(tid).get(i)+referencex); + subblockypos.add(ParagraphBlock.ypos.get(tid).get(i)+referencey); + subblockattribute.add(ParagraphBlock.attribute.get(tid).get(i)); + ParagraphBlock.xpos.get(tid).set(i,ParagraphBlock.xpos.get(tid).get(i)+referencex); + ParagraphBlock.ypos.get(tid).set(i,ParagraphBlock.ypos.get(tid).get(i)+referencey); + + if (i==0 && !ParagraphBlock.newfirstline.get(tid)){ + synchronized(this){superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.tlinelength.get(tid).get(i), (float) fontsize, 0.0f,'x', 0);} + }else { + synchronized(this){ + if (subblock.size()>0 && SuperBlock.blockatom.get(tid*1000+SuperBlock.superblocklinenumber.get(tid)).size()>0){ + superblock.create(tid); + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } else if (subblock.size()>0) { + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute, ParagraphBlock.linelength.get(tid), (float) fontsize, 0.0f, 'x',0); + } + } + } + + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + } + } + if (numline > 0) {indent=ParagraphBlock.xpos.get(tid).get(numline-1)+ParagraphBlock.width.get(tid).get(numline-1)-referencex; + if (indent >= pagewidth && ii<nummolecule-1){ + referencey=ParagraphBlock.ypos.get(tid).get(numline-1)+(float)fontsize; + indent=0; + newline=true; + + }else { + referencey=ParagraphBlock.ypos.get(tid).get(numline-1); + newline=false; + }}; + } + }} + thisypos.put(tid, referencey+maxdepth+Header.linegap); + error.put(tid, false); + errormessage.put(tid, ""); + }; + } + + +
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetitle.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetitle.java new file mode 100644 index 0000000000..7736a52a90 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parsetitle.java @@ -0,0 +1,221 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.util.SparseBooleanArray; + +public class Parsetitle { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parsetitle(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, int superblocknumber, SuperBlock superblock, + SparseArray<ArrayList<String>> superblockline, SparseIntArray superblocknumline, SparseIntArray superblockstartline, SparseIntArray superblockendline, float ypos, ArrayList<Typeface> tf , String attribute1){ + + Parsetext title = new Parsetext(); + Character type=null; + int j=-1; + int fontsize=Header.fontsize; + int tid2=tid*1000; + int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; + float ypos2=ypos; + Boolean endofline=false; + String sfontsize=""; + + String attribute2="1"+attribute1.substring(1); + + + for (int i=0;i<=superblockline.get(superblocknumber).size()-1;i++){ + endofline=false; + String line=superblockline.get(superblocknumber).get(i); + line=line.trim(); + while(!endofline){ + if (line.substring(0,6).equals("!title")){type='t';line=line.substring(6).trim();j=line.indexOf("!!");} + else if (line.substring(0,7).equals("!author")){type='a';line=line.substring(7).trim();j=line.indexOf("!!");ypos=ypos+5;thisypos.put(tid,ypos);} + else if (line.substring(0,12).equals("!affiliation")){type='f';line=line.substring(12).trim();j=line.indexOf("!!");ypos=ypos+0;thisypos.put(tid,ypos);} + else if (line.substring(0,6).equals("!email")){type='e';line=line.substring(6).trim();j=line.indexOf("!!");ypos=ypos+0;thisypos.put(tid,ypos);} + else if (line.substring(0,5).equals("!date")){type='d';line=line.substring(5).trim();j=line.indexOf("!!");ypos=ypos+0;thisypos.put(tid,ypos);} + else if (line.substring(0,5).equals("!text")){type='x';line=line.substring(5).trim();j=line.indexOf("!!");ypos=ypos+0;thisypos.put(tid,ypos);} + else if (line.substring(0,7).equals("!vspace")){ + int ij=line.indexOf("}",7); + float vspace=Integer.parseInt(line.substring(8,ij)); + ypos=ypos+vspace; + line=line.substring(ij+1); line=line.trim(); + thisypos.put(tid,ypos); + } + else if (type=='t'){ + fontsize=(int)(Header.fontsize*Header.sizefactor.get("Huge"));if (fontsize>Header.maxfontsize){fontsize=Header.maxfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + line=line.trim(); + line="$!shadow{!mbox{"+line+"}}$"; + title.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, line, Header.leftsidemargin , ypos, tf, attribute2, attribute1, false, 0.0f); + + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (int ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + ypos=Parsetext.thisypos.get(tid); + thisypos.put(tid,ypos); + endofline=true; + } + else if (type=='a'){ + fontsize=(int)(Header.fontsize*Header.sizefactor.get("Large"));if (fontsize>Header.maxfontsize){fontsize=Header.maxfontsize;}; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + line=line.trim(); + line="$!bf{!mbox{"+line+"}}$"; + title.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, line, Header.leftsidemargin , ypos, tf, attribute2, attribute1, false, 0.0f); + + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (int ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + ypos=Parsetext.thisypos.get(tid); + thisypos.put(tid,ypos); + endofline=true; + } + else if (type=='f'){ + fontsize=Header.fontsize; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + line=line.trim(); + line="$!it{!mbox{"+line+"}}$"; + title.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, line, Header.leftsidemargin , ypos, tf, attribute2, attribute1, false, 0.0f); + + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (int ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + ypos=Parsetext.thisypos.get(tid); + thisypos.put(tid,ypos); + endofline=true; + } + else if (type=='e'){ + fontsize=Header.fontsize; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + line=line.trim(); + line="$!mo{!mbox{"+line+"}}$"; + title.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, line, Header.leftsidemargin , ypos, tf, attribute2, attribute1, false, 0.0f); + + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (int ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + ypos=Parsetext.thisypos.get(tid); + thisypos.put(tid,ypos); + endofline=true; + } + else if (type=='d'){ + fontsize=Header.fontsize; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + line=line.trim(); + line="$!mo{!mbox{"+line+"}}$"; + title.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, line, Header.leftsidemargin , ypos, tf, attribute2, attribute1, false, 0.0f); + + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (int ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + ypos=Parsetext.thisypos.get(tid); + thisypos.put(tid,ypos); + endofline=true; + } + else if (type=='x'){ + fontsize=Header.fontsize; + sfontsize=Integer.toString(fontsize); + if (sfontsize.length()==1){ + attribute1 = "000"+sfontsize+attribute1.substring(4); + attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==2){ + attribute1 = "00"+sfontsize+attribute1.substring(4); + attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); + } else if (sfontsize.length()==3){ + attribute1 = "0"+sfontsize+attribute1.substring(4); + attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); + } + line=line.trim(); + line="$!mbox{"+line+"}$"; + title.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, line, Header.leftsidemargin , ypos, tf, attribute2, attribute1, false, 0.0f); + + float adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(i))/2; + for (int ii=0;ii<=SuperBlock.blockxpos.get(i+tid2).size()-1;ii++){ + SuperBlock.blockxpos.get(i+tid2).set(ii,SuperBlock.blockxpos.get(i+tid2).get(ii)+adjustx); + } + error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; + ypos=Parsetext.thisypos.get(tid); + thisypos.put(tid,ypos); + endofline=true; + } + if(j==0){endofline=true;} + } + thisypos.put(tid,ypos+20); + } + SuperBlock.titleendline.put(tid, SuperBlock.superblocklinenumber.get(tid)); + SuperBlock.titleheight.put(tid,thisypos.get(tid)-ypos2+SuperBlock.superblocklineheight.get(0).get(0)-SuperBlock.superblocklinedepth.get(0).get(0)); + } + } diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseverbatim.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseverbatim.java new file mode 100644 index 0000000000..1d4004b592 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Parseverbatim.java @@ -0,0 +1,68 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.SparseArray; +import android.util.SparseBooleanArray; + +public class Parseverbatim { + + public static volatile SparseArray<Float> thisypos = new SparseArray<Float>(); + public static volatile SparseBooleanArray error = new SparseBooleanArray(); + public static volatile SparseArray<String> errormessage = new SparseArray<String>(); + + public void parseverbatim(Canvas canvas, Block block, Integer tid, Integer containerwidth, Integer containerheight, int superblocknumber, SuperBlock superblock, SparseArray<ArrayList<String>> superblockline,float referencex, float referencey, ArrayList<Typeface> tf ,String attribute1) { + + int fontsize = Header.fontsize; + + int ii; + error.put(tid,false); + errormessage.put(tid,""); + + Paint textpaint = new Paint(); + Rect textbounds = new Rect(); + textpaint.setTextSize(Header.fontsize); + textpaint.setTypeface(tf.get(Header.defaultfont)); + textpaint.getTextBounds("A",0,"A".length(),textbounds); + referencey=referencey+textbounds.height()+Header.linegap; + + ArrayList<String> subblock = new ArrayList<String>(); + ArrayList<Float> subblockxpos = new ArrayList<Float>(); + ArrayList<Float> subblockypos = new ArrayList<Float>(); + ArrayList<String> subblockattribute = new ArrayList<String>(); + + textpaint.getTextBounds("j",0,"j".length(),textbounds); + for (ii=0;ii<=superblockline.get(superblocknumber).size()-1;ii++){ // First parse + synchronized(this){superblock.create(tid);} + subblock.add(superblockline.get(superblocknumber).get(ii).substring(0,superblockline.get(superblocknumber).get(ii).length()-2)); + textpaint.getTextBounds(subblock.get(0),0,subblock.get(0).length(),textbounds); + subblockxpos.add((float) Header.leftsidemargin); + subblockypos.add(referencey); + subblockattribute.add(attribute1); + + referencey=referencey+(float)fontsize; + synchronized(this){ + superblock.add(tid,subblock,subblockxpos, subblockypos, subblockattribute,(float) textbounds.width() , (float) fontsize, (float)textbounds.bottom, 'v',0);} + subblock.clear(); + subblockxpos.clear();subblockypos.clear();subblockattribute.clear(); + } + + thisypos.put(tid, referencey-(float)fontsize+textbounds.bottom); + error.put(tid, false); + errormessage.put(tid, ""); + }; +} + + +
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Separatetext.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Separatetext.java new file mode 100644 index 0000000000..2a0e6534a0 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Separatetext.java @@ -0,0 +1,48 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; + +public class Separatetext { + + int nummolecule = 0; + + ArrayList<String> molecule = new ArrayList<String>(); + ArrayList<Integer> moleculelength = new ArrayList<Integer>(); + ArrayList<Boolean> text = new ArrayList<Boolean>(); + boolean tabular = false; + boolean equation = false; + boolean eqnarray = false; + boolean center = false; + boolean graphics = false; + + public void separatetext(String line) { + + + boolean endofline = false; + + int i2=0; + int i=0; + + line=line.trim(); + + endofline=false; + for (int j=0; !endofline && j < 1000; j++){ + i=line.indexOf('$'); + if(i==-1){molecule.add(line); text.add(true); nummolecule++; endofline=true;} + else { + i2=line.indexOf('$',i+1); + if (i > 0) {molecule.add(line.substring(0,i)); text.add(true); nummolecule++; }; + molecule.add(line.substring(i+1,i2)); text.add(false); nummolecule++; + line=line.substring(i2+1);line=line.trim(); + if (line.length()==0){ endofline=true;}; + } + }} + } diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Source.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Source.java new file mode 100644 index 0000000000..96d2aa9c54 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Source.java @@ -0,0 +1,290 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; + +public class Source { + + + public static final ArrayList<String> lineblock = new ArrayList<String>(); + + public void content (){ + + lineblock.add("!begin{title}" + + "!title Brief Introduction to HKtex (Version 2.03)!!" + + "!author by Kwanleung Tse!!" + + "!email email: worker4math@gmail.com!!" + + "http://www.worker4math.fatcow.com!!" + + "!date 25th September, 2014!!" + + "!text (Notice : This brief introduction is taken from Version 2.00.!!" + + "Updated introduction will be released afterward.)!!" + + "!end{title}" + + "!end{lineblock}"); + lineblock.add("!ss" + + "!noindent $!underlinetext{!large{!bf{!navy{1. Introduction}}}}$ HKtex is a formula parsing software written" + + " for mobile phones and tablets using Android operating system. It is developed using Google Eclipse and thus" + + " allows app developers and book writers to import the files easily. There is now a clear distinction" + + " between books and apps. It is difficult to add interactive elements into books written with" + + " Tex/Latex and, in creating apps, there is no comprehensive formula parsing software easily" + + " imported by Eclipse. The purpose of HKtex is to remove this distinction. HKtex will, intentionally and eventually, enable" + + " developers to create apps which are also complete books by themself, and writers to write books which contain interactive examples, exercises and graphics. In writing HKtex, i understand" + + " the popularity of Tex/Latex and thus make HKtex as compatible to Tex/Latex as possible. However," + + " some differences exist. I will try to explain them in this document. Before moving to next section," + + " i wish to emphasize that this is an ongoing endeavour and is by no mean a completed work. However," + + " i feel that it is presentable and thus release it to solicit feedback to make it better. !! " + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{20}" + + "!noindent $!underlinetext{!large{!bf{!navy{2. Program structure}}}}$ HKtex is written with java. Since there are" + + " many situations to consider, this program is inherently difficult. Avoid" + + " changing the files, except the four input files: MainActivity.java" + + " ,Header.java, Source.java, and Symbol.java. !!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + " The content of the document is stored in Content.java. The content is broken up into blocks. Your document can be contained inside one" + + " huge block or many small blocks. Breaking up into smaller blocks allow you to parse a particular" + + " block. Each block begins with !begin{blockline} and ends with !end{blockline}. The !begin{blockline}" + + " command can be omitted but the !end{blockline} command must be there. Besides, you can not begin an" + + " environment, e.g. eqnarray, in one block and end the environment in another block. " + + " The Header.java file contains page layout informations, for example, margins, gap width between lines, etc." + + " You can have more than one Header.java file and use different one in different situation." + + " The Symbol.java file contains symbols. Comment out those symbols that are not used for the purpose of efficiency. !!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{20}" + + "!noindent $!underlinetext{!large{!bf{!navy{3. Environment}}}}$ There are seven different environments in HKtex: text, eqnarray," + + " equation, table, verbatim, graphics and graphicstable. By default, the environment is text and no further specification is needed. To enclose" + + " a different environment within text, use the begin and end commands. For example, the following lines : !!" + + "!vspace{10}" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!begin{verbatim}" + + "!begin{eqnarray}{rcl}!!" + + "y&=&!int!^{x!_{2}}!_{x!_{1}} 2xdx !!" + + "&=& x!_{2}!^{2} - x!_{1}!^{2} !!" + + "!end{eqnarray}!!" + + "!end{verbatim}" + + "!vspace{10}" + + "!noindent will give : !!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!begin{eqnarray}{rcl}" + + "y&=&!int!^{x!_{2}}!_{x!_{1}} 2xdx !!" + + "&=& x!_{2}!^{2} - x!_{1}!^{2} !!" + + "!end{eqnarray}" + + "!vspace{10}" + + "Inside eqnarray, equation and table environment, the lines are automatically centered. HKtex does not provide" + + " other alignment. However, for text environment, the following alignment are possible : !!" + + "!vspace{10}" + + "!begin{center}" + + "centered text !!" + + "!end{center}" + + "!noindent left-aligned text !!" + + "!begin{alignright}" + + "right-aligned text!!" + + "!end{alignright}" + + "!noindent HKtex does not hyphenate the center-aligned or right-aligned text.!!" + + "!vspace{10}" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "To change the fontsize, type !Huge, !huge, !Large, !large, !normalsize, !small, !scriptsize or !tiny at the" + + " beginning of line, as in the following :!!" + + "!Huge" + + "!noindent Huge text!!" + + "!huge" + + "!noindent huge text!!" + + "!Large" + + "!noindent Large text!!" + + "!large" + + "!noindent large text!!" + + "!normalsize" + + "!noindent normalsize text!!" + + "!small" + + "!noindent small text!!" + + "!scriptsize" + + "!noindent scriptsize text!!" + + "!tiny" + + "!noindent tiny text!!" + + "!normalsize" + + "The default font size is defined in header.java. It cannot be bigger than the maximum size, also specified in" + + " header.java. However, since the maximum can be adjusted. The size is in fact not bounded.!!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "The font type can be specified by the command !ss, !it, !bf, !mo, also at the beginning of the line. They stand for" + + " serif, italic, bold, and mono. The next one is !asana, used for typing symbol. The last one is !rm used only for" + + " trigonometric, logarithmic and hyperbolic functions. Do not specify the last two.!!" + + "!it" + + "!noindent italic text!!" + + "!bf" + + "!noindent bold text!!" + + "!mo" + + "!noindent monospace text!!" + + "!ss" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{20}" + + "!noindent $!underlinetext{!large{!bf{!navy{4. Table}}}}$ The command for constructing a table is similar to Tex/Latex. However," + + " the table in HKtex is more primitive. It does not provide table within table. The following is a simple example :!!" + + "!vspace{10}" + + "!begin{table}{|r|c|l|}!hline" + + "!begin{caption}" + + "Table 1. Infinite products of hyperbolic functions!!" + + "!end{caption}" + + "&Hyperbolic functions& Infinite Products!!!hline!hline" + + "1&!sinh z& z!bigprod!^{!infty}!_{k=1}!lparen{1 + !frac{z!^{2}}{k!^{2}!pi!_{2}}}!!!hline " + + "2&!cosh z&!bigprod!^{!infty}!_{k=1}!lbrack{1 + !frac{4z!^{2}}{(2k-1)!^{2}!pi!_{2}}}!!!hline" + + "!end{table}" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "!noindent Using tabular within table is allowed, as demonstrated in the following example:!!" + + "!vspace{10}" + + "!begin{table}{|r|l|}!hline" + + "& Laplace's equations!!!hline!hline" + + "Cartesian Coordinates& !tabular{l}{!line{{!frac{!partial!^{2}u}{!partial x!^{2}} + !frac{!partial!^{2}u}{!partial y!^{2}} " + + "=}}!line{{!hspace{10} !frac{!partial!^{2}v}{!partial x!^{2}} + !frac{!partial!^{2}v}{!partial y!^{2}} = 0}}} !!!hline" + + "Polar Coordinates& !tabular{l}{!line{{r!frac{!partial}{!partial r}!lparen{r!frac{!partial u}{!partial r}}+" + + "!frac{!partial!^{2}u}{!partial!vartheta!^{2}} =}}!line{{!hspace{10}r!frac{!partial}{!partial r}" + + "!lparen{r!frac{!partial v}{!partial r}}+!frac{!partial!^{2}v}{!partial!vartheta!^{2}} = 0}}}!!!hline" + + "!begin{caption}" + + "Table 2. Laplace's equations!!" + + "!end{caption}" + + "!end{table}" + + "!noindent Note that there is also no tabular within tabular. !!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "HKtex does not have fbox, this can be compensated somewhat by using table and draws only the lines on the outer boundaries. For example:!!" + + "!begin{table}{|c|}!hline" + + "The Jacobian of a transformation is :!!" + + "!frac{!partial(x,y)}{!partial(u,v)}=!vert{!tabular{cc}{!line{{!frac{!partial x}{!partial u}}{!frac{!partial x}{!partial v}}}!line{{!frac{!partial y}{!partial u}}{!frac{!partial y}{!partial v}}}}}!!!hline" + + "!end{table}" + + "Inside table, the default is symbol mode. If text mode is needed, enclosed it within a mbox.!!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "!noindent $!underlinetext{!large{!bf{!navy{5. Eqnarray and equation}}}}$ Equation array is like table except that the font" + + " is italic by default. Besides, neither vertical line nor horizontal line will be drawn. Equation is an eqnarray" + + " with just one line. You can specified an equation just like an eqnarray. This is allowed in HKtex. The following" + + " provides a few examples of equation and eqnarray. !!" + + "!vspace{10}" + + "!noindent Lagrange's Expansion Formula :!!" + + "!begin{equation}" + + "x=x!_{0}+!bigbigsum!^{!infty}!_{k=1}!frac{(y-y!_{0})!^{k}}{k!exclam}!lbrace{!frac{d!^{k-1}}{dx!^{k-1}}" + + "!lparen{g'(x)!lbrace{!frac{x-x!_{0}}{f(x)-y!_{0}}}!^{k}}}!_{x=x!_{0}}!!" + + "!end{equation}" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "!noindent Continued fraction :!!" + + "!Large" + + "!begin{equation}" + + "f=b!_{0}+!frac{a!_{1}}{b!_{1}+!frac{a!_{2}}{b!_{2}+!frac{a!_{3}}{b!_{3}+!frac{a!_{4}}{b!_{4}+...}}}}!!" + + "!end{equation}" + + "!normalsize" + + "!begin{center}" + + "(arbitrary pagebreak here !)!!" + + "!end{center}" + + "!pagebreak" + + "!noindent Algebraic equation :!!" + + "!huge" + + "!begin{equation}" + + "y= !lbrace{!tabular{lr}{!line{{0}{!hspace{20}x = 1}}!line{{!frac{!vert{x-1}}{!fourthroot{!vert{x-1}!^{3}}}}{x !ne 1}}}}!.!!" + + "!end{equation}" + + "!normalsize" + + "!noindent Fluid equations :!!" + + "!begin{eqnarray}{rclr}" + + "!nabla !cdot !bf{U} &=& 0 & !hspace{50} !mbox{continuity}!!" + + "!underbrace{!frac{DU!_{j}}{Dt}}!_{!tiny{!lparen{!tabular{c}{!line{{time}}!line{{derivative}}}}}} &=&" + + "-!overbrace{!frac{1}{!rho}!nabla p}!^{!tiny{!lparen{!tabular{c}{!line{{pressure}}!line{{term}}}}}} +" + + "!underbrace{!nu!nabla!^{2}!bf{U}}!_{!tiny{!lparen{!tabular{c}{!line{{diffusion}}!line{{term}}}}}} & !mbox{momentum}!!" + + "!end{eqnarray}" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "!noindent $!underlinetext{!large{!bf{!navy{6. Graphics and Graphicstable}}}}$ Figures can be included within the !begin{graphics} and !end{graphics} commands.!!" + + "!begin{graphics}" + + "leftarrow.png!!" + + "!begin{caption}" + + "Figure 1. The left arrow. !!" + + "!end{caption}" + + "!end{graphics}" + + "!vspace{10}" + + " If there are more than one figures, then the !begin{graphicstable} and !end{graphicstable} commands can be used. !!" + + "!begin{graphicstable}{cc}" + + "!begin{caption}" + + "Figure 2. The left arrow, the right arrow, !!" + + " the left end arrow and the right end arrow. !!" + + "!end{caption}" + + "leftarrow.png & rightarrow.png!!" + + "leftendarrow.png & rightendarrow.png!!" + + "!end{graphicstable}" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "!noindent $!underlinetext{!large{!bf{!navy{7. Color}}}}$ Color can only be specified within each environment (except verbatim)." + + " The following table is a list of color predefined in HKtex. You can easily add another color by adding another entry in the Color.java file." + + " The name should not be the same as any other command name. For example the color tan is missing because it has the same name as the " + + " trignometric function tan.!!" + + "!tiny" + + "!vspace{10}" + + "!begin{table}{|c|c|c|c|c|c|}!hline" + + "!begin{caption}" + + "Table 3. Color table!!" + + "!end{caption}" + + "!aliceblue{aliceblue}&!antiquewhite{antiquewhite}&!aquamarine{aquamarine}&!aure{aure}&!banana{banana}&!beige{beige} !!!hline" + + "!blanchedalmond{blanchedalmond} &!blueviolet{blueviolet}&!blue{blue}&!brick{brick}&!brown{brown}&!burlywood{burlywood}!!!hline" + + "!cadetblue{cadetblue}&!cadmiumorange{cadmiumorange}&!cadmiumyellow{cadmiumyellow}&!carrot{carrot}&!black{black}&!burntumber{burntumber}!!!hline" + + "!chocolate{chocolate}&!cobalt{cobalt}&!cobaltgreen{cobaltgreen}&!coldgrey{coldgrey}&!cornflowerblue{cornflowerblue} &!cornsilk{cornsilk} !!!hline" + + "!crimson{crimson}&!cyan{cyan}&!darkgoldenrod{darkgoldenrod}&!darkgray{darkgray}&!darkgreen{darkgreen}&!darkkhaki{darkkhaki}!!!hline" + + "!bisque{bisque}&!burntsienna{burntsienna}&!chartreuse{chartreuse}&!coral{coral}&!darkolivegreen{darkolivegreen} &!darkorange{darkorange} !!!hline" + + "!darkorchid{darkorchid} &!darksalmon{darksalmon}&!darkseagreen{darkseagreen}&!darkslateblue{darkslateblue}&!darkslategray{darkslategray}&!darkturquoise{darkturquoise}!!!hline " + + "!ddarkviolet{ddarkviolet}&!deeppink{deeppink}&!deepskyblue{deepskyblue}&!dimgray{dimgray}&!dodgerblue{dodgerblue}&!eggshell{eggshell}!!!hline" + + "!emeraldgreen{emeraldgreen}&!firebrick{firebrick}&!flesh{flesh}&!floralwhite{floralwhite}&!forestgreen{forestgreen}&!gainsboro{gainsboro}!!!hline" + + "!ghostwhite{ghostwhite}&!gold{gold}&!goldenrod{goldenrod}&!gray{gray}&!green{green}&!greenyellow{greenyellow}!!!hline" + + "!honeydew{honeydew}&!hotpink{hotpink}&!indianred{indianred}&!indigo{indigo}&!ivory{ivory}&!ivoryblack{ivoryblack}!!!hline" + + "!khaki{khaki}&!lavender{lavender}&!lavenderblush{lavenderblush}&!lawngreen{lawngreen}&!lemonchiffon{lemonchiffon}&!lightblue{lightblue}!!!hline" + + "!lightcoral{lightcoral}&!lightcyan{lightcyan}&!lightgrey{lightgrey}&!lightgoldenrod{lightgoldenrod}&!lightgoldenrodyellow{lightgoldenrodyellow}&!lightpink{lightpink}!!!hline" + + "!lightsalmon{lightsalmon}&!lightseagreen{lightseagreen}&!lightskyblue{lightskyblue}&!lightslateblue{lightslateblue}&!lightslategray{lightslategray}&!lightsteelblue{lightsteelblue}!!!hline" + + "!lightyellow{lightyellow}&!limegreen{limegreen}&!linen{linen}&!magenta{magenta}&!manganeseblue{manganeseblue}&!maroon{maroon}!!!hline" + + "!mediumorchid{mediumorchid}&!mediumpurple{mediumpurple}&!mediumseagreen{mediumseagreen}&!mediumslateblue{mediumslateblue}&!mediumspringgreen{mediumspringgreen}&!mediumturquoise{mediumturquoise}!!!hline" + + "!mediumvioletred{mediumvioletred}&!melon{melon}&!midnightblue{midnightblue}&!mint{mint}&!mintcream{mintcream}&!mistyrose{mistyrose}!!!hline" + + "!moccasin{moccasin}&!navajowhite{navajowhite}&!navy{navy}&!oldlace{oldlace}&!olivedrab{olivedrab}&!olive{olive}!!!hline" + + "!orange{orange}&!orangered{orangered}&!orchid{orchid}&!palegoldenrod{palegoldenrod}&!palegreen{palegreen}&!palevioletred{palevioletred}!!!hline" + + "!paleturquoise{paleturquoise}&!papayawhip{papayawhip}&!peachpuff{peachpuff}&!peacock{peacock}&!pink{pink}&!plum{plum}!!!hline" + + "!powderblue{powderblue}&!purple{purple}&!raspberry{raspberry}&!rawsienna{rawsienna}&!red{red}&!royalblue{royalblue}!!!hline" + + "!rosybrown{rosybrown}&!salmon{salmon}&!sandybrown{sandybrown}&!sapgreen{sapgreen}&!seashell{seashell}&!sepia{sepia}!!!hline" + + "!sienna{sienna}&!silver{silver}&!skyblue{skyblue}&!slateblue{slateblue}&!slategray{slategray}&!snow{snow}!!!hline" + + "!springgreen{springgreen}&!steelblue{steelblue}&!teal{teal}&!thistle{thistle}&!tomato{tomato}&!turquoise{turquoise}!!!hline" + + "!turquoiseblue{turquoiseblue}&!violet{violet}&!violetred{violetred}&!warmgrey{warmgrey}&!wheat{wheat}&!white{white}!!!hline" + + "!whitesmoke{whitesmoke}&!yellow{yellow}&&&&!!!hline" + + "!end{table}" + + "!normalsize" + + "!vspace{10}" + + "!noindent If table pass beyond the bottom of the view container, it will be move to the next one. However, if" + + " the scrollview in Header.java is specified as true, the table will not be moved.!!" + + "!end{lineblock}"); + lineblock.add("!begin{lineblock}" + + "!vspace{10}" + + "!noindent $!underlinetext{!large{!bf{!navy{8. Math Symbols}}}}$ There are over one thousand symbols in HKtex corresponding to" + + " the asana-math font with four unicode digits. Besides, common trigonometric, logarithmic, hyperbolic functions" + + " and limit are regarded as symbol. They are classified in different types for the purpose of putting the superscript" + + " and subscript. Not every symbol has superscript nor subscript. For example, if you assign a superscript to underbrace," + + " the program will stop parsing and an error message will be shown. Refer to symbol.java for the avialable symbols." + + " For optimization, uncomment any symbol that is needed, and comment out any symbol that is not needed. !!" + + "!vspace{10}" + + "!noindent $!underlinetext{!large{!bf{!navy{9. Final Comment}}}}$ HKtex is very much an ongoing endeavour. A huge amount" + + " of work is waiting to be done, e.g. increasing its efficiency and making it more compatible with Tex/Latex." + + " If you have any comment that are helpful to this course, please" + + " don't hesitate to contact me. I hope my effort is helpful to you and thank you for your attention. !!" + + "!end{lineblock}"); + } + } diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/SuperBlock.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/SuperBlock.java new file mode 100644 index 0000000000..c51f20ead6 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/SuperBlock.java @@ -0,0 +1,134 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.ArrayList; +import android.util.SparseArray; +import android.util.SparseIntArray; + +public final class SuperBlock { + + public static volatile SparseArray<ArrayList<Float>> superblocklinewidth = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> superblocklineheight = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> superblocklinedepth = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Character>> superblocktype = new SparseArray<ArrayList<Character>>(); + public static volatile SparseArray<ArrayList<String>> blockatom = new SparseArray<ArrayList<String>>(); + public static volatile SparseArray<ArrayList<Float>> blockxpos = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<Float>> blockypos = new SparseArray<ArrayList<Float>>(); + public static volatile SparseArray<ArrayList<String>> blockattribute = new SparseArray<ArrayList<String>>(); + public static volatile SparseArray<ArrayList<Integer>> blockcolumnnum = new SparseArray<ArrayList<Integer>>(); + public static volatile SparseArray<Float> ypos = new SparseArray<Float>(); + public static volatile SparseIntArray superblocklinenumber = new SparseIntArray(); + + public static volatile SparseIntArray tablenumber = new SparseIntArray(); + public static volatile SparseIntArray tablestartline = new SparseIntArray(); + public static volatile SparseIntArray tableendline = new SparseIntArray(); + public static volatile SparseArray<Float> tableheight = new SparseArray<Float>(); + public static volatile SparseIntArray titlenumber = new SparseIntArray(); + public static volatile SparseIntArray titlestartline = new SparseIntArray(); + public static volatile SparseIntArray titleendline = new SparseIntArray(); + public static volatile SparseArray<Float> titleheight = new SparseArray<Float>(); + public static volatile SparseArray<ArrayList<Integer>> pagebreak = new SparseArray<ArrayList<Integer>>(); + + public void init(int tid){ + synchronized(this){ + superblocklinewidth.put(tid,new ArrayList<Float>()); + superblocklineheight.put(tid,new ArrayList<Float>()); + superblocklinedepth.put(tid,new ArrayList<Float>()); + superblocktype.put(tid, new ArrayList<Character>()); + superblocklinenumber.put(tid, -1); + + tablenumber.put(tid, 0); + + pagebreak.put(tid, new ArrayList<Integer>()); + return; + } +} + + + public void create(int tid){ + synchronized(this){ + + superblocklinenumber.put(tid,superblocklinenumber.get(tid)+1); + + int tid2=tid*1000+superblocklinenumber.get(tid); + blockatom.put(tid2,new ArrayList<String>()); + blockxpos.put(tid2,new ArrayList<Float>()); + blockypos.put(tid2,new ArrayList<Float>()); + blockattribute.put(tid2,new ArrayList<String>()); + blockcolumnnum.put(tid2,new ArrayList<Integer>()); + superblocklinewidth.get(tid).add(0.0f); + superblocklineheight.get(tid).add(0.0f); + superblocklinedepth.get(tid).add(0.0f); + + return; + } +} + + public void addtable(int tid){ + synchronized(this){ + tablenumber.put(tid, tablenumber.get(tid)+1); + tablestartline.put(tid*1000+tablenumber.get(tid), -1); + tableendline.put(tid*1000+tablenumber.get(tid), -1); + tableheight.put(tid*1000+tablenumber.get(tid), 0.0f); + } + } + + public void addtitle(int tid){ + synchronized(this){ + titlenumber.put(tid, 1); + titlestartline.put(tid, 0); + titleendline.put(tid, -1); + titleheight.put(tid, 0.0f); + } + } + + public void add(int tid, SparseArray<ArrayList<String>> atom, + SparseArray<ArrayList<Float>> xpos,SparseArray<ArrayList<Float>> ypos,SparseArray<ArrayList<String>> attribute, Float tsuperblockwidth, Float tsuperblockheight, Float tsuperblockdepth, Character type, Integer columnnum) { + synchronized(this){ + int tid2=tid*1000+superblocklinenumber.get(tid); + int i=0; + for (i=0;i<=atom.get(tid).size()-1;i++){ + blockatom.get(tid2).add(atom.get(tid).get(i)); + blockxpos.get(tid2).add(xpos.get(tid).get(i)); + blockypos.get(tid2).add(ypos.get(tid).get(i)); + blockattribute.get(tid2).add(attribute.get(tid).get(i)); + blockcolumnnum.get(tid2).add(columnnum); + } + superblocklinewidth.get(tid).set(superblocklinenumber.get(tid), superblocklinewidth.get(tid).get(superblocklinenumber.get(tid))+tsuperblockwidth); + float maxtop=Math.max(superblocklineheight.get(tid).get(superblocklinenumber.get(tid))-superblocklinedepth.get(tid).get(superblocklinenumber.get(tid)), tsuperblockheight-tsuperblockdepth); + superblocklinedepth.get(tid).set(superblocklinenumber.get(tid), Math.max(superblocklinedepth.get(tid).get(superblocklinenumber.get(tid)),tsuperblockdepth)); + superblocklineheight.get(tid).set(superblocklinenumber.get(tid),maxtop+superblocklinedepth.get(tid).get(superblocklinenumber.get(tid))); + superblocktype.get(tid).add(type); + return; + } + } + + public void add(int tid, ArrayList<String> atom, + ArrayList<Float> xpos,ArrayList<Float> ypos,ArrayList<String> attribute, Float tsuperblockwidth, Float tsuperblockheight, Float tsuperblockdepth, Character type, Integer columnnum) { + synchronized(this){ + int tid2=tid*1000+superblocklinenumber.get(tid); + + for (int i=0;i<=atom.size()-1;i++){ + blockatom.get(tid2).add(atom.get(i)); + blockxpos.get(tid2).add(xpos.get(i)); + blockypos.get(tid2).add(ypos.get(i)); + blockattribute.get(tid2).add(attribute.get(i)); + blockcolumnnum.get(tid2).add(columnnum); + } + superblocklinewidth.get(tid).set(superblocklinenumber.get(tid), superblocklinewidth.get(tid).get(superblocklinenumber.get(tid))+tsuperblockwidth); + float maxtop=Math.max(superblocklineheight.get(tid).get(superblocklinenumber.get(tid))-superblocklinedepth.get(tid).get(superblocklinenumber.get(tid)), tsuperblockheight-tsuperblockdepth); + superblocklinedepth.get(tid).set(superblocklinenumber.get(tid), Math.max(superblocklinedepth.get(tid).get(superblocklinenumber.get(tid)),tsuperblockdepth)); + superblocklineheight.get(tid).set(superblocklinenumber.get(tid),maxtop+superblocklinedepth.get(tid).get(superblocklinenumber.get(tid))); + superblocktype.get(tid).add(type); + return; + } + } + +}
\ No newline at end of file diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Symbol.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Symbol.java new file mode 100644 index 0000000000..3f2c892bf4 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Symbol.java @@ -0,0 +1,2861 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + +import java.util.HashMap; + +public class Symbol { + + public static HashMap<String, Integer> symboltype = new HashMap<String, Integer>(); + public static HashMap<String, Integer> symbolsubtype = new HashMap<String, Integer>(); + public static HashMap<String, String> symbolunicode = new HashMap<String, String>(); + public static HashMap<String, String> matchsymbol = new HashMap<String, String>(); + +public void symbol() { + + + matchsymbol.put("lparen","rparen"); + matchsymbol.put("lbrack","rbrack"); + matchsymbol.put("lbrace","rbrace"); +/* matchsymbol.put("lceil","rceil"); + matchsymbol.put("lfloor","rfloor"); + matchsymbol.put("ulcorner","urcorner"); + matchsymbol.put("llcorner","rlcorner"); + matchsymbol.put("lbag","rbag"); + matchsymbol.put("lBrack","rBrack"); + matchsymbol.put("langle","rangle"); + matchsymbol.put("lAngle","rAngle"); + matchsymbol.put("Lbrbrak","Rbrbrak"); + matchsymbol.put("lgroup","rgroup"); + matchsymbol.put("lBrace","rBrace"); + matchsymbol.put("lParen","rParen"); + matchsymbol.put("llparenthesis","rlparenthesis"); + matchsymbol.put("llangle","rlangle"); + matchsymbol.put("lbrackubar","rbrackubar"); + matchsymbol.put("lbrackultick","rbrackultick"); + matchsymbol.put("lbracklltick","rbracklltick"); + matchsymbol.put("langledot","rangledot"); + matchsymbol.put("lparenless","rparenless"); + matchsymbol.put("lparengtr","rparengtr"); + matchsymbol.put("lblkbrbrak","rblkbrbrak"); + matchsymbol.put("lvzigzag","rvzigzag"); + matchsymbol.put("Lvzigzag","Rvzigzag"); + matchsymbol.put("lcurvyangle","rcurvyangle"); + matchsymbol.put("lbrbrak","rbrbrak"); */ + + + symboltype.put("lparen",1); + symboltype.put("lbrack",1); + symboltype.put("lbrace",1); +/* symboltype.put("lceil",1); + symboltype.put("lfloor",1); + symboltype.put("ulcorner",1); + symboltype.put("llcorner",1); + symboltype.put("lbag",1); + symboltype.put("lBrack",1); + symboltype.put("langle",1); + symboltype.put("lAngle",1); + symboltype.put("Lbrbrak",1); + symboltype.put("lgroup",1); + symboltype.put("lBrace",1); + symboltype.put("lParen",1); + symboltype.put("llparenthesis",1); + symboltype.put("llangle",1); + symboltype.put("lbrackubar",1); + symboltype.put("lbrackultick",1); + symboltype.put("lbracklltick",1); + symboltype.put("langledot",1); + symboltype.put("lparenless",1); + symboltype.put("lparengtr",1); + symboltype.put("lblkbrbrak",1); + symboltype.put("lvzigzag",1); + symboltype.put("Lvzigzag",1); + symboltype.put("lcurvyangle",1); + symboltype.put("lbrbrak",1); */ + symboltype.put("rparen",2); + symboltype.put("rbrack",2); + symboltype.put("rbrace",2); +/* symboltype.put("rceil",2); + symboltype.put("rfloor",2); + symboltype.put("urcorner",2); + symboltype.put("lrcorner",2); + symboltype.put("rbag",2); + symboltype.put("rBrack",2); + symboltype.put("rangle",2); + symboltype.put("rAngle",2); + symboltype.put("Rbrbrak",2); + symboltype.put("rgroup",2); + symboltype.put("rBrace",2); + symboltype.put("rParen",2); + symboltype.put("rrparenthesis",2); + symboltype.put("rrangle",2); + symboltype.put("rbrackubar",2); + symboltype.put("rbrackurtick",2); + symboltype.put("rbracklrtick",2); + symboltype.put("rangledot",2); + symboltype.put("rparenless",2); + symboltype.put("rparengtr",2); + symboltype.put("rblkbrbrak",2); + symboltype.put("rvzigzag",2); + symboltype.put("Rvzigzag",2); + symboltype.put("rcurvyangle",2); + symboltype.put("rbrbrak",2); */ + symboltype.put("vert",3); + /* symboltype.put("Vert",3); + symboltype.put("Vvert",3); */ + + // symboltype.put("overbracket",5); + // symboltype.put("overparen",5); + symboltype.put("overbrace",5); + // symboltype.put("underbracket",6); + // symboltype.put("underparen",6); + symboltype.put("underbrace",6); + symboltype.put("grave",7); symbolsubtype.put("grave",1); + symboltype.put("acute",7); symbolsubtype.put("acute",1); + symboltype.put("hat",7); symbolsubtype.put("hat",1); + symboltype.put("tilde",7); symbolsubtype.put("tilde",1); + symboltype.put("overbar",7); symbolsubtype.put("overbar",1); + symboltype.put("breve",7); symbolsubtype.put("breve",1); + symboltype.put("dot",7); symbolsubtype.put("dot",1); +/* symboltype.put("ddot",7); symbolsubtype.put("ddot",1); + symboltype.put("ocirc",7); symbolsubtype.put("ocirc",1); + symboltype.put("check",7);symbolsubtype.put("check",1); + symboltype.put("not",7); symbolsubtype.put("not",1); + symboltype.put("leftharpoonaccent",7);symbolsubtype.put("leftharpoonaccent",2); + symboltype.put("rightharpoonaccent",7); symbolsubtype.put("rightharpoonaccent",2); + symboltype.put("vertoverlay",7); // cancel + symboltype.put("overleftarrow",7); symbolsubtype.put("overleftarrow",2); */ + symboltype.put("vec",7);symbolsubtype.put("vec",2); + symboltype.put("dddot",7); symbolsubtype.put("dddot",2); +/* symboltype.put("ddddot",7);symbolsubtype.put("ddddot",2); + symboltype.put("overleftrightarrow",7); symbolsubtype.put("overleftrightarrow",2); + symboltype.put("widebridgeabove",7); symbolsubtype.put("widebridgeabove",2); + symboltype.put("threeunderdot",8); + symboltype.put("underrightharpoondown",8); + symboltype.put("underleftharpoondown",8); + symboltype.put("underleftarrow",8); + symboltype.put("underrightarrow",8); */ + + symboltype.put("sqrt",9); + symboltype.put("cuberoot",9); + symboltype.put("fourthroot",9); + + symboltype.put("plus",10); + symboltype.put("pm",10); + /* symboltype.put("cdotp",10); + symboltype.put("times",10); + symboltype.put("div",10); + symboltype.put("dagger",10); + symboltype.put("ddagger",10); + symboltype.put("smblkcircle",10); + symboltype.put("tieconcat",10); + symboltype.put("fracslash",10); + symboltype.put("upand",10); + symboltype.put("minus",10); + symboltype.put("mp",10); + symboltype.put("dotplus",10); + symboltype.put("divslash",10); + symboltype.put("smallsetminus",10); + symboltype.put("ast",10); + symboltype.put("vysmwhtcircle",10); + symboltype.put("vysmblkcircle",10); + symboltype.put("wedge",10); + symboltype.put("vee",10); + symboltype.put("cap",10); + symboltype.put("cup",10); + symboltype.put("dotminus",10); + symboltype.put("invlazys",10); + symboltype.put("wr",10); + symboltype.put("cupleftarrow",10); + symboltype.put("cupdot",10); + symboltype.put("uplus",10); + symboltype.put("sqcap",10); + symboltype.put("sqcup",10); + symboltype.put("oplus",10); + symboltype.put("ominus",10); + symboltype.put("otimes",10); + symboltype.put("oslash",10); + symboltype.put("odot",10); + symboltype.put("circledcirc",10); + symboltype.put("circleddast",10); + symboltype.put("circledequal",10); + symboltype.put("circleddash",10); + symboltype.put("boxplus",10); + symboltype.put("boxminus",10); + symboltype.put("boxtimes",10); + symboltype.put("boxdot",10); + symboltype.put("intercal",10); + symboltype.put("veebar",10); + symboltype.put("barwedge",10); + symboltype.put("barvee",10); + symboltype.put("smwhtdiamond",10); */ + symboltype.put("cdot",10); + /* symboltype.put("star",10); + symboltype.put("divideontimes",10); + symboltype.put("ltimes",10); + symboltype.put("rtimes",10); + symboltype.put("leftthreetimes",10); + symboltype.put("rightthreetimes",10); + symboltype.put("curlyvee",10); + symboltype.put("curlywedge",10); + symboltype.put("Cap",10); + symboltype.put("Cup",10); + symboltype.put("varbarwedge",10); + symboltype.put("vardoublewedge",10); + symboltype.put("obar",10); + symboltype.put("bigtriangleup",10); + symboltype.put("triangleright",10); + symboltype.put("triangleleft",10); + symboltype.put("mdlgwhtcircle",10); + symboltype.put("boxbar",10); + symboltype.put("veedot",10); + symboltype.put("wedgedot",10); + symboltype.put("lozengeminus",10); + symboltype.put("concavediamond",10); + symboltype.put("concavediamondtickleft",10); + symboltype.put("concavediamondtickright",10); + symboltype.put("whitesquaretickleft",10); + symboltype.put("whitesquaretickright",10); + symboltype.put("typecolon",10); + symboltype.put("circlehbar",10); + symboltype.put("circledvert",10); + symboltype.put("circledparallel",10); + symboltype.put("obslash",10); + symboltype.put("operp",10); + symboltype.put("olessthan",10); + symboltype.put("ogreaterthan",10); + symboltype.put("boxdiag",10); + symboltype.put("boxbslash",10); + symboltype.put("boxast",10); + symboltype.put("boxcicle",10); + symboltype.put("boxbox",10); + symboltype.put("triangleserifs",10); + symboltype.put("hourglass",10); + symboltype.put("blackhourglass",10); + symboltype.put("shuffle",10); + symboltype.put("mdlgblkozenge",10); + symboltype.put("setminus",10); + symboltype.put("dsol",10); + symboltype.put("rsolbar",10); + symboltype.put("doubleplus",10); + symboltype.put("tripleplus",10); + symboltype.put("tplus",10); + symboltype.put("tminus",10); + symboltype.put("ringplus",10); + symboltype.put("plushat",10); + symboltype.put("simplus",10); + symboltype.put("plusdot",10); + symboltype.put("plussim",10); + symboltype.put("plussubtwo",10); + symboltype.put("plustrif",10); + symboltype.put("commaminus",10); + symboltype.put("minusdot",10); + symboltype.put("minusfdots",10); + symboltype.put("minusrdots",10); + symboltype.put("opluslhrim",10); + symboltype.put("oplusrhrim",10); + symboltype.put("vectimes",10); + symboltype.put("dottimes",10); + symboltype.put("timesbar",10); + symboltype.put("btimes",10); + symboltype.put("smashtimes",10); + symboltype.put("otimeslhrim",10); + symboltype.put("otimesrhrim",10); + symboltype.put("otimeshat",10); + symboltype.put("Otimes",10); + symboltype.put("odiv",10); + symboltype.put("triangleplus",10); + symboltype.put("triangleminus",10); + symboltype.put("triangletimes",10); + symboltype.put("intprod",10); + symboltype.put("intprodr",10); + symboltype.put("fcmp",10); + symboltype.put("amalg",10); + symboltype.put("capdot",10); + symboltype.put("barcup",10); + symboltype.put("barcap",10); + symboltype.put("capwedge",10); + symboltype.put("cupvee",10); + symboltype.put("cupovercap",10); + symboltype.put("cupovercup",10); + symboltype.put("cupbarcap",10); + symboltype.put("capbarcup",10); + symboltype.put("twocups",10); + symboltype.put("twocaps",10); + symboltype.put("closedvarcup",10); + symboltype.put("closedvarcap",10); + symboltype.put("Sqcap",10); + symboltype.put("Sqcup",10); + symboltype.put("closedvarcupsmashprod",10); + symboltype.put("wedgeodot",10); + symboltype.put("veeodot",10); + symboltype.put("Wedge",10); + symboltype.put("Vee",10); + symboltype.put("wedgeonwedge",10); + symboltype.put("veeonvee",10); + symboltype.put("bigslopedvee",10); + symboltype.put("bigslopedwedge",10); + symboltype.put("wedgemidvert",10); + symboltype.put("veemidvert",10); + symboltype.put("midbarwedge",10); + symboltype.put("midbarvee",10); + symboltype.put("doublebarwedge",10); + symboltype.put("wedgebar",10); + symboltype.put("wedgedoublebar",10); + symboltype.put("varveebar",10); + symboltype.put("doublebarvee",10); + symboltype.put("veedoublebar",10); + symboltype.put("dsub",10); + symboltype.put("rsub",10); + symboltype.put("eqqplus",10); + symboltype.put("pluseqq",10); + symboltype.put("interleave",10); + symboltype.put("nhVvert",10); + symboltype.put("threedotcolon",10); + symboltype.put("trslash",10); + symboltype.put("sslash",10); + symboltype.put("talloblong",10); */ +/* symboltype.put("octothorpe",11); + symboltype.put("mathdollar",11); + symboltype.put("percent",11); + symboltype.put("ampersand",11); + symboltype.put("period",11); + symboltype.put("mathslash",11); + symboltype.put("question",11); + symboltype.put("atsign",11); */ + symboltype.put("backslash",11); + /* symboltype.put("sterling",11); + symboltype.put("yen",11); + symboltype.put("neg",11); + symboltype.put("horizbar",11); + symboltype.put("twolowline",11); + symboltype.put("enleadertwodots",11); + symboltype.put("unicodeellipsis",11); + symboltype.put("prime",11); + symboltype.put("dprime",11); + symboltype.put("trprime",11); + symboltype.put("backprime",11); + symboltype.put("backdprime",11); + symboltype.put("backtrprime",11); + symboltype.put("Exclam",11); + symboltype.put("qprime",11); + symboltype.put("euro",11); + symboltype.put("enclosecircle",11); + symboltype.put("enclosesquare",11); + symboltype.put("enclosediamond",11); + symboltype.put("enclosetriangle",11); + symboltype.put("Eulerconst",11); + symboltype.put("Planckconst",11); + symboltype.put("mho",11); + symboltype.put("Finv",11); + symboltype.put("Bbbpi",11); + symboltype.put("Game",11); + symboltype.put("sansLturned",11); + symboltype.put("sansLmirrored",11); + symboltype.put("Yup",11); + symboltype.put("mitBbbD",11); + symboltype.put("mitBbbd",11); + symboltype.put("mitBbbe",11); + symboltype.put("mitBbbi",11); + symboltype.put("mitBbbj",11); + symboltype.put("updownarrowbar",11); + symboltype.put("linefeed",11); + symboltype.put("carriagereturn",11); + symboltype.put("barovernorthwestarrow",11); + symboltype.put("barleftarrowrightarrowbar",11); + symboltype.put("acwopencirclearrow",11); + symboltype.put("cwopencirclearrow",11); + symboltype.put("nHuparrow",11); + symboltype.put("nHdownarrow",11); + symboltype.put("leftdasharrow",11); + symboltype.put("updasharrow",11); + symboltype.put("rightdasharrow",11); + symboltype.put("downdasharrow",11); + symboltype.put("leftwhitearrow",11); + symboltype.put("upwhitearrow",11); + symboltype.put("rightwhitearrow",11); + symboltype.put("downwhitearrow",11); + symboltype.put("whitearrowupfrombar",11); */ + symboltype.put("forall",11); + symboltype.put("complement",11); + symboltype.put("exists",11); + symboltype.put("nexists",11); + symboltype.put("varnothing",11); + symboltype.put("increment",11); + symboltype.put("QED",11); + symboltype.put("infty",11); + symboltype.put("rightangle",11); + symboltype.put("angle",11); + symboltype.put("measuredangle",11); + symboltype.put("sphericalangle",11); + symboltype.put("therefore",11); + symboltype.put("because",11); +/* symboltype.put("sinewave",11); + symboltype.put("top",11); + symboltype.put("bot",11); + symboltype.put("hermitmatrix",11); + symboltype.put("measuredrightangle",11); + symboltype.put("varlrtriangle",11); + symboltype.put("unicodecdots",11); + symboltype.put("diameter",11); + symboltype.put("invnot",11); + symboltype.put("turnednot",11); + symboltype.put("inttop",11); + symboltype.put("intbottom",11); + symboltype.put("lparenuend",11); + symboltype.put("lparenextender",11); + symboltype.put("lparenlend",11); + symboltype.put("rparenuend",11); + symboltype.put("rparenextender",11); + symboltype.put("rparenlend",11); + symboltype.put("lbrackuend",11); + symboltype.put("lbrackextender",11); + symboltype.put("lbracklend",11); + symboltype.put("rbrackuend",11); + symboltype.put("rbrackextender",11); + symboltype.put("rbracklend",11); + symboltype.put("lbraceuend",11); + symboltype.put("lbracemid",11); + symboltype.put("lbracelend",11); + symboltype.put("vbraceextender",11); + symboltype.put("rbraceuend",11); + symboltype.put("rbracemid",11); + symboltype.put("rbracelend",11); + symboltype.put("intextender",11); + symboltype.put("harrowextender",11); + symboltype.put("sumtop",11); + symboltype.put("sumbottom",11); + symboltype.put("sqrtbottom",11); + symboltype.put("obrbrak",11); + symboltype.put("ubrbrak",11); + symboltype.put("blanksymbol",11); + symboltype.put("mathvisiblespace",11); + symboltype.put("mdlgblksquare",11); + symboltype.put("mdlgwhtsquare",11); + symboltype.put("bigblacktriangleup",11); + symboltype.put("blacktriangleright",11); + symboltype.put("blackpointerright",11); + symboltype.put("whitepointerright",11); + symboltype.put("bigblacktriangledown",11); + symboltype.put("bigtriangledown",11); + symboltype.put("blacktriangleleft",11); + symboltype.put("blackpointerleft",11); + symboltype.put("whitepointerleft",11); + symboltype.put("bullseye",11); + symboltype.put("mdlgblkcircle",11); + symboltype.put("smwhtcircle",11); + symboltype.put("squareleftblack",11); + symboltype.put("squarerightblack",11); + symboltype.put("mdwhtsquare",11); + symboltype.put("mdblksquare",11); + symboltype.put("bigstar",11); + symboltype.put("bigwhitestar",11); + symboltype.put("spadesuit",11); + symboltype.put("heartsuit",11); + symboltype.put("diamondsuit",11); + symboltype.put("clubsuit",11); + symboltype.put("varspadesuit",11); + symboltype.put("varheartsuit",11); + symboltype.put("vardiamondsuit",11); + symboltype.put("varclubsuit",11); + symboltype.put("quarternote",11); + symboltype.put("eighthnote",11); + symboltype.put("flat",11); + symboltype.put("natural",11); + symboltype.put("sharp",11); + symboltype.put("dicei",11); + symboltype.put("diceii",11); + symboltype.put("diceiii",11); + symboltype.put("diceiv",11); + symboltype.put("dicev",11); + symboltype.put("dicevi",11); + symboltype.put("checkmark",11); + symboltype.put("maltese",11); + symboltype.put("varstar",11); + symboltype.put("threedangle",11); + symboltype.put("whiteinwhitetriangle",11); + symboltype.put("subsetcirc",11); + symboltype.put("supsetcirc",11); + symboltype.put("diamondcdot",11); + symboltype.put("rdiagovfdiag",11); + symboltype.put("fdiagovrdiag",11); + symboltype.put("seovnearrow",11); + symboltype.put("neovsearrow",11); + symboltype.put("fdiagovnearrow",11); + symboltype.put("rdiagovsearrow",11); + symboltype.put("neovnwarrow",11); + symboltype.put("nwovnearrow",11); + symboltype.put("uprightcurvearrow",11); + symboltype.put("downrightcurvedarrow",11); + symboltype.put("mdsmblkcircle",11); + symboltype.put("fourvdots",11); + symboltype.put("vzigzag",11); + symboltype.put("measuredangleleft",11); + symboltype.put("rightanglesqr",11); + symboltype.put("rightanglemdot",11); + symboltype.put("angles",11); + symboltype.put("angdnr",11); + symboltype.put("gtlpar",11); + symboltype.put("sphericalangleup",11); + symboltype.put("turnangle",11); + symboltype.put("revangle",11); + symboltype.put("angleubar",11); + symboltype.put("revangleubar",11); + symboltype.put("wideangledown",11); + symboltype.put("wideangleup",11); + symboltype.put("measanglerutone",11); + symboltype.put("measanglelutonw",11); + symboltype.put("measanglerdtose",11); + symboltype.put("measangleldtosw",11); + symboltype.put("measangleurtone",11); + symboltype.put("measangleultonw",11); + symboltype.put("measangledrtose",11); + symboltype.put("measangledltosw",11); + symboltype.put("revemptyset",11); + symboltype.put("emptysetobar",11); + symboltype.put("emptysetocirc",11); + symboltype.put("emptysetoarr",11); + symboltype.put("emptysetoarrl",11); + symboltype.put("obot",11); + symboltype.put("olcross",11); + symboltype.put("odotslashdot",11); + symboltype.put("uparrowoncircle",11); + symboltype.put("circledwhitebullet",11); + symboltype.put("circledbullet",11); + symboltype.put("cirscir",11); + symboltype.put("cirE",11); + symboltype.put("boxonbox",11); + symboltype.put("triangleodot",11); + symboltype.put("triangleubar",11); + symboltype.put("triangles",11); + symboltype.put("iinfin",11); + symboltype.put("tieinfty",11); + symboltype.put("nvinfty",11); + symboltype.put("laplac",11); + symboltype.put("thermod",11); + symboltype.put("downtriangleleftblack",11); + symboltype.put("downtrianglerightblack",11); + symboltype.put("blackdiamonddownarrow",11); + symboltype.put("circledownarrow",11); + symboltype.put("blackcircledownarrow",11); + symboltype.put("errbarsquare",11); + symboltype.put("errbarblacksquare",11); + symboltype.put("errbardiamond",11); + symboltype.put("errbarblackdiamond",11); + symboltype.put("errbarcircle",11); + symboltype.put("errbarblackcircle",11); + symboltype.put("perps",11); + symboltype.put("topcir",11); + symboltype.put("dottedsquare",11); + symboltype.put("lgblksquare",11); + symboltype.put("lgwhtsquare",11); + symboltype.put("medwhitestar",11); + symboltype.put("medblackstar",11); + symboltype.put("smwhitestar",11); */ + symboltype.put("less",12); + symboltype.put("equal",12); + symboltype.put("greater",12); +/* symboltype.put("closure",12); + symboltype.put("leftarrow",12); + symboltype.put("uparrow",12); + symboltype.put("rightarrow",12); + symboltype.put("downarrow",12); + symboltype.put("leftrightarrow",12); + symboltype.put("updownarrow",12); + symboltype.put("nwarrow",12); + symboltype.put("nearrow",12); + symboltype.put("searrow",12); + symboltype.put("swarrow",12); + symboltype.put("nleftarrow",12); + symboltype.put("nrightarrow",12); + symboltype.put("leftwavearrow",12); + symboltype.put("rightwavearrow",12); + symboltype.put("twoheadleftarrow",12); + symboltype.put("twoheaduparrow",12); + symboltype.put("twoheadrightarrow",12); + symboltype.put("twoheaddownarrow",12); + symboltype.put("leftarrowtail",12); + symboltype.put("rightarrowtail",12); + symboltype.put("mapsfrom",12); + symboltype.put("mapsup",12); + symboltype.put("mapsto(",12); + symboltype.put("mapsdown",12); + symboltype.put("hookleftarrow",12); + symboltype.put("hookrightarrow",12); + symboltype.put("looparrowleft",12); + symboltype.put("looparrowright",12); + symboltype.put("leftrightsquigarrow",12); + symboltype.put("nleftrightarrow",12); + symboltype.put("downzigzagarrow",12); + symboltype.put("Lsh",12); + symboltype.put("Rsh",12); + symboltype.put("Ldsh",12); + symboltype.put("Rdsh",12); + symboltype.put("curvearrowleft",12); + symboltype.put("curvearrowright",12); + symboltype.put("leftharpoonup",12); + symboltype.put("leftharpoondown",12); + symboltype.put("upharpoonright",12); + symboltype.put("upharpoonleft",12); + symboltype.put("rightharpoonup",12); + symboltype.put("rightharpoondown",12); + symboltype.put("downharpoonright",12); + symboltype.put("downharpoonleft",12); + symboltype.put("rightleftarrows",12); + symboltype.put("updownarrows",12); + symboltype.put("leftrightarrows",12); + symboltype.put("leftleftarrows",12); + symboltype.put("upuparrows",12); + symboltype.put("rightrightarrows",12); + symboltype.put("downdownarrows",12); + symboltype.put("leftrightharpoons",12); + symboltype.put("rightleftharpoons",12); + symboltype.put("nLeftarrow",12); + symboltype.put("nLeftrightarrow",12); + symboltype.put("nRightarrow",12); + symboltype.put("Leftarrow",12); + symboltype.put("Uparrow",12); + symboltype.put("Rightarrow",12); + symboltype.put("Downarrow",12); + symboltype.put("Leftrightarrow",12); + symboltype.put("Updownarrow",12); + symboltype.put("Nwarrow",12); + symboltype.put("Nearrow",12); + symboltype.put("Searrow",12); + symboltype.put("Swarrow",12); + symboltype.put("Lleftarrow",12); + symboltype.put("Rrightarrow",12); + symboltype.put("leftsquigarrow",12); + symboltype.put("rightsquigarrow",12); + symboltype.put("barleftarrow",12); + symboltype.put("rightarrowbar",12); + symboltype.put("circleonrightarrow",12); + symboltype.put("downuparrows",12); + symboltype.put("rightthreearrows",12); + symboltype.put("nvleftarrow",12); + symboltype.put("nvrightarrow",12); + symboltype.put("nvleftrightarrow",12); + symboltype.put("nVleftarrow",12); + symboltype.put("nVrightarrow",12); + symboltype.put("nVleftrightarrow",12); + symboltype.put("leftarrowtriangle",12); + symboltype.put("rightarrowtriangle",12); + symboltype.put("leftrightarrowtriangle",12); + symboltype.put("in",12); + symboltype.put("notin",12); + symboltype.put("smallin",12); + symboltype.put("ni",12); + symboltype.put("nni",12); + symboltype.put("smallni",12); + symboltype.put("propto",12); + symboltype.put("mid",12); + symboltype.put("nmid",12); + symboltype.put("parallel",12); + symboltype.put("nparallel",12); + symboltype.put("mathratio",12); + symboltype.put("Colon",12); + symboltype.put("dashcolon",12); + symboltype.put("dotsminusdots",12); + symboltype.put("kernelcontraction",12); */ + symboltype.put("sim",12); +// symboltype.put("backsim",12); + symboltype.put("nsim",12); + symboltype.put("eqsim",12); + symboltype.put("simeq",12); + symboltype.put("nsime",12); + // symboltype.put("cong",12); + // symboltype.put("simneqq",12); + // symboltype.put("ncong",12); + symboltype.put("approx",12); + symboltype.put("napprox",12); + symboltype.put("approxeq",12); + /* symboltype.put("approxident",12); + symboltype.put("backcong",12); + symboltype.put("asymp",12); + symboltype.put("Bumpeq",12); + symboltype.put("bumpeq",12); + symboltype.put("doteq",12); + symboltype.put("Doteq",12); + symboltype.put("fallingdotseq",12); + symboltype.put("risingdotseq",12); + symboltype.put("coloneq",12); + symboltype.put("eqcolon",12); + symboltype.put("eqcirc",12); + symboltype.put("circeq",12); + symboltype.put("arceq",12); + symboltype.put("wedgeq",12); + symboltype.put("veeeq",12); + symboltype.put("stareq",12); + symboltype.put("triangleq",12); + symboltype.put("eqdef",12); + symboltype.put("measeq",12); + symboltype.put("questeq",12); */ + symboltype.put("ne",12); + symboltype.put("equiv",12); + symboltype.put("nequiv",12); + symboltype.put("Equiv",12); + symboltype.put("leq",12); + symboltype.put("geq",12); + symboltype.put("leqq",12); + symboltype.put("geqq",12); + symboltype.put("lneqq",12); + symboltype.put("gneqq",12); + symboltype.put("ll",12); + symboltype.put("gg",12); + /* symboltype.put("between",12); + symboltype.put("nasymp",12); + symboltype.put("nless",12); + symboltype.put("ngtr",12); + symboltype.put("nleq",12); + symboltype.put("ngeq",12); + symboltype.put("lesssim",12); + symboltype.put("gtrsim",12); + symboltype.put("nlesssim",12); + symboltype.put("ngtrsim",12); + symboltype.put("lessgtr",12); + symboltype.put("gtrless",12); + symboltype.put("nlessgtr",12); + symboltype.put("ngtrless",12); + symboltype.put("prec",12); + symboltype.put("succ",12); + symboltype.put("preccurlyeq",12); + symboltype.put("succcurlyeq",12); + symboltype.put("precsim",12); + symboltype.put("succsim",12); + symboltype.put("nprec",12); + symboltype.put("nsucc",12); + symboltype.put("subset",12); + symboltype.put("supset",12); + symboltype.put("nsubset",12); + symboltype.put("nsupset",12); + symboltype.put("subseteq",12); + symboltype.put("supseteq",12); + symboltype.put("nsubseteq",12); + symboltype.put("nsupseteq",12); + symboltype.put("subsetneq",12); + symboltype.put("supsetneq",12); + symboltype.put("sqsubset",12); + symboltype.put("sqsupset",12); + symboltype.put("sqsubseteq",12); + symboltype.put("sqsupseteq",12); + symboltype.put("vdash",12); + symboltype.put("dashv",12); + symboltype.put("assert",12); + symboltype.put("models",12); + symboltype.put("vDash",12); + symboltype.put("Vdash",12); + symboltype.put("Vvdash",12); + symboltype.put("VDash",12); + symboltype.put("nvdash",12); + symboltype.put("nvDash",12); + symboltype.put("nVdash",12); + symboltype.put("nVDash",12); + symboltype.put("prurel",12); + symboltype.put("scurel",12); + symboltype.put("vartriangleleft",12); + symboltype.put("vartriangleright",12); + symboltype.put("trianglelefteq",12); + symboltype.put("trianglerighteq",12); + symboltype.put("origof",12); + symboltype.put("imageof",12); + symboltype.put("multimap",12); + symboltype.put("bowtie",12); + symboltype.put("backsimeq",12); + symboltype.put("Subset",12); + symboltype.put("Supset",12); + symboltype.put("pitchfork",12); + symboltype.put("equalparallel",12); + symboltype.put("lessdot",12); + symboltype.put("gtrdot",12); + symboltype.put("lll",12); + symboltype.put("ggg",12); + symboltype.put("lesseqgtr",12); + symboltype.put("gtreqless",12); + symboltype.put("eqless",12); + symboltype.put("eqgtr",12); + symboltype.put("curlyeqprec",12); + symboltype.put("curlyeqsucc",12); + symboltype.put("npreccurlyeq",12); + symboltype.put("nsucccurlyeq",12); + symboltype.put("nsqsubseteq",12); + symboltype.put("nsqsupseteq",12); + symboltype.put("sqsubsetneq",12); + symboltype.put("sqsupsetneq",12); + symboltype.put("lnsim",12); + symboltype.put("gnsim",12); + symboltype.put("precnsim",12); + symboltype.put("succnsim",12); + symboltype.put("nvartriangleleft",12); + symboltype.put("nvartriangleright",12); + symboltype.put("ntrianglelefteq",12); + symboltype.put("ntrianglerighteq",12); + symboltype.put("vdots",12); + symboltype.put("adots",12); + symboltype.put("ddots",12); + symboltype.put("disin",12); + symboltype.put("varisins",12); + symboltype.put("isins",12); + symboltype.put("isindot",12); + symboltype.put("varisinobar",12); + symboltype.put("isinobar",12); + symboltype.put("isinvb",12); + symboltype.put("isinE",12); + symboltype.put("nisd",12); + symboltype.put("varnis",12); + symboltype.put("nis",12); + symboltype.put("varniobar",12); + symboltype.put("niobar",12); + symboltype.put("bagmember",12); + symboltype.put("frown",12); + symboltype.put("smile",12); + symboltype.put("perp",12); + symboltype.put("bsolhsub",12); + symboltype.put("suphsol",12); + symboltype.put("upin",12); + symboltype.put("pullback",12); + symboltype.put("pushout",12); + symboltype.put("DashVDash",12); + symboltype.put("dashVdash",12); + symboltype.put("multimapinv",12); + symboltype.put("vlongdash",12); + symboltype.put("longdashv",12); + symboltype.put("cirbot",12); + symboltype.put("UUparrow",12); + symboltype.put("DDownarrow",12); + symboltype.put("acwgapcirclearrow",12); + symboltype.put("cwgapcirclearrow",12); + symboltype.put("rightarrowonoplus",12); + symboltype.put("longleftarrow",12); + symboltype.put("longrightarrow",12); + symboltype.put("longleftrightarrow",12); + symboltype.put("Longleftarrow",12); + symboltype.put("Longrightarrow",12); + symboltype.put("Longleftrightarrow",12); + symboltype.put("longmapsfrom",12); + symboltype.put("longmapsto",12); + symboltype.put("Longmapsfrom",12); + symboltype.put("Longmapsto",12); + symboltype.put("longrightsquigarrow",12); + symboltype.put("nvtwoheadrightarrow",12); + symboltype.put("nVtwoheadrightarrow",12); + symboltype.put("nvLeftarrow",12); + symboltype.put("nvRightarrow",12); + symboltype.put("nvLeftrightarrow",12); + symboltype.put("twoheadmapsto",12); + symboltype.put("Mapsfrom",12); + symboltype.put("Mapsto",12); + symboltype.put("downarrowbarred",12); + symboltype.put("uparrowbarred",12); + symboltype.put("Uuparrow",12); + symboltype.put("Ddownarrow",12); + symboltype.put("leftbkarrow",12); + symboltype.put("rightbkarrow",12); + symboltype.put("leftdbkarrow",12); + symboltype.put("dbkarow",12); + symboltype.put("drbkarow",12); + symboltype.put("rightdotarrow",12); + symboltype.put("baruparrow",12); + symboltype.put("downarrowbar",12); + symboltype.put("nvrightarrowtail",12); + symboltype.put("nVrightarrowtail",12); + symboltype.put("twoheadrightarrowtail",12); + symboltype.put("nvtwoheadrightarrowtail",12); + symboltype.put("nVtwoheadrightarrowtail",12); + symboltype.put("lefttail",12); + symboltype.put("righttail",12); + symboltype.put("leftdbltail",12); + symboltype.put("rightdbltail",12); + symboltype.put("diamondleftarrow",12); + symboltype.put("rightarrowdiamond",12); + symboltype.put("diamondleftarrowbar",12); + symboltype.put("barrightarrowdiamond",12); + symboltype.put("nwsearrow",12); + symboltype.put("neswarrow",12); + symboltype.put("hknwarrow",12); + symboltype.put("hknearrow",12); + symboltype.put("hksearow",12); + symboltype.put("hkswarow",12); + symboltype.put("tona",12); + symboltype.put("toea",12); + symboltype.put("tosa",12); + symboltype.put("towa",12); + symboltype.put("rightcurvedarrow",12); + symboltype.put("leftdowncurvedarrow",12); + symboltype.put("rightdowncurvedarrow",12); + symboltype.put("cwrightarcarrow",12); + symboltype.put("acwleftarcarrow",12); + symboltype.put("acwoverarcarrow",12); + symboltype.put("acwunderarcarrow",12); + symboltype.put("curvearrowrightminus",12); + symboltype.put("curvearrowleftplus",12); + symboltype.put("cwundercurvearrow",12); + symboltype.put("ccwundercurvearrow",12); + symboltype.put("acwcirclearrow",12); + symboltype.put("cwcirclearrow",12); + symboltype.put("rightarrowshortleftarrow",12); + symboltype.put("leftarrowshortrightarrow",12); + symboltype.put("shortrightarrowleftarrow",12); + symboltype.put("rightarrowplus",12); + symboltype.put("leftarrowplus",12); + symboltype.put("rightarrowx",12); + symboltype.put("leftrightarrowcircle",12); + symboltype.put("twoheaduparrowcircle",12); + symboltype.put("leftrightharpoonupdown",12); + symboltype.put("leftrightharpoondownup",12); + symboltype.put("updownharpoonrightleft",12); + symboltype.put("updownharpoonleftright",12); + symboltype.put("leftrightharpoonupup",12); + symboltype.put("updownharpoonrightright",12); + symboltype.put("leftrightharpoondowndown",12); + symboltype.put("updownharpoonleftleft",12); + symboltype.put("barleftharpoonup",12); + symboltype.put("rightharpoonupbar",12); + symboltype.put("barupharpoonright",12); + symboltype.put("downharpoonrightbar",12); + symboltype.put("barleftharpoondown",12); + symboltype.put("rightharpoondownbar",12); + symboltype.put("barupharpoonleft",12); + symboltype.put("downharpoonleftbar",12); + symboltype.put("leftharpoonupbar",12); + symboltype.put("barrightharpoonup",12); + symboltype.put("upharpoonrightbar",12); + symboltype.put("bardownharpoonright",12); + symboltype.put("leftharpoondownbar",12); + symboltype.put("barrightharpoondown",12); + symboltype.put("upharpoonleftbar",12); + symboltype.put("bardownharpoonleft",12); + symboltype.put("leftharpoonsupdown",12); + symboltype.put("upharpoonsleftright",12); + symboltype.put("rightharpoonsupdown",12); + symboltype.put("downharpoonsleftright",12); + symboltype.put("leftrightharpoonsup",12); + symboltype.put("leftrightharpoonsdown",12); + symboltype.put("rightleftharpoonsup",12); + symboltype.put("rightleftharpoonsdown",12); + symboltype.put("leftharpoonupdash",12); + symboltype.put("dashleftharpoondown",12); + symboltype.put("rightharpoonupdash",12); + symboltype.put("dashrightharpoondown",12); + symboltype.put("updownharpoonsleftright",12); + symboltype.put("downupharpoonsleftright",12); + symboltype.put("rightimply",12); + symboltype.put("equalrightarrow",12); + symboltype.put("similarrightarrow",12); + symboltype.put("leftarrowsimilar",12); + symboltype.put("rightarrowsimilar",12); + symboltype.put("rightarrowapprox",12); + symboltype.put("ltlarr",12); + symboltype.put("leftarrowless",12); + symboltype.put("gtrarr",12); + symboltype.put("subrarr",12); + symboltype.put("leftarrowsubset",12); + symboltype.put("suplarr",12); + symboltype.put("leftfishtail",12); + symboltype.put("rightfishtail",12); + symboltype.put("upfishtail",12); + symboltype.put("downfishtail",12); + symboltype.put("rtriltri",12); + symboltype.put("ltrivb",12); + symboltype.put("vbrtri",12); + symboltype.put("lfbowtie",12); + symboltype.put("rfbowtie",12); + symboltype.put("fbowtie",12); + symboltype.put("lftimes",12); + symboltype.put("rftimes",12); + symboltype.put("dualmap",12); + symboltype.put("lrtriangleeq",12); + symboltype.put("eparsl",12); + symboltype.put("smeparsl",12); + symboltype.put("eqvparsl",12); + symboltype.put("gleichstark",12); + symboltype.put("ruledelayed",12); + symboltype.put("veeonwedge",12); + symboltype.put("eqdot",12); + symboltype.put("dotequiv",12); + symboltype.put("equivVert",12); + symboltype.put("equivVvert",12); + symboltype.put("dotsim",12); + symboltype.put("simrdots",12); + symboltype.put("simminussim",12); + symboltype.put("congdot",12); + symboltype.put("asteq",12); + symboltype.put("hatapprox",12); + symboltype.put("approxeqq",12); + symboltype.put("eqqsim",12); + symboltype.put("Coloneq",12); + symboltype.put("eqeq",12); + symboltype.put("eqeqeq",12); + symboltype.put("ddotseq",12); + symboltype.put("equivDD",12); + symboltype.put("ltcir",12); + symboltype.put("gtcir",12); + symboltype.put("ltquest",12); + symboltype.put("gtquest",12); + symboltype.put("leqslant",12); + symboltype.put("geqslant",12); + symboltype.put("lesdot",12); + symboltype.put("gesdot",12); + symboltype.put("lesdoto",12); + symboltype.put("gesdoto",12); + symboltype.put("lesdotor",12); + symboltype.put("gesdotol",12); + symboltype.put("lessapprox",12); + symboltype.put("gtrapprox",12); + symboltype.put("lneq",12); + symboltype.put("gneq",12); + symboltype.put("lnapprox",12); + symboltype.put("gnapprox",12); + symboltype.put("lesseqqgtr",12); + symboltype.put("gtreqqless",12); + symboltype.put("lsime",12); + symboltype.put("gsime",12); + symboltype.put("lsimg",12); + symboltype.put("gsiml",12); + symboltype.put("lgE",12); + symboltype.put("glE",12); + symboltype.put("lesges",12); + symboltype.put("gesles",12); + symboltype.put("eqslantless",12); + symboltype.put("eqslantgtr",12); + symboltype.put("elsdot",12); + symboltype.put("egsdot",12); + symboltype.put("eqqless",12); + symboltype.put("eqqgtr",12); + symboltype.put("eqqslantless",12); + symboltype.put("eqqslantgtr",12); + symboltype.put("simless",12); + symboltype.put("simgtr",12); + symboltype.put("simlE",12); + symboltype.put("simgE",12); + symboltype.put("Lt",12); + symboltype.put("Gt",12); + symboltype.put("partialmeetcontraction",12); + symboltype.put("glj",12); + symboltype.put("gla",12); + symboltype.put("ltcc",12); + symboltype.put("gtcc",12); + symboltype.put("lescc",12); + symboltype.put("gescc",12); + symboltype.put("smt",12); + symboltype.put("lat",12); + symboltype.put("smte",12); + symboltype.put("late",12); + symboltype.put("bumpeqq",12); + symboltype.put("preceq",12); + symboltype.put("succeq",12); + symboltype.put("precneq",12); + symboltype.put("succneq",12); + symboltype.put("preceqq",12); + symboltype.put("succeqq",12); + symboltype.put("precneqq",12); + symboltype.put("succneqq",12); + symboltype.put("precapprox",12); + symboltype.put("succapprox",12); + symboltype.put("precnapprox",12); + symboltype.put("succnapprox",12); + symboltype.put("Prec",12); + symboltype.put("Succ",12); + symboltype.put("subsetdot",12); + symboltype.put("supsetdot",12); + symboltype.put("subsetplus",12); + symboltype.put("supsetplus",12); + symboltype.put("submult",12); + symboltype.put("supmult",12); + symboltype.put("subedot",12); + symboltype.put("supedot",12); + symboltype.put("subseteqq",12); + symboltype.put("supseteqq",12); + symboltype.put("subsim",12); + symboltype.put("supsim",12); + symboltype.put("subsetapprox",12); + symboltype.put("supsetapprox",12); + symboltype.put("subsetneqq",12); + symboltype.put("supsetneqq",12); + symboltype.put("lsqhook",12); + symboltype.put("rsqhook",12); + symboltype.put("csub",12); + symboltype.put("csup",12); + symboltype.put("csube",12); + symboltype.put("csupe",12); + symboltype.put("subsup",12); + symboltype.put("supsub",12); + symboltype.put("subsub",12); + symboltype.put("supsup",12); + symboltype.put("suphsub",12); + symboltype.put("supdsub",12); + symboltype.put("forkv",12); + symboltype.put("topfork",12); + symboltype.put("mlcp",12); + symboltype.put("forks",12); + symboltype.put("forksnot",12); + symboltype.put("shortlefttack",12); + symboltype.put("shortdowntack",12); + symboltype.put("shortuptack",12); + symboltype.put("vDdash",12); + symboltype.put("dashV",12); + symboltype.put("Dashv",12); + symboltype.put("DashV",12); + symboltype.put("varVdash",12); + symboltype.put("Barv",12); + symboltype.put("vBar",12); + symboltype.put("vBarv",12); + symboltype.put("barV",12); + symboltype.put("Vbar",12); + symboltype.put("Not",12); + symboltype.put("bNot",12); + symboltype.put("revnmid",12); + symboltype.put("cirmid",12); + symboltype.put("midcir",12); + symboltype.put("nhpar",12); + symboltype.put("parsim",12); + symboltype.put("lllnest",12); + symboltype.put("gggnest",12); + symboltype.put("leqqslant",12); + symboltype.put("geqqslant",12); + symboltype.put("circleonleftarrow",12); + symboltype.put("leftthreearrows",12); + symboltype.put("leftarrowonoplus",12); + symboltype.put("longleftsquigarrow",12); + symboltype.put("nvtwoheadleftarrow",12); + symboltype.put("nVtwoheadleftarrow",12); + symboltype.put("twoheadmapsfrom",12); + symboltype.put("twoheadleftdbkarrow",12); + symboltype.put("leftdotarrow",12); + symboltype.put("nvleftarrowtail",12); + symboltype.put("nVleftarrowtail",12); + symboltype.put("twoheadleftarrowtail",12); + symboltype.put("nvtwoheadleftarrowtail",12); + symboltype.put("nVtwoheadleftarrowtail",12); + symboltype.put("leftarrowx",12); + symboltype.put("leftcurvedarrow",12); + symboltype.put("equalleftarrow",12); + symboltype.put("bsimilarleftarrow",12); + symboltype.put("leftarrowbackapprox",12); + symboltype.put("rightarrowgtr",12); + symboltype.put("rightarrowsupset",12); + symboltype.put("LLeftarrow",12); + symboltype.put("RRightarrow",12); + symboltype.put("bsimilarrightarrow",12); + symboltype.put("rightarrowbackapprox",12); + symboltype.put("similarleftarrow",12); + symboltype.put("leftarrowapprox",12); + symboltype.put("leftarrowbsimilar",12); + symboltype.put("rightarrowbsimilar",12); */ + symboltype.put("Alpha",13); + symboltype.put("Beta",13); + symboltype.put("Gamma",13); + symboltype.put("Delta",13); + symboltype.put("Epsilon",13); + symboltype.put("Zeta",13); + symboltype.put("Eta",13); + symboltype.put("Theta",13); + symboltype.put("Iota",13); + symboltype.put("Kappa",13); + symboltype.put("Lambda",13); + symboltype.put("Mu",13); + symboltype.put("Nu",13); + symboltype.put("Xi",13); + symboltype.put("Omicron",13); + symboltype.put("Pi",13); + symboltype.put("Rho",13); + symboltype.put("Sigma",13); + symboltype.put("Tau",13); + symboltype.put("Upsilon",13); + symboltype.put("Phi",13); + symboltype.put("Chi",13); + symboltype.put("Psi",13); + symboltype.put("Omega",13); + symboltype.put("alpha",13); + symboltype.put("beta",13); + symboltype.put("gamma",13); + symboltype.put("delta",13); + symboltype.put("epsilon",13); + symboltype.put("zeta",13); + symboltype.put("eta",13); + symboltype.put("theta",13); + symboltype.put("iota",13); + symboltype.put("kappa",13); + symboltype.put("lambda",13); + symboltype.put("mu",13); + symboltype.put("nu",13); + symboltype.put("xi",13); + symboltype.put("omicron",13); + symboltype.put("pi",13); + symboltype.put("rho",13); + symboltype.put("varsigma",13); + symboltype.put("sigma",13); + symboltype.put("tau",13); + symboltype.put("upsilon",13); + symboltype.put("varphi",13); + symboltype.put("chi",13); + symboltype.put("psi",13); + symboltype.put("omega",13); + symboltype.put("varbeta",13); + symboltype.put("vartheta",13); + symboltype.put("phi",13); + symboltype.put("varpi",13); + symboltype.put("Digamma",13); + symboltype.put("digamma",13); + symboltype.put("varkappa",13); + symboltype.put("varrho",13); + symboltype.put("varTheta",13); + symboltype.put("varepsilon",13); +/* symboltype.put("matheth",13); + symboltype.put("BbbC",13); + symboltype.put("mscrg",13); + symboltype.put("mscrH",13); + symboltype.put("mfrakH",13); + symboltype.put("BbbH",13); + symboltype.put("hslash",13); + symboltype.put("mscrI",13); */ + symboltype.put("Im",13); +/* symboltype.put("mscrL",13); + symboltype.put("ell",13); + symboltype.put("BbbN",13); + symboltype.put("wp",13); + symboltype.put("BbbP",13); + symboltype.put("BbbQ",13); + symboltype.put("mscrR",13); */ + symboltype.put("Re",13); +/* symboltype.put("BbbR",13); + symboltype.put("BbbZ",13); + symboltype.put("mfrakZ",13); + symboltype.put("turnediota",13); + symboltype.put("Angstrom",13); + symboltype.put("mscrB",13); + symboltype.put("mfrakC",13); + symboltype.put("mscre",13); + symboltype.put("mscrE",13); + symboltype.put("mscrF",13); + symboltype.put("mscrM",13); + symboltype.put("mscro",13); + symboltype.put("aleph",13); + symboltype.put("beth",13); + symboltype.put("gimel",13); + symboltype.put("daleth",13); + symboltype.put("Bbbgamma",13); + symboltype.put("BbbGamma",13); + symboltype.put("BbbPi",13); */ + symboltype.put("partial",13); + symboltype.put("nabla",13); + symboltype.put("log",14); + symboltype.put("ln",14); + symboltype.put("sin",14); + symboltype.put("cos",14); + symboltype.put("tan",14); + symboltype.put("sec",14); + symboltype.put("csc",14); + symboltype.put("cot",14); + symboltype.put("sinh",14); + symboltype.put("cosh",14); + symboltype.put("tanh",14); + symboltype.put("coth",14); + symboltype.put("sech",14); + symboltype.put("csch",14); + symboltype.put("lim",15); + + symboltype.put("exclam",17); + symboltype.put("comma",17); + // symboltype.put("mathcolon",17); + // symboltype.put("semicolon",17); + + // symboltype.put("Bbbsum",19); + symboltype.put("prod",19); + // symboltype.put("coprod",19); + symboltype.put("sum",19); + /* symboltype.put("intclockwise",19); + symboltype.put("varointclockwise",19); + symboltype.put("ointctrclockwise",19); + symboltype.put("bigwedge",19); + symboltype.put("bigvee",19); + symboltype.put("bigcap",19); + symboltype.put("bigcup",19); + symboltype.put("leftouterjoin",19); + symboltype.put("rightouterjoin",19); + symboltype.put("fullouterjoin",19); + symboltype.put("bigbot",19); + symboltype.put("bigtop",19); + symboltype.put("xsol",19); + symboltype.put("xbsol",19); + symboltype.put("bigodot",19); + symboltype.put("bigoplus",19); + symboltype.put("bigotimes",19); + symboltype.put("bigcupdot",19); + symboltype.put("biguplus",19); + symboltype.put("bigsqcap",19); + symboltype.put("bigsqcup",19); + symboltype.put("conjquant",19); + symboltype.put("disjquant",19); + symboltype.put("bigtimes",19); + symboltype.put("modtwosum",19); + symboltype.put("intbar",19); + symboltype.put("intBar",19); + symboltype.put("intlarhk",19); + symboltype.put("intx",19); + symboltype.put("intcap",19); + symboltype.put("intcup",19); + symboltype.put("Join",19); + symboltype.put("bigtriangleleft",19); + symboltype.put("zcmp",19); + symboltype.put("zpipe",19); + symboltype.put("zproject",19); + symboltype.put("biginterleave",19); + symboltype.put("bigtalloblong",19); */ + + +// symboltype.put("bigBbbsum",20); + symboltype.put("bigprod",20); +// symboltype.put("bigcoprod",20); + symboltype.put("bigsum",20); + /* symboltype.put("bigintclockwise",20); + symboltype.put("bigvarointclockwise",20); + symboltype.put("bigointctrclockwise",20); + symboltype.put("bigbigwedge",20); + symboltype.put("bigbigvee",20); + symboltype.put("bigbigcap",20); + symboltype.put("bigbigcup",20); + symboltype.put("bigleftouterjoin",20); + symboltype.put("bigrightouterjoin",20); + symboltype.put("bigfullouterjoin",20); + symboltype.put("bigbigbot",20); + symboltype.put("bigbigtop",20); + symboltype.put("bigxsol",20); + symboltype.put("bigxbsol",20); + symboltype.put("bigbigodot",20); + symboltype.put("bigbigoplus",20); + symboltype.put("bigbigotimes",20); + symboltype.put("bigbigcupdot",20); + symboltype.put("bigbiguplus",20); + symboltype.put("bigbigsqcap",20); + symboltype.put("bigbigsqcup",20); + symboltype.put("bigconjquant",20); + symboltype.put("bigdisjquant",20); + symboltype.put("bigbigtimes",20); + symboltype.put("bigmodtwosum",20); + symboltype.put("bigintbar",20); + symboltype.put("bigintBar",20); + symboltype.put("bigintlarhk",20); + symboltype.put("bigintx",20); + symboltype.put("bigintcap",20); + symboltype.put("bigintcup",20); + symboltype.put("bigJoin",20); + symboltype.put("bigbigtriangleleft",20); + symboltype.put("bigzcmp",20); + symboltype.put("bigzpipe",20); + symboltype.put("bigzproject",20); + symboltype.put("bigbiginterleave",20); + symboltype.put("bigbigtalloblong",20); */ + +// symboltype.put("bigbigBbbsum",21); + symboltype.put("bigbigprod",21); + // symboltype.put("bigbigcoprod",21); + symboltype.put("bigbigsum",21); + /* symboltype.put("bigbigintclockwise",21); + symboltype.put("bigbigvarointclockwise",21); + symboltype.put("bigbigointctrclockwise",21); + symboltype.put("bigbigbigwedge",21); + symboltype.put("bigbigbigvee",21); + symboltype.put("bigbigbigcap",21); + symboltype.put("bigbigbigcup",21); + symboltype.put("bigbigleftouterjoin",21); + symboltype.put("bigbigrightouterjoin",21); + symboltype.put("bigbigfullouterjoin",21); + symboltype.put("bigbigbigbot",21); + symboltype.put("bigbigbigtop",21); + symboltype.put("bigbigxsol",21); + symboltype.put("bigbigxbsol",21); + symboltype.put("bigbigbigodot",21); + symboltype.put("bigbigbigoplus",21); + symboltype.put("bigbigbigotimes",21); + symboltype.put("bigbigbigcupdot",21); + symboltype.put("bigbigbiguplus",21); + symboltype.put("bigbigbigsqcap",21); + symboltype.put("bigbigbigsqcup",21); + symboltype.put("bigbigconjquant",21); + symboltype.put("bigbigdisjquant",21); + symboltype.put("bigbigbigtimes",21); + symboltype.put("bigbigmodtwosum",21); + symboltype.put("bigbigintbar",21); + symboltype.put("bigbigintBar",21); + symboltype.put("bigbigintlarhk",21); + symboltype.put("bigbigintx",21); + symboltype.put("bigbigintcap",21); + symboltype.put("bigbigintcup",21); + symboltype.put("bigbigJoin",21); + symboltype.put("bigbigbigtriangleleft",21); + symboltype.put("bigbigzcmp",21); + symboltype.put("bigbigzpipe",21); + symboltype.put("bigbigzproject",21); + symboltype.put("bigbigbiginterleave",21); + symboltype.put("bigbigbigtalloblong",21); */ + + symboltype.put("int",22); + symboltype.put("iint",22); + symboltype.put("iiint",22); + symboltype.put("oint",22); + symboltype.put("oiint",22); + symboltype.put("oiiint",22); + /* symboltype.put("sumint",22); + symboltype.put("iiiint",22); + symboltype.put("fint",22); + symboltype.put("cirfint",22); + symboltype.put("awint",22); + symboltype.put("rppolint",22); + symboltype.put("scpolint",22); + symboltype.put("npolint",22); + symboltype.put("pointint",22); + symboltype.put("sqint",22); + symboltype.put("upint",22); + symboltype.put("lowint",22); */ + + + symboltype.put("bigint",23); + symboltype.put("bigiint",23); + symboltype.put("bigiiint",23); + symboltype.put("bigoint",23); + symboltype.put("bigoiint",23); + symboltype.put("bigoiiint",23); + /* symboltype.put("bigsumint",23); + symboltype.put("bigiiiint",23); + symboltype.put("bigfint",23); + symboltype.put("bigcirfint",23); + symboltype.put("bigawint",23); + symboltype.put("bigrppolint",23); + symboltype.put("bigscpolint",23); + symboltype.put("bignpolint",23); + symboltype.put("bigpointint",23); + symboltype.put("bigsqint",23); + symboltype.put("bigupint",23); + symboltype.put("biglowint",23); */ + + symboltype.put("bigbigint",24); + symboltype.put("bigbigiint",24); + symboltype.put("bigbigiiint",24); + symboltype.put("bigbigoint",24); + symboltype.put("bigbigoiint",24); + symboltype.put("bigbigoiiint",24); + /* symboltype.put("bigbigsumint",24); + symboltype.put("bigbigiiiint",24); + symboltype.put("bigbigfint",24); + symboltype.put("bigbigcirfint",24); + symboltype.put("bigbigawint",24); + symboltype.put("bigbigrppolint",24); + symboltype.put("bigbigscpolint",24); + symboltype.put("bigbignpolint",24); + symboltype.put("bigbigpointint",24); + symboltype.put("bigbigsqint",24); + symboltype.put("bigbigupint",24); + symboltype.put("bigbiglowint",24); */ + +/************************************************************************************/ + + symbolunicode.put("lparen","\u0028"); + symbolunicode.put("lbrack","\u005B"); + symbolunicode.put("lbrace","\u007B"); +/* symbolunicode.put("lceil","\u2308"); + symbolunicode.put("lfloor","\u230A"); + symbolunicode.put("ulcorner","\u231C"); + symbolunicode.put("llcorner","\u231E"); + symbolunicode.put("lbag","\u27C5"); + symbolunicode.put("lBrack","\u27E6"); + symbolunicode.put("langle","\u27E8"); + symbolunicode.put("lAngle","\u27EA"); + symbolunicode.put("Lbrbrak","\u27EC"); + symbolunicode.put("lgroup","\u27EE"); + symbolunicode.put("lBrace","\u2983"); + symbolunicode.put("lParen","\u2985"); + symbolunicode.put("llparenthesis","\u2987"); + symbolunicode.put("llangle","\u2989"); + symbolunicode.put("lbrackubar","\u298B"); + symbolunicode.put("lbrackultick","\u298D"); + symbolunicode.put("lbracklltick","\u298F"); + symbolunicode.put("langledot","\u2991"); + symbolunicode.put("lparenless","\u2993"); + symbolunicode.put("lparengtr","\u2995"); + symbolunicode.put("lblkbrbrak","\u2997"); + symbolunicode.put("lvzigzag","\u29D8"); + symbolunicode.put("Lvzigzag","\u29DA"); + symbolunicode.put("lcurvyangle","\u29FC"); + symbolunicode.put("lbrbrak","\u3014"); */ + symbolunicode.put("rparen","\u0029"); + symbolunicode.put("rbrack","\u005D"); + symbolunicode.put("rbrace","\u007D"); +/* symbolunicode.put("rceil","\u2309"); + symbolunicode.put("rfloor","\u230B"); + symbolunicode.put("urcorner","\u231D"); + symbolunicode.put("lrcorner","\u231F"); + symbolunicode.put("rbag","\u27C6"); + symbolunicode.put("rBrack","\u27E7"); + symbolunicode.put("rangle","\u27E9"); + symbolunicode.put("rAngle","\u27EB"); + symbolunicode.put("Rbrbrak","\u27ED"); + symbolunicode.put("rgroup","\u27EF"); + symbolunicode.put("rBrace","\u2984"); + symbolunicode.put("rParen","\u2986"); + symbolunicode.put("rrparenthesis","\u2988"); + symbolunicode.put("rrangle","\u298A"); + symbolunicode.put("rbrackubar","\u298C"); + symbolunicode.put("rbrackurtick","\u2990"); + symbolunicode.put("rbracklrtick","\u298E"); + symbolunicode.put("rangledot","\u2992"); + symbolunicode.put("rparenless","\u2996"); + symbolunicode.put("rparengtr","\u2994"); + symbolunicode.put("rblkbrbrak","\u2998"); + symbolunicode.put("rvzigzag","\u29D9"); + symbolunicode.put("Rvzigzag","\u29DB"); + symbolunicode.put("rcurvyangle","\u29FD"); + symbolunicode.put("rbrbrak","\u3015"); */ + symbolunicode.put("vert","\u007C"); + /* symbolunicode.put("Vert","\u2016"); + symbolunicode.put("Vvert","\u2980"); */ + symbolunicode.put("exclam","\u0021"); + /* symbolunicode.put("comma","\u002C"); + symbolunicode.put("mathcolon","\u003A"); + symbolunicode.put("semicolon","\u003B"); + symbolunicode.put("overbracket","\u23B4"); + symbolunicode.put("overparen","\u23DC"); */ + symbolunicode.put("overbrace","\u23DE"); + // symbolunicode.put("underbracket","\u23B5"); + // symbolunicode.put("underparen","\u23DD"); + symbolunicode.put("underbrace","\u23DF"); + symbolunicode.put("grave","\u0300"); + symbolunicode.put("acute","\u0301"); + symbolunicode.put("hat","\u0302"); + symbolunicode.put("tilde","\u0303"); + symbolunicode.put("bar","\u0304"); + symbolunicode.put("overbar","\u0305"); + symbolunicode.put("breve","\u0306"); + symbolunicode.put("dot","\u0307"); + /* symbolunicode.put("ddot","\u0308"); + symbolunicode.put("ovhook","\u0309"); + symbolunicode.put("ocirc","\u030A"); + symbolunicode.put("check","\u030C"); + symbolunicode.put("not","\u0338"); + symbolunicode.put("leftharpoonaccent","\u20D0"); + symbolunicode.put("rightharpoonaccent","\u20D1"); + symbolunicode.put("vertoverlay","\u20D2"); + symbolunicode.put("overleftarrow","\u20D6"); */ + symbolunicode.put("vec","\u20D7"); + symbolunicode.put("dddot","\u20DB"); + /* symbolunicode.put("ddddot","\u20DC"); + symbolunicode.put("overleftrightarrow","\u20E1"); + symbolunicode.put("annuity","\u20E7"); + symbolunicode.put("widebridgeabove","\u20E9"); + symbolunicode.put("threeunderdot","\u20E8"); + symbolunicode.put("underrightharpoondown","\u20EC"); + symbolunicode.put("underleftharpoondown","\u20ED"); + symbolunicode.put("underleftarrow","\u20EE"); + symbolunicode.put("underrightarrow","\u20EF");*/ + // symbolunicode.put("Bbbsum","\u2140"); + symbolunicode.put("prod","\u220F"); + // symbolunicode.put("coprod","\u2210"); + symbolunicode.put("sum","\u2211"); + symbolunicode.put("int","\u222B"); + symbolunicode.put("iint","\u222C"); + symbolunicode.put("iiint","\u222D"); + symbolunicode.put("oint","\u222E"); + symbolunicode.put("oiint","\u222F"); + symbolunicode.put("oiiint","\u2230"); + /* symbolunicode.put("intclockwise","\u2231"); + symbolunicode.put("varointclockwise","\u2232"); + symbolunicode.put("ointctrclockwise","\u2233"); + symbolunicode.put("bigwedge","\u22C0"); + symbolunicode.put("bigvee","\u22C1"); + symbolunicode.put("bigcap","\u22C2"); + symbolunicode.put("bigcup","\u22C3"); + symbolunicode.put("leftouterjoin","\u27D5"); + symbolunicode.put("rightouterjoin","\u27D6"); + symbolunicode.put("fullouterjoin","\u27D7"); + symbolunicode.put("bigbot","\u27D8"); + symbolunicode.put("bigtop","\u27D9"); + symbolunicode.put("xsol","\u29F8"); + symbolunicode.put("xbsol","\u29F9"); + symbolunicode.put("bigodot","\u2A00"); + symbolunicode.put("bigoplus","\u2A01"); + symbolunicode.put("bigotimes","\u2A02"); + symbolunicode.put("bigcupdot","\u2A03"); + symbolunicode.put("biguplus","\u2A04"); + symbolunicode.put("bigsqcap","\u2A05"); + symbolunicode.put("bigsqcup","\u2A06"); + symbolunicode.put("conjquant","\u2A07"); + symbolunicode.put("disjquant","\u2A08"); + symbolunicode.put("bigtimes","\u2A09"); + symbolunicode.put("modtwosum","\u2A0A"); + symbolunicode.put("sumint","\u2A0B"); + symbolunicode.put("iiiint","\u2A0C"); + symbolunicode.put("intbar","\u2A0D"); + symbolunicode.put("intBar","\u2A0E"); + symbolunicode.put("fint","\u2A0F"); + symbolunicode.put("cirfint","\u2A10"); + symbolunicode.put("awint","\u2A11"); + symbolunicode.put("rppolint","\u2A12"); + symbolunicode.put("scpolint","\u2A13"); + symbolunicode.put("npolint","\u2A14"); + symbolunicode.put("pointint","\u2A15"); + symbolunicode.put("sqint","\u2A16"); + symbolunicode.put("intlarhk","\u2A17"); + symbolunicode.put("intx","\u2A18"); + symbolunicode.put("intcap","\u2A19"); + symbolunicode.put("intcup","\u2A1A"); + symbolunicode.put("upint","\u2A1B"); + symbolunicode.put("lowint","\u2A1C"); + symbolunicode.put("Join","\u2A1D"); + symbolunicode.put("bigtriangleleft","\u2A1E"); + symbolunicode.put("zcmp","\u2A1F"); + symbolunicode.put("zpipe","\u2A20"); + symbolunicode.put("zproject","\u2A21"); + symbolunicode.put("biginterleave","\u2AFc"); + symbolunicode.put("bigtalloblong","\u2AFF"); */ + // symbolunicode.put("bigBbbsum","\u2140"); + symbolunicode.put("bigprod","\u220F"); + // symbolunicode.put("bigcoprod","\u2210"); + symbolunicode.put("bigsum","\u2211"); + symbolunicode.put("bigint","\u222B"); + symbolunicode.put("bigiint","\u222C"); + symbolunicode.put("bigiiint","\u222D"); + symbolunicode.put("bigoint","\u222E"); + symbolunicode.put("bigoiint","\u222F"); + symbolunicode.put("bigoiiint","\u2230"); + /* symbolunicode.put("bigintclockwise","\u2231"); + symbolunicode.put("bigvarointclockwise","\u2232"); + symbolunicode.put("bigointctrclockwise","\u2233"); + symbolunicode.put("bigbigwedge","\u22C0"); + symbolunicode.put("bigbigvee","\u22C1"); + symbolunicode.put("bigbigcap","\u22C2"); + symbolunicode.put("bigbigcup","\u22C3"); + symbolunicode.put("bigleftouterjoin","\u27D5"); + symbolunicode.put("bigrightouterjoin","\u27D6"); + symbolunicode.put("bigfullouterjoin","\u27D7"); + symbolunicode.put("bigbigbot","\u27D8"); + symbolunicode.put("bigbigtop","\u27D9"); + symbolunicode.put("bigxsol","\u29F8"); + symbolunicode.put("bigxbsol","\u29F9"); + symbolunicode.put("bigbigodot","\u2A00"); + symbolunicode.put("bigbigoplus","\u2A01"); + symbolunicode.put("bigbigotimes","\u2A02"); + symbolunicode.put("bigbigcupdot","\u2A03"); + symbolunicode.put("bigbiguplus","\u2A04"); + symbolunicode.put("bigbigsqcap","\u2A05"); + symbolunicode.put("bigbigsqcup","\u2A06"); + symbolunicode.put("bigconjquant","\u2A07"); + symbolunicode.put("bigdisjquant","\u2A08"); + symbolunicode.put("bigbigtimes","\u2A09"); + symbolunicode.put("bigmodtwosum","\u2A0A"); + symbolunicode.put("bigsumint","\u2A0B"); + symbolunicode.put("bigiiiint","\u2A0C"); + symbolunicode.put("bigintbar","\u2A0D"); + symbolunicode.put("bigintBar","\u2A0E"); + symbolunicode.put("bigfint","\u2A0F"); + symbolunicode.put("bigcirfint","\u2A10"); + symbolunicode.put("bigawint","\u2A11"); + symbolunicode.put("bigrppolint","\u2A12"); + symbolunicode.put("bigscpolint","\u2A13"); + symbolunicode.put("bignpolint","\u2A14"); + symbolunicode.put("bigpointint","\u2A15"); + symbolunicode.put("bigsqint","\u2A16"); + symbolunicode.put("bigintlarhk","\u2A17"); + symbolunicode.put("bigintx","\u2A18"); + symbolunicode.put("bigintcap","\u2A19"); + symbolunicode.put("bigintcup","\u2A1A"); + symbolunicode.put("bigupint","\u2A1B"); + symbolunicode.put("biglowint","\u2A1C"); + symbolunicode.put("bigJoin","\u2A1D"); + symbolunicode.put("bigbigtriangleleft","\u2A1E"); + symbolunicode.put("bigzcmp","\u2A1F"); + symbolunicode.put("bigzpipe","\u2A20"); + symbolunicode.put("bigzproject","\u2A21"); + symbolunicode.put("bigbiginterleave","\u2AFc"); + symbolunicode.put("bigbigtalloblong","\u2AFF"); */ + // symbolunicode.put("bigbigBbbsum","\u2140"); + symbolunicode.put("bigbigprod","\u220F"); + // symbolunicode.put("bigbigcoprod","\u2210"); + symbolunicode.put("bigbigsum","\u2211"); + symbolunicode.put("bigbigint","\u222B"); + symbolunicode.put("bigbigiint","\u222C"); + symbolunicode.put("bigbigiiint","\u222D"); + symbolunicode.put("bigbigoint","\u222E"); + symbolunicode.put("bigbigoiint","\u222F"); + symbolunicode.put("bigbigoiiint","\u2230"); +/* symbolunicode.put("bigbigintclockwise","\u2231"); + symbolunicode.put("bigbigvarointclockwise","\u2232"); + symbolunicode.put("bigbigointctrclockwise","\u2233"); + symbolunicode.put("bigbigbigwedge","\u22C0"); + symbolunicode.put("bigbigbigvee","\u22C1"); + symbolunicode.put("bigbigbigcap","\u22C2"); + symbolunicode.put("bigbigbigcup","\u22C3"); + symbolunicode.put("bigbigleftouterjoin","\u27D5"); + symbolunicode.put("bigbigrightouterjoin","\u27D6"); + symbolunicode.put("bigbigfullouterjoin","\u27D7"); + symbolunicode.put("bigbigbigbot","\u27D8"); + symbolunicode.put("bigbigbigtop","\u27D9"); + symbolunicode.put("bigbigxsol","\u29F8"); + symbolunicode.put("bigbigxbsol","\u29F9"); + symbolunicode.put("bigbigbigodot","\u2A00"); + symbolunicode.put("bigbigbigoplus","\u2A01"); + symbolunicode.put("bigbigbigotimes","\u2A02"); + symbolunicode.put("bigbigbigcupdot","\u2A03"); + symbolunicode.put("bigbigbiguplus","\u2A04"); + symbolunicode.put("bigbigbigsqcap","\u2A05"); + symbolunicode.put("bigbigbigsqcup","\u2A06"); + symbolunicode.put("bigbigconjquant","\u2A07"); + symbolunicode.put("bigbigdisjquant","\u2A08"); + symbolunicode.put("bigbigbigtimes","\u2A09"); + symbolunicode.put("bigbigmodtwosum","\u2A0A"); + symbolunicode.put("bigbigsumint","\u2A0B"); + symbolunicode.put("bigbigiiiint","\u2A0C"); + symbolunicode.put("bigbigintbar","\u2A0D"); + symbolunicode.put("bigbigintBar","\u2A0E"); + symbolunicode.put("bigbigfint","\u2A0F"); + symbolunicode.put("bigbigcirfint","\u2A10"); + symbolunicode.put("bigbigawint","\u2A11"); + symbolunicode.put("bigbigrppolint","\u2A12"); + symbolunicode.put("bigbigscpolint","\u2A13"); + symbolunicode.put("bigbignpolint","\u2A14"); + symbolunicode.put("bigbigpointint","\u2A15"); + symbolunicode.put("bigbigsqint","\u2A16"); + symbolunicode.put("bigbigintlarhk","\u2A17"); + symbolunicode.put("bigbigintx","\u2A18"); + symbolunicode.put("bigbigintcap","\u2A19"); + symbolunicode.put("bigbigintcup","\u2A1A"); + symbolunicode.put("bigbigupint","\u2A1B"); + symbolunicode.put("bigbiglowint","\u2A1C"); + symbolunicode.put("bigbigJoin","\u2A1D"); + symbolunicode.put("bigbigbigtriangleleft","\u2A1E"); + symbolunicode.put("bigbigzcmp","\u2A1F"); + symbolunicode.put("bigbigzpipe","\u2A20"); + symbolunicode.put("bigbigzproject","\u2A21"); + symbolunicode.put("bigbigbiginterleave","\u2AFc"); + symbolunicode.put("bigbigbigtalloblong","\u2AFF"); */ + + symbolunicode.put("plus","\u002B"); + symbolunicode.put("pm","\u00B1"); + /* symbolunicode.put("cdotp","\u00B7"); + symbolunicode.put("times","\u00D7"); + symbolunicode.put("div","\u00F7"); + symbolunicode.put("dagger","\u2020"); + symbolunicode.put("ddagger","\u2021"); + symbolunicode.put("smblkcircle","\u2022"); + symbolunicode.put("tieconcat","\u2040"); + symbolunicode.put("fracslash","\u2044"); + symbolunicode.put("upand","\u214B"); + symbolunicode.put("minus","\u2212"); + symbolunicode.put("mp","\u2213"); + symbolunicode.put("dotplus","\u2214"); + symbolunicode.put("divslash","\u2215"); + symbolunicode.put("smallsetminus","\u2216"); + symbolunicode.put("ast","\u2217"); + symbolunicode.put("vysmwhtcircle","\u2218"); + symbolunicode.put("vysmblkcircle","\u2219"); + symbolunicode.put("wedge","\u2227"); + symbolunicode.put("vee","\u2228"); + symbolunicode.put("cap","\u2229"); + symbolunicode.put("cup","\u222A"); + symbolunicode.put("dotminus","\u2238"); + symbolunicode.put("invlazys","\u223E"); + symbolunicode.put("wr","\u2240"); + symbolunicode.put("cupleftarrow","\u228C"); + symbolunicode.put("cupdot","\u228D"); + symbolunicode.put("uplus","\u228E"); + symbolunicode.put("sqcap","\u2293"); + symbolunicode.put("sqcup","\u2294"); + symbolunicode.put("oplus","\u2295"); + symbolunicode.put("ominus","\u2296"); + symbolunicode.put("otimes","\u2297"); + symbolunicode.put("oslash","\u2298"); + symbolunicode.put("odot","\u2299"); + symbolunicode.put("circledcirc","\u229A"); + symbolunicode.put("circleddast","\u229B"); + symbolunicode.put("circledequal","\u229C"); + symbolunicode.put("circleddash","\u229D"); + symbolunicode.put("boxplus","\u229E"); + symbolunicode.put("boxminus","\u229F"); + symbolunicode.put("boxtimes","\u22A0"); + symbolunicode.put("boxdot","\u22A1"); + symbolunicode.put("intercal","\u22BA"); + symbolunicode.put("veebar","\u22BB"); + symbolunicode.put("barwedge","\u22BC"); + symbolunicode.put("barvee","\u22BD"); + symbolunicode.put("smwhtdiamond","\u22C4"); */ + symbolunicode.put("cdot","\u22C5"); + /* symbolunicode.put("star","\u22C6"); + symbolunicode.put("divideontimes","\u22C7"); + symbolunicode.put("ltimes","\u22C9"); + symbolunicode.put("rtimes","\u22CA"); + symbolunicode.put("leftthreetimes","\u22CB"); + symbolunicode.put("rightthreetimes","\u22CC"); + symbolunicode.put("curlyvee","\u22CE"); + symbolunicode.put("curlywedge","\u22CF"); + symbolunicode.put("Cap","\u22D2"); + symbolunicode.put("Cup","\u22D3"); + symbolunicode.put("varbarwedge","\u2305"); + symbolunicode.put("vardoublewedge","\u2306"); + symbolunicode.put("obar","\u233D"); + symbolunicode.put("bigtriangleup","\u25B3"); + symbolunicode.put("triangleright","\u25B7"); + symbolunicode.put("triangleleft","\u25C1"); + symbolunicode.put("mdlgwhtcircle","\u25CB"); + symbolunicode.put("boxbar","\u25EB"); + symbolunicode.put("veedot","\u27C7"); + symbolunicode.put("wedgedot","\u27D1"); + symbolunicode.put("lozengeminus","\u27E0"); + symbolunicode.put("concavediamond","\u27E1"); + symbolunicode.put("concavediamondtickleft","\u27E2"); + symbolunicode.put("concavediamondtickright","\u27E3"); + symbolunicode.put("whitesquaretickleft","\u27E4"); + symbolunicode.put("whitesquaretickright","\u27E5"); + symbolunicode.put("typecolon","\u2982"); + symbolunicode.put("circlehbar","\u29B5"); + symbolunicode.put("circledvert","\u29B6"); + symbolunicode.put("circledparallel","\u29B7"); + symbolunicode.put("obslash","\u29B8"); + symbolunicode.put("operp","\u29B9"); + symbolunicode.put("olessthan","\u29C0"); + symbolunicode.put("ogreaterthan","\u29C1"); + symbolunicode.put("boxdiag","\u29C4"); + symbolunicode.put("boxbslash","\u29C5"); + symbolunicode.put("boxast","\u29C6"); + symbolunicode.put("boxcicle","\u29C7"); + symbolunicode.put("boxbox","\u29C8"); + symbolunicode.put("triangleserifs","\u29CD"); + symbolunicode.put("hourglass","\u29D6"); + symbolunicode.put("blackhourglass","\u29D7"); + symbolunicode.put("shuffle","\u29E2"); + symbolunicode.put("mdlgblkozenge","\u29EB"); + symbolunicode.put("setminus","\u29F5"); + symbolunicode.put("dsol","\u29F6"); + symbolunicode.put("rsolbar","\u29F7"); + symbolunicode.put("doubleplus","\u29FA"); + symbolunicode.put("tripleplus","\u29FB"); + symbolunicode.put("tplus","\u29FE"); + symbolunicode.put("tminus","\u29FF"); + symbolunicode.put("ringplus","\u2A22"); + symbolunicode.put("plushat","\u2A23"); + symbolunicode.put("simplus","\u2A24"); + symbolunicode.put("plusdot","\u2A25"); + symbolunicode.put("plussim","\u2A26"); + symbolunicode.put("plussubtwo","\u2A27"); + symbolunicode.put("plustrif","\u2A28"); + symbolunicode.put("commaminus","\u2A29"); + symbolunicode.put("minusdot","\u2A2A"); + symbolunicode.put("minusfdots","\u2A2B"); + symbolunicode.put("minusrdots","\u2A2C"); + symbolunicode.put("opluslhrim","\u2A2D"); + symbolunicode.put("oplusrhrim","\u2A2E"); + symbolunicode.put("vectimes","\u2A2F"); + symbolunicode.put("dottimes","\u2A30"); + symbolunicode.put("timesbar","\u2A31"); + symbolunicode.put("btimes","\u2A32"); + symbolunicode.put("smashtimes","\u2A33"); + symbolunicode.put("otimeslhrim","\u2A34"); + symbolunicode.put("otimesrhrim","\u2A35"); + symbolunicode.put("otimeshat","\u2A36"); + symbolunicode.put("Otimes","\u2A37"); + symbolunicode.put("odiv","\u2A38"); + symbolunicode.put("triangleplus","\u2A39"); + symbolunicode.put("triangleminus","\u2A3A"); + symbolunicode.put("triangletimes","\u2A3B"); + symbolunicode.put("intprod","\u2A3C"); + symbolunicode.put("intprodr","\u2A3D"); + symbolunicode.put("fcmp","\u2A3E"); + symbolunicode.put("amalg","\u2A3F"); + symbolunicode.put("capdot","\u2A40"); + symbolunicode.put("barcup","\u2A42"); + symbolunicode.put("barcap","\u2A43"); + symbolunicode.put("capwedge","\u2A44"); + symbolunicode.put("cupvee","\u2A45"); + symbolunicode.put("cupovercap","\u2A46"); + symbolunicode.put("cupovercup","\u2A47"); + symbolunicode.put("cupbarcap","\u2A48"); + symbolunicode.put("capbarcup","\u2A49"); + symbolunicode.put("twocups","\u2A4A"); + symbolunicode.put("twocaps","\u2A4B"); + symbolunicode.put("closedvarcup","\u2A4C"); + symbolunicode.put("closedvarcap","\u2A4D"); + symbolunicode.put("Sqcap","\u2A4E"); + symbolunicode.put("Sqcup","\u2A4F"); + symbolunicode.put("closedvarcupsmashprod","\u2A50"); + symbolunicode.put("wedgeodot","\u2A51"); + symbolunicode.put("veeodot","\u2A52"); + symbolunicode.put("Wedge","\u2A53"); + symbolunicode.put("Vee","\u2A54"); + symbolunicode.put("wedgeonwedge","\u2A55"); + symbolunicode.put("veeonvee","\u2A56"); + symbolunicode.put("bigslopedvee","\u2A57"); + symbolunicode.put("bigslopedwedge","\u2A58"); + symbolunicode.put("wedgemidvert","\u2A5A"); + symbolunicode.put("veemidvert","\u2A5B"); + symbolunicode.put("midbarwedge","\u2A5C"); + symbolunicode.put("midbarvee","\u2A5D"); + symbolunicode.put("doublebarwedge","\u2A5E"); + symbolunicode.put("wedgebar","\u2A5F"); + symbolunicode.put("wedgedoublebar","\u2A60"); + symbolunicode.put("varveebar","\u2A61"); + symbolunicode.put("doublebarvee","\u2A62"); + symbolunicode.put("veedoublebar","\u2A63"); + symbolunicode.put("dsub","\u2A64"); + symbolunicode.put("rsub","\u2A65"); + symbolunicode.put("eqqplus","\u2A71"); + symbolunicode.put("pluseqq","\u2A72"); + symbolunicode.put("interleave","\u2AF4"); + symbolunicode.put("nhVvert","\u2AF5"); + symbolunicode.put("threedotcolon","\u2AF6"); + symbolunicode.put("trslash","\u2AFB"); + symbolunicode.put("sslash","\u2AFD"); + symbolunicode.put("talloblong","\u2AFE");*/ +/* symbolunicode.put("octothrope", "\u0023"); + symbolunicode.put("mathdollar","\u0024"); + symbolunicode.put("percent","\u0025"); + symbolunicode.put("ampersand","\u0026"); + symbolunicode.put("period","\u002E"); + symbolunicode.put("mathslash","\u002F"); + symbolunicode.put("question","\u003F"); + symbolunicode.put("atsign","\u0040");*/ + symbolunicode.put("backslash","\\"); + /* symbolunicode.put("sterling","\u00A3"); + symbolunicode.put("yen","\u00A5"); + symbolunicode.put("neg","\u00AC"); + symbolunicode.put("horizbar","\u2015"); + symbolunicode.put("twolowline","\u2017"); + symbolunicode.put("enleadertwodots","\u2025"); + symbolunicode.put("unicodeellipsis","\u2026"); + symbolunicode.put("prime","\u2032"); + symbolunicode.put("dprime","\u2033"); + symbolunicode.put("trprime","\u2034"); + symbolunicode.put("backprime","\u2035"); + symbolunicode.put("backdprime","\u2036"); + symbolunicode.put("backtrprime","\u2037"); + symbolunicode.put("Exclam","\u203C"); + symbolunicode.put("qprime","\u2057"); + symbolunicode.put("euro","\u20AC"); + symbolunicode.put("enclosecircle","\u20DD"); + symbolunicode.put("enclosesquare","\u20DE"); + symbolunicode.put("enclosediamond","\u20DF"); + symbolunicode.put("enclosetriangle","\u20E4"); + symbolunicode.put("Eulerconst","\u2017"); + symbolunicode.put("Planckconst","\u210E"); + symbolunicode.put("mho","\u2127"); + symbolunicode.put("Finv","\u2132"); + symbolunicode.put("Bbbpi","\u213C"); + symbolunicode.put("Game","\u2141"); + symbolunicode.put("sansLturned","\u2142"); + symbolunicode.put("sansLmirrored","\u2143"); + symbolunicode.put("Yup","\u2144"); + symbolunicode.put("mitBbbD","\u2145"); + symbolunicode.put("mitBbbd","\u2146"); + symbolunicode.put("mitBbbe","\u2147"); + symbolunicode.put("mitBbbi","\u2148"); + symbolunicode.put("mitBbbj","\u2149"); + symbolunicode.put("updownarrowbar","\u21A8"); + symbolunicode.put("linefeed","\u21B4"); + symbolunicode.put("carriagereturn","\u21B5"); + symbolunicode.put("barovernorthwestarrow","\u21B8"); + symbolunicode.put("barleftarrowrightarrowbar","\u21B9"); + symbolunicode.put("acwopencirclearrow","\u21BA"); + symbolunicode.put("cwopencirclearrow","\u21BB"); + symbolunicode.put("nHuparrow","\u21DE"); + symbolunicode.put("nHdownarrow","\u21DF"); + symbolunicode.put("leftdasharrow","\u21E0"); + symbolunicode.put("updasharrow","\u21E1"); + symbolunicode.put("rightdasharrow","\u21E2"); + symbolunicode.put("downdasharrow","\u21E3"); + symbolunicode.put("leftwhitearrow","\u21E6"); + symbolunicode.put("upwhitearrow","\u21E7"); + symbolunicode.put("rightwhitearrow","\u21E8"); + symbolunicode.put("downwhitearrow","\u21E9"); + symbolunicode.put("whitearrowupfrombar","\u21EA"); */ + symbolunicode.put("forall","\u2200"); + symbolunicode.put("complement","\u2201"); + symbolunicode.put("exists","\u2203"); + symbolunicode.put("nexists","\u2204"); + symbolunicode.put("varnothing","\u2205"); + symbolunicode.put("increment","\u2206"); + symbolunicode.put("QED","\u220E"); + symbolunicode.put("infty","\u221E"); + symbolunicode.put("rightangle","\u221F"); + symbolunicode.put("angle","\u2220"); + symbolunicode.put("measuredangle","\u2221"); + symbolunicode.put("sphericalangle","\u2222"); + symbolunicode.put("therefore","\u2234"); + symbolunicode.put("because","\u2235"); + /* symbolunicode.put("sinewave","\u223F"); + symbolunicode.put("top","\u22A4"); + symbolunicode.put("bot","\u22A5"); + symbolunicode.put("hermitmatrix","\u22B9"); + symbolunicode.put("measuredrightangle","\u22BE"); + symbolunicode.put("varlrtriangle","\u22BF"); + symbolunicode.put("unicodecdots","\u22EF"); + symbolunicode.put("diameter","\u2300"); + symbolunicode.put("invnot","\u2310"); + symbolunicode.put("turnednot","\u2319"); + symbolunicode.put("inttop","\u2320"); + symbolunicode.put("intbottom","\u2321"); + symbolunicode.put("lparenuend","\u239B"); + symbolunicode.put("lparenextender","\u239C"); + symbolunicode.put("lparenlend","\u239D"); + symbolunicode.put("rparenuend","\u239E"); + symbolunicode.put("rparenextender","\u239F"); + symbolunicode.put("rparenlend","\u23A0"); + symbolunicode.put("lbrackuend","\u23A1"); + symbolunicode.put("lbrackextender","\u23A2"); + symbolunicode.put("lbracklend","\u23A3"); + symbolunicode.put("rbrackuend","\u23A4"); + symbolunicode.put("rbrackextender","\u23A5"); + symbolunicode.put("rbracklend","\u23A6"); + symbolunicode.put("lbraceuend","\u23A7"); + symbolunicode.put("lbracemid","\u23A8"); + symbolunicode.put("lbracelend","\u23A9"); + symbolunicode.put("vbraceextender","\u23AA"); + symbolunicode.put("rbraceuend","\u23AB"); + symbolunicode.put("rbracemid","\u23AC"); + symbolunicode.put("rbracelend","\u23AD"); + symbolunicode.put("intextender","\u23AE"); + symbolunicode.put("harrowextender","\u23AF"); + symbolunicode.put("sumtop","\u23B2"); + symbolunicode.put("sumbottom","\u23B3"); + symbolunicode.put("sqrtbottom","\u23B7"); + symbolunicode.put("obrbrak","\u23E0"); + symbolunicode.put("ubrbrak","\u23E1"); + symbolunicode.put("blanksymbol","\u2422"); + symbolunicode.put("mathvisiblespace","\u2423"); + symbolunicode.put("mdlgblksquare","\u25A0"); + symbolunicode.put("mdlgwhtsquare","\u25A1"); + symbolunicode.put("bigblacktriangleup","\u25B2"); + symbolunicode.put("blacktriangleright","\u25B6"); + symbolunicode.put("blackpointerright","\u25BA"); + symbolunicode.put("whitepointerright","\u25BB"); + symbolunicode.put("bigblacktriangledown","\u25BC"); + symbolunicode.put("bigtriangledown","\u25BD"); + symbolunicode.put("blacktriangleleft","\u25C0"); + symbolunicode.put("blackpointerleft","\u25C4"); + symbolunicode.put("whitepointerleft","\u25C5"); + symbolunicode.put("bullseye","\u25CE"); + symbolunicode.put("mdlgblkcircle","\u25CF"); + symbolunicode.put("smwhtcircle","\u25E6"); + symbolunicode.put("squareleftblack","\u25E7"); + symbolunicode.put("squarerightblack","\u25E8"); + symbolunicode.put("mdwhtsquare","\u25FB"); + symbolunicode.put("mdblksquare","\u25FC"); + symbolunicode.put("bigstar","\u2605"); + symbolunicode.put("bigwhitestar","\u2606"); + symbolunicode.put("spadesuit","\u2660"); + symbolunicode.put("heartsuit","\u2661"); + symbolunicode.put("diamondsuit","\u2662"); + symbolunicode.put("clubsuit","\u2663"); + symbolunicode.put("varspadesuit","\u2664"); + symbolunicode.put("varheartsuit","\u2665"); + symbolunicode.put("vardiamondsuit","\u2666"); + symbolunicode.put("varclubsuit","\u2667"); + symbolunicode.put("quarternote","\u2669"); + symbolunicode.put("eighthnote","\u266A"); + symbolunicode.put("flat","\u266D"); + symbolunicode.put("natural","\u266E"); + symbolunicode.put("sharp","\u266F"); + symbolunicode.put("dicei","\u2680"); + symbolunicode.put("diceii","\u2681"); + symbolunicode.put("diceiii","\u2682"); + symbolunicode.put("diceiv","\u2683"); + symbolunicode.put("dicev","\u2684"); + symbolunicode.put("dicevi","\u2685"); + symbolunicode.put("checkmark","\u2713"); + symbolunicode.put("maltese","\u2720"); + symbolunicode.put("varstar","\u2736"); + symbolunicode.put("threedangle","\u27C0"); + symbolunicode.put("whiteinwhitetriangle","\u27C1"); + symbolunicode.put("subsetcirc","\u27C3"); + symbolunicode.put("supsetcirc","\u27C4"); + symbolunicode.put("diamondcdot","\u27D0"); + symbolunicode.put("rdiagovfdiag","\u292B"); + symbolunicode.put("fdiagovrdiag","\u292C"); + symbolunicode.put("seovnearrow","\u292D"); + symbolunicode.put("neovsearrow","\u292E"); + symbolunicode.put("fdiagovnearrow","\u292F"); + symbolunicode.put("rdiagovsearrow","\u2930"); + symbolunicode.put("neovnwarrow","\u2931"); + symbolunicode.put("nwovnearrow","\u2932"); + symbolunicode.put("uprightcurvearrow","\u2934"); + symbolunicode.put("downrightcurvedarrow","\u2935"); + symbolunicode.put("mdsmblkcircle","\u2981"); + symbolunicode.put("fourvdots","\u2999"); + symbolunicode.put("vzigzag","\u299A"); + symbolunicode.put("measuredangleleft","\u299B"); + symbolunicode.put("rightanglesqr","\u299C"); + symbolunicode.put("rightanglemdot","\u299D"); + symbolunicode.put("angles","\u299E"); + symbolunicode.put("angdnr","\u299F"); + symbolunicode.put("gtlpar","\u29A0"); + symbolunicode.put("sphericalangleup","\u29A1"); + symbolunicode.put("turnangle","\u29A2"); + symbolunicode.put("revangle","\u29A3"); + symbolunicode.put("angleubar","\u29A4"); + symbolunicode.put("revangleubar","\u29A5"); + symbolunicode.put("wideangledown","\u29A6"); + symbolunicode.put("wideangleup","\u29A7"); + symbolunicode.put("measanglerutone","\u29A8"); + symbolunicode.put("measanglelutonw","\u29A9"); + symbolunicode.put("measanglerdtose","\u29AA"); + symbolunicode.put("measangleldtosw","\u29AB"); + symbolunicode.put("measangleurtone","\u29AC"); + symbolunicode.put("measangleultonw","\u29AD"); + symbolunicode.put("measangledrtose","\u29AE"); + symbolunicode.put("measangledltosw","\u29AF"); + symbolunicode.put("revemptyset","\u29B0"); + symbolunicode.put("emptysetobar","\u29B1"); + symbolunicode.put("emptysetocirc","\u29B2"); + symbolunicode.put("emptysetoarr","\u29B3"); + symbolunicode.put("emptysetoarrl","\u29B4"); + symbolunicode.put("obot","\u29BA"); + symbolunicode.put("olcross","\u29BB"); + symbolunicode.put("odotslashdot","\u29BC"); + symbolunicode.put("uparrowoncircle","\u29BD"); + symbolunicode.put("circledwhitebullet","\u29BE"); + symbolunicode.put("circledbullet","\u29BF"); + symbolunicode.put("cirscir","\u29C2"); + symbolunicode.put("cirE","\u29C3"); + symbolunicode.put("boxonbox","\u29C9"); + symbolunicode.put("triangleodot","\u29CA"); + symbolunicode.put("triangleubar","\u29CB"); + symbolunicode.put("triangles","\u29CC"); + symbolunicode.put("iinfin","\u29DC"); + symbolunicode.put("tieinfty","\u29DD"); + symbolunicode.put("nvinfty","\u29DE"); + symbolunicode.put("laplac","\u29E0"); + symbolunicode.put("thermod","\u29E7"); + symbolunicode.put("downtriangleleftblack","\u29E8"); + symbolunicode.put("downtrianglerightblack","\u29E9"); + symbolunicode.put("blackdiamonddownarrow","\u29EA"); + symbolunicode.put("circledownarrow","\u29EC"); + symbolunicode.put("blackcircledownarrow","\u29ED"); + symbolunicode.put("errbarsquare","\u29EE"); + symbolunicode.put("errbarblacksquare","\u29EF"); + symbolunicode.put("errbardiamond","\u29F0"); + symbolunicode.put("errbarblackdiamond","\u29F1"); + symbolunicode.put("errbarcircle","\u29F2"); + symbolunicode.put("errbarblackcircle","\u29F3"); + symbolunicode.put("perps","\u2AE1"); + symbolunicode.put("topcir","\u2AF1"); + symbolunicode.put("dottedsquare","\u2B1A"); + symbolunicode.put("lgblksquare","\u2B1B"); + symbolunicode.put("lgwhtsquare","\u2B1C"); + symbolunicode.put("medwhitestar","\u2B50"); + symbolunicode.put("medblackstar","\u2B51"); + symbolunicode.put("smwhitestar","\u2B52"); */ + symbolunicode.put("less","\u003C"); + symbolunicode.put("equal","\u003D"); + symbolunicode.put("greater","\u003E"); + /* symbolunicode.put("closure","\u2050"); + symbolunicode.put("leftarrow","\u2190"); + symbolunicode.put("uparrow","\u2191"); + symbolunicode.put("rightarrow","\u2192"); + symbolunicode.put("downarrow","\u2193"); + symbolunicode.put("leftrightarrow","\u2194"); + symbolunicode.put("updownarrow","\u2195"); + symbolunicode.put("nwarrow","\u2196"); + symbolunicode.put("nearrow","\u2197"); + symbolunicode.put("searrow","\u2198"); + symbolunicode.put("swarrow","\u2199"); + symbolunicode.put("nleftarrow","\u219A"); + symbolunicode.put("nrightarrow","\u219B"); + symbolunicode.put("leftwavearrow","\u219C"); + symbolunicode.put("rightwavearrow","\u219D"); + symbolunicode.put("twoheadleftarrow","\u219E"); + symbolunicode.put("twoheaduparrow","\u219F"); + symbolunicode.put("twoheadrightarrow","\u21A0"); + symbolunicode.put("twoheaddownarrow","\u21A1"); + symbolunicode.put("leftarrowtail","\u21A2"); + symbolunicode.put("rightarrowtail","\u21A3"); + symbolunicode.put("mapsfrom","\u21A4"); + symbolunicode.put("mapsup","\u21A5"); + symbolunicode.put("mapsto(","\u21A6"); + symbolunicode.put("mapsdown","\u21A7"); + symbolunicode.put("hookleftarrow","\u21A9"); + symbolunicode.put("hookrightarrow","\u21AA"); + symbolunicode.put("looparrowleft","\u21AB"); + symbolunicode.put("looparrowright","\u21AC"); + symbolunicode.put("leftrightsquigarrow","\u21AD"); + symbolunicode.put("nleftrightarrow","\u21AE"); + symbolunicode.put("downzigzagarrow","\u21AF"); + symbolunicode.put("Lsh","\u21B0"); + symbolunicode.put("Rsh","\u21B1"); + symbolunicode.put("Ldsh","\u21B2"); + symbolunicode.put("Rdsh","\u21B3"); + symbolunicode.put("curvearrowleft","\u21B6"); + symbolunicode.put("curvearrowright","\u21B7"); + symbolunicode.put("leftharpoonup","\u21BC"); + symbolunicode.put("leftharpoondown","\u21BD"); + symbolunicode.put("upharpoonright","\u21BE"); + symbolunicode.put("upharpoonleft","\u21BF"); + symbolunicode.put("rightharpoonup","\u21C0"); + symbolunicode.put("rightharpoondown","\u21C1"); + symbolunicode.put("downharpoonright","\u21C2"); + symbolunicode.put("downharpoonleft","\u21C3"); + symbolunicode.put("rightleftarrows","\u21C4"); + symbolunicode.put("updownarrows","\u21C5"); + symbolunicode.put("leftrightarrows","\u21C6"); + symbolunicode.put("leftleftarrows","\u21C7"); + symbolunicode.put("upuparrows","\u21C8"); + symbolunicode.put("rightrightarrows","\u21C9"); + symbolunicode.put("downdownarrows","\u21CA"); + symbolunicode.put("leftrightharpoons","\u21CB"); + symbolunicode.put("rightleftharpoons","\u21CC"); + symbolunicode.put("nLeftarrow","\u21CD"); + symbolunicode.put("nLeftrightarrow","\u21CE"); + symbolunicode.put("nRightarrow","\u21CF"); + symbolunicode.put("Leftarrow","\u21D0"); + symbolunicode.put("Uparrow","\u21D1"); + symbolunicode.put("Rightarrow","\u21D2"); + symbolunicode.put("Downarrow","\u21D3"); + symbolunicode.put("Leftrightarrow","\u21D4"); + symbolunicode.put("Updownarrow","\u21D5"); + symbolunicode.put("Nwarrow","\u21D6"); + symbolunicode.put("Nearrow","\u21D7"); + symbolunicode.put("Searrow","\u21D8"); + symbolunicode.put("Swarrow","\u21D9"); + symbolunicode.put("Lleftarrow","\u21DA"); + symbolunicode.put("Rrightarrow","\u21DB"); + symbolunicode.put("leftsquigarrow","\u21DC"); + symbolunicode.put("rightsquigarrow","\u21DD"); + symbolunicode.put("barleftarrow","\u21E4"); + symbolunicode.put("rightarrowbar","\u21E5"); + symbolunicode.put("circleonrightarrow","\u21F4"); + symbolunicode.put("downuparrows","\u21F5"); + symbolunicode.put("rightthreearrows","\u21F6"); + symbolunicode.put("nvleftarrow","\u21F7"); + symbolunicode.put("nvrightarrow","\u21F8"); + symbolunicode.put("nvleftrightarrow","\u21F9"); + symbolunicode.put("nVleftarrow","\u21FA"); + symbolunicode.put("nVrightarrow","\u21FB"); + symbolunicode.put("nVleftrightarrow","\u21FC"); + symbolunicode.put("leftarrowtriangle","\u21FD"); + symbolunicode.put("rightarrowtriangle","\u21FE"); + symbolunicode.put("leftrightarrowtriangle","\u21FF"); + symbolunicode.put("in","\u2208"); + symbolunicode.put("notin","\u2209"); + symbolunicode.put("smallin","\u220A"); + symbolunicode.put("ni","\u220B"); + symbolunicode.put("nni","\u220C"); + symbolunicode.put("smallni","\u220D"); + symbolunicode.put("propto","\u221D"); + symbolunicode.put("mid","\u2223"); + symbolunicode.put("nmid","\u2224"); + symbolunicode.put("parallel","\u2225"); + symbolunicode.put("nparallel","\u2226"); + symbolunicode.put("mathratio","\u2236"); + symbolunicode.put("Colon","\u2237"); + symbolunicode.put("dashcolon","\u2239"); + symbolunicode.put("dotsminusdots","\u223A"); + symbolunicode.put("kernelcontraction","\u223B"); */ + symbolunicode.put("sim","\u223C"); +// symbolunicode.put("backsim","\u223D"); + symbolunicode.put("nsim","\u2241"); + symbolunicode.put("eqsim","\u2242"); + symbolunicode.put("simeq","\u2243"); + symbolunicode.put("nsime","\u2244"); + // symbolunicode.put("cong","\u2245"); + // symbolunicode.put("simneqq","\u2246"); + // symbolunicode.put("ncong","\u2247"); + symbolunicode.put("approx","\u2248"); + symbolunicode.put("napprox","\u2249"); + symbolunicode.put("approxeq","\u224A"); + /* symbolunicode.put("approxident","\u224B"); + symbolunicode.put("backcong","\u224C"); + symbolunicode.put("asymp","\u224D"); + symbolunicode.put("Bumpeq","\u224E"); + symbolunicode.put("bumpeq","\u224F"); + symbolunicode.put("doteq","\u2250"); + symbolunicode.put("Doteq","\u2251"); + symbolunicode.put("fallingdotseq","\u2252"); + symbolunicode.put("risingdotseq","\u2253"); + symbolunicode.put("coloneq","\u2254"); + symbolunicode.put("eqcolon","\u2255"); + symbolunicode.put("eqcirc","\u2256"); + symbolunicode.put("circeq","\u2257"); + symbolunicode.put("arceq","\u2258"); + symbolunicode.put("wedgeq","\u2259"); + symbolunicode.put("veeeq","\u225A"); + symbolunicode.put("stareq","\u225B"); + symbolunicode.put("triangleq","\u225C"); + symbolunicode.put("eqdef","\u225D"); + symbolunicode.put("measeq","\u225E"); + symbolunicode.put("questeq","\u225F"); */ + symbolunicode.put("ne","\u2260"); + symbolunicode.put("equiv","\u2261"); + symbolunicode.put("nequiv","\u2262"); + symbolunicode.put("Equiv","\u2263"); + symbolunicode.put("leq","\u2264"); + symbolunicode.put("geq","\u2265"); + symbolunicode.put("leqq","\u2266"); + symbolunicode.put("geqq","\u2267"); + symbolunicode.put("lneqq","\u2268"); + symbolunicode.put("gneqq","\u2269"); + symbolunicode.put("ll","\u226A"); + symbolunicode.put("gg","\u226B"); + /* symbolunicode.put("between","\u226C"); + symbolunicode.put("nasymp","\u226D"); + symbolunicode.put("nless","\u226E"); + symbolunicode.put("ngtr","\u226F"); + symbolunicode.put("nleq","\u2270"); + symbolunicode.put("ngeq","\u2271"); + symbolunicode.put("lesssim","\u2272"); + symbolunicode.put("gtrsim","\u2273"); + symbolunicode.put("nlesssim","\u2274"); + symbolunicode.put("ngtrsim","\u2275"); + symbolunicode.put("lessgtr","\u2276"); + symbolunicode.put("gtrless","\u2277"); + symbolunicode.put("nlessgtr","\u2278"); + symbolunicode.put("ngtrless","\u2279"); + symbolunicode.put("prec","\u227A"); + symbolunicode.put("succ","\u227B"); + symbolunicode.put("preccurlyeq","\u227C"); + symbolunicode.put("succcurlyeq","\u227D"); + symbolunicode.put("precsim","\u227E"); + symbolunicode.put("succsim","\u227F"); + symbolunicode.put("nprec","\u2280"); + symbolunicode.put("nsucc","\u2281"); + symbolunicode.put("subset","\u2282"); + symbolunicode.put("supset","\u2283"); + symbolunicode.put("nsubset","\u2284"); + symbolunicode.put("nsupset","\u2285"); + symbolunicode.put("subseteq","\u2286"); + symbolunicode.put("supseteq","\u2287"); + symbolunicode.put("nsubseteq","\u2288"); + symbolunicode.put("nsupseteq","\u2289"); + symbolunicode.put("subsetneq","\u228A"); + symbolunicode.put("supsetneq","\u228B"); + symbolunicode.put("sqsubset","\u228F"); + symbolunicode.put("sqsupset","\u2290"); + symbolunicode.put("sqsubseteq","\u2291"); + symbolunicode.put("sqsupseteq","\u2292"); + symbolunicode.put("vdash","\u22A2"); + symbolunicode.put("dashv","\u22A3"); + symbolunicode.put("assert","\u22A6"); + symbolunicode.put("models","\u22A7"); + symbolunicode.put("vDash","\u22A8"); + symbolunicode.put("Vdash","\u22A9"); + symbolunicode.put("Vvdash","\u22AA"); + symbolunicode.put("VDash","\u22AB"); + symbolunicode.put("nvdash","\u22AC"); + symbolunicode.put("nvDash","\u22AD"); + symbolunicode.put("nVdash","\u22AE"); + symbolunicode.put("nVDash","\u22AF"); + symbolunicode.put("prurel","\u22B0"); + symbolunicode.put("scurel","\u22B1"); + symbolunicode.put("vartriangleleft","\u22B2"); + symbolunicode.put("vartriangleright","\u22B3"); + symbolunicode.put("trianglelefteq","\u22B4"); + symbolunicode.put("trianglerighteq","\u22B5"); + symbolunicode.put("origof","\u22B6"); + symbolunicode.put("imageof","\u22B7"); + symbolunicode.put("multimap","\u22B8"); + symbolunicode.put("bowtie","\u22C8"); + symbolunicode.put("backsimeq","\u22CD"); + symbolunicode.put("Subset","\u22D0"); + symbolunicode.put("Supset","\u22D1"); + symbolunicode.put("pitchfork","\u22D4"); + symbolunicode.put("equalparallel","\u22D5"); + symbolunicode.put("lessdot","\u22D6"); + symbolunicode.put("gtrdot","\u22D7"); + symbolunicode.put("lll","\u22D8"); + symbolunicode.put("ggg","\u22D9"); + symbolunicode.put("lesseqgtr","\u22DA"); + symbolunicode.put("gtreqless","\u22DB"); + symbolunicode.put("eqless","\u22DC"); + symbolunicode.put("eqgtr","\u22DD"); + symbolunicode.put("curlyeqprec","\u22DE"); + symbolunicode.put("curlyeqsucc","\u22DF"); + symbolunicode.put("npreccurlyeq","\u22E0"); + symbolunicode.put("nsucccurlyeq","\u22E1"); + symbolunicode.put("nsqsubseteq","\u22E2"); + symbolunicode.put("nsqsupseteq","\u22E3"); + symbolunicode.put("sqsubsetneq","\u22E4"); + symbolunicode.put("sqsupsetneq","\u22E5"); + symbolunicode.put("lnsim","\u22E6"); + symbolunicode.put("gnsim","\u22E7"); + symbolunicode.put("precnsim","\u22E8"); + symbolunicode.put("succnsim","\u22E9"); + symbolunicode.put("nvartriangleleft","\u22EA"); + symbolunicode.put("nvartriangleright","\u22EB"); + symbolunicode.put("ntrianglelefteq","\u22EC"); + symbolunicode.put("ntrianglerighteq","\u22ED"); + symbolunicode.put("vdots","\u22EE"); + symbolunicode.put("adots","\u22F0"); + symbolunicode.put("ddots","\u22F1"); + symbolunicode.put("disin","\u22F2"); + symbolunicode.put("varisins","\u22F3"); + symbolunicode.put("isins","\u22F4"); + symbolunicode.put("isindot","\u22F5"); + symbolunicode.put("varisinobar","\u22F6"); + symbolunicode.put("isinobar","\u22F7"); + symbolunicode.put("isinvb","\u22F8"); + symbolunicode.put("isinE","\u22F9"); + symbolunicode.put("nisd","\u22FA"); + symbolunicode.put("varnis","\u22FB"); + symbolunicode.put("nis","\u22FC"); + symbolunicode.put("varniobar","\u22FD"); + symbolunicode.put("niobar","\u22FE"); + symbolunicode.put("bagmember","\u22FF"); + symbolunicode.put("frown","\u2322"); + symbolunicode.put("smile","\u2323"); + symbolunicode.put("perp","\u27C2"); + symbolunicode.put("bsolhsub","\u27C8"); + symbolunicode.put("suphsol","\u27C9"); + symbolunicode.put("upin","\u27D2"); + symbolunicode.put("pullback","\u27D3"); + symbolunicode.put("pushout","\u27D4"); + symbolunicode.put("DashVDash","\u27DA"); + symbolunicode.put("dashVdash","\u27DB"); + symbolunicode.put("multimapinv","\u27DC"); + symbolunicode.put("vlongdash","\u27DD"); + symbolunicode.put("longdashv","\u27DE"); + symbolunicode.put("cirbot","\u27DF"); + symbolunicode.put("UUparrow","\u27F0"); + symbolunicode.put("DDownarrow","\u27F1"); + symbolunicode.put("acwgapcirclearrow","\u27F2"); + symbolunicode.put("cwgapcirclearrow","\u27F3"); + symbolunicode.put("rightarrowonoplus","\u27F4"); + symbolunicode.put("longleftarrow","\u27F5"); + symbolunicode.put("longrightarrow","\u27F6"); + symbolunicode.put("longleftrightarrow","\u27F7"); + symbolunicode.put("Longleftarrow","\u27F8"); + symbolunicode.put("Longrightarrow","\u27F9"); + symbolunicode.put("Longleftrightarrow","\u27FA"); + symbolunicode.put("longmapsfrom","\u27FB"); + symbolunicode.put("longmapsto","\u27FC"); + symbolunicode.put("Longmapsfrom","\u27FD"); + symbolunicode.put("Longmapsto","\u27FE"); + symbolunicode.put("longrightsquigarrow","\u27FF"); + symbolunicode.put("nvtwoheadrightarrow","\u2900"); + symbolunicode.put("nVtwoheadrightarrow","\u2901"); + symbolunicode.put("nvLeftarrow","\u2902"); + symbolunicode.put("nvRightarrow","\u2903"); + symbolunicode.put("nvLeftrightarrow","\u2904"); + symbolunicode.put("twoheadmapsto","\u2905"); + symbolunicode.put("Mapsfrom","\u2906"); + symbolunicode.put("Mapsto","\u2907"); + symbolunicode.put("downarrowbarred","\u2908"); + symbolunicode.put("uparrowbarred","\u2909"); + symbolunicode.put("Uuparrow","\u290A"); + symbolunicode.put("Ddownarrow","\u290B"); + symbolunicode.put("leftbkarrow","\u290C"); + symbolunicode.put("rightbkarrow","\u290D"); + symbolunicode.put("leftdbkarrow","\u290E"); + symbolunicode.put("dbkarow","\u290F"); + symbolunicode.put("drbkarow","\u2910"); + symbolunicode.put("rightdotarrow","\u2911"); + symbolunicode.put("baruparrow","\u2912"); + symbolunicode.put("downarrowbar","\u2913"); + symbolunicode.put("nvrightarrowtail","\u2914"); + symbolunicode.put("nVrightarrowtail","\u2915"); + symbolunicode.put("twoheadrightarrowtail","\u2916"); + symbolunicode.put("nvtwoheadrightarrowtail","\u2917"); + symbolunicode.put("nVtwoheadrightarrowtail","\u2918"); + symbolunicode.put("lefttail","\u2919"); + symbolunicode.put("righttail","\u291A"); + symbolunicode.put("leftdbltail","\u291B"); + symbolunicode.put("rightdbltail","\u291C"); + symbolunicode.put("diamondleftarrow","\u291D"); + symbolunicode.put("rightarrowdiamond","\u291E"); + symbolunicode.put("diamondleftarrowbar","\u291F"); + symbolunicode.put("barrightarrowdiamond","\u2920"); + symbolunicode.put("nwsearrow","\u2921"); + symbolunicode.put("neswarrow","\u2922"); + symbolunicode.put("hknwarrow","\u2923"); + symbolunicode.put("hknearrow","\u2924"); + symbolunicode.put("hksearow","\u2925"); + symbolunicode.put("hkswarow","\u2926"); + symbolunicode.put("tona","\u2927"); + symbolunicode.put("toea","\u2928"); + symbolunicode.put("tosa","\u2929"); + symbolunicode.put("towa","\u292A"); + symbolunicode.put("rightcurvedarrow","\u2933"); + symbolunicode.put("leftdowncurvedarrow","\u2936"); + symbolunicode.put("rightdowncurvedarrow","\u2937"); + symbolunicode.put("cwrightarcarrow","\u2938"); + symbolunicode.put("acwleftarcarrow","\u2939"); + symbolunicode.put("acwoverarcarrow","\u293A"); + symbolunicode.put("acwunderarcarrow","\u293B"); + symbolunicode.put("curvearrowrightminus","\u293C"); + symbolunicode.put("curvearrowleftplus","\u293D"); + symbolunicode.put("cwundercurvearrow","\u293E"); + symbolunicode.put("ccwundercurvearrow","\u293F"); + symbolunicode.put("acwcirclearrow","\u2940"); + symbolunicode.put("cwcirclearrow","\u2941"); + symbolunicode.put("rightarrowshortleftarrow","\u2942"); + symbolunicode.put("leftarrowshortrightarrow","\u2943"); + symbolunicode.put("shortrightarrowleftarrow","\u2944"); + symbolunicode.put("rightarrowplus","\u2945"); + symbolunicode.put("leftarrowplus","\u2946"); + symbolunicode.put("rightarrowx","\u2947"); + symbolunicode.put("leftrightarrowcircle","\u2948"); + symbolunicode.put("twoheaduparrowcircle","\u2949"); + symbolunicode.put("leftrightharpoonupdown","\u294A"); + symbolunicode.put("leftrightharpoondownup","\u294B"); + symbolunicode.put("updownharpoonrightleft","\u294C"); + symbolunicode.put("updownharpoonleftright","\u294D"); + symbolunicode.put("leftrightharpoonupup","\u294E"); + symbolunicode.put("updownharpoonrightright","\u294F"); + symbolunicode.put("leftrightharpoondowndown","\u2950"); + symbolunicode.put("updownharpoonleftleft","\u2951"); + symbolunicode.put("barleftharpoonup","\u2952"); + symbolunicode.put("rightharpoonupbar","\u2953"); + symbolunicode.put("barupharpoonright","\u2954"); + symbolunicode.put("downharpoonrightbar","\u2955"); + symbolunicode.put("barleftharpoondown","\u2956"); + symbolunicode.put("rightharpoondownbar","\u2957"); + symbolunicode.put("barupharpoonleft","\u2958"); + symbolunicode.put("downharpoonleftbar","\u2959"); + symbolunicode.put("leftharpoonupbar","\u295A"); + symbolunicode.put("barrightharpoonup","\u295B"); + symbolunicode.put("upharpoonrightbar","\u295C"); + symbolunicode.put("bardownharpoonright","\u295D"); + symbolunicode.put("leftharpoondownbar","\u295E"); + symbolunicode.put("barrightharpoondown","\u295F"); + symbolunicode.put("upharpoonleftbar","\u2960"); + symbolunicode.put("bardownharpoonleft","\u2961"); + symbolunicode.put("leftharpoonsupdown","\u2962"); + symbolunicode.put("upharpoonsleftright","\u2963"); + symbolunicode.put("rightharpoonsupdown","\u2964"); + symbolunicode.put("downharpoonsleftright","\u2965"); + symbolunicode.put("leftrightharpoonsup","\u2966"); + symbolunicode.put("leftrightharpoonsdown","\u2967"); + symbolunicode.put("rightleftharpoonsup","\u2968"); + symbolunicode.put("rightleftharpoonsdown","\u2969"); + symbolunicode.put("leftharpoonupdash","\u296A"); + symbolunicode.put("dashleftharpoondown","\u296B"); + symbolunicode.put("rightharpoonupdash","\u296C"); + symbolunicode.put("dashrightharpoondown","\u296D"); + symbolunicode.put("updownharpoonsleftright","\u296E"); + symbolunicode.put("downupharpoonsleftright","\u296F"); + symbolunicode.put("rightimply","\u2970"); + symbolunicode.put("equalrightarrow","\u2971"); + symbolunicode.put("similarrightarrow","\u2972"); + symbolunicode.put("leftarrowsimilar","\u2973"); + symbolunicode.put("rightarrowsimilar","\u2974"); + symbolunicode.put("rightarrowapprox","\u2975"); + symbolunicode.put("ltlarr","\u2976"); + symbolunicode.put("leftarrowless","\u2977"); + symbolunicode.put("gtrarr","\u2978"); + symbolunicode.put("subrarr","\u2979"); + symbolunicode.put("leftarrowsubset","\u297A"); + symbolunicode.put("suplarr","\u297B"); + symbolunicode.put("leftfishtail","\u297C"); + symbolunicode.put("rightfishtail","\u297D"); + symbolunicode.put("upfishtail","\u297E"); + symbolunicode.put("downfishtail","\u297F"); + symbolunicode.put("rtriltri","\u29CE"); + symbolunicode.put("ltrivb","\u29CF"); + symbolunicode.put("vbrtri","\u29D0"); + symbolunicode.put("lfbowtie","\u29D1"); + symbolunicode.put("rfbowtie","\u29D2"); + symbolunicode.put("fbowtie","\u29D3"); + symbolunicode.put("lftimes","\u29D4"); + symbolunicode.put("rftimes","\u29D5"); + symbolunicode.put("dualmap","\u29DF"); + symbolunicode.put("lrtriangleeq","\u29E1"); + symbolunicode.put("eparsl","\u29E3"); + symbolunicode.put("smeparsl","\u29E4"); + symbolunicode.put("eqvparsl","\u29E5"); + symbolunicode.put("gleichstark","\u29E6"); + symbolunicode.put("ruledelayed","\u29F4"); + symbolunicode.put("veeonwedge","\u2A59"); + symbolunicode.put("eqdot","\u2A66"); + symbolunicode.put("dotequiv","\u2A67"); + symbolunicode.put("equivVert","\u2A68"); + symbolunicode.put("equivVvert","\u2A69"); + symbolunicode.put("dotsim","\u2A6A"); + symbolunicode.put("simrdots","\u2A6B"); + symbolunicode.put("simminussim","\u2A6C"); + symbolunicode.put("congdot","\u2A6D"); + symbolunicode.put("asteq","\u2A6E"); + symbolunicode.put("hatapprox","\u2A6F"); + symbolunicode.put("approxeqq","\u2A70"); + symbolunicode.put("eqqsim","\u2A73"); + symbolunicode.put("Coloneq","\u2A74"); + symbolunicode.put("eqeq","\u2A75"); + symbolunicode.put("eqeqeq","\u2A76"); + symbolunicode.put("ddotseq","\u2A77"); + symbolunicode.put("equivDD","\u2A78"); + symbolunicode.put("ltcir","\u2A79"); + symbolunicode.put("gtcir","\u2A7A"); + symbolunicode.put("ltquest","\u2A7B"); + symbolunicode.put("gtquest","\u2A7C"); + symbolunicode.put("leqslant","\u2A7D"); + symbolunicode.put("geqslant","\u2A7E"); + symbolunicode.put("lesdot","\u2A7F"); + symbolunicode.put("gesdot","\u2A80"); + symbolunicode.put("lesdoto","\u2A81"); + symbolunicode.put("gesdoto","\u2A82"); + symbolunicode.put("lesdotor","\u2A83"); + symbolunicode.put("gesdotol","\u2A84"); + symbolunicode.put("lessapprox","\u2A85"); + symbolunicode.put("gtrapprox","\u2A86"); + symbolunicode.put("lneq","\u2A87"); + symbolunicode.put("gneq","\u2A88"); + symbolunicode.put("lnapprox","\u2A89"); + symbolunicode.put("gnapprox","\u2A8A"); + symbolunicode.put("lesseqqgtr","\u2A8B"); + symbolunicode.put("gtreqqless","\u2A8C"); + symbolunicode.put("lsime","\u2A8D"); + symbolunicode.put("gsime","\u2A8E"); + symbolunicode.put("lsimg","\u2A8F"); + symbolunicode.put("gsiml","\u2A90"); + symbolunicode.put("lgE","\u2A91"); + symbolunicode.put("glE","\u2A92"); + symbolunicode.put("lesges","\u2A93"); + symbolunicode.put("gesles","\u2A94"); + symbolunicode.put("eqslantless","\u2A95"); + symbolunicode.put("eqslantgtr","\u2A96"); + symbolunicode.put("elsdot","\u2A97"); + symbolunicode.put("egsdot","\u2A98"); + symbolunicode.put("eqqless","\u2A99"); + symbolunicode.put("eqqgtr","\u2A9A"); + symbolunicode.put("eqqslantless","\u2A9B"); + symbolunicode.put("eqqslantgtr","\u2A9C"); + symbolunicode.put("simless","\u2A9D"); + symbolunicode.put("simgtr","\u2A9E"); + symbolunicode.put("simlE","\u2A9F"); + symbolunicode.put("simgE","\u2AA0"); + symbolunicode.put("Lt","\u2AA1"); + symbolunicode.put("Gt","\u2AA2"); + symbolunicode.put("partialmeetcontraction","\u2AA3"); + symbolunicode.put("glj","\u2AA4"); + symbolunicode.put("gla","\u2AA5"); + symbolunicode.put("ltcc","\u2AA6"); + symbolunicode.put("gtcc","\u2AA7"); + symbolunicode.put("lescc","\u2AA8"); + symbolunicode.put("gescc","\u2AA9"); + symbolunicode.put("smt","\u2AAA"); + symbolunicode.put("lat","\u2AAB"); + symbolunicode.put("smte","\u2AAC"); + symbolunicode.put("late","\u2AAD"); + symbolunicode.put("bumpeqq","\u2AAE"); + symbolunicode.put("preceq","\u2AAF"); + symbolunicode.put("succeq","\u2AB0"); + symbolunicode.put("precneq","\u2AB1"); + symbolunicode.put("succneq","\u2AB2"); + symbolunicode.put("preceqq","\u2AB3"); + symbolunicode.put("succeqq","\u2AB4"); + symbolunicode.put("precneqq","\u2AB5"); + symbolunicode.put("succneqq","\u2AB6"); + symbolunicode.put("precapprox","\u2AB7"); + symbolunicode.put("succapprox","\u2AB8"); + symbolunicode.put("precnapprox","\u2AB9"); + symbolunicode.put("succnapprox","\u2ABA"); + symbolunicode.put("Prec","\u2ABB"); + symbolunicode.put("Succ","\u2ABC"); + symbolunicode.put("subsetdot","\u2ABD"); + symbolunicode.put("supsetdot","\u2ABE"); + symbolunicode.put("subsetplus","\u2ABF"); + symbolunicode.put("supsetplus","\u2AC0"); + symbolunicode.put("submult","\u2AC1"); + symbolunicode.put("supmult","\u2AC2"); + symbolunicode.put("subedot","\u2AC3"); + symbolunicode.put("supedot","\u2AC4"); + symbolunicode.put("subseteqq","\u2AC5"); + symbolunicode.put("supseteqq","\u2AC6"); + symbolunicode.put("subsim","\u2AC7"); + symbolunicode.put("supsim","\u2AC8"); + symbolunicode.put("subsetapprox","\u2AC9"); + symbolunicode.put("supsetapprox","\u2ACA"); + symbolunicode.put("subsetneqq","\u2ACB"); + symbolunicode.put("supsetneqq","\u2ACC"); + symbolunicode.put("lsqhook","\u2ACD"); + symbolunicode.put("rsqhook","\u2ACE"); + symbolunicode.put("csub","\u2ACF"); + symbolunicode.put("csup","\u2AD0"); + symbolunicode.put("csube","\u2AD1"); + symbolunicode.put("csupe","\u2AD2"); + symbolunicode.put("subsup","\u2AD3"); + symbolunicode.put("supsub","\u2AD4"); + symbolunicode.put("subsub","\u2AD5"); + symbolunicode.put("supsup","\u2AD6"); + symbolunicode.put("suphsub","\u2AD7"); + symbolunicode.put("supdsub","\u2AD8"); + symbolunicode.put("forkv","\u2AD9"); + symbolunicode.put("topfork","\u2ADA"); + symbolunicode.put("mlcp","\u2ADB"); + symbolunicode.put("forks","\u2ADC"); + symbolunicode.put("forksnot","\u2ADD"); + symbolunicode.put("shortlefttack","\u2ADE"); + symbolunicode.put("shortdowntack","\u2ADF"); + symbolunicode.put("shortuptack","\u2AE0"); + symbolunicode.put("vDdash","\u2AE2"); + symbolunicode.put("dashV","\u2AE3"); + symbolunicode.put("Dashv","\u2AE4"); + symbolunicode.put("DashV","\u2AE5"); + symbolunicode.put("varVdash","\u2AE6"); + symbolunicode.put("Barv","\u2AE7"); + symbolunicode.put("vBar","\u2AE8"); + symbolunicode.put("vBarv","\u2AE9"); + symbolunicode.put("barV","\u2AEA"); + symbolunicode.put("Vbar","\u2AEB"); + symbolunicode.put("Not","\u2AEC"); + symbolunicode.put("bNot","\u2AED"); + symbolunicode.put("revnmid","\u2AEE"); + symbolunicode.put("cirmid","\u2AEF"); + symbolunicode.put("midcir","\u2AF0"); + symbolunicode.put("nhpar","\u2AF2"); + symbolunicode.put("parsim","\u2AF3"); + symbolunicode.put("lllnest","\u2AF7"); + symbolunicode.put("gggnest","\u2AF8"); + symbolunicode.put("leqqslant","\u2AF9"); + symbolunicode.put("geqqslant","\u2AFA"); + symbolunicode.put("circleonleftarrow","\u2B30"); + symbolunicode.put("leftthreearrows","\u2B31"); + symbolunicode.put("leftarrowonoplus","\u2B32"); + symbolunicode.put("longleftsquigarrow","\u2B33"); + symbolunicode.put("nvtwoheadleftarrow","\u2B34"); + symbolunicode.put("nVtwoheadleftarrow","\u2B35"); + symbolunicode.put("twoheadmapsfrom","\u2B36"); + symbolunicode.put("twoheadleftdbkarrow","\u2B37"); + symbolunicode.put("leftdotarrow","\u2B38"); + symbolunicode.put("nvleftarrowtail","\u2B39"); + symbolunicode.put("nVleftarrowtail","\u2B3A"); + symbolunicode.put("twoheadleftarrowtail","\u2B3B"); + symbolunicode.put("nvtwoheadleftarrowtail","\u2B3C"); + symbolunicode.put("nVtwoheadleftarrowtail","\u2B3D"); + symbolunicode.put("leftarrowx","\u2B3E"); + symbolunicode.put("leftcurvedarrow","\u2B3F"); + symbolunicode.put("equalleftarrow","\u2B40"); + symbolunicode.put("bsimilarleftarrow","\u2B41"); + symbolunicode.put("leftarrowbackapprox","\u2B42"); + symbolunicode.put("rightarrowgtr","\u2B43"); + symbolunicode.put("rightarrowsupset","\u2B44"); + symbolunicode.put("LLeftarrow","\u2B45"); + symbolunicode.put("RRightarrow","\u2B46"); + symbolunicode.put("bsimilarrightarrow","\u2B47"); + symbolunicode.put("rightarrowbackapprox","\u2B48"); + symbolunicode.put("similarleftarrow","\u2B49"); + symbolunicode.put("leftarrowapprox","\u2B4A"); + symbolunicode.put("leftarrowbsimilar","\u2B4B"); + symbolunicode.put("rightarrowbsimilar","\u2B4C"); */ + symbolunicode.put("Alpha","\u0391"); + symbolunicode.put("Beta","\u0392"); + symbolunicode.put("Gamma","\u0393"); + symbolunicode.put("Delta","\u0394"); + symbolunicode.put("Epsilon","\u0395"); + symbolunicode.put("Zeta","\u0396"); + symbolunicode.put("Eta","\u0397"); + symbolunicode.put("Theta","\u0398"); + symbolunicode.put("Iota","\u0399"); + symbolunicode.put("Kappa","\u039A"); + symbolunicode.put("Lambda","\u039B"); + symbolunicode.put("Mu","\u039C"); + symbolunicode.put("Nu","\u039D"); + symbolunicode.put("Xi","\u039E"); + symbolunicode.put("Omicron","\u039F"); + symbolunicode.put("Pi","\u03A0"); + symbolunicode.put("Rho","\u03A1"); + symbolunicode.put("Sigma","\u03A3"); + symbolunicode.put("Tau","\u03A4"); + symbolunicode.put("Upsilon","\u03A5"); + symbolunicode.put("Phi","\u03A6"); + symbolunicode.put("Chi","\u03A7"); + symbolunicode.put("Psi","\u03A8"); + symbolunicode.put("Omega","\u03A9"); + symbolunicode.put("alpha","\u03B1"); + symbolunicode.put("beta","\u03B2"); + symbolunicode.put("gamma","\u03B3"); + symbolunicode.put("delta","\u03B4"); + symbolunicode.put("epsilon","\u03B5"); + symbolunicode.put("zeta","\u03B6"); + symbolunicode.put("eta","\u03B7"); + symbolunicode.put("theta","\u03B8"); + symbolunicode.put("iota","\u03B9"); + symbolunicode.put("kappa","\u03BA"); + symbolunicode.put("lambda","\u03BB"); + symbolunicode.put("mu","\u03BC"); + symbolunicode.put("nu","\u03BD"); + symbolunicode.put("xi","\u03BE"); + symbolunicode.put("omicron","\u03BF"); + symbolunicode.put("pi","\u03C0"); + symbolunicode.put("rho","\u03C1"); + symbolunicode.put("varsigma","\u03C2"); + symbolunicode.put("sigma","\u03C3"); + symbolunicode.put("tau","\u03C4"); + symbolunicode.put("upsilon","\u03C5"); + symbolunicode.put("varphi","\u03C6"); + symbolunicode.put("chi","\u03C7"); + symbolunicode.put("psi","\u03C8"); + symbolunicode.put("omega","\u03C9"); + symbolunicode.put("varbeta","\u03D0"); + symbolunicode.put("vartheta","\u03D1"); + symbolunicode.put("phi","\u03D5"); + symbolunicode.put("varpi","\u03D6"); + symbolunicode.put("Digamma","\u03DC"); + symbolunicode.put("digamma","\u03DD"); + symbolunicode.put("varkappa","\u03F0"); + symbolunicode.put("varrho","\u03F1"); + symbolunicode.put("varTheta","\u03F4"); + symbolunicode.put("varepsilon","\u03F5"); + symbolunicode.put("matheth","\u00F0"); + symbolunicode.put("BbbC","\u2102"); + symbolunicode.put("mscrg","\u210A"); + symbolunicode.put("mscrH","\u210B"); + symbolunicode.put("mfrakH","\u210C"); + symbolunicode.put("BbbH","\u210D"); + symbolunicode.put("hslash","\u210F"); + symbolunicode.put("mscrI","\u2110"); + symbolunicode.put("Im","\u2111"); + symbolunicode.put("mscrL","\u2112"); + symbolunicode.put("ell","\u2113"); + symbolunicode.put("BbbN","\u2115"); + symbolunicode.put("wp","\u2118"); + symbolunicode.put("BbbP","\u2119"); + symbolunicode.put("BbbQ","\u211A"); + symbolunicode.put("mscrR","\u211B"); + symbolunicode.put("Re","\u211C"); + symbolunicode.put("BbbR","\u211D"); + symbolunicode.put("BbbZ","\u2124"); + symbolunicode.put("mfrakZ","\u2128"); + symbolunicode.put("turnediota","\u2129"); + symbolunicode.put("Angstrom","\u212B"); + symbolunicode.put("mscrB","\u212C"); + symbolunicode.put("mfrakC","\u212D"); + symbolunicode.put("mscre","\u212F"); + symbolunicode.put("mscrE","\u2130"); + symbolunicode.put("mscrF","\u2131"); + symbolunicode.put("mscrM","\u2133"); + symbolunicode.put("mscro","\u2134"); + symbolunicode.put("aleph","\u2135"); + symbolunicode.put("beth","\u2136"); + symbolunicode.put("gimel","\u2137"); + symbolunicode.put("daleth","\u2138"); + symbolunicode.put("Bbbgamma","\u213D"); + symbolunicode.put("BbbGamma","\u213E"); + symbolunicode.put("BbbPi","\u213F"); + symbolunicode.put("partial","\u2202"); + symbolunicode.put("nabla","\u2207"); + symbolunicode.put("log","log"); + symbolunicode.put("ln","ln"); + symbolunicode.put("sin","sin"); + symbolunicode.put("cos","cos"); + symbolunicode.put("tan","tan"); + symbolunicode.put("sec","sec"); + symbolunicode.put("csc","csc"); + symbolunicode.put("cot","cot"); + symbolunicode.put("sinh","sinh"); + symbolunicode.put("cosh","cosh"); + symbolunicode.put("tanh","tanh"); + symbolunicode.put("coth","coth"); + symbolunicode.put("sech","sech"); + symbolunicode.put("csch","csch"); + symbolunicode.put("lim","lim"); + symbolunicode.put("sqrt","\u221A"); + symbolunicode.put("cuberoot","\u221B"); + symbolunicode.put("fourthroot","\u221C"); + + +}} + + + + + + + diff --git a/systems/android/hktex/HKtex2/src/worker4math/hktex2/Textattributefile.java b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Textattributefile.java new file mode 100644 index 0000000000..01649b21d8 --- /dev/null +++ b/systems/android/hktex/HKtex2/src/worker4math/hktex2/Textattributefile.java @@ -0,0 +1,25 @@ +// +// Latex Project Public Licence (lppl1.3) applies +// Originally written by Kwanleung Tse +// First Release : 1st July, 2014 +// Last Update : 25th September, 2014 +// +// + +package worker4math.hktex2; + + +import java.util.ArrayList; + +public class Textattributefile{ + ArrayList<String> attribute = new ArrayList<String>(); + + public void textattributefile (){ + + attribute.add("underlinetext"); + attribute.add("strikethru"); + attribute.add("skew"); + attribute.add("alpha"); + attribute.add("shadow"); + +}} diff --git a/systems/android/hktex/HKtexdoc.pdf b/systems/android/hktex/HKtexdoc.pdf Binary files differnew file mode 100644 index 0000000000..e69037c892 --- /dev/null +++ b/systems/android/hktex/HKtexdoc.pdf diff --git a/systems/android/hktex/LicenceGuaranteeWarranty.txt b/systems/android/hktex/LicenceGuaranteeWarranty.txt new file mode 100644 index 0000000000..331033a447 --- /dev/null +++ b/systems/android/hktex/LicenceGuaranteeWarranty.txt @@ -0,0 +1,12 @@ + +Licence : + +Latex project public licence lppl1.3 applies. If lppl1.3 is observed, HKtex2 +is free for all personal, educational or commercial use. The licence never expire. + +Guarantee and Warranty: + +There is no guarantee or warranty for HKtex2. Use it at your own risk. + +Licence Holder : Kwanleung Tse +Date 25th September, 2014 diff --git a/systems/android/hktex/README b/systems/android/hktex/README new file mode 100644 index 0000000000..f41184cdb9 --- /dev/null +++ b/systems/android/hktex/README @@ -0,0 +1,11 @@ + +This directory contains the HKtex2 (Version 2.04) Eclipse project. + + +HKtex2 is an intermediate product for the bigger HKtex project. +Please visit http://www.worker4math.fatcow.com for more details before installation. + +Open Google's Eclipse program to launch the project. + +Licence Holder : Kwanleung Tse +Date : 1st October, 2014 |