mirror of
				https://github.com/kovidgoyal/calibre.git
				synced 2025-11-04 03:27:00 -05:00 
			
		
		
		
	Enhancement 1885943: Ignore articles when sorting custom columns. Implemented by a new formatter function, swap_around_articles(), that applies title_sort to each item in the list.
This commit is contained in:
		
							parent
							
								
									5b2baa7233
								
							
						
					
					
						commit
						7cd342f3a2
					
				@ -150,6 +150,7 @@ The functions available are listed below. Note that the definitive documentation
 | 
				
			|||||||
        {tags:sublist(-1,0,\,)} returns "C"
 | 
					        {tags:sublist(-1,0,\,)} returns "C"
 | 
				
			||||||
        {tags:sublist(0,-1,\,)} returns "A, B"
 | 
					        {tags:sublist(0,-1,\,)} returns "A, B"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    * ``swap_around_articles(separator)`` -- returns the val with articles moved to the end. The value can be a list, in which case each member of the list is processed. If the value is a list then you must provide the list value separator. If no separator is provided then the value is treated as being a single value, not a list.
 | 
				
			||||||
    * ``swap_around_comma()`` -- given a field with a value of the form ``B, A``, return ``A B``. This is most useful for converting names in LN, FN format to FN LN. If there is no comma, the function returns val unchanged.
 | 
					    * ``swap_around_comma()`` -- given a field with a value of the form ``B, A``, return ``A B``. This is most useful for converting names in LN, FN format to FN LN. If there is no comma, the function returns val unchanged.
 | 
				
			||||||
    * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want.
 | 
					    * ``switch(pattern, value, pattern, value, ..., else_value)`` -- for each ``pattern, value`` pair, checks if the field matches the regular expression ``pattern`` and if so, returns that ``value``. If no ``pattern`` matches, then ``else_value`` is returned. You can have as many ``pattern, value`` pairs as you want.
 | 
				
			||||||
    * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`.
 | 
					    * ``test(text if not empty, text if empty)`` -- return `text if not empty` if the field is not empty, otherwise return `text if empty`.
 | 
				
			||||||
 | 
				
			|||||||
@ -1659,6 +1659,32 @@ class BuiltinRatingToStars(BuiltinFormatterFunction):
 | 
				
			|||||||
        return rating_to_stars(v, use_half_stars == '1')
 | 
					        return rating_to_stars(v, use_half_stars == '1')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BuiltinSwapAroundArticles(BuiltinFormatterFunction):
 | 
				
			||||||
 | 
					    name = 'swap_around_articles'
 | 
				
			||||||
 | 
					    arg_count = 2
 | 
				
			||||||
 | 
					    category = 'String manipulation'
 | 
				
			||||||
 | 
					    __doc__ = doc = _('swap_around_articles(val, separator) '
 | 
				
			||||||
 | 
					                      '-- returns the val with articles moved to the end. '
 | 
				
			||||||
 | 
					                      'The value can be a list, in which case each member '
 | 
				
			||||||
 | 
					                      'of the list is processed. If the value is a list then '
 | 
				
			||||||
 | 
					                      'you must provide the list value separator. If no '
 | 
				
			||||||
 | 
					                      'separator is provided then the value is treated as '
 | 
				
			||||||
 | 
					                      'being a single value, not a list.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def evaluate(self, formatter, kwargs, mi, locals, val, separator):
 | 
				
			||||||
 | 
					        if not val:
 | 
				
			||||||
 | 
					            return ''
 | 
				
			||||||
 | 
					        if not separator:
 | 
				
			||||||
 | 
					            return title_sort(val).replace(',', ';')
 | 
				
			||||||
 | 
					        result = []
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            for v in [x.strip() for x in val.split(separator)]:
 | 
				
			||||||
 | 
					                result.append(title_sort(v).replace(',', ';'))
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            traceback.print_exc()
 | 
				
			||||||
 | 
					        return separator.join(sorted(result, key=sort_key))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_formatter_builtins = [
 | 
					_formatter_builtins = [
 | 
				
			||||||
    BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinAssign(),
 | 
					    BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(), BuiltinAssign(),
 | 
				
			||||||
    BuiltinAuthorLinks(), BuiltinAuthorSorts(), BuiltinBooksize(),
 | 
					    BuiltinAuthorLinks(), BuiltinAuthorSorts(), BuiltinBooksize(),
 | 
				
			||||||
@ -1678,8 +1704,9 @@ _formatter_builtins = [
 | 
				
			|||||||
    BuiltinRe(), BuiltinReGroup(), BuiltinSelect(), BuiltinSeriesSort(),
 | 
					    BuiltinRe(), BuiltinReGroup(), BuiltinSelect(), BuiltinSeriesSort(),
 | 
				
			||||||
    BuiltinShorten(), BuiltinStrcat(), BuiltinStrcatMax(),
 | 
					    BuiltinShorten(), BuiltinStrcat(), BuiltinStrcatMax(),
 | 
				
			||||||
    BuiltinStrcmp(), BuiltinStrInList(), BuiltinStrlen(), BuiltinSubitems(),
 | 
					    BuiltinStrcmp(), BuiltinStrInList(), BuiltinStrlen(), BuiltinSubitems(),
 | 
				
			||||||
    BuiltinSublist(),BuiltinSubstr(), BuiltinSubtract(), BuiltinSwapAroundComma(),
 | 
					    BuiltinSublist(),BuiltinSubstr(), BuiltinSubtract(), BuiltinSwapAroundArticles(),
 | 
				
			||||||
    BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(),
 | 
					    BuiltinSwapAroundComma(), BuiltinSwitch(),
 | 
				
			||||||
 | 
					    BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(),
 | 
				
			||||||
    BuiltinToday(), BuiltinTransliterate(), BuiltinUppercase(),
 | 
					    BuiltinToday(), BuiltinTransliterate(), BuiltinUppercase(),
 | 
				
			||||||
    BuiltinUserCategories(), BuiltinVirtualLibraries()
 | 
					    BuiltinUserCategories(), BuiltinVirtualLibraries()
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user