Para onde vai a operação de cópia?
A página vê um método chamado clipboard.write. Sua implementação na pré-carga é um invólucro. A questão útil é o que esse wrapper envia e qual código o recebe.
Use REA para rastrear como Notion copia texto e HTML para a área de transferência do sistema. Mostre o código em cada etapa.
Um exemplo de prompt com o pacote de aplicativos locais do Notion disponível para o seu agente de codificação.
REA descobre por onde começar a ler
A análise da pré-carga da guia com REA localiza a API exposta à página e a chamada que envia uma solicitação IPC. Ambas as descobertas vêm com intervalos de origem no pacote reduzido:
REA constatações intesti dois lugares a abrir
api_key: "__electronApi"
api_status: "dynamic"
source: preload.js:1:22764–22828
operation: "invoke"
channel_expression: "e"
source: preload.js:1:6486–6522
analyze_javascript_application resultado da pré-carga de tabulação do Notion, registado com o REA 4.1.0. As posições usam a linha do pacote original e a coluna baseada em zero.
O agente abre esses locais, localiza o membro da área de transferência na API montada e lê invokerInMain. Seu local de chamada fornece notion:clipboard:write. Esse nome dá ao agente algo preciso para procurar no pacote principal. Os quatro trechos abaixo mostram a rota que liga.
Quatro pequenos pedaços de código
Simplificado a partir do pacote JavaScript, com nomes de variáveis legíveis. Os membros independentes são omitidos.
-
Comece na API exposta à página
tab_browser_view / preload.js * membro da APIconst clipboardApi = { write: invokerInMain("notion:clipboard:write") }; // Included in the API exposed through contextBridge: // window.__electronApi.clipboardEste membro fornece o nome do canal. A aplicação do
invokerInMaindiz-nos como o pedido sai do processo da página. -
Resolver o wrapper da pré-carga
tab_browser_view / preload.js * IPC helperfunction invokerInMain(channel) { return (...args) => invokeInMainAndReturnResult(channel, ...args); } function invokeInMainAndReturnResult(channel, ...args) { return ipcRenderer.invoke(channel, ...args); }A função devolvida encaminha os argumentos através do IPC de pedido e resposta do Electron. Podemos agora procurar
notion:clipboard:writedo lado do processo principal. -
Verificar como o recetor está registado
principal/index.js * handler helperconst handleRequestFromRenderer = { addListener(channel, handler) { ipcMain.handle(channel, handler); } };O processo principal utiliza outro invólucro. Sua
addListenero método regista umaipcMain.handlereceptor para esse canal. -
Encontre a gravação e a verificação do remetente
principal/index.js * receptor da área de transferênciahandleRequestFromRenderer.addListener( "notion:clipboard:write", (event, data) => isNotionWebContents(event.sender) ? clipboard.write(data) : undefined );Este é o destino. Depois de verificar o remetente, o manipulador passa os dados fornecidos para a API da área de transferência do Electron. O canal e os dois wrappers resolvidos conectam o método exposto a esta chamada.
Como é que um bloco copiado mantém a sua estrutura?
O editor web do Notion envia texto e HTML através de electronApi.clipboard.write. Ele mantém os dados do bloco localmente e coloca um ID no HTML copiado para conectá-los.
Links HTML para dados de bloco salvos
text: "Project notes"
html: "<p>Project notes</p>"
+ "<!-- notionvc: <copy-id> -->"
id: <copy-id>
mimeTypes:
text/_notion-blocks-v3-production
→ structured block data
- Leia o ID HTML
- Encontre o mesmo ID local
- Restaurar dados do bloco Notion
Ao colar, Notion procura o ID HTML e verifica-o em relação à cópia salva. Os IDs correspondentes restauram os dados do bloco.
Formato da área de transferência gravado a partir de ativos da web armazenados em cache em 13 de julho de 2026.
Mais exemplos e fontes
Outro exemplo: tabelas de remarcação
Notion analisa Markdown em dados de bloco. Este exemplo mostra como uma tabela se torna cabeçalho e linhas de dados.
Uma tabela através do analisador Markdown do Notion
| A | B |
| - | - |
| 1 | 2 |
table · headerRow: true
table_row
cells: ["A"], ["B"]
table_row
cells: ["1"], ["2"]
Outro caminho: a conexão SQLite offline
Pedidos do renderizador Notion getSqliteMeta através do IPC. O processo principal cria um canal de mensagem e fornece uma porta ao renderizador e a outra a um processo utilitário SQLite. Os lotes de declaração subsequentes e os resultados percorrem esse Porto.
Após esta transferência, explica onde o trabalho do banco de dados é executado e por que o rastreamento apenas da solicitação IPC inicial perde a conversa posterior.
Fontes e como ler os excertos
A Ponte da área de transferência vem do Notion Desktop 7.6.1 app.asar: a pré-carga do separador e main/index.js. Os excertos expandem nomes de variáveis minimizados e omitem código não relacionado; o auxiliar sender-check é mostrado com seu subjacente isNotionWebContents telefona.
Os exemplos de prancheta virtual e Markdown vêm de ativos da web armazenados em cache em 13 de julho de 2026, incluindo módulos 747001, 58169, 736810 e 422457. Esses activos têm a sua própria versão. As sondas salvas executaram módulos extraídos e pequenos chicotes de fios; suas saídas descrevem essas sondas em vez de uma sessão de interface do usuário da área de trabalho capturada.
O resultado REA mostrado aqui é uma análise focada da pré-carga de tabulação guardada, registada com o pacote REA 4.1.0 publicado. Ele localiza a API e invoca a operação. O membro da área de transferência e o receptor correspondente são conectados lendo suas implementações de wrapper no Pacote.
O exemplo Markdown usa o módulo parser 422457. Os testes de Módulo salvos mostram que os filtros de página e de bate-papo preservam essa tabela. Os analisadores paste/import, structured Markdown e AI/chat têm pontos de entrada separados e formatos intermédios.
- Guia de Aplicação JavaScriptSiga o recurso de exportação de um pequeno aplicativo Electron.
- Reconstrução DX-BallSiga as instruções nativas para uma função C verificada.