| #!/usr/bin/python3 -i |
| # |
| # Copyright (c) 2013-2019 The Khronos Group Inc. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # Base class for working-group-specific style conventions, |
| # used in generation. |
| |
| from abc import ABCMeta, abstractmethod |
| |
| ABC = ABCMeta('ABC', (object,), {}) |
| |
| class ConventionsBase(ABC): |
| """WG-specific conventions.""" |
| |
| @abstractmethod |
| def formatExtension(self, name): |
| """Mark up a name as an extension for the spec.""" |
| raise NotImplementedError |
| |
| @property |
| @abstractmethod |
| def null(self): |
| """Preferred spelling of NULL.""" |
| raise NotImplementedError |
| |
| def makeProseList(self, elements, connective='and'): |
| """Make a (comma-separated) list for use in prose. |
| |
| Adds a connective (by default, 'and') |
| before the last element if there are more than 1. |
| |
| Override with a different method or different call to |
| _implMakeProseList if you want to add a comma for two elements, |
| or not use a serial comma. |
| """ |
| return self._implMakeProseList(elements, connective) |
| |
| @property |
| def struct_macro(self): |
| """Get the appropriate format macro for a structure. |
| |
| May override. |
| """ |
| return 'sname:' |
| |
| def makeStructName(self, name): |
| """Prepend the appropriate format macro for a structure to a structure type name. |
| |
| Uses struct_macro, so just override that if you want to change behavior. |
| """ |
| return self.struct_macro + name |
| |
| @property |
| def external_macro(self): |
| """Get the appropriate format macro for an external type like uint32_t. |
| |
| May override. |
| """ |
| return 'basetype:' |
| |
| def makeExternalTypeName(self, name): |
| """Prepend the appropriate format macro for an external type like uint32_t to a type name. |
| |
| Uses external_macro, so just override that if you want to change behavior. |
| """ |
| return self.external_macro + name |
| |
| def _implMakeProseList(self, elements, connective, comma_for_two_elts=False, serial_comma=True): |
| """Internal-use implementation to make a (comma-separated) list for use in prose. |
| |
| Adds a connective (by default, 'and') |
| before the last element if there are more than 1, |
| and only includes commas if there are more than 2 |
| (if comma_for_two_elts is False). |
| |
| Don't edit these defaults, override self.makeProseList(). |
| """ |
| assert(serial_comma) # didn't implement what we didn't need |
| my_elts = list(elements) |
| if len(my_elts) > 1: |
| my_elts[-1] = '{} {}'.format(connective, my_elts[-1]) |
| |
| if not comma_for_two_elts and len(my_elts) <= 2: |
| return ' '.join(my_elts) |
| return ', '.join(my_elts) |
| |
| @property |
| @abstractmethod |
| def file_suffix(self): |
| """Return suffix of generated Asciidoctor files""" |
| raise NotImplementedError |
| |
| @abstractmethod |
| def api_name(self, spectype = None): |
| """Return API name""" |
| raise NotImplementedError |
| |
| @property |
| @abstractmethod |
| def api_prefix(self): |
| """Return API token prefix""" |
| raise NotImplementedError |
| |
| @property |
| @abstractmethod |
| def api_version_prefix(self): |
| """Return API core version token prefix""" |
| raise NotImplementedError |
| |
| @property |
| @abstractmethod |
| def KHR_prefix(self): |
| """Return extension name prefix for KHR extensions""" |
| raise NotImplementedError |
| |
| @property |
| @abstractmethod |
| def EXT_prefix(self): |
| """Return extension name prefix for EXT extensions""" |
| raise NotImplementedError |