diff options
author | László Németh <nemeth@numbertext.org> | 2012-11-07 15:04:52 +0100 |
---|---|---|
committer | Andras Timar <atimar@suse.com> | 2012-11-07 14:26:46 +0000 |
commit | c2a393fbaed468d1ffb3004f267dbbf11890bbd0 (patch) | |
tree | a6a1740a0e92f250dca470f98020d258827d32c7 /librelogo | |
parent | 207ed1b1a17ca6d785cad936ecadcd160acc2b83 (diff) |
LibreLogo Writer extension
Change-Id: I31a61f0773689a054b5d5008ca9d4eb0bd9d7a19
Reviewed-on: https://gerrit.libreoffice.org/998
Reviewed-by: Andras Timar <atimar@suse.com>
Tested-by: Andras Timar <atimar@suse.com>
Diffstat (limited to 'librelogo')
38 files changed, 3706 insertions, 0 deletions
diff --git a/librelogo/Addons.xcu b/librelogo/Addons.xcu new file mode 100644 index 000000000000..29080ed9194e --- /dev/null +++ b/librelogo/Addons.xcu @@ -0,0 +1,310 @@ +<?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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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> diff --git a/librelogo/ChangeLog b/librelogo/ChangeLog new file mode 100644 index 000000000000..17f19a88a998 --- /dev/null +++ b/librelogo/ChangeLog @@ -0,0 +1,82 @@ +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 diff --git a/librelogo/LibreLogo/LibreLogo.py b/librelogo/LibreLogo/LibreLogo.py new file mode 100644 index 000000000000..34f271b4bbfa --- /dev/null +++ b/librelogo/LibreLogo/LibreLogo.py @@ -0,0 +1,1407 @@ +# -*- 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",),) diff --git a/librelogo/LibreLogoDummy.py b/librelogo/LibreLogoDummy.py new file mode 100644 index 000000000000..1d65ff4919fa --- /dev/null +++ b/librelogo/LibreLogoDummy.py @@ -0,0 +1,14 @@ +# 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",),) diff --git a/librelogo/META-INF/manifest.xml b/librelogo/META-INF/manifest.xml new file mode 100644 index 000000000000..a10be2952af5 --- /dev/null +++ b/librelogo/META-INF/manifest.xml @@ -0,0 +1,9 @@ +<?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 diff --git a/librelogo/Office/UI/StartModuleWindowState.xcu b/librelogo/Office/UI/StartModuleWindowState.xcu new file mode 100644 index 000000000000..c772f2aa1594 --- /dev/null +++ b/librelogo/Office/UI/StartModuleWindowState.xcu @@ -0,0 +1,22 @@ +<?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> diff --git a/librelogo/Office/UI/WriterWindowState.xcu b/librelogo/Office/UI/WriterWindowState.xcu new file mode 100644 index 000000000000..b10980cd3262 --- /dev/null +++ b/librelogo/Office/UI/WriterWindowState.xcu @@ -0,0 +1,22 @@ +<?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> diff --git a/librelogo/README b/librelogo/README new file mode 100644 index 000000000000..cc32af2e3fa5 --- /dev/null +++ b/librelogo/README @@ -0,0 +1,43 @@ +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. diff --git a/librelogo/description-en.txt b/librelogo/description-en.txt new file mode 100644 index 000000000000..6e9566518da8 --- /dev/null +++ b/librelogo/description-en.txt @@ -0,0 +1 @@ +Programming language and environment for education, graphic design and desktop publishing. Usage: View→Toolbars→Logo toolbar in Writer. See Logo in LibreOffice Help. diff --git a/librelogo/description-hu.txt b/librelogo/description-hu.txt new file mode 100644 index 000000000000..9d0b626b470a --- /dev/null +++ b/librelogo/description-hu.txt @@ -0,0 +1 @@ +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. diff --git a/librelogo/description.xml b/librelogo/description.xml new file mode 100644 index 000000000000..6ff4a9f1d19c --- /dev/null +++ b/librelogo/description.xml @@ -0,0 +1,21 @@ +<?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> diff --git a/librelogo/help/en-US/LibreLogo/LibreLogo.xhp b/librelogo/help/en-US/LibreLogo/LibreLogo.xhp new file mode 100644 index 000000000000..e3aa04c08bdf --- /dev/null +++ b/librelogo/help/en-US/LibreLogo/LibreLogo.xhp @@ -0,0 +1,614 @@ +<?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"> FORWARD 200 LEFT 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"> TO triangle :size<br/> REPEAT 3 [<br/>   FORWARD :size<br/>   LEFT 120<br/> ]<br/> END<br/> <br/> triangle 10 triangle 100 triangle 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"> POSITION [0, 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"> REPEAT 10 [ forward 10 left 36 ]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="paragraph">Lists need close parenthesization:</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> POSITION [0, 0]        ; and not POSITION [ 0, 0 ]<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"> TO polygon<br/>   FORWARD 1 RIGHT 1<br/>   polygon      ; recursion<br/> END<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> 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"> TO triangle size<br/>   REPEAT 3 [ FORWARD size LEFT 120 ]<br/> 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"> PRINT "word ; original Logo syntax<br/> PRINT “Arbitrary text.” ; orthography, Writer<br/> PRINT 'Arbitrary text.' ; Python 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"> PRINT “text”[2] ; print “x”<br/> PRINT “text”[1:3] ; print “ex”<br/> PRINT [1, 2, 3, 4][1] ; print 2<br/> PRINT [1, 2, 3, 4][1:3] ; print [2, 3]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">Python-like FOR loop</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FOR i IN [1, 2] [<br/>   PRINT i<br/> ]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">Python-like variable declaration</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> x = 15<br/> PRINT 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"> PRINT FILLCOLOR<br/> p = POSITION<br/> PRINT p<br/> REPEAT 10 [ POSITION ANY POSITION p ]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">Alternative parenthesization in function calls</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> TO star size color<br/> FILLCOLOR color<br/> REPEAT 5 [ LEFT 72 FORWARD size RIGHT 144 FORWARD size ]<br/> FILL<br/> END<br/> <br/> star 100 “red”<br/> star (100, “green”)<br/> star(100, “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"> PRINT “Hello, World!”<br/> print “Hello, World, again!”<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="paragraph">Variable names are case sensitive:</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> a = 5<br/> A = 7<br/> PRINT a<br/> PRINT 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"> PRINT “Hello, World!” PRINT “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"> ; some comments<br/> PRINT 5 * 5 ; some 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"> PRINT “This is a very long ” + ~<br/>       “warning 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"> FORWARD 10 ; move forward 10pt (1pt = 1/72 inch)<br/> FORWARD 10pt ; see above<br/> FORWARD 0.5in ; move forward 0.5 inch (1 inch = 2.54 cm)<br/> FORWARD 1" ; see above<br/> FD 1mm<br/> FD 1cm<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">BACK (bk)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> BACK 10 ; move back 10pt<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">LEFT (lt)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> LEFT 90 ; turn counterclockwise 90 degrees<br/> LEFT 90° ; see above<br/> LT 3h ; see above (clock position)<br/> LT any ; turn to a random position<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">RIGHT (rt)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> RIGHT 90 ; turn clockwise 90 degrees<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PENUP (pu)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PENUP ; turtle will move without drawing<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PENDOWN (pd)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PENDOWN ; turtle will move with drawing<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">POSITION (pos)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> POSITION [0, 0] ; turn and move to the top-left corner<br/> POSITION PAGESIZE ; turn and move to the bottom-right corner<br/> POSITION [PAGESIZE[0], 0] ; turn and move to the top-right corner<br/> POSITION ANY ; turn and move to a random position<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">HEADING (seth)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> HEADING 0 ; turn north<br/> HEADING 12h ; see above<br/> HEADING ANY ; turn to a random 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"> HIDETURTLE ; hide turtle (until the showturtle command)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">SHOWTURTLE (st)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> SHOWTURTLE ; show turtle<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">HOME</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> HOME ; reset initial turtle settings and position<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">CLEARSCREEN (cs)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> CLEARSCREEN ; remove drawing objects of the document<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FILL and CLOSE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FILL ; close and fill the actual line shape<br/> CLOSE ; close the actual line 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"> PENSIZE 100 ; line width is 100 points<br/> PENSIZE ANY ; equivalent of PENSIZE RANDOM 10<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PENCOLOR/PENCOLOUR (pc)</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PENCOLOR “red” ; set red pen color (by color name, see color constants)<br/> PENCOLOR [255, 255, 0] ; set yellow color (RGB list)<br/> PENCOLOR 0xffff00 ; set yellow color (hexa code)<br/> PENCOLOR 0 ; set black color (0x000000)<br/> PENCOLOR ANY ; random color<br/> PENCOLOR [5] ; set red color (by color identifier, see color constants)<br/> PENCOLOR “invisible” ; invisible pen color for shapes without visible outline<br/> PENCOLOR “~red” ; set random red color<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PENJOINT/LINEJOINT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PENJOINT “rounded” ; rounded line joint (default)<br/> PENJOINT “miter” ; sharp line joint<br/> PENJOINT “bevel” ; bevel line joint<br/> PENJOINT “none” ; without line joint<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PENSTYLE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PENSTYLE “solid” ; solid line (default)<br/> PENSTYLE “dotted” ; dotted line<br/> PENSTYLE “dashed” ; dashed line<br/> <br/> ; custom dot–dash pattern specified by a list with the following arguments:<br/> ; – number of the neighbouring dots<br/> ; – length of a dot<br/> ; – number of the neighbouring dashes<br/> ; – length of a dash<br/> ; – distance of the dots/dashes<br/> ; – type (optional):<br/> ;   0 = dots are rectangles (default)<br/> ;   2 = dots are squares (lengths and distances are relative to the pensize)<br/> <br/> PENSTYLE [3, 1mm, 2, 4mm, 2mm, 2] ; ...––...––...––<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"> FILLCOLOR “blue” ; fill with blue color, see also PENCOLOR<br/> FILLCOLOR “invisible” CIRCLE 10 ; unfilled circle<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FILLSTYLE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FILLSTYLE 0 ; fill without hatches (default)<br/> FILLSTYLE 1 ; black single hatches (horizontal)<br/> FILLSTYLE 2 ; black single hatches (45 degrees)<br/> FILLSTYLE 3 ; black single hatches (-45 degrees)<br/> FILLSTYLE 4 ; black single hatches (vertical)<br/> FILLSTYLE 5 ; red crossed hatches (45 degrees)<br/> FILLSTYLE 6 ; red crossed hatches (0 degrees)<br/> FILLSTYLE 7 ; blue crossed hatches (45 degrees)<br/> FILLSTYLE 8 ; blue crossed hatches (0 degrees)<br/> FILLSTYLE 9 ; blue triple crossed<br/> FILLSTYLE 10 ; black wide single hatches (45 degrees)<br/> <br/> ; custom hatches specified by a list with the following arguments:<br/> ; – style (1 = single, 2 = double, 3 = triple hatching)<br/> ; – color<br/> ; – distance<br/> ; – degree<br/> <br/> FILLSTYLE [2, “green”, 3pt, 15°] ; green crossed hatches (15 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"> CIRCLE 100 ; draw a circle shape (diameter = 100pt)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">ELLIPSE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ELLIPSE [50, 100] ; draw an ellipse with 50 and 100 diameters<br/> ELLIPSE [50, 100, 2h, 12h] ; draw an elliptical sector (from 2h clock position to 12h)<br/> ELLIPSE [50, 100, 2h, 12h, 2]  ; draw an elliptical segment<br/> ELLIPSE [50, 100, 2h, 12h, 3]  ; draw an elliptical arc<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">SQUARE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> SQUARE 100 ; draw a square shape (size = 100pt)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">RECTANGLE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> RECTANGLE [50, 100] ; draw a rectange shape (50×100pt)<br/> RECTANGLE [50, 100, 50] ; draw a rectangle <br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">POINT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> POINT ; draw a point with size and color of the pen<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">LABEL</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> LABEL “text” ; print text in the turte position<br/> LABEL 'text' ; see above<br/> LABEL "text ; see above (only for single words)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">TEXT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> CIRCLE 10 TEXT “text” ; set text of the actual drawing 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"> FONTCOLOR “green” ; set font color<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FONTFAMILY</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FONTFAMILY “Linux Libertine G” ; set font (family)<br/> FONTFAMILY “Linux Libertine G:smcp=1” ; set also font feature (small caps)<br/> FONTFAMILY “Linux Libertine G:smcp=1&onum=1” ; small caps + old figures<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FONTSIZE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FONTSIZE 12 ; set 12pt<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FONTWEIGHT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FONTWEIGHT “bold” ; set bold font<br/> FONTWEIGHT “normal” ; set normal weight<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FONTSTYLE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> FONTSTYLE “italic” ; set italic variant<br/> FONTSTYLE “normal” ; set normal 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"> ; PICTURE [ LibreLogo_commands ]<br/> PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped 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"> TO tree location<br/>   PENUP POSITION location HEADING 0 PENDOWN<br/>   PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped shape<br/> END<br/> <br/> PICTURE [ tree [30, 50] tree [100, 50] ] ; grouped shapes in a grouped shape<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">Starting new line shapes</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PICTURE ; start a new line shape<br/> FORWARD 10 PICTURE FORWARD 10 ; two line 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"> PICTURE [ CIRCLE 20 POSITION [-100, 100] CIRCLE 20 ]<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"> ; REPEAT number [ commands ]<br/> <br/> REPEAT 10 [ FORWARD 10 LEFT 45 CIRCLE 10 ] ; repeat 10 times<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ; number is optional<br/> <br/> REPEAT [ POSITION ANY ] ; endless 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"> REPEAT 100 [ FORWARD REPCOUNT LEFT 90 ]<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"> FOR i IN [1, 5, 7, 9, 11] [<br/>   FORWARD i<br/>   LEFT 90<br/> ]<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"> FOR i IN “text” [<br/>   LABEL i<br/>   FORWARD 10<br/> ]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">WHILE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> WHILE TRUE [ POSITION ANY ] ; endless loop<br/> WHILE REPCOUNT <= 10 [ FORWARD 50 LEFT 36 ] ; as REPEAT 10 [ ... ]<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"> REPEAT [ ; endless loop<br/>   POSITION ANY<br/>   IF REPCOUNT = 100 [ BREAK ]  ; equivalent of the REPEAT 100 [ ... ]<br/> ]<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"> REPEAT 100 [<br/>   POSITION ANY<br/>   IF REPCOUNT % 2 <> 0 [ CONTINUE ]<br/>   CIRCLE 10 ; draw circles on every 2nd positions<br/> ]<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"> ; IF condition [ true block ]<br/> ; IF condition [ true block ] [ false block ]<br/> <br/> IF a < 10 [ PRINT “Small” ]<br/> IF a < 10 [ PRINT “Small” ] [ PRINT “Big” ]<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"> IF a < 10 AND NOT a < 5 [ PRINT “5, 6, 7, 8 or 9” ]<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"> TO triangle<br/>   REPEAT [ FORWARD 100 RIGHT 120 ] FILL<br/> END<br/> <br/> REPEAT 10 [ triangle PENUP POSITION ANY PENDOWN ]<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"> TO randomletter<br/>   OUTPUT RANDOM “qwertzuiopasdfghjklyxcvbnm”<br/> END<br/> <br/> PRINT randomletter + randomletter + randomletter ; print 3-letter random character 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"> TO example number<br/>   IF number < 0 [ STOP ]<br/>   PRINT SQRT number ; print square root<br/> ]<br/> <br/> example 100<br/> example -1 ; without output and error<br/> example 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"> PENCOLOR ANY ; random pen 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"> WHILE TRUE [ POSITION ANY ] ; endless loop<br/> PRINT TRUE ; print 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"> WHILE NOT FALSE [ POSITION ANY ] ; endless loop<br/> PRINT FALSE ; print false<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PAGESIZE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT PAGESIZE ; print list of the page sizes in points, eg. [595.30, 841.89]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">PI/π</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT PI ; print 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"> PRINT “text” ; print “text” in a dialog box<br/> PRINT 5 + 10 ; print 15<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">INPUT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT INPUT “Input value?” ; ask and print a string by a query dialog box<br/> PRINT FLOAT (INPUT “First number?”) + FLOAT (INPUT “Second number?”) ; simple calculator<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="2">SLEEP</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> SLEEP 1000 ; wait for 1000 ms (1 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"> GLOBAL about<br/> about = “LibreLogo”<br/> <br/> TO example<br/>   PRINT about<br/>   GLOBAL about ; when we want to add a new value<br/>   about = “new value for the global variable”<br/> END<br/> <br/> example<br/> PRINT 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"> PRINT RANDOM 100 ; random float number (0 <= x < 100)<br/> PRINT RANDOM “text” ; random letter of the “text”<br/> PRINT RANDOM [1, 2] ; random list element (1 or 2)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">INT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT INT 3.8 ; print 3 (integer part of 3.8)<br/> PRINT INT RANDOM 100 ; random integer number (0 <= x < 100)<br/> PRINT INT “7” ; convert the string parameter to integer<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">FLOAT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ; convert the string parameter to float number<br/> PRINT 2 * FLOAT “5.5” ; print 11.0<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">STR</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ; convert the number parameter to string<br/> PRINT “Result: ” + STR 5 ; print “Result: 5”<br/> PRINT 10 * STR 5 ; print 5555555555<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">SQRT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT SQRT 100 ; print 10, square root of 100<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">SIN</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT SIN 90 * PI/180 ; print 1.0 (sinus of 90° in radians)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">COS</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT COS 0 * PI/180 ; print 1.0 (sinus of 0° in radians)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">ROUND</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT ROUND 3.8 ; print 4 (rounding 3.8)<br/> PRINT ROUND RANDOM 100 ; random integer number (0 <= x <= 100)<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">ABS</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT ABS -10 ; print 10, absolute value of -10<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">COUNT</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT COUNT “text” ; print 4, character count of “text”<br/> PRINT COUNT [1, 2, 3] ; print 3, size of the list<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">SET</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ; Convert list to Python set<br/> PRINT SET [4, 5, 6, 6] ; print {4, 5, 6}<br/> PRINT SET [4, 5, 6, 6] | SET [4, 1, 9] ; print {1, 4, 5, 6, 9}, union<br/> PRINT SET [4, 5, 6, 6] & SET [4, 1, 9] ; print {4}, intersection<br/> PRINT SET ([4, 5, 6, 6]) - SET [4, 1, 9] ; print {5, 6}, difference<br/> PRINT SET [4, 5, 6, 6] ^ SET [4, 1, 9] ; print {1, 5, 6, 9}, symmetric difference  <br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">RANGE</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ; Python-like list generation<br/> PRINT RANGE 10 ; print [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]<br/> PRINT RANGE 3 10 ; print [3, 4, 5, 6, 7, 8, 9]<br/> PRINT RANGE 3 10 3 ; print [3, 6, 9]<br/> <br/> FOR i in RANGE 10 50 10 [ ; loop for [10, 20, 30, 40]<br/>   FORWARD i<br/>   LEFT 90<br/> ]<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">LIST</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> ; remove the repeating elements of a list using set and list conversion<br/> PRINT LIST (SET [1, 3, 5, 5, 2, 1]) ; print [1, 3, 5, 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"> PRINT TUPLE [4, 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"> PRINT SORTED [5, 1, 3, 4] ; print [1, 3, 4, 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"> PRINT SUB (“t”, “T”, “text”) ; print “Text”, replacing “t” with “T”<br/> PRINT SUB (“(.)”, “\\1\\1”, “text”) ; print “tteexxtt”, doubling every 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"> IF SEARCH (“\w”, word) [ PRINT “Letter in the word.” ]<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"> PRINT FINDALL(“\w+”, “Dogs, cats.”) ; print [“Dogs”, “cats”], the list of the words.<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">MIN</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT MIN [1, 2, 3] ; print 1, the lowest element of the list<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="3">MAX</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PRINT MAX [1, 2, 3] ; print 3, the greatest element of the list<br/></paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="heading" level="2">Color constants</paragraph> +<paragraph role="paragraph"></paragraph> +<paragraph role="code"> PENCOLOR “SILVER” ; set by name<br/> PENCOLOR [1] ; set by identifiers<br/> PENCOLOR “~SILVER” ; random silver color<br/> <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> diff --git a/librelogo/help/en-US/LibreLogo/doc.txt b/librelogo/help/en-US/LibreLogo/doc.txt new file mode 100644 index 000000000000..db596f926808 --- /dev/null +++ b/librelogo/help/en-US/LibreLogo/doc.txt @@ -0,0 +1,787 @@ += 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&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 <= 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 <> 0 [ CONTINUE ] + CIRCLE 10 ; draw circles on every 2nd positions + ] + +== Conditions == + +=== IF === + + ; IF condition [ true block ] + ; IF condition [ true block ] [ false block ] + + IF a < 10 [ PRINT “Small” ] + IF a < 10 [ PRINT “Small” ] [ PRINT “Big” ] + +=== AND, OR, NOT === + +Logical operators. + + IF a < 10 AND NOT a < 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 < 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 <= x < 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 <= x < 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 <= x <= 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] & 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 +|} + diff --git a/librelogo/help/en-US/LibreLogo/gendoc.sh b/librelogo/help/en-US/LibreLogo/gendoc.sh new file mode 100755 index 000000000000..c07c62d3d82e --- /dev/null +++ b/librelogo/help/en-US/LibreLogo/gendoc.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cat doc.txt | awk 'BEGIN{system("cat head")}/^ /{code = code $0 "<br/>";next}{if (code != ""){print "<paragraph role=\"code\">" gensub(" ", "\\ ", "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 + diff --git a/librelogo/help/en-US/LibreLogo/head b/librelogo/help/en-US/LibreLogo/head new file mode 100644 index 000000000000..e0783a4ae971 --- /dev/null +++ b/librelogo/help/en-US/LibreLogo/head @@ -0,0 +1,17 @@ +<?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> + diff --git a/librelogo/help/en-US/help.tree b/librelogo/help/en-US/help.tree new file mode 100644 index 000000000000..6bed2ffa1d2e --- /dev/null +++ b/librelogo/help/en-US/help.tree @@ -0,0 +1,18 @@ +<?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> diff --git a/librelogo/icons/lc_arrowshapes.circular-arrow.png b/librelogo/icons/lc_arrowshapes.circular-arrow.png Binary files differnew file mode 100644 index 000000000000..b7a5a9258ca7 --- /dev/null +++ b/librelogo/icons/lc_arrowshapes.circular-arrow.png diff --git a/librelogo/icons/lc_arrowshapes.circular-leftarrow.png b/librelogo/icons/lc_arrowshapes.circular-leftarrow.png Binary files differnew file mode 100644 index 000000000000..ad2197838ca7 --- /dev/null +++ b/librelogo/icons/lc_arrowshapes.circular-leftarrow.png diff --git a/librelogo/icons/lc_arrowshapes.down-arrow.png b/librelogo/icons/lc_arrowshapes.down-arrow.png Binary files differnew file mode 100644 index 000000000000..d3b81b9f6446 --- /dev/null +++ b/librelogo/icons/lc_arrowshapes.down-arrow.png diff --git a/librelogo/icons/lc_arrowshapes.up-arrow.png b/librelogo/icons/lc_arrowshapes.up-arrow.png Binary files differnew file mode 100644 index 000000000000..6ae84abe8376 --- /dev/null +++ b/librelogo/icons/lc_arrowshapes.up-arrow.png diff --git a/librelogo/icons/lc_basicstop.png b/librelogo/icons/lc_basicstop.png Binary files differnew file mode 100644 index 000000000000..ab9bddb4a98b --- /dev/null +++ b/librelogo/icons/lc_basicstop.png diff --git a/librelogo/icons/lc_editglossary.png b/librelogo/icons/lc_editglossary.png Binary files differnew file mode 100644 index 000000000000..fcba68f1feb5 --- /dev/null +++ b/librelogo/icons/lc_editglossary.png diff --git a/librelogo/icons/lc_navigationbarleft.png b/librelogo/icons/lc_navigationbarleft.png Binary files differnew file mode 100644 index 000000000000..7e69c8045fbe --- /dev/null +++ b/librelogo/icons/lc_navigationbarleft.png diff --git a/librelogo/icons/lc_newdoc.png b/librelogo/icons/lc_newdoc.png Binary files differnew file mode 100644 index 000000000000..8e18798acdb2 --- /dev/null +++ b/librelogo/icons/lc_newdoc.png diff --git a/librelogo/icons/lc_runbasic.png b/librelogo/icons/lc_runbasic.png Binary files differnew file mode 100644 index 000000000000..da2d9d97badf --- /dev/null +++ b/librelogo/icons/lc_runbasic.png diff --git a/librelogo/icons/sc_arrowshapes.circular-arrow.png b/librelogo/icons/sc_arrowshapes.circular-arrow.png Binary files differnew file mode 100644 index 000000000000..35a5e9719607 --- /dev/null +++ b/librelogo/icons/sc_arrowshapes.circular-arrow.png diff --git a/librelogo/icons/sc_arrowshapes.circular-leftarrow.png b/librelogo/icons/sc_arrowshapes.circular-leftarrow.png Binary files differnew file mode 100644 index 000000000000..62eeee65fba4 --- /dev/null +++ b/librelogo/icons/sc_arrowshapes.circular-leftarrow.png diff --git a/librelogo/icons/sc_arrowshapes.down-arrow.png b/librelogo/icons/sc_arrowshapes.down-arrow.png Binary files differnew file mode 100644 index 000000000000..7290cae2f1c4 --- /dev/null +++ b/librelogo/icons/sc_arrowshapes.down-arrow.png diff --git a/librelogo/icons/sc_arrowshapes.up-arrow.png b/librelogo/icons/sc_arrowshapes.up-arrow.png Binary files differnew file mode 100644 index 000000000000..5f9bcc197f81 --- /dev/null +++ b/librelogo/icons/sc_arrowshapes.up-arrow.png diff --git a/librelogo/icons/sc_basicstop.png b/librelogo/icons/sc_basicstop.png Binary files differnew file mode 100644 index 000000000000..1c6ff922a786 --- /dev/null +++ b/librelogo/icons/sc_basicstop.png diff --git a/librelogo/icons/sc_editglossary.png b/librelogo/icons/sc_editglossary.png Binary files differnew file mode 100644 index 000000000000..4e14c031a4ae --- /dev/null +++ b/librelogo/icons/sc_editglossary.png diff --git a/librelogo/icons/sc_navigationbarleft.png b/librelogo/icons/sc_navigationbarleft.png Binary files differnew file mode 100644 index 000000000000..e544a7581f33 --- /dev/null +++ b/librelogo/icons/sc_navigationbarleft.png diff --git a/librelogo/icons/sc_newdoc.png b/librelogo/icons/sc_newdoc.png Binary files differnew file mode 100644 index 000000000000..e914775a2693 --- /dev/null +++ b/librelogo/icons/sc_newdoc.png diff --git a/librelogo/icons/sc_runbasic.png b/librelogo/icons/sc_runbasic.png Binary files differnew file mode 100644 index 000000000000..8dd695c1e767 --- /dev/null +++ b/librelogo/icons/sc_runbasic.png diff --git a/librelogo/make.py b/librelogo/make.py new file mode 100644 index 000000000000..0d877edadf62 --- /dev/null +++ b/librelogo/make.py @@ -0,0 +1,30 @@ +# -*- 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()) diff --git a/librelogo/pythonpath/en.properties b/librelogo/pythonpath/en.properties new file mode 100644 index 000000000000..f9a0d0b87ee6 --- /dev/null +++ b/librelogo/pythonpath/en.properties @@ -0,0 +1,151 @@ +# 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? diff --git a/librelogo/pythonpath/hu.properties b/librelogo/pythonpath/hu.properties new file mode 100644 index 000000000000..36408b732e48 --- /dev/null +++ b/librelogo/pythonpath/hu.properties @@ -0,0 +1,151 @@ +# 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? diff --git a/librelogo/pythonpath/librelogodummy_path.py b/librelogo/pythonpath/librelogodummy_path.py new file mode 100644 index 000000000000..f600a162b1cf --- /dev/null +++ b/librelogo/pythonpath/librelogodummy_path.py @@ -0,0 +1,3 @@ +import uno, re, sys, os, traceback +def get_path(): + return os.path.join(os.path.dirname(sys.modules[__name__].__file__), __name__ + ".py") |