File: update_potfile.py

package info (click to toggle)
siril 1.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 47,656 kB
  • sloc: ansic: 175,395; cpp: 28,654; python: 8,476; makefile: 974; xml: 879; sh: 280
file content (113 lines) | stat: -rw-r--r-- 4,315 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env python3
"""
Cross-platform script to update the POTFILES.in file for Siril.
"""

import os
import re
from pathlib import Path
import time

def search_translation_strings(src_dir, exclude_dirs):
    """Native Python implementation for searching translation strings _('...')"""
    matched_files = []
    total_files = 0
    
    print("Searching for files containing translation strings _('...')")
    start_time = time.time()
    
    # List of extensions to search
    extensions = ['.c', '.cpp']
    
    for ext in extensions:
        for filepath in Path(src_dir).glob(f'**/*{ext}'):
            total_files += 1
            path_str = str(filepath)
            
            # Check if path contains an excluded directory
            if any(exclude_dir in path_str for exclude_dir in exclude_dirs):
                continue
                
            # Check file content
            try:
                with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:
                    # Search for translation patterns (_("..."))
                    content = f.read()
                    # Regex that searches for _(" followed by ") with anything in between
                    # This regex supports multi-line and concatenated strings
                    pattern = r'_\s*\(\s*".*?"\s*\)'
                    if re.search(pattern, content, re.DOTALL):
                        rel_path = os.path.relpath(filepath).replace('\\', '/')
                        matched_files.append(rel_path)
            except Exception as e:
                print(f"Error reading {filepath}: {e}")
    
    elapsed_time = time.time() - start_time
    print(f"Search completed in {elapsed_time:.2f} seconds, {total_files} files analyzed")
    
    return matched_files

def main():
    # Configuration
    potfiles_path = 'po/POTFILES.in'
    src_dir = 'src'
    exclude_dirs = ['tests', 'build', 'lcms_acceleration', 'deconvolution', 'avi_pipp', 'registration/matching']
    
    print(f"Updating {potfiles_path}...")
    
    # Read current content of POTFILES.in
    with open(potfiles_path, 'r', encoding='utf-8') as f:
        current_content = f.read()
    
    # Extract header (comments and instructions)
    header_match = re.search(r'^(.*?# after adding files here\.).*', current_content, re.DOTALL | re.MULTILINE)
    if not header_match:
        print("Warning: Unrecognized header format in POTFILES.in")
        header = "# List of source files containing translatable strings.\n# Please keep this file in alphabetical order; run ./sort-potfiles\n# after adding files here."
    else:
        header = header_match.group(1)
    
    # Extract UI section
    ui_section_match = re.search(r'# the next lines of ui MUST always be here.*?\n[^\n]*\.ui(\n[^\n]*\.ui)*', current_content, re.DOTALL)
    if not ui_section_match:
        print("Warning: UI section not found")
        ui_section = "# the next lines of ui MUST always be here (it is not sorted)"
    else:
        ui_section = ui_section_match.group(0)
    
    print(f"UI section extracted: {ui_section.count('.ui')} UI files")
    
    try:
        # Use native Python method to search for translation strings
        matched_files = search_translation_strings(src_dir, exclude_dirs)
        
        # Sort files
        matched_files.sort()
        
        print(f"Found {len(matched_files)} source files with translation strings")
        
        # Display first few lines for verification
        if matched_files:
            print("\nFirst files found (5 first):")
            for f in matched_files[:5]:
                print(f"  - {f}")
            
            if len(matched_files) > 5:
                print(f"  ... and {len(matched_files) - 5} other files")
        
        # Create new file content
        new_content = f"{header}\n{ui_section}\n" + '\n'.join(matched_files)
        
        # Write new content to file
        with open(potfiles_path, 'w', encoding='utf-8') as f:
            f.write(new_content)
        
        print(f"\nFile {potfiles_path} updated successfully.")
        print(f"  - UI section: {ui_section.count('.ui')} files")
        print(f"  - Source section: {len(matched_files)} files")
    
    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    main()