Web Markdown Editor

Result:

Video Url(Visit this use your phone and Wechat app):
https://weixin.qq.com/sph/ALA3U1jMR

Use Wechat to scan this QR code also can see the video:
image

My Code:

import streamlit as st
from streamlit_ace import st_ace
import time
import pyautogui

st.set_page_config(page_title="Markdown编辑器", layout="wide", page_icon="💡")
markdown_table = """
## Markdown 语法参考

| 语法类型 | 说明             | 示例                             |
|----------|------------------|----------------------------------|
| 标题     | 创建标题         | `# 一级标题` `## 二级标题`        |
| 强调     | 斜体、粗体、删除线 | `*斜体*` **粗体** `~~删除线~~`    |
| 列表     | 无序和有序列表   | `- 项目1` `1. 第一项`            |
| 链接     | 插入链接         | `[标题](https://example.com)`   |
| 图片     | 插入图片         | `![替代文本](image-url.jpg)`     |
| 引用     | 引用文本         | `> 引用内容`                     |
| 代码     | 显示代码         | ```python行内代码```  |
| 分隔线   | 插入分隔线       | `---`                            |
| 任务列表 | 创建任务列表     | `- [x] 完成任务` `- [ ] 待完成`   |
| HTML元素 | 使用HTML元素     | `<div>HTML元素</div>`            |
| 转义字符 | 转义Markdown字符 | `\*这不是斜体\*`                 |
| 换行 | 隔开上下内容 | `在要隔开的内容之间输入<br>`                |

<br>

## Markdown 表格语法示例

```markdown
| 表头1 | 表头2 | 表头3 |
|-------|:-----:|------:|
| 左对齐 | 居中对齐 | 右对齐 |
| 文本   | 文本   | 文本  |
"""
with st.sidebar:
    st.markdown(markdown_table, unsafe_allow_html=True)


# 创建两个并行的列
c1, c2, c3, c4, c5 = st.columns([0.5,2,0.5,2,0.5])

# 添加全局CSS来改变一级和二级标题的样式和代码块背景色
st.markdown(
    """
    <style>
    h1, h2 {
        background-image: linear-gradient(to right, #00ccff, #1aff1a, #ffffff);
        border-radius: 3px;
        color: white !important;
        padding: 5px;
    }
    pre {
        background-color: #E0FFF0 !important;
    }
    </style>
    """,
    unsafe_allow_html=True,
)

# 使用左侧列来获取用户输入的Markdown文本
with c1:
    st.empty()
with c2:
    st.header("Markdown输入")
    markdown_text = st_ace(
        language="markdown",
        value="",
        height=400,
        theme="monokai",
        show_gutter=True,
        key="markdown_editor",
    )

with c3:
    st.empty()

# 使用右侧列来显示Markdown文本的渲染效果
with c4:
    st.header("操作区域")
    # 用户提交内容后,显示滚动幅度输入框和复制按钮
    # 默认隐藏复制区域的相关控件
    copy_button = None
    scroll_value = None
    # 当用户提交内容后,显示滚动幅度输入框和复制按钮
    if markdown_text is not None:
        # 设置向下滚动的幅度,用户可以调整
        scroll_value = st.number_input('设置向下滚动的幅度(单位:行数)',
                                       min_value=1, value=10, step=1)
        copy_button = st.button('开始复制')

    # 如果已经设置了滚动值并且按下了复制按钮,执行复制操作
    if copy_button:
        # 执行复制区域的函数
        # 定义复制区域的函数
        # 矩形区域的两个顶点坐标
        first_point = (1012, 500)  # 左上角
        second_point = (1798, 500)  # 右上角
        def select_and_copy_area(scroll_amount):
            # 移动到第一个点并点击以确保焦点在正确的窗口
            pyautogui.click(first_point)
            # 按下鼠标左键准备拖动
            pyautogui.mouseDown()
            time.sleep(0.2)  # 短暂延迟确保按键被注册

            # 移动到第二个点,此处不改变y坐标
            pyautogui.moveTo(second_point[0], first_point[1])
            time.sleep(0.2)  # 短暂延迟以完成横向选择

            # 根据用户输入的滚动幅度计算滚动
            pyautogui.scroll(-scroll_amount * 100)  # 假设每行滚动100像素
            time.sleep(0.2)  # 短暂延迟以完成滚动

            # 松开鼠标左键完成选择
            pyautogui.mouseUp()
            time.sleep(0.2)  # 短暂延迟以完成选择操作

            # 执行 Ctrl+C 复制操作
            pyautogui.hotkey('ctrl', 'c')  # 对于 macOS 使用 'command', 'c'


        # 执行滚动并复制
        select_and_copy_area(scroll_value)
        st.toast("右侧区域复制成功!")

    st.markdown(markdown_text, unsafe_allow_html=True)

with c5:
    st.empty()