doc: Re-add summaries of what children each menu item has

Slightly different to the original version of this, but same goal.
This commit is contained in:
Angus Gratton 2018-09-19 16:10:46 +10:00 committed by Angus Gratton
parent 8721173109
commit 9add51bc6d
2 changed files with 46 additions and 17 deletions

View file

@ -84,7 +84,7 @@ config MQTT_TASK_CORE_SELECTION_ENABLED
help
This will enable core selection
choice
choice MQTT_TASK_CORE_SELECTION
depends on MQTT_TASK_CORE_SELECTION_ENABLED
prompt "Core to use ?"
config MQTT_USE_CORE_0

View file

@ -21,6 +21,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import re
import kconfiglib
# Indentation to be used in the generated file
@ -40,6 +41,11 @@ def write_docs(config, filename):
with open(filename, "w") as f:
config.walk_menu(lambda node: write_menu_item(f, node))
def node_is_menu(node):
try:
return node.item == kconfiglib.MENU or node.is_menuconfig
except AttributeError:
return False # not all MenuNodes have is_menuconfig for some reason
def get_breadcrumbs(node):
# this is a bit wasteful as it recalculates each time, but still...
@ -51,6 +57,16 @@ def get_breadcrumbs(node):
node = node.parent
return " > ".join(result)
def get_link_anchor(node):
try:
return "CONFIG_%s" % node.item.name
except AttributeError:
assert(node_is_menu(node)) # only menus should have no item.name
result = "%s-%s" % (get_breadcrumbs(node), node.prompt[0])
result = re.sub(r"[^a-zA-z0-9]+", "-", result).lower()
return result
def get_heading_level(node):
# bit wasteful also
result = INITIAL_HEADING_LEVEL
@ -71,38 +87,37 @@ def format_rest_text(text, indent):
text += '\n'
return text
def write_menu_item(f, node):
def node_should_write(node):
if not node.prompt:
return # Don't do anything for invisible menu items
return False # Don't do anything for invisible menu items
if isinstance(node.parent.item, kconfiglib.Choice):
return # Skip choice nodes, they are handled as part of the parent (see below)
return False # Skip choice nodes, they are handled as part of the parent (see below)
return True
def write_menu_item(f, node):
if not node_should_write(node):
return
try:
name = node.item.name
except AttributeError:
name = None
try:
is_menu = node.item == kconfiglib.MENU or node.is_menuconfig
except AttributeError:
is_menu = False # not all MenuNodes have is_menuconfig for some reason
is_menu = node_is_menu(node)
## Heading
if name:
title = name
# add link target so we can use :ref:`CONFIG_FOO`
f.write('.. _CONFIG_%s:\n\n' % name)
else:
# if no symbol name, use the prompt as the heading
title = node.prompt[0]
# if no symbol name, use the prompt as the heading
if True or is_menu:
f.write('%s\n' % title)
f.write(HEADING_SYMBOLS[get_heading_level(node)] * len(title))
f.write('\n\n')
else:
f.write('**%s**\n\n\n' % title)
f.write(".. _%s:\n\n" % get_link_anchor(node))
f.write('%s\n' % title)
f.write(HEADING_SYMBOLS[get_heading_level(node)] * len(title))
f.write('\n\n')
if name:
f.write('%s%s\n\n' % (INDENT, node.prompt[0]))
@ -131,6 +146,20 @@ def write_menu_item(f, node):
f.write('\n\n')
if is_menu:
# enumerate links to child items
first = True
child = node.list
while child:
try:
if node_should_write(child):
if first:
first = False
f.write('- :ref:`%s`\n' % get_link_anchor(child))
except AttributeError:
pass
child = child.next
f.write('\n')
if __name__ == '__main__':
print("Run this via 'confgen.py --output doc FILENAME'")