extractText method

List<TextSpan> extractText(
  1. String rawString
)

Implementation

List<TextSpan> extractText(String rawString) {
  List<TextSpan> textSpan = [];

  final urlRegExp = RegExp(
      r"((https?:www\.)|(https?:\/\/)|(www\.))[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}(\/[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)?");

  getLink(String linkString) {
    textSpan.add(
      TextSpan(
        text: 'Link',
        style: const TextStyle(
          color: Colors.blue,
          decoration: TextDecoration.underline,
          decorationColor: Colors.blue,
        ),
        recognizer: TapGestureRecognizer()
          ..onTap = () async {
            if (!await launchUrl(Uri.parse(linkString))) {
              throw Exception('Could not launch $linkString');
            }
          },
      ),
    );
    return linkString;
  }

  getNormalText(String normalText) {
    textSpan.add(
      TextSpan(
        text: normalText,
        style: const TextStyle(color: Colors.black),
      ),
    );
    return normalText;
  }

  rawString.splitMapJoin(
    urlRegExp,
    onMatch: (m) => getLink("${m.group(0)}"),
    onNonMatch: (n) => getNormalText(n.substring(0)),
  );

  return textSpan;
}