/usr/share/scribus/scripts/InfoBox.py is in scribus-data 1.4.6+dfsg-4build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
# ****************************************************************************
# 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ****************************************************************************
"""
(C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de
(c) 2008, 2010, 2012 modifications, additional features, and reversion back to using PIL again! by Gregory Pittman
A simple script for exact placement of a frame (infobox)
over the current textbox, asking the user for the width
of the infobox and in which column to place it.
Some enhancements:
* You can now create a text frame or an image frame, and also load
an image.
* More than one infobox can be added to a text frame by repeatedly running
the script (ie, no name conflicts occur).
* Height and Y-Pos of top of infobox can be specified.
* Works with any page unit - pts, mm, in, and picas, cm, and even ciceros.
* Infobox has Text Flows Around Frame activated, also
Scale Image to Frame for images.
* If you load an image with the script, an exactly correct frame height is made.
USAGE
Select a textframe, start the script and have phun
Default name for the infobox is 'infobox' + name_of_selected_frame,
but this can be changed.
"""
try:
import scribus
except ImportError:
print "Unable to import the 'scribus' module. This script will only run within"
print "the Python interpreter embedded in Scribus. Try Script->Execute Script."
sys.exit(1)
pil_found = 1
try:
from PIL import Image
except ImportError:
pil_found = 0
def main(argv):
unit = scribus.getUnit()
units = [' pts','mm',' inches',' picas','cm',' ciceros']
unitlabel = units[unit]
if scribus.selectionCount() == 0:
scribus.messageBox('Scribus - Script Error',
"There is no object selected.\nPlease select a text frame and try again.",
scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(2)
if scribus.selectionCount() > 1:
scribus.messageBox('Scribus - Script Error',
"You have more than one object selected.\nPlease select one text frame and try again.",
scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(2)
textbox = scribus.getSelectedObject()
pageitems = scribus.getPageItems()
boxcount = 1
for item in pageitems:
if (item[0] == textbox):
if (item[1] != 4):
scribus.messageBox('Scribus - Script Error',
"This is not a textframe. Try again.", scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(2)
# While we're finding out what kind of frame is selected, we'll also make sure we
# will come up with a unique name for our infobox frame - it's possible we may want
# more than one for a multicolumn frame.
if (item[0] == ("infobox" + str(boxcount) + textbox)):
boxcount += 1
left, top = scribus.getPosition(textbox)
o_width, o_height = scribus.getSize(textbox)
o_cols = int(scribus.getColumns(textbox))
o_gap = scribus.getColumnGap(textbox)
columns_width = 0
column_pos = 0
o_colwidth = (o_width - ((o_cols - 1) * o_gap)) / o_cols
if (o_cols > 1):
while (columns_width > o_cols or columns_width < 1):
columns_width = scribus.valueDialog('Width',
'How many columns width shall the '+
'box be (max ' + str(o_cols) + ')?','1')
columns_width = int(columns_width)
if (columns_width < o_cols):
max = o_cols - columns_width
while (column_pos <= max and column_pos <= 1):
column_pos = scribus.valueDialog('Placement',
'In which column do you want '
'to place the box (1 to ' +
str(o_cols) + ')?','1')
column_pos = int(column_pos) - 1
if (o_cols == 1):
columns_width = 1
new_height = 0
while (new_height <= 0):
new_height = scribus.valueDialog('Height','Your frame height is '+ str(o_height) +
unitlabel +'. How tall\n do you want your ' +
'infobox to be in '+ unitlabel +'?\n If you load an image and have the PIL module, height will be\n calculated, so the value here will not\n matter in that case.', str(o_height))
if (not new_height) :
sys.exit(0)
new_height = float(new_height)
new_top = -1
while (new_top < 0):
new_top = scribus.valueDialog('Y-Pos','The top of your infobox is currently\n'+ str(top) +
unitlabel +'. Where do you want \n' +
'the top to be in '+ unitlabel +'?', str(top))
if (not new_top) :
sys.exit(0)
new_top = float(new_top)
framename = scribus.valueDialog('Name of Frame','Name your frame or use this default name',"infobox" + str(boxcount) + textbox)
if (not framename) :
sys.exit(0)
frametype = 'text'
frametype = scribus.valueDialog('Frame Type','Change to anything other\n than "text" for image frame.\nEnter "imageL" to also load an image',frametype)
if (not frametype) :
sys.exit(0)
new_width = columns_width * o_colwidth + (columns_width-1) * o_gap
new_left = left + ((column_pos) * o_colwidth) + ((column_pos) * o_gap)
if (frametype == 'text'):
new_textbox = scribus.createText(new_left, float(new_top), new_width, float(new_height),framename)
scribus.setColumnGap(0, new_textbox)
scribus.setColumns(1, new_textbox)
scribus.textFlowMode(new_textbox, 1)
else:
if (frametype == 'imageL'):
imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif *.JPG *.PNG *.jpeg *.JPEG *.TIF)',haspreview=1)
if (pil_found == 1):
im = Image.open(imageload)
xsize, ysize = im.size
new_height = float(ysize)/float(xsize)*new_width
else:
scribus.messageBox('Please Note',"Your frame will be created once you click OK.\n\nUse the Context Menu to Adjust Frame to Image.\n\nIf your image does not fill the width completely,\nstretch the frame vertically first.",scribus.BUTTON_OK)
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
scribus.loadImage(imageload, new_image)
else:
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
scribus.textFlowMode(new_image, 1)
scribus.setScaleImageToFrame(1,1,new_image)
# scribus.setScaleImageToFrame(scaletoframe=1, proportional=1, name=new_image)
if __name__ == '__main__':
# This script makes no sense without a document open
if not scribus.haveDoc():
scribus.messageBox('Scribus - Script Error', "No document open", scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(1)
# Disable redraws
scribus.setRedraw(False)
# Run the main script, ensuring redraws are re-enabled even if the
# script aborts with an exception, and don't fail with an exception
# even if the document is closed while the script runs.
try:
main(sys.argv)
finally:
try:
scribus.setRedraw(True)
except:
pass
|