CYAN YELLOW MAGENTA BLACK www.sharexxx.net - free books & magazines IN THIS BOOK YOU’LL LEARN: H a i How to avoid presentational markup and streamline your HTML n e How to enrich your content with semantic meaning When to use all the available advanced XHTML and HTML elements Advanced semantic technologies such as Microformats The future of markup, including a look ahead at XHTML 2.0, Web Applications 1.0, and The Semantic Web H Also Available T M arkup is the fabric that holds the web together. But M most people only scratch the surface of what can be achieved using (X)HTML. That’s where this book comes in—it’s aimed at web designers and developers who have already L mastered the basics of web design, but want to take their markup further, making it leaner and more efficient, and semantically M richer. It is one thing to show the basics of HTML, but another altogether to show how to streamline and optimize that markup for a more efficient, more usable and accessible web site. A HTML Mastery does all this and more, showing all of the HTML S tags available, including less commonly used ones, where and how to use them, and clever styling and scripting techniques that T you can employ to take advantage of them on your web site. It is totally standards compliant, and up to date with modern web E design techniques. Forms and Tables are covered in particular R An in-depth guide to detail, as they are the most complex areas of HTML, where many the advanced HTML elements important elements are often overlooked. Y Covers XHTML and HTML, and In addition, the book also looks at some of the advanced CSS and JavaScript™ tips and tricks semantic tools available: an entire chapter is devoted to Microformats, and a nod is given to XHTML 2.0 and Web The future of markup, including Applications 1.0—web standards of the future. a look ahead at XHTML 2.0, Web Applications 1.0, and the Semantic Web SHELVING CATEGORY ISBN 1-59059-765-6 1.WEB DESIGN 53499 US $34.99 www.friendsofed.com Paul Haine www.htmlmastery.com 6 89253 59765 1 9 781590 597651 this print for reference only—size & color not accurate spine = 0.584" 248 page count 7656FM.qxp 11/16/06 11:33 AM Page i HTML Mastery: Semantics, Standards, and Styling Paul Haine 7656FM.qxp 11/16/06 11:33 AM Page ii HTML Mastery: Semantics, Standards, and Styling Copyright © 2006 by Paul Haine All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-59059-765-1 ISBN-10 (pbk): 1-59059-765-6 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence ofatrademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner,with no intention of infringement of the trademark. Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street,6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected],or visit www.springeronline.com. For information on translations, please contact Apress directly at 2560 Ninth Street,Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected],or visit www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is freely available to readers at www.friendsofed.com in the Downloads section. Credits Lead Editor Assistant Production Director Chris Mills Kari Brooks-Copony Technical Reviewer Production Editor Ian Lloyd Ellie Fountain Editorial Board Compositor Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Lynn L’Heureux Gilmore, Jonathan Gennick, Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Proofreader Shakeshaft,Jim Sumser, Keir Thomas, Matt Wade Linda Seifert Project Manager Indexer Elizabeth Seymour Julie Grady Copy Edit Manager Interior and Cover Designer Nicole Flores Kurt Krames Copy Editors Manufacturing Director Nicole Flores, Ami Knox Tom Debolski 7656FM.qxp 11/16/06 11:33 AM Page iii CONTENTS AT A GLANCE Chapter 1: Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Chapter 2: Using the Right Tag for the Right Job. . . . . . . . . . . . . . 21 Chapter 3: Table Mastery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Chapter 4: Form Mastery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Chapter 5: Purpose-Built Semantics: Microformats and Other Stories . . . . . . . . . . . . . . . . . 117 Chapter 6: Recognizing Semantics. . . . . . . . . . . . . . . . . . . . . . . . . 157 Chapter 7: Looking Ahead: XHTML 2.0 and Web Applications 1.0. . . . . . . . . . . . . 185 Appendix A: XHTML As XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Appendix B: Frames, and How to Avoid Them . . . . . . . . . . . . . . . 205 Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 7656FM.qxp 11/16/06 11:33 AM Page iv 7656FM.qxp 11/16/06 11:33 AM Page v CONTENTS Chapter 1: Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 (X)HTML terminology. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Elements and tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Other terms you should know . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Divs and spans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Block and inline elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 id and class attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 XHTML vs. HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Differences between XHTML and HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Myths and misconceptions about XHTML and HTML. . . . . . . . . . . . . . . . . . . . 10 XHTML has a greater/fewer number of elements than HTML. . . . . . . . . . . . . 10 XHTML has better error-checking/is stricter/is more robust than HTML . . . . . . 11 XHTML is more semantic/structural than HTML . . . . . . . . . . . . . . . . . . . . 11 XHTML is leaner/lighter than HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 XHTML is required for web standards compliance. . . . . . . . . . . . . . . . . . . 12 What’s all this noise about MIME types?. . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Deciding between HTML and XHTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Anatomy of an XHTML document. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Doctype declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Available doctypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Purposes of doctypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 The <html>, <head>, and <body> elements . . . . . . . . . . . . . . . . . . . . . . . . 16 The XML declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Anatomy of an HTML document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 7656FM.qxp 11/16/06 11:33 AM Page vi CONTENTS Chapter 2: Using the Right Tag for the Right Job. . . . . . . . . . . . . . 21 Document markup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Paragraphs, line breaks, and headings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Contact information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Quotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Block quotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Inline quotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Unordered and ordered lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 The definition (is this) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Relationship issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Targeting links. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Accessible linking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Marking up changes to your document . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Presentational elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Font style elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 The <hr>, <pre>, <sup>, and <sub> elements . . . . . . . . . . . . . . . . . . . . . . . 43 Phrase elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Emphasis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Citations and definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Coding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Images and other media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Inline images. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 CSS background images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Image maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Being objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Chapter 3: Table Mastery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Table basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Adding structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Adding even more structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Associating data with headers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Abbreviating headers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Almost-standards mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Table markup summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Styling tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Presentational attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Spaced out. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Border conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Styling columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Striping table rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Scrollable tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 vi 7656FM.qxp 11/16/06 11:33 AM Page vii CONTENTS Scripting tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Conditional comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Hovering with scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Table sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Chapter 4: Form Mastery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Form markup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 The form container. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 text. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 password. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 checkbox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 hidden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 submit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Other input types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Other forms of input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Added structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Form usability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Use the right tag for the right job. . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Keep it short and simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Don’t make me think, don’t make me work, and don’t try to trick me . . . . . . 103 Remember that the Internet is global . . . . . . . . . . . . . . . . . . . . . . . . . 104 Styling forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Layout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Form controls styling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 CSS as an aid to usability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Scripting forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Forms as navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Manipulation of disabled controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Form event handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 vii 7656FM.qxp 11/16/06 11:33 AM Page viii CONTENTS Chapter 5: Purpose-Built Semantics: Microformats and Other Stories . . . . . . . . . . . . . . . . . 117 Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Microformats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 hCard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 hCalendar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 “rel-” microformats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 VoteLinks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 XOXO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 XFN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 hReview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 The Semantic Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 The Dublin Core Metadata Initiative. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Structured Blogging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Other implementations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Web 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Chapter 6: Recognizing Semantics. . . . . . . . . . . . . . . . . . . . . . . . . 157 Avoiding divitis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Styling the body . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Rounded-corner menus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 News excerpts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Footers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Avoiding span-mania. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Intentional spans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Avoiding classitis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Semantic navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 The importance of validity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Chapter 7: Looking Ahead: XHTML 2.0 and Web Applications 1.0. . . . . . . . . . . . . 185 XHTML 2.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Other new tags and attributes in XHTML 2.0. . . . . . . . . . . . . . . . . . . . . . . . 187 XForms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Preparing for XHTML 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Web Applications 1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 New tags and attributes in Web Applications 1.0 . . . . . . . . . . . . . . . . . . . . . 190 Web Forms 2.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Preparing for Web Applications 1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 viii 7656FM.qxp 11/16/06 11:33 AM Page ix CONTENTS Appendix A: XHTML As XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Serving XHTML as XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Things to watch out for. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 XHTML 1.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Modularization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 Ruby. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Simple Ruby markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Complex Ruby markup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Appendix B: Frames, and How to Avoid Them . . . . . . . . . . . . . . . 205 (X)HTML frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Targeting links within frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Inline frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Alternatives to frames. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Frame-like behavior with CSS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Future frames: XFrames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 ix