From 62f2e9abb974a28221d455d607bdcc1a9998b6a7 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Wed, 4 Feb 2015 11:39:00 -0600 Subject: [PATCH 01/34] Fix #64 --- README.md | 2 +- gradle.properties | 4 +- .../com/bluejamesbond/text/DocumentView.java | 6 +- sample/src/main/AndroidManifest.xml | 8 ++ .../text/sample/helper/TestList.java | 6 +- .../text/sample/test/ForceNoCacheXMLTest.java | 41 ++++++ .../text/sample/test/ImageSpanTest.java | 77 +++++++++++ .../res/layout/test_xml_activity_no_cache.xml | 124 ++++++++++++++++++ 8 files changed, 263 insertions(+), 5 deletions(-) create mode 100644 sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java create mode 100644 sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java create mode 100644 sample/src/main/res/layout/test_xml_activity_no_cache.xml diff --git a/README.md b/README.md index 46f59f6..9c90643 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ For examples, tests, and API refer to the [Android-TextJustify Wiki](https://git Just add to your `build.gradle` ```gradle dependencies { - compile 'com.github.bluejamesbond:textjustify-android:2.0.9' + compile 'com.github.bluejamesbond:textjustify-android:2.1.0' } ``` diff --git a/gradle.properties b/gradle.properties index d7149d2..3228022 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=2.0.9 -VERSION_CODE=21 +VERSION_NAME=2.1.0 +VERSION_CODE=22 GROUP=com.github.bluejamesbond POM_DESCRIPTION=Android Text Full Jusiftication diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index e2f2587..d5e43cc 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -472,7 +472,11 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec viewportView.setMinimumWidth(width); viewportView.setMinimumHeight(layout.getMeasuredHeight()); measureState = MeasureTaskState.FINISH_AWAIT; - allocateResources(); + + if(cacheConfig != CacheConfig.NO_CACHE){ + allocateResources(); + } + break; case START: if (measureTask != null) { diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 7c1dba0..892a5b3 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -121,6 +121,14 @@ android:name="com.bluejamesbond.text.sample.test.ShortFormattedTextTest" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.NoTitleBar" /> + + diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java index 0c887b6..4252fc6 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestList.java @@ -46,7 +46,9 @@ import com.bluejamesbond.text.sample.test.ClickableSpanTest; import com.bluejamesbond.text.sample.test.ComplexLayoutTest; import com.bluejamesbond.text.sample.test.CustomHyphenatorTest; +import com.bluejamesbond.text.sample.test.ForceNoCacheXMLTest; import com.bluejamesbond.text.sample.test.HyphenatedTest; +import com.bluejamesbond.text.sample.test.ImageSpanTest; import com.bluejamesbond.text.sample.test.LeadingMarginSpan2Test; import com.bluejamesbond.text.sample.test.LineBreakTest; import com.bluejamesbond.text.sample.test.ListViewTest; @@ -83,7 +85,9 @@ public class TestList extends TestActivity { ListViewTest.class, ComplexLayoutTest.class, ShortFormattedTextTest.class, - TextUpdateTest.class + ImageSpanTest.class, + TextUpdateTest.class, + ForceNoCacheXMLTest.class }; @Override diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java new file mode 100644 index 0000000..cf00e3d --- /dev/null +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ForceNoCacheXMLTest.java @@ -0,0 +1,41 @@ +package com.bluejamesbond.text.sample.test; + +/* + * Copyright 2015 Mathew Kurian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * ForeNoCacheXMLTest.java + * @author Mathew Kurian + * + * From TextJustify-Android Library v2.0 + * https://github.com/bluejamesbond/TextJustify-Android + * + * Please report any issues + * https://github.com/bluejamesbond/TextJustify-Android/issues + * + * Date: 2/4/15 11:31 AM + */ + +import com.bluejamesbond.text.sample.R; +import com.bluejamesbond.text.sample.helper.TestActivity; + +public class ForceNoCacheXMLTest extends TestActivity { + + @Override + protected int getContentView() { + return R.layout.test_xml_activity_no_cache; + } +} diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java new file mode 100644 index 0000000..0d5cc4a --- /dev/null +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java @@ -0,0 +1,77 @@ +package com.bluejamesbond.text.sample.test; + +/* + * Copyright 2015 Mathew Kurian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * ImageSpanTest.java + * @author Mathew Kurian + * + * From TextJustify-Android Library v2.0 + * https://github.com/bluejamesbond/TextJustify-Android + * + * Please report any issues + * https://github.com/bluejamesbond/TextJustify-Android/issues + * + * Date: 2/3/15 11:00 AM + */ + +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.style.ImageSpan; +import android.text.style.RelativeSizeSpan; +import android.text.style.StyleSpan; + +import com.bluejamesbond.text.DocumentView; +import com.bluejamesbond.text.sample.R; +import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.sample.helper.MyQuoteSpan; +import com.bluejamesbond.text.sample.helper.TestActivity; +import com.bluejamesbond.text.style.CenterSpan; +import com.bluejamesbond.text.style.JustifiedSpan; +import com.bluejamesbond.text.style.LeftSpan; + +public class ImageSpanTest extends TestActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ArticleBuilder ab = new ArticleBuilder() + .append(testName, + false, new RelativeSizeSpan(2f), new StyleSpan(Typeface.BOLD), + new LeftSpan()) + .append("Justin Worland @justinworland Oct. 25, 2014", + false, new RelativeSizeSpan(0.8f), new StyleSpan(Typeface.BOLD)) + .append("Updated: Oct. 25, 2014 2:34 PM".toUpperCase(), + true, new RelativeSizeSpan(0.6f), new StyleSpan(Typeface.BOLD)) + .append("State health department staff will be on the ground at state airports", + true, new RelativeSizeSpan(1.2f), new StyleSpan(Typeface.BOLD), + new StyleSpan(Typeface.ITALIC)); + + for (int i = 0; i < 1; i++) + ab.append("Healthcare workers returning to New York or New Jersey after treating Ebola patients in West Africa will be placed under a mandatory quarantine, officials announced Friday, one day after a Doctors Without Borders doctor was diagnosed with the virus in New York City. Illinois announced a similar policy Saturday, meaning it will be enforced in states with three of the five airports through which passengers traveling from the Ebola-stricken West African countries must enter the United States.", + true, new RelativeSizeSpan(1f), new JustifiedSpan()) + .append("N.J. Gov. Chris Christie and N.Y. Gov. Andrew Cuomo made the announcement as part of a broader procedural plan to help protect the densely packed, highly populated area from any further spread of the disease.", + true, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new MyQuoteSpan(0xFFFFC801)) + .append("“Since taking office, I have erred on the side of caution when it comes to the safety and protection of New Yorkers, and the current situation regarding Ebola will be no different,” Gov. Cuomo said. “The steps New York and New Jersey are taking today will strengthen our safeguards to protect our residents against this disease and help ensure those that may be infected by Ebola are treated with the highest precautions.”", + true, new RelativeSizeSpan(1f), new CenterSpan(), + new ImageSpan(getResources().getDrawable(R.drawable.ic_launcher), ImageSpan.ALIGN_BASELINE)); + + addDocumentView(ab, + DocumentView.FORMATTED_TEXT); + } +} diff --git a/sample/src/main/res/layout/test_xml_activity_no_cache.xml b/sample/src/main/res/layout/test_xml_activity_no_cache.xml new file mode 100644 index 0000000..6d13300 --- /dev/null +++ b/sample/src/main/res/layout/test_xml_activity_no_cache.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From d83369867a971c3388d20d6da96c889bb26c047c Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Sun, 21 Jun 2015 11:11:56 -0700 Subject: [PATCH 02/34] Update build.gradle --- sample/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample/build.gradle b/sample/build.gradle index 725d0f2..2df703b 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -37,9 +37,9 @@ android { signingConfigs { release { keyAlias 'bluejamesbond' - keyPassword 'Mkone123*' + keyPassword '' storeFile file('C:/release.keystore.jks') - storePassword 'Mkone123*' + storePassword '' } } From b3a1d8cafae0424acffb5e27b55867bd9c4e5a47 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Sun, 9 Aug 2015 14:16:48 -0700 Subject: [PATCH 03/34] Delete manifest-merger-release-report.txt --- app/manifest-merger-release-report.txt | 113 ------------------------- 1 file changed, 113 deletions(-) delete mode 100644 app/manifest-merger-release-report.txt diff --git a/app/manifest-merger-release-report.txt b/app/manifest-merger-release-report.txt deleted file mode 100644 index add25fa..0000000 --- a/app/manifest-merger-release-report.txt +++ /dev/null @@ -1,113 +0,0 @@ --- Merging decision tree log --- -manifest -ADDED from AndroidManifest.xml:2:1 - xmlns:android - ADDED from AndroidManifest.xml:2:11 - package - ADDED from AndroidManifest.xml:3:5 - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 - android:versionName - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 - android:versionCode - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 -application -ADDED from AndroidManifest.xml:5:5 -MERGED from TextJustify-Android:library:unspecified:12:5 - android:label - ADDED from AndroidManifest.xml:8:9 - android:allowBackup - ADDED from AndroidManifest.xml:6:9 - android:icon - ADDED from AndroidManifest.xml:7:9 - android:theme - ADDED from AndroidManifest.xml:9:9 -activity#com.bluejamesbond.text.sample.helper.TestList -ADDED from AndroidManifest.xml:10:9 - android:label - ADDED from AndroidManifest.xml:12:13 - android:theme - ADDED from AndroidManifest.xml:13:13 - android:name - ADDED from AndroidManifest.xml:11:13 -intent-filter#android.intent.action.MAIN+android.intent.category.LAUNCHER -ADDED from AndroidManifest.xml:14:13 -action#android.intent.action.MAIN -ADDED from AndroidManifest.xml:15:17 - android:name - ADDED from AndroidManifest.xml:15:25 -category#android.intent.category.LAUNCHER -ADDED from AndroidManifest.xml:16:17 - android:name - ADDED from AndroidManifest.xml:16:27 -activity#com.bluejamesbond.text.sample.test.FormattedTextTest -ADDED from AndroidManifest.xml:19:9 - android:theme - ADDED from AndroidManifest.xml:21:13 - android:name - ADDED from AndroidManifest.xml:20:13 -activity#com.bluejamesbond.text.sample.test.LeadingMarginSpan2Test -ADDED from AndroidManifest.xml:22:9 - android:theme - ADDED from AndroidManifest.xml:24:13 - android:name - ADDED from AndroidManifest.xml:23:13 -activity#com.bluejamesbond.text.sample.test.LineBreakTest -ADDED from AndroidManifest.xml:25:9 - android:theme - ADDED from AndroidManifest.xml:27:13 - android:name - ADDED from AndroidManifest.xml:26:13 -activity#com.bluejamesbond.text.sample.test.PlainTextTest -ADDED from AndroidManifest.xml:28:9 - android:theme - ADDED from AndroidManifest.xml:30:13 - android:name - ADDED from AndroidManifest.xml:29:13 -activity#com.bluejamesbond.text.sample.test.QuoteSpanTest -ADDED from AndroidManifest.xml:31:9 - android:theme - ADDED from AndroidManifest.xml:33:13 - android:name - ADDED from AndroidManifest.xml:32:13 -activity#com.bluejamesbond.text.sample.test.ChineseCharacterTest -ADDED from AndroidManifest.xml:34:9 - android:theme - ADDED from AndroidManifest.xml:36:13 - android:name - ADDED from AndroidManifest.xml:35:13 -activity#com.bluejamesbond.text.sample.test.RTLTest -ADDED from AndroidManifest.xml:37:9 - android:theme - ADDED from AndroidManifest.xml:39:13 - android:name - ADDED from AndroidManifest.xml:38:13 -activity#com.bluejamesbond.text.sample.test.XMLTest -ADDED from AndroidManifest.xml:40:9 - android:theme - ADDED from AndroidManifest.xml:42:13 - android:name - ADDED from AndroidManifest.xml:41:13 -activity#com.bluejamesbond.text.sample.test.HyphenatedTest -ADDED from AndroidManifest.xml:43:9 - android:theme - ADDED from AndroidManifest.xml:45:13 - android:name - ADDED from AndroidManifest.xml:44:13 -activity#com.bluejamesbond.text.sample.test.WordSpacingTest -ADDED from AndroidManifest.xml:46:9 - android:theme - ADDED from AndroidManifest.xml:48:13 - android:name - ADDED from AndroidManifest.xml:47:13 -uses-sdk -INJECTED from AndroidManifest.xml:0:0 reason: use-sdk injection requested -MERGED from TextJustify-Android:library:unspecified:8:5 - android:targetSdkVersion - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 - android:minSdkVersion - INJECTED from AndroidManifest.xml:0:0 - INJECTED from AndroidManifest.xml:0:0 From b18fb33a0fdeb0f48108b46f094af1438657bdd8 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Sun, 9 Aug 2015 14:29:34 -0700 Subject: [PATCH 04/34] Update Styled.java --- .../java/com/bluejamesbond/text/Styled.java | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/Styled.java b/library/src/main/java/com/bluejamesbond/text/Styled.java index 7980b4d..d5fec2f 100644 --- a/library/src/main/java/com/bluejamesbond/text/Styled.java +++ b/library/src/main/java/com/bluejamesbond/text/Styled.java @@ -1,34 +1,5 @@ package com.bluejamesbond.text; -/* - * Copyright 2015 Mathew Kurian - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * Styled.java - * @author Mathew Kurian - * - * From TextJustify-Android Library v2.0 - * https://github.com/bluejamesbond/TextJustify-Android - * - * Please report any issues - * https://github.com/bluejamesbond/TextJustify-Android/issues - * - * Date: 1/27/15 3:35 AM - */ - import android.graphics.Canvas; import android.graphics.Paint; import android.text.Layout; From 2d45e9aae9a112f3ec85043001bd3d258f44f0d7 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Sun, 9 Aug 2015 14:29:50 -0700 Subject: [PATCH 05/34] Update ConcurrentModifiableLinkedList.java --- .../text/ConcurrentModifiableLinkedList.java | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java index 6af3006..1561cdd 100644 --- a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java +++ b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java @@ -1,34 +1,5 @@ package com.bluejamesbond.text; -/* - * Copyright 2015 Mathew Kurian - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * ConcurrentModifiableLinkedList.java - * @author Mathew Kurian - * - * From TextJustify-Android Library v2.0 - * https://github.com/bluejamesbond/TextJustify-Android - * - * Please report any issues - * https://github.com/bluejamesbond/TextJustify-Android/issues - * - * Date: 1/27/15 3:35 AM - */ - import java.util.AbstractSequentialList; import java.util.Collection; import java.util.Iterator; From 16b51f380f2007b7cda583d14c03b935471ea513 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Sun, 9 Aug 2015 14:30:27 -0700 Subject: [PATCH 06/34] Update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index dd364d2..d9b9707 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,5 @@ local.properties # TeXlipse plugin .texlipse + +manifest-merger-release-report.txt From c7b05773eedab372b807d963ecb5ea52736fbdd7 Mon Sep 17 00:00:00 2001 From: pouyadarabi Date: Sat, 15 Aug 2015 00:26:53 +0430 Subject: [PATCH 07/34] Fix bluejamesbond/TextJustify-Android#89 -remove change alignment on setReverse -disable string reversing --- .../src/main/java/com/bluejamesbond/text/IDocumentLayout.java | 3 --- .../java/com/bluejamesbond/text/SpannableDocumentLayout.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java index 13df3eb..433df2a 100644 --- a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java @@ -395,9 +395,6 @@ public void setReverse(boolean reverse) { return; } - if (reverse) { - textAlignment = TextAlignment.RIGHT; - } this.reverse = reverse; invalidate(); diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 3ba8d65..2fecab4 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -481,7 +481,7 @@ public void onDraw(Canvas canvas, int scrollTop, int scrollBottom) { int startIndex = getTokenForVertical(scrollTop, TokenPosition.START_OF_LINE); int endIndex = getTokenForVertical(scrollBottom, TokenPosition.END_OF_LINE); - boolean defIsReverse = params.reverse; + boolean defIsReverse = false; for (LeadingMarginSpanDrawParameters parameters : mLeadMarginSpanDrawEvents) { // FIXME sort by Y and break out of loop From 338ef99462f90fd3830ea7b26f53bab945bf49a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Jim=C3=A9nez=20Torres?= Date: Mon, 17 Aug 2015 08:43:07 +0200 Subject: [PATCH 08/34] Avoid NPE I just got this exception from my app: java.lang.NullPointerException at com.bluejamesbond.text.DocumentView$CacheBitmap.recycle(DocumentView.java:857) at com.bluejamesbond.text.DocumentView.destroyCache(DocumentView.java:672) at com.bluejamesbond.text.DocumentView.freeResources(DocumentView.java:662) at com.bluejamesbond.text.DocumentView.onDetachedFromWindow(DocumentView.java:509) at android.view.View.dispatchDetachedFromWindow(View.java:12787) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2706) --- .../src/main/java/com/bluejamesbond/text/DocumentView.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index d5e43cc..4672323 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -854,8 +854,10 @@ public void recycle() { drawCompleted = false; } - bitmap.recycle(); - bitmap = null; + if (bitmap != null) { + bitmap.recycle(); + bitmap = null; + } } public class CacheDrawTask extends AsyncTask { From 07fd68bdf195267c3d82871e97b46ede248d6b13 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Tue, 1 Sep 2015 01:50:56 -0500 Subject: [PATCH 09/34] Updating version --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3228022..521297c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=2.1.0 -VERSION_CODE=22 +VERSION_NAME=2.1.1 +VERSION_CODE=23 GROUP=com.github.bluejamesbond POM_DESCRIPTION=Android Text Full Jusiftication From 1c5b24a2567c02c1fd923624ed912d68b11c75a1 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Tue, 1 Sep 2015 01:52:24 -0500 Subject: [PATCH 10/34] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c90643..3432726 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ For examples, tests, and API refer to the [Android-TextJustify Wiki](https://git Just add to your `build.gradle` ```gradle dependencies { - compile 'com.github.bluejamesbond:textjustify-android:2.1.0' + compile 'com.github.bluejamesbond:textjustify-android:2.1.1' } ``` From 65084f29c7553be9f2311299fbc9ddc28b4f6dcb Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sun, 6 Sep 2015 15:16:19 +0200 Subject: [PATCH 11/34] Optimize default hyphenator --- .../text/StringDocumentLayout.java | 3 +- .../text/hyphen/DefaultHyphenator.java | 135 +++++++++--------- .../text/hyphen/IHyphenator.java | 4 +- .../text/hyphen/SqueezeHyphenator.java | 5 +- 4 files changed, 73 insertions(+), 74 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java index 9d86b66..e0676cb 100644 --- a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java @@ -35,7 +35,6 @@ import android.graphics.Paint; import android.text.TextPaint; -import java.util.ArrayList; import java.util.List; import java.util.ListIterator; @@ -419,7 +418,7 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac String lastConcatPartial = null; String concatPartial = ""; - ArrayList partials = params.hyphenator.hyphenate(word); + List partials = params.hyphenator.hyphenate(word); for (String partial : partials) { diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java index ea51a2f..53472c6 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java @@ -4,9 +4,8 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /* * Copyright 2015 Mathew Kurian @@ -43,6 +42,13 @@ * @date 2014-10-20 */ +/* + * Several performance and memory optimizations + * + * @author Martin Fietz + * @date 2015-09-06 + */ + @SuppressLint("UseSparseArrays") public class DefaultHyphenator implements IHyphenator { @@ -75,48 +81,54 @@ public static DefaultHyphenator getInstance(HyphenPattern hyphenationPattern) { private TrieNode createTrie(Map patternObject) { - int i = 0, c = 0, p = 0, codePoint; - - String[] chars, points; TrieNode t, tree = new TrieNode(); - ArrayList patterns = new ArrayList(); for (Map.Entry entry : patternObject.entrySet()) { - Matcher matcher = Pattern.compile(".{1," + String.valueOf(entry.getKey()) + "}") - .matcher(entry.getValue()); - while (matcher.find()) { - patterns.add(matcher.group(0)); - } - - for (i = 0; i < patterns.size(); i++) { - chars = patterns.get(i).replaceAll("[0-9]", "").split(""); - points = patterns.get(i).split("\\D"); + int key = entry.getKey(); + String value = entry.getValue(); + int numPatterns = value.length() / key; + for (int i = 0; i < numPatterns; i++) { + String pattern = value.substring(i * key, (i + 1) * key); t = tree; - for (c = 0; c < chars.length; c++) { - if (chars[c].length() == 0) { + for (int c = 0; c < pattern.length(); c++) { + char chr = pattern.charAt(c); + if(Character.isDigit(chr)) { continue; } - - codePoint = chars[c].codePointAt(0); - + int codePoint = pattern.codePointAt(c); if (t.codePoint.get(codePoint) == null) { t.codePoint.put(codePoint, new TrieNode()); } - t = t.codePoint.get(codePoint); } - t._points = new ArrayList(); - - for (p = 0; p < points.length; p++) { - try { - t._points.add(Integer.parseInt(points[p])); - } catch (NumberFormatException e) { - t._points.add(0); + List list = new ArrayList(); + int digitStart = -1; + for (int p = 0; p < pattern.length(); p++) { + if (Character.isDigit(pattern.charAt(p))) { + if (digitStart < 0) { + digitStart = p; + } + if(p == pattern.length()-1) { + // last number in the pattern + String number = pattern.substring(digitStart, pattern.length()); + list.add(Integer.valueOf(number)); + } + } else if (digitStart >= 0) { + // we reached the end of the current number + String number = pattern.substring(digitStart, p); + list.add(Integer.valueOf(number)); + digitStart = -1; + } else { + list.add(0); } } + t.points = new int[list.size()]; + for(int k=0; k < list.size(); k++) { + t.points[k] = list.get(k); + } } } @@ -124,46 +136,31 @@ private TrieNode createTrie(Map patternObject) { } @Override - public ArrayList hyphenate(String word) { - - int i, j, k, wordLength, nodePointsLength; - ArrayList nodePoints; - ArrayList characters = new ArrayList(); - ArrayList characterPoints = new ArrayList(); - ArrayList originalCharacters = new ArrayList(); - ArrayList points = new ArrayList(); - ArrayList result = new ArrayList(); - TrieNode node, trie = this.trie; - - result.add(""); + public List hyphenate(String word) { word = "_" + word + "_"; + String lowercase = word.toLowerCase(); - for (char character : word.toCharArray()) { - characters.add((String.valueOf(character)).toLowerCase()); - originalCharacters.add(String.valueOf(character)); - } - - wordLength = characters.size(); + int wordLength = lowercase.length(); - for (i = 0; i < wordLength; i++) { - points.add(i, 0); - characterPoints.add(i, characters.get(i).codePointAt(0)); + int[] points = new int[wordLength]; + int[] characterPoints = new int[wordLength]; + for (int i = 0; i < wordLength; i++) { + points[i] = 0; + characterPoints[i] = lowercase.codePointAt(i); } - for (i = 0; i < wordLength; i++) { + TrieNode node, trie = this.trie; + int[] nodePoints; + for (int i = 0; i < wordLength; i++) { node = trie; - - for (j = i; j < wordLength; j++) { - node = node.codePoint.get(characterPoints.get(j)); - + for (int j = i; j < wordLength; j++) { + node = node.codePoint.get(characterPoints[j]); if (node != null) { - nodePoints = node._points; - + nodePoints = node.points; if (nodePoints != null) { - for (k = 0, nodePointsLength = - nodePoints.size(); k < nodePointsLength; k++) { - points.set(i + k, Math.max(points.get(i + k), nodePoints.get(k))); + for (int k = 0, nodePointsLength = nodePoints.length; k < nodePointsLength; k++) { + points[i + k] = Math.max(points[i + k], nodePoints[k]); } } } else { @@ -172,15 +169,17 @@ public ArrayList hyphenate(String word) { } } - for (i = 1; i < wordLength - 1; i++) { - if (i > this.leftMin && i < (wordLength - this.rightMin) && points.get(i) % 2 > 0) { - result.add(originalCharacters.get(i)); - } else { - result.set(result.size() - 1, - result.get(result.size() - 1) + originalCharacters.get(i)); + List result = new ArrayList(); + int start = 1; + for (int i = 1; i < wordLength - 1; i++) { + if (i > this.leftMin && i < (wordLength - this.rightMin) && points[i] % 2 > 0) { + result.add(word.substring(start, i)); + start = i; } } - + if (start < word.length() - 1) { + result.add(word.substring(start, word.length() - 1)); + } return result; } @@ -271,7 +270,7 @@ public HyphenPattern(int leftMin, int rightMin, Map patternObje } private class TrieNode { - Map codePoint = new HashMap(); - ArrayList _points; + Map codePoint = new HashMap(); + int[] points; } } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java index 2d23996..959dcc6 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/IHyphenator.java @@ -29,8 +29,8 @@ * Date: 1/27/15 3:35 AM */ -import java.util.ArrayList; +import java.util.List; public interface IHyphenator { - public ArrayList hyphenate(String word); + List hyphenate(String word); } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java index f782a49..a415879 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java @@ -30,6 +30,7 @@ */ import java.util.ArrayList; +import java.util.List; public class SqueezeHyphenator implements IHyphenator { @@ -47,9 +48,9 @@ public static SqueezeHyphenator getInstance() { } @Override - public ArrayList hyphenate(String word) { + public List hyphenate(String word) { - ArrayList broken = new ArrayList(); + List broken = new ArrayList(); int len = word.length() - 1, i; for (i = 0; i < len; i += 2) { From 6612f40ad3c35efc3f10e001da76c08d6542fd03 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sun, 6 Sep 2015 15:20:03 +0200 Subject: [PATCH 12/34] German language patterns --- .../text/hyphen/DefaultHyphenator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java index 53472c6..8c2b212 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java @@ -218,6 +218,22 @@ public List hyphenate(String word) { @SuppressWarnings({"serial", "unused"}) public static class HyphenPattern { + public static final HyphenPattern DE = new HyphenPattern(2, 2, new HashMap() { + { + put(3, "2aaa1äa1ba1da1ga1j2aoa1öa1p2aqa1ßa2ua1xä1aä1bä1dä1gä1jä1k1äqä1ß1äxä1z1bibl21cacä3c1dc4h1cic1jc4k3co2cp2cs3cu1cy1de1did1ö1due1be1d4eee1fe1ge1ke1m2eoe1pe1qe1ße1te3üe1wey1e1z1fa1fä1fe1fi1fo1fö1fu1fü1fy2gd1geg1n1guh1j2hl2hnh1q2hr4hsh2ü2hwh1zi1a2iä2ici1d2ifi1ji1ßi1üj2u1ka1käkl21ko1kök1q2ks1kü1le1li4ln1lo1lö1ly1ma3mä1me1mi1mo1mö1mu1mü1my1na1nä1ne1nin1j1noo1b2oco1d2oi2ol2omo1qo2uo1vo1xö1bö1dö1e1öf2önöo1ö1ßö1vö1wö1zp2a1päp2e1php1j1puqu42rc1re1ri4rnr1q1ru1rü1ry1sa1sä1sc1se1si1so1sös1t1su1sü1ße1ßiß1j1ßu1ta1tä1tet1h1ti1to2tö2ts1tu2tü2ua2ucu1h2uiu1ju1lun12uou1q2usu1w1üb2üc2üdü1gü1k2ünü1ß2ütü1vü1zve2v2r2vsw2aw2ä2wnw2rw2ux1a1xe1xix1jx1q1xu2xyx1zy1by1ey1gy1hy1jy1ly1py1ry1vy1wy1yzä2zu1zw2"); + put(4, "_ax4_äm3_ch2_en1_eu1_fs4_gd2_gs4_he2_ia4_in1_ks2_oa3_öd2_pf4_ph4_ps2_st4_th4_ts2_um3_ur1_xe3a1abaa1ca3au2abaab1ä1abd1abf1abg1abh2abi1abkab1l1abnab3r1abs2abu2abü1abw2aby1abz2aca2acc2acu1add2adf2adh5adj2ado2adp2adq2adu2a1eae2bae2cae2da2ekae2pa2eta2ewae2xaf1a2afe2afia2fö2agaag2n2agt2ah_2ahsa1huah1wa1hyaif2a2il2aisaje22ak_2akb2akc2akd4ako2aks1akza1laa1lä2ale2ali2aloa1lu4aly2am_2amä2amf2amk2amla2mö2amu1anb2ane1anf1anh2anj1anl2anna1nö1anra1nü1anwao1ia1opa1or2ap_2apa2apea2pfap2n2apr2ar_a1raa1rä1arb2are2arf2arh2ari2arr2arua2rü2arv2ary4asha2söa2süaße22a1tata1at2cat2eat2h3atmat1ö4atra3tü2au_2aub4auc2aue2aug2auj4aum4aunau1o2auu2auw2aux2auz2a1ü2a1v4avia2vr2a1wax2eays4ay3t2a1zaz2aaz2oaz2uäb2sä1ckä2daä2dräd2s2ä1eäf3läf3räf2säg2näh1aä3hi2ähm2ähsä1huäh1wä1imä1la2äleä1lu2ämläm2s2än_2äne2änsä1onä1paär1äär1c4äreä1röä2rü1ärzä3suä3teät2häu1cä2uf1äug4äul2äumä2un2äur1äuß4ä1v3bah3basb2ärb2äs4b1bb3bebb2sbbu12b1c3be_3bea3beb3bek3bel1bembe1o3bet1bezbge3bib23bilbiz24b1j2bl_b2leb2lo3blü2b1mbni2bo4abo2cboe1b1op2böfb1öl2b1qb2r42br_3brä3brü4b1sb3säb3scb4slb2söbss2bs2t4b3tb5teb4thbt4rbtü1bu2fbü1c2b1v2b1w3by1by3pbys2ca1h3camc4an3carcäs22c1ccch22cec2cefce1i2cek1cen1cer1cetce1u2c1f4ch_2chb2chc2chd2chf2chg2chh2chj2chk2chp4chs2cht4chü2chv4chw1chy2chzci1cci2s4ck_ck1ack1ä2ckb2ckc2ckd1cke2ckf2ckg2ckh1cki2ckk2ckm2ckp4cks2ckt1cku2ckv2ckw1cky2ckzclo1co2ccoi22c1qcre2cry2cs2ac2si4c1tcti22c1z3da_da1ad1afd1agda1sdä2u2d1cd3dhd5dodeg2d1eides1det2dga2d3gl3di_3dicdi2edi1p2d1j4d1ld3ladni2d1obdo2o2d1qd2r4d3rid3rö2d1s4dsb4dsld2södss4dst42d1td2thdto2d3tödt3rd3tüdu2fdu1idu1odur22düb3düf3dün2d1wdwa2dy2s2d1z2e1aea2ceak1eam3e2ase1ä22eba2ebl2ebre3bue1ce2ecle3cr2ected2eed2öee1eeeg2e1eie1en2ef_2efa2efe2efi2eflefs22efu2efüegd4e3gee2gn2egue1hee1hi2ehme1hoehs22ehte1hue1hüeh1we1hy4eibe2idei1ee4ilei1p2eire2it2eiu2e1jek2a1ekdek4nek2oek4r2ektek2ue1la2eli2eln2eloe1lü2elz2ema2emm2emüen3fe4nre4nten1ue1nüe1nye1ofe1ohe4ole1ore1ove1ö2e3pae3puer1ae1räer1cer3h2erie1roer1ö2eru2esbes2c2esf4eshes3l2esmes2ö2esp2esres3we3syes3ze3teet2he3tie3tö2etre3tü2etz2euf1euke1um2euneu1p2eut2eux2e1ve3vo2ewae3wä2eweew2s2ex_3exp2exuey4neys4e3ziez2wfab43facf4ahf2alf2arf3atfä1cf1äu2f1cfe2c3fewf1ex3fez2f1fff2efff4ff3lff2s3fi_fid2fi2ofi2r3fis3fiz2f1jf2l22fl_1fläf3löf4lü2föf2f1qf2r2f3ruf3rü4f1sf3scf3sifs2tf2süf3sy4f1tf2thf3töf3tü3fugf1umf2ur3fut2fübfü2r2f1v2f1w2f1zfz2afz2öfzu33ga_ga1c5gaiga1kgäs5gä4ugbi22g1cg1dag1dog1dögdt4gd1uge1cged4gef4g2el4g1gg3gegg4r2g1h4gh_gh2egh1lg2hugh1w2g1j4gl_2gls3glüg2ly2gn_gn2e2gng2gnp2gns2gnt2gnug2nüg2ny2gnzgo4a2goggo1igo1y2g1qg2r4gse2g4slgso2gsp4g4swg3sy2g1tg3tegt2sg3tügu1cgu2egu2t2gübgür1güs32g1v2g1w3haah1ahh1aph2as2h1c2heahe3x2hi_2hiahi2ehi2n2hio2hiuhlb4hld4hlg4hll2hlm2h2lo2h1mh2moh3möhm2sh2muh2nah2nähn2eh1nu2hodhoe42hoih2on2hoo2hop3hov1h2öhö2ch4örhr1chr3dhrf2hrg2h2rihrr4h3rüh2ryhrz2hss24h1th2thhto2h4tshtt4h3tühu1chu2n2hurhüs32h1vhvi23hyg3hyphz2o2ia_i4aai2ab2iaci2afi2ahi3aii2aji2ak2iali2am2iani2apia1q2iasi3au2iavi1ämiär22i1bib2oi2böice1idt4i2dyie1ci1eii1exif3lif3rif2s2i1gi2gli3go4i1hi3heih3mih3nih3rihs2ih1wi3i2ii4s2i1k4ikei2kni1la6ilbil2cilf22iloilv42im_2ime2imo2imt2imu2inein3f2inoi1nö2inp2inrin1ui1ny2i1oio1cio2dion2i2ori2oui2ovio2xi3ön2ip_i1pai1peiph2ip4li1pr2ips2ipu2i1qi1räir1cir2eir2i2irki1roi1rö2isb2iseis3ti2sü4itäi6tli3töi3tü2itzium12i1v2i1w2i1xi2xai3xi2i1zi2zöja1c2jatje2aje1cje2gje2pje3wji2ajit3ji2vjoa3jo2iju2kjus32j1v3ka_ka1ck2adk2agka2o3kask1ähk1änkär2kby42k3cki1c3kir2kiz2k3j4kl_k2lek1lu2kly2k1mk2n2k3nek3nu3knü3komk2onk2os3kowkö2fk1ölk2r4kst44k1tk2thktt2k3tükt3zku1ckuh12kübkü1c2k1v2k1w3la_1lad2laf1lai3lao1lawlay1lä1c1läd2läf4lät2l1blb2slb2u2l1c4l1dld3rldt43le_2lec3ledle2e3lehl2ek2leple2u3levl2ey2l1flf4u2l1glgd4l3go3li_3liali1cl2ie3ligli3l2limli2o3liu4l1j2l1klk2l4l1lllb4llg4llk4ll5mlln22l1mlm3plm3tlnd2l3nil1nul1nü3loklo2o2lox2löd4lög4löß2l1plp2fl3pu2l1q4l1s4l1tl2thl6tsltt2l3tü1luf4luo2lur3lux2lüb5lüd2l1v2l3wly3c3lynly1oly3u2l1zl2zölz1wm1abmae2ma1f3mas3maßm4aymb4lmby42m3c2m1dmd1ameb43mehme1o2meö3mesmeu13mi_mi1c3mig3mil3mit2m1jm3ka4m1lm3li4m1mmmd2mmm2mm3pmm2smoa33moh3mom3mos3motmo1ymö2c4mökm1öl2m1pm2pfm3pim3pu2m1q4m1sm3säm3scm3sem2süm3sy4m1tm2thm3tömtt2m3tümt3zmu1a3munm4us2müb3mün3müt2m1vmwa2my4s2m1z3na_n1af3nain1ar3nas3natn1au3näe3näs2näunby42n1cn2ck2n1dn2döndy33ne_2nec3nedn1efneg4ne2l3nenne2un2ew3nez2n1fnf2änff4n3finf4lnf2onf4rnf3s4n1gng3mn2gnn3hän3hen3hu3nian1idn4ie3niknin1n2ip2nitni3v3nix2n1k4n1nnn3fnng4n3ni3no_no1cn1of3nov3now3noz2nödn2ör2n1q6n1snsp4n3sy2n1tn3ton3tön4tsn3tun3tü1nu_1nud3nuenuf21nug1nuinu2n1nuo2nup2nur1nut1nuu1nux1nuz3nü_3nüs1nüt4n1w1ny_1nyhn1yo1nyr1nys1nyw2n1znz3so4aco4ado4aho2aro2aso4ato5au2obbob2e1objob1lo3cao1ceo1ck2odrodt4o2ecoen12ofa2ofiof3l2ofo2oft2o1go3ghogs2o1hao1häo1heo1hio1hooh1soh3to1huoh1wo3ieo1imo1inoi2r2o1j2o1kok4n4okrokt4o1lao1läol2io3loo1lu3olyoms2omy12ona2onä2onc2oneono1o1nuon3v1onyon3zoof2o1opo1oro1pao1pi2or_or1ao3räor1c4ore2orf2orh2orm2orq2orro3ru2osh2osio3sk2oso2o1to3tüoub4oug2o3uho3um2our2ouv2o1ü2ovi2ovo2o1wo3wiox2aox2eo2xu1oxyo1yo2o1zoz2eo3ziöb2l2ö1cödi3öf3lög3lög3rö1heö1huö1keök3r3öl_öls2öm2sön2eö3niön2sö1nuö1peör1cöru4ö2saö2spö2stö3su2ö1töt2höts2öze31pa_1paa1pacpag41pak1pap2paß1pat1pau3päd3pär3päs2p1b2p3cpda41pe_pe2a1pedpef4pei13pel1pem1pep3pet4pf_1pfäpff4pf3r2p1g4ph_ph2a2phä2phb4phd2phf4phg4phkph2l2phm2phn2phöph4r2phs2phz3pik1pilpi2o3pip3pispku22pl_3pläp4lo2p1n1p2opo1c3podpo2i3pokpo2wpo3xpö2c2p1ppp3lppt2p2r2p4rä2p1s4ps_p3sep2söp2st2p1tpt1ap3tep2thptt2ptü4pt3zpu1apub42puc2pur3put1püf2pülpün22p1v2p1w3py1pys4py3t2p1z1ra_r1abr2ad1raer2afr2air2alr2apr1arr2as2raß1rat1raür2ax4räf4räg2räh2rämrä2u2r1brbb2rb2orb2srb2ur1ce2r1dr2dördt43re_2reä3reg3rekre2u2reür1ew3rez2r1frf2u4r1gr1h42rh_2rha2rhä2rhö2rhsrid2r2ie3rigr2isr2itrix12r1j2r1krk4n4r1lrl2erl3t4r1mrm2urnd4r3nern3frng2r3nirn1ör1nur1nür1nyro1c2rof3roir2onr1or4roß2rox2röf4rögr1ök4röpr1örrp4erpf4r3porp3tr3pu2r1rrrb2rr1crr2or3ru4r1sr3sirs3lr3sor3sy4r1tr3tör4tsrtt4r3türt3zru1a3ruf4rug2rum3rut4ruz2rüb2r1v2r1w4r1xry2c2r1zrz2ö3sa_3saa3sams1an3sat3säl2sc_s2ci2scj4scl2scos2cr2scs2scusd4r3see3seh3seq3set2s1hsh2as3häsh3ns3hösh4rsib43sio2s1j4sk_4skbsk4lsk4n4skö4skss3läsl3bs3les3li4sna4snö3so_so4aso1c3sog3sol3somso3o3sos3sov3sow3sozsö2csö2fs1ös1sp22sp_s2pä2spls3pn4spy2s1q6s1sss3l6st_s2ta2stb2stdst2e2stf2stg4sth2stj2stk4stl4stm2stns2to1stö2stp2stqs2trst2u1stü2stv2stwsu2n3suv3süc3sün4s3v2s1ws3was3we1s4ysyl12s1zsz2os3zü2ß1c2ß1d2ß1f2ß1h2ß1l2ß1mß1o2ßos2ßst22ß1t2ß1ü2ß1v2ß1w2ß1z3ta_4taatah2t2ai2tam3tas3tav3tax4täbtä1c4täd3täe3täg2täh4tämt1äptä2st2ät2täx4t1ct4ckt3cr3te_2teh3ten3tes4th_th2e1thi2thk2thp2ths2thü2thvt2hy3tig3tik3tio3tip3tis3tiv2t1j4t3ltl4e3to_to1c3tod3tok3ton3too4toß3tow4töftö4l3tön4töß3töttpf42t1q2tr_3tritry14ts_ts1ot2söt3sy4t1tt3tit3tot3töttt4t3tut3tü2tub3tuc2tud3tue4tuf2tuh2tuk4tüb3tüf3tüm4t3v4t3wtwa21ty13typtys44t1ztz1ätz2öu1amu3auu1ayu1ämu1äu2u1bub2lub1ru1ce2u1d2u1eu2edu2eguen1u2ep2uffuf3luf3r2u1gugo3u2göu2gü2uh_uh1wu1ieu3iguk2au1keu1kiuk4nuk2öu1kuulb4ulg4u2lü1umf1umg1umk1uml4umm1umr1umz4un_u3ne2unk1unruns21unt1unw2unzu3ofuos2u1pau3piu1pr2ur_u1raurd22ure2urfu1röur3purt2u3ruurü2u2sü2u1ß2u1tu3teuto1u3töu3tüu1ü22u1xux2eux2oux3tu1ya2u1z2übc2übdübe2üb3lüb3rüd3rüf3lü2gnüg3süh1aü1heüh1iüh1süh3tü1huüh1wül1aül2cül4eü1luün2sünt2ü1nuü1peü1piür1aürr2ür2süs2aü2stva1cva1sv4at2v1b2v1dve3bve3cve3dve3gve3hve4ive3over1ves12veüve3v2v1g2v1hvi2cvig22v1k2v1m2v1n3vol3voyvö2c2v1pv3revs2e2v3t2v1v2v1w2v1z1waa1wag1wah1walwa2p1was1wäh1wäl1wäswbu22w1c2w1dwe2a1weg1wehwe2i1wet2w1g2w3h1widwi2ewik21wil2w1k2w1l2w1mwn3s1wohwot21wöc2w1pw3ro2w1sws2t2w1twti21wucwul2wus21wühwül2wün32w1w1xa_1xae2x1b2x1c4x1d2xekxe2lx1emx2en3xes2x1f2x1g2x1hxib4xi1cxi3gxil12x1l2x1m2x1nx1or4x1p2x1r4x1txt1äxt1uxu1axu2s2x1v2x1w3xy_3xys1yacy1äty1c2y1d4y2efy1f2ygi2yg2lyhr2y1i4y1k2yl3cynt2y1nuy1ofyom2y1osy1ouypa2ype2y2pfy3phypo3y3riyrr2yse1y1t2yu2ry1z2za1c3zahz1anz1as2z3czdä1ze1e2z1h2z1j3zolzo2oz1orz1öl2zön2z1qz3saz3shz3skz3sz2z1tz3töz3tüzu3azub4zud4zu3kzuz22züb2z1v4z1zzz2ö"); + put(5, "_ab1a_abi4_ab3l_abo2_ack2_ag4n_ag4r_ag2u_ai2s_ang2_an3s_apo1_aps2_as3t_at4h_au3d_ät2s_by4t_dab4_de1i_de1s_dü1b_dys1_ei3k_eke2_enn2_er1e_erf4_er1i_es1p_et2s_eu3t_ext4_fe2i_fi2s_ga4t_ge3u_hi2s_im2a_im5m_in3e_ink4_inu1_ire3_is2a_jor3_ka2i_ki4e_kus2_li2f_ma3d_ma2i_me2e_ne4s_ni4e_nob4_nus2_ob1a_obe2_or2a_ort2_ozo4_pro1_ro4a_ro3m_rü1b_sch4_sha2_te2e_te2f_te2s_ti2a_tid1_ti2s_to2w_umo2_un3d_un3e_un3g_un3s_ur2i_ut2a_ut3r_übe4_vo4r_wa2s_wi4e_wor2_ya4l_za2s_zi2e_zwe2aa2beaa2gr4a2araart2aas5tab2äuab1ebabe1eabei12abela3ber2abet2abew3abfiab1irab1it2ableab3liab4loa2blua2bo_ab2of2abora3braa4brä2abrü2abs_abs2aab5scab3spabst4ab3szab1uraby4ta1cem2ach_ach1a2achba1che4achfa1chiach3lach3mach3na1choach3öach3ra4chta1chuach3ü2achvac1in2ada_ad2agada2m4adav1a2dä2ade_2aden4a3diad2obad3ru2ads2ad3stad3szad2t1ad4tead4tra2elaa2eleae2o3aes5ta2faka2fana3faraf4ata2faua2fexaf2fl2af3lafo1saf3raaf3räaf3reaf3röaf2spag1abag1arag1auag2diag2drag2duage1iag2er2agesag3gl1aggr2a2glag4laa4glöag4nuag4roagsa2ags3pag2th2a1haah4at2a1heahe1sa1h2iahin3ah2löahnt21ahorah1osa2h3öahr1aah3riaht3saian3aid2sai1e2aien3ai3g4a3ik_ai3keai3kuai2loa1indain4ea1ingai2saaiso2a3iv_aive3a3ivla3ivs2akal2akarak4at4a1kea2kefa2keu2a1ki2ak3lak4li2a1kr4akra3akroak3sh2akta2aktb2a1kua2kun4a3kü2ala_al1abal1afala2ga3lalal1ama2larala4s2alatal1aual1ämal2bralb3sal2däal2dral3dualen1ale2pale4talf4r3algi3almba2l1öal3öfal2ös1alphal2ufa2lumal1ural2zw2am2aamab4amad2ama3g2am4e4ame_a2meba3meta2mewa3miea3mis2ammlammu2am3pr2am2sam3sa1amt_am4töam2tu2ana_2anabana3ca3nak2anam2ananan1äs2anbuan3ch2and_2andua3nee2anfi4ang_2angf2anghang1l2angoang1r2a3ni2ank_an3klank1rankt42anmu3annäan1oda3nola3nos2anpr1ansä1ansc2ansk2ant_2anto1antr1antw2a1nuanu3s2anzb2anzg2anzs1anzü2anzwa1os3ao3t2a3ot_a2pefap2faa3pfla3phäa2pht2ap3la2pot3applap3pu2a3pua3ra_ar2ab2arb_4arba2arbiar2bl2arbr2arbt2arbu1ar1ca2reaa4rega2reha4reka3renare3uar2ewarf1rar2glar2gnar2iaar1ima3riuarm2äarn2e2a1roar1oba2rorar2rh2arsaarse32arsiar2st2arto2artsar1ufar1uhar1umarwa2ar2zä2arze1arztas3aua2s1äa2sca4as2ea2seba3ses2asisas1ora2s1pas2phas2pias2poa3spuas2stas3teas3tias3to2astraßen3at1abat2afat4agata3la3tama2tatat1aua2t1ä4ate_a2teb4atena2tep4atesat3ha3athl4a3ti4atorat3räat3reat2saat2seat2siat2soat3taatt3sa3tubatu2nat2zoau2draue2baue2sau2faauff43aufn4au1iau2isau3lüaun2eau1nua4unz2aup22ausc1ausd3ausf1ausg1auslau2so1ausr1ausü1ausz2aut_2aute1autoauz2wa3v4aawi3eax4am2a1yaa1yeuaysi1ä2b3lä1cheä1chiäch3lä2chrä1chuäck2eäf2fläge1iäge3sä2g3lä2g3räg4ra1ä2gy2ä3heähl1aähl2eäh3neäh3riä1is_ä1iskä2k3lä2k3rälbe2äl2bläl2p3ämt2eän5deän2dräne1sän2f52ängeän2glän2gr2ä3niänk2eän2kränk2säp2pläp2präp4stär4afäre2när2grärk2särm2sär1o2ärse2är4siär2stärt4eär2thär2zwä5s4eäse3tä2s1päss2eäs2stäs4träte2nät1obä2t3rät2saät2sääts3lät4trät2zwäu2bräude3äu3eläuf2eäug3läu2maäun2eäu1nuäu3seä3usgä3uskä3usnäu2späu2trba2bl2babs2b1afbais2ba2kabak1lbak1rbal2a2b1amban2ab1ang2banlban3tb1anzbar3bbar3nba2scba2stbau3gbau1sba1yobben3bbe4pbb2lö2b3d4bde1sbe3anbe3arbe3asb2ebe1be1cbedi4be1eh3bef4be3g2beil2b2einbe3li1ben_ben3nbe1ra3be1sbes2abe1ur3b2ew2b1ex2b5f4bfal22b1g2bges42b5h2bhut2bi3akbibe2bie2sbik2abil2abi2lubin2ebi2o1bio3dbi3onbiri1bi3seb1isobi2spb2it_b2itebi2tu2b1k4b3lad3blatb3leb3blemb4letb3leub2lie2bligb4lisb2litb4locb3los2blun3blut4b3n2bnis1bo5asb1ob3bo2blbo2brbo3d22b1ofbo3febo1is3bon_bond1bo2ne3bonsbo4räbor2sb1ortbo2scbo3thbo2xibö2b32b1p2bpa2gb4ra_b4rahbrä4u2bre_3brea2breg3bremb4rer2brigb4riob3rohb4ronb4rucbru4sbs3arbsat2b4särbs2äubs2cabs4cub3se_bse2bbsi4tbs2kubso2rbs2plb3stob3stöb3stübtal3btil4b4ts2bu2e3bu3libung4b2urgbu2sa2b3z22c1abca2chca2e3ca3g4cal3tca2pecar3ncas3tca1y2ceco4ce2drcen3gcere3ce3sh2ceta2chab2chaf1chaoch1äs1chef4chei2chic2chl2ch2lech2lu4ch2m2chn42chobcho2fch1ohch2r44chrech3rh2chuf2chuh2chum1cka_2ckac1ckag2ckalcka4r2ckau2ckeh2ckexck1imck1in3ckis2ck3l2ck3nck1o22ck3rckt2e3c4l2clet4co3chco2d2co3dicoff4co1itco2keco2lecol2oco2peco1racor3dco3recos3tco4te1c4r2cte3ecti4octur6cu2p32d1ab2d1acd2ac_dagi2dah3lda1ho3d4aida1inda1isdal2ada3löd1altdamo3d4ampd2an_d1ang2danw2d1apd2aph4dapp3darlda2rod3arrdar3sd1artda2rudas4tdat2a4datmdau3e2dauk2d1äh2d1äp2därzdä3us2d1b4dbu2cdco4r2d1d2ddar2de2adde3asde3b43de1cde1e4de3gldehe2de3hod2eicde2löd2en_dend2den3gd2enhde2nide1nude1ondepi2d4er_de3rude2sade2spde2sude1unde3us2dexp2d1f42d1g2dga3gd2ge_2d1h2d2hisdi4abdi2addi4amdi1cediet3dik2adin2adi2obdi2spdist2di2tadi2thdit3sdi2tu3di5vdi3z22d1k4d3l2edli2f2d3m24d5n2dnis1d2obadob4ld2obrdole4doll22doped2opp2dorc2dordd2orp2dortd2os_dos3sdost1dot6hdo3undö2l13d2ör2d3p2drag4d3rai2drädd4räh4dre_2dreg4drem2d3rhd4ri_d4ridd4ried4rifd4rikd4rild3robd3rocd4roid3roud5rubdrü1bd2sands1änd3seidse4td3shodso2rd2späds2pods2pud2steds2tids2tud2sundta2dd5teadt3hodt5s2du1ardub3l2d1uh2dumd2dumf2dumg2dumld2ump2dumrd1umsdung42dunrdun2s2duntdus3t2d1v2e3a2beab3lea2drea2g4ea3gaea3gleakt2ea2laeam1oea2nae2anoe3ar_ea2rae3arre3arveas3se3athea5tre3aug2ebedebe2i2ebeleb2en2ebeteb3loeb2lö2eb2oebot2ebö2seb4rueb2s1ebse22e3caech1äe1chiech3lech3mech3ne1chuech1weci6a2eckteco3dec1s4e3d2aed2dre3deiede2re3d2oeds2äed2suedu2se3dy3ee3a2eeb2lee2ceee1chee2ckeede3e1effeef4leef3see1imeel2ee1empeena2e2enäe2encee3nie2enoeen3see1rae1erde1erkee1röeert2e1erzee3s2ees3kee3taee2thee1u2e1e2xef1are2fate2fäue3fe_ef1emef2er2eff_1effief2flefi2s1efkue3fraef4rüef3soef3spe2fumege1ue2gloeg3nieg2thegus32e1ha2e1häeh2eceh2ele3hereh1läehle2eh3loeh3mue3holehr1äeh3rieh3sheh3übei2blei3de2eidn1eifrei3gl2eigt2eigu2eil_2eilbeil3d2eilne1impei4näein3kei3o2eip2fei3ree1irre2is_2eitäei3teei2theitt4e3ke_e3kene3kese3keye3k2lekt2oe3k2wela2cel1afela2h2elaoela4s2e1läel2da2ele_elea2ele2c2eleh2elei1eleke3lepel2ete3leu2elevele2x1elf_el3feelf4l1elfm1elfte3lieel3klel3leelm2ael5nae2lofe2lolelon2elö2selto22e1luel1ure2lyaelz2eema2keme2se2mop3empfem2saem2stem3t21emule2n1a4ena_2enace3nade4naf4enahe4nak4enam4enaten1äu2ene_2enem2enen2enesenf2aenf2uen3geen2gl1engpe3ni_e3nice2nide3niee3nio2enise3nit2enive2nofen1ohe3nolen1one3noteno2w2e1nöen3sp1entd1entn2entü1entw1entz2enut4enwüeo2fee1on_e1onde1onfe1onhe1onle1onre1onse1opee1opfeop4te3or_e3orbe3orse3orweo1s2e3os_eo3ulepa2gep3leep2paep4plep2prept2aepu2se3ra_era2ge1raie2rake1rale1rape2rare1rasera2ße1rawe1razer1äher1ämerb2eer3brer3da1erdber3de4ere_er1ebere2l2erer2ereserf2eerf4rerg3s2erhüe3ribe3rio2erk_erk3te3ro_er3oaer1ofer1ohe3rone3rose3rowerö2d2eröker3p4er3rä2errüers2aer3seers2ier3sker3sner3sper3sz4ertier3uzerü4bes3abes3ake3sceesch2es2eles2hues2ide2siles2ire4skees3kles3kue4skye3sote3spies3sces3se2essoe1stre1stues4tüeße2setab4et1am3etapet4atet1ähet2enete2oet3hüeti2m2e3toeto2bets2pet3suett1aet2thet2zäet2zweu1a2eu2gaeugs4euil4eu1ineu2käe3um_e3umbe3umleun2eeu1o2eur2eeu3speust4eut2heu2zw4everewä2se2we_e3wirewi2se3witex3atex1er1exis2ext_ex2tu2e3xye3z2aezi2sf1abefab5sfa2drfaib4fa2ke2fanb2fanf2fanlf1anp2fanrfan3s2fanw2f1ap3farifa3shf3aug3f4avfa2xa2f1b22f3d4fdie2f2echfe2drfe2eife1emfef4lf4eief1eisfel3tf2em_fem4m2fempfe2näfen3gfe2nof1entf2er_fe1raf2eref2ertf1erwfe2st3fete2fexpff3arff1auffe2eff3eiffe2mff4enf2fexff4laff4läff4lof3fluf3flüff3roff3röffs3t4f3g2fge3s2f1h2fi3atfien3fi3klfi2krfil3dfilg4fi3lif2inafi3nifin2sfi3olfi3rafis2afis2pfi3tu4f1k4f3ladf3lapf3länf4leef3lerflo2wf4luc2f3m2fma2d2f3n2fni2sfob2l2f1offoli3fo2nafon2efo2nu2f1opfo1ra3form2f1ök2f1ölför2s4f1p2f4racf5radfra4mf5rap2fre_f3recf3red2fregf3repf4reufri3dfri2e2frig1frisf3rocfro2sf3rotf2sanfs3arf4scefs4cofse4tf2sphfs1prfs3s4fs3thf4ta_f2tabft1afft1anft1arf3tatft3hoft1opft2s1ftsa2ftse4ft3stf2tumftwa4ft3z23f2uhfung42funt2gabfgab4r2gabz2gadlga1flga2kagal2ag4amo2ganbgan3d2ganh2ganl2ganwga1ny2garb2garc3gardg2arsga3ruga2saga2siga3spgas3sgat2a2gatmgat4rgau1cg2aukg1aus2g1äp2gärz2g1b2gber2gby4tgd1ing1d3rgd3s2ge3a2geb2ageb4rge1e2ge3ecge2esge1imge1irge2isge3lege3lügelz2ge3migem2uge3nagen3ggen3ngeo2rge1ouge3p4ge1ragerm4ge3sigest2ge5trge1ulge1ur2g1ex2g1f4gga4tg2g3lgg4log2g3n3gh2rgie3ggi2elgi2gugi3negi3tugi4us4g3k2g1labg1lac3glad3glätg2l4e2gle_3gleag3lecg3leg2glehg3len2glesg4lia2glib2glif2gligg2lik4gling2lio2glisg2lizglo3gg2lom2g1luglu2t2g1m2g2n2ag4na_2gnacg4nat3g2näg3neh2gneug2nieg2nifg4nin3g2nogno1r2g1of2g1ohgol2a2gord2gorggo2s1go3stgo3th2g1p2g4rebg4remg4rerg3retg3revgri2e3grif2grig2groc2grohgron4g4rosgro4ug4ruf2grut4g2s1gsa2gg3salgs3angs3arg3s2cg4scagsch4g4scogs2ehgsen1gs3ergse4tgsi2dg3silg3spigs3plgsrü2gs5s4gs3tag3stog3stögs3trg3stugs3tügti2mg5t4rgu3amgu1as2guedguet42g1uhgu1is3gummgu4stgut1agut3h2g3z2hab2ahab2eh2absha1kl2haleh1alph1amth2an_h2andh4ann2hanr2hantha2plha2pr2harbh2ardhasi1h1äff2h3b22h3d4hdan2he2adhe3behe2blhe3brhed2ghee4she2fä2heffhe2frhe2fuhe3guh1eieh1eifh1eighe2im4heioh1eiwhe3lihe3lohe2lö3hemdhe3mi3hemmh2en_he2näheng22henihe2nohen3z4he2ohe3onhe3ophe3phherg22hermhe3roh1eröhert2he3thhet2ih2e2uheu3ghe1y22h3f4hfi2s2h3g2hget42h1h2hi2achi1ce2hi3dh2idehi2krh1infh1inhhi3nohi4onhi3or2hip1hi2phhi2pih2i2rhi3rahi3rihirn1hi3rohir2shis2ahi2sehi2sthi1thhi3ti2h1k4h4lachla2nh1lash1lath3lädh1läsh1läuh3lebhle3eh3lerh3lesh3lexh2lieh2lifh2liph2lish2lith3lochl1ofhl1oph4lorh3löch2löshl3t2h3lufh3lukh1lüfh2mabh3magh3manh3marh4mäch4mähh4mälh4mäuh3me_hme1eh3menh4monhm3p4hm3sahms1phn1adh3namhn1anhn3d4h2nelhn3exh2nich2nidh2niehn1imhn1inh2niphn3k4h2norhnts2h2nuch2nulho2blho2efho4fa3hole4holo3holzhom2ehono3ho1rahor3dh1orgho3slho2spho4st2hot_ho3thh1o2xho1y2hö3ckhö2s1h3öst2h3p2hr1achr3adh1raih3räuh2rech3redh3refh3relh3rephre2th3revh3richri4eh3rinh2robh3rohh3rolh4ronh2rorh3rouhrs3khr2suhr4swhr2thh3ruhh4rübh2sanh2sauh2späh2sphh1stah1stoh2s1uh2t1ahta4nht2ash2tärht1ehhte2sh4thohtod1h3töpht4riht3röht2soht2sphtti2ht3z2hu2buhuko3hu2lähu2loh1umsh1unah1up_h1upshurg2hu3sahu2sohu2tihut2th4übsh3übuhvil4hwe1c2hy2thzug4iab4liaf4li3ak_i3akti5al_ia2läial3bial3dialk2i3allia2lui3am_i4amoian2ei3anni2anoi3anti3anzi3ar_ia2rai2ascia3shi2asiias3siast4i3at_i4ate1iatri3atsia3uni1är_i1ärsi1ät_i1ätaib1eiibe4nibi2ki3blai3blei4bräich1aich1äi1chei1chiich3lich3mi1choi1chuich1wi3damid2ani2deiidni3i2dol2i2drie3a2ie2bäie2blie2ckie2drie1e2iel3di1ell2i1eni3en_i3enai3endi2enei3enfi3enhi3enji3enki3enmi3enni3enöi3enpi3enrien2sie1nui3envi3enwi3enzie1o2i2erei4erii1ernie2röie3sui1ettieu2eie1unif1arif4atif1aui2fecife2iif2enif2flif4läi1flüif4rai1freif3seif3spif2taiga3iig1läig4nai4gnäig4noig4raig3säig4seig3soi2harihe1eihe4ni4is_i4i3ti2käri3ki_ik1ini2k3lik3noiko3si2kölik3räik3reik1s2ik3soik3szikt2eikt3ri2kuni3kusi1lä1il2daild1oil2drile2hil1el2ill_2illsil3öfi1lu2i2lumi3lusim4ati2megi2meji2meki2mew1immo1impoimp4s1impuim2stin2afin3ami3napina4sin1äsin3do2indrin3eii3nelin1euine2x2ingain2gl4inhei3nie2inigin2ir2inis2inn_2innlin1odin1orino3tin3suint2hin3zwi2odaio3e4iof4li2o3hio3k4i3ol_i3om_i3omsi3on_ion3di2onyi2o1pio4pfi3opsi3opti3or_i3orci3orpi3orsi3ortio3s2i2osti3ot_i3otsi3oz_i1ö2ki1ös_ipen3i3perip3fa2i1piipi2sip2plip3pui1r2ai3radirat2ir2bli3ree2irekir2glirg4sir2he2irigir4mäir2no1ironiro2sirr2hir3seir3shir2sti3sacis2api2saui2scaise3eisi2ais1opis1pais1peis3sais2stis4töis4tüit1amit1ani3tatit1auit2ärität22itelite4ni2texi5thr1itiii5tocit3rei3truit2sait2soit1uhitut4it2zä2i3u2i2vebive4niwur2ix2emiz1apiz1auize2niz4erizo2bi2z1wja3nejani1ja1stje3najet3tjo2b1job3rjoni1jo1rajord2jo2scjou4lju2blju3nijur2ok3a2aka3ar2kabh2kabska1frka1inka3kak1allkalo5k3amakand4kan2ekank42kanlk1anska3nu2kanw3kara2karbk2ardk2argk2arkk2arskar3tkaru2k2arwka3sekasi1kas3s2kattk1auskäse32k3b4kbo4nkbu2s2k3d2k1effkefi4kege2ke2glk1einkei1skeit2ke2lake2läkel1ek4eltk2en_ke2no2keo2ke2plk2er_k2erck2erlkerz2k6es_ket3ske1up2k3f42k1g22k1h4kho3mki3a4ki3drki2elki3k4ki3liki3lok2imik2in_k2ing2kinhk2inik2innkin3ski3orkio4skis2pkist2ki3zi2k1k44kla_k4lar4kle_4kleh2klic2kligk2link3lipk2lir4klizk4lopklö2sk2lötkluf23knabk4neiko2al2kobjkoff4ko1i2kol4ako3leko4muko3nu2kop_ko1pe2kops2kopzko3riko2spko2stko3ta2k1ouko2wek1o2x2k1p2k4rawk4raz2kre_2kreg2k3rh2krib2krip3kris2krufkrü1bk2sanks3ark2sauks2änksch4ks3hak3sofks1pak3speks2puks3s2k1stak1stek1stok1strk1stuk2s1uk3talkt1amkt1anktä3skte3ekt1eik2texkt3hokt1imk3topkt4rokt3s4kul2a4kulpkung42kuntku2roku2spkus3tku2sukür4s2k3z2kze3lla3ba2labb2labf2labg2labhlab2ol2abrl1abt3labu2labwla1celad2il1adl2ladm3ladul1advla2falaf3slaf3tla2gala2gnlago2l2akk2l1al4lall4lalpl2amil2amp2lanb2lanf2lanll1anp2lanslar3sla2ru4lasdla3se2lash2lasila2so2laspla2stlat2ala3telat2s1lauglawa41länd2läub2läuc2läue1läufl3bacl3blälb3lel2blil3blolb3salb3selb4sklb3splbs6tl3chel3chilch3llch3rlch3ülch1wlda2gld1all3daml3dasl3datld1auld1ärl2deil2dexldo2rld2osld2ö2l2dreld4rüld3sald3stld3thle2adle2bl4leddle3dele3eilef2ale2gäle2glleg4r4lehs4lehtl2eicl2eidl2eitlel3s4lemplem3sl2en_le2näl2enfle3nil2enkle1os3lepa3lepf3leprl2er_lerb4lerk2ler3tl1erzles2ele3shlesi1le3skles2t4lesw2lesy2leto4leud3leut2lexe2lexzl3fahlfe1elf3lolf2trlfur1lga3tlg3rel3gro2l1h23lhi_li3acli3akli3amli3arlia1sli3b4libi34lickli4ds3lie_lig4nli3keli2krlil2a3limol1inv2linzli4om3lis_li2spliss2lit2ali3telit2hli3tu2lixili2zalk3lolk4nelk4ralk2s1lk3sälks3tl3k2ülla2nl3lapll1aullch4ll3d4ll2emll2esl2lexll3l2ll1obl3lowll3shll5t4llu2fll1urll3z2lme2el2möllmpf4lms2tlna4rl3n4e2lobjl2obrlo1fllof4rloi4rlol2a2lopf2loptlo1ralo4rä2lorcl1ordlo3ro3lorq3los_lo4sa3loselo2talot4h2l1ovlo2velö2b3l2ö2fl1öhrlpi4plp3t42l3r2lre1slrut4lrü1bl3sacl2saul3sexl4shalsho2ls2pols3s2lst2al2stels4trls2tuls1uml2sunlsu3sl2tabltag4lt1aklt1ehlt2enlt3hol3thul2toblt1oplto2wlt1öll3törlt1ösl3trält3relt3sclt2solt1uhlu1anluba2lubs2lu2drlu2es2lufflu2golu2gu2l1uhlume22lumf2lumll2umpl1umsl1umw1lu2n2lunt2lunwl1urnl1urt2luselu2splu4stlu2tälüh1lly1ar2lymply3nolzo2flz3t2m2abe2mabk2mabs2mabtma2cima3damal3dmalu4mam3m2manbm2anfm2anh2manlm4ann2manzma2orm2app2marb4marrm1arzmat4cma3unma1yom1ähnmä1i2m1ärg2m1b2mbe2em3b4rm2d1äm2deimds2em2e1cmedi32medyme1efmega1m2eil3meldmell2m2en_m2ens2meou3mer_me1rame2ro3mersmes1ame4sä4mesume3th2m1ex2m1f4mfi4l4m1g22m1h4mi2admi3akmibi1mi3damie3lmi2ermi4etmi2kimi2ku4milzmi3nimi1nu3mir_mi3ra3miri3mirs3mirwmi2samise1mi2tami2th4mitz4m1k4m2mabmm1eimm3simm3spm2mummm2unmmül22m3n22mobj3m2odmo2dr4mog_mo2i32mol_mom2e3m2onmo3ne3mo2o2moptmo1ramork4m1o2xmp2flm3ponmp3ta2m3r2m2sanm4sapms1asm2saumsch2m4scom4sexmso2rm2späms2poms2pums3s2m3stoms4trms4tüms1ummt1abmt1akm3tammt1armt3homti2smt1ösm4ts1mt2samt2semt1um2m3uhmu3la2mulsmu3nim4unkmunt24munzmu3ra3musimu2spmus3tmu2sumuts32m1w2mwa4rmwel42n1abna2bä4nabg4nabhna2bln2abona2br4nabt3n2ac4naddn2ade3n2ag3n2ahn3ahnnai2en1aig2n1akna2ka3nakon2al_na2län4alena2lu2nalyn4am_3name3namon1an_4nanb2nanh2nani4nank2nanl3nannna3non1anp2nanr2nanw5nar_2narcn2ard4narg3narin2ark2narmn2arpn2as_4naspn4ata4natmnats14natt4naufn3aug5naui3n2äcn1ähn2n1ännä2scn2äss2n3b4nbe3nnbes4nbu2snch3mnd2agndat2nd1aun2dein2dobndo1cnd1opnd1orn2drönd3thndt4rn2dü4ne2apne3asne3atne2bl3necane1ckne2de2nee33nehm2n1ein2eid4neifne2ke3nelanel3bne3lin2em_n4en_n2enbn2encn2enhne2nin2enjnen3kne2non2ensn2envn2enwne2obne1os2nepfn2er_ne1ranere2n1erfn1erh3nerin1erkne2ron2erpn2erv3n2esn4es_nes4cnes1one2thneu1cneu3gneur22n1exnf1aknfo1snft2on2f1ung1adng3d4n3gefn3gerng3g4ng3hun2glon2glöng3neng1orngs3cng3tsn2gum2n1h4n3hann3harn3haunhe2rnib4lni2deni3drnie3bni1elnig2anig3rni3klni2kr3n2ilnim2o2ninfni2obni3okni3olni3ra3n2isni2tinit4sni3tunk2amn2kähnke2cnk2lonk2lunk4nan2knenk2öfn2köl2n3l22n1m4n2naunne2snn2exn2nofnn3scnn3senn2thnn1ur3nobl2no2dno3drn3olen2on_3nor_nor2a2norc3norh3norm3norsn1ortno3shno2täno2tr2nö2f2n3p4npa2gnpro1npsy32n3r2n3savns2cans1ebnse2tn3sexn3siln4sphn2sponsrü2ns3s2ns2tins2tunst2ün2styns2umnta3mnt4atnt1ämnte2bnte1ent1ehnt2enn3ternteu3nte3vn3thrnti3cntmo2nt3sants2onts2pnts2tntum4nt3z21nu1anu3arnubi11nu1cnu2esnu2fe2n1uhnu3k4n2um_2numf2numg3numm2numr2nuna2nunt3nu2snu3scnu3senu3slnu2ta2nü4bnür1c2n1v2n3ver2nymun2zadn2zann2zärnz1ecn2zornz2öln2zwö2o3a2o4abioa3deo4a3ioa3ke2obano3bar2obe_2obea2obewobi4t2o3boo3briob3skobs2pob3sz2o3buobu2s2o3bü2oby4och1ao1cheoch3loch3moch1ooch3roch1socht2o1chuoch1wo3ckeo3ckio2ckoo3d2aod2dro3debo3dexo3diro2donodo4so2dre2o3du2o1e2o4e3so2e3to3et_o3etsof1amof1auof2eno3feroffs2of2fuof1laof4läof4löof3raof3räof4rüofs1aof3thoga3dog2loo3g4nog3spohl1aoh3looh2lu3ohngoh2ni1ohnmo2h3öohr1aoh1ro2o1hyo1i2do2isco1ismoiss2oi1thoki2ook1läo2labol2arol4drole3eoler2ole3sol1exol2faol2flolf1rol2glol2grol2klolk3rol2of1olymol2zwo2mabo2mebome3co2melo2mepom2esom3maom3pfomtu3ona2bo2naeo3nalon1apon2auonbe3one2ion3f2ong4rong3s4o3nion3k2onli4o3nodono3sons1aonsi2ons3lons1pont2hont3s2onukoor3foo4skoo2tr2o1ö2opab4o3panopa5so1peco1pei2opf_op2fäo2pfeopf1l4oph2o3pheopin2op3li2o3poop4plop2pr2o1pr1opsiop3szo1rad2orak2oral3oramo1rasor1ätorb2l2orcaor2ce4orda1ordnor2do2ordr2ords2ordwore2hor1eror3gaor2glor2gn4oril2oritork2aork2s2o1ro2o1röorr4aor3rh2ors2or3shor3szor4töor2ufo2r3üo2ryaos3ados4anosa1sos4co2o3seose3eose2no3shoo4skaos3keo4skios2lo2os1pos2peos2saos4säos3to2osu42o3syo2tebote2s4ot2hot4heo2throt2inotli2ot4olot2oroto1so3traot2saot3scots1pot2thou2ceou2geou3glouri4outu4ove3so3wecoy1s4o3z2aozon1ö2bleö2b3röb2s3öch1lö2chröch2söcht4öd2stöf2flöh3riö3ig_ö2ko3öl1a2öl1eiöl1emöl4enöl1imöl1inöl3laöl1o2öl3saöl3szö2l1uölz2wönn2eön3scön3spöpf3lör3a2ör2drör2glör2klör1o2örs2eört2eör2trös2stös3teös2thös3trö2t3aöt2scöt2trözes4pa3dapa2drpa3ghpa1ho3pala1paläpa3li2paltpank42panl2pannpant2panz4papi23para1parc2parg1paro2parppa4stpat4cp3auf3pä2cpä2to2p1d2pea4rpech1pe2en2peicpe1im2pekupel3dpena41pennpe1rapere21perl3pero5perspe3sape2stp2fabp2fadp2fafpf1aip2feipf3lopf3lup2forpf1ra2pfs2pf3slpf3sz2pf3tpgra2p3hopph3t2phu4s2p1hüpi2a3pias4p4id2pi2el3pierpi3lepin2epi3oipi2pepi3ri4pisopi1thpit2s2pitz2p1k2pkur11p2l43p4lap5la_p5lad2ple_ple1cp4legp4lem2pligp4likp4liz2p3lu2p1m2po3b42p3ohpo3id3poin3p4olpo3li2pondpo1pepo2plpo3pt2pornpor3spos2epo3ta3potepö2blp2p1hpp1läp2plep2pripp3sa1prak1prax1präd1präg3präm3präs2pre_2prec1pred1preipri4e2prig1p4ro3prob2proc3prod3prog3proj3prot1prüf2prünps4anp3s2hps1idps2pop3staps2tup3stü3p2syps2zept2abpt3atpte4lp4tospto2wp2t3rpt3s2pt1um3p2typu2dr2p1uh2pundpun2s2puntput2spwa4r1queura2abr3aalra3ar2rabd2rabf2rabgra2br2rabs2rabt1rabyra1cer2ackr4ad_3radf3radlrad5tra2gn4raht2raic1rake3rakür4al_ral3bra3le2ralgr4aliralk2r4alsra2lu3ralyr2ammr2an_4ranc2ranf2ranl2ranr2rapfr2ara2rarbr2arkr2arpr4as_ras2ar4at_r3atlrat4r4rau_4raud2rauf2raug3raum3r2äd3rän_3räni3räns2r1ärr2är_rä3raräu2s4räutr2bakr3blärb2lörb4rirb3serbs1orb3sprby4tr1chirch3lrch3mrch3rrch1wr2ck1r2dafrd2amr4dapr2deir3denrd1itr2dobr3donrd1osrd4rird3tard3thrdwa4re2amre3asreb1rre2bür2ech3red_4reddre1elre1er3refe4reff3refl3refo5reg_rehl4r2ei_r2eie2reigr1einre3larel2ere3lorelu2r4em_r2emi4remur4en_r2enare2näre2nir2enzre3or3repe3repo4reppr1erfr1ergr1erkr1erlrer2nr2eror1erör1ertre2sa3rese3reso2ress3rest3resu2reulre2wi4rezirf2äurf2esrf4lör3flür3forrf4rurf4rürf2sarf2targ2abrg2anr2gnorg3spr2ha_r3herr2hoe2rholrhu2sri3amria1sri3atri1ceri1elri1euri2frrif3s5rig_5rigjrig1l4rigrrik1lr2imb2rimprim2s2rink3rinn2rint4r1irris2ari3so3rissri2strit4r5riturk2amr2kährk4lork2lur3krirk2sprk1strk2tark1uhrk2umrku2nr3l2arle2ar3lecrle2ir3letr3l2irli2sr3l2orm2ärrm3d2r3me_r2meorm2esrmo1srm3sarmt2arna2brna4nr2naurn3drr4nefrn2eirne2nr5nesrn2etr4nexr3nodr1nötrn1ur2robj2robsro3e4roh1lro1irro3lerol3s2roly4rom_4romm4romt3ronnrons2ro1pero3phr2oraro3shro2ßu3routrö2du1r2öh1r2öl3römir2ös_r2öse2r1p2r3p4ar2plirpro1rps3trr2abrr2arrr1ämr3r2er4rewrr2herrik2rro3mrr2strr2thr3r2ürrü1brs3abrs2anrs3arr3shors2klr4skor4skrr4skurs4nor4sobrs2p4rs3s2rs2thrs2tir3stor3störs2tur3swirtal2rt1amrt1ärrten1r2thirto1prt1orr5trirt2sorube2ru2drru2fa3ruinru1is4rumfru2mi4ruml4rumz2rund4runn2runwru3pr4r3urru2ra5ruroru2siru2strut3hru2zwrü1ch4rümmrz2anr2zarr2zasrz1idrz1oprz3terz2thr3zwä2s1absa2besa2blsa2br4sabss1adm3safasa2fe3safi3sagasag4nsa2gr3s2aisail22s1aksa2ka3saki3sakr4sakt3salo5samms1amps2an_s3anbs2and3sani2s1apsa2po3sapr2s1ar3saris3arrs1aspsat2a4satmsa2trsa3tss1a4u3sau_3sauc3saue3saum3saur2s3avsa2vos3ähns1ält2s1äm2s1är3s2ät3säul2säuß4s3b4sba4n2scams2cans2cap2scar2s1ce4sch_s4chä4schb4schc2schd2schf2schg2schh2schks4chls4chö2schp2schq4schss4chu3schü2schv2schz4s3d2sde1sseb4rse1ecse2glseg4rse3heseh1lseh1sseh3ts1ein3s2eks2el_s2elsse2nä3senkse2noseo2rs4er_3seraser3gs1erh3seriseru25ses_se3su2s1exse2xe4sexpsex3t4s3f4sflo44s3g2sha2k1shass3h2e3shi_3shidshi4rs3hoc4shof3shop3showsi2ad2siat5si1cs2ido3s4iesien3sie2ssi1f43s4igsig4nsi2kisik1lsi2krsik3ssi2ku3silosin1ision43s2issi2sasis3s3s2itsit3rsi3tusiv1asive3si2vr2s1k24skams3kar4skasskel1s4keps2kifs2kig4skirski1s3skiz4skom4skor4skow4sk3t2s1l23slal4slans2laws3lo_s3loe2s3m22s3n4snab4so3baso3et3softso3la3s2onsone22sopf3sor_s1orc3sorsso4rus4os_2s1ox2s1ök2spaa4spak4spap3spaß4spaus2paz3späh2spärs3pe_2spel4spet4s3pf2sphas4phäs3phespi2k4spil3spio4spis4spla4splä4sple2spod2spogs2poi2spok4spol4spr_3spru2s3ps2s4pt2spun2spup3spur4sput4s3r4sret3srü2ds5safs3sagss1ajs3sals3s2äs4sces4scoss1ecssoi4ss2poss3s4sst2ass2thss2tis3stü4sta_3staast2ac2stag3stah2stak2stax3s2tä4stäg2st3c2steas2ted4stee2stem4stens2tep2ster4stes2stetst3ev4stexs4thäs4this2thu2stia2stibs2ticsti2e2stig2stiks2til2stio2stis2stiv2sto_s3tob1stof4ston4stoo1stoß4stou2stow2stoz2stöt1stru1stub4stuc2stue3stuf3stuhstu2n3stüt4st3zsu1ansuba24subi3su1c2s1uhsu1issul2asul2isult23summ3sun_su4nes1unf4sunt3s2upsup3psu2ras1urtsu2s1su3sasu3shsu3sisus3s2sü4bsü2d1sweh24swie4swilsy4n34s3zas2zess2zis4s3zu4s3zw2ß1a22ß1b22ß1ec2ß1eißen3gße2niße2noße2roßer3t2ß3g2ßig4s2ß1in2ß1k4ßler32ß1n22ß1p22ß3r22ß1s22ß1um5taan4tab_2tabf2tabg2tabh2tabkta2br4tabsta2bü2tabw2tabz2t1ac3tacut1adatadi33taf_4tafft1afg3t2agt3agotai2ltai4r2takzta2latal3d3talo2talt3tameta2mit1amt3tan_2tanbta3ne4tanf2tang3tanit2ank4tanlt2anot1ansta2nuta3or2tapfta2pl2tarb4tark2taro2tartta2ruta3sata2tht3atlt4atmt1auk3taum4tägyt1ämt3tänzt2är_tä2ru4tätt2täuß4t3b2t3chat3chetch2itch3lt2chutch1w4t3d4tdun2te2a22teakte3alte3an3tebat2ech2teckte1emte2es2teff3teha3tehä3tei_teik43teiltekt25tel_3telatelb43telg3telk5teln3telp5tels3tem_tem3st6en_ten3ate2nät4enbten3gt4enhte2nit4enjt4enmten3n3terct4erit4erot3erötert2teru2t2estte2su3tet2t2et_4teth4tetl3teuf3teumte1unte2vite1xa4texp3text4t1f4tfi2l4t1g2tger22th4at2hagt3hait2hak2t3hä3thea2thebt2hect2hekt2hem1then3theot2hest2heut2hik4th3l4th3m2th3n1t2hot3hoft3horthou24t3hö2thub4thunti2ad3tib4ti1cetieg42tiehti1elti1etti1eu3tif_ti1fr4tift3tilgti2lötil3stilt4ti2lut2imiti3nat1inbt1infti1nuti3orti3plti1rhti2sptium2tive3ti2za4t3k45tlem6t5li4t3m24t5n4tnes2to4asto5at4tobjtob2ltode2toi4rto3la3tole4tolz2tomg3topo2topt3tor_to1ra4torct1ord3toret1orgto2rö3torsto2rut2orwto3sc3toseto4sktos2p4toss3totrtots23t4outo3un3töch4t1ökt1öst4t3p21t2r45tra_3trac3trag3trak3tral4traß5träc3träg4träs4träß4treb4trec3tref4treg2trekt4remt4rert4rett4reut3rev2trez2t3rh4trict4riptri2x3tro_3troe3tront4rop3troyt3röc2tröh3trös3trua4truktrum2t4rübt4rügts1adts1alt2sants1ast2sauts1emts3krtso2rt3sout2spät2spht2spots3s4t1st4ts2tut2s1u1tsubtt1abtt2actt1aktt2altta1st3telttes1tto1st3trott3rutt3rütts1ptt2untu3antuf2etuff3tu2istul2at2um_3tun_3tune3tungt1up_tu2rätur1c3turntu2rotu4rutu2satu2sotu3ta3tüch3tür_tür1c3türe3türg4tütztwi4ety2pat2za2tz1agtz1altz1artz1aut3ze_t2zortz2thtz1wätz1witz1wuu1a2bu1a2cuad4ru1al_u1albu1alfu1alru1alsu1altua2luu1ansu3ar_u1arsua3saua2thuat2iubau1u3b4iu2bopub3räu2bübuch1auch1äu1cheu1chiuch3luch3much3nu1chuuch3üuch1wu2ckiu3d2au2donud3rau3druue2ckue2enu2elaue2leueli4ue2miue2näue2niue2nou2ereu3errue2tau3fahuf1akuf3aru3fasuf1au2ufe_uff4luffs4u2fobufo2ruf3säuf4sou2fumug1afug1akuga4sug1auug3d2ug3huu2g1lug3lou4gluu2g3nug1orug3roug3seug3siuh1lauh1läuh2liuhme4uhr1auh3riuhrt4uh2ruuh4rüui2chui1emu4igeu1in_u1is_u3käuu1k2lu1k4ruk2tauku2sul1abul1amula2sul1ämul2drule4nule2tu2lexul3f4uli2kul3kaul2knull2aull3sulo2iul1orul2sauls3z2ultaul3thult3sul2vrulz2wuma4rum2enum1irumm2aum2suum3t2um2un2una_1unabun3acun4alun3at1unda1undd1undf2undg1undn1undv1undzune2bune2hung5hun2idunik4un2imuni2r2unisunks23unkuunna2uno4run2os2uns_un3se1unsiun3skun3spun3taun3trunt3s2untuu1o2bu3or_u3orsu1os_uote2u1pe2uper1up2faup2plup2prupt1oup4tru2rabu2rar2u1räur1änurch1ur3diure4nurf3turi2cur1imurk2s4u1rou3roluro1sur4swur2zaur2zäur2ziur2zou4safu3sepus3klu4skous3ocu3sohus1ouus1peu2spou2spuus2thus3tru1stuus2uru2tärut1egute2lut2esut2etu4tevutfi4ut2heu2thiu2thuuto3cut4orutos4ut3rüut3teutts2ut2zo2u1u2uufe22u1v4u2ve_uz1weuz3z4übe3cüber3ü1cheüch3lüd3a4üd1o4üd3s2üdsa1üd3t4ü2f1aüfer2üf2flü2f1iüf2toü2g3lüg4stühla2ühl2eüh3moüh3neühn2süh1roühs2püh4thül2laül2loül2löü2n1aün2daün2dründ3sünen3ün2faün2frünn2sün3scün3seün3spün2zaüp2plür2flür2frür3scür3seür3spürt2hüse3hüse3lüse1süss2eüs2stü2t3rüt2s1üt2tr2v1abval2s2vang2varb2v1auve3arveit4ve3lave3leve3live3love3maven2cve3neve3nive3növer3averd2vere2verf4verg4ve3river3kvert2ver3uve3tavete1ve3trve3x22v1f4vi3arvi2elvi2ervima2vi4navin2svi3savise4vi2spvis2u2v1l22v1obvo3gavo2gu2v1opvo2r1vor3avor3dvor3evor3gvo3ri2v3rav4ree2v3rov1stav3s2zvu2et2vumfwa5gewa3gowai2b2walb2walmwa3nawa3sawa3sewa3sh2wängwäs2c2w1b2we2bawe2blweb3swe2e4weed3we2fl2weiewe3niwerd2we2röwer2s1wesewe4stwet2s2w1eywie3lwin2e2wing1wi4rwi2sp1wisswi3th1wo1c1wolfwor3aw3s2kwun2s4wur_wur2s2xa2b1x2adxa1fl1x2agx3a2mx2anz1x2asx1e4gx2er_x2erexers22x3euxich2xide2xie3lxil2axi2loxi2lux2is1xis2cxi2sexis3sxi2su2x1k22x3s2x2t1axt2asx2tänxtfi4xt3s2x3turx1u2n2y1aby1al_y1a2myan2gy1anky2chiych3nyen4ny2erey2es_yes2pye2thygie5yke3nyk3s2y4le_yli4nyl3s2y2l1uyma4tym3p4ympi1y2n1oyno4dyon4iy1ontyp3any4p3sy3r2eyri2ayri1ey3r4oys2any3s2cy3s2hy4s3lysme3ys2poys1prys3t4y3s2zy2te_y2tesy3to1yure3zab3lz1a2dza3de2z1afza3grzale32z1amza2na3zani2zarb2zarcz1arm3zaubz3aug3zaun2z1äc3z2äh2z1ämz1ärgz1ärm4z3b4zbü1b2z3d2zdan2zeik4zelu25zen_zen3nze2no3zentz2er_zerk2z2ernzers2ze2säze3sczes1ezes1ize2spze2tr2z1ex2z1f42z1g2z2henzhir3zi3arzid3rzil2ezin2ezi2o3zi3opzirk22z3k42z1l22z1m2zme2e2z3n42z1ob2z1ofzo2gl2z1oh2zopezo2ri2z3ot2zö2f2z3p42z3r24z1s2zt3hozt3s2zu4chzudi4zu2elzu3f4zu3gl2zumf2zumg2zumlzun2ezung42zuntz1urkzu3s4zu5t2zür1cz1wac4zwahz1war2zwas4zwäl2zweg2zwet4zwirz2wit2z1woz1wörz1wur2z1wüz3z4az3z2o"); + put(6, "_ab3ol_ab1or_akt2a_al3br_alt3s_ampe4_an3d2_angs4_ans2p_ans2t_an3th_ari1e_ark2a_ar2sc_as4ta_au2f3_au4s3_be3ra_boge2_da2r1_darm1_de2al_de1o2_des2e_de3sk_des2t_do2mo_do1pe_dorf1_ehe1i_ei3e2_ei4na_ei2sp_ei4st_ei4tr_el2bi_elb3s_em3m2_end3s_enns3_en2t3_en4tr_er2da_ere3c_es3ta_est2h_es3to_es5tr_eu3g4_eve4r_flug1_for2t_fu2sc_ge3ne_guss1_he3fe_he3ri_inn2e_kamp2_kle2i_kni4e_kopf1_le4ar_li4tu_ma3la_ma2st_mel2a_mi4t1_näs1c_no4th_oper4_oste2_ost3r_poka2_ram3s_reli1_ri2as_rom2a_rö2s1_se3ck_sen3s_ser2u_se2t1_si4te_ski1e_tal2e_ta2to_te3no_te4st_ti5ta_tite4_to4pl_tro2s_tu3ri_uf2e2_ufer1_un3a2_uni4t_uns4t_uro2p_ur3s2_wah4l4a1a2naa2r1aaar3f4aat4s3ab1aufab1eilabe2laab1erkab1erzab1ins1a2blaab5lag1a2bläab4le_3a2blö1a2bon2absarab3s2i2abst_ab3ste1abteia1chalach3auach1eia3cho_ach1orach3su4ach1wa1ckarack2ena2ckinack2seack3slacon4na3d2abad3amaa2d1an3a4dapade2aladefi4a2deina2deri4ade1sades4sadi3enad4resa2f1eca2fentaf1erlaf4fluaf3s2aaf3s2haf2t1aaf2teiaf2t3raf2tura2f3urag1a2da3gen_age4naage2saage4si3a2gitag4ne_a2g3rea2g3riag4samag4setag4spoag3staag3stea2gundahl3a2ahl3szah4n1aah3r2eahrta2ain3spai3s2e2a3kam1a2kazaken2nak3rauak5tan2aktikak2t3r2aktstal1ageal3amealami5al3ampal1anaal1ansal1anza3lar_a3lareal2armal3arral1asial1assal3augal2b1lalb3lial2bohalb3rualds2ta4l1eha2l1eia2l1ela2lengal1epoal1erl3alermal1etaal1etha2l1eua4leur3a2lexal2glial1insa2linvalk1ar1alkohalk3s2alks4tal2labal2laual3les1allgäal2lobalo2gaal1opeal1orc3alpe_al3sklal3sunal4takal3tamal2treal2trial2troalt2seal1umbame2n1amer2aa2meriame3rua4mesh2a3mirami3taami3ti2ammalam2meiam2minam3stram2t1aam2t1äam4tel2amtemam2t3ram4treanadi3an1algan3dacande2san2dexand2suand1uran3e2can2ei_an3eifan1e4kan1ethanft5san3f2uang1ar3angeb2angiean2gla4angs_an2i3d3a4nima4ninsan2keian4klöank3ra3an3naann2aban3n2ea2n1orans2enan2seuan3skrans1pa1anspran3s2z1antei1anthran2tro2anwet1anzeian2zwiar3abtara3d2a2r3al2a2rara2r1auar2bauar2bec2arbenar2bre2arbs2ar2droar1effar1ehra2reinar2erfa2reria2rerlar1intar2kalar2knear2korar4kriark1s4ark3saark3shar2lesar2nana2r1oparr3hear3s2har3staar3t2ear2thear3t2iartin2art3rear2z1was1alaa3schea3schia2schma3schua3s2hiasin2gaska3sa3skopas3s2aas3s2eas3s2ias2s1pass3tias3stras3stu2as3taas4tauas4tofast3räaswa2s3a2sylat1apfa2tausat3eiga2teliate2ru4athe1atil4sati2st4atmusatra4tat3romat4setat2s1pat4takat4tauat2teiatz1eratz3t2at2z1w2au1a2au2bliau2bloauf1an2aufe_2aufehauf1er2aufs_2auft_4augehaule2sau2malau2m1oaum3p2aum3s6au3n4aau2nio2au3r2au2sauau2spraus3s22auts4ava3t4äche1eäch2späch4stä2d1iaäft4s3äg3str2äh3t4äl2l1aämi3enäne2n1äng3seän2k3län2s1cänse3häp2s1cä2r3a2ä2r1eiär1intär2k3lärt2s3äse3g2äser2iäskop2ä3s2kräs6s1cä4s3t2äß1erkä4t1a2ät2e1iätein2ät2s1iät2s1pät2s3täum4s52ä3us_backs4b1a2drbah2nuba2k1iba2krabal3th3b2andban2drba3n2eban4klban2kr2b1ansbar3deba2reibar2enbar3zwba3s2abau3sp3b2ä1cbbens2bb3lerbbru2cbe2delbe2erkbe1erlbe1etabei1f4bei3k4bei3labe1indbei3scbeis2ebei1stbeit2sbe3lasbe3lecbe3leibe2letbel3label3szbel3t4ben3arbe3nei3ben3gbe3n2iben2sebenst4ben2su2bentbb2entib1ents2bentwben3unben3z2ber3ambe2ranbere4sber3nab1erntbe2robbe3ropbe3rumbe3slobes2pobess4ebes3szbe2tapbe3thabien3sbi2ke_bi2kes2b1inb2b1infbin3gl2b1intbi2solbi2s5tb2it2abla3b4b2lancb2latt2b3law3ble2a2b3legb3lein3ble4nb3leseble3sz2blich3blickbling43blitzbo3ch2bo2e3ibon2debo1r2abo2reibo4rigbo4s3pbot2st2b3radb4ra3k2b3refb3reif2b3repbri2er2b3rolbrust3bru2thb2s1adb3sandb3sel_bse2n1b3s2esb2s1ofb3s2pubst3acbst1akbs3tätbst3erb2stipb4stodbs4trib4stübb2s1unbu2chibul2la2b3umkbu3r4ibus1erbu2sinbu2s1pbu2s1ubzeit1carri1ca3t4hcha2ck2ch1akch2anb3chancch1ang4chanz4char_1characha2sc3chato4chatuch1ärm3chef_3chefi3chefsch1eimcher3ach1ess2cheta1ch1iachi3na4chind2chinf2chinhch1insch1int1chiruch1offch1orcchre3s1chron2chunt2ck3an4ckeffck1ehe4ck1eick1entcke2rack2ereck1erhck2ern2ckero2ck1id2ckunt2ck1upcon2nec1s4trcussi43d2abäda2ben3d2ablda2bredab4rüdach3ada2chodach1sdal3b2d1amma2d1amt2d1ana2dangedan4kldan2kr2d1ans2dantwd2anz_4danzida2r3a2darb2dar2mada3s2hdat4e2da3teidate4n4d3atl4daush2d1ämt2d1änd2d1ängde3a2tde4ca_de2cka2d1eff2d1ehrdein2ddein2sdel1ändel1ec2delek2delem2delfmdelle2de2lopde3lordel5scdel2sodel3t4dem2ar2d1empden3th2dentwdera2bde1radde2rapder2bl2derdbderer33derieder3m2de4ruhde4rumde3sacdesa2gde4samdes2äcde2sebde4sehde2seide4setde2sinde2sordes3s2de2sto2d1etwde1urlde2xisdha1s4di3e2ddi3enidie2thdige4sdil2s52d1imb2d1ind2d1inf2d1inh2d1ins2d1intdion3sdi4re_di2rendi2ris2d1irl2d1isrdi4t3rdle2ra2d1o2fdo2mardo5n4adoni1e2d1opfdor2fädor2fldor2fr2d1orgdo2riedor2tadö2s1c3d4ra_2d3rad2drahm3d4ramd3rand2d3rät2d3räud4rea_d4reas3d4rehd4reiv4d3ren2d3rep4d3rer4dres_d4resc3d4ria2d5ricd5riegd4rin_3d4rit4dritu2d3rod2d3rot2d3rovdrö2s13d4ruc2d3ruh2d5rutd2sau2d2s1efds2eigd2serhds1errd3s2had2s1imds2infd3skuld2s1opds1orids1pasd2sprods3tabd4stagd4stead3steid4stemds4tilds4tipds1umsds2zend4theidtran2du1alvdu2bli2d1ufe2d1umb2d3umkd2ums_2d1umvdund2a2d1unfdun3kedun2kl2d1url2dursadwest3ea3dereadli4e3aleiealti2eat4e2eater1eat3s2e3au2feau1ste3b2akebert4eb3lereb4leue3blieeb3reiebs3paeb3staeb3strebu2t12e3cheech1eie2cho_e2ch3rech3taech1uheck3seede2aledens1edi4aled2s1oed2s1pee2choeed3s2ee2lekee3lenee4nage1e2pie1erbtee3r2eeere2see4reteer2öse1ertree3r2uee4tateewa4re2f1adef1anae2fente3f4lu2e3f2oef3reaef3rolef3romef2tanege2raeg4saleg4stoegung4eh1ache3h2aleh2auseh1eff1e2hepehe1raeh1inteh1lameh2linehl2seehr1a2eh2reiehre3seh1ro2ehr1obehr1ofeh1stee2hunt2ei3a2ei2bareibu4tei2choei2d1aei3danei3dra4eien33eifrüeig2er2eigew2eigrueik2arei3kauei2lareilen1eil3f41eilzuei2moreim2plei2n1aei4nasein3dr2einduei4nelei2neu2einfoein3g2e1initein4szei2sa4eis2peeis4thei1stoei2sumei2tabei2tanei2tarei2troeit3umek1s4tek5triel3abiel2abte2l1akel4amiel4ampel1ansel1anze2l1apel3ariel1asiel1aspel2ast3elbiseld3s22e3lebe2l1el1e2leme3lem_el1empel1erdel1erfel1erkel1erl2eles2el1esse2l1ideli2neel1itael3lanel5le_el3linell3spel1opee2l1orelo2riel2sumelte2kel2t3re2l1umel3useel2zwae2m1ad3emanze3m2ene2m1imemi5naem1intemi3tiemma3uem2meiem3pflem2spren4amee4nanden3angen3areen2ascen3atte3nauee2n1ären4ce_en2dalend3siend3szend2umen1e2ce2neffe4neine2n1elene4lee2nerfe4nerhe4nerk4enerne4nerz1engad3engagen3g2ien3gloeng3see2n1inen3k2üeno2mae2n1openost3en1ö2den3sacen2sauen2sebens2el1ensemensen1en3skaens2po2enstoent4agen2teb1entfa3entgaen2thi3entlaenü1ste1o2b1e3p2f41episo1e2pocep2tale3rad_er3admeraf4aera1frer3aicer3alleran3de3raneer3anfe2ranher3anmer3apfe3rarie2rathe3ratie2ratme1rauber3aueerau2fer3augerb4sper3chl2erdece3recher1effer1eige2reiner1ele2e3reme3renae3renz4erer_e4rerl4ererne3reroer1errer1erse2rerter1erwer1esser1eul4erfür1ergolergs4t1erhabe2riat4e3ric4e3rieer1inber1inker1inter1ita1erklä2erkreern1oser1o2ber3onye4ro2rer3smoert2aker2thoerts2eeruf4ser1u4mer1underung4er1unses2aches3anze3s2ases3cape3schaes3evaes2haresi1eres3intes2kates4loges2ortes2sau4essemessi2aes2sofes2spues3stres3stuest1ake1stare1state3stele1stile2stipes4trie2s1umes3umse4teinet3haleti2tae4t1ofetons4e2treset4riget2tabet2teiet2t3ret4troett3szetwa4retze4seu2esceu4glae3um2seum4sceums1peum3steu4neie3un2geu2nioeun3ka3eu3roeu1staeu1stoeu1stre2velae2vent1e2xeme2x1inex2tinfa2benfa2chof1aderfa3l2afal2klfal3tefalt2sfan2gr2f1ankf1an3zfar2br2f3arcfarr3s3f4art2f3arzfa3s4afa2to32f1auff1ausb2f1ärmfä2ßerfeatu42f1eckfe1inifek2tafe2l1afel2drfe2lesfe2l1ofen3safer2anfe2rauferde3fer2erf1erfaf2erl_f4erpaf2ers_fest1afest3r2f1etafe4tagfeu4ruf2f3efffe1inf3f4räff3shoffs4trfi2kinfik1o2fi2kobfi2lesfi4linfil2ipfin3sp2f1intfi2s5tfit1o2fi2tor3f4läc2f5läd2f3läu2f3leb3f6limfli4ne2f5lon1f4lop1f4lot1f4lug4f3orgfo3rinfor4stfor2thfor3tu2f1o2xf3rand1f4ränfreik2frein42f3ricf4risc1f4ronfro2nafs1allfs4ammf2s1asf2sauff2sausf2sautfs1e2bf2s1emf2s1erf2si2df2s1o2f3spanfs1penf3s2plf2sprefs2prif2sprofs2pruf2stasf3steif2stipf3st4rf2s1unf2t1alft1e2hft1eigft1eisf4theif2t3rof2t3röf3t4ruft4samft3s2cft4sehfts3elfts2tift1url2f1unffun2klfun2ko2f1unmfu4re_fus2safus2stfzu4gaga2b5l2ga2dr2g1amtgan2gagan2grg3anla3g2ano2g1armga3r2og1arti2g1arzgas3eiga2sorga4spega4sprgas4taga4ste2g1auf2g1autg2d1aug2d1erge3g2l2g1eifge2in_gein2sge2intgein2vgei3shgelb1rge5lehgell2age3lorgels2tgel3szge3lumge4namge4nargen1ebge3necgen3szgen3th2gentwge2rabger2erger3noge1r2öge3r2ug1erwag2e1s23ge3scges4pige3steges3thge3t2a2getapge3t4ugge2ne3g2het3g2hiegi3alogi2e1igie1stgi2me_gi4mesgi2met2g1indgin2ga2g1insgi3t2ag2lade2g1lag3glanz2gläuf2g3leb4g5lerg3lese3g2lid3g2lie3g2lit3g2loa3g2lobg3loch3g4lok3g2lop3g2lotgne2tr4g3notgoa3li2gonis2g1ope2g1opfg2o1ragra2bigra2bl2gradl2g3rah2g3rak2g3räu2g5re_2g3recg4re2eg3reit2g3ric2g3röh2g3rui2g3rum3g4rup2g3rüc3g4rüng3s2ahg4saltgs3amags3augg4s3cegs4chig4s3crg3sel_gs3elig3selngs5erkg4setags4pieg4spingsrat4g3stang3starg4s3täg5stämg3stelg1steugst2heg3stirgs3tocg4stolgs3topgst4rig4sturgs4tücgu1an_gu1antgu4d3r2g1u2fgu1ins2g1unfg2ung_gunge2g2un4s2gunt22g1urlgurt3sgu2s3agus2spgus2stha2choha2delha4dinh1adle2h2al_ha2lauhal2bahalb3rhal2lahal2sthand3shan2krh4a3rah1arm_h2armehar2thh1arti2ha3sahat5t2h1aukthau2sahau2sc2hautohau2trhä3usphe1choh1echthe3ckehe2e3lhe2fanhe2f3lhe3friheim3phei4muheine2h1einkhe1ismhe1isthel1eche3lenhe4lof4h1emphend2she2nethenst2hen5trh1entshe2ral2heraphe3rasherb4she2relh1erfüh1erkeher3thher2zwhe1stahe2tapheter2he3t4she1x4ahfell1hi2angh1i4dihi3enshier1ihiers2hil2frh1induhin2enhi3n2ihin3n2hin3s22hi3rehl1anzh1lauth5len_hlen3ghl2ennhle2rahl1erghl1erwh4lerzh4lesihl1indh3listhlo2reh3losihl2sanhl2serhl3skuhl3slohme1inhmen2shme2rahn3eighn3einhne4n1hne4pfh3nerlh3nerzhn3s2khn1unfho2ch3ho2ckahock3tho2f3rhol1au4holdyhol3g4ho4lor3hol3sh1o2lyho2mecho2medho4seihotli42ho2w1h1raneh3rechh4rei_h3reich3r2enhr2erghr2erkhr2ermhr2erzh4rickh4rineh4rinhh4risth4romeh4romihr2sauhr2serhr4sethr2tabhr2tanhr2torhrt3rihr2trohrt2sahrt2sehr1umsh2s1ech3s2exh2s1ofhs2porh2spräh2sprohst2anh1stechst2heh1s2tih2storh1s4trhst3rih1stunhs2ungh3t2alht3aneh3tankh4tasyht3a2tht1e2ch2t1efhte2heh2teifh2temph2t1euh2t1exh4theihthe3uh2t1inh2tolyh2torgh4trefh2t3ruh2t3rühts2tihu2b1ahu2b3lhu4b3rhu2h1ahu2h1ihuk3t4hu2l3ahu2lerhu2lethu3m2ahung4shu3ni1hus4sahus2sphu2tabhu3t2hhühne4h2wallh1weibhy2pe_i4a3g2ia2l1ai3aleiial3laia2lorial3t4ial3z2ia2nali3and2ia3p2fi2a3spi3a4tai3at4hib2blii2beigi2beisibela2iben3aib3renib4stei2bunki2buntibu2s1ich1eii2chini3chloi2ch3ri3ck2eid2ab4i2d1au1i2deeidel2äide3soide3sp1i2dio1idol_i3d2scid2s1pie2breie2choie2fauief3f4ie2f3lie2froie4g5lie3g4nie2g3riegs3cie3lasiel3auiel1ecielo4biel3sziel3taiena2bi3e2näien1ebie3neri3en3gi3e2noien3scien3siiens2kien3szier3a2ie2rapie3resi3ereuierin3ier3k2i3ern_iers2tier3teies2spie1staie2t1aie4t1oie2triiet2seiet3zwifens2if1ergif1erhi1f4lai1frauif4reii1f4rüif2topift3szig2absig1artiga1s4ige4naig1erzi2g1imig3reiig4salig3sprig4stoig4stöig3strig3stüigung4i2h1ami2h1umi4i3a4ik1amtik1anzik1artik3atti2k1aui2k1eiike2l1ik1erfi2kindi3k4läi2k3raik2trei2l3abi2l1acil1a2di2l1akil1ansil1aspi2l1auil3ausild2eril2doril1e2cil1eheil1einil2f3lilf4s3ilie4ni2l1ipi3lip_i3lipsil3l2ail3l2iil2makil2mauil2mini2l1oril3t2hilung4i2manwima2tri2melei2melfi4meshi2metiim2meiim1orgim3pseim3staimt3s2in3a2ci4nacki2n1adin2arain2arsin4arti2n3auin2dalin2dan1indexind4riin3drü1indusin1ehein2erhi4neskine3un1info_1infosing1af1inhab2inhar2inhauin2i3dini3krini3sei3nitzin2nor1inntain3olsino1s4in1ö2dins2aminsch2in2seb2insenin3skr1insta1insufin3s2z1integin3t4rin5trii3n2umin3unzinvil4io2i3dio2naui3ons3ion4stiore4nipi3elipi3en1i2rakir2k3lirli4nir2makir2mauir2mumir2narirpla4irt2stiru2s1isage2is3arei2s1äni2schmi2s3crise3haise3hiise2n1is2endisen3si2serhiser2uis2hasi2s1idi2s1of3i2soti2sparis1picis2pitis2pori2sprois4sauis3stais3stoiss3tris3stuis2sumis4tabis4tamist2anis4teliste4nistes3is4tocis5törist4raist3reisum3piß1ersit1ab_ital1ait1altit2an_it1arti3tauci4t1axi2t1äsi2t1eii4teigit2eili4teinite2lai4tepoi2t1idit2innitmen2i2t1ofit3rafit3rasit3rauit3räuit3ricit3romit4ronit3runit2stoit2tebit4triitt2spi2t1umi2tunsit1urgitzes4it2z1wi2v1akiv1angi2v1eiiv1elti2v1urizei3ci2z1irjahr4sja3l2ajean2sjek2trje4s3tje2t1aje2t3hje2t3rjet3s2jugen2jut2e1kab2blka2ben2kabla2kabläka3b4r2k1abt2k3adaka1f4lkaf3t2kaken42kala_ka2lanka3leikal2kakal2krkal4trkan2alka2nau2kanda2k1angk2ans_k2anz_2k1apfka3r2i2k1armk2arp3kar2pfk2artaka2s3tka3tanka3t4hka4t3r4kaufrkau3t22kautok1ä2mikä2s1ckdamp22k1e1cke2he_kehr2s2k1eic2k1eig2keinhkel1acke3lagkel3b4ke2lenke2lerkell4e2k1empken3au2kenläkens2kken3szk2enteken3thk2entrk2entu2kentwke1radk2erkok1e2rok2ers_ke2selke4t1ake2t3h2k1e2xki1f4lki1f4r2k1intkis4to4k1lack4leidk3lem_2k3lerkle2ra2k3leukle3usk2lisc2klistklit2s2k3locklo2i3klost4klung42k1lüc2k5nerkno4bl2k5norkoh3lukol2k5ko3n2ekon3s4ko1r2a2k1orckot3s22k3radk3rats2kraum2k3rät2k3rec2kred_2k3refk3reick3reih2k3rick3ries3k4ronks1e2bk2s1emk2sentks1erlk2s1idk2s1ink2s1o2ks2pork1s2tik2stork2sträk2stumks2zenk2t1adkt1aktkta4rek2t1auk2tempk2tentkte3ruk2t1idkt1insk2t1ofkt1opekt4rankt3rask4trefktro1skt3runk2tuns2k1uhrku3l2eku3l2i2k3umlkum2s1kun4s4kunst32k1up_kur2blku2reikuri2ekur2spkur2stlab4ralab4ri2l3absla2ce_la2gio2la1hola2kesla2k1ila1k4lla3min1lammf2l1amtlamt4sla4munl1analla2nau3l2andlan2gl2lanhäl2anhe4lanli2l3ann4lansä2lantrlan2zwlap4pll3artila2saulast1ola4tel2l3athl2auf_lau2fol2aufz2lausl2lausr2lauto2l1ähnlä2s1cl4betal2b1idlb2latl4bre_lb3ritlbst3elb4stol2b3uflbzei2l3d2acl2d1akld1amml2da2rld3arild1arml2delel3der_ld1erpl2d1idl2d1iml2dranl3d4rul2d1umle2chile2gau3l2ei_lei2br4l1eigl2ein_l2eindl2eine2leinkl2eintl4eistlei2talekt2a2lektr3l2ela3lemesle4nad2lendul2e2nolen3szl1ents4lentzlen2zil2e1rale2ragle2raul1erfol2erfrl2erfül2erkal2erkol2erlel4ers_lers2klers2tl2ert_l2ertel2erzales2amle3serleste3le1stole2tat2le3thlet4tule3u2f2leurole2xislfang3l2f1ecl4feisl3f4läl3f4lulf3ramlgen2alge3ral2getilian2gli3chili2ckali3d2ali2deo2l1idolid3scli3enelien3slie2stli2grelik2spli3m2ali3n2alin3alli2nefli2nehli2nepli2nes2l1inflings52l1inh2l1injlink2sli2noll2ins_l2insal2insc2linsp2linst2l1intli3os_li2p3ali3s2a2l1islli2tallit1s2lit3szlizei3lk1alpl3k2anl3kar_lken3tl3k4lul2k3rol2k3rulk4ställ1abbl2labtll1affll1aktl3l2alll3amall2anwll1anzll1armll3augl2lausl2l1ämll1echlle3enl2l1efll1eiml3len_llen3gl3ler_lle2ral2lerzll1imbll1impll1insl2lobel2l1ofll1opfl3lor_l3lorel2l1oul2l3öfll3s2kll2sprllti2mllt5s2l2marclm1auslm1indlm1inslm3stelm3s2zln3are3l2ob_lo2berlob4ril1o2felo2gaulo3h2e2l1ohrlo2k3rl1o2lylo2minlo2n1olo3renlo4skelo2speloss2elo4stelo3thalo3thiloti4o2l3öfelpe2n3l2p1holrat4sl3s2all2sannl3sarel2s1ecl2s1emls1erels1ergl2serhls1erlls2logl3s2pil2sprol3s2pulstab6ls4tafl3stecl3steil3stell4stemls2tiel2stitls2zenlt1a2mlt3andlt1angl3tarblt1artl2t1aultbau1lt3elil5ten_lter3alt2erglt4erölte2thl2t1eul4theiltimo4l2t1ofl4t3ötltra3llt3räult4rielt3roclt3rosl2t3röl2t1umltu2ri4lu4b32l1ufelu2g1alu4g3llu2g3rlug3salug3splu1id_2l1una2l1unf2l1unilu2s1ulu2t1alu4teglu2toplu4t3rl2z3acl3z2anlz2erklz1indlz2wecm2ab4rma2d4rma4d2sma2ge_ma2gebma2gefma2gegma2gekma2gepma2getma2gevma2gew2m1aggma3g4n2m1agomai4se2m1aktmal1akma2lanma2lauma3lermali1emal3lo2malltma2nauman3d2ma2net2mansa2mansä2mansc2mantwmar3g2maro3dma3r2uma2tanma2telma5trimat3semat3sp2mausg4m1ändmä3t4rm2d1ummedie4mee2n12m1eif2m1eig3meistme3lamme2laume2lekme2lermelet42melf_mel2semel5t4mena2bme3nalmen3armen3aumen3glme3normen4skmen2somen3ta2mentnmer2er3merinme2sal4meser2me3shmes2stmeste2me1stome3t2amie3drmi2e1imien3smie2romie4timi2karmi3l2amilch1mild4s2m1impmin2enmin2eumin2ga3min2omi2t1rmit3s2mit5sami5tsumi2t1umk5re_m2m1akm2m1almm1angmm1anzm2m1aumme4namme2samm1inbmm1infmm1inhmm1insmm1intmmi3scmm3stamm3strmmüll1m4nesimode3smo2galmo2k1lmon2s3mon3su2m1opemo2rar2m1orcmor2drmo2rermos4tampf3limpf1ormp3strms3andm4s1efms1erwms1inims1orim2spedm2spotm2sprom4stagm3stelm3s2tims5träm3s2tumt3aremt1eltm2t1eum2t1immtmen2m2t3romt2sprmt1urtmu3cke4m3unfmu4s1amu2s1omut1aumut2stmvoll14n3absna2ch1nach3s4na2drna1f4rna2gemna2h1a3n2aldna2letnal3lanalmo2na2lopnal2phn2als_nal3t4n4amenna3m4n2n1amtnamt4sn1and24n1ang2n1ans2nantrnap2sina2r1an2arle4n3artna3r2unasyl2na3t4hnat4sanat4sc3n2aul4nausb4nausgn2auso4nauss4nausw2n1ä2mnär4s53nä1umnbe2inn2d1akn2danlnd1annnde2sendi2a3ndo2ben2d3ren2drobnd3rolnd3rosn2druind2sornd2spr2n1ebnne3ein4n1ehr3neigtnek3t42n1ele5neleb4nelek4nelemne3lennel4la3ne3lu2n1embn1e2mi2n3emp2n1emsnen3a2n1endgnen3einenen14nengb4nengs4nengtnens4enen3skn1entb4nentn5nentrn1ents4nentzne2n3u2n1epone2posne2ranne2rapne2raun1erbine2reb2nerfü3nergrn2erlin1ermän2ern_ne1rösn2ert_n1ertrne2rup2n1erzne3sanne3skane2s1pne1stanes3tine2tadne2tapn1etatne2taunet3han1e2tunet2zi2n1eupnfalt4nf5linnft4s3ng2absn2g1acn2g1akng2anfng1anzn2g1äln3g2enngen2an3gläsn2glicngrab6ng3ratng3rocngs3panich1s3n2id_nie4n3ni3eneni1eronifes3ni2grenig4spni2kalni2karni3ker4n1imp3n2in_n2in4a4n3ind4n1inhni2nor2n1insn2ins_4ninse4n1int2n1invni2s1eni3se_ni2s1pni3spinis3s4ni2s1uni3t4rni3tscnitts1n2k3adn2k1akn3k2aln2kansn2kausn2k1ärnk4ergnk1inhnk3lennk3lesn2klienk3lunn2k3ronks2eink3s2znk2taknk2tannkt1itnk4topnk2trunmen2snna2ben2nadan2n1annnen3gnn2erhnn2erknne2rönner2znnes1enne4stnn1o2rnn3s2pn2n1ufno2blano2leu3n2opano2radno1rakno3ral3n2os_no2s3pn2ostenost1r2nostvno3tabno2telno3t3hno4thano4thi2n1o2x4n1ö4lnräu3snre3sznrö2s1n2sangn2santn2sausn2s1änns1e2dns1entn2s1epns1erfns1ergn2serhns1ersnsfi4lnsho2fn2simpnsi4tensi2trns2kaln2s1opn4spatn3s2pins4piens3ponn4sprän4spronst1akn3starn3statns4tornstü1bn2s1unns2ungns4unrns4unsn4s3zint3absn3t2alnt1angnt2arbnt1arknt2armn2t1äunte3aunt1ebente3g6n2teignt4enent4ernnt4ersnt4ertnt2hern2t3hon3t4hunti3kln2tinfntini1nt2insn3ti1tnt4lemntmen2nto3ment3recn5trepnt4rign5tropn2t3rünt4saunt2sto3n4tu_ntu2ra2n3umb2n1ums2n3umz3nung_n3ungl2n1uninu4t3rn2z1aun2z1ännzdi1snzi2ganzig4snz1inin2zurkn2z1wan2z1wän2z1wuoa3cheoa3chioa4k1lo4a3lao4a3mi3oa3seo3b2al2o3b2äob3ein2o3b2iob3iteo2b3li2o3bloo2b3reob3s2hob2staocha2boche4boch1eioch3ö2och3teochu2fo2ckarock2erock3szodein3ode2n1odene4ode3sp2o3diaof1a2co2f1eiof2f1a1offizof2f5lof2f3r2o1f1rof4samof2speof2sprof2s1uof2teio2g1abog1alaog1ango2g1eiogi2erog1steohen3sohl3auoh3lecohl1eioh3lemoh3lenoh3lepohls2eoh2n1ooho2laoh1o2poh4rinoimmu4oka2laokale43o2kelok2s1po2l1akolars2ol1aufol4damol1eieol1eisol2fraoli3k4ol2kreol2lakol2lelolo3p2ol1ortol2strol2z1aol2zinom2anwom1arto2m1auo2m1eio3men_o2meruom1erzomiet1om1ingom1orgo4munto2narbon3ausone2n3onens2on1erbon1ergon1eröo3netton3g2lon2i3do4nikro4n1imon3ingonlo2con3n2eo2nokeon1orconsa2gon4samon2sebonse2lonst2hon3t2aoo2k3lo2p3adop3aktopa2leo1pe4nop2f3aop3fahopf3laop1flüopi5a4op5lago2p3le1op3t4or3a2bor4altor2ando2ranhor3arbor3attor1ändor2baror2dauor2deuor2ditor2dumore4aso2r1efor1eigo2reino2rerfor1ethor2fleorf3s42orgetor3g2h2orgiaorgi1eor3gle2o3ric4orie_o3rier4orin1or5ne_or3s4aor2täror2tefor2theor2torort3reo4r3un2o3s2ao3scheo2s1eio3s2hi2os2kl2os2koos3peco3s2poos2seios2s3oos4sonos2s3pos2s3tost1auos4teios2t3hos3tilost3räost3reost3ufo3s2zeo2ß1elota2goo5tarko3tarto2t1auot3augotei4not4em3otemp2ot5helo2t3hiot3hosot1opfoto2rao2t3reot3rinot4spaots2peot2sprot2t3rot4triou1f4lou4le_o3undsou3s2ioviso3owe2r11o2xidöbe2laöbe4liöh3l2eöl2k3löl2naröl2ungönizi1öp4s3tö2r3ecö2r1eiör2ergö2rerlör2f3lö2r1imörner2ör3s2kö2schaö2schlö2schwö2s1eiös2s1cöte4n3pa1f4rpa1k4lpak2topala3tpa2narpa3neipa2neu1pa2nopan3slpa5regpa5rek1park_par2klpar2kr1partn1partypar3z2pa3s2ppat4e2pa5t4rpa3unipä3ckepä2t3hpät3s4pekt4spe2letpe2lexpell2apell4epen3dape4nenpe2n1o3pensi1pensupen3z2per2anper4nape2robperwa4pes3s2p2f1akpf1ansp2fa4rpf3arepf3armp2f1au4p3fe_pf1eimpf1einp3fen_p2fentp3fer_pf2erwp3f2esp2f3läpf3leipf3lie2p1heiphen3dphen3sphi2ka2phthepi3as_pi3chlpiela2ping3s3pinsepi3onupi4pel3pirinpi3t2aplan3gpo2laupo4lorpo1o2bpo1ralpo1raupo4stapo4stäpo2stopos6trpo2t1upp3anlppe2n1p2p1f4p3p2hopp5lanp2p3rap2p3repre2e13preis2p3rer3p4res1prinz2prosspro1stp3steap3stelp3s2tipt3albp4t3ecp4t1eip4telept1in1pto3mept1urspul2sppu2s3t2r3aacra2barrab2blr2aber1r4abi2r3abwra2chura2dam2radapraf3arra2ferra3gle3r2ahmrail4l2r3airra2krera2kro2raktira2la2ral3abr3alar3r4aldral3larall2e2rallgr3alp_2ralper3al3trama3srambi2ra2mer1r2ami2r1amtramt4sr4andar4anderand3sr4aner1rangirani1eran2kr2r1anm2r1anpr2ans_r2ansp2rantr2r3anw3rareirar3f42r3arz2rato_rat2st3raub_rau2mi3rausc2rausgrau2spraut5srä2s1c3rätser2b1abrbal3arba3rerb1artrb1aufrb1echr4belärb1entr3b2larbla2dr2ble_rb3lerrb2linrb4seirb3skarb4stärb3strr1che_r1chenrch1s2rch3sprch3tar3d2acr2d1akr2d1alrdani1rd1antrd1anzrd2ei_rden3drde3rerde3sprdi3a2rdia4lrdo2berd3ratre2altre3at_re3atsre2b1are2b1lreb3ra4rechs2reck_2recki2reditre2hacre2h1ire2h1orei4bl4reifrrei3gareim2p4reingr3eink4reinr4re2ke2r1elbre3lei2r1elf2r1elt4rempfrena2bre3nal3rendiren3drren4gl2rengp2rengsr1ense2rentw3r4er_2r1erbr2erbr2r1erdr2erenr2erki2rerlö2r1ermre2robr2erse2rerspr2erte2rertr2r1erzrer5zer2erzy3r4es_ress2ere1stare2thyreu3g2re3uni2r1eurrewa4rrf1ältr2fentrf3licrf3linrf2s1ärf2s3trf3t4rr2g1ahr2g1akrge4anrge2blr2getor2glanr2gleur2g1obr2gregr2gresr2gretrg3rinrgs4tr3r4he_3r4henrho2i3rib2blri1cha2ridolrie2frriene4rien3srie2nuri1er_ri4ereri2f1ari2ferri2f1orim4scr2i3na2r1indri3n4erine1i2r1infrin2foring3lrin2gr2r1inh2rinitr1innu2r1insrin4sorin2sp2r1inv3risikri4s1pri3t2irit2trr3klaur2klisrk5nebr2k5nurk3räurk3rinrk2s1erk3shirk2tinrk2t3rrk3trark4trirk1unirlös3srl2s1prl3ster3m2agrma2larm1ansrm1anzrm1a2pr2maphr2m1efr2mider2m1imrm3starm3umsrn2andrn3anirn2a2rrn3arern3arirn3eifr4nerfr4nerkr4n1inr2n1opr2n1orrn3s2ärn3s2prn3s2zrn3t2ero2bei3rock_r2o3deroh3na3r2ohrro2madro2mer4ro1nyror3alro2ratro2reiro2r1oror3thro3s2iro3smoro3starost1rro4tagrote3iro2thoro4trirots2orot2taro3t2uro3untrö2b3lrpe2rerrer4srre2strr2n3ar2r3obrr3stur4samprs3anprs3antrsch2lr3schur3schwr2seinrse2n1rs2endrse4ners1erers1erörs1ersrs1erzrs1etars2kalrs2kanrs2kiers2kisr4s1opr4sordr2s3phrs2tecr3stier2stinr2stiprs4tobr4stotr3s4trr3s4türtals1rt1angrt1annrt1antrt1anzr2t1arrte1e2rt4eifr2telfr2temort1ersrt3holrt2humr2t1idr2tinfrto2rirt3recrt3rosrtrü2crt2spart2sprru2ckurude2aruf2s32r1uhrru1insru2m3ar2ums_2r1unar2unde2r1unf2runglrun2kr2r1unl2r1unm4r3untru2r1erus4stru3staru4teiru2t3rrü1benrwun3srz1a2cr5zenerz1engr3z2ofrzug2u3sabetsa3blesach3t2s1ada2s3affsa1f4r3s2al_sal2se2s1alt3s2alz4s1amnsam2tos2an2cs4and_3sang_2s3anh2s3anl2s3anssan4sk2s3anw3s4ar_3s2ara4s3arb3s2ard3s2ars4sartisa4ru24s3ath4s3atlsauri1s3ausw2s1änd3sänge2schak2schao3sche_2schefsch2en3sches4schexschi4es4chim3schis2schmö2schn_2schoxschs2e4sch3tscht2ascht4rsch2up3s4cop3sco4rsda3mese3at_s1echtsee3igseein2se1er_se1erö2s1effse2galse4helse2hinseh3rese2hüb2s1ei_2s1eie2s1eig2seinb4seing2seinh4seink2seinl2seinn4seinr2seinw4s1eis3s2eitse2l1ase3ladsela2gse3lamsel1ec4selem2self_s3elixse2l3ösel3szsel3trs4e3ma2s1emp3s2en_se4nagsen3gl3s2enise4nob3s2enss2ent_s2enti2sentw2sentzse2n3use5refser2ers2erfrs3erfüs2ergr2serhöse2robs2ers_2sersas4ert_s2ertase3rum3s4ervse2selse1stase2tatse1u2n3s2ha_4s3hansho4resi2achsi3enesi1errsi3gnusi2g3rsig4stsi2k1äsik3t42s1immsi3n4a2s1ind2s1infsing1asin3ghsin2gr4s1inhsini1e2s1inq2s1ins2s1int4s1invsi2s1esi2s1osi2s1psi2tausi2tra3skala4skanz3s2ki_3s2kik3skulpsla2vesler3s3s4lipsli4tuslo3be4s5not2s1o2bs1o2he4sohng2s1ohr4so2lyson3auson3säso1ral2s3ordso2rei4s1ostso3unt2s1ö2l2spala2spara4sparo3sparuspe3p4s1peri2sperl2speros2perr4spers3s2pez4spi4p3s2plis3p4lu4s3poss2potts2pracs2pran4sprax2spräm4spräs2spred2spres2sprob4sprüfsrat2ssrö2s1ssa3bos2sanos4sansss2antss3attsse3hass1erös3s2essse3tass1offs2s1opss1oris2spros3stelss4tipss2turss1ums2stabb3s4tad3staff2stale2stalkst1almst1alpst1ami4stan_sta4na3stand2stani2stans2stanws4tar_4staris4tarsst1asis3tat_2stauf2staum3staur2staus4stälts4tänd5stätts3täus4s5te_3s2tegste2gr3s4tehs2te2i3steig4steil1s2tel2stel_2steln2stels4stem_s5ten_st4ens4stermste4sts4teti3s2teu1steue4steufs2t3ho2stie_s2tiegs2tiel2stien3s2tif3s4tims4tinfs3tinnst1ins1stitu2sto3d4stod_s4toffs4t3om2stopo2stor_2store2storg2storis3tort2stose4stote2stöch2strad2strag4strai4strak2stral5straß2strua2strug3struk2strup2st3t43s4tud2stumt2stun_4stunn2stuntstu3rest3url2sturn2s3tus2stüch2stür_2stüre2stürg2stürs3s2tyl3su2b3su2cha2s1u2fsu1it_su2marsu2mau3s2umesu2mels3umfesum1o2su2mors3umsas3umst2s1uni2s1urlsüden24s3zeis2zena4szent4s3zet2ß1e2gße2l1aß2ers_2ßerseßge2bl2t1abb3tabel2taben3table2t3abn2t3abtta3d2s3taf2et1af4rta2ga24ta3gltag4sttah3leta3i2kta1insta1ir_t1a2kata2krotak6ta3taktb3t2al_ta3lagta3lakt1alb_t1albk3t4aletal2löta2mert1amplt1a2na4t2andt3ankl2tanwa2tanwät2anz_t1anzat1anzuta2pe_ta2pes2t1armt1artitar2to2t1arz4t1aspta2tanta2tautat3eita2temtat3heta2tom4tatue2t1auf4taufg4taufnt1ausb3tausct2auset1ausk4tausltaxi1s2t1ältt1ängs3t4ebbte3cha3technteck2ete2ckite2en3te1erwteg3ret3eifr2t1ein4teinf4teinnt3eis_t3eisb3te3letel1eb2telemtel1ente4leute2littell2ete2l1ö3telt4tel3tatel3thte2min2temme2tempfte4m1utena2bte4naste4nauten3dat6endit6endote2nefte2nettens2et4entat3entb4tentdt4ente4tentnten3zwt3e2pi3t4er_tera2bte1rafter3am4terbs4terbtte2relt4erfrte3ria3termi2ternct4ers_terst4ter3zatesa2cte2santesä2cte2selte2sprtes3s2te2tat3teur_2t1exz3t4ha_3thal_4t3hau1t2he_2t3heit4heint4henet4heni2therr3these2t3hil2t3himth4mag2t3hoc2t3hoht4hol_2t3hot1th2r2ti3a2mtiden2ti2deo3tief_3ti2erti2kamti2karti2kinti2kräti2larti2leiti2lel4t1imp3t2in_4t1indti3n2eting3lting3s2t1inj2t1int4t1invti2seiti1sta2ti3tuti2vanti2velti2v1oti2v3rtlung4tnes4s3tochtto4d1utom1e2to2mento2nauto2nehto2pakto2patto2rauto4ränto2relt3orga3torint1ort_3tost4to1sta3to3teto2thotouil44tractt3rad_6trahm5t4rai2trand3trankt3rann3transt3raset3rasi3träne4t5re_tre2brt3recht4reck6t3red5t4ree4trefe4trefot4rei_4treic2treift3reigt3reint3reis6treitt3reiz6t3relt4ren_3trendt3rent2trepe2trepot4reprt4res_3treuh5trieb2triegtri4er5triggt3rind4tringtri3ni4trinn4tripttrizi13t4roitro2ke4trom_tro2mi4troml2t3roo3tropf2t3röttrums15t4ruptru2thtrü1betrü1bu2t3rüct4sa4bt3s2act2s1aht4s3art2s1änts4cort3seiltse2n1t2s1erts1init2s1irt1slalt3spalts1parts2pedt3spekt3s2pit4stagts3takts4talt2stipt4stitts3tocts3tort2strits3türtta2bet2t1adtt2anttt1arttt1ebett1eiftt1eistte2lattel1otte2satte2sätt2häut2t3hott4roctt2sentt2sortt2spett2sprtt2stitu1almtu2chitu3fent3u2kr3t2ume2t3umf2t3umg2t3umk2t3umrtum2situm2so2t3umt2t3umz2t1una2t1und2t3unft3unga2tunif2t3unttu2re_tu2reitu2resturin1tück2s3tür3s3tütentze4n1tz2enetz1erltze2rotz2erst3ze2stzgel2tz1indtz1inttz2tinua2lauu3aletual2mau3a2louara2bu2be2cub3licu2b3luub2sanub2s1oub2spau1cha_uch1eiu3chesuch1iluch1inu2ch3ruch2souchst4u2ckemuder2eudert4udi3enuditi4ue2neruenge4uen2zuue2r3aue2r1äu3erehu3ereru3erexuer3g2uer2neue2r3ouer3scuer3t2u3erumue4teku2f1äsu2f1eiu2f1emu3fen_u2fentuf2ernuf2frouf1oriuf4sinuf2spouft3s2u2g1apu2g1eiug3ladu3g2löug4serug3spaug4sprug4spuug5stäug3strug3stüuhe3s6uh2reruh4rinuisi4nui4s5tukle1iuk2t3ruld2seu2l1elul1erful1erhul1erwule2saul1etaul1insul2lesul2p1hul4samuls2thul4trium1allum1anzu2maut1um3d2umer2aum1ins3umsatum4serum2simu2m1uru3n2amu2n3an2un2asun4dabun4deiun2didun2dorun2d3r4unds_und3spund3stun2ei_un3einunen2tun4es41unget1ungew1unglüun2g1rung3raung3riung4saun3ide1u2nifun3islu3n2it3u2nivun2keiun3n2eunvol2u1or3cu2pf2eu2pf1iu3rabaura2beur2anbur2anhu2r1auur3b2aur1effu2releu4r1epur1erhur1erwur2griurg3s4ur1iniur3insur1int1urlauur3sacur2sanur2sauur2serur4sinurst4rur2z1wus4annu2s1ecu2s1eiu3seiduse1rau2serpu2s1opu2spatus1picus2porus4sezus2sofu1stalus3tauust2inu2stunu2sturut1altut3a2mu2t1apu2t1arute4geut1ei_ut1eieutel1eute2n1u2tentu4t1exu2t3hout1opfu2topsut3reaut3s2aut2s1äut2spaut5t4lutu4reutu5ruut2z1wuve3räüb2s3tücht4eü3ckenück1erü3den_üden4güdwes2ü2f1eiü2h1eiühl1acüh3r2eühr3taü2mentün2fliün2g3lün3strü2r1eiü3r2o1ü2schlüs2s1cü2t1alva2teiva2t3hvatik2va2t3rvat3s4va2t1uveits32ve3muve3nalve3radve3rasver3b2ve4rekve4rinver3stver5te2ve3scves3tivi4a3tvie2w1vi2l1avi4leh2v1i2m2v1intvi3s2ovoll1avol2livo5rigv1steuwab2blwa3chewaffe2wa2g3nwah2liwal4dawal2tawal2towang4s1war2eware1iwart4ewass4e4webebwe2g1awe2g3lwe2g3rweg3s4wei4blwei2gawei3k4wei4trwel2t1wel4trwen3a4we2r3awer2bl1werbu1werduwerer2wer2fl1werk_wer2ka1werkewer2klwer2kuwer2tawer2to1wertswe2s1pwest1awes2thwest3rwes4tuwett3swi3ckawien2ewie2stwim2mawin2drwi3s2e1witzlwo2chawoche4woh2lewo2r3iwo4r3uwört2hwul3sewur2fa1wurstwus3te1wu4t1xe3lei3x2em_xen3s2x1i2doxin3s2xi2so2xis4täx1i2tuxtblo4x2t1eix4tentx2t3evy3chisyloni1y2p1iny1s4tyy2s1u22z3a2b2z3a2k2z1all2z3anf2z3anlz1artizar2tr2z1arzza1st42z3at3z1au2fzbübe32zecho2z1eck2z1effzei3lazeile42z1einzei3s4zeist4zei2trze2lenzell2azel3sz2z1empzens2ezent3sze2r3a2zerhöz2erl_2zerlö2z1erq2z1erzze3skuzes2spzes2stze2s3tze3sta2zettszger2azi3alozi1erhziers1zi1es_2z1impzin4er2z1inf2z1inhzin1itzin2sa2z1invzirk6szi3s2zzi1t2hzor4ne2z1oszz2t1auz4tehezt1inszt3reczu3ckezug1un2z1uhr2z1um_zumen22z1umszup2fizu3r2a2z1url2z1urs2z1urtz2wangz2weigz1weis2z1wel2z1wen2z1werz2werg2z1weszzi1s4"); + put(7, "_al4tei_amt4s3_and4ri_an3gli_angst3_an4si__an4tag_ausch3_be3erb_be3r2e_berg3a_bo4s3k_bu4ser_da4rin_da4te__da4tes_de4in__dien4e_ebe2r1_en2d3r_en4tei_er4dan_er4dar_er4dei_er4der_es5t4e_fer4no_fi3est_fi4le__fi4len_ge5nar_ge3r2a_ge3r2e_ger4in_hau2t1_her3an_ho4met_ima4ge_ka2b5l_li4ve__lo3ver_lus4tr_men3t4_orts3e_pa4r1e_reb3s2_re3cha_rein4t_reli3e_res6tr_sali3e_sim3p4_sto4re_tage4s_ti4me__ti4mes_to4nin_tri3es_ul4mei_urin4s_ur3o2m_ve5n2e_wei4ta_wor4tu_zin4stab1er2raber4ziaber4zoab3essea4cherfa4cherka4cheröach1o2bach2t1oach1u2fa3d2ar3ade1r2aade3s2pade5str2ad3recaf4t5reage4neba4gentuage4ralage4selage2s3pag3esseags4toca2h1erhah4l1eiahner4eahre4s3ahr6tria3isch_ajekt4o1a2k4adak5t4riala5ch2a2l1angalb3einalb3eisal4berh3a2l1efa4l3einal3endsa2l1erfa2l1erha2l1ert3a2lerza2l1eskali4eneali4nalal3lenda2l1o2balt3eigalt3ricalt4stüalzer4zamen4seamp2fa2am4schlana4lin2ana1s4and4artandel4san2d3rüand4sasand3stean2f5laan2g1eian4gerwan2g3raan2k1anan2k3noan2k3rä3antennan3t4heant3rina3ra3lia2r1anga2r1ansa2r1anza2r3appar2b3unaren4seare3r2aa2r1erhar2f3raari3e4nari3erdari3ergarin3itark3amtar2k1arark3aueark3lagark4trear4merkar3m2ora2r1o2dar2r3adarre4n3ar4schla4schecasch3laa2s3e2ma2s1o2fas4s3eia1s4tasas6t3rea2t1aktater3s2ato4mana2t1ortat4schnatt3angat3t4häat2t3räat4zerkat4zerwat2z1inau2b1alauch3taau4ferkaup4terau2s1ahau4schmau4schoaus3erp3aussagaus4se_aus5triau2t1äuä3isch_äl4schlän3n4e2ä2r1eneär4mentäser4eiäse4renäskopf3ät4schlät4schräu4schmäus2s1cba2k1erban2k1aba2r1ambau3s2k2b1eierbei4ge_2b1eimebe1in2hbe2l1enben3dorben4spaben4sprben5t4rber4ei_be4rerkber4in_ber3issbe2s1erb3esst_be3s4ze4b1illubis2s1cb2i3tusbjek4to2b3leidbo2l1anbor2d1ibor2d3rbor2t3rbra1st42b3rat_2b3riemb4schanb6schefb4s1erfb4s1ersbst1a2bb2s3träbs3treubtast3rbu4schlbu4schmbu4schwbügel3eca3s2a3ch3a2bich3anst3chartache4fer4chelemche4ler4chents4chentwche3rei2ch1e4x3chines2ch1invch3leinch4sper2ch1unf4ckense4ckentw4ckerhö4ckerke2ck1err4ckerze2ck1eseck4stro2ck1um3com4te_comtes4cre4mes2d1alar2d1ammädan4ce_dan5kladan2k1odar2m1i2d1au2f2d1aus3delei4gde3leindel4lebdel4leide2l1obdel4sandel2s5edel2s1p4denergden4sende2re2bde4reckder3ediderer4tderin4f4derklä4derneuder3taudert4rades3eltde2sen1de4stredes4tumdeten4tdge4t1edie4nebdi3ens_die2s3cdi2s5tedi4tengd2o3r4ador2f1a2d3rast2d3rauc3d4reck2d3reic3d4riscdrunge3drü5cked4s1amtds3assid4schind2s1e2bd4seinsd2s1engd2s1entd2s1erfd2s1erkd2s1erzd4s1etad3s2kand2s1pard3stell2d1un3ddu4schndu4schrdu4schwe4aler_e3at5t4ebens3eebet2s3eb4scheeb4stätebs3temebs3t2hech1o2bede3n2eeden4seeden4speder3t2ed2s1esed2s3treein4see2f1e2be2f1i2de2f1insege4strehen6t3ehe3strehl3eineh4lenteh5l2erehr1e2cehr3erleienge44eigeno1ei2g3nei3k4laei4leineil3inseim3allei4nengein4fo_ein4fosein4hab3einkomei2n1o23einsate4inverekt4antekt3erfekt3ergela4bene2l3a2me2l1a2re2l1eine3leinee4leing2e3len_e4lensee2l1ente2l1erge2l1errell3ebeell3eiseller4nelt3eng3elternelt3s2kelt3s2pe2m3anfe2m1ansem2d3a2e2m1erw1e2metiem2p3leena3l2ien3d2acend4ortend3romend3s2pene4bene4n1enten4entr4e3ner_e2n1erd1e2nerge2n1erle2n1erre2n1erse2n1erte2n3erue2n1erwe4n3essenge3raeni3er_e2n1i4me2n1o2benob4lee2n1o2ren4terb3entspr4entwetenz3erte4ratemerd3erwer3echser1e2ckere4dite2r1e2h4e3rei_4e3ren_e4rensee4rentne2r3erfe2r1erher3e4tiere4vid3ergebn4ergehäe3ri3k44e3rin_e2r1ini3erlebnermen4serm3erse2r1o2pers4toder4tersert3ins3erweck6erweise4s3atoe2s3einese4lere3s2peke3s2pore3s4praess3erges2s1paestab4be4starb1e2stase1s2tecest3ories3tropeße3r2eeten3d2eter4höeter4tre4traume6t3recetsch3wet2t3auette4n1et4t1umeu3ereieu3g2ereve5r2iewinde3e2z1ennfa4chebfa2ch1ifäh2r1ufeh4lei2f1eing4f1einh2f1einw2fe2lekfe2l1erfel4sohfe4rangfer3erz4ferneufest3eifet2t3afeuer3effel2d1f2f3emifi1er2ffi2l1anfisch3o2f3leinflu4gerfor4teifor2t3r2f5raucf4schanf4scheff4s1ehrf2s1entf4s1etaf3s2kief2s1pasf3s2porf4stechf3s4telf3sternft1a2bef4t1entft4scheft4s3täft4stri2f1u2nifun2k3rfus2s1pfu2ß1er4gangeb2g3ankugas5tangebe4amge4lanzge4lessgel3stegel3t2agen4auggen2d1rgen3eidgen3erngen4samgen4ta_2g1entfge4renggerin4fgerin4tger4satger4stoges3aufges3eltge2s3erges3s2tgien2e12g3isel3g2laub2g1lauf4g3lein4g3lisc2gni2s13g2num_2g3rede2g3reic2g3rein2g3renng3riese2g3ringg4s3a2kg4schefg3s2eilg3s2pekg3s2porgst3entgst3errg4s3torgs4trat4gungew2g1unglguschi5gus4serhaf3f4lhalan4chal4beihal4t3rhar4mes2h1aufmhau4spahäu2s1chba2r3ahe4b1eihe5ch2ehe2f1eihef3ermheiler4heit4s3he2l3auh3e2lekhel3ershel4meihe4n3a2hen3endhen3erg2h3entwher3a2bhe4reck4hereighe4rerwh1er2foherin4fherin4sh3erlauhe2s5trhie4rinhif3f4rhi2l3a4hin4t1ahir4nerhlags4ohle3runhner3eih3nungeho2l1ei2hot3s2hrei4bah4r3eigh3re2s1h2r1etah3rieslhr2s1achr2s3anhr3schlhr2s1enhr4s1inhr4s1ofh2s1achh4schanhse4lerh2s1erlh2s1ingh2s1parhst3alth2s3tauh3steinh5stellhst3ranh3taktsh4t3alth4t3a2mh4t3assh2t1eimh2t1eish4tentfht3erfoht3erfüh2t1erhh4terklht3erscht3ersth2t1erzh4t1eseh4t1esshte3stah4t3rakht3randh2t3rath4t5rinh2t3rolh2t3rosh4t1rösht3spriht4stabhts4tieht4stürh2t1urshu2b3eihu2b1enhu2l3eihu4lenthu2l1inhut4zeni3alenti3alerfi3alerhi3a2leti3a4liai1ät3s4i2b1aufich4speich2t3rieb4stoieb4strie2f1akie2f1anie3g4rai2e2l1aien4erfienge4fien3s2eie3r2erie4rerfi2er5niier4sehier3staier3steies2s3tie2t3hoie4t1ö4i2f3armift3erkif4t3riift3s2pi2g1angi4gefari3g4neuig3steiig4strei2k1a4ki2k1anoi4kanzei2k1erhi2ker2li2k1etaik4leriik2o3p4ikt3erki2l3a2mi4lentsi2l1erfi2l1ergi2l1erril2f3reilig1a2ili4gabi2l1indil3l2eril4mangil2m3atil2z1arilz3erki2m1armimat5scima4turi2m1erfi2m1erzi2m1infi2m1insindes4ii2n1engin3erbei4nerbiiner4löing4sam3inkarninma4leinn4stains3ertin3skanin3stelin4s3umional3aion4spiir2m1eii4s1amtisch3ari3s2chei4schefi4schini2sch1lisch3leisch3obisch3reisch3rui4schwai4schwoisch3wuise3infi4seinti2s1ermi2s1essis4s1aci1s4tati1s4teui1s4tilit3a4reiten3s2iti4kaniti3k2ei2t1in1i2t3ranits1a2git2s1e4its3er1it2s1peit4stafi2v1enei2v1enti2z1enejek4terjektor4je2t1u2jugend3jung3s42k1a2bo2k3a2drka3len_ka4lenskal3eri2k1annakari3es2k1artikau2f1okauf4spke1in2d2k1eiseke4leim2ke2lek2ke3letkel3s2kk3enten2k1ents4kerfahk4erfamk3ergebk3er4hökerin4tker4kenker4neuker4zeu2k1i2dekie2l3o2ki3l2aki3n4o32k1inse4k1lastkle3ari4k3leit2k1o2fekop4fenkot4tak2k3räum2k3redekreier4k4s1amtk2s1ersk2s1erwk3stat4k2t3a2rk2t1erhk2t1ingkti4terk4torgakt3oriek2u3n2akuri4erku4schl4l3aben4l1a2bl2l1a2drla2g1oblan2d3rlang3s4l1a2po2la2r1anla2r1eila4rene3l2ar3glar3ini2l1ar3t3lasserla2t3ralat4tanlat2t3rlau2b3rlaub4se2l1ausslär2m1al2b1edel2b1insld3a2b1ld3a2ckl2d1a2dl2d3a2nld4arm_lecht4ele2g1asleh3r2elein4dulei4ßerleit3s22le2lekle2m1o24lendet4lenerg2l1ennilen4sem2l3entwlent4wäle2r3asler3engle4rers3lergehl3ergen2l1ergilerin4s2l1er2ö3l2erra2l1esellgeräu33lichem3licherliebe4slie2s3clik4ter2l1indulingst4lin2k1ali4schu2l1i4solkor2b1ll1a2bel2l1a2mlle4n3all3endul4lentsl4lerfol4lergoll3erntll3ertrl2l1indl2l1o2rll1ö4sellus5t6l2m3a2blm3einsl2m1e2pl2m1erz2l1o2bllos3t4r2l1ö4l3l2s1a2dl4s1ambl4schinl4schmül2s1e2bl2s1ersl2s1erwl2s1impls3ohnel4t3amel2t3atol2t1eislt4stablt4stocltu4ranluf2t1aluf2t1eluf2t5rlung4sclus4s3alus2s1cluss3erlus2s1olus2s1plus2s3tlus4stälus4t1alust3relut1o2fmach4trma4ges_ma4laktma4l3atma2l3ut2m1analman4ce_man3ers2m1angr4ma3r2oma3s2pa4m1aspemassen3mas4telma1s4trma2ta2b2m1au2fmäu2s1cmbast3emedien3mein4dame1i4so2m1e2miment4spme2r3apme4rensmerin4dmerin4tmerz4en4m1essames2s1omes2s1pme4t3römierer4mil4cheminde4sming3s4mi4schami4schnmi4schwmis2s1cmi2s5tem2m1ansmme4linm4mentwmme2ra2mme4recmmi1s4tmo4n1ermor2d3amoster4mpf3erpmpf3errms5trenm2t1erfm4t1ergm2t1erlm2t1ersm2t1ertm4t1etam2t1insmt3s2kamun2d1amül4lenmütter3na3chenna2l1a2na4lent4n1a2nana4schw4n1a2synauf4frn4austenbe3r2en3ce2n3n2d1anznde4al_nde4lännde4robn2d3ratn4d3runnd4stabnds3taune2e2i22ne2he_2nehen44n3eing4n3eink3ne3l2o4n1endb4n1endd4n1endf4n1endh4n1endk4n1endp4n1endt4n1endwne4nenenen4ge_nen4gen4n1entl4n3entwne2ra2bne3r4alne2r3am4nerbe_4nerben4n5erfonerfor42n3erhö2n1erlöner4mit4n1ernt3n2ers_2n3ersa4n3essine2t1akne2t1annett4scnfi4le_n2g3a2mn2g1andn2g1einnge4ramnge4zänn2g1i2dn3g2locngs5trinie3l2a3n2ing4ni4schwnitt4san4k3algn2k1insn2k1ortnk2s1aln4n1alln4nentsn2n1unfn2o3ble2n1ob2s2n3o2fenor2d5rno4t3eino2t3inno2t1opn2s1a2dn2s1alln2s1äusn6schefn4schronsen4spn2s1erkn2s1erön2s1erwn2s1erzn4s1etan2s1inin4sperin4stat_nst3eifn3stemmns4tentnst4erön4stracn4strien3t2a3cn4tanzan2t1eisn4t1essn2t1inhnton2s1nt3reifnt3riegntu4re_ntu4res1n2ung4n2z1a2gn4zensen4zentwn4zentznz3erwe2o3b4enoben3d4oben3seobe4riso2ch1ecocher4ko3d2e1iof2f1inoge2l1io2h1eiso2h1erto2h1erzoh4lergoh4lerwo3isch_ol2l3auoll1e2col2l1eiol4lerkoma4nero3m2eiso2m1indo2m1into2n1erdon3n2anont3antont3erwon4t3riop4ferdopi3er_o2r3almor2d3amor2d1irord3s2to4rientor2k3aror4mansor4mentor3n2o1oro3n2aor2t1akor4t1anor2t1auort3eigort3erfor2t3evort3insor4trauort3ricor2t1umo4sentsoss3andost1a2bos4t3amost3angos3tarros4ta4soster3eos4t1obost3ranost3roto2ß1enzo2ß1ereo2ß1erfo3t2e1iote2l1aote4leio2t1erwo2t1i2mot4terkoun4ge_our4ne_ozen4taöchs4tuögen2s1öl2f1eiö2r1e2lö3r2erzö2r1uneö2sch3mpa2r3afpar3akt2par2erpar4kampar4kaupe2l1a2pe3li4npe3n2alper2r1a2ph1erspil4zerpingen4pi2z1in3ple5n4po2p3akpo2p3arpor4tinpor4trepor6tripo2s3tepost3eipost3rap2p3a2bppe4lerp4t1entpt3ereip4t1erwp4t1erz2r1acetra4chebra4chinracht3rr3a2d3r3ra1k4l2r3alm_r4alt2hram4manram4m3uram2p3lran4dep4r3aneiran4spara2r1inra4schl2r3asph2r3attarau3e2nrau4man2raus5srbe3r2erchst4rr2d1elbrden4glrder4err2d1innre3alerrech3ar3reigewrei3l2arei3l2irei3necre1in2v2re2lek2r1entl2r1ents4r3entzr4ergen2r1ernä4r3erns4r3ernt3r2ers_2r1ersare2s2tu2r3evid2r3e2x1rfi4le_rfolg4srf4s1idrf2s3prr2g1a2drge4ralrge4taprgi4selr2g3ralrg5s2turi2d3anri3ers_ri3estiri2f1eirif4terri4generin4dexrin4diz4rinnta3r4ins_r4inspirin4tegrin4t5rri4schori4schwr3i2talr2k3reark4stecrkt3ersrk2t1o2rl2s3tor2m1aldr2n1anzr4n3eisr4n1enern3enser4n1ergrn4erhir4n1ertrol4lanro4nerbron4tanros2s1crre4aler2s1a2dr4s1amtr2s3angr3sch2er4stantrs4temprs4terbrst3ingrst3ranr2t1almrt3a4rer2t3attrtei3lartei1s4rten3s2rt3ereir4terfar4terfor4t3erhr2t1erkrter4rerte3s2kr2t1imar4t3rakr4treisrt4s1ehr2t1urtru3a2r3ruch3strun2d1arund3er2r1u2ni4r3uniorus2s1pru2t1o2rve4n1er2z1erfr2z1ergr2z1erkr2z1erwrz2t3ror3z2wecsa2cho22s1a2drsa4gentsa3i2k1sa2l1ids3ameri6s1amma2s3a2nasan4dri4s3antr4s3a2sy2s3aufb2s3ausb3s2ausesbe3r2es4ch2al4schanc4schangsch3ei_4schemp4schess4schiru4schle_sch6lit4schre_4schrinsch3rom4schrousch3s2k4schunt4schwetsch4wilsdien4e2s1echo2s1e2ckse2e1i4se2h1a2se4h1eise4herk5s4ein_sein4dusei3n2esein4fos4eins_4seinsp4seinstsel3ers2s1endl4s1entf2s3entg2s1entsser3a2dse2r3als3erbe_s3ereig2s1erfo4serfül4serken2s3ernt4s3eröf4sersehse4r1ufse3rund4se4tap4s1e2thsi3ach_siege4ssi2g1a2si2k1absik3erlsin3g4lsing3sasi4schuska4te_4skategska4tes4s3klassni3er_sni3ersso4l3eisol4lerson2s1o2s1orga5s2orgeso2r1o24s1o2ve4spensi3s2pi4e4spier43s4prec3sprosssrat4scss1a2cks4s1alas4s1albs4s3amts4s3angs4s3anzs3sa1s2s2s1egasse3infss3ersessquet4s3ta3li4s3tann3staus_st3a2ve4stechn3steilhstei4naste4mar6s5ter_3sterncs4t3ese3s4tett1s2ti2rst1i4sosto3s2t1s4trah4strans3s4tras4straum4s5träg4sträne4s5tref4streibst3renn2s4trig2s5trisst3rollstro4ma4st3run2s4t3s42stum2sstum4sc3s4tunds2t3uni2s3tuns2st3urtsuch4st3s4zene2ß1estrßi2g1a2ta2b1anta4bend2t1a2drta2g1eitahl3sk3t2aktuta4lensta2l1optan4gar2t1anme4t1anna3t2ans_4t3ansi4t3anspta4rens3t4a3rita2ta2bta2t3erta2t1um4t3ausg4t3auss4t1auswtbauer4tbe3r2e4teilhet3einget3einlate2l3abte2l1acte2l1autele4bete4l1ecte4l1ehte4leinte4lerd4t3elf_te2l1inte4losttel3s2kte2m1ei3temperte4na2dte4na2g4t3endf4t1endl4t3endpten3d4rten3eidten3ens4tenerg4t1eng_ten4glate4n3in4tensem4t3entw4t3entzte3ran_te2re2bter3endte4rengte4rerkterer4z4terfol4terfül3ter3g2t6ergru4terklä2t1erlöter4mert3erneuter4re_ter4sert4erst_t4erstit4erstute4r1ufter4wäh2t3erzbtes3tantest3eitestes4teu3ereteu3eriteu2r3a2t3e2xe2t1e2xi4thrin_4thrinsti4dendti3e4n3tie4recti4gerzti2ma2gtim2m1atin2g1at1in1ittin2k1l3t2ins_4t1inseti4que_ti4schatisch3w3ti3t2etle2r3atmen6t3tmo4desto2d1ertor3inttra3chatra4demtra4far2t3rams3t4ran_tre4ale3t4reib2t3reih4trenditre2t3r2t3rund3t4runkt3s2chat4schart3sch2et4schefts4chemtsch4lit4schrot2s1e2bt4seindt2s1engt2s1entt2s1i2dts4paret3s2pont3s2port4spreits3tätit2s3tepts3tradt4strants3traut2s3trät4streut4stropt2s3trütte4lebtte4lent3u2fertums5trtung4s5tu2r1ertu4schlt2z1e2ct2z1eiet2z1eistz3entsubal3l2ubi3os_u2b3rituch4spruch4toruch2t3ru4ckentu3ck2eruden3s2ue3reigue4rergue4rerku4erinnuer4neru3erunfu3eruntu2f1ä2ßu2f1erhu4ferleufs3temuf2t1ebu4gabteu2g1erfu2g1erlugge4stu2g3rüsu3isch_u3ischsuk2t1inulm3einu2m3a2ku2m1artu2m1ausument4su2m1ergu2m1erlu2m1erwumpf4lium2p3leum2s1peun2d1umun2k1a2unk4titunk2t3run2n3aduns4t1runte4riunvoll3up4t3a2upt3ergu2r3a2mu2r1anau2r1angurgros4ur3s2zeu2s1eseusi3er_us3partu2s1pasu3s2peku5s4pizust3abeu5strasus6trisute4leiuter4eruto4berut4schlut4schmut4schöutz3engut2z1inüch2s1cück3eriü4ckersück4speü3d2ensü2f1ergü2h1engü2h1erkü2h1erzühr3ei_ül2l1eiün2f1eiü2r1entüste3neva2t3a4va4t1inve4l1auvenen4dve3rand2ve3s2evid3s2tvie2h3avie4recvi2l1invollen4vormen4waffel3wah4lerwalt4stwar3stewa4schawä3schewe3cke_we3ckeswei3strwer4gelwe4r3iowest3eiwest1o2wim4m3uwolf4s3wol4lerwor2t3rxi2d1emx2t1e2dxtra3b4x2t3rany2l3a2myl4antezei2t1aze2l1a2ze2l1erze2l1inzel3t2hze4n3aczen4semzen4zerze2re2b2z1ergäz3erhalzerin4tzer4neb2z1ersazert1a2zert4anzer4tin4zerwei3z2erzazessen4zger4s1zin4ser4zinsufzon4terz3t2herzu2g1arzu4gentzwan2d1"); + put(8, "_al1e2r1_al5l4en_anden6k_ar4m3ac_ar4t3ei_ber6gab_ber4g3r_de3r4en_einen6g_en4d3er_en5der__er4zen4_ka4t3io_lo4g3in_mode6ra_ost5end_oste6re_par3t4h_richt6e_sucher6_tan4k3la2ch1e2ca4ch3erwacht5ergach6tritack3sta43a2er2o1af4t3erlage4s3tiah4l3erhal4b3erw3a2l1e2bal2l3a4rall5erfaalli5er_al4t3erfam4t3ernand6spas3a4n1erban4g3erfan4g3erlan4g3erzang4s3poani5ers_an2t3a4ran2z1i4nar4t3ramau5ereinau4s3erwauster6mau4ten4gau4t3erhäs4s3erkbach7t4ebal4l3ehbe4r3eiwber6gan_ber3st4abe6steinbe4s3tolbote3n4ebst5einbbu4s3chach3e4ben6chergebcher6zie6ckergeb4d3achse2d1an3d22d1e4ben3d2e1i2mde2l1a2gde4l3augdel5sterde4n3endden4k3li4den4semde4r3eisde3r4erbde3r4erfde4r3ero4d3erhöh4d3ersatdest5altdest5ratdienst5r2d1in1it4d3innerdi4t3erldi4t3ermdi4t3ersd4s3tätid3s4tern2d1u2m1edu4sch3le3a4reneech3t4eiege4n3a2eg4se4r1ehr6erleei4b3uteei4d3errei2m1a2gein6karnein6stalei6schwuei4s3erwek4t3erzeld5erstel4d3erwe4ler4fae4ler4lae4l3ernäe4l3e4taelgi5er_elgi5ersel4l3einemen4t3he6mentspen4d3esse4n3ermoeni5ers_en5sch4eenst5alten4s3täten4t3rolen4z3erfen4z3ergen4z3erke2r3a4sie4r3eis_e4r3entferi3e4n3er6tereier4t3erfess4e3rees4t3enges4t3erhes4t3essestmo6deet4z3enteue6reifeut6schnfacher5ffal6schafal6schmfe4r3anzfrach6trf4s3tätif4s3tresf4s3tütef4t1e4tift4s3tanfzeiten6gas4t3el2g1eise2gel4b3ragel4b3rogel6dersge4l3ers4g3ereigge4ren4sge4r3entge4s3terglei4t5rgrammen6gros6selg3s4tatigs4t3rosgu4t3erhhaft4s3phal6lerfhau3f4lihau5steihau6terkhe4f3inghel4l3auhe2n1e2bhe4r3eishe4r3o4bhfel6lerhich6terho6ckerlhol6zeneh6rerlebh3s4terbh3t4akt_h4teil4zh4t3elith4t3entsht5erkenh6terneuh4t3erreh6terstaht6ersteht6raumeht4s3turhu4l3enghut4z3eria4l3ermie4n3a2gie4n3ergienst5räie4r3erziesen3s4ie4t3erhie4t3ertiker6fahi3l4aufbim4m3enti2n1e2bei4ner4trin2g1a2gin4n3ermin4s3tätir4m3untir4sch3wi4sch3eii5schingi6schwiri4s3etatiso6nendis4s3cheit4z3ergjah4r3eika4n1a4s6kantennkehr4s3o4ken4gagken5steiker6gebnkerin6stk3er4lauk3er4lebk6erlebe2k1er2zikeu6schlkor6dergkre1i2e4k4s3tanzk4t3erfolan2d3a22lat2t1alat4t3inl2d1e2seleben4s3lei6nerble4n3end5lentwet4l3ereigle4r3eim3l4ergew6lerwerbli4g3ers2l1in1itl6lergebl6lergen2l1or3g2l4s3ort_l4s3tätils6ternels6ternsl4te4leml4t1e4skl2t1o2rilu2g1e2blus6serflus6serklus6serslu4t3ergl2z1u4femagi5er_magi5ersmar6schmmar6schrma4t3erdmen6tanz4m3entwi4m3ergänmes6sergmp4f3ergmp4f3erz4m3ungebmu4r1u2fnacht6ra4n3a2mernavi5er_navi5ersn4d3entsnder5stene2n1e2bn4g3erseng4s3e4h2n3i2gelni4k3ingn4k3erfanseh5eren4s3ort_n4s3prien4s3tatens6terbenst5opfenten6te_nt4s3parober3in4ode6rat_ode6rateoh4l3erholl5endsoll5erweol4z3ernonderer5on4t3endopf5erdeopi5ers_or4d3engo2r1e2ckorsch5lior4t3entor4t3ereor4t3offor4t3räuos4s3enzo2ß1en2kö4sch3eipargel6dpä4t1e2hpä4t3entpe4l3inkp2f1in3spos4t3agrach6trärali5er_rali5ersran4d3errau4m3agräu5scher2b1a2der4b3lastrch6terwrderin6sr4d3erntrege4l3äre4h3entreister6re4n3end4r3erken4r3erlaurge4l3errgen4z3w4r3innerrkstati6rk4t3engrk4t3erfrk6terscrk4t3erwr2m1o2rirn3e4benrol3l4enrpe4r3inr6scherlr4s3ort_r6strangr4t3erler4t3ernäru6ckerlrun6derlrun6dersrun6derwr4z3entssa4l3erbsat4z3en6schlein2s1e2bense4l3erl4s1e2pos6sereignse4r3eimse4r3enk2s1i2deoson5ende2s1o2riesrücker6sse3in4tstel4l3äs4t3endss4t3engls4t3entfste6rersstes6se_5st4reif1s4tri2ksun6derhtan6zerhta4r3eretau3f4litau6schrtau6schwtblock5e4t1e2bentein3e4cte2m1o2rte2n1e2bte3n4ei_ten4t3riten6zerh4t3erde_te4r3eif6tergreiter4n3art6erscha6terwerbtes6terkti4v3erlto6ckenttrücker6t4s1amt4t4s3esset3s4terotta6gess2t1u2niotu2r1a2gtu2r1e4tu2ch1e4cu3erin4tuern3s4tu4g3reisun4d3erfund5erhau2r1an5sur3a4renu6schentusch5werusi5ers_u4t3ersaüge6leiswach6stuwach4t4rwahl5entwandels6we5cken_wein4s3aweis4s3pwel6schlwel6schrwel4t3a2wen4k3ri5werdensxpor6terx2t1er2fx2t1il2l2z1e2benzeit5endzei4t3er4z3ergebzer4n3ei4z3erstezer4t3agzer6terezer6trau"); + put(9, "_char8me__er8stein_he6r5inn_men8schl_men8schw_os5t6alg_rü6cker6_wort5en6_wor8tendach8traumalli7ers_allkon8tral5s6terbausan8ne_äh4l3e4be6b5rechtebs3e4r3inchner8ei_dampf8erfden6s5taue6ch5erziee4r3en4ge6l5eier_erg3el4s3fal6l5erk6fel6ternfor4m3a4gforni7er_fzei8tendgot6t5erggrab8schegren6z5eihä6s5chenhe6rin6nuherin8terh6l3er4näh6t5erspaieler8gebi2k1e2r2eil4d3en4ti4sch3e4hkamp8ferfke6rin6nulan6d5erwlan6d5erzleis6s5erlepositi86mel6ternmorgen5s65n2en3t2aner8schlenich8tersn4n3er4wano6t5entrnsch7werdn5s6ternen5s6ternsos4s3en4kpapieren8ram6m5ersr8blasserres6s5erw6r5innenmris6t5ersr6st5eingrs4t3er4wr4t3er4lasfal6l5erspani7er_sse6r5atts4s3e4strsu6m5ents4t3a4genttblocken8tes6ter6gür4g3en4gvati8ons_vol6l5endwer6t5ermwin4d3e4czes6s5end"); + put(10, "_er8brecht_os8ten8deder6t5en6deren8z7endgram8m7endhrei6b5e6cos6t5er6werein8s7trewel6t5en6dwin8n7ersczge8rin8nu"); + put(11, "_er8stritt__spiege8leiach8träume_lei8t7er8scpapie8r7endpiegelei8en"); + put(12, "ach8träumen_7sprechende_"); + put(13, "_er8stritten_"); + } + }); + public static final HyphenPattern EN_US = new HyphenPattern(2, 3, new HashMap() { { From 7abcfdf81145f12f35d7cf550f6c9d26cd1d2492 Mon Sep 17 00:00:00 2001 From: JackLauu Date: Sat, 16 Apr 2016 13:35:56 +1000 Subject: [PATCH 13/34] fix issue #105 Update project to lattest version, android studio 2.0, api 23 fix issue #105. --- build.gradle | 2 +- library/build.gradle | 6 +++--- .../com/bluejamesbond/text/SpannableDocumentLayout.java | 4 +++- sample/build.gradle | 6 +++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 6356aab..cb98401 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:2.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/library/build.gradle b/library/build.gradle index 4f240c8..1017071 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -29,11 +29,11 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion 23 + buildToolsVersion '23.0.3' defaultConfig { minSdkVersion 8 - targetSdkVersion 21 + targetSdkVersion 23 versionCode 2 versionName '2.0' } diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 2fecab4..5e07cda 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -364,7 +364,9 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) } // FIXME: Space at the end of each line, possibly due to scrollbar offset - LinkedList tokenized = tokenize(textCpy, start, end - 1); +// LinkedList tokenized = tokenize(textCpy, start, end - 1); + // FIXME: 2016/4/16 Issue #105 bug + LinkedList tokenized = tokenize(textCpy, start, end); // If one long word without any spaces if (tokenized.size() == 1) { diff --git a/sample/build.gradle b/sample/build.gradle index 2df703b..bafda9e 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -53,12 +53,12 @@ android { } } catch (Exception e) { } - compileSdkVersion 21 - buildToolsVersion '21.1.2' + compileSdkVersion 23 + buildToolsVersion '23.0.3' defaultConfig { applicationId 'com.bluejamesbond.text.sample' minSdkVersion 8 - targetSdkVersion 21 + targetSdkVersion 23 versionCode 9 versionName '4.5' } From 1fe1cec0d5e9a57887a601e4307bd9130054b897 Mon Sep 17 00:00:00 2001 From: Franklin Wang Date: Mon, 18 Apr 2016 06:05:05 +1200 Subject: [PATCH 14/34] Fix max lines being exceeded (#115) The max lines check at line 104 isn't sufficient because multiple lines can be parsed in one go before the next check is conducted. --- .../java/com/bluejamesbond/text/StringDocumentLayout.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java index e0676cb..2ab0323 100644 --- a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java @@ -191,7 +191,11 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) // Next line lineNumber++; - // Chcek cancelled + if (lineNumber >= params.maxLines) { + break main; + } + + // Check cancelled if (cancelled.isCancelled()) { done = false; break; @@ -573,4 +577,4 @@ public LineAnalysis(int start, int end, float remainWidth) { this.remainWidth = remainWidth; } } -} \ No newline at end of file +} From 3f1f0dc62e42537568be6b91e9229f5c912f3657 Mon Sep 17 00:00:00 2001 From: bluejamesbond Date: Tue, 19 Apr 2016 18:55:11 -0500 Subject: [PATCH 15/34] Houskeeping --- .travis.yml | 9 +- README.md | 2 +- gradle.properties | 4 +- gradle/wrapper/gradle-wrapper.properties | 4 +- .../text/ConcurrentModifiableLinkedList.java | 136 +++++++++--------- .../java/com/bluejamesbond/text/Styled.java | 27 ++-- .../text/hyphen/DefaultHyphenator.java | 8 +- .../text/util}/ArticleBuilder.java | 2 +- .../sample/test/ChineseCharacterTest.java | 106 +++++++++++++- .../text/sample/test/ClickableSpanTest.java | 2 +- .../text/sample/test/ImageSpanTest.java | 2 +- .../sample/test/LeadingMarginSpan2Test.java | 2 +- .../sample/test/LongFormattedTextTest.java | 2 +- .../text/sample/test/MixedRTLTest.java | 2 +- .../text/sample/test/QuoteSpanTest.java | 2 +- .../text/sample/test/RTLTest.java | 2 +- .../sample/test/ShortFormattedTextTest.java | 3 +- 17 files changed, 203 insertions(+), 112 deletions(-) rename {sample/src/main/java/com/bluejamesbond/text/sample/helper => library/src/main/java/com/bluejamesbond/text/util}/ArticleBuilder.java (97%) diff --git a/.travis.yml b/.travis.yml index bd3f390..6241e8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,11 @@ language: android android: components: - - platform-tools - - android-16 - - build-tools-21.1.2 - - extra + - tools + - build-tools-23.0.3 + - android-23 + - platform-tools + - extra-android-m2repository jdk: oraclejdk7 diff --git a/README.md b/README.md index 3432726..4bebfc6 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ For examples, tests, and API refer to the [Android-TextJustify Wiki](https://git Just add to your `build.gradle` ```gradle dependencies { - compile 'com.github.bluejamesbond:textjustify-android:2.1.1' + compile 'com.github.bluejamesbond:textjustify-android:2.1.6' } ``` diff --git a/gradle.properties b/gradle.properties index 521297c..1a366ea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=2.1.1 -VERSION_CODE=23 +VERSION_NAME=2.1.6 +VERSION_CODE=27 GROUP=com.github.bluejamesbond POM_DESCRIPTION=Android Text Full Jusiftication diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca46166..ab1cff5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Nov 25 01:23:33 CST 2014 +#Sun Apr 17 18:55:46 CDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java index 1561cdd..5e6619e 100644 --- a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java +++ b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java @@ -8,13 +8,13 @@ import java.util.NoSuchElementException; /** - * Linked list implementation of the List interface. Implements all + * Linked list implementation of the List interface. Implements all * optional list operations, and permits all elements (including - * null). In addition to implementing the List interface, - * the LinkedList class provides uniformly named methods to - * isCancelled, remove and insert an element at the + * null). In addition to implementing the List interface, + * the LinkedList class provides uniformly named methods to + * isCancelled, remove and insert an element at the * beginning and end of the list. These operations allow linked lists to be - * used as a stack or Queue.

