Builder – שפת DSL ליצור תוכן Markup

אחד התוספות המעניינות ביותר שיש לרובי נקרא Builder.התוסף מאפשר לנו ליצור תוכן Markup אבל באמצעות שימוש ב DSL, במקום בשימוש של Templates או inline code.

בנוסף, הוא גם נמצא בשימוש של תוספים נוספים, כדוגמת Nokogiri. שם ניתן להשתמש בו לעריכה של xml.

שימוש פשוט בBuilder יראה כך:

require 'rubygems'
require 'builder'

xml = Builder::XmlMarkup.new

xml.root do # you can use proc instead
  xml.bin do 
    xml.file 'bash'
    xml.file 'ls'
    xml.file 'cp'
  end
  
  xml.boot do 
    xml.file 'initramfs-linux.img'
    xml.file 'initramfs-linux-fallback.img'
    xml.file 'vmlinuz-linux'

    xml.grub do
     xml.file 'grub.cfg'
    end
  end
end

במידה ונריץ את הקוד, לא נראה שקרה משהו, וזה בגלל שלא אמרנו ל builder לאן להפנות את הפלט.

אם ניצור את xml עם הפניה לפלט למסך, נקבל בעצם את ההפניה בצורה שנוכל לראות מה קורה (באותה מידה אפשר להפנות אותה למשתנה, או לIO כלשהו):

xml = Builder::XmlMarkup.new(target: $stdout)

עכשיו נקבל פלט ממש לא יפה בצורה הבאה:

<root><bin><file>bash</file><file>ls</file><file>cp</file></bin><boot><file>initramfs-linux.img</file><file>initramfs-linux-fallback.img</file><file>vmlinuz-linux</file><grub><file>grub.cfg</file></grub></boot></root>

נוכל לסדר גם את זה בעת יצירת xml:

...
xml = Builder::XmlMarkup.new(target: $stdout, indent: 2)
...

והפלט יהיה מסודר:

<root>
  <bin>
    <file>bash</file>
    <file>ls</file>
    <file>cp</file>
  </bin>
  <boot>
    <file>initramfs-linux.img</file>
    <file>initramfs-linux-fallback.img</file>
    <file>vmlinuz-linux</file>
    <grub>
      <file>grub.cfg</file>
    </grub>
  </boot>
</root>

השאלה הבאה בד"כ היא איך מוסיפים תכונות למשהו מסויים, אז הנה קוד קטן שיבצע את זה:

...
xml.file('bash', user: 'root', group: 'root' )
...

התוצר הוא:

<file user="root" group="root">bash</file>

עדיין חסר לי כאן משהו: הראש של הxml:

...
xml = Builder::XmlMarkup.new(target: $stdout, indent: 2)
xml.instruct! :‎xml, version: '1.0', encoding: 'UTF-8'
...

והתוצר:

<?xml version="1.0" encoding="UTF-8"?>
...

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s