Showing
2 changed files
with
98 additions
and
74 deletions
| @@ -122,84 +122,94 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex | @@ -122,84 +122,94 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex | ||
| 122 | Column( | 122 | Column( |
| 123 | children: [ | 123 | children: [ |
| 124 | Expanded( | 124 | Expanded( |
| 125 | - child: SingleChildScrollView( | ||
| 126 | - child: Column( | ||
| 127 | - children: [ | ||
| 128 | - AnimatedBuilder( | ||
| 129 | - animation: _controller, | ||
| 130 | - builder: (context, _) { | ||
| 131 | - return Material( | ||
| 132 | - // color: Theme.of(context).colorScheme.surfaceVariant, | ||
| 133 | - shape: RoundedRectangleBorder( | ||
| 134 | - side: BorderSide( | ||
| 135 | - width: 1, | ||
| 136 | - color: Theme.of(context).colorScheme.outline), | ||
| 137 | - ), | ||
| 138 | - child: | ||
| 139 | - LayoutBuilder(builder: (context, constraints) { | ||
| 140 | - return Theme( | ||
| 141 | - data: Theme.of(context).copyWith( | ||
| 142 | - textTheme: const TextTheme( | ||
| 143 | - // For H1. | ||
| 144 | - headlineLarge: TextStyle(fontSize: 55), | ||
| 145 | - // For H2. | ||
| 146 | - headlineMedium: TextStyle(fontSize: 45), | ||
| 147 | - // For H3. | ||
| 148 | - headlineSmall: TextStyle(fontSize: 35), | ||
| 149 | - // For H4. | ||
| 150 | - titleLarge: TextStyle(fontSize: 25), | ||
| 151 | - // For H5. | ||
| 152 | - titleMedium: TextStyle(fontSize: 15), | ||
| 153 | - // For H6. | ||
| 154 | - titleSmall: TextStyle(fontSize: 10), | ||
| 155 | - ), | 125 | + child: ListView( |
| 126 | + children: [ | ||
| 127 | + AnimatedBuilder( | ||
| 128 | + animation: _controller, | ||
| 129 | + builder: (context, _) { | ||
| 130 | + return Material( | ||
| 131 | + // color: Theme.of(context).colorScheme.surfaceVariant, | ||
| 132 | + shape: RoundedRectangleBorder( | ||
| 133 | + side: BorderSide( | ||
| 134 | + width: 1, | ||
| 135 | + color: Theme.of(context).colorScheme.outline), | ||
| 136 | + ), | ||
| 137 | + child: | ||
| 138 | + LayoutBuilder(builder: (context, constraints) { | ||
| 139 | + return Theme( | ||
| 140 | + data: Theme.of(context).copyWith( | ||
| 141 | + textTheme: const TextTheme( | ||
| 142 | + // For H1. | ||
| 143 | + headlineLarge: TextStyle(fontSize: 55), | ||
| 144 | + // For H2. | ||
| 145 | + headlineMedium: TextStyle(fontSize: 45), | ||
| 146 | + // For H3. | ||
| 147 | + headlineSmall: TextStyle(fontSize: 35), | ||
| 148 | + // For H4. | ||
| 149 | + titleLarge: TextStyle(fontSize: 25), | ||
| 150 | + // For H5. | ||
| 151 | + titleMedium: TextStyle(fontSize: 15), | ||
| 152 | + // For H6. | ||
| 153 | + titleSmall: TextStyle(fontSize: 10), | ||
| 156 | ), | 154 | ), |
| 157 | - child: TexMarkdown( | ||
| 158 | - _controller.text, | ||
| 159 | - textDirection: _direction, | ||
| 160 | - onLinkTab: (url, title) { | ||
| 161 | - log(title, name: "title"); | ||
| 162 | - log(url, name: "url"); | ||
| 163 | - }, | ||
| 164 | - textAlign: TextAlign.justify, | ||
| 165 | - // textScaler: const TextScaler.linear(1.3), | ||
| 166 | - textScaler: MediaQuery.textScalerOf(context), | ||
| 167 | - style: const TextStyle( | ||
| 168 | - // Regular text font size here. | ||
| 169 | - fontSize: 15, | ||
| 170 | - ), | ||
| 171 | - latexWorkaround: (tex) => | ||
| 172 | - tex.replaceAllMapped(RegExp(r"align\*"), | ||
| 173 | - (match) => "aligned"), | ||
| 174 | - latexBuilder: (contex, tex) { | ||
| 175 | - var controller = ScrollController(); | ||
| 176 | - return Column( | ||
| 177 | - children: [ | ||
| 178 | - Scrollbar( | 155 | + ), |
| 156 | + child: TexMarkdown( | ||
| 157 | + _controller.text, | ||
| 158 | + textDirection: _direction, | ||
| 159 | + onLinkTab: (url, title) { | ||
| 160 | + log(title, name: "title"); | ||
| 161 | + log(url, name: "url"); | ||
| 162 | + }, | ||
| 163 | + textAlign: TextAlign.justify, | ||
| 164 | + // textScaler: const TextScaler.linear(1.3), | ||
| 165 | + textScaler: MediaQuery.textScalerOf(context), | ||
| 166 | + style: const TextStyle( | ||
| 167 | + // Regular text font size here. | ||
| 168 | + fontSize: 15, | ||
| 169 | + ), | ||
| 170 | + latexWorkaround: (tex) => | ||
| 171 | + tex.replaceAllMapped(RegExp(r"align\*"), | ||
| 172 | + (match) => "aligned"), | ||
| 173 | + latexBuilder: (contex, tex) { | ||
| 174 | + if (tex.contains(r"\begin{tabular}")) { | ||
| 175 | + // return table. | ||
| 176 | + String tableString = "|${(RegExp( | ||
| 177 | + r"^\\begin\{tabular\}\{.*?\}(.*?)\\end\{tabular\}$", | ||
| 178 | + multiLine: true, | ||
| 179 | + dotAll: true, | ||
| 180 | + ).firstMatch(tex)?[1] ?? "").trim()}|"; | ||
| 181 | + tableString = tableString | ||
| 182 | + .replaceAll(r"\\", "|\n|") | ||
| 183 | + .replaceAll("&", "|"); | ||
| 184 | + return TexMarkdown(tableString); | ||
| 185 | + } | ||
| 186 | + var controller = ScrollController(); | ||
| 187 | + return Column( | ||
| 188 | + children: [ | ||
| 189 | + Scrollbar( | ||
| 190 | + controller: controller, | ||
| 191 | + child: SingleChildScrollView( | ||
| 179 | controller: controller, | 192 | controller: controller, |
| 180 | - child: SingleChildScrollView( | ||
| 181 | - controller: controller, | ||
| 182 | - scrollDirection: Axis.horizontal, | ||
| 183 | - child: Math.tex( | ||
| 184 | - tex, | ||
| 185 | - textStyle: const TextStyle( | ||
| 186 | - fontSize: 17, | ||
| 187 | - ), | 193 | + scrollDirection: Axis.horizontal, |
| 194 | + child: Math.tex( | ||
| 195 | + tex, | ||
| 196 | + textStyle: const TextStyle( | ||
| 197 | + fontSize: 17, | ||
| 188 | ), | 198 | ), |
| 189 | ), | 199 | ), |
| 190 | ), | 200 | ), |
| 191 | - ], | ||
| 192 | - ); | ||
| 193 | - }, | ||
| 194 | - ), | ||
| 195 | - // child: const Text("Hello"), | ||
| 196 | - ); | ||
| 197 | - }), | ||
| 198 | - ); | ||
| 199 | - }, | ||
| 200 | - ), | ||
| 201 | - ], | ||
| 202 | - ), | 201 | + ), |
| 202 | + ], | ||
| 203 | + ); | ||
| 204 | + }, | ||
| 205 | + ), | ||
| 206 | + // child: const Text("Hello"), | ||
| 207 | + ); | ||
| 208 | + }), | ||
| 209 | + ); | ||
| 210 | + }, | ||
| 211 | + ), | ||
| 212 | + ], | ||
| 203 | ), | 213 | ), |
| 204 | ), | 214 | ), |
| 205 | ConstrainedBox( | 215 | ConstrainedBox( |
| @@ -58,6 +58,8 @@ class MdWidget extends StatelessWidget { | @@ -58,6 +58,8 @@ class MdWidget extends StatelessWidget { | ||
| 58 | .asMap(), | 58 | .asMap(), |
| 59 | ) | 59 | ) |
| 60 | .toList(); | 60 | .toList(); |
| 61 | + bool heading = | ||
| 62 | + RegExp(r"^\|.*?\|\n\|-[-\\ |]*?-\|\n").hasMatch(eachLn.trim()); | ||
| 61 | int maxCol = 0; | 63 | int maxCol = 0; |
| 62 | for (final each in value) { | 64 | for (final each in value) { |
| 63 | if (maxCol < each.keys.length) { | 65 | if (maxCol < each.keys.length) { |
| @@ -80,11 +82,23 @@ class MdWidget extends StatelessWidget { | @@ -80,11 +82,23 @@ class MdWidget extends StatelessWidget { | ||
| 80 | color: Theme.of(context).colorScheme.onSurface, | 82 | color: Theme.of(context).colorScheme.onSurface, |
| 81 | ), | 83 | ), |
| 82 | children: value | 84 | children: value |
| 85 | + .asMap() | ||
| 86 | + .entries | ||
| 83 | .map<TableRow>( | 87 | .map<TableRow>( |
| 84 | - (e) => TableRow( | 88 | + (entry) => TableRow( |
| 89 | + decoration: (heading) | ||
| 90 | + ? BoxDecoration( | ||
| 91 | + color: (entry.key == 0) | ||
| 92 | + ? Theme.of(context) | ||
| 93 | + .colorScheme | ||
| 94 | + .surfaceVariant | ||
| 95 | + : null, | ||
| 96 | + ) | ||
| 97 | + : null, | ||
| 85 | children: List.generate( | 98 | children: List.generate( |
| 86 | maxCol, | 99 | maxCol, |
| 87 | (index) { | 100 | (index) { |
| 101 | + var e = entry.value; | ||
| 88 | String data = e[index] ?? ""; | 102 | String data = e[index] ?? ""; |
| 89 | if (RegExp(r"^---+$").hasMatch(data.trim())) { | 103 | if (RegExp(r"^---+$").hasMatch(data.trim())) { |
| 90 | return const SizedBox(); | 104 | return const SizedBox(); |
-
Please register or login to post a comment