File size: 4,668 Bytes
5fac43c
 
 
 
a8d6f9c
 
5fac43c
1afcf85
a8d6f9c
1afcf85
 
a8d6f9c
1afcf85
 
 
 
 
5fac43c
 
a8d6f9c
 
1afcf85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5fac43c
 
 
 
a8d6f9c
 
5fac43c
 
 
1afcf85
5fac43c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a8d6f9c
 
5fac43c
 
 
 
 
 
 
 
 
a8d6f9c
5fac43c
 
 
 
 
 
 
 
 
 
 
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
114
115
116
117
import re
import streamlit as st
from bs4 import BeautifulSoup

def parse_variable_file(variable_content):
    """Parses the SCSS variable content and returns a mapping of color names to their values."""
    variables = {}
    # First pass: collect all variable definitions
    for line in variable_content.splitlines():
        # Match SCSS variables with more flexible pattern
        match = re.match(r'^\s*\$([\w-]+)\s*:\s*([^;]+)\s*(!default)?;?', line)
        if match:
            var_name = match.group(1)
            var_value = match.group(2).strip()
            variables[var_value] = f"${var_name}"
            # Also store the variable name itself for reference
            variables[f"${var_name}"] = f"${var_name}"
    return variables

def convert_css_to_scss(css_content, variable_mapping):
    """Converts CSS content to SCSS by replacing color values with variable names."""
    # Sort the color mappings by length (longest first) to avoid partial replacements
    sorted_mappings = sorted(variable_mapping.items(), key=lambda x: len(x[0]), reverse=True)
    
    # Process the content line by line
    converted_lines = []
    for line in css_content.splitlines():
        processed_line = line
        
        # Skip comments
        if '/*' in line and '*/' in line:
            comment_start = line.index('/*')
            comment_end = line.index('*/') + 2
            before_comment = line[:comment_start]
            comment = line[comment_start:comment_end]
            after_comment = line[comment_end:]
            
            # Process only the non-comment parts
            for value, variable in sorted_mappings:
                before_comment = before_comment.replace(value, variable)
                after_comment = after_comment.replace(value, variable)
            
            processed_line = before_comment + comment + after_comment
        else:
            # Process normal lines
            for value, variable in sorted_mappings:
                processed_line = processed_line.replace(value, variable)
        
        converted_lines.append(processed_line)
    
    return '\n'.join(converted_lines)

def extract_css_and_replace_with_variables(css_content, variables_content):
    """Replaces CSS properties with SCSS variables."""
    try:
        variable_mapping = parse_variable_file(variables_content)
        return convert_css_to_scss(css_content, variable_mapping)
    except Exception as e:
        st.error(f"Error processing CSS to SCSS: {e}")
        return None
        
def convert_html_to_twig(html_content):
    """Converts HTML to Twig format."""
    try:
        soup = BeautifulSoup(html_content, "html.parser")

        for tag in soup.find_all():
            # Replace text with Twig variables
            if tag.string and tag.string.strip():
                tag.string = f"{{{{ {tag.name}_content }}}}"  # Example: <h1>{{ h1_content }}</h1>

            # Replace attributes with Twig variables
            for attr, value in tag.attrs.items():
                tag[attr] = f"{{{{ {attr}_{tag.name} }}}}"  # Example: src="{{ src_img }}"

        # Add comments for Twig variables
        twig_comments = "\n".join(
            [
                f"<!-- `{{{{ {tag.name}_content }}}}`: Content for <{tag.name}> -->"
                for tag in soup.find_all() if tag.string
            ]
        )

        return f"{twig_comments}\n{soup.prettify()}"
    except Exception as e:
        st.error(f"Error converting HTML to Twig: {e}")
        return None

# File uploaders
html_file = st.file_uploader("Upload HTML File", type=["html"], key="html_file")
css_file = st.file_uploader("Upload CSS File (Optional)", type=["css"], key="css_file")
variables_file = st.file_uploader("Upload SCSS Variables File", type=["scss"], key="variables_file")

# Handle HTML to Twig conversion
if html_file:
    html_content = html_file.read().decode("utf-8")
    twig_content = convert_html_to_twig(html_content)

    if twig_content:
        st.subheader("Twig Output")
        st.code(twig_content, language="twig")

        st.download_button("Download Twig File", data=twig_content, file_name="output.twig", mime="text/plain")

# Handle CSS to SCSS conversion
if css_file and variables_file:
    css_content = css_file.read().decode("utf-8")
    variables_content = variables_file.read().decode("utf-8")

    scss_content = extract_css_and_replace_with_variables(css_content, variables_content)

    if scss_content:
        st.subheader("SCSS Output")
        st.code(scss_content, language="scss")

        st.download_button("Download SCSS File", data=scss_content, file_name="styles.scss", mime="text/plain")