jyb导航网文本编辑

# -*- coding: utf-8 -*-
from tkinter import *
from tkinter import messagebox
from tkinter.scrolledtext import ScrolledText
from bs4 import BeautifulSoup, NavigableString
import ctypes
import re


class HTMLProcessorApp:
    def __init__(self, master):
        self.master = master
        master.title("就业办导航网一键更改格式")
        master.geometry("1200x600")

        # 创建主框架
        main_frame = Frame(master)
        main_frame.pack(fill=BOTH, expand=1, padx=10, pady=10)

        # 输入部分
        self.input_label = Label(main_frame, text="输入HTML内容:")
        self.input_label.grid(row=0, column=0, sticky=W)

        self.input_text = ScrolledText(main_frame, wrap=WORD, font=('宋体', 12))
        self.input_text.grid(row=1, column=0, sticky="nsew", padx=(0, 10))

        # 处理按钮
        self.process_btn = Button(main_frame,
                                  text="处理 HTML →",
                                  command=self.process_html,
                                  height=3,
                                  bg="#4CAF50",
                                  fg="white")
        self.process_btn.grid(row=1, column=1, padx=10)

        # 输出部分
        output_header = Frame(main_frame)
        output_header.grid(row=0, column=2, sticky=EW)

        self.output_label = Label(output_header, text="处理结果:")
        self.output_label.pack(side=LEFT)

        # 复制按钮
        self.copy_btn = Button(output_header,
                               text="📋 复制结果",
                               command=self.copy_output,
                               bg="#2196F3",
                               fg="white")
        self.copy_btn.pack(side=RIGHT, padx=5)

        self.output_text = ScrolledText(main_frame,
                                        wrap=WORD,
                                        font=('宋体', 12))
        self.output_text.grid(row=1, column=2, sticky="nsew", padx=(10, 0))

        # 配置网格布局权重
        main_frame.grid_columnconfigure(0, weight=1)
        main_frame.grid_columnconfigure(2, weight=1)
        main_frame.grid_rowconfigure(1, weight=1)

    def process_html(self):
        """处理HTML并显示结果"""
        input_content = self.input_text.get("1.0", END)

        try:
            processed = process_html(input_content)
            self.output_text.delete("1.0", END)
            self.output_text.insert(END, processed)
        except Exception as e:
            self.output_text.delete("1.0", END)
            self.output_text.insert(END, f"处理出错:{str(e)}")

    def copy_output(self):
        """复制输出内容到剪贴板"""
        output_content = self.output_text.get("1.0", END).strip()
        if output_content:
            try:
                self.master.clipboard_clear()
                self.master.clipboard_append(output_content)
                messagebox.showinfo("操作成功", "内容已复制到剪贴板")
            except Exception as e:
                messagebox.showerror("复制失败", f"无法访问剪贴板:{str(e)}")
        else:
            messagebox.showwarning("内容为空", "输出区域没有可复制的内容")


def process_html(html):
    """HTML文档处理主函数"""
    soup = BeautifulSoup(html, 'html.parser')

    for p in soup.find_all('p'):
        base_style = "font-family: 宋体, SimSun; font-size: 18px;"
        if p.find('img'):
            base_style += " text-align: center;"
        p['style'] = base_style

        new_contents = []
        buffer = []
        prev_was_header = False

        for content in p.contents:
            if content.name == 'br':
                if buffer:
                    text = ''.join(buffer).strip()
                    if re.match(r'^[一二三四五六七八九十]、', text):
                        new_contents.append(soup.new_tag('br'))
                        strong = soup.new_tag('strong')
                        strong.string = f'    {text}'
                        new_contents.append(strong)
                        new_contents.append(soup.new_tag('br'))
                        prev_was_header = True
                    else:
                        if prev_was_header:
                            new_contents.append(soup.new_tag('br'))
                            prev_was_header = False
                        span = soup.new_tag('span')
                        span.string = f'    {text}'
                        new_contents.append(span)
                        new_contents.append(content)
                    buffer = []
                else:
                    new_contents.append(content)

            elif isinstance(content, NavigableString):
                cleaned = content.strip()
                if cleaned:
                    buffer.append(cleaned)

            else:
                if buffer:
                    span = soup.new_tag('span')
                    span.string = '    ' + ''.join(buffer)
                    new_contents.append(span)
                    buffer = []
                new_contents.append(content)

        if buffer:
            text = ''.join(buffer).strip()
            if re.match(r'^[一二三四五六七八九十]、', text):
                new_contents.append(soup.new_tag('br'))
                strong = soup.new_tag('strong')
                strong.string = f'    {text}'
                new_contents.append(strong)
                new_contents.append(soup.new_tag('br'))
            else:
                span = soup.new_tag('span')
                span.string = f'    {text}'
                new_contents.append(span)

        p.clear()
        for item in new_contents:
            if isinstance(item, str):
                p.append(NavigableString(item))
            else:
                p.append(item)

    for table in soup.find_all('table'):
        table['style'] = "font-family: 宋体, SimSun; font-size: 18px;"

    return str(soup)


if __name__ == "__main__":
    root = Tk()

    # 让窗口的字体没有锯齿
    # 调用api设置成由应用程序缩放
    ctypes.windll.shcore.SetProcessDpiAwareness(1)
    # 调用api获得当前的缩放因子
    ScaleFactor = ctypes.windll.shcore.GetScaleFactorForDevice(0)
    # 设置缩放因子
    root.tk.call('tk', 'scaling', ScaleFactor / 75)

    app = HTMLProcessorApp(root)
    root.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值