- From: Maciej Stachowiak <mjs@apple.com>
- Date: Sat, 14 Jan 2006 14:48:41 -0800
- To: www-svg@w3.org
- Cc: www-style@w3.org
As requested by Jon Ferraiolo, here's a rough cut at reformulating
SVG whitespace handling in terms of style properties, to eventually
phase out use of xml:space and to be more compatible with a CDF
environment. I have Cc'd www-style because I believe that changes to
CSS may be required.
Here's what the SVG Tiny 1.2 spec says now:
==============
* default (the initial value for xml:space) - When
xml:space="default", the SVG user agent will do the following using
a copy of the original character data content. First, it will remove
all newline characters. Then it will convert all tab
characters into space characters. Then, it will strip off all leading
and trailing space characters. Then, all contiguous
space characters will be consolidated.
* preserve - When xml:space="preserve", the SVG user agent will do
the following using a copy of the original
character data content. It will convert all newline and tab
characters into space characters. Then, it will draw all space
characters, including leading, trailing and multiple contiguous space
characters. Thus, when drawn with xml:
space="preserve", the string "a b" (three spaces between "a" and
"b") will produce a larger separation between
"a" and "b" than "a b" (one space between "a" and "b").
===============
Here's my proposal for how to change this.
* The default setting for xml:space for SVG elements is "preserve".
In "preserve" mode, all whitespace is preserved in the DOM as is.
* xml:space="default" is deprecated, in favor of using whitespace-
related properties.
* The default whitespace property settings for SVG elements are set
up so that whitespace is not collapsed, but linefeeds and tabs are
treated as spaces.
At this point, there are two choices:
1) CSS 2.1 has no ability to treat linefeeds or tabs as spaces but
not collapse them, in the white-space property. However, a new white-
space value could be added (in CSS 2.1.1?) that gives the SVG
behavior. Possible names would be "pre-space", "pre-nobreak", "pre-
all-as-space", or something like that. Then when/if CSS3 expands the
whitespace properties, it can ensure that the SVG mode is covered too.
2) Some CSS3 Text drafts have included a linefeed-treatment property
(as in XSL) that allows linefeeds to be treated as spaces. Adding an
analogoues tab-treatment, it would be possible to say that for SVG
there is a default style of { white-space: pre; linefeed-treatment:
treat-as-space; tab-treatment: treat-as-space; } However, the latest
Text Effects module replaced all the whitespace properties with a new
white-space-collapse property. As far as I can tell, white-space-
collapse cannot even be used to implement all the CSS 2.1 white-space
modes, so I'm not sure what the CSS WG intends here.
Now for xml:space="default", there are multiple options for how to
treat it.
A) Define it as transforming the DOM in the specified way, such that
even standard DOM access to the characters gives the transformed
string. This is useful, but problematic for interoperability since it
would be harder to use a single XML parser for multiple languages if
they defined their own meanings for "default". The XML spec does not
define a behavior for "default".
B) Have it leave the DOM alone, but apply { white-space: collapse;
linefeed-treatment: ignore; } (or invent yet another CSS 2.1
whitespace mode for it - "collapse-strip-linefeeds" or something).
My own preference of options is 1 and A, with "default" deprecated
and its special behavior slated to be removed in a future revision of
the SVG spec.
I'm hoping for guidance from the CSS WG and feedback from the SVG WG.
Note: this proposal is not meant to supercede my comment that
whitespace treatment in SVG should be reformulated generally; I would
like to see that happen even if this specific proposal is fatally
flawed in some way. I dashed it off pretty quickly and did not try to
figure out all the details.
Regards,
Maciej
Received on Monday, 30 January 2006 23:23:04 UTC