Natural Sort to ODF
Kohei Yoshida
kohei at libreoffice.org
Sat Aug 23 01:21:03 UTC 2025
On 8/21/25 06:46, Regina Henschel wrote:
> Hi all,
>
> LibreOffice can sort texts in "natural sort" kind in database ranges
> in Calc. That is an order K1, K2, K14, K107 instead of the
> alphanumeric order K1, K107, K14, K2. But LibreOffice does not
> write/read to ODF, that a database range uses this kind of sorting. I
> want to implement this.
>
> Problem A: The according ODF attribute is
> table:embedded-number-behavior (19.628, part 3 ODF 1.4).
> https://docs.oasis-open.org/office/OpenDocument/v1.4/cs01/part3-schema/OpenDocument-v1.4-cs01-part3-schema.html#attribute-table_embedded-number-behavior
>
> It has the values 'alpha-numeric', 'double', and 'integer'.
>
> The according LibreOffice attribute in core is
> bool bNaturalSort
> in struct ScSortParam.
>
> Thus ODF has three kinds and LO has two kinds.
> From my tests I guess, that bNaturalSort=true corresponds to value
> 'double'.
Yes. In fact I remember this feature since I worked on this. You can
still see the spec document I wrote for this feature back in 2005:
https://www.openoffice.org/specs/calc/ease-of-use/natural_sort_algorithm.sxw.
It should be fairly trivial to implement the integer mode since all you
have to change is to not allow the decimal separator to be parsed as a
digit character. Here
https://git.libreoffice.org/core/+/refs/heads/master/sc/source/core/data/table3.cxx#119
is where the code retrieves the decimal separator character for the
current locale and plug that into the token parser. Passing an empty
string in lieu of that may be enough to implement the integer mode (in
theory.. please test this!). Then you can switch that bNaturalSort
boolean flag to a tri-state flag and map that to the UNO API.
>
> Problem B: There exists no UNO property for natural sort.
> Can I simply add it to css.sheet.SheetSortDescriptor2? As boolean or
> as enum?
IIRC we are not supposed to use enum in the UNO API since the enum type
cannot be extended once defined. Instead, we are to use a group of
integer constants to simulate an enum type, then we can append new
values to that group as needed.
Kohei
More information about the LibreOffice
mailing list