Kaydet (Commit) c2a393fb authored tarafından László Németh's avatar László Németh Kaydeden (comit) Andras Timar

LibreLogo Writer extension

Change-Id: I31a61f0773689a054b5d5008ca9d4eb0bd9d7a19
Reviewed-on: https://gerrit.libreoffice.org/998Reviewed-by: 's avatarAndras Timar <atimar@suse.com>
Tested-by: 's avatarAndras Timar <atimar@suse.com>
üst 207ed1b1
<?xml version='1.0' encoding='UTF-8'?>
<oor:component-data
xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
oor:name="Addons"
oor:package="org.openoffice.Office">
<node oor:name="AddonUI">
<node oor:name="OfficeToolBar">
<node oor:name="LibreLogo.OfficeToolBar" oor:op="replace">
<node oor:name="m01" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$goforward?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Forward</value>
<value xml:lang="hu">Előre</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m02" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$gobackward?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Back</value>
<value xml:lang="hu">Hátra</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m03" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$left?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Left</value>
<value xml:lang="hu">Balra</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m04" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$right?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Right</value>
<value xml:lang="hu">Jobbra</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m05" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$run?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Start (the program in the Writer document)</value>
<value xml:lang="hu">Indítás (a Writer dokumentumban lévő programé)</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m06" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$stop?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Stop</value>
<value xml:lang="hu">Leállítás</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m07" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$home?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Home</value>
<value xml:lang="hu">Haza</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m08" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$clearscreen?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Clear screen</value>
<value xml:lang="hu">Képernyőtörlés</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
<node oor:name="m09" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$commandline?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">FORWARD (fd), BACK (bk), LEFT (lt), RIGHT (rt) • fd 72, bk 1cm + 1in + 1", lt 90, rt 1.5h
REPEAT num [ commands ], REPCOUNT • repeat 100 [ fd repcount lt 91 ]
PENUP (pu), PENDOWN (pd), FILL, CLOSE, HOME, CLEARSCREEN (cs), PENSIZE (ps 5)
PENCOLOR (pc), FILLCOLOR (fc) • pc “red”, pc 0xff0000, fc [255, 0, 0], fc any
POSITION (pos), HEADING (seth) • pos [0, 0], pos pagesize, seth 60, seth [0, 0]
CIRCLE, ELLIPSE, BOX, RECTANGLE • circle 10 ellipse [5, 9] box 10 rectangle [5, 2]
LABEL, TEXT, PRINT • label “Some text”, circle 200 text “center of the actual shape”
FONTFAMILY “Font” FONTSIZE 9 FONTCOLOR “red” FONTWEIGHT “bold”
TO name arguments ... END, TO name arguments, OUTPUT return_value, END
RANDOM, SQRT, INT, COUNT, ABS, SIN, COS, INPUT • ps random 100, print count “string”
PICTURE (pic) [ ... ] • group different shapes: pic [ fd 100 circle 50 ]</value>
<value xml:lang="hu">ELŐRE (e), HÁTRA (h), BALRA (b), JOBBRA (j) • e 72, h 1cm + 1in + 1", b 90, j 1,5ó
ISMÉTLÉS (ism) hányszor [ parancsok ], HÁNYADIK • ism 100 [ e hányadik b 91 ]
TOLLATFEL (tf), TOLLATLE (tl), TÖLT, ZÁR, HAZA, TÖRÖLKÉP, TOLLVASTAGSÁG (tv 5)
TOLLSZÍN (tsz), TÖLTŐSZÍN (tlsz) • tsz „kék”, tsz 0xff0000, tsz [0, 0, 0], tsz tetsz
HELY, IRÁNY • hely [0, 0], hely oldalméret, irány 60, irány [0, 0]
KÖR, ELLIPSZIS, NÉGYZET, TÉGLALAP • kör 100, ellipszis [50, 100], négyzet 100
CÍMKE, SZÖVEG, KI • „címke szöveg”, kör 200 szöveg „körfelirat” ki 5+5
BETŰCSALÁD „betű” BETŰMÉRET 24 BETŰSZÍN „kék” BETŰVASTAGSÁG „vastag”
EZ név változók ... VÉGE, EZ név változók, EREDMÉNY visszatérési_érték, VÉGE
VÉLETLENSZÁM (vszám), GYÖK, EGÉSZ, DARAB (db), BE • e vszám 100, ki db „betűk”
KÉP [ ... ] • alakzatok csoportosítása: kép [ e 100 kör 50 ]</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="ControlType" oor:type="xs:string">
<value>Editfield</value>
</prop>
<prop oor:name="Width" oor:type="xs:long">
<value>300</value>
</prop>
</node>
<node oor:name="m10" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.TextDocument</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$__translate__?language=Python&amp;location=user:uno_packages</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Uppercase commands, also translate them to the language of the document</value>
<value xml:lang="hu">Parancsok nagybetűsítése és fordítása a dokumentum nyelvére</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
</node>
</node>
</node>
<node oor:name="Images">
<node oor:name="logo-forward" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$goforward?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_arrowshapes.up-arrow.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_arrowshapes.up-arrow.png</value>
</prop>
</node>
</node>
<node oor:name="logo-backward" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$gobackward?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_arrowshapes.down-arrow.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_arrowshapes.down-arrow.png</value>
</prop>
</node>
</node>
<node oor:name="logo-left" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$left?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_arrowshapes.circular-leftarrow.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_arrowshapes.circular-leftarrow.png</value>
</prop>
</node>
</node>
<node oor:name="logo-right" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$right?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_arrowshapes.circular-arrow.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_arrowshapes.circular-arrow.png</value>
</prop>
</node>
</node>
<node oor:name="logo-run" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$run?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_runbasic.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_runbasic.png</value>
</prop>
</node>
</node>
<node oor:name="logo-stop" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$stop?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_basicstop.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_basicstop.png</value>
</prop>
</node>
</node>
<node oor:name="logo-home" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$home?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_navigationbarleft.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_navigationbarleft.png</value>
</prop>
</node>
</node>
<node oor:name="logo-clearscreen" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$clearscreen?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_newdoc.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_newdoc.png</value>
</prop>
</node>
</node>
<node oor:name="logo-translate" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$__translate__?language=Python&amp;location=user:uno_packages</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageSmallURL">
<value>%origin%/icons/sc_editglossary.png</value>
</prop>
<prop oor:name="ImageBigURL">
<value>%origin%/icons/lc_editglossary.png</value>
</prop>
</node>
</node>
</node>
</node>
</oor:component-data>
2012-11-06 László Németh:
* uppercase/translation icon:
- expands and uppercase Logo commands (fd -> FORWARD)
- translation between supported languages (commands, decimal sign, for/in order)
* new icon for clear screen
* add English manual (see LibreLogo/Logo/Turtle graphics in Help)
2012-10-25 László Németh:
* fix positioning to the faulty program line
* program cache depends from the (modified) language of the document, too
2012-10-21 László Németh:
* speed up command line
* add multiline tooltip to the command line (it works well from LibO 3.6.2)
* random color constants: ~color, eg. '~orange', '~green' etc.
* handle modulo operator
* ask before the compilation of long documents (avoid freezings)
* add compilation cache to the multiline programs
* better help window caption in the command line
2012-06-27 László Németh:
* fix __string__ (use localized decimal sign)
* fix repcount in loops with inner picture block
* handle reopened documents
* modified argument list of custom dashed penstyle
* fix warning messages at maximum recursion depth and memory
* add hatching styles (fillstyle num or
fillstyle [line count(max 3), color, distance, degree]
* add localized set(), range(), sorted()
* fix turtle selection at program start
* modified turtle colors
* fix showturtle
* fix LineStyle_SOLID and LineStyle_DASHED
* add repcount to the infinite loop
* add logical expression and better list support to the simple LibreLogo expression parser
* add string size limit for Print()
* support "pic" without block: new shape
* use localized __string__ for STR instead of str
* add min, max, and regex functions: sub, search, findall
* fix double round in localizations
* more stable dotted lines in the PDF export (implemented as arrays of dot-headed arrows)
* circles with dotted lines
* working pos and pagesize indices in expressions
2012-05-17 László Németh:
* fix opt. suffix syntax of for+in (eg. with Finnish :ssa, Hungarian -ban)
* add dashed outline of turtle to show "pen up" state
* fix initial turtle focus for OpenOffice.org and older LibreOffice versions
* parsing simple (with 0 or 1 argument) user functions in complex expressions
* add localized "global"
* add localized operator "in" for logical expressions
* parsing user functions with 2 or more arguments in simple numerical expressions
* function heading supports coordinates
* function position supports drawing
* function pensize supports argument any
* set SizeProtect feature of turtle shape
* replace random while repcount variable with iterator
* fix repcount checking in conditions of "while" loops
* add repcount support to "for x in y" loops
* fix OUTPUT and STOP for lines with multiple commands
* fix = -> == conversion in logical expressions in OUTPUT
* fix multiple document support using CreationDate instead of Title
* better OpenOffice.org 3.2 compatibility (optional usage of feature Visible)
2012-05-08 László Németh:
* picture [] handles left hanging shapes better
* function random works on lists or list-convertable objects (string, tuple, dict, set), too
* faster "label" (remove unnecessary shape search)
* document-level turtle states
* clean name spaces
* localization of "pi" (localizations support greek letter pi as alternative)
* localized "float"
* int & float support localized decimal signs and measurements (float '10,5cm')
* print, label, text support localized decimal sign
2012-05-02 László Németh:
* fix slow drawing of new line shapes (unnecessary shape search)
* "circle" and "square" are synonyms of ellipse and rectangle, eg.
square num = rectangle [num, num]
2012-04-27 László Németh:
* Initial release
# -*- encoding: UTF-8 -*-
# -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
import sys, os, uno, unohelper
import re, random, traceback, itertools
import threading, time as __time__
ctx = uno.getComponentContext()
__lngpath__ = re.sub("[\w_.]*$", "", ctx.ServiceManager.createInstanceWithContext("org.openoffice.LibreLogo.LibreLogoDummy", ctx).get_path())
__translang__ = "cz|de|dk|en|es|fr|hu|it|nl|no|pl|pt|ru|se|sl" # FIXME supported languages for language guessing, expand this list, according to the localizations
__lng__ = {}
__docs__ = {}
__prevcode__ = None
__prevlang__ = None
__prevcompiledcode__ = None
__thread__ = None
__lock__ = threading.Lock()
__halt__ = False
__compiled__ = ""
__group__ = 0
__groupstack__ = []
__grouplefthang__ = 0
__comp__ = {}
__strings__ = []
__colors__ = {}
__COLORS__ = ['BLACK', 0x000000], ['SILVER', 0xc0c0c0], ['GRAY', 0x808080], \
['WHITE', 0xffffff], ['MAROON', 0x800000], ['RED', 0xff0000], \
['PURPLE', 0x800080], ['FUCHSIA', 0xff00ff], ['GREEN', 0x008000], \
['LIME', 0x00ff00], ['OLIVE', 0x808000], ['YELLOW', 0xffff00], \
['NAVY', 0x000080], ['BLUE', 0x0000ff], ['TEAL', 0x008080], \
['AQUA', 0x00ffff], ['PINK', 0xffc0cb], ['TOMATO', 0xff6347], \
['ORANGE', 0xffa500], ['GOLD', 0xffd700], ['VIOLET', 0x9400d3], \
['SKYBLUE', 0x87ceeb], ['CHOCOLATE', 0xd2691e], ['BROWN', 0xa52a2a], \
['INVISIBLE', 0xff000000]
__SLEEP_SLICE_IN_MILLISECONDS__ = 500
__PT_TO_TWIP__ = 20
__MM_TO_PT__ = 1/(25.4/72)
__MM10_TO_TWIP__ = 1/(2540.0/72/20) # 0.01 mm to twentieth point
__FILLCOLOR__ = 0x8000ff00
__LINEWIDTH__ = 0.5 * __PT_TO_TWIP__
__ENCODED_STRING__ = "_s_%s___"
__DECODE_STRING_REGEX__ = "_s_([0-9]+)___"
__LINEBREAK__ = "#_@L_i_N_e@_#"
__TURTLE__ = "turtle"
__ACTUAL__ = "actual"
__BASEFONTFAMILY__ = "Linux Biolinum G"
__LineStyle_DOTTED__ = 2
class __Doc__:
def __init__(self, doc):
self.doc = doc
try:
self.drawpage = doc.DrawPage # Writer
except:
self.drawpage = doc.DrawPages.getByIndex(0) # Draw, Impress
self.shapecache = {}
self.zoomvalue = 0
self.initialize()
def initialize(self):
self.pen = 1
self.pencolor = 0
self.pensize = __LINEWIDTH__
self.linestyle = __LineStyle_SOLID__
self.linejoint = __ROUNDED__
self.oldlc = 0
self.oldlw = 0
self.oldls = __LineStyle_SOLID__
self.oldlj = __ROUNDED__
self.continuous = True
self.areacolor = __FILLCOLOR__
self.hatch = None
self.textcolor = 0
self.fontfamily = __BASEFONTFAMILY__
self.fontheight = 12
self.fontweight = 100
self.fontstyle = 0
from math import pi, sin, cos, asin, sqrt
from com.sun.star.awt import Point as __Point__
from com.sun.star.drawing import LineDash as __LineDash__
from com.sun.star.drawing import Hatch as __Hatch__
from com.sun.star.drawing import PolyPolygonBezierCoords as __Bezier__
from com.sun.star.text.TextContentAnchorType import AT_PAGE as __AT_PAGE__
from com.sun.star.text.WrapTextMode import THROUGHT as __THROUGHT__
from com.sun.star.drawing.LineJoint import NONE as __Joint_NONE__
from com.sun.star.drawing.LineJoint import BEVEL as __BEVEL__
from com.sun.star.drawing.LineJoint import MITER as __MITER__
from com.sun.star.drawing.LineJoint import ROUND as __ROUNDED__
from com.sun.star.drawing.LineStyle import SOLID as __LineStyle_SOLID__
from com.sun.star.drawing.LineStyle import DASH as __LineStyle_DASHED__
from com.sun.star.drawing.DashStyle import RECT as __DashStyle_RECT__
from com.sun.star.drawing.DashStyle import ROUND as __DashStyle_ROUND__
from com.sun.star.drawing.DashStyle import ROUNDRELATIVE as __DashStyle_ROUNDRELATIVE__
from com.sun.star.drawing.CircleKind import FULL as __FULL__
from com.sun.star.drawing.CircleKind import SECTION as __SECTION__
from com.sun.star.drawing.CircleKind import CUT as __CUT__
from com.sun.star.drawing.CircleKind import ARC as __ARC__
from com.sun.star.awt.FontSlant import NONE as __Slant_NONE__
from com.sun.star.awt.FontSlant import ITALIC as __Slant_ITALIC__
from com.sun.star.awt import Size as __Size__
from com.sun.star.awt import WindowDescriptor as __WinDesc__
from com.sun.star.awt.WindowClass import MODALTOP as __MODALTOP__
from com.sun.star.awt.VclWindowPeerAttribute import OK as __OK__
from com.sun.star.awt.VclWindowPeerAttribute import YES_NO_CANCEL as __YES_NO_CANCEL__ # OK_CANCEL, YES_NO, RETRY_CANCEL, DEF_OK, DEF_CANCEL, DEF_RETRY, DEF_YES, DEF_NO
from com.sun.star.awt.PushButtonType import OK as __Button_OK__
from com.sun.star.awt.PushButtonType import CANCEL as __Button_CANCEL__
from com.sun.star.util.MeasureUnit import APPFONT as __APPFONT__
from com.sun.star.beans import PropertyValue as __property__
from com.sun.star.lang import Locale
def __getprop__(name, value):
p, p.Name, p.Value = __property__(), name, value
return p
def __l12n__(lng):
try:
return __lng__[lng]
except:
try:
__lng__[lng] = dict([[i.split("=")[0].strip(), i.split("=")[1].strip().decode("unicode-escape")] for i in open(__lngpath__ + lng + ".properties", 'r').readlines() if "=" in i])
return __lng__[lng]
except:
return None
# dot for dotted line (implemented as an array of dot-headed arrows, because PostScript dot isn't supported by Writer)
__bezierdot__ = __Bezier__()
__dots__ = []
for i in range(32):
__dots__ += [__Point__(round(sin(360.0/32 * i * pi/180.0) * 1000), round(cos(360.0/32 * i * pi/180) * 1000))]
__bezierdot__.Coordinates = (tuple(__dots__),)
__bezierdot__.Flags = ((0,) * 32,)
def __getdocument__():
global __docs__, _
doc = XSCRIPTCONTEXT.getDocument()
try:
_ = __docs__[doc.Title]
_.doc.Title # Is existing instance (not the garbage of the previous instance of a reopened document or a new "Untitled 1")?
except:
_ = __Doc__(doc)
__docs__[doc.Title] = _
# input function, result: input string or 0
def Input(s):
try:
ctx = uno.getComponentContext()
smgr = ctx.ServiceManager
text = ""
# dialog
d = smgr.createInstanceWithContext("com.sun.star.awt.UnoControlDialogModel", ctx)
ps = _.doc.CurrentController.Frame.ContainerWindow.getPosSize()
lo = _.doc.CurrentController.Frame.ContainerWindow.convertSizeToLogic(__Size__(ps.Width, ps.Height), __APPFONT__)
d.PositionX, d.PositionY, d.Width, d.Height = lo.Width/2 - 75, lo.Height/2 - 25, 150, 50
# label
l = d.createInstance("com.sun.star.awt.UnoControlFixedTextModel" )
if type(s) == list:
text = s[1]
s = s[0]
l.PositionX, l.PositionY, l.Width, l.Height, l.Name, l.TabIndex, l.Label = 5, 4, 140, 14, "l1", 2, s
# textbox or combobox
e = d.createInstance("com.sun.star.awt.UnoControlEditModel")
e.PositionX, e.PositionY, e.Width, e.Height, e.Name, e.TabIndex = 5, 14, 140, 12, "e1", 0
# buttons
b = d.createInstance( "com.sun.star.awt.UnoControlButtonModel" )
b.PositionX, b.PositionY, b.Width, b.Height, b.Name, b.TabIndex, b.PushButtonType, b.DefaultButton = 55, 32, 45, 14, "b1", 1, __Button_OK__, True
b2 = d.createInstance( "com.sun.star.awt.UnoControlButtonModel" )
b2.PositionX, b2.PositionY, b2.Width, b2.Height, b2.Name, b2.TabIndex, b2.PushButtonType = 100, 32, 45, 14, "b2", 1, __Button_CANCEL__
# insert the control models into the dialog model
d.insertByName( "l1", l)
d.insertByName( "b1", b)
d.insertByName( "b2", b2)
d.insertByName( "e1", e)
# create the dialog control and set the model
controlContainer = smgr.createInstanceWithContext("com.sun.star.awt.UnoControlDialog", ctx)
controlContainer.setModel(d)
# create a peer
toolkit = smgr.createInstanceWithContext("com.sun.star.awt.ExtToolkit", ctx)
controlContainer.setVisible(False)
controlContainer.createPeer(toolkit, None)
# execute it
inputtext = controlContainer.execute()
if inputtext:
inputtext = e.Text
# dispose the dialog
controlContainer.dispose()
return inputtext
except Exception, e:
__trace__()
def __string__(s, decimal = None): # convert decimal sign, localized BOOL and SET
if not decimal:
decimal = _.decimal
if decimal == ',' and type(s) == float:
return str(s).replace(".", ",")
if type(s) in [list, tuple, dict, set]:
__strings__ = []
s = re.sub("(?u)(['\"])(([^'\"]|\\['\"])*)(?<!\\\\)\\1", __encodestring__, str(s)) # XXX fix double '\'\"'
if decimal == ',':
s = s.replace(".", ",")
return re.sub(__DECODE_STRING_REGEX__, __decodestring__, \
s.replace('set', __locname__('SET')).replace('True', __locname__('TRUE')).replace('False', __locname__('FALSE')))
if type(s) in [str, unicode]:
return s
elif type(s) == bool:
return __locname__(str(s).upper())
return str(s)
def Print(s):
s = __string__(s, _.decimal)
z = MessageBox(_.doc.CurrentController.Frame.ContainerWindow, s[:500] + s[500:5000].replace('\n', ' '), "", "messbox")
def MessageBox(parent, message, title, msgtype = "messbox", buttons = __OK__):
msgtypes = ("messbox", "infobox", "errorbox", "warningbox", "querybox")
if not (msgtype in msgtypes):
msgtype = "messbox"
d = __WinDesc__()
d.Type = __MODALTOP__
d.WindowServiceName = msgtype
d.ParentIndex = -1
d.Parent = parent
d.WindowAttributes = buttons
tk = parent.getToolkit()
msgbox = tk.createWindow(d)
msgbox.setMessageText(message)
if title:
msgbox.setCaptionText(title)
return msgbox.execute()
def Random(r):
try:
return r * random.random()
except:
return list(r)[int(random.random() * len(r))]
def to_ascii(s):
return s.encode("unicode-escape").replace("\u", "__u__").replace(r"\x", "__x__")
def to_unicode(s):
return s.replace("__x__", r"\x").replace("__u__", "\u").decode("unicode-escape")
def __trace__():
if 'PYUNO_LOGLEVEL' in os.environ:
print(traceback.format_exc())
def __locname__(name, l = -1):
if l == -1:
l = _.lng
for i in __l12n__(l):
if i == name.upper():
return __l12n__(l)[i].split("|")[0] # return with the first localized name
return to_unicode(name)
def __translate__(arg = None):
global _
__initialize__()
__setlang__()
# detect language
text = _.doc.getText().getString()
# remove comments and strings
text = re.sub(r"[ ]*;[^\n]*", "", re.sub(ur"['„“‘«»「][^\n'”“‘’«»」]*['”“‘’«»」]", "", re.sub(r"^[ \t]*[;#][^\n]*", "", text)))
text = " ".join(set(re.findall("(?u)\w+", text)) - set(re.findall("(?u)\w*\d+\w*", text))).lower() # only words
ctx = uno.getComponentContext()
guess = ctx.ServiceManager.createInstanceWithContext("com.sun.star.linguistic2.LanguageGuessing", ctx)
guess.disableLanguages(guess.getEnabledLanguages())
guess.enableLanguages(tuple([Locale(i, "", "") for i in __translang__.split("|")]))
guess = guess.guessPrimaryLanguage(text, 0, len(text))
lang = __l12n__(guess.Language + "_" + guess.Country)
if not lang:
lang = __l12n__(guess.Language)
if not lang:
lang = __l12n__(_.lng)
if not lang:
lang = __l12n__("en")
lq = '\'' + lang['LEFTSTRING'].replace("|", "")
rq = '\'' + lang['RIGHTSTRING'].replace("|", "")
__strings__ = []
text = re.sub("(?u)([%s])([^\n%s]*)(?<!\\\\)[%s]" % (lq, rq, rq), __encodestring__, _.doc.getText().getString())
text = re.sub('(?u)(?<![0-9])(")(~?\w*)', __encodestring__, text)
# translate the program to the language of the document FIXME space/tab
exception = ['DECIMAL']
in1 = lang['IN'].upper()
in2 = __l12n__(_.lng)['IN'].split("|")[0].upper()
if in1[0] == '-' and in2[0] != '-': # "for x y-in" -> "for x in y"
exception += ['IN']
text = re.sub(ur"(?ui)\b((?:%s) +:?\w+) +([^\n]+)(?:%s) +(?=[[] |[[]\n)" % (lang['FOR'], in1), "\\1 %s \\2 " % in2, text)
text = re.sub(ur"(?ui)(:?\b\w+|[[][^[\n]*])\b(?:%s)\b" % in1, "%s \\1" % in2, text)
elif in1[0] != '-' and in2[0] == '-': # "for x in y" -> "for x y-in"
exception += ['IN']
text = re.sub(ur"(?ui)(?<=\n)((?:%s)\b +:?\w+) +(?:%s) +([^\n]+?) +(?=[[] |[[]\n)" % (lang['FOR'], in1), "\\1 \\2%s " % in2, text)
text = re.sub(ur"(?ui)(?<!:)\b(?:%s) +(:?\b\w+|[[][^[\n]*])\b" % in1, "\\1%s" % in2, text)
for i in set(lang) - set(exception):
text = re.sub(ur'(?ui)(?<!:)\b(%s)\b' % lang[i], __l12n__(_.lng)[i].split("|")[0].upper(), text)
text = re.sub(ur"(?<=\d)[%s](?=\d)" % lang['DECIMAL'], __l12n__(_.lng)['DECIMAL'], text)
# decode strings
quoted = u"(?ui)(?<=%s)(%%s)(?=%s)" % (__l12n__(_.lng)['LEFTSTRING'][0], __l12n__(_.lng)['RIGHTSTRING'][0])
text = re.sub(__DECODE_STRING_REGEX__, __decodestring2__, text)
for i in __COLORS__ + (['NONE'], ['BEVEL'], ['MITER'], ['ROUNDED'], ['SOLID'], ['DASH'], ['DOTTED'], ['BOLD'], ['ITALIC'], ['UPRIGHT'], ['NORMAL']):
text = re.sub(quoted % lang[i[0]], __l12n__(_.lng)[i[0]].split("|")[0].upper(), text)
_.doc.getText().setString(text)
# convert to paragraphs
__dispatcher__(".uno:ExecuteSearch", (__getprop__("SearchItem.SearchString", r"\n"), __getprop__("SearchItem.ReplaceString", r"\n"), \
__getprop__("Quiet", True), __getprop__("SearchItem.Command", 3), __getprop__("SearchItem.StyleFamily", 2)))
class LogoProgram(threading.Thread):
def __init__(self, code):
self.code = code
threading.Thread.__init__(self)
def run(self):
global __thread__
try:
exec(self.code)
except Exception as e:
try:
TRACEPATTERN = '"<string>", line '
message = traceback.format_exc()
l = re.findall(TRACEPATTERN + '[0-9]+', message)
if len(l) > 0 and not "SystemExit" in message:
line = len(re.findall(__LINEBREAK__, ''.join(self.code.split("\n")[:int(l[-1][len(TRACEPATTERN):])]))) + 1
caption = __l12n__(_.lng)['LIBRELOGO']
if __prevcode__ and "\n" in __prevcode__:
__gotoline__(line)
caption = __l12n__(_.lng)['ERROR'] % line
parent = _.doc.CurrentController.Frame.ContainerWindow
if "maximum recursion" in message:
MessageBox(parent, __l12n__(_.lng)['ERR_STOP'] + " " + __l12n__(_.lng)['ERR_MAXRECURSION'] % sys.getrecursionlimit(), __l12n__(_.lng)['LIBRELOGO'])
elif "cannot initialize memory" in message or "Couldn't instantiate" in message:
MessageBox(parent, __l12n__(_.lng)['ERR_STOP'] + " " + __l12n__(_.lng)['ERR_MEMORY'], __l12n__(_.lng)['LIBRELOGO'])
elif "ZeroDivisionError" in message:
MessageBox(parent, __l12n__(_.lng)['ERR_ZERODIVISION'], caption, "errorbox")
elif "IndexError" in message:
MessageBox(parent, __l12n__(_.lng)['ERR_INDEX'], caption, "errorbox")
elif "KeyError" in message:
MessageBox(parent, __l12n__(_.lng)['ERR_KEY'] % eval(re.search("KeyError: ([^\n]*)", message).group(1)), caption, "errorbox")
elif "NameError" in message:
if "__repeat__" in message:
MessageBox(parent, __l12n__(_.lng)['ERR_ARGUMENTS'] % (__locname__('REPEAT'), 1, 0), caption, "errorbox")
else:
MessageBox(parent, __l12n__(_.lng)['ERR_NAME'] % \
to_unicode(re.search("(?<=name ')[\w_]*(?=')", message).group(0)), caption, "errorbox")
elif "TypeError" in message and "argument" in message and "given" in message:
r = re.search("([\w_]*)[(][)][^\n]* (\w+) arguments? [(](\d+)", message) # XXX later: handle 'no arguments' + plural
MessageBox(parent, __l12n__(_.lng)['ERR_ARGUMENTS'] % (__locname__(r.group(1)), r.group(2), r.group(3)), caption, "errorbox")
else:
origline = __compiled__.split("\n")[line-1]
if not "com.sun.star" in message and not "__repeat__" in message and not "*)" in message and ("[" in origline or "]" in origline):
MessageBox(parent, __l12n__(_.lng)['ERR_BLOCK'], caption, "errorbox")
else:
MessageBox(parent, __l12n__(_.lng)['ERROR'] %line, __l12n__(_.lng)['LIBRELOGO'], "errorbox")
__trace__()
except:
pass
with __lock__:
__thread__ = None
def __encodestring__(m):
__strings__.append(re.sub("\\[^\\]", "", m.group(2)))
return __ENCODED_STRING__ % (len(__strings__) - 1)
def __decodestring__(m):
return "u'%s'" % __strings__[int(m.group(1))]
def __decodestring2__(m):
return __l12n__(_.lng)['LEFTSTRING'][0] + __strings__[int(m.group(1))] + __l12n__(_.lng)['RIGHTSTRING'][0]
def __initialize__():
global __halt__, __thread__
__getdocument__()
_.zoomvalue = _.doc.CurrentController.getViewSettings().ZoomValue
shape = __getshape__(__TURTLE__)
if not shape:
shape = _.doc.createInstance( "com.sun.star.drawing.PolyPolygonShape" )
shape.AnchorType = __AT_PAGE__
shape.TextWrap = __THROUGHT__
shape.Opaque = True
_.drawpage.add(shape)
shape.PolyPolygon = ((__Point__(-60, 0), __Point__(0, -100), __Point__(60, 0)), (__Point__(0, 0), __Point__(0, 100)), \
(__Point__(-250, 0),), (__Point__(0, 250),), (__Point__(250, 0),), (__Point__(0, -250),), # single points for wider selection
(__Point__(0, 0),)) # last point for position handling
_.shapecache[__TURTLE__] = shape
shape.Name = __TURTLE__
_.initialize()
turtlehome()
_.doc.CurrentController.select(shape)
shape.LineJoint = __MITER__
shape.Shadow = True
shape.FillColor, transparence = __splitcolor__(_.areacolor)
shape.FillTransparence = min(95, transparence)
shape.ShadowColor, shape.ShadowTransparence, shape.ShadowXDistance, shape.ShadowYDistance = (0, 20, 0, 0)
# shape.ShadowColor, shape.ShadowTransparence, shape.ShadowXDistance, shape.ShadowYDistance = (0, max(20, 100 - transparence), 0, 0)
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
shape.LineWidth = min(_.pensize, (1 + _.pen * 2) * __PT_TO_TWIP__)
shape.SizeProtect = True
def pagesize(n = -1):
if n == -1:
ps = _.doc.CurrentController.getViewCursor().PageStyleName
page = _.doc.StyleFamilies.getByName("PageStyles").getByName(ps)
return [page.Width * __MM10_TO_TWIP__ / __PT_TO_TWIP__, page.Height * __MM10_TO_TWIP__ / __PT_TO_TWIP__]
return None
def turtlehome():
turtle = __getshape__(__TURTLE__)
if turtle:
ps = _.doc.CurrentController.getViewCursor().PageStyleName
page = _.doc.StyleFamilies.getByName("PageStyles").getByName(ps)
turtle.setPosition(__Point__((page.Width - turtle.BoundRect.Width)/2, (page.Height - turtle.BoundRect.Height)/2))
turtle.LineStyle = __LineStyle_SOLID__
turtle.LineJoint = __MITER__
turtle.LineWidth = min(_.pensize, (1 + _.pen * 2) * __PT_TO_TWIP__)
turtle.LineColor, none = __splitcolor__(_.pencolor)
turtle.LineTransparence = 25
turtle.RotateAngle = 0
turtle.ZOrder = 1000
def __pen__(n):
_.pen = n
turtle = __getshape__(__TURTLE__)
if turtle:
if n:
turtle.LineStyle = __LineStyle_SOLID__
turtle.LineWidth = min(_.pensize, 3 * __PT_TO_TWIP__)
else:
turtle.LineStyle = __LineStyle_DASHED__
turtle.LineDash = __LineDash__(__DashStyle_RECT__, 0, 0, 1, __PT_TO_TWIP__, __PT_TO_TWIP__)
turtle.LineWidth = min(_.pensize, __PT_TO_TWIP__)
def __visible__(shape, visible = -1): # for OOo 3.2 compatibility
try:
if visible == -1:
return shape.Visible
shape.Visible = visible
except:
return True
def hideturtle():
turtle = __getshape__(__TURTLE__)
if turtle:
__visible__(turtle, False)
turtle.LineTransparence, turtle.FillTransparence = 100, 100 # for saved files
__dispatcher__(".uno:Escape")
def showturtle():
turtle = __getshape__(__TURTLE__)
if turtle:
if not turtle.Parent:
_.drawpage.add(turtle)
pencolor(_.pencolor)
fillcolor(_.areacolor)
pensize(_.pensize/__PT_TO_TWIP__)
__visible__(turtle, True)
_.doc.CurrentController.select(__getshape__(__TURTLE__))
else:
__initialize__()
def left(arg=None):
if __thread__:
return None
__initialize__()
turtle = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.drawing.ShapeCollection')
turtle.add(__getshape__(__TURTLE__))
_.doc.CurrentController.select(turtle)
# _.doc.CurrentController.select(__getshape__(__TURTLE__)) # it works from LibreOffice 3.5
rotate(__TURTLE__, 1500)
return None
def right(arg=None):
if __thread__:
return None
__initialize__()
turtle = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.drawing.ShapeCollection')
turtle.add(__getshape__(__TURTLE__))
_.doc.CurrentController.select(turtle)
rotate(__TURTLE__, -1500)
return None
def goforward(arg=None):
if __thread__:
return None
__initialize__()
turtle = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.drawing.ShapeCollection')
turtle.add(__getshape__(__TURTLE__))
_.doc.CurrentController.select(turtle)
forward(10)
return None
def gobackward(arg=None):
if __thread__:
return None
__initialize__()
turtle = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.drawing.ShapeCollection')
turtle.add(__getshape__(__TURTLE__))
_.doc.CurrentController.select(turtle)
backward(10)
return None
def commandline(arg=None, arg2=None):
run(arg, arg2)
def __setlang__():
global _
loc = _.doc.CurrentController.getViewCursor().CharLocale
_.lng = loc.Language + '_' + loc.Country
if not __l12n__(_.lng):
_.lng = loc.Language
if not __l12n__(_.lng):
_.lng = "en"
def run(arg=None, arg2 = -1):
global _, __thread__, __halt__, _, __prevcode__, __prevlang__, __prevcompiledcode__
if __thread__:
return None
with __lock__:
__thread__ = 1
try:
__initialize__()
__setlang__()
if arg2 == -1:
arg2 = _.doc.getText().getString()
if len(arg2) > 20000:
if MessageBox(_.doc.CurrentController.Frame.ContainerWindow, __l12n__(_.lng)['ERR_NOTAPROGRAM'], __l12n__(_.lng)['LIBRELOGO'], "querybox", __YES_NO_CANCEL__) <> 2:
with __lock__:
__thread__ = None
return None
__gotoline__(1)
if __prevcode__ and __prevcode__ == arg2 and __prevlang__ == _.lng:
__thread__ = LogoProgram(__prevcompiledcode__)
else:
__prevcode__ = arg2
__prevlang__ = _.lng
__prevcompiledcode__ = __compil__(arg2)
__thread__ = LogoProgram(__prevcompiledcode__)
__halt__ = False
turtle = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.drawing.ShapeCollection')
turtle.add(__getshape__(__TURTLE__))
_.doc.CurrentController.select(turtle)
__thread__.start()
except Exception as e:
__thread__ = None
__trace__()
return None
def stop(arg=None):
global __halt__
with __lock__:
__halt__ = True
return None
def home(arg=None):
if __thread__:
return None
__getdocument__()
turtle = __getshape__(__TURTLE__)
if turtle:
__removeshape__(__TURTLE__)
_.drawpage.remove(turtle)
__initialize__()
__dispatcher__(".uno:Escape")
if not __halt__:
return None
_.pencolor = 0
_.pensize = __LINEWIDTH__
_.areacolor = __FILLCOLOR__
pen = 1
__removeshape__(__ACTUAL__)
def clearscreen(arg=None):
__getdocument__()
turtle = __getshape__(__TURTLE__)
if not turtle:
__initialize__()
if not __halt__:
return
__cs__(False)
__dispatcher__(".uno:Escape")
def __checkhalt__():
global __thread__, __halt__
if __halt__:
with __lock__:
__thread__ = None
sys.exit()
def __cs__(select = True):
turtle = __getshape__(__TURTLE__)
if turtle:
__visible__(turtle, False)
if _.doc.CurrentController.select(_.drawpage) and \
_.doc.CurrentController.getSelection().ImplementationName == "com.sun.star.drawing.SvxShapeCollection":
__dispatcher__(".uno:Delete")
if turtle:
__visible__(turtle, True)
if select:
_.doc.CurrentController.select(_.drawpage)
def __dispatcher__(s, properties = ()):
ctx = XSCRIPTCONTEXT.getComponentContext()
d = ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.DispatchHelper", ctx)
d.executeDispatch(_.doc.CurrentController.Frame, s, "", 0, properties)
def __getshape__(shapename):
try:
if _.shapecache[shapename].Parent:
return _.shapecache[shapename]
_.shapecache.pop(shapename)
except:
pass
return None
def __angle__(deg):
if deg == u'any':
return random.random() * 36000
return deg * 100
def turnleft(deg):
rotate(__TURTLE__, __angle__(deg))
def turnright(deg):
rotate(__TURTLE__, -__angle__(deg))
def heading(deg = -1, go = False):
turtle = __getshape__(__TURTLE__)
if deg == -1:
return turtle.RotateAngle / 100
else:
if deg == u'any':
turtle.RotateAngle = random.random() * 36000
elif type(deg) == list:
pos = turtle.getPosition()
px, py = pos.X + turtle.BoundRect.Width / 2.0, pos.Y + turtle.BoundRect.Height / 2.0
dx = px * __MM10_TO_TWIP__ - deg[0] * __PT_TO_TWIP__
dy = deg[1] * __PT_TO_TWIP__ - py * __MM10_TO_TWIP__
n = sqrt(dx**2 + dy**2)
if dy > 0 and n > 0:
turtle.RotateAngle = a = -(180 + asin(dx / n) / (pi/180)) * 100 + 72000 # +720 for max(angle, preciseAngle) of __go__()
elif n > 0:
turtle.RotateAngle = a = asin(dx / n) / (pi/180) * 100 + 72000
if go and n > 0:
__go__(__TURTLE__, -n, False, a)
else:
turtle.RotateAngle = deg * 100
def rotate(shapename, deg):
shape = __getshape__(shapename)
if shape:
shape.RotateAngle = shape.RotateAngle + deg
def forward(n):
if type(n) == list:
pos = position()
position([pos[0] + n[0], pos[1] + n[1]])
else:
__go__(__TURTLE__, -n * __PT_TO_TWIP__)
def backward(n):
if type(n) == list:
forward([-n[0], -n[1]])
turnright(180)
else:
__go__(__TURTLE__, n * __PT_TO_TWIP__)
def __dots__(n, pos, dx, dy, r = 0): # dots for dotted polyline or circle
k = abs(int(1.0 * n / max(10, _.pensize) / 2.0))
dots = []
px, py = pos.X, pos.Y
for i in range(k + 1):
if k > 0:
if r:
px, py = pos.X + sin(360.0/k * i * pi/180.0) * r, pos.Y + cos(360.0/k * i * pi/180) * r
else:
px, py = pos.X + round(i * dx/k), pos.Y + round(i * dy/k)
dots += [(__Point__(px, py),__Point__(px + 10, py + 10))]
return dots
def __draw__(d):
shape = _.doc.createInstance( "com.sun.star.drawing." + d)
shape.AnchorType = __AT_PAGE__
shape.TextWrap = __THROUGHT__
__visible__(shape, False)
while __zoom__(): # temporary fix program halt with continuous zoom
while __zoom__():
__time__.sleep(0.2)
__time__.sleep(0.2)
_.drawpage.add(shape)
if __group__:
__group__.add(shape)
return shape
def __zoom__():
z = _.doc.CurrentController.getViewSettings().ZoomValue
if z <> _.zoomvalue:
_.zoomvalue = z
return True
return False
def __lefthang__(shape):
global __grouplefthang__
if __group__:
p = shape.getPosition()
if p.X < __grouplefthang__:
__grouplefthang__ = p.X
def __go__(shapename, n, dot = False, preciseAngle = -1):
turtle = __getshape__(shapename)
turtlepos = None
if shapename == __TURTLE__:
try:
turtlepos = turtle.PolyPolygon[-1][-1]
except:
pass
pos = turtle.getPosition()
dx = n * sin((pi/180)*(max(turtle.RotateAngle, preciseAngle)/100))
dy = n * cos((pi/180)*(max(turtle.RotateAngle, preciseAngle)/100))
turtle.setPosition(__Point__(pos.X + dx / __MM10_TO_TWIP__, pos.Y + dy / __MM10_TO_TWIP__))
if (_.pencolor <> _.oldlc or _.pensize <> _.oldlw or _.linestyle <> _.oldls or _.linejoint <> _.oldlj):
__removeshape__(__ACTUAL__)
shape = None
else:
shape = __getshape__(__ACTUAL__)
_.oldlw = _.pensize
_.oldlc = _.pencolor
_.oldls = _.linestyle
_.oldlj = _.linejoint
if shape and not _.pen and not dot:
_.continuous = False
return
c, c2 = __Point__(pos.X + turtle.BoundRect.Width / 2.0, pos.Y + turtle.BoundRect.Height / 2.0), __Point__(round(dx), round(dy))
if shape and "LineShape" in shape.ShapeType:
if _.continuous or dot:
last = shape.PolyPolygon[-1][-1]
if not (turtlepos and (abs(last.X - turtlepos.X) > 100 or abs(last.Y - turtlepos.Y) > 100) and
(not __group__ or (shape.getPosition().X > 0 and turtle.getPosition().X > 0))): # picture [ ] keeps hanging shapes
if dot or _.linestyle == __LineStyle_DOTTED__:
shape.PolyPolygon = tuple( list(shape.PolyPolygon) + __dots__(n, turtlepos, dx, dy))
else:
last.X = last.X + c2.X
last.Y = last.Y + c2.Y
shape.PolyPolygon = tuple( list(shape.PolyPolygon[:-1]) + [tuple( list(shape.PolyPolygon[-1]) + [last])])
__lefthang__(shape)
return
elif turtlepos:
shape.PolyPolygon = tuple( list(shape.PolyPolygon) + [(turtlepos, __Point__(turtlepos.X + c2.X, turtlepos.Y + c2.Y))])
_.continuous = True
__lefthang__(shape)
return
if not _.pen and not dot:
return
shape = __draw__("PolyLineShape")
shape.RotateAngle = 0
shape.PolyPolygon = tuple([tuple([__Point__(0, 0)])])
shape.setPosition(c)
last = shape.PolyPolygon[-1][-1]
last2 = __Point__(last.X + c2.X, last.Y + c2.Y)
shape.LineStyle, shape.LineDash = __linestyle__(_.linestyle)
shape.LineJoint = _.linejoint
if dot or _.linestyle == __LineStyle_DOTTED__:
shape.PolyPolygon = tuple( list(shape.PolyPolygon) + __dots__(n, last, c2.X, c2.Y))
shape.LineStart = __bezierdot__
shape.LineStartCenter = True
shape.LineStartWidth = _.pensize / __MM10_TO_TWIP__
shape.LineWidth = 0
else:
shape.PolyPolygon = tuple([tuple( list(shape.PolyPolygon[-1]) + [last2])])
shape.LineWidth = _.pensize / __MM10_TO_TWIP__
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
__visible__(shape, True)
shape.Name = __ACTUAL__
_.shapecache[__ACTUAL__] = shape
_.oldlw = _.pensize
_.oldlc = _.pencolor
_.oldls = _.linestyle
_.oldlj = _.linejoint
_.continuous = True
__lefthang__(shape)
def __fillit__(filled = True):
oldshape = __getshape__(__ACTUAL__)
if oldshape.LineStartCenter:
__removeshape__(__ACTUAL__) # FIXME close dotted polyline
return
if oldshape and "LineShape" in oldshape.ShapeType:
shape = __draw__("PolyPolygonShape")
shape.PolyPolygon = oldshape.PolyPolygon
shape.setPosition(oldshape.getPosition())
shape.LineStyle, shape.LineDash = __linestyle__(_.linestyle)
shape.LineJoint = _.linejoint
if _.hatch:
shape.FillBackground = True
shape.FillHatch = _.hatch
shape.FillStyle = 3
else:
shape.FillStyle = int(filled)
shape.LineWidth = _.pensize / __MM10_TO_TWIP__
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
shape.FillColor, shape.FillTransparence = __splitcolor__(_.areacolor)
shape.setString(oldshape.getString())
oldshape.Name = ""
shape.Name = __ACTUAL__
_.shapecache[__ACTUAL__] = shape
if __group__:
__group__.remove(oldshape)
__visible__(shape, True)
_.drawpage.remove(oldshape)
elif oldshape and "PolyPolygon" in oldshape.ShapeType:
oldshape.LineStyle = int(_.pen)
oldshape.LineJoint = _.linejoint
if _.hatch:
oldshape.FillBackground = True
oldshape.FillHatch = _.hatch
oldshape.FillStyle = 3
else:
oldshape.FillStyle = int(filled)
oldshape.LineWidth = _.pensize / __MM10_TO_TWIP__
oldshape.LineColor, oldshape.LineTransparence = __splitcolor__(_.pencolor)
oldshape.FillColor, oldshape.FillTransparence = __splitcolor__(_.areacolor)
def point():
oldpen, _.pen = _.pen, 1
oldstyle, _.linestyle = _.linestyle, __LineStyle_DOTTED__
__go__(__TURTLE__, 0, True)
_.pen, _.linestyle = oldpen, oldstyle
def __boxshape__(shapetype, l):
if type(l) <> type([]): # default for circle and square
l = [l, l]
turtle = __getshape__(__TURTLE__)
shape = __draw__(shapetype + "Shape")
if _.hatch:
shape.FillBackground = True
shape.FillHatch = _.hatch
shape.FillStyle = 3
else:
shape.FillStyle = 1
pos = turtle.getPosition()
pos.X = pos.X - (l[0] * __PT_TO_TWIP__ / __MM10_TO_TWIP__ / 2) + turtle.BoundRect.Width / 2.0
pos.Y = pos.Y - (l[1] * __PT_TO_TWIP__ / __MM10_TO_TWIP__ / 2) + turtle.BoundRect.Height / 2.0
shape.setPosition(pos)
shape.setSize(__Size__(l[0] * __PT_TO_TWIP__ / __MM10_TO_TWIP__, l[1] * __PT_TO_TWIP__ / __MM10_TO_TWIP__))
shape.LineStyle, shape.LineDash = __linestyle__(_.linestyle)
shape.LineWidth = _.pensize / __MM10_TO_TWIP__
shape.LineJoint = _.linejoint
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
shape.FillColor, shape.FillTransparence = __splitcolor__(_.areacolor)
shape.RotateAngle = turtle.RotateAngle
if shapetype == "Rectangle" and len(l) > 2:
shape.CornerRadius = l[2] * __PT_TO_TWIP__
elif shapetype == "Ellipse" and len(l) > 2:
try:
shape.CircleKind = __SECTION__
shape.CircleStartAngle = (-l[3] - 270) * 100
shape.CircleEndAngle = (-l[2] - 270) * 100
shape.CircleKind = [__FULL__, __SECTION__, __CUT__, __ARC__][l[4]]
except:
pass
__visible__(shape, True)
__removeshape__(__ACTUAL__)
_.shapecache[__ACTUAL__] = shape
__lefthang__(shape)
def ellipse(l):
if _.linestyle == __LineStyle_DOTTED__:
__removeshape__(__ACTUAL__)
point()
shape = __getshape__(__ACTUAL__)
shape.PolyPolygon = tuple(__dots__(l * pi * __PT_TO_TWIP__, shape.PolyPolygon[0][0], 0, 0, l/2 * __PT_TO_TWIP__))
else:
__boxshape__("Ellipse", l)
def rectangle(l):
if _.linestyle == __LineStyle_DOTTED__:
__removeshape__(__ACTUAL__)
point()
shape = __getshape__(__ACTUAL__)
shape.PolyPolygon = tuple(__dots__(l * pi * __PT_TO_TWIP__, shape.PolyPolygon[0][0], 0, 0, l/2 * __PT_TO_TWIP__))
else:
__boxshape__("Rectangle", l)
def label(st):
turtle = __getshape__(__TURTLE__)
shape = __draw__("TextShape")
shape.RotateAngle = turtle.RotateAngle
pos = turtle.getPosition()
pos.X = pos.X + turtle.BoundRect.Width / 2.0
pos.Y = pos.Y + turtle.BoundRect.Height / 2.0
shape.setSize(__Size__(1, 1))
shape.TextAutoGrowWidth = True
text(shape, st)
shape.setPosition(__Point__(pos.X - shape.BoundRect.Width/2, pos.Y - shape.BoundRect.Height/2))
__visible__(shape, True)
__lefthang__(shape)
def text(shape, st):
if shape:
shape.setString(__string__(st, _.decimal))
c = shape.createTextCursor()
c.gotoStart(False)
c.gotoEnd(True)
c.CharColor, none = __splitcolor__(_.textcolor)
c.CharHeight = _.fontheight
c.CharWeight = __fontweight__(_.fontweight)
c.CharPosture = __fontstyle__(_.fontstyle)
c.CharFontName = _.fontfamily
def sleep(t):
for i in range(t/__SLEEP_SLICE_IN_MILLISECONDS__):
__checkhalt__()
__time__.sleep(0.5)
__checkhalt__()
__time__.sleep(t%__SLEEP_SLICE_IN_MILLISECONDS__/1000.0)
def __removeshape__(shapename):
try:
_.shapecache.pop(shapename).Name = ""
except:
pass
def __fontweight__(w):
if type(w) == int:
return w
elif re.match(__l12n__(_.lng)['BOLD'], w, flags = re.I):
return 150
elif re.match(__l12n__(_.lng)['NORMAL'], w, flags = re.I):
return 100
return 100
def __fontstyle__(w):
if type(w) == int:
return w
elif re.match(__l12n__(_.lng)['ITALIC'], w, flags = re.I):
return __Slant_ITALIC__
elif re.match(__l12n__(_.lng)['UPRIGHT'], w, flags = re.I):
return __Slant_NONE__
return __Slant_NONE__
def __color__(c):
if type(c) in [int, float, long]:
return c
if type(c) == unicode:
if c == u'any':
# return __COLORS__[int(random.random() * 24)][1]
return int(random.random() * 2**31) # max. 50% transparency
if c[0:1] == '~':
c = __componentcolor__(__colors__[_.lng][c[1:].lower()])
for i in range(3):
c[i] = max(min(c[i] + int(random.random() * 64) - 32, 255), 0)
return __color__(c)
return __colors__[_.lng][c.lower()]
if type(c) == list:
if len(c) == 1:
return __COLORS__[int(c[0])][1]
if len(c) == 3:
return (int(c[0])%256 << 16) + (int(c[1])%256 << 8) + int(c[2])%256
return (int(c[3])%256 << 24) + (int(c[0])%256 << 16) + (int(c[1])%256 << 8) + int(c[2])%256
def __linestyle__(s):
if _.pen == 0:
return 0, __LineDash__()
if _.linestyle == __LineStyle_DASHED__:
return _.linestyle, __LineDash__(__DashStyle_RECT__, 0, 0, 1, 100, 100)
elif _.linestyle == __LineStyle_DOTTED__:
return __LineStyle_DASHED__, __LineDash__(__DashStyle_RECT__, 1, 1, 0, 0, 100000)
elif type(s) == list:
return __LineStyle_DASHED__, __LineDash__((s[5:6] or [0])[0], s[0], s[1] * __PT_TO_TWIP__, s[2], s[3] * __PT_TO_TWIP__, s[4] * __PT_TO_TWIP__)
return s, __LineDash__()
def fillstyle(s):
if type(s) == list:
color, null = __splitcolor__(__color__(s[1]))
_.hatch = __Hatch__(s[0] - 1, color, s[2] * __PT_TO_TWIP__, s[3] * 10)
elif s == 0:
_.hatch = None
elif s <= 10: # using hatching styles of Writer
fillstyle([[1, 0, 5, 0], [1, 0, 5, 45], [1, 0, 5, -45], [1, 0, 5, 90], [2, [127, 0, 0], 5, 45], [2, [127, 0, 0], 5, 0], [2, [0, 0, 127], 5, 45], [2, [0, 0, 127], 5, 0], [3, [0, 0, 127], 5, 0], [1, 0, 25, 45]][s-1])
def __splitcolor__(c):
"""Split color constants to RGB (3-byte) + transparency (%)"""
return int(c) & 0xffffff, (int(c) >> 24) / (255.0/100)
def __componentcolor__(c):
a = [ (c & 0xff0000) >> 16, (c & 0xff00) >> 8, c & 0xff ]
if c > 2**24:
a.append((c & 0xff000000) >> 24)
return a
def pencolor(n = -1):
if n != -1:
_.pencolor = __color__(n)
turtle = __getshape__(__TURTLE__)
if turtle and __visible__(turtle):
turtle.LineColor, turtle.LineTransparence = __splitcolor__(_.pencolor)
else:
return __componentcolor__(_.pencolor)
def pensize(n = -1):
if n != -1:
if n == 'any':
_.pensize = random.random() * 10 * __PT_TO_TWIP__
else:
_.pensize = n * __PT_TO_TWIP__
turtle = __getshape__(__TURTLE__)
if turtle and __visible__(turtle):
turtle.LineWidth = min(_.pensize, (1 + _.pen * 2) * __PT_TO_TWIP__)
return _.pensize / __PT_TO_TWIP__
def penstyle(n = -1):
if n == -1:
try:
return __locname__(_.linestyle.value)
except:
return __locname__('DOTTED')
if type(n) == list and len(n) >= 5:
_.linestyle = n
elif re.match(__l12n__(_.lng)['SOLID'], n, flags = re.I):
_.linestyle = __LineStyle_SOLID__
elif re.match(__l12n__(_.lng)['DASH'], n, flags = re.I):
_.linestyle = __LineStyle_DASHED__
elif re.match(__l12n__(_.lng)['DOTTED'], n, flags = re.I):
_.linestyle = __LineStyle_DOTTED__
def penjoint(n = -1):
if n == -1:
return __locname__(_.linejoint.value)
if re.match(__l12n__(_.lng)['NONE'], n, flags = re.I):
_.linejoint = __Joint_NONE__
elif re.match(__l12n__(_.lng)['BEVEL'], n, flags = re.I):
_.linejoint = __BEVEL__
elif re.match(__l12n__(_.lng)['MITER'], n, flags = re.I):
_.linejoint = __MITER__
elif re.match(__l12n__(_.lng)['ROUNDED'], n, flags = re.I):
_.linejoint = __ROUNDED__
def fillcolor(n = -1):
if n != -1:
_.areacolor = __color__(n)
turtle = __getshape__(__TURTLE__)
if turtle and __visible__(turtle):
turtle.FillColor, transparence = __splitcolor__(_.areacolor)
turtle.FillTransparence = min(95, transparence)
else:
return __componentcolor__(_.areacolor)
def fontcolor(n = -1):
if n != -1:
_.textcolor = __color__(n)
else:
return __componentcolor__(_.textcolor)
def position(n = -1):
turtle = __getshape__(__TURTLE__)
if turtle:
if n != -1:
if n == 'any':
ps = pagesize()
heading([random.random() * ps[0], random.random() * ps[1]], True)
else:
heading(n, True)
else:
pos = turtle.getPosition()
pos.X, pos.Y = pos.X + turtle.BoundRect.Width / 2.0, pos.Y + turtle.BoundRect.Height / 2.0
return [ pos.X * __MM10_TO_TWIP__ / __PT_TO_TWIP__, pos.Y * __MM10_TO_TWIP__ / __PT_TO_TWIP__ ]
def __groupstart__():
global __group__, __grouplefthang__, __groupstack__
__removeshape__(__ACTUAL__)
__groupstack__.append(__group__)
__groupstack__.append(__grouplefthang__)
__group__ = uno.getComponentContext().ServiceManager.createInstance('com.sun.star.drawing.ShapeCollection')
__grouplefthang__ = 0
def __groupend__():
global __group__, __grouplefthang__, __groupstack__
g = 0
if __group__.getCount() > 1:
if __grouplefthang__ < 0:
for i in range(__group__.Count):
s = __group__.getByIndex(i)
p = s.getPosition()
p.X = p.X + -__grouplefthang__
s.setPosition(p)
g = _.drawpage.group(__group__)
p = g.getPosition()
p.X = p.X + __grouplefthang__
g.setPosition(p)
else:
g = _.drawpage.group(__group__)
g.TextWrap = __THROUGHT__
elif __group__.getCount() == 1:
g = __group__.getByIndex(0)
__grouplefthang__ = min(__groupstack__.pop(), __grouplefthang__)
__group__ = __groupstack__.pop()
if __group__ and g:
__group__.add(g)
__removeshape__(__ACTUAL__)
def __int__(x): # handle eg. int("10cm")
if type(x) == str or type(x) == unicode:
x = __float__(x)
return int(x)
def __float__(x): # handle eg. float("10,5cm")
if type(x) == str or type(x) == unicode:
for i in __comp__[_.lng]:
x = re.sub(u"(?iu)" + i[0], i[1], x)
x = eval(x)
return float(x)
def __loadlang__(lang, a):
global comp, __colors__
__colors__[lang] = {}
for i in __COLORS__:
for j in a[i[0]].split("|"):
__colors__[lang][j] = i[1]
repcount = a['REPCOUNT'].split('|')[0]
loopi = itertools.count()
loop = lambda r: "%(i)s = 1\n%(orig)s%(j)s = %(i)s\n%(i)s += 1\n" % \
{ "i": repcount + str(loopi.next()), "j": repcount, "orig": re.sub( ur"(?ui)(?<!:)\b%s\b" % repcount, repcount + str(loopi.next()-1), r.group(0)) }
__comp__[lang] = [
[ur"(?<!:)\b(?:%s) [[]" % a['GROUP'], "\n__groupstart__()\nfor __groupindex__ in range(2):\n[\nif __groupindex__ == 1:\n[\n__groupend__()\nbreak\n]\n"],
[ur"(?<!:)\b(?:%s)\b" % a['GROUP'], "\n__removeshape__(__ACTUAL__)\n"],
[ur"(\n| )][ \n]*\[(\n| )", "\n]\nelse:\n[\n"], # if/else block
[ur"(?<!\n)\[(?= |\n)", ":\n[\n"], # start block
[ur"( ]|\n]$)", "\n]\n"], # finish block
[ur"(?<!:)\b(?:%s)\b" % a['FOR'], "\nfor"],
[ur"(?<!:)\b(?:%s)\b" % a['REPEAT'], "\n__repeat__"],
[ur"(?<!:)\b(?:%s)\b" % a['BREAK'], "\nbreak"],
[ur"(?<!:)\b(?:%s)\b" % a['CONTINUE'], "\ncontinue"],
[ur"(?<!:)\b(?:%s)\b" % a['REPCOUNT'], repcount],
[ur"(?<!:)\b(?:%s)\b" % a['IF'], "\nif"],
[ur"(?<!:)\b(?:%s)\b" % a['WHILE'], "\nwhile"],
[ur"(?<!:)\b(?:%s)\b" % a['OUTPUT'], "\nreturn"],
[ur"\n(if|while|return) [^\n]*", lambda r: re.sub("(?<![=!<>])=(?!=)", "==", r.group(0))], # = -> ==, XXX x = y = 1?
[ur"(?<=\n)(for\b :?\w+) ([^\n]+)(?<=\w|]|}|\))(?=-|:)(?:%s)\b" % a['IN'], "\\1 in \\2"], # "for x y-in" -> "for x in y"
[ur"(:?\b\w+|[[][^[\n]*])\b(?:%s)\b" % a['IN'], "in \\1"], # "x y-in" -> "x in y"
[ur"(?<!:)\b(?:%s)\b" % a['IN'], "in"],
[ur"(?<!:)\b(?:%s)\b[ \t]+(:?\w+)\b(?! in\b)" % a['FOR'], "\nfor \\1 in"],
[ur"(?<=\n)__repeat__ :\n", "while True:\n"], # infinite loop
[ur"(?<=\n)(for|while) (?!__groupindex__)[^\n]*:\n\[\n", loop], # loop variables for repcount (not groupindex loop)
[ur"(?<=\n)__repeat__([^\n]*\w[^\n]*):(?=\n)", "for %s in range(1, 1+int(\\1)):" % repcount], # repeat block
[ur"(?<=\d)[%s](?=\d)" % a['DECIMAL'], "."], # decimal sign
[ur"(?<!/)/(?!/)", "*1.0/"], # fix division: /1 -> /1.0, but not with //
[ur"\b([0-9]+([,.][0-9]+)?)(%s)\b" % a['HOUR'], "\\1*30"], # 12h = 12*30°
[ur"(?<=\d)(%s)" % a['DEG'], ""], # 1° -> 1
[ur"(?<!:)\b(?:__def__)[ \t]+(\w+)\b[ \t]*([:]?\w[^\n]*)", "\ndef \\1(\\2):\n["],
[ur"(?<!:)\b(?:__def__)\s+(\w+)", "\ndef \\1():\n["],
[ur"(?<!:)\b(?:%s)\b" % a['END'], "\n]"],
[ur"(?<!:)\b(?:%s)\b" % a['GLOBAL'], "global"],
[ur"(?<!:)\b(?:%s)\b" % a['TRUE'], "True"],
[ur"(?<!:)\b(?:%s)\b" % a['FALSE'], "False"],
[ur"(?<!:)\b(?:%s)\b" % a['NOT'], "not"],
[ur"(?<!:)\b(?:%s)\b" % a['AND'], "and"],
[ur"(?<!:)\b(?:%s)\b" % a['OR'], "or"],
[ur"(?<!:)\b(?:%s)\b" % a['INT'], "__int__"],
[ur"(?<!:)\b(?:%s)\b" % a['FLOAT'], "__float__"],
[ur"(?<!:)\b(?:%s)\b" % a['STR'], "__string__"],
[ur"(?<!:)\b(?:%s)\b" % a['COUNT'], "len"],
[ur"(?<!:)\b(?:%s)\b" % a['ROUND'], "round"],
[ur"(?<!:)\b(?:%s)\b" % a['ABS'], "abs"],
[ur"(?<!:)\b(?:%s)\b" % a['SIN'], "sin"],
[ur"(?<!:)\b(?:%s)\b" % a['COS'], "cos"],
[ur"(?<!:)\b(?:%s)\b" % a['PI'], "pi"],
[ur"(?<!:)\b(?:%s)\b" % a['SQRT'], "sqrt"],
[ur"(?<!:)\b(?:%s)\b" % a['MIN'], "min"],
[ur"(?<!:)\b(?:%s)\b" % a['MAX'], "max"],
[ur"(?<!:)\b(?:%s)\b" % a['STOP'], "\nreturn None"],
[ur"(?<!:)\b(?:%s)\b" % a['CLEARSCREEN'], "\n__cs__()"],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['PENCOLOR'], "\n)pencolor("],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['PENSTYLE'], "\n)penstyle("],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['PENJOINT'], "\n)penjoint("],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FILLCOLOR'], "\n)fillcolor("],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FILLSTYLE'], "\n)fillstyle("],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FONTCOLOR'], "\n)fontcolor("],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FONTFAMILY'], "\nglobal _\n_.fontfamily="],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FONTHEIGHT'], "\nglobal _\n_.fontheight="],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FONTWEIGHT'], "\nglobal _\n_.fontweight="],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['FONTSTYLE'], "\nglobal _\n_.fontstyle="],
[ur"(?<!:)\b(?:%s)(\s+|$)" % a['PENWIDTH'], "\n)pensize("],
[ur"(?<!:)\b(?:%s)\b" % a['PENDOWN'], "\nglobal _\n__pen__(1)"],
[ur"(?<!:)\b(?:%s)\b" % a['PENUP'], "\nglobal _\n__pen__(0)"],
[ur"(?<!:)\b(?:%s)\b" % a['HIDETURTLE'], "\nhideturtle()"],
[ur"(?<!:)\b(?:%s)\b" % a['SHOWTURTLE'], "\nshowturtle()"],
[ur"(?<!:)\b(?:%s)\b\[" % a['POSITION'], "position()["],
[ur"(?<!:)\b(?:%s)\b(?!\()" % a['POSITION'], "\n)position("],
[ur"(?<!:)\b(?:%s)\b" % a['HEADING'], "\n)heading("],
[ur"(?<!:)\b(?:%s)\b" % a['PAGESIZE'], "pagesize()"],
[ur"(?<!:)\b(?:%s)\b" % a['POINT'], "\npoint()"],
[ur"(?<!:)\b(?:%s)\b" % (a['ELLIPSE'] + "|" + a['CIRCLE']), "\n)ellipse("],
[ur"(?<!:)\b(?:%s)\b" % (a['RECTANGLE'] + "|" + a['SQUARE']), "\n)rectangle("],
[ur"(?<!:)\b(?:%s)\b" % a['CLOSE'], "\n__fillit__(False)"],
[ur"(?<!:)\b(?:%s)\b" % a['FILL'], "\n__fillit__()"],
[ur"(?<!:)\b(?:%s)\b" % a['LABEL'], "\n)label("],
[ur"(?<!:)\b(?:%s)\b" % a['TEXT'], "\n)text(__getshape__(__ACTUAL__),"],
[ur"(text\([ \t]*\"[^\"\n\)]*)", "\\1\"\n"],
[ur"(?<!:)\b(?:%s)\b" % a['HOME'], "\nturtlehome()"],
[ur"(?<!:)\b(?:%s)\b" % a['SLEEP'], "\n)sleep("],
[ur"(?<!:)\b(?:%s)\b" % a['FORWARD'], "\n)forward("],
[ur"(?<!:)\b(?:%s)\b" % a['BACKWARD'], "\n)backward("],
[ur"(?<!:)\b(?:%s)\b" % a['TURNRIGHT'], "\n)turnright("],
[ur"(?<!:)\b(?:%s)\b" % a['RANDOM'], "Random"],
[ur"(?<!:)\b(?:%s)\b(?= \d)" % 'Random', "random.random()*"],
[ur"(?<!:)\b(?:%s)\b" % a['SET'], "set"],
[ur"(?<!:)\b(?:%s)\b" % a['RANGE'], "range"],
[ur"(?<!:)\b(?:%s)\b" % a['LIST'], "list"],
[ur"(?<!:)\b(?:%s)\b" % a['TUPLE'], "tuple"],
[ur"(?<!:)\b(?:%s)\b" % a['SORTED'], "sorted"],
[ur"(?<!:)\b(?:%s)\b ?\(" % a['RESEARCH'], "re.search('(?u)'+"],
[ur"(?<!:)\b(?:%s)\b ?\(" % a['RESUB'], "re.sub('(?u)'+"],
[ur"(?<!:)\b(?:%s)\b ?\(" % a['REFINDALL'], "re.findall('(?u)'+"],
[ur"(?<!:)\b(?:%s)\b" % a['ANY'], "u'any'"],
[ur"(?<!:)\b(?:%s) (\w+|[[][^\]]*])\b" % a['INPUT'], " Input(\\1)"],
[ur"(?<!:)\b(?:%s)\b" % a['PRINT'], "\n)Print("],
[ur"(?<!:)\b(?:%s)\b" % a['TURNLEFT'], "\n)turnleft("],
[ur"\b([0-9]+([,.][0-9]+)?)(%s)\b" % a['PT'], "\\1"],
[ur"\b([0-9]+([,.][0-9]+)?)(%s)(?!\w)" % a['INCH'], "\\1*72"],
[ur"\b([0-9]+([,.][0-9]+)?)(%s)\b" % a['MM'], "\\1*%s" % __MM_TO_PT__],
[ur"\b([0-9]+([,.][0-9]+)?)(%s)\b" % a['CM'], "\\1*%s*10" % __MM_TO_PT__],
[ur"\b(__(?:int|float|string)__len|round|abs|sin|cos|sqrt|set|list|tuple|sorted)\b ((?:\w|\d+([,.]\d+)?|[-+*/]| )+)\)" , "\\1(\\2))" ], # fix parsing: (1 + sqrt x) -> (1 + sqrt(x))
[ur"(?<=[-*/=+,]) ?\n\)(\w+)\(", "\\1()"], # read attributes, eg. x = fillcolor
[ur"(?<=return) ?\n\)(\w+)\(", "\\1()"], # return + user function
[ur"(?<=(?:Print|label)\() ?\n\)(\w+)\(", "\\1()\n"] # Print/label + user function
]
def __concatenation__(r): # keep line positions with extra line breaks
s = re.subn("~[ \t]*\n", " ", r.group(0))
return s[0] + "\n" * s[1]
def __compil__(s):
global _, comp, __strings__, __compiled__
try:
loc = _.doc.CurrentController.getViewCursor().CharLocale
try:
_.lng = loc.Language + '_' + loc.Country
__loadlang__(_.lng, __l12n__(_.lng))
except:
__trace__()
_.lng = loc.Language
__loadlang__(_.lng, __l12n__(_.lng))
except:
__trace__()
_.lng = 'en'
if not _.lng in __comp__:
__loadlang__(_.lng, __l12n__(_.lng))
_.decimal = __l12n__(_.lng)['DECIMAL']
names = {}
rmsp = re.compile(r"[ ]*([=+*/]|==|<=|>=|<>|!=|-[ ]+)[ ]*")
chsp = re.compile(r"[ \t]+")
chch = re.compile(r"(?u)(?<!\w):(?=\w)")
parenfix = re.compile(ur"(?ui)(\([^\(\[\]\)]+)]\)")
# remove CR characters and split lines
s = re.sub(r'[ \t\r]*(?=\n)', '', s)
# remove full line comments
s = re.sub(r"^[ \t]*[;#][^\n]*", "", s)
s = re.sub(r"(?<=\n)[ \t]*[;#][^\n]*", "", s)
# concatenate lines
__compiled__ = re.sub(r'([^\n]*~[ \t]*\n)+[^\n]*', __concatenation__, s)
# sign original line breaks
s = re.sub("(?<=\n)", __LINEBREAK__ + "\n", __compiled__)
# encode strings
lq = '\'' + __l12n__(_.lng)['LEFTSTRING'].replace("|", "")
rq = '\'' + __l12n__(_.lng)['RIGHTSTRING'].replace("|", "")
__strings__ = []
s = re.sub("(?u)([%s])([^\n%s]*)(?<!\\\\)[%s]" % (lq, rq, rq), __encodestring__, s)
s = re.sub('(?u)(?<![0-9])(")(~?\w*)', __encodestring__, s)
# remove extra spaces
s = chsp.sub(" ", s)
# remove inline comments
s = re.sub(r"[ ]*;[^\n]*", "", s)
# n-dash and m-dash as minus signs
s = re.sub(ur"(?u)[–—]", "-", s)
# replace procedure names
s = re.sub(ur"(?i)^[ ]*(%s)[ ]+" % __l12n__(_.lng)['TO'], "__def__ ", s)
s = re.sub(ur"(?i)\n[ ]*(%s)[ ]+" % __l12n__(_.lng)['TO'], "\n__def__ ", s)
subnames = re.findall(u"(?iu)(?<=__def__ )\w+", s)
globs = ""
functions = ["range", "__int__", "__float__", "Random", "Input", "__string__", "len", "round", "abs", "sin", "cos", "sqrt", "set", "list", "tuple", "re.sub", "re.search", "re.findall", "sorted", "min", "max"]
if len(subnames) > 0:
globs = "global %s" % ", ".join(subnames)
# search user functions (function calls with two or more arguments need explicite Python parentheses)
functions += [ re.findall("(?u)\w+",i[0])[0] for i in re.findall(ur"""(?iu)(?<=__def__ )([^\n]*)\n # beginning of a procedure
(?:[^\n]*(?<!\b(%(END)s))\n)* # 0 or more lines (not END)
[^\n]*\b(?:%(OUTPUT)s)\b[^\n]*\n # line with OUTPUT (functions = procedures with OUTPUT)
(?:[^\n]*(?<!\b(?:%(END)s))\n)* # 0 or more lines (not END)
(?:%(END)s)\b""" % __l12n__(_.lng), s, re.X) ] # final END (XXX multiple names of "END" doesn't supported)
# add line breaks before procedure calls
procedures = set(subnames) - set(functions)
if len(procedures) > 0:
s = re.sub(ur"(?<!__def__)(?<![-+=*/])(?<!%s)(?:^|[ \t]+)(" % ")(?<!".join(functions) + "|".join(procedures) + ")", r"\n\1", s)
# compile native Logo
for i in __comp__[_.lng]:
s = re.sub(u"(?iu)" + i[0], i[1], s)
indent = 0
result = ""
func = re.compile("(?iu)(def (\w+))(\(.*\):)")
expr = ur"""(?iu)(?<!def[ ])(?<![:\w])%(name)s(?!\w)(?!\()(?![ ]\()
(
([ ]+\[*([-+]|\([ ]?)*((%(functions)s)\b[ ]*\(*)*
(?:[0-9]+([,.][0-9]+)?|:?\w+(?:[.]\w+[\(]?[\)]?)?]*|\[])]*[\)]*
(
(?:[ ]*([+*/,<>]|//|==|<=|>=|<>|!=)[ ]*|[ ]*-[ ]+|-|[ ]*[*][*][ ]*) # operators, eg. "**", " - ", "-", "- "
\[*([-+]|\([ ]?)* # minus sign, parenthesis
((%(functions)s)\b[ ]*\(*)*([0-9]+([.,][0-9]+)?|:?\w+(?:[.]\w+[\(]?[\)]?)?)]*
([ ]?\))*)*
[\)]*){,%(repeat)s}
)
"""
chargsp = re.compile(r"(?<![\(,])(?<!%s) (?!\)|,)" % ")(?<!".join(functions))
# compile to Python
joinfunc = "|".join(functions)
funcnames = {}
for i in s.split("\n"):
i = i.strip()
if i[0:4] == 'def ':
s = func.search(i)
if s.group(3) == '():':
names[s.group(2)] = (0, "")
else:
s2 = len(chsp.findall(s.group(3))) + 1
i = s.group(1) + chsp.sub(", ", s.group(3))
names[s.group(2)] = (s2, re.compile(expr % {"name": s.group(2), "functions": joinfunc, "repeat": s2}, re.X))
for j in functions:
if j in i:
if not j in funcnames:
funcnames[j] = (1, re.compile(expr % {"name": j, "functions": joinfunc, "repeat": 1 + 2 * int(j == 'range')}, re.X))
r = funcnames[j][1].search(i)
while r:
i = i[:r.start()] + j + '(' + chargsp.sub(", ", rmsp.sub(lambda l: l.group(1).strip(), r.group(1).strip())) + ')' + i[r.end():]
i = parenfix.sub("\\1)]", i)
r = funcnames[j][1].search(i)
for j in names:
if j in i:
if names[j][0] == 0:
if not j in functions:
i = re.sub(ur"(?iu)(?<!def )(?<![_\w])\b%s\b(?!\w)" %j, j+'()', i)
else:
r = names[j][1].search(i)
if r:
i = i[:r.start()] + j + '(' + chargsp.sub(", ", rmsp.sub(lambda l: l.group(1).strip(), r.group(1).strip())) + ')' + i[r.end():]
i = parenfix.sub("\\1)]", i)
if i[0:1] == '[':
i = i[1:]
indent += 1
result = result + "\n" + " " * indent + "__checkhalt__()\n"
if i[0:1] == ')':
i = i[1:] + ')'
result = result + "\n" + " " * indent + i
if i[0:1] == ']':
result = result[:-1]
indent -= 1
# colon_to_underline in Logo variables
result = chch.sub("_", result)
# character encoding
result = to_ascii(result).replace(r"\n", "\n")
# decode strings
result = re.sub(__DECODE_STRING_REGEX__, __decodestring__, result)
return to_ascii(globs) + "\n" + result
def __gotoline__(n):
__dispatcher__(".uno:Escape")
c = _.doc.Text.createTextCursor()
c.gotoStart(False)
for i in range(1, n):
c.gotoNextParagraph(False)
_.doc.CurrentController.getViewCursor().gotoRange(c, False)
g_exportedScripts = left, right, goforward, gobackward, run, stop, home, clearscreen, commandline, __translate__
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
None,"org.openoffice.script.LibreLogo", \
("org.openoffice.script.ServiceLibreLogo",),)
# dummy UNO component to get the path of the localizations
import uno, unohelper, os, sys
from com.sun.star.lang import XMain
class LibreLogoDummyComponent(XMain, unohelper.Base):
def __init__( self, ctx ):
self.ctx = ctx
def get_path(self):
import librelogodummy_path
return librelogodummy_path.get_path()
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
LibreLogoDummyComponent,"org.openoffice.comp.pyuno.LibreLogoDummy",("org.openoffice.LibreLogo.LibreLogoDummy",),)
<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest>
<manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-component;type=Python" manifest:full-path="LibreLogoDummy.py"/>
<manifest:file-entry manifest:media-type="application/vnd.sun.star.framework-script" manifest:full-path="LibreLogo"/>
<manifest:file-entry manifest:full-path="Office/UI/StartModuleWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
<manifest:file-entry manifest:full-path="Office/UI/WriterWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
<manifest:file-entry manifest:full-path="Addons.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
<manifest:file-entry manifest:media-type="application/vnd.sun.star.help" manifest:full-path="help"/>
</manifest:manifest>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
oor:name="StartModuleWindowState"
oor:package="org.openoffice.Office.UI">
<node oor:name="UIElements">
<node oor:name="States">
<node oor:name="private:resource/toolbar/addon_LibreLogo.OfficeToolBar" oor:op="replace">
<prop oor:name="UIName" oor:type="xs:string">
<value lang="en">Logo</value>
<value lang="hu">Logo</value>
</prop>
<prop oor:name="Visible" oor:type="xs:boolean">
<value>false</value>
</prop>
<prop oor:name="Locked" oor:type="xs:boolean">
<value>false</value>
</prop>
</node>
</node>
</node>
</oor:component-data>
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
oor:name="WriterWindowState"
oor:package="org.openoffice.Office.UI">
<node oor:name="UIElements">
<node oor:name="States">
<node oor:name="private:resource/toolbar/addon_LibreLogo.OfficeToolBar" oor:op="replace">
<prop oor:name="UIName" oor:type="xs:string">
<value lang="en">Logo</value>
<value lang="hu">Logo</value>
</prop>
<prop oor:name="Visible" oor:type="xs:boolean">
<value>false</value>
</prop>
<prop oor:name="Locked" oor:type="xs:boolean">
<value>false</value>
</prop>
</node>
</node>
</node>
</oor:component-data>
LibreOffice Logo 0.2 RC2
License: GNU LGPL & GPL, MPL
Home page: http://www.numbertext.org/logo
(c) László Németh (nemeth at numbertextdotorg)
FSF.hu Foundation, http://www.fsf.hu
Icons copyright: OpenOffice.org/LibreOffice
Introduction
============
LibreLogo is a Logo-like progamming language with interactive vectorgraphics for education and DTP
- presentation: http://www.numbertext.org/logo/librelogo.pdf
- basic Logo syntax for back compability with educational Logo systems
- interactive vectorgraphics in LibreOffice Writer
- native commands (easily translatable)
- Python data structures (list, tuple, set, dictionary) and other Python features
Usage
=====
See Logo in LibreOffice Help and http://www.numbertext.org/logo for documentation.
Translation
===========
create your_language_id.lng in LibreOffice/ based on en.lng.
Compilation:
python make.py
Development
===========
LibreLogo uses the PyUNO scripting framework, so Addons.xcu URLs depend from the
full name of the package. Modify them according to the package name with the
version number.
Programming language and environment for education, graphic design and desktop publishing. Usage: View→Toolbars→Logo toolbar in Writer. See Logo in LibreOffice Help.
Programozási nyelv és környezet oktatáshoz, számítógépes grafikához és kiadványszerkesztéshez. Használat: Nézet→Eszköztárak→Logo eszköztár a Writerben. L. Logo a LibreOffice Súgóban.
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://openoffice.org/extensions/description/2006"
xmlns:d="http://openoffice.org/extensions/description/2006"
xmlns:xlink="http://www.w3.org/1999/xlink">
<identifier value="org.openoffice.comp.pyuno.LibreLogo" />
<display-name>
<name lang="en-US">LibreLogo</name>
</display-name>
<version value="0.2rc2" />
<publisher>
<name lang="en" xlink:href="http://www.numbertext.org/logo">László Németh</name>
<name lang="hu" xlink:href="http://www.numbertext.org/logo">Németh László</name>
</publisher>
<extension-description>
<src lang="en" xlink:href="description-en.txt" />
<src lang="hu" xlink:href="description-hu.txt" />
</extension-description>
<dependencies>
<OpenOffice.org-minimal-version value="3.2" d:name="OpenOffice.org 3.2" />
</dependencies>
</description>
<?xml version="1.0" encoding="UTF-8"?>
<helpdocument version="1.0">
<meta>
<topic id="LibreLogo" indexer="include" status="PUBLISH">
<title id="title">LibreLogo</title>
<filename>/LibreLogo/LibreLogo.xhp</filename>
</topic>
</meta>
<body>
<bookmark xml-lang="en" branch="index" id="bm1">
<bookmark_value>LibreLogo</bookmark_value>
<bookmark_value>Logo</bookmark_value>
<bookmark_value>Turtle graphics</bookmark_value>
</bookmark>
<paragraph role="heading" level="1">LibreLogo</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">LibreLogo is a simple, native, Logo-like programming environment with turtle vector graphics for teaching of computing (programming and word processing), DTP and graphic design. See http://www.numbertext.org/logo/librelogo.pdf.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">LibreLogo toolbar</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">The LibreLogo toolbar (View » Toolbars » Logo) contains turtle moving, program run and stop, home and clear screen and syntax highlighting/translating icons and an input bar (command line).</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Turtle moving icons</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">They are equivalents of the Logo commands “FORWARD 10”, “BACK 10”, “LEFT 15”, “RIGHT 15”.</paragraph>
<paragraph role="paragraph">Clicking on one of the icons will also focus the turtle shape scrolling the page to its position.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Program run and start</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Click on the icon “run” to execute the text of the Writer document as a LibreLogo program.</paragraph>
<paragraph role="paragraph">Click on the icon “stop” to stop the program execution.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Home</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Click on the icon “home” to reset the position and settings of the turtle.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Clear screen</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Click on the icon “clear screen” to remove the drawing objects of the document.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Command line</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Hit Enter in the command line to execute its content. To stop the program use the icon “stop”.</paragraph>
<paragraph role="paragraph">Hold down the Enter to repeat the command line, for example, on the following command sequence:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FORWARD&#160;200&#160;LEFT&#160;89<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">To reset the command line click triple in it or press Ctrl-A to select the previous commands, and type the new commands.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Syntax highlighting/Translating</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">It expands and upper case Logo commands in the Writer document. Change the language of the document (Tools » Options » Language Settings » Languages » Western) and click on this icon to translate the Logo program to the selected language.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Program editing</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">LibreLogo drawings and programs use the same Writer document. The LibreLogo canvas is on the first page of the Writer document. You can insert a page break before the LibreLogo programs and set the zoom/font size for a comfortable two page layout for LibreLogo programming: left (first) page is the canvas, right (second) page is for the LibreLogo programs.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="1">LibreLogo programming language</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">LibreLogo is a native, easily localisable, Logo-like programming language. It is back-compatible with the older Logo systems in the case of the simple Logo programs used in education, eg.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;triangle&#160;:size<br/>&#160;REPEAT&#160;3&#160;[<br/>&#160;&#160;&#160;FORWARD&#160;:size<br/>&#160;&#160;&#160;LEFT&#160;120<br/>&#160;]<br/>&#160;END<br/>&#160;<br/>&#160;triangle&#160;10&#160;triangle&#160;100&#160;triangle&#160;200<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Differences from the Logo programming language</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">List members are comma separated</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;POSITION&#160;[0,&#160;0]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Program blocks and lists</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Program blocks and lists have got different syntax.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Program blocks need space or new line at parenthesization:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;REPEAT&#160;10&#160;[&#160;forward&#160;10&#160;left&#160;36&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Lists need close parenthesization:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;POSITION&#160;[0,&#160;0]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;&#160;and&#160;not&#160;POSITION&#160;[&#160;0,&#160;0&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Function declarations</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">LibreLogo has not supported 1-line function declarations, yet. TO and END need new lines.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;polygon<br/>&#160;&#160;&#160;FORWARD&#160;1&#160;RIGHT&#160;1<br/>&#160;&#160;&#160;polygon&#160;&#160;&#160;&#160;&#160;&#160;;&#160;recursion<br/>&#160;END<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;polygon<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Other features of LibreLogo</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Optional colon</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">The colon is optional before variable names.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;triangle&#160;size<br/>&#160;&#160;&#160;REPEAT&#160;3&#160;[&#160;FORWARD&#160;size&#160;LEFT&#160;120&#160;]<br/>&#160;END<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">String notation</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">String notation supports also orthographical and Python syntax.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;"word ;&#160;original&#160;Logo&#160;syntax<br/>&#160;PRINT&#160;“Arbitrary&#160;text.” ;&#160;orthography,&#160;Writer<br/>&#160;PRINT&#160;'Arbitrary&#160;text.' ;&#160;Python&#160;syntax<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Python list and string handling</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;“text”[2] ;&#160;print&#160;“x”<br/>&#160;PRINT&#160;“text”[1:3] ;&#160;print&#160;“ex”<br/>&#160;PRINT&#160;[1,&#160;2,&#160;3,&#160;4][1] ;&#160;print&#160;2<br/>&#160;PRINT&#160;[1,&#160;2,&#160;3,&#160;4][1:3] ;&#160;print&#160;[2,&#160;3]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Python-like FOR loop</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FOR&#160;i&#160;IN&#160;[1,&#160;2]&#160;[<br/>&#160;&#160;&#160;PRINT&#160;i<br/>&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Python-like variable declaration</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;x&#160;=&#160;15<br/>&#160;PRINT&#160;x<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">There are no extra query functions</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;FILLCOLOR<br/>&#160;p&#160;=&#160;POSITION<br/>&#160;PRINT&#160;p<br/>&#160;REPEAT&#160;10&#160;[&#160;POSITION&#160;ANY&#160;POSITION&#160;p&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Alternative parenthesization in function calls</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;star&#160;size&#160;color<br/>&#160;FILLCOLOR&#160;color<br/>&#160;REPEAT&#160;5&#160;[&#160;LEFT&#160;72&#160;FORWARD&#160;size&#160;RIGHT&#160;144&#160;FORWARD&#160;size&#160;]<br/>&#160;FILL<br/>&#160;END<br/>&#160;<br/>&#160;star&#160;100&#160;“red”<br/>&#160;star&#160;(100,&#160;“green”)<br/>&#160;star(100,&#160;“blue”)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="1">LibreLogo commands</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Basic syntax</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Case sensitivity</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Commands, color constants are case insensitive:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;“Hello,&#160;World!”<br/>&#160;print&#160;“Hello,&#160;World,&#160;again!”<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Variable names are case sensitive:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;a&#160;=&#160;5<br/>&#160;A&#160;=&#160;7<br/>&#160;PRINT&#160;a<br/>&#160;PRINT&#160;A<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Program lines</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Lines of a LibreLogo program are paragraphs in the LibreOffice Writer document. A program line can contain multiple commands:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;“Hello,&#160;World!”&#160;PRINT&#160;“LibreLogo”<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Comments</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Lines or line parts are comments from a semicolon to the end of the line (paragraph):</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;some&#160;comments<br/>&#160;PRINT&#160;5&#160;*&#160;5 ;&#160;some&#160;comments<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Break program lines to multiple paragraphs</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">It’s possible to break a program line for more paragraphs using the character tilde at the end of the line:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;“This&#160;is&#160;a&#160;very&#160;long&#160;&#160;+&#160;~<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;“warning&#160;message”<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Turtle moving</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FORWARD (fd)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FORWARD&#160;10 ;&#160;move&#160;forward&#160;10pt&#160;(1pt&#160;=&#160;1/72&#160;inch)<br/>&#160;FORWARD&#160;10pt ;&#160;see&#160;above<br/>&#160;FORWARD&#160;0.5in ;&#160;move&#160;forward&#160;0.5&#160;inch&#160;(1&#160;inch&#160;=&#160;2.54&#160;cm)<br/>&#160;FORWARD&#160;1" ;&#160;see&#160;above<br/>&#160;FD&#160;1mm<br/>&#160;FD&#160;1cm<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">BACK (bk)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;BACK&#160;10&#160;;&#160;move&#160;back&#160;10pt<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">LEFT (lt)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;LEFT&#160;90 ;&#160;turn&#160;counterclockwise&#160;90&#160;degrees<br/>&#160;LEFT&#160;90° ;&#160;see&#160;above<br/>&#160;LT&#160;3h ;&#160;see&#160;above&#160;(clock&#160;position)<br/>&#160;LT&#160;any ;&#160;turn&#160;to&#160;a&#160;random&#160;position<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">RIGHT (rt)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;RIGHT&#160;90 ;&#160;turn&#160;clockwise&#160;90&#160;degrees<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PENUP (pu)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENUP ;&#160;turtle&#160;will&#160;move&#160;without&#160;drawing<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PENDOWN (pd)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENDOWN ;&#160;turtle&#160;will&#160;move&#160;with&#160;drawing<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">POSITION (pos)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;POSITION&#160;[0,&#160;0] ;&#160;turn&#160;and&#160;move&#160;to&#160;the&#160;top-left&#160;corner<br/>&#160;POSITION&#160;PAGESIZE ;&#160;turn&#160;and&#160;move&#160;to&#160;the&#160;bottom-right&#160;corner<br/>&#160;POSITION&#160;[PAGESIZE[0],&#160;0]&#160;;&#160;turn&#160;and&#160;move&#160;to&#160;the&#160;top-right&#160;corner<br/>&#160;POSITION&#160;ANY ;&#160;turn&#160;and&#160;move&#160;to&#160;a&#160;random&#160;position<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">HEADING (seth)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;HEADING&#160;0 ;&#160;turn&#160;north<br/>&#160;HEADING&#160;12h ;&#160;see&#160;above<br/>&#160;HEADING&#160;ANY ;&#160;turn&#160;to&#160;a&#160;random&#160;position<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Other turtle commands</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">HIDETURTLE (ht)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;HIDETURTLE ;&#160;hide&#160;turtle&#160;(until&#160;the&#160;showturtle&#160;command)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SHOWTURTLE (st)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;SHOWTURTLE ;&#160;show&#160;turtle<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">HOME</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;HOME ;&#160;reset&#160;initial&#160;turtle&#160;settings&#160;and&#160;position<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">CLEARSCREEN (cs)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;CLEARSCREEN ;&#160;remove&#160;drawing&#160;objects&#160;of&#160;the&#160;document<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FILL and CLOSE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FILL ;&#160;close&#160;and&#160;fill&#160;the&#160;actual&#160;line&#160;shape<br/>&#160;CLOSE ;&#160;close&#160;the&#160;actual&#160;line&#160;shape<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Pen settings</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PENSIZE (ps)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENSIZE&#160;100 ;&#160;line&#160;width&#160;is&#160;100&#160;points<br/>&#160;PENSIZE&#160;ANY ;&#160;equivalent&#160;of&#160;PENSIZE&#160;RANDOM&#160;10<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PENCOLOR/PENCOLOUR (pc)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENCOLOR&#160;“red” ;&#160;set&#160;red&#160;pen&#160;color&#160;(by&#160;color&#160;name,&#160;see&#160;color&#160;constants)<br/>&#160;PENCOLOR&#160;[255,&#160;255,&#160;0] ;&#160;set&#160;yellow&#160;color&#160;(RGB&#160;list)<br/>&#160;PENCOLOR&#160;0xffff00 ;&#160;set&#160;yellow&#160;color&#160;(hexa&#160;code)<br/>&#160;PENCOLOR&#160;0 ;&#160;set&#160;black&#160;color&#160;(0x000000)<br/>&#160;PENCOLOR&#160;ANY ;&#160;random&#160;color<br/>&#160;PENCOLOR&#160;[5] ;&#160;set&#160;red&#160;color&#160;(by&#160;color&#160;identifier,&#160;see&#160;color&#160;constants)<br/>&#160;PENCOLOR&#160;“invisible” ;&#160;invisible&#160;pen&#160;color&#160;for&#160;shapes&#160;without&#160;visible&#160;outline<br/>&#160;PENCOLOR&#160;“~red” ;&#160;set&#160;random&#160;red&#160;color<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PENJOINT/LINEJOINT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENJOINT&#160;“rounded” ;&#160;rounded&#160;line&#160;joint&#160;(default)<br/>&#160;PENJOINT&#160;“miter” ;&#160;sharp&#160;line&#160;joint<br/>&#160;PENJOINT&#160;“bevel” ;&#160;bevel&#160;line&#160;joint<br/>&#160;PENJOINT&#160;“none” ;&#160;without&#160;line&#160;joint<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PENSTYLE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENSTYLE&#160;“solid” ;&#160;solid&#160;line&#160;(default)<br/>&#160;PENSTYLE&#160;“dotted” ;&#160;dotted&#160;line<br/>&#160;PENSTYLE&#160;“dashed” ;&#160;dashed&#160;line<br/>&#160;<br/>&#160;;&#160;custom&#160;dot–dash&#160;pattern&#160;specified&#160;by&#160;a&#160;list&#160;with&#160;the&#160;following&#160;arguments:<br/>&#160;;&#160;&#160;number&#160;of&#160;the&#160;neighbouring&#160;dots<br/>&#160;;&#160;&#160;length&#160;of&#160;a&#160;dot<br/>&#160;;&#160;&#160;number&#160;of&#160;the&#160;neighbouring&#160;dashes<br/>&#160;;&#160;&#160;length&#160;of&#160;a&#160;dash<br/>&#160;;&#160;&#160;distance&#160;of&#160;the&#160;dots/dashes<br/>&#160;;&#160;&#160;type&#160;(optional):<br/>&#160;;&#160;&#160;&#160;0&#160;=&#160;dots&#160;are&#160;rectangles&#160;(default)<br/>&#160;;&#160;&#160;&#160;2&#160;=&#160;dots&#160;are&#160;squares&#160;(lengths&#160;and&#160;distances&#160;are&#160;relative&#160;to&#160;the&#160;pensize)<br/>&#160;<br/>&#160;PENSTYLE&#160;[3,&#160;1mm,&#160;2,&#160;4mm,&#160;2mm,&#160;2] ;&#160;...––...––...––<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Fill settings</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FILLCOLOR/FILLCOLOUR (fc)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FILLCOLOR&#160;“blue” ;&#160;fill&#160;with&#160;blue&#160;color,&#160;see&#160;also&#160;PENCOLOR<br/>&#160;FILLCOLOR&#160;“invisible”&#160;CIRCLE&#160;10 ;&#160;unfilled&#160;circle<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FILLSTYLE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FILLSTYLE&#160;0 ;&#160;fill&#160;without&#160;hatches&#160;(default)<br/>&#160;FILLSTYLE&#160;1 ;&#160;black&#160;single&#160;hatches&#160;(horizontal)<br/>&#160;FILLSTYLE&#160;2 ;&#160;black&#160;single&#160;hatches&#160;(45&#160;degrees)<br/>&#160;FILLSTYLE&#160;3 ;&#160;black&#160;single&#160;hatches&#160;(-45&#160;degrees)<br/>&#160;FILLSTYLE&#160;4 ;&#160;black&#160;single&#160;hatches&#160;(vertical)<br/>&#160;FILLSTYLE&#160;5 ;&#160;red&#160;crossed&#160;hatches&#160;(45&#160;degrees)<br/>&#160;FILLSTYLE&#160;6 ;&#160;red&#160;crossed&#160;hatches&#160;(0&#160;degrees)<br/>&#160;FILLSTYLE&#160;7 ;&#160;blue&#160;crossed&#160;hatches&#160;(45&#160;degrees)<br/>&#160;FILLSTYLE&#160;8 ;&#160;blue&#160;crossed&#160;hatches&#160;(0&#160;degrees)<br/>&#160;FILLSTYLE&#160;9 ;&#160;blue&#160;triple&#160;crossed<br/>&#160;FILLSTYLE&#160;10 ;&#160;black&#160;wide&#160;single&#160;hatches&#160;(45&#160;degrees)<br/>&#160;<br/>&#160;;&#160;custom&#160;hatches&#160;specified&#160;by&#160;a&#160;list&#160;with&#160;the&#160;following&#160;arguments:<br/>&#160;;&#160;&#160;style&#160;(1&#160;=&#160;single,&#160;2&#160;=&#160;double,&#160;3&#160;=&#160;triple&#160;hatching)<br/>&#160;;&#160;&#160;color<br/>&#160;;&#160;&#160;distance<br/>&#160;;&#160;&#160;degree<br/>&#160;<br/>&#160;FILLSTYLE&#160;[2,&#160;“green”,&#160;3pt,&#160;15°] ;&#160;green&#160;crossed&#160;hatches&#160;(15&#160;degrees)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Drawing objects</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">CIRCLE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;CIRCLE&#160;100 ;&#160;draw&#160;a&#160;circle&#160;shape&#160;(diameter&#160;=&#160;100pt)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">ELLIPSE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;ELLIPSE&#160;[50,&#160;100] ;&#160;draw&#160;an&#160;ellipse&#160;with&#160;50&#160;and&#160;100&#160;diameters<br/>&#160;ELLIPSE&#160;[50,&#160;100,&#160;2h,&#160;12h] ;&#160;draw&#160;an&#160;elliptical&#160;sector&#160;(from&#160;2h&#160;clock&#160;position&#160;to&#160;12h)<br/>&#160;ELLIPSE&#160;[50,&#160;100,&#160;2h,&#160;12h,&#160;2]&#160;&#160;;&#160;draw&#160;an&#160;elliptical&#160;segment<br/>&#160;ELLIPSE&#160;[50,&#160;100,&#160;2h,&#160;12h,&#160;3]&#160;&#160;;&#160;draw&#160;an&#160;elliptical&#160;arc<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SQUARE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;SQUARE&#160;100 ;&#160;draw&#160;a&#160;square&#160;shape&#160;(size&#160;=&#160;100pt)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">RECTANGLE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;RECTANGLE&#160;[50,&#160;100] ;&#160;draw&#160;a&#160;rectange&#160;shape&#160;(50×100pt)<br/>&#160;RECTANGLE&#160;[50,&#160;100,&#160;50] ;&#160;draw&#160;a&#160;rectangle&#160;<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">POINT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;POINT ;&#160;draw&#160;a&#160;point&#160;with&#160;size&#160;and&#160;color&#160;of&#160;the&#160;pen<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">LABEL</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;LABEL&#160;“text” ;&#160;print&#160;text&#160;in&#160;the&#160;turte&#160;position<br/>&#160;LABEL&#160;'text' ;&#160;see&#160;above<br/>&#160;LABEL&#160;"text ;&#160;see&#160;above&#160;(only&#160;for&#160;single&#160;words)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">TEXT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;CIRCLE&#160;10&#160;TEXT&#160;“text” ;&#160;set&#160;text&#160;of&#160;the&#160;actual&#160;drawing&#160;object<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Font settings</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FONTCOLOR/FONTCOLOUR</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FONTCOLOR&#160;“green” ;&#160;set&#160;font&#160;color<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FONTFAMILY</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FONTFAMILY&#160;“Linux&#160;Libertine&#160;G” ;&#160;set&#160;font&#160;(family)<br/>&#160;FONTFAMILY&#160;“Linux&#160;Libertine&#160;G:smcp=1” ;&#160;set&#160;also&#160;font&#160;feature&#160;(small&#160;caps)<br/>&#160;FONTFAMILY&#160;“Linux&#160;Libertine&#160;G:smcp=1&amp;onum=1” ;&#160;small&#160;caps&#160;+&#160;old&#160;figures<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FONTSIZE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FONTSIZE&#160;12 ;&#160;set&#160;12pt<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FONTWEIGHT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FONTWEIGHT&#160;“bold” ;&#160;set&#160;bold&#160;font<br/>&#160;FONTWEIGHT&#160;“normal” ;&#160;set&#160;normal&#160;weight<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FONTSTYLE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FONTSTYLE&#160;“italic” ;&#160;set&#160;italic&#160;variant<br/>&#160;FONTSTYLE&#160;“normal” ;&#160;set&#160;normal&#160;variant<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">PICTURE (pic)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">PICTURE is for </paragraph>
<paragraph role="paragraph">* shape grouping;</paragraph>
<paragraph role="paragraph">* starting new line shapes;</paragraph>
<paragraph role="paragraph">* keeping the consistency of positions and line shapes at the left border.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Shape grouping</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;PICTURE&#160;[&#160;LibreLogo_commands&#160;]<br/>&#160;PICTURE&#160;[&#160;FORWARD&#160;100&#160;CIRCLE&#160;100&#160;] ;&#160;tree-like&#160;grouped&#160;shape<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">See also “Group” in LibreOffice Writer Help.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;tree&#160;location<br/>&#160;&#160;&#160;PENUP&#160;POSITION&#160;location&#160;HEADING&#160;0&#160;PENDOWN<br/>&#160;&#160;&#160;PICTURE&#160;[&#160;FORWARD&#160;100&#160;CIRCLE&#160;100&#160;] ;&#160;tree-like&#160;grouped&#160;shape<br/>&#160;END<br/>&#160;<br/>&#160;PICTURE&#160;[&#160;tree&#160;[30,&#160;50]&#160;tree&#160;[100,&#160;50]&#160;] ;&#160;grouped&#160;shapes&#160;in&#160;a&#160;grouped&#160;shape<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Starting new line shapes</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PICTURE ;&#160;start&#160;a&#160;new&#160;line&#160;shape<br/>&#160;FORWARD&#160;10&#160;PICTURE&#160;FORWARD&#160;10 ;&#160;two&#160;line&#160;shapes<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">Consistency at the left border</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Use picture to keep the consistency of positions and line shapes at the left border of Writer:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PICTURE&#160;[&#160;CIRCLE&#160;20&#160;POSITION&#160;[-100,&#160;100]&#160;CIRCLE&#160;20&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Loops</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">REPEAT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;REPEAT&#160;number&#160;[&#160;commands&#160;]<br/>&#160;<br/>&#160;REPEAT&#160;10&#160;[&#160;FORWARD&#160;10&#160;LEFT&#160;45&#160;CIRCLE&#160;10&#160;] ;&#160;repeat&#160;10&#160;times<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;number&#160;is&#160;optional<br/>&#160;<br/>&#160;REPEAT&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">REPCOUNT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Loop variable (also in the FOR and WHILE loops).</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;REPEAT&#160;100&#160;[&#160;FORWARD&#160;REPCOUNT&#160;LEFT&#160;90&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FOR IN</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Loop for the list elements:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FOR&#160;i&#160;IN&#160;[1,&#160;5,&#160;7,&#160;9,&#160;11]&#160;[<br/>&#160;&#160;&#160;FORWARD&#160;i<br/>&#160;&#160;&#160;LEFT&#160;90<br/>&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Loop for the characters of a character sequence:</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;FOR&#160;i&#160;IN&#160;“text”&#160;[<br/>&#160;&#160;&#160;LABEL&#160;i<br/>&#160;&#160;&#160;FORWARD&#160;10<br/>&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">WHILE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;WHILE&#160;TRUE&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/>&#160;WHILE&#160;REPCOUNT&#160;&lt;=&#160;10&#160;[&#160;FORWARD&#160;50&#160;LEFT&#160;36&#160;] ;&#160;as&#160;REPEAT&#160;10&#160;[&#160;...&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">BREAK</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Stop the loop.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;REPEAT&#160;[ ;&#160;endless&#160;loop<br/>&#160;&#160;&#160;POSITION&#160;ANY<br/>&#160;&#160;&#160;IF&#160;REPCOUNT&#160;=&#160;100&#160;[&#160;BREAK&#160;]&#160;&#160;;&#160;equivalent&#160;of&#160;the&#160;REPEAT&#160;100&#160;[&#160;...&#160;]<br/>&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">CONTINUE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Jump into the next iteration of the loop.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;REPEAT&#160;100&#160;[<br/>&#160;&#160;&#160;POSITION&#160;ANY<br/>&#160;&#160;&#160;IF&#160;REPCOUNT&#160;%&#160;2&#160;&lt;>&#160;0&#160;[&#160;CONTINUE&#160;]<br/>&#160;&#160;&#160;CIRCLE&#160;10 ;&#160;draw&#160;circles&#160;on&#160;every&#160;2nd&#160;positions<br/>&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Conditions</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">IF</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;IF&#160;condition&#160;[&#160;true&#160;block&#160;]<br/>&#160;;&#160;IF&#160;condition&#160;[&#160;true&#160;block&#160;]&#160;[&#160;false&#160;block&#160;]<br/>&#160;<br/>&#160;IF&#160;a&#160;&lt;&#160;10&#160;[&#160;PRINT&#160;“Small”&#160;]<br/>&#160;IF&#160;a&#160;&lt;&#160;10&#160;[&#160;PRINT&#160;“Small”&#160;]&#160;[&#160;PRINT&#160;“Big”&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">AND, OR, NOT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Logical operators.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;IF&#160;a&#160;&lt;&#160;10&#160;AND&#160;NOT&#160;a&#160;&lt;&#160;5&#160;[&#160;PRINT&#160;“5,&#160;6,&#160;7,&#160;8&#160;or&#160;9”&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Subroutines</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">TO, END</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">New word (or procedure).</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;triangle<br/>&#160;&#160;&#160;REPEAT&#160;[&#160;FORWARD&#160;100&#160;RIGHT&#160;120&#160;]&#160;FILL<br/>&#160;END<br/>&#160;<br/>&#160;REPEAT&#160;10&#160;[&#160;triangle&#160;PENUP&#160;POSITION&#160;ANY&#160;PENDOWN&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">OUTPUT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Return value of the function.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;randomletter<br/>&#160;&#160;&#160;OUTPUT&#160;RANDOM&#160;“qwertzuiopasdfghjklyxcvbnm”<br/>&#160;END<br/>&#160;<br/>&#160;PRINT&#160;randomletter&#160;+&#160;randomletter&#160;+&#160;randomletter ;&#160;print&#160;3-letter&#160;random&#160;character&#160;sequence<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">STOP</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Return from the procedure.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;TO&#160;example&#160;number<br/>&#160;&#160;&#160;IF&#160;number&#160;&lt;&#160;0&#160;[&#160;STOP&#160;]<br/>&#160;&#160;&#160;PRINT&#160;SQRT&#160;number ;&#160;print&#160;square&#160;root<br/>&#160;]<br/>&#160;<br/>&#160;example&#160;100<br/>&#160;example&#160;-1 ;&#160;without&#160;output&#160;and&#160;error<br/>&#160;example&#160;25<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Default variables</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">ANY</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Default random value of colors, etc.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENCOLOR&#160;ANY ;&#160;random&#160;pen&#160;color<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">TRUE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Logical value.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;WHILE&#160;TRUE&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/>&#160;PRINT&#160;TRUE ;&#160;print&#160;true<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FALSE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Logical value.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;WHILE&#160;NOT&#160;FALSE&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/>&#160;PRINT&#160;FALSE ;&#160;print&#160;false<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PAGESIZE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;PAGESIZE ;&#160;print&#160;list&#160;of&#160;the&#160;page&#160;sizes&#160;in&#160;points,&#160;eg.&#160;[595.30,&#160;841.89]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PI/π</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;PI ;&#160;print&#160;3.14159265359<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Input/Output</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">PRINT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;“text” ;&#160;print&#160;“text”&#160;in&#160;a&#160;dialog&#160;box<br/>&#160;PRINT&#160;5&#160;+&#160;10 ;&#160;print&#160;15<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">INPUT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;INPUT&#160;“Input&#160;value?” ;&#160;ask&#160;and&#160;print&#160;a&#160;string&#160;by&#160;a&#160;query&#160;dialog&#160;box<br/>&#160;PRINT&#160;FLOAT&#160;(INPUT&#160;“First&#160;number?”)&#160;+&#160;FLOAT&#160;(INPUT&#160;“Second&#160;number?”)&#160;;&#160;simple&#160;calculator<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">SLEEP</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;SLEEP&#160;1000 ;&#160;wait&#160;for&#160;1000&#160;ms&#160;(1&#160;sec)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">GLOBAL</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Set global variables used in procedures.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;GLOBAL&#160;about<br/>&#160;about&#160;=&#160;“LibreLogo”<br/>&#160;<br/>&#160;TO&#160;example<br/>&#160;&#160;&#160;PRINT&#160;about<br/>&#160;&#160;&#160;GLOBAL&#160;about ;&#160;when&#160;we&#160;want&#160;to&#160;add&#160;a&#160;new&#160;value<br/>&#160;&#160;&#160;about&#160;=&#160;“new&#160;value&#160;for&#160;the&#160;global&#160;variable”<br/>&#160;END<br/>&#160;<br/>&#160;example<br/>&#160;PRINT&#160;about<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Functions</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">RANDOM</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;RANDOM&#160;100 ;&#160;random&#160;float&#160;number&#160;(0&#160;&lt;=&#160;x&#160;&lt;&#160;100)<br/>&#160;PRINT&#160;RANDOM&#160;“text” ;&#160;random&#160;letter&#160;of&#160;the&#160;“text”<br/>&#160;PRINT&#160;RANDOM&#160;[1,&#160;2] ;&#160;random&#160;list&#160;element&#160;(1&#160;or&#160;2)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">INT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;INT&#160;3.8 ;&#160;print&#160;3&#160;(integer&#160;part&#160;of&#160;3.8)<br/>&#160;PRINT&#160;INT&#160;RANDOM&#160;100 ;&#160;random&#160;integer&#160;number&#160;(0&#160;&lt;=&#160;x&#160;&lt;&#160;100)<br/>&#160;PRINT&#160;INT&#160;“7” ;&#160;convert&#160;the&#160;string&#160;parameter&#160;to&#160;integer<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FLOAT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;convert&#160;the&#160;string&#160;parameter&#160;to&#160;float&#160;number<br/>&#160;PRINT&#160;2&#160;*&#160;FLOAT&#160;“5.5” ;&#160;print&#160;11.0<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">STR</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;convert&#160;the&#160;number&#160;parameter&#160;to&#160;string<br/>&#160;PRINT&#160;“Result:&#160;&#160;+&#160;STR&#160;5 ;&#160;print&#160;“Result:&#160;5”<br/>&#160;PRINT&#160;10&#160;*&#160;STR&#160;5 ;&#160;print&#160;5555555555<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SQRT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;SQRT&#160;100 ;&#160;print&#160;10,&#160;square&#160;root&#160;of&#160;100<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SIN</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;SIN&#160;90&#160;*&#160;PI/180 ;&#160;print&#160;1.0&#160;(sinus&#160;of&#160;90°&#160;in&#160;radians)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">COS</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;COS&#160;0&#160;*&#160;PI/180 ;&#160;print&#160;1.0&#160;(sinus&#160;of&#160;&#160;in&#160;radians)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">ROUND</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;ROUND&#160;3.8 ;&#160;print&#160;4&#160;(rounding&#160;3.8)<br/>&#160;PRINT&#160;ROUND&#160;RANDOM&#160;100 ;&#160;random&#160;integer&#160;number&#160;(0&#160;&lt;=&#160;x&#160;&lt;=&#160;100)<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">ABS</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;ABS&#160;-10 ;&#160;print&#160;10,&#160;absolute&#160;value&#160;of&#160;-10<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">COUNT</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;COUNT&#160;“text” ;&#160;print&#160;4,&#160;character&#160;count&#160;of&#160;“text”<br/>&#160;PRINT&#160;COUNT&#160;[1,&#160;2,&#160;3] ;&#160;print&#160;3,&#160;size&#160;of&#160;the&#160;list<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SET</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;Convert&#160;list&#160;to&#160;Python&#160;set<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6] ;&#160;print&#160;{4,&#160;5,&#160;6}<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6]&#160;|&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{1,&#160;4,&#160;5,&#160;6,&#160;9},&#160;union<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6]&#160;&amp;&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{4},&#160;intersection<br/>&#160;PRINT&#160;SET&#160;([4,&#160;5,&#160;6,&#160;6])&#160;-&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{5,&#160;6},&#160;difference<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6]&#160;^&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{1,&#160;5,&#160;6,&#160;9},&#160;symmetric&#160;difference&#160;&#160;<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">RANGE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;Python-like&#160;list&#160;generation<br/>&#160;PRINT&#160;RANGE&#160;10 ;&#160;print&#160;[0,&#160;1,&#160;2,&#160;3,&#160;4,&#160;5,&#160;6,&#160;7,&#160;8,&#160;9]<br/>&#160;PRINT&#160;RANGE&#160;3&#160;10 ;&#160;print&#160;[3,&#160;4,&#160;5,&#160;6,&#160;7,&#160;8,&#160;9]<br/>&#160;PRINT&#160;RANGE&#160;3&#160;10&#160;3 ;&#160;print&#160;[3,&#160;6,&#160;9]<br/>&#160;<br/>&#160;FOR&#160;i&#160;in&#160;RANGE&#160;10&#160;50&#160;10&#160;[ ;&#160;loop&#160;for&#160;[10,&#160;20,&#160;30,&#160;40]<br/>&#160;&#160;&#160;FORWARD&#160;i<br/>&#160;&#160;&#160;LEFT&#160;90<br/>&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">LIST</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;;&#160;remove&#160;the&#160;repeating&#160;elements&#160;of&#160;a&#160;list&#160;using&#160;set&#160;and&#160;list&#160;conversion<br/>&#160;PRINT&#160;LIST&#160;(SET&#160;[1,&#160;3,&#160;5,&#160;5,&#160;2,&#160;1]) ;&#160;print&#160;[1,&#160;3,&#160;5,&#160;2]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">TUPLE</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Conversion to Python tuple (non-modifiable list)</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;TUPLE&#160;[4,&#160;5]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SORTED</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">It returns with a sorted list.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;SORTED&#160;[5,&#160;1,&#160;3,&#160;4] ;&#160;print&#160;[1,&#160;3,&#160;4,&#160;5]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SUB</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Substitue character sequences using regex (regular expression) patterns.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;SUB&#160;(“t”,&#160;“T”,&#160;“text”) ;&#160;print&#160;“Text”,&#160;replacing&#160;“t”&#160;with&#160;“T”<br/>&#160;PRINT&#160;SUB&#160;(“(.)”,&#160;“\\1\\1”,&#160;“text”)&#160;;&#160;print&#160;“tteexxtt”,&#160;doubling&#160;every&#160;characters<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">SEARCH</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Search character sequences patterns using regex patterns.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;IF&#160;SEARCH&#160;(“\w”,&#160;word)&#160;[&#160;PRINT&#160;“Letter&#160;in&#160;the&#160;word.”&#160;]<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">FINDALL</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="paragraph">Find all character sequences in the input string matching the given regex pattern.</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;FINDALL(“\w+”,&#160;“Dogs,&#160;cats.”) ;&#160;print&#160;[“Dogs”,&#160;“cats”],&#160;the&#160;list&#160;of&#160;the&#160;words.<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">MIN</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;MIN&#160;[1,&#160;2,&#160;3] ;&#160;print&#160;1,&#160;the&#160;lowest&#160;element&#160;of&#160;the&#160;list<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="3">MAX</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PRINT&#160;MAX&#160;[1,&#160;2,&#160;3] ;&#160;print&#160;3,&#160;the&#160;greatest&#160;element&#160;of&#160;the&#160;list<br/></paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="heading" level="2">Color constants</paragraph>
<paragraph role="paragraph"></paragraph>
<paragraph role="code">&#160;PENCOLOR&#160;“SILVER” ;&#160;set&#160;by&#160;name<br/>&#160;PENCOLOR&#160;[1] ;&#160;set&#160;by&#160;identifiers<br/>&#160;PENCOLOR&#160;“~SILVER” ;&#160;random&#160;silver&#160;color<br/>&#160;<br/></paragraph>
<table><tablerow>
<tablecell>Identifier</tablecell>
<tablecell>Name</tablecell>
</tablerow><tablerow>
<tablecell>0</tablecell>
<tablecell>BLACK</tablecell>
</tablerow><tablerow>
<tablecell>1</tablecell>
<tablecell>SILVER</tablecell>
</tablerow><tablerow>
<tablecell>2</tablecell>
<tablecell>GRAY/GREY</tablecell>
</tablerow><tablerow>
<tablecell>3</tablecell>
<tablecell>WHITE</tablecell>
</tablerow><tablerow>
<tablecell>4</tablecell>
<tablecell>MAROON</tablecell>
</tablerow><tablerow>
<tablecell>5</tablecell>
<tablecell>RED</tablecell>
</tablerow><tablerow>
<tablecell>6</tablecell>
<tablecell>PURPLE</tablecell>
</tablerow><tablerow>
<tablecell>7</tablecell>
<tablecell>FUCHSIA/MAGENTA</tablecell>
</tablerow><tablerow>
<tablecell>8</tablecell>
<tablecell>GREEN</tablecell>
</tablerow><tablerow>
<tablecell>9</tablecell>
<tablecell>LIME</tablecell>
</tablerow><tablerow>
<tablecell>10</tablecell>
<tablecell>OLIVE</tablecell>
</tablerow><tablerow>
<tablecell>11</tablecell>
<tablecell>YELLOW</tablecell>
</tablerow><tablerow>
<tablecell>12</tablecell>
<tablecell>NAVY</tablecell>
</tablerow><tablerow>
<tablecell>13</tablecell>
<tablecell>BLUE</tablecell>
</tablerow><tablerow>
<tablecell>14</tablecell>
<tablecell>TEAL</tablecell>
</tablerow><tablerow>
<tablecell>15</tablecell>
<tablecell>AQUA</tablecell>
</tablerow><tablerow>
<tablecell>16</tablecell>
<tablecell>PINK</tablecell>
</tablerow><tablerow>
<tablecell>17</tablecell>
<tablecell>TOMATO</tablecell>
</tablerow><tablerow>
<tablecell>18</tablecell>
<tablecell>ORANGE</tablecell>
</tablerow><tablerow>
<tablecell>19</tablecell>
<tablecell>GOLD</tablecell>
</tablerow><tablerow>
<tablecell>20</tablecell>
<tablecell>VIOLET</tablecell>
</tablerow><tablerow>
<tablecell>21</tablecell>
<tablecell>SKYBLUE</tablecell>
</tablerow><tablerow>
<tablecell>22</tablecell>
<tablecell>CHOCOLATE</tablecell>
</tablerow><tablerow>
<tablecell>23</tablecell>
<tablecell>BROWN</tablecell>
</tablerow><tablerow>
<tablecell>24</tablecell>
<tablecell>INVISIBLE</tablecell>
</tablerow></table>
</body></helpdocument>
= LibreLogo =
LibreLogo is a simple, native, Logo-like programming environment with turtle vector graphics for teaching of computing (programming and word processing), DTP and graphic design. See http://www.numbertext.org/logo/librelogo.pdf.
== LibreLogo toolbar ==
The LibreLogo toolbar (View » Toolbars » Logo) contains turtle moving, program run and stop, home and clear screen and syntax highlighting/translating icons and an input bar (command line).
== Turtle moving icons ==
They are equivalents of the Logo commands “FORWARD 10”, “BACK 10”, “LEFT 15”, “RIGHT 15”.
Clicking on one of the icons will also focus the turtle shape scrolling the page to its position.
== Program run and start ==
Click on the icon “run” to execute the text of the Writer document as a LibreLogo program.
Click on the icon “stop” to stop the program execution.
== Home ==
Click on the icon “home” to reset the position and settings of the turtle.
== Clear screen ==
Click on the icon “clear screen” to remove the drawing objects of the document.
== Command line ==
Hit Enter in the command line to execute its content. To stop the program use the icon “stop”.
Hold down the Enter to repeat the command line, for example, on the following command sequence:
FORWARD 200 LEFT 89
To reset the command line click triple in it or press Ctrl-A to select the previous commands, and type the new commands.
== Syntax highlighting/Translating ==
It expands and upper case Logo commands in the Writer document. Change the language of the document (Tools » Options » Language Settings » Languages » Western) and click on this icon to translate the Logo program to the selected language.
== Program editing ==
LibreLogo drawings and programs use the same Writer document. The LibreLogo canvas is on the first page of the Writer document. You can insert a page break before the LibreLogo programs and set the zoom/font size for a comfortable two page layout for LibreLogo programming: left (first) page is the canvas, right (second) page is for the LibreLogo programs.
= LibreLogo programming language =
LibreLogo is a native, easily localisable, Logo-like programming language. It is back-compatible with the older Logo systems in the case of the simple Logo programs used in education, eg.
TO triangle :size
REPEAT 3 [
FORWARD :size
LEFT 120
]
END
triangle 10 triangle 100 triangle 200
== Differences from the Logo programming language ==
=== List members are comma separated ===
POSITION [0, 0]
=== Program blocks and lists ===
Program blocks and lists have got different syntax.
Program blocks need space or new line at parenthesization:
REPEAT 10 [ forward 10 left 36 ]
Lists need close parenthesization:
POSITION [0, 0] ; and not POSITION [ 0, 0 ]
=== Function declarations ===
LibreLogo has not supported 1-line function declarations, yet. TO and END need new lines.
TO polygon
FORWARD 1 RIGHT 1
polygon ; recursion
END
polygon
== Other features of LibreLogo ==
=== Optional colon ===
The colon is optional before variable names.
TO triangle size
REPEAT 3 [ FORWARD size LEFT 120 ]
END
=== String notation ===
String notation supports also orthographical and Python syntax.
PRINT "word ; original Logo syntax
PRINT “Arbitrary text.” ; orthography, Writer
PRINT 'Arbitrary text.' ; Python syntax
=== Python list and string handling ===
PRINT “text”[2] ; print “x”
PRINT “text”[1:3] ; print “ex”
PRINT [1, 2, 3, 4][1] ; print 2
PRINT [1, 2, 3, 4][1:3] ; print [2, 3]
=== Python-like FOR loop ===
FOR i IN [1, 2] [
PRINT i
]
=== Python-like variable declaration ===
x = 15
PRINT x
=== There are no extra query functions ===
PRINT FILLCOLOR
p = POSITION
PRINT p
REPEAT 10 [ POSITION ANY POSITION p ]
=== Alternative parenthesization in function calls ===
TO star size color
FILLCOLOR color
REPEAT 5 [ LEFT 72 FORWARD size RIGHT 144 FORWARD size ]
FILL
END
star 100 “red”
star (100, “green”)
star(100, “blue”)
= LibreLogo commands =
== Basic syntax ==
=== Case sensitivity ===
Commands, color constants are case insensitive:
PRINT “Hello, World!”
print “Hello, World, again!”
Variable names are case sensitive:
a = 5
A = 7
PRINT a
PRINT A
=== Program lines ===
Lines of a LibreLogo program are paragraphs in the LibreOffice Writer document. A program line can contain multiple commands:
PRINT “Hello, World!” PRINT “LibreLogo”
=== Comments ===
Lines or line parts are comments from a semicolon to the end of the line (paragraph):
; some comments
PRINT 5 * 5 ; some comments
=== Break program lines to multiple paragraphs ===
It’s possible to break a program line for more paragraphs using the character tilde at the end of the line:
PRINT “This is a very long ” + ~
“warning message”
== Turtle moving ==
=== FORWARD (fd) ===
FORWARD 10 ; move forward 10pt (1pt = 1/72 inch)
FORWARD 10pt ; see above
FORWARD 0.5in ; move forward 0.5 inch (1 inch = 2.54 cm)
FORWARD 1" ; see above
FD 1mm
FD 1cm
=== BACK (bk) ===
BACK 10 ; move back 10pt
=== LEFT (lt) ===
LEFT 90 ; turn counterclockwise 90 degrees
LEFT 90° ; see above
LT 3h ; see above (clock position)
LT any ; turn to a random position
=== RIGHT (rt) ===
RIGHT 90 ; turn clockwise 90 degrees
=== PENUP (pu) ===
PENUP ; turtle will move without drawing
=== PENDOWN (pd) ===
PENDOWN ; turtle will move with drawing
=== POSITION (pos) ===
POSITION [0, 0] ; turn and move to the top-left corner
POSITION PAGESIZE ; turn and move to the bottom-right corner
POSITION [PAGESIZE[0], 0] ; turn and move to the top-right corner
POSITION ANY ; turn and move to a random position
=== HEADING (seth) ===
HEADING 0 ; turn north
HEADING 12h ; see above
HEADING ANY ; turn to a random position
== Other turtle commands ==
=== HIDETURTLE (ht) ===
HIDETURTLE ; hide turtle (until the showturtle command)
=== SHOWTURTLE (st) ===
SHOWTURTLE ; show turtle
=== HOME ===
HOME ; reset initial turtle settings and position
=== CLEARSCREEN (cs) ===
CLEARSCREEN ; remove drawing objects of the document
=== FILL and CLOSE ===
FILL ; close and fill the actual line shape
CLOSE ; close the actual line shape
== Pen settings ==
=== PENSIZE (ps) ===
PENSIZE 100 ; line width is 100 points
PENSIZE ANY ; equivalent of PENSIZE RANDOM 10
=== PENCOLOR/PENCOLOUR (pc) ===
PENCOLOR “red” ; set red pen color (by color name, see color constants)
PENCOLOR [255, 255, 0] ; set yellow color (RGB list)
PENCOLOR 0xffff00 ; set yellow color (hexa code)
PENCOLOR 0 ; set black color (0x000000)
PENCOLOR ANY ; random color
PENCOLOR [5] ; set red color (by color identifier, see color constants)
PENCOLOR “invisible” ; invisible pen color for shapes without visible outline
PENCOLOR “~red” ; set random red color
=== PENJOINT/LINEJOINT ===
PENJOINT “rounded” ; rounded line joint (default)
PENJOINT “miter” ; sharp line joint
PENJOINT “bevel” ; bevel line joint
PENJOINT “none” ; without line joint
=== PENSTYLE ===
PENSTYLE “solid” ; solid line (default)
PENSTYLE “dotted” ; dotted line
PENSTYLE “dashed” ; dashed line
; custom dot–dash pattern specified by a list with the following arguments:
; – number of the neighbouring dots
; – length of a dot
; – number of the neighbouring dashes
; – length of a dash
; – distance of the dots/dashes
; – type (optional):
; 0 = dots are rectangles (default)
; 2 = dots are squares (lengths and distances are relative to the pensize)
PENSTYLE [3, 1mm, 2, 4mm, 2mm, 2] ; ...––...––...––
== Fill settings ==
=== FILLCOLOR/FILLCOLOUR (fc) ===
FILLCOLOR “blue” ; fill with blue color, see also PENCOLOR
FILLCOLOR “invisible” CIRCLE 10 ; unfilled circle
=== FILLSTYLE ===
FILLSTYLE 0 ; fill without hatches (default)
FILLSTYLE 1 ; black single hatches (horizontal)
FILLSTYLE 2 ; black single hatches (45 degrees)
FILLSTYLE 3 ; black single hatches (-45 degrees)
FILLSTYLE 4 ; black single hatches (vertical)
FILLSTYLE 5 ; red crossed hatches (45 degrees)
FILLSTYLE 6 ; red crossed hatches (0 degrees)
FILLSTYLE 7 ; blue crossed hatches (45 degrees)
FILLSTYLE 8 ; blue crossed hatches (0 degrees)
FILLSTYLE 9 ; blue triple crossed
FILLSTYLE 10 ; black wide single hatches (45 degrees)
; custom hatches specified by a list with the following arguments:
; – style (1 = single, 2 = double, 3 = triple hatching)
; – color
; – distance
; – degree
FILLSTYLE [2, “green”, 3pt, 15°] ; green crossed hatches (15 degrees)
== Drawing objects ==
=== CIRCLE ===
CIRCLE 100 ; draw a circle shape (diameter = 100pt)
=== ELLIPSE ===
ELLIPSE [50, 100] ; draw an ellipse with 50 and 100 diameters
ELLIPSE [50, 100, 2h, 12h] ; draw an elliptical sector (from 2h clock position to 12h)
ELLIPSE [50, 100, 2h, 12h, 2] ; draw an elliptical segment
ELLIPSE [50, 100, 2h, 12h, 3] ; draw an elliptical arc
=== SQUARE ===
SQUARE 100 ; draw a square shape (size = 100pt)
=== RECTANGLE ===
RECTANGLE [50, 100] ; draw a rectange shape (50×100pt)
RECTANGLE [50, 100, 50] ; draw a rectangle
=== POINT ===
POINT ; draw a point with size and color of the pen
=== LABEL ===
LABEL “text” ; print text in the turte position
LABEL 'text' ; see above
LABEL "text ; see above (only for single words)
=== TEXT ===
CIRCLE 10 TEXT “text” ; set text of the actual drawing object
== Font settings ==
=== FONTCOLOR/FONTCOLOUR ===
FONTCOLOR “green” ; set font color
=== FONTFAMILY ===
FONTFAMILY “Linux Libertine G” ; set font (family)
FONTFAMILY “Linux Libertine G:smcp=1” ; set also font feature (small caps)
FONTFAMILY “Linux Libertine G:smcp=1&amp;onum=1” ; small caps + old figures
=== FONTSIZE ===
FONTSIZE 12 ; set 12pt
=== FONTWEIGHT ===
FONTWEIGHT “bold” ; set bold font
FONTWEIGHT “normal” ; set normal weight
=== FONTSTYLE ===
FONTSTYLE “italic” ; set italic variant
FONTSTYLE “normal” ; set normal variant
== PICTURE (pic) ==
PICTURE is for
* shape grouping;
* starting new line shapes;
* keeping the consistency of positions and line shapes at the left border.
=== Shape grouping ===
; PICTURE [ LibreLogo_commands ]
PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped shape
See also “Group” in LibreOffice Writer Help.
TO tree location
PENUP POSITION location HEADING 0 PENDOWN
PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped shape
END
PICTURE [ tree [30, 50] tree [100, 50] ] ; grouped shapes in a grouped shape
=== Starting new line shapes ===
PICTURE ; start a new line shape
FORWARD 10 PICTURE FORWARD 10 ; two line shapes
=== Consistency at the left border ===
Use picture to keep the consistency of positions and line shapes at the left border of Writer:
PICTURE [ CIRCLE 20 POSITION [-100, 100] CIRCLE 20 ]
== Loops ==
=== REPEAT ===
; REPEAT number [ commands ]
REPEAT 10 [ FORWARD 10 LEFT 45 CIRCLE 10 ] ; repeat 10 times
; number is optional
REPEAT [ POSITION ANY ] ; endless loop
=== REPCOUNT ===
Loop variable (also in the FOR and WHILE loops).
REPEAT 100 [ FORWARD REPCOUNT LEFT 90 ]
=== FOR IN ===
Loop for the list elements:
FOR i IN [1, 5, 7, 9, 11] [
FORWARD i
LEFT 90
]
Loop for the characters of a character sequence:
FOR i IN “text” [
LABEL i
FORWARD 10
]
=== WHILE ===
WHILE TRUE [ POSITION ANY ] ; endless loop
WHILE REPCOUNT &lt;= 10 [ FORWARD 50 LEFT 36 ] ; as REPEAT 10 [ ... ]
=== BREAK ===
Stop the loop.
REPEAT [ ; endless loop
POSITION ANY
IF REPCOUNT = 100 [ BREAK ] ; equivalent of the REPEAT 100 [ ... ]
]
=== CONTINUE ===
Jump into the next iteration of the loop.
REPEAT 100 [
POSITION ANY
IF REPCOUNT % 2 &lt;> 0 [ CONTINUE ]
CIRCLE 10 ; draw circles on every 2nd positions
]
== Conditions ==
=== IF ===
; IF condition [ true block ]
; IF condition [ true block ] [ false block ]
IF a &lt; 10 [ PRINT “Small” ]
IF a &lt; 10 [ PRINT “Small” ] [ PRINT “Big” ]
=== AND, OR, NOT ===
Logical operators.
IF a &lt; 10 AND NOT a &lt; 5 [ PRINT “5, 6, 7, 8 or 9” ]
== Subroutines ==
=== TO, END ===
New word (or procedure).
TO triangle
REPEAT [ FORWARD 100 RIGHT 120 ] FILL
END
REPEAT 10 [ triangle PENUP POSITION ANY PENDOWN ]
=== OUTPUT ===
Return value of the function.
TO randomletter
OUTPUT RANDOM “qwertzuiopasdfghjklyxcvbnm”
END
PRINT randomletter + randomletter + randomletter ; print 3-letter random character sequence
=== STOP ===
Return from the procedure.
TO example number
IF number &lt; 0 [ STOP ]
PRINT SQRT number ; print square root
]
example 100
example -1 ; without output and error
example 25
== Default variables ==
=== ANY ===
Default random value of colors, etc.
PENCOLOR ANY ; random pen color
=== TRUE ===
Logical value.
WHILE TRUE [ POSITION ANY ] ; endless loop
PRINT TRUE ; print true
=== FALSE ===
Logical value.
WHILE NOT FALSE [ POSITION ANY ] ; endless loop
PRINT FALSE ; print false
=== PAGESIZE ===
PRINT PAGESIZE ; print list of the page sizes in points, eg. [595.30, 841.89]
=== PI/π ===
PRINT PI ; print 3.14159265359
== Input/Output ==
=== PRINT ===
PRINT “text” ; print “text” in a dialog box
PRINT 5 + 10 ; print 15
=== INPUT ===
PRINT INPUT “Input value?” ; ask and print a string by a query dialog box
PRINT FLOAT (INPUT “First number?”) + FLOAT (INPUT “Second number?”) ; simple calculator
== SLEEP ==
SLEEP 1000 ; wait for 1000 ms (1 sec)
== GLOBAL ==
Set global variables used in procedures.
GLOBAL about
about = “LibreLogo”
TO example
PRINT about
GLOBAL about ; when we want to add a new value
about = “new value for the global variable”
END
example
PRINT about
== Functions ==
=== RANDOM ===
PRINT RANDOM 100 ; random float number (0 &lt;= x &lt; 100)
PRINT RANDOM “text” ; random letter of the “text”
PRINT RANDOM [1, 2] ; random list element (1 or 2)
=== INT ===
PRINT INT 3.8 ; print 3 (integer part of 3.8)
PRINT INT RANDOM 100 ; random integer number (0 &lt;= x &lt; 100)
PRINT INT “7” ; convert the string parameter to integer
=== FLOAT ===
; convert the string parameter to float number
PRINT 2 * FLOAT “5.5” ; print 11.0
=== STR ===
; convert the number parameter to string
PRINT “Result: ” + STR 5 ; print “Result: 5”
PRINT 10 * STR 5 ; print 5555555555
=== SQRT ===
PRINT SQRT 100 ; print 10, square root of 100
=== SIN ===
PRINT SIN 90 * PI/180 ; print 1.0 (sinus of 90° in radians)
=== COS ===
PRINT COS 0 * PI/180 ; print 1.0 (sinus of 0° in radians)
=== ROUND ===
PRINT ROUND 3.8 ; print 4 (rounding 3.8)
PRINT ROUND RANDOM 100 ; random integer number (0 &lt;= x &lt;= 100)
=== ABS ===
PRINT ABS -10 ; print 10, absolute value of -10
=== COUNT ===
PRINT COUNT “text” ; print 4, character count of “text”
PRINT COUNT [1, 2, 3] ; print 3, size of the list
=== SET ===
; Convert list to Python set
PRINT SET [4, 5, 6, 6] ; print {4, 5, 6}
PRINT SET [4, 5, 6, 6] | SET [4, 1, 9] ; print {1, 4, 5, 6, 9}, union
PRINT SET [4, 5, 6, 6] &amp; SET [4, 1, 9] ; print {4}, intersection
PRINT SET ([4, 5, 6, 6]) - SET [4, 1, 9] ; print {5, 6}, difference
PRINT SET [4, 5, 6, 6] ^ SET [4, 1, 9] ; print {1, 5, 6, 9}, symmetric difference
=== RANGE ===
; Python-like list generation
PRINT RANGE 10 ; print [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
PRINT RANGE 3 10 ; print [3, 4, 5, 6, 7, 8, 9]
PRINT RANGE 3 10 3 ; print [3, 6, 9]
FOR i in RANGE 10 50 10 [ ; loop for [10, 20, 30, 40]
FORWARD i
LEFT 90
]
=== LIST ===
; remove the repeating elements of a list using set and list conversion
PRINT LIST (SET [1, 3, 5, 5, 2, 1]) ; print [1, 3, 5, 2]
=== TUPLE ===
Conversion to Python tuple (non-modifiable list)
PRINT TUPLE [4, 5]
=== SORTED ===
It returns with a sorted list.
PRINT SORTED [5, 1, 3, 4] ; print [1, 3, 4, 5]
=== SUB ===
Substitue character sequences using regex (regular expression) patterns.
PRINT SUB (“t”, “T”, “text”) ; print “Text”, replacing “t” with “T”
PRINT SUB (“(.)”, “\\1\\1”, “text”) ; print “tteexxtt”, doubling every characters
=== SEARCH ===
Search character sequences patterns using regex patterns.
IF SEARCH (“\w”, word) [ PRINT “Letter in the word.” ]
=== FINDALL ===
Find all character sequences in the input string matching the given regex pattern.
PRINT FINDALL(“\w+”, “Dogs, cats.”) ; print [“Dogs”, “cats”], the list of the words.
=== MIN ===
PRINT MIN [1, 2, 3] ; print 1, the lowest element of the list
=== MAX ===
PRINT MAX [1, 2, 3] ; print 3, the greatest element of the list
== Color constants ==
PENCOLOR “SILVER” ; set by name
PENCOLOR [1] ; set by identifiers
PENCOLOR “~SILVER” ; random silver color
{|class="wikitable"
|Identifier
|Name
|-
|0
|style="color: white; background-color: #000000;"|BLACK
|-
|1
|style="color: black; background-color: #c0c0c0;"|SILVER
|-
|2
|style="color: white; background-color: #808080;"|GRAY/GREY
|-
|3
|style="color: black; background-color: #ffffff;"|WHITE
|-
|4
|style="color: white; background-color: #800000;"|MAROON
|-
|5
|style="color: white; background-color: #ff0000;"|RED
|-
|6
|style="color: white; background-color: #800080;"|PURPLE
|-
|7
|style="color: black; background-color: #f000f0;"|FUCHSIA/MAGENTA
|-
|8
|style="color: white; background-color: #008000;"|GREEN
|-
|9
|style="color: black; background-color: #00ff00;"|LIME
|-
|10
|style="color: white; background-color: #808000;"|OLIVE
|-
|11
|style="color: black; background-color: #ffff00;"|YELLOW
|-
|12
|style="color: white; background-color: #000080;"|NAVY
|-
|13
|style="color: white; background-color: #0000f0;"|BLUE
|-
|14
|style="color: white; background-color: #008080;"|TEAL
|-
|15
|style="color: black; background-color: #00ffff;"|AQUA
|-
|16
|style="color: black; background-color: #ffc0cb;"|PINK
|-
|17
|style="color: black; background-color: #ff6347;"|TOMATO
|-
|18
|style="color: black; background-color: #ffa500;"|ORANGE
|-
|19
|style="color: black; background-color: #ffd700;"|GOLD
|-
|20
|style="color: black; background-color: #9400d3;"|VIOLET
|-
|21
|style="color: black; background-color: #87ceeb;"|SKYBLUE
|-
|22
|style="color: black; background-color: #d2691e;"|CHOCOLATE
|-
|23
|style="color: black; background-color: #a52a2a;"|BROWN
|-
|24
|style="color: black;"|INVISIBLE
|}
#!/bin/sh
cat doc.txt | awk 'BEGIN{system("cat head")}/^ /{code = code $0 "<br/>";next}{if (code != ""){print "<paragraph role=\"code\">" gensub(" ", "\\&#160;", "g", code) "</paragraph>";code=""}}/^=+/{l=length($1);print "<paragraph role=\"heading\" level=\"" l "\">"substr($0, l+2, length($0)-l*2-2)"</paragraph>";next}/^[{][|]/{print "<table><tablerow>";next}/^[|]}/{print "</tablerow></table>";next}/^[|]-/{print "</tablerow><tablerow>";next}/^[|]/{print "<tablecell>"gensub("^.*[|]","","g")"</tablecell>";next}{print "<paragraph role=\"paragraph\">" $0 "</paragraph>" }END{print "</body></helpdocument>"}' >LibreLogo.xhp
<?xml version="1.0" encoding="UTF-8"?>
<helpdocument version="1.0">
<meta>
<topic id="LibreLogo" indexer="include" status="PUBLISH">
<title id="title">LibreLogo</title>
<filename>/LibreLogo/LibreLogo.xhp</filename>
</topic>
</meta>
<body>
<bookmark xml-lang="en" branch="index" id="bm1">
<bookmark_value>LibreLogo</bookmark_value>
<bookmark_value>Logo</bookmark_value>
<bookmark_value>Turtle graphics</bookmark_value>
</bookmark>
<?xml version="1.0" encoding="UTF-8"?>
<!--
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
-->
<tree_view>
<help_section application="swriter" id="02" title="Presenter Console Keyboard Shortcuts">
<node id="0211" title="LibreLogo">
<topic id="LibreLogo/LibreLogo.xhp">LibreLogo</topic>
</node>
</help_section>
</tree_view>
# -*- encoding: UTF-8 -*-
import sys, os, zipfile
distname = 'librelogo-0.2.oxt'
z = zipfile.ZipFile(distname, mode='w', compression = zipfile.ZIP_DEFLATED)
for i in ["LibreLogo/LibreLogo.py", "pythonpath/en.properties", "pythonpath/hu.properties", \
"META-INF/manifest.xml", "description.xml", "Addons.xcu", "README", \
"Office/UI/WriterWindowState.xcu", "Office/UI/StartModuleWindowState.xcu", \
"help/en-US/LibreLogo/LibreLogo.xhp", "help/en-US/help.tree", "pythonpath/librelogodummy_path.py", \
"description-en.txt", "description-hu.txt", "LibreLogoDummy.py" ] + \
"""icons/lc_arrowshapes.circular-arrow.png
icons/lc_arrowshapes.circular-leftarrow.png
icons/lc_arrowshapes.down-arrow.png
icons/lc_arrowshapes.up-arrow.png
icons/lc_basicstop.png
icons/lc_editglossary.png
icons/lc_navigationbarleft.png
icons/lc_newdoc.png
icons/lc_runbasic.png
icons/sc_arrowshapes.circular-arrow.png
icons/sc_arrowshapes.circular-leftarrow.png
icons/sc_arrowshapes.down-arrow.png
icons/sc_arrowshapes.up-arrow.png
icons/sc_basicstop.png
icons/sc_editglossary.png
icons/sc_navigationbarleft.png
icons/sc_newdoc.png
icons/sc_runbasic.png""".split("\n"):
z.writestr(i, open(i, "r").read())
# turtle graphics
FORWARD=forward|fd
BACKWARD=back|bk
TURNLEFT=left|turnleft|lt
TURNRIGHT=right|turnright|rt
PENUP=penup|pu
PENDOWN=pendown|pd
HOME=home
POINT=point
CIRCLE=circle
ELLIPSE=ellipse
SQUARE=square
RECTANGLE=rectangle
LABEL=label
PENCOLOR=pencolor|pencolour|linecolor|pc
ANY=any
PENWIDTH=pensize|penwidth|linewidth|ps
PENSTYLE=penstyle|linestyle
PENJOINT=penjoint|linejoint
NONE=none
BEVEL=bevel
MITER=miter
ROUNDED=round
SOLID=solid
DASH=dashed
DOTTED=dotted
CLOSE=close
FILL=fill
FILLCOLOR=fillcolor|fillcolour|fc
FILLSTYLE=fillstyle
FONTCOLOR=fontcolor|textcolor|textcolour
FONTHEIGHT=fontsize|textsize|textheight
FONTWEIGHT=fontweight
FONTSTYLE=fontstyle
BOLD=bold
ITALIC=italic
UPRIGHT=upright|normal
NORMAL=normal
FONTFAMILY=fontfamily
CLEARSCREEN=clearscreen|cs
TEXT=text
HIDETURTLE=hideturtle|ht|hideme
SHOWTURTLE=showturtle|st|showme
POSITION=position|pos|setpos
HEADING=heading|setheading|seth
PAGESIZE=pagesize
GROUP=picture|pic
# control structures
TO=to
END=end
STOP=stop
REPEAT=repeat|forever
REPCOUNT=repcount
BREAK=break
CONTINUE=continue
WHILE=while
FOR=for
IN=in
IF=if
OUTPUT=output
LEFTSTRING=\u201c|\u2018
RIGHTSTRING=\u201d|\u2019
TRUE=true
FALSE=false
NOT=not
AND=and
OR=or
INPUT=input
PRINT=print
SLEEP=sleep
GLOBAL=global
# functions
RANDOM=random
INT=int
FLOAT=float
STR=str
SQRT=sqrt
SIN=sin
COS=cos
ROUND=round
ABS=abs
COUNT=count
SET=set
RANGE=range
LIST=list
TUPLE=tuple
SORTED=sorted
RESUB=sub
RESEARCH=search
REFINDALL=findall
MIN=min
MAX=max
PI=pi|\u03c0
# measurement
DECIMAL=.
DEG=\u00b0
HOUR=h
MM=mm
CM=cm
PT=pt
INCH=in|"
# color codes
INVISIBLE=invisible
BLACK=black
SILVER=silver
GRAY=gray|grey
WHITE=white
MAROON=maroon
RED=red
PURPLE=purple
FUCHSIA=fuchsia|magenta
GREEN=green
LIME=lime
OLIVE=olive
YELLOW=yellow
NAVY=navy
BLUE=blue
TEAL=teal
AQUA=aqua|cyan
PINK=pink
TOMATO=tomato
ORANGE=orange
GOLD=gold
VIOLET=violet
SKYBLUE=skyblue
CHOCOLATE=chocolate
BROWN=brown
# messages
LIBRELOGO=LibreLogo
ERROR=Error (in line %s)
ERR_ZERODIVISION=Division by zero.
ERR_NAME=Unknown name: \u2018%s\u201d.
ERR_ARGUMENTS=%s takes %s arguments (%s given).
ERR_BLOCK=Error (extra or missing spaces at brackets?)
ERR_KEY=Unknown element: %s
ERR_INDEX=Index out of range.
ERR_STOP=Program terminated:
ERR_MAXRECURSION=maximum recursion depth (%d) exceeded.
ERR_MEMORY=not enough memory.
ERR_NOTAPROGRAM=Do you want to run this text document?
# turtle graphics
FORWARD=el\u0151re|e
BACKWARD=h\u00e1tra|h
TURNLEFT=balra|b
TURNRIGHT=jobbra|j
PENUP=tollatfel|tf
PENDOWN=tollatle|tl
HOME=haza
POINT=pont
CIRCLE=k\u00f6r
ELLIPSE=ellipszis
SQUARE=n\u00e9gyzet
RECTANGLE=t\u00e9glalap
LABEL=c\u00edmke
PENCOLOR=tollsz\u00edn|tollsz\u00edn!|tsz!?|vonalsz\u00edn
ANY=tetsz\u0151leges|tetsz
PENWIDTH=tollvastags\u00e1g|tollvastags\u00e1g!|tv!?|vonalvastags\u00e1g
PENSTYLE=tollst\u00edlus|vonalst\u00edlus
PENJOINT=tollsarok|vonalsarok
NONE=nincs
BEVEL=tompa
ROUNDED=kerek
MITER=hegyes
SOLID=folyamatos
DASH=szaggatott
DOTTED=pontozott
CLOSE=z\u00e1r
FILL=t\u00f6lt
FILLCOLOR=t\u00f6lt\u0151sz\u00edn|t\u00f6lt\u0151sz\u00edn!|tlsz!?
FILLSTYLE=t\u00f6lt\u0151st\u00edlus
FONTCOLOR=bet\u0171sz\u00edn
FONTHEIGHT=bet\u0171m\u00e9ret
FONTWEIGHT=bet\u0171vastags\u00e1g
FONTSTYLE=bet\u0171st\u00edlus
BOLD=f\u00e9lk\u00f6v\u00e9r|k\u00f6v\u00e9r|vastag
ITALIC=kurz\u00edv|d\u0151lt
UPRIGHT=\u00e1ll\u00f3|norm\u00e1l
NORMAL=norm\u00e1l
FONTFAMILY=bet\u0171csal\u00e1d
CLEARSCREEN=t\u00f6r\u00f6lk\u00e9perny\u0151|t\u00f6r\u00f6lk\u00e9p|t\u00f6r\u00f6lrajzlap|tr
TEXT=sz\u00f6veg
HIDETURTLE=l\u00e1thatatlan|elrejttekn\u0151c|rejttek|elrejt
SHOWTURTLE=l\u00e1that\u00f3
POSITION=hely|hely!|poz\u00edci\u00f3|xy!
HEADING=ir\u00e1ny|ir\u00e1ny!
PAGESIZE=oldalm\u00e9ret
GROUP=k\u00e9p
# control structures
TO=ez|elj\u00e1r\u00e1s|elj|tanuld
END=v\u00e9ge
STOP=stop|visszat\u00e9r
OUTPUT=eredm\u00e9ny
REPEAT=ism\u00e9t|ism|ism\u00e9tl\u00e9s|v\u00e9gtelenszer|vszer
REPCOUNT=h\u00e1nyadik
BREAK=kil\u00e9p
CONTINUE=\u00fajra
WHILE=am\u00edg
FOR=fut
IN=-ban|-ben
IF=ha
LEFTSTRING=\u201e
RIGHTSTRING=\u201d
TRUE=igaz
FALSE=hamis
NOT=nem
AND=\u00e9s
OR=vagy
INPUT=be
PRINT=ki|ki\u00edr
SLEEP=v\u00e1r|v\u00e1rj
GLOBAL=glob\u00e1lis|glob\u00e1lisv\u00e1ltoz\u00f3|globv\u00e1l
# functions
RANDOM=v\u00e9letlen|v\u00e9letlensz\u00e1m|vsz\u00e1m|kiv\u00e1laszt
INT=eg\u00e9szsz\u00e1m|eg\u00e9sz
FLOAT=t\u00f6rtsz\u00e1m|t\u00f6rt
STR=karakterl\u00e1nc|l\u00e1nc
SQRT=gy\u00f6k
SIN=sin
COS=cos
ROUND=kerek|kerek\u00edt\u00e9s
ABS=abszol\u00fat\u00e9rt\u00e9k|absz?
COUNT=darab|db|elemsz\u00e1m
SET=halmaz
RANGE=sor
LIST=lista
TUPLE=fix
SORTED=rendez
RESUB=cser\u00e9l
RESEARCH=keres
REFINDALL=tal\u00e1l
MIN=min
MAX=max
PI=pi|\u03c0
# measurement
DECIMAL=,
DEG=\u00b0
HOUR=\u00f3|h
MM=mm
CM=cm
PT=pt
INCH=in|"
# color constants
INVISIBLE=l\u00e1thatatlan
BLACK=fekete
SILVER=vil\u00e1gossz\u00fcrke|ez\u00fcst
GRAY=sz\u00fcrke
WHITE=feh\u00e9r
MAROON=s\u00f6t\u00e9tbarna
RED=piros|v\u00f6r\u00f6s
PURPLE=lila
FUCHSIA=b\u00edbor|cikl\u00e1men
GREEN=z\u00f6ld
LIME=vil\u00e1gosz\u00f6ld
OLIVE=olajz\u00f6ld
YELLOW=s\u00e1rga
NAVY=s\u00f6t\u00e9tk\u00e9k
BLUE=k\u00e9k
TEAL=k\u00e9kesz\u00f6ld
AQUA=ci\u00e1nk\u00e9k|ci\u00e1n
PINK=r\u00f3zsasz\u00edn
TOMATO=vil\u00e1gospiros
ORANGE=narancss\u00e1rga|narancs
GOLD=aranys\u00e1rga|arany
VIOLET=ibolyak\u00e9k|ibolya|viola
SKYBLUE=\u00e9gsz\u00ednk\u00e9k|vil\u00e1gosk\u00e9k
CHOCOLATE=vil\u00e1gosbarna
BROWN=barna
# messages
LIBRELOGO=LibreLogo
ERROR=Hiba (%s. sor)
ERR_ZERODIVISION=Oszt\u00e1s null\u00e1val.
ERR_NAME=Ismeretlen n\u00e9v: \u201e%s\u201d.
ERR_ARGUMENTS=%s: %s adatot v\u00e1r, de %s lett megadva.
ERR_BLOCK=Hiba (hi\u00e1nyz\u00f3 vagy felesleges sz\u00f3k\u00f6z a kapcsos z\u00e1r\u00f3jeln\u00e9l?)
ERR_KEY=Ismeretlen elem: %s
ERR_INDEX=Nem l\u00e9tez\u0151 elemre hivatkoz\u00e1s.
ERR_STOP=A fut\u00e1s le\u00e1ll\u00edtva:
ERR_MAXRECURSION=el\u00e9rve az \u00fajrah\u00edv\u00e1si korl\u00e1t (%d).
ERR_MEMORY=nincs el\u00e9g mem\u00f3ria.
ERR_NOTAPROGRAM=Futtatni akarja ezt a sz\u00f6veges dokumentumot?
import uno, re, sys, os, traceback
def get_path():
return os.path.join(os.path.dirname(sys.modules[__name__].__file__), __name__ + ".py")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment