mirror of
				https://github.com/ytdl-org/youtube-dl
				synced 2025-11-04 03:33:46 +00:00 
			
		
		
		
	Refactor JSInterpreter._separate
yt-dlp/yt-dlp/@06dfe0a, improve _MATCHING_PARENS
This commit is contained in:
		
							parent
							
								
									9d142109f4
								
							
						
					
					
						commit
						6ca7b77696
					
				@ -36,6 +36,8 @@ _ASSIGN_OPERATORS.append(('=', (lambda cur, right: right)))
 | 
			
		||||
 | 
			
		||||
_NAME_RE = r'[a-zA-Z_$][a-zA-Z_$0-9]*'
 | 
			
		||||
 | 
			
		||||
_MATCHING_PARENS = dict(zip(*zip('()', '{}', '[]')))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class JS_Break(ExtractorError):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
@ -100,26 +102,24 @@ class JSInterpreter(object):
 | 
			
		||||
    def _separate(expr, delim=',', max_split=None):
 | 
			
		||||
        if not expr:
 | 
			
		||||
            return
 | 
			
		||||
        parens = {'(': 0, '{': 0, '[': 0, ']': 0, '}': 0, ')': 0}
 | 
			
		||||
        start, splits, pos, max_pos = 0, 0, 0, len(delim) - 1
 | 
			
		||||
        counters = {k: 0 for k in _MATCHING_PARENS.values()}
 | 
			
		||||
        start, splits, pos, delim_len = 0, 0, 0, len(delim) - 1
 | 
			
		||||
        for idx, char in enumerate(expr):
 | 
			
		||||
            if char in parens:
 | 
			
		||||
                parens[char] += 1
 | 
			
		||||
            is_in_parens = (parens['['] - parens[']']
 | 
			
		||||
                            or parens['('] - parens[')']
 | 
			
		||||
                            or parens['{'] - parens['}'])
 | 
			
		||||
            if char == delim[pos] and not is_in_parens:
 | 
			
		||||
                if pos == max_pos:
 | 
			
		||||
            if char in _MATCHING_PARENS:
 | 
			
		||||
                counters[_MATCHING_PARENS[char]] += 1
 | 
			
		||||
            elif char in counters:
 | 
			
		||||
                counters[char] -= 1
 | 
			
		||||
            if char != delim[pos] or any(counters.values()):
 | 
			
		||||
                pos = 0
 | 
			
		||||
                    yield expr[start: idx - max_pos]
 | 
			
		||||
                    start = idx + 1
 | 
			
		||||
                continue
 | 
			
		||||
            elif pos != delim_len:
 | 
			
		||||
                pos += 1
 | 
			
		||||
                continue
 | 
			
		||||
            yield expr[start: idx - delim_len]
 | 
			
		||||
            start, pos = idx + 1, 0
 | 
			
		||||
            splits += 1
 | 
			
		||||
            if max_split and splits >= max_split:
 | 
			
		||||
                break
 | 
			
		||||
                else:
 | 
			
		||||
                    pos += 1
 | 
			
		||||
            else:
 | 
			
		||||
                pos = 0
 | 
			
		||||
        yield expr[start:]
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user