www-pt-br-general
[Top][All Lists]
Advanced

[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\\|\\\\\"\\|{\\|<\\|&ldquo;\\|&rdquo;\\)" 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 "&ldquo;")
>         (replace-match "“")
>         (setq inside-quote t))
>
>        ((string-equal str "&rdquo;")
>         (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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]