summaryrefslogtreecommitdiff
path: root/librelogo
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2012-11-07 15:04:52 +0100
committerAndras Timar <atimar@suse.com>2012-11-07 14:26:46 +0000
commitc2a393fbaed468d1ffb3004f267dbbf11890bbd0 (patch)
treea6a1740a0e92f250dca470f98020d258827d32c7 /librelogo
parent207ed1b1a17ca6d785cad936ecadcd160acc2b83 (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')
-rw-r--r--librelogo/Addons.xcu310
-rw-r--r--librelogo/ChangeLog82
-rw-r--r--librelogo/LibreLogo/LibreLogo.py1407
-rw-r--r--librelogo/LibreLogoDummy.py14
-rw-r--r--librelogo/META-INF/manifest.xml9
-rw-r--r--librelogo/Office/UI/StartModuleWindowState.xcu22
-rw-r--r--librelogo/Office/UI/WriterWindowState.xcu22
-rw-r--r--librelogo/README43
-rw-r--r--librelogo/description-en.txt1
-rw-r--r--librelogo/description-hu.txt1
-rw-r--r--librelogo/description.xml21
-rw-r--r--librelogo/help/en-US/LibreLogo/LibreLogo.xhp614
-rw-r--r--librelogo/help/en-US/LibreLogo/doc.txt787
-rwxr-xr-xlibrelogo/help/en-US/LibreLogo/gendoc.sh3
-rw-r--r--librelogo/help/en-US/LibreLogo/head17
-rw-r--r--librelogo/help/en-US/help.tree18
-rw-r--r--librelogo/icons/lc_arrowshapes.circular-arrow.pngbin0 -> 787 bytes
-rw-r--r--librelogo/icons/lc_arrowshapes.circular-leftarrow.pngbin0 -> 1082 bytes
-rw-r--r--librelogo/icons/lc_arrowshapes.down-arrow.pngbin0 -> 527 bytes
-rw-r--r--librelogo/icons/lc_arrowshapes.up-arrow.pngbin0 -> 487 bytes
-rw-r--r--librelogo/icons/lc_basicstop.pngbin0 -> 616 bytes
-rw-r--r--librelogo/icons/lc_editglossary.pngbin0 -> 705 bytes
-rw-r--r--librelogo/icons/lc_navigationbarleft.pngbin0 -> 831 bytes
-rw-r--r--librelogo/icons/lc_newdoc.pngbin0 -> 445 bytes
-rw-r--r--librelogo/icons/lc_runbasic.pngbin0 -> 740 bytes
-rw-r--r--librelogo/icons/sc_arrowshapes.circular-arrow.pngbin0 -> 482 bytes
-rw-r--r--librelogo/icons/sc_arrowshapes.circular-leftarrow.pngbin0 -> 631 bytes
-rw-r--r--librelogo/icons/sc_arrowshapes.down-arrow.pngbin0 -> 340 bytes
-rw-r--r--librelogo/icons/sc_arrowshapes.up-arrow.pngbin0 -> 323 bytes
-rw-r--r--librelogo/icons/sc_basicstop.pngbin0 -> 397 bytes
-rw-r--r--librelogo/icons/sc_editglossary.pngbin0 -> 429 bytes
-rw-r--r--librelogo/icons/sc_navigationbarleft.pngbin0 -> 626 bytes
-rw-r--r--librelogo/icons/sc_newdoc.pngbin0 -> 350 bytes
-rw-r--r--librelogo/icons/sc_runbasic.pngbin0 -> 534 bytes
-rw-r--r--librelogo/make.py30
-rw-r--r--librelogo/pythonpath/en.properties151
-rw-r--r--librelogo/pythonpath/hu.properties151
-rw-r--r--librelogo/pythonpath/librelogodummy_path.py3
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&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Forward</value>
+ <value xml:lang="hu">Előre</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m02" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$gobackward?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Back</value>
+ <value xml:lang="hu">Hátra</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m03" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$left?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Left</value>
+ <value xml:lang="hu">Balra</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m04" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$right?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Right</value>
+ <value xml:lang="hu">Jobbra</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m05" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$run?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Start (the program in the Writer document)</value>
+ <value xml:lang="hu">Indítás (a Writer dokumentumban lévő programé)</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m06" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$stop?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Stop</value>
+ <value xml:lang="hu">Leállítás</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m07" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$home?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Home</value>
+ <value xml:lang="hu">Haza</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m08" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$clearscreen?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Clear screen</value>
+ <value xml:lang="hu">Képernyőtörlés</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ <node oor:name="m09" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$commandline?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">FORWARD (fd), BACK (bk), LEFT (lt), RIGHT (rt) • fd 72, bk 1cm + 1in + 1", lt 90, rt 1.5h
+REPEAT num [ commands ], REPCOUNT • repeat 100 [ fd repcount lt 91 ]
+PENUP (pu), PENDOWN (pd), FILL, CLOSE, HOME, CLEARSCREEN (cs), PENSIZE (ps 5)
+PENCOLOR (pc), FILLCOLOR (fc) • pc “red”, pc 0xff0000, fc [255, 0, 0], fc any
+POSITION (pos), HEADING (seth) • pos [0, 0], pos pagesize, seth 60, seth [0, 0]
+CIRCLE, ELLIPSE, BOX, RECTANGLE • circle 10 ellipse [5, 9] box 10 rectangle [5, 2]
+LABEL, TEXT, PRINT • label “Some text”, circle 200 text “center of the actual shape”
+FONTFAMILY “Font” FONTSIZE 9 FONTCOLOR “red” FONTWEIGHT “bold”
+TO name arguments ... END, TO name arguments, OUTPUT return_value, END
+RANDOM, SQRT, INT, COUNT, ABS, SIN, COS, INPUT • ps random 100, print count “string”
+PICTURE (pic) [ ... ] • group different shapes: pic [ fd 100 circle 50 ]</value>
+<value xml:lang="hu">ELŐRE (e), HÁTRA (h), BALRA (b), JOBBRA (j) • e 72, h 1cm + 1in + 1", b 90, j 1,5ó
+ISMÉTLÉS (ism) hányszor [ parancsok ], HÁNYADIK • ism 100 [ e hányadik b 91 ]
+TOLLATFEL (tf), TOLLATLE (tl), TÖLT, ZÁR, HAZA, TÖRÖLKÉP, TOLLVASTAGSÁG (tv 5)
+TOLLSZÍN (tsz), TÖLTŐSZÍN (tlsz) • tsz „kék”, tsz 0xff0000, tsz [0, 0, 0], tsz tetsz
+HELY, IRÁNY • hely [0, 0], hely oldalméret, irány 60, irány [0, 0]
+KÖR, ELLIPSZIS, NÉGYZET, TÉGLALAP • kör 100, ellipszis [50, 100], négyzet 100
+CÍMKE, SZÖVEG, KI • „címke szöveg”, kör 200 szöveg „körfelirat” ki 5+5
+BETŰCSALÁD „betű” BETŰMÉRET 24 BETŰSZÍN „kék” BETŰVASTAGSÁG „vastag”
+EZ név változók ... VÉGE, EZ név változók, EREDMÉNY visszatérési_érték, VÉGE
+VÉLETLENSZÁM (vszám), GYÖK, EGÉSZ, DARAB (db), BE • e vszám 100, ki db „betűk”
+KÉP [ ... ] • alakzatok csoportosítása: kép [ e 100 kör 50 ]</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="ControlType" oor:type="xs:string">
+ <value>Editfield</value>
+ </prop>
+ <prop oor:name="Width" oor:type="xs:long">
+ <value>300</value>
+ </prop>
+ </node>
+ <node oor:name="m10" oor:op="replace">
+ <prop oor:name="Context" oor:type="xs:string">
+ <value>com.sun.star.text.TextDocument</value>
+ </prop>
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$__translate__?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <prop oor:name="Title" oor:type="xs:string">
+ <value xml:lang="en">Uppercase commands, also translate them to the language of the document</value>
+ <value xml:lang="hu">Parancsok nagybetűsítése és fordítása a dokumentum nyelvére</value>
+ </prop>
+ <prop oor:name="Target" oor:type="xs:string">
+ <value>_self</value>
+ </prop>
+ </node>
+ </node>
+ </node>
+ <node oor:name="Images">
+ <node oor:name="logo-forward" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$goforward?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_arrowshapes.up-arrow.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_arrowshapes.up-arrow.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-backward" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$gobackward?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_arrowshapes.down-arrow.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_arrowshapes.down-arrow.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-left" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$left?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_arrowshapes.circular-leftarrow.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_arrowshapes.circular-leftarrow.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-right" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$right?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_arrowshapes.circular-arrow.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_arrowshapes.circular-arrow.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-run" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$run?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_runbasic.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_runbasic.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-stop" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$stop?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_basicstop.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_basicstop.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-home" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$home?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_navigationbarleft.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_navigationbarleft.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-clearscreen" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$clearscreen?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_newdoc.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_newdoc.png</value>
+ </prop>
+ </node>
+ </node>
+ <node oor:name="logo-translate" oor:op="replace">
+ <prop oor:name="URL" oor:type="xs:string">
+ <value>vnd.sun.star.script:librelogo-0.2.oxt|LibreLogo|LibreLogo.py$__translate__?language=Python&amp;location=user:uno_packages</value>
+ </prop>
+ <node oor:name="UserDefinedImages">
+ <prop oor:name="ImageSmallURL">
+ <value>%origin%/icons/sc_editglossary.png</value>
+ </prop>
+ <prop oor:name="ImageBigURL">
+ <value>%origin%/icons/lc_editglossary.png</value>
+ </prop>
+ </node>
+ </node>
+
+ </node>
+
+ </node>
+</oor:component-data>
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">&#160;FORWARD&#160;200&#160;LEFT&#160;89<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">To reset the command line click triple in it or press Ctrl-A to select the previous commands, and type the new commands.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Syntax highlighting/Translating</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">It expands and upper case Logo commands in the Writer document. Change the language of the document (Tools » Options » Language Settings » Languages » Western) and click on this icon to translate the Logo program to the selected language.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Program editing</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">LibreLogo drawings and programs use the same Writer document. The LibreLogo canvas is on the first page of the Writer document. You can insert a page break before the LibreLogo programs and set the zoom/font size for a comfortable two page layout for LibreLogo programming: left (first) page is the canvas, right (second) page is for the LibreLogo programs.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="1">LibreLogo programming language</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">LibreLogo is a native, easily localisable, Logo-like programming language. It is back-compatible with the older Logo systems in the case of the simple Logo programs used in education, eg.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;triangle&#160;:size<br/>&#160;REPEAT&#160;3&#160;[<br/>&#160;&#160;&#160;FORWARD&#160;:size<br/>&#160;&#160;&#160;LEFT&#160;120<br/>&#160;]<br/>&#160;END<br/>&#160;<br/>&#160;triangle&#160;10&#160;triangle&#160;100&#160;triangle&#160;200<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Differences from the Logo programming language</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">List members are comma separated</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;POSITION&#160;[0,&#160;0]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Program blocks and lists</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Program blocks and lists have got different syntax.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Program blocks need space or new line at parenthesization:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;REPEAT&#160;10&#160;[&#160;forward&#160;10&#160;left&#160;36&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Lists need close parenthesization:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;POSITION&#160;[0,&#160;0]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;;&#160;and&#160;not&#160;POSITION&#160;[&#160;0,&#160;0&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Function declarations</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">LibreLogo has not supported 1-line function declarations, yet. TO and END need new lines.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;polygon<br/>&#160;&#160;&#160;FORWARD&#160;1&#160;RIGHT&#160;1<br/>&#160;&#160;&#160;polygon&#160;&#160;&#160;&#160;&#160;&#160;;&#160;recursion<br/>&#160;END<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;polygon<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Other features of LibreLogo</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Optional colon</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">The colon is optional before variable names.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;triangle&#160;size<br/>&#160;&#160;&#160;REPEAT&#160;3&#160;[&#160;FORWARD&#160;size&#160;LEFT&#160;120&#160;]<br/>&#160;END<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">String notation</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">String notation supports also orthographical and Python syntax.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;"word ;&#160;original&#160;Logo&#160;syntax<br/>&#160;PRINT&#160;“Arbitrary&#160;text.” ;&#160;orthography,&#160;Writer<br/>&#160;PRINT&#160;'Arbitrary&#160;text.' ;&#160;Python&#160;syntax<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Python list and string handling</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;“text”[2] ;&#160;print&#160;“x”<br/>&#160;PRINT&#160;“text”[1:3] ;&#160;print&#160;“ex”<br/>&#160;PRINT&#160;[1,&#160;2,&#160;3,&#160;4][1] ;&#160;print&#160;2<br/>&#160;PRINT&#160;[1,&#160;2,&#160;3,&#160;4][1:3] ;&#160;print&#160;[2,&#160;3]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Python-like FOR loop</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FOR&#160;i&#160;IN&#160;[1,&#160;2]&#160;[<br/>&#160;&#160;&#160;PRINT&#160;i<br/>&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Python-like variable declaration</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;x&#160;=&#160;15<br/>&#160;PRINT&#160;x<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">There are no extra query functions</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;FILLCOLOR<br/>&#160;p&#160;=&#160;POSITION<br/>&#160;PRINT&#160;p<br/>&#160;REPEAT&#160;10&#160;[&#160;POSITION&#160;ANY&#160;POSITION&#160;p&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Alternative parenthesization in function calls</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;star&#160;size&#160;color<br/>&#160;FILLCOLOR&#160;color<br/>&#160;REPEAT&#160;5&#160;[&#160;LEFT&#160;72&#160;FORWARD&#160;size&#160;RIGHT&#160;144&#160;FORWARD&#160;size&#160;]<br/>&#160;FILL<br/>&#160;END<br/>&#160;<br/>&#160;star&#160;100&#160;“red”<br/>&#160;star&#160;(100,&#160;“green”)<br/>&#160;star(100,&#160;“blue”)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="1">LibreLogo commands</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Basic syntax</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Case sensitivity</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Commands, color constants are case insensitive:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;“Hello,&#160;World!”<br/>&#160;print&#160;“Hello,&#160;World,&#160;again!”<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Variable names are case sensitive:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;a&#160;=&#160;5<br/>&#160;A&#160;=&#160;7<br/>&#160;PRINT&#160;a<br/>&#160;PRINT&#160;A<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Program lines</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Lines of a LibreLogo program are paragraphs in the LibreOffice Writer document. A program line can contain multiple commands:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;“Hello,&#160;World!”&#160;PRINT&#160;“LibreLogo”<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Comments</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Lines or line parts are comments from a semicolon to the end of the line (paragraph):</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;some&#160;comments<br/>&#160;PRINT&#160;5&#160;*&#160;5 ;&#160;some&#160;comments<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Break program lines to multiple paragraphs</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">It’s possible to break a program line for more paragraphs using the character tilde at the end of the line:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;“This&#160;is&#160;a&#160;very&#160;long&#160;”&#160;+&#160;~<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;“warning&#160;message”<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Turtle moving</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FORWARD (fd)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FORWARD&#160;10 ;&#160;move&#160;forward&#160;10pt&#160;(1pt&#160;=&#160;1/72&#160;inch)<br/>&#160;FORWARD&#160;10pt ;&#160;see&#160;above<br/>&#160;FORWARD&#160;0.5in ;&#160;move&#160;forward&#160;0.5&#160;inch&#160;(1&#160;inch&#160;=&#160;2.54&#160;cm)<br/>&#160;FORWARD&#160;1" ;&#160;see&#160;above<br/>&#160;FD&#160;1mm<br/>&#160;FD&#160;1cm<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">BACK (bk)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;BACK&#160;10&#160;;&#160;move&#160;back&#160;10pt<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">LEFT (lt)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;LEFT&#160;90 ;&#160;turn&#160;counterclockwise&#160;90&#160;degrees<br/>&#160;LEFT&#160;90° ;&#160;see&#160;above<br/>&#160;LT&#160;3h ;&#160;see&#160;above&#160;(clock&#160;position)<br/>&#160;LT&#160;any ;&#160;turn&#160;to&#160;a&#160;random&#160;position<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">RIGHT (rt)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;RIGHT&#160;90 ;&#160;turn&#160;clockwise&#160;90&#160;degrees<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PENUP (pu)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENUP ;&#160;turtle&#160;will&#160;move&#160;without&#160;drawing<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PENDOWN (pd)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENDOWN ;&#160;turtle&#160;will&#160;move&#160;with&#160;drawing<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">POSITION (pos)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;POSITION&#160;[0,&#160;0] ;&#160;turn&#160;and&#160;move&#160;to&#160;the&#160;top-left&#160;corner<br/>&#160;POSITION&#160;PAGESIZE ;&#160;turn&#160;and&#160;move&#160;to&#160;the&#160;bottom-right&#160;corner<br/>&#160;POSITION&#160;[PAGESIZE[0],&#160;0]&#160;;&#160;turn&#160;and&#160;move&#160;to&#160;the&#160;top-right&#160;corner<br/>&#160;POSITION&#160;ANY ;&#160;turn&#160;and&#160;move&#160;to&#160;a&#160;random&#160;position<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">HEADING (seth)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;HEADING&#160;0 ;&#160;turn&#160;north<br/>&#160;HEADING&#160;12h ;&#160;see&#160;above<br/>&#160;HEADING&#160;ANY ;&#160;turn&#160;to&#160;a&#160;random&#160;position<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Other turtle commands</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">HIDETURTLE (ht)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;HIDETURTLE ;&#160;hide&#160;turtle&#160;(until&#160;the&#160;showturtle&#160;command)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SHOWTURTLE (st)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;SHOWTURTLE ;&#160;show&#160;turtle<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">HOME</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;HOME ;&#160;reset&#160;initial&#160;turtle&#160;settings&#160;and&#160;position<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">CLEARSCREEN (cs)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;CLEARSCREEN ;&#160;remove&#160;drawing&#160;objects&#160;of&#160;the&#160;document<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FILL and CLOSE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FILL ;&#160;close&#160;and&#160;fill&#160;the&#160;actual&#160;line&#160;shape<br/>&#160;CLOSE ;&#160;close&#160;the&#160;actual&#160;line&#160;shape<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Pen settings</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PENSIZE (ps)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENSIZE&#160;100 ;&#160;line&#160;width&#160;is&#160;100&#160;points<br/>&#160;PENSIZE&#160;ANY ;&#160;equivalent&#160;of&#160;PENSIZE&#160;RANDOM&#160;10<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PENCOLOR/PENCOLOUR (pc)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENCOLOR&#160;“red” ;&#160;set&#160;red&#160;pen&#160;color&#160;(by&#160;color&#160;name,&#160;see&#160;color&#160;constants)<br/>&#160;PENCOLOR&#160;[255,&#160;255,&#160;0] ;&#160;set&#160;yellow&#160;color&#160;(RGB&#160;list)<br/>&#160;PENCOLOR&#160;0xffff00 ;&#160;set&#160;yellow&#160;color&#160;(hexa&#160;code)<br/>&#160;PENCOLOR&#160;0 ;&#160;set&#160;black&#160;color&#160;(0x000000)<br/>&#160;PENCOLOR&#160;ANY ;&#160;random&#160;color<br/>&#160;PENCOLOR&#160;[5] ;&#160;set&#160;red&#160;color&#160;(by&#160;color&#160;identifier,&#160;see&#160;color&#160;constants)<br/>&#160;PENCOLOR&#160;“invisible” ;&#160;invisible&#160;pen&#160;color&#160;for&#160;shapes&#160;without&#160;visible&#160;outline<br/>&#160;PENCOLOR&#160;“~red” ;&#160;set&#160;random&#160;red&#160;color<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PENJOINT/LINEJOINT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENJOINT&#160;“rounded” ;&#160;rounded&#160;line&#160;joint&#160;(default)<br/>&#160;PENJOINT&#160;“miter” ;&#160;sharp&#160;line&#160;joint<br/>&#160;PENJOINT&#160;“bevel” ;&#160;bevel&#160;line&#160;joint<br/>&#160;PENJOINT&#160;“none” ;&#160;without&#160;line&#160;joint<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PENSTYLE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENSTYLE&#160;“solid” ;&#160;solid&#160;line&#160;(default)<br/>&#160;PENSTYLE&#160;“dotted” ;&#160;dotted&#160;line<br/>&#160;PENSTYLE&#160;“dashed” ;&#160;dashed&#160;line<br/>&#160;<br/>&#160;;&#160;custom&#160;dot–dash&#160;pattern&#160;specified&#160;by&#160;a&#160;list&#160;with&#160;the&#160;following&#160;arguments:<br/>&#160;;&#160;–&#160;number&#160;of&#160;the&#160;neighbouring&#160;dots<br/>&#160;;&#160;–&#160;length&#160;of&#160;a&#160;dot<br/>&#160;;&#160;–&#160;number&#160;of&#160;the&#160;neighbouring&#160;dashes<br/>&#160;;&#160;–&#160;length&#160;of&#160;a&#160;dash<br/>&#160;;&#160;–&#160;distance&#160;of&#160;the&#160;dots/dashes<br/>&#160;;&#160;–&#160;type&#160;(optional):<br/>&#160;;&#160;&#160;&#160;0&#160;=&#160;dots&#160;are&#160;rectangles&#160;(default)<br/>&#160;;&#160;&#160;&#160;2&#160;=&#160;dots&#160;are&#160;squares&#160;(lengths&#160;and&#160;distances&#160;are&#160;relative&#160;to&#160;the&#160;pensize)<br/>&#160;<br/>&#160;PENSTYLE&#160;[3,&#160;1mm,&#160;2,&#160;4mm,&#160;2mm,&#160;2] ;&#160;...––...––...––<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Fill settings</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FILLCOLOR/FILLCOLOUR (fc)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FILLCOLOR&#160;“blue” ;&#160;fill&#160;with&#160;blue&#160;color,&#160;see&#160;also&#160;PENCOLOR<br/>&#160;FILLCOLOR&#160;“invisible”&#160;CIRCLE&#160;10 ;&#160;unfilled&#160;circle<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FILLSTYLE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FILLSTYLE&#160;0 ;&#160;fill&#160;without&#160;hatches&#160;(default)<br/>&#160;FILLSTYLE&#160;1 ;&#160;black&#160;single&#160;hatches&#160;(horizontal)<br/>&#160;FILLSTYLE&#160;2 ;&#160;black&#160;single&#160;hatches&#160;(45&#160;degrees)<br/>&#160;FILLSTYLE&#160;3 ;&#160;black&#160;single&#160;hatches&#160;(-45&#160;degrees)<br/>&#160;FILLSTYLE&#160;4 ;&#160;black&#160;single&#160;hatches&#160;(vertical)<br/>&#160;FILLSTYLE&#160;5 ;&#160;red&#160;crossed&#160;hatches&#160;(45&#160;degrees)<br/>&#160;FILLSTYLE&#160;6 ;&#160;red&#160;crossed&#160;hatches&#160;(0&#160;degrees)<br/>&#160;FILLSTYLE&#160;7 ;&#160;blue&#160;crossed&#160;hatches&#160;(45&#160;degrees)<br/>&#160;FILLSTYLE&#160;8 ;&#160;blue&#160;crossed&#160;hatches&#160;(0&#160;degrees)<br/>&#160;FILLSTYLE&#160;9 ;&#160;blue&#160;triple&#160;crossed<br/>&#160;FILLSTYLE&#160;10 ;&#160;black&#160;wide&#160;single&#160;hatches&#160;(45&#160;degrees)<br/>&#160;<br/>&#160;;&#160;custom&#160;hatches&#160;specified&#160;by&#160;a&#160;list&#160;with&#160;the&#160;following&#160;arguments:<br/>&#160;;&#160;–&#160;style&#160;(1&#160;=&#160;single,&#160;2&#160;=&#160;double,&#160;3&#160;=&#160;triple&#160;hatching)<br/>&#160;;&#160;–&#160;color<br/>&#160;;&#160;–&#160;distance<br/>&#160;;&#160;–&#160;degree<br/>&#160;<br/>&#160;FILLSTYLE&#160;[2,&#160;“green”,&#160;3pt,&#160;15°] ;&#160;green&#160;crossed&#160;hatches&#160;(15&#160;degrees)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Drawing objects</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">CIRCLE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;CIRCLE&#160;100 ;&#160;draw&#160;a&#160;circle&#160;shape&#160;(diameter&#160;=&#160;100pt)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">ELLIPSE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;ELLIPSE&#160;[50,&#160;100] ;&#160;draw&#160;an&#160;ellipse&#160;with&#160;50&#160;and&#160;100&#160;diameters<br/>&#160;ELLIPSE&#160;[50,&#160;100,&#160;2h,&#160;12h] ;&#160;draw&#160;an&#160;elliptical&#160;sector&#160;(from&#160;2h&#160;clock&#160;position&#160;to&#160;12h)<br/>&#160;ELLIPSE&#160;[50,&#160;100,&#160;2h,&#160;12h,&#160;2]&#160;&#160;;&#160;draw&#160;an&#160;elliptical&#160;segment<br/>&#160;ELLIPSE&#160;[50,&#160;100,&#160;2h,&#160;12h,&#160;3]&#160;&#160;;&#160;draw&#160;an&#160;elliptical&#160;arc<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SQUARE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;SQUARE&#160;100 ;&#160;draw&#160;a&#160;square&#160;shape&#160;(size&#160;=&#160;100pt)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">RECTANGLE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;RECTANGLE&#160;[50,&#160;100] ;&#160;draw&#160;a&#160;rectange&#160;shape&#160;(50×100pt)<br/>&#160;RECTANGLE&#160;[50,&#160;100,&#160;50] ;&#160;draw&#160;a&#160;rectangle&#160;<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">POINT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;POINT ;&#160;draw&#160;a&#160;point&#160;with&#160;size&#160;and&#160;color&#160;of&#160;the&#160;pen<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">LABEL</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;LABEL&#160;“text” ;&#160;print&#160;text&#160;in&#160;the&#160;turte&#160;position<br/>&#160;LABEL&#160;'text' ;&#160;see&#160;above<br/>&#160;LABEL&#160;"text ;&#160;see&#160;above&#160;(only&#160;for&#160;single&#160;words)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">TEXT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;CIRCLE&#160;10&#160;TEXT&#160;“text” ;&#160;set&#160;text&#160;of&#160;the&#160;actual&#160;drawing&#160;object<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Font settings</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FONTCOLOR/FONTCOLOUR</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FONTCOLOR&#160;“green” ;&#160;set&#160;font&#160;color<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FONTFAMILY</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FONTFAMILY&#160;“Linux&#160;Libertine&#160;G” ;&#160;set&#160;font&#160;(family)<br/>&#160;FONTFAMILY&#160;“Linux&#160;Libertine&#160;G:smcp=1” ;&#160;set&#160;also&#160;font&#160;feature&#160;(small&#160;caps)<br/>&#160;FONTFAMILY&#160;“Linux&#160;Libertine&#160;G:smcp=1&amp;onum=1” ;&#160;small&#160;caps&#160;+&#160;old&#160;figures<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FONTSIZE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FONTSIZE&#160;12 ;&#160;set&#160;12pt<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FONTWEIGHT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FONTWEIGHT&#160;“bold” ;&#160;set&#160;bold&#160;font<br/>&#160;FONTWEIGHT&#160;“normal” ;&#160;set&#160;normal&#160;weight<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FONTSTYLE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FONTSTYLE&#160;“italic” ;&#160;set&#160;italic&#160;variant<br/>&#160;FONTSTYLE&#160;“normal” ;&#160;set&#160;normal&#160;variant<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">PICTURE (pic)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">PICTURE is for </paragraph>
+<paragraph role="paragraph">* shape grouping;</paragraph>
+<paragraph role="paragraph">* starting new line shapes;</paragraph>
+<paragraph role="paragraph">* keeping the consistency of positions and line shapes at the left border.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Shape grouping</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;PICTURE&#160;[&#160;LibreLogo_commands&#160;]<br/>&#160;PICTURE&#160;[&#160;FORWARD&#160;100&#160;CIRCLE&#160;100&#160;] ;&#160;tree-like&#160;grouped&#160;shape<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">See also “Group” in LibreOffice Writer Help.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;tree&#160;location<br/>&#160;&#160;&#160;PENUP&#160;POSITION&#160;location&#160;HEADING&#160;0&#160;PENDOWN<br/>&#160;&#160;&#160;PICTURE&#160;[&#160;FORWARD&#160;100&#160;CIRCLE&#160;100&#160;] ;&#160;tree-like&#160;grouped&#160;shape<br/>&#160;END<br/>&#160;<br/>&#160;PICTURE&#160;[&#160;tree&#160;[30,&#160;50]&#160;tree&#160;[100,&#160;50]&#160;] ;&#160;grouped&#160;shapes&#160;in&#160;a&#160;grouped&#160;shape<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Starting new line shapes</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PICTURE ;&#160;start&#160;a&#160;new&#160;line&#160;shape<br/>&#160;FORWARD&#160;10&#160;PICTURE&#160;FORWARD&#160;10 ;&#160;two&#160;line&#160;shapes<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">Consistency at the left border</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Use picture to keep the consistency of positions and line shapes at the left border of Writer:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PICTURE&#160;[&#160;CIRCLE&#160;20&#160;POSITION&#160;[-100,&#160;100]&#160;CIRCLE&#160;20&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Loops</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">REPEAT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;REPEAT&#160;number&#160;[&#160;commands&#160;]<br/>&#160;<br/>&#160;REPEAT&#160;10&#160;[&#160;FORWARD&#160;10&#160;LEFT&#160;45&#160;CIRCLE&#160;10&#160;] ;&#160;repeat&#160;10&#160;times<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;number&#160;is&#160;optional<br/>&#160;<br/>&#160;REPEAT&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">REPCOUNT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Loop variable (also in the FOR and WHILE loops).</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;REPEAT&#160;100&#160;[&#160;FORWARD&#160;REPCOUNT&#160;LEFT&#160;90&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FOR IN</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Loop for the list elements:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FOR&#160;i&#160;IN&#160;[1,&#160;5,&#160;7,&#160;9,&#160;11]&#160;[<br/>&#160;&#160;&#160;FORWARD&#160;i<br/>&#160;&#160;&#160;LEFT&#160;90<br/>&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Loop for the characters of a character sequence:</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;FOR&#160;i&#160;IN&#160;“text”&#160;[<br/>&#160;&#160;&#160;LABEL&#160;i<br/>&#160;&#160;&#160;FORWARD&#160;10<br/>&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">WHILE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;WHILE&#160;TRUE&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/>&#160;WHILE&#160;REPCOUNT&#160;&lt;=&#160;10&#160;[&#160;FORWARD&#160;50&#160;LEFT&#160;36&#160;] ;&#160;as&#160;REPEAT&#160;10&#160;[&#160;...&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">BREAK</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Stop the loop.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;REPEAT&#160;[ ;&#160;endless&#160;loop<br/>&#160;&#160;&#160;POSITION&#160;ANY<br/>&#160;&#160;&#160;IF&#160;REPCOUNT&#160;=&#160;100&#160;[&#160;BREAK&#160;]&#160;&#160;;&#160;equivalent&#160;of&#160;the&#160;REPEAT&#160;100&#160;[&#160;...&#160;]<br/>&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">CONTINUE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Jump into the next iteration of the loop.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;REPEAT&#160;100&#160;[<br/>&#160;&#160;&#160;POSITION&#160;ANY<br/>&#160;&#160;&#160;IF&#160;REPCOUNT&#160;%&#160;2&#160;&lt;>&#160;0&#160;[&#160;CONTINUE&#160;]<br/>&#160;&#160;&#160;CIRCLE&#160;10 ;&#160;draw&#160;circles&#160;on&#160;every&#160;2nd&#160;positions<br/>&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Conditions</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">IF</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;IF&#160;condition&#160;[&#160;true&#160;block&#160;]<br/>&#160;;&#160;IF&#160;condition&#160;[&#160;true&#160;block&#160;]&#160;[&#160;false&#160;block&#160;]<br/>&#160;<br/>&#160;IF&#160;a&#160;&lt;&#160;10&#160;[&#160;PRINT&#160;“Small”&#160;]<br/>&#160;IF&#160;a&#160;&lt;&#160;10&#160;[&#160;PRINT&#160;“Small”&#160;]&#160;[&#160;PRINT&#160;“Big”&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">AND, OR, NOT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Logical operators.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;IF&#160;a&#160;&lt;&#160;10&#160;AND&#160;NOT&#160;a&#160;&lt;&#160;5&#160;[&#160;PRINT&#160;“5,&#160;6,&#160;7,&#160;8&#160;or&#160;9”&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Subroutines</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">TO, END</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">New word (or procedure).</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;triangle<br/>&#160;&#160;&#160;REPEAT&#160;[&#160;FORWARD&#160;100&#160;RIGHT&#160;120&#160;]&#160;FILL<br/>&#160;END<br/>&#160;<br/>&#160;REPEAT&#160;10&#160;[&#160;triangle&#160;PENUP&#160;POSITION&#160;ANY&#160;PENDOWN&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">OUTPUT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Return value of the function.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;randomletter<br/>&#160;&#160;&#160;OUTPUT&#160;RANDOM&#160;“qwertzuiopasdfghjklyxcvbnm”<br/>&#160;END<br/>&#160;<br/>&#160;PRINT&#160;randomletter&#160;+&#160;randomletter&#160;+&#160;randomletter ;&#160;print&#160;3-letter&#160;random&#160;character&#160;sequence<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">STOP</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Return from the procedure.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;TO&#160;example&#160;number<br/>&#160;&#160;&#160;IF&#160;number&#160;&lt;&#160;0&#160;[&#160;STOP&#160;]<br/>&#160;&#160;&#160;PRINT&#160;SQRT&#160;number ;&#160;print&#160;square&#160;root<br/>&#160;]<br/>&#160;<br/>&#160;example&#160;100<br/>&#160;example&#160;-1 ;&#160;without&#160;output&#160;and&#160;error<br/>&#160;example&#160;25<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Default variables</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">ANY</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Default random value of colors, etc.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENCOLOR&#160;ANY ;&#160;random&#160;pen&#160;color<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">TRUE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Logical value.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;WHILE&#160;TRUE&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/>&#160;PRINT&#160;TRUE ;&#160;print&#160;true<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FALSE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Logical value.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;WHILE&#160;NOT&#160;FALSE&#160;[&#160;POSITION&#160;ANY&#160;] ;&#160;endless&#160;loop<br/>&#160;PRINT&#160;FALSE ;&#160;print&#160;false<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PAGESIZE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;PAGESIZE ;&#160;print&#160;list&#160;of&#160;the&#160;page&#160;sizes&#160;in&#160;points,&#160;eg.&#160;[595.30,&#160;841.89]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PI/π</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;PI ;&#160;print&#160;3.14159265359<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Input/Output</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">PRINT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;“text” ;&#160;print&#160;“text”&#160;in&#160;a&#160;dialog&#160;box<br/>&#160;PRINT&#160;5&#160;+&#160;10 ;&#160;print&#160;15<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">INPUT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;INPUT&#160;“Input&#160;value?” ;&#160;ask&#160;and&#160;print&#160;a&#160;string&#160;by&#160;a&#160;query&#160;dialog&#160;box<br/>&#160;PRINT&#160;FLOAT&#160;(INPUT&#160;“First&#160;number?”)&#160;+&#160;FLOAT&#160;(INPUT&#160;“Second&#160;number?”)&#160;;&#160;simple&#160;calculator<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">SLEEP</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;SLEEP&#160;1000 ;&#160;wait&#160;for&#160;1000&#160;ms&#160;(1&#160;sec)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">GLOBAL</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Set global variables used in procedures.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;GLOBAL&#160;about<br/>&#160;about&#160;=&#160;“LibreLogo”<br/>&#160;<br/>&#160;TO&#160;example<br/>&#160;&#160;&#160;PRINT&#160;about<br/>&#160;&#160;&#160;GLOBAL&#160;about ;&#160;when&#160;we&#160;want&#160;to&#160;add&#160;a&#160;new&#160;value<br/>&#160;&#160;&#160;about&#160;=&#160;“new&#160;value&#160;for&#160;the&#160;global&#160;variable”<br/>&#160;END<br/>&#160;<br/>&#160;example<br/>&#160;PRINT&#160;about<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Functions</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">RANDOM</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;RANDOM&#160;100 ;&#160;random&#160;float&#160;number&#160;(0&#160;&lt;=&#160;x&#160;&lt;&#160;100)<br/>&#160;PRINT&#160;RANDOM&#160;“text” ;&#160;random&#160;letter&#160;of&#160;the&#160;“text”<br/>&#160;PRINT&#160;RANDOM&#160;[1,&#160;2] ;&#160;random&#160;list&#160;element&#160;(1&#160;or&#160;2)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">INT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;INT&#160;3.8 ;&#160;print&#160;3&#160;(integer&#160;part&#160;of&#160;3.8)<br/>&#160;PRINT&#160;INT&#160;RANDOM&#160;100 ;&#160;random&#160;integer&#160;number&#160;(0&#160;&lt;=&#160;x&#160;&lt;&#160;100)<br/>&#160;PRINT&#160;INT&#160;“7” ;&#160;convert&#160;the&#160;string&#160;parameter&#160;to&#160;integer<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FLOAT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;convert&#160;the&#160;string&#160;parameter&#160;to&#160;float&#160;number<br/>&#160;PRINT&#160;2&#160;*&#160;FLOAT&#160;“5.5” ;&#160;print&#160;11.0<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">STR</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;convert&#160;the&#160;number&#160;parameter&#160;to&#160;string<br/>&#160;PRINT&#160;“Result:&#160;”&#160;+&#160;STR&#160;5 ;&#160;print&#160;“Result:&#160;5”<br/>&#160;PRINT&#160;10&#160;*&#160;STR&#160;5 ;&#160;print&#160;5555555555<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SQRT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;SQRT&#160;100 ;&#160;print&#160;10,&#160;square&#160;root&#160;of&#160;100<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SIN</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;SIN&#160;90&#160;*&#160;PI/180 ;&#160;print&#160;1.0&#160;(sinus&#160;of&#160;90°&#160;in&#160;radians)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">COS</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;COS&#160;0&#160;*&#160;PI/180 ;&#160;print&#160;1.0&#160;(sinus&#160;of&#160;0°&#160;in&#160;radians)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">ROUND</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;ROUND&#160;3.8 ;&#160;print&#160;4&#160;(rounding&#160;3.8)<br/>&#160;PRINT&#160;ROUND&#160;RANDOM&#160;100 ;&#160;random&#160;integer&#160;number&#160;(0&#160;&lt;=&#160;x&#160;&lt;=&#160;100)<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">ABS</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;ABS&#160;-10 ;&#160;print&#160;10,&#160;absolute&#160;value&#160;of&#160;-10<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">COUNT</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;COUNT&#160;“text” ;&#160;print&#160;4,&#160;character&#160;count&#160;of&#160;“text”<br/>&#160;PRINT&#160;COUNT&#160;[1,&#160;2,&#160;3] ;&#160;print&#160;3,&#160;size&#160;of&#160;the&#160;list<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SET</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;Convert&#160;list&#160;to&#160;Python&#160;set<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6] ;&#160;print&#160;{4,&#160;5,&#160;6}<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6]&#160;|&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{1,&#160;4,&#160;5,&#160;6,&#160;9},&#160;union<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6]&#160;&amp;&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{4},&#160;intersection<br/>&#160;PRINT&#160;SET&#160;([4,&#160;5,&#160;6,&#160;6])&#160;-&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{5,&#160;6},&#160;difference<br/>&#160;PRINT&#160;SET&#160;[4,&#160;5,&#160;6,&#160;6]&#160;^&#160;SET&#160;[4,&#160;1,&#160;9] ;&#160;print&#160;{1,&#160;5,&#160;6,&#160;9},&#160;symmetric&#160;difference&#160;&#160;<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">RANGE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;Python-like&#160;list&#160;generation<br/>&#160;PRINT&#160;RANGE&#160;10 ;&#160;print&#160;[0,&#160;1,&#160;2,&#160;3,&#160;4,&#160;5,&#160;6,&#160;7,&#160;8,&#160;9]<br/>&#160;PRINT&#160;RANGE&#160;3&#160;10 ;&#160;print&#160;[3,&#160;4,&#160;5,&#160;6,&#160;7,&#160;8,&#160;9]<br/>&#160;PRINT&#160;RANGE&#160;3&#160;10&#160;3 ;&#160;print&#160;[3,&#160;6,&#160;9]<br/>&#160;<br/>&#160;FOR&#160;i&#160;in&#160;RANGE&#160;10&#160;50&#160;10&#160;[ ;&#160;loop&#160;for&#160;[10,&#160;20,&#160;30,&#160;40]<br/>&#160;&#160;&#160;FORWARD&#160;i<br/>&#160;&#160;&#160;LEFT&#160;90<br/>&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">LIST</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;;&#160;remove&#160;the&#160;repeating&#160;elements&#160;of&#160;a&#160;list&#160;using&#160;set&#160;and&#160;list&#160;conversion<br/>&#160;PRINT&#160;LIST&#160;(SET&#160;[1,&#160;3,&#160;5,&#160;5,&#160;2,&#160;1]) ;&#160;print&#160;[1,&#160;3,&#160;5,&#160;2]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">TUPLE</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Conversion to Python tuple (non-modifiable list)</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;TUPLE&#160;[4,&#160;5]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SORTED</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">It returns with a sorted list.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;SORTED&#160;[5,&#160;1,&#160;3,&#160;4] ;&#160;print&#160;[1,&#160;3,&#160;4,&#160;5]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SUB</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Substitue character sequences using regex (regular expression) patterns.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;SUB&#160;(“t”,&#160;“T”,&#160;“text”) ;&#160;print&#160;“Text”,&#160;replacing&#160;“t”&#160;with&#160;“T”<br/>&#160;PRINT&#160;SUB&#160;(“(.)”,&#160;“\\1\\1”,&#160;“text”)&#160;;&#160;print&#160;“tteexxtt”,&#160;doubling&#160;every&#160;characters<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">SEARCH</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Search character sequences patterns using regex patterns.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;IF&#160;SEARCH&#160;(“\w”,&#160;word)&#160;[&#160;PRINT&#160;“Letter&#160;in&#160;the&#160;word.”&#160;]<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">FINDALL</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="paragraph">Find all character sequences in the input string matching the given regex pattern.</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;FINDALL(“\w+”,&#160;“Dogs,&#160;cats.”) ;&#160;print&#160;[“Dogs”,&#160;“cats”],&#160;the&#160;list&#160;of&#160;the&#160;words.<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">MIN</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;MIN&#160;[1,&#160;2,&#160;3] ;&#160;print&#160;1,&#160;the&#160;lowest&#160;element&#160;of&#160;the&#160;list<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="3">MAX</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PRINT&#160;MAX&#160;[1,&#160;2,&#160;3] ;&#160;print&#160;3,&#160;the&#160;greatest&#160;element&#160;of&#160;the&#160;list<br/></paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="heading" level="2">Color constants</paragraph>
+<paragraph role="paragraph"></paragraph>
+<paragraph role="code">&#160;PENCOLOR&#160;“SILVER” ;&#160;set&#160;by&#160;name<br/>&#160;PENCOLOR&#160;[1] ;&#160;set&#160;by&#160;identifiers<br/>&#160;PENCOLOR&#160;“~SILVER” ;&#160;random&#160;silver&#160;color<br/>&#160;<br/></paragraph>
+<table><tablerow>
+<tablecell>Identifier</tablecell>
+<tablecell>Name</tablecell>
+</tablerow><tablerow>
+<tablecell>0</tablecell>
+<tablecell>BLACK</tablecell>
+</tablerow><tablerow>
+<tablecell>1</tablecell>
+<tablecell>SILVER</tablecell>
+</tablerow><tablerow>
+<tablecell>2</tablecell>
+<tablecell>GRAY/GREY</tablecell>
+</tablerow><tablerow>
+<tablecell>3</tablecell>
+<tablecell>WHITE</tablecell>
+</tablerow><tablerow>
+<tablecell>4</tablecell>
+<tablecell>MAROON</tablecell>
+</tablerow><tablerow>
+<tablecell>5</tablecell>
+<tablecell>RED</tablecell>
+</tablerow><tablerow>
+<tablecell>6</tablecell>
+<tablecell>PURPLE</tablecell>
+</tablerow><tablerow>
+<tablecell>7</tablecell>
+<tablecell>FUCHSIA/MAGENTA</tablecell>
+</tablerow><tablerow>
+<tablecell>8</tablecell>
+<tablecell>GREEN</tablecell>
+</tablerow><tablerow>
+<tablecell>9</tablecell>
+<tablecell>LIME</tablecell>
+</tablerow><tablerow>
+<tablecell>10</tablecell>
+<tablecell>OLIVE</tablecell>
+</tablerow><tablerow>
+<tablecell>11</tablecell>
+<tablecell>YELLOW</tablecell>
+</tablerow><tablerow>
+<tablecell>12</tablecell>
+<tablecell>NAVY</tablecell>
+</tablerow><tablerow>
+<tablecell>13</tablecell>
+<tablecell>BLUE</tablecell>
+</tablerow><tablerow>
+<tablecell>14</tablecell>
+<tablecell>TEAL</tablecell>
+</tablerow><tablerow>
+<tablecell>15</tablecell>
+<tablecell>AQUA</tablecell>
+</tablerow><tablerow>
+<tablecell>16</tablecell>
+<tablecell>PINK</tablecell>
+</tablerow><tablerow>
+<tablecell>17</tablecell>
+<tablecell>TOMATO</tablecell>
+</tablerow><tablerow>
+<tablecell>18</tablecell>
+<tablecell>ORANGE</tablecell>
+</tablerow><tablerow>
+<tablecell>19</tablecell>
+<tablecell>GOLD</tablecell>
+</tablerow><tablerow>
+<tablecell>20</tablecell>
+<tablecell>VIOLET</tablecell>
+</tablerow><tablerow>
+<tablecell>21</tablecell>
+<tablecell>SKYBLUE</tablecell>
+</tablerow><tablerow>
+<tablecell>22</tablecell>
+<tablecell>CHOCOLATE</tablecell>
+</tablerow><tablerow>
+<tablecell>23</tablecell>
+<tablecell>BROWN</tablecell>
+</tablerow><tablerow>
+<tablecell>24</tablecell>
+<tablecell>INVISIBLE</tablecell>
+</tablerow></table>
+</body></helpdocument>
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&amp;onum=1” ; small caps + old figures
+
+=== FONTSIZE ===
+
+ FONTSIZE 12 ; set 12pt
+
+=== FONTWEIGHT ===
+
+ FONTWEIGHT “bold” ; set bold font
+ FONTWEIGHT “normal” ; set normal weight
+
+=== FONTSTYLE ===
+
+ FONTSTYLE “italic” ; set italic variant
+ FONTSTYLE “normal” ; set normal variant
+
+== PICTURE (pic) ==
+
+PICTURE is for
+* shape grouping;
+* starting new line shapes;
+* keeping the consistency of positions and line shapes at the left border.
+
+=== Shape grouping ===
+
+ ; PICTURE [ LibreLogo_commands ]
+ PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped shape
+
+See also “Group” in LibreOffice Writer Help.
+
+ TO tree location
+ PENUP POSITION location HEADING 0 PENDOWN
+ PICTURE [ FORWARD 100 CIRCLE 100 ] ; tree-like grouped shape
+ END
+
+ PICTURE [ tree [30, 50] tree [100, 50] ] ; grouped shapes in a grouped shape
+
+=== Starting new line shapes ===
+
+ PICTURE ; start a new line shape
+ FORWARD 10 PICTURE FORWARD 10 ; two line shapes
+
+=== Consistency at the left border ===
+
+Use picture to keep the consistency of positions and line shapes at the left border of Writer:
+
+ PICTURE [ CIRCLE 20 POSITION [-100, 100] CIRCLE 20 ]
+
+== Loops ==
+
+=== REPEAT ===
+
+ ; REPEAT number [ commands ]
+
+ REPEAT 10 [ FORWARD 10 LEFT 45 CIRCLE 10 ] ; repeat 10 times
+
+ ; number is optional
+
+ REPEAT [ POSITION ANY ] ; endless loop
+
+=== REPCOUNT ===
+
+Loop variable (also in the FOR and WHILE loops).
+
+ REPEAT 100 [ FORWARD REPCOUNT LEFT 90 ]
+
+=== FOR IN ===
+
+Loop for the list elements:
+
+ FOR i IN [1, 5, 7, 9, 11] [
+ FORWARD i
+ LEFT 90
+ ]
+
+Loop for the characters of a character sequence:
+
+ FOR i IN “text” [
+ LABEL i
+ FORWARD 10
+ ]
+
+=== WHILE ===
+
+ WHILE TRUE [ POSITION ANY ] ; endless loop
+ WHILE REPCOUNT &lt;= 10 [ FORWARD 50 LEFT 36 ] ; as REPEAT 10 [ ... ]
+
+=== BREAK ===
+
+Stop the loop.
+
+ REPEAT [ ; endless loop
+ POSITION ANY
+ IF REPCOUNT = 100 [ BREAK ] ; equivalent of the REPEAT 100 [ ... ]
+ ]
+
+=== CONTINUE ===
+
+Jump into the next iteration of the loop.
+
+ REPEAT 100 [
+ POSITION ANY
+ IF REPCOUNT % 2 &lt;> 0 [ CONTINUE ]
+ CIRCLE 10 ; draw circles on every 2nd positions
+ ]
+
+== Conditions ==
+
+=== IF ===
+
+ ; IF condition [ true block ]
+ ; IF condition [ true block ] [ false block ]
+
+ IF a &lt; 10 [ PRINT “Small” ]
+ IF a &lt; 10 [ PRINT “Small” ] [ PRINT “Big” ]
+
+=== AND, OR, NOT ===
+
+Logical operators.
+
+ IF a &lt; 10 AND NOT a &lt; 5 [ PRINT “5, 6, 7, 8 or 9” ]
+
+== Subroutines ==
+
+=== TO, END ===
+
+New word (or procedure).
+
+ TO triangle
+ REPEAT [ FORWARD 100 RIGHT 120 ] FILL
+ END
+
+ REPEAT 10 [ triangle PENUP POSITION ANY PENDOWN ]
+
+=== OUTPUT ===
+
+Return value of the function.
+
+ TO randomletter
+ OUTPUT RANDOM “qwertzuiopasdfghjklyxcvbnm”
+ END
+
+ PRINT randomletter + randomletter + randomletter ; print 3-letter random character sequence
+
+=== STOP ===
+
+Return from the procedure.
+
+ TO example number
+ IF number &lt; 0 [ STOP ]
+ PRINT SQRT number ; print square root
+ ]
+
+ example 100
+ example -1 ; without output and error
+ example 25
+
+== Default variables ==
+
+=== ANY ===
+
+Default random value of colors, etc.
+
+ PENCOLOR ANY ; random pen color
+
+=== TRUE ===
+
+Logical value.
+
+ WHILE TRUE [ POSITION ANY ] ; endless loop
+ PRINT TRUE ; print true
+
+=== FALSE ===
+
+Logical value.
+
+ WHILE NOT FALSE [ POSITION ANY ] ; endless loop
+ PRINT FALSE ; print false
+
+=== PAGESIZE ===
+
+ PRINT PAGESIZE ; print list of the page sizes in points, eg. [595.30, 841.89]
+
+=== PI/π ===
+
+ PRINT PI ; print 3.14159265359
+
+== Input/Output ==
+
+=== PRINT ===
+
+ PRINT “text” ; print “text” in a dialog box
+ PRINT 5 + 10 ; print 15
+
+=== INPUT ===
+
+ PRINT INPUT “Input value?” ; ask and print a string by a query dialog box
+ PRINT FLOAT (INPUT “First number?”) + FLOAT (INPUT “Second number?”) ; simple calculator
+
+== SLEEP ==
+
+ SLEEP 1000 ; wait for 1000 ms (1 sec)
+
+== GLOBAL ==
+
+Set global variables used in procedures.
+
+ GLOBAL about
+ about = “LibreLogo”
+
+ TO example
+ PRINT about
+ GLOBAL about ; when we want to add a new value
+ about = “new value for the global variable”
+ END
+
+ example
+ PRINT about
+
+== Functions ==
+
+=== RANDOM ===
+
+ PRINT RANDOM 100 ; random float number (0 &lt;= x &lt; 100)
+ PRINT RANDOM “text” ; random letter of the “text”
+ PRINT RANDOM [1, 2] ; random list element (1 or 2)
+
+=== INT ===
+
+ PRINT INT 3.8 ; print 3 (integer part of 3.8)
+ PRINT INT RANDOM 100 ; random integer number (0 &lt;= x &lt; 100)
+ PRINT INT “7” ; convert the string parameter to integer
+
+=== FLOAT ===
+
+ ; convert the string parameter to float number
+ PRINT 2 * FLOAT “5.5” ; print 11.0
+
+=== STR ===
+
+ ; convert the number parameter to string
+ PRINT “Result: ” + STR 5 ; print “Result: 5”
+ PRINT 10 * STR 5 ; print 5555555555
+
+=== SQRT ===
+
+ PRINT SQRT 100 ; print 10, square root of 100
+
+=== SIN ===
+
+ PRINT SIN 90 * PI/180 ; print 1.0 (sinus of 90° in radians)
+
+=== COS ===
+
+ PRINT COS 0 * PI/180 ; print 1.0 (sinus of 0° in radians)
+
+=== ROUND ===
+
+ PRINT ROUND 3.8 ; print 4 (rounding 3.8)
+ PRINT ROUND RANDOM 100 ; random integer number (0 &lt;= x &lt;= 100)
+
+=== ABS ===
+
+ PRINT ABS -10 ; print 10, absolute value of -10
+
+=== COUNT ===
+
+ PRINT COUNT “text” ; print 4, character count of “text”
+ PRINT COUNT [1, 2, 3] ; print 3, size of the list
+
+=== SET ===
+
+ ; Convert list to Python set
+ PRINT SET [4, 5, 6, 6] ; print {4, 5, 6}
+ PRINT SET [4, 5, 6, 6] | SET [4, 1, 9] ; print {1, 4, 5, 6, 9}, union
+ PRINT SET [4, 5, 6, 6] &amp; SET [4, 1, 9] ; print {4}, intersection
+ PRINT SET ([4, 5, 6, 6]) - SET [4, 1, 9] ; print {5, 6}, difference
+ PRINT SET [4, 5, 6, 6] ^ SET [4, 1, 9] ; print {1, 5, 6, 9}, symmetric difference
+
+=== RANGE ===
+
+ ; Python-like list generation
+ PRINT RANGE 10 ; print [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+ PRINT RANGE 3 10 ; print [3, 4, 5, 6, 7, 8, 9]
+ PRINT RANGE 3 10 3 ; print [3, 6, 9]
+
+ FOR i in RANGE 10 50 10 [ ; loop for [10, 20, 30, 40]
+ FORWARD i
+ LEFT 90
+ ]
+
+=== LIST ===
+
+ ; remove the repeating elements of a list using set and list conversion
+ PRINT LIST (SET [1, 3, 5, 5, 2, 1]) ; print [1, 3, 5, 2]
+
+=== TUPLE ===
+
+Conversion to Python tuple (non-modifiable list)
+
+ PRINT TUPLE [4, 5]
+
+=== SORTED ===
+
+It returns with a sorted list.
+
+ PRINT SORTED [5, 1, 3, 4] ; print [1, 3, 4, 5]
+
+=== SUB ===
+
+Substitue character sequences using regex (regular expression) patterns.
+
+ PRINT SUB (“t”, “T”, “text”) ; print “Text”, replacing “t” with “T”
+ PRINT SUB (“(.)”, “\\1\\1”, “text”) ; print “tteexxtt”, doubling every characters
+
+=== SEARCH ===
+
+Search character sequences patterns using regex patterns.
+
+ IF SEARCH (“\w”, word) [ PRINT “Letter in the word.” ]
+
+=== FINDALL ===
+
+Find all character sequences in the input string matching the given regex pattern.
+
+ PRINT FINDALL(“\w+”, “Dogs, cats.”) ; print [“Dogs”, “cats”], the list of the words.
+
+=== MIN ===
+
+ PRINT MIN [1, 2, 3] ; print 1, the lowest element of the list
+
+=== MAX ===
+
+ PRINT MAX [1, 2, 3] ; print 3, the greatest element of the list
+
+== Color constants ==
+
+ PENCOLOR “SILVER” ; set by name
+ PENCOLOR [1] ; set by identifiers
+ PENCOLOR “~SILVER” ; random silver color
+
+{|class="wikitable"
+|Identifier
+|Name
+|-
+|0
+|style="color: white; background-color: #000000;"|BLACK
+|-
+|1
+|style="color: black; background-color: #c0c0c0;"|SILVER
+|-
+|2
+|style="color: white; background-color: #808080;"|GRAY/GREY
+|-
+|3
+|style="color: black; background-color: #ffffff;"|WHITE
+|-
+|4
+|style="color: white; background-color: #800000;"|MAROON
+|-
+|5
+|style="color: white; background-color: #ff0000;"|RED
+|-
+|6
+|style="color: white; background-color: #800080;"|PURPLE
+|-
+|7
+|style="color: black; background-color: #f000f0;"|FUCHSIA/MAGENTA
+|-
+|8
+|style="color: white; background-color: #008000;"|GREEN
+|-
+|9
+|style="color: black; background-color: #00ff00;"|LIME
+|-
+|10
+|style="color: white; background-color: #808000;"|OLIVE
+|-
+|11
+|style="color: black; background-color: #ffff00;"|YELLOW
+|-
+|12
+|style="color: white; background-color: #000080;"|NAVY
+|-
+|13
+|style="color: white; background-color: #0000f0;"|BLUE
+|-
+|14
+|style="color: white; background-color: #008080;"|TEAL
+|-
+|15
+|style="color: black; background-color: #00ffff;"|AQUA
+|-
+|16
+|style="color: black; background-color: #ffc0cb;"|PINK
+|-
+|17
+|style="color: black; background-color: #ff6347;"|TOMATO
+|-
+|18
+|style="color: black; background-color: #ffa500;"|ORANGE
+|-
+|19
+|style="color: black; background-color: #ffd700;"|GOLD
+|-
+|20
+|style="color: black; background-color: #9400d3;"|VIOLET
+|-
+|21
+|style="color: black; background-color: #87ceeb;"|SKYBLUE
+|-
+|22
+|style="color: black; background-color: #d2691e;"|CHOCOLATE
+|-
+|23
+|style="color: black; background-color: #a52a2a;"|BROWN
+|-
+|24
+|style="color: black;"|INVISIBLE
+|}
+
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(" ", "\\&#160;", "g", code) "</paragraph>";code=""}}/^=+/{l=length($1);print "<paragraph role=\"heading\" level=\"" l "\">"substr($0, l+2, length($0)-l*2-2)"</paragraph>";next}/^[{][|]/{print "<table><tablerow>";next}/^[|]}/{print "</tablerow></table>";next}/^[|]-/{print "</tablerow><tablerow>";next}/^[|]/{print "<tablecell>"gensub("^.*[|]","","g")"</tablecell>";next}{print "<paragraph role=\"paragraph\">" $0 "</paragraph>" }END{print "</body></helpdocument>"}' >LibreLogo.xhp
+
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
new file mode 100644
index 000000000000..b7a5a9258ca7
--- /dev/null
+++ b/librelogo/icons/lc_arrowshapes.circular-arrow.png
Binary files differ
diff --git a/librelogo/icons/lc_arrowshapes.circular-leftarrow.png b/librelogo/icons/lc_arrowshapes.circular-leftarrow.png
new file mode 100644
index 000000000000..ad2197838ca7
--- /dev/null
+++ b/librelogo/icons/lc_arrowshapes.circular-leftarrow.png
Binary files differ
diff --git a/librelogo/icons/lc_arrowshapes.down-arrow.png b/librelogo/icons/lc_arrowshapes.down-arrow.png
new file mode 100644
index 000000000000..d3b81b9f6446
--- /dev/null
+++ b/librelogo/icons/lc_arrowshapes.down-arrow.png
Binary files differ
diff --git a/librelogo/icons/lc_arrowshapes.up-arrow.png b/librelogo/icons/lc_arrowshapes.up-arrow.png
new file mode 100644
index 000000000000..6ae84abe8376
--- /dev/null
+++ b/librelogo/icons/lc_arrowshapes.up-arrow.png
Binary files differ
diff --git a/librelogo/icons/lc_basicstop.png b/librelogo/icons/lc_basicstop.png
new file mode 100644
index 000000000000..ab9bddb4a98b
--- /dev/null
+++ b/librelogo/icons/lc_basicstop.png
Binary files differ
diff --git a/librelogo/icons/lc_editglossary.png b/librelogo/icons/lc_editglossary.png
new file mode 100644
index 000000000000..fcba68f1feb5
--- /dev/null
+++ b/librelogo/icons/lc_editglossary.png
Binary files differ
diff --git a/librelogo/icons/lc_navigationbarleft.png b/librelogo/icons/lc_navigationbarleft.png
new file mode 100644
index 000000000000..7e69c8045fbe
--- /dev/null
+++ b/librelogo/icons/lc_navigationbarleft.png
Binary files differ
diff --git a/librelogo/icons/lc_newdoc.png b/librelogo/icons/lc_newdoc.png
new file mode 100644
index 000000000000..8e18798acdb2
--- /dev/null
+++ b/librelogo/icons/lc_newdoc.png
Binary files differ
diff --git a/librelogo/icons/lc_runbasic.png b/librelogo/icons/lc_runbasic.png
new file mode 100644
index 000000000000..da2d9d97badf
--- /dev/null
+++ b/librelogo/icons/lc_runbasic.png
Binary files differ
diff --git a/librelogo/icons/sc_arrowshapes.circular-arrow.png b/librelogo/icons/sc_arrowshapes.circular-arrow.png
new file mode 100644
index 000000000000..35a5e9719607
--- /dev/null
+++ b/librelogo/icons/sc_arrowshapes.circular-arrow.png
Binary files differ
diff --git a/librelogo/icons/sc_arrowshapes.circular-leftarrow.png b/librelogo/icons/sc_arrowshapes.circular-leftarrow.png
new file mode 100644
index 000000000000..62eeee65fba4
--- /dev/null
+++ b/librelogo/icons/sc_arrowshapes.circular-leftarrow.png
Binary files differ
diff --git a/librelogo/icons/sc_arrowshapes.down-arrow.png b/librelogo/icons/sc_arrowshapes.down-arrow.png
new file mode 100644
index 000000000000..7290cae2f1c4
--- /dev/null
+++ b/librelogo/icons/sc_arrowshapes.down-arrow.png
Binary files differ
diff --git a/librelogo/icons/sc_arrowshapes.up-arrow.png b/librelogo/icons/sc_arrowshapes.up-arrow.png
new file mode 100644
index 000000000000..5f9bcc197f81
--- /dev/null
+++ b/librelogo/icons/sc_arrowshapes.up-arrow.png
Binary files differ
diff --git a/librelogo/icons/sc_basicstop.png b/librelogo/icons/sc_basicstop.png
new file mode 100644
index 000000000000..1c6ff922a786
--- /dev/null
+++ b/librelogo/icons/sc_basicstop.png
Binary files differ
diff --git a/librelogo/icons/sc_editglossary.png b/librelogo/icons/sc_editglossary.png
new file mode 100644
index 000000000000..4e14c031a4ae
--- /dev/null
+++ b/librelogo/icons/sc_editglossary.png
Binary files differ
diff --git a/librelogo/icons/sc_navigationbarleft.png b/librelogo/icons/sc_navigationbarleft.png
new file mode 100644
index 000000000000..e544a7581f33
--- /dev/null
+++ b/librelogo/icons/sc_navigationbarleft.png
Binary files differ
diff --git a/librelogo/icons/sc_newdoc.png b/librelogo/icons/sc_newdoc.png
new file mode 100644
index 000000000000..e914775a2693
--- /dev/null
+++ b/librelogo/icons/sc_newdoc.png
Binary files differ
diff --git a/librelogo/icons/sc_runbasic.png b/librelogo/icons/sc_runbasic.png
new file mode 100644
index 000000000000..8dd695c1e767
--- /dev/null
+++ b/librelogo/icons/sc_runbasic.png
Binary files differ
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")