|
From: | Rafael Fontenelle |
Subject: | Re: [www-pt-br-general] Trocar aspas |
Date: | Wed, 6 Jul 2016 12:32:38 -0300 |
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)
[Prev in Thread] | Current Thread | [Next in Thread] |