diff --git a/.github/workflows/Release.yaml b/.github/workflows/Release.yaml index 70f22de..8598481 100644 --- a/.github/workflows/Release.yaml +++ b/.github/workflows/Release.yaml @@ -16,7 +16,7 @@ jobs: # Константы, используемые далее по тексту env: PROJ: ${{ github.event.repository.name }} - TAG: '1.3.2' + TAG: '1.3.3' steps: # Проверка состава репозитория (без анализа, как может показаться) diff --git a/.release/Release.md b/.release/Release.md index 6ee1b1f..d419f17 100644 --- a/.release/Release.md +++ b/.release/Release.md @@ -1,6 +1,4 @@ -_Changes for v 1.3.2_: -- Access and appearance of the Lab Policy have been updated; -- `Android`: app target API has been upgraded to 35; +_Changes for v 1.3.3_: - `Android`: MAUI support packages have been updated; -- Implemented the search for specified word or phrase (thanks to @MecyJere); -- `Windows`: added some useful hotkeys +- Access and appearance of the Lab Policy have been updated; +- `Android`: app target API has been upgraded to 35 diff --git a/.release/TextStats.apk b/.release/TextStats.apk index 7ba0591..d33743a 100644 Binary files a/.release/TextStats.apk and b/.release/TextStats.apk differ diff --git a/.release/TextStats.exe b/.release/TextStats.exe new file mode 100644 index 0000000..c543ba6 Binary files /dev/null and b/.release/TextStats.exe differ diff --git a/.release/TextStats_en_us.html b/.release/TextStats_en_us.html new file mode 100644 index 0000000..a707259 --- /dev/null +++ b/.release/TextStats_en_us.html @@ -0,0 +1,72 @@ + + + +TextStats: user guide | TextStats + + + +

TextStats: user guide

+

ƒ RD AAOW FDL

+ +
+

This tool obtains statistics on the specified text. It allows you to collect next data:

+ +

The text can be loaded from file under UTF8, UTF16 and CP1251 encodings (auto-detection by +preamble). Statistics can also be saved to file.

+ +
+ +

Supported characters

+

This app now detects only next characters as letters when considering words, +sentences and paragraphs. Other characters will be treated as separators. Let us know if you +need to change this behavior.

+ +
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
+абвгдеёжзийклмнопрстуфхцчшщъыьэюя
+
+ +
ABCDEFGHIJKLMNOPQRSTUVWXYZ
+abcdefghijklmnopqrstuvwxyz
+
+ +
0123456789
+
+ +
-'’
+
+ + + +
+ +

Hotkeys

+

For Windows:

+ + + + diff --git a/.release/TextStats_ru_ru.html b/.release/TextStats_ru_ru.html new file mode 100644 index 0000000..26ae00e --- /dev/null +++ b/.release/TextStats_ru_ru.html @@ -0,0 +1,73 @@ + + + +TextStats: руководство пользователя | TextStats + + + + +

TextStats: руководство пользователя

+

ƒ RD AAOW FDL

+ +
+

Этот инструмент получает статистику по указанному тексту. Он позволяет собирать следующие данные:

+ +

Текст можно загрузить из файла в кодировках UTF8, UTF16 и CP1251 (автоматическое определение +по преамбуле). Статистику также можно сохранить в файл.

+ +
+ +

Поддерживаемые символы

+

Это приложение сейчас определяет только следующие символы как буквы при учёте +слов, предложений и абзацев. Другие символы будут обрабатываться как разделители. Сообщите нам, +если вам необходимо изменить это поведение.

+ +
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
+абвгдеёжзийклмнопрстуфхцчшщъыьэюя
+
+ +
ABCDEFGHIJKLMNOPQRSTUVWXYZ
+abcdefghijklmnopqrstuvwxyz
+
+ +
0123456789
+
+ +
-'’
+
+ + + +
+ +

Горячие клавиши

+

Для Windows:

