[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [www-pt-br-general] Trocar aspas
From: |
Rafael Beraldo |
Subject: |
Re: [www-pt-br-general] Trocar aspas |
Date: |
Sun, 22 Feb 2015 17:32:12 -0300 |
Olá, Sergio,
Perfeito! elisp parece ser muito mais poderoso que expressões
regulares. Fiquei com vontade de aprender! Perguntei à Thérèse
Godefroy, do time francês, que me disse que eles ainda não mudaram
todas as aspas para UTF-8. Talvez outros times possam usar esse script
no futuro.
Criei uma tarefa no Savannah para lembrarmos de aplicar o patch que
vou mandou [0].
[0]: https://savannah.gnu.org/task/index.php?13500
Abraços!
2015-02-21 23:42 GMT-03:00 Sergio Durigan Junior <address@hidden>:
> Yo,
>
> Tudo jóia? Finalmente tive um tempo agora à noite, e fiz um scriptzinho
> em elisp pra trocar as aspas "antigas" por “novas” :-).
>
> Como disse no outro e-mail, infelizmente um simples sed/awk não
> resolveria; acabei tendo que levar em conta diversos fatores pra que o
> script funcionasse como deveria. São eles:
>
> - As aspas, nos arquivos .po, estão escritas assim: \" (ou seja, estão
> "escapadas"). No entanto, as tags HTML também usam aspas, e elas (as
> aspas das tags) *também* estão escapadas. Obviamente, substituir as
> aspas das tags é errado.
>
> - Nem todas as aspas estão escritas literalmente; algumas delas estão
> escritas usando HTML (i.e., &lquote; e &rquote;).
>
> - As strings em inglês também estão usando aspas "antigas"; no entanto,
> obviamente não devemos tocar nessas strings (identificadas por
> "msgid").
>
> - Aparentemente existem alguns elementos CSS/Javascript no código, que
> *também* usam aspas, e que, assim como as tags HTML, não devem ser
> tocados.
>
> - As aspas "antigas" não são visualmente distinguíveis entre si (i.e.,
> abre-aspas e fecha-aspas são o mesmo caractere); as aspas em UTF-8 são
> distintas (essa é uma das vantagens delas, claro). Portanto, é
> preciso manter um "estado" pra saber se vamos abrir ou fechar aspas.
>
> O script toma conta de tudo isso. O uso dele é bem simples:
>
> emacs --script troca-aspas.el ARQUIVO
>
> Ele *sobrescreve* o arquivo. No caso do nosso repositório, eu rodei ele
> com um simples loop:
>
> for f in `find . -type f -name "*.po"` ; do emacs --script ./troca-aspas.el
> $f ; done
>
> (Esse loop assume que você está dentro do repositório; ele roda o script
> em cada arquivo .po que encontrar).
>
> Estou enviando o patch gerado depois de rodar o script. Inspecionei o
> patch, e parece que está tudo certo (no entanto, recomendo e agradeço se
> alguém mais der uma olhada).
>
> Também estou enviando o script, licenciado, caso seja interessante
> colocá-lo no repositório, ou se alguém quiser dar uma olhada.
>
> Emacs é show :-).
>
> Falou,
>
> --
> Sergio
> GPG key ID: 0x65FC5E36
> Please send encrypted e-mail if possible
> http://sergiodj.net/
>
>
> ;;; troca-aspas.el -- Substitui aspas "antigas" por “novas” nos
> ;;; arquivos de tradução do projeto GNU.
>
> ;; Copyright (C) 2015 Sergio Durigan Junior
>
> ;; This program is free software; you can redistribute it and/or
> ;; modify it under the terms of the GNU General Public License as
> ;; published by the Free Software Foundation, either version 3 of the
> ;; License, or (at your option) any later version.
>
> ;; This program is distributed in the hope that it will be useful, but
> ;; WITHOUT ANY WARRANTY; without even the implied warranty of
> ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> ;; General Public License for more details.
>
> ;; You should have received a copy of the GNU General Public License
> ;; along with this program. If not, see
> ;; <http://www.gnu.org/licenses/>.
>
> (defconst file-to-scan (pop argv))
> (unless (and file-to-scan (file-readable-p file-to-scan))
> (error "Uso: emacs --script replace-quote.el ARQUIVO"))
>
> (setq inside-quote nil)
>
> (defun replace-quote-1 ()
> (goto-char (point-min))
> (while (re-search-forward
> "\\(msgid\\|\\\\\"\\|{\\|<\\|“\\|”\\)" nil 'move)
> (let ((str (match-string 1)))
> (cond
>
> ((string-equal str "msgid")
> (search-forward "msgstr"))
>
> ((string-equal str "<")
> (skip-chars-forward "^>"))
>
> ((string-equal str "{")
> (skip-chars-forward "^}"))
>
> ((string-equal str "\\\"")
> (if inside-quote
> (replace-match "”" t t)
> (replace-match "“" t t))
> (setq inside-quote (not inside-quote)))
>
> ((string-equal str "“")
> (replace-match "“")
> (setq inside-quote t))
>
> ((string-equal str "”")
> (replace-match "”")
> (setq inside-quote nil))))))
>
> (defun replace-quote ()
> (find-file file-to-scan)
> ;; Se o modo PO estiver instalado, ele marca o arquivo como read-only
> (when (eq major-mode 'po-mode)
> (setq major-mode 'fundamental-mode)
> (setq buffer-read-only nil))
> (message "Processando arquivo %s" file-to-scan)
> (unless buffer-read-only
> (replace-quote-1)
> (and (buffer-modified-p) (save-buffer))))
>
> (replace-quote)
>
--
Rafael Beraldo
cabaladada.org