htmlData function

Future<String> htmlData({
  1. required String siteKey,
  2. String? action,
  3. String? cData,
  4. String type = "app",
  5. required TurnstileOptions options,
  6. required String onTurnstileReady,
  7. required String onBeforeInteractive,
  8. required String onAfterInteractive,
  9. required String onTokenReceived,
  10. required String onTurnstileError,
  11. required String onTokenExpired,
  12. required String onWidgetCreated,
})

define html

Implementation

Future<String> htmlData({
  required String siteKey,
  String? action,
  String? cData,
  String type = "app",
  required TurnstileOptions options,
  required String onTurnstileReady,
  required String onBeforeInteractive,
  required String onAfterInteractive,
  required String onTokenReceived,
  required String onTurnstileError,
  required String onTokenExpired,
  required String onWidgetCreated,
}) async {
  ///正则匹配TURNSTILE_*类型的文本,分case进行替换
  RegExp exp = RegExp(
      r'<TURNSTILE_(SITE_KEY|ACTION|CDATA|THEME|SIZE|LANGUAGE|RETRY|RETRY_INTERVAL|REFRESH_EXPIRED|REFRESH_TIMEOUT|READY|BEFORE_INTERACTIVE|AFTER_INTERACTIVE|TYPE|TOKEN_RECEIVED|ERROR|TOKEN_EXPIRED|CREATED)>');

  ///为了更直观,我们直接将source提出去到trunstile.html文件中去,然后在代码中把它加载进来,当然你得知道其路径。,因为这里是耗时操作,所以我们使用了 async ,返回也是Future<String>
  ByteData bytes =
      await rootBundle.load("packages/flutter_turnstile/data/trunstile.html");

  // 将 ByteData 转换为 Uint8List
  Uint8List uint8list = bytes.buffer.asUint8List();

  ///替换之后的text
  String? replacedText = utf8.decode(uint8list).replaceAllMapped(exp, (match) {
    switch (match.group(1)) {
      case 'SITE_KEY':
        return siteKey;
      case 'ACTION':
        return action ?? '';
      case 'CDATA':
        return cData ?? '';
      case 'THEME':
        return options.theme.name;
      case 'SIZE':
        return options.size.name;
      case 'LANGUAGE':
        return options.language;
      case 'RETRY':
        return options.retryAutomatically ? 'auto' : 'never';
      case 'RETRY_INTERVAL':
        return options.retryInterval.inMilliseconds.toString();
      case 'REFRESH_EXPIRED':
        return options.refreshExpired.name;
      case 'REFRESH_TIMEOUT':
        return options.refreshTimeout.name;
      case 'READY':
        return onTurnstileReady;
      case 'BEFORE_INTERACTIVE':
        return onBeforeInteractive;
      case 'AFTER_INTERACTIVE':
        return onAfterInteractive;
      case 'TYPE':
        return type;
      case 'TOKEN_RECEIVED':
        return onTokenReceived;
      case 'ERROR':
        return onTurnstileError;
      case 'TOKEN_EXPIRED':
        return onTokenExpired;
      case 'CREATED':
        return onWidgetCreated;
      default:
        return match.group(0) ?? "";
    }
  });

  return replacedText;
}