summaryrefslogtreecommitdiff
path: root/librelogo
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2014-03-18 11:49:57 +0100
committerLászló Németh <nemeth@numbertext.org>2014-03-18 11:54:59 +0100
commitc1bfac2c4643869ded140828aceaaf9a9d0e5ee0 (patch)
tree00b5134f79c02c3bdc1c958a7bdaf0f95d58faac /librelogo
parent8c52b5dd1c6457131b2c2c6b85222400fce3f246 (diff)
librelogo UI fixes, gradients, log10, improved random colors
Change-Id: I7ef59f9ce589ab0d68b02c1b2ba61c061f9c51ae
Diffstat (limited to 'librelogo')
-rw-r--r--librelogo/source/ChangeLog45
-rw-r--r--librelogo/source/LibreLogo/LibreLogo.py141
-rw-r--r--librelogo/source/pythonpath/LibreLogo_en_US.properties3
3 files changed, 161 insertions, 28 deletions
diff --git a/librelogo/source/ChangeLog b/librelogo/source/ChangeLog
index 0e1ed446c288..8deb072e2d55 100644
--- a/librelogo/source/ChangeLog
+++ b/librelogo/source/ChangeLog
@@ -1,3 +1,48 @@
+2014-03-18 László Németh:
+ * Start icon inserts and starts a simple localized demo program in an empty
+ document (UI fix for the missing feedback)
+ * LOG10 function
+ * PENTRANSPARENCY, FILLTRANSPARENCY: set transparency of the actual color:
+ - PENTRANSPARENCY 50 ; 50% transparency of the lines
+ - FILLTRANSPARENCY 20 ; 20% transparency of the areas
+ * fill gradient support
+ - FILLCOLOR ['red', 'blue'] ; gradient between red and blue
+ - FILLCOLOR [[255, 255, 255], [255, 128, 0]] ; between white and orange
+ - FILLCOLOR ['red', 'blue', 0, 90, 20] ; linear, 90deg gradient with 20% border
+ - FILLCOLOR ['red', 'blue', 0, 90, 20, 0, 0, 200, 50] ; from 200% to 50% intensity
+ - FILLCOLOR ['red', 'blue', 2, 0, 0, 50, 50] ; radial, with 50-50% x, y (centre)
+ * transparency gradient support (similar settings, without intensity values)
+ - FILLTRANSPARENCY [75] ; linear gradient from 75% to 0% transparency
+ - FILLTRANSPARENCY [75, 25] ; linear gradient from 75% to 25% transparency
+ - FILLTRANSPARENCY [75, 25, 2, 0, 20, 50, 50] ; radial with 20% border, 50-50% x, y
+ * normalized random colors for the visible spectrum (check FILLCOLOR ANY)
+ * magic icon sets also page zoom + page break for 2-page program editing
+ * fix multiple document handling using OfficeDocument.RuntimeUID
+ instead of Document.Title:
+ - "Saving as" doesn't create a new turtle
+ - use current doc. instead of old ones (eg. new Untitled 1 instead of the renamed one)
+ * change icon order: magic icon before input bar for better undocked Logo
+ toolbar (two-line, instead of three-line), suggested by Gilvan Vilarim
+ * keep turtle selection instead of the bad text selection at the end of the run
+ * support capitalized color names in the translations (fix Slovak translation)
+
+2014-02-04 László Németh:
+ * avoid to translate comments: http://bug.openscope.org/browse/OOO-837,
+ reported by Levente Kovács
+
+2014-01-07 László Németh:
+ * fix messagebox (API changes)
+
+2014-01-01 László Németh:
+ * path, interop. and color name fixes
+
+2013-10-28: László Németh
+ * fix parsing problem of functions
+
+2013-10-25:
+ * fix Logo program halt at font settings (Windows)
+ * fix division with measurements
+
2013-10-24 László Németh:
* synchronize Writer/Draw when saving cropped SVG to avoid program halt,
huge sleeps (the workaround) have been removed
diff --git a/librelogo/source/LibreLogo/LibreLogo.py b/librelogo/source/LibreLogo/LibreLogo.py
index c1a35b1f9dbd..665ec74df83f 100644
--- a/librelogo/source/LibreLogo/LibreLogo.py
+++ b/librelogo/source/LibreLogo/LibreLogo.py
@@ -48,6 +48,10 @@ __COLORS__ = ['BLACK', 0x000000], ['SILVER', 0xc0c0c0], ['GRAY', 0x808080], \
['ORANGE', 0xffa500], ['GOLD', 0xffd700], ['VIOLET', 0x9400d3], \
['SKYBLUE', 0x87ceeb], ['CHOCOLATE', 0xd2691e], ['BROWN', 0xa52a2a], \
['INVISIBLE', 0xffffffff]
+__NORMCOLORS__ = [[[255, 255, 0], 0, -11, 1, -11],
+ [[255, 128, 0], 1, 116, 1, -33], [[255, 0, 0], 1, 95, 2, 42],
+ [[255, 0, 255], 2, -213, 0, -106], [[0, 0, 255], 0, 148, 1, 127],
+ [[0, 255, 255], 1, -128, 2, -63], [[0, 255, 0], 2, 192, 0, 244]]
__STRCONST__ = [i[0] for i in __COLORS__] + ['NONE', 'BEVEL', 'MITER', 'ROUNDED', 'SOLID', 'DASH', 'DOTTED', 'BOLD', 'ITALIC', 'UPRIGHT', 'NORMAL', "HOUR", "PT", "INCH", "MM", "CM"]
__SLEEP_SLICE_IN_MILLISECONDS__ = 500
__PT_TO_TWIP__ = 20
@@ -91,6 +95,7 @@ class __Doc__:
self.oldlj = __ROUNDED__
self.continuous = True
self.areacolor = __FILLCOLOR__
+ self.t10y = int((__FILLCOLOR__ >> 24) / (255.0/100))
self.hatch = None
self.textcolor = 0
self.fontfamily = __BASEFONTFAMILY__
@@ -98,9 +103,11 @@ class __Doc__:
self.fontweight = 100
self.fontstyle = 0
-from math import pi, sin, cos, asin, sqrt
+from math import pi, sin, cos, asin, sqrt, log10
from com.sun.star.awt import Point as __Point__
+from com.sun.star.awt import Gradient as __Gradient__
+from com.sun.star.awt.GradientStyle import LINEAR as __GradientStyle_LINEAR__
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__
@@ -114,6 +121,7 @@ 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.FillStyle import NONE as __FillStyle_NONE__
+from com.sun.star.drawing.FillStyle import GRADIENT as __FillStyle_GRADIENT__
from com.sun.star.drawing.LineStyle import NONE as __LineStyle_NONE__
from com.sun.star.drawing.LineStyle import SOLID as __LineStyle_SOLID__
from com.sun.star.drawing.LineStyle import DASH as __LineStyle_DASHED__
@@ -174,11 +182,10 @@ 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")?
+ _ = __docs__[doc.RuntimeUID]
except:
_ = __Doc__(doc)
- __docs__[doc.Title] = _
+ __docs__[doc.RuntimeUID] = _
# input function, result: input string or 0
def Input(s):
@@ -306,20 +313,22 @@ def __locname__(name, l = -1):
return to_unicode(name)
def __getcursor__(fulltext):
+ realselection = False
try:
text = _.doc.getCurrentController().getViewCursor().getText().createTextCursor() # copy selection (also in frames)
text.gotoRange(_.doc.getCurrentController().getViewCursor(), False)
if fulltext:
1/len(text.getString()) # exception, if zero length
+ realselection = True
except:
text = _.doc.getText().createTextCursorByRange(_.doc.getText().getStart())
text.gotoEnd(True)
- return text
+ return text, realselection
def __translate__(arg = None):
global _
__getdocument__()
- selection = __getcursor__(True)
+ selection = __getcursor__(True)[0]
__initialize__()
__setlang__()
# detect language
@@ -374,11 +383,20 @@ def __translate__(arg = None):
for i in __STRCONST__:
text = re.sub(quoted % lang[i], __l12n__(_.lng)[i].split("|")[0].upper(), text)
text = re.sub(__DECODE_COMMENT_REGEX__, __decodecomment__, text)
- selection.setString(text)
+ if _.doc.getText().compareRegionStarts(selection.getStart(), _.doc.getText().getStart()) == 0:
+ pagebreak = True
+ selection.setString("\n" + text.lstrip("\n"))
+ else:
+ pagebreak = False
+ selection.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), \
__getprop__("SearchItem.AlgorithmType", 1), __getprop__("SearchItem.RowDirection", 1), __getprop__("SearchItem.SearchFlags", 65536)))
+ # set 2-page layout
+ if pagebreak:
+ selection.getStart().BreakType = 4
+ __dispatcher__(".uno:ZoomPage")
class LogoProgram(threading.Thread):
def __init__(self, code):
@@ -389,12 +407,12 @@ class LogoProgram(threading.Thread):
global __thread__
try:
exec(self.code)
- if _.origcursor:
+ if _.origcursor[0] and _.origcursor[1]:
__dispatcher__(".uno:Escape")
try:
- _.doc.CurrentController.getViewCursor().gotoRange(_.origcursor, False)
+ _.doc.CurrentController.getViewCursor().gotoRange(_.origcursor[0], False)
except:
- _.doc.CurrentController.getViewCursor().gotoRange(_.origcursor.getStart(), False)
+ _.doc.CurrentController.getViewCursor().gotoRange(_.origcursor[0].getStart(), False)
except Exception as e:
try:
TRACEPATTERN = '"<string>", line '
@@ -473,7 +491,7 @@ def __initialize__():
_.initialize()
turtlehome()
_.doc.CurrentController.select(shape)
- shape.FillColor, transparence = __splitcolor__(_.areacolor)
+ shape.FillColor, transparence = __splitcolor__(_.areacolor, shape)
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
elif shape.Visible:
if shape.FillStyle == __FillStyle_NONE__:
@@ -490,7 +508,7 @@ def __initialize__():
_.pencolor = shape.LineColor + (int(255.0 * shape.LineTransparence/100) << 24)
shape.LineJoint = __ROUNDED__
shape.Shadow = True
- shape.FillColor, transparence = __splitcolor__(_.areacolor)
+ shape.FillColor, transparence = __splitcolor__(_.areacolor, shape)
shape.FillTransparence = min(95, transparence)
shape.ShadowColor, shape.ShadowTransparence, shape.ShadowXDistance, shape.ShadowYDistance = (0, 20, 0, 0)
shape.LineWidth = min(_.pensize, (1 + _.pen * 2) * __PT_TO_TWIP__) / __MM10_TO_TWIP__
@@ -634,9 +652,9 @@ def run(arg=None, arg2 = -1):
__thread__ = 1
try:
__getdocument__()
- _.origcursor = None
+ _.origcursor = [None, None]
if arg2 == -1:
- _.origcursor, _.cursor = __getcursor__(False), __getcursor__(True)
+ _.origcursor, _.cursor = __getcursor__(False), __getcursor__(True)[0]
__dispatcher__(".uno:Escape")
c = _.doc.Text.createTextCursor() # go to the first page
c.gotoStart(False)
@@ -649,6 +667,11 @@ def run(arg=None, arg2 = -1):
with __lock__:
__thread__ = None
return None
+ elif len(arg2) == 0 and _.origcursor[1]:
+ _.origcursor[0].setString("fontcolor 'green'\nlabel 'LIBRE'\npu\nback 30\npic [\n\tfc any\n\tcircle 40\n\tfontcolor 'black'\n\tlabel 'LOGO'\n\tleft 180\n\tfd 20\n\tpd\n\tpc any\n\tps 1\n\tfd 40\n\trepeat 20 [\n\t\tfd repcount*2\n\t\trt 90\n\t]\n]\npu pos any pd")
+ __translate__()
+ _.origcursor, _.cursor = __getcursor__(False), __getcursor__(True)[0]
+ arg2 = _.cursor.getString()
else:
__initialize__()
__setlang__()
@@ -706,6 +729,9 @@ def clearscreen(arg=None):
if not turtle:
__initialize__()
if not __halt__:
+ # avoid unintentional image deletion in large documents
+ if len(__getcursor__(True)[0].getString()) < 5000:
+ __cs__(False)
return
__cs__(False)
__dispatcher__(".uno:Escape")
@@ -949,12 +975,12 @@ def __fillit__(filled = True):
shape.LineCap = _.linecap
shape.LineWidth = _.pensize / __MM10_TO_TWIP__
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
- shape.FillColor, shape.FillTransparence = __splitcolor__(_.areacolor)
+ shape.FillColor, shape.FillTransparence = __splitcolor__(_.areacolor, shape)
if _.hatch:
shape.FillBackground = True if shape.FillTransparence != 100 else False
shape.FillHatch = _.hatch
shape.FillStyle = 3
- else:
+ elif type(_.areacolor) != tuple:
shape.FillStyle = int(filled)
if shape.LineTransparence == 100:
shape.LineStyle = 0
@@ -982,7 +1008,7 @@ def __fillit__(filled = True):
oldshape.FillStyle = int(filled)
oldshape.LineWidth = _.pensize / __MM10_TO_TWIP__
oldshape.LineColor, oldshape.LineTransparence = __splitcolor__(_.pencolor)
- oldshape.FillColor, oldshape.FillTransparence = __splitcolor__(_.areacolor)
+ oldshape.FillColor, oldshape.FillTransparence = __splitcolor__(_.areacolor, oldshape)
def point():
oldpen, _.pen = _.pen, 1
@@ -1003,12 +1029,12 @@ def __boxshape__(shapetype, l):
shape.LineJoint = _.linejoint
shape.LineCap = _.linecap
shape.LineColor, shape.LineTransparence = __splitcolor__(_.pencolor)
- shape.FillColor, shape.FillTransparence = __splitcolor__(_.areacolor)
+ shape.FillColor, shape.FillTransparence = __splitcolor__(_.areacolor, shape, turtle.RotateAngle)
if _.hatch:
shape.FillBackground = True if shape.FillTransparence != 100 else False
shape.FillHatch = _.hatch
shape.FillStyle = 3
- else:
+ elif type(_.areacolor) != tuple:
shape.FillStyle = 1
if shape.LineTransparence == 100:
shape.LineStyle = 0
@@ -1163,7 +1189,18 @@ def __color__(c):
return c
if type(c) == unicode:
if c == u'any':
- return int(random.random() * 2**31) # max. 50% transparency
+ rc, rv, rgray = __NORMCOLORS__[int(random.random()*7)], random.random(), random.random() ** 0.5
+ ratio = 1.0*abs(rc[2])/(abs(rc[2]) + abs(rc[4]))
+ newcol = list(rc[0])
+ if rv < ratio:
+ newcol[rc[1]] += rc[2] * rv/ratio
+ else:
+ newcol[rc[3]] += rc[4] * (rv - ratio)/(1 - ratio)
+ # random grayness
+ rdark = 1 - 2**4 * (random.random()-0.5)**4
+ for i in range(0, 3):
+ newcol[i] = 255 * (rgray + (newcol[i]/255.0 - rgray) * rdark)
+ return __color__(newcol)
if c[0:1] == '~':
c = __componentcolor__(__colors__[_.lng][c[1:].lower()])
for i in range(3):
@@ -1171,11 +1208,13 @@ def __color__(c):
return __color__(c)
return __colors__[_.lng][c.lower()]
if type(c) == list:
- if len(c) == 1:
+ if len(c) == 1: # color index
return __COLORS__[int(c[0])][1]
- if len(c) == 3:
+ elif len(c) == 3: # RGB
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
+ elif len(c) == 2 or len(c) > 4: # gradient
+ return (__color__(c[0]), __color__(c[1])) + tuple(c[2:])
+ return (int(c[3])%256 << 24) + (int(c[0])%256 << 16) + (int(c[1])%256 << 8) + int(c[2])%256 # RGB + alpha
def __linestyle__(s):
if _.pen == 0:
@@ -1197,7 +1236,24 @@ def fillstyle(s):
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):
+def __splitcolor__(c, shape = None, angle = None):
+ if shape and (type(c) == tuple or type(_.t10y) == list):
+ angle = heading() if angle == None else -angle / 100 + 360
+ if type(c) == tuple:
+ shape.FillStyle = __FillStyle_GRADIENT__
+ # gradient color: [color1, color2, style, angle(must be positive for I/O), border, x_percent, y_percent, color1_intensity_percent, color2_intensity_percent]
+ d, d[0:len(c)], c = [0, 0, __GradientStyle_LINEAR__, 0, 0, 0, 0, 100, 100], c, c[0]
+ shape.FillGradient = __Gradient__(d[2], d[0], d[1], (-angle + d[3]) * 10 % 3600, d[4], d[5], d[6], d[7], d[8], 0)
+ if type(_.t10y) == list: # transparency gradient: [begin_percent, end_percent, style, angle, border, x_percent, y_percent]
+ table = _.doc.createInstance("com.sun.star.drawing.TransparencyGradientTable")
+ if not table.hasByName(str(_.t10y) + str(angle)):
+ t, t[0:len(_.t10y)] = [100, __GradientStyle_LINEAR__, 0, 0, 0, 0, 0], _.t10y
+ table.insertByName(str(_.t10y) + str(angle), __Gradient__(t[2], t[0] * 0xffffff / 100.0, t[1] * 0xffffff / 100.0, (-angle + t[3]) * 10 % 3600, t[4], t[5], t[6], 100, 100, 0))
+ shape.FillTransparenceGradientName = str(_.t10y) + str(angle)
+ c = 0 if type(c) == tuple else c & 0xffffff
+ else:
+ shape.FillStyle = __FillStyle_GRADIENT__
+ c = int(_.t10y * 255.0/100) << 24
"""Split color constants to RGB (3-byte) + transparency (%)"""
return int(c) & 0xffffff, (int(c) >> 24) / (255.0/100)
@@ -1267,13 +1323,39 @@ def pencap(n = -1):
def fillcolor(n = -1):
if n != -1:
_.areacolor = __color__(n)
+ if type(_.areacolor) != tuple:
+ _.t10y = (int(_.areacolor) >> 24) / (255.0/100)
+ else:
+ _.t10y = 0
turtle = __getshape__(__TURTLE__)
if turtle and __visible__(turtle):
- turtle.FillColor, transparence = __splitcolor__(_.areacolor)
+ turtle.FillColor, transparence = __splitcolor__(_.areacolor, turtle)
turtle.FillTransparence = min(95, transparence)
else:
return __componentcolor__(_.areacolor)
+def filltransparency(n = -1):
+ if n != -1:
+ if n == u'any':
+ n = 100 * random.random()
+ if type(n) != list:
+ if type(_.areacolor) != tuple:
+ fillcolor((_.areacolor & 0xffffff) + (int(n * (255.0/100)) << 24))
+ else:
+ _.t10y = n
+ else:
+ _.t10y = n
+ else:
+ return _.t10y
+
+def pentransparency(n = -1):
+ if n != -1:
+ if n == u'any':
+ n = 100 * random.random()
+ pencolor((_.pencolor & 0xffffff) + (int(n * (255.0/100)) << 24))
+ else:
+ return _.pencolor >> 24
+
def fontcolor(n = -1):
if n != -1:
_.textcolor = __color__(n)
@@ -1430,7 +1512,7 @@ def __loadlang__(lang, a):
__colors__[lang] = {}
for i in __COLORS__:
for j in a[i[0]].split("|"):
- __colors__[lang][j] = i[1]
+ __colors__[lang][j.lower()] = i[1]
for i in a:
if not i[0:3] in ["LIB", "ERR", "PT", "INC", "MM", "CM", "HOU", "DEG"] and not i in __STRCONST__: # uppercase native commands
a[i] = a[i].upper()
@@ -1485,6 +1567,7 @@ def __loadlang__(lang, a):
[r"(?<!:)\b(?:%s)\b" % a['COS'], "cos"],
[r"(?<!:)\b(?:%s)\b" % a['PI'], "pi"],
[r"(?<!:)\b(?:%s)\b" % a['SQRT'], "sqrt"],
+ [r"(?<!:)\b(?:%s)\b" % a['LOG10'], "log10"],
[r"(?<!:)\b(?:%s)\b" % a['MIN'], "min"],
[r"(?<!:)\b(?:%s)\b" % a['MAX'], "max"],
[r"(?<!:)\b(?:%s)\b" % a['STOP'], "\nreturn None"],
@@ -1494,6 +1577,8 @@ def __loadlang__(lang, a):
[r"(?<!:)\b(?:%s)(\s+|$)" % a['PENJOINT'], "\n)penjoint("],
[r"(?<!:)\b(?:%s)(\s+|$)" % a['PENCAP'], "\n)pencap("],
[r"(?<!:)\b(?:%s)(\s+|$)" % a['FILLCOLOR'], "\n)fillcolor("],
+ [r"(?<!:)\b(?:%s)(\s+|$)" % a['FILLTRANSPARENCY'], "\n)filltransparency("],
+ [r"(?<!:)\b(?:%s)(\s+|$)" % a['PENTRANSPARENCY'], "\n)pentransparency("],
[r"(?<!:)\b(?:%s)(\s+|$)" % a['FILLSTYLE'], "\n)fillstyle("],
[r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTCOLOR'], "\n)fontcolor("],
[r"(?<!:)\b(?:%s)(\s+|$)" % a['FONTFAMILY'], "\n)fontfamily("],
@@ -1540,7 +1625,7 @@ def __loadlang__(lang, a):
[r"\b([0-9]+([,.][0-9]+)?)(%s)(?!\w)" % a['INCH'], lambda r: str(float(r.group(1).replace(",", "."))*72)],
[r"\b([0-9]+([,.][0-9]+)?)(%s)\b" % a['MM'], lambda r: str(float(r.group(1).replace(",", "."))*__MM_TO_PT__)],
[r"\b([0-9]+([,.][0-9]+)?)(%s)\b" % a['CM'], lambda r: str(float(r.group(1).replace(",", "."))*__MM_TO_PT__*10)],
- [r"\b(__(?:int|float|string)__len|round|abs|sin|cos|sqrt|set|list|tuple|sorted)\b ((?:\w|\d+([,.]\d+)?|0[xX][0-9a-fA-F]+|[-+*/]| )+)\)" , "\\1(\\2))" ], # fix parsing: (1 + sqrt x) -> (1 + sqrt(x))
+ [r"\b(__(?:int|float|string)__len|round|abs|sin|cos|sqrt|log10|set|list|tuple|sorted)\b ((?:\w|\d+([,.]\d+)?|0[xX][0-9a-fA-F]+|[-+*/]| )+)\)" , "\\1(\\2))" ], # fix parsing: (1 + sqrt x) -> (1 + sqrt(x))
[r"(?<=[-*/=+,]) ?\n\)(\w+)\(", "\\1()"], # read attributes, eg. x = fillcolor
[r"(?<=return) ?\n\)(\w+)\(", "\\1()"], # return + user function
[r"(?<=(?:Print|label)\() ?\n\)(\w+)\(", "\\1()\n"] # Print/label + user function
@@ -1613,7 +1698,7 @@ def __compil__(s):
s = re.sub(r"(?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"]
+ functions = ["range", "__int__", "__float__", "Random", "Input", "__string__", "len", "round", "abs", "sin", "cos", "sqrt", "log10", "set", "list", "tuple", "re.sub", "re.search", "re.findall", "sorted", "min", "max"]
if len(subnames) > 0:
globs = "global %s" % ", ".join(subnames)
diff --git a/librelogo/source/pythonpath/LibreLogo_en_US.properties b/librelogo/source/pythonpath/LibreLogo_en_US.properties
index d9fdbd11e142..c943d307f7dd 100644
--- a/librelogo/source/pythonpath/LibreLogo_en_US.properties
+++ b/librelogo/source/pythonpath/LibreLogo_en_US.properties
@@ -29,6 +29,8 @@ DOTTED=dotted
CLOSE=close
FILL=fill
FILLCOLOR=fillcolor|fillcolour|fc
+FILLTRANSPARENCY=filltransparency
+PENTRANSPARENCY=pentransparency|linetransparency
FILLSTYLE=fillstyle
FONTCOLOR=fontcolor|textcolor|textcolour
FONTHEIGHT=fontsize|textsize|textheight
@@ -80,6 +82,7 @@ INT=int
FLOAT=float
STR=str
SQRT=sqrt
+LOG10=log10
SIN=sin
COS=cos
ROUND=round