OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 /// Simple script to generate a page summarizing all error messages produces by |
| 6 /// the polymer compiler code. The generated code will be placed directly under |
| 7 /// the `polymer/lib/src/generated` folder. This script should be invoked from |
| 8 /// the root of the polymer package either by doing: |
| 9 /// |
| 10 /// dart tool/create_message_details_page.dart |
| 11 /// |
| 12 /// or |
| 13 /// |
| 14 /// pub run tool/create_message_details_page |
| 15 library polymer.tool.create_message_details_page; |
| 16 |
| 17 import 'dart:io'; |
| 18 import 'dart:mirrors'; |
| 19 |
| 20 import 'package:code_transformers/messages/messages.dart'; |
| 21 import 'package:code_transformers/src/messages.dart' as m1; // used via mirrors |
| 22 import 'package:observe/src/messages.dart' as m2; // used via mirrors |
| 23 import 'package:polymer/src/build/messages.dart' as m3; // used via mirrors |
| 24 import 'package:markdown/markdown.dart'; |
| 25 import 'package:path/path.dart' as path; |
| 26 |
| 27 main() { |
| 28 var seen = {}; |
| 29 var templates = []; |
| 30 _getMessagesFrom(#polymer.src.build.messages, seen, templates); |
| 31 _getMessagesFrom(#code_transformers.src.messages, seen, templates); |
| 32 _getMessagesFrom(#observe.src.messages, seen, templates); |
| 33 |
| 34 templates.sort((a, b) => a.id.compareTo(b.id)); |
| 35 var sb = new StringBuffer(); |
| 36 sb.write(_HEADER); |
| 37 |
| 38 var lastPackage = ''; |
| 39 for (var t in templates) { |
| 40 if (lastPackage != t.id.package) { |
| 41 lastPackage = t.id.package; |
| 42 sb.write(markdownToHtml( |
| 43 '#Messages from package `$lastPackage`\n\n----\n')); |
| 44 } |
| 45 sb.write(_htmlFor(t)); |
| 46 } |
| 47 sb.write(_FOOTER); |
| 48 new File('lib/src/build/generated/messages.html') |
| 49 .writeAsStringSync(sb.toString()); |
| 50 } |
| 51 |
| 52 final _mirrors = currentMirrorSystem(); |
| 53 |
| 54 _getMessagesFrom(Symbol libName, Map seen, List templates) { |
| 55 var lib = _mirrors.findLibrary(libName); |
| 56 lib.declarations.forEach((symbol, decl) { |
| 57 if (decl is! VariableMirror) return; |
| 58 var template = lib.getField(symbol).reflectee; |
| 59 var name = MirrorSystem.getName(symbol); |
| 60 if (template is! MessageTemplate) return; |
| 61 var id = template.id; |
| 62 if (seen.containsKey(id)) { |
| 63 print('error: duplicate id `$id`. ' |
| 64 'Currently set for both `$name` and `${seen[id]}`.'); |
| 65 } |
| 66 seen[id] = name; |
| 67 templates.add(template); |
| 68 }); |
| 69 } |
| 70 |
| 71 _htmlFor(MessageTemplate template) { |
| 72 var details = template.details == null |
| 73 ? 'No details available' : template.details; |
| 74 var id = template.id; |
| 75 var markdown = |
| 76 '## ${template.description} [#${id.id}](#msg_$id)\n\n$details\n\n----\n'; |
| 77 var html = markdownToHtml(markdown); |
| 78 // We add the anchor inside the <h2> title, otherwise the link doesn't work. |
| 79 return '\n\n${html.replaceFirst("<h2>", "<h2 id=\"msg_$id\">")}'; |
| 80 } |
| 81 |
| 82 const _HEADER = ''' |
| 83 <!doctype html> |
| 84 <!-- |
| 85 This file is autogenerated with polymer/tool/create_message_details_page.dart |
| 86 --> |
| 87 <html> |
| 88 <style> |
| 89 @font-face { |
| 90 font-family: 'Montserrat'; |
| 91 font-style: normal; |
| 92 font-weight: 400; |
| 93 src: url(https://themes.googleusercontent.com/static/fonts/montserrat/v4/zhcz-
_WihjSQC0oHJ9TCYL3hpw3pgy2gAi-Ip7WPMi0.woff) format('woff'); |
| 94 } |
| 95 @font-face { |
| 96 font-family: 'Montserrat'; |
| 97 font-style: normal; |
| 98 font-weight: 700; |
| 99 src: url(https://themes.googleusercontent.com/static/fonts/montserrat/v4/IQHow
_FEYlDC4Gzy_m8fcnbFhgvWbfSbdVg11QabG8w.woff) format('woff'); |
| 100 } |
| 101 @font-face { |
| 102 font-family: 'Roboto'; |
| 103 font-style: normal; |
| 104 font-weight: 300; |
| 105 src: url(https://themes.googleusercontent.com/static/fonts/roboto/v10/Hgo13k-t
fSpn0qi1SFdUfbO3LdcAZYWl9Si6vvxL-qU.woff) format('woff'); |
| 106 } |
| 107 @font-face { |
| 108 font-family: 'Roboto'; |
| 109 font-style: normal; |
| 110 font-weight: 400; |
| 111 src: url(https://themes.googleusercontent.com/static/fonts/roboto/v10/CrYjSnGj
rRCn0pd9VQsnFOvvDin1pK8aKteLpeZ5c0A.woff) format('woff'); |
| 112 } |
| 113 |
| 114 body { |
| 115 width: 80vw; |
| 116 margin: 20px; |
| 117 font-family: Roboto, sans-serif; |
| 118 } |
| 119 |
| 120 h1 { |
| 121 font-family: Montserrat, sans-serif; |
| 122 box-sizing: border-box; |
| 123 color: rgb(72, 72, 72); |
| 124 display: block; |
| 125 font-style: normal; |
| 126 font-variant: normal; |
| 127 font-weight: normal; |
| 128 } |
| 129 |
| 130 h2 { |
| 131 font-family: Montserrat, sans-serif; |
| 132 box-sizing: border-box; |
| 133 color: rgb(72, 72, 72); |
| 134 display: block; |
| 135 font-style: normal; |
| 136 font-variant: normal; |
| 137 font-weight: normal; |
| 138 } |
| 139 |
| 140 pre { |
| 141 display: block; |
| 142 padding: 9.5px; |
| 143 margin: 0 0 10px; |
| 144 line-height: 1.42857143; |
| 145 color: #333; |
| 146 word-break: break-all; |
| 147 word-wrap: break-word; |
| 148 background-color: #f5f5f5; |
| 149 border: 1px solid #ccc; |
| 150 border-radius: 4px; |
| 151 } |
| 152 |
| 153 code { |
| 154 font-family: Menlo,Monaco,Consolas,"Courier New",monospace; |
| 155 box-sizing: border-box; |
| 156 padding: 0; |
| 157 font-size: 90%; |
| 158 color: #0084c5; |
| 159 white-space: nowrap; |
| 160 border-radius: 4px; |
| 161 background-color: #f9f2f4; |
| 162 } |
| 163 |
| 164 pre > code { |
| 165 white-space: inherit; |
| 166 } |
| 167 |
| 168 a { |
| 169 color: rgb(42, 100, 150); |
| 170 } |
| 171 |
| 172 h2 > a { |
| 173 display: none; |
| 174 font-size: 0.8em; |
| 175 } |
| 176 |
| 177 h2:hover > a { |
| 178 display: inline; |
| 179 } |
| 180 </style> |
| 181 <body> |
| 182 '''; |
| 183 |
| 184 const _FOOTER = ''' |
| 185 </body> |
| 186 </html> |
| 187 '''; |
OLD | NEW |