diff --git a/lib/model/katex.dart b/lib/model/katex.dart index d7d09d5ea2..2a39e0019b 100644 --- a/lib/model/katex.dart +++ b/lib/model/katex.dart @@ -116,31 +116,27 @@ MathParserResult? parseMath(dom.Element element, { required bool block }) { // content parsing stage here, thus the `!` here. final globalStore = ZulipBinding.instance.getGlobalStoreSync()!; final globalSettings = globalStore.settings; - final flagRenderKatex = - globalSettings.getBool(BoolGlobalSetting.renderKatex); final flagForceRenderKatex = globalSettings.getBool(BoolGlobalSetting.forceRenderKatex); KatexParserHardFailReason? hardFailReason; KatexParserSoftFailReason? softFailReason; List? nodes; - if (flagRenderKatex) { - final parser = _KatexParser(); - try { - nodes = parser.parseKatexHtml(katexHtmlElement); - } on _KatexHtmlParseError catch (e, st) { - assert(debugLog('$e\n$st')); - hardFailReason = KatexParserHardFailReason( - message: e.message, - stackTrace: st); - } + final parser = _KatexParser(); + try { + nodes = parser.parseKatexHtml(katexHtmlElement); + } on _KatexHtmlParseError catch (e, st) { + assert(debugLog('$e\n$st')); + hardFailReason = KatexParserHardFailReason( + message: e.message, + stackTrace: st); + } - if (parser.hasError && !flagForceRenderKatex) { - nodes = null; - softFailReason = KatexParserSoftFailReason( - unsupportedCssClasses: parser.unsupportedCssClasses, - unsupportedInlineCssProperties: parser.unsupportedInlineCssProperties); - } + if (parser.hasError && !flagForceRenderKatex) { + nodes = null; + softFailReason = KatexParserSoftFailReason( + unsupportedCssClasses: parser.unsupportedCssClasses, + unsupportedInlineCssProperties: parser.unsupportedInlineCssProperties); } return MathParserResult( diff --git a/lib/model/settings.dart b/lib/model/settings.dart index 4e71224444..384d2e5c30 100644 --- a/lib/model/settings.dart +++ b/lib/model/settings.dart @@ -177,9 +177,6 @@ enum BoolGlobalSetting { /// welcome dialog for upgrading from the legacy app. upgradeWelcomeDialogShown(GlobalSettingType.internal, false), - /// An experimental flag to toggle rendering KaTeX content in messages. - renderKatex(GlobalSettingType.experimentalFeatureFlag, true), - /// An experimental flag to enable rendering KaTeX even when some /// errors are encountered. forceRenderKatex(GlobalSettingType.experimentalFeatureFlag, false), @@ -187,6 +184,7 @@ enum BoolGlobalSetting { // Former settings which might exist in the database, // whose names should therefore not be reused: // openFirstUnread // v0.0.30 + // renderKatex // v0.0.29 - v30.0.261 ; const BoolGlobalSetting(this.type, this.default_); diff --git a/test/model/content_test.dart b/test/model/content_test.dart index 5eaf5500fa..9cabfbb3b8 100644 --- a/test/model/content_test.dart +++ b/test/model/content_test.dart @@ -6,7 +6,6 @@ import 'package:stack_trace/stack_trace.dart'; import 'package:test/scaffolding.dart'; import 'package:zulip/model/code_block.dart'; import 'package:zulip/model/content.dart'; -import 'package:zulip/model/settings.dart'; import 'package:zulip/model/katex.dart'; import 'binding.dart'; @@ -528,6 +527,20 @@ class ContentExample { ]), ])); + // A test message to test the fallback behaviour of KaTeX implementation. + static final mathInlineUnknown = ContentExample.inline( + 'inline math', + null, // r"$$ \lambda $$" (hypothetical server variation) + expectedText: r'\lambda', + '

' + 'λ' + ' \\lambda ' + '

', + MathInlineNode(texSource: r'\lambda', nodes: null)); + static const mathBlock = ContentExample( 'math block', "```math\n\\lambda\n```", @@ -547,6 +560,20 @@ class ContentExample { ]), ])]); + // A test message to test the fallback behaviour of KaTeX implementation. + static const mathBlockUnknown = ContentExample( + 'math block unknown, fallback to TeX source', + null, // r"```math\n\lambda\n```" (hypothetical server variation) + expectedText: r'\lambda', + '

' + 'λ' + '\\lambda' + '

', + [MathBlockNode(texSource: r'\lambda', nodes: null)]); + static const mathBlocksMultipleInParagraph = ContentExample( 'math blocks, multiple in paragraph', '```math\na\n\nb\n```', @@ -1484,10 +1511,6 @@ void main() async { TestZulipBinding.ensureInitialized(); - // We need this to be able to test the currently experimental KaTeX code. - await testBinding.globalStore.settings.setBool( - BoolGlobalSetting.renderKatex, true); - // // Inline content. // @@ -1599,6 +1622,7 @@ void main() async { testParseExample(ContentExample.emojiZulipExtra); testParseExample(ContentExample.mathInline); + testParseExample(ContentExample.mathInlineUnknown); group('global times', () { testParseExample(ContentExample.globalTime); @@ -1777,6 +1801,8 @@ void main() async { // into the context of a Zulip message. // For tests going deeper inside KaTeX content, see katex_test.dart. testParseExample(ContentExample.mathBlock); + testParseExample(ContentExample.mathBlockUnknown); + testParseExample(ContentExample.mathBlocksMultipleInParagraph); testParseExample(ContentExample.mathBlockInQuote); testParseExample(ContentExample.mathBlocksMultipleInQuote); diff --git a/test/model/katex_test.dart b/test/model/katex_test.dart index 3b0916d3c0..9b2520bd51 100644 --- a/test/model/katex_test.dart +++ b/test/model/katex_test.dart @@ -1,6 +1,5 @@ import 'dart:io'; -import 'package:zulip/model/settings.dart'; import 'package:checks/checks.dart'; import 'package:stack_trace/stack_trace.dart'; import 'package:test_api/scaffolding.dart'; @@ -572,9 +571,6 @@ class KatexExample extends ContentExample { void main() async { TestZulipBinding.ensureInitialized(); - await testBinding.globalStore.settings.setBool( - BoolGlobalSetting.renderKatex, true); - testParseExample(KatexExample.mathBlockKatexSizing); testParseExample(KatexExample.mathBlockKatexNestedSizing); testParseExample(KatexExample.mathBlockKatexDelimSizing); diff --git a/test/widgets/content_test.dart b/test/widgets/content_test.dart index 2b7eb45180..aef5ef3cc0 100644 --- a/test/widgets/content_test.dart +++ b/test/widgets/content_test.dart @@ -25,7 +25,6 @@ import '../example_data.dart' as eg; import '../flutter_checks.dart'; import '../model/binding.dart'; import '../model/content_test.dart'; -import '../model/store_checks.dart'; import '../model/test_store.dart'; import '../test_images.dart'; import '../test_navigation.dart'; @@ -566,23 +565,14 @@ void main() { testContentSmoke(ContentExample.mathBlock); - testWidgets('displays KaTeX source; experimental flag disabled', (tester) async { - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, false); - + testWidgets('displays KaTeX content', (tester) async { await prepareContent(tester, plainContent(ContentExample.mathBlock.html)); - tester.widget(find.text(r'\lambda', findRichText: true)); + tester.widget(find.text('λ', findRichText: true)); }); - testWidgets('displays KaTeX content; experimental flag enabled', (tester) async { - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, true); - check(globalSettings).getBool(BoolGlobalSetting.renderKatex).isTrue(); - - await prepareContent(tester, plainContent(ContentExample.mathBlock.html)); - tester.widget(find.text('λ', findRichText: true)); + testWidgets('fallback to displaying KaTeX source if unsupported KaTeX HTML', (tester) async { + await prepareContent(tester, plainContent(ContentExample.mathBlockUnknown.html)); + tester.widget(find.text(r'\lambda', findRichText: true)); }); }); @@ -1000,11 +990,6 @@ void main() { testContentSmoke(ContentExample.mathInline); testWidgets('maintains font-size ratio with surrounding text', (tester) async { - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, true); - check(globalSettings.getBool(BoolGlobalSetting.renderKatex)).isTrue(); - const html = '' 'λ' ' \\lambda ' @@ -1025,50 +1010,27 @@ void main() { }); }); - testWidgets('maintains font-size ratio with surrounding text, when showing TeX source', (tester) async { - const html = '' - 'λ' - ' \\lambda ' - ''; - await checkFontSizeRatio(tester, - targetHtml: html, - targetFontSizeFinder: mkTargetFontSizeFinderFromPattern(r'λ')); - }, skip: true // TODO(#46): adapt this test - // (it needs a more complex targetFontSizeFinder; - // see other uses in this file for examples.) - ); - - testWidgets('maintains font-size ratio with surrounding text, when showing TeX source', (tester) async { - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, false); - - const html = '' + testWidgets('maintains font-size ratio with surrounding text, when falling back to TeX source', (tester) async { + const unsupportedHtml = '' 'λ' ' \\lambda ' - ''; + ''; await checkFontSizeRatio(tester, - targetHtml: html, + targetHtml: unsupportedHtml, targetFontSizeFinder: mkTargetFontSizeFinderFromPattern(r'\lambda')); }); - testWidgets('displays KaTeX source; experimental flag disabled', (tester) async { - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, false); - + testWidgets('displays KaTeX content', (tester) async { await prepareContent(tester, plainContent(ContentExample.mathInline.html)); - tester.widget(find.text(r'\lambda', findRichText: true)); + tester.widget(find.text('λ', findRichText: true)); }); - testWidgets('displays KaTeX content; experimental flag enabled', (tester) async { - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, true); - check(globalSettings.getBool(BoolGlobalSetting.renderKatex)).isTrue(); - - await prepareContent(tester, plainContent(ContentExample.mathInline.html)); - tester.widget(find.text('λ', findRichText: true)); + testWidgets('fallback to displaying KaTeX source if unsupported KaTeX HTML', (tester) async { + await prepareContent(tester, plainContent(ContentExample.mathInlineUnknown.html)); + tester.widget(find.text(r'\lambda')); }); }); diff --git a/test/widgets/katex_test.dart b/test/widgets/katex_test.dart index 325bcf0b6a..c6aa8b164f 100644 --- a/test/widgets/katex_test.dart +++ b/test/widgets/katex_test.dart @@ -2,12 +2,10 @@ import 'package:checks/checks.dart'; import 'package:flutter/services.dart'; import 'package:flutter_checks/flutter_checks.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:zulip/model/settings.dart'; import 'package:zulip/widgets/katex.dart'; import '../model/binding.dart'; import '../model/katex_test.dart'; -import '../model/store_checks.dart'; import 'content_test.dart'; void main() { @@ -81,11 +79,6 @@ void main() { testWidgets(testCase.$1.description, (tester) async { await _loadKatexFonts(); - addTearDown(testBinding.reset); - final globalSettings = testBinding.globalStore.settings; - await globalSettings.setBool(BoolGlobalSetting.renderKatex, true); - check(globalSettings).getBool(BoolGlobalSetting.renderKatex).isTrue(); - await prepareContent(tester, plainContent(testCase.$1.html)); final baseRect = tester.getRect(find.byType(KatexWidget)); diff --git a/tools/content/unimplemented_katex_test.dart b/tools/content/unimplemented_katex_test.dart index bb89052f24..048499998c 100644 --- a/tools/content/unimplemented_katex_test.dart +++ b/tools/content/unimplemented_katex_test.dart @@ -10,15 +10,12 @@ import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:zulip/model/content.dart'; -import 'package:zulip/model/settings.dart'; import '../../test/model/binding.dart'; import 'model.dart'; void main() async { TestZulipBinding.ensureInitialized(); - await testBinding.globalStore.settings.setBool( - BoolGlobalSetting.renderKatex, true); Future checkForKatexFailuresInFile(File file) async { int totalMessageCount = 0;