Representando a estrutura de diretórios e arquivos na sintaxe Markdown

215

Quero descrever as estruturas de diretórios e arquivos em alguns dos meus posts no Jekyll. O Markdown fornece uma maneira elegante de produzir uma coisa dessas?

Por exemplo, você pode ver neste link no site da Jekyll que a estrutura de diretórios e arquivos é impressa na página muito bem:

.
├── _config.yml
├── _drafts
│   ├── begin-with-the-crazy-ideas.textile
│   └── on-simplicity-in-technology.markdown
├── _includes
│   ├── footer.html
│   └── header.html
├── _layouts
│   ├── default.html
│   └── post.html
├── _posts
│   ├── 2007-10-29-why-every-programmer-should-play-nethack.textile
│   └── 2009-04-26-barcamp-boston-4-roundup.textile
├── _data
│   └── members.yml
├── _site
└── index.html

Acredito que os caracteres do bloco de linhas acima sejam Unicode (conforme descrito nesta resposta aqui ), mas não tenho certeza de como o Markdown ou diferentes navegadores os manipularão. Eu esperava que o Markdown tivesse incluído alguma maneira de fazer isso, que gera os caracteres Unicode acima, talvez.

Matt Rowles
fonte
1
desde que você mencionou Jekyll especificamente, este no-fluff exemplo e sua fonte pode caber a conta
user3276552

Respostas:

144

Se você estiver preocupado com caracteres Unicode, poderá usar ASCII para construir as estruturas, para que sua estrutura de exemplo se torne

.
+-- _config.yml
+-- _drafts
|   +-- begin-with-the-crazy-ideas.textile
|   +-- on-simplicity-in-technology.markdown
+-- _includes
|   +-- footer.html
|   +-- header.html
+-- _layouts
|   +-- default.html
|   +-- post.html
+-- _posts
|   +-- 2007-10-29-why-every-programmer-should-play-nethack.textile
|   +-- 2009-04-26-barcamp-boston-4-roundup.textile
+-- _data
|   +-- members.yml
+-- _site
+-- index.html

Que é semelhante ao formato treeusado se você selecionar a ANSIsaída.

RobertKenny
fonte
1
Obrigado por isso. Porém, deve haver alguma preocupação em usar os caracteres Unicode? Tais como problemas conhecidos com navegadores mais antigos, Markdown tornando incorretamente etc
Matt Rowles
2
Não deve haver nenhum problema com o Markdown, ele estará nos seus navegadores da Web e dos modelos Jekyll.
RobertKenny
1
Outra vantagem dessa opção são diferenças menores em comparação com outras opções que usam símbolos diferentes apenas por razões cosméticas (como a saída de tree).
villasv
1
Ao usar esta resposta, a árvore é renderizada apenas como algumas linhas de texto. Testado em VSCode e VisualStudio com o plugin md. Também no GitHub isso não está funcionando
Danny
239

