; Created in LibreOffice 4.1.2 with this LibreLogo program
; Usage: Put this code into an English language document in LibO Writer,
; fix one program line for older LibreOffice versions, see FIXME in the code,
; and click on the Start icon of the View»Toolbars»Logo toolbar.
; NEED INTERNET CONNECTION TO RUN THIS PROGRAM! (table data downloaded from Wikipedia)
lang = input “Language (de, el, en, fr, hu, it, ru)?”
bw = int input “Color (0 = COLORED, 1 = BLACK/WHITE)?”
; Source pages: http://www.wikidata.org/wiki/Q13584100?uselang=hu
sources = {“ru”: [“%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D1%85%D0%B8%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2”, 2], “fr”: [“Liste_des_%C3%A9l%C3%A9ments_chimiques”, 2], “de”: [“Liste_der_chemischen_Elemente”, 1], “el”: [“%CE%9A%CE%B1%CF%84%CE%AC%CE%BB%CE%BF%CE%B3%CE%BF%CF%82_%CF%87%CE%B7%CE%BC%CE%B9%CE%BA%CF%8E%CE%BD_%CF%83%CF%84%CE%BF%CE%B9%CF%87%CE%B5%CE%AF%CF%89%CE%BD_%CE%BA%CE%B1%CF%84%CE%AC_%CE%B1%CF%84%CE%BF%CE%BC%CE%B9%CE%BA%CF%8C_%CE%B1%CF%81%CE%B9%CE%B8%CE%BC%CF%8C”, 2], “it”: [“Elementi_per_numero_atomico”, 2], “hu”: [“K%C3%A9miai_elemek_list%C3%A1ja”, 3]}
if lang != “en” [
langpage = sources[lang][0]
langfield = sources[lang][1] ; column with element names on the Wikipedia page
]
GLOBAL annotation, posx, posy, size, font, font2, lang
font = “DejaVu Sans”
font2 = “DejaVu Sans Condensed” ; Wikimedia has got problem with it, convert the result to path in Inkscape, if needed.
posx = 30
posy = 40
size = 42
; load and process element data from Wikipedia (embedded Python)
exec(“import urllib.request”)
exec(“data = urllib.request.urlopen("http://en.wikipedia.org/w/index.php?action=raw&title=List_of_elements").readlines()”)
exec(“table = [[j.strip(" |[]") for j in i.decode("utf-8").replace("style=\\\"background-color:#","0x").replace("\\\" | ","||").split("||")] for i in data if re.match("^\| *\d+ *\|\|", i.decode("utf-8"))]”)
; load and process other language data
IF lang != “en” [
exec(“data = urllib.request.urlopen("http://%s.wikipedia.org/w/index.php?action=raw&title=%s").readlines()” % (lang, langpage))
IF lang != “de” [
exec(“langtable = [i.decode("utf-8").split("||")[%d].strip(" []").split("|")[-1] for i in data if re.match("^\| *\d+ *\|\|", i.decode("utf-8"))]” % (langfield-1))
] [
; process and sort German data
exec(“langtable = [[i.decode("utf-8").split("||")[0].split("{")[0].split("|")[-1].strip(" \t[]").split(" ")[0].split("<")[0].split("(")[0].strip(" \t[]").split("|")[-1], int(i.decode("utf-8").split("||")[2].strip(" \t"))] for i in data if re.match(".*\|[ \t]*\d+[ \t]*\|\|", i.decode("utf-8"))]”)
exec(“import operator”)
exec(“langtable.sort(key=operator.itemgetter(1))”)
exec(“langtable = [i[0] for i in langtable]”)
]
] [ langtable = [] ]
; a few fixes
table[79][3] = “Mercury” ; instead of Mercury (element)
table[11][7] = “24.31” ; Mg
table[25][7] = “55.85” ; Fe
table[63][7] = “157.3” ; Gd
; add missing positions TO the table
FOR i IN RANGE 56 71 [
table[i][5] = i – (56 – 4)
table[i][6] = 8.5
]
FOR i IN RANGE 88 103 [
table[i][5] = i – (88 – 4)
table[i][6] = 9.5
]
; helper functions
TO width_of_last_object
OUTPUT _.drawpage.getByIndex(_.drawpage.getCount()-1).getSize().Width / 100 * __MM_TO_PT__; IN PT
END ; FIXME: remove the space before the “END”
TO delete_last_object
_.drawpage.remove(_.drawpage.getByIndex(_.drawpage.getCount()-1))
END
TO element size d l18n bw
PENUP POSITION [posx + INT(d[5])*size, posy + FLOAT(d[6])*size*1.2] HEADING 0
; show group number
IF INT(d[0]) IN [1, 2, 4, 5, 6, 7, 8, 9, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] [
IF lang = “en” [
FORWARD size/2 + size/5 LABEL [0, 1, d[5]]
] [
FORWARD size/2 + size/5 LABEL [0, 4.5, d[5]]
groupname = {“1”: “I. A.”, “2”: “II. A.”, “3”: “III. B.”, “4”: “IV. B.”, “5”: “V. B.”, “6”: “VI. B.”, “7”: “VII. B.”, “8”: “ ╭───”, “9”: “VIII. B.”, “10”: “───╮ ”, “11”: “I. B.”, “12”: “II. B.”, “13”: “III. A.”, “14”: “IV. A.”, “15”: “V. A.”, “16”: “VI. A.”, “17”: “VII. A.”, “18”: “VIII. A.”}[d[5]]
IF lang not in [“hu”] [ groupname = SUB (“[.]”, “”, groupname) ]
FONTSIZE 10 LABEL [0, 1, groupname]
]
BACK size/2 + size/5
]
IF bw [ FILLCOLOR “WHITE” ] [ FILLCOLOR INT (d[1]) ]
PENDOWN RECTANGLE [size, size*1.2] PENUP
IF “M” IN d[2] OR “m” IN d[2] OR 2 < COUNT (d[2]) [ FONTFAMILY font2 ] [ FONTFAMILY font ]
FONTWEIGHT “BOLD”
FONTSIZE size/2.1
TEXT d[2]
FONTWEIGHT “UPRIGHT” FONTFAMILY font
BACK size*1.2/2-size/20
fontsiz = 5.6
FONTSIZE size/fontsiz
IF l18n [
name = l18n[INT(d[0])-1]
] [ name = d[3] ]
if lang != “de” [ name = name.lower() ]
LABEL [0, 1, name]
fontdescratio = 492/2048 ; DejaVu Sans Condensed
IF width_of_last_object() > size * 0.95 [
delete_last_object
FONTFAMILY font2
LABEL [0, 1, name]
width = width_of_last_object
IF width > size * 0.95 [
delete_last_object
fontsiz2 = size/fontsiz * size/width * 0.95
FORWARD size/fontsiz*fontdescratio - fontsiz2*fontdescratio
FONTSIZE fontsiz2
LABEL [0, 1, name]
BACK size/fontsiz*fontdescratio - fontsiz2*fontdescratio
]
]
FONTSIZE size/5.8 FONTFAMILY font2
FORWARD [-size/2 + size/20, size*1.2/2-size/20 + size*0.6 – size/20]
HEADING 0 LABEL [1, -1, d[0]]
RIGHT 90 FORWARD size – size/10 LEFT 90
weight = FINDALL(“(\d+[.]\d+