#!/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)