// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. library src_gen_common; import 'package:markdown/markdown.dart'; const int RUNE_SPACE = 32; const int RUNE_EOL = 10; const int RUNE_LEFT_CURLY = 123; const int RUNE_RIGHT_CURLY = 125; final RegExp _wsRegexp = RegExp(r'\s+'); String collapseWhitespace(String str) => str.replaceAll(_wsRegexp, ' '); bool isEmphasis(Node node) => node is Element && node.tag == 'em'; bool isPara(Node node) => node is Element && node.tag == 'p'; bool isBlockquote(Node node) => node is Element && node.tag == 'blockquote'; bool isPre(Node node) => node is Element && node.tag == 'pre'; bool isList(Node node) => node is Element && node.tag == 'ul'; bool isH1(Node node) => node is Element && node.tag == 'h1'; bool isH3(Node node) => node is Element && node.tag == 'h3'; bool isHeader(Node node) => node is Element && node.tag.startsWith('h'); String textForElement(Node node) => (((node as Element).children!.first) as Text).text; String textForCode(Node node) => textForElement((node as Element).children!.first); /// foo ==> Foo String titleCase(String str) => str.substring(0, 1).toUpperCase() + str.substring(1); /// FooBar ==> fooBar String lowerTitleCase(String str) => str.substring(0, 1).toLowerCase() + str.substring(1); String joinLast(Iterable strs, String join, [String? last]) { if (strs.isEmpty) return ''; List list = strs.toList(); if (list.length == 1) return list.first; StringBuffer buf = StringBuffer(); for (int i = 0; i < list.length; i++) { if (i > 0) { if (i + 1 == list.length && last != null) { buf.write(last); } else { buf.write(join); } } buf.write(list[i]); } return buf.toString(); } /// Wrap a string on column boundaries. String wrap(String str, [int col = 80]) { // The given string could contain newlines. List lines = str.split('\n'); return lines.map((l) => _simpleWrap(l, col)).join('\n'); } /// Wrap a string ignoring newlines. String _simpleWrap(String str, [int col = 80]) { List lines = []; while (str.length > col) { int index = col; while (index > 0 && str.codeUnitAt(index) != RUNE_SPACE) { index--; } if (index == 0) { index = str.indexOf(' '); if (index == -1) { lines.add(str); str = ''; } else { lines.add(str.substring(0, index).trim()); str = str.substring(index).trim(); } } else { lines.add(str.substring(0, index).trim()); str = str.substring(index).trim(); } } if (str.isNotEmpty) lines.add(str); return lines.join('\n'); }