anchor.diff:  }
   
   main() async {
  -  // Lens on just ruleset comparisons.
  -  // See: https://github.com/dart-lang/linter/issues/1365.
  -  var ruleSetLens = false;
  -
     var scorecard = await ScoreCard.calculate();
  -  var totalLintCount = scorecard.lintCount;
  -
  -  if (ruleSetLens) {
  -    scorecard.removeWhere((LintScore score) =>
  -        score.ruleSets.isEmpty ||
  -        (ruleSetLens &&
  -            score.ruleSets.length == 1 &&
  -            score.ruleSets[0] == 'flutter_repo'));
  -  }
  -
  -  //printAll(scorecard);
  -  printMarkdownTable(scorecard, justRules: ruleSetLens);
  -
  -  var footer = new StringBuffer('\n_$totalLintCount lints');
  -  if (ruleSetLens) {
  -    var filteredCount = totalLintCount - scorecard.lintCount;
  -    footer.write(' ($filteredCount w/o rulesets not shown)');
  -  }
  +
  +  print(scorecard.asMarkdown([
  +    Detail.rule,
  +    Detail.linter,
  +    Detail.sdk,
  +    Detail.fix,
  +    Detail.pedantic,
  +    Detail.flutterUser,
  +    Detail.flutterRepo,
  +    Detail.status,
  +    Detail.bugs,
  +  ]));
  +
  +  var footer = new StringBuffer('\n_${scorecard.lintCount} lints');
     footer.writeln('_');
   
     print(footer);
   }
   
  -void printAll(ScoreCard scorecard) {
  -  print('-- ALL -----------------------------------------');
  -  scorecard.forEach(print);
  -}
  -
  -const allHeader = [
  -  '| name | linter | dart sdk | fix | pedantic |  flutter user | flutter repo | status | bug refs |',
  -  '| :--- | :--- | :--- | :---: | :---:|  :---: | :---: | :---: | :--- |'
  -];
  -
  -/// https://github.com/dart-lang/linter/issues/1365
  -const justRuleSetsHeader = [
  -  '| name | pedantic | flutter user |',
  -  '| :--- | :---: | :---: |'
  -];
  -
  -void printMarkdownTable(ScoreCard scorecard, {bool justRules = false}) {
  -  print(justRules ? justRuleSetsHeader[0] : allHeader[0]);
  -  print(justRules ? justRuleSetsHeader[1] : allHeader[1]);
  -  scorecard.forEach((lint) {
  -    var sb = StringBuffer('| `${lint.name}` |');
  -    if (!justRules) {
  -      sb.write(' ${lint.since.sinceLinter} |');
  -      sb.write(' ${lint.since.sinceDartSdk} |');
  -      sb.write('${lint.hasFix ? " $bulb" : ""} |');
  -    }
  -    sb.write('${lint.ruleSets.contains('pedantic') ? " $checkMark" : ""} |');
  -    sb.write('${lint.ruleSets.contains('flutter') ? " $checkMark" : ""} |');
  -    if (!justRules) {
  -      sb.write(
  -          '${lint.ruleSets.contains('flutter_repo') ? " $checkMark" : ""} |');
  -      sb.write(
  -          '${lint.maturity != 'stable' ? ' **${lint.maturity}** ' : ""} |');
  -      sb.write(' ${lint.bugReferences.join(", ")} |');
  -    }
  -    print(sb.toString());
  -  });
  +class Header {
  +  final String markdown;
  +  const Header(this.markdown);
  +  static const Header left = const Header('| :--- ');
  +  static const Header center = const Header('| :---: ');
  +}
  +
  +class Detail {
  +  final String name;
  +  final Header header;
  +  const Detail(this.name, {this.header = Header.center});
  +
  +  static const Detail rule = const Detail('name', header: Header.left);
  +  static const Detail linter = const Detail('linter', header: Header.left);
  +  static const Detail sdk = const Detail('dart sdk', header: Header.left);
  +  static const Detail fix = const Detail('fix');
  +  static const Detail pedantic = const Detail('pedantic');
  +  static const Detail flutterUser = const Detail('flutter user');
  +  static const Detail flutterRepo = const Detail('flutter repo');
  +  static const Detail status = const Detail('status');
  +  static const Detail bugs = const Detail('bug refs', header: Header.left);
   }
   
   class _AssistCollector extends GeneralizingAstVisitor<void> {
  
positive.code: 
    void forEach(void f(LintScore element)) {
      scores.forEach(f);
    }
  
    static Future<List<String>> _getLintsWithFixes() async {
  
negative.code:     var flutterRuleset = await flutterRules;
      var flutterRepoRuleset = await flutterRepoRules;
      var pedanticRuleset = await pedanticRules;
  
      var issues = await _getIssues();
      var bugs = issues.where(_isBug).toList();
  