المحتويات
يُمهِّدُ هذا الجزء من المستند لـ SGML ويناقش علاقتها بـ HTML. أي نقاش متكامل يُترَك للمقياس (انظر [ISO8879]).
SGML هو نظام لتعريف لغات التَّوسيم (markup languages). يقوم المؤلفون بـوسم مستنداتهم بتمثيل المعلومات البنيويّة (structural)، التَّقديميّة (presentational) والدَّلائليّة (semantic) بالتَّجانب مع المحتوى. HTML هي مثال عن لغة توسيم (markup language). يوجد هنا مثال عن مستند HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>أول مستند تشعبيّ لي</TITLE>
</HEAD>
<BODY>
<P>أهلا يا عالم!
</BODY>
</HTML>
ينقسم مستند HTML إلى مقطع رأسيّ (head section) (يتواجد هنا بين <HEAD> و </HEAD>) وجسم (body) (يتواجد هنا بين <BODY> و </BODY>). يظهر علوان المستند (title of the document) في الرَّأس (head) (بجانب معلومات أخرى عن المستند) في حين يظهر محتوي المستند في الجسم (body). يحتوي الجسم، في هذا المثال، على فقرة (paragraph) واحدة فقط، موسومة بـ <P>.
كلّ لغة توسيم "markup language" مُعرَّفة في SGML تُسمى تطبيق SGML. عموما، يتميز تطبيق SGML بـ:
يتضمن التَّحديد تصريح SGML، ثلاثة تعريفات لنوع المستند (استعرض الفصل المتعلق بـ معلومات عن إصدارة HTML (HTML version information) للحصول على وصف للثلاثة) ولائحة الإحالات الحرفيّة (character references).
تُمهِّد المقاطع التَّالية لبناءات SGML التِّي تُستخدَم في HTML.
يُعدِّد الملحق بعض ميزات SGML التِّي لا تُدْعَم بشكل واسع من قبل أدوات HTML ووكلاء المستخدمين (user agents) ويجب تفاديها.
يُصَرِّحُ تعريف نوع المستند (document type definition) الخاص بـ SGML بـ أنواع العناصر (element types) التِّي تُمَثِّل البنى والسُّلوك المُرَادَين. تتضمن HTML أنواع عناصر تُمَثِّل الفقرات، الرَّوابط النَّصيّة التَّشعبيّة، اللَّوائح، الجداول، الصُّور، إلخ.
عموما، يصِفُ كلُّ تصريح لنوع العنصر (element type declaration) ثلاثة أجزاء: وسم بداية (start tag)، محتوى (content) ووسم نهاية (end tag).
يظهر إسم العنصر (element name) في وسم البداية (start tag) (يُكتَب <element-name>) وفي وسم النِّهاية (end tag) (يُكتَب </element-name>)؛ انتبه إلى الخط المائل (slash) قبل إسم العنصر في وسم النِّهاية. على سبيل المثال، فإنَّ وسوم بداية ونِهاية نوع العنصر UL تفصل البنود في لائحة:
<UL> <LI><P>...اللائحة - البند 1... <LI><P>...اللائحة - البند 2... </UL>
تسمح بعض أنواع عناصر HTML للمؤلفين بـ إغفال وسوم النِّهاية (على سبيل المثال: أنواع العناصر P و LI ). تسمح بعض أنواع العناصر أيضا بإغفال وسوم البداية؛ على سبيل المثال: HEAD و BODY. لكل نوع عنصر، يُشِير تعريف نوع المستند الخاص بـ HTML (HTML DTD) إذا كان وسم البداية ووسم النِّهاية مطلوبا.
لا تتوفر بعض أنواع عناصر HTML على محتوى. على سبيل المثال، فإنّ عنصر العودة إلى السَّطر (line break element) أي BR ليس لديه محتوى؛ دوره الوحيد هو إنهاء سطر نصيّ. مثل وسوم النِّهاية الفارغة هذه لا تكون لديها أبدا وسوم نهاية. تعريف نوع المستند ونص التَّحديد (specification) هما الذين يُحدِّدان إذا ما كان نوع عنصر ما فارغاً (ليس لديه محتوى) أو، في حالة إذا كان لديه محتوى، يُقرِّران ما يُعْتَبَر محتوى شرعيّاً.
السِّمة الدَّائمة لأسماء العناصر (Element names) هي كونها غير مُتحِّسة لحالة الحروف (case-insensitive).
رجاءً، اطلع على مقياس SGML للحصول على معلومات بخصوص القواعد التِّي تتحكم في العناصر (على سبيل المثال: يجب أن تكون متداخلة بشكل صحيح، فوسم النِّهاية يُغْلِق، بالرُّجوع إلى وسم البداية المطابق، كافةَ وسوم البداية التِّي بينهما والتِّي لم يتم إغلاقها نظرا لإغفال وسوم النِّهاية (الفصل 7.5.1)، إلخ.).
على سبيل المثال، الفقرة التَّاليّة:
<P> هذه هي الفقرة الأولى. </P> ...عنصر مقطع (block element)...
يمكن إعادة كتابتها من دون وسمها النِّهائيّ:
<P> هذه هي الفقرة الأولى. ...عنصر مقطع (block element)...
باعتبار أنَّ وسم البداية <P> يتم إغلاقه من قبل عنصر المقطع التَّاليّ. بنفس الطَّريقة، إذا كانت هناك فقرة مُحاطة بعنصر مقطع، مثلما في:
<DIV> <P>هذه هي الفقرة. </DIV>
فإنّ وسم النِّهاية الخاص بعنصر المقطع المُحيط (enclosing block element) (هنا: </DIV>) ينطوي على وسم النِّهاية الخاص بوسم البداية <P> المفتوح.
العناصر ليست هي الوسوم. بعض النَّاس يشير إلى العناصر على أنَّها وسوم (على سبيل المثال: "وسم P"). تذكّر أنَّ العنصر شيء وأنّ الوسم (سواء أ كان وسم بداية أو وسم نهاية) هو شيء آخر. على سبيل المثال: عنصر HEAD هو دائم التَّواجد، حتى وإن غاب كلا وسمي البداية والنِّهاية الخاصين بـ HEAD في التَّوسيم (markup).
كافة أنواع العناصر المُصرَّح بها في هذا التَّحديد مُدوَّنَة في لائحة في فهرس العناصر (element index).
يمكن للعناصر أن تتوفر على خصائص مشترَكة، تُدعى السِّمات (attributes)، التِّي يمكن أن تكون لديها قيم (بشكل إفتراضيّ، أو أن تُحدَّد قيمتها من قبل مؤلفين أو خواطيط). تظهر أزواج السِّمة/القيمة (Attribute/value pairs) قبل ">" النِّهائيّ الخاص بوسم بداية عنصر. يمكن لأي عدد من أزواج قيمة/سِمة (شَرعيّة) "attribute/value pairs"، مفصول بينها بمسافات، أن تظهر في وسم بداية عنصر ما. يمكنها أن تظهر بأيّ ترتيب كان.
في هذا المثال، حُدِّدَت السِّمة id لأجل عنصر H1:
<H1 id="section1"> هذا عنوان (heading) شُخِّص كذلك بفضل سِمة id </H1>
إفتراضيا، فإنّ SGML تشترط أن تكون كافة قيم السِّمات (attribute values) واضحة المعالم (delimited) إما باستخدام علامات إقتباس مُزدوجة (ASCII عشري 34) أو علامات إقتباس مفردة (ASCII عشري 39). يمكن تضمين علامات الإقتباس المُفرَدَة ضمن قيمة السِّمة عندما تكون القيمة مُحاطة بعلامات اقتباس مُزدوجة، والعكس صحيح. يمكن للمؤلفين أيضا إستخدام إحالات الحروف الرَّقميّة (numeric character references) لتمثيل علامات الإقتباس المُزدَوَجَة (") وعلامات الإقتباسات المُفردَة ('). بالنِّسبة لعلامات الإقتباس المُزدوجة، فيمكن للمؤلفين أيضا استخدام إحالة الكيان الحرفيّ (character entity reference) ".
في بعض الحالات، يمكن للمؤلفين تحديد قيمة سِمة ما من دون أيّ علامات اقتباس. يمكن لقيمة السِّمة أن تحتوي فقط على حروف (a-z و A-Z)، أرقام (0-9)، شَرْطَات الوصل (ASCII عشريّ 45)، نقاط (ASCII عشريّ 46)، الشَّرْطَات السُّفْلِيَّة (ASCII عشريّ 95) والنُّقطتين (ASCII عشريّ 58). إنَّنا نوصي باستخدام علامات الإقتباس حتى حيث يمكن انتزاعها.
السِّمة الدَّائمة لأسماء السِّمات هي أنَّها غير مُتحسِّسَة لحالة الحروف.
على العموم، فإنّ قيم السِّمات تتسم بكونها غير مُتحسِّسَة لحالة الحروف. يُشير تعريف كلّ سِمة، في الدَّليل المرجعيّ، إذا ما كانت قيمتها غير مُتحسِّسَة لحالة الحروف.
كافة السِّمات، المُعرَّفة من قبل هذا التَّحديد، مُدوَّنَة في لائحة بـفهرس السِّمات.
الإحالات الحرفيّة هي أسماء رقميَّة أو رمزيّة للحروف التي يمكن تضمينها في مستند HTML. تتسم بكونها مُفِيدَة عند الإحالة باتجاه الحروف النَّادرة الإستخدام أو تلك التِّي تجعلها الأدوات التَّأليفيَّة صعبة أو مستحيلة الإدخال. سيكون بإمكانك مشاهدة إحالات حرفيّة على طول هذا المستند، هي تبدأ برمز "&" وتنتهي بفاصلة منقوطة (;). بعض الأمثلة الشَّائعة تتضمن:
ستكون الإحالات الحرفيّة الخاصة بـHTML محل نقاش مُفَصَّل في الفصل المتعلق بـمجموعة الحروف الخاصة بـمستندات HTML. يحتوي التَّحديد أيضا على لائحة الإحالات الحرفيّة التِّي يمكن أن تظهر في مستندات HTML 4.
يُعبَّر عن تعليقات HTML بالصِّيغة التَّاليَّة:
<!-- هذا تعليق --> <!-- وهذا آخر يشغُل أكثر من سطر واحد -->
لا يُسْمَح بالفراغات بين فاصل فتح تصريح وسم ("<!") وفاصل فتح تَعليق ("--") لكن يُسْمح لها بين فاصل إغلاق تعليق ("--") وفاصل إغلاق تصريح الوسم (">"). هناك خطأ شائع يكمن في تضمين سلسلة من شَرْطات وصل ("---") في تعليق. يجب على المؤلفين تجنب وضع إثنين أو أكثر من شَرْطات الوصل تكون متجاورة داخل التَّعليقات.
ليس للمعلومات التِّي تظهر بين التَّعليقات معنى خاصا (على سبيل المثال: الإحالات الحرفيّة لا تُتَرجَم على هذا النَّحو).
انتبه أنَّ التَّعليقات هي عبارة عن وسم.
كلُّ تصريح للعنصر وللسِمة، في هذا التَّحديد، هو مصحوب بمقطعه الخاص بـتعريف نوع المستند. لقد إخترنا تضمين مقاطع تعريف نوع المستند في التَّحديد بدلا من البحث عن مقاربة تكون أكثر منالية، وبالتّالي وسيلة أطول وأقل دقة لوصف خصائص عنصر. يسمح الدَّرس التَّاليّ للقرَّاء غير المُعتادين على SGML بقراءة تعريف نوع المستند (DTD) وفهم التَّفاصيل التِّقنيَّة الخاصة بتحديد HTML.
في تعريفات أنواع المستندات، يمكن لـلتَّعليقات أن تمتد على سطر أو اكثر. في تعريف نوع المستند، يتم الفصل بين التَّعليقات بواسطة زوج من علامات "--"، على سبيل المثال:
<!ELEMENT PARAM - O EMPTY -- قيمة خاصية مسماة -->
يبدأ تعريف نوع مستند HTML بسلسلة من تعريفات الكيانات المَعْلَمَات (Parameter entity definitions). يُعَرِّف تعريف كيان مَعْلَمَة نوعا من الماكرو التِّي يمكن إحالتها وتمديدها في أيّ مكان آخر في تعريف نوع المستند. لا يمكن لهذه الماكروهات أن تظهر في مستندات HTML، فقط في تعريف نوع المستند. يمكن لأنواع أخرى من الماكروهات، وتُدْعَى إحالات حرفيّة، أن تستخدم في نص مستند HTML أو ضمن قيم سِمات.
عند الإحالة لكيان المَعْلَمَة عبر الإسم في تعريف نوع المستند، فإنَّه يتم تمديده داخل السِّلسلة النَّصيَّة.
يبدأ تعريف كيان مَعْلَمَة بالكلمة المفتاحيَّة <!ENTITY % متبوعة باسم الكيان، السِّلسلة النَّصيَّة المُحاطة بعلامات اقتباس التي يتمدد الكيان نحوها وأخيرا وللإغلاق >. تبدأ مثيلات كيانات مَعْلَمَات (Instances of parameter entities) في تعريف نوع المستند بـ"%" ثم إسم الكيان المَعْلَمَة وتُنهَى بـ ";" إختياريّ.
المثال التَّاليّ يُعرِّف السِّلسلة النَّصيَّة التِّي يمتد إليها كيان "%fontstyle;" .
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
يمكن للسلسلة النَّصيَّة التِّي يمتد إليها الكيان المَعْلَمَة أن تحتوي أسماء كيانات مَعْلَمَات أخرى. هذه الأسماء يتم تمديدها بصورة تِكراريَّة. في المثال التَّاليّ، عُرِّفَ الكيان المَعْلَمَة "%inline;" بغرض تضمين الكيانات المَعْلَمَات "%fontstyle;" - "%phrase;" - "%special;" و "%formctrl;".
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
غالبا ما ستُصَادِف كيانين إثنين لتعريف نوع المستند (DTD entities) في تعريف نوع مستند HTML وهما: "%block;" "%inline;". وتُسْتَخْدَمَان عندما يتضمن نموذج المحتوى (content model) عناصر من مستوى المقطع وعناصر على الخط (block-level and inline elements)، (المُعرَّفة في فصل البنية الشَّامِلَة لمستند HTML) بالتَّرتيب.
يتألف معظم تعريف نوع مستند HTML من تصريحات أنواع العناصر وسِماتها. تبدأ الكلمة المفتاحيَّة <!ELEMENT تصريحاً وينهيها حرف >. بينهما يتم تحديد:
في هذا المثال:
<!ELEMENT UL - - (LI)+>
يُوَضِّحُ هذا المثال تصريح نوع عنصر فارغ:
<!ELEMENT IMG - O EMPTY>
يصف نموذج المحتوى ما يمكن أن يُحْتَوَى من قبل مثيل نوع عنصر (instance of an element type). يمكن لـ نموذج المحتوى أن يتضمن:
يتم تحديد نموذج المحتوى الخاص بعنصر ما بواسطة الصِّيغة التَّاليَّة. رجاءً، لاحظ أن اللائحة التِّي بالأسفل هي تبسيط لكامل قواعد صيغ SGML وهي لا تتطرق، على سبيل المثال، إلى الأسبقيات (precedences).
هذه بعض الأمثلة من HTML DTD:
<!ELEMENT UL - - (LI)+>
يجب على عنصر UL أن يحتوي على عنصر LI واحد أو أكثر.
<!ELEMENT DL - - (DT|DD)+>
يجب على عنصر DL أن يحتوي على عنصر DT أو DD واحد أو أكثر، بأيّ ترتيب.
<!ELEMENT OPTION - O (#PCDATA)>
يمكن لعنصر OPTION أن يحتوي فقط على نص وكيانات، مثل & -- يُشار إلى هذا بواسطة نوع بيانات SGML: #PCDATA.
تستخدم بعض أنواع عناصر HTML ميزة إضافيَّة في SGML لاستبعاد عناصر من نموذجها للمحتوى. تُسْبَق العناصر المُسْتَبْعَدَة (Excluded elements) بشَرْطَة وصل. تطغى الإستثناءات الصَّريحة على العناصر المسموحة (permitted elements).
في هذا المثال، تعني -(A) أنَّ العنصر A لا يمكنها الظهور في عنصر A آخر (على سبيل المثال، لا يمكن للمراسي أن تكون متشابكة).
<!ELEMENT A - - (%inline;)* -(A)>
لاحظ أنَّ نوع العنصر A هو جزء من الكيان المَعْلَمَة لتعريف نوع المستند "%inline;" لكنَّه مُسْتَبْعَد بشكل صريح بسبب -(A).
بنفس الطَّريقة، فإنَّ تصريح نوع العنصر التَّاليّ الخاص بـ FORM يحظر النَّماذج المُتشابكة (nested forms):
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>
الكلمة المفتاحيَّة <!ATTLIST تبدأ تصريح السِّمات التِّي يمكن لعنصر أن يأخذه. هو متبوع بإسم العنصر المقصود، لائحة تعريفات السِّمات وكذا > للإغلاق. كل تعريف سِمة هو ثلاثية تُعَرِّف:
في هذا المثال، السِّمة name عُرِّفَت لأجل عنصر MAP. تتسم السِّمة بكونها إختياريَّة بالنِّسبة لهذا العنصر.
<!ATTLIST MAP name CDATA #IMPLIED >
يُقَدَّم نوع القيم، المسموح بها من أجل السِّمة، على أنَّه CDATA، نوع بيانات خاص بـ SGML. CDATA هي نص يمكنه احتواء إحالات حرفيَّة.
لمزيد من المعلومات بخصوص "CDATA"، "NAME"، "ID" وأنواع بيانات أخرى، رجاءً، اطلع على الفصل المتعلق بـأنواع بيانات HTML.
الأمثلة التَّاليَّة توضح العديد من تعريفات السِّمات:
rowspan NUMBER 1 -- عدد الصفوف المُشْتَمَل عليها من قبل خلية --
http-equiv NAME #IMPLIED -- إسم ترويسة إجابة HTTP --
id ID #IMPLIED -- المُعرِّف الوحيد لمجمل المستند --
valign (top|middle|bottom|baseline) #IMPLIED
تشترط سِمة rowspan قيماً من نوع NUMBER. تُعْطَى القيمة الإفتراضيَّة، وبشكل صريح، على أنَّها "1". تشترط سِمة http-equiv الإختياريَّة قيماً من نوع NAME. تشترط سِمة id الإختياريَّة قيماً من نوع ID. وتقتصر سِمة valign الإختياريَّة على أخذ قيم من المجموعة {top, middle, bottom, baseline}.
يمكن لتعريفات السِّمات أيضا أن تحتوي على إحالات كيانات مَعْلَمَات (parameter entity references).
في هذا المثال، نلمح أنَّ لائحة تعريفات السِّمات لأجل العنصر LINK تبدأ بالكيان المَعْلَمَة "%attrs;".
<!ELEMENT LINK - O EMPTY -- رابط مستقل عن الوسائط --> <!ATTLIST LINK %attrs; -- %coreattrs, %i18n, %events -- charset %Charset; #IMPLIED -- تشفير حروف المورد المربوط -- href %URI; #IMPLIED -- مُعَرِّف المورد الكلّيّ (URI) الخاص بالمورد المربوط -- hreflang %LanguageCode; #IMPLIED -- شيفرة اللُّغة -- type %ContentType; #IMPLIED -- نوع محتوى استشاريّ -- rel %LinkTypes; #IMPLIED -- أنواع روابط متقدِّمة -- rev %LinkTypes; #IMPLIED -- أنواع روابط تراجعيَّة -- media %MediaDesc; #IMPLIED -- للتصيير على هذه الوسائط -- >
وسم البداية: مُستلزم (required)، وسم النِّهاية: ممنوع (forbidden)
عُرِّفَ الكيان المَعْلَمَة "%attrs;" كالتَّالي:
<!ENTITY % attrs "%coreattrs; %i18n; %events;">
يتمدَّد الكيان المَعْلَمَة "%coreattrs;" في التَّعريف "%attrs;" كالتّالي:
الكيان المَعْلَمَة "%attrs;" عُرِّف مسبقا بغرض الملاءمة باعتبار أنَّ هذه السِّمات مُعَرَّفة لأجل معظم أنواع عناصر HTML.
بنفس الطَّريقة، فإنَّ الـ DTD يُعرِّف الكيان المَعْلَمَة "%URI;" على أنَّه يتمدد داخل السِّلسلة النَّصيَّة "CDATA".
مثلما يوضح هذا المثال، فإنَّ الكيان المَعْلَمَة "%URI;" يُزوِّد قراء تعريف نوع المستند بمزيد من المعلومات مثلما الحال بالنِّسبة لنوع البيانات المُتوَّقَعَة لسِمة. كيانات مماثلة قد تم تعريفها لأجل "%Color;"، "%Charset;"، "%Length;"، "%Pixels;" إلخ.
تلعب بعض السِّمات دور متغيِّرات منطقيَّة (على سبيل المثال: سِمة selected لأجل العنصر OPTION). إنَّ ظهورها في وسم البداية الخاص بعنصر ينطوي على أنَّ قيمة السِّمة هي "true". ينطوي غيابها على قيمة "false".
يمكن للسِمات المنطقيَّة أن تأخذ بصورة شرعيَّة قيمة مفردة: إسم السِّمة نفسها (على سبيل المثال: selected="selected").
يُعرِّف هذا المثال السِّمة selected لتكون سِمة منطقيَّة.
selected (selected) #IMPLIED -- الخيار قد تم انتقاؤه مسبقاً --
عُيّْنت السِّمة لتكون "صحيحة - true" بالظُّهور في وسم بداية العنصر:
<OPTION selected="selected"> ...محتويات... </OPTION>
في HTML، يمكن للسِمات المنطقيَّة أن تظهر في شكل مُصَغَّر -- تظهر قيمة السِّمة لوحدها في وسم بداية العنصر. وهكذا، فإنَّه يمكن تحديد selected بكتابة:
<OPTION selected>
بدلا من:
<OPTION selected="selected">
يجب على المؤلفين أن يدركوا أن العديد من الوكلاء المستخدمين يتعرفون فقط على الشَّكل المُصَغَّر للسمِات المنطقيَّة وليس الشَّكل الكامل.