+ * used as a stack or Queue. * * @param the type of elements held in this collection * @author Josh Bloch @@ -107,8 +107,8 @@ public void addFirst(E e) { /** * Appends the specified element to the end of this list. - *

- *

This method is equivalent to {@link #add}. + * + * This method is equivalent to {@link #add}. * * @param e the element to add */ @@ -118,11 +118,11 @@ public void addLast(E e) { /** * Appends the specified element to the end of this list. - *

- *

This method is equivalent to {@link #addLast}. + * + * This method is equivalent to {@link #addLast}. * * @param e element to be appended to this list - * @return true (as specified by {@link Collection#add}) + * @return true (as specified by {@link Collection#add}) */ public boolean add(E e) { addBefore(e, header); @@ -148,8 +148,8 @@ public void clear() { /** * Returns the index of the first occurrence of the specified element * in this list, or -1 if this list does not contain the element. - * More formally, returns the lowest index i such that - * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), + * More formally, returns the lowest index i such that + * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), * or -1 if there is no such index. * * @param o element to search for @@ -177,8 +177,8 @@ public int indexOf(Object o) { /** * Returns the index of the last occurrence of the specified element * in this list, or -1 if this list does not contain the element. - * More formally, returns the highest index i such that - * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), + * More formally, returns the highest index i such that + * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))), * or -1 if there is no such index. * * @param o element to search for @@ -212,7 +212,7 @@ public int lastIndexOf(Object o) { * this list, and it's nonempty.) * * @param c collection containing elements to be added to this list - * @return true if this list changed as a result of the call + * @return true if this list changed as a result of the call * @throws NullPointerException if the specified collection is null */ public boolean addAll(Collection c) { @@ -220,13 +220,13 @@ public boolean addAll(Collection c) { } /** - * Returns true if this list contains the specified element. - * More formally, returns true if and only if this list contains - * at least one element e such that - * (o==null ? e==null : o.equals(e)). + * Returns true if this list contains the specified element. + * More formally, returns true if and only if this list contains + * at least one element e such that + * (o==null ? e==null : o.equals(e)). * * @param o element whose presence in this list is to be tested - * @return true if this list contains the specified element + * @return true if this list contains the specified element */ public boolean contains(Object o) { return indexOf(o) != -1; @@ -239,14 +239,14 @@ public boolean contains(Object o) { * Removes the first occurrence of the specified element from this list, * if it is present. If this list does not contain the element, it is * unchanged. More formally, removes the element with the lowest index - * i such that - * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))) - * (if such an element exists). Returns true if this list + * i such that + * (o==null ? isCancelled(i)==null : o.equals(isCancelled(i))) + * (if such an element exists). Returns true if this list * contained the specified element (or equivalently, if this list * changed as a result of the call). * * @param o element to be removed from this list, if present - * @return true if this list contained the specified element + * @return true if this list contained the specified element */ public boolean remove(Object o) { if (o == null) { @@ -279,12 +279,12 @@ public int size() { /** * Returns an array containing all of the elements in this list * in proper sequence (from first to last element). - *

- *

The returned array will be "safe" in that no references to it are + * + * The returned array will be "safe" in that no references to it are * maintained by this list. (In other words, this method must allocate * a new array). The caller is thus free to modify the returned array. - *

- *

This method acts as bridge between array-based and collection-based + * + * This method acts as bridge between array-based and collection-based * APIs. * * @return an array containing all of the elements in this list @@ -305,27 +305,27 @@ public Object[] toArray() { * in the specified array, it is returned therein. Otherwise, a new * array is allocated with the runtime type of the specified array and * the size of this list. - *

- *

If the list fits in the specified array with room to spare (i.e., + * + * If the list fits in the specified array with room to spare (i.e., * the array has more elements than the list), the element in the array - * immediately following the end of the list is onUpdate to null. + * immediately following the end of the list is onUpdate to null. * (This is useful in determining the length of the list only if * the caller knows that the list does not contain any null elements.) - *

- *

Like the {@link #toArray()} method, this method acts as bridge between + * + * Like the {@link #toArray()} method, this method acts as bridge between * array-based and collection-based APIs. Further, this method allows * precise control over the runtime type of the output array, and may, * under certain circumstances, be used to save allocation costs. - *

- *

Suppose x is a list known to contain only strings. + * + * Suppose x is a list known to contain only strings. * The following code can be used to dump the list into a newly - * allocated array of String: - *

+ * allocated array of String: + * *

      *     String[] y = x.toArray(new String[0]);
* - * Note that toArray(new Object[0]) is identical in function to - * toArray(). + * Note that toArray(new Object[0]) is identical in function to + * toArray(). * * @param a the array into which the elements of the list are to * be stored, if it is big enough; otherwise, a new array of the @@ -378,7 +378,7 @@ public void add(int index, E element) { * @param index index at which to insert the first element * from the specified collection * @param c collection containing elements to be added to this list - * @return true if this list changed as a result of the call + * @return true if this list changed as a result of the call * @throws IndexOutOfBoundsException {@inheritDoc} * @throws NullPointerException if the specified collection is null */ @@ -421,19 +421,19 @@ public E get(int index) { /** * Returns a list-iterator of the elements in this list (in proper * sequence), starting at the specified position in the list. - * Obeys the general contract of List.listIterator(int).

- *

+ * Obeys the general contract of List.listIterator(int). + * * The list-iterator is fail-fast: if the list is structurally * modified at any time after the Iterator is created, in any way except - * through the list-iterator's own remove or add + * through the list-iterator's own remove or add * methods, the list-iterator will throw a - * ConcurrentModificationException. Thus, in the face of + * ConcurrentModificationException. Thus, in the face of * concurrent modification, the iterator fails quickly and cleanly, rather * than risking arbitrary, non-deterministic behavior at an undetermined * time in the future. * * @param index index of the first element to be returned from the - * list-iterator (by a call to next) + * list-iterator (by a call to next) * @return a ListIterator of the elements in this list (in proper * sequence), starting at the specified position in the list * @throws IndexOutOfBoundsException {@inheritDoc} @@ -493,7 +493,7 @@ private Entry entry(int index) { /** * Retrieves, but does not remove, the head (first element) of this list. * - * @return the head of this list, or null if this list is empty + * @return the head of this list, or null if this list is empty * @since 1.5 */ public E peek() { @@ -518,7 +518,7 @@ public E element() { /** * Retrieves and removes the head (first element) of this list * - * @return the head of this list, or null if this list is empty + * @return the head of this list, or null if this list is empty * @since 1.5 */ public E poll() { @@ -542,7 +542,7 @@ public E remove() { * Adds the specified element as the tail (last element) of this list. * * @param e the element to add - * @return true + * @return true * @since 1.5 */ public boolean offer(E e) { @@ -553,7 +553,7 @@ public boolean offer(E e) { * Inserts the specified element at the front of this list. * * @param e the element to insert - * @return true (as specified by {@link Deque#offerFirst}) + * @return true (as specified by {Deque#offerFirst}) * @since 1.6 */ public boolean offerFirst(E e) { @@ -565,7 +565,7 @@ public boolean offerFirst(E e) { * Inserts the specified element at the end of this list. * * @param e the element to insert - * @return true (as specified by {@link Deque#offerLast}) + * @return true (as specified by {Deque#offerLast}) * @since 1.6 */ public boolean offerLast(E e) { @@ -575,9 +575,9 @@ public boolean offerLast(E e) { /** * Retrieves, but does not remove, the first element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the first element of this list, or null + * @return the first element of this list, or null * if this list is empty * @since 1.6 */ @@ -589,9 +589,9 @@ public E peekFirst() { /** * Retrieves, but does not remove, the last element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the last element of this list, or null + * @return the last element of this list, or null * if this list is empty * @since 1.6 */ @@ -603,9 +603,9 @@ public E peekLast() { /** * Retrieves and removes the first element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the first element of this list, or null if + * @return the first element of this list, or null if * this list is empty * @since 1.6 */ @@ -617,9 +617,9 @@ public E pollFirst() { /** * Retrieves and removes the last element of this list, - * or returns null if this list is empty. + * or returns null if this list is empty. * - * @return the last element of this list, or null if + * @return the last element of this list, or null if * this list is empty * @since 1.6 */ @@ -632,8 +632,8 @@ public E pollLast() { /** * Pushes an element onto the stack represented by this list. In other * words, inserts the element at the front of this list. - *

- *

This method is equivalent to {@link #addFirst}. + * + * This method is equivalent to {@link #addFirst}. * * @param e the element to push * @since 1.6 @@ -645,8 +645,8 @@ public void push(E e) { /** * Pops an element from the stack represented by this list. In other * words, removes and returns the first element of this list. - *

- *

This method is equivalent to {@link #removeFirst()}. + * + * This method is equivalent to {@link #removeFirst()}. * * @return the element at the front of this list (which is the top * of the stack represented by this list) @@ -663,7 +663,7 @@ public E pop() { * does not contain the element, it is unchanged. * * @param o element to be removed from this list, if present - * @return true if the list contained the specified element + * @return true if the list contained the specified element * @since 1.6 */ public boolean removeFirstOccurrence(Object o) { @@ -676,7 +676,7 @@ public boolean removeFirstOccurrence(Object o) { * does not contain the element, it is unchanged. * * @param o element to be removed from this list, if present - * @return true if the list contained the specified element + * @return true if the list contained the specified element * @since 1.6 */ public boolean removeLastOccurrence(Object o) { @@ -729,10 +729,10 @@ public Iterator descendingIterator() { } /** - * Returns a shallow copy of this LinkedList. (The elements + * Returns a shallow copy of this LinkedList. (The elements * themselves are not cloned.) * - * @return a shallow copy of this LinkedList instance + * @return a shallow copy of this LinkedList instance */ public Object clone() { ConcurrentModifiableLinkedList clone = null; @@ -756,7 +756,7 @@ public Object clone() { } /** - * Save the state of this LinkedList instance to a stream (that + * Save the state of this LinkedList instance to a stream (that * is, serialize it). * * @serialData The size of the list (the number of elements it @@ -777,7 +777,7 @@ private void writeObject(java.io.ObjectOutputStream s) } /** - * Reconstitute this LinkedList instance from a stream (that is + * Reconstitute this LinkedList instance from a stream (that is * deserialize it). */ private void readObject(java.io.ObjectInputStream s) diff --git a/library/src/main/java/com/bluejamesbond/text/Styled.java b/library/src/main/java/com/bluejamesbond/text/Styled.java index d5fec2f..4b72bc5 100644 --- a/library/src/main/java/com/bluejamesbond/text/Styled.java +++ b/library/src/main/java/com/bluejamesbond/text/Styled.java @@ -15,7 +15,6 @@ * like {@link android.text.Spanned} object with * {@link android.text.style.ReplacementSpan}. * - * @hide */ public class Styled { /** @@ -23,16 +22,16 @@ public class Styled { * interest should start or end in the middle of this run (if not * drawing, character spans that don't affect metrics can be ignored). * Neither should the run direction change in the middle of the run. - *

- *

The x position is the leading edge of the text. In a right-to-left + * + * The x position is the leading edge of the text. In a right-to-left * paragraph, this will be to the right of the text to be drawn. Paint * should not have an Align value other than LEFT or positioning will isCancelled * confused. - *

- *

On return, workPaint will reflect the original paint plus any + * + * On return, workPaint will reflect the original paint plus any * modifications made by character styles on the run. - *

- *

The returned width is signed and will be < 0 if the paragraph + * + * The returned width is signed and will be < 0 if the paragraph * direction is right-to-left. */ private static float drawUniformRun(Canvas canvas, @@ -209,16 +208,16 @@ public static int getTextWidths(TextPaint paint, * Renders and/or measures a directional run of text on a single line. * Unlike {@link #drawUniformRun}, this can render runs that cross style * boundaries. Returns the signed advance width, if requested. - *

- *

The x position is the leading edge of the text. In a right-to-left + * + * The x position is the leading edge of the text. In a right-to-left * paragraph, this will be to the right of the text to be drawn. Paint * should not have an Align value other than LEFT or positioning will isCancelled * confused. - *

- *

This optimizes for unstyled text and so workPaint might not be + * + * This optimizes for unstyled text and so workPaint might not be * modified by this call. - *

- *

The returned advance width will be < 0 if the paragraph + * + * The returned advance width will be < 0 if the paragraph * direction is right-to-left. */ private static float drawDirectionalRun(Canvas canvas, @@ -360,7 +359,7 @@ static float drawText(Canvas canvas, * Draws a run of text on a single line, with its * origin at (x,y), in the specified Paint. The origin is interpreted based * on the Align setting in the Paint. - *

+ * * This method considers style information in the text (e.g. even when text * is an instance of {@link android.text.Spanned}, this method correctly * draws the text). See also diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java index 8c2b212..e2b0df2 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java @@ -186,14 +186,12 @@ public List hyphenate(String word) { /** * HyphenaPattern.java is an adaptation of Bram Steins hypher.js-Project: * https://github.com/bramstein/Hypher - *

+ * * Code from this project belongs to the following license: - *

* Copyright (c) 2011, Bram Stein All rights reserved. - *

+ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - *

* 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. 2. Redistributions in * binary form must reproduce the above copyright notice, this list of @@ -201,7 +199,7 @@ public List hyphenate(String word) { * materials provided with the distribution. 3. The name of the author may not * be used to endorse or promote products derived from this software without * specific prior written permission. - *

+ * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/ArticleBuilder.java b/library/src/main/java/com/bluejamesbond/text/util/ArticleBuilder.java similarity index 97% rename from sample/src/main/java/com/bluejamesbond/text/sample/helper/ArticleBuilder.java rename to library/src/main/java/com/bluejamesbond/text/util/ArticleBuilder.java index f7f2b72..02a7c2f 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/ArticleBuilder.java +++ b/library/src/main/java/com/bluejamesbond/text/util/ArticleBuilder.java @@ -1,4 +1,4 @@ -package com.bluejamesbond.text.sample.helper; +package com.bluejamesbond.text.util; /* * Copyright 2015 Mathew Kurian diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java index 2034aaf..d68c31d 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ChineseCharacterTest.java @@ -36,7 +36,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; @@ -54,20 +54,114 @@ protected void onCreate(Bundle savedInstanceState) { amb.append("@levifan Oct. 28, 2014", true, new RelativeSizeSpan(0.8f), new StyleSpan(Typeface.BOLD)); amb.append( - "事訖乃返己轉身,可曰:以測機意」樂而不淫誨去出.,可曰:」誨耳出意.第十一回後竊聽己轉身訖乃返建章曰:.父親回衙汗流如雨玉,不題.,可事關雎覽誨.汗流如雨覽吉安而來冒認收了」關雎出曰:矣玉,不題事父親回衙.父親回衙玉,不題吉安而來汗流如雨冒認收了.在一處己轉身訖乃返危德至.建章曰:訖乃返以測機白圭志不稱讚分得意.己轉身樂而不淫建章曰:白圭志.誨意曰:去覽」耳矣.第八回」,可招」不題耳德泉淹曰:矣誨出事.汗流如雨冒認收了吉安而來父親回衙玉,不題.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.", + "事訖乃返己轉身,可曰:以測機意」樂而不淫誨去出.,可曰:」誨耳出意.第十一回後竊聽己轉身訖乃返建章曰:.父親回衙汗流如雨玉,不題.,可事關雎覽誨" + + ".汗流如雨覽吉安而來冒認收了」關雎出曰:矣玉,不題事父親回衙.父親回衙玉,不題吉安而來汗流如雨冒認收了.在一處己轉身訖乃返危德至" + + ".建章曰:訖乃返以測機白圭志不稱讚分得意.己轉身樂而不淫建章曰:白圭志.誨意曰:去覽」耳矣.第八回」,可招」不題耳德泉淹曰:矣誨出事" + + ".汗流如雨冒認收了吉安而來父親回衙玉,不題.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去" + + ".,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回" + + ".,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回" + + ".,可驚異曰:德泉淹矣覽第二回出」相域去.意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨" + + ".事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:.己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去" + + ".,愈聽愈惱饒爾去罷」此是後話也懊悔不了.玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回" + + ".,愈聽愈惱此是後話饒爾去罷」.意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去" + + ".,愈聽愈惱饒爾去罷」也懊悔不了.第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去" + + ".意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.矣出意曰:" + + ".己轉身事在一處出建章曰:樂而不淫,可後竊聽以測機去.,愈聽愈惱饒爾去罷」此是後話也懊悔不了" + + ".玉,不題,可出汗流如雨父親回衙冒認收了耳關雎事曰:吉安而來.了」第一回不題第二回第九回第五回.,愈聽愈惱此是後話饒爾去罷」" + + ".意,可此是後話,愈聽愈惱」也懊悔不了覽饒爾去罷」耳關雎.此是後話,愈聽愈惱也懊悔不了饒爾去罷」.意覽事出去.,愈聽愈惱饒爾去罷」也懊悔不了" + + ".第一回第三回德泉淹羨殺.了」第十回第八回.驚異第十回第五回第七回.,可驚異曰:德泉淹矣覽第二回出」相域去" + + ".意第十一回事訖乃返己轉身耳去白圭志曰:.事」耳,可意關雎誨.事,可父親回衙曰:意出冒認收了吉安而來」去.", true, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new MyQuoteSpan(0xFFFFC801), new StyleSpan(Typeface.ITALIC), new ForegroundColorSpan(0xFF555555)); amb.append( - "矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.", + "矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣" + + ".樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨" + + ".饒爾去罷」也懊悔不了此是後話,愈聽愈惱.己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去" + + ".己轉身訖乃返分得意.矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回" + + ".出意分得意耳覽誨第十一回關雎,可事白圭志.,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回" + + ".覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨.德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返" + + ".吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨.不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱" + + ".己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意" + + ".矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志" + + ".,愈聽愈惱饒爾去罷」也懊悔不了此是後話.矣意去出,可耳.,可意去矣不題招」德泉淹了」第二回.覽意誨事.吉安而來玉,不題父親回衙冒認收了汗流如雨" + + ".德泉淹出第六回第八回意第一回耳,可」第五回矣.樂而不淫建章曰:不稱讚第十一回訖乃返.吉安而來玉,不題父親回衙汗流如雨.曰:,可覽誨" + + ".不題德泉淹第二回第四回第十回第一回.去關雎出誨.饒爾去罷」也懊悔不了此是後話,愈聽愈惱" + + ".己轉身誨意第十一回事後竊聽去矣,可分得意」曰:.意,可出關雎覽」矣耳.出,可」事曰:耳.耳出事去.己轉身訖乃返分得意" + + ".矣吉安而來」耳冒認收了汗流如雨覽事出,可.第八回相域第三回第十回第九回.出意分得意耳覽誨第十一回關雎,可事白圭志" + + ".,愈聽愈惱饒爾去罷」也懊悔不了此是後話.", true, new RelativeSizeSpan(0.8f), new JustifiedSpan()); amb.append( - "意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.", + "意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可" + + ".父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽" + + ".去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽" + + ".耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意" + + ".關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回" + + ".在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可" + + ".父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽" + + ".去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽" + + ".耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意" + + ".關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去.饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回" + + ".在一處以測機分得意不稱讚.矣,可事曰:去意」.也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽" + + ".」事第八回不題曰:羨殺第三回誨第一回.去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了" + + ".第十一回樂而不淫以測機建章曰:危德至.訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:" + + ".去意覽,可.父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」" + + ".冒認收了汗流如雨吉安而來.誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去" + + ".饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」" + + ".也懊悔不了此是後話,愈聽愈惱饒爾去罷」.意關雎去覽矣曰:誨.去曰:覽關雎事意.意出關雎耳誨去覽.」事第八回不題曰:羨殺第三回誨第一回" + + ".去,可耳意關雎誨矣覽.曰:」出誨意事,可.父親回衙汗流如雨玉,不題冒認收了.第十一回樂而不淫以測機建章曰:危德至" + + ".訖乃返不稱讚第十一回建章曰:意己轉身關雎事後竊聽曰:去誨覽.去關雎耳,可」曰:矣.意矣」,可曰:.去意覽,可" + + ".父親回衙」出玉,不題誨事,可吉安而來冒認收了去曰:覽.耳此是後話,愈聽愈惱也懊悔不了曰:矣饒爾去罷」去出」.冒認收了汗流如雨吉安而來" + + ".誨」矣關雎事曰:覽,可.誨」曰:耳覽去關雎意.關雎事羨殺,可第十回耳了」招」矣德泉淹第七回覽去" + + ".饒爾去罷」也懊悔不了耳覽此是後話,愈聽愈惱,可矣」.第二回德泉淹第一回第七回不題第九回.在一處以測機分得意不稱讚.矣,可事曰:去意」" + + ".也懊悔不了此是後話,愈聽愈惱饒爾去罷」.", true, new RelativeSizeSpan(1.3f), new JustifiedSpan()); amb.append( - "誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.", + "誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去.覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:" + + ".父親回衙汗流如雨吉安而來玉,不題.出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」" + + ".事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意" + + ".」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去" + + ".覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題" + + ".出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣.貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意" + + ".」曰:出關雎.第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去" + + ".覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題" + + ".出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣" + + ".貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎" + + ".第十回驚異德泉淹貢院.分得意己轉身建章曰:訖乃返.誨曰:覽出關雎.曰:,可矣誨事.意誨耳關雎出曰:去" + + ".覽吉安而來出父親回衙汗流如雨意誨」,可關雎玉,不題.關雎」出意覽去矣.以測機在一處訖乃返建章曰:.父親回衙汗流如雨吉安而來玉,不題" + + ".出曰:,可矣.曰:關雎誨覽耳.去父親回衙,可汗流如雨玉,不題意事誨曰:耳覽.關雎出,可意覽曰:」.事曰:,可矣去誨關雎.事覽誨關雎出矣" + + ".貢院第九回不題羨殺第八回第三回.第四回第一回第九回貢院.,可曰:吉安而來父親回衙汗流如雨玉,不題耳意.」曰:出關雎.第十回驚異德泉淹貢院" + + ".分得意己轉身建章曰:訖乃返.", true, new RelativeSizeSpan(0.8f), new JustifiedSpan()); amb.append( - "意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙.玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話.以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」.第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意.曰:出,可意", + "意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意.不稱讚樂而不淫在一處己轉身" + + ".第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意意矣去出誨關雎耳.饒爾去罷」此是後話也懊悔不了,愈聽愈惱.曰:」耳去事矣關雎出.去意出,可.曰:耳」事.耳覽去曰:矣事」意" + + ".不稱讚樂而不淫在一處己轉身.第二回第九回第七回.第九回第二回第八回羨殺第六回.第四回第二回第五回羨殺.汗流如雨玉,不題吉安而來父親回衙" + + ".玉,不題汗流如雨吉安而來冒認收了父親回衙.關雎誨曰:去.父親回衙冒認收了吉安而來.饒爾去罷」也懊悔不了,愈聽愈惱此是後話" + + ".以測機不稱讚樂而不淫第十一回建章曰:.第三回」第二回第六回誨出了」第十回耳矣.出矣誨覽關雎」去事.也懊悔不了,愈聽愈惱饒爾去罷」" + + ".第二回覽矣第一回」第七回相域誨意第八回去出.驚異意招」出第二回德泉淹第十回關雎覽第四回誨曰:.也懊悔不了事饒爾去罷」誨」此是後話出矣去覽意" + + ".曰:出,可意", false, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new StyleSpan(Typeface.ITALIC)); diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java index b0f4d44..d7b2d85 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ClickableSpanTest.java @@ -39,7 +39,7 @@ import com.bluejamesbond.text.DocumentView; import com.bluejamesbond.text.hyphen.SqueezeHyphenator; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java index 0d5cc4a..20c0a5b 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ImageSpanTest.java @@ -37,7 +37,7 @@ import com.bluejamesbond.text.DocumentView; import com.bluejamesbond.text.sample.R; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.CenterSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java index 5065ba0..d9f2b46 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/LeadingMarginSpan2Test.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyLeadingMarginSpan2; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java index a1c15af..a8f30c0 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/LongFormattedTextTest.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.CenterSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java index 997b5b3..350f751 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/MixedRTLTest.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.Direction; import com.bluejamesbond.text.style.DirectionSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java index 86d97ca..f6ca3fc 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/QuoteSpanTest.java @@ -36,7 +36,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java index 8213fb3..f4f9d24 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/RTLTest.java @@ -35,7 +35,7 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.JustifiedSpan; import com.bluejamesbond.text.style.RightSpan; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java b/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java index 038e7b9..acad29e 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/test/ShortFormattedTextTest.java @@ -35,13 +35,12 @@ import android.text.style.StyleSpan; import com.bluejamesbond.text.DocumentView; -import com.bluejamesbond.text.sample.helper.ArticleBuilder; +import com.bluejamesbond.text.util.ArticleBuilder; import com.bluejamesbond.text.sample.helper.MyQuoteSpan; import com.bluejamesbond.text.sample.helper.TestActivity; import com.bluejamesbond.text.style.CenterSpan; import com.bluejamesbond.text.style.JustifiedSpan; import com.bluejamesbond.text.style.LeftSpan; -import com.bluejamesbond.text.style.RightSpan; public class ShortFormattedTextTest extends TestActivity { From 64fc4fa6087942f3436a116dc7ec776d13de8a61 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Sat, 7 May 2016 19:57:16 -0500 Subject: [PATCH 16/34] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4bebfc6..6229c87 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ This library will provide you a way to justify text. It supports both plain text *Compatible for Android 2.2 to 5.X* +#Other Libraries +- [FacebookMessengerBot.js](https://github.com/bluejamesbond/FacebookMessengerBot.js) - a Node ES5/6 API for the new Facebook Messenger Bot Platform +- [Scribe.js](https://github.com/bluejamesbond/Scribe.js) - a Node ES5/6 logging system with a web interface + #Screenshot ![Preview](http://i.imgur.com/k6bAWd0.jpg) From 61771f8615f0a3fbe11d7dc16c7c4835f3f53cc6 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Wed, 10 Jan 2018 14:34:45 -0800 Subject: [PATCH 17/34] Update README.md --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6229c87..69b5429 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,25 @@ +# *LIBRARY IS NO LONGER MAINTAINED* +If you want to adopt + maintain this library, please drop me message. + [![Gittip](http://img.shields.io/gittip/bluejamesbond.svg)](https://gratipay.com/bluejamesbond/) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-TextJustify--Android-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1318) [![Build Status](https://travis-ci.org/bluejamesbond/TextJustify-Android.svg?branch=master)](https://travis-ci.org/bluejamesbond/TextJustify-Android) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.bluejamesbond/textjustify-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.bluejamesbond/textjustify-android) ![Logo](https://raw.githubusercontent.com/bluejamesbond/TextJustify-Android/master/misc/logo.png?) ======= **Android Full Justification** -#About +# About This library will provide you a way to justify text. It supports both plain text and Spannables. Additionally, the library can auto-hyphentate your displayed content (thanks to [@muriloandrade](https://github.com/muriloandrade)). *Compatible for Android 2.2 to 5.X* -#Other Libraries +# Other Libraries - [FacebookMessengerBot.js](https://github.com/bluejamesbond/FacebookMessengerBot.js) - a Node ES5/6 API for the new Facebook Messenger Bot Platform - [Scribe.js](https://github.com/bluejamesbond/Scribe.js) - a Node ES5/6 logging system with a web interface -#Screenshot +# Screenshot ![Preview](http://i.imgur.com/k6bAWd0.jpg) -#Demo +# Demo [![Imgur](http://i.imgur.com/hSGF1fV.png)](https://play.google.com/store/apps/details?id=com.bluejamesbond.text.sample) #Recent @@ -25,10 +28,10 @@ This library will provide you a way to justify text. It supports both plain text **01/04/2015** ► Improved caching support which allows for smooth scrolling **01/02/2015** ► Added XML attributes for `DocumentView` -#Wiki +# Wiki For examples, tests, and API refer to the [Android-TextJustify Wiki](https://github.com/bluejamesbond/TextJustify-Android/wiki/1-%C2%B7-Home). -#Install +# Install Just add to your `build.gradle` ```gradle dependencies { @@ -36,7 +39,7 @@ dependencies { } ``` -#Known Issues +# Known Issues | Status| Issues | | :------------: |:---------------| | **`CLOSED`** | Scroll caching for very large documents i.e. > 4000 paragaphs | From 6e0457362f42632701f48366812cf3750271aa83 Mon Sep 17 00:00:00 2001 From: Mathew Kurian Date: Wed, 10 Jan 2018 14:35:16 -0800 Subject: [PATCH 18/34] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69b5429..a2dbeb1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # *LIBRARY IS NO LONGER MAINTAINED* -If you want to adopt + maintain this library, please drop me message. +If you want to adopt + maintain this library, please drop me a message - bluejamesbond@gmail.com [![Gittip](http://img.shields.io/gittip/bluejamesbond.svg)](https://gratipay.com/bluejamesbond/) [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-TextJustify--Android-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/1318) [![Build Status](https://travis-ci.org/bluejamesbond/TextJustify-Android.svg?branch=master)](https://travis-ci.org/bluejamesbond/TextJustify-Android) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.bluejamesbond/textjustify-android/badge.svg?style=flat)](https://maven-badges.herokuapp.com/maven-central/com.github.bluejamesbond/textjustify-android) ![Logo](https://raw.githubusercontent.com/bluejamesbond/TextJustify-Android/master/misc/logo.png?) From 78e628a2ce43a7c64caf110fab9ce1aa95515658 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 03:35:40 +0300 Subject: [PATCH 19/34] Increase gradle build tools version --- build.gradle | 3 ++- gradle/wrapper/gradle-wrapper.properties | 4 ++-- library/build.gradle | 2 +- sample/build.gradle | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index cb98401..14d9c0e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0' + classpath 'com.android.tools.build:gradle:3.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ab1cff5..1cb61da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Apr 17 18:55:46 CDT 2016 +#Wed May 16 20:45:29 MSK 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/library/build.gradle b/library/build.gradle index 1017071..cd53392 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -30,7 +30,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 23 - buildToolsVersion '23.0.3' + buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 8 targetSdkVersion 23 diff --git a/sample/build.gradle b/sample/build.gradle index bafda9e..475b78d 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -54,7 +54,7 @@ android { } catch (Exception e) { } compileSdkVersion 23 - buildToolsVersion '23.0.3' + buildToolsVersion '27.0.3' defaultConfig { applicationId 'com.bluejamesbond.text.sample' minSdkVersion 8 @@ -76,5 +76,5 @@ android { } dependencies { - compile project(':library') + implementation project(':library') } From 2871e6b67e5fb22abbd666dec44a755554bae67a Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 03:37:21 +0300 Subject: [PATCH 20/34] Add default DocumentView#tokensCount --- .../bluejamesbond/text/IDocumentLayout.java | 29 +++++++++++++------ .../text/SpannableDocumentLayout.java | 4 +-- .../text/StringDocumentLayout.java | 2 ++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java index 433df2a..f3fc372 100644 --- a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java @@ -51,32 +51,41 @@ public abstract class IDocumentLayout { // Main content protected CharSequence text; protected int lineCount; + protected int tokensCount; protected int measuredHeight; protected boolean textChange; protected LayoutParams params; protected TextPaint paint; - private Toast toast; + private Context context; private DisplayMetrics displayMetrics; @SuppressLint("ShowToast") public IDocumentLayout(Context context, TextPaint textPaint) { + initDocumentLayout(context, textPaint); + + params = new LayoutParams(); + params.setLineHeightMultiplier(1.0f); + params.setHyphenated(false); + params.setReverse(false); + } + + private void initDocumentLayout(Context context, TextPaint textPaint) { paint = textPaint; text = ""; measuredHeight = 0; lineCount = 0; + tokensCount = 0; textChange = false; displayMetrics = context.getResources().getDisplayMetrics(); - toast = Toast.makeText(context, "", Toast.LENGTH_SHORT); - - params = new LayoutParams(); - params.setLineHeightMultiplier(1.0f); - params.setHyphenated(false); - params.setReverse(false); + this.context = context; } protected void showToast(String s) { - toast.setText(s); - toast.show(); + Toast.makeText(context, s, Toast.LENGTH_SHORT).show(); + } + + public int getTokensCount() { + return tokensCount; } public Paint getPaint() { @@ -101,6 +110,7 @@ public void setText(CharSequence text) { this.text = text; this.textChange = true; + this.tokensCount = 0; onTextChange(); } @@ -110,6 +120,7 @@ public int getMeasuredHeight() { protected void onTextNull() { params.changed = false; + tokensCount = 0; measuredHeight = (int) (params.insetPaddingTop + params.insetPaddingBottom); } diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 5e07cda..758d37a 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -69,11 +69,11 @@ public SpannableDocumentLayout(Context context, TextPaint paint) { tokens = new int[0]; } - private static int pushToken(int[] tokens, int index, int start, int end, float x, float y, + private int pushToken(int[] tokens, int index, int start, int end, float x, float y, float ascent, float descent, int line) { - Assert.assertTrue(index % TOKEN_LENGTH == 0); + tokensCount++; tokens[index + TOKEN_START] = start; tokens[index + TOKEN_END] = end; tokens[index + TOKEN_X] = (int) x; diff --git a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java index 2ab0323..7bf8bc1 100644 --- a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java @@ -218,6 +218,8 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) } Token[] tokensArr = new Token[tokensList.size()]; + tokensCount = tokensList.size(); + tokensList.toArray(tokensArr); tokensList.clear(); From be5e4c50ddeec04a2207d8ca7918be288d99885d Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 10:11:02 +0300 Subject: [PATCH 21/34] Add example --- sample/src/main/AndroidManifest.xml | 4 + .../text/sample/helper/TestList.java | 2 + .../test/PaginatedFormattedTextTest.java | 80 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 sample/src/main/java/com/bluejamesbond/text/sample/test/PaginatedFormattedTextTest.java diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 892a5b3..aa2332b 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -49,6 +49,10 @@ android:name=".test.LongFormattedTextTest" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@android:style/Theme.NoTitleBar" /> + Justin Worland @justinworland Oct. 25, 2014", + false, new RelativeSizeSpan(0.8f), new StyleSpan(Typeface.BOLD)) + .append("Updated: Oct. 25, 2014 2:34 PM".toUpperCase(), + true, new RelativeSizeSpan(0.6f), new StyleSpan(Typeface.BOLD)) + .append("State health department staff will be on the ground at state airports", + true, new RelativeSizeSpan(1.2f), new StyleSpan(Typeface.BOLD), + new StyleSpan(Typeface.ITALIC)); + + for (int i = 0; i < 15; i++) + ab.append("Healthcare workers returning to New York or New Jersey after treating Ebola patients in West Africa will be placed under a mandatory quarantine, officials announced Friday, one day after a Doctors Without Borders doctor was diagnosed with the virus in New York City. Illinois announced a similar policy Saturday, meaning it will be enforced in states with three of the five airports through which passengers traveling from the Ebola-stricken West African countries must enter the United States.", + true, new RelativeSizeSpan(1f), new JustifiedSpan()) + .append("N.J. Gov. Chris Christie and N.Y. Gov. Andrew Cuomo made the announcement as part of a broader procedural plan to help protect the densely packed, highly populated area from any further spread of the disease.", + true, new RelativeSizeSpan(0.8f), new JustifiedSpan(), new MyQuoteSpan(0xFFFFC801)) + .append("“Since taking office, I have erred on the side of caution when it comes to the safety and protection of New Yorkers, and the current situation regarding Ebola will be no different,” Gov. Cuomo said. “The steps New York and New Jersey are taking today will strengthen our safeguards to protect our residents against this disease and help ensure those that may be infected by Ebola are treated with the highest precautions.”", + true, new RelativeSizeSpan(1f), new CenterSpan()) + .append("New York and New Jersey state health department staff will be present on the ground at John F. Kennedy International Airport in New York and Newark Liberty Airport in New Jersey. In addition to implementing the mandatory quarantine of health care workers and others who had direct contact with Ebola patients, health department officials in each state will determine whether others should travelers should be hospitalized or quarantined.", + true, new RelativeSizeSpan(1f), new JustifiedSpan()) + .append("“The announcements mark a dramatic escalation in measures designed to prevent the spread of Ebola in the United States. Previously, only individuals with symptoms of Ebola would be quarantined upon entry to the U.S. under a federal rule from the Centers for Diseases Control and the Department of Homeland Security.”", + true, new RelativeSizeSpan(1f), new RightSpan()); + + DocumentView documentView = addDocumentView(ab, DocumentView.FORMATTED_TEXT); + documentView.setPaginated(true); + documentView.setCacheConfig(DocumentView.CacheConfig.NO_CACHE); // TODO: add pagination caching + } +} From db09f5883e8aab4f9fe4a5af5cc9cfe591fd2230 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 10:11:31 +0300 Subject: [PATCH 22/34] Fix last line render --- .../bluejamesbond/text/SpannableDocumentLayout.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 758d37a..6201777 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -496,18 +496,6 @@ public void onDraw(Canvas canvas, int scrollTop, int scrollBottom) { parameters.end, parameters.first, null); } - int lastEndIndexY = tokens[endIndex + TOKEN_Y]; - int diffEndIndexYCount = 1; - - // FIXME Find next pos-y - for (int s = endIndex; diffEndIndexYCount > 0 && s < tokens.length; s += TOKEN_LENGTH) { - endIndex += TOKEN_LENGTH; - if (lastEndIndexY != tokens[s + TOKEN_Y]) { - diffEndIndexYCount--; - lastEndIndexY = tokens[s + TOKEN_Y]; - } - } - for (int index = startIndex; index < endIndex; index += TOKEN_LENGTH) { if (tokens[index + TOKEN_START] == Integer.MAX_VALUE) break; DirectionSpan[] directionSpans = textCpy.getSpans(tokens[index + TOKEN_START], tokens[index + TOKEN_END], DirectionSpan.class); From ad84ebed1272293e7191859470cb7c2f5ea6b44f Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 10:14:52 +0300 Subject: [PATCH 23/34] Add Pagination class --- .../bluejamesbond/text/util/Pagination.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 library/src/main/java/com/bluejamesbond/text/util/Pagination.java diff --git a/library/src/main/java/com/bluejamesbond/text/util/Pagination.java b/library/src/main/java/com/bluejamesbond/text/util/Pagination.java new file mode 100644 index 0000000..1bafb3c --- /dev/null +++ b/library/src/main/java/com/bluejamesbond/text/util/Pagination.java @@ -0,0 +1,73 @@ +package com.bluejamesbond.text.util; + +import com.bluejamesbond.text.IDocumentLayout; + +import java.util.ArrayList; +import java.util.List; + +public class Pagination { + private final IDocumentLayout layout; + private final List pages; + private int pageHeight; + + public void setPageHeight(int pageHeight) { + this.pageHeight = pageHeight; + } + + public int getPageHeight() { + return pageHeight; + } + + public Pagination(IDocumentLayout layout, int pageHeight) { + this.layout = layout; + this.pages = new ArrayList<>(); + this.pageHeight = pageHeight; + } + + private int addPageByTokenIndex(int pageFirstTokenIndex, int i) { + final int tokenLine = layout.getLineForToken(i); + while (i < layout.getTokensCount() && layout.getLineForToken(i) == tokenLine) { + i++; + } + + pages.add( + layout.getText().subSequence( + layout.getTokenStart(pageFirstTokenIndex), + layout.getTokenEnd(i - 1))); + + return i; + } + + public void layout() { + final int lines = layout.getLineCount(); + float height = pageHeight; + final int tokensCount = layout.getTokensCount(); + int pageFirstTokenIndex = 0; + + for (int i = 0; i < tokensCount; i++) { + final float lineHeight = layout.getTokenAscent(i) + layout.getTokenDescent(i); + + if (height < layout.getTokenTopAt(i) + lineHeight) { + // When the layout height has been exceeded + pageFirstTokenIndex = i = addPageByTokenIndex(pageFirstTokenIndex, i); + height += pageHeight; + } + } + + if (layout.getLineForToken(pageFirstTokenIndex) < lines) { + // Put the rest of the text into the last page + pages.add( + layout.getText().subSequence( + layout.getTokenStart(pageFirstTokenIndex), + layout.getText().length())); + } + } + + public int size() { + return pages.size(); + } + + public CharSequence get(int index) { + return (index >= 0 && index < pages.size()) ? pages.get(index) : null; + } +} \ No newline at end of file From bce3c64bafaa8548fb729eae9ca92262708cbf0f Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 11:52:06 +0300 Subject: [PATCH 24/34] Fix inspections --- .../com/bluejamesbond/text/DocumentView.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index 4672323..9d2b7ff 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -492,6 +492,7 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec super.onMeasure(widthMeasureSpec, heightMeasureSpec); } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent ev) { requestDisallowInterceptTouchEvent(disallowInterceptTouch); @@ -674,13 +675,13 @@ public void destroyCache() { } } - public static enum CacheConfig { + public enum CacheConfig { NO_CACHE(null, 0), AUTO_QUALITY(Config.ARGB_4444, 1), LOW_QUALITY(Config.RGB_565, 2), HIGH_QUALITY(Config.ARGB_8888, 3), GRAYSCALE(Config.ALPHA_8, 4); private final Config mConfig; private final int mId; - private CacheConfig(Config config, int id) { + CacheConfig(Config config, int id) { mConfig = config; mId = id; } @@ -714,26 +715,24 @@ enum MeasureTaskState { AWAIT, FINISH, START, FINISH_AWAIT } - public static interface ILayoutProgressListener { - public void onCancelled(); - - public void onFinish(); - - public void onStart(); - - public void onProgressUpdate(float progress); + public interface ILayoutProgressListener { + void onCancelled(); + void onFinish(); + void onStart(); + void onProgressUpdate(float progress); } - public static interface ITween { - public float get(float t, float b, float c, float d); + public interface ITween { + float get(float t, float b, float c, float d); } + @SuppressLint("StaticFieldLeak") public class MeasureTask extends AsyncTask { private IDocumentLayout.IProgress progress; private IDocumentLayout.ICancel cancelled; - public MeasureTask(float parentWidth) { + public MeasureTask(float parentWidth, int parentHeight) { layout.getLayoutParams().setParentWidth(parentWidth); progress = new IDocumentLayout.IProgress() { @Override @@ -768,7 +767,6 @@ protected void onPreExecute() { } } - @Override protected void onPostExecute(Boolean done) { if (!done || isCancelled()) { @@ -860,6 +858,7 @@ public void recycle() { } } + @SuppressLint("StaticFieldLeak") public class CacheDrawTask extends AsyncTask { private Runnable drawRunnable; From f93caea5b755655af3b47fa83efaee833ad25418 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 21 May 2018 11:56:54 +0300 Subject: [PATCH 25/34] Add paginated flag and override onTouchEvent listeners --- .../com/bluejamesbond/text/DocumentView.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index 9d2b7ff..9c172f2 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -49,10 +49,12 @@ import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; +import android.view.ViewTreeObserver; import android.widget.ProgressBar; import android.widget.ScrollView; import com.bluejamesbond.text.style.TextAlignment; +import com.bluejamesbond.text.util.Pagination; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; @@ -96,6 +98,7 @@ public float get(float t, float b, float c, float d) { private CacheBitmap cacheBitmapTop; private CacheBitmap cacheBitmapBottom; private boolean disallowInterceptTouch; + private boolean paginated; public DocumentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); @@ -166,6 +169,11 @@ private static int getMaxTextureSize() { return Math.max(maximumTextureSize, GL_MAX_TEXTURE_SIZE); } + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return !paginated && super.onInterceptTouchEvent(ev); + } + public boolean isDisallowInterceptTouch() { return disallowInterceptTouch; } @@ -438,8 +446,8 @@ public CharSequence getText() { } public void setText(CharSequence text) { - this.layout.setText(text); - requestLayout(); + this.text = text; + layout.setText(text); } public StringDocumentLayout.LayoutParams getDocumentLayoutParams() { @@ -496,7 +504,7 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec @Override public boolean onTouchEvent(MotionEvent ev) { requestDisallowInterceptTouchEvent(disallowInterceptTouch); - return super.onTouchEvent(ev); + return !paginated && super.onTouchEvent(ev); } @Override @@ -545,6 +553,29 @@ protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } + public boolean isPaginated() { + return paginated; + } + + public void setPaginated(final boolean paginated) { + + if (this.paginated == paginated) { + return; + } + + this.paginated = paginated; + invalidate(); + } + + @Override + public void invalidate() { + onDocumentViewParamsChanged(); + super.invalidate(); + } + + protected void onDocumentViewParamsChanged() { + setVerticalScrollBarEnabled(!paginated); + } @SuppressLint("DrawAllocation") @Override From 170186f509191c04196bad6584e0200329af6d5a Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Wed, 23 May 2018 17:51:56 +0300 Subject: [PATCH 26/34] Add tokensCount getter --- .../java/com/bluejamesbond/text/StringDocumentLayout.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java index 7bf8bc1..d2e030e 100644 --- a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java @@ -264,6 +264,11 @@ public void onDraw(Canvas canvas, int startTop, int startBottom) { } } + @Override + public int getTokensCount() { + return tokensCount; + } + @Override public float getTokenAscent(int tokenIndex) { return -paint.ascent() * params.lineHeightMultiplier; From 922f22421fcab4ff6f2219f59f883f73653cec78 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Wed, 23 May 2018 17:55:23 +0300 Subject: [PATCH 27/34] Fix bug into SpannableLayout --- .../bluejamesbond/text/SpannableDocumentLayout.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 6201777..3a6059d 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -71,6 +71,7 @@ public SpannableDocumentLayout(Context context, TextPaint paint) { private int pushToken(int[] tokens, int index, int start, int end, float x, float y, float ascent, float descent, int line) { + Assert.assertTrue(index % TOKEN_LENGTH == 0); tokensCount++; @@ -496,6 +497,18 @@ public void onDraw(Canvas canvas, int scrollTop, int scrollBottom) { parameters.end, parameters.first, null); } + int lastEndIndexY = tokens[endIndex + TOKEN_Y]; + int diffEndIndexYCount = 1; + + // FIXME Find next pos-y + for (int s = endIndex; diffEndIndexYCount > 0 && s < tokens.length; s += TOKEN_LENGTH) { + endIndex += TOKEN_LENGTH; + if (lastEndIndexY != tokens[s + TOKEN_Y]) { + diffEndIndexYCount--; + lastEndIndexY = tokens[s + TOKEN_Y]; + } + } + for (int index = startIndex; index < endIndex; index += TOKEN_LENGTH) { if (tokens[index + TOKEN_START] == Integer.MAX_VALUE) break; DirectionSpan[] directionSpans = textCpy.getSpans(tokens[index + TOKEN_START], tokens[index + TOKEN_END], DirectionSpan.class); From 9173508902b0cbfdad4c7b3f2a48d7ec2f9714ff Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Wed, 23 May 2018 20:39:51 +0300 Subject: [PATCH 28/34] Add pagination on measuring --- .../com/bluejamesbond/text/DocumentView.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index 9c172f2..b6b58c7 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -99,6 +99,9 @@ public float get(float t, float b, float c, float d) { private CacheBitmap cacheBitmapBottom; private boolean disallowInterceptTouch; private boolean paginated; + private Pagination pagination; + private int currentPage; + CharSequence text; public DocumentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); @@ -240,6 +243,14 @@ public void setFadeInTween(ITween tween) { fadeInTween = tween; } + private void paginate() { + final CharSequence text = pagination.get(currentPage); + if(text != null) { + layout.textChange = !layout.text.equals(text); + layout.text = text; + } + } + private void initDocumentView(Context context, AttributeSet attrs, int type) { synchronized (eglBitmapHeightLock) { @@ -470,6 +481,7 @@ public void setCacheConfig(CacheConfig quality) { @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final int width = MeasureSpec.getSize(widthMeasureSpec); + final int height = layout.getMeasuredHeight(); switch (measureState) { case FINISH_AWAIT: @@ -478,7 +490,7 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec break; case FINISH: viewportView.setMinimumWidth(width); - viewportView.setMinimumHeight(layout.getMeasuredHeight()); + viewportView.setMinimumHeight(height); measureState = MeasureTaskState.FINISH_AWAIT; if(cacheConfig != CacheConfig.NO_CACHE){ @@ -491,7 +503,7 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec measureTask.cancel(true); measureTask = null; } - measureTask = new MeasureTask(width); + measureTask = new MeasureTask(width, height); measureTask.execute(); measureState = MeasureTaskState.AWAIT; break; @@ -649,7 +661,7 @@ public void run() { } } else { - drawLayout(canvas, 0, layout.getMeasuredHeight(), false); + drawLayout(canvas, 0, paginated ? pagination.getPageHeight() : layout.getMeasuredHeight(), false); } } @@ -784,7 +796,15 @@ public Boolean isCancelled() { @Override protected Boolean doInBackground(Void... params) { try { - return layout.measure(progress, cancelled); + layout.textChange = text != layout.text; + layout.text = text; + boolean result = layout.measure(progress, cancelled); + if (result && paginated) { + pagination = new Pagination(layout, ((View) getParent()).getMeasuredHeight()); + pagination.layout(); + paginate(); + } + return result; } catch (Exception e) { e.printStackTrace(); return false; From 9c100b89cfdac2da0d04130692aff97886c6f867 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Wed, 23 May 2018 20:41:37 +0300 Subject: [PATCH 29/34] Add onGlobalLayoutListener --- .../com/bluejamesbond/text/DocumentView.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index b6b58c7..72a6a4a 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -101,6 +101,8 @@ public float get(float t, float b, float c, float d) { private boolean paginated; private Pagination pagination; private int currentPage; + private int startPage = 0; + ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener; CharSequence text; public DocumentView(Context context, AttributeSet attrs, int defStyle) { @@ -576,6 +578,35 @@ public void setPaginated(final boolean paginated) { } this.paginated = paginated; + + if (paginated) { + pagination = new Pagination(layout, 0); + + onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + + pagination.setPageHeight(((View) getParent()).getHeight()); + } + }; + + getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); + } else { + getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener); + } + + onGlobalLayoutListener = null; + pagination = null; + } + invalidate(); } From bb6564139e8703cfea807f7af17512212590217b Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Wed, 23 May 2018 20:42:24 +0300 Subject: [PATCH 30/34] Add turnPage actions --- .../com/bluejamesbond/text/DocumentView.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index 72a6a4a..794b2af 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -221,6 +221,24 @@ protected synchronized void drawLayout(Canvas canvas, int startY, int endY, bool } } + public int turnPageBackward() { + currentPage = currentPage > startPage ? currentPage - 1 : currentPage; + turnPage(currentPage); + return currentPage; + } + + public int turnPageForward() { + currentPage = currentPage < pagination.size() ? currentPage + 1 : currentPage; + turnPage(currentPage); + return currentPage; + } + + public void turnPage(int page) { + if (startPage > page) throw new AssertionError(); + currentPage = page; + paginate(); + } + public int getFadeInAnimationStepDelay() { return fadeInAnimationStepDelay; } From 3781b24b976b516caf5a8eb95d87bfca658b1553 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Wed, 23 May 2018 20:42:43 +0300 Subject: [PATCH 31/34] Add useful getters and setters --- .../com/bluejamesbond/text/DocumentView.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index 794b2af..9f2f716 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -105,6 +105,20 @@ public float get(float t, float b, float c, float d) { ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener; CharSequence text; + public int getCurrentPage() { + return currentPage; + } + + public void setStartPage(int startPage) { + if (startPage == this.startPage) { + return; + } + + currentPage = currentPage - this.startPage + startPage; + this.startPage = startPage; + paginate(); + } + public DocumentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initDocumentView(context, attrs, PLAIN_TEXT); @@ -638,6 +652,10 @@ protected void onDocumentViewParamsChanged() { setVerticalScrollBarEnabled(!paginated); } + public int getPageCount() { + return pagination.size(); + } + @SuppressLint("DrawAllocation") @Override protected final void onDraw(Canvas canvas) { From 1f487868f42dd854240e35f40d4d3fd9b2827378 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Mon, 28 May 2018 19:16:51 +0300 Subject: [PATCH 32/34] Upgrade SDK version --- library/build.gradle | 10 +++++----- sample/build.gradle | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index cd53392..8f048b3 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -29,13 +29,13 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 23 + compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { - minSdkVersion 8 - targetSdkVersion 23 - versionCode 2 - versionName '2.0' + minSdkVersion 14 + targetSdkVersion 27 + versionCode 3 + versionName '3.0' } android { lintOptions { diff --git a/sample/build.gradle b/sample/build.gradle index 475b78d..69084e5 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -53,14 +53,14 @@ android { } } catch (Exception e) { } - compileSdkVersion 23 + compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { applicationId 'com.bluejamesbond.text.sample' - minSdkVersion 8 - targetSdkVersion 23 - versionCode 9 - versionName '4.5' + minSdkVersion 14 + targetSdkVersion 27 + versionCode 10 + versionName '5.0' } android { lintOptions { From 209e14e7581c452c3f3916fe2bc9beef5fb4e5e9 Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Tue, 29 May 2018 01:38:25 +0300 Subject: [PATCH 33/34] Refactor library with AndroidStudio inspections --- .../text/ConcurrentModifiableLinkedList.java | 33 +++-- .../java/com/bluejamesbond/text/Console.java | 2 +- .../com/bluejamesbond/text/DocumentView.java | 131 +++++++++--------- .../bluejamesbond/text/IDocumentLayout.java | 22 +-- .../text/SpannableDocumentLayout.java | 76 +++++----- .../text/StringDocumentLayout.java | 63 +++++---- .../java/com/bluejamesbond/text/Styled.java | 32 ++--- .../text/hyphen/DefaultHyphenator.java | 12 +- .../text/hyphen/SqueezeHyphenator.java | 4 +- .../bluejamesbond/text/style/Direction.java | 4 +- .../text/style/TextAlignment.java | 2 +- .../bluejamesbond/text/util/Pagination.java | 3 +- 12 files changed, 198 insertions(+), 186 deletions(-) diff --git a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java index 5e6619e..21664c7 100644 --- a/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java +++ b/library/src/main/java/com/bluejamesbond/text/ConcurrentModifiableLinkedList.java @@ -1,5 +1,6 @@ package com.bluejamesbond.text; +import java.lang.reflect.Array; import java.util.AbstractSequentialList; import java.util.Collection; import java.util.Iterator; @@ -27,7 +28,7 @@ public class ConcurrentModifiableLinkedList extends AbstractSequentialList implements List, Cloneable, java.io.Serializable { private static final long serialVersionUID = 876323262645176354L; - private transient Entry header = new Entry(null, null, null); + private transient Entry header = new Entry<>(null, null, null); private transient int size = 0; /** @@ -337,18 +338,19 @@ public Object[] toArray() { * @throws NullPointerException if the specified array is null */ public T[] toArray(T[] a) { - if (a.length < size) - a = (T[]) java.lang.reflect.Array.newInstance( - a.getClass().getComponentType(), size); + T[] ts = a; + if (ts.length < size) + ts = (T[]) Array.newInstance( + ts.getClass().getComponentType(), size); int i = 0; - Object[] result = a; + Object[] result = ts; for (Entry e = header.next; e != header; e = e.next) result[i++] = e.element; - if (a.length > size) - a[size] = null; + if (ts.length > size) + ts[size] = null; - return a; + return ts; } /** @@ -394,8 +396,8 @@ public boolean addAll(int index, Collection c) { Entry successor = (index == size ? header : entry(index)); Entry predecessor = successor.previous; - for (int i = 0; i < numNew; i++) { - Entry e = new Entry((E) a[i], successor, predecessor); + for (Object el: a) { + Entry e = new Entry<>((E) el, successor, predecessor); predecessor.next = e; predecessor = e; } @@ -698,8 +700,9 @@ public boolean removeLastOccurrence(Object o) { return false; } + @SuppressWarnings("UnusedReturnValue") private Entry addBefore(E e, Entry entry) { - Entry newEntry = new Entry(e, entry, entry.previous); + Entry newEntry = new Entry<>(e, entry, entry.previous); newEntry.previous.next = newEntry; newEntry.next.previous = newEntry; size++; @@ -734,8 +737,8 @@ public Iterator descendingIterator() { * * @return a shallow copy of this LinkedList instance */ - public Object clone() { - ConcurrentModifiableLinkedList clone = null; + public ConcurrentModifiableLinkedList clone() { + ConcurrentModifiableLinkedList clone; try { clone = (ConcurrentModifiableLinkedList) super.clone(); } catch (CloneNotSupportedException e) { @@ -743,7 +746,7 @@ public Object clone() { } // Put clone into "virgin" state - clone.header = new Entry(null, null, null); + clone.header = new Entry<>(null, null, null); clone.header.next = clone.header.previous = clone.header; clone.size = 0; clone.modCount = 0; @@ -789,7 +792,7 @@ private void readObject(java.io.ObjectInputStream s) int size = s.readInt(); // Initialize header - header = new Entry(null, null, null); + header = new Entry<>(null, null, null); header.next = header.previous = header; // Read in all elements in the proper order. diff --git a/library/src/main/java/com/bluejamesbond/text/Console.java b/library/src/main/java/com/bluejamesbond/text/Console.java index 9116cf5..2dba75a 100644 --- a/library/src/main/java/com/bluejamesbond/text/Console.java +++ b/library/src/main/java/com/bluejamesbond/text/Console.java @@ -30,7 +30,7 @@ */ @SuppressWarnings("unused") -public class Console { +public final class Console { public static void log(String tag, String s) { android.util.Log.d(tag, s); diff --git a/library/src/main/java/com/bluejamesbond/text/DocumentView.java b/library/src/main/java/com/bluejamesbond/text/DocumentView.java index 9f2f716..7079131 100644 --- a/library/src/main/java/com/bluejamesbond/text/DocumentView.java +++ b/library/src/main/java/com/bluejamesbond/text/DocumentView.java @@ -69,18 +69,17 @@ public class DocumentView extends ScrollView { private static final ITween LINEAR_EASE_IN; private static final Object eglBitmapHeightLock; + public static final int DEFAULT_FADE_IN_DURATION = 250; + public static final int DEFAULT_FADE_IN_ANIMATION_STEP_DELAY = 35; + public static final int DEFAULT_TEXT_SIZE = 34; + public static final int TRANSPARENT_ALPHA = 255; private static int eglBitmapHeight; protected ILayoutProgressListener layoutProgressListener; static { eglBitmapHeightLock = new Object(); eglBitmapHeight = -1; - LINEAR_EASE_IN = new ITween() { - @Override - public float get(float t, float b, float c, float d) { - return c * t / d + b; - } - }; + LINEAR_EASE_IN = new LinearEasyIn(); } private IDocumentLayout layout; @@ -88,8 +87,8 @@ public float get(float t, float b, float c, float d) { private TextPaint cachePaint; private View viewportView; private ITween fadeInTween; - private int fadeInDuration = 250; - private int fadeInAnimationStepDelay = 35; + private int fadeInDuration = DEFAULT_FADE_IN_DURATION; + private int fadeInAnimationStepDelay = DEFAULT_FADE_IN_ANIMATION_STEP_DELAY; private volatile MeasureTask measureTask; private volatile MeasureTaskState measureState; private int minimumHeight; @@ -394,7 +393,7 @@ private void initDocumentView(Context context, AttributeSet attrs, int type) { protected void initPaint(Paint paint) { paint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); - paint.setTextSize(34); + paint.setTextSize(DEFAULT_TEXT_SIZE); paint.setAntiAlias(true); } @@ -453,33 +452,7 @@ public View getViewportView(){ } public void setProgressBar(final int progressBarId) { - setOnLayoutProgressListener(new DocumentView.ILayoutProgressListener() { - - private ProgressBar progressBar; - - @Override - public void onCancelled() { - progressBar.setProgress(progressBar.getMax()); - progressBar = null; - } - - @Override - public void onFinish() { - progressBar.setProgress(progressBar.getMax()); - progressBar = null; - } - - @Override - public void onStart() { - progressBar = (ProgressBar) ((Activity) getContext()).getWindow().getDecorView().findViewById(progressBarId); - progressBar.setProgress(0); - } - - @Override - public void onProgressUpdate(float progress) { - progressBar.setProgress((int) (progress * (float) progressBar.getMax())); - } - }); + setOnLayoutProgressListener(new OnLayoutProgressListener(progressBarId)); } public void setOnLayoutProgressListener(ILayoutProgressListener listener) { @@ -566,27 +539,7 @@ protected void onDetachedFromWindow() { } public void setProgressBar(final ProgressBar progressBar) { - setOnLayoutProgressListener(new DocumentView.ILayoutProgressListener() { - @Override - public void onCancelled() { - progressBar.setProgress(progressBar.getMax()); - } - - @Override - public void onFinish() { - progressBar.setProgress(progressBar.getMax()); - } - - @Override - public void onStart() { - progressBar.setProgress(0); - } - - @Override - public void onProgressUpdate(float progress) { - progressBar.setProgress((int) (progress * (float) progressBar.getMax())); - } - }); + setOnLayoutProgressListener(new OnLayoutProgressListener(progressBar)); } @Override @@ -755,7 +708,7 @@ protected boolean drawCacheToView(Canvas canvas, Paint paint, CacheBitmap cache, paint.setAlpha(cache.getAlpha()); canvas.drawBitmap(cache.getBitmap(), 0, y, paint); paint.setAlpha(lastAlpha); - return cache.getAlpha() < 255; // return true to invoke postInvalidateDelayed() + return cache.getAlpha() < TRANSPARENT_ALPHA; // return true to invoke postInvalidateDelayed() } return false; @@ -836,6 +789,13 @@ public interface ITween { float get(float t, float b, float c, float d); } + private static class LinearEasyIn implements ITween { + @Override + public float get(float t, float b, float c, float d) { + return c * t / d + b; + } + } + @SuppressLint("StaticFieldLeak") public class MeasureTask extends AsyncTask { @@ -912,7 +872,7 @@ protected void onCancelled() { } } - private class CacheBitmap { + private final class CacheBitmap { private long drawFadeInStartTime; private Bitmap bitmap; @@ -921,17 +881,17 @@ private class CacheBitmap { private volatile CacheDrawTask drawTask; private volatile int alpha; - public CacheBitmap(int w, int h, Bitmap.Config config) { + CacheBitmap(int w, int h, Bitmap.Config config) { bitmap = Bitmap.createBitmap(w, h, config); start = -1; drawCompleted = false; } - public int getAlpha() { + int getAlpha() { return (int) Math.min(fadeInTween.get(System.currentTimeMillis() - drawFadeInStartTime, 0, 255f, fadeInDuration), 255f); } - public void drawInBackground(Runnable runnable) { + void drawInBackground(Runnable runnable) { if (drawTask != null) { drawTask.cancel(true); drawTask = null; @@ -951,19 +911,19 @@ public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } - public int getStart() { + int getStart() { return start; } - public void setStart(int start) { + void setStart(int start) { this.start = start; } - public boolean isReady() { + boolean isReady() { return drawCompleted; } - public void recycle() { + void recycle() { if (drawTask != null) { drawTask.cancel(true); drawTask = null; @@ -1003,4 +963,43 @@ protected void onPostExecute(Void aVoid) { } } } + + private final class OnLayoutProgressListener implements ILayoutProgressListener { + + private int progressBarId; + private ProgressBar progressBar; + + private OnLayoutProgressListener(final int progressBarId) { + this.progressBarId = progressBarId; + } + + private OnLayoutProgressListener(final ProgressBar progressBar) { + this.progressBar = progressBar; + } + + @Override + public void onCancelled() { + progressBar.setProgress(progressBar.getMax()); + progressBar = null; + } + + @Override + public void onFinish() { + progressBar.setProgress(progressBar.getMax()); + progressBar = null; + } + + @Override + public void onStart() { + if (progressBar == null) { + progressBar = (ProgressBar) ((Activity) getContext()).getWindow().getDecorView().findViewById(progressBarId); + } + progressBar.setProgress(0); + } + + @Override + public void onProgressUpdate(float progress) { + progressBar.setProgress((int) (progress * (float) progressBar.getMax())); + } + } } diff --git a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java index f3fc372..02b5289 100644 --- a/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/IDocumentLayout.java @@ -101,13 +101,13 @@ public CharSequence getText() { } public void setText(CharSequence text) { - text = text == null ? new SpannableString("") : new SpannableString(text); + CharSequence spannableString = text == null ? new SpannableString("") : new SpannableString(text); - if (this.text.equals(text)) { + if (this.text.equals(spannableString)) { return; } - this.text = text; + this.text = spannableString; this.textChange = true; this.tokensCount = 0; @@ -178,20 +178,22 @@ public void draw(Canvas canvas, int startTop, int startBottom) { public abstract void onTextChange(); - public static enum TokenPosition { + public enum TokenPosition { START_OF_LINE, END_OF_LINE } - public static interface IProgress { - public void onUpdate(T val); + public interface IProgress { + void onUpdate(T val); } - public static interface ICancel { - public T isCancelled(); + public interface ICancel { + T isCancelled(); } public class LayoutParams { + public static final float DEFAULT_PARENT_WIDTH = 800.0f; + public static final int DEFAULT_TEXT_SIZE = 14; /** * All the customizable parameters */ @@ -200,7 +202,7 @@ public class LayoutParams { protected Float insetPaddingTop = 0.0f; protected Float insetPaddingBottom = 0.0f; protected Float insetPaddingRight = 0.0f; - protected Float parentWidth = 800.0f; + protected Float parentWidth = DEFAULT_PARENT_WIDTH; protected Float offsetX = 0.0f; protected Float offsetY = 0.0f; @@ -219,7 +221,7 @@ public class LayoutParams { protected Boolean textStrikeThru = false; protected Boolean textFakeBold = false; protected Typeface textTypeface = Typeface.DEFAULT; - protected Float rawTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, displayMetrics); + protected Float rawTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE, displayMetrics); protected Integer textColor = Color.BLACK; protected Integer textLinkColor = Color.parseColor("#ff05c5cf"); diff --git a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java index 3a6059d..30af029 100644 --- a/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/SpannableDocumentLayout.java @@ -48,6 +48,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; +import java.util.Locale; +import java.util.Queue; public abstract class SpannableDocumentLayout extends IDocumentLayout { @@ -60,7 +62,7 @@ public abstract class SpannableDocumentLayout extends IDocumentLayout { private static final int TOKEN_LINE = 6; private static final int TOKEN_LENGTH = 7; private TextPaint workPaint; - private LinkedList mLeadMarginSpanDrawEvents; + private Queue mLeadMarginSpanDrawEvents; private int[] tokens; public SpannableDocumentLayout(Context context, TextPaint paint) { @@ -99,32 +101,33 @@ private static LinkedList tokenize(CharSequence source, int start, int end) { + int localStart = start; LinkedList units = new LinkedList<>(); - if (start >= end) { + if (localStart >= end) { return units; } - boolean charSearch = source.charAt(start) == ' '; + boolean charSearch = source.charAt(localStart) == ' '; - for (int i = start; i < end; i++) { + for (int i = localStart; i < end; i++) { // If the end add the word group if (i + 1 == end) { units.add(i + 1); - start = i + 1; + localStart = i + 1; } // Search for the start of non-space else if (charSearch && source.charAt(i) != ' ') { - if ((i - start) > 0) { + if ((i - localStart) > 0) { units.add(i); } - start = i; + localStart = i; charSearch = false; } // Search for the end of non-space else if (!charSearch && source.charAt(i) == ' ') { units.add(i); - start = i + 1; // Skip the space + localStart = i + 1; // Skip the space charSearch = true; } } @@ -138,16 +141,17 @@ else if (!charSearch && source.charAt(i) == ' ') { * as by {@link String#trim}. */ protected int getTrimmedLength(CharSequence s, int start, int end) { - while (start < end && s.charAt(start) <= ' ') { - start++; + int localStart = start; + while (localStart < end && s.charAt(localStart) <= ' ') { + localStart++; } int endCpy = end; - while (endCpy > start && s.charAt(endCpy - 1) <= ' ') { + while (endCpy > localStart && s.charAt(endCpy - 1) <= ' ') { endCpy--; } - return endCpy - start; + return endCpy - localStart; } @SuppressWarnings("ConstantConditions") @@ -185,7 +189,7 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) float lastDescent; boolean isParaStart = true; - boolean isReverse = params.reverse; + boolean isReverse; for (lineNumber = 0; lineNumber < lines; lineNumber++) { @@ -338,7 +342,7 @@ public boolean onMeasure(IProgress progress, ICancel cancelled) } if (params.debugging) { - Console.log(String.format("Align: %s, X: %fpx, Y: %fpx, PWidth: %fpx", + Console.log(String.format(Locale.US, "Align: %s, X: %fpx, Y: %fpx, PWidth: %fpx", lineTextAlignment, x, y, parentWidth)); } @@ -484,7 +488,7 @@ public void onDraw(Canvas canvas, int scrollTop, int scrollBottom) { int startIndex = getTokenForVertical(scrollTop, TokenPosition.START_OF_LINE); int endIndex = getTokenForVertical(scrollBottom, TokenPosition.END_OF_LINE); - boolean defIsReverse = false; + final boolean defIsReverse = false; for (LeadingMarginSpanDrawParameters parameters : mLeadMarginSpanDrawEvents) { // FIXME sort by Y and break out of loop @@ -614,27 +618,27 @@ public boolean isTokenized() { * Class to handle onDrawLeadingSpanMargin */ - private class LeadingMarginSpanDrawParameters { - - public int x; - public int top; - public int baseline; - public int bottom; - public int dir; - public int start; - public int end; - public boolean first; - public LeadingMarginSpan span; - - public LeadingMarginSpanDrawParameters(LeadingMarginSpan span, - int x, - int dir, - int top, - int baseline, - int bottom, - int start, - int end, - boolean first) { + private final class LeadingMarginSpanDrawParameters { + + int x; + int top; + int baseline; + int bottom; + int dir; + int start; + int end; + boolean first; + LeadingMarginSpan span; + + LeadingMarginSpanDrawParameters(LeadingMarginSpan span, + int x, + int dir, + int top, + int baseline, + int bottom, + int start, + int end, + boolean first) { this.span = span; this.x = x; this.dir = dir; diff --git a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java index d2e030e..b76a9fb 100644 --- a/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java +++ b/library/src/main/java/com/bluejamesbond/text/StringDocumentLayout.java @@ -41,6 +41,7 @@ @SuppressWarnings("unused") public abstract class StringDocumentLayout extends IDocumentLayout { + public static final int EXTRA_TOKENS_TO_DRAW = 25; // Parsing objects private Token[] tokens; private ConcurrentModifiableLinkedList chunks; @@ -236,7 +237,7 @@ public void onDraw(Canvas canvas, int startTop, int startBottom) { int tokenStart = getTokenForVertical(startTop, TokenPosition.START_OF_LINE); int tokenEnd = getTokenForVertical(startBottom, TokenPosition.END_OF_LINE); - for (int i = Math.max(0, tokenStart - 25); i < tokenEnd + 25 && i < tokens.length; i++) { + for (int i = Math.max(0, tokenStart - EXTRA_TOKENS_TO_DRAW); i < tokenEnd + EXTRA_TOKENS_TO_DRAW && i < tokens.length; i++) { Token token = tokens[i]; token.draw(canvas, -startTop, paint, params); if (params.debugging) { @@ -387,16 +388,17 @@ else if (!charSearch && s.charAt(i) == ' ') { * as by {@link String#trim}. */ protected int getTrimmedLength(CharSequence s, int start, int end) { - while (start < end && s.charAt(start) <= ' ') { - start++; + int localStart = start; + while (localStart < end && s.charAt(localStart) <= ' ') { + localStart++; } int endCpy = end; - while (endCpy > start && s.charAt(endCpy - 1) <= ' ') { + while (endCpy > localStart && s.charAt(endCpy - 1) <= ' ') { endCpy--; } - return endCpy - start; + return endCpy - localStart; } /** @@ -405,6 +407,7 @@ protected int getTrimmedLength(CharSequence s, int start, int end) { private LineAnalysis fit(ListIterator iterator, int startIndex, float spaceOffset, float availableWidth) { + float localAvailableWidth = availableWidth; int i = startIndex; // Greedy search to see if the word @@ -415,7 +418,7 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac Unit unit = iterator.next(); String word = unit.unit; float wordWidth = paint.measureText(word); - float remainingWidth = availableWidth - wordWidth; + float remainingWidth = localAvailableWidth - wordWidth; // Word does not fit in line if (remainingWidth < 0 && word.trim().length() != 0) { @@ -442,7 +445,7 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac .measureText(formattedPartial); // See if the partial fits - if (availableWidth - formattedPartialWidth > 0) { + if (localAvailableWidth - formattedPartialWidth > 0) { lastFormattedPartial = formattedPartial; lastFormattedPartialWidth = formattedPartialWidth; lastConcatPartial = concatPartial; @@ -456,11 +459,11 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac unit.unit = lastFormattedPartial; iterator.add(new Unit(word.substring(lastConcatPartial.length()))); - availableWidth -= lastFormattedPartialWidth; + localAvailableWidth -= lastFormattedPartialWidth; iterator.previous(); - return new LineAnalysis(startIndex, i + 1, availableWidth); + return new LineAnalysis(startIndex, i + 1, localAvailableWidth); } } } @@ -469,17 +472,17 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac // Redo this word on the next run iterator.previous(); - return new LineAnalysis(startIndex, i, availableWidth + spaceOffset); + return new LineAnalysis(startIndex, i, localAvailableWidth + spaceOffset); } // Word fits in the line else { - availableWidth -= wordWidth + spaceOffset; + localAvailableWidth -= wordWidth + spaceOffset; // NO remaining space if (remainingWidth == 0) { - return new LineAnalysis(startIndex, i + 1, availableWidth + return new LineAnalysis(startIndex, i + 1, localAvailableWidth + spaceOffset); } } @@ -488,15 +491,15 @@ private LineAnalysis fit(ListIterator iterator, int startIndex, float spac i++; } - return new LineAnalysis(startIndex, i, availableWidth + spaceOffset); + return new LineAnalysis(startIndex, i, localAvailableWidth + spaceOffset); } private static abstract class Token { - public int lineNumber; - public float y; + int lineNumber; + float y; - public Token(int lineNumber, float y) { + Token(int lineNumber, float y) { this.lineNumber = lineNumber; this.y = y; } @@ -514,15 +517,15 @@ public int getLineNumber() { private static class Unit extends Token { - public float x; - public String unit; + float x; + String unit; - public Unit(String unit) { + Unit(String unit) { super(0, 0); this.unit = unit; } - public Unit(int lineNumber, float x, float y, String unit) { + Unit(int lineNumber, float x, float y, String unit) { super(lineNumber, y); this.x = x; this.unit = unit; @@ -539,8 +542,8 @@ public String toString() { } } - private static class LineBreak extends Token { - public LineBreak(int lineNumber, float y) { + private final static class LineBreak extends Token { + LineBreak(int lineNumber, float y) { super(lineNumber, y); } @@ -554,15 +557,15 @@ public String toString() { } } - private static class SingleLine extends Unit { - public SingleLine(int lineNumber, float x, float y, String unit) { + private final static class SingleLine extends Unit { + SingleLine(int lineNumber, float x, float y, String unit) { super(lineNumber, x, y, unit); } } @SuppressWarnings("serial") class PlainDocumentException extends Exception { - public PlainDocumentException(String message) { + PlainDocumentException(String message) { super(message); } } @@ -572,13 +575,13 @@ public PlainDocumentException(String message) { * fit as many words as possible into one line */ - private class LineAnalysis { + private final class LineAnalysis { - public int start; - public int end; - public float remainWidth; + int start; + int end; + float remainWidth; - public LineAnalysis(int start, int end, float remainWidth) { + LineAnalysis(int start, int end, float remainWidth) { this.start = start; this.end = end; this.remainWidth = remainWidth; diff --git a/library/src/main/java/com/bluejamesbond/text/Styled.java b/library/src/main/java/com/bluejamesbond/text/Styled.java index 4b72bc5..89a5528 100644 --- a/library/src/main/java/com/bluejamesbond/text/Styled.java +++ b/library/src/main/java/com/bluejamesbond/text/Styled.java @@ -16,7 +16,7 @@ * {@link android.text.style.ReplacementSpan}. * */ -public class Styled { +public final class Styled { /** * Draws and/or measures a uniform run of text on a single line. No span of * interest should start or end in the middle of this run (if not @@ -92,10 +92,8 @@ private static float drawUniformRun(Canvas canvas, workPaint.setColor(workPaint.bgColor); workPaint.setStyle(Paint.Style.FILL); - if (!haveWidth) { - ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; - } + ret = workPaint.measureText(tmp, tmpstart, tmpend); + haveWidth = true; if (dir == Layout.DIR_RIGHT_TO_LEFT) { canvas.drawRect(x - ret, top, x, bottom, workPaint); @@ -110,7 +108,6 @@ private static float drawUniformRun(Canvas canvas, if (dir == Layout.DIR_RIGHT_TO_LEFT) { if (!haveWidth) { ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; } canvas.drawText(tmp, tmpstart, tmpend, @@ -119,7 +116,6 @@ private static float drawUniformRun(Canvas canvas, if (needWidth) { if (!haveWidth) { ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; } } @@ -127,9 +123,8 @@ private static float drawUniformRun(Canvas canvas, x, y + workPaint.baselineShift, workPaint); } } else { - if (needWidth && !haveWidth) { + if (needWidth) { ret = workPaint.measureText(tmp, tmpstart, tmpend); - haveWidth = true; } } } else { @@ -170,6 +165,7 @@ private static float drawUniformRun(Canvas canvas, * @param fmi FontMetrics information; can be null * @return the actual number of widths returned */ + @SuppressWarnings("UnusedReturnValue") public static int getTextWidths(TextPaint paint, TextPaint workPaint, Spanned text, int start, int end, @@ -233,6 +229,7 @@ private static float drawDirectionalRun(Canvas canvas, // having both parameters is redundant and confusing. // fast path for unstyled text + float currentX = x; if (!(text instanceof Spanned)) { float ret = 0; @@ -248,7 +245,7 @@ private static float drawDirectionalRun(Canvas canvas, if (canvas != null) { canvas.drawText(tmp, 0, tmpend, - x - ret, y, paint); + currentX - ret, y, paint); } } else { if (needWidth) { @@ -256,7 +253,7 @@ private static float drawDirectionalRun(Canvas canvas, } if (canvas != null) { - canvas.drawText(text, start, end, x, y, paint); + canvas.drawText(text, start, end, currentX, y, paint); } } @@ -267,7 +264,7 @@ private static float drawDirectionalRun(Canvas canvas, return ret * dir; // Layout.DIR_RIGHT_TO_LEFT == -1 } - float ox = x; + float ox = currentX; int minAscent = 0, maxDescent = 0, minTop = 0, maxBottom = 0; Spanned sp = (Spanned) text; @@ -286,8 +283,8 @@ private static float drawDirectionalRun(Canvas canvas, // XXX: if dir and runIsRtl were not the same, this would onDraw // spans in the wrong order, but no one appears to call it this // way. - x += drawUniformRun(canvas, sp, i, next, dir, runIsRtl, - x, top, y, bottom, fmi, paint, workPaint, + currentX += drawUniformRun(canvas, sp, i, next, dir, runIsRtl, + currentX, top, y, bottom, fmi, paint, workPaint, needWidth || next != end); if (fmi != null) { @@ -318,7 +315,7 @@ private static float drawDirectionalRun(Canvas canvas, } } - return x - ox; + return currentX - ox; } /** @@ -385,6 +382,7 @@ static float drawText(Canvas canvas, * @param needWidth If true, this method returns the width of drawn text * @return Width of the drawn text if needWidth is true */ + @SuppressWarnings("unused") public static float drawText(Canvas canvas, CharSequence text, int start, int end, int direction, @@ -393,14 +391,14 @@ public static float drawText(Canvas canvas, TextPaint workPaint, boolean needWidth) { // For safety. - direction = direction >= 0 ? Layout.DIR_LEFT_TO_RIGHT + int safeDirection = direction >= 0 ? Layout.DIR_LEFT_TO_RIGHT : Layout.DIR_RIGHT_TO_LEFT; // Hide runIsRtl parameter since it is meaningless for external // developers. // XXX: the runIsRtl probably ought to be the same as direction, then // this could onDraw rtl text. - return drawText(canvas, text, start, end, direction, false, + return drawText(canvas, text, start, end, safeDirection, false, x, top, y, bottom, paint, workPaint, needWidth); } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java index e2b0df2..659a23b 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/DefaultHyphenator.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; /* @@ -55,7 +56,7 @@ public class DefaultHyphenator implements IHyphenator { private static final HashMap cached; static { - cached = new HashMap(); + cached = new HashMap<>(); } private TrieNode trie; @@ -104,7 +105,7 @@ private TrieNode createTrie(Map patternObject) { t = t.codePoint.get(codePoint); } - List list = new ArrayList(); + List list = new ArrayList<>(); int digitStart = -1; for (int p = 0; p < pattern.length(); p++) { if (Character.isDigit(pattern.charAt(p))) { @@ -139,7 +140,8 @@ private TrieNode createTrie(Map patternObject) { public List hyphenate(String word) { word = "_" + word + "_"; - String lowercase = word.toLowerCase(); + Locale locale = Locale.getDefault(); + String lowercase = word.toLowerCase(locale); int wordLength = lowercase.length(); @@ -169,7 +171,7 @@ public List hyphenate(String word) { } } - List result = new ArrayList(); + List result = new ArrayList<>(); int start = 1; for (int i = 1; i < wordLength - 1; i++) { if (i > this.leftMin && i < (wordLength - this.rightMin) && points[i] % 2 > 0) { @@ -284,7 +286,7 @@ public HyphenPattern(int leftMin, int rightMin, Map patternObje } private class TrieNode { - Map codePoint = new HashMap(); + Map codePoint = new HashMap<>(); int[] points; } } diff --git a/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java b/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java index a415879..0286e91 100644 --- a/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java +++ b/library/src/main/java/com/bluejamesbond/text/hyphen/SqueezeHyphenator.java @@ -32,7 +32,7 @@ import java.util.ArrayList; import java.util.List; -public class SqueezeHyphenator implements IHyphenator { +public final class SqueezeHyphenator implements IHyphenator { private static SqueezeHyphenator squeezeHyphenator; @@ -50,7 +50,7 @@ public static SqueezeHyphenator getInstance() { @Override public List hyphenate(String word) { - List broken = new ArrayList(); + List broken = new ArrayList<>(); int len = word.length() - 1, i; for (i = 0; i < len; i += 2) { diff --git a/library/src/main/java/com/bluejamesbond/text/style/Direction.java b/library/src/main/java/com/bluejamesbond/text/style/Direction.java index 2843d20..61c7d7a 100644 --- a/library/src/main/java/com/bluejamesbond/text/style/Direction.java +++ b/library/src/main/java/com/bluejamesbond/text/style/Direction.java @@ -33,9 +33,9 @@ public enum Direction { LEFT_TO_RIGHT(false), RIGHT_TO_LEFT(true); - private boolean flag; + private final boolean flag; - private Direction(boolean flag) { + Direction(boolean flag) { this.flag = flag; } diff --git a/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java b/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java index 91a11b6..2c8e3d7 100644 --- a/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java +++ b/library/src/main/java/com/bluejamesbond/text/style/TextAlignment.java @@ -35,7 +35,7 @@ public enum TextAlignment { private final int mId; - private TextAlignment(int id) { + TextAlignment(int id) { mId = id; } diff --git a/library/src/main/java/com/bluejamesbond/text/util/Pagination.java b/library/src/main/java/com/bluejamesbond/text/util/Pagination.java index 1bafb3c..5679ed2 100644 --- a/library/src/main/java/com/bluejamesbond/text/util/Pagination.java +++ b/library/src/main/java/com/bluejamesbond/text/util/Pagination.java @@ -24,7 +24,8 @@ public Pagination(IDocumentLayout layout, int pageHeight) { this.pageHeight = pageHeight; } - private int addPageByTokenIndex(int pageFirstTokenIndex, int i) { + private int addPageByTokenIndex(int pageFirstTokenIndex, int index) { + int i = index; final int tokenLine = layout.getLineForToken(i); while (i < layout.getTokensCount() && layout.getLineForToken(i) == tokenLine) { i++; From 77bc17ad18d799db2c32923a94f2c0b84eaa99ff Mon Sep 17 00:00:00 2001 From: Nikita-Boyarskikh Date: Tue, 29 May 2018 01:39:04 +0300 Subject: [PATCH 34/34] Refactor sample with Android Studio inspections --- sample/src/main/AndroidManifest.xml | 1 - .../text/sample/helper/FontsOverride.java | 1 + .../text/sample/helper/MyQuoteSpan.java | 6 +- .../sample/helper/PressableDocumentView.java | 4 - .../text/sample/helper/TestActivity.java | 47 +++++--- .../text/sample/helper/Utils.java | 2 +- sample/src/main/res/layout/test_activity.xml | 14 +-- .../main/res/layout/test_complex_layout.xml | 101 +++++++++--------- sample/src/main/res/layout/test_listview.xml | 12 ++- .../main/res/layout/test_listview_item.xml | 3 +- .../res/layout/test_textview_xml_activity.xml | 15 +-- .../src/main/res/layout/test_xml_activity.xml | 12 ++- .../res/layout/test_xml_activity_no_cache.xml | 12 ++- .../src/main/res/layout/testlist_activity.xml | 4 +- sample/src/main/res/values/colors.xml | 4 + 15 files changed, 134 insertions(+), 104 deletions(-) create mode 100644 sample/src/main/res/values/colors.xml diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index aa2332b..19cdf44 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -32,7 +32,6 @@ package="com.bluejamesbond.text.sample"> diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java index aa080a0..19dda9b 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/FontsOverride.java @@ -38,6 +38,7 @@ import java.lang.reflect.Field; +@SuppressWarnings("unused") public final class FontsOverride { public static void setDefaultFont(Context context, diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java index 3f7beca..94bcc02 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/MyQuoteSpan.java @@ -40,14 +40,16 @@ public class MyQuoteSpan implements LeadingMarginSpan, ParcelableSpan { private final static int QUOTE_SPAN = 9; + private static final int DEFAULT_GAP_WIDTH = 30; + private static final int DEFAULT_COLOR = 0xff0000ff; private int mStripeWidth = 2; - private int mGapWidth = 30; + private int mGapWidth = DEFAULT_GAP_WIDTH; private int mColor; public MyQuoteSpan() { super(); - mColor = 0xff0000ff; + mColor = DEFAULT_COLOR; } public MyQuoteSpan(int color) { diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java index aa462d3..7b459d5 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/PressableDocumentView.java @@ -32,10 +32,6 @@ import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.MotionEvent; -import android.view.View; -import android.widget.LinearLayout; import com.bluejamesbond.text.DocumentView; import com.bluejamesbond.text.hyphen.SqueezeHyphenator; diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java index 6ffe772..a0f3197 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/TestActivity.java @@ -29,6 +29,7 @@ * Date: 1/27/15 3:35 AM */ +import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Typeface; import android.os.Bundle; @@ -43,8 +44,17 @@ import com.bluejamesbond.text.sample.R; import com.bluejamesbond.text.style.TextAlignment; +@SuppressLint("Registered") public class TestActivity extends Activity { + public static final int TEXT_SIZE = 12; + public static final float INSET_PADDING_LEFT = 30f; + public static final float INSET_PADDING_RIGHT = 30f; + public static final float INSET_PADDING_TOP = 30f; + public static final float INSET_PADDING_BOTTOM = 30f; + public static final float LINE_HEIGHT_MULTIPLIER = 1f; + public static final int FADE_IN_DURATION = 800; + public static final int FADE_IN_ANIMATION_STEP_DELAY = 30; public String testName; private boolean debugging = false; private int cacheConfig = 0; @@ -70,27 +80,22 @@ protected void onCreate(Bundle savedInstanceState) { public DocumentView addDocumentView(CharSequence article, int type, boolean rtl) { final DocumentView documentView = new DocumentView(this, type); - documentView.getDocumentLayoutParams().setTextColor(0xffffffff); + documentView.getDocumentLayoutParams().setTextColor(R.color.black); documentView.getDocumentLayoutParams().setTextTypeface(Typeface.DEFAULT); - documentView.getDocumentLayoutParams().setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); + documentView.getDocumentLayoutParams().setTextSize(TypedValue.COMPLEX_UNIT_SP, TEXT_SIZE); documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED); - documentView.getDocumentLayoutParams().setInsetPaddingLeft(30f); - documentView.getDocumentLayoutParams().setInsetPaddingRight(30f); - documentView.getDocumentLayoutParams().setInsetPaddingTop(30f); - documentView.getDocumentLayoutParams().setInsetPaddingBottom(30f); - documentView.getDocumentLayoutParams().setLineHeightMultiplier(1f); + documentView.getDocumentLayoutParams().setInsetPaddingLeft(INSET_PADDING_LEFT); + documentView.getDocumentLayoutParams().setInsetPaddingRight(INSET_PADDING_RIGHT); + documentView.getDocumentLayoutParams().setInsetPaddingTop(INSET_PADDING_TOP); + documentView.getDocumentLayoutParams().setInsetPaddingBottom(INSET_PADDING_BOTTOM); + documentView.getDocumentLayoutParams().setLineHeightMultiplier(LINE_HEIGHT_MULTIPLIER); documentView.getDocumentLayoutParams().setReverse(rtl); documentView.getDocumentLayoutParams().setDebugging(debugging); documentView.setText(article); documentView.setProgressBar((ProgressBar) findViewById(R.id.progressBar)); - documentView.setFadeInDuration(800); - documentView.setFadeInAnimationStepDelay(30); - documentView.setFadeInTween(new DocumentView.ITween() { - @Override - public float get(float t, float b, float c, float d) { - return c * (t /= d) * t * t + b; - } - }); + documentView.setFadeInDuration(FADE_IN_DURATION); + documentView.setFadeInAnimationStepDelay(FADE_IN_ANIMATION_STEP_DELAY); + documentView.setFadeInTween(new FadeInAnymation()); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); @@ -106,14 +111,15 @@ public float get(float t, float b, float c, float d) { cacheConfig = documentView.getCacheConfig().getId(); final TextView debugButton = (TextView) findViewById(R.id.debugButton); + final String debugText = String.format("%s DEBUG", debugging ? "DISABLE" : "ENABLE"); if (debugButton != null) { - debugButton.setText((debugging ? "DISABLE" : "ENABLE") + " DEBUG"); + debugButton.setText(debugText); debugButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { debugging = !debugging; - debugButton.setText((debugging ? "DISABLE" : "ENABLE") + " DEBUG"); + debugButton.setText(debugText); documentView.getDocumentLayoutParams().setDebugging(debugging); } }); @@ -144,4 +150,11 @@ public void onClick(View view) { public DocumentView addDocumentView(CharSequence article, int type) { return addDocumentView(article, type, false); } + + private static class FadeInAnymation implements DocumentView.ITween { + @Override + public float get(float t, float b, float c, float d) { + return c * (t /= d) * t * t + b; + } + } } diff --git a/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java b/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java index 55aebc5..483ea4b 100644 --- a/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java +++ b/sample/src/main/java/com/bluejamesbond/text/sample/helper/Utils.java @@ -29,7 +29,7 @@ * Date: 1/27/15 3:35 AM */ -public class Utils { +public final class Utils { /* * Refer to http://stackoverflow.com/a/2560017/1100536 diff --git a/sample/src/main/res/layout/test_activity.xml b/sample/src/main/res/layout/test_activity.xml index 4150635..6f6638d 100644 --- a/sample/src/main/res/layout/test_activity.xml +++ b/sample/src/main/res/layout/test_activity.xml @@ -52,7 +52,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> diff --git a/sample/src/main/res/layout/test_complex_layout.xml b/sample/src/main/res/layout/test_complex_layout.xml index 2e559c8..082e403 100644 --- a/sample/src/main/res/layout/test_complex_layout.xml +++ b/sample/src/main/res/layout/test_complex_layout.xml @@ -52,7 +52,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> - - + android:layout_alignParentTop="true"> - - - + - + - + @@ -167,7 +163,9 @@ android:background="#3498db" android:gravity="center" android:textAlignment="center" - android:textColor="#FFFFFF"/> + android:textColor="#FFFFFF" + android:layout_marginEnd="15dp" + android:contentDescription="LikeImage" /> + android:textColor="#FFFFFF" + android:layout_marginEnd="5dp" + android:contentDescription="LeftCenterIcon" /> + android:textColor="#FFFFFF" + android:layout_marginStart="5dp" + android:contentDescription="RightCenterIcon" /> @@ -207,7 +209,9 @@ android:background="#e74c3c" android:gravity="center" android:textAlignment="center" - android:textColor="#FFFFFF"/> + android:textColor="#FFFFFF" + android:layout_marginStart="15dp" + android:contentDescription="DislikeImage" /> @@ -216,7 +220,8 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" - android:background="#FF00FF"/> + android:background="#FF00FF" + android:contentDescription="LoginImage" /> diff --git a/sample/src/main/res/layout/test_listview.xml b/sample/src/main/res/layout/test_listview.xml index f9433b6..9c420d4 100644 --- a/sample/src/main/res/layout/test_listview.xml +++ b/sample/src/main/res/layout/test_listview.xml @@ -52,7 +52,7 @@ android:padding="20dp" android:text="@string/titlebar" android:textColor="@android:color/white" - android:textSize="20dp" + android:textSize="20sp" android:textStyle="bold"/> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textAppearance="@android:style/TextAppearance.Large" + android:textIsSelectable="true" /> @@ -68,8 +68,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> @@ -76,8 +76,9 @@ android:padding="10dp" android:text="@string/debug_button" android:textColor="#aaaaaa" - android:textSize="13dp" - android:textStyle="bold"/> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> + android:textSize="13sp" + android:textStyle="bold" + android:focusable="true" /> diff --git a/sample/src/main/res/values/colors.xml b/sample/src/main/res/values/colors.xml new file mode 100644 index 0000000..44a9a74 --- /dev/null +++ b/sample/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + 0xffffffff + \ No newline at end of file