#!/usr/bin/env python2.4 # -*- coding: utf-8 -*- """ Build a newspaper story. Ask a bunch of parameters. By prof. MS. José Antonio Meira da Rocha mailto:joseantoniomeira@gmail.com http://meiradarocha.jor.br License GPL 2.0 2009-06-14a Bugs: GRAVE: dá erro de índice se o bloco está fora das margens 1. Monta só o título se não houver guias de linha 2. Não manipula matérias de uma só coluna 3. Foto é agrupada com largura errada, estranha """ ############################## # Import Python system ############################## import sys ########################### # Assegura que está rodando # dentro do Scribus ########################### try: import scribus except ImportError,err: print "This Python script is written for the Scribus scripting interface." print "It can only be run from within Scribus." sys.exit(1) ######################### # USER IMPORTS GO HERE # ######################### ################################################ # Usuário pode mudar estes parâmetros constantes ################################################ numeroDeColunasPadrao = 5 entrecolunasPadrao = 5 # 14.1732pt # 5mm corpoDeTituloPadrao = 48 # corpo 48 corpoPadraoDoSubtitulo = 18 # corpo 18 proporcaoDeEntrelinha = 1.20256 # Constante cosmogônica para arredondar em 28mm de altura com título 48pt+18pt estiloDoTitulo = "Titulo 1" estiloDoSubtitulo = "Subtitulo 1" estiloDoAutor = "Assinatura" estiloDoPrimeiroParagrafo = "Primeiro paragrafo" estiloNormal = "Normal" ########################################## # Constantes que não devem ser modificadas AROUND_FRAME = 1 BOUNDING_BOX = 2 CONTOUR_LINE = 3 ###################### # Locale strings # Textos para tradução ###################### # Texto para abrir um documento pedirParaAbrirDoc = "

Abra um documento

" \ +"Ops! Abra um documento antes \nde rodar este comando." # Mensagens para erro. labelDeScript = "Aplicar Estilos" pedirParaAbrirQuadro = "

Selecione um quadro

\n" \ +"Ops! Desenhe ou selecione apenas um quadro\n" \ +"da matéria em que você quer aplicar estilos." # Textos sobre número de colunas labelDeColunas = 'Colunas' #Number of columns mensagemDeColunas = '

Colunas

Quantas colunas?

