Создание цикла для печати списков HTML - PullRequest
1 голос
/ 27 сентября 2011

Мне нужно создать HTML-список, похожий по форме на следующее:

<ul class="treeView">
    <li>
        Root Item
        <ul class="collapsibleList">
        <li>
            Sub-Folder 1
            <ul>
                <li>
                    Sub-Sub-Folder 1
                    <ul>
                        <li>Item 1</li>
                        <li class="lastChild">Item 2</li>
                    </ul>
                </li>
                <li class="lastChild">
                    Sub-Sub-Folder 2
                    <ul>
                        <li>Item 3</li>
                        <li class="lastChild">Item 4</li>
                    </ul>
                </li>
            </ul>
        </li>
            <li class="lastChild">
                Sub-Folder 2
                <ul>
                    <li>Item 5</li>
                    <li>Item 6</li>
                    <li class="lastChild">Item 7</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

Этот список основан на структуре каталогов, но у меня есть код для перечисления фактической структуры. Поэтому все, что мне нужно, это как использовать цикл for, чтобы отслеживать все и создавать вложенные списки HTML.

Ниже приведен мой скрипт на python:

for item in lstItems:
    splitfile = os.path.split(item[0])
    webpyPath = splitfile[0].replace("/srv/http/example/www", "")
    itemName = splitfile[1]
    if item[1] == 0:
        lstRemDir.append(itemName)
    intDirNum = len(lstRemDir) - 1
    if item[1] == 0:
        if len(lstRemDir) == 1:
            print '''
<ul class="treeView">
    <li>Collapsible lists
        <ul class="collapsibleList">
            '''
        elif len(lstRemDir) != 1:
            f.write('    </ul>\n</li>')
        f.write('<li><a href=\"' + webpyPath + "/" + itemName + '\" id=\"directory\" alt=\"' + itemName + '\" target=\"viewer\">' + itemName + '</a></li>\n')
    elif item[1] == 1:
        f.write('<li><a href=\"' + webpyPath + "/" + itemName + '\" id=\"file\" alt=\"' + itemName + '\" target=\"viewer\">' + itemName + '</a></li>\n')
    else:
        f.write('<li>An error happened in processing ' + itemName + '.')

Причина, по которой я спрашиваю, состоит в том, что я пытался выяснить это в течение нескольких дней. Я не прошу, чтобы кто-то сделал это для меня, просто хороший способ сделать это. Я пытался использовать списки для хранения данных, но я чувствовал, что это слишком запутанно. Надеюсь, это проясняет, что я ищу.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 сентября 2011

Это может помочь вам начать с более простого решения, которое использует вложенный словарь для представления ваших файлов вместо списков:

dir = {}
start = rootdir.rfind('/')+1
for path, dirs, files in os.walk(rootdir):
    folders = path[start:].split('/')
    subdir = dict.fromkeys(files)
    parent = reduce(dict.get, folders[:-1], dir)
    parent[folders[-1]] = subdir

Вот пример того, как dir может выглядеть дляструктура, аналогичная приведенной в вашем примере:

{
    "root": {
        "folder2": {
            "item2": None, 
            "item3": None, 
            "item1": None
        }, 
        "folder1": {
            "subfolder1": {
                "item2": None, 
                "item1": None
            }, 
            "subfolder2": {
                "item3": None, 
                "item4": None
            }
        }
    }
}

Используя это, не должно быть слишком сложно написать рекурсивную функцию, которая принимает словарь и возвращает список html.Вот простая функция, которая просто печатает элементы на правильном уровне, вы можете изменить это, добавив HTML-код:

def html_list(nested_dict, indent=0):
    result = ''
    if nested_dict is not None:
        for item in sorted(nested_dict.keys()):
            result += ' '*indent + item + '\n'
            result += html_list(nested_dict[item], indent+4)
    return result

>>> print html_list(dir)
root
    folder1
        subfolder1
            item1
            item2
        subfolder2
            item3
            item4
    folder2
        item1
        item2
        item3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...