- From: fantasai <fantasai.lists@inkedblade.net>
- Date: Mon, 04 Oct 2004 12:06:44 -0400
- To: www-style@w3.org
Purpose ======= The line-breaking and white space properties in CSS3 Text CR are - too many - too convoluted to be efficient and understandable in CSS. There are a fair number of meaningless and redundant combinations, so the discrete combinatorial effect is not necessary. (It can actually be troublesome in a cascading environment such as CSS.) This is a proposal for revising these controls, mainly by simplifying them into fewer properties. Comments, questions, additional background info, implementation notes, and suggestions are all welcome. They should preferably be sent to www-style@w3.org. Notice: Reply-to is set to www-style (which is public), so watch your follow-ups. I will be producing the next revision of CSS3 Text, so if this topic is important to you, you might want to pay attention. :) Open Issues =========== Are there any compatibility issues I'm missing? Are all necessary combinations of white space controls available? (MathML, i18n, I'm looking in your direction.) For text wrapping, is there a preference for version A or version B? Name suggestions for 'white-space-something'? References ========== CSS3 Text: http://www.w3.org/TR/css3-text/#line-breaking XSL: http://www.w3.org/TR/xsl/slice7.html#section-N38191-Block-and-Line-related-Properties MSWinIE: http://msdn.microsoft.com/workshop/author/dhtml/reference/properties.asp Part I: Breaking Lines ====================== CSS3 Text defines the following properties to affect line breaking behavior: Property Origin Controls -------- ------ -------- line-break WinIE Japanese line break rules: strict vs. loose word-break-cjk Allowing breaks within CJK and/or non-CJK word-break-inside Hyphenation word-break (shorthand) WinIE (WinIE's name for word-break-cjk) wrap-option XSL:FO Text wrapping Line Breaking Rules ------------------- CSS3 Text: line-break: normal | strict word-break-cjk: keep-all | normal | break-all XSL: n/a WinIE: line-break: normal | strict word-break: keep-all | normal | break-all Proposed: word-break: keep-all | strict | normal | break-all Justification: Practically-speaking, there's only one scale of strictness. strictest <----------------------> loosest line-break | irrelevant | strict | normal | normal | word-break-cjk | keep-all | normal | normal | break-all | * normal vs. strict line-breaking is irrelevant when keep-all takes effect. * The combination of strict and break-all makes little sense. (Why would you allow breaks in scripts like Latin, where breaking words in random places is wrong, but disallow breaks before small kana, where breaking is merely discouraged?) Compatibility: wrt XSL - n/a wrt WinIE - The proposal uses the WinIE property name and values. It also adds a new value, 'strict', which will be ignored in WinIE. A style sheet can cause IE to recognize the same effect by also specifying "line-break: strict". Hyphenation ----------- CSS3 Text: word-break-inside: none | hyphenate XSL: a slew of separate hyphenation controls, see spec WinIE: n/a Proposed: hyphenation: none | auto Justification: I agree with CSS3 Text in that a simple switch is enough for CSS3. However, I think the name 'word-break-inside' is really obscure, and there's no need to create a shorthand for combining it with word-break. So let's just call it 'hyphenation'. This also presents a nicer framework for adding hyphenation limits later on. Text Wrap --------- CSS3 Text: wrap-option: wrap | no-wrap | soft-wrap | emergency XSL: wrap-option: no-wrap | wrap WinIE: word-wrap: normal | break-word [wrap / no-wrap settings given with 'white-space'] Proposed A: wrap-option: wrap | no-wrap | character-wrap | force-wrap Proposed B: text-wrap: wrap | nowrap | character-wrap word-wrap: normal | break-word Justification: 'soft-wrap' is misleading: to most people, it means "wrap without inserting hard line breaks" 'emergency' is weird and inaccurate (it wraps on regular breaks when it's not an "emergency"); 'force-wrap' is much more self-explanatory. (This value allows wrapping of very long words words to prevent overflow.) Compatibility: * The advantage of separating out word-wrap is that it cascades independently. Since wrapping is traditionally set by the 'white-space' property, which currently has no force-wrap option, this allows easy, current-ua-compatible retro-fitting of existing content: set "word-wrap: break-word" on the root element, and any time you set 'white-space' to allow wrapping, it will allow force-wrapping in UAs that support it. * WinIE has already implemented things this way, and we can define 'wrap-option' as a shorthand that will be compatible with XSL. * If we take this route, the 'white-space' shorthand will not be able to set force-wrapping (because white-space and word-wrap will be independent). * If we didn't have this backwards-compat situation, it would certainly be better not to split them up. Part II: White Space Handling ============================= CSS3 Text defines the following properties to affect white space processing: Property Origin Controls -------- ------ -------- linefeed-treatment XSL how to transform line breaks white-space-treatment XSL whether to preserve other white space all-space-treatment XSL whether to collapse remaining white space CSS3 Text: linefeed-treatment: auto | ignore | preserve | treat-as-space | treat-as-zero-width-space | ignore-if-after-linefeed white-space-treatment: ignore | preserve | ignore-if-before-linefeed | ignore-if-after-linefeed | ignore-if-surrounding-linefeed all-space-treatment: preserve | collapse XSL: linefeed-treatment: auto | ignore | preserve | treat-as-space | treat-as-zero-width-space | ignore-if-after-linefeed white-space-treatment: ignore | preserve | ignore-if-before-linefeed | ignore-if-after-linefeed | ignore-if-surrounding-linefeed white-space-collapse: true | false WinIE: n/a Proposed: white-space-something: discard | preserve | [ collapse || [ auto-collapse-breaks | space-collapse-breaks | zero-width-collapse-breaks | discard-breaks | preserve-breaks ] ] 'collapse' implies 'auto-collapse-breaks' '*-breaks' implies 'collapse' examples: /* Discard all white space, including breaks */ white-space-sth: discard; /* Preserve all white space, including breaks as in "white-space: pre" / "white-space: pre-wrap" */ white-space-sth: preserve; /* Collapse consecutive white space into single space, auto-collapsing breaks and surrounding white space based on surrounding script context (-> space, zwsp, or discard) as in "white-space: normal" / "white-space: nowrap" */ white-space-sth: collapse; white-space-sth: collapse auto-collapse-breaks; white-space-sth: auto-collapse-breaks collapse; white-space-sth: auto-cllapse-breaks; /* Collapse consecutive white space into single space, collapsing breaks and surrounding white space into single space */ white-space-sth: collapse space-collapse-breaks; white-space-sth: space-collapse-breaks collapse; white-space-sth: space-collapse-breaks; /* Collapse consecutive white space into single space, collapsing breaks and surrounding white space into zero-width space */ white-space-sth: collapse zero-width-collapse-breaks; white-space-sth: zero-width-collapse-breaks collapse; white-space-sth: zero-width-collapse-breaks; /* Collapse consecutive white space into single space, but discard collapse breaks and surrounding white space */ white-space-sth: collapse discard-breaks; white-space-sth: discard-breaks collapse; white-space-sth: discard-breaks; /* Collapse consecutive white space into single space, but discard collapse breaks and surrounding white space as in "white-space: pre-lines" */ white-space-sth: collapse preserve-breaks; white-space-sth: preserve-breaks collapse; white-space-sth: preserve-breaks; Justification: The three properties in the current version of CSS3 Text, which were inherited from XSL, result in 60 different combinations of white-space processing rules, a lot of which are redundant or useless. (E.g. some result in consecutive zero-width spaces, some result in a combination of spaces and zwsp that has no useful application that I can think of, etc.) More importantly, these properties do not need to cascade independently, so they should be combined into one property that can represent all generally useful values. I believe I've covered most things. Let me know if I've missed a necessary value. Part III: Shorthand =================== CSS3 Text: white-space: normal | pre | nowrap | pre-wrap | pre-line XSL: white-space: normal | pre | nowrap WinIE: white-space: normal | pre | nowrap Proposed A: white-space: normal | pre | nowrap | pre-wrap | pre-line | force-wrap | pre-force-wrap | line-force-wrap Justification: Add values to 'white-space' shorthand to represent the force-wrap setting. (Only needed if we go with version A of wrap-option.) How this fits with XSL ====================== For features that are parallel, it should be possible to map from CSS to XSL. Going the other way, however, is not so much of a priority. (There are several areas where CSS does not need such a fine level of control.) Thanks go to Ada Chan of MS Corp. for researching and reporting on WinIE's implementation of CSS3 Text capabilities. ~ ~fantasai
Received on Monday, 4 October 2004 16:06:49 UTC