' #How many columns? defaultText = "Título\nSubtítulo\nAutor da matéria\nPrimeiro Parágrafo\nOutros parágrafos\nOutros parágrafos..." statusMessage = "Rodando o script..." #################### # End Locale strings #################### try: import Image except ImportError,err: print "This Python script is written for the PIL graphic interface." print "It should be installed in Scribus Python tree." sys.exit(1) from scribus import UNIT_MILLIMETERS, BUTTON_OK, ICON_WARNING, mm, pt #import re # carrega o módulo de expressões regulares ##################### # Tira espaços duplos ##################### def tiraEspacosDuplos(t): """Tira espaços duplos e parágrafos vazios""" t = t.strip() while t.count("\t"): t = t.replace("\t","") while t.count(" "): t = t.replace(" "," ") while t.count("
"): t = t.replace("
","\n") while t.count(chr(13)): # Fim de parágrafo tipo DOS e Windows. t = t.replace(chr(13),"\n") # Troca pelo fim-de-parágrafo padrão while t.count(" \n"): t = t.replace(" \n","\n") while t.count("\n "): t = t.replace("\n ","\n") while t.count("\n\n"): t = t.replace("\n\n","\n") return t ############################## # Pega tipo do objeto # Entrada: nada, mas deve # haver objeto selecionado ############################## # Retorno: #0: nada selecionado #2: quadro de Imagem ou renderização #4: quadro de Texto #5: linha #6: grupo ou retângulo #7: polígono ou polilinha #8: texto em linha ############################## def getObjectType(): objtype = 0 obj = scribus.getSelectedObject() itens = scribus.getPageItems() for item in itens: if item[0] == obj: objtype = item[1] break return objtype ############################### # Verifica se objeto é um grupo ############################### def isGroup(): name = scribus.getSelectedObject(0)[0:5] type = getObjectType() if (type == 6) and (scribus.selectionCount() > 1) and (name == "Group"): return type else: return 0 ################### # Aplica Estilo ################### def aplicaEstilo(estilo,quadro): # Tenta aplicar estilo try: scribus.setStyle(estilo, quadro) except: scribus.createParagraphStyle(estilo) scribus.setStyle(estilo, quadro) return quadro ########################### # DIALOGO ########################### def pede(label,msg,query,default): """Pede entrada de usuário.""" res = scribus.valueDialog(label,msg,query) if not res: sys.exit() try: return res except: return default ###################### # Formata todo o texto ###################### def formataTexto(quadroDeTexto): """Formata matéria com titulo, subtítulo,autor, primeiro parágrafo, parágrafos normais.""" # Colocar aqui verificação se é grupo e desagrupar scribus.deselectAll() scribus.selectObject(quadroDeTexto) if isGroup(): scribus.unGroupObject(quadroDeTexto) quadroDeTexto = scribus.getSelectedObject() #scribus.selectObject(1) # Tiras espaços duplos e parágrafos vazios alltext = scribus.getAllText(quadroDeTexto) alltext = tiraEspacosDuplos(alltext) scribus.deleteText(quadroDeTexto) scribus.setText(alltext,quadroDeTexto) linhas = alltext.splitlines(1) # Método Python para devolver lista com linhas do texto e fim-de-parágrafo tit = len(unicode(linhas[0])) # unicode() para contar como 1 os caracteres acentuados com mais de 1 byte subtit = len(unicode(linhas[1])) # O comprimento leva em conta o fim de parágrafo aut = len(unicode(linhas[2])) prim = len(unicode(linhas[3])) # Aplica estilo normal a todo o texto inicioTitulo = 0 comprTexto = len(unicode(alltext)) scribus.deselectAll() scribus.selectText(inicioTitulo, comprTexto-1, quadroDeTexto) aplicaEstilo(estiloNormal, quadroDeTexto) scribus.hyphenateText() # Formata o título inicioTitulo = 0 scribus.deselectAll() scribus.selectText(inicioTitulo, tit-1, quadroDeTexto) aplicaEstilo(estiloDoTitulo, quadroDeTexto) scribus.dehyphenateText() # Formata o subtítulo inicioSubTitulo = tit scribus.deselectAll() scribus.selectText(inicioSubTitulo, subtit-1, quadroDeTexto) aplicaEstilo(estiloDoSubtitulo, quadroDeTexto) scribus.dehyphenateText() # Formata a assinatura inicioAutor = tit + subtit scribus.deselectAll() scribus.selectText(inicioAutor, aut-1, quadroDeTexto) aplicaEstilo(estiloDoAutor, quadroDeTexto) scribus.dehyphenateText() # Formata o primeiro parágrafo inicioTexto = tit + subtit + aut scribus.deselectAll() scribus.selectText(inicioTexto, prim-1, quadroDeTexto) aplicaEstilo(estiloDoPrimeiroParagrafo, quadroDeTexto) scribus.deselectAll() ###################### # MANIPULA SELEÇÃO ###################### def manipulaSelecao(): """ Gerencia objetos selecionados """ # Se há objeto selecionado... story = scribus.getSelectedObject(0) # Need check if only one object is selected if story: # and scribus.selectionCount() == 1 : # if story: formataTexto(story) scribus.docChanged(True) else: scribus.messageBox( labelDeScript, pedirParaAbrirQuadro, ICON_WARNING, BUTTON_OK ) ###################### # MANIPULA DOCUMENTO ###################### def manipulaDocumento(): """Manipula documentos """ # Se há documento aberto if scribus.haveDoc(): #Desliga redraw scribus.setRedraw(False) #Guarda unidades do usuário # Save unit unit = scribus.getUnit() #Define novas unidades como "pontos tipográfico" scribus.setUnit(UNIT_MILLIMETERS) ############################# # Manipula objeto selecionado ############################# manipulaSelecao() #Recupera medidas do usuário scribus.setUnit(unit) else: # Senão há documento aberto, avisa. scribus.messageBox( "Abra um documento", "

Abra um documento

Por favor, abra um documento e selecione um quadro antes de usar este script.

", ICON_WARNING, BUTTON_OK ) def myCode(): """ User code """ ######################### # USER CODE GOES HERE # ######################### # Gerencia documento (aberto, abre etc) manipulaDocumento() ######################### # USER CODE ENDS HERE # ######################### def main(argv): """Main entry point""" myCode() def main_wrapper(argv): try: scribus.statusMessage(statusMessage) scribus.progressReset() main(argv) finally: if scribus.haveDoc(): scribus.setRedraw(True) scribus.statusMessage("") scribus.progressReset() if __name__ == '__main__': main_wrapper(sys.argv)