File size: 3,549 Bytes
5fac43c
 
 
 
 
 
 
 
 
a8d6f9c
 
5fac43c
a8d6f9c
 
 
 
 
5fac43c
 
a8d6f9c
 
5fac43c
 
a8d6f9c
5fac43c
 
 
 
 
a8d6f9c
 
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
import re
import streamlit as st
from bs4 import BeautifulSoup
from pathlib import Path

# Streamlit App
st.title("HTML to Twig and SCSS Converter")

# Functions to parse variables and convert CSS to SCSS
def parse_variable_file(variable_content):
    """Parses the SCSS variable content and returns a mapping of color names to their values."""
    variables = {}
    for line in variable_content.splitlines():
        # Match SCSS variables (e.g., `$white: #fff !default;`)
        match = re.match(r"^\s*\$([\w-]+):\s*(#[a-fA-F0-9]{3,6}|rgba?\(.+?\))", line)
        if match:
            variables[match.group(2)] = f"${match.group(1)}"  # Color value as key, variable name as value
    return variables

def convert_css_to_scss(css_content, variable_mapping):
    """Converts CSS content to SCSS by replacing color values with variable names."""
    for color, variable in variable_mapping.items():
        css_content = css_content.replace(color, variable)
    return css_content

# Functions to convert HTML to Twig and CSS to SCSS
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")