1617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin## -*- coding: utf-8 -*-
2617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<!DOCTYPE html>
3617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<html>
4617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<!-- Copyright (C) 2012 The Android Open Source Project
5617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
6617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     Licensed under the Apache License, Version 2.0 (the "License");
7617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     you may not use this file except in compliance with the License.
8617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     You may obtain a copy of the License at
9617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
10617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          http://www.apache.org/licenses/LICENSE-2.0
11617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
12617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     Unless required by applicable law or agreed to in writing, software
13617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     distributed under the License is distributed on an "AS IS" BASIS,
14617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     See the License for the specific language governing permissions and
16617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin     limitations under the License.
17617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin-->
18617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<head>
196ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin  <!-- automatically generated from html.mako. do NOT edit directly -->
20617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <meta charset="utf-8" />
210477854868fda8f877e21e1e18474e24c14bb8d7Eino-Ville Talvala  <title>Android Camera HAL3.4 Properties</title>
22617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <style type="text/css">
23fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala     body { background-color: #f7f7f7; font-family: Roboto, sans-serif;}
24fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala     h1 { color: #333333; }
25fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala     h2 { color: #333333; }
26fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala     a:link { color: #258aaf; text-decoration: none}
27fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala     a:hover { color: #459aaf; text-decoration: underline }
28fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala     a:visited { color: #154a5f; text-decoration: none}
29fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .section { color: #eeeeee; font-size: 1.5em; font-weight: bold; background-color: #888888; padding: 0.5em 0em 0.5em 0.5em; border-width: thick thin thin thin; border-color: #111111 #777777 #777777 #777777}
30fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .kind { color: #eeeeee; font-size: 1.2em; font-weight: bold; padding-left: 1.5em; background-color: #aaaaaa }
31fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .entry { background-color: #f0f0f0 }
328eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    .entry_cont { background-color: #f0f0f0 }
33fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .entries_header { background-color: #dddddd; text-align: center}
34fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala
35fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    /* toc style */
36fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .toc_section_header { font-size:1.3em;  }
37fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .toc_kind_header { font-size:1.2em;  }
386c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    .toc_deprecated { text-decoration:line-through; }
39617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
40617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* table column sizes */
41fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    table { border-collapse:collapse; table-layout: fixed; width: 100%; word-wrap: break-word }
42fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    td,th { border: 1px solid; border-color: #aaaaaa; padding-left: 0.5em; padding-right: 0.5em }
43617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .th_name { width: 20% }
44617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .th_units { width: 10% }
45617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .th_tags { width: 5% }
468eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    .th_details { width: 25% }
47617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .th_type { width: 20% }
48fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .th_description { width: 20% }
49fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .th_range { width: 10% }
50617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    td { font-size: 0.9em; }
51617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
52617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* hide the first thead, we need it there only to enforce column sizes */
53617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .thead_dummy { visibility: hidden; }
54617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
55617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* Entry flair */
568eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    .entry_name { color: #333333; padding-left:1.0em; font-size:1.1em; font-family: monospace; vertical-align:top; }
576c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    .entry_name_deprecated { text-decoration:line-through; }
58617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
59617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* Entry type flair */
60fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .entry_type_name { font-size:1.1em; color: #669900; font-weight: bold;}
61fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .entry_type_name_enum:after { color: #669900; font-weight: bold; content:" (enum)" }
62fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    .entry_type_visibility { font-weight: bolder; padding-left:1em}
636c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    .entry_type_synthetic { font-weight: bolder; color: #996600; }
64ca25627fc63255d147286ef9a9624059825eb548Igor Murashkin    .entry_type_hwlevel { font-weight: bolder; color: #000066; }
656c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    .entry_type_deprecated { font-weight: bolder; color: #4D4D4D; }
66617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry_type_enum_name { font-family: monospace; font-weight: bolder; }
67617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry_type_enum_notes:before { content:" - " }
68a10351ae06772a2f559bf6ce9fb9587a0649b670Igor Murashkin    .entry_type_enum_notes>p:first-child { display:inline; }
69617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry_type_enum_value:before { content:" = " }
70617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry_type_enum_value { font-family: monospace; }
71617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry ul { margin: 0 0 0 0; list-style-position: inside; padding-left: 0.5em; }
72617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry ul li { padding: 0 0 0 0; margin: 0 0 0 0;}
736c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    .entry_range_deprecated { font-weight: bolder; }
74617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
75617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* Entry tags flair */
76617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    .entry_tags ul { list-style-type: none; }
77617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
788eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    /* Entry details (full docs) flair */
798eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    .entry_details_header { font-weight: bold; background-color: #dddddd;
808eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala      text-align: center; font-size: 1.1em; margin-left: 0em; margin-right: 0em; }
818eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala
828eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    /* Entry spacer flair */
838eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala    .entry_spacer { background-color: transparent; border-style: none; height: 0.5em; }
84617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
85617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* TODO: generate abbr element for each tag link? */
86617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    /* TODO for each x.y.z try to link it to the entry */
87617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
88617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  </style>
896ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin
906ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin  <style>
916ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin
926ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin    {
936ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin      /* broken...
946ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin         supposedly there is a bug in chrome that it lays out tables before
956ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin         it knows its being printed, so the page-break-* styles are ignored
966ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin         */
976ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin        tr { page-break-after: always; page-break-inside: avoid; }
986ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin    }
996ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin
1006ad61d460aabf8db9b52e946bb38b8f20717b2a8Igor Murashkin  </style>
101617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin</head>
102617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
103617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<%!
104c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin  import re
1051dd4ecb0ea0589610b3616459b707c2898889153Igor Murashkin  from metadata_helpers import md
1061dd4ecb0ea0589610b3616459b707c2898889153Igor Murashkin  from metadata_helpers import IMAGE_SRC_METADATA
10763c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala  from metadata_helpers import filter_tags
108ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala  from metadata_helpers import filter_links
1090b080452cca90f215d10d636abfb47701d7518daIgor Murashkin  from metadata_helpers import wbr
110c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin
111c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin  # insert line breaks after every two \n\n
112c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin  def br(text):
113c469f7dc234ec0b901440902cd6e39acaf9b0781Igor Murashkin    return re.sub(r"(\r?\n)(\r?\n)", r"\1<br>\2<br>", text)
1141dd4ecb0ea0589610b3616459b707c2898889153Igor Murashkin
11563c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala  # Convert node name "x.y.z" of kind w to an HTML anchor of form
11663c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala  # <a href="#w_x.y.z">x.y.z</a>
11763c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala  def html_anchor(node):
11863c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala    return '<a href="#%s_%s">%s</a>' % (node.kind, node.name, node.name)
11963c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala
120ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala  # Convert target "xxx.yyy#zzz" to a HTML reference to Android public developer
121ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala  # docs with link name from shortname.
122ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala  def html_link(target, shortname):
123ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala    if shortname == '':
124ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      lastdot = target.rfind('.')
125ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      if lastdot == -1:
126ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala        shortname = target
127ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      else:
128ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala        shortname = target[lastdot + 1:]
129ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala
130ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala    target = target.replace('.','/')
131ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala    if target.find('#') != -1:
132ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      target = target.replace('#','.html#')
133ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala    else:
134ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      target = target + '.html'
135ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala
136ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala    return '<a href="https://developer.android.com/reference/%s">%s</a>' % (target, shortname)
137ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala
1381dd4ecb0ea0589610b3616459b707c2898889153Igor Murashkin  # Render as markdown, and do HTML-doc-specific rewrites
1391dd4ecb0ea0589610b3616459b707c2898889153Igor Murashkin  def md_html(text):
1401dd4ecb0ea0589610b3616459b707c2898889153Igor Murashkin    return md(text, IMAGE_SRC_METADATA)
141a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala
14263c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala  # linkify tag names such as "android.x.y.z" into html anchors
14363c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala  def linkify_tags(metadata):
14463c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala    def linkify_filter(text):
145ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      tagged_text = filter_tags(text, metadata, html_anchor)
146ddda2bb917a1eb725c85d8c2b61bff2abf568a95Eino-Ville Talvala      return filter_links(tagged_text, html_link)
14763c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala    return linkify_filter
14863c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala
149a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala  # Number of rows an entry will span
150a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala  def entry_cols(prop):
151a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala    cols = 1
152a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala    if prop.details: cols = cols + 2
153a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala    if prop.hal_details: cols = cols + 2
154a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala    return cols
155617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin%>
156617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
157617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<body>
15842165c20025783c9db8a9362102c4b31055db41fEino-Ville Talvala  <h1>Android Camera HAL3.2 Properties</h1>
159fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala\
160fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala<%def name="insert_toc_body(node)">
161fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala  % for nested in node.namespaces:
162fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala${    insert_toc_body(nested)}
163fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala  % endfor
164fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala  % for entry in node.merged_entries:
1656c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin            <li
1666c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    % if entry.deprecated:
1676c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin                class="toc_deprecated"
1686c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin    % endif
1696c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin            >${html_anchor(entry)}</li>
170fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala  % endfor
171fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala</%def>
172617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
173617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <h2>Table of Contents</h2>
174617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <ul class="toc">
175fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    <li><a href="#tag_index" class="toc_section_header">Tags</a></li>
176fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala% for root in metadata.outer_namespaces:
177fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala  % for section in root.sections:
178fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    <li>
179fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala      <span class="toc_section_header"><a href="#section_${section.name}">${section.name}</a></span>
180fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala      <ul class="toc_section">
181fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala      % for kind in section.merged_kinds: # dynamic,static,controls
182fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala        <li>
183fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala          <span class="toc_kind_header">${kind.name}</span>
184fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala          <ul class="toc_section">\
185fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala${          insert_toc_body(kind)}\
186fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala          </ul>
187fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala        </li>
188617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      % endfor
189fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala      </ul> <!-- toc_section -->
190fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala    </li>
191fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala  % endfor
192fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala% endfor
193617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  </ul>
194617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
195fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala
196617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <h1>Properties</h1>
197617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <table class="properties">
198617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
199617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    <thead class="thead_dummy">
200617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      <tr>
201617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <th class="th_name">Property Name</th>
202617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <th class="th_type">Type</th>
203617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <th class="th_description">Description</th>
204617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <th class="th_units">Units</th>
205617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <th class="th_range">Range</th>
206617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <th class="th_tags">Tags</th>
207617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      </tr>
208617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    </thead> <!-- so that the first occurrence of thead is not
209617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                         above the first occurrence of tr -->
210617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin% for root in metadata.outer_namespaces:
211617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<!-- <namespace name="${root.name}"> -->
212617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  % for section in root.sections:
2138eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala  <tr><td colspan="6" id="section_${section.name}" class="section">${section.name}</td></tr>
214617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
215617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    % if section.description is not None:
216617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      <tr class="description"><td>${section.description}</td></tr>
217617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    % endif
218617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
2195804a48bb15d245fb06f72cf6d64369f151fcc28Igor Murashkin    % for kind in section.merged_kinds: # dynamic,static,controls
2208eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala      <tr><td colspan="6" class="kind">${kind.name}</td></tr>
221617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
222fcef4c2eac3bc623f278a5b064ef1aef267870aaEino-Ville Talvala      <thead class="entries_header">
223617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <tr>
224617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <th class="th_name">Property Name</th>
225617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <th class="th_type">Type</th>
226617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <th class="th_description">Description</th>
227617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <th class="th_units">Units</th>
228617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <th class="th_range">Range</th>
229617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <th class="th_tags">Tags</th>
230617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        </tr>
231617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      </thead>
232617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
233617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      <tbody>
234617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
235617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <%def name="insert_body(node)">
236617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % for nested in node.namespaces:
237617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                ${insert_namespace(nested)}
238617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % endfor
239617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
240617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % for entry in node.merged_entries:
241617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                ${insert_entry(entry)}
242617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % endfor
243617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        </%def>
244617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
245617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <%def name="insert_namespace(namespace)">
246617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            ${insert_body(namespace)}
247617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        </%def>
248617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
249617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <%def name="insert_entry(prop)">
250617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin          <tr class="entry" id="${prop.kind}_${prop.name}">
2516c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin            <td class="entry_name
2526c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              % if prop.deprecated:
2536c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin                entry_name_deprecated
2546c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              % endif
2556c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin             " rowspan="${entry_cols(prop)}">
256a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala              ${prop.name | wbr}
257a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala            </td>
258617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            <td class="entry_type">
259b556bc47068d816cb319a5d0e2f6841b007b38f2Igor Murashkin              % if prop.enum:
260b556bc47068d816cb319a5d0e2f6841b007b38f2Igor Murashkin                <span class="entry_type_name entry_type_name_enum">${prop.type}</span>
261b556bc47068d816cb319a5d0e2f6841b007b38f2Igor Murashkin              % else:
262b556bc47068d816cb319a5d0e2f6841b007b38f2Igor Murashkin                <span class="entry_type_name">${prop.type}</span>
263b556bc47068d816cb319a5d0e2f6841b007b38f2Igor Murashkin              % endif
264617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % if prop.container is not None:
265617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                <span class="entry_type_container">x</span>
266617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % endif
267617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
268617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % if prop.container == 'array':
269617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                <span class="entry_type_array">
270617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  ${" x ".join(prop.container_sizes)}
271617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                </span>
272617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % elif prop.container == 'tuple':
273617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                <ul class="entry_type_tuple">
274617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                % for val in prop.tuple_values:
275617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  <li>${val}</li>
276617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                % endfor
277617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                </ul>
278617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % endif
279b8dc88148bca2e5a267c2ff39aff94b98b00ad6dIgor Murashkin              <span class="entry_type_visibility"> [${prop.applied_visibility}${" as %s" %prop.typedef.name if prop.typedef else ""}]</span>
2806c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin
2816c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              % if prop.synthetic:
2826c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              <span class="entry_type_synthetic">[synthetic] </span>
2836c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              % endif
2846c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin
285ca25627fc63255d147286ef9a9624059825eb548Igor Murashkin              % if prop.hwlevel:
286ca25627fc63255d147286ef9a9624059825eb548Igor Murashkin              <span class="entry_type_hwlevel">[${prop.hwlevel}] </span>
287ca25627fc63255d147286ef9a9624059825eb548Igor Murashkin              % endif
288ca25627fc63255d147286ef9a9624059825eb548Igor Murashkin
2896c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              % if prop.deprecated:
2906c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              <span class="entry_type_deprecated">[deprecated] </span>
2916c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              % endif
2926c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin
293617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % if prop.type_notes is not None:
294617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                <div class="entry_type_notes">${prop.type_notes | wbr}</div>
295617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % endif
296617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
297b556bc47068d816cb319a5d0e2f6841b007b38f2Igor Murashkin              % if prop.enum:
298617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                <ul class="entry_type_enum">
299617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % for value in prop.enum.values:
300617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  <li>
301617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                    <span class="entry_type_enum_name">${value.name}</span>
3027defc683c4e99cfef83d8352d20e619ad1018e9dZhijun He                  % if value.deprecated:
3037defc683c4e99cfef83d8352d20e619ad1018e9dZhijun He                    <span class="entry_type_enum_deprecated">[deprecated]</span>
3047defc683c4e99cfef83d8352d20e619ad1018e9dZhijun He                  % endif:
305617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % if value.optional:
306b432916043290beb246054a77f8978b3136f4315Eino-Ville Talvala                    <span class="entry_type_enum_optional">[optional]</span>
307b432916043290beb246054a77f8978b3136f4315Eino-Ville Talvala                  % endif:
308b432916043290beb246054a77f8978b3136f4315Eino-Ville Talvala                  % if value.hidden:
3097defc683c4e99cfef83d8352d20e619ad1018e9dZhijun He                    <span class="entry_type_enum_hidden">[hidden]</span>
310617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % endif:
311617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % if value.id is not None:
312617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                    <span class="entry_type_enum_value">${value.id}</span>
313617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % endif
314617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % if value.notes is not None:
315a10351ae06772a2f559bf6ce9fb9587a0649b670Igor Murashkin                    <span class="entry_type_enum_notes">${value.notes | md_html, linkify_tags(metadata), wbr}</span>
316617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % endif
317617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  </li>
318617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  % endfor
319617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                </ul>
320617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % endif
321617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
322617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            </td> <!-- entry_type -->
323617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
324617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            <td class="entry_description">
325617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % if prop.description is not None:
32663c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala              ${prop.description | md_html, linkify_tags(metadata), wbr}
327617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % endif
328617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            </td>
329617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
330617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            <td class="entry_units">
331617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % if prop.units is not None:
332617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              ${prop.units | wbr}
333617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % endif
334617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            </td>
335617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
336617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            <td class="entry_range">
3376c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin            % if prop.deprecated:
3386c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin              <p><span class="entry_range_deprecated">Deprecated</span>. Do not use.</p>
3396c936c18e02b122baaa3d5056b0555b6cff256f8Igor Murashkin            % endif
340617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % if prop.range is not None:
34163c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala              ${prop.range | md_html, linkify_tags(metadata), wbr}
342617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % endif
343617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            </td>
344617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
345617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            <td class="entry_tags">
346baacf9a9f032ca392b37b4982eafa43b0a8d4b52Igor Murashkin            % if next(prop.tags, None):
347617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              <ul class="entry_tags">
348617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % for tag in prop.tags:
349617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin                  <li><a href="#tag_${tag.id}">${tag.id}</a></li>
350617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              % endfor
351617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin              </ul>
352617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            % endif
353617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin            </td>
354617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
3558eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          </tr>
356a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          % if prop.details is not None:
3578eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          <tr class="entries_header">
3588eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala            <th class="th_details" colspan="5">Details</th>
3598eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          </tr>
3608eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          <tr class="entry_cont">
3618eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala            <td class="entry_details" colspan="5">
36263c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala              ${prop.details | md_html, linkify_tags(metadata), wbr}
3638eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala            </td>
3648eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          </tr>
3658eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          % endif
366a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala
367a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          % if prop.hal_details is not None:
368a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          <tr class="entries_header">
369a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala            <th class="th_details" colspan="5">HAL Implementation Details</th>
370a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          </tr>
371a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          <tr class="entry_cont">
372a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala            <td class="entry_details" colspan="5">
37363c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala              ${prop.hal_details | md_html, linkify_tags(metadata), wbr}
374a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala            </td>
375a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          </tr>
376a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala          % endif
377a5b73c27ddbf032d1b3b4f628ac8fc0846c0ed2cEino-Ville Talvala
3788eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala          <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
3798eb7005a84d714009bf5868d65f412da407d30b2Eino-Ville Talvala           <!-- end of entry -->
380617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        </%def>
381617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
382617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        ${insert_body(kind)}
383617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
384617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      <!-- end of kind -->
385617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      </tbody>
386617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    % endfor # for each kind
387617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
388617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <!-- end of section -->
389617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  % endfor
390617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin<!-- </namespace> -->
391617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin% endfor
392617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  </table>
393617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
394617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  <div class="tags" id="tag_index">
395617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    <h2>Tags</h2>
396617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    <ul>
397617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    % for tag in metadata.tags:
398617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      <li id="tag_${tag.id}">${tag.id} - ${tag.description}
399617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        <ul class="tags_entries">
400617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        % for prop in tag.entries:
40163c0fb27d923a32d9a398471ad318bfe84befbebEino-Ville Talvala          <li>${html_anchor(prop)} (${prop.kind})</li>
402617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        % endfor
403617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin        </ul>
404617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin      </li> <!-- tag_${tag.id} -->
405617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    % endfor
406617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin    </ul>
407617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  </div>
408617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
409617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin  [ <a href="#">top</a> ]
410617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin
411617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin</body>
412617da1675f9ea7b6ea33d9e6f47e0a07379f14b1Igor Murashkin</html>
413