Modo organizacional - Analisando HTML rico diretamente ao colar?

12

Atualmente, para anotar ferramentas como Evernotee Quiver, posso copiar diretamente o conteúdo HTML do meu navegador favorito e colá-lo no aplicativo, com todo o link de formatação + preservado. No entanto, no modo original, parece que todas as informações de formatação estão perdidas.

Eu vi alguém sugerir o uso ewwpara navegar na web e copiar o conteúdo viaeww-org . No entanto, isso é realmente tedioso (acho que não haveria muita gente navegando na Web ewwhoje em dia em vez de navegadores modernos. Vou ter que abrir esse link novamente ewwe fazer a cópia, sem mencionar que às vezes ewwnão renderize bem o conteúdo).

É possível deixar Emacsanalisar diretamente o HTML copiado ao colar? Mesmo que ainda não exista uma ferramenta para isso, é possível criar uma?

Isso é quase a única coisa que me impede de mudar para orgmodeoutras ferramentas de anotações.

xji
fonte
Por favor, esclareça o que você quer dizer com "analisar diretamente o HTML copiado"
mankoff
@mankoff OK Acho que não estava claro o suficiente na minha descrição. O que eu quero é, por exemplo, se o HTML original tiver <b>text</b>depois Cmd + Cdele, ele pode ser convertido *text*em org modepor alguns meios ao colar. Ou, se não, pelo menos preserve o código HTML original para que eu possa visualizá-los em seu formato original apropriado mais tarde. A situação atual é, de alguma forma, apenas o texto simples será renderizado.
xji 5/05
Por exemplo, temos aqui <p>I've seen somebody <a href="http://emacs.stackexchange.com/q/7171/115">suggest using <code>eww</code> to browse the web and copy the content via <code>eww-org</code></a>. However that is really tedious(I don't think there would be a lot of people browsing the web using <code>eww</code> instead of modern browsers nowadays. I'll have to open that link again in <code>eww</code> and do the copying, not to mention sometimes <code>eww</code> doesn't render the contents nicely). </p>. Se copiar este parágrafo, desejo poder reproduzir sua formatação em orgmode.
xji 5/05
1
@mankoff Wonderful! Funcionou! Você é o cara! Eu acho que você pode até considerar enviá-lo como um pacote Emacs etc. haha. Isso poderia tornar org modemuito mais fácil de usar. Na verdade, eu gosto mais com a formatação sem conversão intermediária de RTF porque preserva mais informações. Por exemplo, #+BEGIN_QUOTEe #+BEGIN_EXAMPLEem sua resposta não seria preservado com a conversão adicional.
Xji
1
@incandescentman Isso é apenas uma tentativa de remover algumas informações de formatação, por exemplo, algum CSS dentro da página da web. Você pode tentar você mesmo e ver que diferença faz.
xji

Respostas:

12

é possível fazer um?

Como este é o emacs, sim .

Minha abordagem é usar ferramentas de terceiros que podem pegar HTML e converter em texto sem formatação ou mesmo diretamente no formato Org. Eu acho que esse é um truque feio e pode haver maneiras melhores de fazer isso, mas parece que funciona nos meus casos de teste.

(defun kdm/html2org-clipboard ()
  "Convert clipboard contents from HTML to Org and then paste (yank)."
  (interactive)
  (kill-new (shell-command-to-string "osascript -e 'the clipboard as \"HTML\"' | perl -ne 'print chr foreach unpack(\"C*\",pack(\"H*\",substr($_,11,-3)))' | pandoc -f html -t json | pandoc -f json -t org"))
  (yank))

Infelizmente, o HTML é incrivelmente complexo agora - não são mais algumas tags manuscritas simples. Essa marcação HTML complexa requer o complicado comando de shell acima. Faz o seguinte:

  1. osascriptobtém o texto HTML da área de transferência. É codificado em hexadecimal, então
  2. perl converte o hexadecimal em uma string
  3. Poderíamos converter esse HTML em Org diretamente com pandoc, mas o HTML está cheio de tags complicadas e, portanto, produz uma tonelada de código Org. Para simplificar o HTML com o conjunto mínimo de tags necessárias para capturar a formatação, eu
  4. Converta o HTML em json e, em seguida,
  5. Converta o json em Org (essas duas etapas simplificam o HTML).

Observe que osascripté para o MacOS. Para modificar as etapas 1 a 2 para Linux, substitua o argumento shell-command-to-string por

"xclip -o -t text/html | pandoc -f html -t json | pandoc -f json -t org"

De qualquer forma, a saída do pandoccomando é retornada ao emacs e inserida no buffer.

Ligue o novo comando do Emacs a uma chave semelhante a "colar", mas isso significa "colar e converter-de-html" para você, e deve funcionar.

Como alternativa, se você não quiser pensar em qual comando colar usar, aqui está uma versão do Linux que converterá HTML quando estiver disponível na área de transferência e, caso contrário, retornará ao texto sem formatação:

"xclip -o -t TARGETS | grep -q text/html && (xclip -o -t text/html | pandoc -f html -t json | pandoc -f json -t org) || xclip -o"
mankoff
fonte
Uma adição: parece que pandoco uso automático de espaço sem quebra é bastante usado em vez do espaço normal ao converter texto embutido formatado (negrito, itálico, código etc.), que não são reconhecidos orgmodepor padrão. Você teria que adicioná-lo () org-emphasis-regexp-componentspara que esses textos sejam formatados corretamente orgmode.
Xj6
notavelmente a versão "liberada" do xclip não suporta a opção -t; portanto, o xclip deve ser construído no github. Além disso, você pode precisar de entrada pandoc tubo e saída atravésiconv utf-8
malcook
xcliptambém está no OS X (talvez apenas com o X11 e / ou Developer Tools instalado?), portanto a resposta aprimorada também pode funcionar no OS X.
Mankoff
@JIXiang Como eu modificaria a resposta aceita para converter também espaços sem quebra em espaços normais?
Incandescentman
1
@incandescentman Modifiquei originalmente o arquivo do pacote org-mode para que ele reconhecesse o espaço sem interrupção como um separador. No entanto, acabou sendo entediante com as alterações de versão. Em seguida, levantei uma questão sobre o repo da pandoc que você pode pesquisar. Essencialmente, você pode usar um "filtro" no pandoc para executar a substituição automática. Mas isso às vezes também falha. Então agora eu seleciono manualmente principalmente o conteúdo colado e faço uma substituição. Minha última substituição é quase sempre essa, então apenas rolar o meu histórico de substituições e aplicar.
Xji #