Πού καταλήγει η λειτουργία αντιγραφής;
Η σελίδα βλέπει μια μέθοδο που ονομάζεται clipboard.write. Η υλοποίησή της στην προφόρτωση είναι ένα περίβλημα. Το χρήσιμο ερώτημα είναι τι στέλνει αυτό το περίβλημα και ποιος κώδικας το λαμβάνει.
Χρησιμοποιήστε το REA για να ακολουθήσετε πώς το Notion αντιγράφει κείμενο και HTML στο πρόχειρο του συστήματος. Δείξτε τον κώδικα σε κάθε βήμα.
Παράδειγμα προτροπής με το τοπικό πακέτο εφαρμογής του Notion διαθέσιμο στον βοηθό προγραμματισμού σας.
Το REA βρίσκει από πού να ξεκινήσετε την ανάγνωση
Η ανάλυση της προφόρτωσης καρτέλας με το REA εντοπίζει το API που εκτίθεται στη σελίδα και την κλήση που στέλνει ένα αίτημα IPC. Και τα δύο ευρήματα συνοδεύονται από περιοχές πηγαίου κώδικα στο ελαχιστοποιημένο πακέτο:
Ευρήματα REA → δύο σημεία για άνοιγμα
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 στην προφόρτωση καρτέλας του Notion, καταγεγραμμένο με REA 4.1.0. Οι θέσεις χρησιμοποιούν τη γραμμή του αρχικού πακέτου και τη στήλη με αρίθμηση από το μηδέν.
Ο βοηθός ανοίγει αυτές τις θέσεις, βρίσκει το μέλος του προχείρου στο συγκροτημένο API και διαβάζει την invokerInMain. Το σημείο κλήσης της παρέχει το notion:clipboard:write. Αυτό το όνομα δίνει στον βοηθό κάτι συγκεκριμένο να αναζητήσει στο κύριο πακέτο. Τα τέσσερα παρακάτω αποσπάσματα δείχνουν τη διαδρομή που συνδέει.
Τέσσερα σύντομα τμήματα κώδικα
Απλοποιημένα από τη συσκευασμένη JavaScript, με ευανάγνωστα ονόματα μεταβλητών. Τα άσχετα μέλη παραλείπονται.
-
Ξεκινήστε από το API που εκτίθεται στη σελίδα
tab_browser_view/preload.js · μέλος APIconst clipboardApi = { write: invokerInMain("notion:clipboard:write") }; // Included in the API exposed through contextBridge: // window.__electronApi.clipboardΑυτό το μέλος παρέχει το όνομα του καναλιού. Η υλοποίηση της
invokerInMainμας δείχνει πώς το αίτημα φεύγει από τη διεργασία της σελίδας. -
Εξετάστε το περίβλημα της προφόρτωσης
tab_browser_view/preload.js · βοηθητική συνάρτηση IPCfunction invokerInMain(channel) { return (...args) => invokeInMainAndReturnResult(channel, ...args); } function invokeInMainAndReturnResult(channel, ...args) { return ipcRenderer.invoke(channel, ...args); }Η επιστρεφόμενη συνάρτηση προωθεί τα ορίσματα μέσω του IPC αιτήματος και απόκρισης του Electron. Μπορούμε πλέον να αναζητήσουμε το
notion:clipboard:writeστην πλευρά της κύριας διεργασίας. -
Ελέγξτε πώς καταχωρίζεται ο παραλήπτης
main/index.js · βοηθητική συνάρτηση χειριστήconst handleRequestFromRenderer = { addListener(channel, handler) { ipcMain.handle(channel, handler); } };Η κύρια διεργασία χρησιμοποιεί άλλο ένα περίβλημα. Η μέθοδός του
addListenerκαταχωρίζει έναν παραλήπτηipcMain.handleγια αυτό το κανάλι. -
Βρείτε την εγγραφή και τον έλεγχο αποστολέα της
main/index.js · παραλήπτης προχείρουhandleRequestFromRenderer.addListener( "notion:clipboard:write", (event, data) => isNotionWebContents(event.sender) ? clipboard.write(data) : undefined );Αυτός είναι ο προορισμός. Αφού ελέγξει τον αποστολέα, ο χειριστής περνά τα παρεχόμενα δεδομένα στο API προχείρου του Electron. Το κανάλι και τα δύο περιβλήματα που εξετάστηκαν συνδέουν την εκτεθειμένη μέθοδο με αυτή την κλήση.
Πώς ένα αντιγραμμένο μπλοκ διατηρεί τη δομή του;
Ο επεξεργαστής ιστού του Notion στέλνει κείμενο και HTML μέσω της electronApi.clipboard.write. Κρατά τα δεδομένα του μπλοκ τοπικά και τοποθετεί ένα αναγνωριστικό στο αντιγραμμένο HTML για να τα συνδέσει.
Το HTML συνδέεται με αποθηκευμένα δεδομένα μπλοκ
text: "Project notes"
html: "<p>Project notes</p>"
+ "<!-- notionvc: <copy-id> -->"
id: <copy-id>
mimeTypes:
text/_notion-blocks-v3-production
→ structured block data
- Διαβάστε το αναγνωριστικό του HTML
- Βρείτε το ίδιο τοπικό αναγνωριστικό
- Επαναφέρετε τα δεδομένα μπλοκ του Notion
Κατά την επικόλληση, το Notion αναζητά το αναγνωριστικό του HTML και το συγκρίνει με το αποθηκευμένο αντίγραφο. Τα ίδια αναγνωριστικά επαναφέρουν τα δεδομένα του μπλοκ.
Μορφή προχείρου καταγεγραμμένη από πόρους ιστού που αποθηκεύτηκαν στην προσωρινή μνήμη στις 13 Ιουλίου 2026.
Περισσότερα παραδείγματα και πηγές
Άλλο παράδειγμα: πίνακες Markdown
Το Notion αναλύει το Markdown σε δεδομένα μπλοκ. Αυτό το παράδειγμα δείχνει πώς ένας πίνακας γίνεται γραμμές κεφαλίδων και δεδομένων.
Ένας πίνακας μέσα από τον αναλυτή Markdown του Notion
| A | B |
| - | - |
| 1 | 2 |
table · headerRow: true
table_row
cells: ["A"], ["B"]
table_row
cells: ["1"], ["2"]
Μια άλλη διαδρομή: η σύνδεση SQLite εκτός δικτύου
Η διεργασία απόδοσης του Notion ζητά την getSqliteMeta μέσω IPC. Η κύρια διεργασία δημιουργεί ένα κανάλι μηνυμάτων και δίνει το ένα άκρο στη διεργασία απόδοσης και το άλλο σε μια βοηθητική διεργασία SQLite. Οι επόμενες παρτίδες εντολών και τα αποτελέσματα μεταφέρονται μέσω αυτού του άκρου.
Η παρακολούθηση αυτής της παράδοσης εξηγεί πού εκτελείται η εργασία της βάσης δεδομένων και γιατί η ιχνηλάτηση μόνο του αρχικού αιτήματος IPC χάνει τη μεταγενέστερη επικοινωνία.
Πηγές και τρόπος ανάγνωσης των αποσπασμάτων
Η γέφυρα του προχείρου προέρχεται από το app.asar του Notion Desktop 7.6.1: την προφόρτωση καρτέλας και το main/index.js. Τα αποσπάσματα αναπτύσσουν τα ελαχιστοποιημένα ονόματα μεταβλητών και παραλείπουν άσχετο κώδικα· η βοηθητική συνάρτηση ελέγχου αποστολέα εμφανίζεται με την υποκείμενη κλήση της isNotionWebContents.
Τα παραδείγματα εικονικού προχείρου και Markdown προέρχονται από πόρους ιστού που αποθηκεύτηκαν στην προσωρινή μνήμη στις 13 Ιουλίου 2026, συμπεριλαμβανομένων των μονάδων 747001, 58169, 736810 και 422457. Αυτοί οι πόροι έχουν τη δική τους έκδοση. Οι αποθηκευμένοι διερευνητικοί έλεγχοι εκτέλεσαν εξαγόμενες μονάδες και μικρά προγράμματα δοκιμής· οι έξοδοί τους περιγράφουν αυτούς τους ελέγχους και όχι μια καταγεγραμμένη συνεδρία του γραφικού περιβάλλοντος της εφαρμογής υπολογιστή.
Το αποτέλεσμα REA που εμφανίζεται εδώ είναι μια εστιασμένη ανάλυση της αποθηκευμένης προφόρτωσης καρτέλας, καταγεγραμμένη με το δημοσιευμένο πακέτο REA 4.1.0. Εντοπίζει το API και τη λειτουργία κλήσης. Το μέλος του προχείρου και ο αντίστοιχος παραλήπτης συνδέονται διαβάζοντας τις υλοποιήσεις των περιβλημάτων τους στο πακέτο.
Το παράδειγμα Markdown χρησιμοποιεί τη μονάδα αναλυτή 422457. Οι αποθηκευμένες δοκιμές μονάδας δείχνουν ότι τόσο τα φίλτρα σελίδας όσο και τα φίλτρα συνομιλίας διατηρούν αυτόν τον πίνακα. Οι αναλυτές επικόλλησης/εισαγωγής, δομημένου Markdown και AI/συνομιλίας έχουν ξεχωριστά σημεία εισόδου και ενδιάμεσες μορφές.
- Οδηγός εφαρμογών JavaScriptΑκολουθήστε τη λειτουργία εξαγωγής μιας μικρής εφαρμογής Electron.
- Ανακατασκευή του DX-BallΑκολουθήστε εντολές κώδικα μηχανής μέχρι μια ελεγμένη συνάρτηση C.