Nghiên cứu trường hợp * Electron

Notion sao CHÉP như THẾ NÀO
văn bản VÀ HTML.

Theo dõi cuộc gọi clipboard TỪ API trang CỦA Notion, thông qua quá trình tải trước và quy trình chính, ĐẾN TRÌNH ghi clipboard CỦA Electron.

Notion Máy tính để bàn 7.6.1 * JavaScript * REA

Cây cầu BÊN TRONG GÓI máy TÍNH ĐỂ BÀN CỦA Notion

  1. 01 * Api Hướng Trang clipboard.write(data) Tải trước hiển thị một phương thức có thể gọi được.
  2. 02 * tải trước wrapper ipcRenderer.invoke Trình bao bọc gửi kênh và đối số.
  3. 03 · Xử lý quy Trình Chính ipcMain.handle Người nhận kiểm tra trang nào đã gửi nó.
  4. 04 * Hệ thống clipboard clipboard.write(data) Electron viết văn bản và HTML được cung cấp.

Một kênh nối hai bên: notion:clipboard:write

Mã đóng gói sử dụng cùng một kênh trong quá trình tải trước và chính. Giải quyết các trình bao bọc cho thấy CÁC cuộc gọi Electron đằng sau những tên đó.

Thao tác sao chép đi đâu?

Trang thấy một phương thức được gọi là clipboard.write. Việc triển khai nó trong tải trước là một trình bao bọc. Câu hỏi hữu ích là những gì trình bao bọc đó gửi và mã nào nhận được nó.

Agent mã hóa của bạn

SỬ DỤNG REA để theo dõi CÁCH Notion sao chép văn bản và HTML vào bảng tạm hệ thống. Hiển thị mã ở mỗi bước.

Một lời nhắc ví dụ VỚI GÓI ứng dụng CỤC BỘ CỦA Notion có sẵn cho agent mã hóa của bạn.

REA tìm nơi bắt đầu đọc

Phân tích tab tải trước VỚI REA định vị API tiếp xúc với trang và cuộc gọi gửi yêu cầu IPC. Cả hai phát hiện đều đi kèm với phạm vi nguồn trong gói thu nhỏ:

REA phát hiện → hai nơi để mở

Api trang tiếp xúc
api_key: "__electronApi"
api_status: "dynamic"
source: preload.js:1:22764–22828
Trình kết XUẤT CUỘC GỌI IPC
operation: "invoke"
channel_expression: "e"
source: preload.js:1:6486–6522
Các lĩnh vực được lựa chọn từ một tươi analyze_javascript_application kết quả TRÊN Notion 's tab tải trước, ghi LẠI VỚI REA 4.1.0. Các vị trí sử dụng dòng của gói ban đầu và cột không dựa trên.

Tác nhân mở các vị trí đó, tìm thành viên clipboard trong API được lắp ráp và đọc invokerInMain. Nguồn cung cấp trang web cuộc gọi của nó notion:clipboard:write. Tên đó cung cấp cho tác nhân một cái gì đó chính xác để tìm kiếm trong gói chính. Bốn đoạn trích dưới đây cho thấy tuyến đường mà nó kết nối.

Bốn đoạn mã ngắn

Đơn giản hóa TỪ JavaScript đóng gói , với tên biến có thể đọc được. Các thành viên không liên quan bị bỏ qua.

  1. Bắt đầu TẠI API tiếp xúc với trang

    tab_browser_view/preload.js * THÀNH VIÊN API
    const clipboardApi = {
      write: invokerInMain("notion:clipboard:write")
    };
    
    // Included in the API exposed through contextBridge:
    // window.__electronApi.clipboard

    Thành viên này cung cấp tên kênh. Việc thực hiện invokerInMain cho chúng tôi biết cách yêu cầu rời khỏi quy trình của trang.

  2. Giải quyết trình bao bọc tải trước

    tab_browser_view/preload.js * TRỢ GIÚP IPC
    function invokerInMain(channel) {
      return (...args) => invokeInMainAndReturnResult(channel, ...args);
    }
    
    function invokeInMainAndReturnResult(channel, ...args) {
      return ipcRenderer.invoke(channel, ...args);
    }

    Hàm trả về chuyển tiếp các đối số thông qua IPC YÊU cầu và phản hồi CỦA Electron. Bây giờ chúng ta có thể tìm kiếm notion:clipboard:write về phía chính-quá trình.

  3. Kiểm tra cách người nhận được đăng ký

    chính/index.js * trình trợ giúp xử lý
    const handleRequestFromRenderer = {
      addListener(channel, handler) {
        ipcMain.handle(channel, handler);
      }
    };

    Quá trình chính sử dụng một trình bao bọc khác. Của nó addListener phương pháp đăng ký một ipcMain.handle người nhận cho kênh đó.

  4. Tìm ghi và kiểm tra người gửi của nó

    chính/index.js * bộ thu clipboard
    handleRequestFromRenderer.addListener(
      "notion:clipboard:write",
      (event, data) =>
        isNotionWebContents(event.sender)
          ? clipboard.write(data)
          : undefined
    );

    Đây là điểm đến. Sau khi kiểm tra người gửi, trình xử lý chuyển dữ liệu được cung cấp cho API clipboard CỦA Electron. Kênh và hai trình bao bọc được giải quyết kết nối phương thức tiếp xúc với cuộc gọi này.

