Похоже, что все ваши проекты настроены на использование интерпретатора системы вместо virtual environment
, который вы настроили для каждого из них.
Следуйте этой инструкции, чтобы исправить это https://www.jetbrains.com/help/pycharm-edu/creating-virtual-environment.html
С точки зрения используя другую версию библиотеки python, вы можете решить эту проблему, указав ее в файле requirements.txt
, который вы можете поместить в папку venv
для каждого проекта. тогда вы можете просто сделать pip install -r requirements.txt
после того, как настроите venv
. (вам нужно убедиться, что venv активирован - вам не нужно об этом беспокоиться, если вы настроили проект в PyCharm для использования интерпретатора python для venv.) Вы можете проверить это, перейдя к Terminal
в вашем PyCharm и вы должны увидеть (venv_name) hostusername@host:~/project_folder$
Во-первых, создайте дерево. Псевдокод (потому что я не бегло говорю на JavaScript):
var headings = array(...);
var treeLevels = array();
var treeRoots = array();
foreach(headings as heading) {
if(heading.level == treeLevels.length) {
/* Adjacent siblings. */
if(heading.level == 1) {
treeRoots[] = heading; // Append.
} else {
treeLevels[treeLevels.length - 2].children[] = heading; // Add child to parent element.
}
treeLevels[treeLevels.length - 1] = heading;
} else if(heading.level > treeLevels.length) {
/* Child. */
while(heading.level - 1 > treeLevels.length) {
/* Create dummy headings if needed. */
treeLevels[] = new Heading();
}
treeLevels[] = heading;
} else {
/* Child of ancestor. */
treeLevels.remove(heading.level, treeLevels.length - 1);
treeLevels[treeLevels.length - 1].children[] = heading;
treeLevels[] = heading;
}
}
Затем, мы поперечный это, создавая список.
function buildList(root) {
var li = new LI(root.text);
if(root.children.length) {
var subUl = new UL();
li.children[] = subUl;
foreach(root.children as child) {
subUl.children[] = buildList(child);
}
}
return li;
}
Наконец, вставьте LI
возвращенный buildList
в a UL
для каждого treeRoots
.
В jQuery можно выбрать элементы заголовка в порядке как таковом:
var headers = $('*').filter(function() {
return this.tagName.match(/h\d/i);
}).get();
Проблема здесь состоит в том, что нет никакого хорошего способа получить заголовки в порядке документа. Например, вызов jQuery $('h1,h2,h3,h4,h5,h6')
возвратит все Ваши заголовки, но все <h1>
s будет на первом месте сопровождаемый <h2>
s, и так далее. Никакая основная основа все же не возвращает элементы в порядке документа при использовании разграниченных селекторов запятой.
Вы могли преодолеть эту проблему путем добавления общего класса к каждому заголовку. Например:
<h1 class="heading">Heading level 1</h1>
<h2 class="heading">Sub heading #1</h2>
<h2 class="heading">Sub heading #2</h2>
<h3 class="heading">Sub Sub heading</h3>
<h2 class="heading">Sub heading #3</h2>
...
Теперь селектор $('.heading')
получит их всех в порядке.
Вот то, как я сделал бы это с jQuery:
var $result = $('<div/>');
var curDepth = 0;
$('h1,h2,h3,h4,h5,h6').addClass('heading');
$('.heading').each(function() {
var $li = $('<li/>').text($(this).text());
var depth = parseInt(this.tagName.substring(1));
if(depth > curDepth) { // going deeper
$result.append($('<ol/>').append($li));
$result = $li;
} else if (depth < curDepth) { // going shallower
$result.parents('ol:eq(' + (curDepth - depth - 1) + ')').append($li);
$result = $li;
} else { // same level
$result.parent().append($li);
$result = $li;
}
curDepth = depth;
});
$result = $result.parents('ol:last');
// clean up
$('h1,h2,h3,h4,h5,h6').removeClass('heading');
$result
должен теперь быть Ваш <ol>
.
Кроме того, обратите внимание, что это обработает <h4>
сопровождаемый <h1>
(спускающий больше чем одного уровня сразу), но это не обработает <h1>
сопровождаемый <h4>
(больше чем один выравнивает за один раз).