add best-effort sort option
This commit is contained in:
parent
0b159ebba7
commit
c26300d752
|
@ -32,6 +32,8 @@ import requests
|
||||||
NUMBER_REGEX = re.compile('[0-90-9]+')
|
NUMBER_REGEX = re.compile('[0-90-9]+')
|
||||||
ALPHABETIC_NUMBERING_REGEX = re.compile('^(?P<prefix>[^a-za-z0-90-9]*)((?P<letter>[a-za-z])(?P<suffix>[^a-za-z0-90-9]*))?$', re.I)
|
ALPHABETIC_NUMBERING_REGEX = re.compile('^(?P<prefix>[^a-za-z0-90-9]*)((?P<letter>[a-za-z])(?P<suffix>[^a-za-z0-90-9]*))?$', re.I)
|
||||||
|
|
||||||
|
STRING_TOKENIZE_REGEX = re.compile('(?P<str>[^0-90-9]+)|(?P<num>[0-90-9]+)')
|
||||||
|
|
||||||
EXTRA_NORMALIZATION_TABLE = str.maketrans({'\u301c': '\uff5e'})
|
EXTRA_NORMALIZATION_TABLE = str.maketrans({'\u301c': '\uff5e'})
|
||||||
|
|
||||||
DLSITE_ID_REGEX = re.compile('^[BR]J[0-9]+$')
|
DLSITE_ID_REGEX = re.compile('^[BR]J[0-9]+$')
|
||||||
|
@ -530,6 +532,10 @@ class Collator:
|
||||||
|
|
||||||
if all(src.is_file() and is_image(src) for src in srcs):
|
if all(src.is_file() and is_image(src) for src in srcs):
|
||||||
ordering = complete_prefix_number_ordering(srcs)
|
ordering = complete_prefix_number_ordering(srcs)
|
||||||
|
if not ordering and self.args.sort:
|
||||||
|
ordering = srcs.copy()
|
||||||
|
ordering.sort(key=best_effort_sort_key)
|
||||||
|
debug(f'Applying best-effort sort: {ordering}')
|
||||||
if ordering:
|
if ordering:
|
||||||
print(f'Symlinking image files: {ordering[0]}...')
|
print(f'Symlinking image files: {ordering[0]}...')
|
||||||
return self.link_ordered_files(ordering)
|
return self.link_ordered_files(ordering)
|
||||||
|
@ -812,6 +818,19 @@ def nname(entry):
|
||||||
def nstem(entry):
|
def nstem(entry):
|
||||||
return normalize_string(entry.stem)
|
return normalize_string(entry.stem)
|
||||||
|
|
||||||
|
def best_effort_sort_key(entry):
|
||||||
|
result = []
|
||||||
|
for token in STRING_TOKENIZE_REGEX.finditer(nstem(entry)):
|
||||||
|
if token.lastgroup == 'num':
|
||||||
|
if len(result) == 0:
|
||||||
|
result.append('') # to prevent failed int/string comparisons against other files
|
||||||
|
result.append(int(token.group()))
|
||||||
|
else:
|
||||||
|
result.append(token.group())
|
||||||
|
|
||||||
|
debug(f"Tokenized {entry} as {result}")
|
||||||
|
return result
|
||||||
|
|
||||||
def complete_prefix_number_ordering(entries):
|
def complete_prefix_number_ordering(entries):
|
||||||
if len(entries) == 1:
|
if len(entries) == 1:
|
||||||
return entries
|
return entries
|
||||||
|
@ -1460,6 +1479,11 @@ parser_collate.add_argument(
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help="only collate works that are explicitly specified",
|
help="only collate works that are explicitly specified",
|
||||||
)
|
)
|
||||||
|
parser_collate.add_argument(
|
||||||
|
'-s', '--sort',
|
||||||
|
action='store_true',
|
||||||
|
help="apply a best-effort sorting algorithm when the ordering of image files is unclear",
|
||||||
|
)
|
||||||
parser_collate.add_argument(
|
parser_collate.add_argument(
|
||||||
'-p', '--pdf-strategy',
|
'-p', '--pdf-strategy',
|
||||||
choices=[
|
choices=[
|
||||||
|
|
Loading…
Reference in a new issue