Copyright © 2011 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
CSS is a language for describing the rendering of structured documents (such as HTML and XML) on screen, on paper, in speech, etc. This draft contains the features of CSS level 3 relating to list styling. It includes and extends the functionality of CSS level 2 [CSS21], which builds on CSS level 1 [CSS1]. The main extensions compared to level 2 are a pseudo-element representing the list marker, and a method for authors to define their own list-styles.
This is a public copy of the editors' draft. It is provided for discussion only and may change at any moment. Its publication here does not imply endorsement of its contents by W3C. Don't cite this document other than as work in progress.
The (archived) public mailing list www-style@w3.org (see instructions) is preferred for discussion of this specification. When sending e-mail, please put the text “css3-lists” in the subject, preferably like this: “[css3-lists] …summary of comment…”
This document was produced by the CSS Working Group (part of the Style Activity).
This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
list-style-image
’ and
‘list-style-type
’ properties
list-style-position
’ property
list-style
’ shorthand
property
::marker
pseudo-element
@counter-style
’
rule
type
’
descriptor
negative
’ descriptor
prefix
’ descriptor
suffix
’ descriptor
range
’ descriptor
fallback
’ descriptor
glyphs
’
and ‘additive-glyphs
’
descriptors
The list model in this module differs in some important ways from the list model in CSS2, specifically in its handling of markers. Implementation experience suggested the CSS2 model overloaded the ::before and ::after pseudo-elements with too much behavior, while at the same time introducing new properties when existing properties were sufficient.
Most block-level elements in CSS generate one principal block box. In this module, we discuss two CSS mechanisms that cause an element to have an associated marker: one method associates one principal block box (for the element's content) with a separate marker box (for decoration such as a bullet, image, or number), and the other inserts a marker box into the principal box. Unlike :before and :after content, the marker box cannot affect the position of the principal box, whatever the positioning scheme.
For instance, the following example illustrates how markers may be used to add parentheses around each numbered list item. This HTML application and style sheet:
<!doctype html>
<html>
<head>
<title>Creating a list with markers</title>
<style>
li::marker
{ content: "(" counter(list-item, lower-roman) ")"; }
li { display: list-item; }
</style>
</head>
<body>
<ol>
<li>This is the first item.</li>
<li>This is the second item.</li>
<li>This is the third item.</li>
</ol>
</body>
</html>
should produce something like this:
(i) This is the first item. (ii) This is the second item. (iii) This is the third item.
With descendant selectors and child selectors, it's possible to specify different marker types depending on the depth of embedded lists.
A future release of this module will probably include ways to render tree lists.
To declare a list item, the ‘display
’ property must be set to ‘list-item
’ or ‘inline-list-item
’ (defined later in this
section). This, in addition to generating a ::marker
pseudo-element and enabling the properties
described below for that element, causes that element to increment the
list item counter ‘list-item
’. (This
does not affect the specified or computed values of the counter
properties.)
The ‘list-item
’ counter is a real
counter, and can be directly affected using the ‘counter-increment
’ and ‘counter-reset
’ properties. It can also be used in
the ‘counter()
’ and ‘counters()
’ functions.
Property: | ‘display ’
|
---|---|
New Value: | inline-list-item |
Initial: | same as CSS2.1 |
Applies to: | same as CSS2.1 |
Inherited: | same as CSS2.1 |
Percentages: | same as CSS2.1 |
Media: | same as CSS2.1 |
Computed value: | same as CSS2.1 |
The ‘inline-list-item
’ display value makes the
element a list item, which means it can generate a ::marker
pseudo-element. The element also affects the
predefined ‘list-item
’ counter, as
specified above. Otherwise, this display value is treated identically to
‘inline
’.
This display value is silly, and only necessary because we
haven't yet defined ‘display
’ to
be split into subproperties. When that happens, "being a list item" will
just be a property value that can apply to block, inline, and other
elements.
list-style-image
’ and ‘list-style-type
’ propertiesName: | list-style-image |
---|---|
Value: | <image> | none |
Initial | none |
Applies To: | list items |
Inherited: | yes |
Percentages: | N/A |
Media: | visual |
Computed Value: | specified value |
The ‘list-style-type
’ property specifies an
image that will be used as the list marker. If the value resolves to a
valid image, the image must be used as the default contents of the ::marker
pseudo-element.
If the value ‘none
’ is provided, or the <image>
doesn't resolve to a valid image, then the default contents are given by
‘list-style-type
’ instead.
The following example sets the marker at the beginning of each list item to be the image "ellipse.png".
LI { list-style-image: url("http://www.example.com/ellipse.png") }
Name: | list-style-type |
---|---|
Value: | <string> | <counter-style> | none |
Initial: | disc |
Applies To: | list items |
Inherited: | yes |
Percentages: | N/A |
Media: | visual |
Computed Value: | specified value |
When the ‘list-style-image
’ property is ‘none
’ or not a valid image,
the ‘list-style-type
’ property must instead
used to construct the default contents of a list item's marker.
::marker
pseudo-element must use the
provided string as its default contents.
The ::marker
pseudo-element's default contents
must be the value of the ‘list-item
’
counter, formatted according to the given counter style. Algorithms for
formatting a value according to a counter style are given later in this
spec.
This specification defines a method for authors to create their own counter styles which may be used here. Additionally, many useful counter styles are predefined in the sections on Complex Counter Styles and Predefined Counter Styles.
::marker
pseudo-element must have no
default contents. This will suppress the creation of a marker unless the
::marker
has its contents specified directly
through the ‘content
’ property.
The following examples illustrate how to set markers to various values:
ul { list-style-type: "★"; } /* Sets the marker to a "star" character */ p.note { display: list-item; list-style-type: "Note:"; list-style-position: inside; } /* Gives note paragraphs a marker consisting of the string "Note:" */ ol { list-style-type: upper-roman; } /* Sets all ordered lists to use the upper-roman counter-style (defined in this specification) */ ul { list-style-type: none; } /* Suppresses the marker entirely, unless list-style-image is specified with a valid image, or the marker's contents are set explicitly via the 'content' property. */
list-style-position
’ propertyName: | list-style-position |
---|---|
Value: | inside | outside |
Initial: | outside |
Applies To: | list items |
Inherited: | yes |
Percentages: | N/A |
Media: | visual |
Computed Value: | specified value |
This property specifies the position of the ::marker
pseudo-element's box in the list item. Values have the following
meanings:
::marker
pseudo-element is a ‘display:inline
’ element placed immediately before
the ‘::before
’ pseudo-element in the
list item‘s
principle box, after which the element
’s content flows. Note
that if there is no inline content, this will create a line box, just as
content in an inline ‘::before
’
pseudo-element would. Also note that all the properties that apply to
inline elements apply to the ::marker
pseudo-element in this state, and this ::marker
box participates in the inline box model in the normal manner.
inside
’,
plus the ‘position
’ property on
the ::marker
pseudo-element must computer to
‘marker
’. The section on the new
‘marker
’ value for ‘position
’ explains the consequences of this.
Additionally, the base directionality of the ::marker
pseudo-element (used as an input to the bidi
resolution algorithm) must be taken from the marker's marker positioning
reference element.
Note that a marker is only generated if the computed value of the
‘content
’ property for the
element's ::marker
pseudo-element is not ‘none
’.
For example:
<!doctype html> <html> <head> <title>Comparison of inside/outside position</title> <style> ul.compact { list-style: inside; } ul { list-style: outside; } </style> </head> <body> <ul class=compact> <li>first "inside" list item comes first</li> <li>second "inside" list item comes first</li> </ul> <hr> <ul> <li>first "outside" list item comes first</li> <li>second "outside" list item comes first</li> </ul> </body> </html>
The above example may be formatted as:
* first "inside" list item comes first * second "inside" list item comes second ======================== * first "outside" list item comes first * second "outside" list item comes second
list-style
’
shorthand propertyName: | list-style |
---|---|
Value: | <‘list-style-type ’> || <‘list-style-position ’> || <‘list-style-image ’>
|
Initial: | see individual properties |
Applies To: | list items |
Inherited: | yes |
Percentages: | N/A |
Media: | visual |
Computed Value: | see individual properties |
The ‘list-style
’ property is a shorthand
notation for setting the three properties ‘list-style-type
’, ‘list-style-image
’, and ‘list-style-position
’ at the same place in
the style sheet.
For example:
UL { list-style: upper-roman inside } /* Any UL */ UL UL { list-style: circle outside } /* Any UL child of a UL */
Using a value of ‘none
’ in the shorthand is potentially
ambiguous, as ‘none
’ is a valid value for both ‘list-style-image
’ and ‘list-style-type
’. To resolve this
ambiguity, a value of ‘none
’ in the shorthand must be applied to
whichever of the two properties aren't otherwise set by the shorthand.
list-style: none disc; /* Sets the image to "none" and the type to "disc". */ list-style: none url(bullet.png); /* Sets the image to "url(bullet.png)" and the type to "none". */ list-style: none; /* Sets both image and type to "none". */ list-style: none disc url(bullet.png); /* Syntax error */
Although authors may specify ‘list-style
’ information directly on list
item elements (e.g., LI in HTML), they should do so with care. Consider
the following rules:
ol.alpha li { list-style: lower-alpha; } ul li { list-style: disc; } /* These won't work as expected. If you nest a <ul> into an <ol class=alpha>, the first rule's specificity will make the <ul>'s list items use the lower-alpha style. */ ol.alpha > li { list-style: lower-alpha; } ul > li { list-style: disc; } /* These work as intended. */ ol.alpha { list-style: lower-alpha; } ul { list-style: disc; } /* So do these, since inheritance will transfer the 'list-style' value to the list items. */
::marker
pseudo-elementMarkers are created by setting an element's ‘display
’ property to ‘list-item
’ or ‘inline-list-item
’. The ::marker
pseudo-element is only created if the computed
value of the ‘content
’ property
for the pseudo-element is not ‘none
’.
Just like other generated content, markers generate a box when they're
created, which has margins, border, padding, and everything else a box
normally has. Markers are placed at the beginning of their superior
parent's content, before the ::before pseudo-element (if it exists). ::marker
pseudo-elements are inline by default, though
certain values for ‘list-style-position
’ on the list item can
make the marker box positioned, which can have an effect on the computed
value of display.
In the following example, the content is centered within a marker box of a fixed width. This document:
<!doctype html>
<html>
<head>
<title>Content alignment in the marker box</title>
<style>
LI::marker
{
content: "(" counter(counter) ")";
width: 6em;
text-align: center;
}
LI {
display: list-item;
counter-increment: counter;
}
</style>
</head>
<body>
<ol>
<li>This is the first item.</li>
<li>This is the second item.</li>
<li>This is the third item.</li>
</ol>
</body>
</html>
should render something like this:
(1) This is the first item. (2) This is the second item. (3) This is the third item.
The next example uses markers to number notes (paragraphs).
The following document:
<!doctype html>
<html>
<head>
<title>Markers to create numbered notes</title>
<style>
P { margin-left: 12 em; }
P.Note::marker
{
content: url("note.gif") "Note " counter(note-counter) ":";
text-align: left;
width: 10em;
}
P.Note {
display: list-item;
counter-increment: note-counter;
}
</style>
</head>
<body>
<p>This is the first paragraph in this document.</p>
<p class="Note">This is a very short document.</p>
<p>This is the end.</p>
</body>
</html>
should render something like this:
This is the first paragraph in this document. Note 1: This is a very short document. This is the end.
The following example illustrates how markers may be offset from their element. This HTML application and style sheet:
<!doctype html>
<html>
<head>
<title>Marker example</title>
<style>
P { margin-left: 8em } /* Make space for counters */
LI::marker
{ margin: 0 3em 0 0; content: counter(list-item, lower-roman) "."; }
LI { display: list-item }
</style>
</head>
<body>
<p>This is a long preceding paragraph ...</p>
<ol>
<li>This is the first item.</li>
<li>This is the second item.</li>
<li>This is the third item.</li>
</ol>
<p>This is a long following paragraph ...</p>
</body>
</html>
should render something like this:
This is a long preceding paragraph ... i. This is the first item. ii. This is the second item. iii. This is the third item. This is a long following paragraph ...
(Note the use of the implicit counter increment.)
content
’
propertyIf a ::marker
pseudo-element has its ‘content
’ property set to ‘normal
’, the computed value of the marker's
‘content
’ property must be
determined according to the following algorithm:
list-style-image
’ is a valid image, then
the computed value of the ‘content
’ property is that image.
list-style-type
’ is a string, then the
computed value of the ‘content
’
property is that string.
list-style-type
’ is the name of a counter
style, then the computed value of the ‘content
’ property is
<counter-prefix> counter(list-item, <counter-name>)
<counter-suffix>
, where <counter-name> is the
computed value of the ‘list-style-type
’ property and
<counter-prefix> and <counter-suffix> are the values
of the prefix and suffix descriptors for the
counter style with that name.
none
’.
Given the following style sheet:
li { display: list-item; list-style-type: decimal /* initial value */; }
li::marker
{ content: normal /* initial value */; }
And the following document fragment:
<li>List Item</li>
The computed value of the ‘content
’ property on the ::marker
pseudo-element of the list item element is:
counter(list-item, decimal) "."
This section introduces a new positioning scheme, designed to model the way in which "outside" list markers were traditionally positioned in CSS 2.1. Outside list markers now have their positioning defined in terms of this new value.
The new positioning scheme defined in this section can be used on all
elements, not just ::marker
pseudo-elements. In
some situations, such as legal proceedings or official minutes, the
precise form that the list marker takes is a vital part of the content.
It's not acceptable for the marker to change (from a custom-defined marker
to a default bullet or alpha marker) just because the UA is not rendering
CSS, or a server error is temporarily preventing the CSS file from being
loaded, as the precise form of the marker is used to officially refer to
that segment. The only way to guarantee that the marker will be rendered
correctly, regardless of whether CSS is applied, is to specify the marker
outside of CSS, directly in the document's markup. However, the page
author may still want to style the marker in many of the ways that are
available to them when using ordinary CSS-generated markers. To accomodate
this, the new positioning scheme can be used to position the
marker-in-content as if it were an ordinary CSS-generated marker.
marker
’ value for ‘position
’Property: | ‘position ’
|
---|---|
New Value: | ‘marker ’
|
Initial: | same as CSS2.1 |
Applies to: | same as CSS2.1 |
Inherited: | same as CSS2.1 |
Percentages: | same as CSS2.1 |
Media: | same as CSS2.1 |
Computed value: | see prose, otherwise same as CSS2.1 |
The ‘marker
’ value for ‘position
’ depends on the element it is set on
having a list item ancestor. If the specified value of ‘position
’ is ‘marker
’ and the element does not have a list item
ancestor, ‘position
’ must compute
to ‘relative
’ on the element. An
element with position:marker
counts as absolutely
positioned.
The element's vertical position is calculated according to the normal flow. In the Positioned Layout Module this will be defined more precisely in terms of placeholders.
To calculate the element's horizontal position, we must first define a few terms:
If the ancestor list item has
‘marker-attachment:list-item
’, the marker positioning
reference element is the ancestor list item.
Otherwise, if the ancestor list
item has ‘marker-attachment:list-container
’ and has a
parent element, the marker positioning
reference element is the ancestor list item‘s parent.
Otherwise, the marker positioning reference element is the ancestor list item.
The element’s horizontal position must then be set such that the
element's margin edge that corresponds to the "end" edge of the marker positioning
reference element is flush with the ancestor list item‘s border edge that corresponds to the "start" edge of the marker positioning
reference element.
The purpose of this somewhat convoluted definition is to position the marker flush against its list item, and then when "marker-attachment:list-container", keep all the markers for a given list on the same side of their list items even in mixed-direction text, so that authors can specify padding on only one side and still ensure their markers are visible.
This handles ltr/rtl mixed-direction text, but not mixed horizontal and vertical text. For example, if the ancestor list container is vertical but the ancestor list item is horizontal, this definition is nonsensical, as it requires a vertical edge of the marker to be flush against a horizontal edge of the ancestor list item. Need to think on what UI would be acceptable for such a crazy case, and how to state it in non-crazy terms.
All elements or pseudo-elements with "position:marker"
that share a common ancestor list item are known as markers
associated with that list item.
The ’top', ‘right
’,
‘bottom
’, and ‘left
’ properties specify offsets relative to
the top, right, bottom, and left edges (respectively) of the element
itself, similar to how relative positioning works.
marker-attachment
’ propertyBy default, elements or ::marker
pseudo-elements
with ‘position:marker
’ position
themselves according to their list item's directionality. However, if the
list item is grouped with several other list items which may have
different directionality (for example, multiple <li>s with different
"dir" attributes in an <ol> in HTML), it is sometimes more useful to
have all the markers line up on one side, so the author can specify a
single "gutter" on that side and be assured that all the markers will lie
in that gutter and be visible. The ‘marker-attachment
’ property defined in
this section allows an author to control this, switching list items to
positioning their markers based off the list container's directionality
instead.
Property: | marker-attachment |
---|---|
Value: | list-item | list-container |
Initial: | list-item |
Applies to: | list items |
Inherited: | yes |
Percentages: | N/A |
Media: | visual |
Computed Value: | specified value |
When a list item has ‘marker-attachment:list-item
’, any markers associated with the list item base
their positioning off of the directionality of the list item. When a list
item has ‘marker-attachment:list-container
’, the associated markers instead base their
positioning off of the directionality of the list item's parent element.
The normative meaning of this is specified in the section defining position:marker.
@counter-style
’ ruleCSS 2.1 defined a handful of useful counter styles based on the styles that HTML traditionally allowed on ordered and unordered lists. This tiny set, though, is quite inadequate for modern web pages; displaying an ordered list with markers based on the latin alphabet while the content is Arabic seems quite incongruous!
Unfortunately, the set of potentially useful list styles is too large to
specify ahead of time - the world contains thousands of languages and
hundreds of scripts, not to mention the near-infinite stylistic variations
found on the web that go beyond mere languaged-based variation. The
‘@counter-style
’ rule allows CSS to
address this in an open-ended manner, by allowing the author to define
their own counter styles. These styles can then be used in the ‘list-style-type
’ property or in the
‘counter()
’ and ‘counters()
’ functions, exactly like the Complex
Counter Styles in CSS.
A counter style defines how to construct the representation of a counter value. Counter styles are composed of:
The algorithm is usually specified implicitly by a combination of the
‘type
’,
‘glyphs
’,
and ‘additive-glyphs
’ properties, but some counter
styles instead have their algorithm explicitly defined in the Complex Counter Styles section.
When asked to generate a counter representation using a particular counter style for a particular counter value, follow these steps:
Note that the prefix and suffix don't play a part in this
algorithm. This is intentional; the prefix and suffix aren't part of the
string returned by the counter() or counters() functions. Instead, the
prefix and suffix are added by the algorithm that constructs the computed
value of the ‘contents
’ property
for the ::marker
pseudo-element. This also implies
that the prefix and suffix always come from the specified counter-style,
even if the actual representation is constructed by a fallback style.
The general form of an ‘@counter-style
’ rule is:
@counter-style <counter-style-name> { [ descriptor: value; ]+ }
Each @counter-style rule specifies a value for every counter-style descriptor, either implicitly or explicitly. Those not given explicit value in the rule take the initial value listed with each descriptor in this specification. These descriptors apply solely within the context of the @counter-style rule in which they are defined, and do not apply to document language elements. There is no notion of which elements the descriptors apply to or whether the values are inherited by child elements. When a given descriptor occurs multiple times in a given @counter-style rule, only the last specified value is used; all prior values for that descriptor must be ignored.
This at-rule conforms with the forward-compatible parsing requirement of
CSS; parsers may ignore these rules without error. Any descriptors that
are not recognized or implemented by a given user agent must be ignored.
@counter-style rules require a ‘type
’ descriptor; if this is missing the
@counter-style is invalid and must be ignored. The
<counter-style-name> must be be a valid identifier and must not
be "decimal", "default", "inherit", "initial", "inside", "none", or
"outside"; otherwise the @counter-style is invalid and must be ignored.
type
’ descriptorName: | type |
---|---|
Value: | repeating | numeric | alphabetic | symbolic | additive | [non-repeating <integer>?] | [ override <counter-style-name> ] |
Initial: | N/A |
The ‘type
’ descriptor specifies which algorithm
will be used to construct the counter's representation based on the
counter value. For example, ‘repeating
’
type counter styles just cycle through their glyphs repeatedly, while
numeric type counter styles interpret their glyphs as digits and
build their representation accordingly. The types are defined as follows:
If the type is repeating, the ‘glyphs
’
descriptor must contain at least one counter
glyph. This type is defined over all counter values.
The repeating counter type cycles repeatedly through its provided glyphs, looping back to the beginning when it reaches the end of the list, similar to the default disc counter style. It can be used for simple bullets (just provide a single counter glyph), or for cycling through multiple bullets. The first counter glyph is used as the representation of the value 1, the second counter glyph (if it exists) is used as the representation of the value 2, etc.
In general, if there are length counter glyphs and a representation is being constructed for the value value, the representation is the counter glyph at index (value mod length) of the list of counter glyphs (0-indexed).
A "triangle bullet" counter style can be defined as:
@counter-style triangle { type: repeating; glyphs: '▶'; suffix: ''; }
It will then produce lists that look like:
▶ One ▶ Two ▶ Three
If the type is numeric, the ‘glyphs
’
descriptor must contain at least two counter
glyphs. This type is defined over all counter values.
The numeric counter type cycles interprets the list of counter glyphs as digits to a number system, similar to the default decimal counter style. The first counter glyph in the list is interpreted as the digit 0, the second as the digit 1, and so on. If there are length counter glyphs, the representation is a base length number using the counter glyphs as digits.
To construct the representation, run the following algorithm. Let length be the length of the list of counter glyphs, value initially be the counter value, S initially be the empty string, negative be a boolean flag that is initially false, and glyph(n) be the nth counter glyph in the list of counter glyphs (0-indexed).
floor( value /
length )
.
A "trinary" counter style can be defined as:
@counter-style trinary { type: numeric; glyphs: '0' '1' '2'; }
It will then produce lists that look like:
1. One 2. Two 10. Three 11. Four 12. Five 20. Six
If the type is alphabetic, the ‘glyphs
’
descriptor must contain at least two counter
glyphs. This type is defined only over positive counter values.
The alphabetic counter type interprets the list of counter
glyphs as digits to an alphabetic numbering system, similar
to the default ‘lower-alpha
’ counter style. Alphabetic
numbering systems are commonly used for lists, and also appear in many
spreadsheet programs to number columns. The first counter glyph in the list is interpreted
as the digit 1, the second as the digit 2, and so on. If there are
length counter glyphs, the
representation is a base length alphabetic number using the counter glyphs as digits. Alphabetic
numbering systems do not contain a digit representing 0.
To construct the representation, run the following algorithm. Let length be the length of the list of counter glyphs, value initially be the counter value, S initially be the empty string, and glyph(n) be the nth counter glyph in the list of counter glyphs (0-indexed).
While value is not equal to 0:
value - 1
.
floor( value /
length )
.
Finally, return S.
A counter style using go stones can be defined as:
@counter-style go { type: alphabetic; glyphs: url(white.svg) url(black.svg); suffix: ''; }
It will then produce lists that look like:
This example requires support for SVG images to display correctly.
Alphabetic styles may also be used to simulate a fixed-width numeric style:
@counter-style fixed-decimal { type: alphabetic; glyphs: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'; } ol { list-style: fixed-decimal; counter-reset: list-item 1111; }
This will produce lists that look like:
0001. One 0002. Two 0003. Three 0004. Four 0005. Five 0006. Six
Two-digit numbers start at value 11, three-digit numbers start at value 111, etc..
Should I instead explicitly provide a fixed-width numeric counter type? I'd like to see if this sort of numbering is used in the wild first.
If the type is symbolic, the ‘glyphs
’
descriptor must contain at least one counter
glyph. This type is defined only over positive counter values.
The symbolic counter type cycles repeatedly through its provided glyphs, doubling, tripling, etc. the glyphs on each successive pass through the list. For example, if the original glyphs were "*" and "†", then on the second pass they would instead be "**" and "††", while on the third they would be "***" and "†††", etc. It can be used for footnote-style markers, and is also sometimes used for alphabetic-style lists for a slightly different presentation than what the alphabetic type presents.
To construct the representation, run the following algorithm. Let length be the length of the list of counter glyphs, value initially be the counter value, S initially be the empty string, and glyph(n) be the nth counter glyph in the list of counter glyphs (0-indexed).
glyph(value mod length)
.
floor(
(value - 1) / length )
.
Finally, return S.
An "footnotes" counter style can be defined as:
@counter-style footnotes { type: symbolic; glyphs: '*' '⁑' '†' '‡'; suffix: ''; }
It will then produce lists that look like:
*. One ⁑. Two †. Three ‡. Four **. Five ⁑⁑. Six
Note the difference between this and the alphabetic
‘upper-alpha
’ style. The alphabetic
style is identical through 27, but then continues with "AB, AC, AD...",
and then at 53 begins "BA, BB, BC...", etc. It doesn't reach three digits
until 703.
The symbolic type will produce representations with sizes that are linear in the magnitude of the counter value. This can potentially be abused to generate excessively large representations and consume undue amounts of the user's memory or even hang their browser. User agents must support representations at least 20 characters long, but they may choose to instead use the fallback style for representations that would be longer than 20 characters.
If the type is non-repeating, the ‘glyphs
’
descriptor must contain at least one counter
glyph. This type is defined over counter values in a finite range,
starting with the first glyph
value and having a length equal to the length of the list of counter glyphs.
The non-repeating counter type is for representing counter styles that only have a finite number of representations. For example, Unicode defines several limited-length runs of special characters meant for lists, such as circled digits.
When this type is specified, it may optionally have an integer provided after it, which sets the first glyph value. If it is omitted, the first glyph value is 1.
The first counter glyph is the representation for the first glyph value, and subsequent counter values are represented by subsequent counter glyphs. Once the list of counter glyphs is exhausted, further values cannot be represented by this type, and must instead be represented by the fallback counter style.
A "box-corner" counter style can be defined as:
@counter-style box-corner { type: non-repeating; glyphs: '◰' '◳' '◲' '◱'; suffix: ':'; }
It will then produce lists that look like:
◰: One ◳: Two ◲: Three ◱: Four 5: Five 6: Six
If the type is additive, the ‘additive-glyphs
’ descriptor must contain
at least one additive tuple. This
type is nominally defined over all positive counter values (see algorithm,
below, for exact details)
The additive counter type takes as many of the largest glyphs that it can, then as many of the next largest glyph, etc. until the sum of all the glyphs equals the counter value. It can be used to implement roman numerals, and additionally is used to represent the numbering system of several languages which use different characters for the digits in differnt positions.
To construct the representation, run this algorithm. let value initially be the counter value, S initially be the empty string, and glyph list initially be the list of additive tuples.
If value is initially 0, and there is an additive tuple with a weight of 0, append that tuple's counter glyph to S and return S.
Otherwise, while value is greater than 0 and there are elements left in the glyph list:
s counter
glyph to S floor( value / current tuple
’s
weight )
times (this may be 0).
s
weight multiplied by the number of times the current tuple was appended to
S in the previous step.
If the loop ended because value is 0, return S. Otherwise, the given counter value cannot be represented by this counter style, and must instead be represented by the fallback counter style.
A "dice" counter style can be defined as:
@counter-style dice { type: additive; additive-glyphs: 6 ’⚅‘, 5
’⚄‘, 4
’⚃‘, 3
’⚂‘, 2
’⚁‘, 1
’⚀‘; suffix:
’‘; }
It will then produce lists that look like:
⚀ One ⚁ Two ⚂ Three ... ⚅⚄ Eleven ⚅⚅ Twelve ⚅⚅⚀ Thirteen
The additive type will produce representations with sizes that are linear in the magnitude of the counter value. This can potentially be abused to generate excessively large representations and consume undue amounts of the user’s memory or even hang their browser. User agents must support representations at least 20 characters long, but they may choose to instead use the fallback style for representations that would be longer than 20 characters.
The override type allows an author to use the algorithm of another counter style, but alter other aspects, such as the negative sign or the suffix. If a counter style uses the override type, any unspecified descriptors must be taken from the specified counter style, rather than taking their initial values.
If a @counter-style uses the override type, it must not contain a
‘glyphs
’ or ‘additive-glyphs
’ descriptor; otherwise it
is invalid and must be ignored. If the specified counter style name isn't
the name of any currently-defined counter style, it must be treated as if
it was overriding the decimal counter style.
negative
’ descriptorName: | negative |
---|---|
Value: | <string> <string>? |
Initial: | "\2D" ("-" hyphen-minus) |
The ‘negative
’ descriptor defines how to alter
the representation when the counter value is negative. Not all counter
types can render negative numbers.
The first string in the value is prepended to the representation when the counter value is negative. The second string, if specified, is appended to the representation when the counter value is negative.
For example, specifying ‘negative: "(" ")";
’ will make negative values
be wrapped in parentheses, which is sometimes used in financial contexts,
like "(2) (1) 0 1 2 3...".
prefix
’ descriptorName: | prefix |
---|---|
Value: | <string> |
Initial: | "" (the empty string) |
The ‘prefix
’ descripter specifies a string that
is prepended to the marker representation. Prefixes are only added by the
algorithm for constructing the default contents of the ::marker
pseudo-element; the prefix is not added
automatically when the counter() or counters() functions are used.
Prefixes are added to the representation after negative signs.
suffix
’ descriptorName: | suffix |
---|---|
Value: | <string> |
Initial: | "\2E" ("." full stop) |
The ‘suffix
’ descripter specifies a string that
is appended to the marker representation. Suffixes are only added by the
algorithm for constructing the default contents of the ::marker
pseudo-element; the suffix is not added
automatically when the counter() or counters() functions are used.
Suffixes are added to the representation after negative signs.
range
’ descriptorName: | range |
---|---|
Value: | [ <integer> | infinite ]{2} |
Initial: | infinite infinite |
The ‘range
’ descriptor defines the range over
which the counter style is defined. If a counter style is used to
represent a counter value outside of its range, the counter style instead
drops down to its fallback counter style.
The first value represents the lower bound of the range (with
‘infinite
’ representing negative
infinity), and the second value represents the upper bound of the range
(with ‘infinite
’ representing
positive infinity). This is an inclusive range - it includes both the
lower and upper bound numbers. If the lower bound is higher than the
higher bound, the descriptor is invalid and must be ignored.
Some counter style types have their own implicit ranges, specified above
in the individual descriptions for each type. The explicit range given by
the ‘range
’
descriptor applies at the same time as the implicit range given by the
‘type
’ descriptor -
if the counter value is less than either lower bound, or greater than
either upper bound, the fallback style must instead be used to generate
the representation.
There's also an implicit range coming from implementation limits. Should we require UAs to support all values in a signed 2-byte int, or a signed 4-byte int?
fallback
’ descriptorName: | fallback |
---|---|
Value: | <counter-style-name> |
Initial: | decimal |
The ‘fallback
’ descriptor specifies a fallback
counter style to be used when the current counter style can't create a
representation for a given counter value. For example, if a counter style
defined with a range of 1-10 is asked to represent a counter value of 11,
the counter value's representation is instead constructed with the
fallback counter style (or possibly the fallback style's fallback style,
if the fallback style can't represent that value, etc.).
If the value of the ‘fallback
’ descriptor isn't the name of any
currently-defined counter style, the used value of the ‘fallback
’
descriptor is decimal instead. Similarly,
while following fallbacks to find a counter style that can render the
given counter value, if a loop in the specified fallbacks is detected, the
decimal style must be used instead.
Note that it is not necessarily an error to specify fallback loops. For example, if an author desires a counter style with significantly different representations for even and odd counter values, they may find it easiest to define one style that can only represent odd values and one that can only represent even values, and specify each as the fallback for the other one. Though the fallback graph is circular, at no point do you encounter a loop while following these fallbacks - every counter value is represented by one or the other counter style. Is it useful to allow this case? If it would be significantly easier for implementations to just detect and reject circular fallback graphs, that would probably be acceptable.
glyphs
’ and ‘additive-glyphs
’ descriptorsName: | glyphs |
---|---|
Value: | [ <string> | <image> ]+ |
Initial: | N/A |
Name: | additive-glyphs |
---|---|
Value: | [ <integer> && [ <string> | <image> ] ]+ |
Initial: | N/A |
The ‘glyphs
’ and ‘additive-glyphs
’ descriptors specify the
characters used by the marker-construction algorithm specified by the
‘type
’
descriptor. The ‘glyphs
’ descriptor must be specified if
the counter type is ‘repeating
’,
numeric, alphabetic, symbolic, or
non-repeating, and the ‘additive-glyphs
’ descriptor must be
specified if the counter type is additive; otherwise, the
@counter-style is invalid and must be ignored.
Some counter styles specify that the ‘glyphs
’
descriptor must have at least two entries. If the counter's style is such
a type, and the ‘glyphs
’ descriptor has only a single
entry, the counter style is invalid and must be ignored.
Each entry in the ‘glyphs
’ descriptor's value defines a counter glyph, which is interpreted differently
based on the counter style's type. Each entry in the ‘additive-glyphs
’ descriptor's value
defines an additive tuple, which consists of
a counter glyph and a non-negative
integer weight. Each weight must be a non-negative integer, and the additive tuples must be specified in
order of descending weight; otherwise, the @counter-style is invalid and
must be ignored.
Counter glyphs may be strings or images, and the two types can be mixed in a single descriptor. Counter representations are constructed by concatenating counter glyphs together. Image counter glyphs are rendered as inline replaced elements. The default object size of an image counter glyph is a 1em by 1em square.
While this specification defines a mechanism to allow authors to define almost any counter style they would want, forcing authors to redefine common styles every time they are used would be unnecessarily onerous. To aid in this regard, this specification predefines a large set of counter styles. User agents must include the following stylesheet as a user-agent stylesheet, so authors can depend on these styles being present.
As with any ‘@counter-style
’ rule,
the counter style definitions given here can be overridden by the author
if they desire to attach a different style to a counter style name defined
in this stylesheet.
@counter-style box {
type: repeating;
glyphs: '\25FD';
/* '◽' */
suffix: '';
}
@counter-style check {
type: repeating;
glyphs: '\2713';
/* '✓' */
suffix: '';
}
@counter-style circle {
type: repeating;
glyphs: '\25E6';
/* '◦' */
suffix: '';
}
@counter-style diamond {
type: repeating;
glyphs: '\25C6';
/* '◆' */
suffix: '';
}
@counter-style disc {
type: repeating;
glyphs: '\2022';
/* '•' */
suffix: '';
}
@counter-style dash {
type: repeating;
glyphs: '\2014';
/* '—' */
suffix: '';
}
@counter-style square {
type: repeating;
glyphs: '\25FE';
/* '◾' */
suffix: '';
}
@counter-style arabic-indic {
type: numeric;
glyphs: '\660' '\661' '\662' '\663' '\664' '\665' '\666' '\667' '\668' '\669';
/* '٠' '١' '٢' '٣' '٤' '٥' '٦' '٧' '٨' '٩' */
}
@counter-style bengali {
type: numeric;
glyphs: '\9E6' '\9E7' '\9E8' '\9E9' '\9EA' '\9EB' '\9EC' '\9ED' '\9EE' '\9EF';
/* '০' '১' '২' '৩' '৪' '৫' '৬' '৭' '৮' '৯' */
}
@counter-style binary {
type: numeric;
glyphs: '\30' '\31';
/* '0' '1' */
}
@counter-style burmese {
type: numeric;
glyphs: '\1040' '\1041' '\1042' '\1043' '\1044' '\1045' '\1046' '\1047' '\1048' '\1049';
/* '၀' '၁' '၂' '၃' '၄' '၅' '၆' '၇' '၈' '၉' */
}
@counter-style cambodian {
type: numeric;
glyphs: '\17E0' '\17E1' '\17E2' '\17E3' '\17E4' '\17E5' '\17E6' '\17E7' '\17E8' '\17E9';
/* '០' '១' '២' '៣' '៤' '៥' '៦' '៧' '៨' '៩' */
}
@counter-style cjk-decimal {
type: numeric;
glyphs: '\3007' '\4E00' '\4E8C' '\4E09' '\56DB' '\4E94' '\516D' '\4E03' '\516B' '\4E5D';
/* '〇' '一' '二' '三' '四' '五' '六' '七' '八' '九' */
}
@counter-style decimal {
type: numeric;
glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39';
/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' */
}
@counter-style devanagari {
type: numeric;
glyphs: '\966' '\967' '\968' '\969' '\96A' '\96B' '\96C' '\96D' '\96E' '\96F';
/* '०' '१' '२' '३' '४' '५' '६' '७' '८' '९' */
}
@counter-style eastern-nagari {
type: numeric;
glyphs: '\9E6' '\9E7' '\9E8' '\9E9' '\9EA' '\9EB' '\9EC' '\9ED' '\9EE' '\9EF';
/* '০' '১' '২' '৩' '৪' '৫' '৬' '৭' '৮' '৯' */
}
@counter-style fullwidth-decimal {
type: numeric;
glyphs: '\FF10' '\FF11' '\FF12' '\FF13' '\FF14' '\FF15' '\FF16' '\FF17' '\FF18' '\FF19';
/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' */
}
@counter-style gujarati {
type: numeric;
glyphs: '\AE6' '\AE7' '\AE8' '\AE9' '\AEA' '\AEB' '\AEC' '\AED' '\AEE' '\AEF';
/* '૦' '૧' '૨' '૩' '૪' '૫' '૬' '૭' '૮' '૯' */
}
@counter-style gurmukhi {
type: numeric;
glyphs: '\A66' '\A67' '\A68' '\A69' '\A6A' '\A6B' '\A6C' '\A6D' '\A6E' '\A6F';
/* '੦' '੧' '੨' '੩' '੪' '੫' '੬' '੭' '੮' '੯' */
}
@counter-style kannada {
type: numeric;
glyphs: '\CE6' '\CE7' '\CE8' '\CE9' '\CEA' '\CEB' '\CEC' '\CED' '\CEE' '\CEF';
/* '೦' '೧' '೨' '೩' '೪' '೫' '೬' '೭' '೮' '೯' */
}
@counter-style khmer {
type: numeric;
glyphs: '\17E0' '\17E1' '\17E2' '\17E3' '\17E4' '\17E5' '\17E6' '\17E7' '\17E8' '\17E9';
/* '០' '១' '២' '៣' '៤' '៥' '៦' '៧' '៨' '៩' */
}
@counter-style lower-hexadecimal {
type: numeric;
glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39' '\61' '\62' '\63' '\64' '\65' '\66';
/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f' */
}
@counter-style lao {
type: numeric;
glyphs: '\ED0' '\ED1' '\ED2' '\ED3' '\ED4' '\ED5' '\ED6' '\ED7' '\ED8' '\ED9';
/* '໐' '໑' '໒' '໓' '໔' '໕' '໖' '໗' '໘' '໙' */
}
@counter-style lepcha {
type: numeric;
glyphs: '\1C40' '\1C41' '\1C42' '\1C43' '\1C44' '\1C45' '\1C46' '\1C47' '\1C48' '\1C49';
/* '᱀' '᱁' '᱂' '᱃' '᱄' '᱅' '᱆' '᱇' '᱈' '᱉' */
}
@counter-style malayalam {
type: numeric;
glyphs: '\D66' '\D67' '\D68' '\D69' '\D6A' '\D6B' '\D6C' '\D6D' '\D6E' '\D6F';
/* '൦' '൧' '൨' '൩' '൪' '൫' '൬' '൭' '൮' '൯' */
}
@counter-style marathi {
type: numeric;
glyphs: '\966' '\967' '\968' '\969' '\96A' '\96B' '\96C' '\96D' '\96E' '\96F';
/* '०' '१' '२' '३' '४' '५' '६' '७' '८' '९' */
}
@counter-style mongolian {
type: numeric;
glyphs: '\1810' '\1811' '\1812' '\1813' '\1814' '\1815' '\1816' '\1817' '\1818' '\1819';
/* '᠐' '᠑' '᠒' '᠓' '᠔' '᠕' '᠖' '᠗' '᠘' '᠙' */
}
@counter-style myanmar {
type: numeric;
glyphs: '\1040' '\1041' '\1042' '\1043' '\1044' '\1045' '\1046' '\1047' '\1048' '\1049';
/* '၀' '၁' '၂' '၃' '၄' '၅' '၆' '၇' '၈' '၉' */
}
@counter-style new-base-60 {
type: numeric;
glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39' '\41' '\42' '\43' '\44' '\45' '\46' '\47' '\48' '\4A' '\4B' '\4C' '\4D' '\4E' '\50' '\51' '\52' '\53' '\54' '\55' '\56' '\57' '\58' '\59' '\5A' '\5F' '\61' '\62' '\63' '\64' '\65' '\66' '\67' '\68' '\69' '\6A' '\6B' '\6D' '\6E' '\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\76' '\77' '\78' '\79' '\7A';
/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'J' 'K' 'L' 'M' 'N' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' '_' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
}
@counter-style octal {
type: numeric;
glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37';
/* '0' '1' '2' '3' '4' '5' '6' '7' */
}
@counter-style oriya {
type: numeric;
glyphs: '\B66' '\B67' '\B68' '\B69' '\B6A' '\B6B' '\B6C' '\B6D' '\B6E' '\B6F';
/* '୦' '୧' '୨' '୩' '୪' '୫' '୬' '୭' '୮' '୯' */
}
@counter-style persian {
type: numeric;
glyphs: '\6F0' '\6F1' '\6F2' '\6F3' '\6F4' '\6F5' '\6F6' '\6F7' '\6F8' '\6F9';
/* '۰' '۱' '۲' '۳' '۴' '۵' '۶' '۷' '۸' '۹' */
}
@counter-style super-decimal {
type: numeric;
glyphs: '\2070' '\B9' '\B2' '\B3' '\2074' '\2075' '\2076' '\2077' '\2078' '\2079';
/* '⁰' '¹' '²' '³' '⁴' '⁵' '⁶' '⁷' '⁸' '⁹' */
}
@counter-style tamil {
type: numeric;
glyphs: '\BE6' '\BE7' '\BE8' '\BE9' '\BEA' '\BEB' '\BEC' '\BED' '\BEE' '\BEF';
/* '௦' '௧' '௨' '௩' '௪' '௫' '௬' '௭' '௮' '௯' */
}
@counter-style telugu {
type: numeric;
glyphs: '\C66' '\C67' '\C68' '\C69' '\C6A' '\C6B' '\C6C' '\C6D' '\C6E' '\C6F';
/* '౦' '౧' '౨' '౩' '౪' '౫' '౬' '౭' '౮' '౯' */
}
@counter-style tibetan {
type: numeric;
glyphs: '\F20' '\F21' '\F22' '\F23' '\F24' '\F25' '\F26' '\F27' '\F28' '\F29';
/* '༠' '༡' '༢' '༣' '༤' '༥' '༦' '༧' '༨' '༩' */
}
@counter-style thai {
type: numeric;
glyphs: '\E50' '\E51' '\E52' '\E53' '\E54' '\E55' '\E56' '\E57' '\E58' '\E59';
/* '๐' '๑' '๒' '๓' '๔' '๕' '๖' '๗' '๘' '๙' */
}
@counter-style upper-hexadecimal {
type: numeric;
glyphs: '\30' '\31' '\32' '\33' '\34' '\35' '\36' '\37' '\38' '\39' '\41' '\42' '\43' '\44' '\45' '\46';
/* '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' */
}
@counter-style afar {
type: alphabetic;
glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1260' '\1270' '\1290' '\12A0' '\12A8' '\12C8' '\12D0' '\12E8' '\12F0' '\12F8' '\1308' '\1338' '\1348';
/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'በ' 'ተ' 'ነ' 'አ' 'ከ' 'ወ' 'ዐ' 'የ' 'ደ' 'ዸ' 'ገ' 'ጸ' 'ፈ' */
suffix: '/';
}
@counter-style agaw {
type: alphabetic;
glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1238' '\1240' '\1250' '\1260' '\1268' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1318' '\1320' '\1328' '\1330' '\1338' '\1348' '\1350';
/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'ቐ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጘ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style ari {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1260' '\1268' '\1270' '\1278' '\1290' '\1300' '\1308' '\1328' '\1340' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጨ' 'ፀ' 'ፐ' */
suffix: '/';
}
@counter-style blin {
type: alphabetic;
glyphs: '\1200' '\1208' '\1210' '\1218' '\1230' '\1238' '\1228' '\1240' '\1250' '\1260' '\1270' '\1290' '\1300' '\1308' '\1318' '\1320' '\1328' '\1348' '\1278' '\1298' '\1338' '\1330' '\1350';
/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ሰ' 'ሸ' 'ረ' 'ቀ' 'ቐ' 'በ' 'ተ' 'ነ' 'ጀ' 'ገ' 'ጘ' 'ጠ' 'ጨ' 'ፈ' 'ቸ' 'ኘ' 'ጸ' 'ጰ' 'ፐ' */
suffix: '/';
}
@counter-style cjk-earthly-branch {
type: alphabetic;
glyphs: '\5B50' '\4E11' '\5BC5' '\536F' '\8FB0' '\5DF3' '\5348' '\672A' '\7533' '\9149' '\620C' '\4EA5';
/* '子' '丑' '寅' '卯' '辰' '巳' '午' '未' '申' '酉' '戌' '亥' */
suffix: '、';
}
@counter-style cjk-heavenly-stem {
type: alphabetic;
glyphs: '\7532' '\4E59' '\4E19' '\4E01' '\620A' '\5DF1' '\5E9A' '\8F9B' '\58EC' '\7678';
/* '甲' '乙' '丙' '丁' '戊' '己' '庚' '辛' '壬' '癸' */
suffix: '、';
}
@counter-style dizi {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1338' '\1340' '\1348';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጸ' 'ፀ' 'ፈ' */
suffix: '/';
}
@counter-style fullwidth-lower-alpha {
type: alphabetic;
glyphs: '\FF41' '\FF42' '\FF43' '\FF44' '\FF45' '\FF46' '\FF47' '\FF48' '\FF49' '\FF4A' '\FF4B' '\FF4C' '\FF4D' '\FF4E' '\FF4F' '\FF50' '\FF51' '\FF52' '\FF53' '\FF54' '\FF55' '\FF56' '\FF57' '\FF58' '\FF59' '\FF5A';
/* 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
suffix: '.';
}
@counter-style fullwidth-upper-alpha {
type: alphabetic;
glyphs: '\FF21' '\FF22' '\FF23' '\FF24' '\FF25' '\FF26' '\FF27' '\FF28' '\FF29' '\FF2A' '\FF2B' '\FF2C' '\FF2D' '\FF2E' '\FF2F' '\FF30' '\FF31' '\FF32' '\FF33' '\FF34' '\FF35' '\FF36' '\FF37' '\FF38' '\FF39' '\FF3A';
/* 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' */
suffix: '.';
}
@counter-style gedeo {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style gumuz {
type: alphabetic;
glyphs: '\1200' '\1210' '\1208' '\1210' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1268' '\1270' '\1278' '\1290' '\1298' '\1308' '\1328' '\1330' '\1340' '\1350';
/* 'ሀ' 'ሐ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ገ' 'ጨ' 'ጰ' 'ፀ' 'ፐ' */
suffix: '/';
}
@counter-style hadiyya {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style harari {
type: alphabetic;
glyphs: '\1210' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1348';
/* 'ሐ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ፈ' */
suffix: '/';
}
@counter-style hindi {
type: alphabetic;
glyphs: '\915' '\916' '\917' '\918' '\919' '\91A' '\91B' '\91C' '\91D' '\91E' '\91F' '\920' '\921' '\922' '\923' '\924' '\925' '\926' '\927' '\928' '\92A' '\92B' '\92C' '\92D' '\92E' '\92F' '\930' '\932' '\935' '\936' '\937' '\938' '\939';
/* 'क' 'ख' 'ग' 'घ' 'ङ' 'च' 'छ' 'ज' 'झ' 'ञ' 'ट' 'ठ' 'ड' 'ढ' 'ण' 'त' 'थ' 'द' 'ध' 'न' 'प' 'फ' 'ब' 'भ' 'म' 'य' 'र' 'ल' 'व' 'श' 'ष' 'स' 'ह' */
}
@counter-style hiragana-iroha {
type: alphabetic;
glyphs: '\3044' '\308D' '\306F' '\306B' '\307B' '\3078' '\3068' '\3061' '\308A' '\306C' '\308B' '\3092' '\308F' '\304B' '\3088' '\305F' '\308C' '\305D' '\3064' '\306D' '\306A' '\3089' '\3080' '\3046' '\3090' '\306E' '\304A' '\304F' '\3084' '\307E' '\3051' '\3075' '\3053' '\3048' '\3066' '\3042' '\3055' '\304D' '\3086' '\3081' '\307F' '\3057' '\3091' '\3072' '\3082' '\305B' '\3059' '\3093';
/* 'い' 'ろ' 'は' 'に' 'ほ' 'へ' 'と' 'ち' 'り' 'ぬ' 'る' 'を' 'わ' 'か' 'よ' 'た' 'れ' 'そ' 'つ' 'ね' 'な' 'ら' 'む' 'う' 'ゐ' 'の' 'お' 'く' 'や' 'ま' 'け' 'ふ' 'こ' 'え' 'て' 'あ' 'さ' 'き' 'ゆ' 'め' 'み' 'し' 'ゑ' 'ひ' 'も' 'せ' 'す' 'ん' */
suffix: '、';
}
@counter-style hiragana {
type: alphabetic;
glyphs: '\3042' '\3044' '\3046' '\3048' '\304A' '\304B' '\304D' '\304F' '\3051' '\3053' '\3055' '\3057' '\3059' '\305B' '\305D' '\305F' '\3061' '\3064' '\3066' '\3068' '\306A' '\306B' '\306C' '\306D' '\306E' '\306F' '\3072' '\3075' '\3078' '\307B' '\307E' '\307F' '\3080' '\3081' '\3082' '\3084' '\3086' '\3088' '\3089' '\308A' '\308B' '\308C' '\308D' '\308F' '\3092' '\3093';
/* 'あ' 'い' 'う' 'え' 'お' 'か' 'き' 'く' 'け' 'こ' 'さ' 'し' 'す' 'せ' 'そ' 'た' 'ち' 'つ' 'て' 'と' 'な' 'に' 'ぬ' 'ね' 'の' 'は' 'ひ' 'ふ' 'へ' 'ほ' 'ま' 'み' 'む' 'め' 'も' 'や' 'ゆ' 'よ' 'ら' 'り' 'る' 'れ' 'ろ' 'わ' 'を' 'ん' */
suffix: '、';
}
@counter-style kaffa {
type: alphabetic;
glyphs: '\1200' '\1208' '\1210' '\1218' '\1220' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1280' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348' '\1350';
/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ሠ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ኀ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style katakana-iroha {
type: alphabetic;
glyphs: '\30A4' '\30ED' '\30CF' '\30CB' '\30DB' '\30D8' '\30C8' '\30C1' '\30EA' '\30CC' '\30EB' '\30F2' '\30EF' '\30AB' '\30E8' '\30BF' '\30EC' '\30BD' '\30C4' '\30CD' '\30CA' '\30E9' '\30E0' '\30A6' '\30F0' '\30CE' '\30AA' '\30AF' '\30E4' '\30DE' '\30B1' '\30D5' '\30B3' '\30A8' '\30C6' '\30A2' '\30B5' '\30AD' '\30E6' '\30E1' '\30DF' '\30B7' '\30F1' '\30D2' '\30E2' '\30BB' '\30B9' '\30F3';
/* 'イ' 'ロ' 'ハ' 'ニ' 'ホ' 'ヘ' 'ト' 'チ' 'リ' 'ヌ' 'ル' 'ヲ' 'ワ' 'カ' 'ヨ' 'タ' 'レ' 'ソ' 'ツ' 'ネ' 'ナ' 'ラ' 'ム' 'ウ' 'ヰ' 'ノ' 'オ' 'ク' 'ヤ' 'マ' 'ケ' 'フ' 'コ' 'エ' 'テ' 'ア' 'サ' 'キ' 'ユ' 'メ' 'ミ' 'シ' 'ヱ' 'ヒ' 'モ' 'セ' 'ス' 'ン' */
suffix: '、';
}
@counter-style katakana {
type: alphabetic;
glyphs: '\30A2' '\30A4' '\30A6' '\30A8' '\30AA' '\30AB' '\30AD' '\30AF' '\30B1' '\30B3' '\30B5' '\30B7' '\30B9' '\30BB' '\30BD' '\30BF' '\30C1' '\30C4' '\30C6' '\30C8' '\30CA' '\30CB' '\30CC' '\30CD' '\30CE' '\30CF' '\30D2' '\30D5' '\30D8' '\30DB' '\30DE' '\30DF' '\30E0' '\30E1' '\30E2' '\30E4' '\30E6' '\30E8' '\30E9' '\30EA' '\30EB' '\30EC' '\30ED' '\30EF' '\30F2' '\30F3';
/* 'ア' 'イ' 'ウ' 'エ' 'オ' 'カ' 'キ' 'ク' 'ケ' 'コ' 'サ' 'シ' 'ス' 'セ' 'ソ' 'タ' 'チ' 'ツ' 'テ' 'ト' 'ナ' 'ニ' 'ヌ' 'ネ' 'ノ' 'ハ' 'ヒ' 'フ' 'ヘ' 'ホ' 'マ' 'ミ' 'ム' 'メ' 'モ' 'ヤ' 'ユ' 'ヨ' 'ラ' 'リ' 'ル' 'レ' 'ロ' 'ワ' 'ヲ' 'ン' */
suffix: '、';
}
@counter-style kebena {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style kembata {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1268' '\1270' '\1278' '\1290' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' */
suffix: '/';
}
@counter-style konso {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1348' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style korean-consonant {
type: alphabetic;
glyphs: '\3131' '\3134' '\3137' '\3139' '\3141' '\3142' '\3145' '\3147' '\3148' '\314A' '\314B' '\314C' '\314D' '\314E';
/* 'ㄱ' 'ㄴ' 'ㄷ' 'ㄹ' 'ㅁ' 'ㅂ' 'ㅅ' 'ㅇ' 'ㅈ' 'ㅊ' 'ㅋ' 'ㅌ' 'ㅍ' 'ㅎ' */
}
@counter-style korean-syllable {
type: alphabetic;
glyphs: '\AC00' '\B098' '\B2E4' '\B77C' '\B9C8' '\BC14' '\C0AC' '\C544' '\C790' '\CC28' '\CE74' '\D0C0' '\D30C' '\D558';
/* '가' '나' '다' '라' '마' '바' '사' '아' '자' '차' '카' '타' '파' '하' */
}
@counter-style kunama {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' */
suffix: '/';
}
@counter-style lower-alpha {
type: alphabetic;
glyphs: '\61' '\62' '\63' '\64' '\65' '\66' '\67' '\68' '\69' '\6A' '\6B' '\6C' '\6D' '\6E' '\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\76' '\77' '\78' '\79' '\7A';
/* 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
}
@counter-style lower-belorussian {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\451' '\436' '\437' '\456' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\45E' '\444' '\445' '\446' '\447' '\448' '\44B' '\44C' '\44D' '\44E' '\44F';
/* 'а' 'б' 'в' 'г' 'д' 'е' 'ё' 'ж' 'з' 'і' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ў' 'ф' 'х' 'ц' 'ч' 'ш' 'ы' 'ь' 'э' 'ю' 'я' */
suffix: ')';
}
@counter-style lower-bulgarian {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\436' '\437' '\438' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44A' '\44C' '\44E' '\44F';
/* 'а' 'б' 'в' 'г' 'д' 'е' 'ж' 'з' 'и' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'ъ' 'ь' 'ю' 'я' */
suffix: ')';
}
@counter-style lower-greek {
type: alphabetic;
glyphs: '\3B1' '\3B2' '\3B3' '\3B4' '\3B5' '\3B6' '\3B7' '\3B8' '\3B9' '\3BA' '\3BB' '\3BC' '\3BD' '\3BE' '\3BF' '\3C0' '\3C1' '\3C3' '\3C4' '\3C5' '\3C6' '\3C7' '\3C8' '\3C9';
/* 'α' 'β' 'γ' 'δ' 'ε' 'ζ' 'η' 'θ' 'ι' 'κ' 'λ' 'μ' 'ν' 'ξ' 'ο' 'π' 'ρ' 'σ' 'τ' 'υ' 'φ' 'χ' 'ψ' 'ω' */
/* This style is only defined because CSS2.1 has it. It doesn't appear to actually be used in Greek texts. */
}
@counter-style lower-macedonian {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\453' '\435' '\436' '\437' '\455' '\438' '\458' '\43A' '\43B' '\459' '\43C' '\43D' '\45A' '\43E' '\43F' '\440' '\441' '\442' '\45C' '\443' '\444' '\445' '\446' '\447' '\45F' '\448';
/* 'а' 'б' 'в' 'г' 'д' 'ѓ' 'е' 'ж' 'з' 'ѕ' 'и' 'ј' 'к' 'л' 'љ' 'м' 'н' 'њ' 'о' 'п' 'р' 'с' 'т' 'ќ' 'у' 'ф' 'х' 'ц' 'ч' 'џ' 'ш' */
suffix: ')';
}
@counter-style lower-oromo-qubee {
type: alphabetic;
glyphs: '\61' '\61\61' '\62' '\63' '\64' '\65' '\65\65' '\66' '\67' '\68' '\69' '\69\69' '\6A' '\6B' '\6C' '\6D' '\6E' '\6F' '\6F\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\75\75' '\76' '\77' '\78' '\79' '\7A' '\63\68' '\64\68' '\6B\68' '\6E\79' '\70\68' '\73\68';
/* 'a' 'aa' 'b' 'c' 'd' 'e' 'ee' 'f' 'g' 'h' 'i' 'ii' 'j' 'k' 'l' 'm' 'n' 'o' 'oo' 'p' 'q' 'r' 's' 't' 'u' 'uu' 'v' 'w' 'x' 'y' 'z' 'ch' 'dh' 'kh' 'ny' 'ph' 'sh' */
}
@counter-style lower-russian {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\436' '\437' '\438' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44D' '\44E' '\44F';
/* 'а' 'б' 'в' 'г' 'д' 'е' 'ж' 'з' 'и' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'э' 'ю' 'я' */
suffix: ')';
}
@counter-style lower-russian-full {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\451' '\436' '\437' '\438' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44A' '\44B' '\44C' '\44D' '\44E' '\44F';
/* 'а' 'б' 'в' 'г' 'д' 'е' 'ё' 'ж' 'з' 'и' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'ъ' 'ы' 'ь' 'э' 'ю' 'я' */
suffix: ')';
}
@counter-style lower-serbo-croatian {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\452' '\435' '\436' '\437' '\438' '\458' '\43A' '\43B' '\459' '\43C' '\43D' '\45A' '\43E' '\43F' '\440' '\441' '\442' '\45B' '\443' '\444' '\445' '\446' '\447' '\45F' '\448';
/* 'а' 'б' 'в' 'г' 'д' 'ђ' 'е' 'ж' 'з' 'и' 'ј' 'к' 'л' 'љ' 'м' 'н' 'њ' 'о' 'п' 'р' 'с' 'т' 'ћ' 'у' 'ф' 'х' 'ц' 'ч' 'џ' 'ш' */
suffix: ')';
}
@counter-style lower-ukrainian {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\434' '\435' '\454' '\436' '\437' '\438' '\456' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\44E' '\44F';
/* 'а' 'б' 'в' 'г' 'д' 'е' 'є' 'ж' 'з' 'и' 'і' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'ю' 'я' */
suffix: ')';
}
@counter-style lower-ukrainian-full {
type: alphabetic;
glyphs: '\430' '\431' '\432' '\433' '\491' '\434' '\435' '\454' '\436' '\437' '\438' '\456' '\457' '\439' '\43A' '\43B' '\43C' '\43D' '\43E' '\43F' '\440' '\441' '\442' '\443' '\444' '\445' '\446' '\447' '\448' '\449' '\44C' '\44E' '\44F';
/* 'а' 'б' 'в' 'г' 'ґ' 'д' 'е' 'є' 'ж' 'з' 'и' 'і' 'ї' 'й' 'к' 'л' 'м' 'н' 'о' 'п' 'р' 'с' 'т' 'у' 'ф' 'х' 'ц' 'ч' 'ш' 'щ' 'ь' 'ю' 'я' */
suffix: ')';
}
@counter-style meen {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1280' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1330' '\1350' '\1340';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ኀ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፐ' 'ፀ' */
suffix: '/';
}
@counter-style oromo {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\12A0' '\12A8' '\12C8' '\12E8' '\12F0' '\12F8' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'አ' 'ከ' 'ወ' 'የ' 'ደ' 'ዸ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' */
suffix: '/';
}
@counter-style saho {
type: alphabetic;
glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1240' '\1260' '\1270' '\1290' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348';
/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ቀ' 'በ' 'ተ' 'ነ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' */
suffix: '/';
}
@counter-style sidama {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\12A0' '\12A8' '\12C8' '\12E8' '\12F0' '\12F8' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'አ' 'ከ' 'ወ' 'የ' 'ደ' 'ዸ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' */
suffix: '/';
}
@counter-style silti {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1320' '\1328' '\1330' '\1348';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' */
suffix: '/';
}
@counter-style thai-alphabetic {
type: alphabetic;
glyphs: '\E01' '\E02' '\E04' '\E07' '\E08' '\E09' '\E0A' '\E0B' '\E0C' '\E0D' '\E0E' '\E0F' '\E10' '\E11' '\E12' '\E13' '\E14' '\E15' '\E16' '\E17' '\E18' '\E19' '\E1A' '\E1B' '\E1C' '\E1D' '\E1E' '\E1F' '\E20' '\E21' '\E22' '\E23' '\E25' '\E27' '\E28' '\E29' '\E2A' '\E2B' '\E2C' '\E2D' '\E2E';
/* 'ก' 'ข' 'ค' 'ง' 'จ' 'ฉ' 'ช' 'ซ' 'ฌ' 'ญ' 'ฎ' 'ฏ' 'ฐ' 'ฑ' 'ฒ' 'ณ' 'ด' 'ต' 'ถ' 'ท' 'ธ' 'น' 'บ' 'ป' 'ผ' 'ฝ' 'พ' 'ฟ' 'ภ' 'ม' 'ย' 'ร' 'ล' 'ว' 'ศ' 'ษ' 'ส' 'ห' 'ฬ' 'อ' 'ฮ' */
}
@counter-style tigre {
type: alphabetic;
glyphs: '\1200' '\1208' '\1210' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\12A0' '\12A8' '\12C8' '\12D0' '\12D8' '\12E8' '\12F0' '\1300' '\1308' '\1320' '\1328' '\1330' '\1338' '\1348' '\1350';
/* 'ሀ' 'ለ' 'ሐ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'አ' 'ከ' 'ወ' 'ዐ' 'ዘ' 'የ' 'ደ' 'ጀ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style upper-alpha {
type: alphabetic;
glyphs: '\41' '\42' '\43' '\44' '\45' '\46' '\47' '\48' '\49' '\4A' '\4B' '\4C' '\4D' '\4E' '\4F' '\50' '\51' '\52' '\53' '\54' '\55' '\56' '\57' '\58' '\59' '\5A';
/* 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' */
}
@counter-style upper-belorussian {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\401' '\416' '\417' '\406' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\40E' '\424' '\425' '\426' '\427' '\428' '\42B' '\42C' '\42D' '\42E' '\42F';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ё' 'Ж' 'З' 'І' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ў' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Ы' 'Ь' 'Э' 'Ю' 'Я' */
}
@counter-style upper-bulgarian {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\416' '\417' '\418' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42A' '\42C' '\42E' '\42F';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ж' 'З' 'И' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Ъ' 'Ь' 'Ю' 'Я' */
}
@counter-style upper-macedonian {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\403' '\415' '\416' '\417' '\405' '\418' '\408' '\41A' '\41B' '\409' '\41C' '\41D' '\40A' '\41E' '\41F' '\420' '\421' '\422' '\40C' '\423' '\424' '\425' '\426' '\427' '\40F' '\428';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Ѓ' 'Е' 'Ж' 'З' 'Ѕ' 'И' 'Ј' 'К' 'Л' 'Љ' 'М' 'Н' 'Њ' 'О' 'П' 'Р' 'С' 'Т' 'Ќ' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Џ' 'Ш' */
}
@counter-style upper-oromo-qubee {
type: alphabetic;
glyphs: '\41' '\41\41' '\42' '\43' '\44' '\45' '\45\45' '\46' '\47' '\48' '\49' '\49\49' '\4A' '\4B' '\4C' '\4D' '\4E' '\4F' '\4F\4F' '\50' '\51' '\52' '\53' '\54' '\55' '\55\55' '\56' '\57' '\58' '\59' '\5A' '\43\48' '\44\48' '\4B\48' '\4E\59' '\50\48' '\53\48';
/* 'A' 'AA' 'B' 'C' 'D' 'E' 'EE' 'F' 'G' 'H' 'I' 'II' 'J' 'K' 'L' 'M' 'N' 'O' 'OO' 'P' 'Q' 'R' 'S' 'T' 'U' 'UU' 'V' 'W' 'X' 'Y' 'Z' 'CH' 'DH' 'KH' 'NY' 'PH' 'SH' */
}
@counter-style upper-russian {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\416' '\417' '\418' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42D' '\42E' '\42F';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ж' 'З' 'И' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Э' 'Ю' 'Я' */
}
@counter-style upper-russian-full {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\401' '\416' '\417' '\418' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42A' '\42B' '\42C' '\42D' '\42E' '\42F';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Ё' 'Ж' 'З' 'И' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Ъ' 'Ы' 'Ь' 'Э' 'Ю' 'Я' */
}
@counter-style upper-serbo-croatian {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\402' '\415' '\416' '\417' '\418' '\408' '\41A' '\41B' '\409' '\41C' '\41D' '\40A' '\41E' '\41F' '\420' '\421' '\422' '\40B' '\423' '\424' '\425' '\426' '\427' '\40F' '\428';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Ђ' 'Е' 'Ж' 'З' 'И' 'Ј' 'К' 'Л' 'Љ' 'М' 'Н' 'Њ' 'О' 'П' 'Р' 'С' 'Т' 'Ћ' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Џ' 'Ш' */
}
@counter-style upper-ukrainian {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\414' '\415' '\404' '\416' '\417' '\418' '\406' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\42E' '\42F';
/* 'А' 'Б' 'В' 'Г' 'Д' 'Е' 'Є' 'Ж' 'З' 'И' 'І' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Ю' 'Я' */
}
@counter-style upper-ukrainian-full {
type: alphabetic;
glyphs: '\410' '\411' '\412' '\413' '\490' '\414' '\415' '\404' '\416' '\417' '\418' '\406' '\407' '\419' '\41A' '\41B' '\41C' '\41D' '\41E' '\41F' '\420' '\421' '\422' '\423' '\424' '\425' '\426' '\427' '\428' '\429' '\42C' '\42E' '\42F';
/* 'А' 'Б' 'В' 'Г' 'Ґ' 'Д' 'Е' 'Є' 'Ж' 'З' 'И' 'І' 'Ї' 'Й' 'К' 'Л' 'М' 'Н' 'О' 'П' 'Р' 'С' 'Т' 'У' 'Ф' 'Х' 'Ц' 'Ч' 'Ш' 'Щ' 'Ь' 'Ю' 'Я' */
}
@counter-style wolaita {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1270' '\1278' '\1290' '\1298' '\1230' '\1308' '\1320' '\1328' '\1330' '\1338' '\1340' '\1348' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ሰ' 'ገ' 'ጠ' 'ጨ' 'ጰ' 'ጸ' 'ፀ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style yemsa {
type: alphabetic;
glyphs: '\1200' '\1208' '\1218' '\1228' '\1230' '\1238' '\1240' '\1260' '\1268' '\1270' '\1278' '\1290' '\1298' '\1300' '\1308' '\1318' '\1320' '\1328' '\1330' '\1348' '\1350';
/* 'ሀ' 'ለ' 'መ' 'ረ' 'ሰ' 'ሸ' 'ቀ' 'በ' 'ቨ' 'ተ' 'ቸ' 'ነ' 'ኘ' 'ጀ' 'ገ' 'ጘ' 'ጠ' 'ጨ' 'ጰ' 'ፈ' 'ፐ' */
suffix: '/';
}
@counter-style asterisk {
type: symbolic;
glyphs: '\2A';
/* '*' */
suffix: '';
}
@counter-style lower-alpha-symbolic {
type: symbolic;
glyphs: '\61' '\62' '\63' '\64' '\65' '\66' '\67' '\68' '\69' '\6A' '\6B' '\6C' '\6D' '\6E' '\6F' '\70' '\71' '\72' '\73' '\74' '\75' '\76' '\77' '\78' '\79' '\7A';
/* 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' */
}
@counter-style upper-alpha-symbolic {
type: symbolic;
glyphs: '\41' '\42' '\43' '\44' '\45' '\46' '\47' '\48' '\49' '\4A' '\4B' '\4C' '\4D' '\4E' '\4F' '\50' '\51' '\52' '\53' '\54' '\55' '\56' '\57' '\58' '\59' '\5A';
/* 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' */
}
@counter-style circled-decimal {
type: non-repeating 0;
glyphs: '\24EA' '\2460' '\2461' '\2462' '\2463' '\2464' '\2465' '\2466' '\2467' '\2468' '\2469' '\246A' '\246B' '\246C' '\246D' '\246E' '\246F' '\2470' '\2471' '\2472' '\2473' '\3251' '\3252' '\3253' '\3254' '\3255' '\3256' '\3257' '\3258' '\3259' '\325a' '\325b' '\325c' '\325d' '\325e' '\325f' '\32b1' '\32b2' '\32b3' '\32b4' '\32b5' '\32b6' '\32b7' '\32b8' '\32b9' '\32ba' '\32bb' '\32bc' '\32bd' '\32be' '\32bf';
/* '⓪' '①' '②' '③' '④' '⑤' '⑥' '⑦' '⑧' '⑨' '⑩' '⑪' '⑫' '⑬' '⑭' '⑮' '⑯' '⑰' '⑱' '⑲' '⑳' '㉑' '㉒' '㉓' '㉔' '㉕' '㉖' '㉗' '㉘' '㉙' '㉚' '㉛' '㉜' '㉝' '㉞' '㉟' '㊱' '㊲' '㊳' '㊴' '㊵' '㊶' '㊷' '㊸' '㊹' '㊺' '㊻' '㊼' '㊽' '㊾' '㊿' */
suffix: '';
}
@counter-style circled-lower-latin {
type: non-repeating;
glyphs: '\24D0' '\24D1' '\24D2' '\24D3' '\24D4' '\24D5' '\24D6' '\24D7' '\24D8' '\24D9' '\24DA' '\24DB' '\24DC' '\24DD' '\24DE' '\24DF' '\24E0' '\24E1' '\24E2' '\24E3' '\24E4' '\24E5' '\24E6' '\24E7' '\24E8' '\24E9';
/* 'ⓐ' 'ⓑ' 'ⓒ' 'ⓓ' 'ⓔ' 'ⓕ' 'ⓖ' 'ⓗ' 'ⓘ' 'ⓙ' 'ⓚ' 'ⓛ' 'ⓜ' 'ⓝ' 'ⓞ' 'ⓟ' 'ⓠ' 'ⓡ' 'ⓢ' 'ⓣ' 'ⓤ' 'ⓥ' 'ⓦ' 'ⓧ' 'ⓨ' 'ⓩ' */
suffix: '';
}
@counter-style circled-upper-latin {
type: non-repeating;
glyphs: '\24B6' '\24B7' '\24B8' '\24B9' '\24BA' '\24BB' '\24BC' '\24BD' '\24BE' '\24BF' '\24C0' '\24C1' '\24C2' '\24C3' '\24C4' '\24C5' '\24C6' '\24C7' '\24C8' '\24C9' '\24CA' '\24CB' '\24CC' '\24CD' '\24CE' '\24CF';
/* 'Ⓐ' 'Ⓑ' 'Ⓒ' 'Ⓓ' 'Ⓔ' 'Ⓕ' 'Ⓖ' 'Ⓗ' 'Ⓘ' 'Ⓙ' 'Ⓚ' 'Ⓛ' 'Ⓜ' 'Ⓝ' 'Ⓞ' 'Ⓟ' 'Ⓠ' 'Ⓡ' 'Ⓢ' 'Ⓣ' 'Ⓤ' 'Ⓥ' 'Ⓦ' 'Ⓧ' 'Ⓨ' 'Ⓩ' */
suffix: '';
}
@counter-style circled-korean-consonants {
type: non-repeating;
glyphs: '\3260' '\3261' '\3262' '\3263' '\3264' '\3265' '\3266' '\3267' '\3268' '\3269' '\326A' '\326B' '\326C' '\326D';
/* '㉠' '㉡' '㉢' '㉣' '㉤' '㉥' '㉦' '㉧' '㉨' '㉩' '㉪' '㉫' '㉬' '㉭' */
suffix: '';
}
@counter-style circled-korean-syllables {
type: non-repeating;
glyphs: '\326E' '\326F' '\3270' '\3271' '\3272' '\3273' '\3274' '\3275' '\3276' '\3277' '\3278' '\3279' '\327A' '\327B';
/* '㉮' '㉯' '㉰' '㉱' '㉲' '㉳' '㉴' '㉵' '㉶' '㉷' '㉸' '㉹' '㉺' '㉻' */
suffix: '';
}
@counter-style decimal-leading-zero {
type: non-repeating -9;
glyphs: '\2D\30\39' '\2D\30\38' '\2D\30\37' '\2D\30\36' '\2D\30\35' '\2D\30\34' '\2D\30\33' '\2D\30\32' '\2D\30\31' '\30\30' '\30\31' '\30\32' '\30\33' '\30\34' '\30\35' '\30\36' '\30\37' '\30\38' '\30\39';
/* '-09' '-08' '-07' '-06' '-05' '-04' '-03' '-02' '-01' '00' '01' '02' '03' '04' '05' '06' '07' '08' '09' */
}
@counter-style dotted-decimal {
type: non-repeating;
glyphs: '\2488' '\2489' '\248A' '\248B' '\248C' '\248D' '\248E' '\248F' '\2490' '\2491' '\2492' '\2493' '\2494' '\2495' '\2496' '\2497' '\2498' '\2499' '\249A' '\249B';
/* '⒈' '⒉' '⒊' '⒋' '⒌' '⒍' '⒎' '⒏' '⒐' '⒑' '⒒' '⒓' '⒔' '⒕' '⒖' '⒗' '⒘' '⒙' '⒚' '⒛' */
suffix: '';
}
@counter-style double-circled-decimal {
type: non-repeating;
glyphs: '\24F5' '\24F6' '\24F7' '\24F8' '\24F9' '\24FA' '\24FB' '\24FC' '\24FD' '\24FE';
/* '⓵' '⓶' '⓷' '⓸' '⓹' '⓺' '⓻' '⓼' '⓽' '⓾' */
suffix: '';
}
@counter-style filled-circled-decimal {
type: non-repeating;
glyphs: '\2776' '\2777' '\2778' '\2779' '\277a' '\277b' '\277c' '\277d' '\277e' '\277f' '\24EB' '\24EC' '\24ED' '\24EE' '\24EF' '\24F0' '\24F1' '\24F2' '\24F3' '\24F4';
/* '❶' '❷' '❸' '❹' '❺' '❻' '❼' '❽' '❾' '❿' '⓫' '⓬' '⓭' '⓮' '⓯' '⓰' '⓱' '⓲' '⓳' '⓴' */
suffix: '';
}
@counter-style fullwidth-upper-roman {
type: non-repeating;
glyphs: '\2160' '\2161' '\2162' '\2163' '\2164' '\2165' '\2166' '\2167' '\2168' '\2169' '\216A' '\216B';
/* 'Ⅰ' 'Ⅱ' 'Ⅲ' 'Ⅳ' 'Ⅴ' 'Ⅵ' 'Ⅶ' 'Ⅷ' 'Ⅸ' 'Ⅹ' 'Ⅺ' 'Ⅻ' */
suffix: '';
}
@counter-style fullwidth-lower-roman {
type: non-repeating;
glyphs: '\2170' '\2171' '\2172' '\2173' '\2174' '\2175' '\2176' '\2177' '\2178' '\2179' '\217A' '\217B';
/* 'ⅰ' 'ⅱ' 'ⅲ' 'ⅳ' 'ⅴ' 'ⅵ' 'ⅶ' 'ⅷ' 'ⅸ' 'ⅹ' 'ⅺ' 'ⅻ' */
suffix: '';
}
@counter-style parenthesized-decimal {
type: non-repeating;
glyphs: '\2474' '\2475' '\2476' '\2477' '\2478' '\2479' '\247A' '\247B' '\247C' '\247D' '\247E' '\247F' '\2480' '\2481' '\2482' '\2483' '\2484' '\2485' '\2486' '\2487';
/* '⑴' '⑵' '⑶' '⑷' '⑸' '⑹' '⑺' '⑻' '⑼' '⑽' '⑾' '⑿' '⒀' '⒁' '⒂' '⒃' '⒄' '⒅' '⒆' '⒇' */
suffix: '';
}
@counter-style parenthesized-lower-latin {
type: non-repeating;
glyphs: '\249C' '\249D' '\249E' '\249F' '\24A0' '\24A1' '\24A2' '\24A3' '\24A4' '\24A5' '\24A6' '\24A7' '\24A8' '\24A9' '\24AA' '\24AB' '\24AC' '\24AD' '\24AE' '\24AF' '\24B0' '\24B1' '\24B2' '\24B3' '\24B4' '\24B5';
/* '⒜' '⒝' '⒞' '⒟' '⒠' '⒡' '⒢' '⒣' '⒤' '⒥' '⒦' '⒧' '⒨' '⒩' '⒪' '⒫' '⒬' '⒭' '⒮' '⒯' '⒰' '⒱' '⒲' '⒳' '⒴' '⒵' */
suffix: '';
}
@counter-style parenthesized-hangul-consonants {
type: non-repeating;
glyphs: '\3200' '\3201' '\3202' '\3203' '\3204' '\3205' '\3206' '\3207' '\3208' '\3209' '\320A' '\320B' '\320C' '\320D';
/* '㈀' '㈁' '㈂' '㈃' '㈄' '㈅' '㈆' '㈇' '㈈' '㈉' '㈊' '㈋' '㈌' '㈍' */
suffix: '';
}
@counter-style parenthesized-hangul-syllable {
type: non-repeating;
glyphs: '\320E' '\320F' '\3210' '\3211' '\3212' '\3213' '\3214' '\3215' '\3216' '\3217' '\3218' '\3219' '\321A';
/* '㈎' '㈏' '㈐' '㈑' '㈒' '㈓' '㈔' '㈕' '㈖' '㈗' '㈘' '㈙' '㈚' */
suffix: '';
}
@counter-style persian-abjad {
type: non-repeating;
glyphs: '\627' '\628' '\62C' '\62F' '\647\200D' '\648' '\632' '\62D' '\637' '\6CC' '\6A9' '\644' '\645' '\646' '\633' '\639' '\641' '\635' '\642' '\631' '\634' '\62A' '\62B' '\62E' '\630' '\636' '\638' '\63A';
/* 'ا' 'ب' 'ج' 'د' 'ه' 'و' 'ز' 'ح' 'ط' 'ی' 'ک' 'ل' 'م' 'ن' 'س' 'ع' 'ف' 'ص' 'ق' 'ر' 'ش' 'ت' 'ث' 'خ' 'ذ' 'ض' 'ظ' 'غ' */
}
@counter-style persian-alphabetic {
type: non-repeating;
glyphs: '\627' '\628' '\67E' '\62A' '\62B' '\62C' '\686' '\62D' '\62E' '\62F' '\630' '\631' '\632' '\698' '\633' '\634' '\635' '\636' '\637' '\638' '\639' '\63A' '\641' '\642' '\6A9' '\6AF' '\644' '\645' '\646' '\648' '\647\200D' '\6CC';
/* 'ا' 'ب' 'پ' 'ت' 'ث' 'ج' 'چ' 'ح' 'خ' 'د' 'ذ' 'ر' 'ز' 'ژ' 'س' 'ش' 'ص' 'ض' 'ط' 'ظ' 'ع' 'غ' 'ف' 'ق' 'ک' 'گ' 'ل' 'م' 'ن' 'و' 'ه' 'ی' */
}
@counter-style hebrew {
type: additive;
range: 1 infinite;
additive-glyphs: 400 '\5EA', 300 '\5E9', 200 '\5E8', 100 '\5E7', 90 '\5E6', 80 '\5E4', 70 '\5E2', 60 '\5E1', 50 '\5E0', 40 '\5DE', 30 '\5DC', 20 '\5DB', 19 '\5D9\5D8', 18 '\5D9\5D7', 17 '\5D9\5D6', 16 '\5D8\5D6', 15 '\5D8\5D5', 10 '\5D9', 9 '\5D8', 8 '\5D7', 7 '\5D6', 6 '\5D5', 5 '\5D4', 4 '\5D3', 3 '\5D2', 2 '\5D1', 1 '\5D0';
/* 400 'ת', 300 'ש', 200 'ר', 100 'ק', 90 'צ', 80 'פ', 70 'ע', 60 'ס', 50 'נ', 40 'מ', 30 'ל', 20 'כ', 10 'י', 9 'ט', 8 'ח', 7 'ז', 6 'ו', 5 'ה', 4 'ד', 3 'ג', 2 'ב', 1 'א' */
/* This system manually specifies the values for 19-15 to force the correct display of 15 and 16, which are commonly
rewritten to avoid a close resemblance to the Tetragrammaton. */
}
@counter-style simple-upper-roman {
type: additive;
range: 1 4999;
additive-glyphs: 1000 '\4D', 500 '\44', 100 '\43', 50 '\4C', 10 '\58', 5 '\56', 1 '\49';
/* 1000 'M', 500 'D', 100 'C', 50 'L', 10 'X', 5 'V', 1 'I' */
}
@counter-style simple-lower-roman {
type: additive;
range: 1 4999;
additive-glyphs: 1000 '\6D', 500 '\64', 100 '\63', 50 '\6C', 10 '\78', 5 '\76', 1 '\69';
/* 1000 'm', 500 'd', 100 'c', 50 'l', 10 'x', 5 'v', 1 'i' */
}
@counter-style upper-roman {
type: additive;
range: 1 4999;
additive-glyphs: 1000 '\4D', 900 '\43\4D', 500 '\44', 400 '\43\44', 100 '\43', 90 '\58\43', 50 '\4C', 40 '\58\4C', 10 '\58', 9 '\49\58', 5 '\56', 4 '\49\56', 1 '\49';
/* 1000 'M', 900 'CM', 500 'D', 400 'CD', 100 'C', 90 'XC', 50 'L', 40 'XL', 10 'X', 9 'IX', 5 'V', 4 'IV', 1 'I' */
}
@counter-style lower-roman {
type: additive;
range: 1 4999;
additive-glyphs: 1000 '\6D', 900 '\63\6D', 500 '\64', 400 '\63\64', 100 '\63', 90 '\78\63', 50 '\6C', 40 '\78\6C', 10 '\78', 9 '\69\78', 5 '\76', 4 '\69\76', 1 '\69';
/* 1000 'm', 900 'cm', 500 'd', 400 'cd', 100 'c', 90 'xc', 50 'l', 40 'xl', 10 'x', 9 'ix', 5 'v', 4 'iv', 1 'i' */
}
@counter-style lower-armenian {
type: additive;
range: 1 9999;
additive-glyphs: 9000 '\584', 8000 '\583', 7000 '\582', 6000 '\581', 5000 '\580', 4000 '\57F', 3000 '\57E', 2000 '\57D', 1000 '\57C', 900 '\57B', 800 '\57A', 700 '\579', 600 '\578', 500 '\577', 400 '\576', 300 '\575', 200 '\574', 100 '\573', 90 '\572', 80 '\571', 70 '\570', 60 '\56F', 50 '\56E', 40 '\56D', 30 '\56C', 20 '\56B', 10 '\56A', 9 '\569', 8 '\568', 7 '\567', 6 '\566', 5 '\565', 4 '\564', 3 '\563', 2 '\562', 1 '\561';
/* 9000 'ք', 8000 'փ', 7000 'ւ', 6000 'ց', 5000 'ր', 4000 'տ', 3000 'վ', 2000 'ս', 1000 'ռ', 900 'ջ', 800 'պ', 700 'չ', 600 'ո', 500 'շ', 400 'ն', 300 'յ', 200 'մ', 100 'ճ', 90 'ղ', 80 'ձ', 70 'հ', 60 'կ', 50 'ծ', 40 'խ', 30 'լ', 20 'ի', 10 'ժ', 9 'թ', 8 'ը', 7 'է', 6 'զ', 5 'ե', 4 'դ', 3 'գ', 2 'բ', 1 'ա' */
}
@counter-style upper-armenian {
type: additive;
range: 1 9999;
additive-glyphs: 9000 '\554', 8000 '\553', 7000 '\552', 6000 '\551', 5000 '\550', 4000 '\54F', 3000 '\54E', 2000 '\54D', 1000 '\54C', 900 '\54B', 800 '\54A', 700 '\549', 600 '\548', 500 '\547', 400 '\546', 300 '\545', 200 '\544', 100 '\543', 90 '\542', 80 '\541', 70 '\540', 60 '\53F', 50 '\53E', 40 '\53D', 30 '\53C', 20 '\53B', 10 '\53A', 9 '\539', 8 '\538', 7 '\537', 6 '\536', 5 '\535', 4 '\534', 3 '\533', 2 '\532', 1 '\531';
/* 9000 'Ք', 8000 'Փ', 7000 'Ւ', 6000 'Ց', 5000 'Ր', 4000 'Տ', 3000 'Վ', 2000 'Ս', 1000 'Ռ', 900 'Ջ', 800 'Պ', 700 'Չ', 600 'Ո', 500 'Շ', 400 'Ն', 300 'Յ', 200 'Մ', 100 'Ճ', 90 'Ղ', 80 'Ձ', 70 'Հ', 60 'Կ', 50 'Ծ', 40 'Խ', 30 'Լ', 20 'Ի', 10 'Ժ', 9 'Թ', 8 'Ը', 7 'Է', 6 'Զ', 5 'Ե', 4 'Դ', 3 'Գ', 2 'Բ', 1 'Ա' */
}
@counter-style armenian {
type: additive;
range: 1 9999;
additive-glyphs: 9000 '\554', 8000 '\553', 7000 '\552', 6000 '\551', 5000 '\550', 4000 '\54F', 3000 '\54E', 2000 '\54D', 1000 '\54C', 900 '\54B', 800 '\54A', 700 '\549', 600 '\548', 500 '\547', 400 '\546', 300 '\545', 200 '\544', 100 '\543', 90 '\542', 80 '\541', 70 '\540', 60 '\53F', 50 '\53E', 40 '\53D', 30 '\53C', 20 '\53B', 10 '\53A', 9 '\539', 8 '\538', 7 '\537', 6 '\536', 5 '\535', 4 '\534', 3 '\533', 2 '\532', 1 '\531';
/* 9000 'Ք', 8000 'Փ', 7000 'Ւ', 6000 'Ց', 5000 'Ր', 4000 'Տ', 3000 'Վ', 2000 'Ս', 1000 'Ռ', 900 'Ջ', 800 'Պ', 700 'Չ', 600 'Ո', 500 'Շ', 400 'Ն', 300 'Յ', 200 'Մ', 100 'Ճ', 90 'Ղ', 80 'Ձ', 70 'Հ', 60 'Կ', 50 'Ծ', 40 'Խ', 30 'Լ', 20 'Ի', 10 'Ժ', 9 'Թ', 8 'Ը', 7 'Է', 6 'Զ', 5 'Ե', 4 'Դ', 3 'Գ', 2 'Բ', 1 'Ա' */
}
@counter-style georgian {
type: additive;
range: 1 19999;
additive-glyphs: 10000 '\10F5', 9000 '\10F0', 8000 '\10EF', 7000 '\10F4', 6000 '\10EE', 5000 '\10ED', 4000 '\10EC', 3000 '\10EB', 2000 '\10EA', 1000 '\10E9', 900 '\10E8', 800 '\10E7', 700 '\10E6', 600 '\10E5', 500 '\10E4', 400 '\10F3', 300 '\10E2', 200 '\10E1', 100 '\10E0', 90 '\10DF', 80 '\10DE', 70 '\10DD', 60 '\10F2', 50 '\10DC', 40 '\10DB', 30 '\10DA', 20 '\10D9', 10 '\10D8', 9 '\10D7', 8 '\10F1', 7 '\10D6', 6 '\10D5', 5 '\10D4', 4 '\10D3', 3 '\10D2', 2 '\10D1', 1 '\10D0';
/* 10000 'ჵ', 9000 'ჰ', 8000 'ჯ', 7000 'ჴ', 6000 'ხ', 5000 'ჭ', 4000 'წ', 3000 'ძ', 2000 'ც', 1000 'ჩ', 900 'შ', 800 'ყ', 700 'ღ', 600 'ქ', 500 'ფ', 400 'ჳ', 300 'ტ', 200 'ს', 100 'რ', 90 'ჟ', 80 'პ', 70 'ო', 60 'ჲ', 50 'ნ', 40 'მ', 30 'ლ', 20 'კ', 10 'ი', 9 'თ', 8 'ჱ', 7 'ზ', 6 'ვ', 5 'ე', 4 'დ', 3 'გ', 2 'ბ', 1 'ა' */
}
@counter-style ancient-tamil {
type: additive;
range: 1 9999;
additive-glyphs: 9000 '\BEF\BF2', 8000 '\BEE\BF2', 7000 '\BED\BF2', 6000 '\BEC\BF2', 5000 '\BEB\BF2', 4000 '\BEA\BF2', 3000 '\BE9\BF2', 2000 '\BE8\BF2', 1000 '\BF2', 900 '\BEF\BF1', 800 '\BEE\BF1', 700 '\BED\BF1', 600 '\BEC\BF1', 500 '\BEB\BF1', 400 '\BEA\BF1', 300 '\BE9\BF1', 200 '\BE8\BF1', 100 '\BF1', 90 '\BEF\BF0', 80 '\BEE\BF0', 70 '\BED\BF0', 60 '\BEC\BF0', 50 '\BEB\BF0', 40 '\BEA\BF0', 30 '\BE9\BF0', 20 '\BE8\BF0', 10 '\BF0', 9 '\BEF', 8 '\BEE', 7 '\BED', 6 '\BEC', 5 '\BEB', 4 '\BEA', 3 '\BE9', 2 '\BE8', 1 '\BE7';
/* 9000 '௯௲', 8000 '௮௲', 7000 '௭௲', 6000 '௬௲', 5000 '௫௲', 4000 '௪௲', 3000 '௩௲', 2000 '௨௲', 1000 '௲', 900 '௯௱', 800 '௮௱', 700 '௭௱', 600 '௬௱', 500 '௫௱', 400 '௪௱', 300 '௩௱', 200 '௨௱', 100 '௱', 90 '௯௰', 80 '௮௰', 70 '௭௰', 60 '௬௰', 50 '௫௰', 40 '௪௰', 30 '௩௰', 20 '௨௰', 10 '௰', 9 '௯', 8 '௮', 7 '௭', 6 '௬', 5 '௫', 4 '௪', 3 '௩', 2 '௨', 1 '௧' */
}
@counter-style japanese-informal {
type: additive;
range: 0 9999;
additive-glyphs: 9000 '\4E5D\5343', 8000 '\516B\5343', 7000 '\4E03\5343', 6000 '\516D\5343', 5000 '\4E94\5343', 4000 '\56DB\5343', 3000 '\4E09\5343', 2000 '\4E8C\5343', 1000 '\5343', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4E94\767E', 400 '\56DB\767E', 300 '\4E09\767E', 200 '\4E8C\767E', 100 '\767E', 90 '\4E5D\5341', 80 '\516B\5341', 70 '\4E03\5341', 60 '\516D\5341', 50 '\4E94\5341', 40 '\56DB\5341', 30 '\4E09\5341', 20 '\4E8C\5341', 10 '\5341', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4E94', 4 '\56DB', 3 '\4E09', 2 '\4E8C', 1 '\4E00', 0 '\3007';
/* 9000 '九千', 8000 '八千', 7000 '七千', 6000 '六千', 5000 '五千', 4000 '四千', 3000 '三千', 2000 '二千', 1000 '千', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '五百', 400 '四百', 300 '三百', 200 '二百', 100 '百', 90 '九十', 80 '八十', 70 '七十', 60 '六十', 50 '五十', 40 '四十', 30 '三十', 20 '二十', 10 '十', 9 '九', 8 '八', 7 '七', 6 '六', 5 '五', 4 '四', 3 '三', 2 '二', 1 '一', 0 '〇' */
suffix: '\3001';
/* '、' */
fallback: cjk-decimal;
}
@counter-style japanese-formal {
type: additive;
range: 0 9999;
additive-glyphs: 9000 '\4E5D\9621', 8000 '\516B\9621', 7000 '\4E03\9621', 6000 '\516D\9621', 5000 '\4F0D\9621', 4000 '\56DB\9621', 3000 '\53C2\9621', 2000 '\5F10\9621', 1000 '\58F1\9621', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4F0D\767E', 400 '\56DB\767E', 300 '\53C2\767E', 200 '\5F10\767E', 100 '\58F1\767E', 90 '\4E5D\62FE', 80 '\516B\62FE', 70 '\4E03\62FE', 60 '\516D\62FE', 50 '\4F0D\62FE', 40 '\56DB\62FE', 30 '\53C2\62FE', 20 '\5F10\62FE', 10 '\58F1\62FE', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4F0D', 4 '\56DB', 3 '\53C2', 2 '\5F10', 1 '\58F1', 0 '\96F6';
/* 9000 '九阡', 8000 '八阡', 7000 '七阡', 6000 '六阡', 5000 '伍阡', 4000 '四阡', 3000 '参阡', 2000 '弐阡', 1000 '壱阡', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '伍百', 400 '四百', 300 '参百', 200 '弐百', 100 '壱百', 90 '九拾', 80 '八拾', 70 '七拾', 60 '六拾', 50 '伍拾', 40 '四拾', 30 '参拾', 20 '弐拾', 10 '壱拾', 9 '九', 8 '八', 7 '七', 6 '六', 5 '伍', 4 '四', 3 '参', 2 '弐', 1 '壱', 0 '零' */
suffix: '\3001';
/* '、' */
fallback: cjk-decimal;
}
@counter-style korean-hangul-formal {
type: additive;
range: 0 9999;
additive-glyphs: 9000 '\AD6C\CC9C', 8000 '\D314\CC9C', 7000 '\CE60\CC9C', 6000 '\C721\CC9C', 5000 '\C624\CC9C', 4000 '\C0AC\CC9C', 3000 '\C0BC\CC9C', 2000 '\C774\CC9C', 1000 '\C77C\CC9C', 900 '\AD6C\BC31', 800 '\D314\BC31', 700 '\CE60\BC31', 600 '\C721\BC31', 500 '\C624\BC31', 400 '\C0AC\BC31', 300 '\C0BC\BC31', 200 '\C774\BC31', 100 '\C77C\BC31', 90 '\AD6C\C2ED', 80 '\D314\C2ED', 70 '\CE60\C2ED', 60 '\C721\C2ED', 50 '\C624\C2ED', 40 '\C0AC\C2ED', 30 '\C0BC\C2ED', 20 '\C774\C2ED', 10 '\C77C\C2ED', 9 '\AD6C', 8 '\D314', 7 '\CE60', 6 '\C721', 5 '\C624', 4 '\C0AC', 3 '\C0BC', 2 '\C774', 1 '\C77C', 0 '\C601';
/* 9000 '구천', 8000 '팔천', 7000 '칠천', 6000 '육천', 5000 '오천', 4000 '사천', 3000 '삼천', 2000 '이천', 1000 '일천', 900 '구백', 800 '팔백', 700 '칠백', 600 '육백', 500 '오백', 400 '사백', 300 '삼백', 200 '이백', 100 '일백', 90 '구십', 80 '팔십', 70 '칠십', 60 '육십', 50 '오십', 40 '사십', 30 '삼십', 20 '이십', 10 '일십', 9 '구', 8 '팔', 7 '칠', 6 '육', 5 '오', 4 '사', 3 '삼', 2 '이', 1 '일', 0 '영' */
suffix: '\3001';
/* '、' */
}
@counter-style korean-hanja-informal {
type: additive;
range: 0 9999;
additive-glyphs: 9000 '\4E5D\5343', 8000 '\516B\5343', 7000 '\4E03\5343', 6000 '\516D\5343', 5000 '\4E94\5343', 4000 '\56DB\5343', 3000 '\4E09\5343', 2000 '\4E8C\5343', 1000 '\5343', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4E94\767E', 400 '\56DB\767E', 300 '\4E09\767E', 200 '\4E8C\767E', 100 '\767E', 90 '\4E5D\5341', 80 '\516B\5341', 70 '\4E03\5341', 60 '\516D\5341', 50 '\4E94\5341', 40 '\56DB\5341', 30 '\4E09\5341', 20 '\4E8C\5341', 10 '\5341', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4E94', 4 '\56DB', 3 '\4E09', 2 '\4E8C', 1 '\4E00', 0 '\96F6';
/* 9000 '九千', 8000 '八千', 7000 '七千', 6000 '六千', 5000 '五千', 4000 '四千', 3000 '三千', 2000 '二千', 1000 '千', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '五百', 400 '四百', 300 '三百', 200 '二百', 100 '百', 90 '九十', 80 '八十', 70 '七十', 60 '六十', 50 '五十', 40 '四十', 30 '三十', 20 '二十', 10 '十', 9 '九', 8 '八', 7 '七', 6 '六', 5 '五', 4 '四', 3 '三', 2 '二', 1 '一', 0 '零' */
suffix: '\3001';
/* '、' */
}
@counter-style korean-hanja-formal {
type: additive;
range: 0 9999;
additive-glyphs: 9000 '\4E5D\4EDF', 8000 '\516B\4EDF', 7000 '\4E03\4EDF', 6000 '\516D\4EDF', 5000 '\4E94\4EDF', 4000 '\56DB\4EDF', 3000 '\53C3\4EDF', 2000 '\8CB3\4EDF', 1000 '\58F9\4EDF', 900 '\4E5D\767E', 800 '\516B\767E', 700 '\4E03\767E', 600 '\516D\767E', 500 '\4E94\767E', 400 '\56DB\767E', 300 '\53C3\767E', 200 '\8CB3\767E', 100 '\58F9\767E', 90 '\4E5D\62FE', 80 '\516B\62FE', 70 '\4E03\62FE', 60 '\516D\62FE', 50 '\4E94\62FE', 40 '\56DB\62FE', 30 '\53C3\62FE', 20 '\8CB3\62FE', 10 '\58F9\62FE', 9 '\4E5D', 8 '\516B', 7 '\4E03', 6 '\516D', 5 '\4E94', 4 '\56DB', 3 '\53C3', 2 '\8CB3', 1 '\58F9', 0 '\96F6';
/* 9000 '九仟', 8000 '八仟', 7000 '七仟', 6000 '六仟', 5000 '五仟', 4000 '四仟', 3000 '參仟', 2000 '貳仟', 1000 '壹仟', 900 '九百', 800 '八百', 700 '七百', 600 '六百', 500 '五百', 400 '四百', 300 '參百', 200 '貳百', 100 '壹百', 90 '九拾', 80 '八拾', 70 '七拾', 60 '六拾', 50 '五拾', 40 '四拾', 30 '參拾', 20 '貳拾', 10 '壹拾', 9 '九', 8 '八', 7 '七', 6 '六', 5 '五', 4 '四', 3 '參', 2 '貳', 1 '壹', 0 '零' */
suffix: '\3001';
/* '、' */
}
@counter-style greek {
type: additive;
range: 1 999;
additive-glyphs: 900 '\3E1', 800 '\3C9', 700 '\3C8', 600 '\3C7', 500 '\3C6', 400 '\3C5', 300 '\3C4', 200 '\3C3', 100 '\3C1', 90 '\3DF', 80 '\3C0', 70 '\3BF', 60 '\3BE', 50 '\3BD', 40 '\3BC', 30 '\3BB', 20 '\3BA', 10 '\3B9', 9 '\3B8', 8 '\3B7', 7 '\3B6', 6 '\3C3\3C4', 5 '\3B4', 4 '\3B3', 3 '\3B2', 2 '\3B1', 1 '\3B0';
/* 900 'ϡ', 800 'ω', 700 'ψ', 600 'χ', 500 'φ', 400 'υ', 300 'τ', 200 'σ', 100 'ρ', 90 'ϟ', 80 'π', 70 'ο', 60 'ξ', 50 'ν', 40 'μ', 30 'λ', 20 'κ', 10 'ι', 9 'θ', 8 'η', 7 'ζ', 6 'στ', 5 'ε', 4 'δ', 3 'γ', 2 'β', 1 'α' */
}
Per http://www.ethiopic.org/w3c/css/WD-css3-lists-20020220-comments.html#armenianlists, putting the circumflex above a digit in armenian numbering multiplies the digit by 1000. The draft currently states a 10,000 multiplier. Which is correct? (Having the multiplier be 1000 means that you can potentially write the thousands digit two ways, using either the set of thousands digits or the set of ones digits with a circumflex. The examples given in the note appear to use the former.)
According to a native Greek speaker, the lower-greek and upper-greek styles aren't actually used. I've removed upper-greek for now, but kept lower-greek because CSS2.1 included the keyword. Do these have actual use-cases?
While authors may define their own counter styles using the ‘@counter-style
’ rule defined in this spec or rely
on the set of predefined counter styles, a
few counter styles are described by rules that are too complex to be
captured by the predefined algorithms. These counter styles are described
in this section.
The counter styles specified in this section have custom algorithms for generating
counter values, but are otherwise identical to a counter style
defined via the ‘@counter-style
’ rule,
described below. For example, an author can reference one of these styles
in an ‘override
’ type, reusing the
algorithm but swapping out some of the other descriptors.
CSS 2.1 defined three single-glyph counter styles (‘circle
’, ‘disc
’, and ‘square
’), but didn't
define precisely how to render them, instead opting to describe generally
how they should look and leaving it up to the UA to decide how to render
the markers.
The Predefined Counter Styles section gives normative definitions for these styles, but UAs may instead default to rendering these styles using a browser-generated image matching the description below. This only describes the rendering of the default counter styles associated with these names - if an author or user creates their own counter style with one of these names (overriding the UA-default version), they must be honored as normal.
If the UA chooses to use an image for the default rendering of these counter styles, the image must be scalable and designed to attractively fill a box 1em wide and 1em tall.
ethiopic-numeric
’ counter styleThe Ethiopian numbering system is defined for all positive non-zero numbers. The following algorithm converts decimal digits to ethiopic numbers.
Tens | Units | ||||
---|---|---|---|---|---|
Values | Codepoints | Values | Codepoints | ||
10 | ፲ | U+1372 | 1 | ፩ | U+1369 |
20 | ፳ | U+1373 | 2 | ፪ | U+136A |
30 | ፴ | U+1374 | 3 | ፫ | U+136B |
40 | ፵ | U+1375 | 4 | ፬ | U+136C |
50 | ፶ | U+1376 | 5 | ፭ | U+136D |
60 | ፷ | U+1377 | 6 | ፮ | U+136E |
70 | ፸ | U+1378 | 7 | ፯ | U+136F |
80 | ፹ | U+1379 | 8 | ፰ | U+1370 |
90 | ፺ | U+137A | 9 | ፱ | U+1371 |
For this system, the name is "ethiopian-numeric", the lower range bound descriptor is 1, the upper range bound descriptor is infinity, and the rest of the descriptors have their initial value.
Is there a better suffix to use than the initial (".")? The alphabetic ethiopic systems use a different suffix.
The decimal number 100, in ethiopic, is ፻ U+137B
The decimal number 78010092, in ethiopic, is ፸፰፻፩፼፻፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137B U+137A U+136A.
The decimal number 780000001092, in ethiopic, is ፸፰፻፩፼፻፼፻፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137B U+137C U+137B U+137A U+136A.
Chinese, Japanese, and Korean have longhand counter styles, which have a structure similar to "one hundred thirteen thousand and twenty-three" in English. Each has both formal and informal variants. The formal styles are typically used in financial and legal documents, as their characters are more difficult to alter.
The Japanese and Korean longhand counter styles are expressed using the additive counter algorithm, in the Predefined Counter Styles section. The Chinese longhand styles have slightly more complex requirements that prevent them from being defined as additive style, so instead the following counter styles are defined in this section:
trad-chinese-informal
’.
Add an example to each of the above types.
The Chinese longhand styles are defined over the range -9999 to 9999.
For numbers outside this range, the ‘cjk-decimal
’ style is used. All of the styles
are defined by almost identical algorithms (specified as a single
algorithm here, with the differences called out when relevant), but use
different sets of characters. The list following the algorithm gives the
name of each counter style using this algorithm, and the individual
character sets used by each style.
For all of these counter styles, the suffix descriptor is "、" U+3001, the fallback
descriptor is ‘cjk-decimal
’, the lower bound
descriptor is -9999, the upper bound descriptor is 9999, and the
negative sign
is given in the table of glyphs for each style.
The following tables define the characters used in these styles:
Values | Codepoints | |||
---|---|---|---|---|
simp-chinese-informal | simp-chinese-formal | trad-chinese-informal | trad-chinese-formal | |
Digit 0 | 零 U+96F6 | 零 U+96F6 | 零 U+96F6 | 零 U+96F6 |
Digit 1 | 一 U+4E00 | 壹 U+58F9 | 一 U+4E00 | 壹 U+58F9 |
Digit 2 | 二 U+4E8C | 贰 U+8D30 | 二 U+4E8C | 貳 U+8CB3 |
Digit 3 | 三 U+4E09 | 叁 U+53C1 | 三 U+4E09 | 參 U+53C3 |
Digit 4 | 四 U+56DB | 肆 U+8086 | 四 U+56DB | 肆 U+8086 |
Digit 5 | 五 U+4E94 | 伍 U+4F0D | 五 U+4E94 | 伍 U+4F0D |
Digit 6 | 六 U+516D | 陆 U+9646 | 六 U+516D | 陸 U+9678 |
Digit 7 | 七 U+4E03 | 柒 U+67D2 | 七 U+4E03 | 柒 U+67D2 |
Digit 8 | 八 U+516B | 捌 U+634C | 八 U+516B | 捌 U+634C |
Digit 9 | 九 U+4E5D | 玖 U+7396 | 九 U+4E5D | 玖 U+7396 |
Tens Digit Marker | 十 U+5341 | 拾 U+62FE | 十 U+5341 | 拾 U+62FE |
Hundreds Digit Marker | 百 U+767E | 佰 U+4F70 | 百 U+767E | 佰 U+4F70 |
Thousands Digit Marker | 千 U+5343 | 仟 U+4EDF | 千 U+5343 | 仟 U+4EDF |
Negative Sign | 负 U+8D1F | 負 U+8D1F | 負 U+8CA0 | 負 U+8CA0 |
Note: Chinese, Japanese, and Korean longhand numbering is actually defined up to 1072. In practice, lists are rarely numbered above ten thousand, so these styles have been limited to their first "group".
Some counter styles described in earlier chapters have been limited to an artifically small (though still useful) range to reduce the overall complexity of the spec and the task of implementing those styles. However, some implementations might consider the extra complexity worthwhile for the additional range it offers to authors. To accomodate this, this section describes how to extend the limited counter-styles to a larger range.
This entire section is normative, but optional. User-agents may ignore it and still be conformant. If a user-agent implements some of the extended forms described in this section, they must be implemented as described here.
The Chinese longhand styles are defined out to 10k with a specialized algorithm, while the Japanese and Korean longhand styles are defined similarly as additive styles. However, these styles are defined out to 1016 in common usage. The following section describes an alternative algorithm for these styles.
The Chinese and Japanese styles are defined for all numbers between
-1016 and 1016, exclusive; the Korean styles are
defined for all non-negative numbers less than 1016. For
numbers outside this range, the ‘cjk-decimal
’ style is used. All of the styles
are defined by almost identical algorithms (specified as a single
algorithm here, with the differences called out when relevant), but use
different sets of characters. The list following the algorithm gives the
name of each counter style using this algorithm, and the individual
character sets used by each style.
For all of these counter styles, the suffix descriptor is "、" U+3001, the fallback
descriptor is ‘cjk-decimal
’, and the negative sign is
given in the tables below, or else is the initial value of the descriptor.
For Chinese and Japanese, the lower range
bound descriptor is -9999 9999 9999 9999 (-1016+1), while
for Korean it's 0. For all of them, the upper
range bound descriptor is 9999 9999 9999 9999 (1016-1).
The following tables define the characters used in these styles:
Values | Codepoints | |||
---|---|---|---|---|
simp-chinese-informal | simp-chinese-formal | trad-chinese-informal | trad-chinese-formal | |
Digit 0 | 零 U+96F6 | 零 U+96F6 | 零 U+96F6 | 零 U+96F6 |
Digit 1 | 一 U+4E00 | 壹 U+58F9 | 一 U+4E00 | 壹 U+58F9 |
Digit 2 | 二 U+4E8C | 贰 U+8D30 | 二 U+4E8C | 貳 U+8CB3 |
Digit 3 | 三 U+4E09 | 叁 U+53C1 | 三 U+4E09 | 參 U+53C3 |
Digit 4 | 四 U+56DB | 肆 U+8086 | 四 U+56DB | 肆 U+8086 |
Digit 5 | 五 U+4E94 | 伍 U+4F0D | 五 U+4E94 | 伍 U+4F0D |
Digit 6 | 六 U+516D | 陆 U+9646 | 六 U+516D | 陸 U+9678 |
Digit 7 | 七 U+4E03 | 柒 U+67D2 | 七 U+4E03 | 柒 U+67D2 |
Digit 8 | 八 U+516B | 捌 U+634C | 八 U+516B | 捌 U+634C |
Digit 9 | 九 U+4E5D | 玖 U+7396 | 九 U+4E5D | 玖 U+7396 |
Second Digit Marker | 十 U+5341 | 拾 U+62FE | 十 U+5341 | 拾 U+62FE |
Third Digit Marker | 百 U+767E | 佰 U+4F70 | 百 U+767E | 佰 U+4F70 |
Fourth Digit Marker | 千 U+5343 | 仟 U+4EDF | 千 U+5343 | 仟 U+4EDF |
Second Group Marker | 万 U+4E07 | 万 U+4E07 | 萬 U+842C | 萬 U+842C |
Third Group Marker | 亿 U+4EBF | 亿 U+4EBF | 億 U+5104 | 億 U+5104 |
Fourth Group Marker | 万亿 U+4E07 U+4EBF | 万亿 U+4E07 U+4EBF | 兆 U+5146 | 兆 U+5146 |
Negative Sign | 负 U+8D1F | 負 U+8D1F | 負 U+8CA0 | 負 U+8CA0 |
Values | Codepoints | |
---|---|---|
japanese-informal | japanese-formal | |
Digit 0 | 〇 U+3007 | 零 U+96F6 |
Digit 1 | 一 U+4E00 | 壱 U+58F1 |
Digit 2 | 二 U+4E8C | 弐 U+5F10 |
Digit 3 | 三 U+4E09 | 参 U+53C2 |
Digit 4 | 四 U+56DB | 四 U+56DB |
Digit 5 | 五 U+4E94 | 伍 U+4f0D |
Digit 6 | 六 U+516D | 六 U+516D |
Digit 7 | 七 U+4E03 | 七 U+4E03 |
Digit 8 | 八 U+516B | 八 U+516B |
Digit 9 | 九 U+4E5D | 九 U+4E5D |
Second Digit Marker | 十 U+5341 | 拾 U+62FE |
Third Digit Marker | 百 U+767E | 百 U+767E |
Fourth Digit Marker | 千 U+5343 | 阡 U+9621 |
Second Group Marker | 万 U+4E07 | 萬 U+842C |
Third Group Marker | 億 U+5104 | 億 U+5104 |
Fourth Group Marker | 兆 U+5146 | 兆 U+5146 |
Negative Sign | マイナス U+30DE U+30A4 U+30CA U+30B9 |
Values | Codepoints | ||
---|---|---|---|
korean-hangul-formal | korean-hanja-informal | korean-hanja-formal | |
Digit 0 | 영 U+C601 | 零 U+96F6 | 零 U+96F6 |
Digit 1 | 일 U+C77C | 一 U+4E00 | 壹 U+58F9 |
Digit 2 | 이 U+C774 | 二 U+4E8C | 貳 U+8CB3 |
Digit 3 | 삼 U+C0BC | 三 U+4E09 | 參 U+53C3 |
Digit 4 | 사 U+C0AC | 四 U+56DB | 四 U+56DB |
Digit 5 | 오 U+C624 | 五 U+4E94 | 五 U+4E94 |
Digit 6 | 육 U+C721 | 六 U+516D | 六 U+516D |
Digit 7 | 칠 U+CE60 | 七 U+4E03 | 七 U+4E03 |
Digit 8 | 팔 U+D314 | 八 U+516B | 八 U+516B |
Digit 9 | 구 U+AD6C | 九 U+4E5D | 九 U+4E5D |
Second Digit Marker | 십 U+C2ED | 十 U+5341 | 拾 U+62FE |
Third Digit Marker | 백 U+BC31 | 百 U+767E | 百 U+767E |
Fourth Digit Marker | 천 U+CC9C | 千 U+5343 | 仟 U+4EDF |
Second Group Marker | 만 U+B9CC | 萬 U+842C | 萬 U+842C |
Third Group Marker | 억 U+C5B5 | 億 U+5104 | 億 U+5104 |
Fourth Group Marker | 조 U+C870 | 兆 U+5146 | 兆 U+5146 |
Several non-repeating styles are numeric in nature, but are represented by single Unicode characters. As such, they are limited to the range of characters that Unicode saw fit to define for them. However, new glyphs can be generated by the UA over a somewhat extended range.
All of the following styles are defined over the range 1-99. The glyphs for each counter value must be the unicode glyph already defined for that value in the existing @counter-style rule, or a generated image in the same style with the counter value changed as appropriate:
circled-decimal
’
dotted-decimal
’
double-circled-decimal
’
filled-circled-decimal
’
parenthesized-decimal
’
This section is informative, not normative. HTML itself defines the actual default properties that apply to HTML lists.
/* Set up list items */
li {
display: list-item;
/* counter-increment: list-item; (implied by display: list-item) */
}
/* Set up ol and ul so that they reset the list-item counter */
ol, ul {
counter-reset: list-item;
}
/* Default list style types for ordered lists */
ol {
list-style-type: decimal;
}
/* Default list style types for unordered lists up to 3 deep */
ul { list-style-type: disc; }
ul ul { list-style-type: square; }
ul ul ul { list-style-type: circle; }
/* The type attribute on ol and ul elements */
ul[type="disc"] { list-style-type: disc; }
ul[type="circle"] { list-style-type: circle; }
ul[type="square"] { list-style-type: square; }
ol[type="1"] { list-style-type: decimal; }
ol[type="a"] { list-style-type: lower-alpha; }
ol[type="A"] { list-style-type: upper-alpha; }
ol[type="i"] { list-style-type: lower-roman; }
ol[type="I"] { list-style-type: upper-roman; }
/* The start attribute on ol elements */
ol[start] {
counter-reset: list-item attr(start, integer, 1);
counter-increment: list-item -1;
}
/* The value attribute on li elements */
li[value] {
counter-reset: list-item attr(value, integer, 1);
counter-increment: none;
}
/* Box Model Rules */
ol, ul {
display: block;
margin: 1em 0;
padding-left: 40px;
marker-attachment: list-container;
}
ol ol, ol ul, ul ul, ul ol {
margin-top: 0;
margin-bottom: 0;
}
li {
text-align: match-parent;
}
li::marker
{
display: inline;
margin-right: 1em;
text-align: end;
unicode-bidi: isolate;
/* 'position' computes to "static" or "marker" depending on list-style-position */
}
This module has two profiles: CSS Level 1 and Full. There is no CSS2 profile because this module is incompatible with the CSS2 list model.
The CSS Level 1 module consists of ‘list-style
’, ‘list-style-position
’, ‘list-style-image
’, and ‘list-style-type
’ (but only the following
values: ‘disc
’, ‘circle,
square
’, ‘decimal
’, ‘lower-roman
’,
‘upper-roman
’, ‘lower-alpha
’,
‘upper-alpha
’, ‘none
’). It does not include the ::marker
pseudo element.
The Full profile contains everything.
The following people and documentation they wrote were very useful for defining the numbering systems: Alexander Savenkov, Arron Eicholz, Aryeh Gregor, Frank Tang, Jonathan Rosenne, Karl Ove Hufthammer, Musheg Arakelyan, Nariné Renard Karapetyan, Randall Bart, Richard Ishida, Simon Montagu (Mozilla, smontagu@smontagu.org)
As described in the introduction section, there are significant changes in this module when compared to CSS2.1.
::marker
pseudo-element has been introduced
to allow styling of the list marker directly.
marker
’ value for ‘position
’ has been added, to allow elements
in the document to position themselves similarly to how markers do.
Property | Values | Initial | Applies to | Inh. | Percentages | Media |
---|---|---|---|---|---|---|
list-style | <‘list-style-type’> || <‘list-style-position’> || <‘list-style-image’> | see individual properties | list items | yes | N/A | visual |
list-style-image | <image> | none | none | list items | yes | N/A | visual |
list-style-position | inside | outside | outside | list items | yes | N/A | visual |
list-style-type | <string> | <counter-style> | none | disc | list items | yes | N/A | visual |
‘display’ | inline-list-item | same as CSS2.1 | same as CSS2.1 | same as CSS2.1 | same as CSS2.1 | same as CSS2.1 |
‘position’ | ‘marker’ | same as CSS2.1 | same as CSS2.1 | same as CSS2.1 | same as CSS2.1 | same as CSS2.1 |
marker-attachment | list-item | list-container | list-item | list items | yes | N/A | visual |