+ + + + diff --git a/Changes.log b/Changes.log index 727d148..4f3561d 100644 --- a/Changes.log +++ b/Changes.log @@ -1,5 +1,8 @@ TextStats: changes log +Version 1.3.3: +• Android: MAUI support packages have been updated + Version 1.3.2: • Access and appearance of the Lab Policy have been updated; • Android: app target API has been upgraded to 35; diff --git a/src/TextStats.cs b/src/TextStats.cs index 671775c..f221409 100644 --- a/src/TextStats.cs +++ b/src/TextStats.cs @@ -27,9 +27,9 @@ public static void Main () return; // Отображение справки и запроса на принятие Политики - if (!RDGenerics.AcceptEULA ()) + if (!RDInterface.AcceptEULA ()) return; - RDGenerics.ShowAbout (true); + RDInterface.ShowAbout (true); // Запуск Application.Run (new TextStatsForm ()); diff --git a/src/TextStatsForm.cs b/src/TextStatsForm.cs index 809871e..70daf28 100644 --- a/src/TextStatsForm.cs +++ b/src/TextStatsForm.cs @@ -98,7 +98,7 @@ private void LanguageCombo_SelectedIndexChanged (object sender, EventArgs e) // Запрос справки private void AboutButton_Clicked (object sender, EventArgs e) { - RDGenerics.ShowAbout (false); + RDInterface.ShowAbout (false); } // Закрытие окна @@ -207,15 +207,15 @@ private void SearchButton_Click (object sender, EventArgs e) bool hasFile = !string.IsNullOrWhiteSpace (TextStatsMath.LastFilePath); if (!hasManualText && !hasFile) { - RDGenerics.LocalizedMessageBox (RDMessageTypes.Warning_Center, "SearchSourceNotFound", 1000); + RDInterface.LocalizedMessageBox (RDMessageTypes.Warning_Center, "SearchSourceNotFound", 1000); return; } // Ввод текста - string textForSearch = RDGenerics.LocalizedMessageBox ("SearchRequest", true, 50); + string textForSearch = RDInterface.LocalizedMessageBox ("SearchRequest", true, 50); if (string.IsNullOrWhiteSpace (textForSearch)) { - RDGenerics.LocalizedMessageBox (RDMessageTypes.Warning_Center, "SearchSourceNotFound", 1000); + RDInterface.LocalizedMessageBox (RDMessageTypes.Warning_Center, "SearchSourceNotFound", 1000); return; } @@ -224,7 +224,7 @@ private void SearchButton_Click (object sender, EventArgs e) bool useManualText = false; if (hasFile && hasManualText) { - switch (RDGenerics.MessageBox (RDMessageTypes.Question_Center, RDLocale.GetText ("SearchVariant"), + switch (RDInterface.MessageBox (RDMessageTypes.Question_Center, RDLocale.GetText ("SearchVariant"), RDLocale.GetText ("SearchVariantFile"), RDLocale.GetText ("SearchVariantText"), RDLocale.GetDefaultText (RDLDefaultTexts.Button_Cancel))) { @@ -258,7 +258,7 @@ private void SearchButton_Click (object sender, EventArgs e) // Результат string stats = TextStatsMath.SearchForText (sourceText, textForSearch); - if (RDGenerics.MessageBox (RDMessageTypes.Information_Left, stats, + if (RDInterface.MessageBox (RDMessageTypes.Information_Left, stats, RDLocale.GetDefaultText (RDLDefaultTexts.Button_Close), RDLocale.GetDefaultText (RDLDefaultTexts.Button_Save)) == RDMessageButtons.ButtonTwo) { diff --git a/src/android/AndroidManifest.xml b/src/android/AndroidManifest.xml index 9d43689..0e51bd3 100644 --- a/src/android/AndroidManifest.xml +++ b/src/android/AndroidManifest.xml @@ -1,6 +1,6 @@  + android:installLocation="internalOnly" android:versionCode="600108" android:versionName="1.3.3"> diff --git a/src/android/App.xaml.cs b/src/android/App.xaml.cs index 04a56e9..cef780d 100644 --- a/src/android/App.xaml.cs +++ b/src/android/App.xaml.cs @@ -52,41 +52,41 @@ public App () { // Инициализация InitializeComponent (); - flags = AndroidSupport.GetAppStartupFlags (RDAppStartupFlags.DisableXPUN | + flags = RDGenerics.GetAppStartupFlags (RDAppStartupFlags.DisableXPUN | RDAppStartupFlags.CanReadFiles | RDAppStartupFlags.CanWriteFiles); // Общая конструкция страниц приложения MainPage = new MasterPage (); - solutionPage = AndroidSupport.ApplyPageSettings (new SolutionPage (), "SolutionPage", + solutionPage = RDInterface.ApplyPageSettings (new SolutionPage (), "SolutionPage", RDLocale.GetText ("SolutionPage"), solutionMasterBackColor); - aboutPage = AndroidSupport.ApplyPageSettings (new AboutPage (), "AboutPage", + aboutPage = RDInterface.ApplyPageSettings (new AboutPage (), "AboutPage", RDLocale.GetDefaultText (RDLDefaultTexts.Control_AppAbout), aboutMasterBackColor); - AndroidSupport.SetMasterPage (MainPage, solutionPage, solutionMasterBackColor); + RDInterface.SetMasterPage (MainPage, solutionPage, solutionMasterBackColor); #region Основная страница // Поле ввода текста - AndroidSupport.ApplyLabelSettings (solutionPage, "EnterTextLabel", + RDInterface.ApplyLabelSettings (solutionPage, "EnterTextLabel", RDLocale.GetText ("EnterTextLabel"), RDLabelTypes.HeaderLeft); - manualTextBox = AndroidSupport.ApplyEditorSettings (solutionPage, "ManualTextBox", + manualTextBox = RDInterface.ApplyEditorSettings (solutionPage, "ManualTextBox", solutionFieldBackColor, Keyboard.Text, 10000, "", null, false); - AndroidSupport.ApplyButtonSettings (solutionPage, "GetStatsButton", + RDInterface.ApplyButtonSettings (solutionPage, "GetStatsButton", RDLocale.GetText ("GetManualStats"), solutionFieldBackColor, GetStatsButton_Clicked, false); // Загрузка из файла - AndroidSupport.ApplyLabelSettings (solutionPage, "LoadFileLabel", + RDInterface.ApplyLabelSettings (solutionPage, "LoadFileLabel", RDLocale.GetText ("LoadFileLabel"), RDLabelTypes.HeaderLeft); - AndroidSupport.ApplyButtonSettings (solutionPage, "ClipboardButton", + RDInterface.ApplyButtonSettings (solutionPage, "ClipboardButton", RDLocale.GetText ("ClipboardButton"), solutionFieldBackColor, ClipboardButton_Clicked, false); - Button lfb = AndroidSupport.ApplyButtonSettings (solutionPage, "LoadFileButton", + Button lfb = RDInterface.ApplyButtonSettings (solutionPage, "LoadFileButton", RDLocale.GetText ("FileButton"), solutionFieldBackColor, LoadFile_Clicked, false); - Label lft = AndroidSupport.ApplyLabelSettings (solutionPage, "LoadFileTip", + Label lft = RDInterface.ApplyLabelSettings (solutionPage, "LoadFileTip", RDLocale.GetDefaultText (RDLDefaultTexts.Message_NotificationPermission), RDLabelTypes.ErrorTip); @@ -94,7 +94,7 @@ public App () lft.IsVisible = flags.HasFlag (RDAppStartupFlags.CanReadFiles); // Раздел результатов - statsLabel = AndroidSupport.ApplyLabelSettings (solutionPage, "StatsLabel", + statsLabel = RDInterface.ApplyLabelSettings (solutionPage, "StatsLabel", RDLocale.GetText ("StatsLabel"), RDLabelTypes.HeaderLeft); resultField = (StackLayout)solutionPage.FindByName ("ResultField"); @@ -105,24 +105,25 @@ public App () { Label l = new Label (); l.FontAttributes = FontAttributes.Bold | FontAttributes.Italic; - l.FontSize = AndroidSupport.MasterFontSize * 1.1; + l.FontSize = RDInterface.MasterFontSize * 1.1; l.HorizontalOptions = LayoutOptions.Start; l.HorizontalTextAlignment = TextAlignment.Start; l.Margin = new Thickness (3); l.Text = captions[i + 1]; - l.TextColor = AndroidSupport.MasterTextColor; + /*l.TextColor = AndroidSupport.MasterTextColor;*/ + l.TextColor = RDInterface.GetInterfaceColor (RDInterfaceColors.AndroidTextColor); resultField.Add (l); resultFields.Add (new Label ()); - /*resultFields[i].BackgroundColor = Color.FromRgba (0, 0, 0, 15);*/ resultFields[i].FontAttributes = FontAttributes.None; - resultFields[i].FontFamily = AndroidSupport.MonospaceFont; - resultFields[i].FontSize = AndroidSupport.MasterFontSize * 1.05; + resultFields[i].FontFamily = RDGenerics.MonospaceFont; + resultFields[i].FontSize = RDInterface.MasterFontSize * 1.05; resultFields[i].HorizontalOptions = LayoutOptions.Start; resultFields[i].HorizontalTextAlignment = TextAlignment.Start; resultFields[i].Margin = new Thickness (6); resultFields[i].Text = ""; - resultFields[i].TextColor = AndroidSupport.MasterTextColor; + /*resultFields[i].TextColor = AndroidSupport.MasterTextColor;*/ + resultFields[i].TextColor = RDInterface.GetInterfaceColor (RDInterfaceColors.AndroidTextColor); resultField.Add (resultFields[i]); resultField.Add (new Label ()); @@ -130,13 +131,13 @@ public App () resultField.IsVisible = false; // Вызов меню и сохранение - AndroidSupport.ApplyButtonSettings (solutionPage, "MenuButton", + RDInterface.ApplyButtonSettings (solutionPage, "MenuButton", RDDefaultButtons.Menu, solutionFieldBackColor, AboutButton_Clicked); - AndroidSupport.ApplyButtonSettings (solutionPage, "SearchButton", + RDInterface.ApplyButtonSettings (solutionPage, "SearchButton", RDDefaultButtons.Find, solutionFieldBackColor, SearchButton_Clicked); - Button ssb = AndroidSupport.ApplyButtonSettings (solutionPage, "SaveStatsButton", + Button ssb = RDInterface.ApplyButtonSettings (solutionPage, "SaveStatsButton", RDLocale.GetText ("SaveStatsButton"), solutionFieldBackColor, SaveFile_Clicked, false); - Label sst = AndroidSupport.ApplyLabelSettings (solutionPage, "SaveStatsTip", + Label sst = RDInterface.ApplyLabelSettings (solutionPage, "SaveStatsTip", RDLocale.GetDefaultText (RDLDefaultTexts.Message_NotificationPermission), RDLabelTypes.ErrorTip); @@ -147,45 +148,45 @@ public App () #region Страница "О программе" - AndroidSupport.ApplyLabelSettings (aboutPage, "AboutLabel", + RDInterface.ApplyLabelSettings (aboutPage, "AboutLabel", RDGenerics.AppAboutLabelText, RDLabelTypes.AppAbout); - AndroidSupport.ApplyButtonSettings (aboutPage, "ManualsButton", + RDInterface.ApplyButtonSettings (aboutPage, "ManualsButton", RDLocale.GetDefaultText (RDLDefaultTexts.Control_ReferenceMaterials), aboutFieldBackColor, ReferenceButton_Click, false); - AndroidSupport.ApplyButtonSettings (aboutPage, "HelpButton", + RDInterface.ApplyButtonSettings (aboutPage, "HelpButton", RDLocale.GetDefaultText (RDLDefaultTexts.Control_HelpSupport), aboutFieldBackColor, HelpButton_Click, false); - AndroidSupport.ApplyLabelSettings (aboutPage, "GenericSettingsLabel", + RDInterface.ApplyLabelSettings (aboutPage, "GenericSettingsLabel", RDLocale.GetDefaultText (RDLDefaultTexts.Control_GenericSettings), RDLabelTypes.HeaderLeft); - AndroidSupport.ApplyLabelSettings (aboutPage, "RestartTipLabel", + RDInterface.ApplyLabelSettings (aboutPage, "RestartTipLabel", RDLocale.GetDefaultText (RDLDefaultTexts.Message_RestartRequired), RDLabelTypes.TipCenter); - AndroidSupport.ApplyLabelSettings (aboutPage, "LanguageLabel", + RDInterface.ApplyLabelSettings (aboutPage, "LanguageLabel", RDLocale.GetDefaultText (RDLDefaultTexts.Control_InterfaceLanguage), RDLabelTypes.DefaultLeft); - languageButton = AndroidSupport.ApplyButtonSettings (aboutPage, "LanguageSelector", + languageButton = RDInterface.ApplyButtonSettings (aboutPage, "LanguageSelector", RDLocale.LanguagesNames[(int)RDLocale.CurrentLanguage], aboutFieldBackColor, SelectLanguage_Clicked, false); - AndroidSupport.ApplyLabelSettings (aboutPage, "FontSizeLabel", + RDInterface.ApplyLabelSettings (aboutPage, "FontSizeLabel", RDLocale.GetDefaultText (RDLDefaultTexts.Control_InterfaceFontSize), RDLabelTypes.DefaultLeft); - AndroidSupport.ApplyButtonSettings (aboutPage, "FontSizeInc", + RDInterface.ApplyButtonSettings (aboutPage, "FontSizeInc", RDDefaultButtons.Increase, aboutFieldBackColor, FontSizeButton_Clicked); - AndroidSupport.ApplyButtonSettings (aboutPage, "FontSizeDec", + RDInterface.ApplyButtonSettings (aboutPage, "FontSizeDec", RDDefaultButtons.Decrease, aboutFieldBackColor, FontSizeButton_Clicked); - aboutFontSizeField = AndroidSupport.ApplyLabelSettings (aboutPage, "FontSizeField", + aboutFontSizeField = RDInterface.ApplyLabelSettings (aboutPage, "FontSizeField", " ", RDLabelTypes.DefaultCenter); - AndroidSupport.ApplyLabelSettings (aboutPage, "HelpHeaderLabel", + RDInterface.ApplyLabelSettings (aboutPage, "HelpHeaderLabel", RDLocale.GetDefaultText (RDLDefaultTexts.Control_AppAbout), RDLabelTypes.HeaderLeft); - Label htl = AndroidSupport.ApplyLabelSettings (aboutPage, "HelpTextLabel", - AndroidSupport.GetAppHelpText (), RDLabelTypes.SmallLeft); + Label htl = RDInterface.ApplyLabelSettings (aboutPage, "HelpTextLabel", + RDGenerics.GetAppHelpText (), RDLabelTypes.SmallLeft); htl.TextType = TextType.Html; FontSizeButton_Clicked (null, null); @@ -201,13 +202,13 @@ private async void ShowStartupTips () { // Контроль XPUN if (!flags.HasFlag (RDAppStartupFlags.DisableXPUN)) - await AndroidSupport.XPUNLoop (); + await RDInterface.XPUNLoop (); // Требование принятия Политики if (TipsState.HasFlag (TipTypes.PolicyTip)) return; - await AndroidSupport.PolicyLoop (); + await RDInterface.PolicyLoop (); TipsState |= TipTypes.PolicyTip; } @@ -252,18 +253,18 @@ public enum TipTypes // Выбор языка приложения private async void SelectLanguage_Clicked (object sender, EventArgs e) { - languageButton.Text = await AndroidSupport.CallLanguageSelector (); + languageButton.Text = await RDInterface.CallLanguageSelector (); } // Вызов справочных материалов private async void ReferenceButton_Click (object sender, EventArgs e) { - await AndroidSupport.CallHelpMaterials (RDHelpMaterials.ReferenceMaterials); + await RDInterface.CallHelpMaterials (RDHelpMaterials.ReferenceMaterials); } private async void HelpButton_Click (object sender, EventArgs e) { - await AndroidSupport.CallHelpMaterials (RDHelpMaterials.HelpAndSupport); + await RDInterface.CallHelpMaterials (RDHelpMaterials.HelpAndSupport); } // Изменение размера шрифта интерфейса @@ -272,14 +273,14 @@ private void FontSizeButton_Clicked (object sender, EventArgs e) if (sender != null) { Button b = (Button)sender; - if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Increase)) - AndroidSupport.MasterFontSize += 0.5; - else if (AndroidSupport.IsNameDefault (b.Text, RDDefaultButtons.Decrease)) - AndroidSupport.MasterFontSize -= 0.5; + if (RDInterface.IsNameDefault (b.Text, RDDefaultButtons.Increase)) + RDInterface.MasterFontSize += 0.5; + else if (RDInterface.IsNameDefault (b.Text, RDDefaultButtons.Decrease)) + RDInterface.MasterFontSize -= 0.5; } - aboutFontSizeField.Text = AndroidSupport.MasterFontSize.ToString ("F1"); - aboutFontSizeField.FontSize = AndroidSupport.MasterFontSize; + aboutFontSizeField.Text = RDInterface.MasterFontSize.ToString ("F1"); + aboutFontSizeField.FontSize = RDInterface.MasterFontSize; } #endregion @@ -289,13 +290,13 @@ private void FontSizeButton_Clicked (object sender, EventArgs e) // Метод открывает страницу О программе private void AboutButton_Clicked (object sender, EventArgs e) { - AndroidSupport.SetCurrentPage (aboutPage, aboutMasterBackColor); + RDInterface.SetCurrentPage (aboutPage, aboutMasterBackColor); } // Метод извлекает текст из буфера обмена private async void ClipboardButton_Clicked (object sender, EventArgs e) { - AndroidSupport.HideKeyboard (manualTextBox); + RDGenerics.HideKeyboard (manualTextBox); manualTextBox.Text = await RDGenerics.GetFromClipboard (); FillFields (); @@ -308,7 +309,7 @@ private async void LoadFile_Clicked (object sender, EventArgs e) if (string.IsNullOrWhiteSpace (text)) { ClearFields (false); - AndroidSupport.ShowBalloon (RDLocale.GetText ("NonTextFile"), true); + RDInterface.ShowBalloon (RDLocale.GetText ("NonTextFile"), true); return; } @@ -348,7 +349,7 @@ private void ClearFields (bool Message) resultField.IsVisible = false; if (Message) - AndroidSupport.ShowBalloon (RDLocale.GetText ("TextIsEmpty"), true); + RDInterface.ShowBalloon (RDLocale.GetText ("TextIsEmpty"), true); } private void LoadFields () @@ -362,7 +363,7 @@ private void LoadFields () // Метод получается статистику по введённому тексту private void GetStatsButton_Clicked (object sender, EventArgs e) { - AndroidSupport.HideKeyboard (manualTextBox); + RDGenerics.HideKeyboard (manualTextBox); FillFields (); } @@ -380,17 +381,17 @@ private async void SearchButton_Clicked (object sender, EventArgs e) bool hasFile = !string.IsNullOrWhiteSpace (TextStatsMath.LastFilePath); if (!hasManualText && !hasFile) { - AndroidSupport.ShowBalloon (RDLocale.GetText ("SearchSourceNotFound"), true); + RDInterface.ShowBalloon (RDLocale.GetText ("SearchSourceNotFound"), true); return; } // Ввод текста - string textForSearch = await AndroidSupport.ShowInput (ProgramDescription.AssemblyVisibleName, + string textForSearch = await RDInterface.ShowInput (ProgramDescription.AssemblyVisibleName, RDLocale.GetText ("SearchRequest"), RDLocale.GetDefaultText (RDLDefaultTexts.Button_OK), RDLocale.GetDefaultText (RDLDefaultTexts.Button_Cancel), 50, Keyboard.Default); if (string.IsNullOrWhiteSpace (textForSearch)) { - AndroidSupport.ShowBalloon (RDLocale.GetText ("SearchSourceNotFound"), true); + RDInterface.ShowBalloon (RDLocale.GetText ("SearchSourceNotFound"), true); return; } @@ -405,7 +406,7 @@ private async void SearchButton_Clicked (object sender, EventArgs e) searchVariants.Add (RDLocale.GetText ("SearchVariantText")); } - int res = await AndroidSupport.ShowList (RDLocale.GetText ("SearchVariant"), + int res = await RDInterface.ShowList (RDLocale.GetText ("SearchVariant"), RDLocale.GetDefaultText (RDLDefaultTexts.Button_Cancel), searchVariants); switch (res) @@ -440,7 +441,7 @@ private async void SearchButton_Clicked (object sender, EventArgs e) // Результат string stats = TextStatsMath.SearchForText (sourceText, textForSearch); - if (!await AndroidSupport.ShowMessage (stats, + if (!await RDInterface.ShowMessage (stats, RDLocale.GetDefaultText (RDLDefaultTexts.Button_Close), RDLocale.GetDefaultText (RDLDefaultTexts.Button_Save))) {