Segui um exemplo em outro repositório e agrupei a estrutura de diretórios em um par de triplos backticks ( ```):

```
project
│   README.md
│   file001.txt    
│
└───folder1
│   │   file011.txt
│   │   file012.txt
│   │
│   └───subfolder1
│       │   file111.txt
│       │   file112.txt
│       │   ...
│   
└───folder2
    │   file021.txt
    │   file022.txt
```
user799188
fonte
5
O estouro de pilha não suporta a sintaxe mais recente do triplo backtick; interpreta-os como backticks únicos. Os backticks únicos marcam o código como texto embutido, somente em uma única linha; é por isso que seu exemplo tem listras brancas entre cada linha. Para uma maneira compatível de marcar o código de várias linhas, recue o texto em quatro espaços.
Rory O'Kane #
3
Embora o SO não suporte o triple-backtick, a maioria das outras implementações de MD suporta (como o Github / BitBucket) e essa foi a única maneira de obter uma árvore em funcionamento que tivesse comentários embutidos sobre o que cada entrada era. Então .. +1 daqui!
22817 Scott-Byers
1
Polegares para cima para esta resposta. A marcação tripla de backticks também funciona para mim no Wordpress.
Binita Bharati 31/01/19
O suporte a triplo backtick parece funcionar no SO agora.
StriplingWarrior
41

Você pode usar a árvore para gerar algo muito semelhante ao seu exemplo. Depois de obter a saída, você pode agrupá-la em uma <pre>tag para preservar a formatação do texto sem formatação.

Cameron Spickert
fonte
Legal, isso parece útil, obrigado! Mas e as estruturas teóricas de arquivos? Se esta for a única solução no momento, acho que talvez seja necessário copiar e colar os caracteres necessários. Saúde novamente.
quer
Eu gosto desta solução. Veja bem em Markdown
Anh Tuan
27

Se você estiver usando o VS Code, esta é uma extensão incrível para gerar árvores de arquivos. https://marketplace.visualstudio.com/items?itemName=Shinotatwu-DS.file-tree-generator

Adicionado diretamente à remarcação ...

📦quakehunter
 ┣ 📂client
 ┣ 📂node_modules
 ┣ 📂server
 ┃ ┗ 📜index.js
 ┣ 📜.gitignore
 ┣ 📜package-lock.json
 ┗ 📜package.json
Will Ward
fonte
22

Eu criei um módulo de nó para automatizar esta tarefa: mddir

Uso

nó mddir "../relative/path/"

Para instalar: npm install mddir -g

Para gerar descontos para o diretório atual: mddir

Para gerar para qualquer caminho absoluto: mddir / absolute / path

Para gerar para um caminho relativo: mddir ~ / Documents / Whatever.

O arquivo md é gerado no seu diretório de trabalho.

Atualmente ignora as pastas node_modules e .git.

Solução de problemas

Se você receber o erro 'node \ r: não existe esse arquivo ou diretório', o problema é que o sistema operacional usa diferentes terminações de linha e o mddir não pode analisá-las sem definir explicitamente o estilo de final de linha como Unix. Isso geralmente afeta o Windows, mas também algumas versões do Linux. A definição das terminações da linha no estilo Unix deve ser realizada na pasta bin global mddir npm.

Correção de terminações de linha

Obtenha o caminho da pasta npm bin com:

npm config get prefix

CD nessa pasta

instalação de fermentação dos2unix

lib dos2unix / node_modules / mddir / src / mddir.js

Isso converte as terminações de linha em Unix, em vez de Dos

Em seguida, execute normalmente: node mddir "../relative/path/".

Exemplo de estrutura de arquivo de remarcação gerada 'directoryList.md'

    |-- .bowerrc
    |-- .jshintrc
    |-- .jshintrc2
    |-- Gruntfile.js
    |-- README.md
    |-- bower.json
    |-- karma.conf.js
    |-- package.json
    |-- app
        |-- app.js
        |-- db.js
        |-- directoryList.md
        |-- index.html
        |-- mddir.js
        |-- routing.js
        |-- server.js
        |-- _api
            |-- api.groups.js
            |-- api.posts.js
            |-- api.users.js
            |-- api.widgets.js
        |-- _components
            |-- directives
                |-- directives.module.js
                |-- vendor
                    |-- directive.draganddrop.js
            |-- helpers
                |-- helpers.module.js
                |-- proprietary
                    |-- factory.actionDispatcher.js
            |-- services
                |-- services.cardTemplates.js
                |-- services.cards.js
                |-- services.groups.js
                |-- services.posts.js
                |-- services.users.js
                |-- services.widgets.js
        |-- _mocks
            |-- mocks.groups.js
            |-- mocks.posts.js
            |-- mocks.users.js
            |-- mocks.widgets.js
John Byrne
fonte
1
Infelizmente, eu tentei isso e ele não funciona na minha máquina Windows 10 e parece que o projeto foi abandonado.
Rich Hopkins
1
Olá, obrigado por experimentar a biblioteca. Estive ocupado em outros projetos e não consigo replicar, mas encontrei uma possível correção. Obtenha o caminho da pasta npm bin com: 'npm config get prefix'. Faça o CD nessa pasta e execute 'brew install dos2unix', execute 'dos2unix lib / node_modules / mddir / src / mddir.js'. Isso converte as terminações de linha em Unix, em vez de Dos. Em seguida, execute normalmente: node mddir "../relative/path/".
John Byrne
Trabalhei na minha máquina Windows 10, pouco utilitário - obrigado!
John Kattenhorn
19

Como já recomendado, você pode usar tree. Mas para usá-lo junto com o texto reestruturado, alguns parâmetros adicionais foram necessários.

A treesaída padrão não será impressa se você estiver usando pandocpara produzir pdf.

tree --dirsfirst --charset=ascii /path/to/directoryproduzirá uma bela ASCIIárvore que pode ser integrada ao seu documento assim:

.. code::
.
|-- ContentStore
|   |-- de-DE
|   |   |-- art.mshc
|   |   |-- artnoloc.mshc
|   |   |-- clientserver.mshc
|   |   |-- noarm.mshc
|   |   |-- resources.mshc
|   |   `-- windowsclient.mshc
|   `-- en-US
|       |-- art.mshc
|       |-- artnoloc.mshc
|       |-- clientserver.mshc
|       |-- noarm.mshc
|       |-- resources.mshc
|       `-- windowsclient.mshc
`-- IndexStore
    |-- de-DE
    |   |-- art.mshi
    |   |-- artnoloc.mshi
    |   |-- clientserver.mshi
    |   |-- noarm.mshi
    |   |-- resources.mshi
    |   `-- windowsclient.mshi
    `-- en-US
        |-- art.mshi
        |-- artnoloc.mshi
        |-- clientserver.mshi
        |-- noarm.mshi
        |-- resources.mshi
        `-- windowsclient.mshi
aronadaal
fonte
8

Eu escrevi isso para a minha lista de arquivos do Dropbox.

sed é usado para remover caminhos completos do caminho de arquivo / pasta com link simbólico que vem depois ->

Infelizmente, as guias estão perdidas. Usando zsheu sou capaz de preservar guias.

! / usr / bin / env bash

#!/usr/bin/env zsh

F1='index-2.md' #With hyperlinks
F2='index.md'

if [ -e $F1 ];then
    rm $F1
fi

if [ -e $F2 ];then
    rm $F2
fi

DATA=`tree --dirsfirst -t -Rl --noreport | \
    sed 's/->.*$//g'`             # Remove symlink adress and ->

echo -e '```\n' ${DATA} '\n```' > $F1  # Markdown needs triple back ticks for <pre>

# With the power of piping, creating HTML tree than pipe it
# to html2markdown program, creates cool markdown file with hyperlinks.

DATA=`tree --dirsfirst -t -Rl --noreport -H http://guneysu.pancakeapps.com`
echo $DATA | \
    sed 's/\r\r/\n/g' | \
    html2markdown | \
    sed '/^\s*$/d' | \
    sed 's/\# Directory Tree//g' | \
        > $F2

As saídas como esta:

```
 .
├── 2013 
│   └── index.markdown
├── 2014 
│   └── index.markdown
├── 2015 
│   └── index.markdown
├── _posts 
│   └── 2014-12-27-2014-yili-degerlendirmesi.markdown
├── _stash 
└── update.sh 
```

[BASE_URL/](BASE_URL/)
├── [2013](BASE_URL/2013/)
│   └── [index.markdown](BASE_URL/2013/index.markdown)
├── [2014](BASE_URL/2014/)
│   └── [index.markdown](BASE_URL/2014/index.markdown)
├── [2015](BASE_URL/2015/)
│   └── [index.markdown](BASE_URL/2015/index.markdown)
├── [_posts](BASE_URL/_posts/)
│   └── [2014-12-27-2014-yili-degerlendirmesi.markdown](_posts/2014-12-27-2014-yili-degerlendirmesi.markdown)
├── [_stash](BASE_URL/_stash/)
├── [index-2.md](BASE_URL/index-2.md)
└── [update.sh](BASE_URL/update.sh)
* * *
tree v1.6.0 © 1996 - 2011 by Steve Baker and Thomas Moore
HTML output hacked and copyleft © 1998 by Francesc Rocher
Charsets / OS/2 support © 2001 by Kyosuke Tokoro
guneysus
fonte
7

Se você estiver usando o editor Atom, poderá fazer isso com o pacote ascii-tree .

Você pode escrever a seguinte árvore:

root
+-- dir1
    +--file1
+-- dir2
    +-- file2

e converta-o para o seguinte, selecionando-o e pressionando ctrl-alt-t:

root
├── dir1
│   └── file1
└── dir2
    └── file2
Ramtin Soltani
fonte
5

No OSX, usando reveal.js, eu tenho um problema de renderização se eu apenas usuário treee copio / colo a saída: símbolos estranhos aparecem.

Eu encontrei 2 soluções possíveis.

1) Use charset ascii e simplesmente copie / cole a saída no arquivo de remarcação