Làm thế nào để một khối được sao chép giữ cấu trúc của nó?

Notion ' s web editor gửi văn bản VÀ HTML thông qua electronApi.clipboard.write. Nó giữ dữ liệu khối cục bộ và ĐẶT ID vào HTML đã sao chép để kết nối chúng.

LIÊN KẾT HTML để lưu dữ liệu khối

Gửi đến clipboard hệ thống
text: "Project notes"
html: "<p>Project notes</p>"
    + "<!-- notionvc: <copy-id> -->"
Lưu cục BỘ BỞI Notion
id: <copy-id>
mimeTypes:
  text/_notion-blocks-v3-production
    → structured block data
  1. Đọc ID HTML
  2. Tìm CÙNG MỘT ID cục BỘ
  3. Khôi phục DỮ LIỆU KHỐI Notion
Văn BẢN minh họa VÀ ID. Kiểm tra mô-đun được ghi sẽ khôi phục dữ liệu khối khi id khớp; một mục cũ chỉ trả về văn bản và HTML.

Khi dán, Notion tìm ID HTML và kiểm tra NÓ với bản sao đã lưu. Id phù hợp khôi phục dữ liệu khối.

Định dạng Clipboard được ghi lại từ tài sản web được lưu trong bộ nhớ cache vào ngày 13 tháng 7 năm 2026.

Thêm ví dụ và nguồn

Một ví dụ khác: Bảng Markdown

Notion phân Tích Markdown thành dữ liệu khối. Ví dụ này cho thấy cách một bảng trở thành tiêu đề và các hàng dữ liệu.

Một bảng thông QUA TRÌNH phân tích Cú pháp Markdown CỦA Notion

Đầu vào đánh dấu
| A | B |
| - | - |
| 1 | 2 |
Đầu ra trình phân tích cú pháp có cấu trúc · đoạn trích
table · headerRow: true
  table_row
    cells: ["A"], ["B"]
  table_row
    cells: ["1"], ["2"]
Ghi lại đầu ra từ Một Trình phân tích Cú pháp Markdown trích xuất. Bảng trở thành hàng và ô.
Một đường dẫn khác: kết nối sqlite ngoại tuyến

YÊU CẦU trình kết xuất CỦA Notion getSqliteMeta THÔNG QUA IPC. Quá trình chính tạo kênh tin nhắn và cung cấp một cổng cho trình kết xuất và cổng kia cho quy trình tiện ích SQLite. Các lô tuyên bố tiếp theo và kết quả đi qua cổng đó.

Sau đó, handoff giải thích nơi công việc cơ sở dữ liệu chạy và tại sao chỉ truy tìm yêu cầu IPC ban đầu bỏ lỡ cuộc trò chuyện sau này.

Nguồn và cách đọc các đoạn trích

Cầu clipboard đến TỪ Notion Desktop 7.6.1 app.asar: tab tải trước và main/index.js. Các đoạn trích mở rộng tên biến được thu nhỏ và bỏ qua mã không liên quan; trình trợ giúp kiểm tra người gửi được hiển thị với phần bên dưới của nó isNotionWebContents gọi.

Các ví dụ về clipboard và Markdown ảo đến từ các tài sản web được lưu trong bộ nhớ cache vào ngày 13 tháng 7 năm 2026, bao gồm các mô-đun 747001, 58169, 736810 và 422457. Những tài sản đó có phiên bản riêng. Các đầu dò đã lưu thực thi các mô-đun được trích xuất và các dây nịt nhỏ; đầu ra của chúng mô tả các đầu dò đó thay vì một phiên GIAO diện người dùng máy tính để bàn bị bắt.

KẾT quả REA được hiển thị ở đây là phân tích tập trung của tab đã lưu tải trước, được ghi lại với gói REA 4.1.0 đã xuất bản. Nó định vị API và gọi hoạt động. Thành viên clipboard và bộ thu phù hợp được kết nối bằng cách đọc các triển khai trình bao bọc của chúng trong gói.

Ví Dụ Markdown sử dụng mô đun trình phân tích cú pháp 422457. Các bài kiểm tra mô-đun đã lưu cho thấy cả bộ lọc trang và trò chuyện đều giữ nguyên bảng này. Các trình phân tích cú pháp dán/nhập, Đánh dấu Có cấu trúc và ai/trò chuyện có các điểm nhập và định dạng trung gian riêng biệt.

Hàng đầu