1 ## -*- coding: utf-8 -*- 2 <!DOCTYPE html> 3 <html> 4 <!-- Copyright (C) 2012 The Android Open Source Project 5 6 Licensed under the Apache License, Version 2.0 (the "License"); 7 you may not use this file except in compliance with the License. 8 You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 See the License for the specific language governing permissions and 16 limitations under the License. 17 --> 18 <head> 19 <!-- automatically generated from html.mako. do NOT edit directly --> 20 <meta charset="utf-8" /> 21 <title>Android Camera HAL2.0 Properties</title> 22 <style type="text/css"> 23 .section { font-size: 1.5em; font-weight: bold; background-color: beige; padding: 0.5em 0em 0.5em 0.1em } 24 .kind { font-size: 1.2em; font-weight: bold; padding-left: 0.5em; background-color: gray } 25 .entry { background-color: burlywood } 26 27 /* table column sizes */ 28 table { table-layout: fixed; width: 100%; word-wrap: break-word } 29 td,th { border: 1px solid; } 30 .th_name { width: 20% } 31 .th_units { width: 10% } 32 .th_tags { width: 5% } 33 .th_notes { width: 30% } 34 .th_type { width: 20% } 35 td { font-size: 0.9em; } 36 37 /* hide the first thead, we need it there only to enforce column sizes */ 38 .thead_dummy { visibility: hidden; } 39 40 /* Entry flair */ 41 .entry_name { font-family: monospace; font-style: italic; } 42 43 /* Entry type flair */ 44 .entry_type_name { color: darkgreen; font-weight: bold; } 45 .entry_type_name_enum:after { color: darkgreen; font-weight: bold; content:" (enum)" } 46 .entry_type_enum_name { font-family: monospace; font-weight: bolder; } 47 .entry_type_enum_notes:before { content:" - " } 48 .entry_type_enum_value:before { content:" = " } 49 .entry_type_enum_value { font-family: monospace; } 50 .entry ul { margin: 0 0 0 0; list-style-position: inside; padding-left: 0.5em; } 51 .entry ul li { padding: 0 0 0 0; margin: 0 0 0 0;} 52 53 /* Entry tags flair */ 54 .entry_tags ul { list-style-type: none; } 55 56 57 /* TODO: generate abbr element for each tag link? */ 58 /* TODO for each x.y.z try to link it to the entry */ 59 60 </style> 61 62 <style> 63 64 { 65 /* broken... 66 supposedly there is a bug in chrome that it lays out tables before 67 it knows its being printed, so the page-break-* styles are ignored 68 */ 69 tr { page-break-after: always; page-break-inside: avoid; } 70 } 71 72 </style> 73 </head> 74 75 <%! 76 import re 77 78 # insert word break hints for the browser 79 def wbr(text): 80 new_txt = text 81 82 # for johnyOrange.appleCider.redGuardian also insert wbr before the caps 83 # => johny<wbr>Orange.apple<wbr>Cider.red<wbr>Guardian 84 for words in text.split(" "): 85 if len(words.split(".")) >= 3: # match only x.y.z 86 addwbr = lambda x: i.isupper() and ("<wbr>" + i) or i 87 new_word = "".join([addwbr(i) for i in words]) 88 new_txt = new_txt.replace(words, new_word) 89 90 # e.g. X/Y/Z -> X/<wbr>Y/<wbr>/Z. also for X.Y.Z, X_Y_Z. 91 replace_chars=['.', '/', '_', ','] 92 for i in replace_chars: 93 new_txt = new_txt.replace(i, i + "<wbr>") 94 95 return new_txt 96 97 # insert line breaks after every two \n\n 98 def br(text): 99 return re.sub(r"(\r?\n)(\r?\n)", r"\1<br>\2<br>", text) 100 %> 101 102 103 <body> 104 <h1>Android Camera HAL2.0 Properties</h1> 105 106 <h2>Table of Contents</h2> 107 <ul class="toc"> 108 <li><a href="#tag_index">Tags</a></li> 109 110 111 % for section in metadata.find_all(lambda x: isinstance(x, metadata_model.Section)): 112 <li><p class="toc_section"><a href="#section_${section.name}">${section.name}</a></p> 113 <ul class="toc_section"> 114 % for prop in section.find_all(lambda x: isinstance(x, metadata_model.Entry)): 115 <li><a href="#${prop.kind}_${prop.name}">${prop.name}</a> (${prop.kind})</li> 116 % endfor 117 </ul> 118 </li> <!-- toc_section --> 119 % endfor 120 </ul> 121 122 <h1>Properties</h1> 123 <table class="properties"> 124 125 <thead class="thead_dummy"> 126 <tr> 127 <th class="th_name">Property Name</th> 128 <th class="th_type">Type</th> 129 <th class="th_description">Description</th> 130 <th class="th_units">Units</th> 131 <th class="th_range">Range</th> 132 <th class="th_notes">Notes</th> 133 <th class="th_tags">Tags</th> 134 </tr> 135 </thead> <!-- so that the first occurrence of thead is not 136 above the first occurrence of tr --> 137 % for root in metadata.outer_namespaces: 138 <!-- <namespace name="${root.name}"> --> 139 % for section in root.sections: 140 <tr><td colspan="7" id="section_${section.name}" class="section">${section.name}</td></tr> 141 142 % if section.description is not None: 143 <tr class="description"><td>${section.description}</td></tr> 144 % endif 145 146 % for kind in section.merged_kinds: # dynamic,static,controls 147 <tr><td colspan="7" class="kind">${kind.name}</td></tr> 148 149 <thead> 150 <tr> 151 <th class="th_name">Property Name</th> 152 <th class="th_type">Type</th> 153 <th class="th_description">Description</th> 154 <th class="th_units">Units</th> 155 <th class="th_range">Range</th> 156 <th class="th_notes">Notes</th> 157 <th class="th_tags">Tags</th> 158 </tr> 159 </thead> 160 161 <tbody> 162 163 <%def name="insert_body(node)"> 164 % for nested in node.namespaces: 165 ${insert_namespace(nested)} 166 % endfor 167 168 % for entry in node.merged_entries: 169 ${insert_entry(entry)} 170 % endfor 171 </%def> 172 173 <%def name="insert_namespace(namespace)"> 174 ${insert_body(namespace)} 175 </%def> 176 177 <%def name="insert_entry(prop)"> 178 % if False: #prop.is_clone(): 179 <clone entry="${prop.name}" kind="${prop.target_kind}"> 180 181 % if prop.notes is not None: 182 <notes>${prop.notes | h,wbr}</notes> 183 % endif 184 185 % for tag in prop.tags: 186 <tag id="${tag.id}" /> 187 % endfor 188 189 </clone> 190 % else: 191 <tr class="entry" id="${prop.kind}_${prop.name}"> 192 <td class="entry_name">${prop.name | wbr}</td> 193 <td class="entry_type"> 194 % if prop.enum: 195 <span class="entry_type_name entry_type_name_enum">${prop.type}</span> 196 % else: 197 <span class="entry_type_name">${prop.type}</span> 198 % endif 199 % if prop.container is not None: 200 <span class="entry_type_container">x</span> 201 % endif 202 203 % if prop.container == 'array': 204 <span class="entry_type_array"> 205 ${" x ".join(prop.container_sizes)} 206 </span> 207 % elif prop.container == 'tuple': 208 <ul class="entry_type_tuple"> 209 % for val in prop.tuple_values: 210 <li>${val}</li> 211 % endfor 212 </ul> 213 % endif 214 215 % if prop.type_notes is not None: 216 <div class="entry_type_notes">${prop.type_notes | wbr}</div> 217 % endif 218 219 % if prop.enum: 220 <ul class="entry_type_enum"> 221 % for value in prop.enum.values: 222 <li> 223 <span class="entry_type_enum_name">${value.name}</span> 224 % if value.optional: 225 <span class="entry_type_enum_optional">optional</span> 226 % endif: 227 % if value.id is not None: 228 <span class="entry_type_enum_value">${value.id}</span> 229 % endif 230 % if value.notes is not None: 231 <span class="entry_type_enum_notes">${value.notes | wbr}</span> 232 % endif 233 </li> 234 % endfor 235 </ul> 236 % endif 237 238 </td> <!-- entry_type --> 239 240 <td class="entry_description"> 241 % if prop.description is not None: 242 ${prop.description | wbr, br} 243 % endif 244 </td> 245 246 <td class="entry_units"> 247 % if prop.units is not None: 248 ${prop.units | wbr} 249 % endif 250 </td> 251 252 <td class="entry_range"> 253 % if prop.range is not None: 254 ${prop.range | wbr} 255 % endif 256 </td> 257 258 <td class="entry_notes"> 259 % if prop.notes is not None: 260 ${prop.notes | wbr, br} 261 % endif 262 </td> 263 264 <td class="entry_tags"> 265 % if next(prop.tags, None): 266 <ul class="entry_tags"> 267 % for tag in prop.tags: 268 <li><a href="#tag_${tag.id}">${tag.id}</a></li> 269 % endfor 270 </ul> 271 % endif 272 </td> 273 274 </tr> <!-- end of entry --> 275 % endif 276 </%def> 277 278 ${insert_body(kind)} 279 280 <!-- end of kind --> 281 </tbody> 282 % endfor # for each kind 283 284 <!-- end of section --> 285 % endfor 286 <!-- </namespace> --> 287 % endfor 288 </table> 289 290 <div class="tags" id="tag_index"> 291 <h2>Tags</h2> 292 <ul> 293 % for tag in metadata.tags: 294 <li id="tag_${tag.id}">${tag.id} - ${tag.description} 295 <ul class="tags_entries"> 296 % for prop in tag.entries: 297 <li><a href="#${prop.kind}_${prop.name}">${prop.name}</a> (${prop.kind})</li> 298 % endfor 299 </ul> 300 </li> <!-- tag_${tag.id} --> 301 % endfor 302 </ul> 303 </div> 304 305 [ <a href="#">top</a> ] 306 307 </body> 308 </html> 309