Zeichnen von Strukturformeln:

{{#invoke: Benutzer:Sivizius/chem | render | breite | höhe | structure= strukture }}

breite bzw. höhe: Breite bzw. Höhe der Zeichenfläche (canvas).
struktur: Struktur der Verbindung, kann folgende Zeichen(-kombinationen) enthalten:
09, AZ, az: Werden als solche an der entsprechenden Stelle zentriert gezeichnet.
_(sub): sub wird tiefgestellt.
^(sup): sup wird hochgestellt.
-, =, #: Einfach-, Doppel- und Dreifachbindung
<, >: Einfachbindung nach vorn
<:, :>: Einfachbindung nach hinten
A-B(-X)-C: Verzweigung (A–B(–X)–C)
A*n(----): n-gliedriger Ring, A ist die erste Gruppe im Ring. Wenn weniger als n Bindungen angegeben werden, wird der Ring nicht geschlossen.

Nicht alles ist bereits implementiert. Vorschläge gerne gesehen


local package = {}

classPrefix    =  "chem"
bondHelfLength =  10 --px
bondSeperation =  1  --px

function drawGroup ( text, class )
  local inner =  mw.html.create ( "p"   )
  local outer =  mw.html.create ( "div" )
  inner
  :addClass ( classPrefix..class                  )
  :css      ( "margin",          "0px"            )
  :css      ( "border",          "1px solid blue" )
  :wikitext ( text                                )
  outer
  :css      ( "position",        "absolute"       )
  :css      ( "display",         "flex"           )
  :css      ( "justify-content", "center"         )
  :css      ( "align-items",     "center"         )
  :css      ( "width",           "0%"             )
  :css      ( "height",          "0%"             )
  :css      ( "top",             "50%"            )
  :css      ( "left",            "50%"            )
  :css      ( "margin",          "0px"            )
  :node     ( inner )
  return outer
end

function drawSingleBond ( xPos, yPos, angle, left, right )
  local inner  =  mw.html.create ( "div" )
  local outer  =  mw.html.create ( "div" )
  local length =  tostring ( left + right ) .. "px"
  local matrix =  "matrix("
               .. tostring (  math.cos ( angle )) .. ","
               .. tostring ( -math.sin ( angle )) .. ","
               .. tostring (  math.sin ( angle )) .. ","
               .. tostring (  math.cos ( angle )) .. ","
               .. ( xPos - left * math.cos ( angle ) )..","
               .. ( yPos - left * math.sin ( angle ) )..","
               .. ")"
  inner
  :addClass ( classPrefix.."SingleBond" )
  :css      ( "outline",         "1px solid"      )
  outer
  :css      ( "position",        "absolute"       )
  :css      ( "width",           length           )
  :css      ( "transform",       matrix           )
  :node     ( inner )
end

function package.render ( frame )
  local width     =  mw.text.trim ( frame.args [ 1 ] )
  local height    =  mw.text.trim ( frame.args [ 2 ] )
  local structure =  tostring ( frame.args [ "structure" ] )
  local theWidth  =  tonumber ( width  )
  local theHeight =  tonumber ( height )
  local canvas    =  mw.html.create( "div" )
  canvas
  :addClass ( classPrefix.."Canvas"               )
  :css      ( "width",           width.."px"      )
  :css      ( "height",          height.."px"     )
  :css      ( "position",        "relative"       )
  :css      ( "background",      "#fff"           )
  return "»"..structure.."«"..tostring ( canvas )
end

return package