tree -L 1 --charset=ascii

2) Use diretamente HTML e unicode no arquivo de remarcação

<pre>
.
&#8866; README.md
&#8866; docs
&#8866; e2e
&#8866; karma.conf.js
&#8866; node_modules
&#8866; package.json
&#8866; protractor.conf.js
&#8866; src
&#8866; tsconfig.json
&#8985; tslint.json
</pre>

Espero que ajude.

felix na housecat
fonte
4

Eu sugiro usar wasabi, então você pode usar o markdown-ish se sentir assim

root/ # entry comments can be inline after a '#'
      # or on their own line, also after a '#'

  readme.md # a child of, 'root/', it's indented
            # under its parent.

  usage.md  # indented syntax is nice for small projects
            # and short comments.

  src/          # directories MUST be identified with a '/'
    fileOne.txt # files don't need any notation
    fileTwo*    # '*' can identify executables
    fileThree@  # '@' can identify symlinks

e jogue a sintaxe exata na biblioteca js para esse

exemplo wasabi

user3276552
fonte
1

Se você deseja gerá-lo dinamicamente, recomendo usar o Frontend-md . É simples de usar.

Bruno Wego
fonte
1

Existe um módulo NPM para isso:

npm dree

Ele permite que você tenha uma representação de uma árvore de diretórios como uma sequência ou um objeto. Usá-lo com a linha de comando permitirá salvar a representação em um arquivo txt.

Exemplo:

$ npm dree parse myDirectory --dest ./generated --name tree
EuberDeveloper
fonte