unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / Atom feed
* [ELPA] New package: repology.el
@ 2020-12-30 16:23 Nicolas Goaziou
  2020-12-30 19:34 ` Jean Louis
  2020-12-30 21:58 ` [ELPA] New package: repology.el (v2) Nicolas Goaziou
  0 siblings, 2 replies; 139+ messages in thread
From: Nicolas Goaziou @ 2020-12-30 16:23 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 370 bytes --]

Hello,

I wrote a small library to access to Repology API
(<https://repology.org>) from Emacs. I'd like to submit it for inclusion
in GNU ELPA, as it might be useful to others.

I'm attaching the sole file since it has no interweb existence so far. 

Please let me know if it is not suitable for inclusion, or needs more
work. 

Thank you.

Regards,
-- 
Nicolas Goaziou

[-- Attachment #2: Repology library --]
[-- Type: application/emacs-lisp, Size: 40913 bytes --]

^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-30 16:23 [ELPA] New package: repology.el Nicolas Goaziou
@ 2020-12-30 19:34 ` Jean Louis
  2020-12-30 21:01   ` Clément Pit-Claudel
  2020-12-31 11:46   ` Nicolas Goaziou
  2020-12-30 21:58 ` [ELPA] New package: repology.el (v2) Nicolas Goaziou
  1 sibling, 2 replies; 139+ messages in thread
From: Jean Louis @ 2020-12-30 19:34 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-devel

While I may find that package personally useful for research of
various packages on multiple OS distributions, it is not for GNU ELPA,
IMHO, as GNU is all about free software and teaching people about free
software.

Package leads or guides people to research packages that are
proprietary software without giving any warning, at least in the
lookup function.

I do not find it useful for Emacs and alright for GNU ELPA as GNU is
about free software and this package is leading people to various OS
distributions that are not endorsed by the FSF and that provide
non-free software. 

Additionally the lookup result does not provide license information
thus putting all proprietary software available from various package
repositories together with free sofware and leads people to
confusions.

For me this is no go for GNU ELPA.

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-30 19:34 ` Jean Louis
@ 2020-12-30 21:01   ` Clément Pit-Claudel
  2020-12-31 13:31     ` Jean Louis
  2020-12-31 11:46   ` Nicolas Goaziou
  1 sibling, 1 reply; 139+ messages in thread
From: Clément Pit-Claudel @ 2020-12-30 21:01 UTC (permalink / raw)
  To: emacs-devel

On 12/30/20 2:34 PM, Jean Louis wrote:
> While I may find that package personally useful for research of
> various packages on multiple OS distributions, it is not for GNU ELPA,
> IMHO, as GNU is all about free software and teaching people about free
> software.

By the same logic, eww is not for GNU ELPA or Emacs, since it allows people to browse the web without displaying license information.

Also, repology itself is GNU GPL.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el (v2)
  2020-12-30 16:23 [ELPA] New package: repology.el Nicolas Goaziou
  2020-12-30 19:34 ` Jean Louis
@ 2020-12-30 21:58 ` Nicolas Goaziou
  2021-01-04 11:45   ` [ELPA] New package: repology.el (v3) Nicolas Goaziou
  1 sibling, 1 reply; 139+ messages in thread
From: Nicolas Goaziou @ 2020-12-30 21:58 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 589 bytes --]

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> I wrote a small library to access to Repology API
> (<https://repology.org>) from Emacs. I'd like to submit it for inclusion
> in GNU ELPA, as it might be useful to others.
>
> I'm attaching the sole file since it has no interweb existence so far. 
>
> Please let me know if it is not suitable for inclusion, or needs more
> work. 

It needed more work… After this brown paper bag announce, the next
revision hopefully fixes compilation warnings and expounds the docstring
of the main interactive function. Here it is.


[-- Attachment #2: Repology library (0.9.1) --]
[-- Type: application/emacs-lisp, Size: 41701 bytes --]

^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-30 19:34 ` Jean Louis
  2020-12-30 21:01   ` Clément Pit-Claudel
@ 2020-12-31 11:46   ` Nicolas Goaziou
  2020-12-31 13:11     ` Jean Louis
  1 sibling, 1 reply; 139+ messages in thread
From: Nicolas Goaziou @ 2020-12-31 11:46 UTC (permalink / raw)
  To: emacs-devel

Hello,

Jean Louis <bugs@gnu.support> writes:

> Additionally the lookup result does not provide license information
> thus putting all proprietary software available from various package
> repositories together with free sofware and leads people to
> confusions.

The license information is here, stored in each package. However, the UI
does not display at the "project" level.  You need to look at a package
to see it.

It is possible to display it at the "project" level, too, by configuring
`repology-display-projects-columns'. See, for example, how outdated
package versions are collected in this variable.

However, depending on the repository, the license information may be
incomplete, inaccurate, or downwards misleading. So I'm not sure it is
a good idea to display it by default. It can be done, tho.

Regards,
-- 
Nicolas Goaziou



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-31 11:46   ` Nicolas Goaziou
@ 2020-12-31 13:11     ` Jean Louis
  2020-12-31 20:30       ` Ulrich Mueller
  0 siblings, 1 reply; 139+ messages in thread
From: Jean Louis @ 2020-12-31 13:11 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-devel

* Nicolas Goaziou <mail@nicolasgoaziou.fr> [2020-12-31 14:54]:
> However, depending on the repository, the license information may be
> incomplete, inaccurate, or downwards misleading. So I'm not sure it is
> a good idea to display it by default. It can be done, tho.

GNU project is development of free software. It does not contribute
and should not contribute to installations, references, promotion or
support to non-free software, neither it shall support remote servers
doing so.

Specific free GNU/Linux operating systems and their packages are
promoted and supported by GNU project:
https://www.gnu.org/distros/free-distros.html

Others are not supported:
https://www.gnu.org/distros/common-distros.html

As non-free packages are not advertised by GNU project neither by free
endorsed OSes it would be contradiction to advertise such non-free
packages through this package. GNU ELPA should not promote such
non-free packages and should not provide API to remote server that
lists, searches, indexes and provides results where non-free packages
may be included.

The package you proposed does not teach users about free software but
advertises non-free software.

repology.org compiles databases of free software and non-free software
together without any ethical distinction. 

It is in contradiction how endorsed free software GNU/Linux operating
systems are structured, see:
https://www.gnu.org/distros/free-system-distribution-guidelines.html

Additionally it advertises third party server about which we know
nothing of, which would collecting data from Emacs users.

Repology server does not give credits to GNU. Why would GNU give
credits and kudos to Repology server?

Debian GNU/Linux is named just "Debian" at repology.org.

GNU Guix is named just "Guix" instead of "GNU Guix" on repology.org

Parabola GNU/Linux-libre is called "Parabola" without mentioning the
full name of the system on repology.org

Hyperbola GNU/Linux-libre is not mentioned by its full name, but
rather just as "Hyperbola" on repology.org, not giving proper credits
to GNU.

Trisquel, etc. the same.

GNU/Linux system is named "Linux" on repology.org, please see:

Why do you call the system we use GNU/Linux and not Linux?
https://www.gnu.org/gnu/gnu-linux-faq.html#why

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-30 21:01   ` Clément Pit-Claudel
@ 2020-12-31 13:31     ` Jean Louis
  0 siblings, 0 replies; 139+ messages in thread
From: Jean Louis @ 2020-12-31 13:31 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

* Clément Pit-Claudel <cpitclaudel@gmail.com> [2020-12-31 00:02]:
> On 12/30/20 2:34 PM, Jean Louis wrote:
> > While I may find that package personally useful for research of
> > various packages on multiple OS distributions, it is not for GNU ELPA,
> > IMHO, as GNU is all about free software and teaching people about free
> > software.
> 
> By the same logic, eww is not for GNU ELPA or Emacs, since it allows
> people to browse the web without displaying license information.

I am trying to get what you mean, but it looks like I cannot. Maybe
you quoted one part of text or let some other part out so that I
cannot connect the dots.

Browsers offer access to networks but not specific references to non
free software. GNU project should not deliver browser that offers
direct reference to a database of free software.

If users do it themselves, they are free to do so, just as users are
free to install proprietary software on GNU/Linux, those are private
issues that are actually beyond GNU.  GNU project is not about
forbidding users do what they wish.

GNU teaches users free software philosophy. Putting a package in GNU
ELPA that does not make ethical distinction would be contrary to what
is already being done in GNU and in FSF.

GNU project teaches users about free software. It points out to
problems with proprietary software.

It does not and should not serve as a platform or access to platform
for users of free software to search, find references to software
without ethical distinction.

Repology.org and package repology.el is contradiction to what GNU and
FSF efforts are about. We teach users distinction between free
software and proprietary software, and we tell people WHY.

Please see the Free Software Directory:
https://directory.fsf.org/wiki/Main_Page

It is directory of free software.

What I would not find logical is that we do not have GNU ELPA package
that provides API to Free Software Directory.  But we would then have
repology.org package that provides API to software without ethical
distinction, be it proprietary or free software or software with
unclear licensing, it does not matter there.

> Also, repology itself is GNU GPL.

We discussed already that GNU GPL software may be ethical and not
ethical. For example malware, viruses and backdoors can be also
licensed as GNU GPL software but are not ethical. GNU GPL software may
control or be made exclusively to work with proprietary
software. It may provide access to search engine that provides
information about software without ethical distinction if it is free
software or proprietary.

All those are examples showing how GNU GPL licensed software may not
fulfill my personal ethical criteria. As this message is my personal
opinion.




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-31 13:11     ` Jean Louis
@ 2020-12-31 20:30       ` Ulrich Mueller
  2021-01-01  7:31         ` Richard Stallman
  2021-01-01 10:05         ` Jean Louis
  0 siblings, 2 replies; 139+ messages in thread
From: Ulrich Mueller @ 2020-12-31 20:30 UTC (permalink / raw)
  To: emacs-devel

>>>>> On Thu, 31 Dec 2020, Jean Louis wrote:

> GNU project is development of free software. It does not contribute
> and should not contribute to installations, references, promotion or
> support to non-free software, neither it shall support remote servers
> doing so.

> Specific free GNU/Linux operating systems and their packages are
> promoted and supported by GNU project:
> https://www.gnu.org/distros/free-distros.html

I've always wondered how many of the Emacs developers are actually using
one of these? On free hardware with free firmware, because everything
else would be inconsequent.

> Others are not supported:
> https://www.gnu.org/distros/common-distros.html

> As non-free packages are not advertised by GNU project neither by free
> endorsed OSes it would be contradiction to advertise such non-free
> packages through this package. GNU ELPA should not promote such
> non-free packages and should not provide API to remote server that
> lists, searches, indexes and provides results where non-free packages
> may be included.

> The package you proposed does not teach users about free software but
> advertises non-free software.

> repology.org compiles databases of free software and non-free software
> together without any ethical distinction.

I find your standpoint rather extreme, because the vast majority of the
projects there is distributed under a free software license.

If there weren't any such services as repology.org, users would likely
use a search engine to find a specific package. How is that better?

> It is in contradiction how endorsed free software GNU/Linux operating
> systems are structured, see:
> https://www.gnu.org/distros/free-system-distribution-guidelines.html

> Additionally it advertises third party server about which we know
> nothing of, which would collecting data from Emacs users.

IIUC their server's software is licensed under GPLv3+ and publicly
available.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-31 20:30       ` Ulrich Mueller
@ 2021-01-01  7:31         ` Richard Stallman
  2021-01-01 10:05         ` Jean Louis
  1 sibling, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-01  7:31 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > repology.org compiles databases of free software and non-free software
  > > together without any ethical distinction.

  > I find your standpoint rather extreme, because the vast majority of the
  > projects there is distributed under a free software license.

You and Jean Louis are talking about two different questions.
Related, yes, but not the same.  What he said and what you said do not
directly conflict.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2020-12-31 20:30       ` Ulrich Mueller
  2021-01-01  7:31         ` Richard Stallman
@ 2021-01-01 10:05         ` Jean Louis
  2021-01-01 11:56           ` Eli Zaretskii
  2021-01-02  5:30           ` Richard Stallman
  1 sibling, 2 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-01 10:05 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: emacs-devel

* Ulrich Mueller <ulm@gentoo.org> [2020-12-31 23:32]:
> > repology.org compiles databases of free software and non-free software
> > together without any ethical distinction.
> 
> I find your standpoint rather extreme, because the vast majority of the
> projects there is distributed under a free software license.

The difference is that references to non-free software would not be
provided by GNU ELPA package to users.

If free software references on GNU.org are extreme, then my standpoint
is extreme too, but I am not a conformist that has desires to be in a
non-extreme class of people so I do not mind how it is classified,
seen, perceived or criticized.

I do not make my analysis or present my personal opinions to conform
them to non-extreme class.

Just as the GNU website does not provide references to non-free
software catalogue, then why should such package be part of GNU ELPA
and unintentionally or intentionally promote non-free software. Note
the "GNU" in GNU ELPA.

And Happy New Free Software Year.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-01 10:05         ` Jean Louis
@ 2021-01-01 11:56           ` Eli Zaretskii
  2021-01-02  9:56             ` Jean Louis
  2021-01-02  5:30           ` Richard Stallman
  1 sibling, 1 reply; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-01 11:56 UTC (permalink / raw)
  To: Jean Louis; +Cc: ulm, emacs-devel

> Date: Fri, 1 Jan 2021 13:05:54 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: emacs-devel@gnu.org
> 
> references to non-free software would not be provided by GNU ELPA
> package to users.

Ulrich, please take what Jean says here with a grain of salt, because
he doesn't speak on behalf of the Emacs project (even though he
sometimes sounds like he is).  These opinions are his own.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-01 10:05         ` Jean Louis
  2021-01-01 11:56           ` Eli Zaretskii
@ 2021-01-02  5:30           ` Richard Stallman
  2021-01-04 12:09             ` Dmitry Gutov
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-02  5:30 UTC (permalink / raw)
  To: Jean Louis; +Cc: ulm, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Just as the GNU website does not provide references to non-free
  > software catalogue, then why should such package be part of GNU ELPA
  > and unintentionally or intentionally promote non-free software. Note
  > the "GNU" in GNU ELPA.

There is no need to argue for or against this position, because it
reflects the GNU Project's policy as stated in the node References in
the GNU Coding Standards.  We won't suggest that people use
repology.org unless it changes its practice on this point.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-01 11:56           ` Eli Zaretskii
@ 2021-01-02  9:56             ` Jean Louis
  0 siblings, 0 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-02  9:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ulm, emacs-devel

* Eli Zaretskii <eliz@gnu.org> [2021-01-01 14:57]:
> > Date: Fri, 1 Jan 2021 13:05:54 +0300
> > From: Jean Louis <bugs@gnu.support>
> > Cc: emacs-devel@gnu.org
> > 
> > references to non-free software would not be provided by GNU ELPA
> > package to users.
> 
> Ulrich, please take what Jean says here with a grain of salt, because
> he doesn't speak on behalf of the Emacs project (even though he
> sometimes sounds like he is).  These opinions are his own.

Which I have myself explicitly and already mentioned it.




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el (v3)
  2020-12-30 21:58 ` [ELPA] New package: repology.el (v2) Nicolas Goaziou
@ 2021-01-04 11:45   ` Nicolas Goaziou
  2021-01-04 17:32     ` Stefan Monnier
  0 siblings, 1 reply; 139+ messages in thread
From: Nicolas Goaziou @ 2021-01-04 11:45 UTC (permalink / raw)
  To: emacs-devel

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:
>
>> I wrote a small library to access to Repology API
>> (<https://repology.org>) from Emacs. I'd like to submit it for inclusion
>> in GNU ELPA, as it might be useful to others.
>>
>> I'm attaching the sole file since it has no interweb existence so far. 
>>
>> Please let me know if it is not suitable for inclusion, or needs more
>> work. 
>
> It needed more work… After this brown paper bag announce, the next
> revision hopefully fixes compilation warnings and expounds the docstring
> of the main interactive function. Here it is.

So, IIUC, my work is not GNU-compatible. Well.

I managed to create a third version of the library (i.e., version 0.10),
which tries, in a best effort attempt, to hide any project with
a dubious license. It works by matching a list of pre-defined regexps
against the license string of the software.

There are obvious limitations in that process:
- the list of regexps is certainly incomplete,
- some licenses are inaccurate in the database,
- "unfreedom" is subtler than what softwares can guess, it requires
  lawyers sometimes.

So, one could argue it may give a false sense of "security". Best effort
attempt, as I wrote… In addition, I can also add a list of projects to
ignore, if requested.

I'm not attaching the new file to avoid spamming the list with anti-GNU
software. But I'm asking it again, to be sure: do you think this new
attempt could go to GNU (or Non-GNU) ELPA with that change, or is
anything Repology-related verboten there?

Regards,



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-02  5:30           ` Richard Stallman
@ 2021-01-04 12:09             ` Dmitry Gutov
  2021-01-04 14:39               ` Alfred M. Szmidt
  2021-01-05  6:33               ` Richard Stallman
  0 siblings, 2 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-04 12:09 UTC (permalink / raw)
  To: rms, Jean Louis; +Cc: ulm, emacs-devel

On 02.01.2021 07:30, Richard Stallman wrote:
>    > Just as the GNU website does not provide references to non-free
>    > software catalogue, then why should such package be part of GNU ELPA
>    > and unintentionally or intentionally promote non-free software. Note
>    > the "GNU" in GNU ELPA.
> 
> There is no need to argue for or against this position, because it
> reflects the GNU Project's policy as stated in the node References in
> the GNU Coding Standards.  We won't suggest that people use
> repology.org unless it changes its practice on this point.

repology.org is not a software catalogue.

It doesn't have any links to the programs themselves, or even pointers 
to their home pages. Its purpose is to show which version has been 
published where, and who is maintaining that.

As such, it's untenable to suggest that this project, or the proposed 
package, promote any particular piece of software listed.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 12:09             ` Dmitry Gutov
@ 2021-01-04 14:39               ` Alfred M. Szmidt
  2021-01-04 15:00                 ` Ulrich Mueller
  2021-01-04 15:02                 ` Dmitry Gutov
  2021-01-05  6:33               ` Richard Stallman
  1 sibling, 2 replies; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-04 14:39 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, rms, bugs, emacs-devel

   It doesn't have any links to the programs themselves, or even pointers 
   to their home pages. Its purpose is to show which version has been 
   published where, and who is maintaining that.

That doesn't really matter, the list lists non-free software packages
and users can easily think that the program is free software (since
there is no license information associated with it).  That alone is a
good reason to not suggest it.

Since this web site does almost the same job as the Free Software
Directory, why not interface against that instead?  That lists
exclusivley packages that have been confirmed to be free software.






^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 14:39               ` Alfred M. Szmidt
@ 2021-01-04 15:00                 ` Ulrich Mueller
  2021-01-04 16:32                   ` Alfred M. Szmidt
  2021-01-05  6:45                   ` Richard Stallman
  2021-01-04 15:02                 ` Dmitry Gutov
  1 sibling, 2 replies; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-04 15:00 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: ulm, emacs-devel, rms, bugs, Dmitry Gutov

>>>>> On Mon, 04 Jan 2021, Alfred M Szmidt wrote:

> That doesn't really matter, the list lists non-free software packages
> and users can easily think that the program is free software (since
> there is no license information associated with it).  That alone is a
> good reason to not suggest it.

> Since this web site does almost the same job as the Free Software
> Directory, why not interface against that instead?  That lists
> exclusivley packages that have been confirmed to be free software.

These are completely different services. The FSD is a catalogue of
free software with human readable descriptions (and IIUC, entries are
maintained by humans). Whereas Repology provides lists of packages and
their versions, with the info being obtained from various repositories
in an automated way.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 14:39               ` Alfred M. Szmidt
  2021-01-04 15:00                 ` Ulrich Mueller
@ 2021-01-04 15:02                 ` Dmitry Gutov
  2021-01-04 16:29                   ` Alfred M. Szmidt
  1 sibling, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-04 15:02 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: ulm, rms, bugs, emacs-devel

On 04.01.2021 16:39, Alfred M. Szmidt wrote:
>     It doesn't have any links to the programs themselves, or even pointers
>     to their home pages. Its purpose is to show which version has been
>     published where, and who is maintaining that.
> 
> That doesn't really matter, the list lists non-free software packages
> and users can easily think that the program is free software (since
> there is no license information associated with it).

Do you have an example?

Sounds like something that's easy to fix in the package's UI.

> Since this web site does almost the same job as the Free Software
> Directory, why not interface against that instead?  That lists
> exclusivley packages that have been confirmed to be free software.

It does not do the same job. Again, it's not a software catalogue/directory.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 15:02                 ` Dmitry Gutov
@ 2021-01-04 16:29                   ` Alfred M. Szmidt
  2021-01-04 17:08                     ` Dmitry Gutov
  0 siblings, 1 reply; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-04 16:29 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, rms, bugs, emacs-devel

   >     It doesn't have any links to the programs themselves, or even pointers
   >     to their home pages. Its purpose is to show which version has been
   >     published where, and who is maintaining that.
   > 
   > That doesn't really matter, the list lists non-free software packages
   > and users can easily think that the program is free software (since
   > there is no license information associated with it).

   Do you have an example?

nmap.  Or anything to do with FPGA development.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 15:00                 ` Ulrich Mueller
@ 2021-01-04 16:32                   ` Alfred M. Szmidt
  2021-01-05  6:45                   ` Richard Stallman
  1 sibling, 0 replies; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-04 16:32 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: ulm, emacs-devel, rms, bugs, dgutov

   > Since this web site does almost the same job as the Free Software
   > Directory, why not interface against that instead?  That lists
   > exclusivley packages that have been confirmed to be free software.

   These are completely different services. The FSD is a catalogue of
   free software with human readable descriptions (and IIUC, entries are
   maintained by humans). Whereas Repology provides lists of packages and
   their versions, with the info being obtained from various repositories
   in an automated way.

That is a difference in how they are implemented, now in their
purpose, no?  FSD lists the version of packages.

;; The results of a query revolve around three types of objects:
;; projects, packages and problems.  Using this library, you can find
;; projects matching certain criteria, packages in a given project,

From the above I don't see how they are "completely" different, it
seems one could do the same but using the FSD -- the only thing
missing might be "bug" reports.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 16:29                   ` Alfred M. Szmidt
@ 2021-01-04 17:08                     ` Dmitry Gutov
  2021-01-04 17:12                       ` Alfred M. Szmidt
  2021-01-06  5:02                       ` Richard Stallman
  0 siblings, 2 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-04 17:08 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: ulm, rms, bugs, emacs-devel

On 04.01.2021 18:29, Alfred M. Szmidt wrote:
>     >     It doesn't have any links to the programs themselves, or even pointers
>     >     to their home pages. Its purpose is to show which version has been
>     >     published where, and who is maintaining that.
>     >
>     > That doesn't really matter, the list lists non-free software packages
>     > and users can easily think that the program is free software (since
>     > there is no license information associated with it).
> 
>     Do you have an example?
> 
> nmap.

What about it?

An example would be a URL to a web page which shows something which 
might be misconstrued by the user. Especially when such situation is the 
fault of the project, and not of the underlying sources of information.

https://repology.org/project/nmap/packages (okay, this shows the 
homepage too) clearly shows the non-standard license where it can.

And the GPLv2 license for older versions.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:08                     ` Dmitry Gutov
@ 2021-01-04 17:12                       ` Alfred M. Szmidt
  2021-01-04 17:17                         ` Dmitry Gutov
  2021-01-04 17:43                         ` Clément Pit-Claudel
  2021-01-06  5:02                       ` Richard Stallman
  1 sibling, 2 replies; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-04 17:12 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, rms, bugs, emacs-devel

   >     >     It doesn't have any links to the programs themselves, or even pointers
   >     >     to their home pages. Its purpose is to show which version has been
   >     >     published where, and who is maintaining that.
   >     >
   >     > That doesn't really matter, the list lists non-free software packages
   >     > and users can easily think that the program is free software (since
   >     > there is no license information associated with it).
   > 
   >     Do you have an example?
   > 
   > nmap.

   What about it?

It is non-free software.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:12                       ` Alfred M. Szmidt
@ 2021-01-04 17:17                         ` Dmitry Gutov
  2021-01-04 17:58                           ` Alfred M. Szmidt
  2021-01-04 17:43                         ` Clément Pit-Claudel
  1 sibling, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-04 17:17 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: ulm, rms, bugs, emacs-devel

On 04.01.2021 19:12, Alfred M. Szmidt wrote:
> It is non-free software.

Anything else you would like to address in my last email?



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el (v3)
  2021-01-04 11:45   ` [ELPA] New package: repology.el (v3) Nicolas Goaziou
@ 2021-01-04 17:32     ` Stefan Monnier
  2021-01-19  9:50       ` [ELPA] New package: repology.el (v4) Nicolas Goaziou
  0 siblings, 1 reply; 139+ messages in thread
From: Stefan Monnier @ 2021-01-04 17:32 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-devel

> I'm not attaching the new file to avoid spamming the list with anti-GNU
> software. But I'm asking it again, to be sure: do you think this new
> attempt could go to GNU (or Non-GNU) ELPA with that change, or is
> anything Repology-related verboten there?

I do think it's acceptable, yes, thank you.

If the code has all copyright assigned (e.g. is fully yours), then it can
go to `elpa.git`.  If you have write access, then you can even add
it yourself.  Let me know if you need help,


        Stefan




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:12                       ` Alfred M. Szmidt
  2021-01-04 17:17                         ` Dmitry Gutov
@ 2021-01-04 17:43                         ` Clément Pit-Claudel
  2021-01-04 17:55                           ` Vasilij Schneidermann
  2021-01-04 19:14                           ` Ulrich Mueller
  1 sibling, 2 replies; 139+ messages in thread
From: Clément Pit-Claudel @ 2021-01-04 17:43 UTC (permalink / raw)
  To: emacs-devel

On 1/4/21 12:12 PM, Alfred M. Szmidt wrote:
>    >     >     It doesn't have any links to the programs themselves, or even pointers
>    >     >     to their home pages. Its purpose is to show which version has been
>    >     >     published where, and who is maintaining that.
>    >     >
>    >     > That doesn't really matter, the list lists non-free software packages
>    >     > and users can easily think that the program is free software (since
>    >     > there is no license information associated with it).
>    > 
>    >     Do you have an example?
>    > 
>    > nmap.
> 
>    What about it?
> 
> It is non-free software.

Are you equating "free" with "GPL-compatible", or did I miss something about nmap? (Last time I checked, nmap was FLOSS)



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:43                         ` Clément Pit-Claudel
@ 2021-01-04 17:55                           ` Vasilij Schneidermann
  2021-01-04 18:51                             ` Clément Pit-Claudel
  2021-01-06  5:03                             ` Richard Stallman
  2021-01-04 19:14                           ` Ulrich Mueller
  1 sibling, 2 replies; 139+ messages in thread
From: Vasilij Schneidermann @ 2021-01-04 17:55 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 518 bytes --]

> Are you equating "free" with "GPL-compatible", or did I miss something
> about nmap? (Last time I checked, nmap was FLOSS)

While the evaluation is terse, it is warranted: nmap is listed as GPL2
in my package manager for some reason, but happens to use a custom
license based on the GPL2: https://nmap.org/npsl/

One of the listed goals is "Prohibit redistribution and use of Nmap
within proprietary hardware and software products." This most likely
violates the four freedoms and thereby makes it GPL-incompatible.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:17                         ` Dmitry Gutov
@ 2021-01-04 17:58                           ` Alfred M. Szmidt
  0 siblings, 0 replies; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-04 17:58 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, rms, bugs, emacs-devel

   > It is non-free software.

   Anything else you would like to address in my last email?

I don't see anything that needs to be addressed, so I did not address
it -- it is all mentioned in (standards) References.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:55                           ` Vasilij Schneidermann
@ 2021-01-04 18:51                             ` Clément Pit-Claudel
  2021-01-04 22:21                               ` Vasilij Schneidermann
  2021-01-06  5:03                             ` Richard Stallman
  1 sibling, 1 reply; 139+ messages in thread
From: Clément Pit-Claudel @ 2021-01-04 18:51 UTC (permalink / raw)
  To: emacs-devel

On 1/4/21 12:55 PM, Vasilij Schneidermann wrote:
>> Are you equating "free" with "GPL-compatible", or did I miss something
>> about nmap? (Last time I checked, nmap was FLOSS)
> 
> While the evaluation is terse, it is warranted: nmap is listed as GPL2
> in my package manager for some reason, but happens to use a custom
> license based on the GPL2: https://nmap.org/npsl/
> 
> One of the listed goals is "Prohibit redistribution and use of Nmap
> within proprietary hardware and software products." This most likely
> violates the four freedoms and thereby makes it GPL-incompatible.

Yes, but GPL-compatibility isn't what we were debating, is it?  The claim was that nmap is non-free.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:43                         ` Clément Pit-Claudel
  2021-01-04 17:55                           ` Vasilij Schneidermann
@ 2021-01-04 19:14                           ` Ulrich Mueller
  2021-01-04 19:17                             ` Clément Pit-Claudel
  1 sibling, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-04 19:14 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

>>>>> On Mon, 04 Jan 2021, Clément Pit-Claudel wrote:

> On 1/4/21 12:12 PM, Alfred M. Szmidt wrote:
>> > nmap.
>> 
>> What about it?
>> 
>> It is non-free software.

> Are you equating "free" with "GPL-compatible", or did I miss something
> about nmap? (Last time I checked, nmap was FLOSS)

This is contested by several distros for nmap-7.90 and later, which
comes with a changed license:
https://github.com/nmap/nmap/issues/2199



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 19:14                           ` Ulrich Mueller
@ 2021-01-04 19:17                             ` Clément Pit-Claudel
  0 siblings, 0 replies; 139+ messages in thread
From: Clément Pit-Claudel @ 2021-01-04 19:17 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: emacs-devel

On 1/4/21 2:14 PM, Ulrich Mueller wrote:
>>>>>> On Mon, 04 Jan 2021, Clément Pit-Claudel wrote:
> 
>> On 1/4/21 12:12 PM, Alfred M. Szmidt wrote:
>>>> nmap.
>>>
>>> What about it?
>>>
>>> It is non-free software.
> 
>> Are you equating "free" with "GPL-compatible", or did I miss something
>> about nmap? (Last time I checked, nmap was FLOSS)
> 
> This is contested by several distros for nmap-7.90 and later, which
> comes with a changed license:
> https://github.com/nmap/nmap/issues/2199

Thanks a lot for the pointer!




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 18:51                             ` Clément Pit-Claudel
@ 2021-01-04 22:21                               ` Vasilij Schneidermann
  2021-01-05  2:09                                 ` Stefan Monnier
  0 siblings, 1 reply; 139+ messages in thread
From: Vasilij Schneidermann @ 2021-01-04 22:21 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 213 bytes --]

> Yes, but GPL-compatibility isn't what we were debating, is it?  The
> claim was that nmap is non-free.

Violating the four freedoms makes a license non-free, thereby having GPL
incompatibility as a side effect.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 22:21                               ` Vasilij Schneidermann
@ 2021-01-05  2:09                                 ` Stefan Monnier
  2021-01-05  6:42                                   ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Stefan Monnier @ 2021-01-05  2:09 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

>> Yes, but GPL-compatibility isn't what we were debating, is it?  The
>> claim was that nmap is non-free.
> Violating the four freedoms makes a license non-free, thereby having GPL
> incompatibility as a side effect.

I suggest you look a bit closer: the license was changed quite recently,
and since the issue was brought up, the maintainers have clarified the
intent, making it clear that the problems in the license are *not*
intended are there is every reason to believe that they will be
fixed soon.

So, `nmap` has always been Free Software and the maintainers still want
to keep it that way.  The current license has *bugs*, that's it.


        Stefan




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 12:09             ` Dmitry Gutov
  2021-01-04 14:39               ` Alfred M. Szmidt
@ 2021-01-05  6:33               ` Richard Stallman
  2021-01-05 11:21                 ` Dmitry Gutov
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-05  6:33 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > It doesn't have any links to the programs themselves, or even pointers 
  > to their home pages. Its purpose is to show which version has been 
  > published where, and who is maintaining that.

I am not sure that difference is crucial.

  > As such, it's untenable to suggest that this project, or the proposed 
  > package, promote any particular piece of software listed.

I am not convinced -- but I'm willing to take a concrete look at what
you're talking about.  Would you please show me a couple of entries
in repology?  For instance, how about the one about LLVM?


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-05  2:09                                 ` Stefan Monnier
@ 2021-01-05  6:42                                   ` Richard Stallman
  2021-01-05  9:28                                     ` Ulrich Mueller
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-05  6:42 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: cpitclaudel, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I suggest you look a bit closer: the license was changed quite recently,
  > and since the issue was brought up, the maintainers have clarified the
  > intent, making it clear that the problems in the license are *not*
  > intended are there is every reason to believe that they will be
  > fixed soon.

If they fix the problems, the problems will be gone.
But it sounds like they are doing something strange and unusual
and it is worth looking at THAT.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 15:00                 ` Ulrich Mueller
  2021-01-04 16:32                   ` Alfred M. Szmidt
@ 2021-01-05  6:45                   ` Richard Stallman
  2021-01-05  8:56                     ` Alfred M. Szmidt
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-05  6:45 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: ams, dgutov, ulm, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  >  Whereas Repology provides lists of packages and
  > their versions, with the info being obtained from various repositories
  > in an automated way.

Is Repology a Lisp program?
Is Repology a list of packages and their versions?
Is it both, packaged together?

What makes it useful?  Supposing there were no nonfree
Elisp packages in the world, why would you want something
like Repology?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-05  6:45                   ` Richard Stallman
@ 2021-01-05  8:56                     ` Alfred M. Szmidt
  2021-01-07  7:34                       ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-05  8:56 UTC (permalink / raw)
  To: rms; +Cc: ulm, dgutov, bugs, emacs-devel

   Is Repology a list of packages and their versions?

It is a website that lists what binary (both free software and
non-free software) packages are available in different opreating
systems; with some version information, and some other meta data like
current bugs reported against the program.

   Is it both, packaged together?

repology.el is a emacs library(?) to access and query Repology.org for
information about packages.  



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-05  6:42                                   ` Richard Stallman
@ 2021-01-05  9:28                                     ` Ulrich Mueller
  0 siblings, 0 replies; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-05  9:28 UTC (permalink / raw)
  To: Richard Stallman; +Cc: cpitclaudel, Stefan Monnier, emacs-devel

>>>>> On Tue, 05 Jan 2021, Richard Stallman wrote:

[about nmap]

>> I suggest you look a bit closer: the license was changed quite
>> recently, and since the issue was brought up, the maintainers have
>> clarified the intent, making it clear that the problems in the
>> license are *not* intended are there is every reason to believe that
>> they will be fixed soon.

> If they fix the problems, the problems will be gone.
> But it sounds like they are doing something strange and unusual
> and it is worth looking at THAT.

That would be very valuable input indeed.

Upstream has been made aware of the problem, but it looks like neither
they nor anybody else participating in the discussion at
https://github.com/nmap/nmap/issues/2199 have any legal background.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-05  6:33               ` Richard Stallman
@ 2021-01-05 11:21                 ` Dmitry Gutov
  2021-01-07  7:32                   ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-05 11:21 UTC (permalink / raw)
  To: rms; +Cc: ulm, bugs, emacs-devel

On 05.01.2021 08:33, Richard Stallman wrote:
>    > As such, it's untenable to suggest that this project, or the proposed
>    > package, promote any particular piece of software listed.
> 
> I am not convinced -- but I'm willing to take a concrete look at what
> you're talking about.  Would you please show me a couple of entries
> in repology?  For instance, how about the one about LLVM?

I'm not sure how to do that, the entry is pretty big. But here are two 
excerpts from two tabs:

Repository 	Package name 	Version 	Category 	Maintainer(s)
Adélie Linux current
user 	clang-doc 	8.0.1		- 	awilfox@adelielinux.org
Adélie Linux current
user 	clang-analyzer 	8.0.1		- 	awilfox@adelielinux.org
Adélie Linux current
user 	clang-libs 	8.0.1		- 	awilfox@adelielinux.org
Adélie Linux current
user 	llvm8 	8.0.1		- 	awilfox@adelielinux.org
Adélie Linux current
user 	llvm8-libs 	8.0.1		- 	awilfox@adelielinux.org
...
Fedora Rawhide 	clang 	11.0.1		Unspecified 	-
Fedora Rawhide 	compiler-rt 	11.0.1		Unspecified 	-
Fedora Rawhide 	flang 	11.0.1		Unspecified 	-
Fedora Rawhide 	libcxx 	11.0.1		Unspecified 	-
Fedora Rawhide 	libcxxabi 	11.0.1		Unspecified 	-
...

and

clang
8.0.1 (8.0.1-r0)

     Summary:
     A C language family front-end for LLVM
     Maintainer:
         awilfox@adelielinux.org
     License:
         NCSA
     Package-related links:
         APKBUILD
     Homepage:
         https://llvm.org/

user Adélie Linux current

clang-analyzer
8.0.1 (8.0.1-r0)

     Summary:
     Clang source code analysis framework
     Maintainer:
         awilfox@adelielinux.org
     License:
         NCSA
     Package-related links:
         APKBUILD
     Homepage:
         https://llvm.org/

user Adélie Linux current

clang-dev
8.0.1 (8.0.1-r0)

     Summary:
     A C language family front-end for LLVM (development files)
     Maintainer:
         awilfox@adelielinux.org
     License:
         NCSA
     Package-related links:
         APKBUILD
     Homepage:
         https://llvm.org/

user Adélie Linux current
...



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:08                     ` Dmitry Gutov
  2021-01-04 17:12                       ` Alfred M. Szmidt
@ 2021-01-06  5:02                       ` Richard Stallman
  2021-01-06 10:58                         ` Dmitry Gutov
  2021-01-06 14:41                         ` Jean Louis
  1 sibling, 2 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-06  5:02 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ams, ulm, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > https://repology.org/project/nmap/packages (okay, this shows the 
  > homepage too) clearly shows the non-standard license where it can.

I am having trouble understanding that page.  It gives a lot of
details but does not explicitly say how they relate to each other.
In particular, I don't know who the many packages listed
relate to each other.  I can only guess that they all relate to
the program nmap somehow.

Also, I don't know what facts that page is trying to present.

Most importantly, does Repology list nmap with nonfree packages as a
peculiar exception because it has had a peculiar history recently?  Or
does repology.org regularly list nonfree programs without trying to
distinguish?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-04 17:55                           ` Vasilij Schneidermann
  2021-01-04 18:51                             ` Clément Pit-Claudel
@ 2021-01-06  5:03                             ` Richard Stallman
  2021-01-06  9:44                               ` Alfred M. Szmidt
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-06  5:03 UTC (permalink / raw)
  To: Vasilij Schneidermann; +Cc: cpitclaudel, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > One of the listed goals is "Prohibit redistribution and use of Nmap
  > within proprietary hardware and software products."

That goal sounds like it might conflict with the free software
definition.  I say "might" because I can't tell from just that.
Maybe this is ok, maybe not.  It would take some thought.

What do they mean by "proprietary hardware products"?  The meaning is
not obvious, so we do not classify "hardware" as free or proprietary.
(See https://gnu.org/philosophy/free-hardware-designs.html.)

In any case, it is not their _goals_ that would either satisfy the
free software definition or not.  Rather, it is their actual _license_
that would make the difference.  The goals might help interpret it,
or might show what license changes they want to make.

Would you like to email me their current license text plus what they
say about its goals?

Did someone say that they were continuing to adjust their license
and what they are using is not final?  I think so.

Anyway, if repology.org has a general practice of listing only free
software, I would not criticize it for having difficulty with an
unclear case like this.

What matters for judging repology.org is its general policy.
Can someone show me that?
-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06  5:03                             ` Richard Stallman
@ 2021-01-06  9:44                               ` Alfred M. Szmidt
  2021-01-07 17:51                                 ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-06  9:44 UTC (permalink / raw)
  To: rms; +Cc: cpitclaudel, emacs-devel, mail

   Did someone say that they were continuing to adjust their license
   and what they are using is not final?  I think so.

Xilinx FPGA tool chains are listed in repology, I'm quite sure one
could find more examples of other non-free software -- for example all
of debians non-free repository seems to be listed there listed there,
it lists non-free firmware, etc.  Concentrating on nmap here is a
redherring.

   Anyway, if repology.org has a general practice of listing only free
   software, I would not criticize it for having difficulty with an
   unclear case like this.

It does not from what I could see on the web page, it lists everything
that is added.

   What matters for judging repology.org is its general policy.
   Can someone show me that?

They don't have one, what I could see.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06  5:02                       ` Richard Stallman
@ 2021-01-06 10:58                         ` Dmitry Gutov
  2021-01-06 14:41                         ` Jean Louis
  1 sibling, 0 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-06 10:58 UTC (permalink / raw)
  To: rms; +Cc: ams, ulm, bugs, emacs-devel

On 06.01.2021 07:02, Richard Stallman wrote:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>    > https://repology.org/project/nmap/packages (okay, this shows the
>    > homepage too) clearly shows the non-standard license where it can.
> 
> I am having trouble understanding that page.  It gives a lot of
> details but does not explicitly say how they relate to each other.
> In particular, I don't know who the many packages listed
> relate to each other.  I can only guess that they all relate to
> the program nmap somehow.

Seems like it shows all packages that have "nmap" in their name or 
description string there.

> Also, I don't know what facts that page is trying to present.

Check out https://repology.org/about:

About

Repology is a service which tracks and compares package versions in more 
than 120 package repositories.
Purpose

     For package/port maintainers:
         Discover new releases of software you maintain packages for
         Find new projects to package
         Get in touch with fellow maintainers to improve packages together
         Keep package naming and versioning schemes in sync to other 
repos for your and your user's convenience
         Fix problems detected by repology, such as broken links
     For software authors:
         Keep track of where and how well your project is packaged
         Keep in touch with your product package maintainers
     For users:
         Discover new releases of software you use
         Pick distribution most suitable for you, in terms of package 
quantity, freshness or stability
         Keep in touch with maintainers of software you use

> Most importantly, does Repology list nmap with nonfree packages as a
> peculiar exception because it has had a peculiar history recently?  Or
> does repology.org regularly list nonfree programs without trying to
> distinguish?

It tries to provide the correct license information. That's about it.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06  5:02                       ` Richard Stallman
  2021-01-06 10:58                         ` Dmitry Gutov
@ 2021-01-06 14:41                         ` Jean Louis
  2021-01-06 14:59                           ` Arthur Miller
  1 sibling, 1 reply; 139+ messages in thread
From: Jean Louis @ 2021-01-06 14:41 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, emacs-devel, ulm, Dmitry Gutov

Example user experience with repology:

1. M-x load-file RET repology.el RET
2. M-x repology RET s search RET toys OK RET

then I can find list like below.

docbook-toys              5     -            -
etoys                     40    5.0.2408     4.0.2340

and many others. Then if I click on `etoys' I get list like:

AUR                  etoys                5.0.2408     -                         fallback-mnt-aur@repology
Debian Oldstable     etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Debian Stable        etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Debian Testing       etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Debian Unstable      etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Deepin               etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Devuan 1.0 (Jessie)  etoys                4.0.2340     non-free/games            jredrejo@debian.org holger@debian.org
Devuan 2.0 (ASCII)   etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Devuan 3.0 (Beowulf) etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Devuan 4.0 (Chimaera) etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Devuan Unstable      etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Kali Linux Rolling   etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Pardus               etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Parrot               etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Raspbian Oldstable   etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Raspbian Stable      etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
Raspbian Testing     etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk

In the same manner I can stumble upon nvidia or other non-free
graphics drivers, and plethora of other non-free software:

Debian Stable Backports nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Debian Testing       nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Debian Unstable      nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Devuan 4.0 (Chimaera) nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Devuan Unstable      nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Kali Linux Rolling   nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
MX Linux MX-17 Testing nvidia-graphics-drivers-tesla-418 418.165.02   non-free/libs             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
MX Linux MX-19 Testing nvidia-graphics-drivers-tesla-418 418.165.02   non-free/libs             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Parrot               nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
Raspbian Testing     nvidia-graphics-drivers-tesla-418 418.165.02   non-free/misc             pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org

Most of times it will not say clearly "non-free" as I have just listed
those from Debian non-free.

GNU ELPA should not provide access to an indexed catalogue of non-free
software.

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 14:41                         ` Jean Louis
@ 2021-01-06 14:59                           ` Arthur Miller
  2021-01-06 15:21                             ` Jean Louis
  0 siblings, 1 reply; 139+ messages in thread
From: Arthur Miller @ 2021-01-06 14:59 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, emacs-devel, ulm, Dmitry Gutov

Jean Louis <bugs@gnu.support> writes:

> Example user experience with repology:
>
> 1. M-x load-file RET repology.el RET
> 2. M-x repology RET s search RET toys OK RET
>
> then I can find list like below.
>
> docbook-toys              5     -            -
> etoys                     40    5.0.2408     4.0.2340
>
> and many others. Then if I click on `etoys' I get list like:
>
> AUR                  etoys                5.0.2408     -                         fallback-mnt-aur@repology
> Debian Oldstable     etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Debian Stable        etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Debian Testing       etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Debian Unstable      etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Deepin               etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Devuan 1.0 (Jessie)  etoys                4.0.2340     non-free/games            jredrejo@debian.org holger@debian.org
> Devuan 2.0 (ASCII)   etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Devuan 3.0 (Beowulf) etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Devuan 4.0 (Chimaera) etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Devuan Unstable      etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Kali Linux Rolling   etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Pardus               etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Parrot               etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Raspbian Oldstable   etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Raspbian Stable      etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
> Raspbian Testing     etoys                5.0.2408     non-free/games            pkg-sugar-devel@lists.alioth.debian.org dr@jones.dk
>
> In the same manner I can stumble upon nvidia or other non-free
> graphics drivers, and plethora of other non-free software:
>
> Debian Stable Backports nvidia-graphics-drivers-tesla-418 418.165.02
> non-free/misc pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org
> bluca@debian.org
> Debian Testing nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
> Debian Unstable nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
> Devuan 4.0 (Chimaera) nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
> Devuan Unstable nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
> Kali Linux Rolling nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
> MX Linux MX-17 Testing nvidia-graphics-drivers-tesla-418 418.165.02
> non-free/libs pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org
> bluca@debian.org
> MX Linux MX-19 Testing nvidia-graphics-drivers-tesla-418 418.165.02
> non-free/libs pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org
> bluca@debian.org
> Parrot nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
> Raspbian Testing nvidia-graphics-drivers-tesla-418 418.165.02 non-free/misc
> pkg-nvidia-devel@lists.alioth.debian.org anbe@debian.org bluca@debian.org
>
> Most of times it will not say clearly "non-free" as I have just listed
> those from Debian non-free.
>
> GNU ELPA should not provide access to an indexed catalogue of non-free
> software.
>
> Jean
As I see, it says "non-free", so what is the problem?

I think it is rather informative to see if a piece of software is free
or not free, that way I can at least avoid non-free ones.

Are we now dogmatically religious where non-free software is forbidden
to even be mentioned as non-free? That smells to me as a slippery slope
into dogmatism and absolutism.

Is there free-speach if people are not allowed to speak freely about
some subject(s) like mentioning non-free software?

I think the problem for you is that you see that list as a
"recommendation list". If you instead interpret it as a "black list",
than having list of non-free software becomes a useful listing in terms
of things to avoid :-).

Cheers
/a



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 14:59                           ` Arthur Miller
@ 2021-01-06 15:21                             ` Jean Louis
  2021-01-06 16:23                               ` Arthur Miller
  0 siblings, 1 reply; 139+ messages in thread
From: Jean Louis @ 2021-01-06 15:21 UTC (permalink / raw)
  To: Arthur Miller; +Cc: ulm, ams, Dmitry Gutov, Richard Stallman, emacs-devel

* Arthur Miller <arthur.miller@live.com> [2021-01-06 18:00]:
> As I see, it says "non-free", so what is the problem?

Maybe you should review the fact that Debian does designate their
non-free repository but that repology.el package will show all other
repositories with non-free software, not being designated as non-free
by any manner. So your perception does not come from practical and
personal use of that software, rather from my example, that was not
exhaustive.

Example with etoys package, as classified non-free in Debian will not
be shown as non-free in Ubuntu:

From repology.el output:

Ubuntu 12.04         etoys                4.0.2340     multiverse/games          jredrejo@debian.org holger@debian.org

because the 4th column is name of repository in repology. It need not
say "non-free" at all.

When clicking on that entry above, user finds following:

repo            ubuntu_12_04
subrepo         precise/multiverse
srcname         etoys
visiblename     etoys
version         4.0.2340
maintainers     jredrejo@debian.org holger@debian.org
categories      multiverse/games
status          outdated
origversion     4.0.2340-1

> I think it is rather informative to see if a piece of software is free
> or not free, that way I can at least avoid non-free ones.

As from example above, it does not says nothing about the license at
all and thus does not serve to you as user to "recognize if software
is free or not-free". That is why you should make better your personal
research.

> Are we now dogmatically religious where non-free software is forbidden
> to even be mentioned as non-free? That smells to me as a slippery slope
> into dogmatism and absolutism.

GNU.org website does not offer directories of various software where
plethora of non-free software package descriptions can be found,
researched, and inspected. Why should Emacs do that? It is not aligned
with overall goals of GNU. It is matter of freedom and liberty and
teaching people free software and not religion.

> Is there free-speach if people are not allowed to speak freely about
> some subject(s) like mentioning non-free software?

That is absolutely not subject of repology.el package. It should be
clear that everybody is free to speak about anything. It is not
subject of this discussion. GNU is project about free software. It
should not offer access to users to search, verify, find references to
non-free software.

Just think little about that, bakery is about baking bread, it should
not (not normally) offer soaps on the bread shelves. Normally it will
also not offer milk on the same shelves. Diary factories normally do
not produce alcohol in their same factories.

GNU.org is about free software, it is not about giving references to
non-free software. Yet many non-free software are mentioned on GNU.org
website and references are given to free software with similar
functionality.

If a package like repology.el would say this software ABC is non-free
software, which you may replace by using this XYZ free software, that
would be useful. If it only offers queries and results from a software
database without distinction or without supporting GNU purposes, then
it should not be in GNU ELPA.

By free speech, it can be on any other server. Why not. 

> I think the problem for you is that you see that list as a
> "recommendation list". If you instead interpret it as a "black
> list", than having list of non-free software becomes a useful
> listing in terms of things to avoid :-).

I have no problem with anything. If it comes in GNU ELPA, I will
denounce the package on my website and say why it should not be there,
even if it is there.

My opinions are personal and not representative of GNU project.

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 15:21                             ` Jean Louis
@ 2021-01-06 16:23                               ` Arthur Miller
  2021-01-06 18:53                                 ` Jean Louis
  0 siblings, 1 reply; 139+ messages in thread
From: Arthur Miller @ 2021-01-06 16:23 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, Dmitry Gutov, ulm, emacs-devel

Jean Louis <bugs@gnu.support> writes:

> * Arthur Miller <arthur.miller@live.com> [2021-01-06 18:00]:
>> As I see, it says "non-free", so what is the problem?
>
> Maybe you should review the fact that Debian does designate their
> non-free repository but that repology.el package will show all other
> repositories with non-free software, not being designated as non-free
> by any manner. So your perception does not come from practical and
> personal use of that software, rather from my example, that was not
> exhaustive.
No. I don't use repology myself it is true. But if that is the case, then
repology.el can fix it in it's gui? No?

>> I think it is rather informative to see if a piece of software is free
>> or not free, that way I can at least avoid non-free ones.
>
> As from example above, it does not says nothing about the license at
> all and thus does not serve to you as user to "recognize if software
> is free or not-free". That is why you should make better your personal
> research.
If it says non-free than it is quite clear for anyone with a bit of
intelligence in their head that it is, well: NON-FREE!

>> Are we now dogmatically religious where non-free software is forbidden
>> to even be mentioned as non-free? That smells to me as a slippery slope
>> into dogmatism and absolutism.
>
> GNU.org website does not offer directories of various software where
> plethora of non-free software package descriptions can be found,
> researched, and inspected.
And? I don't like haggis; does it mean you should not like it?

> It is matter of freedom and liberty and
> teaching people free software and not religion.
I didn't said that GNU teaches people about religion. I said you are
religious dogmatic about software.

>> Is there free-speach if people are not allowed to speak freely about
>> some subject(s) like mentioning non-free software?
>
> That is absolutely not subject of repology.el package. It should be
> clear that everybody is free to speak about anything. It is not
> subject of this discussion. GNU is project about free software. It
> should not offer access to users to search, verify, find references to
> non-free software.
So dogmatic. Why not? It may be useful for people to find references to
non-free software so they are not misstankely using them. Isn't it? You
know, a black list; sort of.

> Just think little about that, bakery is about baking bread, it should
> not (not normally) offer soaps on the bread shelves. Normally it will
> also not offer milk on the same shelves.
Unless owner decides to sell soaps and milk too. For the most part, it
is just a practical choice by hardware used, storage space, demand
etc. In software world, there are less practical limitations than in
physical world.

> GNU.org is about free software, it is not about giving references to
> non-free software. Yet many non-free software are mentioned on GNU.org
> website and references are given to free software with similar
> functionality.
>
> If a package like repology.el would say this software ABC is non-free
> software, which you may replace by using this XYZ free software, that
> would be useful. If it only offers queries and results from a software
> database without distinction or without supporting GNU purposes, then
> it should not be in GNU ELPA.
You have so little faith in other human beings to think with their own
heads. However I don't think everyone is happy with decisions being made
for them. Some people prefer liberty to decide for themselves, otherwise
they might feel oppressed.

Freedom and liberty is letting people decide for themselves.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 16:23                               ` Arthur Miller
@ 2021-01-06 18:53                                 ` Jean Louis
  2021-01-06 19:26                                   ` Eli Zaretskii
                                                     ` (2 more replies)
  0 siblings, 3 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-06 18:53 UTC (permalink / raw)
  To: Arthur Miller; +Cc: ulm, ams, emacs-devel, Richard Stallman, Dmitry Gutov

* Arthur Miller <arthur.miller@live.com> [2021-01-06 19:24]:
> > As from example above, it does not says nothing about the license at
> > all and thus does not serve to you as user to "recognize if software
> > is free or not-free". That is why you should make better your personal
> > research.
> If it says non-free than it is quite clear for anyone with a bit of
> intelligence in their head that it is, well: NON-FREE!

Try using it yourself. Since I gave you my last example, I did not get
impression that you improved your perception. This is because you did
not try it. My conclusion is that it does not say for every piece of
software that it is non-free. It is probably only for those software
from Debian, that it gives the name of repository in the fourth column
and Debian keeps name of repository "non-free". Repology.org server
provides references to software packages from plethora of
repositories. Other repositories may not name the repository
"non-free", so you may not easily distinguish about that. And, I also
gave example that package information may not show at all which
license is used by specific package. Sometimes it may show, sometimes
not.

Take for example the proprietary black list by the fully free Parabola
GNU/Linux distribution:
https://git.parabola.nu/blacklist.git/plain/blacklist.txt

and then use repology.el package to search for those packages.

Then try searching for a popular non-free browser such as "Opera"

You may find an entry like this:

SlackBuilds          network/opera-developer 74.0.3890.0  network
edps.mundognu@gmail.com

where it gives following information:

repo            slackbuilds
srcname         network/opera-developer
visiblename     network/opera-developer
version         74.0.3890.0
maintainers     edps.mundognu@gmail.com
downloads       https://download1.operacdn.com/pub/opera-developer/74.0.3890.0/linux/opera-developer_74.0.3890.0_amd64.deb
www             https://www.opera.com/
categories      network
status          ignored
origversion     -

And in such information there is hyperlink on how to download non-free
software.

Nothing says if software is free or not.

This is becuse SlackBuilds unethical repository probably does not
provide license information on software they package, including
proprietary software.

If however, user clocks on the entry like this:

nixpkgs unstable     opera                68.0.3618.63 -
fallback-mnt-nix@repology

then one can get some information as the nixpkgs unethical repository,
does provide information that they are distributing proprietary
software, they mention it as "Unfree":

repo            nix_unstable
name            opera
visiblename     opera
version         68.0.3618.63
maintainers     fallback-mnt-nix@repology
licenses        Unfree
www             https://www.opera.com/
summary         Web browser
status          outdated
origversion     -

Other unethical repository like Solus would spit out result by
repology.el like this:

repo            solus
srcname         opera-stable
binname         opera-stable
visiblename     opera-stable
version         73.0.3856.329
maintainers     harveydevel@gmail.com
licenses        Distributable
www             https://www.opera.com/
summary         The Opera browser brings you more speed, more discoveries and more safety on the web - all for free
categories      network.web.browser
status          newest
origversion     -

"Distributable" is vague and does not say really what license it is,
but I do ensure you that Opera is proprietary software.

And so on, and so on.

By putting repology.el into GNU ELPA, GNU software like Emacs will
become a good reference to unethical software repositories promoting
among proprietary software.

> > It is matter of freedom and liberty and
> > teaching people free software and not religion.
> I didn't said that GNU teaches people about religion. I said you are
> religious dogmatic about software.

Who I am, or how I am is not subject of this. I do need to conform to
yours or anybody's standards or classes of society. 

Subject is the Emacs package repology.el and if inclusion into GN ELPA
is aligned with GNU purposes. I am free software user and cannot
recommend any proprietary software to any party, so I do not recommend
that GNU Emacs in official GNU repository becomes a platform to
promote proprietary software packages. And I can hardly understand why
you promote such view point. People reading this mailing list shall
know that GNU Emacs is about free software.

Attempt to promote proprietary software by including repology.el in
GNU ELPA is confusing free software users reading this mailing list.

So if you wish to promote proprietary software just find some other
platform, but not GNU.org. You could for example open up your website
and open up your own ELPA repository and include repology.el and
provide access to references on proprietary software. It would be less
typing then what we discuss here.

I do think that attempt to include the repology.el is the attempt to
make better advertising for the unethical website repology.org

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 18:53                                 ` Jean Louis
@ 2021-01-06 19:26                                   ` Eli Zaretskii
  2021-01-06 21:18                                     ` Alfred M. Szmidt
                                                       ` (2 more replies)
  2021-01-06 20:36                                   ` Arthur Miller
  2021-01-07  7:49                                   ` Richard Stallman
  2 siblings, 3 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-06 19:26 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Wed, 6 Jan 2021 21:53:08 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: ulm@gentoo.org, ams@gnu.org, emacs-devel@gnu.org,
>  Richard Stallman <rms@gnu.org>, Dmitry Gutov <dgutov@yandex.ru>
> 
> "Distributable" is vague and does not say really what license it is,
> but I do ensure you that Opera is proprietary software.
> 
> And so on, and so on.
> 
> By putting repology.el into GNU ELPA, GNU software like Emacs will
> become a good reference to unethical software repositories promoting
> among proprietary software.

Showing information about a package and a link to download it is a far
cry from "promoting" it.

Suppose I want to download a potentially non-free package to study its
code, or even just to understand with what kind of license it is
distributed (since you say the site itself doesn't tell) -- is this
"verboten" as well in Jean Louis's interpretation of what a Free
Software follower should and shouldn't do?

IOW, since when providing _information_ about something means we
endorse it?  Are we allowed to discuss "the bad guys", or should we
pretend they don't exist, for the fear that if we do mention them,
that could be interpreted as "promoting" them and their views?

If you think for a while, you will realize that this is the kind of
slippery slope that leads to the company of the bastards that accused
Richard in justifying obnoxious and criminal behavior.  "You are
either with us or against us."



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 18:53                                 ` Jean Louis
  2021-01-06 19:26                                   ` Eli Zaretskii
@ 2021-01-06 20:36                                   ` Arthur Miller
  2021-01-07  7:48                                     ` Richard Stallman
  2021-01-07  7:49                                   ` Richard Stallman
  2 siblings, 1 reply; 139+ messages in thread
From: Arthur Miller @ 2021-01-06 20:36 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, emacs-devel, ulm, Dmitry Gutov

Jean Louis <bugs@gnu.support> writes:

> * Arthur Miller <arthur.miller@live.com> [2021-01-06 19:24]:
>> > As from example above, it does not says nothing about the license at
>> > all and thus does not serve to you as user to "recognize if software
>> > is free or not-free". That is why you should make better your personal
>> > research.
>> If it says non-free than it is quite clear for anyone with a bit of
>> intelligence in their head that it is, well: NON-FREE!
>
> Try using it yourself. Since I gave you my last example, I did not get
> impression that you improved your perception. This is because you did
> not try it. My conclusion is that it does not say for every piece of
> software that it is non-free. It is probably only for those software
> from Debian, that it gives the name of repository in the fourth column
> and Debian keeps name of repository "non-free". Repology.org server
> provides references to software packages from plethora of
> repositories. Other repositories may not name the repository
> "non-free", so you may not easily distinguish about that. And, I also
> gave example that package information may not show at all which
> license is used by specific package. Sometimes it may show, sometimes
> not.
>
> Take for example the proprietary black list by the fully free Parabola
> GNU/Linux distribution:
> https://git.parabola.nu/blacklist.git/plain/blacklist.txt
>
> and then use repology.el package to search for those packages.
>
> Then try searching for a popular non-free browser such as "Opera"
>
> You may find an entry like this:
>
> SlackBuilds          network/opera-developer 74.0.3890.0  network
> edps.mundognu@gmail.com
>
> where it gives following information:
>
> repo            slackbuilds
> srcname         network/opera-developer
> visiblename     network/opera-developer
> version         74.0.3890.0
> maintainers     edps.mundognu@gmail.com
> downloads       https://download1.operacdn.com/pub/opera-developer/74.0.3890.0/linux/opera-developer_74.0.3890.0_amd64.deb
> www             https://www.opera.com/
> categories      network
> status          ignored
> origversion     -
>
> And in such information there is hyperlink on how to download non-free
> software.
>
> Nothing says if software is free or not.
>
> This is becuse SlackBuilds unethical repository probably does not
> provide license information on software they package, including
> proprietary software.
>
> If however, user clocks on the entry like this:
>
> nixpkgs unstable     opera                68.0.3618.63 -
> fallback-mnt-nix@repology
>
> then one can get some information as the nixpkgs unethical repository,
> does provide information that they are distributing proprietary
> software, they mention it as "Unfree":
>
> repo            nix_unstable
> name            opera
> visiblename     opera
> version         68.0.3618.63
> maintainers     fallback-mnt-nix@repology
> licenses        Unfree
> www             https://www.opera.com/
> summary         Web browser
> status          outdated
> origversion     -
>
> Other unethical repository like Solus would spit out result by
> repology.el like this:
>
> repo            solus
> srcname         opera-stable
> binname         opera-stable
> visiblename     opera-stable
> version         73.0.3856.329
> maintainers     harveydevel@gmail.com
> licenses        Distributable
> www             https://www.opera.com/
> summary         The Opera browser brings you more speed, more discoveries and more safety on the web - all for free
> categories      network.web.browser
> status          newest
> origversion     -
>
> "Distributable" is vague and does not say really what license it is,
> but I do ensure you that Opera is proprietary software.
>
> And so on, and so on.
>
> By putting repology.el into GNU ELPA, GNU software like Emacs will
> become a good reference to unethical software repositories promoting
> among proprietary software.
>
>> > It is matter of freedom and liberty and
>> > teaching people free software and not religion.
>> I didn't said that GNU teaches people about religion. I said you are
>> religious dogmatic about software.
>
> Who I am, or how I am is not subject of this. I do need to conform to
> yours or anybody's standards or classes of society. 
Ok. Fair enough; as long as you don't demand other people to live up to
your standards. I am affraid by stigmatizing people for running some
software you are actually indirectly demanding them to live up to your
standards. (btw - I think you ment "I do not need ..." :-))

> Subject is the Emacs package repology.el and if inclusion into GN ELPA
> is aligned with GNU purposes. I am free software user and cannot
> recommend any proprietary software to any party, so I do not recommend
> that GNU Emacs in official GNU repository becomes a platform to
> promote proprietary software packages. And I can hardly understand why
> you promote such view point. People reading this mailing list shall
> know that GNU Emacs is about free software.
Since you like dictionaries a lot, maybe you should look up word
"information" and word "promotion" in some. They are two different
things.

I am not promoting non-free software, but I am very pragmatic person. As
a curiosa, about me, I even went in a political party to promote
actually free software; because I thought we could save A LOTS of
taxpayers money in the long run, and could make the world a better place
if we invested in free software isntead of sending money out of the
contrey to Microsoft or Apple or other big tech Co:s.

However dogmaticism and stigmaticism has never proven to be useful in
the long run. On contrary it is unproductive and potentially harmful. It
holds for every aspect of human life.

So is neither ultra-radicalism, it has tendency to alienate people.

> Attempt to promote proprietary software by including repology.el in
> GNU ELPA is confusing free software users reading this mailing list.
See above about dictionary.

As a curiosa, I wonder what do you think, how much of medical software
that powers life-holding machines in hospitals is *Free*? Should we
erase all those chips and hardrives? What do you think about *that*
unethical software? Do we have alternative? I really wish nobody ever
gets into a respiratory machine, but those that end up there are
probably thankful for whatever software runs it. Are those implicit
users of "unethical softare" suddenly "unethical people" because they
have no choice?

Is it unethical to not jump in a lake and save a drowbing persons life
if you can't swim?

Pesonally, I wish we had only free software in this world; but until we
have, I am affraid a people in that circumstance are thankful to have
whatever there is.

And yes, I agree repology could list the license along their tags and
include license category to search/filter for, at least in their
"Advanced ..." dialogue. Now when I see it I wonder even for whom is it
useful, on first sight it does not even seem very useful, I don't really
know.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 19:26                                   ` Eli Zaretskii
@ 2021-01-06 21:18                                     ` Alfred M. Szmidt
  2021-01-06 21:25                                       ` Dmitry Gutov
                                                         ` (2 more replies)
  2021-01-07  7:49                                     ` Richard Stallman
  2021-01-07  8:15                                     ` Jean Louis
  2 siblings, 3 replies; 139+ messages in thread
From: Alfred M. Szmidt @ 2021-01-06 21:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, bugs, ulm, emacs-devel, arthur.miller, dgutov

   Showing information about a package and a link to download it is a far
   cry from "promoting" it.

   Suppose I want to download a potentially non-free package to study its
   code, or even just to understand with what kind of license it is
   distributed (since you say the site itself doesn't tell) -- is this
   "verboten" as well in Jean Louis's interpretation of what a Free
   Software follower should and shouldn't do?

I think the issue here isn't what you, I, or Jean Louis does -- but
what the GNU project does.  

The GNU project doesn't want to give non-free software the remote
changes of success, so mentioning or linking to it unless it is very
well known would be working against its own goals.  This is all
written down in the GNU coding standards, what GNU project should or
shouldn't do, in the now so overly quoted section 'References to
Non-Free Software and Documentation'.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 21:18                                     ` Alfred M. Szmidt
@ 2021-01-06 21:25                                       ` Dmitry Gutov
  2021-01-07  7:47                                         ` Richard Stallman
  2021-01-07  8:54                                       ` Jean Louis
  2021-01-07 14:07                                       ` Eli Zaretskii
  2 siblings, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-06 21:25 UTC (permalink / raw)
  To: Alfred M. Szmidt, Eli Zaretskii
  Cc: ulm, emacs-devel, arthur.miller, bugs, rms

On 06.01.2021 23:18, Alfred M. Szmidt wrote:
> The GNU project doesn't want to give non-free software the remote
> changes of success, so mentioning or linking to it unless it is very
> well known would be working against its own goals.  This is all
> written down in the GNU coding standards, what GNU project should or
> shouldn't do, in the now so overly quoted section 'References to
> Non-Free Software and Documentation'.

If your interpretation is right (and I'm not sure it is), think this 
kind of "ostrich" approach to the adversary seems like the most puzzling 
part of the GNU policy.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-05 11:21                 ` Dmitry Gutov
@ 2021-01-07  7:32                   ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-07  7:32 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I'm not sure how to do that, the entry is pretty big. But here are two 
  > excerpts from two tabs:

Thanks.  That gives me an idea at one level of what it's doing.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-05  8:56                     ` Alfred M. Szmidt
@ 2021-01-07  7:34                       ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-07  7:34 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: ulm, emacs-devel, bugs, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > It is a website that lists what binary (both free software and
  > non-free software) packages

Too bad.  We should avoid recommending use of repology.org.
(This doesn't imply actively discouraging people from using it.
There is no need to go THAT far.)

If repology.el is a simple interface to repology.org,
we should not recommend repology.el.  Unless we can find a way
to fix the problem of showing nonfree packages.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 21:25                                       ` Dmitry Gutov
@ 2021-01-07  7:47                                         ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-07  7:47 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, eliz

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > If your interpretation is right (and I'm not sure it is), think this 
  > kind of "ostrich" approach to the adversary seems like the most puzzling 
  > part of the GNU policy.

This is a tricky trade-off between various disadvantages, so I think
debating it would be a big time sink.  If your judgment is different
from mine, so be it.

If someone has a constructive suggestion for a change in this policy,
please send it to me personally.  It is a tangent on this list.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 20:36                                   ` Arthur Miller
@ 2021-01-07  7:48                                     ` Richard Stallman
  2021-01-07 16:53                                       ` Arthur Miller
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-07  7:48 UTC (permalink / raw)
  To: Arthur Miller; +Cc: ams, dgutov, ulm, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Since you like dictionaries a lot, maybe you should look up word
  > "information" and word "promotion" in some. They are two different
  > things.

The two are not the same thing, but providing information about
something often has the effect of promoting it.

The node References in the GNU Coding standards explains the relationship,
including its subtleties.

  > However dogmaticism and stigmaticism has never proven to be useful in
  > the long run. On contrary it is unproductive and potentially harmful. It
  > holds for every aspect of human life.

Maybe so, but what the node References actually says is not dogmatic.
It also does not criticize anyone.  It merely states our policy
about how to handle such issues.

  > So is neither ultra-radicalism, it has tendency to alienate people.

I agree, but we are not as radical as you're saying.

  > As a curiosa, I wonder what do you think, how much of medical software
  > that powers life-holding machines in hospitals is *Free*? Should we
  > erase all those chips and hardrives? What do you think about *that*
  > unethical software?

Does anyone here advocate that?  I don't.

I understand that you feel offended.  But responding to that by
fighting "back" will only increase hostility.  Someone else will fight
"back" by attacking you.

Please, everyone, stop attacking other people.  If you can't stay calm,
stay quiet.




-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 19:26                                   ` Eli Zaretskii
  2021-01-06 21:18                                     ` Alfred M. Szmidt
@ 2021-01-07  7:49                                     ` Richard Stallman
  2021-01-07 11:41                                       ` Dmitry Gutov
  2021-01-07 14:24                                       ` Eli Zaretskii
  2021-01-07  8:15                                     ` Jean Louis
  2 siblings, 2 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-07  7:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Suppose I want to download a potentially non-free package to study its
  > code, or even just to understand with what kind of license it is
  > distributed (since you say the site itself doesn't tell) -- is this
  > "verboten" as well in Jean Louis's interpretation of what a Free
  > Software follower should and shouldn't do?

The GNU Project would not criticize anyone for that.
Indeed, we don't generally criticize users for running nonfree programs.
And we don't claim the power to "forbid" anything (except for GPL violations).
You're condemning things which don't have to do with us.

The issue at hand is not about what users are allowed to do.  And
Jean's message was not about what users are allowed to do.  We are
talking about what WE should, and shouldn't, say to the public in
Emacs and other GNU packages.

If you look once again at the References node, you'll see what
this is about.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 18:53                                 ` Jean Louis
  2021-01-06 19:26                                   ` Eli Zaretskii
  2021-01-06 20:36                                   ` Arthur Miller
@ 2021-01-07  7:49                                   ` Richard Stallman
  2021-01-07  9:00                                     ` Jean Louis
                                                       ` (2 more replies)
  2 siblings, 3 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-07  7:49 UTC (permalink / raw)
  To: Jean Louis; +Cc: ams, emacs-devel, ulm, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

You've brought us bad news about repology.org.  Not only does it include
nonfree packages with no effort to avoid them, it fails to provide
enough information for us to easily filter them out.

I see two ways we could possibly manage to use repology.org in the
Free World.

* Find a way to distinguish free from nonfree packages.  I see two
ideas One is to snarf the lists of free packages from Debian and
Parabola.  Another is to see if free packages list a license that
shows they are free.  You might have other ideas.

* Ask the developer of repology.org to work with us to indicate which
packages are free, maybe even provide a way to specify "show me only
free packages".

Does anyone have another idea?


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 19:26                                   ` Eli Zaretskii
  2021-01-06 21:18                                     ` Alfred M. Szmidt
  2021-01-07  7:49                                     ` Richard Stallman
@ 2021-01-07  8:15                                     ` Jean Louis
  2021-01-07 14:37                                       ` Eli Zaretskii
  2 siblings, 1 reply; 139+ messages in thread
From: Jean Louis @ 2021-01-07  8:15 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: rms, Jean Louis, ulm, emacs-devel, ams, arthur.miller, dgutov

* Eli Zaretskii <eliz@gnu.org> [2021-01-06 22:27]:
> > Date: Wed, 6 Jan 2021 21:53:08 +0300
> > From: Jean Louis <bugs@gnu.support>
> > Cc: ulm@gentoo.org, ams@gnu.org, emacs-devel@gnu.org,
> >  Richard Stallman <rms@gnu.org>, Dmitry Gutov <dgutov@yandex.ru>
> > 
> > "Distributable" is vague and does not say really what license it is,
> > but I do ensure you that Opera is proprietary software.
> > 
> > And so on, and so on.
> > 
> > By putting repology.el into GNU ELPA, GNU software like Emacs will
> > become a good reference to unethical software repositories promoting
> > among proprietary software.
> 
> Showing information about a package and a link to download it is a far
> cry from "promoting" it.

To promote means to contribute to the progress or growth of, in one
definition, and in other it means to make publicity for
something. Reference comes from Wordnet dictionary.

repology.el is promoting software packages including many non-free
software packages.

You may have different opinion on what promoting means. I don't agree
it is not promoting.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 21:18                                     ` Alfred M. Szmidt
  2021-01-06 21:25                                       ` Dmitry Gutov
@ 2021-01-07  8:54                                       ` Jean Louis
  2021-01-07 14:07                                       ` Eli Zaretskii
  2 siblings, 0 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-07  8:54 UTC (permalink / raw)
  To: Alfred M. Szmidt
  Cc: rms, ulm, emacs-devel, arthur.miller, dgutov, Eli Zaretskii

* Alfred M. Szmidt <ams@gnu.org> [2021-01-07 00:19]:
>    Showing information about a package and a link to download it is a far
>    cry from "promoting" it.
> 
>    Suppose I want to download a potentially non-free package to study its
>    code, or even just to understand with what kind of license it is
>    distributed (since you say the site itself doesn't tell) -- is this
>    "verboten" as well in Jean Louis's interpretation of what a Free
>    Software follower should and shouldn't do?

I do not know now who really said above paragraph, I just wish to make
it clear that I do not speak about what "free software follower should
do or not" and I never spoke about that, the statements on repology.el
were related on what should be put in GNU ELPA, or not, as it does not
align to GNU project purposes.

That people do what they wish to do is none of my business. So I never
said anything ever on what a free software follower should do or not
do.





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  7:49                                   ` Richard Stallman
@ 2021-01-07  9:00                                     ` Jean Louis
  2021-01-08  6:21                                       ` Richard Stallman
  2021-01-07 10:55                                     ` Ulrich Mueller
  2021-01-07 15:05                                     ` Stefan Monnier
  2 siblings, 1 reply; 139+ messages in thread
From: Jean Louis @ 2021-01-07  9:00 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, emacs-devel, ulm, arthur.miller, dgutov

* Richard Stallman <rms@gnu.org> [2021-01-07 10:50]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
> You've brought us bad news about repology.org.  Not only does it include
> nonfree packages with no effort to avoid them, it fails to provide
> enough information for us to easily filter them out.
> 
> I see two ways we could possibly manage to use repology.org in the
> Free World.
> 
> * Find a way to distinguish free from nonfree packages.  I see two
> ideas One is to snarf the lists of free packages from Debian and
> Parabola.  Another is to see if free packages list a license that
> shows they are free.  You might have other ideas.

Good way to go is to duplicate repology.org server on other domain and
provide package listings from fully free FSF endorsed GNU/Linux
distributions or non-GNU fully free OS-es such as Replicant.

One other way to go is to ask repology.org to provide access to fully
free software so that package repology.el has access to only those
packages as provided by fully free FSF endorsed GNU/Linux distribution
repositories and those fully free non-GNU OS-es such as Replicant.

Then repology.el could be modified to access the API to fully free
packages ONLY, as then results would not show any proprietary software.

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  7:49                                   ` Richard Stallman
  2021-01-07  9:00                                     ` Jean Louis
@ 2021-01-07 10:55                                     ` Ulrich Mueller
  2021-01-09  6:34                                       ` Richard Stallman
  2021-01-20  6:14                                       ` Richard Stallman
  2021-01-07 15:05                                     ` Stefan Monnier
  2 siblings, 2 replies; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-07 10:55 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Jean Louis, ulm, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Thu, 07 Jan 2021, Richard Stallman wrote:

> I see two ways we could possibly manage to use repology.org in the
> Free World.

> * Find a way to distinguish free from nonfree packages.  I see two
> ideas One is to snarf the lists of free packages from Debian and
> Parabola.  Another is to see if free packages list a license that
> shows they are free.  You might have other ideas.

> * Ask the developer of repology.org to work with us to indicate which
> packages are free, maybe even provide a way to specify "show me only
> free packages".

One would first have to define what qualifies as a free package, and the
world isn't all black-or-white there.

For example, the tarball of org-mode as released by upstream [1]
contains Relax-NG schemas [2] distributed under a license that doesn't
allow modification. Does that make org-mode a non-free package?

The way we handle this in Gentoo is not to install these non-free
components by default. Users however have the option to enable their
installation if they do two things: a) set a so-called USE flag, and
b) explicitly accept these components' license.

Another example is the intlfonts package [3], which contains some
Tibetan fonts with a non-commercial restriction. Again, Gentoo handles
this with a USE flag, so users have to explicitly ask for installation
of these non-free fonts.

There are many more packages like that, and I don't believe that one
could simply divide them into free and non-free by just taking the
package name. It will depend on what the distro does when installing
them or creating a binary package from them.

[1] https://orgmode.org/org-9.4.tar.gz
[2] in directory etc/schema/
[3] https://directory.fsf.org/wiki/Intlfonts



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  7:49                                     ` Richard Stallman
@ 2021-01-07 11:41                                       ` Dmitry Gutov
  2021-01-09  6:39                                         ` Richard Stallman
  2021-01-07 14:24                                       ` Eli Zaretskii
  1 sibling, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-07 11:41 UTC (permalink / raw)
  To: rms, Eli Zaretskii; +Cc: arthur.miller, ulm, ams, bugs, emacs-devel

On 07.01.2021 09:49, Richard Stallman wrote:
> We are
> talking about what WE should, and shouldn't, say to the public in
> Emacs and other GNU packages.

The first question we asked is whether publishing a license-agnostic 
package working off an automatically-generated database based on the 
repositories of all the GNU/Linux and BSD distros out there constitutes 
"saying" something "to the public".



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06 21:18                                     ` Alfred M. Szmidt
  2021-01-06 21:25                                       ` Dmitry Gutov
  2021-01-07  8:54                                       ` Jean Louis
@ 2021-01-07 14:07                                       ` Eli Zaretskii
  2 siblings, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-07 14:07 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: rms, bugs, ulm, emacs-devel, arthur.miller, dgutov

> From: "Alfred M. Szmidt" <ams@gnu.org>
> Cc: bugs@gnu.support, arthur.miller@live.com, rms@gnu.org,
> 	dgutov@yandex.ru, ulm@gentoo.org, emacs-devel@gnu.org
> Date: Wed, 06 Jan 2021 16:18:59 -0500
> 
>    Suppose I want to download a potentially non-free package to study its
>    code, or even just to understand with what kind of license it is
>    distributed (since you say the site itself doesn't tell) -- is this
>    "verboten" as well in Jean Louis's interpretation of what a Free
>    Software follower should and shouldn't do?
> 
> I think the issue here isn't what you, I, or Jean Louis does -- but
> what the GNU project does.  

I was talking from the POV of a GNU maintainer.

> The GNU project doesn't want to give non-free software the remote
> changes of success, so mentioning or linking to it unless it is very
> well known would be working against its own goals.

So you are basically saying that no GNU package can ever help me find
out information about potentially non-free software?  Looking for such
information is something I as a GNU maintainer need to do almost every
day: someone proposes or mentions an Emacs package or a program that
can be useful with Emacs, and the first things I want/need to find out
are what kind of package is that? in what language is it written and
what OSes it supports? what is its license? does it rely on other
packages, and if so, what are their implementations and licenses?

You are in effect saying that no GNU package can ever help me with
these tasks, except if I'm looking for info about a Free Software
package, because divulging any information about a non-free package
means "promoting" it?  That is a very strange and radical
interpretation of "promotion", one that hurts our own cause by
preventing me from quickly and reliably answering the above basic
questions about any software package I ever come across.

> This is all written down in the GNU coding standards, what GNU
> project should or shouldn't do, in the now so overly quoted section
> 'References to Non-Free Software and Documentation'.

Some relevant quotes from that section:

  A GNU program should not recommend, promote, or grant legitimacy to
  the use of any non-free program.

No problem here.

  However, you should give only the necessary information to help
  those who already use the non-free program to use your program with
  it—don’t give, or refer to, any further information about the
  proprietary program, and don’t imply that the proprietary program
  enhances your program, or that its existence is in any way a good
  thing.

A somewhat different context not really relevant for our discussion,
but still: no problem here, either.  This text means that providing
the basic information about a program is OK, as long as we don't give
any impression that we endorse it or think that it is helping the
users in any way.

  Referring to a web site that describes or recommends a non-free
  program is promoting that program, so please do not make links to
  (or mention by name) web sites that contain such material.

I guess you mean this text, specifically the "describes" part (the
"recommends" part is fine, IMO).  I think interpreting the "describes"
part of this text literally, specifically when discussing packages
such as repology.el, is a mistake, which actually interferes with GNU
maintainers' job of quickly and reliably identifying software that is
non-free or otherwise problematic to our cause.  The ability to find
and study the code of any package is also an important method of
figuring out what the package really is and does; a literal
interpretation of the above text when applied to the current case is
thus also a mistake, IMO.

I wish the above text would make it more clear how to interpret it in
cases like this one.

  You should not refer to AT&T’s web site if that recommends AT&T’s
  non-free software packages; you should not refer to a page p that
  links to AT&T’s site presenting it as a place to get some non-free
  program, because that part of the page p itself recommends and
  legitimizes the non-free program.

I see no problem here, either: repology.org doesn't promote or
legitimize any of the packages whose information it records.

In sum, the text of that section in GSoC clearly wants to prevent any
recommendation or endorsement or favorite description of non-free
software, so I think its interpretation as precluding the display of
_any_ information of such software, specifically the basics: where to
find it and who maintains it -- such interpretation is a mistake, and
the text in GSoC should be made clearer in that regard.

Maybe we should continue this discussion on another, more suitable GNU
list.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  7:49                                     ` Richard Stallman
  2021-01-07 11:41                                       ` Dmitry Gutov
@ 2021-01-07 14:24                                       ` Eli Zaretskii
  1 sibling, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-07 14:24 UTC (permalink / raw)
  To: rms; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

> From: Richard Stallman <rms@gnu.org>
> Cc: bugs@gnu.support, ulm@gentoo.org, emacs-devel@gnu.org,
> 	ams@gnu.org, arthur.miller@live.com, dgutov@yandex.ru
> Date: Thu, 07 Jan 2021 02:49:19 -0500
> 
>   > Suppose I want to download a potentially non-free package to study its
>   > code, or even just to understand with what kind of license it is
>   > distributed (since you say the site itself doesn't tell) -- is this
>   > "verboten" as well in Jean Louis's interpretation of what a Free
>   > Software follower should and shouldn't do?
> 
> The GNU Project would not criticize anyone for that.
> Indeed, we don't generally criticize users for running nonfree programs.
> And we don't claim the power to "forbid" anything (except for GPL violations).
> You're condemning things which don't have to do with us.
> 
> The issue at hand is not about what users are allowed to do.

We are mis-communicating: I was talking about myself wearing the Emacs
maintainer hat.  See my other messages in this thread.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  8:15                                     ` Jean Louis
@ 2021-01-07 14:37                                       ` Eli Zaretskii
  0 siblings, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-07 14:37 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Thu, 7 Jan 2021 11:15:16 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: Jean Louis <bugs@gnu.support>, arthur.miller@live.com,
>   rms@gnu.org, ams@gnu.org, dgutov@yandex.ru, ulm@gentoo.org,
>   emacs-devel@gnu.org
> 
> To promote means to contribute to the progress or growth of, in one
> definition, and in other it means to make publicity for
> something.

repology.org does neither of these.  It provides basic information
about each package, and doesn't state any opinion on them, FAICT.  It
lets you judge that.  That's neither promotion nor advancement nor
publicity, in any reasonable sense of these words relevant to this
discussion.

> repology.el is promoting software packages including many non-free
> software packages.

I disagree.  It allows me to quickly find basic information about a
package, which is important in my job as an Emacs maintainer.  I
explained in my other messages why this is important and why I do it
almost every day.

> You may have different opinion on what promoting means. I don't agree
> it is not promoting.

You are entitled to your views, but here we discuss what Emacs as a
project should do.  That cannot be based on your or mine personal
views.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  7:49                                   ` Richard Stallman
  2021-01-07  9:00                                     ` Jean Louis
  2021-01-07 10:55                                     ` Ulrich Mueller
@ 2021-01-07 15:05                                     ` Stefan Monnier
  2021-01-13 15:57                                       ` Richard Stallman
  2 siblings, 1 reply; 139+ messages in thread
From: Stefan Monnier @ 2021-01-07 15:05 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Jean Louis, ulm, emacs-devel, ams, arthur.miller, dgutov

Could you people actually read what goes in this thread before getting
on your high horses.  The author already sent a new version days ago
which tries to filter out non-free packages (and I'm working with him
to refine his code).

'Nough said,


        Stefan


Richard Stallman [2021-01-07 02:49:31] wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
> You've brought us bad news about repology.org.  Not only does it include
> nonfree packages with no effort to avoid them, it fails to provide
> enough information for us to easily filter them out.
>
> I see two ways we could possibly manage to use repology.org in the
> Free World.
>
> * Find a way to distinguish free from nonfree packages.  I see two
> ideas One is to snarf the lists of free packages from Debian and
> Parabola.  Another is to see if free packages list a license that
> shows they are free.  You might have other ideas.
>
> * Ask the developer of repology.org to work with us to indicate which
> packages are free, maybe even provide a way to specify "show me only
> free packages".
>
> Does anyone have another idea?




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  7:48                                     ` Richard Stallman
@ 2021-01-07 16:53                                       ` Arthur Miller
  2021-01-14  5:21                                         ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Arthur Miller @ 2021-01-07 16:53 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, dgutov, ulm, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > Since you like dictionaries a lot, maybe you should look up word
>   > "information" and word "promotion" in some. They are two different
>   > things.
>
> The two are not the same thing, but providing information about
> something often has the effect of promoting it.
I think personal judgement here is very important. Providing information
about attrocities of the WWII has informational value to prevent same
thing from hapening again. Yet I have also seen (and even met) people
how are actually symptazing with the nazis rather then the offers (I am
speaking of ultra-right neo-nazis). Nobody in their clear mind would
see information about concentraion camps as a promotion. Yet some idiots
treat it that way.

The point of that ugly illustration is that value of the information is
in the eyes of beholders; it is their judgement.

I think that people in majority have tendency to choose "the good thing"
when given enough information, knowledge and possibility of choice. When
we teach kids not to lie or steal we are usually giving them information
why it is not good to do so.

The possibility of choice is very important too. It is easy to be "good"
when one is not hungry and not living under a tree in -10 degree Celsius.

I personally don't smoke or drink alkohol. I don't need any religion or
law to prohibit me. I just don't think it goes well with the gym and my
health. Last year I had maybe three or four glases of wine and I think
three beers for the entire year (two of them while visiting Austria -
one can't go to Austria and ot drink a glass of good wine or a beer or
two). I also see lots of people in the gym that live similar lifes (with
very little alkohol, smoke- and drug free).

Thus I think that most of people will choose a better option (Free
software) when given enough information (education?) and an option. I
don't think we need to hide our heads in sand and pretend there is no
non-free option. We just need to provide a compelling reason(s) why Free
alternative is a better option.

Just as illustration, if we educate people that they can do most of
things they need with LibreOffice instead of Microsoft Office (which 90%
of people probably can), they will not wish to buy it or use it.

> The node References in the GNU Coding standards explains the relationship,
> including its subtleties.
>
>   > However dogmaticism and stigmaticism has never proven to be useful in
>   > the long run. On contrary it is unproductive and potentially harmful. It
>   > holds for every aspect of human life.
>
> Maybe so, but what the node References actually says is not dogmatic.
> It also does not criticize anyone.  It merely states our policy
> about how to handle such issues.
I think it depends on how people interprets it, like everything else in
the life. Some people will interpret it dogmatically, some will not. 
>
>   > So is neither ultra-radicalism, it has tendency to alienate people.
>
> I agree, but we are not as radical as you're saying.
>
>   > As a curiosa, I wonder what do you think, how much of medical software
>   > that powers life-holding machines in hospitals is *Free*? Should we
>   > erase all those chips and hardrives? What do you think about *that*
>   > unethical software?
>
> Does anyone here advocate that?  I don't.
Why not?

It is a tricky question to answer, but I think it is important to have
answer on that one. 

The question arises, if we wish to be consistent, are binary blobs
unethical or not?

In philosophy we have to be logically consistent. We can't have a rule that
applies only sometimes. A rule either apply or don't.

> I understand that you feel offended.
I am not offended. Maybe it is my way of arguing that sounds to harsh,
but personally I am not offended. Like everyone else here, I wish the
best for both Emacs, Free software and Free world. I am very pragmatic
person, and I believe that goals can be achieved in different
ways. There is not one single answer to every problem, i.e. it is
important to be flexible just as it is to stay with one's principles.

> But responding to that by
> fighting "back" will only increase hostility.  Someone else will fight
> "back" by attacking you.
It seems to be a problem of social media and today's internet. Any
critique is considered as an attack and people are just digging deeper
into trenches.

Sorry if I am too harsh on J-Louise. It was a response to J-Louise who
adviced and teached earlier how one should read a dictionary when
experiencing a trauma, so I thought he would appreciate the reference :-).



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-06  9:44                               ` Alfred M. Szmidt
@ 2021-01-07 17:51                                 ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-07 17:51 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: cpitclaudel, emacs-devel, mail

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  >    Anyway, if repology.org has a general practice of listing only free
  >    software, I would not criticize it for having difficulty with an
  >    unclear case like this.

  > It does not from what I could see on the web page, it lists everything
  > that is added.

What repology is doing is a grave wrong to the free software
community, so grave that a single apology would not be sufficient.
They need to publish an apology, followed by a repology.

;-}

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07  9:00                                     ` Jean Louis
@ 2021-01-08  6:21                                       ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-08  6:21 UTC (permalink / raw)
  To: Jean Louis; +Cc: ams, emacs-devel, ulm, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Good way to go is to duplicate repology.org server on other domain and
  > provide package listings from fully free FSF endorsed GNU/Linux
  > distributions or non-GNU fully free OS-es such as Replicant.

repology.org is indeed a tangent for emacs-devel, so let's move this
also to emacs-tangents.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07 10:55                                     ` Ulrich Mueller
@ 2021-01-09  6:34                                       ` Richard Stallman
  2021-01-09 21:07                                         ` Ulrich Mueller
  2021-01-20  6:14                                       ` Richard Stallman
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-09  6:34 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > One would first have to define what qualifies as a free package, and the
  > world isn't all black-or-white there.

The definition needs interpretation, and we publish interpretations
in https://gnu.org/philosophy/free-sw.html.

  > For example, the tarball of org-mode as released by upstream [1]
  > contains Relax-NG schemas [2] distributed under a license that doesn't
  > allow modification. Does that make org-mode a non-free package?

It looks like we will have to study the situation and reach a
conclusion.

  > Another example is the intlfonts package [3], which contains some
  > Tibetan fonts with a non-commercial restriction.

That sounds like a bug.  Bugs happen, but they do not constitute
a fundamental confusion.  I will investigate.

We're talking about how well it is possible for repology.el to
distinguish free packages from nonfree packages on repology.org.

The site does not distribute these packages, it only finds out about
them by examining them.  So I don't think we need to demand that this
be 100% accurate.  If a few nonfree packages slip by, it is nothing to
tear our hair out about.  We ought to do make our code effective overall.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07 11:41                                       ` Dmitry Gutov
@ 2021-01-09  6:39                                         ` Richard Stallman
  2021-01-09 10:50                                           ` Dmitry Gutov
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-09  6:39 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, eliz

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > The first question we asked is whether publishing a license-agnostic 
  > package working off an automatically-generated database based on the 
  > repositories of all the GNU/Linux and BSD distros out there constitutes 
  > "saying" something "to the public".

For this purpose, what matters is whether this is a way of telling people
about packages.  See the node References.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-09  6:39                                         ` Richard Stallman
@ 2021-01-09 10:50                                           ` Dmitry Gutov
  0 siblings, 0 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-09 10:50 UTC (permalink / raw)
  To: rms; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, eliz

On 09.01.2021 08:39, Richard Stallman wrote:
>    > The first question we asked is whether publishing a license-agnostic
>    > package working off an automatically-generated database based on the
>    > repositories of all the GNU/Linux and BSD distros out there constitutes
>    > "saying" something "to the public".
> 
> For this purpose, what matters is whether this is a way of telling people
> about packages.  See the node References.

Well, I posit that this project is *not* a way that people discover new 
packages.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-09  6:34                                       ` Richard Stallman
@ 2021-01-09 21:07                                         ` Ulrich Mueller
  2021-01-11  4:46                                           ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-09 21:07 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Sat, 09 Jan 2021, Richard Stallman wrote:

>> For example, the tarball of org-mode as released by upstream [1]
>> contains Relax-NG schemas [2] distributed under a license that doesn't
>> allow modification. Does that make org-mode a non-free package?

> It looks like we will have to study the situation and reach a
> conclusion.

>> Another example is the intlfonts package [3], which contains some
>> Tibetan fonts with a non-commercial restriction.

> That sounds like a bug.  Bugs happen, but they do not constitute
> a fundamental confusion.  I will investigate.

These were just meant as examples, and my comment wasn't about these two
packages in particular. There are many more such cases of free packages
that include some strictly optional non-free files.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-09 21:07                                         ` Ulrich Mueller
@ 2021-01-11  4:46                                           ` Richard Stallman
  2021-01-12  8:24                                             ` Ulrich Mueller
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-11  4:46 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > These were just meant as examples, and my comment wasn't about these two
  > packages in particular. There are many more such cases of free packages
  > that include some strictly optional non-free files.

These are cases of a problem.  Would you please give details
so we can investigate and see what kind of problem each one is?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-11  4:46                                           ` Richard Stallman
@ 2021-01-12  8:24                                             ` Ulrich Mueller
  0 siblings, 0 replies; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-12  8:24 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Mon, 11 Jan 2021, Richard Stallman wrote:

> These are cases of a problem.  Would you please give details
> so we can investigate and see what kind of problem each one is?

1. org-mode installs the following two files:

   etc/schema/od-schema-v1.2-os.rnc
   etc/schema/od-manifest-schema-v1.2-os.rnc

They can also be found in the Emacs repository:
https://git.savannah.gnu.org/cgit/emacs.git/tree/etc/schema

Both files are licensed under the following terms:

   Copyright (c) OASIS Open 2002-2011, 2013. All Rights Reserved.

   All capitalized terms in the following text have the meanings
   assigned to them in the OASIS Intellectual Property Rights Policy
   (the "OASIS IPR Policy"). The full Policy may be found at the OASIS
   website.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published,
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this section are
   included on all such copies and derivative works. However, this
   document itself may not be modified in any way, including by removing
   the copyright notice or references to OASIS, except as needed for the
   purpose of developing any document or deliverable produced by an
   OASIS Technical Committee (in which case the rules applicable to
   copyrights, as set forth in the OASIS IPR Policy, must be followed)
   or as required to translate it into languages other than English.

   The limited permissions granted above are perpetual and will not be
   revoked by OASIS or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
   INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY
   IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
   PURPOSE.

The key phrase is "this document itself may not be modified in any way".

The files appear to be part of the Open Document standard, but as
Relax-NG schemas they are functional data.

It was also briefly mentioned in the debian-legal mailing list in 2018:
https://lists.debian.org/debian-legal/2018/08/msg00007.html
but AFAICS, Debian still distributes the files in their package.

2. As for the GNU Intlfonts package, that one may need a complete audit
of all its files. I see some files in the public domain and some with an
HPND license notice. Some Tibetan fonts come with the following notice
including a non-commercial restriction:

   97.1.21  Created by Toru TOMABECHI <Toru.Tomabechi@orient.unil.ch>.
   The glyphs are taken, using PS2PK and PK2BM, from TibMdxA type 1 font,
   originally designed by Christopher FYNN <cfynn@sahaja.demon.co.uk>.
   Slight modification has been made using XMBDFED and glyphs have
   been re-ordered.

   Original glyph design: Copyright (C) Christopher FYNN 1993-1994.
   Many thanks to Chris for kindly permitting its
   non-commercial use for our implementation.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07 15:05                                     ` Stefan Monnier
@ 2021-01-13 15:57                                       ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-13 15:57 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Could you people actually read what goes in this thread before getting
  > on your high horses.  The author already sent a new version days ago
  > which tries to filter out non-free packages (and I'm working with him
  > to refine his code).

That's good news.  Thank you for working on this.

I saw your message just today.  I wish I had seen it before, but I
have been unable to keep up with the volume of mail in my inbox.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07 16:53                                       ` Arthur Miller
@ 2021-01-14  5:21                                         ` Richard Stallman
  2021-01-15 14:52                                           ` Arthur Miller
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-14  5:21 UTC (permalink / raw)
  To: Arthur Miller; +Cc: ams, dgutov, ulm, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I think personal judgement here is very important. Providing information
  > about attrocities of the WWII has informational value

This is pertinent to the general topic of "providing information"
but it is not pertinent to the specific topic, which is
providing the information that there is a nonfree program
called Foo which does X, Y and Z (which might be something
you'd like to do, you being someone who doesn't hesitate
to run a nonfree program.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-14  5:21                                         ` Richard Stallman
@ 2021-01-15 14:52                                           ` Arthur Miller
  2021-01-16  5:14                                             ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Arthur Miller @ 2021-01-15 14:52 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ams, dgutov, ulm, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > I think personal judgement here is very important. Providing information
>   > about attrocities of the WWII has informational value
>
> This is pertinent to the general topic of "providing information"
> but it is not pertinent to the specific topic, which is
> providing the information that there is a nonfree program
> called Foo which does X, Y and Z (which might be something
> you'd like to do, you being someone who doesn't hesitate
> to run a nonfree program.
Why do you think I don't hesitate to run a nonfree program? :-)

I am not arguing for use of non-free programs; I am arguing about
importance of having a consistent and sustainable philosophy useful as a 
set of guiding rules, insted of something that is left to subjective
interpretation. So that people one day does not have to go to some emial
conversation and check: what RMS did or said about this particular issue.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-15 14:52                                           ` Arthur Miller
@ 2021-01-16  5:14                                             ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-16  5:14 UTC (permalink / raw)
  To: Arthur Miller; +Cc: ams, emacs-devel, ulm, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > This is pertinent to the general topic of "providing information"
  > > but it is not pertinent to the specific topic, which is
  > > providing the information that there is a nonfree program
  > > called Foo which does X, Y and Z (which might be something
  > > you'd like to do, you being someone who doesn't hesitate
  > > to run a nonfree program.
  > Why do you think I don't hesitate to run a nonfree program? :-)

I don't.  I was using "you" to refer to a hypothetical person
who doesn't hesitate to run a nonfree program.

Maybe the smiley means you understand that.  I am not sure.

  > I am not arguing for use of non-free programs; I am arguing about
  > importance of having a consistent and sustainable philosophy useful as a 
  > set of guiding rules, insted of something that is left to subjective
  > interpretation.

Requiring a judgment call, requiring interpretation, is not inconsistent.

Many criteria that make sense for human judgment cannot be stated in a
rigorously objective way.  There are points where we _must_ appeal to
human judgment because we don't know a batter way.

What is the specific point?




-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el (v4)
  2021-01-04 17:32     ` Stefan Monnier
@ 2021-01-19  9:50       ` Nicolas Goaziou
  2021-01-20  6:13         ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Nicolas Goaziou @ 2021-01-19  9:50 UTC (permalink / raw)
  To: emacs-devel; +Cc: Stefan Monnier

Hello,

As announced a few days ago, and with the guidance of Stefan Monnier,
I tweaked "repology.el" so it is somewhat aware about freedom, and
cautious about what it displays.

TL;DR: it is currently located at <https://elpa.gnu.org/devel/repology.html>.

Here is its current commentary section. The third and fifth paragraphs
are of particular interest for the discussion.

    This package provides tools to query Repology API
    (<https://repology.org/api>), process results, and display them.
    
    The results of a query revolve around three types of objects:
    projects, packages and problems.  Using this library, you can find
    projects matching certain criteria, packages in a given project,
    and possible problems in some repository.  See `repology-search-projects',
    `repology-lookup-project', and `repology-report-problems'.
    Projects-related requests are limited to `repology-projects-limit'.
    All requests are cached during `repology-cache-duration' seconds.
    
    By default, only projects recognized as free are included in the search
    results.  You can control this behavior with the variable
    `repology-free-only-projects'.  The function `repology-check-freedom'
    is responsible for guessing if a project, or a package, is free.
    
    You can then access data from those various objects using dedicated
    accessors.  See, for example, `repology-project-name',
    `repology-project-packages', `repology-package-field', or
    `repology-problem-field'.
    
    You can also decide to display (a subset of) results in a tabulated
    list.  See `repology-display-package', `repology-display-packages',
    `repology-display-projects' and `repology-display-problems'.  You
    can control various aspects of the display, like the colors used
    (see `repology-status-faces'), or the columns shown (see
    `repology-display-packages-columns',`repology-display-projects-columns',
    and `repology-display-problems-columns').  When projects or packages
    are displayed, pressing <RET> gives you more information about the item
    at point, whereas pressing <F> reports their "freedom" status.
    
    For example, the following expression displays all outdated projects
    named after "emacs" and containing a package in GNU Guix repository
    that I do not ignore:
    
       (repology-display-projects
        (seq-filter (lambda (project)
                      (not (member (repology-project-name project)
                                   my-ignored-projects)))
                    (repology-search-projects
                     :search "emacs" :inrepo "gnuguix" :outdated "on")))
    
    Eventually, this library provides an interactive function with
    a spartan interface wrapping this up: `repology'.  Since it builds
    and displays incrementally search filters, you may use it as
    a template to create your own queries.

The library distinguishes between three categories of freedom for
projects/packages: free, non-free, and unknown. Out of the 200.000
projects from Repology, it currently considers that about 73.000 are
free, 300 are non-free, and the rest is unknown.

Out of the box, the interface now only displays projects _most likely
free_ (more in this below). It is also possible to configure it so it
displays both free and unknown categories, or everything.

The commentary section in "repology-license.el" explains how freedom
state is obtained:

    This library provides the `repology-check-freedom' function, which returns
    t when a package or a project can be considered as free, nil it is
    identified as being non-free, and `unknown' otherwise.
    
    The decision is made by polling a number of "Reference repositories",
    defined in `repology-license-reference-repositories'.  If the ratio of
    "Free" votes is above `repology-license-poll-threshold', the project is
    declared as free.
    
    In order to see the results of each vote, and possibly debug the process,
    you can set `repology-license-debug' to a non-nil value.

Currently, reference repositories are: Debian, Fedora, OpenSUSE, Gentoo,
Mageia, along with all FSF-endorsed distributions known to Repology: GNU
Guix, Hyperbola, Parabola, PureOS, and Trisquel. I also added GNU ELPA
as a specialized repository.

The poll threshold is set to 0.5, so a package/project needs a strict
majority of "Free" votes to be considered as free. As explained above,
it is possible to look at the vote results to understand the final
decision for each project.

I hope this is now more in line with GNU expectations. Let me know if
you have questions, or suggestions.

Regards,
-- 
Nicolas Goaziou



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el (v4)
  2021-01-19  9:50       ` [ELPA] New package: repology.el (v4) Nicolas Goaziou
@ 2021-01-20  6:13         ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-20  6:13 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > As announced a few days ago, and with the guidance of Stefan Monnier,
  > I tweaked "repology.el" so it is somewhat aware about freedom, and
  > cautious about what it displays.

Thanks to both of you.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-07 10:55                                     ` Ulrich Mueller
  2021-01-09  6:34                                       ` Richard Stallman
@ 2021-01-20  6:14                                       ` Richard Stallman
  2021-01-21 11:09                                         ` Ulrich Mueller
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-20  6:14 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > For example, the tarball of org-mode as released by upstream [1]
  > contains Relax-NG schemas [2] distributed under a license that doesn't
  > allow modification. Does that make org-mode a non-free package?

That is an important question, but I don't know the answer.
Can you tell me what a Relax-NG schema is, and what it does?
With that information I should be able to understand the issue.

  > Another example is the intlfonts package [3], which contains some
  > Tibetan fonts with a non-commercial restriction.

It took time for me to reach Handa; he will investigate this.

Problems like this are important, and we need to look at them one by one.
A distro can fix the problem in various ways, but what we really should
aim for is get them fixed upstream.

It sounds like you are in a position to report many such problems.
Would you like to help with a long-term effort to get such problems
fixed upstream?


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-20  6:14                                       ` Richard Stallman
@ 2021-01-21 11:09                                         ` Ulrich Mueller
  2021-01-22  6:06                                           ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-21 11:09 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Wed, 20 Jan 2021, Richard Stallman wrote:

>> For example, the tarball of org-mode as released by upstream [1]
>> contains Relax-NG schemas [2] distributed under a license that doesn't
>> allow modification. Does that make org-mode a non-free package?

> That is an important question, but I don't know the answer.
> Can you tell me what a Relax-NG schema is, and what it does?
> With that information I should be able to understand the issue.

In a nutshell, a Relax-NG schema defines the grammar of an XML document,
somewhat similar to a DTD (which is older as a concept). For example,
nxml-mode can use such schemas for validation. (Strictly speaking, it
uses their compact form RNC, but that's an unimportant detail.)

In the concrete case, I believe the RNG schemas were taken from the Open
Document standard. It is somewhat understandable that they don't want to
allow modified versions of the standard, but that makes these schemas
non-free.

>> Another example is the intlfonts package [3], which contains some
>> Tibetan fonts with a non-commercial restriction.

> It took time for me to reach Handa; he will investigate this.

Thanks.

> Problems like this are important, and we need to look at them one by one.
> A distro can fix the problem in various ways, but what we really should
> aim for is get them fixed upstream.

> It sounds like you are in a position to report many such problems.
> Would you like to help with a long-term effort to get such problems
> fixed upstream?

Sure, I would be happy to help.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-21 11:09                                         ` Ulrich Mueller
@ 2021-01-22  6:06                                           ` Richard Stallman
  2021-01-22  9:43                                             ` Ulrich Mueller
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-22  6:06 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > In the concrete case, I believe the RNG schemas were taken from the Open
  > Document standard. It is somewhat understandable that they don't want to
  > allow modified versions of the standard, but that makes these schemas
  > non-free.

In the short term, I think we need to delete them, but we can try
asking the committee to liberate the code of those schemas under
other names.

What role do these particular schemas play in the standard?
Are they examples?  Are they used by the standards documents?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-22  6:06                                           ` Richard Stallman
@ 2021-01-22  9:43                                             ` Ulrich Mueller
  2021-01-24  6:35                                               ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-22  9:43 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Fri, 22 Jan 2021, Richard Stallman wrote:

>> In the concrete case, I believe the RNG schemas were taken from the Open
>> Document standard. It is somewhat understandable that they don't want to
>> allow modified versions of the standard, but that makes these schemas
>> non-free.

> In the short term, I think we need to delete them, but we can try
> asking the committee to liberate the code of those schemas under
> other names.

> What role do these particular schemas play in the standard?
> Are they examples?  Are they used by the standards documents?

It's not entirely clear to me if they're considered part of the
standard. They are referenced in [1] under "Related work", but it also
says that "This specification consists of this document as well as the
following documents, schemas and ontologies".

[1] http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.html



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-22  9:43                                             ` Ulrich Mueller
@ 2021-01-24  6:35                                               ` Richard Stallman
  2021-01-24  8:34                                                 ` Ulrich Mueller
  2021-01-24 10:53                                                 ` Org schemas we talked to be non-free, was: " Jean Louis
  0 siblings, 2 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-24  6:35 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > What role do these particular schemas play in the standard?
  > > Are they examples?  Are they used by the standards documents?

  > It's not entirely clear to me if they're considered part of the
  > standard.

It sounds like they are either examples or part of the standard
and we cannot tell which.  Is that right?

Do users actually use them?

  > says that "This specification consists of this document as well as the
  > following documents, schemas and ontologies".

I presume that is followed by a list of documents, schemas and ontologies.
Could you please send me that list?  Without that, I don't see
what this implies.

  > [1] http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.html

I will fetch a copy.

Would you please send me (off the list) one of these schemas so I can
see what a typical schema looks like?

Also, what is the relationship between Org mode and these schemes?
How does it use them or operate on them?  What does it do with them?
What does it do if a document refers to a scheme and the schema is
not defined?

Do users ever modify the schemas for their own documents?
Do they distribute the modified schemas along with their documents?

Do users make their own schemas?  Do users release their own
schemas?  Are any user-released schemas free?

Do they expect users to actually use these specific schemas,
or are they only meant to show what a schema looks like
so you can write your own?

Do users often use these schemas, or do they usually make their own?

All these details of the context are crucial for finding a way to
address this problem which won't be too much work for us or too
painful for users.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-24  6:35                                               ` Richard Stallman
@ 2021-01-24  8:34                                                 ` Ulrich Mueller
  2021-01-25  5:53                                                   ` Richard Stallman
  2021-01-24 10:53                                                 ` Org schemas we talked to be non-free, was: " Jean Louis
  1 sibling, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-24  8:34 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Sun, 24 Jan 2021, Richard Stallman wrote:

>> > What role do these particular schemas play in the standard?
>> > Are they examples?  Are they used by the standards documents?

>> It's not entirely clear to me if they're considered part of the
>> standard.

> It sounds like they are either examples or part of the standard
> and we cannot tell which.  Is that right?

At least I couldn't tell.

> Do users actually use them?

AFAICS, ox-odt.el uses them together with nxml-mode for auto-validation
of OpenDocument files. So they are useful.

Interestingly, the docstring of the org-odt-schema-dir variable contains
the following note, indicating that the files weren't meant to be
packaged:

   The OASIS schema files are available only in the org's private git
   repository.  It is *not* bundled with GNU ELPA tar or standard Emacs
   distribution.

Still, I think it would be preferable if upstream released them under a
free license.

>> says that "This specification consists of this document as well as the
>> following documents, schemas and ontologies".

> I presume that is followed by a list of documents, schemas and ontologies.
> Could you please send me that list?  Without that, I don't see
> what this implies.

>> [1] http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.html

> I will fetch a copy.

> Would you please send me (off the list) one of these schemas so I can
> see what a typical schema looks like?

I'll send it off-list.

> Also, what is the relationship between Org mode and these schemes?
> How does it use them or operate on them?  What does it do with them?
> What does it do if a document refers to a scheme and the schema is
> not defined?

See above, they're used by ox-odt.el. AFAICT, nothing catastrophic will
happen if a schema is missing, but validation of documents would be no
longer possible.

> Do users ever modify the schemas for their own documents?
> Do they distribute the modified schemas along with their documents?

I don't think so. OpenDocument is a standardised format, so modifying
its schemas would make little sense for interoperability.

> Do users make their own schemas?  Do users release their own
> schemas?  Are any user-released schemas free?

Users can create their own schemas for their own types of XML documents
(which aren't necessarily related to OpenDocument), and they can release
them under any license they want.

> Do they expect users to actually use these specific schemas,
> or are they only meant to show what a schema looks like
> so you can write your own?

> Do users often use these schemas, or do they usually make their own?

My explanations above should answer these questions.

> All these details of the context are crucial for finding a way to
> address this problem which won't be too much work for us or too
> painful for users.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24  6:35                                               ` Richard Stallman
  2021-01-24  8:34                                                 ` Ulrich Mueller
@ 2021-01-24 10:53                                                 ` Jean Louis
  2021-01-24 17:50                                                   ` Ulrich Mueller
  1 sibling, 1 reply; 139+ messages in thread
From: Jean Louis @ 2021-01-24 10:53 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Ulrich Mueller, dgutov, ams, arthur.miller, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 777 bytes --]

* Richard Stallman <rms@gnu.org> [2021-01-24 09:36]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > > What role do these particular schemas play in the standard?
>   > > Are they examples?  Are they used by the standards documents?
> 
>   > It's not entirely clear to me if they're considered part of the
>   > standard.
> 
> It sounds like they are either examples or part of the standard
> and we cannot tell which.  Is that right?

Schemas are attached.

I see copyright notices inside and it appears to be fully free
document modifiable and distributable as long as copyrights remains.

Jean

[-- Attachment #2: od-manifest-schema-v1.2-os.rnc --]
[-- Type: text/plain, Size: 3815 bytes --]

# Open Document Format for Office Applications (OpenDocument) Version 1.2
# OASIS Standard, 29 September 2011
# Manifest Relax-NG Schema
# Source: http://docs.oasis-open.org/office/v1.2/os/
# Copyright (c) OASIS Open 2002-2011, 2013. All Rights Reserved.
#
# All capitalized terms in the following text have the meanings assigned to them
# in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
# full Policy may be found at the OASIS website.
#
# This document and translations of it may be copied and furnished to others, and
# derivative works that comment on or otherwise explain it or assist in its
# implementation may be prepared, copied, published, and distributed, in whole or
# in part, without restriction of any kind, provided that the above copyright
# notice and this section are included on all such copies and derivative works.
# However, this document itself may not be modified in any way, including by
# removing the copyright notice or references to OASIS, except as needed for the
# purpose of developing any document or deliverable produced by an OASIS
# Technical Committee (in which case the rules applicable to copyrights, as set
# forth in the OASIS IPR Policy, must be followed) or as required to translate it
# into languages other than English.
#
# The limited permissions granted above are perpetual and will not be revoked by
# OASIS or its successors or assigns.
#
# This document and the information contained herein is provided on an "AS IS"
# basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
# INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
# FITNESS FOR A PARTICULAR PURPOSE.

namespace manifest =
  "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"

start = manifest
manifest = element manifest:manifest { manifest-attlist, file-entry+ }
manifest-attlist = attribute manifest:version { "1.2" }
file-entry =
  element manifest:file-entry { file-entry-attlist, encryption-data? }
file-entry-attlist =
  attribute manifest:full-path { \string }
  & attribute manifest:size { nonNegativeInteger }?
  & attribute manifest:media-type { \string }
  & attribute manifest:preferred-view-mode {
      "edit" | "presentation-slide-show" | "read-only" | namespacedToken
    }?
  & attribute manifest:version { \string }?
encryption-data =
  element manifest:encryption-data {
    encryption-data-attlist,
    algorithm,
    start-key-generation?,
    key-derivation
  }
encryption-data-attlist =
  attribute manifest:checksum-type { "SHA1/1K" | anyURI }
  & attribute manifest:checksum { base64Binary }
algorithm =
  element manifest:algorithm { algorithm-attlist, anyElements }
algorithm-attlist =
  attribute manifest:algorithm-name { "Blowfish CFB" | anyURI }
  & attribute manifest:initialisation-vector { base64Binary }
anyAttListOrElements =
  attribute * { text }*,
  anyElements
anyElements =
  element * {
    mixed { anyAttListOrElements }
  }*
key-derivation =
  element manifest:key-derivation { key-derivation-attlist, empty }
key-derivation-attlist =
  attribute manifest:key-derivation-name { "PBKDF2" | anyURI }
  & attribute manifest:salt { base64Binary }
  & attribute manifest:iteration-count { nonNegativeInteger }
  & attribute manifest:key-size { nonNegativeInteger }?
start-key-generation =
  element manifest:start-key-generation {
    start-key-generation-attlist, empty
  }
start-key-generation-attlist =
  attribute manifest:start-key-generation-name { "SHA1" | anyURI }
  & attribute manifest:key-size { nonNegativeInteger }?
base64Binary = xsd:base64Binary
namespacedToken = xsd:QName { pattern = "[^:]+:[^:]+" }
nonNegativeInteger = xsd:nonNegativeInteger
\string = xsd:string
anyURI = xsd:anyURI

[-- Attachment #3: od-schema-v1.2-os.rnc --]
[-- Type: text/plain, Size: 213760 bytes --]

# Open Document Format for Office Applications (OpenDocument) Version 1.2
# OASIS Standard, 29 September 2011
# Relax-NG Schema
# Source: http://docs.oasis-open.org/office/v1.2/os/
# Copyright (c) OASIS Open 2002-2011, 2013. All Rights Reserved.
#
# All capitalized terms in the following text have the meanings assigned to them
# in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
# full Policy may be found at the OASIS website.
#
# This document and translations of it may be copied and furnished to others, and
# derivative works that comment on or otherwise explain it or assist in its
# implementation may be prepared, copied, published, and distributed, in whole or
# in part, without restriction of any kind, provided that the above copyright
# notice and this section are included on all such copies and derivative works.
# However, this document itself may not be modified in any way, including by
# removing the copyright notice or references to OASIS, except as needed for the
# purpose of developing any document or deliverable produced by an OASIS
# Technical Committee (in which case the rules applicable to copyrights, as set
# forth in the OASIS IPR Policy, must be followed) or as required to translate it
# into languages other than English.
#
# The limited permissions granted above are perpetual and will not be revoked by
# OASIS or its successors or assigns.
#
# This document and the information contained herein is provided on an "AS IS"
# basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
# INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
# FITNESS FOR A PARTICULAR PURPOSE.

namespace anim = "urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
namespace chart = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
namespace config = "urn:oasis:names:tc:opendocument:xmlns:config:1.0"
namespace db = "urn:oasis:names:tc:opendocument:xmlns:database:1.0"
namespace dc = "http://purl.org/dc/elements/1.1/"
namespace dr3d = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
namespace draw = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
namespace fo =
  "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
namespace form = "urn:oasis:names:tc:opendocument:xmlns:form:1.0"
namespace grddl = "http://www.w3.org/2003/g/data-view#"
namespace math = "http://www.w3.org/1998/Math/MathML"
namespace meta = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
namespace number = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
namespace office = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"
namespace presentation =
  "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
namespace script = "urn:oasis:names:tc:opendocument:xmlns:script:1.0"
namespace smil =
  "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"
namespace style = "urn:oasis:names:tc:opendocument:xmlns:style:1.0"
namespace svg =
  "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
namespace table = "urn:oasis:names:tc:opendocument:xmlns:table:1.0"
namespace text = "urn:oasis:names:tc:opendocument:xmlns:text:1.0"
namespace xforms = "http://www.w3.org/2002/xforms"
namespace xhtml = "http://www.w3.org/1999/xhtml"
namespace xlink = "http://www.w3.org/1999/xlink"

office-process-content = attribute office:process-content { boolean }?
start =
  office-document
  | office-document-content
  | office-document-styles
  | office-document-meta
  | office-document-settings
office-document =
  element office:document {
    office-document-attrs,
    office-document-common-attrs,
    office-meta,
    office-settings,
    office-scripts,
    office-font-face-decls,
    office-styles,
    office-automatic-styles,
    office-master-styles,
    office-body
  }
office-document-content =
  element office:document-content {
    office-document-common-attrs,
    office-scripts,
    office-font-face-decls,
    office-automatic-styles,
    office-body
  }
office-document-styles =
  element office:document-styles {
    office-document-common-attrs,
    office-font-face-decls,
    office-styles,
    office-automatic-styles,
    office-master-styles
  }
office-document-meta =
  element office:document-meta {
    office-document-common-attrs, office-meta
  }
office-document-settings =
  element office:document-settings {
    office-document-common-attrs, office-settings
  }
office-document-common-attrs =
  attribute office:version { "1.2" }
  & attribute grddl:transformation {
      list { anyIRI* }
    }?
office-document-attrs = attribute office:mimetype { \string }
office-meta = element office:meta { office-meta-content-strict }?
office-meta-content-strict = office-meta-data*
office-body = element office:body { office-body-content }
office-body-content =
  element office:text {
    office-text-attlist,
    office-text-content-prelude,
    office-text-content-main,
    office-text-content-epilogue
  }
  | element office:drawing {
      office-drawing-attlist,
      office-drawing-content-prelude,
      office-drawing-content-main,
      office-drawing-content-epilogue
    }
  | element office:presentation {
      office-presentation-attlist,
      office-presentation-content-prelude,
      office-presentation-content-main,
      office-presentation-content-epilogue
    }
  | element office:spreadsheet {
      office-spreadsheet-attlist,
      office-spreadsheet-content-prelude,
      office-spreadsheet-content-main,
      office-spreadsheet-content-epilogue
    }
  | element office:chart {
      office-chart-attlist,
      office-chart-content-prelude,
      office-chart-content-main,
      office-chart-content-epilogue
    }
  | element office:image {
      office-image-attlist,
      office-image-content-prelude,
      office-image-content-main,
      office-image-content-epilogue
    }
  | office-database
office-text-content-prelude =
  office-forms, text-tracked-changes, text-decls, table-decls
office-text-content-main =
  text-content*
  | (text-page-sequence, (shape)*)
text-content =
  text-h
  | text-p
  | text-list
  | text-numbered-paragraph
  | table-table
  | text-section
  | text-soft-page-break
  | text-table-of-content
  | text-illustration-index
  | text-table-index
  | text-object-index
  | text-user-index
  | text-alphabetical-index
  | text-bibliography
  | shape
  | change-marks
office-text-content-epilogue = table-functions
office-text-attlist =
  attribute text:global { boolean }?
  & attribute text:use-soft-page-breaks { boolean }?
office-drawing-attlist = empty
office-drawing-content-prelude = text-decls, table-decls
office-drawing-content-main = draw-page*
office-drawing-content-epilogue = table-functions
office-presentation-attlist = empty
office-presentation-content-prelude =
  text-decls, table-decls, presentation-decls
office-presentation-content-main = draw-page*
office-presentation-content-epilogue =
  presentation-settings, table-functions
office-spreadsheet-content-prelude =
  table-tracked-changes?, text-decls, table-decls
table-decls =
  table-calculation-settings?,
  table-content-validations?,
  table-label-ranges?
office-spreadsheet-content-main = table-table*
office-spreadsheet-content-epilogue = table-functions
table-functions =
  table-named-expressions?,
  table-database-ranges?,
  table-data-pilot-tables?,
  table-consolidation?,
  table-dde-links?
office-chart-attlist = empty
office-chart-content-prelude = text-decls, table-decls
office-chart-content-main = chart-chart
office-chart-content-epilogue = table-functions
office-image-attlist = empty
office-image-content-prelude = empty
office-image-content-main = draw-frame
office-image-content-epilogue = empty
office-settings = element office:settings { config-config-item-set+ }?
config-config-item-set =
  element config:config-item-set {
    config-config-item-set-attlist, config-items
  }
config-items =
  (config-config-item
   | config-config-item-set
   | config-config-item-map-named
   | config-config-item-map-indexed)+
config-config-item-set-attlist = attribute config:name { \string }
config-config-item =
  element config:config-item { config-config-item-attlist, text }
config-config-item-attlist =
  attribute config:name { \string }
  & attribute config:type {
      "boolean"
      | "short"
      | "int"
      | "long"
      | "double"
      | "string"
      | "datetime"
      | "base64Binary"
    }
config-config-item-map-indexed =
  element config:config-item-map-indexed {
    config-config-item-map-indexed-attlist,
    config-config-item-map-entry+
  }
config-config-item-map-indexed-attlist =
  attribute config:name { \string }
config-config-item-map-entry =
  element config:config-item-map-entry {
    config-config-item-map-entry-attlist, config-items
  }
config-config-item-map-entry-attlist =
  attribute config:name { \string }?
config-config-item-map-named =
  element config:config-item-map-named {
    config-config-item-map-named-attlist, config-config-item-map-entry+
  }
config-config-item-map-named-attlist = attribute config:name { \string }
office-scripts =
  element office:scripts { office-script*, office-event-listeners? }?
office-script =
  element office:script {
    office-script-attlist,
    mixed { anyElements }
  }
office-script-attlist = attribute script:language { \string }
office-font-face-decls =
  element office:font-face-decls { style-font-face* }?
office-styles =
  element office:styles {
    styles
    & style-default-style*
    & style-default-page-layout?
    & text-outline-style?
    & text-notes-configuration*
    & text-bibliography-configuration?
    & text-linenumbering-configuration?
    & draw-gradient*
    & svg-linearGradient*
    & svg-radialGradient*
    & draw-hatch*
    & draw-fill-image*
    & draw-marker*
    & draw-stroke-dash*
    & draw-opacity*
    & style-presentation-page-layout*
    & table-table-template*
  }?
office-automatic-styles =
  element office:automatic-styles { styles & style-page-layout* }?
office-master-styles =
  element office:master-styles {
    style-master-page* & style-handout-master? & draw-layer-set?
  }?
styles =
  style-style*
  & text-list-style*
  & number-number-style*
  & number-currency-style*
  & number-percentage-style*
  & number-date-style*
  & number-time-style*
  & number-boolean-style*
  & number-text-style*
office-meta-data =
  element meta:generator { \string }
  | element dc:title { \string }
  | element dc:description { \string }
  | element dc:subject { \string }
  | element meta:keyword { \string }
  | element meta:initial-creator { \string }
  | dc-creator
  | element meta:printed-by { \string }
  | element meta:creation-date { dateTime }
  | dc-date
  | element meta:print-date { dateTime }
  | element meta:template {
      attribute xlink:type { "simple" },
      attribute xlink:href { anyIRI },
      attribute xlink:actuate { "onRequest" }?,
      attribute xlink:title { \string }?,
      attribute meta:date { dateTime }?
    }
  | element meta:auto-reload {
      (attribute xlink:type { "simple" },
       attribute xlink:href { anyIRI },
       attribute xlink:show { "replace" }?,
       attribute xlink:actuate { "onLoad" }?)?,
      attribute meta:delay { duration }?
    }
  | element meta:hyperlink-behaviour {
      attribute office:target-frame-name { targetFrameName }?,
      attribute xlink:show { "new" | "replace" }?
    }
  | element dc:language { language }
  | element meta:editing-cycles { nonNegativeInteger }
  | element meta:editing-duration { duration }
  | element meta:document-statistic {
      attribute meta:page-count { nonNegativeInteger }?,
      attribute meta:table-count { nonNegativeInteger }?,
      attribute meta:draw-count { nonNegativeInteger }?,
      attribute meta:image-count { nonNegativeInteger }?,
      attribute meta:ole-object-count { nonNegativeInteger }?,
      attribute meta:object-count { nonNegativeInteger }?,
      attribute meta:paragraph-count { nonNegativeInteger }?,
      attribute meta:word-count { nonNegativeInteger }?,
      attribute meta:character-count { nonNegativeInteger }?,
      attribute meta:frame-count { nonNegativeInteger }?,
      attribute meta:sentence-count { nonNegativeInteger }?,
      attribute meta:syllable-count { nonNegativeInteger }?,
      attribute meta:non-whitespace-character-count {
        nonNegativeInteger
      }?,
      attribute meta:row-count { nonNegativeInteger }?,
      attribute meta:cell-count { nonNegativeInteger }?
    }
  | element meta:user-defined {
      attribute meta:name { \string },
      ((attribute meta:value-type { "float" },
        double)
       | (attribute meta:value-type { "date" },
          dateOrDateTime)
       | (attribute meta:value-type { "time" },
          duration)
       | (attribute meta:value-type { "boolean" },
          boolean)
       | (attribute meta:value-type { "string" },
          \string)
       | text)
    }
dc-creator = element dc:creator { \string }
dc-date = element dc:date { dateTime }
text-h =
  element text:h {
    heading-attrs,
    paragraph-attrs,
    text-number?,
    paragraph-content-or-hyperlink*
  }
heading-attrs =
  attribute text:outline-level { positiveInteger }
  & attribute text:restart-numbering { boolean }?
  & attribute text:start-value { nonNegativeInteger }?
  & attribute text:is-list-header { boolean }?
text-number = element text:number { \string }
text-p =
  element text:p { paragraph-attrs, paragraph-content-or-hyperlink* }
paragraph-attrs =
  attribute text:style-name { styleNameRef }?
  & attribute text:class-names { styleNameRefs }?
  & attribute text:cond-style-name { styleNameRef }?
  & (xml-id,
     attribute text:id { NCName }?)?
  & common-in-content-meta-attlist?
text-page-sequence = element text:page-sequence { text-page+ }
text-page = element text:page { text-page-attlist, empty }
text-page-attlist = attribute text:master-page-name { styleNameRef }
text-list =
  element text:list {
    text-list-attr, text-list-header?, text-list-item*
  }
text-list-attr =
  attribute text:style-name { styleNameRef }?
  & attribute text:continue-numbering { boolean }?
  & attribute text:continue-list { IDREF }?
  & xml-id?
text-list-item =
  element text:list-item { text-list-item-attr, text-list-item-content }
text-list-item-content =
  text-number?, (text-p | text-h | text-list | text-soft-page-break)*
text-list-item-attr =
  attribute text:start-value { nonNegativeInteger }?
  & attribute text:style-override { styleNameRef }?
  & xml-id?
text-list-header =
  element text:list-header {
    text-list-header-attr, text-list-item-content
  }
text-list-header-attr = xml-id?
text-numbered-paragraph =
  element text:numbered-paragraph {
    text-numbered-paragraph-attr, text-number?, (text-p | text-h)
  }
text-numbered-paragraph-attr =
  attribute text:list-id { NCName }
  & attribute text:level { positiveInteger }?
  & (attribute text:style-name { styleNameRef },
     attribute text:continue-numbering { boolean },
     attribute text:start-value { nonNegativeInteger })?
  & xml-id?
text-section =
  element text:section {
    text-section-attlist,
    (text-section-source | text-section-source-dde | empty),
    text-content*
  }
text-section-attlist =
  common-section-attlist
  & (attribute text:display { "true" | "none" }
     | (attribute text:display { "condition" },
        attribute text:condition { \string })
     | empty)
common-section-attlist =
  attribute text:style-name { styleNameRef }?
  & attribute text:name { \string }
  & attribute text:protected { boolean }?
  & attribute text:protection-key { \string }?
  & attribute text:protection-key-digest-algorithm { anyIRI }?
  & xml-id?
text-section-source =
  element text:section-source { text-section-source-attr }
text-section-source-attr =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute xlink:show { "embed" }?)?
  & attribute text:section-name { \string }?
  & attribute text:filter-name { \string }?
text-section-source-dde = office-dde-source
text-tracked-changes =
  element text:tracked-changes {
    text-tracked-changes-attr, text-changed-region*
  }?
text-tracked-changes-attr = attribute text:track-changes { boolean }?
text-changed-region =
  element text:changed-region {
    text-changed-region-attr, text-changed-region-content
  }
text-changed-region-attr =
  xml-id,
  attribute text:id { NCName }?
text-changed-region-content =
  element text:insertion { office-change-info }
  | element text:deletion { office-change-info, text-content* }
  | element text:format-change { office-change-info }
change-marks =
  element text:change { change-mark-attr }
  | element text:change-start { change-mark-attr }
  | element text:change-end { change-mark-attr }
change-mark-attr = attribute text:change-id { IDREF }
text-soft-page-break = element text:soft-page-break { empty }
text-decls =
  element text:variable-decls { text-variable-decl* }?,
  element text:sequence-decls { text-sequence-decl* }?,
  element text:user-field-decls { text-user-field-decl* }?,
  element text:dde-connection-decls { text-dde-connection-decl* }?,
  text-alphabetical-index-auto-mark-file?
paragraph-content-or-hyperlink = paragraph-content | text-a
paragraph-content =
  text
  | element text:s {
      attribute text:c { nonNegativeInteger }?
    }
  | element text:tab { text-tab-attr }
  | element text:line-break { empty }
  | text-soft-page-break
  | element text:span {
      attribute text:style-name { styleNameRef }?,
      attribute text:class-names { styleNameRefs }?,
      paragraph-content-or-hyperlink*
    }
  | element text:meta {
      text-meta-attlist, paragraph-content-or-hyperlink*
    }
  | (text-bookmark | text-bookmark-start | text-bookmark-end)
  | element text:reference-mark {
      attribute text:name { \string }
    }
  | (element text:reference-mark-start {
       attribute text:name { \string }
     }
     | element text:reference-mark-end {
         attribute text:name { \string }
       })
  | element text:note {
      text-note-class,
      attribute text:id { \string }?,
      element text:note-citation {
        attribute text:label { \string }?,
        text
      },
      element text:note-body { text-content* }
    }
  | element text:ruby {
      attribute text:style-name { styleNameRef }?,
      element text:ruby-base { paragraph-content-or-hyperlink* },
      element text:ruby-text {
        attribute text:style-name { styleNameRef }?,
        text
      }
    }
  | (office-annotation | office-annotation-end)
  | change-marks
  | shape
  | element text:date { text-date-attlist, text }
  | element text:time { text-time-attlist, text }
  | element text:page-number { text-page-number-attlist, text }
  | element text:page-continuation {
      text-page-continuation-attlist, text
    }
  | element text:sender-firstname { common-field-fixed-attlist, text }
  | element text:sender-lastname { common-field-fixed-attlist, text }
  | element text:sender-initials { common-field-fixed-attlist, text }
  | element text:sender-title { common-field-fixed-attlist, text }
  | element text:sender-position { common-field-fixed-attlist, text }
  | element text:sender-email { common-field-fixed-attlist, text }
  | element text:sender-phone-private {
      common-field-fixed-attlist, text
    }
  | element text:sender-fax { common-field-fixed-attlist, text }
  | element text:sender-company { common-field-fixed-attlist, text }
  | element text:sender-phone-work { common-field-fixed-attlist, text }
  | element text:sender-street { common-field-fixed-attlist, text }
  | element text:sender-city { common-field-fixed-attlist, text }
  | element text:sender-postal-code { common-field-fixed-attlist, text }
  | element text:sender-country { common-field-fixed-attlist, text }
  | element text:sender-state-or-province {
      common-field-fixed-attlist, text
    }
  | element text:author-name { common-field-fixed-attlist, text }
  | element text:author-initials { common-field-fixed-attlist, text }
  | element text:chapter { text-chapter-attlist, text }
  | element text:file-name { text-file-name-attlist, text }
  | element text:template-name { text-template-name-attlist, text }
  | element text:sheet-name { text }
  | element text:variable-set {
      (common-field-name-attlist
       & common-field-formula-attlist
       & common-value-and-type-attlist
       & common-field-display-value-none-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:variable-get {
      (common-field-name-attlist
       & common-field-display-value-formula-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:variable-input {
      (common-field-name-attlist
       & common-field-description-attlist
       & common-value-type-attlist
       & common-field-display-value-none-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:user-field-get {
      (common-field-name-attlist
       & common-field-display-value-formula-none-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:user-field-input {
      (common-field-name-attlist
       & common-field-description-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:sequence {
      (common-field-name-attlist
       & common-field-formula-attlist
       & common-field-num-format-attlist
       & text-sequence-ref-name),
      text
    }
  | element text:expression {
      (common-field-formula-attlist
       & common-value-and-type-attlist?
       & common-field-display-value-formula-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:text-input { common-field-description-attlist, text }
  | element text:initial-creator { common-field-fixed-attlist, text }
  | element text:creation-date {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:date-value { dateOrDateTime }?),
      text
    }
  | element text:creation-time {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:time-value { timeOrDateTime }?),
      text
    }
  | element text:description { common-field-fixed-attlist, text }
  | element text:user-defined {
      (common-field-fixed-attlist
       & attribute text:name { \string }
       & common-field-data-style-name-attlist
       & attribute office:value { double }?
       & attribute office:date-value { dateOrDateTime }?
       & attribute office:time-value { duration }?
       & attribute office:boolean-value { boolean }?
       & attribute office:string-value { \string }?),
      text
    }
  | element text:print-time {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:time-value { time }?),
      text
    }
  | element text:print-date {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:date-value { date }?),
      text
    }
  | element text:printed-by { common-field-fixed-attlist, text }
  | element text:title { common-field-fixed-attlist, text }
  | element text:subject { common-field-fixed-attlist, text }
  | element text:keywords { common-field-fixed-attlist, text }
  | element text:editing-cycles { common-field-fixed-attlist, text }
  | element text:editing-duration {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:duration { duration }?),
      text
    }
  | element text:modification-time {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:time-value { time }?),
      text
    }
  | element text:modification-date {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:date-value { date }?),
      text
    }
  | element text:creator { common-field-fixed-attlist, text }
  | element text:page-count
            | text:paragraph-count
            | text:word-count
            | text:character-count
            | text:table-count
            | text:image-count
            | text:object-count {
      common-field-num-format-attlist, text
    }
  | element text:database-display {
      text-database-display-attlist, text
    }
  | element text:database-next { text-database-next-attlist }
  | element text:database-row-select {
      text-database-row-select-attlist
    }
  | element text:database-row-number {
      (common-field-database-table
       & common-field-num-format-attlist
       & attribute text:value { nonNegativeInteger }?),
      text
    }
  | element text:database-name { common-field-database-table, text }
  | element text:page-variable-set {
      text-set-page-variable-attlist, text
    }
  | element text:page-variable-get {
      text-get-page-variable-attlist, text
    }
  | element text:placeholder { text-placeholder-attlist, text }
  | element text:conditional-text {
      text-conditional-text-attlist, text
    }
  | element text:hidden-text { text-hidden-text-attlist, text }
  | element text:reference-ref | text:bookmark-ref {
      text-common-ref-content & text-bookmark-ref-content
    }
  | element text:note-ref {
      text-common-ref-content & text-note-ref-content
    }
  | element text:sequence-ref {
      text-common-ref-content & text-sequence-ref-content
    }
  | element text:script {
      ((attribute xlink:type { "simple" },
        attribute xlink:href { anyIRI })
       | text)
      & attribute script:language { \string }?
    }
  | element text:execute-macro {
      attribute text:name { \string }?,
      office-event-listeners?,
      text
    }
  | element text:hidden-paragraph {
      text-hidden-paragraph-attlist, text
    }
  | element text:dde-connection {
      attribute text:connection-name { \string },
      text
    }
  | element text:measure {
      attribute text:kind { "value" | "unit" | "gap" },
      text
    }
  | element text:table-formula {
      (common-field-formula-attlist
       & common-field-display-value-formula-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:meta-field {
      text-meta-field-attlist, paragraph-content-or-hyperlink*
    }
  | element text:toc-mark-start { text-toc-mark-start-attrs }
  | element text:toc-mark-end { text-id }
  | element text:toc-mark {
      attribute text:string-value { \string },
      text-outline-level
    }
  | element text:user-index-mark-start {
      text-id, text-outline-level, text-index-name
    }
  | element text:user-index-mark-end { text-id }
  | element text:user-index-mark {
      attribute text:string-value { \string },
      text-outline-level,
      text-index-name
    }
  | element text:alphabetical-index-mark-start {
      text-id, text-alphabetical-index-mark-attrs
    }
  | element text:alphabetical-index-mark-end { text-id }
  | element text:alphabetical-index-mark {
      attribute text:string-value { \string },
      text-alphabetical-index-mark-attrs
    }
  | element text:bibliography-mark {
      attribute text:bibliography-type { text-bibliography-types },
      attribute text:identifier
                | text:address
                | text:annote
                | text:author
                | text:booktitle
                | text:chapter
                | text:edition
                | text:editor
                | text:howpublished
                | text:institution
                | text:journal
                | text:month
                | text:note
                | text:number
                | text:organizations
                | text:pages
                | text:publisher
                | text:school
                | text:series
                | text:title
                | text:report-type
                | text:volume
                | text:year
                | text:url
                | text:custom1
                | text:custom2
                | text:custom3
                | text:custom4
                | text:custom5
                | text:isbn
                | text:issn { \string }*,
      text
    }
  | element presentation:header { empty }
  | element presentation:footer { empty }
  | element presentation:date-time { empty }
text-tab-attr = attribute text:tab-ref { nonNegativeInteger }?
text-a =
  element text:a {
    text-a-attlist, office-event-listeners?, paragraph-content*
  }
text-a-attlist =
  attribute office:name { \string }?
  & attribute office:title { \string }?
  & attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute xlink:actuate { "onRequest" }?
  & attribute office:target-frame-name { targetFrameName }?
  & attribute xlink:show { "new" | "replace" }?
  & attribute text:style-name { styleNameRef }?
  & attribute text:visited-style-name { styleNameRef }?
text-meta-attlist = common-in-content-meta-attlist? & xml-id?
text-bookmark = element text:bookmark { text-bookmark-attlist, empty }
text-bookmark-start =
  element text:bookmark-start { text-bookmark-start-attlist, empty }
text-bookmark-end =
  element text:bookmark-end { text-bookmark-end-attlist, empty }
text-bookmark-attlist =
  attribute text:name { \string }
  & xml-id?
text-bookmark-start-attlist =
  attribute text:name { \string }
  & xml-id?
  & common-in-content-meta-attlist?
text-bookmark-end-attlist = attribute text:name { \string }
text-note-class = attribute text:note-class { "footnote" | "endnote" }
text-date-attlist =
  (common-field-fixed-attlist & common-field-data-style-name-attlist)
  & attribute text:date-value { dateOrDateTime }?
  & attribute text:date-adjust { duration }?
text-time-attlist =
  (common-field-fixed-attlist & common-field-data-style-name-attlist)
  & attribute text:time-value { timeOrDateTime }?
  & attribute text:time-adjust { duration }?
text-page-number-attlist =
  (common-field-num-format-attlist & common-field-fixed-attlist)
  & attribute text:page-adjust { integer }?
  & attribute text:select-page { "previous" | "current" | "next" }?
text-page-continuation-attlist =
  attribute text:select-page { "previous" | "next" }
  & attribute text:string-value { \string }?
text-chapter-attlist =
  attribute text:display {
    "name"
    | "number"
    | "number-and-name"
    | "plain-number-and-name"
    | "plain-number"
  }
  & attribute text:outline-level { nonNegativeInteger }
text-file-name-attlist =
  attribute text:display {
    "full" | "path" | "name" | "name-and-extension"
  }?
  & common-field-fixed-attlist
text-template-name-attlist =
  attribute text:display {
    "full" | "path" | "name" | "name-and-extension" | "area" | "title"
  }?
text-variable-decl =
  element text:variable-decl {
    common-field-name-attlist, common-value-type-attlist
  }
text-user-field-decl =
  element text:user-field-decl {
    common-field-name-attlist,
    common-field-formula-attlist?,
    common-value-and-type-attlist
  }
text-sequence-decl =
  element text:sequence-decl { text-sequence-decl-attlist }
text-sequence-decl-attlist =
  common-field-name-attlist
  & attribute text:display-outline-level { nonNegativeInteger }
  & attribute text:separation-character { character }?
text-sequence-ref-name = attribute text:ref-name { \string }?
common-field-database-table =
  common-field-database-table-attlist, common-field-database-name
common-field-database-name =
  attribute text:database-name { \string }?
  | form-connection-resource
common-field-database-table-attlist =
  attribute text:table-name { \string }
  & attribute text:table-type { "table" | "query" | "command" }?
text-database-display-attlist =
  common-field-database-table
  & common-field-data-style-name-attlist
  & attribute text:column-name { \string }
text-database-next-attlist =
  common-field-database-table
  & attribute text:condition { \string }?
text-database-row-select-attlist =
  common-field-database-table
  & attribute text:condition { \string }?
  & attribute text:row-number { nonNegativeInteger }?
text-set-page-variable-attlist =
  attribute text:active { boolean }?
  & attribute text:page-adjust { integer }?
text-get-page-variable-attlist = common-field-num-format-attlist
text-placeholder-attlist =
  attribute text:placeholder-type {
    "text" | "table" | "text-box" | "image" | "object"
  }
  & common-field-description-attlist
text-conditional-text-attlist =
  attribute text:condition { \string }
  & attribute text:string-value-if-true { \string }
  & attribute text:string-value-if-false { \string }
  & attribute text:current-value { boolean }?
text-hidden-text-attlist =
  attribute text:condition { \string }
  & attribute text:string-value { \string }
  & attribute text:is-hidden { boolean }?
text-common-ref-content =
  text
  & attribute text:ref-name { \string }?
text-bookmark-ref-content =
  attribute text:reference-format {
    common-ref-format-values
    | "number-no-superior"
    | "number-all-superior"
    | "number"
  }?
text-note-ref-content =
  attribute text:reference-format { common-ref-format-values }?
  & text-note-class
text-sequence-ref-content =
  attribute text:reference-format {
    common-ref-format-values
    | "category-and-value"
    | "caption"
    | "value"
  }?
common-ref-format-values = "page" | "chapter" | "direction" | "text"
text-hidden-paragraph-attlist =
  attribute text:condition { \string }
  & attribute text:is-hidden { boolean }?
text-meta-field-attlist = xml-id & common-field-data-style-name-attlist
common-value-type-attlist = attribute office:value-type { valueType }
common-value-and-type-attlist =
  (attribute office:value-type { "float" },
   attribute office:value { double })
  | (attribute office:value-type { "percentage" },
     attribute office:value { double })
  | (attribute office:value-type { "currency" },
     attribute office:value { double },
     attribute office:currency { \string }?)
  | (attribute office:value-type { "date" },
     attribute office:date-value { dateOrDateTime })
  | (attribute office:value-type { "time" },
     attribute office:time-value { duration })
  | (attribute office:value-type { "boolean" },
     attribute office:boolean-value { boolean })
  | (attribute office:value-type { "string" },
     attribute office:string-value { \string }?)
common-field-fixed-attlist = attribute text:fixed { boolean }?
common-field-name-attlist = attribute text:name { variableName }
common-field-description-attlist =
  attribute text:description { \string }?
common-field-display-value-none-attlist =
  attribute text:display { "value" | "none" }?
common-field-display-value-formula-none-attlist =
  attribute text:display { "value" | "formula" | "none" }?
common-field-display-value-formula-attlist =
  attribute text:display { "value" | "formula" }?
common-field-formula-attlist = attribute text:formula { \string }?
common-field-data-style-name-attlist =
  attribute style:data-style-name { styleNameRef }?
common-field-num-format-attlist = common-num-format-attlist?
text-toc-mark-start-attrs = text-id, text-outline-level
text-outline-level = attribute text:outline-level { positiveInteger }?
text-id = attribute text:id { \string }
text-index-name = attribute text:index-name { \string }
text-alphabetical-index-mark-attrs =
  attribute text:key1 { \string }?
  & attribute text:key2 { \string }?
  & attribute text:string-value-phonetic { \string }?
  & attribute text:key1-phonetic { \string }?
  & attribute text:key2-phonetic { \string }?
  & attribute text:main-entry { boolean }?
text-bibliography-types =
  "article"
  | "book"
  | "booklet"
  | "conference"
  | "custom1"
  | "custom2"
  | "custom3"
  | "custom4"
  | "custom5"
  | "email"
  | "inbook"
  | "incollection"
  | "inproceedings"
  | "journal"
  | "manual"
  | "mastersthesis"
  | "misc"
  | "phdthesis"
  | "proceedings"
  | "techreport"
  | "unpublished"
  | "www"
text-index-body = element text:index-body { index-content-main* }
index-content-main = text-content | text-index-title
text-index-title =
  element text:index-title {
    common-section-attlist, index-content-main*
  }
text-table-of-content =
  element text:table-of-content {
    common-section-attlist,
    text-table-of-content-source,
    text-index-body
  }
text-table-of-content-source =
  element text:table-of-content-source {
    text-table-of-content-source-attlist,
    text-index-title-template?,
    text-table-of-content-entry-template*,
    text-index-source-styles*
  }
text-table-of-content-source-attlist =
  attribute text:outline-level { positiveInteger }?
  & attribute text:use-outline-level { boolean }?
  & attribute text:use-index-marks { boolean }?
  & attribute text:use-index-source-styles { boolean }?
  & attribute text:index-scope { "document" | "chapter" }?
  & attribute text:relative-tab-stop-position { boolean }?
text-table-of-content-entry-template =
  element text:table-of-content-entry-template {
    text-table-of-content-entry-template-attlist,
    text-table-of-content-children*
  }
text-table-of-content-children =
  text-index-entry-chapter
  | text-index-entry-page-number
  | text-index-entry-text
  | text-index-entry-span
  | text-index-entry-tab-stop
  | text-index-entry-link-start
  | text-index-entry-link-end
text-table-of-content-entry-template-attlist =
  attribute text:outline-level { positiveInteger }
  & attribute text:style-name { styleNameRef }
text-illustration-index =
  element text:illustration-index {
    common-section-attlist,
    text-illustration-index-source,
    text-index-body
  }
text-illustration-index-source =
  element text:illustration-index-source {
    text-illustration-index-source-attrs,
    text-index-title-template?,
    text-illustration-index-entry-template?
  }
text-illustration-index-source-attrs =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:use-caption { boolean }?
  & attribute text:caption-sequence-name { \string }?
  & attribute text:caption-sequence-format {
      "text" | "category-and-value" | "caption"
    }?
text-index-scope-attr =
  attribute text:index-scope { "document" | "chapter" }?
text-relative-tab-stop-position-attr =
  attribute text:relative-tab-stop-position { boolean }?
text-illustration-index-entry-template =
  element text:illustration-index-entry-template {
    text-illustration-index-entry-content
  }
text-illustration-index-entry-content =
  text-illustration-index-entry-template-attrs,
  (text-index-entry-chapter
   | text-index-entry-page-number
   | text-index-entry-text
   | text-index-entry-span
   | text-index-entry-tab-stop)*
text-illustration-index-entry-template-attrs =
  attribute text:style-name { styleNameRef }
text-table-index =
  element text:table-index {
    common-section-attlist, text-table-index-source, text-index-body
  }
text-table-index-source =
  element text:table-index-source {
    text-illustration-index-source-attrs,
    text-index-title-template?,
    text-table-index-entry-template?
  }
text-table-index-entry-template =
  element text:table-index-entry-template {
    text-illustration-index-entry-content
  }
text-object-index =
  element text:object-index {
    common-section-attlist, text-object-index-source, text-index-body
  }
text-object-index-source =
  element text:object-index-source {
    text-object-index-source-attrs,
    text-index-title-template?,
    text-object-index-entry-template?
  }
text-object-index-source-attrs =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:use-spreadsheet-objects { boolean }?
  & attribute text:use-math-objects { boolean }?
  & attribute text:use-draw-objects { boolean }?
  & attribute text:use-chart-objects { boolean }?
  & attribute text:use-other-objects { boolean }?
text-object-index-entry-template =
  element text:object-index-entry-template {
    text-illustration-index-entry-content
  }
text-user-index =
  element text:user-index {
    common-section-attlist, text-user-index-source, text-index-body
  }
text-user-index-source =
  element text:user-index-source {
    text-user-index-source-attr,
    text-index-title-template?,
    text-user-index-entry-template*,
    text-index-source-styles*
  }
text-user-index-source-attr =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:use-index-marks { boolean }?
  & attribute text:use-index-source-styles { boolean }?
  & attribute text:use-graphics { boolean }?
  & attribute text:use-tables { boolean }?
  & attribute text:use-floating-frames { boolean }?
  & attribute text:use-objects { boolean }?
  & attribute text:copy-outline-levels { boolean }?
  & attribute text:index-name { \string }
text-user-index-entry-template =
  element text:user-index-entry-template {
    text-user-index-entry-template-attrs,
    (text-index-entry-chapter
     | text-index-entry-page-number
     | text-index-entry-text
     | text-index-entry-span
     | text-index-entry-tab-stop)*
  }
text-user-index-entry-template-attrs =
  attribute text:outline-level { positiveInteger }
  & attribute text:style-name { styleNameRef }
text-alphabetical-index =
  element text:alphabetical-index {
    common-section-attlist,
    text-alphabetical-index-source,
    text-index-body
  }
text-alphabetical-index-source =
  element text:alphabetical-index-source {
    text-alphabetical-index-source-attrs,
    text-index-title-template?,
    text-alphabetical-index-entry-template*
  }
text-alphabetical-index-source-attrs =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:ignore-case { boolean }?
  & attribute text:main-entry-style-name { styleNameRef }?
  & attribute text:alphabetical-separators { boolean }?
  & attribute text:combine-entries { boolean }?
  & attribute text:combine-entries-with-dash { boolean }?
  & attribute text:combine-entries-with-pp { boolean }?
  & attribute text:use-keys-as-entries { boolean }?
  & attribute text:capitalize-entries { boolean }?
  & attribute text:comma-separated { boolean }?
  & attribute fo:language { languageCode }?
  & attribute fo:country { countryCode }?
  & attribute fo:script { scriptCode }?
  & attribute style:rfc-language-tag { language }?
  & attribute text:sort-algorithm { \string }?
text-alphabetical-index-auto-mark-file =
  element text:alphabetical-index-auto-mark-file {
    attribute xlink:type { "simple" },
    attribute xlink:href { anyIRI }
  }
text-alphabetical-index-entry-template =
  element text:alphabetical-index-entry-template {
    text-alphabetical-index-entry-template-attrs,
    (text-index-entry-chapter
     | text-index-entry-page-number
     | text-index-entry-text
     | text-index-entry-span
     | text-index-entry-tab-stop)*
  }
text-alphabetical-index-entry-template-attrs =
  attribute text:outline-level { "1" | "2" | "3" | "separator" }
  & attribute text:style-name { styleNameRef }
text-bibliography =
  element text:bibliography {
    common-section-attlist, text-bibliography-source, text-index-body
  }
text-bibliography-source =
  element text:bibliography-source {
    text-index-title-template?, text-bibliography-entry-template*
  }
text-bibliography-entry-template =
  element text:bibliography-entry-template {
    text-bibliography-entry-template-attrs,
    (text-index-entry-span
     | text-index-entry-tab-stop
     | text-index-entry-bibliography)*
  }
text-bibliography-entry-template-attrs =
  attribute text:bibliography-type { text-bibliography-types }
  & attribute text:style-name { styleNameRef }
text-index-source-styles =
  element text:index-source-styles {
    attribute text:outline-level { positiveInteger },
    text-index-source-style*
  }
text-index-source-style =
  element text:index-source-style {
    attribute text:style-name { styleName },
    empty
  }
text-index-title-template =
  element text:index-title-template {
    attribute text:style-name { styleNameRef }?,
    text
  }
text-index-entry-chapter =
  element text:index-entry-chapter {
    attribute text:style-name { styleNameRef }?,
    text-index-entry-chapter-attrs
  }
text-index-entry-chapter-attrs =
  attribute text:display {
    "name"
    | "number"
    | "number-and-name"
    | "plain-number"
    | "plain-number-and-name"
  }?
  & attribute text:outline-level { positiveInteger }?
text-index-entry-text =
  element text:index-entry-text {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-page-number =
  element text:index-entry-page-number {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-span =
  element text:index-entry-span {
    attribute text:style-name { styleNameRef }?,
    text
  }
text-index-entry-bibliography =
  element text:index-entry-bibliography {
    text-index-entry-bibliography-attrs
  }
text-index-entry-bibliography-attrs =
  attribute text:style-name { styleNameRef }?
  & attribute text:bibliography-data-field {
      "address"
      | "annote"
      | "author"
      | "bibliography-type"
      | "booktitle"
      | "chapter"
      | "custom1"
      | "custom2"
      | "custom3"
      | "custom4"
      | "custom5"
      | "edition"
      | "editor"
      | "howpublished"
      | "identifier"
      | "institution"
      | "isbn"
      | "issn"
      | "journal"
      | "month"
      | "note"
      | "number"
      | "organizations"
      | "pages"
      | "publisher"
      | "report-type"
      | "school"
      | "series"
      | "title"
      | "url"
      | "volume"
      | "year"
    }
text-index-entry-tab-stop =
  element text:index-entry-tab-stop {
    attribute text:style-name { styleNameRef }?,
    text-index-entry-tab-stop-attrs
  }
text-index-entry-tab-stop-attrs =
  attribute style:leader-char { character }?
  & (attribute style:type { "right" }
     | (attribute style:type { "left" },
        attribute style:position { length }))
text-index-entry-link-start =
  element text:index-entry-link-start {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-link-end =
  element text:index-entry-link-end {
    attribute text:style-name { styleNameRef }?
  }
table-table =
  element table:table {
    table-table-attlist,
    table-title?,
    table-desc?,
    table-table-source?,
    office-dde-source?,
    table-scenario?,
    office-forms?,
    table-shapes?,
    table-columns-and-groups,
    table-rows-and-groups,
    table-named-expressions?
  }
table-columns-and-groups =
  (table-table-column-group | table-columns-no-group)+
table-columns-no-group =
  (table-columns, (table-table-header-columns, table-columns?)?)
  | (table-table-header-columns, table-columns?)
table-columns = table-table-columns | table-table-column+
table-rows-and-groups = (table-table-row-group | table-rows-no-group)+
table-rows-no-group =
  (table-rows, (table-table-header-rows, table-rows?)?)
  | (table-table-header-rows, table-rows?)
table-rows =
  table-table-rows | (text-soft-page-break?, table-table-row)+
table-table-attlist =
  attribute table:name { \string }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:template-name { \string }?
  & attribute table:use-first-row-styles { boolean }?
  & attribute table:use-last-row-styles { boolean }?
  & attribute table:use-first-column-styles { boolean }?
  & attribute table:use-last-column-styles { boolean }?
  & attribute table:use-banding-rows-styles { boolean }?
  & attribute table:use-banding-columns-styles { boolean }?
  & attribute table:protected { boolean }?
  & attribute table:protection-key { \string }?
  & attribute table:protection-key-digest-algorithm { anyIRI }?
  & attribute table:print { boolean }?
  & attribute table:print-ranges { cellRangeAddressList }?
  & xml-id?
  & attribute table:is-sub-table { boolean }?
table-title = element table:title { text }
table-desc = element table:desc { text }
table-table-row =
  element table:table-row {
    table-table-row-attlist,
    (table-table-cell | table-covered-table-cell)+
  }
table-table-row-attlist =
  attribute table:number-rows-repeated { positiveInteger }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:default-cell-style-name { styleNameRef }?
  & attribute table:visibility { table-visibility-value }?
  & xml-id?
table-visibility-value = "visible" | "collapse" | "filter"
table-table-cell =
  element table:table-cell {
    table-table-cell-attlist,
    table-table-cell-attlist-extra,
    table-table-cell-content
  }
table-covered-table-cell =
  element table:covered-table-cell {
    table-table-cell-attlist, table-table-cell-content
  }
table-table-cell-content =
  table-cell-range-source?,
  office-annotation?,
  table-detective?,
  text-content*
table-table-cell-attlist =
  attribute table:number-columns-repeated { positiveInteger }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:content-validation-name { \string }?
  & attribute table:formula { \string }?
  & common-value-and-type-attlist?
  & attribute table:protect { boolean }?
  & attribute table:protected { boolean }?
  & xml-id?
  & common-in-content-meta-attlist?
table-table-cell-attlist-extra =
  attribute table:number-columns-spanned { positiveInteger }?
  & attribute table:number-rows-spanned { positiveInteger }?
  & attribute table:number-matrix-columns-spanned { positiveInteger }?
  & attribute table:number-matrix-rows-spanned { positiveInteger }?
table-table-column =
  element table:table-column { table-table-column-attlist, empty }
table-table-column-attlist =
  attribute table:number-columns-repeated { positiveInteger }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:visibility { table-visibility-value }?
  & attribute table:default-cell-style-name { styleNameRef }?
  & xml-id?
table-table-header-columns =
  element table:table-header-columns { table-table-column+ }
table-table-columns =
  element table:table-columns { table-table-column+ }
table-table-column-group =
  element table:table-column-group {
    table-table-column-group-attlist, table-columns-and-groups
  }
table-table-column-group-attlist = attribute table:display { boolean }?
table-table-header-rows =
  element table:table-header-rows {
    (text-soft-page-break?, table-table-row)+
  }
table-table-rows =
  element table:table-rows { (text-soft-page-break?, table-table-row)+ }
table-table-row-group =
  element table:table-row-group {
    table-table-row-group-attlist, table-rows-and-groups
  }
table-table-row-group-attlist = attribute table:display { boolean }?
cellAddress =
  xsd:string {
    pattern = "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+"
  }
cellRangeAddress =
  xsd:string {
    pattern =
      "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)?"
  }
  | xsd:string {
      pattern =
        "($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+:($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+"
    }
  | xsd:string {
      pattern =
        "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+"
    }
cellRangeAddressList =
  xsd:string
  >> dc:description [
       'Value is a space separated list of "cellRangeAddress" patterns'
     ]
table-table-source =
  element table:table-source {
    table-table-source-attlist, table-linked-source-attlist, empty
  }
table-table-source-attlist =
  attribute table:mode { "copy-all" | "copy-results-only" }?
  & attribute table:table-name { \string }?
table-linked-source-attlist =
  attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute xlink:actuate { "onRequest" }?
  & attribute table:filter-name { \string }?
  & attribute table:filter-options { \string }?
  & attribute table:refresh-delay { duration }?
table-scenario =
  element table:scenario { table-scenario-attlist, empty }
table-scenario-attlist =
  attribute table:scenario-ranges { cellRangeAddressList }
  & attribute table:is-active { boolean }
  & attribute table:display-border { boolean }?
  & attribute table:border-color { color }?
  & attribute table:copy-back { boolean }?
  & attribute table:copy-styles { boolean }?
  & attribute table:copy-formulas { boolean }?
  & attribute table:comment { \string }?
  & attribute table:protected { boolean }?
table-shapes = element table:shapes { shape+ }
table-cell-range-source =
  element table:cell-range-source {
    table-table-cell-range-source-attlist,
    table-linked-source-attlist,
    empty
  }
table-table-cell-range-source-attlist =
  attribute table:name { \string }
  & attribute table:last-column-spanned { positiveInteger }
  & attribute table:last-row-spanned { positiveInteger }
table-detective =
  element table:detective { table-highlighted-range*, table-operation* }
table-operation =
  element table:operation { table-operation-attlist, empty }
table-operation-attlist =
  attribute table:name {
    "trace-dependents"
    | "remove-dependents"
    | "trace-precedents"
    | "remove-precedents"
    | "trace-errors"
  }
  & attribute table:index { nonNegativeInteger }
table-highlighted-range =
  element table:highlighted-range {
    (table-highlighted-range-attlist
     | table-highlighted-range-attlist-invalid),
    empty
  }
table-highlighted-range-attlist =
  attribute table:cell-range-address { cellRangeAddress }?
  & attribute table:direction {
      "from-another-table" | "to-another-table" | "from-same-table"
    }
  & attribute table:contains-error { boolean }?
table-highlighted-range-attlist-invalid =
  attribute table:marked-invalid { boolean }
office-spreadsheet-attlist =
  attribute table:structure-protected { boolean }?,
  attribute table:protection-key { \string }?,
  attribute table:protection-key-digest-algorithm { anyIRI }?
table-calculation-settings =
  element table:calculation-settings {
    table-calculation-setting-attlist,
    table-null-date?,
    table-iteration?
  }
table-calculation-setting-attlist =
  attribute table:case-sensitive { boolean }?
  & attribute table:precision-as-shown { boolean }?
  & attribute table:search-criteria-must-apply-to-whole-cell {
      boolean
    }?
  & attribute table:automatic-find-labels { boolean }?
  & attribute table:use-regular-expressions { boolean }?
  & attribute table:use-wildcards { boolean }?
  & attribute table:null-year { positiveInteger }?
table-null-date =
  element table:null-date {
    attribute table:value-type { "date" }?,
    attribute table:date-value { date }?,
    empty
  }
table-iteration =
  element table:iteration {
    attribute table:status { "enable" | "disable" }?,
    attribute table:steps { positiveInteger }?,
    attribute table:maximum-difference { double }?,
    empty
  }
table-content-validations =
  element table:content-validations { table-content-validation+ }
table-content-validation =
  element table:content-validation {
    table-validation-attlist,
    table-help-message?,
    (table-error-message | (table-error-macro, office-event-listeners))?
  }
table-validation-attlist =
  attribute table:name { \string }
  & attribute table:condition { \string }?
  & attribute table:base-cell-address { cellAddress }?
  & attribute table:allow-empty-cell { boolean }?
  & attribute table:display-list {
      "none" | "unsorted" | "sort-ascending"
    }?
table-help-message =
  element table:help-message {
    attribute table:title { \string }?,
    attribute table:display { boolean }?,
    text-p*
  }
table-error-message =
  element table:error-message {
    attribute table:title { \string }?,
    attribute table:display { boolean }?,
    attribute table:message-type {
      "stop" | "warning" | "information"
    }?,
    text-p*
  }
table-error-macro =
  element table:error-macro {
    attribute table:execute { boolean }?
  }
table-label-ranges = element table:label-ranges { table-label-range* }
table-label-range =
  element table:label-range { table-label-range-attlist, empty }
table-label-range-attlist =
  attribute table:label-cell-range-address { cellRangeAddress }
  & attribute table:data-cell-range-address { cellRangeAddress }
  & attribute table:orientation { "column" | "row" }
table-named-expressions =
  element table:named-expressions {
    (table-named-range | table-named-expression)*
  }
table-named-range =
  element table:named-range { table-named-range-attlist, empty }
table-named-range-attlist =
  attribute table:name { \string },
  attribute table:cell-range-address { cellRangeAddress },
  attribute table:base-cell-address { cellAddress }?,
  attribute table:range-usable-as {
    "none"
    | list {
        ("print-range" | "filter" | "repeat-row" | "repeat-column")+
      }
  }?
table-named-expression =
  element table:named-expression {
    table-named-expression-attlist, empty
  }
table-named-expression-attlist =
  attribute table:name { \string },
  attribute table:expression { \string },
  attribute table:base-cell-address { cellAddress }?
table-database-ranges =
  element table:database-ranges { table-database-range* }
table-database-range =
  element table:database-range {
    table-database-range-attlist,
    (table-database-source-sql
     | table-database-source-table
     | table-database-source-query)?,
    table-filter?,
    table-sort?,
    table-subtotal-rules?
  }
table-database-range-attlist =
  attribute table:name { \string }?
  & attribute table:is-selection { boolean }?
  & attribute table:on-update-keep-styles { boolean }?
  & attribute table:on-update-keep-size { boolean }?
  & attribute table:has-persistent-data { boolean }?
  & attribute table:orientation { "column" | "row" }?
  & attribute table:contains-header { boolean }?
  & attribute table:display-filter-buttons { boolean }?
  & attribute table:target-range-address { cellRangeAddress }
  & attribute table:refresh-delay { boolean }?
table-database-source-sql =
  element table:database-source-sql {
    table-database-source-sql-attlist, empty
  }
table-database-source-sql-attlist =
  attribute table:database-name { \string }
  & attribute table:sql-statement { \string }
  & attribute table:parse-sql-statement { boolean }?
table-database-source-query =
  element table:database-source-table {
    table-database-source-table-attlist, empty
  }
table-database-source-table-attlist =
  attribute table:database-name { \string }
  & attribute table:database-table-name { \string }
table-database-source-table =
  element table:database-source-query {
    table-database-source-query-attlist, empty
  }
table-database-source-query-attlist =
  attribute table:database-name { \string }
  & attribute table:query-name { \string }
table-sort = element table:sort { table-sort-attlist, table-sort-by+ }
table-sort-attlist =
  attribute table:bind-styles-to-content { boolean }?
  & attribute table:target-range-address { cellRangeAddress }?
  & attribute table:case-sensitive { boolean }?
  & attribute table:language { languageCode }?
  & attribute table:country { countryCode }?
  & attribute table:script { scriptCode }?
  & attribute table:rfc-language-tag { language }?
  & attribute table:algorithm { \string }?
  & attribute table:embedded-number-behavior {
      "alpha-numeric" | "integer" | "double"
    }?
table-sort-by = element table:sort-by { table-sort-by-attlist, empty }
table-sort-by-attlist =
  attribute table:field-number { nonNegativeInteger }
  & attribute table:data-type {
      "text" | "number" | "automatic" | \string
    }?
  & attribute table:order { "ascending" | "descending" }?
table-subtotal-rules =
  element table:subtotal-rules {
    table-subtotal-rules-attlist,
    table-sort-groups?,
    table-subtotal-rule*
  }
table-subtotal-rules-attlist =
  attribute table:bind-styles-to-content { boolean }?
  & attribute table:case-sensitive { boolean }?
  & attribute table:page-breaks-on-group-change { boolean }?
table-sort-groups =
  element table:sort-groups { table-sort-groups-attlist, empty }
table-sort-groups-attlist =
  attribute table:data-type {
    "text" | "number" | "automatic" | \string
  }?
  & attribute table:order { "ascending" | "descending" }?
table-subtotal-rule =
  element table:subtotal-rule {
    table-subtotal-rule-attlist, table-subtotal-field*
  }
table-subtotal-rule-attlist =
  attribute table:group-by-field-number { nonNegativeInteger }
table-subtotal-field =
  element table:subtotal-field { table-subtotal-field-attlist, empty }
table-subtotal-field-attlist =
  attribute table:field-number { nonNegativeInteger }
  & attribute table:function {
      "average"
      | "count"
      | "countnums"
      | "max"
      | "min"
      | "product"
      | "stdev"
      | "stdevp"
      | "sum"
      | "var"
      | "varp"
      | \string
    }
table-filter =
  element table:filter {
    table-filter-attlist,
    (table-filter-condition | table-filter-and | table-filter-or)
  }
table-filter-attlist =
  attribute table:target-range-address { cellRangeAddress }?
  & attribute table:condition-source { "self" | "cell-range" }?
  & attribute table:condition-source-range-address { cellRangeAddress }?
  & attribute table:display-duplicates { boolean }?
table-filter-and =
  element table:filter-and {
    (table-filter-or | table-filter-condition)+
  }
table-filter-or =
  element table:filter-or {
    (table-filter-and | table-filter-condition)+
  }
table-filter-condition =
  element table:filter-condition {
    table-filter-condition-attlist, table-filter-set-item*
  }
table-filter-condition-attlist =
  attribute table:field-number { nonNegativeInteger }
  & attribute table:value { \string | double }
  & attribute table:operator { \string }
  & attribute table:case-sensitive { \string }?
  & attribute table:data-type { "text" | "number" }?
table-filter-set-item =
  element table:filter-set-item {
    attribute table:value { \string },
    empty
  }
table-data-pilot-tables =
  element table:data-pilot-tables { table-data-pilot-table* }
table-data-pilot-table =
  element table:data-pilot-table {
    table-data-pilot-table-attlist,
    (table-database-source-sql
     | table-database-source-table
     | table-database-source-query
     | table-source-service
     | table-source-cell-range)?,
    table-data-pilot-field+
  }
table-data-pilot-table-attlist =
  attribute table:name { \string }
  & attribute table:application-data { \string }?
  & attribute table:grand-total { "none" | "row" | "column" | "both" }?
  & attribute table:ignore-empty-rows { boolean }?
  & attribute table:identify-categories { boolean }?
  & attribute table:target-range-address { cellRangeAddress }
  & attribute table:buttons { cellRangeAddressList }?
  & attribute table:show-filter-button { boolean }?
  & attribute table:drill-down-on-double-click { boolean }?
table-source-cell-range =
  element table:source-cell-range {
    table-source-cell-range-attlist, table-filter?
  }
table-source-cell-range-attlist =
  attribute table:cell-range-address { cellRangeAddress }
table-source-service =
  element table:source-service { table-source-service-attlist, empty }
table-source-service-attlist =
  attribute table:name { \string }
  & attribute table:source-name { \string }
  & attribute table:object-name { \string }
  & attribute table:user-name { \string }?
  & attribute table:password { \string }?
table-data-pilot-field =
  element table:data-pilot-field {
    table-data-pilot-field-attlist,
    table-data-pilot-level?,
    table-data-pilot-field-reference?,
    table-data-pilot-groups?
  }
table-data-pilot-field-attlist =
  attribute table:source-field-name { \string }
  & (attribute table:orientation {
       "row" | "column" | "data" | "hidden"
     }
     | (attribute table:orientation { "page" },
        attribute table:selected-page { \string }))
  & attribute table:is-data-layout-field { \string }?
  & attribute table:function {
      "auto"
      | "average"
      | "count"
      | "countnums"
      | "max"
      | "min"
      | "product"
      | "stdev"
      | "stdevp"
      | "sum"
      | "var"
      | "varp"
      | \string
    }?
  & attribute table:used-hierarchy { integer }?
table-data-pilot-level =
  element table:data-pilot-level {
    table-data-pilot-level-attlist,
    table-data-pilot-subtotals?,
    table-data-pilot-members?,
    table-data-pilot-display-info?,
    table-data-pilot-sort-info?,
    table-data-pilot-layout-info?
  }
table-data-pilot-level-attlist = attribute table:show-empty { boolean }?
table-data-pilot-subtotals =
  element table:data-pilot-subtotals { table-data-pilot-subtotal* }
table-data-pilot-subtotal =
  element table:data-pilot-subtotal {
    table-data-pilot-subtotal-attlist, empty
  }
table-data-pilot-subtotal-attlist =
  attribute table:function {
    "auto"
    | "average"
    | "count"
    | "countnums"
    | "max"
    | "min"
    | "product"
    | "stdev"
    | "stdevp"
    | "sum"
    | "var"
    | "varp"
    | \string
  }
table-data-pilot-members =
  element table:data-pilot-members { table-data-pilot-member* }
table-data-pilot-member =
  element table:data-pilot-member {
    table-data-pilot-member-attlist, empty
  }
table-data-pilot-member-attlist =
  attribute table:name { \string }
  & attribute table:display { boolean }?
  & attribute table:show-details { boolean }?
table-data-pilot-display-info =
  element table:data-pilot-display-info {
    table-data-pilot-display-info-attlist, empty
  }
table-data-pilot-display-info-attlist =
  attribute table:enabled { boolean }
  & attribute table:data-field { \string }
  & attribute table:member-count { nonNegativeInteger }
  & attribute table:display-member-mode { "from-top" | "from-bottom" }
table-data-pilot-sort-info =
  element table:data-pilot-sort-info {
    table-data-pilot-sort-info-attlist, empty
  }
table-data-pilot-sort-info-attlist =
  ((attribute table:sort-mode { "data" },
    attribute table:data-field { \string })
   | attribute table:sort-mode { "none" | "manual" | "name" })
  & attribute table:order { "ascending" | "descending" }
table-data-pilot-layout-info =
  element table:data-pilot-layout-info {
    table-data-pilot-layout-info-attlist, empty
  }
table-data-pilot-layout-info-attlist =
  attribute table:layout-mode {
    "tabular-layout"
    | "outline-subtotals-top"
    | "outline-subtotals-bottom"
  }
  & attribute table:add-empty-lines { boolean }
table-data-pilot-field-reference =
  element table:data-pilot-field-reference {
    table-data-pilot-field-reference-attlist
  }
table-data-pilot-field-reference-attlist =
  attribute table:field-name { \string }
  & ((attribute table:member-type { "named" },
      attribute table:member-name { \string })
     | attribute table:member-type { "previous" | "next" })
  & attribute table:type {
      "none"
      | "member-difference"
      | "member-percentage"
      | "member-percentage-difference"
      | "running-total"
      | "row-percentage"
      | "column-percentage"
      | "total-percentage"
      | "index"
    }
table-data-pilot-groups =
  element table:data-pilot-groups {
    table-data-pilot-groups-attlist, table-data-pilot-group+
  }
table-data-pilot-groups-attlist =
  attribute table:source-field-name { \string }
  & (attribute table:date-start { dateOrDateTime | "auto" }
     | attribute table:start { double | "auto" })
  & (attribute table:date-end { dateOrDateTime | "auto" }
     | attribute table:end { double | "auto" })
  & attribute table:step { double }
  & attribute table:grouped-by {
      "seconds"
      | "minutes"
      | "hours"
      | "days"
      | "months"
      | "quarters"
      | "years"
    }
table-data-pilot-group =
  element table:data-pilot-group {
    table-data-pilot-group-attlist, table-data-pilot-group-member+
  }
table-data-pilot-group-attlist = attribute table:name { \string }
table-data-pilot-group-member =
  element table:data-pilot-group-member {
    table-data-pilot-group-member-attlist
  }
table-data-pilot-group-member-attlist = attribute table:name { \string }
table-consolidation =
  element table:consolidation { table-consolidation-attlist, empty }
table-consolidation-attlist =
  attribute table:function {
    "average"
    | "count"
    | "countnums"
    | "max"
    | "min"
    | "product"
    | "stdev"
    | "stdevp"
    | "sum"
    | "var"
    | "varp"
    | \string
  }
  & attribute table:source-cell-range-addresses { cellRangeAddressList }
  & attribute table:target-cell-address { cellAddress }
  & attribute table:use-labels { "none" | "row" | "column" | "both" }?
  & attribute table:link-to-source-data { boolean }?
table-dde-links = element table:dde-links { table-dde-link+ }
table-tracked-changes =
  element table:tracked-changes {
    table-tracked-changes-attlist,
    (table-cell-content-change
     | table-insertion
     | table-deletion
     | table-movement)*
  }
table-tracked-changes-attlist =
  attribute table:track-changes { boolean }?
table-insertion =
  element table:insertion {
    table-insertion-attlist,
    common-table-change-attlist,
    office-change-info,
    table-dependencies?,
    table-deletions?
  }
table-insertion-attlist =
  attribute table:type { "row" | "column" | "table" }
  & attribute table:position { integer }
  & attribute table:count { positiveInteger }?
  & attribute table:table { integer }?
table-dependencies = element table:dependencies { table-dependency+ }
table-dependency =
  element table:dependency {
    attribute table:id { \string },
    empty
  }
table-deletions =
  element table:deletions {
    (table-cell-content-deletion | table-change-deletion)+
  }
table-cell-content-deletion =
  element table:cell-content-deletion {
    attribute table:id { \string }?,
    table-cell-address?,
    table-change-track-table-cell?
  }
table-change-deletion =
  element table:change-deletion {
    attribute table:id { \string }?,
    empty
  }
table-deletion =
  element table:deletion {
    table-deletion-attlist,
    common-table-change-attlist,
    office-change-info,
    table-dependencies?,
    table-deletions?,
    table-cut-offs?
  }
table-deletion-attlist =
  attribute table:type { "row" | "column" | "table" }
  & attribute table:position { integer }
  & attribute table:table { integer }?
  & attribute table:multi-deletion-spanned { integer }?
table-cut-offs =
  element table:cut-offs {
    table-movement-cut-off+
    | (table-insertion-cut-off, table-movement-cut-off*)
  }
table-insertion-cut-off =
  element table:insertion-cut-off {
    table-insertion-cut-off-attlist, empty
  }
table-insertion-cut-off-attlist =
  attribute table:id { \string }
  & attribute table:position { integer }
table-movement-cut-off =
  element table:movement-cut-off {
    table-movement-cut-off-attlist, empty
  }
table-movement-cut-off-attlist =
  attribute table:position { integer }
  | (attribute table:start-position { integer },
     attribute table:end-position { integer })
table-movement =
  element table:movement {
    common-table-change-attlist,
    table-source-range-address,
    table-target-range-address,
    office-change-info,
    table-dependencies?,
    table-deletions?
  }
table-source-range-address =
  element table:source-range-address {
    common-table-range-attlist, empty
  }
table-target-range-address =
  element table:target-range-address {
    common-table-range-attlist, empty
  }
common-table-range-attlist =
  common-table-cell-address-attlist
  | common-table-cell-range-address-attlist
common-table-cell-address-attlist =
  attribute table:column { integer },
  attribute table:row { integer },
  attribute table:table { integer }
common-table-cell-range-address-attlist =
  attribute table:start-column { integer },
  attribute table:start-row { integer },
  attribute table:start-table { integer },
  attribute table:end-column { integer },
  attribute table:end-row { integer },
  attribute table:end-table { integer }
table-change-track-table-cell =
  element table:change-track-table-cell {
    table-change-track-table-cell-attlist, text-p*
  }
table-change-track-table-cell-attlist =
  attribute table:cell-address { cellAddress }?
  & attribute table:matrix-covered { boolean }?
  & attribute table:formula { \string }?
  & attribute table:number-matrix-columns-spanned { positiveInteger }?
  & attribute table:number-matrix-rows-spanned { positiveInteger }?
  & common-value-and-type-attlist?
table-cell-content-change =
  element table:cell-content-change {
    common-table-change-attlist,
    table-cell-address,
    office-change-info,
    table-dependencies?,
    table-deletions?,
    table-previous
  }
table-cell-address =
  element table:cell-address {
    common-table-cell-address-attlist, empty
  }
table-previous =
  element table:previous {
    attribute table:id { \string }?,
    table-change-track-table-cell
  }
common-table-change-attlist =
  attribute table:id { \string }
  & attribute table:acceptance-state {
      "accepted" | "rejected" | "pending"
    }?
  & attribute table:rejecting-change-id { \string }?
style-handout-master =
  element style:handout-master {
    common-presentation-header-footer-attlist,
    style-handout-master-attlist,
    shape*
  }
style-handout-master-attlist =
  attribute presentation:presentation-page-layout-name { styleNameRef }?
  & attribute style:page-layout-name { styleNameRef }
  & attribute draw:style-name { styleNameRef }?
draw-layer-set = element draw:layer-set { draw-layer* }
draw-layer =
  element draw:layer { draw-layer-attlist, svg-title?, svg-desc? }
draw-layer-attlist =
  attribute draw:name { \string }
  & attribute draw:protected { boolean }?
  & attribute draw:display { "always" | "screen" | "printer" | "none" }?
draw-page =
  element draw:page {
    common-presentation-header-footer-attlist,
    draw-page-attlist,
    svg-title?,
    svg-desc?,
    draw-layer-set?,
    office-forms?,
    shape*,
    (presentation-animations | animation-element)?,
    presentation-notes?
  }
draw-page-attlist =
  attribute draw:name { \string }?
  & attribute draw:style-name { styleNameRef }?
  & attribute draw:master-page-name { styleNameRef }
  & attribute presentation:presentation-page-layout-name {
      styleNameRef
    }?
  & (xml-id,
     attribute draw:id { NCName }?)?
  & attribute draw:nav-order { IDREFS }?
common-presentation-header-footer-attlist =
  attribute presentation:use-header-name { \string }?
  & attribute presentation:use-footer-name { \string }?
  & attribute presentation:use-date-time-name { \string }?
shape = shape-instance | draw-a
shape-instance =
  draw-rect
  | draw-line
  | draw-polyline
  | draw-polygon
  | draw-regular-polygon
  | draw-path
  | draw-circle
  | draw-ellipse
  | draw-g
  | draw-page-thumbnail
  | draw-frame
  | draw-measure
  | draw-caption
  | draw-connector
  | draw-control
  | dr3d-scene
  | draw-custom-shape
draw-rect =
  element draw:rect {
    draw-rect-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-rect-attlist =
  attribute draw:corner-radius { nonNegativeLength }?
  | (attribute svg:rx { nonNegativeLength }?,
     attribute svg:ry { nonNegativeLength }?)
draw-line =
  element draw:line {
    draw-line-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-line-attlist =
  attribute svg:x1 { coordinate }
  & attribute svg:y1 { coordinate }
  & attribute svg:x2 { coordinate }
  & attribute svg:y2 { coordinate }
draw-polyline =
  element draw:polyline {
    common-draw-points-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
common-draw-points-attlist = attribute draw:points { points }
draw-polygon =
  element draw:polygon {
    common-draw-points-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-regular-polygon =
  element draw:regular-polygon {
    draw-regular-polygon-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-regular-polygon-attlist =
  (attribute draw:concave { "false" }
   | (attribute draw:concave { "true" },
      draw-regular-polygon-sharpness-attlist))
  & attribute draw:corners { positiveInteger }
draw-regular-polygon-sharpness-attlist =
  attribute draw:sharpness { percent }
draw-path =
  element draw:path {
    common-draw-path-data-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
common-draw-path-data-attlist = attribute svg:d { pathData }
draw-circle =
  element draw:circle {
    ((draw-circle-attlist, common-draw-circle-ellipse-pos-attlist)
     | (common-draw-position-attlist, common-draw-size-attlist)),
    common-draw-circle-ellipse-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
common-draw-circle-ellipse-pos-attlist =
  attribute svg:cx { coordinate },
  attribute svg:cy { coordinate }
draw-circle-attlist = attribute svg:r { length }
common-draw-circle-ellipse-attlist =
  attribute draw:kind { "full" | "section" | "cut" | "arc" }?
  & attribute draw:start-angle { angle }?
  & attribute draw:end-angle { angle }?
draw-ellipse =
  element draw:ellipse {
    ((draw-ellipse-attlist, common-draw-circle-ellipse-pos-attlist)
     | (common-draw-position-attlist, common-draw-size-attlist)),
    common-draw-circle-ellipse-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-ellipse-attlist =
  attribute svg:rx { length },
  attribute svg:ry { length }
draw-connector =
  element draw:connector {
    draw-connector-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    common-draw-viewbox-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-connector-attlist =
  attribute draw:type { "standard" | "lines" | "line" | "curve" }?
  & (attribute svg:x1 { coordinate },
     attribute svg:y1 { coordinate })?
  & attribute draw:start-shape { IDREF }?
  & attribute draw:start-glue-point { nonNegativeInteger }?
  & (attribute svg:x2 { coordinate },
     attribute svg:y2 { coordinate })?
  & attribute draw:end-shape { IDREF }?
  & attribute draw:end-glue-point { nonNegativeInteger }?
  & attribute draw:line-skew {
      list { length, (length, length?)? }
    }?
  & attribute svg:d { pathData }?
draw-caption =
  element draw:caption {
    draw-caption-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-caption-attlist =
  (attribute draw:caption-point-x { coordinate },
   attribute draw:caption-point-y { coordinate })?
  & attribute draw:corner-radius { nonNegativeLength }?
draw-measure =
  element draw:measure {
    draw-measure-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-measure-attlist =
  attribute svg:x1 { coordinate }
  & attribute svg:y1 { coordinate }
  & attribute svg:x2 { coordinate }
  & attribute svg:y2 { coordinate }
draw-control =
  element draw:control {
    draw-control-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    draw-glue-point*
  }
draw-control-attlist = attribute draw:control { IDREF }
draw-page-thumbnail =
  element draw:page-thumbnail {
    draw-page-thumbnail-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    presentation-shape-attlist,
    common-draw-shape-with-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?
  }
draw-page-thumbnail-attlist =
  attribute draw:page-number { positiveInteger }?
draw-g =
  element draw:g {
    draw-g-attlist,
    common-draw-z-index-attlist,
    common-draw-name-attlist,
    common-draw-id-attlist,
    common-draw-style-name-attlist,
    common-text-spreadsheet-shape-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    shape*
  }
draw-g-attlist = attribute svg:y { coordinate }?
common-draw-name-attlist = attribute draw:name { \string }?
common-draw-caption-id-attlist = attribute draw:caption-id { IDREF }?
common-draw-position-attlist =
  attribute svg:x { coordinate }?,
  attribute svg:y { coordinate }?
common-draw-size-attlist =
  attribute svg:width { length }?,
  attribute svg:height { length }?
common-draw-transform-attlist = attribute draw:transform { \string }?
common-draw-viewbox-attlist =
  attribute svg:viewBox {
    list { integer, integer, integer, integer }
  }
common-draw-style-name-attlist =
  (attribute draw:style-name { styleNameRef }?,
   attribute draw:class-names { styleNameRefs }?)
  | (attribute presentation:style-name { styleNameRef }?,
     attribute presentation:class-names { styleNameRefs }?)
common-draw-text-style-name-attlist =
  attribute draw:text-style-name { styleNameRef }?
common-draw-layer-name-attlist = attribute draw:layer { \string }?
common-draw-id-attlist =
  (xml-id,
   attribute draw:id { NCName }?)?
common-draw-z-index-attlist =
  attribute draw:z-index { nonNegativeInteger }?
common-text-spreadsheet-shape-attlist =
  attribute table:end-cell-address { cellAddress }?
  & attribute table:end-x { coordinate }?
  & attribute table:end-y { coordinate }?
  & attribute table:table-background { boolean }?
  & common-text-anchor-attlist
common-text-anchor-attlist =
  attribute text:anchor-type {
    "page" | "frame" | "paragraph" | "char" | "as-char"
  }?
  & attribute text:anchor-page-number { positiveInteger }?
draw-text = (text-p | text-list)*
common-draw-shape-with-styles-attlist =
  common-draw-z-index-attlist,
  common-draw-id-attlist,
  common-draw-layer-name-attlist,
  common-draw-style-name-attlist,
  common-draw-transform-attlist,
  common-draw-name-attlist,
  common-text-spreadsheet-shape-attlist
common-draw-shape-with-text-and-styles-attlist =
  common-draw-shape-with-styles-attlist,
  common-draw-text-style-name-attlist
draw-glue-point =
  element draw:glue-point { draw-glue-point-attlist, empty }
draw-glue-point-attlist =
  attribute draw:id { nonNegativeInteger }
  & attribute svg:x { distance | percent }
  & attribute svg:y { distance | percent }
  & attribute draw:align {
      "top-left"
      | "top"
      | "top-right"
      | "left"
      | "center"
      | "right"
      | "bottom-left"
      | "bottom-right"
    }?
  & attribute draw:escape-direction {
      "auto"
      | "left"
      | "right"
      | "up"
      | "down"
      | "horizontal"
      | "vertical"
    }
svg-title = element svg:title { text }
svg-desc = element svg:desc { text }
draw-frame =
  element draw:frame {
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-position-attlist,
    common-draw-rel-size-attlist,
    common-draw-caption-id-attlist,
    presentation-shape-attlist,
    draw-frame-attlist,
    (draw-text-box
     | draw-image
     | draw-object
     | draw-object-ole
     | draw-applet
     | draw-floating-frame
     | draw-plugin
     | table-table)*,
    office-event-listeners?,
    draw-glue-point*,
    draw-image-map?,
    svg-title?,
    svg-desc?,
    (draw-contour-polygon | draw-contour-path)?
  }
common-draw-rel-size-attlist =
  common-draw-size-attlist,
  attribute style:rel-width { percent | "scale" | "scale-min" }?,
  attribute style:rel-height { percent | "scale" | "scale-min" }?
draw-frame-attlist = attribute draw:copy-of { \string }?
draw-text-box =
  element draw:text-box { draw-text-box-attlist, text-content* }
draw-text-box-attlist =
  attribute draw:chain-next-name { \string }?
  & attribute draw:corner-radius { nonNegativeLength }?
  & attribute fo:min-height { length | percent }?
  & attribute fo:min-width { length | percent }?
  & attribute fo:max-height { length | percent }?
  & attribute fo:max-width { length | percent }?
  & (xml-id,
     attribute text:id { NCName }?)?
draw-image =
  element draw:image {
    draw-image-attlist,
    (common-draw-data-attlist | office-binary-data),
    draw-text
  }
common-draw-data-attlist =
  attribute xlink:type { "simple" },
  attribute xlink:href { anyIRI },
  attribute xlink:show { "embed" }?,
  attribute xlink:actuate { "onLoad" }?
office-binary-data = element office:binary-data { base64Binary }
draw-image-attlist =
  attribute draw:filter-name { \string }?
  & xml-id?
draw-object =
  element draw:object {
    draw-object-attlist,
    (common-draw-data-attlist | office-document | math-math)
  }
draw-object-ole =
  element draw:object-ole {
    draw-object-ole-attlist,
    (common-draw-data-attlist | office-binary-data)
  }
draw-object-attlist =
  attribute draw:notify-on-update-of-ranges {
    cellRangeAddressList | \string
  }?
  & xml-id?
draw-object-ole-attlist =
  attribute draw:class-id { \string }?
  & xml-id?
draw-applet =
  element draw:applet {
    draw-applet-attlist, common-draw-data-attlist?, draw-param*
  }
draw-applet-attlist =
  attribute draw:code { \string }?
  & attribute draw:object { \string }?
  & attribute draw:archive { \string }?
  & attribute draw:may-script { boolean }?
  & xml-id?
draw-plugin =
  element draw:plugin {
    draw-plugin-attlist, common-draw-data-attlist, draw-param*
  }
draw-plugin-attlist =
  attribute draw:mime-type { \string }?
  & xml-id?
draw-param = element draw:param { draw-param-attlist, empty }
draw-param-attlist =
  attribute draw:name { \string }?
  & attribute draw:value { \string }?
draw-floating-frame =
  element draw:floating-frame {
    draw-floating-frame-attlist, common-draw-data-attlist
  }
draw-floating-frame-attlist =
  attribute draw:frame-name { \string }?
  & xml-id?
draw-contour-polygon =
  element draw:contour-polygon {
    common-contour-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-points-attlist,
    empty
  }
draw-contour-path =
  element draw:contour-path {
    common-contour-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-path-data-attlist,
    empty
  }
common-contour-attlist = attribute draw:recreate-on-edit { boolean }
draw-a = element draw:a { draw-a-attlist, shape-instance }
draw-a-attlist =
  attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute xlink:actuate { "onRequest" }?
  & attribute office:target-frame-name { targetFrameName }?
  & attribute xlink:show { "new" | "replace" }?
  & attribute office:name { \string }?
  & attribute office:title { \string }?
  & attribute office:server-map { boolean }?
  & xml-id?
draw-image-map =
  element draw:image-map {
    (draw-area-rectangle | draw-area-circle | draw-area-polygon)*
  }
draw-area-rectangle =
  element draw:area-rectangle {
    common-draw-area-attlist,
    attribute svg:x { coordinate },
    attribute svg:y { coordinate },
    attribute svg:width { length },
    attribute svg:height { length },
    svg-title?,
    svg-desc?,
    office-event-listeners?
  }
draw-area-circle =
  element draw:area-circle {
    common-draw-area-attlist,
    attribute svg:cx { coordinate },
    attribute svg:cy { coordinate },
    attribute svg:r { length },
    svg-title?,
    svg-desc?,
    office-event-listeners?
  }
draw-area-polygon =
  element draw:area-polygon {
    common-draw-area-attlist,
    attribute svg:x { coordinate },
    attribute svg:y { coordinate },
    attribute svg:width { length },
    attribute svg:height { length },
    common-draw-viewbox-attlist,
    common-draw-points-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?
  }
common-draw-area-attlist =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute office:target-frame-name { targetFrameName }?,
   attribute xlink:show { "new" | "replace" }?)?
  & attribute office:name { \string }?
  & attribute draw:nohref { "nohref" }?
dr3d-scene =
  element dr3d:scene {
    dr3d-scene-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-style-name-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-text-spreadsheet-shape-attlist,
    common-dr3d-transform-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    dr3d-light*,
    shapes3d*,
    draw-glue-point*
  }
shapes3d =
  dr3d-scene | dr3d-extrude | dr3d-sphere | dr3d-rotate | dr3d-cube
dr3d-scene-attlist =
  attribute dr3d:vrp { vector3D }?
  & attribute dr3d:vpn { vector3D }?
  & attribute dr3d:vup { vector3D }?
  & attribute dr3d:projection { "parallel" | "perspective" }?
  & attribute dr3d:distance { length }?
  & attribute dr3d:focal-length { length }?
  & attribute dr3d:shadow-slant { angle }?
  & attribute dr3d:shade-mode {
      "flat" | "phong" | "gouraud" | "draft"
    }?
  & attribute dr3d:ambient-color { color }?
  & attribute dr3d:lighting-mode { boolean }?
common-dr3d-transform-attlist = attribute dr3d:transform { \string }?
dr3d-light = element dr3d:light { dr3d-light-attlist, empty }
dr3d-light-attlist =
  attribute dr3d:diffuse-color { color }?
  & attribute dr3d:direction { vector3D }
  & attribute dr3d:enabled { boolean }?
  & attribute dr3d:specular { boolean }?
dr3d-cube =
  element dr3d:cube {
    dr3d-cube-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
dr3d-cube-attlist =
  attribute dr3d:min-edge { vector3D }?,
  attribute dr3d:max-edge { vector3D }?
dr3d-sphere =
  element dr3d:sphere {
    dr3d-sphere-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
dr3d-sphere-attlist =
  attribute dr3d:center { vector3D }?
  & attribute dr3d:size { vector3D }?
dr3d-extrude =
  element dr3d:extrude {
    common-draw-path-data-attlist,
    common-draw-viewbox-attlist,
    common-draw-id-attlist,
    common-draw-z-index-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
dr3d-rotate =
  element dr3d:rotate {
    common-draw-viewbox-attlist,
    common-draw-path-data-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
draw-custom-shape =
  element draw:custom-shape {
    draw-custom-shape-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text,
    draw-enhanced-geometry?
  }
draw-custom-shape-attlist =
  attribute draw:engine { namespacedToken }?
  & attribute draw:data { \string }?
draw-enhanced-geometry =
  element draw:enhanced-geometry {
    draw-enhanced-geometry-attlist, draw-equation*, draw-handle*
  }
draw-enhanced-geometry-attlist =
  attribute draw:type { custom-shape-type }?
  & attribute svg:viewBox {
      list { integer, integer, integer, integer }
    }?
  & attribute draw:mirror-vertical { boolean }?
  & attribute draw:mirror-horizontal { boolean }?
  & attribute draw:text-rotate-angle { angle }?
  & attribute draw:extrusion-allowed { boolean }?
  & attribute draw:text-path-allowed { boolean }?
  & attribute draw:concentric-gradient-fill-allowed { boolean }?
  & attribute draw:extrusion { boolean }?
  & attribute draw:extrusion-brightness { zeroToHundredPercent }?
  & attribute draw:extrusion-depth {
      list { length, double }
    }?
  & attribute draw:extrusion-diffusion { percent }?
  & attribute draw:extrusion-number-of-line-segments { integer }?
  & attribute draw:extrusion-light-face { boolean }?
  & attribute draw:extrusion-first-light-harsh { boolean }?
  & attribute draw:extrusion-second-light-harsh { boolean }?
  & attribute draw:extrusion-first-light-level { zeroToHundredPercent }?
  & attribute draw:extrusion-second-light-level {
      zeroToHundredPercent
    }?
  & attribute draw:extrusion-first-light-direction { vector3D }?
  & attribute draw:extrusion-second-light-direction { vector3D }?
  & attribute draw:extrusion-metal { boolean }?
  & attribute dr3d:shade-mode {
      "flat" | "phong" | "gouraud" | "draft"
    }?
  & attribute draw:extrusion-rotation-angle {
      list { angle, angle }
    }?
  & attribute draw:extrusion-rotation-center { vector3D }?
  & attribute draw:extrusion-shininess { zeroToHundredPercent }?
  & attribute draw:extrusion-skew {
      list { double, angle }
    }?
  & attribute draw:extrusion-specularity { zeroToHundredPercent }?
  & attribute dr3d:projection { "parallel" | "perspective" }?
  & attribute draw:extrusion-viewpoint { point3D }?
  & attribute draw:extrusion-origin {
      list { extrusionOrigin, extrusionOrigin }
    }?
  & attribute draw:extrusion-color { boolean }?
  & attribute draw:enhanced-path { \string }?
  & attribute draw:path-stretchpoint-x { double }?
  & attribute draw:path-stretchpoint-y { double }?
  & attribute draw:text-areas { \string }?
  & attribute draw:glue-points { \string }?
  & attribute draw:glue-point-type {
      "none" | "segments" | "rectangle"
    }?
  & attribute draw:glue-point-leaving-directions { \string }?
  & attribute draw:text-path { boolean }?
  & attribute draw:text-path-mode { "normal" | "path" | "shape" }?
  & attribute draw:text-path-scale { "path" | "shape" }?
  & attribute draw:text-path-same-letter-heights { boolean }?
  & attribute draw:modifiers { \string }?
custom-shape-type = "non-primitive" | \string
point3D =
  xsd:string {
    pattern =
      "\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))){2}[ ]*\)"
  }
extrusionOrigin =
  xsd:double { minInclusive = "-0.5" maxInclusive = "0.5" }
draw-equation = element draw:equation { draw-equation-attlist, empty }
draw-equation-attlist =
  attribute draw:name { \string }?
  & attribute draw:formula { \string }?
draw-handle = element draw:handle { draw-handle-attlist, empty }
draw-handle-attlist =
  attribute draw:handle-mirror-vertical { boolean }?
  & attribute draw:handle-mirror-horizontal { boolean }?
  & attribute draw:handle-switched { boolean }?
  & attribute draw:handle-position { \string }
  & attribute draw:handle-range-x-minimum { \string }?
  & attribute draw:handle-range-x-maximum { \string }?
  & attribute draw:handle-range-y-minimum { \string }?
  & attribute draw:handle-range-y-maximum { \string }?
  & attribute draw:handle-polar { \string }?
  & attribute draw:handle-radius-range-minimum { \string }?
  & attribute draw:handle-radius-range-maximum { \string }?
presentation-shape-attlist =
  attribute presentation:class { presentation-classes }?
  & attribute presentation:placeholder { boolean }?
  & attribute presentation:user-transformed { boolean }?
presentation-classes =
  "title"
  | "outline"
  | "subtitle"
  | "text"
  | "graphic"
  | "object"
  | "chart"
  | "table"
  | "orgchart"
  | "page"
  | "notes"
  | "handout"
  | "header"
  | "footer"
  | "date-time"
  | "page-number"
presentation-animations =
  element presentation:animations {
    (presentation-animation-elements | presentation-animation-group)*
  }
presentation-animation-elements =
  presentation-show-shape
  | presentation-show-text
  | presentation-hide-shape
  | presentation-hide-text
  | presentation-dim
  | presentation-play
presentation-sound =
  element presentation:sound {
    presentation-sound-attlist,
    attribute xlink:type { "simple" },
    attribute xlink:href { anyIRI },
    attribute xlink:actuate { "onRequest" }?,
    attribute xlink:show { "new" | "replace" }?,
    empty
  }
presentation-sound-attlist =
  attribute presentation:play-full { boolean }?
  & xml-id?
presentation-show-shape =
  element presentation:show-shape {
    common-presentation-effect-attlist, presentation-sound?
  }
common-presentation-effect-attlist =
  attribute draw:shape-id { IDREF }
  & attribute presentation:effect { presentationEffects }?
  & attribute presentation:direction { presentationEffectDirections }?
  & attribute presentation:speed { presentationSpeeds }?
  & attribute presentation:delay { duration }?
  & attribute presentation:start-scale { percent }?
  & attribute presentation:path-id { \string }?
presentationEffects =
  "none"
  | "fade"
  | "move"
  | "stripes"
  | "open"
  | "close"
  | "dissolve"
  | "wavyline"
  | "random"
  | "lines"
  | "laser"
  | "appear"
  | "hide"
  | "move-short"
  | "checkerboard"
  | "rotate"
  | "stretch"
presentationEffectDirections =
  "none"
  | "from-left"
  | "from-top"
  | "from-right"
  | "from-bottom"
  | "from-center"
  | "from-upper-left"
  | "from-upper-right"
  | "from-lower-left"
  | "from-lower-right"
  | "to-left"
  | "to-top"
  | "to-right"
  | "to-bottom"
  | "to-upper-left"
  | "to-upper-right"
  | "to-lower-right"
  | "to-lower-left"
  | "path"
  | "spiral-inward-left"
  | "spiral-inward-right"
  | "spiral-outward-left"
  | "spiral-outward-right"
  | "vertical"
  | "horizontal"
  | "to-center"
  | "clockwise"
  | "counter-clockwise"
presentationSpeeds = "slow" | "medium" | "fast"
presentation-show-text =
  element presentation:show-text {
    common-presentation-effect-attlist, presentation-sound?
  }
presentation-hide-shape =
  element presentation:hide-shape {
    common-presentation-effect-attlist, presentation-sound?
  }
presentation-hide-text =
  element presentation:hide-text {
    common-presentation-effect-attlist, presentation-sound?
  }
presentation-dim =
  element presentation:dim {
    presentation-dim-attlist, presentation-sound?
  }
presentation-dim-attlist =
  attribute draw:shape-id { IDREF }
  & attribute draw:color { color }
presentation-play =
  element presentation:play { presentation-play-attlist, empty }
presentation-play-attlist =
  attribute draw:shape-id { IDREF },
  attribute presentation:speed { presentationSpeeds }?
presentation-animation-group =
  element presentation:animation-group {
    presentation-animation-elements*
  }
common-anim-attlist =
  attribute presentation:node-type {
    "default"
    | "on-click"
    | "with-previous"
    | "after-previous"
    | "timing-root"
    | "main-sequence"
    | "interactive-sequence"
  }?
  & attribute presentation:preset-id { \string }?
  & attribute presentation:preset-sub-type { \string }?
  & attribute presentation:preset-class {
      "custom"
      | "entrance"
      | "exit"
      | "emphasis"
      | "motion-path"
      | "ole-action"
      | "media-call"
    }?
  & attribute presentation:master-element { IDREF }?
  & attribute presentation:group-id { \string }?
  & (xml-id,
     attribute anim:id { NCName }?)?
presentation-event-listener =
  element presentation:event-listener {
    presentation-event-listener-attlist, presentation-sound?
  }
presentation-event-listener-attlist =
  attribute script:event-name { \string }
  & attribute presentation:action {
      "none"
      | "previous-page"
      | "next-page"
      | "first-page"
      | "last-page"
      | "hide"
      | "stop"
      | "execute"
      | "show"
      | "verb"
      | "fade-out"
      | "sound"
      | "last-visited-page"
    }
  & attribute presentation:effect { presentationEffects }?
  & attribute presentation:direction { presentationEffectDirections }?
  & attribute presentation:speed { presentationSpeeds }?
  & attribute presentation:start-scale { percent }?
  & (attribute xlink:type { "simple" },
     attribute xlink:href { anyIRI },
     attribute xlink:show { "embed" }?,
     attribute xlink:actuate { "onRequest" }?)?
  & attribute presentation:verb { nonNegativeInteger }?
presentation-decls = presentation-decl*
presentation-decl =
  element presentation:header-decl {
    presentation-header-decl-attlist, text
  }
  | element presentation:footer-decl {
      presentation-footer-decl-attlist, text
    }
  | element presentation:date-time-decl {
      presentation-date-time-decl-attlist, text
    }
presentation-header-decl-attlist =
  attribute presentation:name { \string }
presentation-footer-decl-attlist =
  attribute presentation:name { \string }
presentation-date-time-decl-attlist =
  attribute presentation:name { \string }
  & attribute presentation:source { "fixed" | "current-date" }
  & attribute style:data-style-name { styleNameRef }?
presentation-settings =
  element presentation:settings {
    presentation-settings-attlist, presentation-show*
  }?
presentation-settings-attlist =
  attribute presentation:start-page { \string }?
  & attribute presentation:show { \string }?
  & attribute presentation:full-screen { boolean }?
  & attribute presentation:endless { boolean }?
  & attribute presentation:pause { duration }?
  & attribute presentation:show-logo { boolean }?
  & attribute presentation:force-manual { boolean }?
  & attribute presentation:mouse-visible { boolean }?
  & attribute presentation:mouse-as-pen { boolean }?
  & attribute presentation:start-with-navigator { boolean }?
  & attribute presentation:animations { "enabled" | "disabled" }?
  & attribute presentation:transition-on-click {
      "enabled" | "disabled"
    }?
  & attribute presentation:stay-on-top { boolean }?
  & attribute presentation:show-end-of-presentation-slide { boolean }?
presentation-show =
  element presentation:show { presentation-show-attlist, empty }
presentation-show-attlist =
  attribute presentation:name { \string }
  & attribute presentation:pages { \string }
chart-chart =
  element chart:chart {
    chart-chart-attlist,
    chart-title?,
    chart-subtitle?,
    chart-footer?,
    chart-legend?,
    chart-plot-area,
    table-table?
  }
chart-chart-attlist =
  attribute chart:class { namespacedToken }
  & common-draw-size-attlist
  & attribute chart:column-mapping { \string }?
  & attribute chart:row-mapping { \string }?
  & attribute chart:style-name { styleNameRef }?
  & (attribute xlink:type { "simple" },
     attribute xlink:href { anyIRI })?
  & xml-id?
chart-title = element chart:title { chart-title-attlist, text-p? }
chart-title-attlist =
  attribute table:cell-range { cellRangeAddressList }?
  & common-draw-position-attlist
  & attribute chart:style-name { styleNameRef }?
chart-subtitle = element chart:subtitle { chart-title-attlist, text-p? }
chart-footer = element chart:footer { chart-title-attlist, text-p? }
chart-legend = element chart:legend { chart-legend-attlist, text-p? }
chart-legend-attlist =
  ((attribute chart:legend-position {
      "start" | "end" | "top" | "bottom"
    },
    attribute chart:legend-align { "start" | "center" | "end" }?)
   | attribute chart:legend-position {
       "top-start" | "bottom-start" | "top-end" | "bottom-end"
     }
   | empty)
  & common-draw-position-attlist
  & (attribute style:legend-expansion { "wide" | "high" | "balanced" }
     | (attribute style:legend-expansion { "custom" },
        attribute style:legend-expansion-aspect-ratio { double })
     | empty)
  & attribute chart:style-name { styleNameRef }?
chart-plot-area =
  element chart:plot-area {
    chart-plot-area-attlist,
    dr3d-light*,
    chart-axis*,
    chart-series*,
    chart-stock-gain-marker?,
    chart-stock-loss-marker?,
    chart-stock-range-line?,
    chart-wall?,
    chart-floor?
  }
chart-plot-area-attlist =
  common-draw-position-attlist
  & common-draw-size-attlist
  & attribute chart:style-name { styleNameRef }?
  & attribute table:cell-range-address { cellRangeAddressList }?
  & attribute chart:data-source-has-labels {
      "none" | "row" | "column" | "both"
    }?
  & dr3d-scene-attlist
  & common-dr3d-transform-attlist
  & xml-id?
chart-wall = element chart:wall { chart-wall-attlist, empty }
chart-wall-attlist =
  attribute svg:width { length }?
  & attribute chart:style-name { styleNameRef }?
chart-floor = element chart:floor { chart-floor-attlist, empty }
chart-floor-attlist =
  attribute svg:width { length }?
  & attribute chart:style-name { styleNameRef }?
chart-axis =
  element chart:axis {
    chart-axis-attlist, chart-title?, chart-categories?, chart-grid*
  }
chart-axis-attlist =
  attribute chart:dimension { chart-dimension }
  & attribute chart:name { \string }?
  & attribute chart:style-name { styleNameRef }?
chart-dimension = "x" | "y" | "z"
chart-categories =
  element chart:categories {
    attribute table:cell-range-address { cellRangeAddressList }?
  }
chart-grid = element chart:grid { chart-grid-attlist }
chart-grid-attlist =
  attribute chart:class { "major" | "minor" }?
  & attribute chart:style-name { styleNameRef }?
chart-series =
  element chart:series {
    chart-series-attlist,
    chart-domain*,
    chart-mean-value?,
    chart-regression-curve*,
    chart-error-indicator*,
    chart-data-point*,
    chart-data-label?
  }
chart-series-attlist =
  attribute chart:values-cell-range-address { cellRangeAddressList }?
  & attribute chart:label-cell-address { cellRangeAddressList }?
  & attribute chart:class { namespacedToken }?
  & attribute chart:attached-axis { \string }?
  & attribute chart:style-name { styleNameRef }?
  & xml-id?
chart-domain =
  element chart:domain {
    attribute table:cell-range-address { cellRangeAddressList }?
  }
chart-data-point =
  element chart:data-point {
    chart-data-point-attlist, chart-data-label?
  }
chart-data-point-attlist =
  attribute chart:repeated { positiveInteger }?
  & attribute chart:style-name { styleNameRef }?
  & xml-id?
chart-data-label =
  element chart:data-label { chart-data-label-attlist, text-p? }
chart-data-label-attlist =
  common-draw-position-attlist
  & attribute chart:style-name { styleNameRef }?
chart-mean-value =
  element chart:mean-value { chart-mean-value-attlist, empty }
chart-mean-value-attlist = attribute chart:style-name { styleNameRef }?
chart-error-indicator =
  element chart:error-indicator { chart-error-indicator-attlist, empty }
chart-error-indicator-attlist =
  attribute chart:style-name { styleNameRef }?
  & attribute chart:dimension { chart-dimension }
chart-regression-curve =
  element chart:regression-curve {
    chart-regression-curve-attlist, chart-equation?
  }
chart-regression-curve-attlist =
  attribute chart:style-name { styleNameRef }?
chart-equation =
  element chart:equation { chart-equation-attlist, text-p? }
chart-equation-attlist =
  attribute chart:automatic-content { boolean }?
  & attribute chart:display-r-square { boolean }?
  & attribute chart:display-equation { boolean }?
  & common-draw-position-attlist
  & attribute chart:style-name { styleNameRef }?
chart-stock-gain-marker =
  element chart:stock-gain-marker { common-stock-marker-attlist }
chart-stock-loss-marker =
  element chart:stock-loss-marker { common-stock-marker-attlist }
chart-stock-range-line =
  element chart:stock-range-line { common-stock-marker-attlist }
common-stock-marker-attlist =
  attribute chart:style-name { styleNameRef }?
office-database =
  element office:database {
    db-data-source,
    db-forms?,
    db-reports?,
    db-queries?,
    db-table-presentations?,
    db-schema-definition?
  }
db-data-source =
  element db:data-source {
    db-data-source-attlist,
    db-connection-data,
    db-driver-settings?,
    db-application-connection-settings?
  }
db-data-source-attlist = empty
db-connection-data =
  element db:connection-data {
    db-connection-data-attlist,
    (db-database-description | db-connection-resource),
    db-login?
  }
db-connection-data-attlist = empty
db-database-description =
  element db:database-description {
    db-database-description-attlist,
    (db-file-based-database | db-server-database)
  }
db-database-description-attlist = empty
db-file-based-database =
  element db:file-based-database { db-file-based-database-attlist }
db-file-based-database-attlist =
  attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute db:media-type { \string }
  & attribute db:extension { \string }?
db-server-database =
  element db:server-database { db-server-database-attlist, empty }
db-server-database-attlist =
  attribute db:type { namespacedToken }
  & (db-host-and-port | db-local-socket-name)
  & attribute db:database-name { \string }?
db-host-and-port =
  attribute db:hostname { \string },
  attribute db:port { positiveInteger }?
db-local-socket-name = attribute db:local-socket { \string }?
db-connection-resource =
  element db:connection-resource {
    db-connection-resource-attlist, empty
  }
db-connection-resource-attlist =
  attribute xlink:type { "simple" },
  attribute xlink:href { anyIRI },
  attribute xlink:show { "none" }?,
  attribute xlink:actuate { "onRequest" }?
db-login = element db:login { db-login-attlist, empty }
db-login-attlist =
  (attribute db:user-name { \string }
   | attribute db:use-system-user { boolean })?
  & attribute db:is-password-required { boolean }?
  & attribute db:login-timeout { positiveInteger }?
db-driver-settings =
  element db:driver-settings {
    db-driver-settings-attlist,
    db-auto-increment?,
    db-delimiter?,
    db-character-set?,
    db-table-settings?
  }
db-driver-settings-attlist =
  db-show-deleted
  & attribute db:system-driver-settings { \string }?
  & attribute db:base-dn { \string }?
  & db-is-first-row-header-line
  & attribute db:parameter-name-substitution { boolean }?
db-show-deleted = attribute db:show-deleted { boolean }?
db-is-first-row-header-line =
  attribute db:is-first-row-header-line { boolean }?
db-auto-increment =
  element db:auto-increment { db-auto-increment-attlist, empty }
db-auto-increment-attlist =
  attribute db:additional-column-statement { \string }?
  & attribute db:row-retrieving-statement { \string }?
db-delimiter = element db:delimiter { db-delimiter-attlist, empty }
db-delimiter-attlist =
  attribute db:field { \string }?
  & attribute db:string { \string }?
  & attribute db:decimal { \string }?
  & attribute db:thousand { \string }?
db-character-set =
  element db:character-set { db-character-set-attlist, empty }
db-character-set-attlist = attribute db:encoding { textEncoding }?
db-table-settings = element db:table-settings { db-table-setting* }
db-table-setting =
  element db:table-setting {
    db-table-setting-attlist, db-delimiter?, db-character-set?, empty
  }
db-table-setting-attlist = db-is-first-row-header-line, db-show-deleted
db-application-connection-settings =
  element db:application-connection-settings {
    db-application-connection-settings-attlist,
    db-table-filter?,
    db-table-type-filter?,
    db-data-source-settings?
  }
db-application-connection-settings-attlist =
  attribute db:is-table-name-length-limited { boolean }?
  & attribute db:enable-sql92-check { boolean }?
  & attribute db:append-table-alias-name { boolean }?
  & attribute db:ignore-driver-privileges { boolean }?
  & attribute db:boolean-comparison-mode {
      "equal-integer"
      | "is-boolean"
      | "equal-boolean"
      | "equal-use-only-zero"
    }?
  & attribute db:use-catalog { boolean }?
  & attribute db:max-row-count { integer }?
  & attribute db:suppress-version-columns { boolean }?
db-table-filter =
  element db:table-filter {
    db-table-filter-attlist,
    db-table-include-filter?,
    db-table-exclude-filter?
  }
db-table-filter-attlist = empty
db-table-include-filter =
  element db:table-include-filter {
    db-table-include-filter-attlist, db-table-filter-pattern+
  }
db-table-include-filter-attlist = empty
db-table-exclude-filter =
  element db:table-exclude-filter {
    db-table-exclude-filter-attlist, db-table-filter-pattern+
  }
db-table-exclude-filter-attlist = empty
db-table-filter-pattern =
  element db:table-filter-pattern {
    db-table-filter-pattern-attlist, \string
  }
db-table-filter-pattern-attlist = empty
db-table-type-filter =
  element db:table-type-filter {
    db-table-type-filter-attlist, db-table-type*
  }
db-table-type-filter-attlist = empty
db-table-type = element db:table-type { db-table-type-attlist, \string }
db-table-type-attlist = empty
db-data-source-settings =
  element db:data-source-settings {
    db-data-source-settings-attlist, db-data-source-setting+
  }
db-data-source-settings-attlist = empty
db-data-source-setting =
  element db:data-source-setting {
    db-data-source-setting-attlist, db-data-source-setting-value+
  }
db-data-source-setting-attlist =
  attribute db:data-source-setting-is-list { boolean }?
  & attribute db:data-source-setting-name { \string }
  & attribute db:data-source-setting-type {
      db-data-source-setting-types
    }
db-data-source-setting-types =
  "boolean" | "short" | "int" | "long" | "double" | "string"
db-data-source-setting-value =
  element db:data-source-setting-value {
    db-data-source-setting-value-attlist, \string
  }
db-data-source-setting-value-attlist = empty
db-forms =
  element db:forms {
    db-forms-attlist, (db-component | db-component-collection)*
  }
db-forms-attlist = empty
db-reports =
  element db:reports {
    db-reports-attlist, (db-component | db-component-collection)*
  }
db-reports-attlist = empty
db-component-collection =
  element db:component-collection {
    db-component-collection-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    (db-component | db-component-collection)*
  }
db-component-collection-attlist = empty
db-component =
  element db:component {
    db-component-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    (office-document | math-math)?
  }
db-component-attlist =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute xlink:show { "none" }?,
   attribute xlink:actuate { "onRequest" }?)?
  & attribute db:as-template { boolean }?
db-queries =
  element db:queries {
    db-queries-attlist, (db-query | db-query-collection)*
  }
db-queries-attlist = empty
db-query-collection =
  element db:query-collection {
    db-query-collection-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    (db-query | db-query-collection)*
  }
db-query-collection-attlist = empty
db-query =
  element db:query {
    db-query-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    common-db-table-style-name,
    db-order-statement?,
    db-filter-statement?,
    db-columns?,
    db-update-table?
  }
db-query-attlist =
  attribute db:command { \string }
  & attribute db:escape-processing { boolean }?
db-order-statement =
  element db:order-statement { db-command, db-apply-command, empty }
db-filter-statement =
  element db:filter-statement { db-command, db-apply-command, empty }
db-update-table =
  element db:update-table { common-db-table-name-attlist }
db-table-presentations =
  element db:table-representations {
    db-table-presentations-attlist, db-table-presentation*
  }
db-table-presentations-attlist = empty
db-table-presentation =
  element db:table-representation {
    db-table-presentation-attlist,
    common-db-table-name-attlist,
    common-db-object-title,
    common-db-object-description,
    common-db-table-style-name,
    db-order-statement?,
    db-filter-statement?,
    db-columns?
  }
db-table-presentation-attlist = empty
db-columns = element db:columns { db-columns-attlist, db-column+ }
db-columns-attlist = empty
db-column =
  element db:column {
    db-column-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    common-db-default-value
  }
db-column-attlist =
  attribute db:visible { boolean }?
  & attribute db:style-name { styleNameRef }?
  & attribute db:default-cell-style-name { styleNameRef }?
db-command = attribute db:command { \string }
db-apply-command = attribute db:apply-command { boolean }?
common-db-table-name-attlist =
  attribute db:name { \string }
  & attribute db:catalog-name { \string }?
  & attribute db:schema-name { \string }?
common-db-object-name = attribute db:name { \string }
common-db-object-title = attribute db:title { \string }?
common-db-object-description = attribute db:description { \string }?
common-db-table-style-name =
  attribute db:style-name { styleNameRef }?
  & attribute db:default-row-style-name { styleNameRef }?
common-db-default-value = common-value-and-type-attlist?
db-schema-definition =
  element db:schema-definition {
    db-schema-definition-attlist, db-table-definitions
  }
db-schema-definition-attlist = empty
db-table-definitions =
  element db:table-definitions {
    db-table-definitions-attlist, db-table-definition*
  }
db-table-definitions-attlist = empty
db-table-definition =
  element db:table-definition {
    common-db-table-name-attlist,
    db-table-definition-attlist,
    db-column-definitions,
    db-keys?,
    db-indices?
  }
db-table-definition-attlist = attribute db:type { \string }?
db-column-definitions =
  element db:column-definitions {
    db-column-definitions-attlist, db-column-definition+
  }
db-column-definitions-attlist = empty
db-column-definition =
  element db:column-definition {
    db-column-definition-attlist, common-db-default-value
  }
db-column-definition-attlist =
  attribute db:name { \string }
  & attribute db:data-type { db-data-types }?
  & attribute db:type-name { \string }?
  & attribute db:precision { positiveInteger }?
  & attribute db:scale { positiveInteger }?
  & attribute db:is-nullable { "no-nulls" | "nullable" }?
  & attribute db:is-empty-allowed { boolean }?
  & attribute db:is-autoincrement { boolean }?
db-data-types =
  "bit"
  | "boolean"
  | "tinyint"
  | "smallint"
  | "integer"
  | "bigint"
  | "float"
  | "real"
  | "double"
  | "numeric"
  | "decimal"
  | "char"
  | "varchar"
  | "longvarchar"
  | "date"
  | "time"
  | "timestmp"
  | "binary"
  | "varbinary"
  | "longvarbinary"
  | "sqlnull"
  | "other"
  | "object"
  | "distinct"
  | "struct"
  | "array"
  | "blob"
  | "clob"
  | "ref"
db-keys = element db:keys { db-keys-attlist, db-key+ }
db-keys-attlist = empty
db-key = element db:key { db-key-attlist, db-key-columns+ }
db-key-attlist =
  attribute db:name { \string }?
  & attribute db:type { "primary" | "unique" | "foreign" }
  & attribute db:referenced-table-name { \string }?
  & attribute db:update-rule {
      "cascade" | "restrict" | "set-null" | "no-action" | "set-default"
    }?
  & attribute db:delete-rule {
      "cascade" | "restrict" | "set-null" | "no-action" | "set-default"
    }?
db-key-columns =
  element db:key-columns { db-key-columns-attlist, db-key-column+ }
db-key-columns-attlist = empty
db-key-column = element db:key-column { db-key-column-attlist, empty }
db-key-column-attlist =
  attribute db:name { \string }?
  & attribute db:related-column-name { \string }?
db-indices = element db:indices { db-indices-attlist, db-index+ }
db-indices-attlist = empty
db-index = element db:index { db-index-attlist, db-index-columns+ }
db-index-attlist =
  attribute db:name { \string }
  & attribute db:catalog-name { \string }?
  & attribute db:is-unique { boolean }?
  & attribute db:is-clustered { boolean }?
db-index-columns = element db:index-columns { db-index-column+ }
db-index-column =
  element db:index-column { db-index-column-attlist, empty }
db-index-column-attlist =
  attribute db:name { \string }
  & attribute db:is-ascending { boolean }?
office-forms =
  element office:forms {
    office-forms-attlist, (form-form | xforms-model)*
  }?
office-forms-attlist =
  attribute form:automatic-focus { boolean }?
  & attribute form:apply-design-mode { boolean }?
form-form =
  element form:form {
    common-form-control-attlist,
    form-form-attlist,
    form-properties?,
    office-event-listeners?,
    (controls | form-form)*,
    form-connection-resource?
  }
form-form-attlist =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute xlink:actuate { "onRequest" }?)?
  & attribute office:target-frame { targetFrameName }?
  & attribute form:method { "get" | "post" | \string }?
  & attribute form:enctype { \string }?
  & attribute form:allow-deletes { boolean }?
  & attribute form:allow-inserts { boolean }?
  & attribute form:allow-updates { boolean }?
  & attribute form:apply-filter { boolean }?
  & attribute form:command-type { "table" | "query" | "command" }?
  & attribute form:command { \string }?
  & attribute form:datasource { anyIRI | \string }?
  & attribute form:master-fields { \string }?
  & attribute form:detail-fields { \string }?
  & attribute form:escape-processing { boolean }?
  & attribute form:filter { \string }?
  & attribute form:ignore-result { boolean }?
  & attribute form:navigation-mode { navigation }?
  & attribute form:order { \string }?
  & attribute form:tab-cycle { tab-cycles }?
navigation = "none" | "current" | "parent"
tab-cycles = "records" | "current" | "page"
form-connection-resource =
  element form:connection-resource {
    attribute xlink:href { anyIRI },
    empty
  }
xforms-model = element xforms:model { anyAttListOrElements }
column-controls =
  element form:text { form-text-attlist, common-form-control-content }
  | element form:textarea {
      form-textarea-attlist, common-form-control-content, text-p*
    }
  | element form:formatted-text {
      form-formatted-text-attlist, common-form-control-content
    }
  | element form:number {
      form-number-attlist,
      common-numeric-control-attlist,
      common-form-control-content,
      common-linked-cell,
      common-spin-button,
      common-repeat,
      common-delay-for-repeat
    }
  | element form:date {
      form-date-attlist,
      common-numeric-control-attlist,
      common-form-control-content,
      common-linked-cell,
      common-spin-button,
      common-repeat,
      common-delay-for-repeat
    }
  | element form:time {
      form-time-attlist,
      common-numeric-control-attlist,
      common-form-control-content,
      common-linked-cell,
      common-spin-button,
      common-repeat,
      common-delay-for-repeat
    }
  | element form:combobox {
      form-combobox-attlist, common-form-control-content, form-item*
    }
  | element form:listbox {
      form-listbox-attlist, common-form-control-content, form-option*
    }
  | element form:checkbox {
      form-checkbox-attlist, common-form-control-content
    }
controls =
  column-controls
  | element form:password {
      form-password-attlist, common-form-control-content
    }
  | element form:file { form-file-attlist, common-form-control-content }
  | element form:fixed-text {
      form-fixed-text-attlist, common-form-control-content
    }
  | element form:button {
      form-button-attlist, common-form-control-content
    }
  | element form:image {
      form-image-attlist, common-form-control-content
    }
  | element form:radio {
      form-radio-attlist, common-form-control-content
    }
  | element form:frame {
      form-frame-attlist, common-form-control-content
    }
  | element form:image-frame {
      form-image-frame-attlist, common-form-control-content
    }
  | element form:hidden {
      form-hidden-attlist, common-form-control-content
    }
  | element form:grid {
      form-grid-attlist, common-form-control-content, form-column*
    }
  | element form:value-range {
      form-value-range-attlist, common-form-control-content
    }
  | element form:generic-control {
      form-generic-control-attlist, common-form-control-content
    }
form-text-attlist =
  form-control-attlist,
  common-current-value-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-convert-empty-attlist,
  common-data-field-attlist,
  common-linked-cell
form-control-attlist =
  common-form-control-attlist,
  common-control-id-attlist,
  xforms-bind-attlist
common-form-control-content = form-properties?, office-event-listeners?
form-textarea-attlist =
  form-control-attlist,
  common-current-value-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-convert-empty-attlist,
  common-data-field-attlist,
  common-linked-cell
form-password-attlist =
  form-control-attlist
  & common-disabled-attlist
  & common-maxlength-attlist
  & common-printable-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-convert-empty-attlist
  & common-linked-cell
  & attribute form:echo-char { character }?
form-file-attlist =
  form-control-attlist,
  common-current-value-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-linked-cell
form-formatted-text-attlist =
  form-control-attlist
  & common-current-value-attlist
  & common-disabled-attlist
  & common-maxlength-attlist
  & common-printable-attlist
  & common-readonly-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-convert-empty-attlist
  & common-data-field-attlist
  & common-linked-cell
  & common-spin-button
  & common-repeat
  & common-delay-for-repeat
  & attribute form:max-value { \string }?
  & attribute form:min-value { \string }?
  & attribute form:validation { boolean }?
common-numeric-control-attlist =
  form-control-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-convert-empty-attlist,
  common-data-field-attlist
form-number-attlist =
  attribute form:value { double }?
  & attribute form:current-value { double }?
  & attribute form:min-value { double }?
  & attribute form:max-value { double }?
form-date-attlist =
  attribute form:value { date }?
  & attribute form:current-value { date }?
  & attribute form:min-value { date }?
  & attribute form:max-value { date }?
form-time-attlist =
  attribute form:value { time }?
  & attribute form:current-value { time }?
  & attribute form:min-value { time }?
  & attribute form:max-value { time }?
form-fixed-text-attlist =
  form-control-attlist
  & for
  & common-disabled-attlist
  & label
  & common-printable-attlist
  & common-title-attlist
  & attribute form:multi-line { boolean }?
form-combobox-attlist =
  form-control-attlist
  & common-current-value-attlist
  & common-disabled-attlist
  & dropdown
  & common-maxlength-attlist
  & common-printable-attlist
  & common-readonly-attlist
  & size
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-convert-empty-attlist
  & common-data-field-attlist
  & list-source
  & list-source-type
  & common-linked-cell
  & common-source-cell-range
  & attribute form:auto-complete { boolean }?
form-item = element form:item { form-item-attlist, text }
form-item-attlist = label
form-listbox-attlist =
  form-control-attlist
  & common-disabled-attlist
  & dropdown
  & common-printable-attlist
  & size
  & common-tab-attlist
  & common-title-attlist
  & bound-column
  & common-data-field-attlist
  & list-source
  & list-source-type
  & common-linked-cell
  & list-linkage-type
  & common-source-cell-range
  & attribute form:multiple { boolean }?
  & attribute form:xforms-list-source { \string }?
list-linkage-type =
  attribute form:list-linkage-type {
    "selection" | "selection-indices"
  }?
form-option = element form:option { form-option-attlist, text }
form-option-attlist =
  current-selected, selected, label, common-value-attlist
form-button-attlist =
  form-control-attlist
  & button-type
  & common-disabled-attlist
  & label
  & image-data
  & common-printable-attlist
  & common-tab-attlist
  & target-frame
  & target-location
  & common-title-attlist
  & common-value-attlist
  & common-form-relative-image-position-attlist
  & common-repeat
  & common-delay-for-repeat
  & attribute form:default-button { boolean }?
  & attribute form:toggle { boolean }?
  & attribute form:focus-on-click { boolean }?
  & attribute form:xforms-submission { \string }?
form-image-attlist =
  form-control-attlist,
  button-type,
  common-disabled-attlist,
  image-data,
  common-printable-attlist,
  common-tab-attlist,
  target-frame,
  target-location,
  common-title-attlist,
  common-value-attlist
form-checkbox-attlist =
  form-control-attlist
  & common-disabled-attlist
  & label
  & common-printable-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-data-field-attlist
  & common-form-visual-effect-attlist
  & common-form-relative-image-position-attlist
  & common-linked-cell
  & attribute form:current-state { states }?
  & attribute form:is-tristate { boolean }?
  & attribute form:state { states }?
states = "unchecked" | "checked" | "unknown"
form-radio-attlist =
  form-control-attlist,
  current-selected,
  common-disabled-attlist,
  label,
  common-printable-attlist,
  selected,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-data-field-attlist,
  common-form-visual-effect-attlist,
  common-form-relative-image-position-attlist,
  common-linked-cell
form-frame-attlist =
  form-control-attlist,
  common-disabled-attlist,
  for,
  label,
  common-printable-attlist,
  common-title-attlist
form-image-frame-attlist =
  form-control-attlist,
  common-disabled-attlist,
  image-data,
  common-printable-attlist,
  common-readonly-attlist,
  common-title-attlist,
  common-data-field-attlist
form-hidden-attlist = form-control-attlist, common-value-attlist
form-grid-attlist =
  form-control-attlist,
  common-disabled-attlist,
  common-printable-attlist,
  common-tab-attlist,
  common-title-attlist
form-column =
  element form:column { form-column-attlist, column-controls+ }
form-column-attlist =
  common-form-control-attlist, label, text-style-name
text-style-name = attribute form:text-style-name { styleNameRef }?
form-value-range-attlist =
  form-control-attlist
  & common-disabled-attlist
  & common-printable-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-linked-cell
  & common-repeat
  & common-delay-for-repeat
  & attribute form:max-value { integer }?
  & attribute form:min-value { integer }?
  & attribute form:step-size { positiveInteger }?
  & attribute form:page-step-size { positiveInteger }?
  & attribute form:orientation { "horizontal" | "vertical" }?
form-generic-control-attlist = form-control-attlist
common-form-control-attlist =
  attribute form:name { \string }?
  & attribute form:control-implementation { namespacedToken }?
xforms-bind-attlist = attribute xforms:bind { \string }?
types = "submit" | "reset" | "push" | "url"
button-type = attribute form:button-type { types }?
common-control-id-attlist =
  xml-id,
  attribute form:id { NCName }?
current-selected = attribute form:current-selected { boolean }?
common-value-attlist = attribute form:value { \string }?
common-current-value-attlist = attribute form:current-value { \string }?
common-disabled-attlist = attribute form:disabled { boolean }?
dropdown = attribute form:dropdown { boolean }?
for = attribute form:for { \string }?
image-data = attribute form:image-data { anyIRI }?
label = attribute form:label { \string }?
common-maxlength-attlist =
  attribute form:max-length { nonNegativeInteger }?
common-printable-attlist = attribute form:printable { boolean }?
common-readonly-attlist = attribute form:readonly { boolean }?
selected = attribute form:selected { boolean }?
size = attribute form:size { nonNegativeInteger }?
common-tab-attlist =
  attribute form:tab-index { nonNegativeInteger }?
  & attribute form:tab-stop { boolean }?
target-frame = attribute office:target-frame { targetFrameName }?
target-location = attribute xlink:href { anyIRI }?
common-title-attlist = attribute form:title { \string }?
common-form-visual-effect-attlist =
  attribute form:visual-effect { "flat" | "3d" }?
common-form-relative-image-position-attlist =
  attribute form:image-position { "center" }?
  | (attribute form:image-position {
       "start" | "end" | "top" | "bottom"
     },
     attribute form:image-align { "start" | "center" | "end" }?)
bound-column = attribute form:bound-column { \string }?
common-convert-empty-attlist =
  attribute form:convert-empty-to-null { boolean }?
common-data-field-attlist = attribute form:data-field { \string }?
list-source = attribute form:list-source { \string }?
list-source-type =
  attribute form:list-source-type {
    "table"
    | "query"
    | "sql"
    | "sql-pass-through"
    | "value-list"
    | "table-fields"
  }?
common-linked-cell =
  attribute form:linked-cell { cellAddress | \string }?
common-source-cell-range =
  attribute form:source-cell-range { cellRangeAddress | \string }?
common-spin-button = attribute form:spin-button { boolean }?
common-repeat = attribute form:repeat { boolean }?
common-delay-for-repeat = attribute form:delay-for-repeat { duration }?
form-properties = element form:properties { form-property+ }
form-property =
  element form:property {
    form-property-name, form-property-value-and-type-attlist
  }
  | element form:list-property {
      form-property-name, form-property-type-and-value-list
    }
form-property-name = attribute form:property-name { \string }
form-property-value-and-type-attlist =
  common-value-and-type-attlist
  | attribute office:value-type { "void" }
form-property-type-and-value-list =
  (attribute office:value-type { "float" },
   element form:list-value {
     attribute office:value { double }
   }*)
  | (attribute office:value-type { "percentage" },
     element form:list-value {
       attribute office:value { double }
     }*)
  | (attribute office:value-type { "currency" },
     element form:list-value {
       attribute office:value { double },
       attribute office:currency { \string }?
     }*)
  | (attribute office:value-type { "date" },
     element form:list-value {
       attribute office:date-value { dateOrDateTime }
     }*)
  | (attribute office:value-type { "time" },
     element form:list-value {
       attribute office:time-value { duration }
     }*)
  | (attribute office:value-type { "boolean" },
     element form:list-value {
       attribute office:boolean-value { boolean }
     }*)
  | (attribute office:value-type { "string" },
     element form:list-value {
       attribute office:string-value { \string }
     }*)
  | attribute office:value-type { "void" }
office-annotation =
  element office:annotation {
    office-annotation-attlist,
    draw-caption-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    dc-creator?,
    dc-date?,
    meta-date-string?,
    (text-p | text-list)*
  }
office-annotation-end =
  element office:annotation-end { office-annotation-end-attlist }
office-annotation-attlist =
  attribute office:display { boolean }?
  & common-office-annotation-name-attlist?
office-annotation-end-attlist = common-office-annotation-name-attlist
common-office-annotation-name-attlist =
  attribute office:name { \string }
meta-date-string = element meta:date-string { \string }
common-num-format-prefix-suffix-attlist =
  attribute style:num-prefix { \string }?,
  attribute style:num-suffix { \string }?
common-num-format-attlist =
  attribute style:num-format { "1" | "i" | "I" | \string | empty }
  | (attribute style:num-format { "a" | "A" },
     style-num-letter-sync-attlist)
  | empty
style-num-letter-sync-attlist =
  attribute style:num-letter-sync { boolean }?
office-change-info =
  element office:change-info { dc-creator, dc-date, text-p* }
office-event-listeners =
  element office:event-listeners {
    (script-event-listener | presentation-event-listener)*
  }
script-event-listener =
  element script:event-listener { script-event-listener-attlist, empty }
script-event-listener-attlist =
  attribute script:event-name { \string }
  & attribute script:language { \string }
  & (attribute script:macro-name { \string }
     | (attribute xlink:type { "simple" },
        attribute xlink:href { anyIRI },
        attribute xlink:actuate { "onRequest" }?))
math-math = element math:math { mathMarkup }
[
  dc:description [
    "To avoid inclusion of the complete MathML schema, anything is allowed within a math:math top-level element"
  ]
]
mathMarkup =
  (attribute * { text }
   | text
   | element * { mathMarkup })*
text-dde-connection-decl =
  element text:dde-connection-decl {
    text-dde-connection-decl-attlist, common-dde-connection-decl-attlist
  }
text-dde-connection-decl-attlist = attribute office:name { \string }
common-dde-connection-decl-attlist =
  attribute office:dde-application { \string }
  & attribute office:dde-topic { \string }
  & attribute office:dde-item { \string }
  & attribute office:automatic-update { boolean }?
table-dde-link =
  element table:dde-link { office-dde-source, table-table }
office-dde-source =
  element office:dde-source {
    office-dde-source-attlist, common-dde-connection-decl-attlist
  }
office-dde-source-attlist =
  attribute office:name { \string }?
  & attribute office:conversion-mode {
      "into-default-style-data-style"
      | "into-english-number"
      | "keep-text"
    }?
animation-element =
  element anim:animate {
    common-anim-target-attlist,
    common-anim-named-target-attlist,
    common-anim-values-attlist,
    common-anim-spline-mode-attlist,
    common-spline-anim-value-attlist,
    common-timing-attlist,
    common-anim-add-accum-attlist
  }
  | element anim:set {
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-set-values-attlist,
      common-timing-attlist,
      common-anim-add-accum-attlist
    }
  | element anim:animateMotion {
      anim-animate-motion-attlist,
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      common-timing-attlist,
      common-spline-anim-value-attlist
    }
  | element anim:animateColor {
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      common-anim-spline-mode-attlist,
      common-spline-anim-value-attlist,
      anim-animate-color-attlist,
      common-timing-attlist
    }
  | element anim:animateTransform {
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      anim-animate-transform-attlist,
      common-timing-attlist
    }
  | element anim:transitionFilter {
      common-anim-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      common-anim-spline-mode-attlist,
      anim-transition-filter-attlist,
      common-timing-attlist
    }
  | element anim:par {
      common-anim-attlist,
      common-timing-attlist,
      common-endsync-timing-attlist,
      animation-element*
    }
  | element anim:seq {
      common-anim-attlist,
      common-endsync-timing-attlist,
      common-timing-attlist,
      animation-element*
    }
  | element anim:iterate {
      common-anim-attlist,
      anim-iterate-attlist,
      common-timing-attlist,
      common-endsync-timing-attlist,
      animation-element*
    }
  | element anim:audio {
      common-anim-attlist,
      anim-audio-attlist,
      common-basic-timing-attlist
    }
  | element anim:command {
      common-anim-attlist,
      anim-command-attlist,
      common-begin-end-timing-attlist,
      common-anim-target-attlist,
      element anim:param {
        attribute anim:name { \string },
        attribute anim:value { \string }
      }*
    }
anim-animate-motion-attlist =
  attribute svg:path { pathData }?
  & attribute svg:origin { \string }?
  & attribute smil:calcMode {
      "discrete" | "linear" | "paced" | "spline"
    }?
anim-animate-color-attlist =
  attribute anim:color-interpolation { "rgb" | "hsl" }?
  & attribute anim:color-interpolation-direction {
      "clockwise" | "counter-clockwise"
    }?
anim-animate-transform-attlist =
  attribute svg:type {
    "translate" | "scale" | "rotate" | "skewX" | "skewY"
  }
anim-transition-filter-attlist =
  attribute smil:type { \string }
  & attribute smil:subtype { \string }?
  & attribute smil:direction { "forward" | "reverse" }?
  & attribute smil:fadeColor { color }?
  & attribute smil:mode { "in" | "out" }?
common-anim-target-attlist =
  attribute smil:targetElement { IDREF }?
  & attribute anim:sub-item { \string }?
common-anim-named-target-attlist =
  attribute smil:attributeName { \string }
common-anim-values-attlist =
  attribute smil:values { \string }?
  & attribute anim:formula { \string }?
  & common-anim-set-values-attlist
  & attribute smil:from { \string }?
  & attribute smil:by { \string }?
common-anim-spline-mode-attlist =
  attribute smil:calcMode {
    "discrete" | "linear" | "paced" | "spline"
  }?
common-spline-anim-value-attlist =
  attribute smil:keyTimes { \string }?
  & attribute smil:keySplines { \string }?
common-anim-add-accum-attlist =
  attribute smil:accumulate { "none" | "sum" }?
  & attribute smil:additive { "replace" | "sum" }?
common-anim-set-values-attlist = attribute smil:to { \string }?
common-begin-end-timing-attlist =
  attribute smil:begin { \string }?
  & attribute smil:end { \string }?
common-dur-timing-attlist = attribute smil:dur { \string }?
common-endsync-timing-attlist =
  attribute smil:endsync { "first" | "last" | "all" | "media" | IDREF }?
common-repeat-timing-attlist =
  attribute smil:repeatDur { \string }?,
  attribute smil:repeatCount { nonNegativeDecimal | "indefinite" }?
nonNegativeDecimal = xsd:decimal { minInclusive = "0.0" }
common-fill-timing-attlist =
  attribute smil:fill {
    "remove" | "freeze" | "hold" | "auto" | "default" | "transition"
  }?
common-fill-default-attlist =
  attribute smil:fillDefault {
    "remove" | "freeze" | "hold" | "transition" | "auto" | "inherit"
  }?
common-restart-timing-attlist =
  attribute smil:restart {
    "never" | "always" | "whenNotActive" | "default"
  }?
common-restart-default-attlist =
  attribute smil:restartDefault {
    "never" | "always" | "whenNotActive" | "inherit"
  }?
common-time-manip-attlist =
  attribute smil:accelerate { zeroToOneDecimal }?
  & attribute smil:decelerate { zeroToOneDecimal }?
  & attribute smil:autoReverse { boolean }?
zeroToOneDecimal = xsd:decimal { minInclusive = "0" maxInclusive = "1" }
common-basic-timing-attlist =
  common-begin-end-timing-attlist,
  common-dur-timing-attlist,
  common-repeat-timing-attlist,
  common-restart-timing-attlist,
  common-restart-default-attlist,
  common-fill-timing-attlist,
  common-fill-default-attlist
common-timing-attlist =
  common-basic-timing-attlist, common-time-manip-attlist
anim-iterate-attlist =
  common-anim-target-attlist
  & attribute anim:iterate-type { \string }?
  & attribute anim:iterate-interval { duration }?
anim-audio-attlist =
  attribute xlink:href { anyIRI }?
  & attribute anim:audio-level { double }?
anim-command-attlist = attribute anim:command { \string }
style-style =
  element style:style {
    style-style-attlist, style-style-content, style-map*
  }
common-in-content-meta-attlist =
  attribute xhtml:about { URIorSafeCURIE },
  attribute xhtml:property { CURIEs },
  common-meta-literal-attlist
common-meta-literal-attlist =
  attribute xhtml:datatype { CURIE }?,
  attribute xhtml:content { \string }?
xml-id = attribute xml:id { ID }
style-style-attlist =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute style:parent-style-name { styleNameRef }?
  & attribute style:next-style-name { styleNameRef }?
  & attribute style:list-level { positiveInteger | empty }?
  & attribute style:list-style-name { styleName | empty }?
  & attribute style:master-page-name { styleNameRef }?
  & attribute style:auto-update { boolean }?
  & attribute style:data-style-name { styleNameRef }?
  & attribute style:percentage-data-style-name { styleNameRef }?
  & attribute style:class { \string }?
  & attribute style:default-outline-level { positiveInteger | empty }?
style-map = element style:map { style-map-attlist, empty }
style-map-attlist =
  attribute style:condition { \string }
  & attribute style:apply-style-name { styleNameRef }
  & attribute style:base-cell-address { cellAddress }?
style-default-style =
  element style:default-style { style-style-content }
style-page-layout =
  element style:page-layout {
    style-page-layout-attlist, style-page-layout-content
  }
style-page-layout-content =
  style-page-layout-properties?,
  style-header-style?,
  style-footer-style?
style-page-layout-attlist =
  attribute style:name { styleName }
  & attribute style:page-usage {
      "all" | "left" | "right" | "mirrored"
    }?
style-header-style =
  element style:header-style { style-header-footer-properties? }
style-footer-style =
  element style:footer-style { style-header-footer-properties? }
style-default-page-layout =
  element style:default-page-layout { style-page-layout-content }
style-master-page =
  element style:master-page {
    style-master-page-attlist,
    (style-header, style-header-left?)?,
    (style-footer, style-footer-left?)?,
    draw-layer-set?,
    office-forms?,
    shape*,
    animation-element?,
    presentation-notes?
  }
style-master-page-attlist =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute style:page-layout-name { styleNameRef }
  & attribute draw:style-name { styleNameRef }?
  & attribute style:next-style-name { styleNameRef }?
style-header =
  element style:header {
    common-style-header-footer-attlist, header-footer-content
  }
style-footer =
  element style:footer {
    common-style-header-footer-attlist, header-footer-content
  }
style-header-left =
  element style:header-left {
    common-style-header-footer-attlist, header-footer-content
  }
style-footer-left =
  element style:footer-left {
    common-style-header-footer-attlist, header-footer-content
  }
header-footer-content =
  (text-tracked-changes,
   text-decls,
   (text-h
    | text-p
    | text-list
    | table-table
    | text-section
    | text-table-of-content
    | text-illustration-index
    | text-table-index
    | text-object-index
    | text-user-index
    | text-alphabetical-index
    | text-bibliography
    | text-index-title
    | change-marks)*)
  | (style-region-left?, style-region-center?, style-region-right?)
common-style-header-footer-attlist =
  attribute style:display { boolean }?
style-region-left = element style:region-left { region-content }
style-region-center = element style:region-center { region-content }
style-region-right = element style:region-right { region-content }
region-content = text-p*
presentation-notes =
  element presentation:notes {
    common-presentation-header-footer-attlist,
    presentation-notes-attlist,
    office-forms,
    shape*
  }
presentation-notes-attlist =
  attribute style:page-layout-name { styleNameRef }?
  & attribute draw:style-name { styleNameRef }?
table-table-template =
  element table:table-template {
    table-table-template-attlist,
    table-first-row?,
    table-last-row?,
    table-first-column?,
    table-last-column?,
    table-body,
    table-even-rows?,
    table-odd-rows?,
    table-even-columns?,
    table-odd-columns?,
    table-background?
  }
table-table-template-attlist =
  attribute table:name { \string }
  & attribute table:first-row-start-column { rowOrCol }
  & attribute table:first-row-end-column { rowOrCol }
  & attribute table:last-row-start-column { rowOrCol }
  & attribute table:last-row-end-column { rowOrCol }
rowOrCol = "row" | "column"
table-first-row =
  element table:first-row { common-table-template-attlist, empty }
table-last-row =
  element table:last-row { common-table-template-attlist, empty }
table-first-column =
  element table:first-column { common-table-template-attlist, empty }
table-last-column =
  element table:last-column { common-table-template-attlist, empty }
table-body = element table:body { common-table-template-attlist, empty }
table-even-rows =
  element table:even-rows { common-table-template-attlist, empty }
table-odd-rows =
  element table:odd-rows { common-table-template-attlist, empty }
table-even-columns =
  element table:even-columns { common-table-template-attlist, empty }
table-odd-columns =
  element table:odd-columns { common-table-template-attlist, empty }
common-table-template-attlist =
  attribute table:style-name { styleNameRef },
  attribute table:paragraph-style-name { styleNameRef }?
table-background =
  element table:background { table-background-attlist, empty }
table-background-attlist = attribute table:style-name { styleNameRef }
style-font-face =
  element style:font-face {
    style-font-face-attlist, svg-font-face-src?, svg-definition-src?
  }
style-font-face-attlist =
  attribute svg:font-family { \string }?
  & attribute svg:font-style { fontStyle }?
  & attribute svg:font-variant { fontVariant }?
  & attribute svg:font-weight { fontWeight }?
  & attribute svg:font-stretch {
      "normal"
      | "ultra-condensed"
      | "extra-condensed"
      | "condensed"
      | "semi-condensed"
      | "semi-expanded"
      | "expanded"
      | "extra-expanded"
      | "ultra-expanded"
    }?
  & attribute svg:font-size { positiveLength }?
  & attribute svg:unicode-range { \string }?
  & attribute svg:units-per-em { integer }?
  & attribute svg:panose-1 { \string }?
  & attribute svg:stemv { integer }?
  & attribute svg:stemh { integer }?
  & attribute svg:slope { integer }?
  & attribute svg:cap-height { integer }?
  & attribute svg:x-height { integer }?
  & attribute svg:accent-height { integer }?
  & attribute svg:ascent { integer }?
  & attribute svg:descent { integer }?
  & attribute svg:widths { \string }?
  & attribute svg:bbox { \string }?
  & attribute svg:ideographic { integer }?
  & attribute svg:alphabetic { integer }?
  & attribute svg:mathematical { integer }?
  & attribute svg:hanging { integer }?
  & attribute svg:v-ideographic { integer }?
  & attribute svg:v-alphabetic { integer }?
  & attribute svg:v-mathematical { integer }?
  & attribute svg:v-hanging { integer }?
  & attribute svg:underline-position { integer }?
  & attribute svg:underline-thickness { integer }?
  & attribute svg:strikethrough-position { integer }?
  & attribute svg:strikethrough-thickness { integer }?
  & attribute svg:overline-position { integer }?
  & attribute svg:overline-thickness { integer }?
  & attribute style:name { \string }
  & attribute style:font-adornments { \string }?
  & attribute style:font-family-generic { fontFamilyGeneric }?
  & attribute style:font-pitch { fontPitch }?
  & attribute style:font-charset { textEncoding }?
svg-font-face-src =
  element svg:font-face-src {
    (svg-font-face-uri | svg-font-face-name)+
  }
svg-font-face-uri =
  element svg:font-face-uri {
    common-svg-font-face-xlink-attlist, svg-font-face-format*
  }
svg-font-face-format =
  element svg:font-face-format {
    attribute svg:string { \string }?,
    empty
  }
svg-font-face-name =
  element svg:font-face-name {
    attribute svg:name { \string }?,
    empty
  }
svg-definition-src =
  element svg:definition-src {
    common-svg-font-face-xlink-attlist, empty
  }
common-svg-font-face-xlink-attlist =
  attribute xlink:type { "simple" },
  attribute xlink:href { anyIRI },
  attribute xlink:actuate { "onRequest" }?
number-number-style =
  element number:number-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    (any-number, number-text?)?,
    style-map*
  }
any-number = number-number | number-scientific-number | number-fraction
number-number =
  element number:number {
    number-number-attlist,
    common-decimal-places-attlist,
    common-number-attlist,
    number-embedded-text*
  }
number-number-attlist =
  attribute number:decimal-replacement { \string }?
  & attribute number:display-factor { double }?
number-embedded-text =
  element number:embedded-text { number-embedded-text-attlist, text }
number-embedded-text-attlist = attribute number:position { integer }
number-scientific-number =
  element number:scientific-number {
    number-scientific-number-attlist,
    common-decimal-places-attlist,
    common-number-attlist,
    empty
  }
number-scientific-number-attlist =
  attribute number:min-exponent-digits { integer }?
number-fraction =
  element number:fraction {
    number-fraction-attlist, common-number-attlist, empty
  }
number-fraction-attlist =
  attribute number:min-numerator-digits { integer }?
  & attribute number:min-denominator-digits { integer }?
  & attribute number:denominator-value { integer }?
number-currency-style =
  element number:currency-style {
    common-data-style-attlist,
    common-auto-reorder-attlist,
    style-text-properties?,
    number-text?,
    ((number-and-text, currency-symbol-and-text?)
     | (currency-symbol-and-text, number-and-text?))?,
    style-map*
  }
currency-symbol-and-text = number-currency-symbol, number-text?
number-and-text = number-number, number-text?
number-currency-symbol =
  element number:currency-symbol {
    number-currency-symbol-attlist, text
  }
number-currency-symbol-attlist =
  attribute number:language { languageCode }?,
  attribute number:country { countryCode }?,
  attribute number:script { scriptCode }?,
  attribute number:rfc-language-tag { language }?
number-percentage-style =
  element number:percentage-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    number-and-text?,
    style-map*
  }
number-date-style =
  element number:date-style {
    common-data-style-attlist,
    common-auto-reorder-attlist,
    common-format-source-attlist,
    style-text-properties?,
    number-text?,
    (any-date, number-text?)+,
    style-map*
  }
any-date =
  number-day
  | number-month
  | number-year
  | number-era
  | number-day-of-week
  | number-week-of-year
  | number-quarter
  | number-hours
  | number-am-pm
  | number-minutes
  | number-seconds
number-day =
  element number:day {
    number-day-attlist, common-calendar-attlist, empty
  }
number-day-attlist = attribute number:style { "short" | "long" }?
number-month =
  element number:month {
    number-month-attlist, common-calendar-attlist, empty
  }
number-month-attlist =
  attribute number:textual { boolean }?
  & attribute number:possessive-form { boolean }?
  & attribute number:style { "short" | "long" }?
number-year =
  element number:year {
    number-year-attlist, common-calendar-attlist, empty
  }
number-year-attlist = attribute number:style { "short" | "long" }?
number-era =
  element number:era {
    number-era-attlist, common-calendar-attlist, empty
  }
number-era-attlist = attribute number:style { "short" | "long" }?
number-day-of-week =
  element number:day-of-week {
    number-day-of-week-attlist, common-calendar-attlist, empty
  }
number-day-of-week-attlist =
  attribute number:style { "short" | "long" }?
number-week-of-year =
  element number:week-of-year { common-calendar-attlist, empty }
number-quarter =
  element number:quarter {
    number-quarter-attlist, common-calendar-attlist, empty
  }
number-quarter-attlist = attribute number:style { "short" | "long" }?
number-time-style =
  element number:time-style {
    number-time-style-attlist,
    common-data-style-attlist,
    common-format-source-attlist,
    style-text-properties?,
    number-text?,
    (any-time, number-text?)+,
    style-map*
  }
any-time = number-hours | number-am-pm | number-minutes | number-seconds
number-time-style-attlist =
  attribute number:truncate-on-overflow { boolean }?
number-hours = element number:hours { number-hours-attlist, empty }
number-hours-attlist = attribute number:style { "short" | "long" }?
number-minutes =
  element number:minutes { number-minutes-attlist, empty }
number-minutes-attlist = attribute number:style { "short" | "long" }?
number-seconds =
  element number:seconds { number-seconds-attlist, empty }
number-seconds-attlist =
  attribute number:style { "short" | "long" }?
  & attribute number:decimal-places { integer }?
number-am-pm = element number:am-pm { empty }
number-boolean-style =
  element number:boolean-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    (number-boolean, number-text?)?,
    style-map*
  }
number-boolean = element number:boolean { empty }
number-text-style =
  element number:text-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    (number-text-content, number-text?)*,
    style-map*
  }
number-text = element number:text { text }
number-text-content = element number:text-content { empty }
common-data-style-attlist =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute number:language { languageCode }?
  & attribute number:country { countryCode }?
  & attribute number:script { scriptCode }?
  & attribute number:rfc-language-tag { language }?
  & attribute number:title { \string }?
  & attribute style:volatile { boolean }?
  & attribute number:transliteration-format { \string }?
  & attribute number:transliteration-language { countryCode }?
  & attribute number:transliteration-country { countryCode }?
  & attribute number:transliteration-style {
      "short" | "medium" | "long"
    }?
common-auto-reorder-attlist =
  attribute number:automatic-order { boolean }?
common-format-source-attlist =
  attribute number:format-source { "fixed" | "language" }?
common-decimal-places-attlist =
  attribute number:decimal-places { integer }?
common-number-attlist =
  attribute number:min-integer-digits { integer }?
  & attribute number:grouping { boolean }?
common-calendar-attlist =
  attribute number:calendar {
    "gregorian"
    | "gengou"
    | "ROC"
    | "hanja_yoil"
    | "hanja"
    | "hijri"
    | "jewish"
    | "buddhist"
    | \string
  }?
style-style-content =
  (attribute style:family { "text" },
   style-text-properties?)
  | (attribute style:family { "paragraph" },
     style-paragraph-properties?,
     style-text-properties?)
  | (attribute style:family { "section" },
     style-section-properties?)
  | (attribute style:family { "ruby" },
     style-ruby-properties?)
  | (attribute style:family { "table" },
     style-table-properties?)
  | (attribute style:family { "table-column" },
     style-table-column-properties?)
  | (attribute style:family { "table-row" },
     style-table-row-properties?)
  | (attribute style:family { "table-cell" },
     style-table-cell-properties?,
     style-paragraph-properties?,
     style-text-properties?)
  | (attribute style:family { "graphic" | "presentation" },
     style-graphic-properties?,
     style-paragraph-properties?,
     style-text-properties?)
  | (attribute style:family { "drawing-page" },
     style-drawing-page-properties?)
  | (attribute style:family { "chart" },
     style-chart-properties?,
     style-graphic-properties?,
     style-paragraph-properties?,
     style-text-properties?)
text-linenumbering-configuration =
  element text:linenumbering-configuration {
    text-linenumbering-configuration-attlist,
    text-linenumbering-separator?
  }
text-linenumbering-configuration-attlist =
  attribute text:number-lines { boolean }?
  & common-num-format-attlist?
  & attribute text:style-name { styleNameRef }?
  & attribute text:increment { nonNegativeInteger }?
  & attribute text:number-position {
      "left" | "right" | "inner" | "outer"
    }?
  & attribute text:offset { nonNegativeLength }?
  & attribute text:count-empty-lines { boolean }?
  & attribute text:count-in-text-boxes { boolean }?
  & attribute text:restart-on-page { boolean }?
text-linenumbering-separator =
  element text:linenumbering-separator {
    attribute text:increment { nonNegativeInteger }?,
    text
  }
text-notes-configuration =
  element text:notes-configuration { text-notes-configuration-content }
text-notes-configuration-content =
  text-note-class
  & attribute text:citation-style-name { styleNameRef }?
  & attribute text:citation-body-style-name { styleNameRef }?
  & attribute text:default-style-name { styleNameRef }?
  & attribute text:master-page-name { styleNameRef }?
  & attribute text:start-value { nonNegativeInteger }?
  & common-num-format-prefix-suffix-attlist
  & common-num-format-attlist?
  & attribute text:start-numbering-at {
      "document" | "chapter" | "page"
    }?
  & attribute text:footnotes-position {
      "text" | "page" | "section" | "document"
    }?
  & element text:note-continuation-notice-forward { text }?
  & element text:note-continuation-notice-backward { text }?
text-bibliography-configuration =
  element text:bibliography-configuration {
    text-bibliography-configuration-attlist, text-sort-key*
  }
text-bibliography-configuration-attlist =
  attribute text:prefix { \string }?
  & attribute text:suffix { \string }?
  & attribute text:numbered-entries { boolean }?
  & attribute text:sort-by-position { boolean }?
  & attribute fo:language { languageCode }?
  & attribute fo:country { countryCode }?
  & attribute fo:script { scriptCode }?
  & attribute style:rfc-language-tag { language }?
  & attribute text:sort-algorithm { \string }?
text-sort-key = element text:sort-key { text-sort-key-attlist, empty }
text-sort-key-attlist =
  attribute text:key {
    "address"
    | "annote"
    | "author"
    | "bibliography-type"
    | "booktitle"
    | "chapter"
    | "custom1"
    | "custom2"
    | "custom3"
    | "custom4"
    | "custom5"
    | "edition"
    | "editor"
    | "howpublished"
    | "identifier"
    | "institution"
    | "isbn"
    | "issn"
    | "journal"
    | "month"
    | "note"
    | "number"
    | "organizations"
    | "pages"
    | "publisher"
    | "report-type"
    | "school"
    | "series"
    | "title"
    | "url"
    | "volume"
    | "year"
  },
  attribute text:sort-ascending { boolean }?
text-list-style =
  element text:list-style {
    text-list-style-attr, text-list-style-content*
  }
text-list-style-attr =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute text:consecutive-numbering { boolean }?
text-list-style-content =
  element text:list-level-style-number {
    text-list-level-style-attr,
    text-list-level-style-number-attr,
    style-list-level-properties?,
    style-text-properties?
  }
  | element text:list-level-style-bullet {
      text-list-level-style-attr,
      text-list-level-style-bullet-attr,
      style-list-level-properties?,
      style-text-properties?
    }
  | element text:list-level-style-image {
      text-list-level-style-attr,
      text-list-level-style-image-attr,
      style-list-level-properties?
    }
text-list-level-style-number-attr =
  attribute text:style-name { styleNameRef }?
  & common-num-format-attlist
  & common-num-format-prefix-suffix-attlist
  & attribute text:display-levels { positiveInteger }?
  & attribute text:start-value { positiveInteger }?
text-list-level-style-bullet-attr =
  attribute text:style-name { styleNameRef }?
  & attribute text:bullet-char { character }
  & common-num-format-prefix-suffix-attlist
  & attribute text:bullet-relative-size { percent }?
text-list-level-style-image-attr =
  common-draw-data-attlist | office-binary-data
text-list-level-style-attr = attribute text:level { positiveInteger }
text-outline-style =
  element text:outline-style {
    text-outline-style-attr, text-outline-level-style+
  }
text-outline-style-attr = attribute style:name { styleName }
text-outline-level-style =
  element text:outline-level-style {
    text-outline-level-style-attlist,
    style-list-level-properties?,
    style-text-properties?
  }
text-outline-level-style-attlist =
  attribute text:level { positiveInteger }
  & attribute text:style-name { styleNameRef }?
  & common-num-format-attlist
  & common-num-format-prefix-suffix-attlist
  & attribute text:display-levels { positiveInteger }?
  & attribute text:start-value { positiveInteger }?
style-graphic-properties =
  element style:graphic-properties {
    style-graphic-properties-content-strict
  }
style-graphic-properties-content-strict =
  style-graphic-properties-attlist,
  style-graphic-fill-properties-attlist,
  style-graphic-properties-elements
style-drawing-page-properties =
  element style:drawing-page-properties {
    style-drawing-page-properties-content-strict
  }
style-drawing-page-properties-content-strict =
  style-graphic-fill-properties-attlist,
  style-drawing-page-properties-attlist,
  style-drawing-page-properties-elements
draw-gradient =
  element draw:gradient {
    common-draw-gradient-attlist, draw-gradient-attlist, empty
  }
common-draw-gradient-attlist =
  attribute draw:name { styleName }?
  & attribute draw:display-name { \string }?
  & attribute draw:style { gradient-style }
  & attribute draw:cx { percent }?
  & attribute draw:cy { percent }?
  & attribute draw:angle { angle }?
  & attribute draw:border { percent }?
gradient-style =
  "linear" | "axial" | "radial" | "ellipsoid" | "square" | "rectangular"
draw-gradient-attlist =
  attribute draw:start-color { color }?
  & attribute draw:end-color { color }?
  & attribute draw:start-intensity { zeroToHundredPercent }?
  & attribute draw:end-intensity { zeroToHundredPercent }?
svg-linearGradient =
  element svg:linearGradient {
    common-svg-gradient-attlist,
    attribute svg:x1 { coordinate | percent }?,
    attribute svg:y1 { coordinate | percent }?,
    attribute svg:x2 { coordinate | percent }?,
    attribute svg:y2 { coordinate | percent }?,
    svg-stop*
  }
svg-radialGradient =
  element svg:radialGradient {
    common-svg-gradient-attlist,
    attribute svg:cx { coordinate | percent }?,
    attribute svg:cy { coordinate | percent }?,
    attribute svg:r { coordinate | percent }?,
    attribute svg:fx { coordinate | percent }?,
    attribute svg:fy { coordinate | percent }?,
    svg-stop*
  }
svg-stop =
  element svg:stop {
    attribute svg:offset { double | percent },
    attribute svg:stop-color { color }?,
    attribute svg:stop-opacity { double }?
  }
common-svg-gradient-attlist =
  attribute svg:gradientUnits { "objectBoundingBox" }?
  & attribute svg:gradientTransform { \string }?
  & attribute svg:spreadMethod { "pad" | "reflect" | "repeat" }?
  & attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
draw-hatch = element draw:hatch { draw-hatch-attlist, empty }
draw-hatch-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
  & attribute draw:style { "single" | "double" | "triple" }
  & attribute draw:color { color }?
  & attribute draw:distance { length }?
  & attribute draw:rotation { angle }?
draw-fill-image =
  element draw:fill-image {
    draw-fill-image-attlist,
    attribute xlink:type { "simple" },
    attribute xlink:href { anyIRI },
    attribute xlink:show { "embed" }?,
    attribute xlink:actuate { "onLoad" }?,
    empty
  }
draw-fill-image-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
  & attribute svg:width { length }?
  & attribute svg:height { length }?
draw-opacity =
  element draw:opacity {
    common-draw-gradient-attlist, draw-opacity-attlist, empty
  }
draw-opacity-attlist =
  attribute draw:start { zeroToHundredPercent }?,
  attribute draw:end { zeroToHundredPercent }?
draw-marker =
  element draw:marker {
    draw-marker-attlist,
    common-draw-viewbox-attlist,
    common-draw-path-data-attlist,
    empty
  }
draw-marker-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
draw-stroke-dash =
  element draw:stroke-dash { draw-stroke-dash-attlist, empty }
draw-stroke-dash-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
  & attribute draw:style { "rect" | "round" }?
  & attribute draw:dots1 { integer }?
  & attribute draw:dots1-length { length | percent }?
  & attribute draw:dots2 { integer }?
  & attribute draw:dots2-length { length | percent }?
  & attribute draw:distance { length | percent }?
style-presentation-page-layout =
  element style:presentation-page-layout {
    attribute style:name { styleName },
    attribute style:display-name { \string }?,
    presentation-placeholder*
  }
presentation-placeholder =
  element presentation:placeholder {
    attribute presentation:object { presentation-classes },
    attribute svg:x { coordinate | percent },
    attribute svg:y { coordinate | percent },
    attribute svg:width { length | percent },
    attribute svg:height { length | percent },
    empty
  }
style-page-layout-properties =
  element style:page-layout-properties {
    style-page-layout-properties-content-strict
  }
style-page-layout-properties-content-strict =
  style-page-layout-properties-attlist,
  style-page-layout-properties-elements
style-page-layout-properties-attlist =
  attribute fo:page-width { length }?
  & attribute fo:page-height { length }?
  & common-num-format-attlist?
  & common-num-format-prefix-suffix-attlist
  & attribute style:paper-tray-name { "default" | \string }?
  & attribute style:print-orientation { "portrait" | "landscape" }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & common-padding-attlist
  & common-shadow-attlist
  & common-background-color-attlist
  & attribute style:register-truth-ref-style-name { styleNameRef }?
  & attribute style:print {
      list {
        ("headers"
         | "grid"
         | "annotations"
         | "objects"
         | "charts"
         | "drawings"
         | "formulas"
         | "zero-values")*
      }
    }?
  & attribute style:print-page-order { "ttb" | "ltr" }?
  & attribute style:first-page-number { positiveInteger | "continue" }?
  & attribute style:scale-to { percent }?
  & attribute style:scale-to-pages { positiveInteger }?
  & attribute style:table-centering {
      "horizontal" | "vertical" | "both" | "none"
    }?
  & attribute style:footnote-max-height { length }?
  & common-writing-mode-attlist
  & attribute style:layout-grid-mode { "none" | "line" | "both" }?
  & attribute style:layout-grid-standard-mode { boolean }?
  & attribute style:layout-grid-base-height { length }?
  & attribute style:layout-grid-ruby-height { length }?
  & attribute style:layout-grid-lines { positiveInteger }?
  & attribute style:layout-grid-base-width { length }?
  & attribute style:layout-grid-color { color }?
  & attribute style:layout-grid-ruby-below { boolean }?
  & attribute style:layout-grid-print { boolean }?
  & attribute style:layout-grid-display { boolean }?
  & attribute style:layout-grid-snap-to { boolean }?
style-page-layout-properties-elements =
  style-background-image & style-columns & style-footnote-sep
style-footnote-sep =
  element style:footnote-sep { style-footnote-sep-attlist, empty }?
style-footnote-sep-attlist =
  attribute style:width { length }?,
  attribute style:rel-width { percent }?,
  attribute style:color { color }?,
  attribute style:line-style { lineStyle }?,
  attribute style:adjustment { "left" | "center" | "right" }?,
  attribute style:distance-before-sep { length }?,
  attribute style:distance-after-sep { length }?
style-header-footer-properties =
  element style:header-footer-properties {
    style-header-footer-properties-content-strict
  }
style-header-footer-properties-content-strict =
  style-header-footer-properties-attlist,
  style-header-footer-properties-elements
style-header-footer-properties-attlist =
  attribute svg:height { length }?
  & attribute fo:min-height { length }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & common-padding-attlist
  & common-background-color-attlist
  & common-shadow-attlist
  & attribute style:dynamic-spacing { boolean }?
style-header-footer-properties-elements = style-background-image
style-text-properties =
  element style:text-properties { style-text-properties-content-strict }
style-text-properties-content-strict =
  style-text-properties-attlist, style-text-properties-elements
style-text-properties-elements = empty
style-text-properties-attlist =
  attribute fo:font-variant { fontVariant }?
  & attribute fo:text-transform {
      "none" | "lowercase" | "uppercase" | "capitalize"
    }?
  & attribute fo:color { color }?
  & attribute style:use-window-font-color { boolean }?
  & attribute style:text-outline { boolean }?
  & attribute style:text-line-through-type { lineType }?
  & attribute style:text-line-through-style { lineStyle }?
  & attribute style:text-line-through-width { lineWidth }?
  & attribute style:text-line-through-color { "font-color" | color }?
  & attribute style:text-line-through-text { \string }?
  & attribute style:text-line-through-text-style { styleNameRef }?
  & attribute style:text-position {
      list { (percent | "super" | "sub"), percent? }
    }?
  & attribute style:font-name { \string }?
  & attribute style:font-name-asian { \string }?
  & attribute style:font-name-complex { \string }?
  & attribute fo:font-family { \string }?
  & attribute style:font-family-asian { \string }?
  & attribute style:font-family-complex { \string }?
  & attribute style:font-family-generic { fontFamilyGeneric }?
  & attribute style:font-family-generic-asian { fontFamilyGeneric }?
  & attribute style:font-family-generic-complex { fontFamilyGeneric }?
  & attribute style:font-style-name { \string }?
  & attribute style:font-style-name-asian { \string }?
  & attribute style:font-style-name-complex { \string }?
  & attribute style:font-pitch { fontPitch }?
  & attribute style:font-pitch-asian { fontPitch }?
  & attribute style:font-pitch-complex { fontPitch }?
  & attribute style:font-charset { textEncoding }?
  & attribute style:font-charset-asian { textEncoding }?
  & attribute style:font-charset-complex { textEncoding }?
  & attribute fo:font-size { positiveLength | percent }?
  & attribute style:font-size-asian { positiveLength | percent }?
  & attribute style:font-size-complex { positiveLength | percent }?
  & attribute style:font-size-rel { length }?
  & attribute style:font-size-rel-asian { length }?
  & attribute style:font-size-rel-complex { length }?
  & attribute style:script-type {
      "latin" | "asian" | "complex" | "ignore"
    }?
  & attribute fo:letter-spacing { length | "normal" }?
  & attribute fo:language { languageCode }?
  & attribute style:language-asian { languageCode }?
  & attribute style:language-complex { languageCode }?
  & attribute fo:country { countryCode }?
  & attribute style:country-asian { countryCode }?
  & attribute style:country-complex { countryCode }?
  & attribute fo:script { scriptCode }?
  & attribute style:script-asian { scriptCode }?
  & attribute style:script-complex { scriptCode }?
  & attribute style:rfc-language-tag { language }?
  & attribute style:rfc-language-tag-asian { language }?
  & attribute style:rfc-language-tag-complex { language }?
  & attribute fo:font-style { fontStyle }?
  & attribute style:font-style-asian { fontStyle }?
  & attribute style:font-style-complex { fontStyle }?
  & attribute style:font-relief { "none" | "embossed" | "engraved" }?
  & attribute fo:text-shadow { shadowType }?
  & attribute style:text-underline-type { lineType }?
  & attribute style:text-underline-style { lineStyle }?
  & attribute style:text-underline-width { lineWidth }?
  & attribute style:text-underline-color { "font-color" | color }?
  & attribute style:text-overline-type { lineType }?
  & attribute style:text-overline-style { lineStyle }?
  & attribute style:text-overline-width { lineWidth }?
  & attribute style:text-overline-color { "font-color" | color }?
  & attribute style:text-overline-mode { lineMode }?
  & attribute fo:font-weight { fontWeight }?
  & attribute style:font-weight-asian { fontWeight }?
  & attribute style:font-weight-complex { fontWeight }?
  & attribute style:text-underline-mode { lineMode }?
  & attribute style:text-line-through-mode { lineMode }?
  & attribute style:letter-kerning { boolean }?
  & attribute style:text-blinking { boolean }?
  & common-background-color-attlist
  & attribute style:text-combine { "none" | "letters" | "lines" }?
  & attribute style:text-combine-start-char { character }?
  & attribute style:text-combine-end-char { character }?
  & attribute style:text-emphasize {
      "none"
      | list {
          ("none" | "accent" | "dot" | "circle" | "disc"),
          ("above" | "below")
        }
    }?
  & attribute style:text-scale { percent }?
  & attribute style:text-rotation-angle { angle }?
  & attribute style:text-rotation-scale { "fixed" | "line-height" }?
  & attribute fo:hyphenate { boolean }?
  & attribute fo:hyphenation-remain-char-count { positiveInteger }?
  & attribute fo:hyphenation-push-char-count { positiveInteger }?
  & (attribute text:display { "true" }
     | attribute text:display { "none" }
     | (attribute text:display { "condition" },
        attribute text:condition { "none" })
     | empty)
fontVariant = "normal" | "small-caps"
fontFamilyGeneric =
  "roman" | "swiss" | "modern" | "decorative" | "script" | "system"
fontPitch = "fixed" | "variable"
textEncoding = xsd:string { pattern = "[A-Za-z][A-Za-z0-9._\-]*" }
fontStyle = "normal" | "italic" | "oblique"
shadowType = "none" | \string
lineType = "none" | "single" | "double"
lineStyle =
  "none"
  | "solid"
  | "dotted"
  | "dash"
  | "long-dash"
  | "dot-dash"
  | "dot-dot-dash"
  | "wave"
lineWidth =
  "auto"
  | "normal"
  | "bold"
  | "thin"
  | "medium"
  | "thick"
  | positiveInteger
  | percent
  | positiveLength
fontWeight =
  "normal"
  | "bold"
  | "100"
  | "200"
  | "300"
  | "400"
  | "500"
  | "600"
  | "700"
  | "800"
  | "900"
lineMode = "continuous" | "skip-white-space"
style-paragraph-properties =
  element style:paragraph-properties {
    style-paragraph-properties-content-strict
  }
style-paragraph-properties-content-strict =
  style-paragraph-properties-attlist,
  style-paragraph-properties-elements
style-paragraph-properties-attlist =
  attribute fo:line-height { "normal" | nonNegativeLength | percent }?
  & attribute style:line-height-at-least { nonNegativeLength }?
  & attribute style:line-spacing { length }?
  & attribute style:font-independent-line-spacing { boolean }?
  & common-text-align
  & attribute fo:text-align-last { "start" | "center" | "justify" }?
  & attribute style:justify-single-word { boolean }?
  & attribute fo:keep-together { "auto" | "always" }?
  & attribute fo:widows { nonNegativeInteger }?
  & attribute fo:orphans { nonNegativeInteger }?
  & attribute style:tab-stop-distance { nonNegativeLength }?
  & attribute fo:hyphenation-keep { "auto" | "page" }?
  & attribute fo:hyphenation-ladder-count {
      "no-limit" | positiveInteger
    }?
  & attribute style:register-true { boolean }?
  & common-horizontal-margin-attlist
  & attribute fo:text-indent { length | percent }?
  & attribute style:auto-text-indent { boolean }?
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-break-attlist
  & common-background-color-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & attribute style:join-border { boolean }?
  & common-padding-attlist
  & common-shadow-attlist
  & common-keep-with-next-attlist
  & attribute text:number-lines { boolean }?
  & attribute text:line-number { nonNegativeInteger }?
  & attribute style:text-autospace { "none" | "ideograph-alpha" }?
  & attribute style:punctuation-wrap { "simple" | "hanging" }?
  & attribute style:line-break { "normal" | "strict" }?
  & attribute style:vertical-align {
      "top" | "middle" | "bottom" | "auto" | "baseline"
    }?
  & common-writing-mode-attlist
  & attribute style:writing-mode-automatic { boolean }?
  & attribute style:snap-to-layout-grid { boolean }?
  & common-page-number-attlist
  & common-background-transparency-attlist
common-text-align =
  attribute fo:text-align {
    "start" | "end" | "left" | "right" | "center" | "justify"
  }?
style-paragraph-properties-elements =
  style-tab-stops & style-drop-cap & style-background-image
style-tab-stops = element style:tab-stops { style-tab-stop* }?
style-tab-stop =
  element style:tab-stop { style-tab-stop-attlist, empty }
style-tab-stop-attlist =
  attribute style:position { length }
  & (attribute style:type { "left" | "center" | "right" }?
     | (attribute style:type { "char" },
        style-tab-stop-char-attlist))
  & attribute style:leader-type { lineType }?
  & attribute style:leader-style { lineStyle }?
  & attribute style:leader-width { lineWidth }?
  & attribute style:leader-color { "font-color" | color }?
  & attribute style:leader-text { character }?
  & attribute style:leader-text-style { styleNameRef }?
style-tab-stop-char-attlist = attribute style:char { character }
style-drop-cap =
  element style:drop-cap { style-drop-cap-attlist, empty }?
style-drop-cap-attlist =
  attribute style:length { "word" | positiveInteger }?
  & attribute style:lines { positiveInteger }?
  & attribute style:distance { length }?
  & attribute style:style-name { styleNameRef }?
common-horizontal-margin-attlist =
  attribute fo:margin-left { length | percent }?,
  attribute fo:margin-right { length | percent }?
common-vertical-margin-attlist =
  attribute fo:margin-top { nonNegativeLength | percent }?,
  attribute fo:margin-bottom { nonNegativeLength | percent }?
common-margin-attlist =
  attribute fo:margin { nonNegativeLength | percent }?
common-break-attlist =
  attribute fo:break-before { "auto" | "column" | "page" }?,
  attribute fo:break-after { "auto" | "column" | "page" }?
common-background-color-attlist =
  attribute fo:background-color { "transparent" | color }?
style-background-image =
  element style:background-image {
    style-background-image-attlist,
    (common-draw-data-attlist | office-binary-data | empty)
  }?
style-background-image-attlist =
  attribute style:repeat { "no-repeat" | "repeat" | "stretch" }?
  & attribute style:position {
      "left"
      | "center"
      | "right"
      | "top"
      | "bottom"
      | list { horiBackPos, vertBackPos }
      | list { vertBackPos, horiBackPos }
    }?
  & attribute style:filter-name { \string }?
  & attribute draw:opacity { zeroToHundredPercent }?
horiBackPos = "left" | "center" | "right"
vertBackPos = "top" | "center" | "bottom"
common-border-attlist =
  attribute fo:border { \string }?,
  attribute fo:border-top { \string }?,
  attribute fo:border-bottom { \string }?,
  attribute fo:border-left { \string }?,
  attribute fo:border-right { \string }?
common-border-line-width-attlist =
  attribute style:border-line-width { borderWidths }?,
  attribute style:border-line-width-top { borderWidths }?,
  attribute style:border-line-width-bottom { borderWidths }?,
  attribute style:border-line-width-left { borderWidths }?,
  attribute style:border-line-width-right { borderWidths }?
borderWidths = list { positiveLength, positiveLength, positiveLength }
common-padding-attlist =
  attribute fo:padding { nonNegativeLength }?,
  attribute fo:padding-top { nonNegativeLength }?,
  attribute fo:padding-bottom { nonNegativeLength }?,
  attribute fo:padding-left { nonNegativeLength }?,
  attribute fo:padding-right { nonNegativeLength }?
common-shadow-attlist = attribute style:shadow { shadowType }?
common-keep-with-next-attlist =
  attribute fo:keep-with-next { "auto" | "always" }?
common-writing-mode-attlist =
  attribute style:writing-mode {
    "lr-tb" | "rl-tb" | "tb-rl" | "tb-lr" | "lr" | "rl" | "tb" | "page"
  }?
common-page-number-attlist =
  attribute style:page-number { positiveInteger | "auto" }?
common-background-transparency-attlist =
  attribute style:background-transparency { zeroToHundredPercent }?
style-ruby-properties =
  element style:ruby-properties { style-ruby-properties-content-strict }
style-ruby-properties-content-strict =
  style-ruby-properties-attlist, style-ruby-properties-elements
style-ruby-properties-elements = empty
style-ruby-properties-attlist =
  attribute style:ruby-position { "above" | "below" }?
  & attribute style:ruby-align {
      "left"
      | "center"
      | "right"
      | "distribute-letter"
      | "distribute-space"
    }?
style-section-properties =
  element style:section-properties {
    style-section-properties-content-strict
  }
style-section-properties-content-strict =
  style-section-properties-attlist, style-section-properties-elements
style-section-properties-attlist =
  common-background-color-attlist
  & common-horizontal-margin-attlist
  & attribute style:protect { boolean }?
  & common-editable-attlist
  & attribute text:dont-balance-text-columns { boolean }?
  & common-writing-mode-attlist
style-section-properties-elements =
  style-background-image & style-columns & text-notes-configuration*
style-columns =
  element style:columns {
    style-columns-attlist, style-column-sep?, style-column*
  }?
style-columns-attlist =
  attribute fo:column-count { positiveInteger }
  & attribute fo:column-gap { length }?
style-column = element style:column { style-column-attlist }
style-column-attlist =
  attribute style:rel-width { relativeLength }
  & attribute fo:start-indent { length }?
  & attribute fo:end-indent { length }?
  & attribute fo:space-before { length }?
  & attribute fo:space-after { length }?
style-column-sep = element style:column-sep { style-column-sep-attlist }
style-column-sep-attlist =
  attribute style:style {
    "none" | "solid" | "dotted" | "dashed" | "dot-dashed"
  }?
  & attribute style:width { length }
  & attribute style:height { zeroToHundredPercent }?
  & attribute style:vertical-align { "top" | "middle" | "bottom" }?
  & attribute style:color { color }?
style-table-properties =
  element style:table-properties {
    style-table-properties-content-strict
  }
style-table-properties-content-strict =
  style-table-properties-attlist, style-table-properties-elements
style-table-properties-attlist =
  attribute style:width { positiveLength }?
  & attribute style:rel-width { percent }?
  & attribute table:align { "left" | "center" | "right" | "margins" }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-page-number-attlist
  & common-break-attlist
  & common-background-color-attlist
  & common-shadow-attlist
  & common-keep-with-next-attlist
  & attribute style:may-break-between-rows { boolean }?
  & attribute table:border-model { "collapsing" | "separating" }?
  & common-writing-mode-attlist
  & attribute table:display { boolean }?
style-table-properties-elements = style-background-image
style-table-column-properties =
  element style:table-column-properties {
    style-table-column-properties-content-strict
  }
style-table-column-properties-content-strict =
  style-table-column-properties-attlist,
  style-table-column-properties-elements
style-table-column-properties-elements = empty
style-table-column-properties-attlist =
  attribute style:column-width { positiveLength }?
  & attribute style:rel-column-width { relativeLength }?
  & attribute style:use-optimal-column-width { boolean }?
  & common-break-attlist
style-table-row-properties =
  element style:table-row-properties {
    style-table-row-properties-content-strict
  }
style-table-row-properties-content-strict =
  style-table-row-properties-attlist,
  style-table-row-properties-elements
style-table-row-properties-attlist =
  attribute style:row-height { positiveLength }?
  & attribute style:min-row-height { nonNegativeLength }?
  & attribute style:use-optimal-row-height { boolean }?
  & common-background-color-attlist
  & common-break-attlist
  & attribute fo:keep-together { "auto" | "always" }?
style-table-row-properties-elements = style-background-image
style-table-cell-properties =
  element style:table-cell-properties {
    style-table-cell-properties-content-strict
  }
style-table-cell-properties-content-strict =
  style-table-cell-properties-attlist,
  style-table-cell-properties-elements
style-table-cell-properties-attlist =
  attribute style:vertical-align {
    "top" | "middle" | "bottom" | "automatic"
  }?
  & attribute style:text-align-source { "fix" | "value-type" }?
  & common-style-direction-attlist
  & attribute style:glyph-orientation-vertical {
      "auto" | "0" | "0deg" | "0rad" | "0grad"
    }?
  & common-writing-mode-attlist
  & common-shadow-attlist
  & common-background-color-attlist
  & common-border-attlist
  & attribute style:diagonal-tl-br { \string }?
  & attribute style:diagonal-tl-br-widths { borderWidths }?
  & attribute style:diagonal-bl-tr { \string }?
  & attribute style:diagonal-bl-tr-widths { borderWidths }?
  & common-border-line-width-attlist
  & common-padding-attlist
  & attribute fo:wrap-option { "no-wrap" | "wrap" }?
  & common-rotation-angle-attlist
  & attribute style:rotation-align {
      "none" | "bottom" | "top" | "center"
    }?
  & attribute style:cell-protect {
      "none"
      | "hidden-and-protected"
      | list { ("protected" | "formula-hidden")+ }
    }?
  & attribute style:print-content { boolean }?
  & attribute style:decimal-places { nonNegativeInteger }?
  & attribute style:repeat-content { boolean }?
  & attribute style:shrink-to-fit { boolean }?
common-style-direction-attlist =
  attribute style:direction { "ltr" | "ttb" }?
style-table-cell-properties-elements = style-background-image
common-rotation-angle-attlist =
  attribute style:rotation-angle { angle }?
style-list-level-properties =
  element style:list-level-properties {
    style-list-level-properties-content-strict
  }
style-list-level-properties-content-strict =
  style-list-level-properties-attlist,
  style-list-level-properties-elements
style-list-level-properties-attlist =
  common-text-align
  & attribute text:space-before { length }?
  & attribute text:min-label-width { nonNegativeLength }?
  & attribute text:min-label-distance { nonNegativeLength }?
  & attribute style:font-name { \string }?
  & attribute fo:width { positiveLength }?
  & attribute fo:height { positiveLength }?
  & common-vertical-rel-attlist
  & common-vertical-pos-attlist
  & attribute text:list-level-position-and-space-mode {
      "label-width-and-position" | "label-alignment"
    }?
style-list-level-properties-elements = style-list-level-label-alignment
style-list-level-label-alignment =
  element style:list-level-label-alignment {
    style-list-level-label-alignment-attlist, empty
  }?
style-list-level-label-alignment-attlist =
  attribute text:label-followed-by { "listtab" | "space" | "nothing" }
  & attribute text:list-tab-stop-position { length }?
  & attribute fo:text-indent { length }?
  & attribute fo:margin-left { length }?
style-graphic-properties-attlist =
  attribute draw:stroke { "none" | "dash" | "solid" }?
  & attribute draw:stroke-dash { styleNameRef }?
  & attribute draw:stroke-dash-names { styleNameRefs }?
  & attribute svg:stroke-width { length }?
  & attribute svg:stroke-color { color }?
  & attribute draw:marker-start { styleNameRef }?
  & attribute draw:marker-end { styleNameRef }?
  & attribute draw:marker-start-width { length }?
  & attribute draw:marker-end-width { length }?
  & attribute draw:marker-start-center { boolean }?
  & attribute draw:marker-end-center { boolean }?
  & attribute svg:stroke-opacity {
      xsd:double { minInclusive = "0" maxInclusive = "1" }
      | zeroToHundredPercent
    }?
  & attribute draw:stroke-linejoin {
      "miter" | "round" | "bevel" | "middle" | "none"
    }?
  & attribute svg:stroke-linecap { "butt" | "square" | "round" }?
  & attribute draw:symbol-color { color }?
  & attribute text:animation {
      "none" | "scroll" | "alternate" | "slide"
    }?
  & attribute text:animation-direction {
      "left" | "right" | "up" | "down"
    }?
  & attribute text:animation-start-inside { boolean }?
  & attribute text:animation-stop-inside { boolean }?
  & attribute text:animation-repeat { nonNegativeInteger }?
  & attribute text:animation-delay { duration }?
  & attribute text:animation-steps { length }?
  & attribute draw:auto-grow-width { boolean }?
  & attribute draw:auto-grow-height { boolean }?
  & attribute draw:fit-to-size { boolean }?
  & attribute draw:fit-to-contour { boolean }?
  & attribute draw:textarea-vertical-align {
      "top" | "middle" | "bottom" | "justify"
    }?
  & attribute draw:textarea-horizontal-align {
      "left" | "center" | "right" | "justify"
    }?
  & attribute fo:wrap-option { "no-wrap" | "wrap" }?
  & attribute style:shrink-to-fit { boolean }?
  & attribute draw:color-mode {
      "greyscale" | "mono" | "watermark" | "standard"
    }?
  & attribute draw:color-inversion { boolean }?
  & attribute draw:luminance { zeroToHundredPercent }?
  & attribute draw:contrast { percent }?
  & attribute draw:gamma { percent }?
  & attribute draw:red { signedZeroToHundredPercent }?
  & attribute draw:green { signedZeroToHundredPercent }?
  & attribute draw:blue { signedZeroToHundredPercent }?
  & attribute draw:image-opacity { zeroToHundredPercent }?
  & attribute draw:shadow { "visible" | "hidden" }?
  & attribute draw:shadow-offset-x { length }?
  & attribute draw:shadow-offset-y { length }?
  & attribute draw:shadow-color { color }?
  & attribute draw:shadow-opacity { zeroToHundredPercent }?
  & attribute draw:start-line-spacing-horizontal { distance }?
  & attribute draw:start-line-spacing-vertical { distance }?
  & attribute draw:end-line-spacing-horizontal { distance }?
  & attribute draw:end-line-spacing-vertical { distance }?
  & attribute draw:line-distance { distance }?
  & attribute draw:guide-overhang { length }?
  & attribute draw:guide-distance { distance }?
  & attribute draw:start-guide { length }?
  & attribute draw:end-guide { length }?
  & attribute draw:placing { "below" | "above" }?
  & attribute draw:parallel { boolean }?
  & attribute draw:measure-align {
      "automatic" | "left-outside" | "inside" | "right-outside"
    }?
  & attribute draw:measure-vertical-align {
      "automatic" | "above" | "below" | "center"
    }?
  & attribute draw:unit {
      "automatic"
      | "mm"
      | "cm"
      | "m"
      | "km"
      | "pt"
      | "pc"
      | "inch"
      | "ft"
      | "mi"
    }?
  & attribute draw:show-unit { boolean }?
  & attribute draw:decimal-places { nonNegativeInteger }?
  & attribute draw:caption-type {
      "straight-line" | "angled-line" | "angled-connector-line"
    }?
  & attribute draw:caption-angle-type { "fixed" | "free" }?
  & attribute draw:caption-angle { angle }?
  & attribute draw:caption-gap { distance }?
  & attribute draw:caption-escape-direction {
      "horizontal" | "vertical" | "auto"
    }?
  & attribute draw:caption-escape { length | percent }?
  & attribute draw:caption-line-length { length }?
  & attribute draw:caption-fit-line-length { boolean }?
  & attribute dr3d:horizontal-segments { nonNegativeInteger }?
  & attribute dr3d:vertical-segments { nonNegativeInteger }?
  & attribute dr3d:edge-rounding { percent }?
  & attribute dr3d:edge-rounding-mode { "correct" | "attractive" }?
  & attribute dr3d:back-scale { percent }?
  & attribute dr3d:depth { length }?
  & attribute dr3d:backface-culling { "enabled" | "disabled" }?
  & attribute dr3d:end-angle { angle }?
  & attribute dr3d:close-front { boolean }?
  & attribute dr3d:close-back { boolean }?
  & attribute dr3d:lighting-mode { "standard" | "double-sided" }?
  & attribute dr3d:normals-kind { "object" | "flat" | "sphere" }?
  & attribute dr3d:normals-direction { "normal" | "inverse" }?
  & attribute dr3d:texture-generation-mode-x {
      "object" | "parallel" | "sphere"
    }?
  & attribute dr3d:texture-generation-mode-y {
      "object" | "parallel" | "sphere"
    }?
  & attribute dr3d:texture-kind { "luminance" | "intensity" | "color" }?
  & attribute dr3d:texture-filter { "enabled" | "disabled" }?
  & attribute dr3d:texture-mode { "replace" | "modulate" | "blend" }?
  & attribute dr3d:ambient-color { color }?
  & attribute dr3d:emissive-color { color }?
  & attribute dr3d:specular-color { color }?
  & attribute dr3d:diffuse-color { color }?
  & attribute dr3d:shininess { percent }?
  & attribute dr3d:shadow { "visible" | "hidden" }?
  & common-draw-rel-size-attlist
  & attribute fo:min-width { length | percent }?
  & attribute fo:min-height { length | percent }?
  & attribute fo:max-height { length | percent }?
  & attribute fo:max-width { length | percent }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & attribute style:print-content { boolean }?
  & attribute style:protect {
      "none"
      | list { ("content" | "position" | "size")+ }
    }?
  & attribute style:horizontal-pos {
      "left"
      | "center"
      | "right"
      | "from-left"
      | "inside"
      | "outside"
      | "from-inside"
    }?
  & attribute svg:x { coordinate }?
  & attribute style:horizontal-rel {
      "page"
      | "page-content"
      | "page-start-margin"
      | "page-end-margin"
      | "frame"
      | "frame-content"
      | "frame-start-margin"
      | "frame-end-margin"
      | "paragraph"
      | "paragraph-content"
      | "paragraph-start-margin"
      | "paragraph-end-margin"
      | "char"
    }?
  & common-vertical-pos-attlist
  & common-vertical-rel-attlist
  & common-text-anchor-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & common-padding-attlist
  & common-shadow-attlist
  & common-background-color-attlist
  & common-background-transparency-attlist
  & common-editable-attlist
  & attribute style:wrap {
      "none"
      | "left"
      | "right"
      | "parallel"
      | "dynamic"
      | "run-through"
      | "biggest"
    }?
  & attribute style:wrap-dynamic-threshold { nonNegativeLength }?
  & attribute style:number-wrapped-paragraphs {
      "no-limit" | positiveInteger
    }?
  & attribute style:wrap-contour { boolean }?
  & attribute style:wrap-contour-mode { "full" | "outside" }?
  & attribute style:run-through { "foreground" | "background" }?
  & attribute style:flow-with-text { boolean }?
  & attribute style:overflow-behavior {
      "clip" | "auto-create-new-frame"
    }?
  & attribute style:mirror {
      "none"
      | "vertical"
      | horizontal-mirror
      | list { "vertical", horizontal-mirror }
      | list { horizontal-mirror, "vertical" }
    }?
  & attribute fo:clip { "auto" | clipShape }?
  & attribute draw:wrap-influence-on-position {
      "iterative" | "once-concurrent" | "once-successive"
    }?
  & common-writing-mode-attlist
  & attribute draw:frame-display-scrollbar { boolean }?
  & attribute draw:frame-display-border { boolean }?
  & attribute draw:frame-margin-horizontal { nonNegativePixelLength }?
  & attribute draw:frame-margin-vertical { nonNegativePixelLength }?
  & attribute draw:visible-area-left { nonNegativeLength }?
  & attribute draw:visible-area-top { nonNegativeLength }?
  & attribute draw:visible-area-width { positiveLength }?
  & attribute draw:visible-area-height { positiveLength }?
  & attribute draw:draw-aspect {
      "content" | "thumbnail" | "icon" | "print-view"
    }?
  & attribute draw:ole-draw-aspect { nonNegativeInteger }?
style-graphic-fill-properties-attlist =
  attribute draw:fill {
    "none" | "solid" | "bitmap" | "gradient" | "hatch"
  }?
  & attribute draw:fill-color { color }?
  & attribute draw:secondary-fill-color { color }?
  & attribute draw:fill-gradient-name { styleNameRef }?
  & attribute draw:gradient-step-count { nonNegativeInteger }?
  & attribute draw:fill-hatch-name { styleNameRef }?
  & attribute draw:fill-hatch-solid { boolean }?
  & attribute draw:fill-image-name { styleNameRef }?
  & attribute style:repeat { "no-repeat" | "repeat" | "stretch" }?
  & attribute draw:fill-image-width { length | percent }?
  & attribute draw:fill-image-height { length | percent }?
  & attribute draw:fill-image-ref-point-x { percent }?
  & attribute draw:fill-image-ref-point-y { percent }?
  & attribute draw:fill-image-ref-point {
      "top-left"
      | "top"
      | "top-right"
      | "left"
      | "center"
      | "right"
      | "bottom-left"
      | "bottom"
      | "bottom-right"
    }?
  & attribute draw:tile-repeat-offset {
      list { zeroToHundredPercent, ("horizontal" | "vertical") }
    }?
  & attribute draw:opacity { zeroToHundredPercent }?
  & attribute draw:opacity-name { styleNameRef }?
  & attribute svg:fill-rule { "nonzero" | "evenodd" }?
style-graphic-properties-elements =
  text-list-style? & style-background-image & style-columns
common-vertical-pos-attlist =
  attribute style:vertical-pos {
    "top" | "middle" | "bottom" | "from-top" | "below"
  }?,
  attribute svg:y { coordinate }?
common-vertical-rel-attlist =
  attribute style:vertical-rel {
    "page"
    | "page-content"
    | "frame"
    | "frame-content"
    | "paragraph"
    | "paragraph-content"
    | "char"
    | "line"
    | "baseline"
    | "text"
  }?
common-editable-attlist = attribute style:editable { boolean }?
horizontal-mirror =
  "horizontal" | "horizontal-on-odd" | "horizontal-on-even"
clipShape =
  xsd:string {
    pattern =
      "rect\([ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)))|(auto))([ ]*,[ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))))|(auto)){3}[ ]*\)"
  }
nonNegativePixelLength =
  xsd:string { pattern = "([0-9]+(\.[0-9]*)?|\.[0-9]+)(px)" }
style-chart-properties =
  element style:chart-properties {
    style-chart-properties-content-strict
  }
style-chart-properties-content-strict =
  style-chart-properties-attlist, style-chart-properties-elements
style-chart-properties-elements = empty
style-chart-properties-attlist =
  attribute chart:scale-text { boolean }?
  & attribute chart:three-dimensional { boolean }?
  & attribute chart:deep { boolean }?
  & attribute chart:right-angled-axes { boolean }?
  & (attribute chart:symbol-type { "none" }
     | attribute chart:symbol-type { "automatic" }
     | (attribute chart:symbol-type { "named-symbol" },
        attribute chart:symbol-name {
          "square"
          | "diamond"
          | "arrow-down"
          | "arrow-up"
          | "arrow-right"
          | "arrow-left"
          | "bow-tie"
          | "hourglass"
          | "circle"
          | "star"
          | "x"
          | "plus"
          | "asterisk"
          | "horizontal-bar"
          | "vertical-bar"
        })
     | (attribute chart:symbol-type { "image" },
        element chart:symbol-image {
          attribute xlink:href { anyIRI }
        })
     | empty)
  & attribute chart:symbol-width { nonNegativeLength }?
  & attribute chart:symbol-height { nonNegativeLength }?
  & attribute chart:sort-by-x-values { boolean }?
  & attribute chart:vertical { boolean }?
  & attribute chart:connect-bars { boolean }?
  & attribute chart:gap-width { integer }?
  & attribute chart:overlap { integer }?
  & attribute chart:group-bars-per-axis { boolean }?
  & attribute chart:japanese-candle-stick { boolean }?
  & attribute chart:interpolation {
      "none" | "cubic-spline" | "b-spline"
    }?
  & attribute chart:spline-order { positiveInteger }?
  & attribute chart:spline-resolution { positiveInteger }?
  & attribute chart:pie-offset { nonNegativeInteger }?
  & attribute chart:angle-offset { angle }?
  & attribute chart:hole-size { percent }?
  & attribute chart:lines { boolean }?
  & attribute chart:solid-type {
      "cuboid" | "cylinder" | "cone" | "pyramid"
    }?
  & attribute chart:stacked { boolean }?
  & attribute chart:percentage { boolean }?
  & attribute chart:treat-empty-cells {
      "use-zero" | "leave-gap" | "ignore"
    }?
  & attribute chart:link-data-style-to-source { boolean }?
  & attribute chart:logarithmic { boolean }?
  & attribute chart:maximum { double }?
  & attribute chart:minimum { double }?
  & attribute chart:origin { double }?
  & attribute chart:interval-major { double }?
  & attribute chart:interval-minor-divisor { positiveInteger }?
  & attribute chart:tick-marks-major-inner { boolean }?
  & attribute chart:tick-marks-major-outer { boolean }?
  & attribute chart:tick-marks-minor-inner { boolean }?
  & attribute chart:tick-marks-minor-outer { boolean }?
  & attribute chart:reverse-direction { boolean }?
  & attribute chart:display-label { boolean }?
  & attribute chart:text-overlap { boolean }?
  & attribute text:line-break { boolean }?
  & attribute chart:label-arrangement {
      "side-by-side" | "stagger-even" | "stagger-odd"
    }?
  & common-style-direction-attlist
  & common-rotation-angle-attlist
  & attribute chart:data-label-number {
      "none" | "value" | "percentage" | "value-and-percentage"
    }?
  & attribute chart:data-label-text { boolean }?
  & attribute chart:data-label-symbol { boolean }?
  & element chart:label-separator { text-p }?
  & attribute chart:label-position { labelPositions }?
  & attribute chart:label-position-negative { labelPositions }?
  & attribute chart:visible { boolean }?
  & attribute chart:auto-position { boolean }?
  & attribute chart:auto-size { boolean }?
  & attribute chart:mean-value { boolean }?
  & attribute chart:error-category {
      "none"
      | "variance"
      | "standard-deviation"
      | "percentage"
      | "error-margin"
      | "constant"
      | "standard-error"
      | "cell-range"
    }?
  & attribute chart:error-percentage { double }?
  & attribute chart:error-margin { double }?
  & attribute chart:error-lower-limit { double }?
  & attribute chart:error-upper-limit { double }?
  & attribute chart:error-upper-indicator { boolean }?
  & attribute chart:error-lower-indicator { boolean }?
  & attribute chart:error-lower-range { cellRangeAddressList }?
  & attribute chart:error-upper-range { cellRangeAddressList }?
  & attribute chart:series-source { "columns" | "rows" }?
  & attribute chart:regression-type {
      "none" | "linear" | "logarithmic" | "exponential" | "power"
    }?
  & attribute chart:axis-position { "start" | "end" | double }?
  & attribute chart:axis-label-position {
      "near-axis"
      | "near-axis-other-side"
      | "outside-start"
      | "outside-end"
    }?
  & attribute chart:tick-mark-position {
      "at-labels" | "at-axis" | "at-labels-and-axis"
    }?
  & attribute chart:include-hidden-cells { boolean }?
labelPositions =
  "avoid-overlap"
  | "center"
  | "top"
  | "top-right"
  | "right"
  | "bottom-right"
  | "bottom"
  | "bottom-left"
  | "left"
  | "top-left"
  | "inside"
  | "outside"
  | "near-origin"
style-drawing-page-properties-attlist =
  attribute presentation:transition-type {
    "manual" | "automatic" | "semi-automatic"
  }?
  & attribute presentation:transition-style {
      "none"
      | "fade-from-left"
      | "fade-from-top"
      | "fade-from-right"
      | "fade-from-bottom"
      | "fade-from-upperleft"
      | "fade-from-upperright"
      | "fade-from-lowerleft"
      | "fade-from-lowerright"
      | "move-from-left"
      | "move-from-top"
      | "move-from-right"
      | "move-from-bottom"
      | "move-from-upperleft"
      | "move-from-upperright"
      | "move-from-lowerleft"
      | "move-from-lowerright"
      | "uncover-to-left"
      | "uncover-to-top"
      | "uncover-to-right"
      | "uncover-to-bottom"
      | "uncover-to-upperleft"
      | "uncover-to-upperright"
      | "uncover-to-lowerleft"
      | "uncover-to-lowerright"
      | "fade-to-center"
      | "fade-from-center"
      | "vertical-stripes"
      | "horizontal-stripes"
      | "clockwise"
      | "counterclockwise"
      | "open-vertical"
      | "open-horizontal"
      | "close-vertical"
      | "close-horizontal"
      | "wavyline-from-left"
      | "wavyline-from-top"
      | "wavyline-from-right"
      | "wavyline-from-bottom"
      | "spiralin-left"
      | "spiralin-right"
      | "spiralout-left"
      | "spiralout-right"
      | "roll-from-top"
      | "roll-from-left"
      | "roll-from-right"
      | "roll-from-bottom"
      | "stretch-from-left"
      | "stretch-from-top"
      | "stretch-from-right"
      | "stretch-from-bottom"
      | "vertical-lines"
      | "horizontal-lines"
      | "dissolve"
      | "random"
      | "vertical-checkerboard"
      | "horizontal-checkerboard"
      | "interlocking-horizontal-left"
      | "interlocking-horizontal-right"
      | "interlocking-vertical-top"
      | "interlocking-vertical-bottom"
      | "fly-away"
      | "open"
      | "close"
      | "melt"
    }?
  & attribute presentation:transition-speed { presentationSpeeds }?
  & attribute smil:type { \string }?
  & attribute smil:subtype { \string }?
  & attribute smil:direction { "forward" | "reverse" }?
  & attribute smil:fadeColor { color }?
  & attribute presentation:duration { duration }?
  & attribute presentation:visibility { "visible" | "hidden" }?
  & attribute draw:background-size { "full" | "border" }?
  & attribute presentation:background-objects-visible { boolean }?
  & attribute presentation:background-visible { boolean }?
  & attribute presentation:display-header { boolean }?
  & attribute presentation:display-footer { boolean }?
  & attribute presentation:display-page-number { boolean }?
  & attribute presentation:display-date-time { boolean }?
style-drawing-page-properties-elements = presentation-sound?
\string = xsd:string
date = xsd:date
time = xsd:time
dateTime = xsd:dateTime
duration = xsd:duration
integer = xsd:integer
nonNegativeInteger = xsd:nonNegativeInteger
positiveInteger = xsd:positiveInteger
double = xsd:double
anyURI = xsd:anyURI
base64Binary = xsd:base64Binary
ID = xsd:ID
IDREF = xsd:IDREF
IDREFS = xsd:IDREFS
NCName = xsd:NCName
boolean = "true" | "false"
dateOrDateTime = xsd:date | xsd:dateTime
timeOrDateTime = xsd:time | xsd:dateTime
language = xsd:language
countryCode = xsd:token { pattern = "[A-Za-z0-9]{1,8}" }
languageCode = xsd:token { pattern = "[A-Za-z]{1,8}" }
scriptCode = xsd:token { pattern = "[A-Za-z0-9]{1,8}" }
character = xsd:string { length = "1" }
length =
  xsd:string {
    pattern =
      "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
  }
nonNegativeLength =
  xsd:string {
    pattern =
      "([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
  }
positiveLength =
  xsd:string {
    pattern =
      "([0-9]*[1-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][0-9]*|\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
  }
percent = xsd:string { pattern = "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)%" }
zeroToHundredPercent =
  xsd:string {
    pattern = "([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
  }
signedZeroToHundredPercent =
  xsd:string {
    pattern = "-?([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
  }
relativeLength = xsd:string { pattern = "[0-9]+\*" }
coordinate = length
distance = length
color = xsd:string { pattern = "#[0-9a-fA-F]{6}" }
angle = xsd:string
CURIE =
  xsd:string { pattern = "(([\i-[:]][\c-[:]]*)?:)?.+" minLength = "1" }
CURIEs = list { CURIE+ }
SafeCURIE =
  xsd:string {
    pattern = "\[(([\i-[:]][\c-[:]]*)?:)?.+\]"
    minLength = "3"
  }
URIorSafeCURIE = anyURI | SafeCURIE
styleName = xsd:NCName
styleNameRef = xsd:NCName | empty
styleNameRefs = list { xsd:NCName* }
variableName = xsd:string
targetFrameName = "_self" | "_blank" | "_parent" | "_top" | \string
valueType =
  "float"
  | "time"
  | "date"
  | "percentage"
  | "currency"
  | "boolean"
  | "string"
points =
  xsd:string { pattern = "-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*" }
pathData = xsd:string
vector3D =
  xsd:string {
    pattern =
      "\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\)"
  }
namespacedToken = xsd:QName { pattern = "[^:]+:[^:]+" }
anyIRI =
  xsd:anyURI
  >> dc:description [
       "An IRI-reference as defined in [RFC3987]. See ODF 1.2 Part 1 section 18.3."
     ]
anyAttListOrElements =
  attribute * { text }*,
  anyElements
anyElements =
  element * {
    mixed { anyAttListOrElements }
  }*

[-- Attachment #4: schemas.xml --]
[-- Type: application/xml, Size: 402 bytes --]

^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 10:53                                                 ` Org schemas we talked to be non-free, was: " Jean Louis
@ 2021-01-24 17:50                                                   ` Ulrich Mueller
  2021-01-24 19:12                                                     ` Jean Louis
  2021-01-25  5:51                                                     ` Richard Stallman
  0 siblings, 2 replies; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-24 17:50 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Ulrich Mueller, dgutov, ams, arthur.miller, emacs-devel

>>>>> On Sun, 24 Jan 2021, Jean Louis wrote:

> Schemas are attached.

> I see copyright notices inside and it appears to be fully free
> document modifiable and distributable as long as copyrights remains.

Read these notices carefully. The key paragraph is this:

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   or assist in its implementation may be prepared, copied, published,
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this section are
   included on all such copies and derivative works.

Only a special class of derivative works can be distributed freely,
and it sounds like some of these would fall under "fair use" anyway.
Certainly this isn't enough to qualify as a free software license?

   However, this document itself may not be modified in any way,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   including by removing the copyright notice or references to OASIS,
   except as needed for the purpose of developing any document or
   deliverable produced by an OASIS Technical Committee (in which case
   the rules applicable to copyrights, as set forth in the OASIS IPR
   Policy, must be followed) or as required to translate it into
   languages other than English.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 17:50                                                   ` Ulrich Mueller
@ 2021-01-24 19:12                                                     ` Jean Louis
  2021-01-24 19:53                                                       ` Eli Zaretskii
                                                                         ` (2 more replies)
  2021-01-25  5:51                                                     ` Richard Stallman
  1 sibling, 3 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-24 19:12 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: ams, emacs-devel, Richard Stallman, arthur.miller, dgutov

* Ulrich Mueller <ulm@gentoo.org> [2021-01-24 20:51]:
> >>>>> On Sun, 24 Jan 2021, Jean Louis wrote:
> 
> > Schemas are attached.
> 
> > I see copyright notices inside and it appears to be fully free
> > document modifiable and distributable as long as copyrights remains.
> 
> Read these notices carefully. The key paragraph is this:
> 
>    This document and translations of it may be copied and furnished to
>    others, and derivative works that comment on or otherwise explain it
>                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    or assist in its implementation may be prepared, copied, published,
>    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    and distributed, in whole or in part, without restriction of any
>    kind, provided that the above copyright notice and this section are
>    included on all such copies and derivative works.
> 
> Only a special class of derivative works can be distributed freely,
> and it sounds like some of these would fall under "fair use" anyway.
> Certainly this isn't enough to qualify as a free software license?
> 
>    However, this document itself may not be modified in any way,
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>    including by removing the copyright notice or references to OASIS,
>    except as needed for the purpose of developing any document or
>    deliverable produced by an OASIS Technical Committee (in which case
>    the rules applicable to copyrights, as set forth in the OASIS IPR
>    Policy, must be followed) or as required to translate it into
>    languages other than English.

Then it is not free.

Maybe Org mode shall switch from using OASIS infested non-free
specification to Libreoffice. I could not find those files in
Libreoffice folders. But they could be somewhere hidden.

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 19:12                                                     ` Jean Louis
@ 2021-01-24 19:53                                                       ` Eli Zaretskii
  2021-01-24 20:36                                                         ` Ulrich Mueller
                                                                           ` (2 more replies)
  2021-01-24 20:46                                                       ` tomas
  2021-01-25  5:53                                                       ` Richard Stallman
  2 siblings, 3 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-24 19:53 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Sun, 24 Jan 2021 22:12:17 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: ams@gnu.org, emacs-devel@gnu.org, Richard Stallman <rms@gnu.org>,
>  arthur.miller@live.com, dgutov@yandex.ru
> 
> > Only a special class of derivative works can be distributed freely,
> > and it sounds like some of these would fall under "fair use" anyway.
> > Certainly this isn't enough to qualify as a free software license?
> > 
> >    However, this document itself may not be modified in any way,
> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >    including by removing the copyright notice or references to OASIS,
> >    except as needed for the purpose of developing any document or
> >    deliverable produced by an OASIS Technical Committee (in which case
> >    the rules applicable to copyrights, as set forth in the OASIS IPR
> >    Policy, must be followed) or as required to translate it into
> >    languages other than English.
> 
> Then it is not free.

Forgive me for a possibly naïve question, but why on earth would you
want to modify a schema?  It's the same as modifying a physical law.
Would you say that E = mc² is "non-free" because it cannot be
meaningfully modified at will?



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 19:53                                                       ` Eli Zaretskii
@ 2021-01-24 20:36                                                         ` Ulrich Mueller
  2021-01-25 15:06                                                           ` Eli Zaretskii
  2021-01-24 20:47                                                         ` Jean Louis
  2021-01-25  5:53                                                         ` Richard Stallman
  2 siblings, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-24 20:36 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: rms, Jean Louis, ulm, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Sun, 24 Jan 2021, Eli Zaretskii wrote:

>> > Only a special class of derivative works can be distributed freely,
>> > and it sounds like some of these would fall under "fair use" anyway.
>> > Certainly this isn't enough to qualify as a free software license?
>> > 
>> >    However, this document itself may not be modified in any way,
>> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> >    including by removing the copyright notice or references to OASIS,
>> >    except as needed for the purpose of developing any document or
>> >    deliverable produced by an OASIS Technical Committee (in which case
>> >    the rules applicable to copyrights, as set forth in the OASIS IPR
>> >    Policy, must be followed) or as required to translate it into
>> >    languages other than English.
>> 
>> Then it is not free.

> Forgive me for a possibly naïve question, but why on earth would you
> want to modify a schema?

I think the core question isn't if the files can be modified, but if
their license allows including them with a free software package.
At least if you apply the usual criteria mechanically, I believe the
answer would be "no".

> It's the same as modifying a physical law.  Would you say that E = mc²
> is "non-free" because it cannot be meaningfully modified at will?

That's an awful analogy. For example, you can modify (i.e. generalise)
the formula to E² = p²c² + m²c⁴ for an object with nonzero momentum. :-)



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 19:12                                                     ` Jean Louis
  2021-01-24 19:53                                                       ` Eli Zaretskii
@ 2021-01-24 20:46                                                       ` tomas
  2021-01-27  7:35                                                         ` Richard Stallman
  2021-01-25  5:53                                                       ` Richard Stallman
  2 siblings, 1 reply; 139+ messages in thread
From: tomas @ 2021-01-24 20:46 UTC (permalink / raw)
  To: emacs-devel; +Cc: Ulrich Mueller, ams, Richard Stallman, arthur.miller, dgutov

[-- Attachment #1: Type: text/plain, Size: 2379 bytes --]

On Sun, Jan 24, 2021 at 10:12:17PM +0300, Jean Louis wrote:
> * Ulrich Mueller <ulm@gentoo.org> [2021-01-24 20:51]:
> > >>>>> On Sun, 24 Jan 2021, Jean Louis wrote:
> > 
> > > Schemas are attached.
> > 
> > > I see copyright notices inside and it appears to be fully free
> > > document modifiable and distributable as long as copyrights remains.
> > 
> > Read these notices carefully. The key paragraph is this:
> > 
> >    This document and translations of it may be copied and furnished to
> >    others, and derivative works that comment on or otherwise explain it
> >                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >    or assist in its implementation may be prepared, copied, published,
> >    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >    and distributed, in whole or in part, without restriction of any
> >    kind, provided that the above copyright notice and this section are
> >    included on all such copies and derivative works.
> > 
> > Only a special class of derivative works can be distributed freely,
> > and it sounds like some of these would fall under "fair use" anyway.
> > Certainly this isn't enough to qualify as a free software license?
> > 
> >    However, this document itself may not be modified in any way,
> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >    including by removing the copyright notice or references to OASIS,
> >    except as needed for the purpose of developing any document or
> >    deliverable produced by an OASIS Technical Committee (in which case
> >    the rules applicable to copyrights, as set forth in the OASIS IPR
> >    Policy, must be followed) or as required to translate it into
> >    languages other than English.
> 
> Then it is not free.
> 
> Maybe Org mode shall switch from using OASIS infested non-free
> specification to Libreoffice. I could not find those files in
> Libreoffice folders. But they could be somewhere hidden.

LibreOffice's format (ODF) /is/ an OASIS standard [1].

(I have the impression that we might be interpreting to much into
the RelaxNG immutability. After all, things like RFCs are, in their
way immutable -- you can't change RFC8555 and keep calling it by
the same name.

Perhaps it'd make sense to talk to the OASIS folks.

Cheers

[1] https://wiki.documentfoundation.org/OASIS

 - t

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 19:53                                                       ` Eli Zaretskii
  2021-01-24 20:36                                                         ` Ulrich Mueller
@ 2021-01-24 20:47                                                         ` Jean Louis
  2021-01-25 15:13                                                           ` Eli Zaretskii
  2021-01-25  5:53                                                         ` Richard Stallman
  2 siblings, 1 reply; 139+ messages in thread
From: Jean Louis @ 2021-01-24 20:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

* Eli Zaretskii <eliz@gnu.org> [2021-01-24 22:53]:
> Forgive me for a possibly naïve question, but why on earth would you
> want to modify a schema?  It's the same as modifying a physical law.
> Would you say that E = mc² is "non-free" because it cannot be
> meaningfully modified at will?

I understand it. If that schema defines a document format and document
format cannot be modified then I do not see how software that handles
that document format is free. Programmers should be able to improve
the format or make it incompatible as it is part of the overall
document creation. It is not software but data used by software. Data
should be modifiable in my opinion.

Let us say enriched mode in Emacs, if it would not be modifiable by
programmers who fork Emacs, I am not sure if Emacs would be free
software.

How about Org mode itself? If its format would not be modifiable, then
we would not have software similar on Org or based on Org mode, such
as:

OneModel — an Alternative to emacs org-mode
https://soylentnews.org/article.pl?sid=16/04/23/0149257

Maybe we would not have Orgzly as mobile Org mode application that is
not Emacs. Maybe there would be not Vim Org mode and so on.

I just hope that Libreoffice is not using non-free OASIS schemas.

Jean







^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 17:50                                                   ` Ulrich Mueller
  2021-01-24 19:12                                                     ` Jean Louis
@ 2021-01-25  5:51                                                     ` Richard Stallman
  1 sibling, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-25  5:51 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: ulm, dgutov, ams, arthur.miller, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Only a special class of derivative works can be distributed freely,
  > and it sounds like some of these would fall under "fair use" anyway.
  > Certainly this isn't enough to qualify as a free software license?

Sad to say, you are right -- it is not a free license.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-24  8:34                                                 ` Ulrich Mueller
@ 2021-01-25  5:53                                                   ` Richard Stallman
  2021-01-25  6:52                                                     ` Jean Louis
  2021-01-25 15:51                                                     ` Dmitry Gutov
  0 siblings, 2 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-25  5:53 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

I think I understand the facts of the situation.
The OpenDocument schemas are nonfree.

One uncertainty remains in my understanding.  Are those
Schemas a kind of software, or are they some other kind of thing?

I think they are software, because they could be modified within an
infinite space of possibilities.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 19:12                                                     ` Jean Louis
  2021-01-24 19:53                                                       ` Eli Zaretskii
  2021-01-24 20:46                                                       ` tomas
@ 2021-01-25  5:53                                                       ` Richard Stallman
  2021-01-25  9:27                                                         ` Ulrich Mueller
  2 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-25  5:53 UTC (permalink / raw)
  To: Jean Louis; +Cc: ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Maybe Org mode shall switch from using OASIS infested non-free
  > specification to Libreoffice. I could not find those files in
  > Libreoffice folders. But they could be somewhere hidden.

This is an interesting issue.  If you could verify that LibreOffice
does not contain those nonfree schemas, that would be very good news!

You don't have to check it yourself -- you could find an expert
who understands how LibreOffice works, someone who knows the answer
and can explain it.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 19:53                                                       ` Eli Zaretskii
  2021-01-24 20:36                                                         ` Ulrich Mueller
  2021-01-24 20:47                                                         ` Jean Louis
@ 2021-01-25  5:53                                                         ` Richard Stallman
  2021-01-25 15:27                                                           ` Eli Zaretskii
  2 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-25  5:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Forgive me for a possibly naïve question, but why on earth would you
  > want to modify a schema?  It's the same as modifying a physical law.

  > Would you say that E = mc² is "non-free" because it cannot be
  > meaningfully modified at will?

We can't modify physics, but a physicist might very well want to modify
the equation E = mc².  For instance, perse might want to use natural units,
in which c = 1, which would give E = m.

Then perse might want to generalize to handle an object not at rest, by
including its momentum.  That gives E² - p² = m².

Or perse might want to express that in 4-dimensional covariant form as

    μ    2                                    2    2
p  p  = m   = p  p  - p  p - p  p - p  p   = E  - p
 μ             0  0    1  1   2  2   3  3

And that's considering only _valid_ equations for relating mass and
energy.  I might want to modify the equation to make it be valid for
some other purpose, or to present an instance of an equation which is
not valid.



-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25  5:53                                                   ` Richard Stallman
@ 2021-01-25  6:52                                                     ` Jean Louis
  2021-01-25 12:11                                                       ` Fabrice BAUZAC-STEHLY
                                                                         ` (2 more replies)
  2021-01-25 15:51                                                     ` Dmitry Gutov
  1 sibling, 3 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-25  6:52 UTC (permalink / raw)
  To: rms, Richard Stallman, Ulrich Mueller
  Cc: ulm, dgutov, ams, arthur.miller, emacs-devel

I think, but not sure, that schema is pattern on how documents should be interpreted by software. Without it, certain functions would not work. In my opinion it is one way of programming by pattern and this part of software.

In itself it does nothing. 

It is not just a configuration file or data like list of colors or fonts. I think it is pattern that changes algorithm of software and thus part of software.


On January 25, 2021 5:53:04 AM UTC, Richard Stallman <rms@gnu.org> wrote:
>[[[ To any NSA and FBI agents reading my email: please consider    ]]]
>[[[ whether defending the US Constitution against all enemies,     ]]]
>[[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>I think I understand the facts of the situation.
>The OpenDocument schemas are nonfree.
>
>One uncertainty remains in my understanding.  Are those
>Schemas a kind of software, or are they some other kind of thing?
>
>I think they are software, because they could be modified within an
>infinite space of possibilities.


Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25  5:53                                                       ` Richard Stallman
@ 2021-01-25  9:27                                                         ` Ulrich Mueller
  2021-01-26  6:03                                                           ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-25  9:27 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Jean Louis, ulm, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Mon, 25 Jan 2021, Richard Stallman wrote:

>> Maybe Org mode shall switch from using OASIS infested non-free
>> specification to Libreoffice. I could not find those files in
>> Libreoffice folders. But they could be somewhere hidden.

> This is an interesting issue.  If you could verify that LibreOffice
> does not contain those nonfree schemas, that would be very good news!

I fear we are out of luck there. Libreoffice documentation at
https://help.libreoffice.org/3.3/Common/XML_File_Formats#Definition_of_the_XML_formats
says "The schema for the OpenDocument formats can be found on the
www.oasis-open.org web site", i.e., it points to the same nonfree files.

I've also checked the Gentoo app-office/libreoffice-7.0.4.2 package,
and it doesn't install any Relax-NG schemas. It only installs DTDs for
the older OpenOffice.org 1.x format. These are licensed under MPL-2.0.

Maybe it's time to contact OASIS Open and ask them if they would
consider relicensing the Relax-NG schemas. Does somebody know one of the
persons from their committee, because that may be a good place to start:
https://www.oasis-open.org/committees/membership.php?wg_abbrev=office



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25  6:52                                                     ` Jean Louis
@ 2021-01-25 12:11                                                       ` Fabrice BAUZAC-STEHLY
  2021-01-25 15:29                                                       ` Eli Zaretskii
  2021-01-27  7:37                                                       ` Richard Stallman
  2 siblings, 0 replies; 139+ messages in thread
From: Fabrice BAUZAC-STEHLY @ 2021-01-25 12:11 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

Jean Louis <bugs@gnu.support> writes:

> I think, but not sure, that schema is pattern on how documents should
> be interpreted by software. Without it, certain functions would not
> work. In my opinion it is one way of programming by pattern and this
> part of software.

I happen to have worked on software that works with XML and which
provides an XML schema with it.

I think the XML schemas (be them Relax-NG or XML Schema Definition
(XSD)) only indicate constraints in a tree of XML elements.  For
example, we can say the following set of constraints in either Relax-NG
syntax or XSD syntax:

  Each <a> element must contain exactly one <b> element, followed by at
  least 2 <c> elements.

  Each <b> element can have an optional attribute "name" which value
  must be boolean, and must contain exactly one <c> element.

  Each <c> element must contain a string.

It is somewhat similar to constraints I impose on the argument of my
defun, e.g. "it must be a list with any number of elements, but each
element must be a number or a list of strings"

So for me an XML schema is something similar to a BNF grammar
definition.

Why would a schema need to be modified?  I think there can be a lot of
reasons.  There may be several ways to represent the constraints, so
another way might be more readable and it would then be a good idea to
change it.  Or, maybe there is a new version of the schema syntax and we
would like to upgrade a schema with the new features of the new version
which makes the schema more straightforward to read.  Or something in
the schema is not sufficiently constrained, so that users using a
schema-verification tool would provide values that are not understood by
a program, and we would need to change the schema so that users are
warned that the thing they are putting in is not right.  Or, a program
now has extended capabilities which were not envisioned when the schema
was written, so we would like to accept more things in XML and for that
we would need to change the schema.

Concerning the XML-processing software I have worked on, the schema had
to be changed from version to version (it was delivered with each
version) to cope with new needs and extend the features.  It was a
schema dedicated to this tool, not a standard supposed to be unique for
many tools.  But I think even a standard schema should not prevent an
implementation to be able to support extensions of the standard schema
to add more features.  The implementation should be able to not only
process XML files that comply to the standard schema, but also XML files
that have additions that improve the functionality of the
implementation.

I don't know for sure whether schemas can be written in a way that never
prevent extensions, such as: "each <a> should have one <b> child, but it
is allowed to also put any other child under <a>".  But even if there
can be such very permissive schemas, we might want the program to come
with its alternative schema (with additional features and XML elements
and XML attributes) to ease data editing by users, because schemas are
also used by XML editors to help the user fill in the blanks.

However, a schema indicates types in a (possibly recursive) data
structure, but does not otherwise influence how the data are processed.

--
Fabrice Bauzac-Stehly
PGP 01EEACF8244E9C14B551C5256ADA5F189BD322B6
old PGP 015AE9B25DCB0511D200A75DE5674DEA514C891D



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 20:36                                                         ` Ulrich Mueller
@ 2021-01-25 15:06                                                           ` Eli Zaretskii
  2021-01-26  6:01                                                             ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 15:06 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: rms, bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

> From: Ulrich Mueller <ulm@gentoo.org>
> Cc: Jean Louis <bugs@gnu.support>,  ulm@gentoo.org,  rms@gnu.org,
>   dgutov@yandex.ru,  ams@gnu.org,  arthur.miller@live.com,
>   emacs-devel@gnu.org
> Date: Sun, 24 Jan 2021 21:36:54 +0100
> 
> >>>>> On Sun, 24 Jan 2021, Eli Zaretskii wrote:
> 
> >> > Only a special class of derivative works can be distributed freely,
> >> > and it sounds like some of these would fall under "fair use" anyway.
> >> > Certainly this isn't enough to qualify as a free software license?
> >> > 
> >> >    However, this document itself may not be modified in any way,
> >> >             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >> >    including by removing the copyright notice or references to OASIS,
> >> >    except as needed for the purpose of developing any document or
> >> >    deliverable produced by an OASIS Technical Committee (in which case
> >> >    the rules applicable to copyrights, as set forth in the OASIS IPR
> >> >    Policy, must be followed) or as required to translate it into
> >> >    languages other than English.
> >> 
> >> Then it is not free.
> 
> > Forgive me for a possibly naïve question, but why on earth would you
> > want to modify a schema?
> 
> I think the core question isn't if the files can be modified, but if
> their license allows including them with a free software package.

Where does the stuff that you quoted disallow that?

> At least if you apply the usual criteria mechanically, I believe the
> answer would be "no".

I very much hope that we don't apply anything of this kind
mechanically.

> > It's the same as modifying a physical law.  Would you say that E = mc²
> > is "non-free" because it cannot be meaningfully modified at will?
> 
> That's an awful analogy.

Why "awful"?  A physical law describes some part of the reality, and
an XML schema describes a certain kind of documents and data types.

> For example, you can modify (i.e. generalise) the formula to E² =
> p²c² + m²c⁴ for an object with nonzero momentum. :-)

A schema can be similarly "generalized" (a.k.a. "extended") without
changing it: you include the schema in your own and then add your own
data types and conditions.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 20:47                                                         ` Jean Louis
@ 2021-01-25 15:13                                                           ` Eli Zaretskii
  2021-01-25 17:50                                                             ` Jean Louis
                                                                               ` (2 more replies)
  0 siblings, 3 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 15:13 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Sun, 24 Jan 2021 23:47:42 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: ulm@gentoo.org, rms@gnu.org, dgutov@yandex.ru, ams@gnu.org,
>   arthur.miller@live.com, emacs-devel@gnu.org
> 
> I understand it. If that schema defines a document format and document
> format cannot be modified then I do not see how software that handles
> that document format is free. Programmers should be able to improve
> the format or make it incompatible as it is part of the overall
> document creation. It is not software but data used by software. Data
> should be modifiable in my opinion.

Modifications of a schema produce a file that can no longer be used
with the same collection of documents and protocols.  So such
modifications are not useful.  I very much hope that we as a movement
will not insist on abstract "freedom" to make useless modifications
just for the sake of modifications.  To me, Free Software movement is
a pragmatic movement that picks up its fights wisely, and this
particular fight isn't, it's a Quixotic fight for a useless goal.

> Let us say enriched mode in Emacs, if it would not be modifiable by
> programmers who fork Emacs, I am not sure if Emacs would be free
> software.

Enriched mode doesn't have or use a schema, so this example is
inapplicable.

> How about Org mode itself? If its format would not be modifiable, then
> we would not have software similar on Org or based on Org mode, such
> as:
> 
> OneModel — an Alternative to emacs org-mode
> https://soylentnews.org/article.pl?sid=16/04/23/0149257

Is OneModel compatible with Org?  If it is, then it's an extension,
not some modification.  If it isn't compatible, then it's simply a
different schema, unrelated to Org.

> I just hope that Libreoffice is not using non-free OASIS schemas.

They would be silly if they didn't.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25  5:53                                                         ` Richard Stallman
@ 2021-01-25 15:27                                                           ` Eli Zaretskii
  0 siblings, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 15:27 UTC (permalink / raw)
  To: rms; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

> From: Richard Stallman <rms@gnu.org>
> Cc: bugs@gnu.support, ulm@gentoo.org, dgutov@yandex.ru, ams@gnu.org,
> 	arthur.miller@live.com, emacs-devel@gnu.org
> Date: Mon, 25 Jan 2021 00:53:57 -0500
> 
>   > Forgive me for a possibly naïve question, but why on earth would you
>   > want to modify a schema?  It's the same as modifying a physical law.
> 
>   > Would you say that E = mc² is "non-free" because it cannot be
>   > meaningfully modified at will?
> 
> We can't modify physics

Exactly.  And similarly with the data types described by a schema:
changing the description doesn't change the things it describes, it
just makes the description inaccurate and thus useless.

> but a physicist might very well want to modify
> the equation E = mc².  For instance, perse might want to use natural units,
> in which c = 1, which would give E = m.

A schema supports extension, which IMO is the analogy of that.

> And that's considering only _valid_ equations for relating mass and
> energy.  I might want to modify the equation to make it be valid for
> some other purpose, or to present an instance of an equation which is
> not valid.

I very much hope we won't fight a Quixotic battle so that we could
make a schema invalid.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25  6:52                                                     ` Jean Louis
  2021-01-25 12:11                                                       ` Fabrice BAUZAC-STEHLY
@ 2021-01-25 15:29                                                       ` Eli Zaretskii
  2021-01-27  7:37                                                       ` Richard Stallman
  2 siblings, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 15:29 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Mon, 25 Jan 2021 06:52:46 +0000
> From: Jean Louis <bugs@gnu.support>
> Cc: ulm@gentoo.org, dgutov@yandex.ru, ams@gnu.org, arthur.miller@live.com,
>  emacs-devel@gnu.org
> 
> I think, but not sure, that schema is pattern on how documents should be interpreted by software. Without it, certain functions would not work. In my opinion it is one way of programming by pattern and this part of software.
> 
> In itself it does nothing. 
> 
> It is not just a configuration file or data like list of colors or fonts. I think it is pattern that changes algorithm of software and thus part of software.

Therefore, it is not software.  (And no, it doesn't change the
algorithms.)



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25  5:53                                                   ` Richard Stallman
  2021-01-25  6:52                                                     ` Jean Louis
@ 2021-01-25 15:51                                                     ` Dmitry Gutov
  2021-01-25 17:59                                                       ` Jean Louis
  2021-01-26  5:59                                                       ` Richard Stallman
  1 sibling, 2 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-25 15:51 UTC (permalink / raw)
  To: rms, Ulrich Mueller; +Cc: ams, arthur.miller, bugs, emacs-devel

On 25.01.2021 07:53, Richard Stallman wrote:
> One uncertainty remains in my understanding.  Are those
> Schemas a kind of software, or are they some other kind of thing?
> 
> I think they are software, because they could be modified within an
> infinite space of possibilities.

A picture can be modified within an infinite space of possibilities. A 
book can be modified. A mathematical equation can be modified.

None of the above are software.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 15:13                                                           ` Eli Zaretskii
@ 2021-01-25 17:50                                                             ` Jean Louis
  2021-01-25 17:56                                                             ` Jean Louis
  2021-01-25 20:10                                                             ` Ulrich Mueller
  2 siblings, 0 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-25 17:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

* Eli Zaretskii <eliz@gnu.org> [2021-01-25 18:14]:
> > Date: Sun, 24 Jan 2021 23:47:42 +0300
> > From: Jean Louis <bugs@gnu.support>
> > Cc: ulm@gentoo.org, rms@gnu.org, dgutov@yandex.ru, ams@gnu.org,
> >   arthur.miller@live.com, emacs-devel@gnu.org
> > 
> > I understand it. If that schema defines a document format and document
> > format cannot be modified then I do not see how software that handles
> > that document format is free. Programmers should be able to improve
> > the format or make it incompatible as it is part of the overall
> > document creation. It is not software but data used by software. Data
> > should be modifiable in my opinion.
> 
> Modifications of a schema produce a file that can no longer be used
> with the same collection of documents and protocols.  So such
> modifications are not useful.  I very much hope that we as a movement
> will not insist on abstract "freedom" to make useless modifications
> just for the sake of modifications.  To me, Free Software movement is
> a pragmatic movement that picks up its fights wisely, and this
> particular fight isn't, it's a Quixotic fight for a useless goal.

That may be. I do not know.

I find it alright to fork various software and change the final format
of a document and produce new software with it. That is why also
schemas should be modifiable. Otherwise it could make all software
producing those documents non-free. I am just not sure if that schema
does what I think it does.

Of course people would not really make useless modifications. There
are reasons why and how modifications are made, why sometimes forks
are necessary.

Libreoffice is itself fork from Openoffice. I do not see it being
useless, now it is everywhere. I cannot even find Openoffice easy. It
is useful.

Then again without all the combinations of useless and useful things
we would not be able to distinguish between each other. Plethora of
people will make some useless things, but some of those useless will
incite other people to make useful things. Those are butterfly
effects, we better not underestimate it.

Some projects will stall. Why does Guile language support Emacs Lisp?
One could say it is useless to create new implementation of Emacs
Lisp. Or new implementation of Common Lisp.

In relation to formats, such should be free and modifiable, people
shall be able to build upon them and create new formats. Some will be
useless some will be useful. But without freedom, we will not even
know it.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 15:13                                                           ` Eli Zaretskii
  2021-01-25 17:50                                                             ` Jean Louis
@ 2021-01-25 17:56                                                             ` Jean Louis
  2021-01-25 19:27                                                               ` Eli Zaretskii
  2021-01-26  6:09                                                               ` Richard Stallman
  2021-01-25 20:10                                                             ` Ulrich Mueller
  2 siblings, 2 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-25 17:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

* Eli Zaretskii <eliz@gnu.org> [2021-01-25 18:14]:
> > Let us say enriched mode in Emacs, if it would not be modifiable by
> > programmers who fork Emacs, I am not sure if Emacs would be free
> > software.
> 
> Enriched mode doesn't have or use a schema, so this example is
> inapplicable.

But it has its format. Right?

Content-Type: text/enriched
Text-Width: 70

<center>

Hello there</center>

How about programmer comes and says, now I want to call it Enriched
mode, but internally it has to look like this:

FORMAT: Enriched
Width: 70

<PUT-MIDDLE>

Hello there</DONE>

> > How about Org mode itself? If its format would not be modifiable, then
> > we would not have software similar on Org or based on Org mode, such
> > as:
> > 
> > OneModel — an Alternative to emacs org-mode
> > https://soylentnews.org/article.pl?sid=16/04/23/0149257
> 
> Is OneModel compatible with Org?  If it is, then it's an extension,
> not some modification.  If it isn't compatible, then it's simply a
> different schema, unrelated to Org.

Exactly, I was thinking we were chatting about that. Of course that by
changing schema one may get incompatible formats. And that shall be
software freedom. We have to allow programmers to make any formats and
build upon previous formats.

Incompatibility or not, that is not major point.

When StarOffice was made first time its format was incompatible to
many other formats. It was proprietary software. I know it as I have
purchased it in Germany and used. Without that incompatible format we
would not have today Open Document Format. So those schemas should be
also free that new formats can be devised. The history of
StarOffice/OpenOffice/LibreOffice shows that freedom is important and
that people build upon it.





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 15:51                                                     ` Dmitry Gutov
@ 2021-01-25 17:59                                                       ` Jean Louis
  2021-01-25 18:21                                                         ` Dmitry Gutov
                                                                           ` (3 more replies)
  2021-01-26  5:59                                                       ` Richard Stallman
  1 sibling, 4 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-25 17:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ulrich Mueller, ams, rms, arthur.miller, emacs-devel

* Dmitry Gutov <dgutov@yandex.ru> [2021-01-25 18:52]:
> On 25.01.2021 07:53, Richard Stallman wrote:
> > One uncertainty remains in my understanding.  Are those
> > Schemas a kind of software, or are they some other kind of thing?
> > 
> > I think they are software, because they could be modified within an
> > infinite space of possibilities.
> 
> A picture can be modified within an infinite space of possibilities. A book
> can be modified. A mathematical equation can be modified.
> 
> None of the above are software.

Software

From Wordnet dictionary:

* Overview of noun software

The noun software has 1 sense (no senses from tagged texts)
1. software, software program, computer software, software system, software package, package -- ((computer science) written programs or procedures or rules and associated documentation pertaining to the operation of a computer system and that are stored in read/write memory; "the market for software is expected to expand")

From Wikipedia:

Software is a collection of instructions and data that tell the
computer how to work.

If schema is data it is part of software together with instructions.

If schema represents rules how to produce digital document it is part
of software.




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 17:59                                                       ` Jean Louis
@ 2021-01-25 18:21                                                         ` Dmitry Gutov
  2021-01-26  3:40                                                           ` Jean Louis
  2021-01-26  6:10                                                           ` Richard Stallman
  2021-01-25 19:33                                                         ` Eli Zaretskii
                                                                           ` (2 subsequent siblings)
  3 siblings, 2 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-25 18:21 UTC (permalink / raw)
  To: rms, Ulrich Mueller, emacs-devel, ams, arthur.miller

On 25.01.2021 19:59, Jean Louis wrote:
> If schema is data it is part of software together with instructions.
> 
> If schema represents rules how to produce digital document it is part
> of software.

We don't consider the bitmap files in the Emacs distribution to be software.

And yet, they contain the "rules" to produce each individual picture on 
the screen.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 17:56                                                             ` Jean Louis
@ 2021-01-25 19:27                                                               ` Eli Zaretskii
  2021-01-26  3:50                                                                 ` Jean Louis
  2021-01-26  6:09                                                               ` Richard Stallman
  1 sibling, 1 reply; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 19:27 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Mon, 25 Jan 2021 20:56:21 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: ulm@gentoo.org, rms@gnu.org, dgutov@yandex.ru, ams@gnu.org,
>   arthur.miller@live.com, emacs-devel@gnu.org
> 
> * Eli Zaretskii <eliz@gnu.org> [2021-01-25 18:14]:
> > > Let us say enriched mode in Emacs, if it would not be modifiable by
> > > programmers who fork Emacs, I am not sure if Emacs would be free
> > > software.
> > 
> > Enriched mode doesn't have or use a schema, so this example is
> > inapplicable.
> 
> But it has its format. Right?

Its format is determined by the code, not by a DTD.  And that format
is specific to Enriched mode alone, it's its private format that is
not shared with any other application.

> How about programmer comes and says, now I want to call it Enriched
> mode, but internally it has to look like this:
> 
> FORMAT: Enriched
> Width: 70
> 
> <PUT-MIDDLE>
> 
> Hello there</DONE>

How is this relevant to the issue we are discussing?

> Exactly, I was thinking we were chatting about that. Of course that by
> changing schema one may get incompatible formats. And that shall be
> software freedom. We have to allow programmers to make any formats and
> build upon previous formats.
> 
> Incompatibility or not, that is not major point.

It is exactly the major point.  If you want to create a new schema,
you can.

> When StarOffice was made first time its format was incompatible to
> many other formats.

We are not talking about format of office files, we are talking about
definitions of data types shared by gazillions of files used for very
different purposes.  It's a completely different use case.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 17:59                                                       ` Jean Louis
  2021-01-25 18:21                                                         ` Dmitry Gutov
@ 2021-01-25 19:33                                                         ` Eli Zaretskii
  2021-01-25 19:38                                                         ` Eli Zaretskii
  2021-01-26 13:21                                                         ` Richard Stallman
  3 siblings, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 19:33 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Mon, 25 Jan 2021 20:59:14 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: Ulrich Mueller <ulm@gentoo.org>, ams@gnu.org, rms@gnu.org,
>  arthur.miller@live.com, emacs-devel@gnu.org
> 
> > A picture can be modified within an infinite space of possibilities. A book
> > can be modified. A mathematical equation can be modified.
> > 
> > None of the above are software.
> 
> Software
> 
> >From Wordnet dictionary:
> 
> * Overview of noun software

Sigh...

The Free Software movement was born out of this great concept: that
programs are expressions of ideas -- algorithms and methods for
solving complex problems -- and that free exchange of those ideas
benefits mankind, and therefore preventing this free exchange is
harmful.

Now tell me what kind of a useful idea that should be shared do you
find in a data type definition contained in an XML schema, which is
basically a label: when I say "string" I mean this and that?  Is this
what Free Software is about?  Maybe that's a better food for thought
than an abstract definition from Wordnet (which you also mis-interpret
to mean that "data" there means the kind of data we have in a schema).



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 17:59                                                       ` Jean Louis
  2021-01-25 18:21                                                         ` Dmitry Gutov
  2021-01-25 19:33                                                         ` Eli Zaretskii
@ 2021-01-25 19:38                                                         ` Eli Zaretskii
  2021-01-26 13:21                                                         ` Richard Stallman
  3 siblings, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 19:38 UTC (permalink / raw)
  To: Jean Louis; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

> Date: Mon, 25 Jan 2021 20:59:14 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: Ulrich Mueller <ulm@gentoo.org>, ams@gnu.org, rms@gnu.org,
>  arthur.miller@live.com, emacs-devel@gnu.org
> 
> If schema is data it is part of software together with instructions.

You have misunderstood what "data" means in that definition.  To
realize why you misunderstood, consider this: a program can include
"data" like the number 5.0e-10, but that doesn't make such a number
any kind of software.  Conclusion: not every kind of "data" can be
considered to be so central to a program as to be an integral part of
'software".  A judgment call is needed.

> If schema represents rules how to produce digital document

It doesn't.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 15:13                                                           ` Eli Zaretskii
  2021-01-25 17:50                                                             ` Jean Louis
  2021-01-25 17:56                                                             ` Jean Louis
@ 2021-01-25 20:10                                                             ` Ulrich Mueller
  2021-01-25 20:21                                                               ` Eli Zaretskii
  2021-01-26  6:09                                                               ` Richard Stallman
  2 siblings, 2 replies; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-25 20:10 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: rms, Jean Louis, ulm, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Mon, 25 Jan 2021, Eli Zaretskii wrote:

> Modifications of a schema produce a file that can no longer be used
> with the same collection of documents and protocols.  So such
> modifications are not useful.  I very much hope that we as a movement
> will not insist on abstract "freedom" to make useless modifications
> just for the sake of modifications.  To me, Free Software movement is
> a pragmatic movement that picks up its fights wisely, and this
> particular fight isn't, it's a Quixotic fight for a useless goal.

Of the files included with Emacs, maybe the the Unicode data files are
the ones that resemble the purpose of the schemas most closely. As they
are also part of a standard, modifying them (e.g., put "A" at a position
other than 0x41) wouldn't make much sense either.

Nevertheless, they are distributed under a license [1] that allows
"to deal in the Data Files or Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies".

[1] https://www.unicode.org/license.html



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 20:10                                                             ` Ulrich Mueller
@ 2021-01-25 20:21                                                               ` Eli Zaretskii
  2021-01-26  6:09                                                               ` Richard Stallman
  1 sibling, 0 replies; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-25 20:21 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: rms, bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

> From: Ulrich Mueller <ulm@gentoo.org>
> Cc: Jean Louis <bugs@gnu.support>,  rms@gnu.org,  ulm@gentoo.org,
>   emacs-devel@gnu.org,  ams@gnu.org,  arthur.miller@live.com,
>   dgutov@yandex.ru
> Date: Mon, 25 Jan 2021 21:10:21 +0100
> 
> Of the files included with Emacs, maybe the the Unicode data files are
> the ones that resemble the purpose of the schemas most closely. As they
> are also part of a standard, modifying them (e.g., put "A" at a position
> other than 0x41) wouldn't make much sense either.
> 
> Nevertheless, they are distributed under a license [1] that allows
> "to deal in the Data Files or Software without restriction, including
> without limitation the rights to use, copy, modify, merge, publish,
> distribute, and/or sell copies".

But we did nothing to have that license, it's how the Unicode
Consortium distributes the UCD files.  So I don't see how this is
relevant to the issue at hand -- unless you'd like to propose that we
approach the Unicode Consortium asking them whether they would like to
replace their license with a non-free one...



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 18:21                                                         ` Dmitry Gutov
@ 2021-01-26  3:40                                                           ` Jean Louis
  2021-01-26  6:10                                                           ` Richard Stallman
  1 sibling, 0 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-26  3:40 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Ulrich Mueller, ams, rms, arthur.miller, emacs-devel

* Dmitry Gutov <dgutov@yandex.ru> [2021-01-25 21:30]:
> On 25.01.2021 19:59, Jean Louis wrote:
> > If schema is data it is part of software together with instructions.
> > 
> > If schema represents rules how to produce digital document it is part
> > of software.
> 
> We don't consider the bitmap files in the Emacs distribution to be software.
> 
> And yet, they contain the "rules" to produce each individual picture on the
> screen.

So what is "software" for you? Maybe you use different definition.

If we speak of software it is anything that one cannot physically by
using hands touch, assemble, disassemble, and repair. It is related
and opposite to hardware. It is data in any form that is stored
digitally on hardware.

Bitmap files and program are software. They are not hardware. In
general, if one wants to know if something is software there is simple
test: Is it hardware? If it is not hardware, but is stored on hardware
memory devices then it is software. It can be a picture of course. It
could be picture alone without any program to use that picture.

Software is what is not hardware.

If some schema is used to verify document in any manner that is
definitely data and it is there for a program to process that
data. Program’s function depends on that data, thus data becomes part
of program. Such data can be optional. Program’s function can be
optional. That does not make the data less part of specific
software. It can be part of various other software packages.

Software as general term is that data inside memory that is not
hardware. Be it executable program or not.

Software package is what is bundled together to make the whole program
function.

Program alone is software, but in example of Emacs there are many
programs bundled together and they do not constitute plural of
software such as Emacs softwareS, rather all Emacs package together is
called software. All digital information coming in the Emacs package
is "software". That is how all software packages in the world are
marketed, sold, purchased, referred to.  "Software" and "program" are
different words with different definitions.

Data may be separate from programs, but any digital data on computer
is always processed by some programs. Any digital data is software
because it is not hardware but is stored on hardware devices.

So any picture, any type of file, or text is software. Any type of
file is processed by program such as operating system to at least
display that such file exists on hardware. One need not run the
file. The file need not have specific procedure or set of
instructions, thus it need not be program to be software. It is
processed by software sooner or later.

Software is what can be processed by CPU and is stored digitally.

In my opinion, a computer program or other digital data written or
printed on paper does not represent software. It is printout of
software. But such printout does represent a computer program. One
could call it "software" but I think that is mistaken as such cannot
be directly run by CPU and it is not digitally stored. So such are not
software for me.

Jean





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 19:27                                                               ` Eli Zaretskii
@ 2021-01-26  3:50                                                                 ` Jean Louis
  0 siblings, 0 replies; 139+ messages in thread
From: Jean Louis @ 2021-01-26  3:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, ulm, emacs-devel, ams, arthur.miller, dgutov

* Eli Zaretskii <eliz@gnu.org> [2021-01-25 22:27]:
> > Date: Mon, 25 Jan 2021 20:56:21 +0300
> > From: Jean Louis <bugs@gnu.support>
> > Cc: ulm@gentoo.org, rms@gnu.org, dgutov@yandex.ru, ams@gnu.org,
> >   arthur.miller@live.com, emacs-devel@gnu.org
> > 
> > * Eli Zaretskii <eliz@gnu.org> [2021-01-25 18:14]:
> > > > Let us say enriched mode in Emacs, if it would not be modifiable by
> > > > programmers who fork Emacs, I am not sure if Emacs would be free
> > > > software.
> > > 
> > > Enriched mode doesn't have or use a schema, so this example is
> > > inapplicable.
> > 
> > But it has its format. Right?
> 
> Its format is determined by the code, not by a DTD.  And that format
> is specific to Enriched mode alone, it's its private format that is
> not shared with any other application.

I was assuming it is determined by code. The specification need not be
anywhere written in easy manner such as some schema. But it is written
in the code and users are free to modify it. So when speaking of
freedom users are free to modify the format of that document. I hope
so.

Freedom gives user opportunity not to make it private format. That is
how new software comes into existence. If there is no freedom to
modify and distribute and build upon it then programmers will most
probably be reluctant to create new works.

> > How about programmer comes and says, now I want to call it Enriched
> > mode, but internally it has to look like this:
> > 
> > FORMAT: Enriched
> > Width: 70
> > 
> > <PUT-MIDDLE>
> > 
> > Hello there</DONE>
> 
> How is this relevant to the issue we are discussing?

Maybe we shall first agree what we are discussing?

I am talking about free software and freedom and if non-free program
dependent data such as schemas should or should not be distributed
with the Org package.

What is the issue that we discuss according to you?

> > Exactly, I was thinking we were chatting about that. Of course that by
> > changing schema one may get incompatible formats. And that shall be
> > software freedom. We have to allow programmers to make any formats and
> > build upon previous formats.
> > 
> > Incompatibility or not, that is not major point.
> 
> It is exactly the major point.  If you want to create a new schema,
> you can.

But you cannot modify the file that came along with free software. Of
course we can create new schemas and new programs from scratch. But if
we cannot modify that data coming along with free software such as Org
package then Org package as software package is not fully free
package.

Maybe those functions that depend on non-free data shall be taken out
of the Org mode and be distributed separately.

It also brings up question if LibreOffice is really Libre if it
depends on such non-free schema.

> > When StarOffice was made first time its format was incompatible to
> > many other formats.
> 
> We are not talking about format of office files, we are talking about
> definitions of data types shared by gazillions of files used for very
> different purposes.  It's a completely different use case.

Your reference of the text I wrote is out of the intended context. You
said it was useless to change schema and I have pointed out back to
same LibreOffice/OpenOffice/StarOffice that it actually improved
itself in few decades exactly because somebody was allowed to change
the formats. Even if it maybe was not fully free, at least somebody
was improving upon it. So the option to improve the format of a
document is beneficial and rather useful even if it would break or
change some compatibilities from past.

My point was that when people are given freedom they are allowed to
create new software and build upon the existing one.

When bundling non-free schema with Org, do we give that freedom to
receiver or not?

If we do not give the freedom to user receiving the Org package then
maybe such schema shall be removed from the package and functions
depending on such non-free schema removed.

Jean



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 15:51                                                     ` Dmitry Gutov
  2021-01-25 17:59                                                       ` Jean Louis
@ 2021-01-26  5:59                                                       ` Richard Stallman
  2021-01-26 13:15                                                         ` Dmitry Gutov
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-26  5:59 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, bugs, ams, arthur.miller, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > I think they are software, because they could be modified within an
  > > infinite space of possibilities.

  > A picture can be modified within an infinite space of possibilities. A 
  > book can be modified. A mathematical equation can be modified.

That is true, but you've taken the question I raised for myself out of
its context.  The real question is, "In the context, is there any
doubt that this is a piece of software?  If not, what else could it
be?

I think it is clear that a specification of a data structure, meant to
guide a program's operation on that data, is software.  It is
comparable to a bunch of struct and enum declarations which is how we
use C header files to show the structure of other data.

It may be true that any changes you make in these schemas would be
tightly constrained _if you want them to interoperate with ODF_.  The
same is true for system header files, as long as you're going to use
with GNU libc.  The latter must be under a free license, and for the same
reasons the former also.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 15:06                                                           ` Eli Zaretskii
@ 2021-01-26  6:01                                                             ` Richard Stallman
  2021-01-26 15:57                                                               ` Eli Zaretskii
  0 siblings, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-26  6:01 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > A schema can be similarly "generalized" (a.k.a. "extended") without
  > changing it: you include the schema in your own and then add your own
  > data types and conditions.

Can you please show me how sort of generalization is done?  It isn't
allowed by editing the schema; the license of the schema does not give
permission for such modifications.
  
Is there some other mechanism that can be used to do that job?  If so,
could you please show me something about that mechanism, and what it
can and can't do?

The license of TeX says that modifying the TeX source file is
forbidden -- but you can make changes for running it, with a change
file.  A change file can be used to make any change whatsoever, so in
effect this is just a requirement abuot how to package a modified
version of TeX, nothing more.  That's why TeX qualifies as free
software.

If there is a similar authorized patching system for XML schemas,
maybe that suffices to make the Open Documentation schemas free in
effect even with their current license.  But that depends on the
details, on what range of things the patching system can do.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25  9:27                                                         ` Ulrich Mueller
@ 2021-01-26  6:03                                                           ` Richard Stallman
  2021-01-26  9:24                                                             ` Ulrich Mueller
                                                                               ` (2 more replies)
  0 siblings, 3 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-26  6:03 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I fear we are out of luck there. Libreoffice documentation at
  > https://help.libreoffice.org/3.3/Common/XML_File_Formats#Definition_of_the_XML_formats
  > says "The schema for the OpenDocument formats can be found on the
  > www.oasis-open.org web site", i.e., it points to the same nonfree files.

If we were looking for alternative definitions of those formats, you
found that there were none there.  But that doesn't necessarily mean
there is a problem in LibreOffice.

  > I've also checked the Gentoo app-office/libreoffice-7.0.4.2 package,
  > and it doesn't install any Relax-NG schemas. It only installs DTDs for
  > the older OpenOffice.org 1.x format. These are licensed under MPL-2.0.

It sounds like those are enough in practice.  That is a vital bit of
good news.  In what directory does it install them?  I'd like to see
which ones the Trisquel package contains.

What is the command I should use in dpkg to find out what files a
package contains?

  > Maybe it's time to contact OASIS Open and ask them if they would
  > consider relicensing the Relax-NG schemas.

I think we will do that, but let's not rush.  We just got mail from
someone who knows more than we do about Relax-NG schemas.  Let's see
what we can learn from per about how to deal with this.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 20:10                                                             ` Ulrich Mueller
  2021-01-25 20:21                                                               ` Eli Zaretskii
@ 2021-01-26  6:09                                                               ` Richard Stallman
  1 sibling, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-26  6:09 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov, eliz

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Of the files included with Emacs, maybe the the Unicode data files are
  > the ones that resemble the purpose of the schemas most closely. As they
  > are also part of a standard, modifying them (e.g., put "A" at a position
  > other than 0x41) wouldn't make much sense either.

  > Nevertheless, they are distributed under a license [1] that allows
  > "to deal in the Data Files or Software without restriction, including
  > without limitation the rights to use, copy, modify, merge, publish,
  > distribute, and/or sell copies".

This is something we could usefully cite if we approach OASIS to ask
to put these schemas under a free license.  It provides precedent.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-25 17:56                                                             ` Jean Louis
  2021-01-25 19:27                                                               ` Eli Zaretskii
@ 2021-01-26  6:09                                                               ` Richard Stallman
  1 sibling, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-26  6:09 UTC (permalink / raw)
  To: Jean Louis; +Cc: ulm, emacs-devel, ams, arthur.miller, dgutov, eliz

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Enriched mode doesn't have or use a schema, so this example is
  > > inapplicable.

  > But it has its format. Right?

It isn't useful to compare these schemas to Enriched mode in this
discussion, because this issue is not about a general idea.  It is
about how to treat a specific part of the implementation.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 18:21                                                         ` Dmitry Gutov
  2021-01-26  3:40                                                           ` Jean Louis
@ 2021-01-26  6:10                                                           ` Richard Stallman
  2021-01-26 13:42                                                             ` Stefan Monnier
  1 sibling, 1 reply; 139+ messages in thread
From: Richard Stallman @ 2021-01-26  6:10 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: ulm, ams, arthur.miller, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > We don't consider the bitmap files in the Emacs distribution to be software.

Indeed, pictures are not software.  But we treat pictures just like
software as regards our ethical criteria for licensing the material
in a GNU package.

  > And yet, they contain the "rules" to produce each individual picture on 
  > the screen.

That stretches the meaning of "rules", but we don't need to argue about it;
for the topic at hand, it makes no difference.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26  6:03                                                           ` Richard Stallman
@ 2021-01-26  9:24                                                             ` Ulrich Mueller
  2021-01-27  7:43                                                               ` Richard Stallman
  2021-01-26 15:43                                                             ` Jose A. Ortega Ruiz
  2021-01-26 16:48                                                             ` Kévin Le Gouguec
  2 siblings, 1 reply; 139+ messages in thread
From: Ulrich Mueller @ 2021-01-26  9:24 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

>>>>> On Tue, 26 Jan 2021, Richard Stallman wrote:

>> I've also checked the Gentoo app-office/libreoffice-7.0.4.2 package,
>> and it doesn't install any Relax-NG schemas. It only installs DTDs for
>> the older OpenOffice.org 1.x format. These are licensed under MPL-2.0.

> It sounds like those are enough in practice.  That is a vital bit of
> good news.  In what directory does it install them?  I'd like to see
> which ones the Trisquel package contains.

The Gentoo package installs the DTDs in
/usr/<libdir>/libreoffice/share/dtd/officedocument/1_0/
where <libdir> is lib or lib64 depending on the system.

> What is the command I should use in dpkg to find out what files a
> package contains?

No idea. I've checked the Ubuntu package list on the web though, and
the DTDs are in their libreoffice-common package, same path as above
(with libdir=lib).



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-26  5:59                                                       ` Richard Stallman
@ 2021-01-26 13:15                                                         ` Dmitry Gutov
  2021-01-27  7:41                                                           ` Richard Stallman
  0 siblings, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-26 13:15 UTC (permalink / raw)
  To: rms; +Cc: ulm, bugs, ams, arthur.miller, emacs-devel

On 26.01.2021 07:59, Richard Stallman wrote:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>    > > I think they are software, because they could be modified within an
>    > > infinite space of possibilities.
> 
>    > A picture can be modified within an infinite space of possibilities. A
>    > book can be modified. A mathematical equation can be modified.
> 
> That is true, but you've taken the question I raised for myself out of
> its context.  The real question is, "In the context, is there any
> doubt that this is a piece of software?  If not, what else could it
> be?
> 
> I think it is clear that a specification of a data structure, meant to
> guide a program's operation on that data, is software.  It is
> comparable to a bunch of struct and enum declarations which is how we
> use C header files to show the structure of other data.

I'm going to say that it's not a program, in the same way as images are 
not part of a program code. Unlike enums that have a role in writing the 
code and its compilation, and thus describe aspects of a program, 
schemas are structured documents which contain information pertaining to 
other documents.

There are different things a program can do with a schema: it can 
determine whether a certain document is valid, or it can output some 
sort of structure describing the elements that are missing in the 
document, or it could even try to generate a sample document based on 
that schema (though it would require a fair amount of supporting code). 
This list is almost certainly incomplete.

So a schema is not a program, nor a part of a particular program.

That said, if we always require that accompanying data (such as images) 
to be distributed under free licenses, the "software or not" question is 
probably moot.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25 17:59                                                       ` Jean Louis
                                                                           ` (2 preceding siblings ...)
  2021-01-25 19:38                                                         ` Eli Zaretskii
@ 2021-01-26 13:21                                                         ` Richard Stallman
  3 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-26 13:21 UTC (permalink / raw)
  To: Jean Louis; +Cc: ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Software is a collection of instructions and data that tell the
  > computer how to work.

  > If schema is data it is part of software together with instructions.

I made a mistake in raising the question of whether the schemas are
software, because in regard to whether the program is free, that
doesn't matter.  Data for the program to use in order to operate is
not software code, but it is part of the program so it needs to be
free.  For instance, images are not rules, not code, but we won't
include an image in a free program if it is not free.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-26  6:10                                                           ` Richard Stallman
@ 2021-01-26 13:42                                                             ` Stefan Monnier
  0 siblings, 0 replies; 139+ messages in thread
From: Stefan Monnier @ 2021-01-26 13:42 UTC (permalink / raw)
  To: Richard Stallman; +Cc: ulm, emacs-devel, ams, arthur.miller, Dmitry Gutov

>   > We don't consider the bitmap files in the Emacs distribution to be software.
> Indeed, pictures are not software.

I don't think that holds either: the formats for images are
domain-specific languages (DSL) in which to express how to build the
final image.  Most of those DSLs are too limited to be thought of as
programming languages (i.e. they're not Turing complete, tho there are
exceptions like PostScript), but if you think of the definition of
Kolmogorov complexity, it's clear that a PNG file is a "program" written
in a DSL.

So, what this points to is that it's futile to try and decide whether
something like that is software or not.


        Stefan




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26  6:03                                                           ` Richard Stallman
  2021-01-26  9:24                                                             ` Ulrich Mueller
@ 2021-01-26 15:43                                                             ` Jose A. Ortega Ruiz
  2021-01-26 16:48                                                             ` Kévin Le Gouguec
  2 siblings, 0 replies; 139+ messages in thread
From: Jose A. Ortega Ruiz @ 2021-01-26 15:43 UTC (permalink / raw)
  To: emacs-devel

On Tue, Jan 26 2021, Richard Stallman wrote:

> What is the command I should use in dpkg to find out what files a
> package contains?

dpkg -L <package-name>




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26  6:01                                                             ` Richard Stallman
@ 2021-01-26 15:57                                                               ` Eli Zaretskii
  2021-01-26 16:03                                                                 ` Dmitry Gutov
  0 siblings, 1 reply; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-26 15:57 UTC (permalink / raw)
  To: rms; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

> From: Richard Stallman <rms@gnu.org>
> Cc: ulm@gentoo.org, bugs@gnu.support, ulm@gentoo.org,
> 	emacs-devel@gnu.org, ams@gnu.org, arthur.miller@live.com,
> 	dgutov@yandex.ru
> Date: Tue, 26 Jan 2021 01:01:07 -0500
> 
>   > A schema can be similarly "generalized" (a.k.a. "extended") without
>   > changing it: you include the schema in your own and then add your own
>   > data types and conditions.
> 
> Can you please show me how sort of generalization is done?  It isn't
> allowed by editing the schema; the license of the schema does not give
> permission for such modifications.
>   
> Is there some other mechanism that can be used to do that job?  If so,
> could you please show me something about that mechanism, and what it
> can and can't do?

Basically you reference the original schema in yours, and then add
your extensions or overrides.

There are several methods available for that, but the simplest one is
to define new elements using the ones defined in the original schema.
Here's a simple example:

  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="USaddress">
   <xs:complexType>
    <xs:sequence>
     <xs:element name="street1" type="xs:string" minOccurs="0"/>
     <xs:element name="street2" type="xs:string" minOccurs="0"/>
     <xs:element name="city"    type="xs:string"/>
     <xs:element name="state"   type="xs:string"/>
     <xs:element name="zip"     type="xs:string" minOccurs="0"/>
    </xs:sequence>
   </xs:complexType>
  </xs:element>
  </xs:schema>

This defines an element "US Address" using xs:string type defined in
the W3C XMLSchema.  Then you can define a new element "Contact", on
top of that, by adding a name to an address:

  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <!-- Reference to External Module containing USaddress definition -->
   <xs:include schemaLocation="USaddress.xsd"/>
   <!-- Element containing USaddress element from included module -->
   <xs:complexType name="contact">
    <xs:sequence>
     <xs:element name="Name" type="xs:string"/>
     <xs:element ref="USaddress"/>
    </xs:sequence>
   </xs:complexType>
  </xs:schema>

You can also extend an existing type:

  <xs:complexType name="extendedNameType">
    <xs:extension base="nameType">
      <xs:sequence>
	<xs:element name="gen" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexType>

This extends the existing type "nameType" (presumably defined in some
schema you include as above) by adding to it the sub-element "gen".

There's also a facility to redefine existing data types.

Etc. etc.  This way, there's no reason to change the original schema,
you just extend it in your own schema, using the original one as the
baseline.

A few resources to read up on this:

  https://www.w3schools.com/xml/el_extension.asp
  https://www.ibm.com/developerworks/library/x-xtendschema/index.html
  https://stackoverflow.com/questions/3392402/how-do-i-extend-a-base-schema-with-custom-elements-while-remaining-open-to-chang



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26 15:57                                                               ` Eli Zaretskii
@ 2021-01-26 16:03                                                                 ` Dmitry Gutov
  2021-01-26 16:13                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-26 16:03 UTC (permalink / raw)
  To: Eli Zaretskii, rms; +Cc: arthur.miller, ulm, ams, bugs, emacs-devel

On 26.01.2021 17:57, Eli Zaretskii wrote:
> There are several methods available for that, but the simplest one is
> to define new elements using the ones defined in the original schema.

Wouldn't that make it a derivative work?



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26 16:03                                                                 ` Dmitry Gutov
@ 2021-01-26 16:13                                                                   ` Eli Zaretskii
  2021-01-26 16:14                                                                     ` Dmitry Gutov
  0 siblings, 1 reply; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-26 16:13 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: rms, bugs, ulm, emacs-devel, ams, arthur.miller

> From: Dmitry Gutov <dgutov@yandex.ru>
> Date: Tue, 26 Jan 2021 18:03:48 +0200
> Cc: arthur.miller@live.com, ulm@gentoo.org, ams@gnu.org, bugs@gnu.support,
>  emacs-devel@gnu.org
> 
> On 26.01.2021 17:57, Eli Zaretskii wrote:
> > There are several methods available for that, but the simplest one is
> > to define new elements using the ones defined in the original schema.
> 
> Wouldn't that make it a derivative work?

I don't know.  What if it does?



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26 16:13                                                                   ` Eli Zaretskii
@ 2021-01-26 16:14                                                                     ` Dmitry Gutov
  2021-01-26 16:31                                                                       ` Eli Zaretskii
  0 siblings, 1 reply; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-26 16:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, bugs, ulm, emacs-devel, ams, arthur.miller

On 26.01.2021 18:13, Eli Zaretskii wrote:
>>> There are several methods available for that, but the simplest one is
>>> to define new elements using the ones defined in the original schema.
>> Wouldn't that make it a derivative work?
> I don't know.  What if it does?

The original schema's license can impose restrictions on that.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26 16:14                                                                     ` Dmitry Gutov
@ 2021-01-26 16:31                                                                       ` Eli Zaretskii
  2021-01-26 22:55                                                                         ` Dmitry Gutov
  0 siblings, 1 reply; 139+ messages in thread
From: Eli Zaretskii @ 2021-01-26 16:31 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: rms, bugs, ulm, emacs-devel, ams, arthur.miller

> Cc: rms@gnu.org, arthur.miller@live.com, ulm@gentoo.org, ams@gnu.org,
>  bugs@gnu.support, emacs-devel@gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> Date: Tue, 26 Jan 2021 18:14:31 +0200
> 
> On 26.01.2021 18:13, Eli Zaretskii wrote:
> >>> There are several methods available for that, but the simplest one is
> >>> to define new elements using the ones defined in the original schema.
> >> Wouldn't that make it a derivative work?
> > I don't know.  What if it does?
> 
> The original schema's license can impose restrictions on that.

Does it, though?

And if it does, how useful is such a schema?




^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26  6:03                                                           ` Richard Stallman
  2021-01-26  9:24                                                             ` Ulrich Mueller
  2021-01-26 15:43                                                             ` Jose A. Ortega Ruiz
@ 2021-01-26 16:48                                                             ` Kévin Le Gouguec
  2 siblings, 0 replies; 139+ messages in thread
From: Kévin Le Gouguec @ 2021-01-26 16:48 UTC (permalink / raw)
  To: Richard Stallman
  Cc: bugs, Ulrich Mueller, emacs-devel, ams, arthur.miller, dgutov

Richard Stallman <rms@gnu.org> writes:

> What is the command I should use in dpkg to find out what files a
> package contains?

$ dpkg --listfiles $packagename         # or -L for short.

In the case of libreoffice, which is composed of many packages, that's
not enough to find the files you are after.

There might be a way to query dkpg for all packages matching a pattern;
if bash completions are enabled, one can also start typing "dpkg -L
libreoffice" then hit M-* to ask readline to insert all completions.

Piping this into "grep dtd" yields the answer Ulrich gave.

Another way to get this answer:

$ dpkg --search dtd | grep libreoffice

--search $pattern (or -S for short) lists all files from installed
packages which match $pattern, prepended with the name of the package.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26 16:31                                                                       ` Eli Zaretskii
@ 2021-01-26 22:55                                                                         ` Dmitry Gutov
  0 siblings, 0 replies; 139+ messages in thread
From: Dmitry Gutov @ 2021-01-26 22:55 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, bugs, ulm, emacs-devel, ams, arthur.miller

On 26.01.2021 18:31, Eli Zaretskii wrote:
>>>>> There are several methods available for that, but the simplest one is
>>>>> to define new elements using the ones defined in the original schema.
>>>> Wouldn't that make it a derivative work?
>>> I don't know.  What if it does?
>> The original schema's license can impose restrictions on that.
> Does it, though?

The OASIS schemas we're talking about have a license blurb that starts 
with "All right reserved", and then only mentiones permissions to do 
derivative works "that comment on or otherwise explain it or assist in 
its implementation", which doesn't seem to cover derivative schemas for, 
say, experimentation.

Of course, many cases could be covered by Fair Use, and even those that 
don't, the likelihood of being sued is vanishingly low, and the main 
goal of theirs seems to be to avoid being misrepresented by others (e.g. 
by removing the authorship or keeping it but changing the contents 
somehow maliciously), but as a matter of license, permission for 
arbitrary derivative works seems absent.

IANAL, consult your lawyer, etc.

> And if it does, how useful is such a schema?

Just as a way to describe a certain fixed format, I guess?

The wording of their rules seems pretty bureaucratic. It seems you need 
to join OASIS (or work in a company that is part of it) to safely 
contribute to any new version of the format. Which is disappointing.

Again, IANAL, and perhaps there are some better explanations in their 
policy somewhere on the website. I just could find them so far.



^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-24 20:46                                                       ` tomas
@ 2021-01-27  7:35                                                         ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-27  7:35 UTC (permalink / raw)
  To: tomas; +Cc: ulm, dgutov, ams, arthur.miller, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > (I have the impression that we might be interpreting to much into
  > the RelaxNG immutability. After all, things like RFCs are, in their
  > way immutable -- you can't change RFC8555 and keep calling it by
  > the same name.

GNU software usually follows standards, and occasionally departs from
them.  (See node Non-GNU Standards in the GNU Coding Standards.)  But
the standards a program follows are not part of the program itself.

You might think of using a standards document as part of the program's
documentation, but we never do that, precisely because standards
documents are typically immutable.  Documentation must be free
(see https://gnu.org/philosophy/free-doc.html).

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-25  6:52                                                     ` Jean Louis
  2021-01-25 12:11                                                       ` Fabrice BAUZAC-STEHLY
  2021-01-25 15:29                                                       ` Eli Zaretskii
@ 2021-01-27  7:37                                                       ` Richard Stallman
  2 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-27  7:37 UTC (permalink / raw)
  To: Jean Louis; +Cc: ulm, dgutov, ams, arthur.miller, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > In itself it does nothing. 

  > It is not just a configuration file or data like list of colors or
  > fonts. I think it is pattern that changes algorithm of software
  > and thus part of software.

It is now clear that you're right.

However, if we were to include a list of colors or fonts _in a GNU package_
we would insist that the list be free.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: [ELPA] New package: repology.el
  2021-01-26 13:15                                                         ` Dmitry Gutov
@ 2021-01-27  7:41                                                           ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-27  7:41 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: arthur.miller, ulm, ams, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > So a schema is not a program, nor a part of a particular program.

A schema can be part of many programs -- all the programs that use it.

  > That said, if we always require that accompanying data (such as images) 
  > to be distributed under free licenses, the "software or not" question is 
  > probably moot.

Our policies are not formulated using the concept of "accompanying".
Data to be used with the program also should be free.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

* Re: Org schemas we talked to be non-free, was: [ELPA] New package: repology.el
  2021-01-26  9:24                                                             ` Ulrich Mueller
@ 2021-01-27  7:43                                                               ` Richard Stallman
  0 siblings, 0 replies; 139+ messages in thread
From: Richard Stallman @ 2021-01-27  7:43 UTC (permalink / raw)
  To: Ulrich Mueller; +Cc: bugs, ulm, emacs-devel, ams, arthur.miller, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Thanks.  Now I see that Trisquel has installed the DTDs there,
and they are free.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 139+ messages in thread

end of thread, other threads:[~2021-01-27  7:43 UTC | newest]

Thread overview: 139+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-30 16:23 [ELPA] New package: repology.el Nicolas Goaziou
2020-12-30 19:34 ` Jean Louis
2020-12-30 21:01   ` Clément Pit-Claudel
2020-12-31 13:31     ` Jean Louis
2020-12-31 11:46   ` Nicolas Goaziou
2020-12-31 13:11     ` Jean Louis
2020-12-31 20:30       ` Ulrich Mueller
2021-01-01  7:31         ` Richard Stallman
2021-01-01 10:05         ` Jean Louis
2021-01-01 11:56           ` Eli Zaretskii
2021-01-02  9:56             ` Jean Louis
2021-01-02  5:30           ` Richard Stallman
2021-01-04 12:09             ` Dmitry Gutov
2021-01-04 14:39               ` Alfred M. Szmidt
2021-01-04 15:00                 ` Ulrich Mueller
2021-01-04 16:32                   ` Alfred M. Szmidt
2021-01-05  6:45                   ` Richard Stallman
2021-01-05  8:56                     ` Alfred M. Szmidt
2021-01-07  7:34                       ` Richard Stallman
2021-01-04 15:02                 ` Dmitry Gutov
2021-01-04 16:29                   ` Alfred M. Szmidt
2021-01-04 17:08                     ` Dmitry Gutov
2021-01-04 17:12                       ` Alfred M. Szmidt
2021-01-04 17:17                         ` Dmitry Gutov
2021-01-04 17:58                           ` Alfred M. Szmidt
2021-01-04 17:43                         ` Clément Pit-Claudel
2021-01-04 17:55                           ` Vasilij Schneidermann
2021-01-04 18:51                             ` Clément Pit-Claudel
2021-01-04 22:21                               ` Vasilij Schneidermann
2021-01-05  2:09                                 ` Stefan Monnier
2021-01-05  6:42                                   ` Richard Stallman
2021-01-05  9:28                                     ` Ulrich Mueller
2021-01-06  5:03                             ` Richard Stallman
2021-01-06  9:44                               ` Alfred M. Szmidt
2021-01-07 17:51                                 ` Richard Stallman
2021-01-04 19:14                           ` Ulrich Mueller
2021-01-04 19:17                             ` Clément Pit-Claudel
2021-01-06  5:02                       ` Richard Stallman
2021-01-06 10:58                         ` Dmitry Gutov
2021-01-06 14:41                         ` Jean Louis
2021-01-06 14:59                           ` Arthur Miller
2021-01-06 15:21                             ` Jean Louis
2021-01-06 16:23                               ` Arthur Miller
2021-01-06 18:53                                 ` Jean Louis
2021-01-06 19:26                                   ` Eli Zaretskii
2021-01-06 21:18                                     ` Alfred M. Szmidt
2021-01-06 21:25                                       ` Dmitry Gutov
2021-01-07  7:47                                         ` Richard Stallman
2021-01-07  8:54                                       ` Jean Louis
2021-01-07 14:07                                       ` Eli Zaretskii
2021-01-07  7:49                                     ` Richard Stallman
2021-01-07 11:41                                       ` Dmitry Gutov
2021-01-09  6:39                                         ` Richard Stallman
2021-01-09 10:50                                           ` Dmitry Gutov
2021-01-07 14:24                                       ` Eli Zaretskii
2021-01-07  8:15                                     ` Jean Louis
2021-01-07 14:37                                       ` Eli Zaretskii
2021-01-06 20:36                                   ` Arthur Miller
2021-01-07  7:48                                     ` Richard Stallman
2021-01-07 16:53                                       ` Arthur Miller
2021-01-14  5:21                                         ` Richard Stallman
2021-01-15 14:52                                           ` Arthur Miller
2021-01-16  5:14                                             ` Richard Stallman
2021-01-07  7:49                                   ` Richard Stallman
2021-01-07  9:00                                     ` Jean Louis
2021-01-08  6:21                                       ` Richard Stallman
2021-01-07 10:55                                     ` Ulrich Mueller
2021-01-09  6:34                                       ` Richard Stallman
2021-01-09 21:07                                         ` Ulrich Mueller
2021-01-11  4:46                                           ` Richard Stallman
2021-01-12  8:24                                             ` Ulrich Mueller
2021-01-20  6:14                                       ` Richard Stallman
2021-01-21 11:09                                         ` Ulrich Mueller
2021-01-22  6:06                                           ` Richard Stallman
2021-01-22  9:43                                             ` Ulrich Mueller
2021-01-24  6:35                                               ` Richard Stallman
2021-01-24  8:34                                                 ` Ulrich Mueller
2021-01-25  5:53                                                   ` Richard Stallman
2021-01-25  6:52                                                     ` Jean Louis
2021-01-25 12:11                                                       ` Fabrice BAUZAC-STEHLY
2021-01-25 15:29                                                       ` Eli Zaretskii
2021-01-27  7:37                                                       ` Richard Stallman
2021-01-25 15:51                                                     ` Dmitry Gutov
2021-01-25 17:59                                                       ` Jean Louis
2021-01-25 18:21                                                         ` Dmitry Gutov
2021-01-26  3:40                                                           ` Jean Louis
2021-01-26  6:10                                                           ` Richard Stallman
2021-01-26 13:42                                                             ` Stefan Monnier
2021-01-25 19:33                                                         ` Eli Zaretskii
2021-01-25 19:38                                                         ` Eli Zaretskii
2021-01-26 13:21                                                         ` Richard Stallman
2021-01-26  5:59                                                       ` Richard Stallman
2021-01-26 13:15                                                         ` Dmitry Gutov
2021-01-27  7:41                                                           ` Richard Stallman
2021-01-24 10:53                                                 ` Org schemas we talked to be non-free, was: " Jean Louis
2021-01-24 17:50                                                   ` Ulrich Mueller
2021-01-24 19:12                                                     ` Jean Louis
2021-01-24 19:53                                                       ` Eli Zaretskii
2021-01-24 20:36                                                         ` Ulrich Mueller
2021-01-25 15:06                                                           ` Eli Zaretskii
2021-01-26  6:01                                                             ` Richard Stallman
2021-01-26 15:57                                                               ` Eli Zaretskii
2021-01-26 16:03                                                                 ` Dmitry Gutov
2021-01-26 16:13                                                                   ` Eli Zaretskii
2021-01-26 16:14                                                                     ` Dmitry Gutov
2021-01-26 16:31                                                                       ` Eli Zaretskii
2021-01-26 22:55                                                                         ` Dmitry Gutov
2021-01-24 20:47                                                         ` Jean Louis
2021-01-25 15:13                                                           ` Eli Zaretskii
2021-01-25 17:50                                                             ` Jean Louis
2021-01-25 17:56                                                             ` Jean Louis
2021-01-25 19:27                                                               ` Eli Zaretskii
2021-01-26  3:50                                                                 ` Jean Louis
2021-01-26  6:09                                                               ` Richard Stallman
2021-01-25 20:10                                                             ` Ulrich Mueller
2021-01-25 20:21                                                               ` Eli Zaretskii
2021-01-26  6:09                                                               ` Richard Stallman
2021-01-25  5:53                                                         ` Richard Stallman
2021-01-25 15:27                                                           ` Eli Zaretskii
2021-01-24 20:46                                                       ` tomas
2021-01-27  7:35                                                         ` Richard Stallman
2021-01-25  5:53                                                       ` Richard Stallman
2021-01-25  9:27                                                         ` Ulrich Mueller
2021-01-26  6:03                                                           ` Richard Stallman
2021-01-26  9:24                                                             ` Ulrich Mueller
2021-01-27  7:43                                                               ` Richard Stallman
2021-01-26 15:43                                                             ` Jose A. Ortega Ruiz
2021-01-26 16:48                                                             ` Kévin Le Gouguec
2021-01-25  5:51                                                     ` Richard Stallman
2021-01-07 15:05                                     ` Stefan Monnier
2021-01-13 15:57                                       ` Richard Stallman
2021-01-05  6:33               ` Richard Stallman
2021-01-05 11:21                 ` Dmitry Gutov
2021-01-07  7:32                   ` Richard Stallman
2020-12-30 21:58 ` [ELPA] New package: repology.el (v2) Nicolas Goaziou
2021-01-04 11:45   ` [ELPA] New package: repology.el (v3) Nicolas Goaziou
2021-01-04 17:32     ` Stefan Monnier
2021-01-19  9:50       ` [ELPA] New package: repology.el (v4) Nicolas Goaziou
2021-01-20  6:13         ` Richard Stallman

unofficial mirror of emacs-devel@gnu.org 

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://yhetil.org/emacs-devel/0 emacs-devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 emacs-devel emacs-devel/ https://yhetil.org/emacs-devel \
		emacs-devel@gnu.org
	public-inbox-index emacs-devel

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.yhetil.org/yhetil.emacs.devel
	nntp://news.gmane.io/gmane.emacs.devel


AGPL code for this site: git clone http://ou63pmih66umazou.onion/public-inbox.git