133 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/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
 |