build method
Implementation
@override
Widget build(
BuildContext context,
String text,
final GptMarkdownConfig config,
) {
final List<Map<int, String>> value = text
.split('\n')
.map<Map<int, String>>(
(e) => e
.split('|')
.where((element) => element.isNotEmpty)
.toList()
.asMap(),
)
.toList();
bool heading = RegExp(
r"^\|.*?\|\n\|-[-\\ |]*?-\|$",
multiLine: true,
).hasMatch(text.trim());
int maxCol = 0;
for (final each in value) {
if (maxCol < each.keys.length) {
maxCol = each.keys.length;
}
}
if (maxCol == 0) {
return Text("", style: config.style);
}
final controller = ScrollController();
return Scrollbar(
controller: controller,
child: SingleChildScrollView(
controller: controller,
scrollDirection: Axis.horizontal,
child: Table(
textDirection: config.textDirection,
defaultColumnWidth: CustomTableColumnWidth(),
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
border: TableBorder.all(
width: 1,
color: Theme.of(context).colorScheme.onSurface,
),
children: value
.asMap()
.entries
.map<TableRow>(
(entry) => TableRow(
decoration: (heading)
? BoxDecoration(
color: (entry.key == 0)
? Theme.of(context)
.colorScheme
.surfaceContainerHighest
: null,
)
: null,
children: List.generate(
maxCol,
(index) {
var e = entry.value;
String data = e[index] ?? "";
if (RegExp(r"^--+$").hasMatch(data.trim()) ||
data.trim().isEmpty) {
return const SizedBox();
}
return Center(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 4),
child: MdWidget(
(e[index] ?? "").trim(),
config: config,
),
),
);
},
),
),
)
.toList(),
),
),
);
}