{"id":7130,"date":"2019-01-21T14:29:22","date_gmt":"2019-01-21T13:29:22","guid":{"rendered":"https:\/\/pi3g.com\/?p=7130"},"modified":"2019-01-21T14:35:21","modified_gmt":"2019-01-21T13:35:21","slug":"the-scope-of-ecr-within-crystal-or-how-do-i-pass-in-variables-and-objects-into-ecr-templates","status":"publish","type":"post","link":"https:\/\/pi3g.com\/de\/the-scope-of-ecr-within-crystal-or-how-do-i-pass-in-variables-and-objects-into-ecr-templates\/","title":{"rendered":"Der Anwendungsbereich von ecr in crystal: oder wie \u00fcbergebe ich Variablen und Objekte in ECR-Vorlagen?"},"content":{"rendered":"<p>Als Anf\u00e4nger in der Crystal-Sprache f\u00e4llt es mir immer noch schwer, einige der darin enthaltenen Konzepte zu verstehen und ein Gef\u00fchl f\u00fcr die Programmierung in Crystal zu entwickeln.<\/p>\n<p>Wenn ich auf schwierige Probleme sto\u00dfe, die ich l\u00f6se oder zu verstehen beginne, blogge ich dar\u00fcber, damit andere davon profitieren k\u00f6nnen - denn der Mangel an Dokumentation wird (von mir) manchmal stark empfunden.<\/p>\n<p>Vorw\u00e4rts!<\/p>\n<p>Hier ist die Dokumentation f\u00fcr ECR (in v.0.27, der derzeit letzten Version von Crystal):<\/p>\n<p><a title=\"https:\/\/crystal-lang.org\/api\/0.27.0\/ECR.html\" href=\"https:\/\/crystal-lang.org\/api\/0.27.0\/ECR.html\">https:\/\/crystal-lang.org\/api\/0.27.0\/ECR.html<\/a><\/p>\n<p>Sie k\u00f6nnen sich den Quellcode von ECR, den eingebetteten Kristallvorlagen, hier ansehen:<\/p>\n<p><a title=\"https:\/\/github.com\/crystal-lang\/crystal\/tree\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\" href=\"https:\/\/github.com\/crystal-lang\/crystal\/tree\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\">https:\/\/github.com\/crystal-lang\/crystal\/tree\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr<\/a><\/p>\n<p>ECR ist eine Templatesprache zur Kompilierzeit. Sie k\u00f6nnen ECR nicht verwenden, um Vorlagen zur Laufzeit zu verarbeiten!<\/p>\n<h1>Makros, die die Welt regieren<\/h1>\n<p>Wenn Sie die ECR-Vorlagen in Crystal verwenden (auch wenn Sie sie mit Hilfe von Kemal verwenden), verwenden Sie Makros.<\/p>\n<p>Crystal verf\u00fcgt \u00fcber eine Makrosprache, mit der Sie Code abstrahieren und wiederverwenden k\u00f6nnen. Im ersten Schritt der Kompilierung werden die Makros ausgewertet und der resultierende Code wird an der Stelle \"eingef\u00fcgt\", an der der Makroaufruf stand.<\/p>\n<p>Anschlie\u00dfend kompiliert Crystal den Code.<\/p>\n<p><strong>Wie funktioniert das bei ECR?<\/strong><\/p>\n<p>Nehmen wir zum Beispiel die <strong>def_to_s(Dateiname)<\/strong> Makro im Code des Beispiels:<\/p>\n<blockquote>\n<pre><code>erfordern \"ecr\"\n\nclass Begr\u00fc\u00dfung\n  def initialize(@name : String)\n  end\n\n  <font>ECR.def_to_s \"greeting.ecr\"<\/font>\nend\n\n# gruss.ecr\nGru\u00df, !\n\nGru\u00df.new(\"John\").to_s #=&gt; Gru\u00df, John!<\/code><\/pre>\n<\/blockquote>\n<pre><code><font face=\"Calibri\"><br><\/font><\/code><\/pre>\n<pre><font face=\"Calibri\">Crystal ruft das Makro <strong>def_to_s<\/strong> zur Kompilierzeit mit der \u00dcbergabe von \"greeting.ecr\".<\/font><\/pre>\n<pre><font face=\"Calibri\">Das Makro wird hier definiert:<\/font><\/pre>\n<pre><a title=\"https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/macros.cr\" href=\"https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/macros.cr\">https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/macros.cr<\/a><\/pre>\n<blockquote>\n<p>Makro def_to_s(Dateiname)<\/p>\n<p>&nbsp; def to_s(__io__)<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; <font style=\"background-color: rgb(255, 255, 0);\">ECR.embed {{Dateiname}}, \"__io__\"<\/font><\/p>\n<p>&nbsp; Ende<\/p>\n<p>Ende<\/p>\n<\/blockquote>\n<p>wird Ihre Klasse im ersten Schritt wie folgt umgeschrieben:<\/p>\n<blockquote>\n<pre><code>erfordern \"ecr\"\n\nclass Begr\u00fc\u00dfung\n  def initialize(@name : String)\n  end\n\n  def to_s(__io__)<\/code><\/pre>\n<pre><code>    ECR.embed \"gruss.ecr\", \"__io__\"\nend<\/code><\/pre>\n<pre><code><br><\/code><\/pre>\n<\/blockquote>\n<pre><code><font face=\"Calibri\">Siehst du, was gerade passiert ist? Deiner Klasse wurde eine to_s-Methode hinzugef\u00fcgt, die ihrerseits ein Makro enth\u00e4lt. Schauen wir uns an, was dieses Makro tut:<\/font><\/code><\/pre>\n<blockquote>\n<p>Makro embed(Dateiname, io_name)<\/p>\n<p>&nbsp;&nbsp;&nbsp; \\{{ run(\"ecr\/process\", {{filename}}, {{io_name.id.stringify}}) }}<\/p>\n<p>Ende<\/p>\n<\/blockquote>\n<p>Dies ist der Hauptaufruf von ECR. Er kompiliert (? \/ f\u00fchrt aus) eine andere Anwendung <strong>ecr\/Prozess<\/strong> und \u00fcbergibt ihm Dateiname und io_name als Parameter.<\/p>\n<p>Die R\u00fcckgabe ist das Ergebnis der Ausgabe dieser Anwendung.<\/p>\n<p>Was bedeutet der Backslash?<\/p>\n<p>\"Es ist m\u00f6glich, eine<strong> Makro, das eine oder mehrere Makrodefinitionen erzeugt<\/strong>. Sie m\u00fcssen Makroausdr\u00fccke des inneren Makros mit einem vorangestellten Backslash-Zeichen \\ entschl\u00fcsseln, um zu verhindern, dass sie von dem \u00e4u\u00dferen Makro ausgewertet werden.\"<\/p>\n<p>Es handelt sich im Wesentlichen um ein verschachteltes Makro!<\/p>\n<p>ecr\/process ist hier definiert:<\/p>\n<p><a title=\"https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/process.cr\" href=\"https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/process.cr\">https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/process.cr<\/a><\/p>\n<p>es ist im Wesentlichen ein Wrapper um ECR.process_file (denken Sie daran, dass dies kein Makro mehr ist - dies ist eine Anwendung, deren Ausgabe schlie\u00dflich in Ihren Crystal-Code eingef\u00fcgt wird!)<\/p>\n<p>ecr\/processor ist hier definiert:<\/p>\n<p><a title=\"https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/processor.cr\" href=\"https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/processor.cr\">https:\/\/github.com\/crystal-lang\/crystal\/blob\/c9d1eef8fde5c7a03a029d64c8483ed7b4f2fe86\/src\/ecr\/processor.cr<\/a><\/p>\n<p>Es verarbeitet die Datei und erstellt eine Zeichenkette, die es zur\u00fcckgibt.<\/p>\n<p>Hier ein kleiner Auszug:<\/p>\n<blockquote>\n<p>str &lt;&lt; Puffer_name<\/p>\n<p>str &lt;&lt; &quot; &lt;&lt; &quot;<\/p>\n<p>string.inspect(str)<\/p>\n<p>str &lt;&lt; &#039;\\n&#039;<\/p>\n<\/blockquote>\n<p>buffer_name ist das, was wir oben an Crystal \u00fcbergeben haben (__io__ - identifiziert durch seine ID in io_name.id.stringify). <\/p>\n<p>Ausgabe- und Kontrollwerte werden ebenfalls verarbeitet. Au\u00dferdem wird die Debug-Ausgabe f\u00fcr Sie eingef\u00fcgt (mit # als Kommentar):<\/p>\n<blockquote>\n<p>append_loc(str, dateiname, zeilen_nummer, spalten_nummer)<\/p>\n<\/blockquote>\n<p>Im Grunde wird der Code, den Sie in die ECR-Dateien eingeben, direkt in Ihren Code eingef\u00fcgt - an der von Ihnen angegebenen Stelle. Das alles geschieht durch Makros und einen speziellen ECR-Parser.<\/p>\n<p>Der ECR-Code kennt Ihre Variablen nicht - wenn Sie Bereichsfehler, undefinierte Variablen usw. erhalten, liegt das nicht daran, dass Sie sie nicht an ECR \u00fcbergeben haben, sondern daran, dass sie sich nicht im richtigen Bereich befinden.<\/p>\n<p>Versuchen Sie das, was Sie mit dem ECR-Code machen wollten, direkt in Ihrem Hauptcode.<\/p>\n<p><\/p>\n<h1>Demonstration<\/h1>\n<p>Hier ist eine Demonstration, wie Sie eine Klasse in Ihrem ECR-Code in Kemal \"verwenden\" k\u00f6nnen. Die Klasse verschachtelt ein zus\u00e4tzliches ECR-Snippet, das mit dem Kontext der Klasse gerendert wird.<\/p>\n<p><\/p>\n<p><strong>die Datei debug.cr:<\/strong><\/p>\n<blockquote>\n<p>erfordern \"kemal\"<\/p>\n<p>require \".\/..\/macros.cr\"<\/p>\n<p>Modul Fehlersuche<br \/>&nbsp;&nbsp; Makros einbeziehen<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Klasse DClass<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @test : Zeichenkette <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def initialize()<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @test = \"Testzeichenfolge\"<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ECR.def_to_s \"src\/views\/snippets\/debug_snippet.ecr\"<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<\/p>\n<p>&nbsp; get \"\/debug\" do |env|<\/p>\n<p>&nbsp;&nbsp;&nbsp; eingeloggt = false<\/p>\n<p>&nbsp;&nbsp;&nbsp; mrender \"debug\"<br \/>&nbsp;&nbsp; Ende<\/p>\n<p>Ende<\/p>\n<\/blockquote>\n<p><strong>die Datei debug.ecr:<\/strong><\/p>\n<blockquote>\n<p>&lt;% content_for &#8220;main&#8221; do%&gt;<br \/>\n<h1>Debug-Informationen<\/h1><\/p>\n<p>&lt;%= loggedin %&gt;<br \/>\n<h1>Eingebauter dekorierter Schnipsel<\/h1><\/p>\n<p>&lt;%= DClass.new() %&gt;<\/p>\n<p>&lt;% end %&gt;<\/p>\n<\/blockquote>\n<p><strong>den entsprechenden Code f\u00fcr das Makro mrender, definiert in macros.cr:<\/strong><\/p>\n<blockquote>\n<p>makro mrender(filename)<br \/>&nbsp;&nbsp; render \"src\/views\/#{{Dateiname}}}.ecr\", \"src\/views\/layout.ecr\"<br \/>\nEnde&nbsp;&nbsp;&nbsp; \n<\/p>\n<\/blockquote>\n<p>Es verwendet das Makro render von Kemal, mit dem Sie ein Layout f\u00fcr Ihre Ansicht angeben k\u00f6nnen. (Sie brauchen dies nicht unbedingt in Ihrem Code, es wird hier nur der Vollst\u00e4ndigkeit halber angegeben)<\/p>\n<p><strong>die Datei src\/views\/snippets\/debug_snippet.ecr:<\/strong><\/p>\n<blockquote>\n<p>Debug-Schnipsel<br \/>\n<b><\/b><\/p>\n<\/blockquote>\n<p><\/p>\n<h2>Das Ergebnis:<\/h2>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/01\/image-35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"766\" height=\"261\" title=\"Bild\" style=\"display: inline; background-image: none;\" alt=\"Bild\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/01\/image_thumb-34.png\" border=\"0\"><\/a><\/p>\n<h2>Alles zusammengenommen:<\/h2>\n<ol>\n<li>Der Benutzer ruft \/debug in seinem Webbrowser auf<\/li>\n<li>Kemal 's Makro get wird f\u00fcr die Route \"\/debug\" passen. Es ist in meiner debug.cr definiert<\/li>\n<ol>\n<li>Die lokale Variable <strong>eingeloggt<\/strong> wird auf false gesetzt<\/li>\n<li>debug.ecr wird von den ECR-Makros verarbeitet und in \"debug.cr\" eingef\u00fcgt (die AST-Darstellung) eingef\u00fcgt, so als ob sie direkt von Ihnen eingegeben worden w\u00e4re<\/li>\n<ol>\n<li>die lokale Variable <strong>eingeloggt <\/strong>wird als false ausgewertet (zur Laufzeit)<\/li>\n<li>wir nennen <strong>DClass.new()<\/strong>und fragen Sie sie nach ihrer String-Repr\u00e4sentation, die durch die Methode def to_s definiert ist.<\/li>\n<ol>\n<li>k\u00f6nnen wir DClass.new() aufrufen, da sie im selben Modul definiert ist, in dem wir gerade ausgef\u00fchrt werden. Stellen Sie sich einfach vor, dass Ihr ECR-Code genau dort, unterhalb der Klassendefinition, eingef\u00fcgt wird.<\/li>\n<li>wir fragen nach der Darstellung der Zeichenkette, da wir die Syntax  verwenden<\/li>\n<\/ol>\n<\/ol>\n<\/ol>\n<\/ol>\n<p><\/p>\n<p>Schauen wir uns nun an, was beim Aufruf von DClass.new passiert:<\/p>\n<blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Klasse DClass<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @test : Zeichenkette <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def initialize()<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @test = \"Testzeichenfolge\"<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ECR.def_to_s \"src\/views\/snippets\/debug_snippet.ecr\"<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<\/p><\/blockquote>\n<p>Bei der Initialisierung wird eine Zeichenkette @test gesetzt. Dies ist eine <strong>Instanz <\/strong>der DClass-Instanz, die wir gerade erstellt haben. (Dass es sich um eine Instanzvariable handelt, erkennen Sie daran, dass ihr ein \"@\" vorangestellt ist. Zwei \"@@\" w\u00fcrden eine Klassenvariable darstellen)<\/p>\n<p>Diese Instanzvariable wird in debug_snippet.ecr verwendet \/ angezeigt<\/p>\n<p>Wir haben bereits besprochen, wie ECR.def_to_s funktioniert. <\/p>\n<p>Nach dem Durchlaufen der Makrophase w\u00fcrde diese Klasse etwa so aussehen:<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Klasse DClass<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @test : Zeichenkette <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def initialize()<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @test = \"Testzeichenfolge\"<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def to_s(__io__)<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __io__ &lt;&lt; &quot;Debug-Snippet\\n&quot;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __io__ &lt;&lt; &quot;<b>\"<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __io__ &lt;&lt; @test<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __io__ &lt;&lt; &quot;<\/B>\"<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ende<\/p>\n<p><\/p>\n<p>Mit dieser Technik k\u00f6nnen Sie Klassen definieren, um Schnipsel von ECR-Code zu rendern, anstatt jeden Variablennamen manuell einzurichten und zu \u00fcbergeben.<\/p>\n<p>Ich hoffe, dass dieser Artikel Ihnen hilft und dass Sie ihn finden, anstatt frustriert zu werden - ich w\u00fcnschte, ich h\u00e4tte so etwas als Leitfaden f\u00fcr meine ersten Schritte gehabt <img decoding=\"async\" class=\"wlEmoticon wlEmoticon-smile\" style=\"\" alt=\"L\u00e4cheln\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/01\/wlEmoticon-smile.png\"><\/p>\n<h1>Referenzen<\/h1>\n<p>Bezug auf Kemal:<\/p>\n<ul>\n<li><a title=\"http:\/\/kemalcr.com\/guide\/\" href=\"http:\/\/kemalcr.com\/guide\/\">http:\/\/kemalcr.com\/guide\/<\/a><\/li>\n<\/ul>\n<p>Auf dieser Seite finden Sie weitere Informationen zu Makros:<\/p>\n<ul>\n<li><a title=\"https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/macros.html\" href=\"https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/macros.html\">https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/macros.html<\/a><\/li>\n<\/ul>\n<p>NB: AST-Knoten: Knoten des abstrakten Syntaxbaums<\/p>\n<ul>\n<li><a title=\"https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/methods_and_instance_variables.html\" href=\"https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/methods_and_instance_variables.html\">https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/methods_and_instance_variables.html<\/a><\/li>\n<li><a title=\"https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/class_variables.html\" href=\"https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/class_variables.html\">https:\/\/crystal-lang.org\/reference\/syntax_and_semantics\/class_variables.html<\/a><\/li>\n<\/ul>\n<p>Das hat mich auf den richtigen Weg gebracht, Hut ab!!<\/p>\n<ul>\n<li><a title=\"https:\/\/awesomeprogrammer.com\/blog\/2018\/04\/01\/back-to-the-crystal---decorators-and-presenter-ideas-for-kemal\/\" href=\"https:\/\/awesomeprogrammer.com\/blog\/2018\/04\/01\/back-to-the-crystal---decorators-and-presenter-ideas-for-kemal\/\">https:\/\/awesomeprogrammer.com\/blog\/2018\/04\/01\/back-to-the-crystal&#8212;decorators-and-presenter-ideas-for-kemal\/<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Als Anf\u00e4nger in der Crystal-Sprache k\u00e4mpfe ich immer noch damit, einige der darin enthaltenen Konzepte zu verstehen und ein Gef\u00fchl f\u00fcr die Codierung in Crystal zu entwickeln. Wenn ich auf schwierige Probleme sto\u00dfe, die ich l\u00f6se oder zu verstehen beginne, blogge ich dar\u00fcber, damit auch andere davon profitieren k\u00f6nnen - denn der Mangel an Dokumentation...<\/p>","protected":false},"author":830,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[416],"tags":[409,477,490,495,494,493,491,492],"class_list":["post-7130","post","type-post","status-publish","format-standard","hentry","category-crystal-language","tag-crystal","tag-crystal-lang","tag-ecr","tag-kemal","tag-macro","tag-render","tag-scope","tag-variables"],"_links":{"self":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/7130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/users\/830"}],"replies":[{"embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/comments?post=7130"}],"version-history":[{"count":3,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/7130\/revisions"}],"predecessor-version":[{"id":7133,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/7130\/revisions\/7133"}],"wp:attachment":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/media?parent=7130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/categories?post=7130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/tags?post=7130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}