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 Fontenelle
Subject: Re: [www-pt-br-general] Trocar aspas
Date: Wed, 6 Jul 2016 12:32:38 -0300

Olá Sérgio,

Vendo o histórico da lista de discussão, encontrei esse seu script. Muito bom e muito simples de usar!   Só gostaria de saber se você poderia incluir nele uma exceção:  quando usado o gnun [1] para atualizar os arquivos PO, ele coloca a msgid prévia logo acima da atual iniciando a linha com "# | ". Teria como alterar seu script para realizar a substituição for encontrada essa sintaxe no começo da linha?

A título de exemplo, veja se consegue acessar o commit que fiz atualizando os arquivos PO: http://git.savannah.gnu.org/gitweb/?p=www-pt-br.git;a=commitdiff;h=ca0f8bbc785fe81338b8d7f6ce80c340ab494510;hp=922904293de7181add21de4b134c568bc7f19bc3

Agradeço desde já,
Rafael Fontenelle

Em 21 de fevereiro de 2015 23:42, Sergio Durigan Junior <address@hidden> escreveu:
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)



reply via email to

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