Source code
Revision control
Copy as Markdown
Other Tools
{"version":3,"file":"tiptap-95a40ba8.js","sources":["../../assets/longtext.html?raw","../../node_modules/orderedmap/dist/index.js","../../node_modules/prosemirror-model/dist/index.js","../../node_modules/prosemirror-transform/dist/index.js","../../node_modules/prosemirror-state/dist/index.js","../../node_modules/prosemirror-view/dist/index.js","../../node_modules/prosemirror-keymap/dist/index.js","../../node_modules/prosemirror-commands/dist/index.js","../../node_modules/prosemirror-schema-list/dist/index.js","../../node_modules/@tiptap/core/dist/index.js","../../node_modules/@tiptap/extension-blockquote/dist/index.js","../../node_modules/@tiptap/extension-bold/dist/index.js","../../node_modules/@tiptap/extension-bullet-list/dist/index.js","../../node_modules/@tiptap/extension-code/dist/index.js","../../node_modules/@tiptap/extension-code-block/dist/index.js","../../node_modules/@tiptap/extension-document/dist/index.js","../../node_modules/prosemirror-dropcursor/dist/index.js","../../node_modules/@tiptap/extension-dropcursor/dist/index.js","../../node_modules/prosemirror-gapcursor/dist/index.js","../../node_modules/@tiptap/extension-gapcursor/dist/index.js","../../node_modules/@tiptap/extension-hard-break/dist/index.js","../../node_modules/@tiptap/extension-heading/dist/index.js","../../node_modules/rope-sequence/dist/index.es.js","../../node_modules/prosemirror-history/dist/index.js","../../node_modules/@tiptap/extension-history/dist/index.js","../../node_modules/@tiptap/extension-horizontal-rule/dist/index.js","../../node_modules/@tiptap/extension-italic/dist/index.js","../../node_modules/@tiptap/extension-list-item/dist/index.js","../../node_modules/@tiptap/extension-ordered-list/dist/index.js","../../node_modules/@tiptap/extension-paragraph/dist/index.js","../../node_modules/@tiptap/extension-strike/dist/index.js","../../node_modules/@tiptap/extension-text/dist/index.js","../../node_modules/@tiptap/starter-kit/dist/index.js","../../tiptap.js","../../tiptap.html?html-proxy&index=0.js"],"sourcesContent":["export default \" <section class=\\\"pg-boilerplate pgheader\\\" id=\\\"pg-header\\\" lang=\\\"en\\\">\\r\\n <h2 id=\\\"pg-header-heading\\\">The Project Gutenberg eBook of <span lang=\\\"fr\\\">Du côté de chez Swann</span></h2>\\r\\n <div>\\r\\n This ebook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project\\r\\n Gutenberg License included with this ebook or online at <a class=\\\"reference external\\\" href=\\\"https://www.gutenberg.org\\\">www.gutenberg.org</a>. If you are not located in the United States, you’ll have to check the laws of the country\\r\\n where you are located before using this eBook.\\r\\n </div>\\r\\n\\r\\n <div class=\\\"container\\\" id=\\\"pg-machine-header\\\">\\r\\n <p><strong>Title</strong>: Du côté de chez Swann<br /></p>\\r\\n <div id=\\\"pg-header-authlist\\\">\\r\\n <p><strong>Author</strong>: Marcel Proust</p>\\r\\n </div>\\r\\n <p><strong>Release date</strong>: May 1, 2001 [eBook #2650]<br />Most recently updated: August 12, 2021</p>\\r\\n <p><strong>Language</strong>: French</p>\\r\\n </div>\\r\\n <div id=\\\"pg-start-separator\\\">\\r\\n <span>*** START OF THE PROJECT GUTENBERG EBOOK DU CÔTÉ DE CHEZ SWANN ***</span>\\r\\n </div>\\r\\n </section>\\r\\n <div style=\\\"margin-top: 2em; margin-bottom: 4em\\\"></div>\\r\\n <h2 class=\\\"no-break\\\">MARCEL PROUST</h2>\\r\\n <h2>A LA RECHERCHE DU TEMPS PERDU</h2>\\r\\n <h3>TOME I</h3>\\r\\n <h1>Du Côté de Chez Swann</h1>\\r\\n <p class=\\\"center\\\">À Monsieur Gaston Calmette</p>\\r\\n <p class=\\\"letter\\\">\\r\\n <i\\r\\n >Comme un témoignage de profonde<br />\\r\\n et affectueuse reconnaissance</i\\r\\n >,\\r\\n </p>\\r\\n <p class=\\\"letter\\\">Marcel Proust.</p>\\r\\n <div class=\\\"chapter\\\">\\r\\n <h2>\\r\\n PREMIÈRE PARTIE<br />\\r\\n COMBRAY\\r\\n </h2>\\r\\n <h3>I.</h3>\\r\\n <p>\\r\\n Longtemps, je me suis couché de bonne heure. Parfois, à peine ma bougie éteinte, mes yeux se fermaient si vite que je n’avais pas le temps de me dire: «Je m’endors.» Et, une demi-heure après, la pensée qu’il était temps de chercher le\\r\\n sommeil m’éveillait; je voulais poser le volume que je croyais avoir encore dans les mains et souffler ma lumière; je n’avais pas cessé en dormant de faire des réflexions sur ce que je venais de lire, mais ces réflexions avaient pris\\r\\n un tour un peu particulier; il me semblait que j’étais moi-même ce dont parlait l’ouvrage: une église, un quatuor, la rivalité de François I<sup>er</sup> et de Charles Quint. Cette croyance survivait pendant quelques secondes à mon\\r\\n réveil; elle ne choquait pas ma raison mais pesait comme des écailles sur mes yeux et les empêchait de se rendre compte que le bougeoir n’était plus allumé. Puis elle commençait à me devenir inintelligible, comme après la métempsycose\\r\\n les pensées d’une existence antérieure; le sujet du livre se détachait de moi, j’étais libre de m’y appliquer ou non; aussitôt je recouvrais la vue et j’étais bien étonné de trouver autour de moi une obscurité, douce et reposante pour\\r\\n mes yeux, mais peut-être plus encore pour mon esprit, à qui elle apparaissait comme une chose sans cause, incompréhensible, comme une chose vraiment obscure. Je me demandais quelle heure il pouvait être; j’entendais le sifflement des\\r\\n trains qui, plus ou moins éloigné, comme le chant d’un oiseau dans une forêt, relevant les distances, me décrivait l’étendue de la campagne déserte où le voyageur se hâte vers la station prochaine; et le petit chemin qu’il suit va\\r\\n être gravé dans son souvenir par l’excitation qu’il doit à des lieux nouveaux, à des actes inaccoutumés, à la causerie récente et aux adieux sous la lampe étrangère qui le suivent encore dans le silence de la nuit, à la douceur\\r\\n prochaine du retour.\\r\\n </p>\\r\\n <p>\\r\\n J’appuyais tendrement mes joues contre les belles joues de l’oreiller qui, pleines et fraîches, sont comme les joues de notre enfance. Je frottais une allumette pour regarder ma montre. Bientôt minuit. C’est l’instant où le malade,\\r\\n qui a été obligé de partir en voyage et a dû coucher dans un hôtel inconnu, réveillé par une crise, se réjouit en apercevant sous la porte une raie de jour. Quel bonheur, c’est déjà le matin! Dans un moment les domestiques seront\\r\\n levés, il pourra sonner, on viendra lui porter secours. L’espérance d’être soulagé lui donne du courage pour souffrir. Justement il a cru entendre des pas; les pas se rapprochent, puis s’éloignent. Et la raie de jour qui était sous sa\\r\\n porte a disparu. C’est minuit; on vient d’éteindre le gaz; le dernier domestique est parti et il faudra rester toute la nuit à souffrir sans remède.\\r\\n </p>\\r\\n <p>\\r\\n Je me rendormais, et parfois je n’avais plus que de courts réveils d’un instant, le temps d’entendre les craquements organiques des boiseries, d’ouvrir les yeux pour fixer le kaléidoscope de l’obscurité, de goûter grâce à une lueur\\r\\n momentanée de conscience le sommeil où étaient plongés les meubles, la chambre, le tout dont je n’étais qu’une petite partie et à l’insensibilité duquel je retournais vite m’unir. Ou bien en dormant j’avais rejoint sans effort un âge\\r\\n à jamais révolu de ma vie primitive, retrouvé telle de mes terreurs enfantines comme celle que mon grand-oncle me tirât par mes boucles et qu’avait dissipée le jour,—date pour moi d’une ère nouvelle,—où on les avait coupées. J’avais\\r\\n oublié cet événement pendant mon sommeil, j’en retrouvais le souvenir aussitôt que j’avais réussi à m’éveiller pour échapper aux mains de mon grand-oncle, mais par mesure de précaution j’entourais complètement ma tête de mon oreiller\\r\\n avant de retourner dans le monde des rêves.\\r\\n </p>\\r\\n <p>\\r\\n Quelquefois, comme Ève naquit d’une côte d’Adam, une femme naissait pendant mon sommeil d’une fausse position de ma cuisse. Formée du plaisir que j’étais sur le point de goûter, je m’imaginais que c’était elle qui me l’offrait. Mon\\r\\n corps qui sentait dans le sien ma propre chaleur voulait s’y rejoindre, je m’éveillais. Le reste des humains m’apparaissait comme bien lointain auprès de cette femme que j’avais quittée il y avait quelques moments à peine; ma joue\\r\\n était chaude encore de son baiser, mon corps courbaturé par le poids de sa taille. Si, comme il arrivait quelquefois, elle avait les traits d’une femme que j’avais connue dans la vie, j’allais me donner tout entier à ce but: la\\r\\n retrouver, comme ceux qui partent en voyage pour voir de leurs yeux une cité désirée et s’imaginent qu’on peut goûter dans une réalité le charme du songe. Peu à peu son souvenir s’évanouissait, j’avais oublié la fille de mon rêve.\\r\\n </p>\\r\\n <p>\\r\\n Un homme qui dort, tient en cercle autour de lui le fil des heures, l’ordre des années et des mondes. Il les consulte d’instinct en s’éveillant et y lit en une seconde le point de la terre qu’il occupe, le temps qui s’est écoulé\\r\\n jusqu’à son réveil; mais leurs rangs peuvent se mêler, se rompre. Que vers le matin après quelque insomnie, le sommeil le prenne en train de lire, dans une posture trop différente de celle où il dort habituellement, il suffit de son\\r\\n bras soulevé pour arrêter et faire reculer le soleil, et à la première minute de son réveil, il ne saura plus l’heure, il estimera qu’il vient à peine de se coucher. Que s’il s’assoupit dans une position encore plus déplacée et\\r\\n divergente, par exemple après dîner assis dans un fauteuil, alors le bouleversement sera complet dans les mondes désorbités, le fauteuil magique le fera voyager à toute vitesse dans le temps et dans l’espace, et au moment d’ouvrir les\\r\\n paupières, il se croira couché quelques mois plus tôt dans une autre contrée. Mais il suffisait que, dans mon lit même, mon sommeil fût profond et détendît entièrement mon esprit; alors celui-ci lâchait le plan du lieu où je m’étais\\r\\n endormi, et quand je m’éveillais au milieu de la nuit, comme j’ignorais où je me trouvais, je ne savais même pas au premier instant qui j’étais; j’avais seulement dans sa simplicité première, le sentiment de l’existence comme il peut\\r\\n frémir au fond d’un animal: j’étais plus dénué que l’homme des cavernes; mais alors le souvenir—non encore du lieu où j’étais, mais de quelques-uns de ceux que j’avais habités et où j’aurais pu être—venait à moi comme un secours d’en\\r\\n haut pour me tirer du néant d’où je n’aurais pu sortir tout seul; je passais en une seconde par-dessus des siècles de civilisation, et l’image confusément entrevue de lampes à pétrole, puis de chemises à col rabattu, recomposaient peu\\r\\n à peu les traits originaux de mon moi.\\r\\n </p>\\r\\n <p>\\r\\n Peut-être l’immobilité des choses autour de nous leur est-elle imposée par notre certitude que ce sont elles et non pas d’autres, par l’immobilité de notre pensée en face d’elles. Toujours est-il que, quand je me réveillais ainsi, mon\\r\\n esprit s’agitant pour chercher, sans y réussir, à savoir où j’étais, tout tournait autour de moi dans l’obscurité, les choses, les pays, les années. Mon corps, trop engourdi pour remuer, cherchait, d’après la forme de sa fatigue, à\\r\\n repérer la position de ses membres pour en induire la direction du mur, la place des meubles, pour reconstruire et pour nommer la demeure où il se trouvait. Sa mémoire, la mémoire de ses côtes, de ses genoux, de ses épaules, lui\\r\\n présentait successivement plusieurs des chambres où il avait dormi, tandis qu’autour de lui les murs invisibles, changeant de place selon la forme de la pièce imaginée, tourbillonnaient dans les ténèbres. Et avant même que ma pensée,\\r\\n qui hésitait au seuil des temps et des formes, eût identifié le logis en rapprochant les circonstances, lui,—mon corps,—se rappelait pour chacun le genre du lit, la place des portes, la prise de jour des fenêtres, l’existence d’un\\r\\n couloir, avec la pensée que j’avais en m’y endormant et que je retrouvais au réveil. Mon côté ankylosé, cherchant à deviner son orientation, s’imaginait, par exemple, allongé face au mur dans un grand lit à baldaquin et aussitôt je me\\r\\n disais: «Tiens, j’ai fini par m’endormir quoique maman ne soit pas venue me dire bonsoir», j’étais à la campagne chez mon grand-père, mort depuis bien des années; et mon corps, le côté sur lequel je reposais, gardiens fidèles d’un\\r\\n passé que mon esprit n’aurait jamais dû oublier, me rappelaient la flamme de la veilleuse de verre de Bohême, en forme d’urne, suspendue au plafond par des chaînettes, la cheminée en marbre de Sienne, dans ma chambre à coucher de\\r\\n Combray, chez mes grands-parents, en des jours lointains qu’en ce moment je me figurais actuels sans me les représenter exactement et que je reverrais mieux tout à l’heure quand je serais tout à fait éveillé.\\r\\n </p>\\r\\n <p>\\r\\n Puis renaissait le souvenir d’une nouvelle attitude; le mur filait dans une autre direction: j’étais dans ma chambre chez M<sup>me</sup> de Saint-Loup, à la campagne; mon Dieu! Il est au moins dix heures, on doit avoir fini de dîner!\\r\\n J’aurai trop prolongé la sieste que je fais tous les soirs en rentrant de ma promenade avec M<sup>me</sup> de Saint-Loup, avant d’endosser mon habit. Car bien des années ont passé depuis Combray, où, dans nos retours les plus tardifs,\\r\\n c’était les reflets rouges du couchant que je voyais sur le vitrage de ma fenêtre. C’est un autre genre de vie qu’on mène à Tansonville, chez M<sup>me</sup> de Saint-Loup, un autre genre de plaisir que je trouve à ne sortir qu’à la\\r\\n nuit, à suivre au clair de lune ces chemins où je jouais jadis au soleil; et la chambre où je me serai endormi au lieu de m’habiller pour le dîner, de loin je l’aperçois, quand nous rentrons, traversée par les feux de la lampe, seul\\r\\n phare dans la nuit.\\r\\n </p>\\r\\n <p>\\r\\n Ces évocations tournoyantes et confuses ne duraient jamais que quelques secondes; souvent, ma brève incertitude du lieu où je me trouvais ne distinguait pas mieux les unes des autres les diverses suppositions dont elle était faite,\\r\\n que nous n’isolons, en voyant un cheval courir, les positions successives que nous montre le kinétoscope. Mais j’avais revu tantôt l’une, tantôt l’autre, des chambres que j’avais habitées dans ma vie, et je finissais par me les\\r\\n rappeler toutes dans les longues rêveries qui suivaient mon réveil; chambres d’hiver où quand on est couché, on se blottit la tête dans un nid qu’on se tresse avec les choses les plus disparates: un coin de l’oreiller, le haut des\\r\\n couvertures, un bout de châle, le bord du lit, et un numéro des Débats roses, qu’on finit par cimenter ensemble selon la technique des oiseaux en s’y appuyant indéfiniment; où, par un temps glacial le plaisir qu’on goûte est de se\\r\\n sentir séparé du dehors (comme l’hirondelle de mer qui a son nid au fond d’un souterrain dans la chaleur de la terre), et où, le feu étant entretenu toute la nuit dans la cheminée, on dort dans un grand manteau d’air chaud et fumeux,\\r\\n traversé des lueurs des tisons qui se rallument, sorte d’impalpable alcôve, de chaude caverne creusée au sein de la chambre même, zone ardente et mobile en ses contours thermiques, aérée de souffles qui nous rafraîchissent la figure\\r\\n et viennent des angles, des parties voisines de la fenêtre ou éloignées du foyer et qui se sont refroidies;—chambres d’été où l’on aime être uni à la nuit tiède, où le clair de lune appuyé aux volets entr’ouverts, jette jusqu’au pied\\r\\n du lit son échelle enchantée, où on dort presque en plein air, comme la mésange balancée par la brise à la pointe d’un rayon—; parfois la chambre Louis XVI, si gaie que même le premier soir je n’y avais pas été trop malheureux et où\\r\\n les colonnettes qui soutenaient légèrement le plafond s’écartaient avec tant de grâce pour montrer et réserver la place du lit; parfois au contraire celle, petite et si élevée de plafond, creusée en forme de pyramide dans la hauteur\\r\\n de deux étages et partiellement revêtue d’acajou, où dès la première seconde j’avais été intoxiqué moralement par l’odeur inconnue du vétiver, convaincu de l’hostilité des rideaux violets et de l’insolente indifférence de la pendule\\r\\n qui jacassait tout haut comme si je n’eusse pas été là;—où une étrange et impitoyable glace à pieds quadrangulaires, barrant obliquement un des angles de la pièce, se creusait à vif dans la douce plénitude de mon champ visuel\\r\\n accoutumé un emplacement qui n’y était pas prévu;—où ma pensée, s’efforçant pendant des heures de se disloquer, de s’étirer en hauteur pour prendre exactement la forme de la chambre et arriver à remplir jusqu’en haut son gigantesque\\r\\n entonnoir, avait souffert bien de dures nuits, tandis que j’étais étendu dans mon lit, les yeux levés, l’oreille anxieuse, la narine rétive, le cœur battant: jusqu’à ce que l’habitude eût changé la couleur des rideaux, fait taire la\\r\\n pendule, enseigné la pitié à la glace oblique et cruelle, dissimulé, sinon chassé complètement, l’odeur du vétiver et notablement diminué la hauteur apparente du plafond. L’habitude! aménageuse habile mais bien lente et qui commence\\r\\n par laisser souffrir notre esprit pendant des semaines dans une installation provisoire; mais que malgré tout il est bien heureux de trouver, car sans l’habitude et réduit à ses seuls moyens il serait impuissant à nous rendre un logis\\r\\n habitable.\\r\\n </p>\\r\\n <p>\\r\\n Certes, j’étais bien éveillé maintenant, mon corps avait viré une dernière fois et le bon ange de la certitude avait tout arrêté autour de moi, m’avait couché sous mes couvertures, dans ma chambre, et avait mis approximativement à\\r\\n leur place dans l’obscurité ma commode, mon bureau, ma cheminée, la fenêtre sur la rue et les deux portes. Mais j’avais beau savoir que je n’étais pas dans les demeures dont l’ignorance du réveil m’avait en un instant sinon présenté\\r\\n l’image distincte, du moins fait croire la présence possible, le branle était donné à ma mémoire; généralement je ne cherchais pas à me rendormir tout de suite; je passais la plus grande partie de la nuit à me rappeler notre vie\\r\\n d’autrefois, à Combray chez ma grand’tante, à Balbec, à Paris, à Doncières, à Venise, ailleurs encore, à me rappeler les lieux, les personnes que j’y avais connues, ce que j’avais vu d’elles, ce qu’on m’en avait raconté.\\r\\n </p>\\r\\n <p>\\r\\n A Combray, tous les jours dès la fin de l’après-midi, longtemps avant le moment où il faudrait me mettre au lit et rester, sans dormir, loin de ma mère et de ma grand’mère, ma chambre à coucher redevenait le point fixe et douloureux\\r\\n de mes préoccupations. On avait bien inventé, pour me distraire les soirs où on me trouvait l’air trop malheureux, de me donner une lanterne magique, dont, en attendant l’heure du dîner, on coiffait ma lampe; et, à l’instar des\\r\\n premiers architectes et maîtres verriers de l’âge gothique, elle substituait à l’opacité des murs d’impalpables irisations, de surnaturelles apparitions multicolores, où des légendes étaient dépeintes comme dans un vitrail vacillant\\r\\n et momentané. Mais ma tristesse n’en était qu’accrue, parce que rien que le changement d’éclairage détruisait l’habitude que j’avais de ma chambre et grâce à quoi, sauf le supplice du coucher, elle m’était devenue supportable.\\r\\n Maintenant je ne la reconnaissais plus et j’y étais inquiet, comme dans une chambre d’hôtel ou de «chalet», où je fusse arrivé pour la première fois en descendant de chemin de fer.\\r\\n </p>\\r\\n <p>\\r\\n Au pas saccadé de son cheval, Golo, plein d’un affreux dessein, sortait de la petite forêt triangulaire qui veloutait d’un vert sombre la pente d’une colline, et s’avançait en tressautant vers le château de la pauvre Geneviève de\\r\\n Brabant. Ce château était coupé selon une ligne courbe qui n’était autre que la limite d’un des ovales de verre ménagés dans le châssis qu’on glissait entre les coulisses de la lanterne. Ce n’était qu’un pan de château et il avait\\r\\n devant lui une lande où rêvait Geneviève qui portait une ceinture bleue. Le château et la lande étaient jaunes et je n’avais pas attendu de les voir pour connaître leur couleur car, avant les verres du châssis, la sonorité mordorée du\\r\\n nom de Brabant me l’avait montrée avec évidence. Golo s’arrêtait un instant pour écouter avec tristesse le boniment lu à haute voix par ma grand’tante et qu’il avait l’air de comprendre parfaitement, conformant son attitude avec une\\r\\n docilité qui n’excluait pas une certaine majesté, aux indications du texte; puis il s’éloignait du même pas saccadé. Et rien ne pouvait arrêter sa lente chevauchée. Si on bougeait la lanterne, je distinguais le cheval de Golo qui\\r\\n continuait à s’avancer sur les rideaux de la fenêtre, se bombant de leurs plis, descendant dans leurs fentes. Le corps de Golo lui-même, d’une essence aussi surnaturelle que celui de sa monture, s’arrangeait de tout obstacle matériel,\\r\\n de tout objet gênant qu’il rencontrait en le prenant comme ossature et en se le rendant intérieur, fût-ce le bouton de la porte sur lequel s’adaptait aussitôt et surnageait invinciblement sa robe rouge ou sa figure pâle toujours aussi\\r\\n noble et aussi mélancolique, mais qui ne laissait paraître aucun trouble de cette transvertébration.\\r\\n </p>\\r\\n <p>\\r\\n Certes je leur trouvais du charme à ces brillantes projections qui semblaient émaner d’un passé mérovingien et promenaient autour de moi des reflets d’histoire si anciens. Mais je ne peux dire quel malaise me causait pourtant cette\\r\\n intrusion du mystère et de la beauté dans une chambre que j’avais fini par remplir de mon moi au point de ne pas faire plus attention à elle qu’à lui-même. L’influence anesthésiante de l’habitude ayant cessé, je me mettais à penser, à\\r\\n sentir, choses si tristes. Ce bouton de la porte de ma chambre, qui différait pour moi de tous les autres boutons de porte du monde en ceci qu’il semblait ouvrir tout seul, sans que j’eusse besoin de le tourner, tant le maniement m’en\\r\\n était devenu inconscient, le voilà qui servait maintenant de corps astral à Golo. Et dès qu’on sonnait le dîner, j’avais hâte de courir à la salle à manger, où la grosse lampe de la suspension, ignorante de Golo et de Barbe-Bleue, et\\r\\n qui connaissait mes parents et le bœuf à la casserole, donnait sa lumière de tous les soirs; et de tomber dans les bras de maman que les malheurs de Geneviève de Brabant me rendaient plus chère, tandis que les crimes de Golo me\\r\\n faisaient examiner ma propre conscience avec plus de scrupules.\\r\\n </p>\\r\\n <p>\\r\\n Après le dîner, hélas, j’étais bientôt obligé de quitter maman qui restait à causer avec les autres, au jardin s’il faisait beau, dans le petit salon où tout le monde se retirait s’il faisait mauvais. Tout le monde, sauf ma grand’mère\\r\\n qui trouvait que «c’est une pitié de rester enfermé à la campagne» et qui avait d’incessantes discussions avec mon père, les jours de trop grande pluie, parce qu’il m’envoyait lire dans ma chambre au lieu de rester dehors. «Ce n’est\\r\\n pas comme cela que vous le rendrez robuste et énergique, disait-elle tristement, surtout ce petit qui a tant besoin de prendre des forces et de la volonté.» Mon père haussait les épaules et il examinait le baromètre, car il aimait la\\r\\n météorologie, pendant que ma mère, évitant de faire du bruit pour ne pas le troubler, le regardait avec un respect attendri, mais pas trop fixement pour ne pas chercher à percer le mystère de ses supériorités. Mais ma grand’mère,\\r\\n elle, par tous les temps, même quand la pluie faisait rage et que Françoise avait précipitamment rentré les précieux fauteuils d’osier de peur qu’ils ne fussent mouillés, on la voyait dans le jardin vide et fouetté par l’averse,\\r\\n relevant ses mèches désordonnées et grises pour que son front s’imbibât mieux de la salubrité du vent et de la pluie. Elle disait: «Enfin, on respire!» et parcourait les allées détrempées,—trop symétriquement alignées à son gré par le\\r\\n nouveau jardinier dépourvu du sentiment de la nature et auquel mon père avait demandé depuis le matin si le temps s’arrangerait,—de son petit pas enthousiaste et saccadé, réglé sur les mouvements divers qu’excitaient dans son âme\\r\\n l’ivresse de l’orage, la puissance de l’hygiène, la stupidité de mon éducation et la symétrie des jardins, plutôt que sur le désir inconnu d’elle d’éviter à sa jupe prune les taches de boue sous lesquelles elle disparaissait jusqu’à\\r\\n une hauteur qui était toujours pour sa femme de chambre un désespoir et un problème.\\r\\n </p>\\r\\n <p>\\r\\n Quand ces tours de jardin de ma grand’mère avaient lieu après dîner, une chose avait le pouvoir de la faire rentrer: c’était, à un des moments où la révolution de sa promenade la ramenait périodiquement, comme un insecte, en face des\\r\\n lumières du petit salon où les liqueurs étaient servies sur la table à jeu,—si ma grand’tante lui criait: «Bathilde! viens donc empêcher ton mari de boire du cognac!» Pour la taquiner, en effet (elle avait apporté dans la famille de\\r\\n mon père un esprit si différent que tout le monde la plaisantait et la tourmentait), comme les liqueurs étaient défendues à mon grand-père, ma grand’tante lui en faisait boire quelques gouttes. Ma pauvre grand’mère entrait, priait\\r\\n ardemment son mari de ne pas goûter au cognac; il se fâchait, buvait tout de même sa gorgée, et ma grand’mère repartait, triste, découragée, souriante pourtant, car elle était si humble de cœur et si douce que sa tendresse pour les\\r\\n autres et le peu de cas qu’elle faisait de sa propre personne et de ses souffrances, se conciliaient dans son regard en un sourire où, contrairement à ce qu’on voit dans le visage de beaucoup d’humains, il n’y avait d’ironie que pour\\r\\n elle-même, et pour nous tous comme un baiser de ses yeux qui ne pouvaient voir ceux qu’elle chérissait sans les caresser passionnément du regard. Ce supplice que lui infligeait ma grand’tante, le spectacle des vaines prières de ma\\r\\n grand’mère et de sa faiblesse, vaincue d’avance, essayant inutilement d’ôter à mon grand-père le verre à liqueur, c’était de ces choses à la vue desquelles on s’habitue plus tard jusqu’à les considérer en riant et à prendre le parti\\r\\n du persécuteur assez résolument et gaiement pour se persuader à soi-même qu’il ne s’agit pas de persécution; elles me causaient alors une telle horreur, que j’aurais aimé battre ma grand’tante. Mais dès que j’entendais: «Bathilde,\\r\\n viens donc empêcher ton mari de boire du cognac!» déjà homme par la lâcheté, je faisais ce que nous faisons tous, une fois que nous sommes grands, quand il y a devant nous des souffrances et des injustices: je ne voulais pas les voir;\\r\\n je montais sangloter tout en haut de la maison à côté de la salle d’études, sous les toits, dans une petite pièce sentant l’iris, et que parfumait aussi un cassis sauvage poussé au dehors entre les pierres de la muraille et qui\\r\\n passait une branche de fleurs par la fenêtre entr’ouverte. Destinée à un usage plus spécial et plus vulgaire, cette pièce, d’où l’on voyait pendant le jour jusqu’au donjon de Roussainville-le-Pin, servit longtemps de refuge pour moi,\\r\\n sans doute parce qu’elle était la seule qu’il me fût permis de fermer à clef, à toutes celles de mes occupations qui réclamaient une inviolable solitude: la lecture, la rêverie, les larmes et la volupté. Hélas! je ne savais pas que,\\r\\n bien plus tristement que les petits écarts de régime de son mari, mon manque de volonté, ma santé délicate, l’incertitude qu’ils projetaient sur mon avenir, préoccupaient ma grand’mère, au cours de ces déambulations incessantes, de\\r\\n l’après-midi et du soir, où on voyait passer et repasser, obliquement levé vers le ciel, son beau visage aux joues brunes et sillonnées, devenues au retour de l’âge presque mauves comme les labours à l’automne, barrées, si elle\\r\\n sortait, par une voilette à demi relevée, et sur lesquelles, amené là par le froid ou quelque triste pensée, était toujours en train de sécher un pleur involontaire.\\r\\n </p>\\r\\n <p>\\r\\n Ma seule consolation, quand je montais me coucher, était que maman viendrait m’embrasser quand je serais dans mon lit. Mais ce bonsoir durait si peu de temps, elle redescendait si vite, que le moment où je l’entendais monter, puis où\\r\\n passait dans le couloir à double porte le bruit léger de sa robe de jardin en mousseline bleue, à laquelle pendaient de petits cordons de paille tressée, était pour moi un moment douloureux. Il annonçait celui qui allait le suivre, où\\r\\n elle m’aurait quitté, où elle serait redescendue. De sorte que ce bonsoir que j’aimais tant, j’en arrivais à souhaiter qu’il vînt le plus tard possible, à ce que se prolongeât le temps de répit où maman n’était pas encore venue.\\r\\n Quelquefois quand, après m’avoir embrassé, elle ouvrait la porte pour partir, je voulais la rappeler, lui dire «embrasse-moi une fois encore», mais je savais qu’aussitôt elle aurait son visage fâché, car la concession qu’elle faisait\\r\\n à ma tristesse et à mon agitation en montant m’embrasser, en m’apportant ce baiser de paix, agaçait mon père qui trouvait ces rites absurdes, et elle eût voulu tâcher de m’en faire perdre le besoin, l’habitude, bien loin de me laisser\\r\\n prendre celle de lui demander, quand elle était déjà sur le pas de la porte, un baiser de plus. Or la voir fâchée détruisait tout le calme qu’elle m’avait apporté un instant avant, quand elle avait penché vers mon lit sa figure\\r\\n aimante, et me l’avait tendue comme une hostie pour une communion de paix où mes lèvres puiseraient sa présence réelle et le pouvoir de m’endormir. Mais ces soirs-là, où maman en somme restait si peu de temps dans ma chambre, étaient\\r\\n doux encore en comparaison de ceux où il y avait du monde à dîner et où, à cause de cela, elle ne montait pas me dire bonsoir. Le monde se bornait habituellement à M. Swann, qui, en dehors de quelques étrangers de passage, était à peu\\r\\n près la seule personne qui vînt chez nous à Combray, quelquefois pour dîner en voisin (plus rarement depuis qu’il avait fait ce mauvais mariage, parce que mes parents ne voulaient pas recevoir sa femme), quelquefois après le dîner, à\\r\\n l’improviste. Les soirs où, assis devant la maison sous le grand marronnier, autour de la table de fer, nous entendions au bout du jardin, non pas le grelot profus et criard qui arrosait, qui étourdissait au passage de son bruit\\r\\n ferrugineux, intarissable et glacé, toute personne de la maison qui le déclenchait en entrant «sans sonner», mais le double tintement timide, ovale et doré de la clochette pour les étrangers, tout le monde aussitôt se demandait: «Une\\r\\n visite, qui cela peut-il être?» mais on savait bien que cela ne pouvait être que M. Swann; ma grand’tante parlant à haute voix, pour prêcher d’exemple, sur un ton qu’elle s’efforçait de rendre naturel, disait de ne pas chuchoter\\r\\n ainsi; que rien n’est plus désobligeant pour une personne qui arrive et à qui cela fait croire qu’on est en train de dire des choses qu’elle ne doit pas entendre; et on envoyait en éclaireur ma grand’mère, toujours heureuse d’avoir un\\r\\n prétexte pour faire un tour de jardin de plus, et qui en profitait pour arracher subrepticement au passage quelques tuteurs de rosiers afin de rendre aux roses un peu de naturel, comme une mère qui, pour les faire bouffer, passe la\\r\\n main dans les cheveux de son fils que le coiffeur a trop aplatis.\\r\\n </p>\\r\\n <p>\\r\\n Nous restions tous suspendus aux nouvelles que ma grand’mère allait nous apporter de l’ennemi, comme si on eût pu hésiter entre un grand nombre possible d’assaillants, et bientôt après mon grand-père disait: «Je reconnais la voix de\\r\\n Swann.» On ne le reconnaissait en effet qu’à la voix, on distinguait mal son visage au nez busqué, aux yeux verts, sous un haut front entouré de cheveux blonds presque roux, coiffés à la Bressant, parce que nous gardions le moins de\\r\\n lumière possible au jardin pour ne pas attirer les moustiques et j’allais, sans en avoir l’air, dire qu’on apportât les sirops; ma grand’mère attachait beaucoup d’importance, trouvant cela plus aimable, à ce qu’ils n’eussent pas l’air\\r\\n de figurer d’une façon exceptionnelle, et pour les visites seulement. M. Swann, quoique beaucoup plus jeune que lui, était très lié avec mon grand-père qui avait été un des meilleurs amis de son père, homme excellent mais singulier,\\r\\n chez qui, paraît-il, un rien suffisait parfois pour interrompre les élans du cœur, changer le cours de la pensée. J’entendais plusieurs fois par an mon grand-père raconter à table des anecdotes toujours les mêmes sur l’attitude\\r\\n qu’avait eue M. Swann le père, à la mort de sa femme qu’il avait veillée jour et nuit. Mon grand-père qui ne l’avait pas vu depuis longtemps était accouru auprès de lui dans la propriété que les Swann possédaient aux environs de\\r\\n Combray, et avait réussi, pour qu’il n’assistât pas à la mise en bière, à lui faire quitter un moment, tout en pleurs, la chambre mortuaire. Ils firent quelques pas dans le parc où il y avait un peu de soleil. Tout d’un coup, M. Swann\\r\\n prenant mon grand-père par le bras, s’était écrié: «Ah! mon vieil ami, quel bonheur de se promener ensemble par ce beau temps. Vous ne trouvez pas ça joli tous ces arbres, ces aubépines et mon étang dont vous ne m’avez jamais\\r\\n félicité? Vous avez l’air comme un bonnet de nuit. Sentez-vous ce petit vent? Ah! on a beau dire, la vie a du bon tout de même, mon cher Amédée!» Brusquement le souvenir de sa femme morte lui revint, et trouvant sans doute trop\\r\\n compliqué de chercher comment il avait pu à un pareil moment se laisser aller à un mouvement de joie, il se contenta, par un geste qui lui était familier chaque fois qu’une question ardue se présentait à son esprit, de passer la main\\r\\n sur son front, d’essuyer ses yeux et les verres de son lorgnon. Il ne put pourtant pas se consoler de la mort de sa femme, mais pendant les deux années qu’il lui survécut, il disait à mon grand-père: «C’est drôle, je pense très\\r\\n souvent à ma pauvre femme, mais je ne peux y penser beaucoup à la fois.» «Souvent, mais peu à la fois, comme le pauvre père Swann», était devenu une des phrases favorites de mon grand-père qui la prononçait à propos des choses les\\r\\n plus différentes. Il m’aurait paru que ce père de Swann était un monstre, si mon grand-père que je considérais comme meilleur juge et dont la sentence faisant jurisprudence pour moi, m’a souvent servi dans la suite à absoudre des\\r\\n fautes que j’aurais été enclin à condamner, ne s’était récrié: «Mais comment? c’était un cœur d’or!»\\r\\n </p>\\r\\n <p>\\r\\n Pendant bien des années, où pourtant, surtout avant son mariage, M. Swann, le fils, vint souvent les voir à Combray, ma grand’tante et mes grands-parents ne soupçonnèrent pas qu’il ne vivait plus du tout dans la société qu’avait\\r\\n fréquentée sa famille et que sous l’espèce d’incognito que lui faisait chez nous ce nom de Swann, ils hébergeaient,—avec la parfaite innocence d’honnêtes hôteliers qui ont chez eux, sans le savoir, un célèbre brigand,—un des membres\\r\\n les plus élégants du Jockey-Club, ami préféré du comte de Paris et du prince de Galles, un des hommes les plus choyés de la haute société du faubourg Saint-Germain.\\r\\n </p>\\r\\n <p>\\r\\n L’ignorance où nous étions de cette brillante vie mondaine que menait Swann tenait évidemment en partie à la réserve et à la discrétion de son caractère, mais aussi à ce que les bourgeois d’alors se faisaient de la société une idée un\\r\\n peu hindoue et la considéraient comme composée de castes fermées où chacun, dès sa naissance, se trouvait placé dans le rang qu’occupaient ses parents, et d’où rien, à moins des hasards d’une carrière exceptionnelle ou d’un mariage\\r\\n inespéré, ne pouvait vous tirer pour vous faire pénétrer dans une caste supérieure. M. Swann, le père, était agent de change; le «fils Swann» se trouvait faire partie pour toute sa vie d’une caste où les fortunes, comme dans une\\r\\n catégorie de contribuables, variaient entre tel et tel revenu. On savait quelles avaient été les fréquentations de son père, on savait donc quelles étaient les siennes, avec quelles personnes il était «en situation» de frayer. S’il en\\r\\n connaissait d’autres, c’étaient relations de jeune homme sur lesquelles des amis anciens de sa famille, comme étaient mes parents, fermaient d’autant plus bienveillamment les yeux qu’il continuait, depuis qu’il était orphelin, à venir\\r\\n très fidèlement nous voir; mais il y avait fort à parier que ces gens inconnus de nous qu’il voyait, étaient de ceux qu’il n’aurait pas osé saluer si, étant avec nous, il les avait rencontrés. Si l’on avait voulu à toute force\\r\\n appliquer à Swann un coefficient social qui lui fût personnel, entre les autres fils d’agents de situation égale à celle de ses parents, ce coefficient eût été pour lui un peu inférieur parce que, très simple de façon et ayant\\r\\n toujours eu une «toquade» d’objets anciens et de peinture, il demeurait maintenant dans un vieil hôtel où il entassait ses collections et que ma grand’mère rêvait de visiter, mais qui était situé quai d’Orléans, quartier que ma\\r\\n grand’tante trouvait infamant d’habiter. «Êtes-vous seulement connaisseur? je vous demande cela dans votre intérêt, parce que vous devez vous faire repasser des croûtes par les marchands», lui disait ma grand’tante; elle ne lui\\r\\n supposait en effet aucune compétence et n’avait pas haute idée même au point de vue intellectuel d’un homme qui dans la conversation évitait les sujets sérieux et montrait une précision fort prosaïque non seulement quand il nous\\r\\n donnait, en entrant dans les moindres détails, des recettes de cuisine, mais même quand les sœurs de ma grand’mère parlaient de sujets artistiques. Provoqué par elles à donner son avis, à exprimer son admiration pour un tableau, il\\r\\n gardait un silence presque désobligeant et se rattrapait en revanche s’il pouvait fournir sur le musée où il se trouvait, sur la date où il avait été peint, un renseignement matériel. Mais d’habitude il se contentait de chercher à\\r\\n nous amuser en racontant chaque fois une histoire nouvelle qui venait de lui arriver avec des gens choisis parmi ceux que nous connaissions, avec le pharmacien de Combray, avec notre cuisinière, avec notre cocher. Certes ces récits\\r\\n faisaient rire ma grand’tante, mais sans qu’elle distinguât bien si c’était à cause du rôle ridicule que s’y donnait toujours Swann ou de l’esprit qu’il mettait à les conter: «On peut dire que vous êtes un vrai type, monsieur Swann!»\\r\\n Comme elle était la seule personne un peu vulgaire de notre famille, elle avait soin de faire remarquer aux étrangers, quand on parlait de Swann, qu’il aurait pu, s’il avait voulu, habiter boulevard Haussmann ou avenue de l’Opéra,\\r\\n qu’il était le fils de M. Swann qui avait dû lui laisser quatre ou cinq millions, mais que c’était sa fantaisie. Fantaisie qu’elle jugeait du reste devoir être si divertissante pour les autres, qu’à Paris, quand M. Swann venait le\\r\\n 1<sup>er</sup> janvier lui apporter son sac de marrons glacés, elle ne manquait pas, s’il y avait du monde, de lui dire: «Eh bien! M. Swann, vous habitez toujours près de l’Entrepôt des vins, pour être sûr de ne pas manquer le train\\r\\n quand vous prenez le chemin de Lyon?» Et elle regardait du coin de l’œil, par-dessus son lorgnon, les autres visiteurs.\\r\\n </p>\\r\\n <p>\\r\\n Mais si l’on avait dit à ma grand’mère que ce Swann qui, en tant que fils Swann était parfaitement «qualifié» pour être reçu par toute la «belle bourgeoisie», par les notaires ou les avoués les plus estimés de Paris (privilège qu’il\\r\\n semblait laisser tomber un peu en quenouille), avait, comme en cachette, une vie toute différente; qu’en sortant de chez nous, à Paris, après nous avoir dit qu’il rentrait se coucher, il rebroussait chemin à peine la rue tournée et se\\r\\n rendait dans tel salon que jamais l’œil d’aucun agent ou associé d’agent ne contempla, cela eût paru aussi extraordinaire à ma tante qu’aurait pu l’être pour une dame plus lettrée la pensée d’être personnellement liée avec Aristée\\r\\n dont elle aurait compris qu’il allait, après avoir causé avec elle, plonger au sein des royaumes de Thétis, dans un empire soustrait aux yeux des mortels et où Virgile nous le montre reçu à bras ouverts; ou, pour s’en tenir à une\\r\\n image qui avait plus de chance de lui venir à l’esprit, car elle l’avait vue peinte sur nos assiettes à petits fours de Combray—d’avoir eu à dîner Ali-Baba, lequel quand il se saura seul, pénétrera dans la caverne, éblouissante de\\r\\n trésors insoupçonnés.\\r\\n </p>\\r\\n <p>\\r\\n Un jour qu’il était venu nous voir à Paris après dîner en s’excusant d’être en habit, Françoise ayant, après son départ, dit tenir du cocher qu’il avait dîné «chez une princesse»,—«Oui, chez une princesse du demi-monde!» avait répondu\\r\\n ma tante en haussant les épaules sans lever les yeux de sur son tricot, avec une ironie sereine.\\r\\n </p>\\r\\n <p>\\r\\n Aussi, ma grand’tante en usait-elle cavalièrement avec lui. Comme elle croyait qu’il devait être flatté par nos invitations, elle trouvait tout naturel qu’il ne vînt pas nous voir l’été sans avoir à la main un panier de pêches ou de\\r\\n framboises de son jardin et que de chacun de ses voyages d’Italie il m’eût rapporté des photographies de chefs-d’œuvre.\\r\\n </p>\\r\\n <p>\\r\\n On ne se gênait guère pour l’envoyer quérir dès qu’on avait besoin d’une recette de sauce gribiche ou de salade à l’ananas pour des grands dîners où on ne l’invitait pas, ne lui trouvant pas un prestige suffisant pour qu’on pût le\\r\\n servir à des étrangers qui venaient pour la première fois. Si la conversation tombait sur les princes de la Maison de France: «des gens que nous ne connaîtrons jamais ni vous ni moi et nous nous en passons, n’est-ce pas», disait ma\\r\\n grand’tante à Swann qui avait peut-être dans sa poche une lettre de Twickenham; elle lui faisait pousser le piano et tourner les pages les soirs où la sœur de ma grand’mère chantait, ayant pour manier cet être ailleurs si recherché,\\r\\n la naïve brusquerie d’un enfant qui joue avec un bibelot de collection sans plus de précautions qu’avec un objet bon marché. Sans doute le Swann que connurent à la même époque tant de clubmen était bien différent de celui que créait\\r\\n ma grand’tante, quand le soir, dans le petit jardin de Combray, après qu’avaient retenti les deux coups hésitants de la clochette, elle injectait et vivifiait de tout ce qu’elle savait sur la famille Swann, l’obscur et incertain\\r\\n personnage qui se détachait, suivi de ma grand’mère, sur un fond de ténèbres, et qu’on reconnaissait à la voix. Mais même au point de vue des plus insignifiantes choses de la vie, nous ne sommes pas un tout matériellement constitué,\\r\\n identique pour tout le monde et dont chacun n’a qu’à aller prendre connaissance comme d’un cahier des charges ou d’un testament; notre personnalité sociale est une création de la pensée des autres. Même l’acte si simple que nous\\r\\n appelons «voir une personne que nous connaissons» est en partie un acte intellectuel. Nous remplissons l’apparence physique de l’être que nous voyons, de toutes les notions que nous avons sur lui et dans l’aspect total que nous nous\\r\\n représentons, ces notions ont certainement la plus grande part. Elles finissent par gonfler si parfaitement les joues, par suivre en une adhérence si exacte la ligne du nez, elles se mêlent si bien de nuancer la sonorité de la voix\\r\\n comme si celle-ci n’était qu’une transparente enveloppe, que chaque fois que nous voyons ce visage et que nous entendons cette voix, ce sont ces notions que nous retrouvons, que nous écoutons. Sans doute, dans le Swann qu’ils\\r\\n s’étaient constitué, mes parents avaient omis par ignorance de faire entrer une foule de particularités de sa vie mondaine qui étaient cause que d’autres personnes, quand elles étaient en sa présence, voyaient les élégances régner\\r\\n dans son visage et s’arrêter à son nez busqué comme à leur frontière naturelle; mais aussi ils avaient pu entasser dans ce visage désaffecté de son prestige, vacant et spacieux, au fond de ces yeux dépréciés, le vague et doux\\r\\n résidu,—mi-mémoire, mi-oubli,—des heures oisives passées ensemble après nos dîners hebdomadaires, autour de la table de jeu ou au jardin, durant notre vie de bon voisinage campagnard. L’enveloppe corporelle de notre ami en avait été\\r\\n si bien bourrée, ainsi que de quelques souvenirs relatifs à ses parents, que ce Swann-là était devenu un être complet et vivant, et que j’ai l’impression de quitter une personne pour aller vers une autre qui en est distincte, quand,\\r\\n dans ma mémoire, du Swann que j’ai connu plus tard avec exactitude je passe à ce premier Swann,—à ce premier Swann dans lequel je retrouve les erreurs charmantes de ma jeunesse, et qui d’ailleurs ressemble moins à l’autre qu’aux\\r\\n personnes que j’ai connues à la même époque, comme s’il en était de notre vie ainsi que d’un musée où tous les portraits d’un même temps ont un air de famille, une même tonalité—à ce premier Swann rempli de loisir, parfumé par l’odeur\\r\\n du grand marronnier, des paniers de framboises et d’un brin d’estragon.\\r\\n </p>\\r\\n <p>\\r\\n Pourtant un jour que ma grand’mère était allée demander un service à une dame qu’elle avait connue au Sacré-Cœur (et avec laquelle, à cause de notre conception des castes elle n’avait pas voulu rester en relations malgré une sympathie\\r\\n réciproque), la marquise de Villeparisis, de la célèbre famille de Bouillon, celle-ci lui avait dit: «Je crois que vous connaissez beaucoup M. Swann qui est un grand ami de mes neveux des Laumes». Ma grand’mère était revenue de sa\\r\\n visite enthousiasmée par la maison qui donnait sur des jardins et où M<sup>me</sup> de Villeparisis lui conseillait de louer, et aussi par un giletier et sa fille, qui avaient leur boutique dans la cour et chez qui elle était entrée\\r\\n demander qu’on fît un point à sa jupe qu’elle avait déchirée dans l’escalier. Ma grand’mère avait trouvé ces gens parfaits, elle déclarait que la petite était une perle et que le giletier était l’homme le plus distingué, le mieux\\r\\n qu’elle eût jamais vu. Car pour elle, la distinction était quelque chose d’absolument indépendant du rang social. Elle s’extasiait sur une réponse que le giletier lui avait faite, disant à maman: «Sévigné n’aurait pas mieux dit!» et\\r\\n en revanche, d’un neveu de M<sup>me</sup> de Villeparisis qu’elle avait rencontré chez elle: «Ah! ma fille, comme il est commun!»\\r\\n </p>\\r\\n <p>\\r\\n Or le propos relatif à Swann avait eu pour effet non pas de relever celui-ci dans l’esprit de ma grand’tante, mais d’y abaisser M<sup>me</sup> de Villeparisis. Il semblait que la considération que, sur la foi de ma grand’mère, nous\\r\\n accordions à M<sup>me</sup> de Villeparisis, lui créât un devoir de ne rien faire qui l’en rendît moins digne et auquel elle avait manqué en apprenant l’existence de Swann, en permettant à des parents à elle de le fréquenter. «Comment\\r\\n elle connaît Swann? Pour une personne que tu prétendais parente du maréchal de Mac-Mahon!» Cette opinion de mes parents sur les relations de Swann leur parut ensuite confirmée par son mariage avec une femme de la pire société, presque\\r\\n une cocotte que, d’ailleurs, il ne chercha jamais à présenter, continuant à venir seul chez nous, quoique de moins en moins, mais d’après laquelle ils crurent pouvoir juger—supposant que c’était là qu’il l’avait prise—le milieu,\\r\\n inconnu d’eux, qu’il fréquentait habituellement.\\r\\n </p>\\r\\n <p>\\r\\n Mais une fois, mon grand-père lut dans un journal que M. Swann était un des plus fidèles habitués des déjeuners du dimanche chez le duc de X..., dont le père et l’oncle avaient été les hommes d’État les plus en vue du règne de\\r\\n Louis-Philippe. Or mon grand-père était curieux de tous les petits faits qui pouvaient l’aider à entrer par la pensée dans la vie privée d’hommes comme Molé, comme le duc Pasquier, comme le duc de Broglie. Il fut enchanté d’apprendre\\r\\n que Swann fréquentait des gens qui les avaient connus. Ma grand’tante au contraire interpréta cette nouvelle dans un sens défavorable à Swann: quelqu’un qui choisissait ses fréquentations en dehors de la caste où il était né, en\\r\\n dehors de sa «classe» sociale, subissait à ses yeux un fâcheux déclassement. Il lui semblait qu’on renonçât d’un coup au fruit de toutes les belles relations avec des gens bien posés, qu’avaient honorablement entretenues et engrangées\\r\\n pour leurs enfants les familles prévoyantes; (ma grand’tante avait même cessé de voir le fils d’un notaire de nos amis parce qu’il avait épousé une altesse et était par là descendu pour elle du rang respecté de fils de notaire à celui\\r\\n d’un de ces aventuriers, anciens valets de chambre ou garçons d’écurie, pour qui on raconte que les reines eurent parfois des bontés). Elle blâma le projet qu’avait mon grand-père d’interroger Swann, le soir prochain où il devait\\r\\n venir dîner, sur ces amis que nous lui découvrions. D’autre part les deux sœurs de ma grand’mère, vieilles filles qui avaient sa noble nature mais non son esprit, déclarèrent ne pas comprendre le plaisir que leur beau-frère pouvait\\r\\n trouver à parler de niaiseries pareilles. C’étaient des personnes d’aspirations élevées et qui à cause de cela même étaient incapables de s’intéresser à ce qu’on appelle un potin, eût-il même un intérêt historique, et d’une façon\\r\\n générale à tout ce qui ne se rattachait pas directement à un objet esthétique ou vertueux. Le désintéressement de leur pensée était tel, à l’égard de tout ce qui, de près ou de loin semblait se rattacher à la vie mondaine, que leur\\r\\n sens auditif,—ayant fini par comprendre son inutilité momentanée dès qu’à dîner la conversation prenait un ton frivole ou seulement terre à terre sans que ces deux vieilles demoiselles aient pu la ramener aux sujets qui leur étaient\\r\\n chers,—mettait alors au repos ses organes récepteurs et leur laissait subir un véritable commencement d’atrophie. Si alors mon grand-père avait besoin d’attirer l’attention des deux sœurs, il fallait qu’il eût recours à ces\\r\\n avertissements physiques dont usent les médecins aliénistes à l’égard de certains maniaques de la distraction: coups frappés à plusieurs reprises sur un verre avec la lame d’un couteau, coïncidant avec une brusque interpellation de la\\r\\n voix et du regard, moyens violents que ces psychiatres transportent souvent dans les rapports courants avec des gens bien portants, soit par habitude professionnelle, soit qu’ils croient tout le monde un peu fou.\\r\\n </p>\\r\\n <p>\\r\\n Elles furent plus intéressées quand la veille du jour où Swann devait venir dîner, et leur avait personnellement envoyé une caisse de vin d’Asti, ma tante, tenant un numéro du Figaro où à côté du nom d’un tableau qui était à une\\r\\n Exposition de Corot, il y avait ces mots: «de la collection de M. Charles Swann», nous dit: «Vous avez vu que Swann a «les honneurs» du Figaro?»—«Mais je vous ai toujours dit qu’il avait beaucoup de goût», dit ma grand’mère.\\r\\n «Naturellement toi, du moment qu’il s’agit d’être d’un autre avis que nous», répondit ma grand’tante qui, sachant que ma grand’mère n’était jamais du même avis qu’elle, et n’étant bien sûre que ce fût à elle-même que nous donnions\\r\\n toujours raison, voulait nous arracher une condamnation en bloc des opinions de ma grand’mère contre lesquelles elle tâchait de nous solidariser de force avec les siennes. Mais nous restâmes silencieux. Les sœurs de ma grand’mère\\r\\n ayant manifesté l’intention de parler à Swann de ce mot du Figaro, ma grand’tante le leur déconseilla. Chaque fois qu’elle voyait aux autres un avantage si petit fût-il qu’elle n’avait pas, elle se persuadait que c’était non un\\r\\n avantage mais un mal et elle les plaignait pour ne pas avoir à les envier. «Je crois que vous ne lui feriez pas plaisir; moi je sais bien que cela me serait très désagréable de voir mon nom imprimé tout vif comme cela dans le journal,\\r\\n et je ne serais pas flattée du tout qu’on m’en parlât.» Elle ne s’entêta pas d’ailleurs à persuader les sœurs de ma grand’mère; car celles-ci par horreur de la vulgarité poussaient si loin l’art de dissimuler sous des périphrases\\r\\n ingénieuses une allusion personnelle qu’elle passait souvent inaperçue de celui même à qui elle s’adressait. Quant à ma mère elle ne pensait qu’à tâcher d’obtenir de mon père qu’il consentît à parler à Swann non de sa femme mais de sa\\r\\n fille qu’il adorait et à cause de laquelle disait-on il avait fini par faire ce mariage. «Tu pourrais ne lui dire qu’un mot, lui demander comment elle va. Cela doit être si cruel pour lui.» Mais mon père se fâchait: «Mais non! tu as\\r\\n des idées absurdes. Ce serait ridicule.»\\r\\n </p>\\r\\n <p>\\r\\n Mais le seul d’entre nous pour qui la venue de Swann devint l’objet d’une préoccupation douloureuse, ce fut moi. C’est que les soirs où des étrangers, ou seulement M. Swann, étaient là, maman ne montait pas dans ma chambre. Je ne\\r\\n dînais pas à table, je venais après dîner au jardin, et à neuf heures je disais bonsoir et allais me coucher. Je dînais avant tout le monde et je venais ensuite m’asseoir à table, jusqu’à huit heures où il était convenu que je devais\\r\\n monter; ce baiser précieux et fragile que maman me confiait d’habitude dans mon lit au moment de m’endormir il me fallait le transporter de la salle à manger dans ma chambre et le garder pendant tout le temps que je me déshabillais,\\r\\n sans que se brisât sa douceur, sans que se répandît et s’évaporât sa vertu volatile et, justement ces soirs-là où j’aurais eu besoin de le recevoir avec plus de précaution, il fallait que je le prisse, que je le dérobasse brusquement,\\r\\n publiquement, sans même avoir le temps et la liberté d’esprit nécessaires pour porter à ce que je faisais cette attention des maniaques qui s’efforcent de ne pas penser à autre chose pendant qu’ils ferment une porte, pour pouvoir,\\r\\n quand l’incertitude maladive leur revient, lui opposer victorieusement le souvenir du moment où ils l’ont fermée. Nous étions tous au jardin quand retentirent les deux coups hésitants de la clochette. On savait que c’était Swann;\\r\\n néanmoins tout le monde se regarda d’un air interrogateur et on envoya ma grand’mère en reconnaissance. «Pensez à le remercier intelligiblement de son vin, vous savez qu’il est délicieux et la caisse est énorme, recommanda mon\\r\\n grand-père à ses deux belles-sœurs.» «Ne commencez pas à chuchoter, dit ma grand’tante. Comme c’est confortable d’arriver dans une maison où tout le monde parle bas.» «Ah! voilà M. Swann. Nous allons lui demander s’il croit qu’il fera\\r\\n beau demain», dit mon père. Ma mère pensait qu’un mot d’elle effacerait toute la peine que dans notre famille on avait pu faire à Swann depuis son mariage. Elle trouva le moyen de l’emmener un peu à l’écart. Mais je la suivis; je ne\\r\\n pouvais me décider à la quitter d’un pas en pensant que tout à l’heure il faudrait que je la laisse dans la salle à manger et que je remonte dans ma chambre sans avoir comme les autres soirs la consolation qu’elle vînt m’embrasser.\\r\\n «Voyons, monsieur Swann, lui dit-elle, parlez-moi un peu de votre fille; je suis sûre qu’elle a déjà le goût des belles œuvres comme son papa.» «Mais venez donc vous asseoir avec nous tous sous la véranda», dit mon grand-père en\\r\\n s’approchant. Ma mère fut obligée de s’interrompre, mais elle tira de cette contrainte même une pensée délicate de plus, comme les bons poètes que la tyrannie de la rime force à trouver leurs plus grandes beautés: «Nous reparlerons\\r\\n d’elle quand nous serons tous les deux, dit-elle à mi-voix à Swann. Il n’y a qu’une maman qui soit digne de vous comprendre. Je suis sûre que la sienne serait de mon avis.» Nous nous assîmes tous autour de la table de fer. J’aurais\\r\\n voulu ne pas penser aux heures d’angoisse que je passerais ce soir seul dans ma chambre sans pouvoir m’endormir; je tâchais de me persuader qu’elles n’avaient aucune importance, puisque je les aurais oubliées demain matin, de\\r\\n m’attacher à des idées d’avenir qui auraient dû me conduire comme sur un pont au delà de l’abîme prochain qui m’effrayait. Mais mon esprit tendu par ma préoccupation, rendu convexe comme le regard que je dardais sur ma mère, ne se\\r\\n laissait pénétrer par aucune impression étrangère. Les pensées entraient bien en lui, mais à condition de laisser dehors tout élément de beauté ou simplement de drôlerie qui m’eût touché ou distrait. Comme un malade, grâce à un\\r\\n anesthésique, assiste avec une pleine lucidité à l’opération qu’on pratique sur lui, mais sans rien sentir, je pouvais me réciter des vers que j’aimais ou observer les efforts que mon grand-père faisait pour parler à Swann du duc\\r\\n d’Audiffret-Pasquier, sans que les premiers me fissent éprouver aucune émotion, les seconds aucune gaîté. Ces efforts furent infructueux. A peine mon grand-père eut-il posé à Swann une question relative à cet orateur qu’une des sœurs\\r\\n de ma grand’mère aux oreilles de qui cette question résonna comme un silence profond mais intempestif et qu’il était poli de rompre, interpella l’autre: «Imagine-toi, Céline, que j’ai fait la connaissance d’une jeune institutrice\\r\\n suédoise qui m’a donné sur les coopératives dans les pays scandinaves des détails tout ce qu’il y a de plus intéressants. Il faudra qu’elle vienne dîner ici un soir.» «Je crois bien! répondit sa sœur Flora, mais je n’ai pas perdu mon\\r\\n temps non plus. J’ai rencontré chez M. Vinteuil un vieux savant qui connaît beaucoup Maubant, et à qui Maubant a expliqué dans le plus grand détail comment il s’y prend pour composer un rôle. C’est tout ce qu’il y a de plus\\r\\n intéressant. C’est un voisin de M. Vinteuil, je n’en savais rien; et il est très aimable.» «Il n’y a pas que M. Vinteuil qui ait des voisins aimables», s’écria ma tante Céline d’une voix que la timidité rendait forte et la\\r\\n préméditation, factice, tout en jetant sur Swann ce qu’elle appelait un regard significatif. En même temps ma tante Flora qui avait compris que cette phrase était le remerciement de Céline pour le vin d’Asti, regardait également Swann\\r\\n avec un air mêlé de congratulation et d’ironie, soit simplement pour souligner le trait d’esprit de sa sœur, soit qu’elle enviât Swann de l’avoir inspiré, soit qu’elle ne pût s’empêcher de se moquer de lui parce qu’elle le croyait sur\\r\\n la sellette. «Je crois qu’on pourra réussir à avoir ce monsieur à dîner, continua Flora; quand on le met sur Maubant ou sur M<sup>me</sup> Materna, il parle des heures sans s’arrêter.» «Ce doit être délicieux», soupira mon grand-père\\r\\n dans l’esprit de qui la nature avait malheureusement aussi complètement omis d’inclure la possibilité de s’intéresser passionnément aux coopératives suédoises ou à la composition des rôles de Maubant, qu’elle avait oublié de fournir\\r\\n celui des sœurs de ma grand’mère du petit grain de sel qu’il faut ajouter soi-même pour y trouver quelque saveur, à un récit sur la vie intime de Molé ou du comte de Paris. «Tenez, dit Swann à mon grand-père, ce que je vais vous dire\\r\\n a plus de rapports que cela n’en a l’air avec ce que vous me demandiez, car sur certains points les choses n’ont pas énormément changé. Je relisais ce matin dans Saint-Simon quelque chose qui vous aurait amusé. C’est dans le volume\\r\\n sur son ambassade d’Espagne; ce n’est pas un des meilleurs, ce n’est guère qu’un journal, mais du moins un journal merveilleusement écrit, ce qui fait déjà une première différence avec les assommants journaux que nous nous croyons\\r\\n obligés de lire matin et soir.» «Je ne suis pas de votre avis, il y a des jours où la lecture des journaux me semble fort agréable...», interrompit ma tante Flora, pour montrer qu’elle avait lu la phrase sur le Corot de Swann dans le\\r\\n Figaro. «Quand ils parlent de choses ou de gens qui nous intéressent!» enchérit ma tante Céline. «Je ne dis pas non, répondit Swann étonné. Ce que je reproche aux journaux c’est de nous faire faire attention tous les jours à des\\r\\n choses insignifiantes tandis que nous lisons trois ou quatre fois dans notre vie les livres où il y a des choses essentielles. Du moment que nous déchirons fiévreusement chaque matin la bande du journal, alors on devrait changer les\\r\\n choses et mettre dans le journal, moi je ne sais pas, les... Pensées de Pascal! (il détacha ce mot d’un ton d’emphase ironique pour ne pas avoir l’air pédant). Et c’est dans le volume doré sur tranches que nous n’ouvrons qu’une fois\\r\\n tous les dix ans, ajouta-t-il en témoignant pour les choses mondaines ce dédain qu’affectent certains hommes du monde, que nous lirions que la reine de Grèce est allée à Cannes ou que la princesse de Léon a donné un bal costumé. Comme\\r\\n cela la juste proportion serait rétablie.» Mais regrettant de s’être laissé aller à parler même légèrement de choses sérieuses: «Nous avons une bien belle conversation, dit-il ironiquement, je ne sais pas pourquoi nous abordons ces\\r\\n «sommets», et se tournant vers mon grand-père: «Donc Saint-Simon raconte que Maulevrier avait eu l’audace de tendre la main à ses fils. Vous savez, c’est ce Maulevrier dont il dit: «Jamais je ne vis dans cette épaisse bouteille que de\\r\\n l’humeur, de la grossièreté et des sottises.» «Épaisses ou non, je connais des bouteilles où il y a tout autre chose», dit vivement Flora, qui tenait à avoir remercié Swann elle aussi, car le présent de vin d’Asti s’adressait aux\\r\\n deux. Céline se mit à rire. Swann interloqué reprit: «Je ne sais si ce fut ignorance ou panneau, écrit Saint-Simon, il voulut donner la main à mes enfants. Je m’en aperçus assez tôt pour l’en empêcher.» Mon grand-père s’extasiait déjà\\r\\n sur «ignorance ou panneau», mais M<sup>lle</sup> Céline, chez qui le nom de Saint-Simon,—un littérateur,—avait empêché l’anesthésie complète des facultés auditives, s’indignait déjà: «Comment? vous admirez cela? Eh bien! c’est du\\r\\n joli! Mais qu’est-ce que cela peut vouloir dire; est-ce qu’un homme n’est pas autant qu’un autre? Qu’est-ce que cela peut faire qu’il soit duc ou cocher s’il a de l’intelligence et du cœur? Il avait une belle manière d’élever ses\\r\\n enfants, votre Saint-Simon, s’il ne leur disait pas de donner la main à tous les honnêtes gens. Mais c’est abominable, tout simplement. Et vous osez citer cela?» Et mon grand-père navré, sentant l’impossibilité, devant cette\\r\\n obstruction, de chercher à faire raconter à Swann, les histoires qui l’eussent amusé disait à voix basse à maman: «Rappelle-moi donc le vers que tu m’as appris et qui me soulage tant dans ces moments-là. Ah! oui: «Seigneur, que de\\r\\n vertus vous nous faites haïr!» Ah! comme c’est bien!»\\r\\n </p>\\r\\n <p>\\r\\n Je ne quittais pas ma mère des yeux, je savais que quand on serait à table, on ne me permettrait pas de rester pendant toute la durée du dîner et que pour ne pas contrarier mon père, maman ne me laisserait pas l’embrasser à plusieurs\\r\\n reprises devant le monde, comme si ç’avait été dans ma chambre. Aussi je me promettais, dans la salle à manger, pendant qu’on commencerait à dîner et que je sentirais approcher l’heure, de faire d’avance de ce baiser qui serait si\\r\\n court et furtif, tout ce que j’en pouvais faire seul, de choisir avec mon regard la place de la joue que j’embrasserais, de préparer ma pensée pour pouvoir grâce à ce commencement mental de baiser consacrer toute la minute que\\r\\n m’accorderait maman à sentir sa joue contre mes lèvres, comme un peintre qui ne peut obtenir que de courtes séances de pose, prépare sa palette, et a fait d’avance de souvenir, d’après ses notes, tout ce pour quoi il pouvait à la\\r\\n rigueur se passer de la présence du modèle. Mais voici qu’avant que le dîner fût sonné mon grand-père eut la férocité inconsciente de dire: «Le petit a l’air fatigué, il devrait monter se coucher. On dîne tard du reste ce soir.» Et\\r\\n mon père, qui ne gardait pas aussi scrupuleusement que ma grand’mère et que ma mère la foi des traités, dit: «Oui, allons, vas te coucher.» Je voulus embrasser maman, à cet instant on entendit la cloche du dîner. «Mais non, voyons,\\r\\n laisse ta mère, vous vous êtes assez dit bonsoir comme cela, ces manifestations sont ridicules. Allons, monte!» Et il me fallut partir sans viatique; il me fallut monter chaque marche de l’escalier, comme dit l’expression populaire, à\\r\\n «contre-cœur», montant contre mon cœur qui voulait retourner près de ma mère parce qu’elle ne lui avait pas, en m’embrassant, donné licence de me suivre. Cet escalier détesté où je m’engageais toujours si tristement, exhalait une\\r\\n odeur de vernis qui avait en quelque sorte absorbé, fixé, cette sorte particulière de chagrin que je ressentais chaque soir et la rendait peut-être plus cruelle encore pour ma sensibilité parce que sous cette forme olfactive mon\\r\\n intelligence n’en pouvait plus prendre sa part. Quand nous dormons et qu’une rage de dents n’est encore perçue par nous que comme une jeune fille que nous nous efforçons deux cents fois de suite de tirer de l’eau ou que comme un vers\\r\\n de Molière que nous nous répétons sans arrêter, c’est un grand soulagement de nous réveiller et que notre intelligence puisse débarrasser l’idée de rage de dents, de tout déguisement héroïque ou cadencé. C’est l’inverse de ce\\r\\n soulagement que j’éprouvais quand mon chagrin de monter dans ma chambre entrait en moi d’une façon infiniment plus rapide, presque instantanée, à la fois insidieuse et brusque, par l’inhalation,—beaucoup plus toxique que la\\r\\n pénétration morale,—de l’odeur de vernis particulière à cet escalier. Une fois dans ma chambre, il fallut boucher toutes les issues, fermer les volets, creuser mon propre tombeau, en défaisant mes couvertures, revêtir le suaire de ma\\r\\n chemise de nuit. Mais avant de m’ensevelir dans le lit de fer qu’on avait ajouté dans la chambre parce que j’avais trop chaud l’été sous les courtines de reps du grand lit, j’eus un mouvement de révolte, je voulus essayer d’une ruse\\r\\n de condamné. J’écrivis à ma mère en la suppliant de monter pour une chose grave que je ne pouvais lui dire dans ma lettre. Mon effroi était que Françoise, la cuisinière de ma tante qui était chargée de s’occuper de moi quand j’étais à\\r\\n Combray, refusât de porter mon mot. Je me doutais que pour elle, faire une commission à ma mère quand il y avait du monde lui paraîtrait aussi impossible que pour le portier d’un théâtre de remettre une lettre à un acteur pendant\\r\\n qu’il est en scène. Elle possédait à l’égard des choses qui peuvent ou ne peuvent pas se faire un code impérieux, abondant, subtil et intransigeant sur des distinctions insaisissables ou oiseuses (ce qui lui donnait l’apparence de ces\\r\\n lois antiques qui, à côté de prescriptions féroces comme de massacrer les enfants à la mamelle, défendent avec une délicatesse exagérée de faire bouillir le chevreau dans le lait de sa mère, ou de manger dans un animal le nerf de la\\r\\n cuisse). Ce code, si l’on en jugeait par l’entêtement soudain qu’elle mettait à ne pas vouloir faire certaines commissions que nous lui donnions, semblait avoir prévu des complexités sociales et des raffinements mondains tels que rien\\r\\n dans l’entourage de Françoise et dans sa vie de domestique de village n’avait pu les lui suggérer; et l’on était obligé de se dire qu’il y avait en elle un passé français très ancien, noble et mal compris, comme dans ces cités\\r\\n manufacturières où de vieux hôtels témoignent qu’il y eut jadis une vie de cour, et où les ouvriers d’une usine de produits chimiques travaillent au milieu de délicates sculptures qui représentent le miracle de saint Théophile ou les\\r\\n quatre fils Aymon. Dans le cas particulier, l’article du code à cause duquel il était peu probable que sauf le cas d’incendie Françoise allât déranger maman en présence de M. Swann pour un aussi petit personnage que moi, exprimait\\r\\n simplement le respect qu’elle professait non seulement pour les parents,—comme pour les morts, les prêtres et les rois,—mais encore pour l’étranger à qui on donne l’hospitalité, respect qui m’aurait peut-être touché dans un livre mais\\r\\n qui m’irritait toujours dans sa bouche, à cause du ton grave et attendri qu’elle prenait pour en parler, et davantage ce soir où le caractère sacré qu’elle conférait au dîner avait pour effet qu’elle refuserait d’en troubler la\\r\\n cérémonie. Mais pour mettre une chance de mon côté, je n’hésitai pas à mentir et à lui dire que ce n’était pas du tout moi qui avais voulu écrire à maman, mais que c’était maman qui, en me quittant, m’avait recommandé de ne pas\\r\\n oublier de lui envoyer une réponse relativement à un objet qu’elle m’avait prié de chercher; et elle serait certainement très fâchée si on ne lui remettait pas ce mot. Je pense que Françoise ne me crut pas, car, comme les hommes\\r\\n primitifs dont les sens étaient plus puissants que les nôtres, elle discernait immédiatement, à des signes insaisissables pour nous, toute vérité que nous voulions lui cacher; elle regarda pendant cinq minutes l’enveloppe comme si\\r\\n l’examen du papier et l’aspect de l’écriture allaient la renseigner sur la nature du contenu ou lui apprendre à quel article de son code elle devait se référer. Puis elle sortit d’un air résigné qui semblait signifier: «C’est-il pas\\r\\n malheureux pour des parents d’avoir un enfant pareil!» Elle revint au bout d’un moment me dire qu’on n’en était encore qu’à la glace, qu’il était impossible au maître d’hôtel de remettre la lettre en ce moment devant tout le monde,\\r\\n mais que, quand on serait aux rince-bouche, on trouverait le moyen de la faire passer à maman. Aussitôt mon anxiété tomba; maintenant ce n’était plus comme tout à l’heure pour jusqu’à demain que j’avais quitté ma mère, puisque mon\\r\\n petit mot allait, la fâchant sans doute (et doublement parce que ce manège me rendrait ridicule aux yeux de Swann), me faire du moins entrer invisible et ravi dans la même pièce qu’elle, allait lui parler de moi à l’oreille; puisque\\r\\n cette salle à manger interdite, hostile, où, il y avait un instant encore, la glace elle-même—le «granité»—et les rince-bouche me semblaient recéler des plaisirs malfaisants et mortellement tristes parce que maman les goûtait loin de\\r\\n moi, s’ouvrait à moi et, comme un fruit devenu doux qui brise son enveloppe, allait faire jaillir, projeter jusqu’à mon cœur enivré l’attention de maman tandis qu’elle lirait mes lignes. Maintenant je n’étais plus séparé d’elle; les\\r\\n barrières étaient tombées, un fil délicieux nous réunissait. Et puis, ce n’était pas tout: maman allait sans doute venir!\\r\\n </p>\\r\\n <p>\\r\\n L’angoisse que je venais d’éprouver, je pensais que Swann s’en serait bien moqué s’il avait lu ma lettre et en avait deviné le but; or, au contraire, comme je l’ai appris plus tard, une angoisse semblable fut le tourment de longues\\r\\n années de sa vie et personne, aussi bien que lui peut-être, n’aurait pu me comprendre; lui, cette angoisse qu’il y a à sentir l’être qu’on aime dans un lieu de plaisir où l’on n’est pas, où l’on ne peut pas le rejoindre, c’est l’amour\\r\\n qui la lui a fait connaître, l’amour auquel elle est en quelque sorte prédestinée, par lequel elle sera accaparée, spécialisée; mais quand, comme pour moi, elle est entrée en nous avant qu’il ait encore fait son apparition dans notre\\r\\n vie, elle flotte en l’attendant, vague et libre, sans affectation déterminée, au service un jour d’un sentiment, le lendemain d’un autre, tantôt de la tendresse filiale ou de l’amitié pour un camarade. Et la joie avec laquelle je fis\\r\\n mon premier apprentissage quand Françoise revint me dire que ma lettre serait remise, Swann l’avait bien connue aussi cette joie trompeuse que nous donne quelque ami, quelque parent de la femme que nous aimons, quand arrivant à\\r\\n l’hôtel ou au théâtre où elle se trouve, pour quelque bal, redoute, ou première où il va la retrouver, cet ami nous aperçoit errant dehors, attendant désespérément quelque occasion de communiquer avec elle. Il nous reconnaît, nous\\r\\n aborde familièrement, nous demande ce que nous faisons là. Et comme nous inventons que nous avons quelque chose d’urgent à dire à sa parente ou amie, il nous assure que rien n’est plus simple, nous fait entrer dans le vestibule et\\r\\n nous promet de nous l’envoyer avant cinq minutes. Que nous l’aimons—comme en ce moment j’aimais Françoise—, l’intermédiaire bien intentionné qui d’un mot vient de nous rendre supportable, humaine et presque propice la fête\\r\\n inconcevable, infernale, au sein de laquelle nous croyions que des tourbillons ennemis, pervers et délicieux entraînaient loin de nous, la faisant rire de nous, celle que nous aimons. Si nous en jugeons par lui, le parent qui nous a\\r\\n accosté et qui est lui aussi un des initiés des cruels mystères, les autres invités de la fête ne doivent rien avoir de bien démoniaque. Ces heures inaccessibles et suppliciantes où elle allait goûter des plaisirs inconnus, voici que\\r\\n par une brèche inespérée nous y pénétrons; voici qu’un des moments dont la succession les aurait composées, un moment aussi réel que les autres, même peut-être plus important pour nous, parce que notre maîtresse y est plus mêlée, nous\\r\\n nous le représentons, nous le possédons, nous y intervenons, nous l’avons créé presque: le moment où on va lui dire que nous sommes là, en bas. Et sans doute les autres moments de la fête ne devaient pas être d’une essence bien\\r\\n différente de celui-là, ne devaient rien avoir de plus délicieux et qui dût tant nous faire souffrir puisque l’ami bienveillant nous a dit: «Mais elle sera ravie de descendre! Cela lui fera beaucoup plus de plaisir de causer avec vous\\r\\n que de s’ennuyer là-haut.» Hélas! Swann en avait fait l’expérience, les bonnes intentions d’un tiers sont sans pouvoir sur une femme qui s’irrite de se sentir poursuivie jusque dans une fête par quelqu’un qu’elle n’aime pas. Souvent,\\r\\n l’ami redescend seul.\\r\\n </p>\\r\\n <p>\\r\\n Ma mère ne vint pas, et sans ménagements pour mon amour-propre (engagé à ce que la fable de la recherche dont elle était censée m’avoir prié de lui dire le résultat ne fût pas démentie) me fit dire par Françoise ces mots: «Il n’y a\\r\\n pas de réponse» que depuis j’ai si souvent entendu des concierges de «palaces» ou des valets de pied de tripots, rapporter à quelque pauvre fille qui s’étonne: «Comment, il n’a rien dit, mais c’est impossible! Vous avez pourtant bien\\r\\n remis ma lettre. C’est bien, je vais attendre encore.» Et—de même qu’elle assure invariablement n’avoir pas besoin du bec supplémentaire que le concierge veut allumer pour elle, et reste là, n’entendant plus que les rares propos sur\\r\\n le temps qu’il fait échangés entre le concierge et un chasseur qu’il envoie tout d’un coup en s’apercevant de l’heure, faire rafraîchir dans la glace la boisson d’un client,—ayant décliné l’offre de Françoise de me faire de la tisane\\r\\n ou de rester auprès de moi, je la laissai retourner à l’office, je me couchai et je fermai les yeux en tâchant de ne pas entendre la voix de mes parents qui prenaient le café au jardin. Mais au bout de quelques secondes, je sentis\\r\\n qu’en écrivant ce mot à maman, en m’approchant, au risque de la fâcher, si près d’elle que j’avais cru toucher le moment de la revoir, je m’étais barré la possibilité de m’endormir sans l’avoir revue, et les battements de mon cœur, de\\r\\n minute en minute devenaient plus douloureux parce que j’augmentais mon agitation en me prêchant un calme qui était l’acceptation de mon infortune. Tout à coup mon anxiété tomba, une félicité m’envahit comme quand un médicament\\r\\n puissant commence à agir et nous enlève une douleur: je venais de prendre la résolution de ne plus essayer de m’endormir sans avoir revu maman, de l’embrasser coûte que coûte, bien que ce fût avec la certitude d’être ensuite fâché\\r\\n pour longtemps avec elle, quand elle remonterait se coucher. Le calme qui résultait de mes angoisses finies me mettait dans un allégresse extraordinaire, non moins que l’attente, la soif et la peur du danger. J’ouvris la fenêtre sans\\r\\n bruit et m’assis au pied de mon lit; je ne faisais presque aucun mouvement afin qu’on ne m’entendît pas d’en bas. Dehors, les choses semblaient, elles aussi, figées en une muette attention à ne pas troubler le clair de lune, qui\\r\\n doublant et reculant chaque chose par l’extension devant elle de son reflet, plus dense et concret qu’elle-même, avait à la fois aminci et agrandi le paysage comme un plan replié jusque-là, qu’on développe. Ce qui avait besoin de\\r\\n bouger, quelque feuillage de marronnier, bougeait. Mais son frissonnement minutieux, total, exécuté jusque dans ses moindres nuances et ses dernières délicatesses, ne bavait pas sur le reste, ne se fondait pas avec lui, restait\\r\\n circonscrit. Exposés sur ce silence qui n’en absorbait rien, les bruits les plus éloignés, ceux qui devaient venir de jardins situés à l’autre bout de la ville, se percevaient détaillés avec un tel «fini» qu’ils semblaient ne devoir\\r\\n cet effet de lointain qu’à leur pianissimo, comme ces motifs en sourdine si bien exécutés par l’orchestre du Conservatoire que quoiqu’on n’en perde pas une note on croit les entendre cependant loin de la salle du concert et que tous\\r\\n les vieux abonnés,—les sœurs de ma grand’mère aussi quand Swann leur avait donné ses places,—tendaient l’oreille comme s’ils avaient écouté les progrès lointains d’une armée en marche qui n’aurait pas encore tourné la rue de Trévise.\\r\\n </p>\\r\\n <p>\\r\\n Je savais que le cas dans lequel je me mettais était de tous celui qui pouvait avoir pour moi, de la part de mes parents, les conséquences les plus graves, bien plus graves en vérité qu’un étranger n’aurait pu le supposer, de celles\\r\\n qu’il aurait cru que pouvaient produire seules des fautes vraiment honteuses. Mais dans l’éducation qu’on me donnait, l’ordre des fautes n’était pas le même que dans l’éducation des autres enfants et on m’avait habitué à placer avant\\r\\n toutes les autres (parce que sans doute il n’y en avait pas contre lesquelles j’eusse besoin d’être plus soigneusement gardé) celles dont je comprends maintenant que leur caractère commun est qu’on y tombe en cédant à une impulsion\\r\\n nerveuse. Mais alors on ne prononçait pas ce mot, on ne déclarait pas cette origine qui aurait pu me faire croire que j’étais excusable d’y succomber ou même peut-être incapable d’y résister. Mais je les reconnaissais bien à\\r\\n l’angoisse qui les précédait comme à la rigueur du châtiment qui les suivait; et je savais que celle que je venais de commettre était de la même famille que d’autres pour lesquelles j’avais été sévèrement puni, quoique infiniment plus\\r\\n grave. Quand j’irais me mettre sur le chemin de ma mère au moment où elle monterait se coucher, et qu’elle verrait que j’étais resté levé pour lui redire bonsoir dans le couloir, on ne me laisserait plus rester à la maison, on me\\r\\n mettrait au collège le lendemain, c’était certain. Eh bien! dusse-je me jeter par la fenêtre cinq minutes après, j’aimais encore mieux cela. Ce que je voulais maintenant c’était maman, c’était lui dire bonsoir, j’étais allé trop loin\\r\\n dans la voie qui menait à la réalisation de ce désir pour pouvoir rebrousser chemin.\\r\\n </p>\\r\\n <p>\\r\\n J’entendis les pas de mes parents qui accompagnaient Swann; et quand le grelot de la porte m’eut averti qu’il venait de partir, j’allai à la fenêtre. Maman demandait à mon père s’il avait trouvé la langouste bonne et si M. Swann avait\\r\\n repris de la glace au café et à la pistache. «Je l’ai trouvée bien quelconque, dit ma mère; je crois que la prochaine fois il faudra essayer d’un autre parfum.» «Je ne peux pas dire comme je trouve que Swann change, dit ma\\r\\n grand’tante, il est d’un vieux!» Ma grand’tante avait tellement l’habitude de voir toujours en Swann un même adolescent, qu’elle s’étonnait de le trouver tout à coup moins jeune que l’âge qu’elle continuait à lui donner. Et mes\\r\\n parents du reste commençaient à lui trouver cette vieillesse anormale, excessive, honteuse et méritée des célibataires, de tous ceux pour qui il semble que le grand jour qui n’a pas de lendemain soit plus long que pour les autres,\\r\\n parce que pour eux il est vide et que les moments s’y additionnent depuis le matin sans se diviser ensuite entre des enfants. «Je crois qu’il a beaucoup de soucis avec sa coquine de femme qui vit au su de tout Combray avec un certain\\r\\n monsieur de Charlus. C’est la fable de la ville.» Ma mère fit remarquer qu’il avait pourtant l’air bien moins triste depuis quelque temps. «Il fait aussi moins souvent ce geste qu’il a tout à fait comme son père de s’essuyer les yeux\\r\\n et de se passer la main sur le front. Moi je crois qu’au fond il n’aime plus cette femme.» «Mais naturellement il ne l’aime plus, répondit mon grand-père. J’ai reçu de lui il y a déjà longtemps une lettre à ce sujet, à laquelle je me\\r\\n suis empressé de ne pas me conformer, et qui ne laisse aucun doute sur ses sentiments au moins d’amour, pour sa femme. Hé bien! vous voyez, vous ne l’avez pas remercié pour l’Asti», ajouta mon grand-père en se tournant vers ses deux\\r\\n belles-sœurs. «Comment, nous ne l’avons pas remercié? je crois, entre nous, que je lui ai même tourné cela assez délicatement», répondit ma tante Flora. «Oui, tu as très bien arrangé cela: je t’ai admirée», dit ma tante Céline. «Mais\\r\\n toi tu as été très bien aussi.» «Oui j’étais assez fière de ma phrase sur les voisins aimables.» «Comment, c’est cela que vous appelez remercier! s’écria mon grand-père. J’ai bien entendu cela, mais du diable si j’ai cru que c’était\\r\\n pour Swann. Vous pouvez être sûres qu’il n’a rien compris.» «Mais voyons, Swann n’est pas bête, je suis certaine qu’il a apprécié. Je ne pouvais cependant pas lui dire le nombre de bouteilles et le prix du vin!» Mon père et ma mère\\r\\n restèrent seuls, et s’assirent un instant; puis mon père dit: «Hé bien! si tu veux, nous allons monter nous coucher.» «Si tu veux, mon ami, bien que je n’aie pas l’ombre de sommeil; ce n’est pas cette glace au café si anodine qui a pu\\r\\n pourtant me tenir si éveillée; mais j’aperçois de la lumière dans l’office et puisque la pauvre Françoise m’a attendue, je vais lui demander de dégrafer mon corsage pendant que tu vas te déshabiller.» Et ma mère ouvrit la porte\\r\\n treillagée du vestibule qui donnait sur l’escalier. Bientôt, je l’entendis qui montait fermer sa fenêtre. J’allai sans bruit dans le couloir; mon cœur battait si fort que j’avais de la peine à avancer, mais du moins il ne battait plus\\r\\n d’anxiété, mais d’épouvante et de joie. Je vis dans la cage de l’escalier la lumière projetée par la bougie de maman. Puis je la vis elle-même; je m’élançai. À la première seconde, elle me regarda avec étonnement, ne comprenant pas ce\\r\\n qui était arrivé. Puis sa figure prit une expression de colère, elle ne me disait même pas un mot, et en effet pour bien moins que cela on ne m’adressait plus la parole pendant plusieurs jours. Si maman m’avait dit un mot, ç’aurait\\r\\n été admettre qu’on pouvait me reparler et d’ailleurs cela peut-être m’eût paru plus terrible encore, comme un signe que devant la gravité du châtiment qui allait se préparer, le silence, la brouille, eussent été puérils. Une parole\\r\\n c’eût été le calme avec lequel on répond à un domestique quand on vient de décider de le renvoyer; le baiser qu’on donne à un fils qu’on envoie s’engager alors qu’on le lui aurait refusé si on devait se contenter d’être fâché deux\\r\\n jours avec lui. Mais elle entendit mon père qui montait du cabinet de toilette où il était allé se déshabiller et pour éviter la scène qu’il me ferait, elle me dit d’une voix entrecoupée par la colère: «Sauve-toi, sauve-toi, qu’au\\r\\n moins ton père ne t’ait vu ainsi attendant comme un fou!» Mais je lui répétais: «Viens me dire bonsoir», terrifié en voyant que le reflet de la bougie de mon père s’élevait déjà sur le mur, mais aussi usant de son approche comme d’un\\r\\n moyen de chantage et espérant que maman, pour éviter que mon père me trouvât encore là si elle continuait à refuser, allait me dire: «Rentre dans ta chambre, je vais venir.» Il était trop tard, mon père était devant nous. Sans le\\r\\n vouloir, je murmurai ces mots que personne n’entendit: «Je suis perdu!»\\r\\n </p>\\r\\n <p>\\r\\n Il n’en fut pas ainsi. Mon père me refusait constamment des permissions qui m’avaient été consenties dans les pactes plus larges octroyés par ma mère et ma grand’mère parce qu’il ne se souciait pas des «principes» et qu’il n’y avait\\r\\n pas avec lui de «Droit des gens». Pour une raison toute contingente, ou même sans raison, il me supprimait au dernier moment telle promenade si habituelle, si consacrée, qu’on ne pouvait m’en priver sans parjure, ou bien, comme il\\r\\n avait encore fait ce soir, longtemps avant l’heure rituelle, il me disait: «Allons, monte te coucher, pas d’explication!» Mais aussi, parce qu’il n’avait pas de principes (dans le sens de ma grand’mère), il n’avait pas à proprement\\r\\n parler d’intransigeance. Il me regarda un instant d’un air étonné et fâché, puis dès que maman lui eut expliqué en quelques mots embarrassés ce qui était arrivé, il lui dit: «Mais va donc avec lui, puisque tu disais justement que tu\\r\\n n’as pas envie de dormir, reste un peu dans sa chambre, moi je n’ai besoin de rien.» «Mais, mon ami, répondit timidement ma mère, que j’aie envie ou non de dormir, ne change rien à la chose, on ne peut pas habituer cet enfant...»\\r\\n «Mais il ne s’agit pas d’habituer, dit mon père en haussant les épaules, tu vois bien que ce petit a du chagrin, il a l’air désolé, cet enfant; voyons, nous ne sommes pas des bourreaux! Quand tu l’auras rendu malade, tu seras bien\\r\\n avancée! Puisqu’il y a deux lits dans sa chambre, dis donc à Françoise de te préparer le grand lit et couche pour cette nuit auprès de lui. Allons, bonsoir, moi qui ne suis pas si nerveux que vous, je vais me coucher.»\\r\\n </p>\\r\\n <p>\\r\\n On ne pouvait pas remercier mon père; on l’eût agacé par ce qu’il appelait des sensibleries. Je restai sans oser faire un mouvement; il était encore devant nous, grand, dans sa robe de nuit blanche sous le cachemire de l’Inde violet\\r\\n et rose qu’il nouait autour de sa tête depuis qu’il avait des névralgies, avec le geste d’Abraham dans la gravure d’après Benozzo Gozzoli que m’avait donnée M. Swann, disant à Sarah qu’elle a à se départir du côté d’Isaac. Il y a bien\\r\\n des années de cela. La muraille de l’escalier, où je vis monter le reflet de sa bougie n’existe plus depuis longtemps. En moi aussi bien des choses ont été détruites que je croyais devoir durer toujours et de nouvelles se sont\\r\\n édifiées donnant naissance à des peines et à des joies nouvelles que je n’aurais pu prévoir alors, de même que les anciennes me sont devenues difficiles à comprendre. Il y a bien longtemps aussi que mon père a cessé de pouvoir dire à\\r\\n maman: «Va avec le petit.» La possibilité de telles heures ne renaîtra jamais pour moi. Mais depuis peu de temps, je recommence à très bien percevoir si je prête l’oreille, les sanglots que j’eus la force de contenir devant mon père\\r\\n et qui n’éclatèrent que quand je me retrouvai seul avec maman. En réalité ils n’ont jamais cessé; et c’est seulement parce que la vie se tait maintenant davantage autour de moi que je les entends de nouveau, comme ces cloches de\\r\\n couvents que couvrent si bien les bruits de la ville pendant le jour qu’on les croirait arrêtées mais qui se remettent à sonner dans le silence du soir.\\r\\n </p>\\r\\n <p>\\r\\n Maman passa cette nuit-là dans ma chambre; au moment où je venais de commettre une faute telle que je m’attendais à être obligé de quitter la maison, mes parents m’accordaient plus que je n’eusse jamais obtenu d’eux comme récompense\\r\\n d’une belle action. Même à l’heure où elle se manifestait par cette grâce, la conduite de mon père à mon égard gardait ce quelque chose d’arbitraire et d’immérité qui la caractérisait et qui tenait à ce que généralement elle résultait\\r\\n plutôt de convenances fortuites que d’un plan prémédité. Peut-être même que ce que j’appelais sa sévérité, quand il m’envoyait me coucher, méritait moins ce nom que celle de ma mère ou ma grand’mère, car sa nature, plus différente en\\r\\n certains points de la mienne que n’était la leur, n’avait probablement pas deviné jusqu’ici combien j’étais malheureux tous les soirs, ce que ma mère et ma grand’mère savaient bien; mais elles m’aimaient assez pour ne pas consentir à\\r\\n m’épargner de la souffrance, elles voulaient m’apprendre à la dominer afin de diminuer ma sensibilité nerveuse et fortifier ma volonté. Pour mon père, dont l’affection pour moi était d’une autre sorte, je ne sais pas s’il aurait eu ce\\r\\n courage: pour une fois où il venait de comprendre que j’avais du chagrin, il avait dit à ma mère: «Va donc le consoler.» Maman resta cette nuit-là dans ma chambre et, comme pour ne gâter d’aucun remords ces heures si différentes de ce\\r\\n que j’avais eu le droit d’espérer, quand Françoise, comprenant qu’il se passait quelque chose d’extraordinaire en voyant maman assise près de moi, qui me tenait la main et me laissait pleurer sans me gronder, lui demanda: «Mais\\r\\n Madame, qu’a donc Monsieur à pleurer ainsi?» maman lui répondit: «Mais il ne sait pas lui-même, Françoise, il est énervé; préparez-moi vite le grand lit et montez vous coucher.» Ainsi, pour la première fois, ma tristesse n’était plus\\r\\n considérée comme une faute punissable mais comme un mal involontaire qu’on venait de reconnaître officiellement, comme un état nerveux dont je n’étais pas responsable; j’avais le soulagement de n’avoir plus à mêler de scrupules à\\r\\n l’amertume de mes larmes, je pouvais pleurer sans péché. Je n’étais pas non plus médiocrement fier vis-à-vis de Françoise de ce retour des choses humaines, qui, une heure après que maman avait refusé de monter dans ma chambre et\\r\\n m’avait fait dédaigneusement répondre que je devrais dormir, m’élevait à la dignité de grande personne et m’avait fait atteindre tout d’un coup à une sorte de puberté du chagrin, d’émancipation des larmes. J’aurais dû être heureux: je\\r\\n ne l’étais pas. Il me semblait que ma mère venait de me faire une première concession qui devait lui être douloureuse, que c’était une première abdication de sa part devant l’idéal qu’elle avait conçu pour moi, et que pour la première\\r\\n fois, elle, si courageuse, s’avouait vaincue. Il me semblait que si je venais de remporter une victoire c’était contre elle, que j’avais réussi comme auraient pu faire la maladie, des chagrins, ou l’âge, à détendre sa volonté, à faire\\r\\n fléchir sa raison et que cette soirée commençait une ère, resterait comme une triste date. Si j’avais osé maintenant, j’aurais dit à maman: «Non je ne veux pas, ne couche pas ici.» Mais je connaissais la sagesse pratique, réaliste\\r\\n comme on dirait aujourd’hui, qui tempérait en elle la nature ardemment idéaliste de ma grand’mère, et je savais que, maintenant que le mal était fait, elle aimerait mieux m’en laisser du moins goûter le plaisir calmant et ne pas\\r\\n déranger mon père. Certes, le beau visage de ma mère brillait encore de jeunesse ce soir-là où elle me tenait si doucement les mains et cherchait à arrêter mes larmes; mais justement il me semblait que cela n’aurait pas dû être, sa\\r\\n colère eût été moins triste pour moi que cette douceur nouvelle que n’avait pas connue mon enfance; il me semblait que je venais d’une main impie et secrète de tracer dans son âme une première ride et d’y faire apparaître un premier\\r\\n cheveu blanc. Cette pensée redoubla mes sanglots et alors je vis maman, qui jamais ne se laissait aller à aucun attendrissement avec moi, être tout d’un coup gagnée par le mien et essayer de retenir une envie de pleurer. Comme elle\\r\\n sentit que je m’en étais aperçu, elle me dit en riant: «Voilà mon petit jaunet, mon petit serin, qui va rendre sa maman aussi bêtasse que lui, pour peu que cela continue. Voyons, puisque tu n’as pas sommeil ni ta maman non plus, ne\\r\\n restons pas à nous énerver, faisons quelque chose, prenons un de tes livres.» Mais je n’en avais pas là. «Est-ce que tu aurais moins de plaisir si je sortais déjà les livres que ta grand’mère doit te donner pour ta fête? Pense bien:\\r\\n tu ne seras pas déçu de ne rien avoir après-demain?» J’étais au contraire enchanté et maman alla chercher un paquet de livres dont je ne pus deviner, à travers le papier qui les enveloppait, que la taille courte et large, mais qui,\\r\\n sous ce premier aspect, pourtant sommaire et voilé, éclipsaient déjà la boîte à couleurs du Jour de l’An et les vers à soie de l’an dernier. C’était la Mare au Diable, François le Champi, la Petite Fadette et les Maîtres Sonneurs. Ma\\r\\n grand’mère, ai-je su depuis, avait d’abord choisi les poésies de Musset, un volume de Rousseau et Indiana; car si elle jugeait les lectures futiles aussi malsaines que les bonbons et les pâtisseries, elles ne pensait pas que les\\r\\n grands souffles du génie eussent sur l’esprit même d’un enfant une influence plus dangereuse et moins vivifiante que sur son corps le grand air et le vent du large. Mais mon père l’ayant presque traitée de folle en apprenant les\\r\\n livres qu’elle voulait me donner, elle était retournée elle-même à Jouy-le-Vicomte chez le libraire pour que je ne risquasse pas de ne pas avoir mon cadeau (c’était un jour brûlant et elle était rentrée si souffrante que le médecin\\r\\n avait averti ma mère de ne pas la laisser se fatiguer ainsi) et elle s’était rabattue sur les quatre romans champêtres de George Sand. «Ma fille, disait-elle à maman, je ne pourrais me décider à donner à cet enfant quelque chose de\\r\\n mal écrit.»\\r\\n </p>\\r\\n <p>\\r\\n En réalité, elle ne se résignait jamais à rien acheter dont on ne pût tirer un profit intellectuel, et surtout celui que nous procurent les belles choses en nous apprenant à chercher notre plaisir ailleurs que dans les satisfactions\\r\\n du bien-être et de la vanité. Même quand elle avait à faire à quelqu’un un cadeau dit utile, quand elle avait à donner un fauteuil, des couverts, une canne, elle les cherchait «anciens», comme si leur longue désuétude ayant effacé\\r\\n leur caractère d’utilité, ils paraissaient plutôt disposés pour nous raconter la vie des hommes d’autrefois que pour servir aux besoins de la nôtre. Elle eût aimé que j’eusse dans ma chambre des photographies des monuments ou des\\r\\n paysages les plus beaux. Mais au moment d’en faire l’emplette, et bien que la chose représentée eût une valeur esthétique, elle trouvait que la vulgarité, l’utilité reprenaient trop vite leur place dans le mode mécanique de\\r\\n représentation, la photographie. Elle essayait de ruser et sinon d’éliminer entièrement la banalité commerciale, du moins de la réduire, d’y substituer pour la plus grande partie de l’art encore, d’y introduire comme plusieurs\\r\\n «épaisseurs» d’art: au lieu de photographies de la Cathédrale de Chartres, des Grandes Eaux de Saint-Cloud, du Vésuve, elle se renseignait auprès de Swann si quelque grand peintre ne les avait pas représentés, et préférait me donner\\r\\n des photographies de la Cathédrale de Chartres par Corot, des Grandes Eaux de Saint-Cloud par Hubert Robert, du Vésuve par Turner, ce qui faisait un degré d’art de plus. Mais si le photographe avait été écarté de la représentation du\\r\\n chef-d’œuvre ou de la nature et remplacé par un grand artiste, il reprenait ses droits pour reproduire cette interprétation même. Arrivée à l’échéance de la vulgarité, ma grand’mère tâchait de la reculer encore. Elle demandait à Swann\\r\\n si l’œuvre n’avait pas été gravée, préférant, quand c’était possible, des gravures anciennes et ayant encore un intérêt au delà d’elles-mêmes, par exemple celles qui représentent un chef-d’œuvre dans un état où nous ne pouvons plus le\\r\\n voir aujourd’hui (comme la gravure de la Cène de Léonard avant sa dégradation, par Morgan). Il faut dire que les résultats de cette manière de comprendre l’art de faire un cadeau ne furent pas toujours très brillants. L’idée que je\\r\\n pris de Venise d’après un dessin du Titien qui est censé avoir pour fond la lagune, était certainement beaucoup moins exacte que celle que m’eussent donnée de simples photographies. On ne pouvait plus faire le compte à la maison,\\r\\n quand ma grand’tante voulait dresser un réquisitoire contre ma grand’mère, des fauteuils offerts par elle à de jeunes fiancés ou à de vieux époux, qui, à la première tentative qu’on avait faite pour s’en servir, s’étaient\\r\\n immédiatement effondrés sous le poids d’un des destinataires. Mais ma grand’mère aurait cru mesquin de trop s’occuper de la solidité d’une boiserie où se distinguaient encore une fleurette, un sourire, quelquefois une belle\\r\\n imagination du passé. Même ce qui dans ces meubles répondait à un besoin, comme c’était d’une façon à laquelle nous ne sommes plus habitués, la charmait comme les vieilles manières de dire où nous voyons une métaphore, effacée, dans\\r\\n notre moderne langage, par l’usure de l’habitude. Or, justement, les romans champêtres de George Sand qu’elle me donnait pour ma fête, étaient pleins ainsi qu’un mobilier ancien, d’expressions tombées en désuétude et redevenues\\r\\n imagées, comme on n’en trouve plus qu’à la campagne. Et ma grand’mère les avait achetés de préférence à d’autres comme elle eût loué plus volontiers une propriété où il y aurait eu un pigeonnier gothique ou quelqu’une de ces vieilles\\r\\n choses qui exercent sur l’esprit une heureuse influence en lui donnant la nostalgie d’impossibles voyages dans le temps.\\r\\n </p>\\r\\n <p>\\r\\n Maman s’assit à côté de mon lit; elle avait pris François le Champi à qui sa couverture rougeâtre et son titre incompréhensible, donnaient pour moi une personnalité distincte et un attrait mystérieux. Je n’avais jamais lu encore de\\r\\n vrais romans. J’avais entendu dire que George Sand était le type du romancier. Cela me disposait déjà à imaginer dans François le Champi quelque chose d’indéfinissable et de délicieux. Les procédés de narration destinés à exciter la\\r\\n curiosité ou l’attendrissement, certaines façons de dire qui éveillent l’inquiétude et la mélancolie, et qu’un lecteur un peu instruit reconnaît pour communs à beaucoup de romans, me paraissaient simples—à moi qui considérais un livre\\r\\n nouveau non comme une chose ayant beaucoup de semblables, mais comme une personne unique, n’ayant de raison d’exister qu’en soi,—une émanation troublante de l’essence particulière à François le Champi. Sous ces événements si\\r\\n journaliers, ces choses si communes, ces mots si courants, je sentais comme une intonation, une accentuation étrange. L’action s’engagea; elle me parut d’autant plus obscure que dans ce temps-là, quand je lisais, je rêvassais souvent,\\r\\n pendant des pages entières, à tout autre chose. Et aux lacunes que cette distraction laissait dans le récit, s’ajoutait, quand c’était maman qui me lisait à haute voix, qu’elle passait toutes les scènes d’amour. Aussi tous les\\r\\n changements bizarres qui se produisent dans l’attitude respective de la meunière et de l’enfant et qui ne trouvent leur explication que dans les progrès d’un amour naissant me paraissaient empreints d’un profond mystère dont je me\\r\\n figurais volontiers que la source devait être dans ce nom inconnu et si doux de «Champi» qui mettait sur l’enfant, qui le portait sans que je susse pourquoi, sa couleur vive, empourprée et charmante. Si ma mère était une lectrice\\r\\n infidèle c’était aussi, pour les ouvrages où elle trouvait l’accent d’un sentiment vrai, une lectrice admirable par le respect et la simplicité de l’interprétation, par la beauté et la douceur du son. Même dans la vie, quand c’étaient\\r\\n des êtres et non des œuvres d’art qui excitaient ainsi son attendrissement ou son admiration, c’était touchant de voir avec quelle déférence elle écartait de sa voix, de son geste, de ses propos, tel éclat de gaîté qui eût pu faire\\r\\n mal à cette mère qui avait autrefois perdu un enfant, tel rappel de fête, d’anniversaire, qui aurait pu faire penser ce vieillard à son grand âge, tel propos de ménage qui aurait paru fastidieux à ce jeune savant. De même, quand elle\\r\\n lisait la prose de George Sand, qui respire toujours cette bonté, cette distinction morale que maman avait appris de ma grand’mère à tenir pour supérieures à tout dans la vie, et que je ne devais lui apprendre que bien plus tard à ne\\r\\n pas tenir également pour supérieures à tout dans les livres, attentive à bannir de sa voix toute petitesse, toute affectation qui eût pu empêcher le flot puissant d’y être reçu, elle fournissait toute la tendresse naturelle, toute\\r\\n l’ample douceur qu’elles réclamaient à ces phrases qui semblaient écrites pour sa voix et qui pour ainsi dire tenaient tout entières dans le registre de sa sensibilité. Elle retrouvait pour les attaquer dans le ton qu’il faut,\\r\\n l’accent cordial qui leur préexiste et les dicta, mais que les mots n’indiquent pas; grâce à lui elle amortissait au passage toute crudité dans les temps des verbes, donnait à l’imparfait et au passé défini la douceur qu’il y a dans\\r\\n la bonté, la mélancolie qu’il y a dans la tendresse, dirigeait la phrase qui finissait vers celle qui allait commencer, tantôt pressant, tantôt ralentissant la marche des syllabes pour les faire entrer, quoique leurs quantités fussent\\r\\n différentes, dans un rythme uniforme, elle insufflait à cette prose si commune une sorte de vie sentimentale et continue.\\r\\n </p>\\r\\n <p>\\r\\n Mes remords étaient calmés, je me laissais aller à la douceur de cette nuit où j’avais ma mère auprès de moi. Je savais qu’une telle nuit ne pourrait se renouveler; que le plus grand désir que j’eusse au monde, garder ma mère dans ma\\r\\n chambre pendant ces tristes heures nocturnes, était trop en opposition avec les nécessités de la vie et le vœu de tous, pour que l’accomplissement qu’on lui avait accordé ce soir pût être autre chose que factice et exceptionnel.\\r\\n Demain mes angoisses reprendraient et maman ne resterait pas là. Mais quand mes angoisses étaient calmées, je ne les comprenais plus; puis demain soir était encore lointain; je me disais que j’aurais le temps d’aviser, bien que ce\\r\\n temps-là ne pût m’apporter aucun pouvoir de plus, qu’il s’agissait de choses qui ne dépendaient pas de ma volonté et que seul me faisait paraître plus évitables l’intervalle qui les séparait encore de moi.\\r\\n </p>\\r\\n <p>...</p>\\r\\n <p>\\r\\n C’est ainsi que, pendant longtemps, quand, réveillé la nuit, je me ressouvenais de Combray, je n’en revis jamais que cette sorte de pan lumineux, découpé au milieu d’indistinctes ténèbres, pareil à ceux que l’embrasement d’un feu de\\r\\n Bengale ou quelque projection électrique éclairent et sectionnent dans un édifice dont les autres parties restent plongées dans la nuit: à la base assez large, le petit salon, la salle à manger, l’amorce de l’allée obscure par où\\r\\n arriverait M. Swann, l’auteur inconscient de mes tristesses, le vestibule où je m’acheminais vers la première marche de l’escalier, si cruel à monter, qui constituait à lui seul le tronc fort étroit de cette pyramide irrégulière; et,\\r\\n au faîte, ma chambre à coucher avec le petit couloir à porte vitrée pour l’entrée de maman; en un mot, toujours vu à la même heure, isolé de tout ce qu’il pouvait y avoir autour, se détachant seul sur l’obscurité, le décor strictement\\r\\n nécessaire (comme celui qu’on voit indiqué en tête des vieilles pièces pour les représentations en province), au drame de mon déshabillage; comme si Combray n’avait consisté qu’en deux étages reliés par un mince escalier, et comme\\r\\n s’il n’y avait jamais été que sept heures du soir. A vrai dire, j’aurais pu répondre à qui m’eût interrogé que Combray comprenait encore autre chose et existait à d’autres heures. Mais comme ce que je m’en serais rappelé m’eût été\\r\\n fourni seulement par la mémoire volontaire, la mémoire de l’intelligence, et comme les renseignements qu’elle donne sur le passé ne conservent rien de lui, je n’aurais jamais eu envie de songer à ce reste de Combray. Tout cela était\\r\\n en réalité mort pour moi.\\r\\n </p>\\r\\n <p>Mort à jamais? C’était possible.</p>\\r\\n <p>Il y a beaucoup de hasard en tout ceci, et un second hasard, celui de notre mort, souvent ne nous permet pas d’attendre longtemps les faveurs du premier.</p>\\r\\n <p>\\r\\n Je trouve très raisonnable la croyance celtique que les âmes de ceux que nous avons perdus sont captives dans quelque être inférieur, dans une bête, un végétal, une chose inanimée, perdues en effet pour nous jusqu’au jour, qui pour\\r\\n beaucoup ne vient jamais, où nous nous trouvons passer près de l’arbre, entrer en possession de l’objet qui est leur prison. Alors elles tressaillent, nous appellent, et sitôt que nous les avons reconnues, l’enchantement est brisé.\\r\\n Délivrées par nous, elles ont vaincu la mort et reviennent vivre avec nous.\\r\\n </p>\\r\\n <p>\\r\\n Il en est ainsi de notre passé. C’est peine perdue que nous cherchions à l’évoquer, tous les efforts de notre intelligence sont inutiles. Il est caché hors de son domaine et de sa portée, en quelque objet matériel (en la sensation que\\r\\n nous donnerait cet objet matériel), que nous ne soupçonnons pas. Cet objet, il dépend du hasard que nous le rencontrions avant de mourir, ou que nous ne le rencontrions pas.\\r\\n </p>\\r\\n <p>\\r\\n Il y avait déjà bien des années que, de Combray, tout ce qui n’était pas le théâtre et le drame de mon coucher, n’existait plus pour moi, quand un jour d’hiver, comme je rentrais à la maison, ma mère, voyant que j’avais froid, me\\r\\n proposa de me faire prendre, contre mon habitude, un peu de thé. Je refusai d’abord et, je ne sais pourquoi, me ravisai. Elle envoya chercher un de ces gâteaux courts et dodus appelés Petites Madeleines qui semblent avoir été moulés\\r\\n dans la valve rainurée d’une coquille de Saint-Jacques. Et bientôt, machinalement, accablé par la morne journée et la perspective d’un triste lendemain, je portai à mes lèvres une cuillerée du thé où j’avais laissé s’amollir un\\r\\n morceau de madeleine. Mais à l’instant même où la gorgée mêlée des miettes du gâteau toucha mon palais, je tressaillis, attentif à ce qui se passait d’extraordinaire en moi. Un plaisir délicieux m’avait envahi, isolé, sans la notion\\r\\n de sa cause. Il m’avait aussitôt rendu les vicissitudes de la vie indifférentes, ses désastres inoffensifs, sa brièveté illusoire, de la même façon qu’opère l’amour, en me remplissant d’une essence précieuse: ou plutôt cette essence\\r\\n n’était pas en moi, elle était moi. J’avais cessé de me sentir médiocre, contingent, mortel. D’où avait pu me venir cette puissante joie? Je sentais qu’elle était liée au goût du thé et du gâteau, mais qu’elle le dépassait infiniment,\\r\\n ne devait pas être de même nature. D’où venait-elle? Que signifiait-elle? Où l’appréhender? Je bois une seconde gorgée où je ne trouve rien de plus que dans la première, une troisième qui m’apporte un peu moins que la seconde. Il est\\r\\n temps que je m’arrête, la vertu du breuvage semble diminuer. Il est clair que la vérité que je cherche n’est pas en lui, mais en moi. Il l’y a éveillée, mais ne la connaît pas, et ne peut que répéter indéfiniment, avec de moins en\\r\\n moins de force, ce même témoignage que je ne sais pas interpréter et que je veux au moins pouvoir lui redemander et retrouver intact, à ma disposition, tout à l’heure, pour un éclaircissement décisif. Je pose la tasse et me tourne\\r\\n vers mon esprit. C’est à lui de trouver la vérité. Mais comment? Grave incertitude, toutes les fois que l’esprit se sent dépassé par lui-même; quand lui, le chercheur, est tout ensemble le pays obscur où il doit chercher et où tout\\r\\n son bagage ne lui sera de rien. Chercher? pas seulement: créer. Il est en face de quelque chose qui n’est pas encore et que seul il peut réaliser, puis faire entrer dans sa lumière.\\r\\n </p>\\r\\n <p>\\r\\n Et je recommence à me demander quel pouvait être cet état inconnu, qui n’apportait aucune preuve logique, mais l’évidence de sa félicité, de sa réalité devant laquelle les autres s’évanouissaient. Je veux essayer de le faire\\r\\n réapparaître. Je rétrograde par la pensée au moment où je pris la première cuillerée de thé. Je retrouve le même état, sans une clarté nouvelle. Je demande à mon esprit un effort de plus, de ramener encore une fois la sensation qui\\r\\n s’enfuit. Et pour que rien ne brise l’élan dont il va tâcher de la ressaisir, j’écarte tout obstacle, toute idée étrangère, j’abrite mes oreilles et mon attention contre les bruits de la chambre voisine. Mais sentant mon esprit qui se\\r\\n fatigue sans réussir, je le force au contraire à prendre cette distraction que je lui refusais, à penser à autre chose, à se refaire avant une tentative suprême. Puis une deuxième fois, je fais le vide devant lui, je remets en face de\\r\\n lui la saveur encore récente de cette première gorgée et je sens tressaillir en moi quelque chose qui se déplace, voudrait s’élever, quelque chose qu’on aurait désancré, à une grande profondeur; je ne sais ce que c’est, mais cela\\r\\n monte lentement; j’éprouve la résistance et j’entends la rumeur des distances traversées.\\r\\n </p>\\r\\n <p>\\r\\n Certes, ce qui palpite ainsi au fond de moi, ce doit être l’image, le souvenir visuel, qui, lié à cette saveur, tente de la suivre jusqu’à moi. Mais il se débat trop loin, trop confusément; à peine si je perçois le reflet neutre où se\\r\\n confond l’insaisissable tourbillon des couleurs remuées; mais je ne puis distinguer la forme, lui demander comme au seul interprète possible, de me traduire le témoignage de sa contemporaine, de son inséparable compagne, la saveur,\\r\\n lui demander de m’apprendre de quelle circonstance particulière, de quelle époque du passé il s’agit.\\r\\n </p>\\r\\n <p>\\r\\n Arrivera-t-il jusqu’à la surface de ma claire conscience, ce souvenir, l’instant ancien que l’attraction d’un instant identique est venue de si loin solliciter, émouvoir, soulever tout au fond de moi? Je ne sais. Maintenant je ne sens\\r\\n plus rien, il est arrêté, redescendu peut-être; qui sait s’il remontera jamais de sa nuit? Dix fois il me faut recommencer, me pencher vers lui. Et chaque fois la lâcheté qui nous détourne de toute tâche difficile, de toute œuvre\\r\\n important, m’a conseillé de laisser cela, de boire mon thé en pensant simplement à mes ennuis d’aujourd’hui, à mes désirs de demain qui se laissent remâcher sans peine.\\r\\n </p>\\r\\n <p>\\r\\n Et tout d’un coup le souvenir m’est apparu. Ce goût c’était celui du petit morceau de madeleine que le dimanche matin à Combray (parce que ce jour-là je ne sortais pas avant l’heure de la messe), quand j’allais lui dire bonjour dans\\r\\n sa chambre, ma tante Léonie m’offrait après l’avoir trempé dans son infusion de thé ou de tilleul. La vue de la petite madeleine ne m’avait rien rappelé avant que je n’y eusse goûté; peut-être parce que, en ayant souvent aperçu\\r\\n depuis, sans en manger, sur les tablettes des pâtissiers, leur image avait quitté ces jours de Combray pour se lier à d’autres plus récents; peut-être parce que de ces souvenirs abandonnés si longtemps hors de la mémoire, rien ne\\r\\n survivait, tout s’était désagrégé; les formes,—et celle aussi du petit coquillage de pâtisserie, si grassement sensuel, sous son plissage sévère et dévot—s’étaient abolies, ou, ensommeillées, avaient perdu la force d’expansion qui\\r\\n leur eût permis de rejoindre la conscience. Mais, quand d’un passé ancien rien ne subsiste, après la mort des êtres, après la destruction des choses, seules, plus frêles mais plus vivaces, plus immatérielles, plus persistantes, plus\\r\\n fidèles, l’odeur et la saveur restent encore longtemps, comme des âmes, à se rappeler, à attendre, à espérer, sur la ruine de tout le reste, à porter sans fléchir, sur leur gouttelette presque impalpable, l’édifice immense du\\r\\n souvenir.\\r\\n </p>\\r\\n <p>\\r\\n Et dès que j’eus reconnu le goût du morceau de madeleine trempé dans le tilleul que me donnait ma tante (quoique je ne susse pas encore et dusse remettre à bien plus tard de découvrir pourquoi ce souvenir me rendait si heureux),\\r\\n aussitôt la vieille maison grise sur la rue, où était sa chambre, vint comme un décor de théâtre s’appliquer au petit pavillon, donnant sur le jardin, qu’on avait construit pour mes parents sur ses derrières (ce pan tronqué que seul\\r\\n j’avais revu jusque-là); et avec la maison, la ville, la Place où on m’envoyait avant déjeuner, les rues où j’allais faire des courses depuis le matin jusqu’au soir et par tous les temps, les chemins qu’on prenait si le temps était\\r\\n beau. Et comme dans ce jeu où les Japonais s’amusent à tremper dans un bol de porcelaine rempli d’eau, de petits morceaux de papier jusque-là indistincts qui, à peine y sont-ils plongés s’étirent, se contournent, se colorent, se\\r\\n différencient, deviennent des fleurs, des maisons, des personnages consistants et reconnaissables, de même maintenant toutes les fleurs de notre jardin et celles du parc de M. Swann, et les nymphéas de la Vivonne, et les bonnes gens\\r\\n du village et leurs petits logis et l’église et tout Combray et ses environs, tout cela que prend forme et solidité, est sorti, ville et jardins, de ma tasse de thé.\\r\\n </p>\\r\\n <h3>II.</h3>\\r\\n <p>\\r\\n Combray de loin, à dix lieues à la ronde, vu du chemin de fer quand nous y arrivions la dernière semaine avant Pâques, ce n’était qu’une église résumant la ville, la représentant, parlant d’elle et pour elle aux lointains, et, quand\\r\\n on approchait, tenant serrés autour de sa haute mante sombre, en plein champ, contre le vent, comme une pastoure ses brebis, les dos laineux et gris des maisons rassemblées qu’un reste de remparts du moyen âge cernait çà et là d’un\\r\\n trait aussi parfaitement circulaire qu’une petite ville dans un tableau de primitif. A l’habiter, Combray était un peu triste, comme ses rues dont les maisons construites en pierres noirâtres du pays, précédées de degrés extérieurs,\\r\\n coiffées de pignons qui rabattaient l’ombre devant elles, étaient assez obscures pour qu’il fallût dès que le jour commençait à tomber relever les rideaux dans les «salles»; des rues aux graves noms de saints (desquels plusieurs\\r\\n seigneurs de Combray): rue Saint-Hilaire, rue Saint-Jacques où était la maison de ma tante, rue Sainte-Hildegarde, où donnait la grille, et rue du Saint-Esprit sur laquelle s’ouvrait la petite porte latérale de son jardin; et ces rues\\r\\n de Combray existent dans une partie de ma mémoire si reculée, peinte de couleurs si différentes de celles qui maintenant revêtent pour moi le monde, qu’en vérité elles me paraissent toutes, et l’église qui les dominait sur la Place,\\r\\n plus irréelles encore que les projections de la lanterne magique; et qu’à certains moments, il me semble que pouvoir encore traverser la rue Saint-Hilaire, pouvoir louer une chambre rue de l’Oiseau—à la vieille hôtellerie de l’Oiseau\\r\\n flesché, des soupiraux de laquelle montait une odeur de cuisine qui s’élève encore par moments en moi aussi intermittente et aussi chaude,—serait une entrée en contact avec l’Au-delà plus merveilleusement surnaturelle que de faire la\\r\\n connaissance de Golo et de causer avec Geneviève de Brabant.\\r\\n </p>\\r\\n <p>\\r\\n La cousine de mon grand-père,—ma grand’tante,—chez qui nous habitions, était la mère de cette tante Léonie qui, depuis la mort de son mari, mon oncle Octave, n’avait plus voulu quitter, d’abord Combray, puis à Combray sa maison, puis\\r\\n sa chambre, puis son lit et ne «descendait» plus, toujours couchée dans un état incertain de chagrin, de débilité physique, de maladie, d’idée fixe et de dévotion. Son appartement particulier donnait sur la rue Saint-Jacques qui\\r\\n aboutissait beaucoup plus loin au Grand-Pré (par opposition au Petit-Pré, verdoyant au milieu de la ville, entre trois rues), et qui, unie, grisâtre, avec les trois hautes marches de grès presque devant chaque porte, semblait comme un\\r\\n défilé pratiqué par un tailleur d’images gothiques à même la pierre où il eût sculpté une crèche ou un calvaire. Ma tante n’habitait plus effectivement que deux chambres contiguës, restant l’après-midi dans l’une pendant qu’on aérait\\r\\n l’autre. C’étaient de ces chambres de province qui,—de même qu’en certains pays des parties entières de l’air ou de la mer sont illuminées ou parfumées par des myriades de protozoaires que nous ne voyons pas,—nous enchantent des mille\\r\\n odeurs qu’y dégagent les vertus, la sagesse, les habitudes, toute une vie secrète, invisible, surabondante et morale que l’atmosphère y tient en suspens; odeurs naturelles encore, certes, et couleur du temps comme celles de la\\r\\n campagne voisine, mais déjà casanières, humaines et renfermées, gelée exquise industrieuse et limpide de tous les fruits de l’année qui ont quitté le verger pour l’armoire; saisonnières, mais mobilières et domestiques, corrigeant le\\r\\n piquant de la gelée blanche par la douceur du pain chaud, oisives et ponctuelles comme une horloge de village, flâneuses et rangées, insoucieuses et prévoyantes, lingères, matinales, dévotes, heureuses d’une paix qui n’apporte qu’un\\r\\n surcroît d’anxiété et d’un prosaïsme qui sert de grand réservoir de poésie à celui qui la traverse sans y avoir vécu. L’air y était saturé de la fine fleur d’un silence si nourricier, si succulent que je ne m’y avançais qu’avec une\\r\\n sorte de gourmandise, surtout par ces premiers matins encore froids de la semaine de Pâques où je le goûtais mieux parce que je venais seulement d’arriver à Combray: avant que j’entrasse souhaiter le bonjour à ma tante on me faisait\\r\\n attendre un instant, dans la première pièce où le soleil, d’hiver encore, était venu se mettre au chaud devant le feu, déjà allumé entre les deux briques et qui badigeonnait toute la chambre d’une odeur de suie, en faisait comme un de\\r\\n ces grands «devants de four» de campagne, ou de ces manteaux de cheminée de châteaux, sous lesquels on souhaite que se déclarent dehors la pluie, la neige, même quelque catastrophe diluvienne pour ajouter au confort de la réclusion la\\r\\n poésie de l’hivernage; je faisais quelques pas du prie-Dieu aux fauteuils en velours frappé, toujours revêtus d’un appui-tête au crochet; et le feu cuisant comme une pâte les appétissantes odeurs dont l’air de la chambre était tout\\r\\n grumeleux et qu’avait déjà fait travailler et «lever» la fraîcheur humide et ensoleillée du matin, il les feuilletait, les dorait, les godait, les boursouflait, en faisant un invisible et palpable gâteau provincial, un immense\\r\\n «chausson» où, à peine goûtés les arômes plus croustillants, plus fins, plus réputés, mais plus secs aussi du placard, de la commode, du papier à ramages, je revenais toujours avec une convoitise inavouée m’engluer dans l’odeur\\r\\n médiane, poisseuse, fade, indigeste et fruitée de couvre-lit à fleurs.\\r\\n </p>\\r\\n <p>\\r\\n Dans la chambre voisine, j’entendais ma tante qui causait toute seule à mi-voix. Elle ne parlait jamais qu’assez bas parce qu’elle croyait avoir dans la tête quelque chose de cassé et de flottant qu’elle eût déplacé en parlant trop\\r\\n fort, mais elle ne restait jamais longtemps, même seule, sans dire quelque chose, parce qu’elle croyait que c’était salutaire pour sa gorge et qu’en empêchant le sang de s’y arrêter, cela rendrait moins fréquents les étouffements et\\r\\n les angoisses dont elle souffrait; puis, dans l’inertie absolu où elle vivait, elle prêtait à ses moindres sensations une importance extraordinaire; elle les douait d’une motilité qui lui rendait difficile de les garder pour elle, et\\r\\n à défaut de confident à qui les communiquer, elle se les annonçait à elle-même, en un perpétuel monologue qui était sa seule forme d’activité. Malheureusement, ayant pris l’habitude de penser tout haut, elle ne faisait pas toujours\\r\\n attention à ce qu’il n’y eût personne dans la chambre voisine, et je l’entendais souvent se dire à elle-même: «Il faut que je me rappelle bien que je n’ai pas dormi» (car ne jamais dormir était sa grande prétention dont notre langage\\r\\n à tous gardait le respect et la trace: le matin Françoise ne venait pas «l’éveiller», mais «entrait» chez elle; quand ma tante voulait faire un somme dans la journée, on disait qu’elle voulait «réfléchir» ou «reposer»; et quand il lui\\r\\n arrivait de s’oublier en causant jusqu’à dire: «Ce qui m’a réveillée» ou «j’ai rêvé que», elle rougissait et se reprenait au plus vite).\\r\\n </p>\\r\\n <p>\\r\\n Au bout d’un moment, j’entrais l’embrasser; Françoise faisait infuser son thé; ou, si ma tante se sentait agitée, elle demandait à la place sa tisane et c’était moi qui étais chargé de faire tomber du sac de pharmacie dans une\\r\\n assiette la quantité de tilleul qu’il fallait mettre ensuite dans l’eau bouillante. Le dessèchement des tiges les avait incurvées en un capricieux treillage dans les entrelacs duquel s’ouvraient les fleurs pâles, comme si un peintre\\r\\n les eût arrangées, les eût fait poser de la façon la plus ornementale. Les feuilles, ayant perdu ou changé leur aspect, avaient l’air des choses les plus disparates, d’une aile transparente de mouche, de l’envers blanc d’une\\r\\n étiquette, d’un pétale de rose, mais qui eussent été empilées, concassées ou tressées comme dans la confection d’un nid. Mille petits détails inutiles,—charmante prodigalité du pharmacien,—qu’on eût supprimés dans une préparation\\r\\n factice, me donnaient, comme un livre où on s’émerveille de rencontrer le nom d’une personne de connaissance, le plaisir de comprendre que c’était bien des tiges de vrais tilleuls, comme ceux que je voyais avenue de la Gare,\\r\\n modifiées, justement parce que c’étaient non des doubles, mais elles-même et qu’elles avaient vieilli. Et chaque caractère nouveau n’y étant que la métamorphose d’un caractère ancien, dans de petites boules grises je reconnaissais les\\r\\n boutons verts qui ne sont pas venus à terme; mais surtout l’éclat rose, lunaire et doux qui faisait se détacher les fleurs dans la forêt fragile des tiges où elles étaient suspendues comme de petites roses d’or,—signe, comme la lueur\\r\\n qui révèle encore sur une muraille la place d’une fresque effacée, de la différence entre les parties de l’arbre qui avaient été «en couleur» et celles qui ne l’avaient pas été—me montrait que ces pétales étaient bien ceux qui avant\\r\\n de fleurir le sac de pharmacie avaient embaumé les soirs de printemps. Cette flamme rose de cierge, c’était leur couleur encore, mais à demi éteinte et assoupie dans cette vie diminuée qu’était la leur maintenant et qui est comme le\\r\\n crépuscule des fleurs. Bientôt ma tante pouvait tremper dans l’infusion bouillante dont elle savourait le goût de feuille morte ou de fleur fanée une petite madeleine dont elle me tendait un morceau quand il était suffisamment amolli.\\r\\n </p>\\r\\n <p>\\r\\n D’un côté de son lit était une grande commode jaune en bois de citronnier et une table qui tenait à la fois de l’officine et du maître-autel, où, au-dessus d’une statuette de la Vierge et d’une bouteille de Vichy-Célestins, on\\r\\n trouvait des livres de messe et des ordonnances de médicaments, tous ce qu’il fallait pour suivre de son lit les offices et son régime, pour ne manquer l’heure ni de la pepsine, ni des vêpres. De l’autre côté, son lit longeait la\\r\\n fenêtre, elle avait la rue sous les yeux et y lisait du matin au soir, pour se désennuyer, à la façon des princes persans, la chronique quotidienne mais immémoriale de Combray, qu’elle commentait ensuite avec Françoise.\\r\\n </p>\\r\\n <p>\\r\\n Je n’étais pas avec ma tante depuis cinq minutes, qu’elle me renvoyait par peur que je la fatigue. Elle tendait à mes lèvres son triste front pâle et fade sur lequel, à cette heure matinale, elle n’avait pas encore arrangé ses faux\\r\\n cheveux, et où les vertèbres transparaissaient comme les pointes d’une couronne d’épines ou les grains d’un rosaire, et elle me disait: «Allons, mon pauvre enfant, va-t’en, va te préparer pour la messe; et si en bas tu rencontres\\r\\n Françoise, dis-lui de ne pas s’amuser trop longtemps avec vous, qu’elle monte bientôt voir si je n’ai besoin de rien.»\\r\\n </p>\\r\\n <p>\\r\\n Françoise, en effet, qui était depuis des années a son service et ne se doutait pas alors qu’elle entrerait un jour tout à fait au nôtre délaissait un peu ma tante pendant les mois où nous étions là. Il y avait eu dans mon enfance,\\r\\n avant que nous allions à Combray, quand ma tante Léonie passait encore l’hiver à Paris chez sa mère, un temps où je connaissais si peu Françoise que, le 1<sup>er</sup> janvier, avant d’entrer chez ma grand’tante, ma mère me mettait\\r\\n dans la main une pièce de cinq francs et me disait: «Surtout ne te trompe pas de personne. Attends pour donner que tu m’entendes dire: «Bonjour Françoise»; en même temps je te toucherai légèrement le bras. A peine arrivions-nous dans\\r\\n l’obscure antichambre de ma tante que nous apercevions dans l’ombre, sous les tuyaux d’un bonnet éblouissant, raide et fragile comme s’il avait été de sucre filé, les remous concentriques d’un sourire de reconnaissance anticipé.\\r\\n C’était Françoise, immobile et debout dans l’encadrement de la petite porte du corridor comme une statue de sainte dans sa niche. Quand on était un peu habitué à ces ténèbres de chapelle, on distinguait sur son visage l’amour\\r\\n désintéressé de l’humanité, le respect attendri pour les hautes classes qu’exaltait dans les meilleures régions de son cœur l’espoir des étrennes. Maman me pinçait le bras avec violence et disait d’une voix forte: «Bonjour Françoise.»\\r\\n A ce signal mes doigts s’ouvraient et je lâchais la pièce qui trouvait pour la recevoir une main confuse, mais tendue. Mais depuis que nous allions à Combray je ne connaissais personne mieux que Françoise; nous étions ses préférés,\\r\\n elle avait pour nous, au moins pendant les premières années, avec autant de considération que pour ma tante, un goût plus vif, parce que nous ajoutions, au prestige de faire partie de la famille (elle avait pour les liens invisibles\\r\\n que noue entre les membres d’une famille la circulation d’un même sang, autant de respect qu’un tragique grec), le charme de n’être pas ses maîtres habituels. Aussi, avec quelle joie elle nous recevait, nous plaignant de n’avoir pas\\r\\n encore plus beau temps, le jour de notre arrivée, la veille de Pâques, où souvent il faisait un vent glacial, quand maman lui demandait des nouvelles de sa fille et de ses neveux, si son petit-fils était gentil, ce qu’on comptait\\r\\n faire de lui, s’il ressemblerait à sa grand’mère.\\r\\n </p>\\r\\n <p>Et quand il n’y avait plus de monde là, maman qui savait que Françoise pleurait encore ses parents morts depuis des années, lui parlait d’eux avec douceur, lui demandait mille détails sur ce qu’avait été leur vie.</p>\\r\\n <p>\\r\\n Elle avait deviné que Françoise n’aimait pas son gendre et qu’il lui gâtait le plaisir qu’elle avait à être avec sa fille, avec qui elle ne causait pas aussi librement quand il était là. Aussi, quand Françoise allait les voir, à\\r\\n quelques lieues de Combray, maman lui disait en souriant: «N’est-ce pas Françoise, si Julien a été obligé de s’absenter et si vous avez Marguerite à vous toute seule pour toute la journée, vous serez désolée, mais vous vous ferez une\\r\\n raison?» Et Françoise disait en riant: «Madame sait tout; madame est pire que les rayons X (elle disait x avec une difficulté affectée et un sourire pour se railler elle-même, ignorante, d’employer ce terme savant), qu’on a fait venir\\r\\n pour M<sup>me</sup> Octave et qui voient ce que vous avez dans le cœur», et disparaissait, confuse qu’on s’occupât d’elle, peut-être pour qu’on ne la vît pas pleurer; maman était la première personne qui lui donnât cette douce émotion\\r\\n de sentir que sa vie, ses bonheurs, ses chagrins de paysanne pouvaient présenter de l’intérêt, être un motif de joie ou de tristesse pour une autre qu’elle-même. Ma tante se résignait à se priver un peu d’elle pendant notre séjour,\\r\\n sachant combien ma mère appréciait le service de cette bonne si intelligente et active, qui était aussi belle dès cinq heures du matin dans sa cuisine, sous son bonnet dont le tuyautage éclatant et fixe avait l’air d’être en biscuit,\\r\\n que pour aller à la grand’messe; qui faisait tout bien, travaillant comme un cheval, qu’elle fût bien portante ou non, mais sans bruit, sans avoir l’air de rien faire, la seule des bonnes de ma tante qui, quand maman demandait de\\r\\n l’eau chaude ou du café noir, les apportait vraiment bouillants; elle était un de ces serviteurs qui, dans une maison, sont à la fois ceux qui déplaisent le plus au premier abord à un étranger, peut-être parce qu’ils ne prennent pas\\r\\n la peine de faire sa conquête et n’ont pas pour lui de prévenance, sachant très bien qu’ils n’ont aucun besoin de lui, qu’on cesserait de le recevoir plutôt que de les renvoyer; et qui sont en revanche ceux à qui tiennent le plus les\\r\\n maîtres qui ont éprouvé leur capacités réelles, et ne se soucient pas de cet agrément superficiel, de ce bavardage servile qui fait favorablement impression à un visiteur, mais qui recouvre souvent une inéducable nullité.\\r\\n </p>\\r\\n <p>\\r\\n Quand Françoise, après avoir veillé à ce que mes parents eussent tout ce qu’il leur fallait, remontait une première fois chez ma tante pour lui donner sa pepsine et lui demander ce qu’elle prendrait pour déjeuner, il était bien rare\\r\\n qu’il ne fallût pas donner déjà son avis ou fournir des explications sur quelque événement d’importance:\\r\\n </p>\\r\\n <p>\\r\\n —«Françoise, imaginez-vous que M<sup>me</sup> Goupil est passée plus d’un quart d’heure en retard pour aller chercher sa sœur; pour peu qu’elle s’attarde sur son chemin cela ne me surprendrait point qu’elle arrive après l’élévation.»\\r\\n </p>\\r\\n <p>—«Hé! il n’y aurait rien d’étonnant», répondait Françoise.</p>\\r\\n <p>\\r\\n —«Françoise, vous seriez venue cinq minutes plus tôt, vous auriez vu passer M<sup>me</sup> Imbert qui tenait des asperges deux fois grosses comme celles de la mère Callot; tâchez donc de savoir par sa bonne où elle les a eues. Vous\\r\\n qui, cette année, nous mettez des asperges à toutes les sauces, vous auriez pu en prendre de pareilles pour nos voyageurs.»\\r\\n </p>\\r\\n <p>—«Il n’y aurait rien d’étonnant qu’elles viennent de chez M. le Curé», disait Françoise.</p>\\r\\n <p>\\r\\n —«Ah! je vous crois bien, ma pauvre Françoise, répondait ma tante en haussant les épaules, chez M. le Curé! Vous savez bien qu’il ne fait pousser que de petites méchantes asperges de rien. Je vous dis que celles-là étaient grosses\\r\\n comme le bras. Pas comme le vôtre, bien sûr, mais comme mon pauvre bras qui a encore tant maigri cette année.»\\r\\n </p>\\r\\n <p>—«Françoise, vous n’avez pas entendu ce carillon qui m’a cassé la tête?»</p>\\r\\n <p>—«Non, madame Octave.»</p>\\r\\n <p>\\r\\n —«Ah! ma pauvre fille, il faut que vous l’ayez solide votre tête, vous pouvez remercier le Bon Dieu. C’était la Maguelone qui était venue chercher le docteur Piperaud. Il est ressorti tout de suite avec elle et ils ont tourné par la\\r\\n rue de l’Oiseau. Il faut qu’il y ait quelque enfant de malade.»\\r\\n </p>\\r\\n <p>—«Eh! là, mon Dieu», soupirait Françoise, qui ne pouvait pas entendre parler d’un malheur arrivé à un inconnu, même dans une partie du monde éloignée, sans commencer à gémir.</p>\\r\\n <p>\\r\\n —«Françoise, mais pour qui donc a-t-on sonné la cloche des morts? Ah! mon Dieu, ce sera pour M<sup>me</sup> Rousseau. Voilà-t-il pas que j’avais oublié qu’elle a passé l’autre nuit. Ah! il est temps que le Bon Dieu me rappelle, je ne\\r\\n sais plus ce que j’ai fait de ma tête depuis la mort de mon pauvre Octave. Mais je vous fais perdre votre temps, ma fille.»\\r\\n </p>\\r\\n <p>—«Mais non, madame Octave, mon temps n’est pas si cher; celui qui l’a fait ne nous l’a pas vendu. Je vas seulement voir si mon feu ne s’éteint pas.»</p>\\r\\n <p>\\r\\n Ainsi Françoise et ma tante appréciaient-elles ensemble au cours de cette séance matinale, les premiers événements du jour. Mais quelquefois ces événements revêtaient un caractère si mystérieux et si grave que ma tante sentait qu’elle\\r\\n ne pourrait pas attendre le moment où Françoise monterait, et quatre coups de sonnette formidables retentissaient dans la maison.\\r\\n </p>\\r\\n <p>—«Mais, madame Octave, ce n’est pas encore l’heure de la pepsine, disait Françoise. Est-ce que vous vous êtes senti une faiblesse?»</p>\\r\\n <p>\\r\\n —«Mais non, Françoise, disait ma tante, c’est-à-dire si, vous savez bien que maintenant les moments où je n’ai pas de faiblesse sont bien rares; un jour je passerai comme M<sup>me</sup> Rousseau sans avoir eu le temps de me\\r\\n reconnaître; mais ce n’est pas pour cela que je sonne. Croyez-vous pas que je viens de voir comme je vous vois M<sup>me</sup> Goupil avec une fillette que je ne connais point. Allez donc chercher deux sous de sel chez Camus. C’est\\r\\n bien rare si Théodore ne peut pas vous dire qui c’est.»\\r\\n </p>\\r\\n <p>—«Mais ça sera la fille à M. Pupin», disait Françoise qui préférait s’en tenir à une explication immédiate, ayant été déjà deux fois depuis le matin chez Camus.</p>\\r\\n <p>—«La fille à M. Pupin! Oh! je vous crois bien, ma pauvre Françoise! Avec cela que je ne l’aurais pas reconnue?»</p>\\r\\n <p>—«Mais je ne veux pas dire la grande, madame Octave, je veux dire la gamine, celle qui est en pension à Jouy. Il me ressemble de l’avoir déjà vue ce matin.»</p>\\r\\n <p>\\r\\n —«Ah! à moins de ça, disait ma tante. Il faudrait qu’elle soit venue pour les fêtes. C’est cela! Il n’y a pas besoin de chercher, elle sera venue pour les fêtes. Mais alors nous pourrions bien voir tout à l’heure M<sup>me</sup>\\r\\n Sazerat venir sonner chez sa sœur pour le déjeuner. Ce sera ça! J’ai vu le petit de chez Galopin qui passait avec une tarte! Vous verrez que la tarte allait chez M<sup>me</sup> Goupil.»\\r\\n </p>\\r\\n <p>\\r\\n —«Dès l’instant que M<sup>me</sup> Goupil a de la visite, madame Octave, vous n’allez pas tarder à voir tout son monde rentrer pour le déjeuner, car il commence à ne plus être de bonne heure», disait Françoise qui, pressé de\\r\\n redescendre s’occuper du déjeuner, n’était pas fâchée de laisser à ma tante cette distraction en perspective.\\r\\n </p>\\r\\n <p>\\r\\n —«Oh! pas avant midi, répondait ma tante d’un ton résigné, tout en jetant sur la pendule un coup d’œil inquiet, mais furtif pour ne pas laisser voir qu’elle, qui avait renoncé à tout, trouvait pourtant, à apprendre que M<sup>me</sup>\\r\\n Goupil avait à déjeuner, un plaisir aussi vif, et qui se ferait malheureusement attendre encore un peu plus d’une heure. Et encore cela tombera pendant mon déjeuner!» ajouta-t-elle à mi-voix pour elle-même. Son déjeuner lui était une\\r\\n distraction suffisante pour qu’elle n’en souhaitât pas une autre en même temps. «Vous n’oublierez pas au moins de me donner mes œufs à la crème dans une assiette plate?» C’étaient les seules qui fussent ornées de sujets, et ma tante\\r\\n s’amusait à chaque repas à lire la légende de celle qu’on lui servait ce jour-là. Elle mettait ses lunettes, déchiffrait: Alibaba et quarante voleurs, Aladin ou la Lampe merveilleuse, et disait en souriant: Très bien, très bien.\\r\\n </p>\\r\\n <p>—«Je serais bien allée chez Camus...» disait Françoise en voyant que ma tante ne l’y enverrait plus.</p>\\r\\n <p>—«Mais non, ce n’est plus la peine, c’est sûrement M<sup>lle</sup> Pupin. Ma pauvre Françoise, je regrette de vous avoir fait monter pour rien.»</p>\\r\\n <p>\\r\\n Mais ma tante savait bien que ce n’était pas pour rien qu’elle avait sonné Françoise, car, à Combray, une personne «qu’on ne connaissait point» était un être aussi peu croyable qu’un dieu de la mythologie, et de fait on ne se\\r\\n souvenait pas que, chaque fois que s’était produite, dans la rue de Saint-Esprit ou sur la place, une de ces apparitions stupéfiantes, des recherches bien conduites n’eussent pas fini par réduire le personnage fabuleux aux proportions\\r\\n d’une «personne qu’on connaissait», soit personnellement, soit abstraitement, dans son état civil, en tant qu’ayant tel degré de parenté avec des gens de Combray. C’était le fils de M<sup>me</sup> Sauton qui rentrait du service, la\\r\\n nièce de l’abbé Perdreau qui sortait de couvent, le frère du curé, percepteur à Châteaudun qui venait de prendre sa retraite ou qui était venu passer les fêtes. On avait eu en les apercevant l’émotion de croire qu’il y avait à Combray\\r\\n des gens qu’on ne connaissait point simplement parce qu’on ne les avait pas reconnus ou identifiés tout de suite. Et pourtant, longtemps à l’avance, M<sup>me</sup> Sauton et le curé avaient prévenu qu’ils attendaient leurs\\r\\n «voyageurs». Quand le soir, je montais, en rentrant, raconter notre promenade à ma tante, si j’avais l’imprudence de lui dire que nous avions rencontré près du Pont-Vieux, un homme que mon grand-père ne connaissait pas: «Un homme que\\r\\n grand-père ne connaissait point, s’écriait elle. Ah! je te crois bien!» Néanmoins un peu émue de cette nouvelle, elle voulait en avoir le cœur net, mon grand-père était mandé. «Qui donc est-ce que vous avez rencontré près du\\r\\n Pont-Vieux, mon oncle? un homme que vous ne connaissiez point?»—«Mais si, répondait mon grand-père, c’était Prosper le frère du jardinier de M<sup>me</sup>\\r\\n Bouillebœuf.»—«Ah! bien», disait ma tante, tranquillisée et un peu rouge; haussant les épaules avec un sourire ironique, elle ajoutait: «Aussi il me disait que vous aviez rencontré un homme que vous ne connaissiez point!» Et on me\\r\\n recommandait d’être plus circonspect une autre fois et de ne plus agiter ainsi ma tante par des paroles irréfléchies. On connaissait tellement bien tout le monde, à Combray, bêtes et gens, que si ma tante avait vu par hasard passer un\\r\\n chien «qu’elle ne connaissait point», elle ne cessait d’y penser et de consacrer à ce fait incompréhensible ses talents d’induction et ses heures de liberté.\\r\\n </p>\\r\\n <p>—«Ce sera le chien de M<sup>me</sup> Sazerat», disait Françoise, sans grande conviction, mais dans un but d’apaisement et pour que ma tante ne se «fende pas la tête.»</p>\\r\\n <p>—«Comme si je ne connaissais pas le chien de M<sup>me</sup> Sazerat!» répondait ma tante dont l’esprit critique n’admettait pas si facilement un fait.</p>\\r\\n <p>—«Ah! ce sera le nouveau chien que M. Galopin a rapporté de Lisieux.»</p>\\r\\n <p>—«Ah! à moins de ça.»</p>\\r\\n <p>\\r\\n —«Il paraît que c’est une bête bien affable», ajoutait Françoise qui tenait le renseignement de Théodore, «spirituelle comme une personne, toujours de bonne humeur, toujours aimable, toujours quelque chose de gracieux. C’est rare\\r\\n qu’une bête qui n’a que cet âge-là soit déjà si galante. Madame Octave, il va falloir que je vous quitte, je n’ai pas le temps de m’amuser, voilà bientôt dix heures, mon fourneau n’est seulement pas éclairé, et j’ai encore à plumer\\r\\n mes asperges.»\\r\\n </p>\\r\\n <p>—«Comment, Françoise, encore des asperges! mais c’est une vraie maladie d’asperges que vous avez cette année, vous allez en fatiguer nos Parisiens!»</p>\\r\\n <p>—«Mais non, madame Octave, ils aiment bien ça. Ils rentreront de l’église avec de l’appétit et vous verrez qu’ils ne les mangeront pas avec le dos de la cuiller.»</p>\\r\\n <p>—«Mais à l’église, ils doivent y être déjà; vous ferez bien de ne pas perdre de temps. Allez surveiller votre déjeuner.»</p>\\r\\n <p>\\r\\n Pendant que ma tante devisait ainsi avec Françoise, j’accompagnais mes parents à la messe. Que je l’aimais, que je la revois bien, notre Église! Son vieux porche par lequel nous entrions, noir, grêlé comme une écumoire, était dévié et\\r\\n profondément creusé aux angles (de même que le bénitier où il nous conduisait) comme si le doux effleurement des mantes des paysannes entrant à l’église et de leurs doigts timides prenant de l’eau bénite, pouvait, répété pendant des\\r\\n siècles, acquérir une force destructive, infléchir la pierre et l’entailler de sillons comme en trace la roue des carrioles dans la borne contre laquelle elle bute tous les jours. Ses pierres tombales, sous lesquelles la noble\\r\\n poussière des abbés de Combray, enterrés là, faisait au chœur comme un pavage spirituel, n’étaient plus elles-mêmes de la matière inerte et dure, car le temps les avait rendues douces et fait couler comme du miel hors des limites de\\r\\n leur propre équarrissure qu’ici elles avaient dépassées d’un flot blond, entraînant à la dérive une majuscule gothique en fleurs, noyant les violettes blanches du marbre; et en deçà desquelles, ailleurs, elles s’étaient résorbées,\\r\\n contractant encore l’elliptique inscription latine, introduisant un caprice de plus dans la disposition de ces caractères abrégés, rapprochant deux lettres d’un mot dont les autres avaient été démesurément distendues. Ses vitraux ne\\r\\n chatoyaient jamais tant que les jours où le soleil se montrait peu, de sorte que fît-il gris dehors, on était sûr qu’il ferait beau dans l’église; l’un était rempli dans toute sa grandeur par un seul personnage pareil à un Roi de jeu\\r\\n de cartes, qui vivait là-haut, sous un dais architectural, entre ciel et terre; (et dans le reflet oblique et bleu duquel, parfois les jours de semaine, à midi, quand il n’y a pas d’office,—à l’un de ces rares moments où l’église\\r\\n aérée, vacante, plus humaine, luxueuse, avec du soleil sur son riche mobilier, avait l’air presque habitable comme le hall de pierre sculptée et de verre peint, d’un hôtel de style moyen âge,—on voyait s’agenouiller un instant M<sup\\r\\n >me</sup\\r\\n >\\r\\n Sazerat, posant sur le prie-Dieu voisin un paquet tout ficelé de petits fours qu’elle venait de prendre chez le pâtissier d’en face et qu’elle allait rapporter pour le déjeuner); dans un autre une montagne de neige rose, au pied de\\r\\n laquelle se livrait un combat, semblait avoir givré à même la verrière qu’elle boursouflait de son trouble grésil comme une vitre à laquelle il serait resté des flocons, mais des flocons éclairés par quelque aurore (par la même sans\\r\\n doute qui empourprait le retable de l’autel de tons si frais qu’ils semblaient plutôt posés là momentanément par une lueur du dehors prête à s’évanouir que par des couleurs attachées à jamais à la pierre); et tous étaient si anciens\\r\\n qu’on voyait çà et là leur vieillesse argentée étinceler de la poussière des siècles et monter brillante et usée jusqu’à la corde la trame de leur douce tapisserie de verre. Il y en avait un qui était un haut compartiment divisé en\\r\\n une centaine de petits vitraux rectangulaires où dominait le bleu, comme un grand jeu de cartes pareil à ceux qui devaient distraire le roi Charles VI; mais soit qu’un rayon eût brillé, soit que mon regard en bougeant eût promené à\\r\\n travers la verrière tour à tour éteinte et rallumée, un mouvant et précieux incendie, l’instant d’après elle avait pris l’éclat changeant d’une traîne de paon, puis elle tremblait et ondulait en une pluie flamboyante et fantastique\\r\\n qui dégouttait du haut de la voûte sombre et rocheuse, le long des parois humides, comme si c’était dans la nef de quelque grotte irisée de sinueux stalactites que je suivais mes parents, qui portaient leur paroissien; un instant\\r\\n après les petits vitraux en losange avaient pris la transparence profonde, l’infrangible dureté de saphirs qui eussent été juxtaposés sur quelque immense pectoral, mais derrière lesquels on sentait, plus aimé que toutes ces richesses,\\r\\n un sourire momentané de soleil; il était aussi reconnaissable dans le flot bleu et doux dont il baignait les pierreries que sur le pavé de la place ou la paille du marché; et, même à nos premiers dimanches quand nous étions arrivés\\r\\n avant Pâques, il me consolait que la terre fût encore nue et noire, en faisant épanouir, comme en un printemps historique et qui datait des successeurs de saint Louis, ce tapis éblouissant et doré de myosotis en verre.\\r\\n </p>\\r\\n <p>\\r\\n Deux tapisseries de haute lice représentaient le couronnement d’Esther (le tradition voulait qu’on eût donné à Assuérus les traits d’un roi de France et à Esther ceux d’une dame de Guermantes dont il était amoureux) auxquelles leurs\\r\\n couleurs, en fondant, avaient ajouté une expression, un relief, un éclairage: un peu de rose flottait aux lèvres d’Esther au delà du dessin de leur contour, le jaune de sa robe s’étalait si onctueusement, si grassement, qu’elle en\\r\\n prenait une sorte de consistance et s’enlevait vivement sur l’atmosphère refoulée; et la verdure des arbres restée vive dans les parties basses du panneau de soie et de laine, mais ayant «passé» dans le haut, faisait se détacher en\\r\\n plus pâle, au-dessus des troncs foncés, les hautes branches jaunissantes, dorées et comme à demi effacées par la brusque et oblique illumination d’un soleil invisible. Tout cela et plus encore les objets précieux venus à l’église de\\r\\n personnages qui étaient pour moi presque des personnages de légende (la croix d’or travaillée disait-on par saint Éloi et donnée par Dagobert, le tombeau des fils de Louis le Germanique, en porphyre et en cuivre émaillé) à cause de\\r\\n quoi je m’avançais dans l’église, quand nous gagnions nos chaises, comme dans une vallée visitée des fées, où le paysan s’émerveille de voir dans un rocher, dans un arbre, dans une mare, la trace palpable de leur passage surnaturel,\\r\\n tout cela faisait d’elle pour moi quelque chose d’entièrement différent du reste de la ville: un édifice occupant, si l’on peut dire, un espace à quatre dimensions—la quatrième étant celle du Temps,—déployant à travers les siècles son\\r\\n vaisseau qui, de travée en travée, de chapelle en chapelle, semblait vaincre et franchir non pas seulement quelques mètres, mais des époques successives d’où il sortait victorieux; dérobant le rude et farouche XI<sup>e</sup> siècle\\r\\n dans l’épaisseur de ses murs, d’où il n’apparaissait avec ses lourds cintres bouchés et aveuglés de grossiers moellons que par la profonde entaille que creusait près du porche l’escalier du clocher, et, même là, dissimulé par les\\r\\n gracieuses arcades gothiques qui se pressaient coquettement devant lui comme de plus grandes sœurs, pour le cacher aux étrangers, se placent en souriant devant un jeune frère rustre, grognon et mal vêtu; élevant dans le ciel au-dessus\\r\\n de la Place, sa tour qui avait contemplé saint Louis et semblait le voir encore; et s’enfonçant avec sa crypte dans une nuit mérovingienne où, nous guidant à tâtons sous la voûte obscure et puissamment nervurée comme la membrane d’une\\r\\n immense chauve-souris de pierre, Théodore et sa sœur nous éclairaient d’une bougie le tombeau de la petite fille de Sigebert, sur lequel une profonde valve,—comme la trace d’un fossile,—avait été creusée, disait-on, «par une lampe de\\r\\n cristal qui, le soir du meurtre de la princesse franque, s’était détachée d’elle-même des chaînes d’or où elle était suspendue à la place de l’actuelle abside, et, sans que le cristal se brisât, sans que la flamme s’éteignît, s’était\\r\\n enfoncée dans la pierre et l’avait fait mollement céder sous elle.»\\r\\n </p>\\r\\n <p>\\r\\n L’abside de l’église de Combray, peut-on vraiment en parler? Elle était si grossière, si dénuée de beauté artistique et même d’élan religieux. Du dehors, comme le croisement des rues sur lequel elle donnait était en contre-bas, sa\\r\\n grossière muraille s’exhaussait d’un soubassement en moellons nullement polis, hérissés de cailloux, et qui n’avait rien de particulièrement ecclésiastique, les verrières semblaient percées à une hauteur excessive, et le tout avait\\r\\n plus l’air d’un mur de prison que d’église. Et certes, plus tard, quand je me rappelais toutes les glorieuses absides que j’ai vues, il ne me serait jamais venu à la pensée de rapprocher d’elles l’abside de Combray. Seulement, un\\r\\n jour, au détour d’une petite rue provinciale, j’aperçus, en face du croisement de trois ruelles, une muraille fruste et surélevée, avec des verrières percées en haut et offrant le même aspect asymétrique que l’abside de Combray. Alors\\r\\n je ne me suis pas demandé comme à Chartres ou à Reims avec quelle puissance y était exprimé le sentiment religieux, mais je me suis involontairement écrié: «L’Église!»\\r\\n </p>\\r\\n <p>\\r\\n L’église! Familière; mitoyenne, rue Saint-Hilaire, où était sa porte nord, de ses deux voisines, la pharmacie de M. Rapin et la maison de M<sup>me</sup> Loiseau, qu’elle touchait sans aucune séparation; simple citoyenne de Combray qui\\r\\n aurait pu avoir son numéro dans la rue si les rues de Combray avaient eu des numéros, et où il semble que le facteur aurait dû s’arrêter le matin quand il faisait sa distribution, avant d’entrer chez M<sup>me</sup> Loiseau et en\\r\\n sortant de chez M. Rapin, il y avait pourtant entre elle et tout ce qui n’était pas elle une démarcation que mon esprit n’a jamais pu arriver à franchir. M<sup>me</sup> Loiseau avait beau avoir à sa fenêtre des fuchsias, qui prenaient\\r\\n la mauvaise habitude de laisser leurs branches courir toujours partout tête baissée, et dont les fleurs n’avaient rien de plus pressé, quand elles étaient assez grandes, que d’aller rafraîchir leurs joues violettes et congestionnées\\r\\n contre la sombre façade de l’église, les fuchsias ne devenaient pas sacrés pour cela pour moi; entre les fleurs et la pierre noircie sur laquelle elles s’appuyaient, si mes yeux ne percevaient pas d’intervalle, mon esprit réservait un\\r\\n abîme.\\r\\n </p>\\r\\n <p>\\r\\n On reconnaissait le clocher de Saint-Hilaire de bien loin, inscrivant sa figure inoubliable à l’horizon où Combray n’apparaissait pas encore; quand du train qui, la semaine de Pâques, nous amenait de Paris, mon père l’apercevait qui\\r\\n filait tour à tour sur tous les sillons du ciel, faisant courir en tous sens son petit coq de fer, il nous disait: «Allons, prenez les couvertures, on est arrivé.» Et dans une des plus grandes promenades que nous faisions de Combray,\\r\\n il y avait un endroit où la route resserrée débouchait tout à coup sur un immense plateau fermé à l’horizon par des forêts déchiquetées que dépassait seul la fine pointe du clocher de Saint-Hilaire, mais si mince, si rose, qu’elle\\r\\n semblait seulement rayée sur le ciel par un ongle qui aurait voulu donner à se paysage, à ce tableau rien que de nature, cette petite marque d’art, cette unique indication humaine. Quand on se rapprochait et qu’on pouvait apercevoir\\r\\n le reste de la tour carrée et à demi détruite qui, moins haute, subsistait à côté de lui, on était frappé surtout de ton rougeâtre et sombre des pierres; et, par un matin brumeux d’automne, on aurait dit, s’élevant au-dessus du violet\\r\\n orageux des vignobles, une ruine de pourpre presque de la couleur de la vigne vierge.\\r\\n </p>\\r\\n <p>\\r\\n Souvent sur la place, quand nous rentrions, ma grand’mère me faisait arrêter pour le regarder. Des fenêtres de sa tour, placées deux par deux les unes au-dessus des autres, avec cette juste et originale proportion dans les distances\\r\\n qui ne donne pas de la beauté et de la dignité qu’aux visages humains, il lâchait, laissait tomber à intervalles réguliers des volées de corbeaux qui, pendant un moment, tournoyaient en criant, comme si les vieilles pierres qui les\\r\\n laissaient s’ébattre sans paraître les voir, devenues tout d’un coup inhabitables et dégageant un principe d’agitation infinie, les avait frappés et repoussés. Puis, après avoir rayé en tous sens le velours violet de l’air du soir,\\r\\n brusquement calmés ils revenaient s’absorber dans la tour, de néfaste redevenue propice, quelques-uns posés çà et là, ne semblant pas bouger, mais happant peut-être quelque insecte, sur la pointe d’un clocheton, comme une mouette\\r\\n arrêtée avec l’immobilité d’un pêcheur à la crête d’une vague. Sans trop savoir pourquoi, ma grand’mère trouvait au clocher de Saint-Hilaire cette absence de vulgarité, de prétention, de mesquinerie, qui lui faisait aimer et croire\\r\\n riches d’une influence bienfaisante, la nature, quand la main de l’homme ne l’avait pas, comme faisait le jardinier de ma grand’tante, rapetissée, et les œuvres de génie. Et sans doute, toute partie de l’église qu’on apercevait la\\r\\n distinguait de tout autre édifice par une sorte de pensée qui lui était infuse, mais c’était dans son clocher qu’elle semblait prendre conscience d’elle-même, affirmer une existence individuelle et responsable. C’était lui qui parlait\\r\\n pour elle. Je crois surtout que, confusément, ma grand’mère trouvait au clocher de Combray ce qui pour elle avait le plus de prix au monde, l’air naturel et l’air distingué. Ignorante en architecture, elle disait: «Mes enfants,\\r\\n moquez-vous de moi si vous voulez, il n’est peut-être pas beau dans les règles, mais sa vieille figure bizarre me plaît. Je suis sûre que s’il jouait du piano, il ne jouerait pas sec.» Et en le regardant, en suivant des yeux la douce\\r\\n tension, l’inclinaison fervente de ses pentes de pierre qui se rapprochaient en s’élevant comme des mains jointes qui prient, elle s’unissait si bien à l’effusion de la flèche, que son regard semblait s’élancer avec elle; et en même\\r\\n temps elle souriait amicalement aux vieilles pierres usées dont le couchant n’éclairait plus que le faîte et qui, à partir du moment où elles entraient dans cette zone ensoleillée, adoucies par la lumière, paraissaient tout d’un coup\\r\\n montées bien plus haut, lointaines, comme un chant repris «en voix de tête» une octave au-dessus.\\r\\n </p>\\r\\n <p>\\r\\n C’était le clocher de Saint-Hilaire qui donnait à toutes les occupations, à toutes les heures, à tous les points de vue de la ville, leur figure, leur couronnement, leur consécration. De ma chambre, je ne pouvais apercevoir que sa\\r\\n base qui avait été recouverte d’ardoises; mais quand, le dimanche, je les voyais, par une chaude matinée d’été, flamboyer comme un soleil noir, je me disais: «Mon-Dieu! neuf heures! il faut se préparer pour aller à la grand’messe si\\r\\n je veux avoir le temps d’aller embrasser tante Léonie avant», et je savais exactement la couleur qu’avait le soleil sur la place, la chaleur et la poussière du marché, l’ombre que faisait le store du magasin où maman entrerait\\r\\n peut-être avant la messe dans une odeur de toile écrue, faire emplette de quelque mouchoir que lui ferait montrer, en cambrant la taille, le patron qui, tout en se préparant à fermer, venait d’aller dans l’arrière-boutique passer sa\\r\\n veste du dimanche et se savonner les mains qu’il avait l’habitude, toutes les cinq minutes, même dans les circonstances les plus mélancoliques, de frotter l’une contre l’autre d’un air d’entreprise, de partie fine et de réussite.\\r\\n </p>\\r\\n <p>\\r\\n Quand après la messe, on entrait dire à Théodore d’apporter une brioche plus grosse que d’habitude parce que nos cousins avaient profité du beau temps pour venir de Thiberzy déjeuner avec nous, on avait devant soi le clocher qui, doré\\r\\n et cuit lui-même comme une plus grande brioche bénie, avec des écailles et des égouttements gommeux de soleil, piquait sa pointe aiguë dans le ciel bleu. Et le soir, quand je rentrais de promenade et pensais au moment où il faudrait\\r\\n tout à l’heure dire bonsoir à ma mère et ne plus la voir, il était au contraire si doux, dans la journée finissante, qu’il avait l’air d’être posé et enfoncé comme un coussin de velours brun sur le ciel pâli qui avait cédé sous sa\\r\\n pression, s’était creusé légèrement pour lui faire sa place et refluait sur ses bords; et les cris des oiseaux qui tournaient autour de lui semblaient accroître son silence, élancer encore sa flèche et lui donner quelque chose\\r\\n d’ineffable.\\r\\n </p>\\r\\n <p>\\r\\n Même dans les courses qu’on avait à faire derrière l’église, là où on ne la voyait pas, tout semblait ordonné par rapport au clocher surgi ici ou là entre les maisons, peut-être plus émouvant encore quand il apparaissait ainsi sans\\r\\n l’église. Et certes, il y en a bien d’autres qui sont plus beaux vus de cette façon, et j’ai dans mon souvenir des vignettes de clochers dépassant les toits, qui ont un autre caractère d’art que celles que composaient les tristes rues\\r\\n de Combray. Je n’oublierai jamais, dans une curieuse ville de Normandie voisine de Balbec, deux charmants hôtels du XVIII<sup>e</sup> siècle, qui me sont à beaucoup d’égards chers et vénérables et entre lesquels, quand on la regarde\\r\\n du beau jardin qui descend des perrons vers la rivière, la flèche gothique d’une église qu’ils cachent s’élance, ayant l’air de terminer, de surmonter leurs façades, mais d’une matière si différente, si précieuse, si annelée, si rose,\\r\\n si vernie, qu’on voit bien qu’elle n’en fait pas plus partie que de deux beaux galets unis, entre lesquels elle est prise sur la plage, la flèche purpurine et crénelée de quelque coquillage fuselé en tourelle et glacé d’émail. Même à\\r\\n Paris, dans un des quartiers les plus laids de la ville, je sais une fenêtre où on voit après un premier, un second et même un troisième plan fait des toits amoncelés de plusieurs rues, une cloche violette, parfois rougeâtre, parfois\\r\\n aussi, dans les plus nobles «épreuves» qu’en tire l’atmosphère, d’un noir décanté de cendres, laquelle n’est autre que le dôme Saint-Augustin et qui donne à cette vue de Paris le caractère de certaines vues de Rome par Piranesi. Mais\\r\\n comme dans aucune de ces petites gravures, avec quelque goût que ma mémoire ait pu les exécuter elle ne put mettre ce que j’avais perdu depuis longtemps, le sentiment qui nous fait non pas considérer une chose comme un spectacle, mais\\r\\n y croire comme en un être sans équivalent, aucune d’elles ne tient sous sa dépendance toute une partie profonde de ma vie, comme fait le souvenir de ces aspects du clocher de Combray dans les rues qui sont derrière l’église. Qu’on le\\r\\n vît à cinq heures, quand on allait chercher les lettres à la poste, à quelques maisons de soi, à gauche, surélevant brusquement d’une cime isolée la ligne de faîte des toits; que si, au contraire, on voulait entrer demander des\\r\\n nouvelles de M<sup>me</sup> Sazerat, on suivît des yeux cette ligne redevenue basse après la descente de son autre versant en sachant qu’il faudrait tourner à la deuxième rue après le clocher; soit qu’encore, poussant plus loin, si on\\r\\n allait à la gare, on le vît obliquement, montrant de profil des arêtes et des surfaces nouvelles comme un solide surpris à un moment inconnu de sa révolution; ou que, des bords de la Vivonne, l’abside musculeusement ramassée et\\r\\n remontée par la perspective semblât jaillir de l’effort que le clocher faisait pour lancer sa flèche au cœur du ciel: c’était toujours à lui qu’il fallait revenir, toujours lui qui dominait tout, sommant les maisons d’un pinacle\\r\\n inattendu, levé avant moi comme le doigt de Dieu dont le corps eût été caché dans la foule des humains sans que je le confondisse pour cela avec elle. Et aujourd’hui encore si, dans une grande ville de province ou dans un quartier de\\r\\n Paris que je connais mal, un passant qui m’a «mis dans mon chemin» me montre au loin, comme un point de repère, tel beffroi d’hôpital, tel clocher de couvent levant la pointe de son bonnet ecclésiastique au coin d’une rue que je dois\\r\\n prendre, pour peu que ma mémoire puisse obscurément lui trouver quelque trait de ressemblance avec la figure chère et disparue, le passant, s’il se retourne pour s’assurer que je ne m’égare pas, peut, à son étonnement, m’apercevoir\\r\\n qui, oublieux de la promenade entreprise ou de la course obligée, reste là, devant le clocher, pendant des heures, immobile, essayant de me souvenir, sentant au fond de moi des terres reconquises sur l’oubli qui s’assèchent et se\\r\\n rebâtissent; et sans doute alors, et plus anxieusement que tout à l’heure quand je lui demandais de me renseigner, je cherche encore mon chemin, je tourne une rue...mais...c’est dans mon cœur...\\r\\n </p>\\r\\n <p>\\r\\n En rentrant de la messe, nous rencontrions souvent M. Legrandin qui, retenu à Paris par sa profession d’ingénieur, ne pouvait, en dehors des grandes vacances, venir à sa propriété de Combray que du samedi soir au lundi matin. C’était\\r\\n un de ces hommes qui, en dehors d’une carrière scientifique où ils ont d’ailleurs brillamment réussi, possèdent une culture toute différente, littéraire, artistique, que leur spécialisation professionnelle n’utilise pas et dont\\r\\n profite leur conversation. Plus lettrés que bien des littérateurs (nous ne savions pas à cette époque que M. Legrandin eût une certaine réputation comme écrivain et nous fûmes très étonnés de voir qu’un musicien célèbre avait composé\\r\\n une mélodie sur des vers de lui), doués de plus de «facilité» que bien des peintres, ils s’imaginent que la vie qu’ils mènent n’est pas celle qui leur aurait convenu et apportent à leurs occupations positives soit une insouciance\\r\\n mêlée de fantaisie, soit une application soutenue et hautaine, méprisante, amère et consciencieuse. Grand, avec une belle tournure, un visage pensif et fin aux longues moustaches blondes, au regard bleu et désenchanté, d’une politesse\\r\\n raffinée, causeur comme nous n’en avions jamais entendu, il était aux yeux de ma famille qui le citait toujours en exemple, le type de l’homme d’élite, prenant la vie de la façon la plus noble et la plus délicate. Ma grand’mère lui\\r\\n reprochait seulement de parler un peu trop bien, un peu trop comme un livre, de ne pas avoir dans son langage le naturel qu’il y avait dans ses cravates lavallière toujours flottantes, dans son veston droit presque d’écolier. Elle\\r\\n s’étonnait aussi des tirades enflammées qu’il entamait souvent contre l’aristocratie, la vie mondaine, le snobisme, «certainement le péché auquel pense saint Paul quand il parle du péché pour lequel il n’y a pas de rémission.»\\r\\n </p>\\r\\n <p>\\r\\n L’ambition mondaine était un sentiment que ma grand’mère était si incapable de ressentir et presque de comprendre qu’il lui paraissait bien inutile de mettre tant d’ardeur à la flétrir. De plus elle ne trouvait pas de très bon goût\\r\\n que M. Legrandin dont la sœur était mariée près de Balbec avec un gentilhomme bas-normand se livrât à des attaques aussi violentes encore les nobles, allant jusqu’à reprocher à la Révolution de ne les avoir pas tous guillotinés.\\r\\n </p>\\r\\n <p>—Salut, amis! nous disait-il en venant à notre rencontre. Vous êtes heureux d’habiter beaucoup ici; demain il faudra que je rentre à Paris, dans ma niche.</p>\\r\\n <p>\\r\\n —«Oh! ajoutait-il, avec ce sourire doucement ironique et déçu, un peu distrait, qui lui était particulier, certes il y a dans ma maison toutes les choses inutiles. Il n’y manque que le nécessaire, un grand morceau de ciel comme ici.\\r\\n Tâchez de garder toujours un morceau de ciel au-dessus de votre vie, petit garçon, ajoutait-il en se tournant vers moi. Vous avez une jolie âme, d’une qualité rare, une nature d’artiste, ne la laissez pas manquer de ce qu’il lui\\r\\n faut.»\\r\\n </p>\\r\\n <p>\\r\\n Quand, à notre retour, ma tante nous faisait demander si M<sup>me</sup> Goupil était arrivée en retard à la messe, nous étions incapables de la renseigner. En revanche nous ajoutions à son trouble en lui disant qu’un peintre\\r\\n travaillait dans l’église à copier le vitrail de Gilbert le Mauvais. Françoise, envoyée aussitôt chez l’épicier, était revenue bredouille par la faute de l’absence de Théodore à qui sa double profession de chantre ayant une part de\\r\\n l’entretien de l’église, et de garçon épicier donnait, avec des relations dans tous les mondes, un savoir universel.\\r\\n </p>\\r\\n <p>—«Ah! soupirait ma tante, je voudrais que ce soit déjà l’heure d’Eulalie. Il n’y a vraiment qu’elle qui pourra me dire cela.»</p>\\r\\n <p>\\r\\n Eulalie était une fille boiteuse, active et sourde qui s’était «retirée» après la mort de M<sup>me</sup> de la Bretonnerie où elle avait été en place depuis son enfance et qui avait pris à côté de l’église une chambre, d’où elle\\r\\n descendait tout le temps soit aux offices, soit, en dehors des offices, dire une petite prière ou donner un coup de main à Théodore; le reste du temps elle allait voir des personnes malades comme ma tante Léonie à qui elle racontait\\r\\n ce qui s’était passé à la messe ou aux vêpres. Elle ne dédaignait pas d’ajouter quelque casuel à la petite rente que lui servait la famille de ses anciens maîtres en allant de temps en temps visiter le linge du curé ou de quelque\\r\\n autre personnalité marquante du monde clérical de Combray. Elle portait au-dessus d’une mante de drap noir un petit béguin blanc, presque de religieuse, et une maladie de peau donnait à une partie de ses joues et à son nez recourbé,\\r\\n les tons rose vif de la balsamine. Ses visites étaient la grande distraction de ma tante Léonie qui ne recevait plus guère personne d’autre, en dehors de M. le Curé. Ma tante avait peu à peu évincé tous les autres visiteurs parce\\r\\n qu’ils avaient le tort à ses yeux de rentrer tous dans l’une ou l’autre des deux catégories de gens qu’elle détestait. Les uns, les pires et dont elle s’était débarrassée les premiers, étaient ceux qui lui conseillaient de ne pas\\r\\n «s’écouter» et professaient, fût-ce négativement et en ne la manifestant que par certains silences de désapprobation ou par certains sourires de doute, la doctrine subversive qu’une petite promenade au soleil et un bon bifteck\\r\\n saignant (quand elle gardait quatorze heures sur l’estomac deux méchantes gorgées d’eau de Vichy!) lui feraient plus de bien que son lit et ses médecines. L’autre catégorie se composait des personnes qui avaient l’air de croire\\r\\n qu’elle était plus gravement malade qu’elle ne pensait, était aussi gravement malade qu’elle le disait. Aussi, ceux qu’elle avait laissé monter après quelques hésitations et sur les officieuses instances de Françoise et qui, au cours\\r\\n de leur visite, avaient montré combien ils étaient indignes de la faveur qu’on leur faisait en risquant timidement un: «Ne croyez-vous pas que si vous vous secouiez un peu par un beau temps», ou qui, au contraire, quand elle leur\\r\\n avait dit: «Je suis bien bas, bien bas, c’est la fin, mes pauvres amis», lui avaient répondu: «Ah! quand on n’a pas la santé! Mais vous pouvez durer encore comme ça», ceux-là, les uns comme les autres, étaient sûrs de ne plus jamais\\r\\n être reçus. Et si Françoise s’amusait de l’air épouvanté de ma tante quand de son lit elle avait aperçu dans la rue du Saint-Esprit une de ces personnes qui avait l’air de venir chez elle ou quand elle avait entendu un coup de\\r\\n sonnette, elle riait encore bien plus, et comme d’un bon tour, des ruses toujours victorieuses de ma tante pour arriver à les faire congédier et de leur mine déconfite en s’en retournant sans l’avoir vue, et, au fond admirait sa\\r\\n maîtresse qu’elle jugeait supérieure à tous ces gens puisqu’elle ne voulait pas les recevoir. En somme, ma tante exigeait à la fois qu’on l’approuvât dans son régime, qu’on la plaignît pour ses souffrances et qu’on la rassurât sur son\\r\\n avenir.\\r\\n </p>\\r\\n <p>\\r\\n C’est à quoi Eulalie excellait. Ma tante pouvait lui dire vingt fois en une minute: «C’est la fin, ma pauvre Eulalie», vingt fois Eulalie répondait: «Connaissant votre maladie comme vous la connaissez, madame Octave, vous irez à cent\\r\\n ans, comme me disait hier encore M<sup>me</sup> Sazerin.» (Une des plus fermes croyances d’Eulalie et que le nombre imposant des démentis apportés par l’expérience n’avait pas suffi à entamer, était que M<sup>me</sup> Sazerat\\r\\n s’appelait M<sup>me</sup> Sazerin.)\\r\\n </p>\\r\\n <p>—Je ne demande pas à aller à cent ans, répondait ma tante qui préférait ne pas voir assigner à ses jours un terme précis.</p>\\r\\n <p>\\r\\n Et comme Eulalie savait avec cela comme personne distraire ma tante sans la fatiguer, ses visites qui avaient lieu régulièrement tous les dimanches sauf empêchement inopiné, étaient pour ma tante un plaisir dont la perspective\\r\\n l’entretenait ces jours-là dans un état agréable d’abord, mais bien vite douloureux comme une faim excessive, pour peu qu’Eulalie fût en retard. Trop prolongée, cette volupté d’attendre Eulalie tournait en supplice, ma tante ne\\r\\n cessait de regarder l’heure, bâillait, se sentait des faiblesses. Le coup de sonnette d’Eulalie, s’il arrivait tout à la fin de la journée, quand elle ne l’espérait plus, la faisait presque se trouver mal. En réalité, le dimanche,\\r\\n elle ne pensait qu’à cette visite et sitôt le déjeuner fini, Françoise avait hâte que nous quittions la salle à manger pour qu’elle pût monter «occuper» ma tante. Mais (surtout à partir du moment où les beaux jours s’installaient à\\r\\n Combray) il y avait bien longtemps que l’heure altière de midi, descendue de la tour de Saint-Hilaire qu’elle armoriait des douze fleurons momentanés de sa couronne sonore avait retenti autour de notre table, auprès du pain bénit venu\\r\\n lui aussi familièrement en sortant de l’église, quand nous étions encore assis devant les assiettes des Mille et une Nuits, appesantis par la chaleur et surtout par le repas. Car, au fond permanent d’œufs, de côtelettes, de pommes de\\r\\n terre, de confitures, de biscuits, qu’elle ne nous annonçait même plus, Françoise ajoutait—selon les travaux des champs et des vergers, le fruit de la marée, les hasards du commerce, les politesses des voisins et son propre génie, et\\r\\n si bien que notre menu, comme ces quatre-feuilles qu’on sculptait au XIII<sup>e</sup> siècle au portail des cathédrales, reflétait un peu le rythme des saisons et les épisodes de la vie—: une barbue parce que la marchande lui en avait\\r\\n garanti la fraîcheur, une dinde parce qu’elle en avait vu une belle au marché de Roussainville-le-Pin, des cardons à la moelle parce qu’elle ne nous en avait pas encore fait de cette manière-là, un gigot rôti parce que le grand air\\r\\n creuse et qu’il avait bien le temps de descendre d’ici sept heures, des épinards pour changer, des abricots parce que c’était encore une rareté, des groseilles parce que dans quinze jours il n’y en aurait plus, des framboises que M.\\r\\n Swann avait apportées exprès, des cerises, les premières qui vinssent du cerisier du jardin après deux ans qu’il n’en donnait plus, du fromage à la crème que j’aimais bien autrefois, un gâteau aux amandes parce qu’elle l’avait\\r\\n commandé la veille, une brioche parce que c’était notre tour de l’offrir. Quand tout cela était fini, composée expressément pour nous, mais dédiée plus spécialement à mon père qui était amateur, une crème au chocolat, inspiration,\\r\\n attention personnelle de Françoise, nous était offerte, fugitive et légère comme une œuvre de circonstance où elle avait mis tout son talent. Celui qui eût refusé d’en goûter en disant: «J’ai fini, je n’ai plus faim», se serait\\r\\n immédiatement ravalé au rang de ces goujats qui, même dans le présent qu’un artiste leur fait d’une de ses œuvres, regardent au poids et à la matière alors que n’y valent que l’intention et la signature. Même en laisser une seule\\r\\n goutte dans le plat eût témoigné de la même impolitesse que se lever avant la fin du morceau au nez du compositeur.\\r\\n </p>\\r\\n <p>\\r\\n Enfin ma mère me disait: «Voyons, ne reste pas ici indéfiniment, monte dans ta chambre si tu as trop chaud dehors, mais va d’abord prendre l’air un instant pour ne pas lier en sortant de table.» J’allais m’asseoir près de la pompe et\\r\\n de son auge, souvent ornée, comme un fond gothique, d’une salamandre, qui sculptait sur la pierre fruste le relief mobile de son corps allégorique et fuselé, sur le banc sans dossier ombragé d’un lilas, dans ce petit coin du jardin\\r\\n qui s’ouvrait par une porte de service sur la rue du Saint-Esprit et de la terre peu soignée duquel s’élevait par deux degrés, en saillie de la maison, et comme une construction indépendante, l’arrière-cuisine. On apercevait son\\r\\n dallage rouge et luisant comme du porphyre. Elle avait moins l’air de l’antre de Françoise que d’un petit temple à Vénus. Elle regorgeait des offrandes du crémier, du fruitier, de la marchande de légumes, venus parfois de hameaux\\r\\n assez lointains pour lui dédier les prémices de leurs champs. Et son faîte était toujours couronné du roucoulement d’une colombe.\\r\\n </p>\\r\\n <p>\\r\\n Autrefois, je ne m’attardais pas dans le bois consacré qui l’entourait, car, avant de monter lire, j’entrais dans le petit cabinet de repos que mon oncle Adolphe, un frère de mon grand-père, ancien militaire qui avait pris sa retraite\\r\\n comme commandant, occupait au rez-de-chaussée, et qui, même quand les fenêtres ouvertes laissaient entrer la chaleur, sinon les rayons du soleil qui atteignaient rarement jusque-là, dégageait inépuisablement cette odeur obscure et\\r\\n fraîche, à la fois forestière et ancien régime, qui fait rêver longuement les narines, quand on pénètre dans certains pavillons de chasse abandonnés. Mais depuis nombre d’années je n’entrais plus dans le cabinet de mon oncle Adolphe,\\r\\n ce dernier ne venant plus à Combray à cause d’une brouille qui était survenue entre lui et ma famille, par ma faute, dans les circonstances suivantes:\\r\\n </p>\\r\\n <p>\\r\\n Une ou deux fois par mois, à Paris, on m’envoyait lui faire une visite, comme il finissait de déjeuner, en simple vareuse, servi par son domestique en veste de travail de coutil rayé violet et blanc. Il se plaignait en ronchonnant que\\r\\n je n’étais pas venu depuis longtemps, qu’on l’abandonnait; il m’offrait un massepain ou une mandarine, nous traversions un salon dans lequel on ne s’arrêtait jamais, où on ne faisait jamais de feu, dont les murs étaient ornés de\\r\\n moulures dorées, les plafonds peints d’un bleu qui prétendait imiter le ciel et les meubles capitonnés en satin comme chez mes grands-parents, mais jaune; puis nous passions dans ce qu’il appelait son cabinet de «travail» aux murs\\r\\n duquel étaient accrochées de ces gravures représentant sur fond noir une déesse charnue et rose conduisant un char, montée sur un globe, ou une étoile au front, qu’on aimait sous le second Empire parce qu’on leur trouvait un air\\r\\n pompéien, puis qu’on détesta, et qu’on recommence à aimer pour une seule et même raison, malgré les autres qu’on donne et qui est qu’elles ont l’air second Empire. Et je restais avec mon oncle jusqu’à ce que son valet de chambre vînt\\r\\n lui demander, de la part du cocher, pour quelle heure celui-ci devait atteler. Mon oncle se plongeait alors dans une méditation qu’aurait craint de troubler d’un seul mouvement son valet de chambre émerveillé, et dont il attendait\\r\\n avec curiosité le résultat, toujours identique. Enfin, après une hésitation suprême, mon oncle prononçait infailliblement ces mots: «Deux heures et quart», que le valet de chambre répétait avec étonnement, mais sans discuter: «Deux\\r\\n heures et quart? bien...je vais le dire...»\\r\\n </p>\\r\\n <p>\\r\\n A cette époque j’avais l’amour du théâtre, amour platonique, car mes parents ne m’avaient encore jamais permis d’y aller, et je me représentais d’une façon si peu exacte les plaisirs qu’on y goûtait que je n’étais pas éloigné de\\r\\n croire que chaque spectateur regardait comme dans un stéréoscope un décor qui n’était que pour lui, quoique semblable au millier d’autres que regardait, chacun pour soi, le reste des spectateurs.\\r\\n </p>\\r\\n <p>\\r\\n Tous les matins je courais jusqu’à la colonne Moriss pour voir les spectacles qu’elle annonçait. Rien n’était plus désintéressé et plus heureux que les rêves offerts à mon imagination par chaque pièce annoncée et qui étaient\\r\\n conditionnés à la fois par les images inséparables des mots qui en composaient le titre et aussi de la couleur des affiches encore humides et boursouflées de colle sur lesquelles il se détachait. Si ce n’est une de ces œuvres étranges\\r\\n comme le Testament de César Girodot et Œdipe-Roi lesquelles s’inscrivaient, non sur l’affiche verte de l’Opéra-Comique, mais sur l’affiche lie de vin de la Comédie-Française, rien ne me paraissait plus différent de l’aigrette\\r\\n étincelante et blanche des Diamants de la Couronne que le satin lisse et mystérieux du Domino Noir, et, mes parents m’ayant dit que quand j’irais pour la première fois au théâtre j’aurais à choisir entre ces deux pièces, cherchant à\\r\\n approfondir successivement le titre de l’une et le titre de l’autre, puisque c’était tout ce que je connaissais d’elles, pour tâcher de saisir en chacun le plaisir qu’il me promettait et de le comparer à celui que recélait l’autre,\\r\\n j’arrivais à me représenter avec tant de force, d’une part une pièce éblouissante et fière, de l’autre une pièce douce et veloutée, que j’étais aussi incapable de décider laquelle aurait ma préférence, que si, pour le dessert, on\\r\\n m’avait donné à opter encore du riz à l’Impératrice et de la crème au chocolat.\\r\\n </p>\\r\\n <p>\\r\\n Toutes mes conversations avec mes camarades portaient sur ces acteurs dont l’art, bien qu’il me fût encore inconnu, était la première forme, entre toutes celles qu’il revêt, sous laquelle se laissait pressentir par moi, l’Art. Entre\\r\\n la manière que l’un ou l’autre avait de débiter, de nuancer une tirade, les différences les plus minimes me semblaient avoir une importance incalculable. Et, d’après ce que l’on m’avait dit d’eux, je les classais par ordre de talent,\\r\\n dans des listes que je me récitais toute la journée: et qui avaient fini par durcir dans mon cerveau et par le gêner de leur inamovibilité.\\r\\n </p>\\r\\n <p>\\r\\n Plus tard, quand je fus au collège, chaque fois que pendant les classes, je correspondais, aussitôt que le professeur avait la tête tournée, avec un nouvel ami, ma première question était toujours pour lui demander s’il était déjà\\r\\n allé au théâtre et s’il trouvait que le plus grand acteur était bien Got, le second Delaunay, etc. Et si, à son avis, Febvre ne venait qu’après Thiron, ou Delaunay qu’après Coquelin, la soudaine motilité que Coquelin, perdant la\\r\\n rigidité de la pierre, contractait dans mon esprit pour y passer au deuxième rang, et l’agilité miraculeuse, la féconde animation dont se voyait doué Delaunay pour reculer au quatrième, rendait la sensation du fleurissement et de la\\r\\n vie à mon cerveau assoupli et fertilisé.\\r\\n </p>\\r\\n <p>\\r\\n Mais si les acteurs me préoccupaient ainsi, si la vue de Maubant sortant un après-midi du Théâtre-Français m’avait causé le saisissement et les souffrances de l’amour, combien le nom d’une étoile flamboyant à la porte d’un théâtre,\\r\\n combien, à la glace d’un coupé qui passait dans la rue avec ses chevaux fleuris de roses au frontail, la vue du visage d’une femme que je pensais être peut-être une actrice, laissait en moi un trouble plus prolongé, un effort\\r\\n impuissant et douloureux pour me représenter sa vie! Je classais par ordre de talent les plus illustres: Sarah Bernhardt, la Berma, Bartet, Madeleine Brohan, Jeanne Samary, mais toutes m’intéressaient. Or mon oncle en connaissait\\r\\n beaucoup, et aussi des cocottes que je ne distinguais pas nettement des actrices. Il les recevait chez lui. Et si nous n’allions le voir qu’à certains jours c’est que, les autres jours, venaient des femmes avec lesquelles sa famille\\r\\n n’aurait pas pu se rencontrer, du moins à son avis à elle, car, pour mon oncle, au contraire, sa trop grande facilité à faire à de jolies veuves qui n’avaient peut-être jamais été mariées, à des comtesses de nom ronflant, qui n’était\\r\\n sans doute qu’un nom de guerre, la politesse de les présenter à ma grand’mère ou même à leur donner des bijoux de famille, l’avait déjà brouillé plus d’une fois avec mon grand-père. Souvent, à un nom d’actrice qui venait dans la\\r\\n conversation, j’entendais mon père dire à ma mère, en souriant: «Une amie de ton oncle»; et je pensais que le stage que peut-être pendant des années des hommes importants faisaient inutilement à la porte de telle femme qui ne\\r\\n répondait pas à leurs lettres et les faisait chasser par le concierge de son hôtel, mon oncle aurait pu en dispenser un gamin comme moi en le présentant chez lui à l’actrice, inapprochable à tant d’autres, qui était pour lui une\\r\\n intime amie.\\r\\n </p>\\r\\n <p>\\r\\n Aussi,—sous le prétexte qu’une leçon qui avait été déplacée tombait maintenant si mal qu’elle m’avait empêché plusieurs fois et m’empêcherait encore de voir mon oncle—un jour, autre que celui qui était réservé aux visites que nous lui\\r\\n faisions, profitant de ce que mes parents avaient déjeuné de bonne heure, je sortis et au lieu d’aller regarder la colonne d’affiches, pour quoi on me laissait aller seul, je courus jusqu’à lui. Je remarquai devant sa porte une\\r\\n voiture attelée de deux chevaux qui avaient aux œillères un œillet rouge comme avait le cocher à sa boutonnière. De l’escalier j’entendis un rire et une voix de femme, et dès que j’eus sonné, un silence, puis le bruit de portes qu’on\\r\\n fermait. Le valet de chambre vint ouvrir, et en me voyant parut embarrassé, me dit que mon oncle était très occupé, ne pourrait sans doute pas me recevoir et tandis qu’il allait pourtant le prévenir la même voix que j’avais entendue\\r\\n disait: «Oh, si! laisse-le entrer; rien qu’une minute, cela m’amuserait tant. Sur la photographie qui est sur ton bureau, il ressemble tant à sa maman, ta nièce, dont la photographie est à côté de la sienne, n’est-ce pas? Je voudrais\\r\\n le voir rien qu’un instant, ce gosse.»\\r\\n </p>\\r\\n <p>J’entendis mon oncle grommeler, se fâcher; finalement le valet de chambre me fit entrer.</p>\\r\\n <p>\\r\\n Sur la table, il y avait la même assiette de massepains que d’habitude; mon oncle avait sa vareuse de tous les jours, mais en face de lui, en robe de soie rose avec un grand collier de perles au cou, était assise une jeune femme qui\\r\\n achevait de manger une mandarine. L’incertitude où j’étais s’il fallait dire madame ou mademoiselle me fit rougir et n’osant pas trop tourner les yeux de son côté de peur d’avoir à lui parler, j’allai embrasser mon oncle. Elle me\\r\\n regardait en souriant, mon oncle lui dit: «Mon neveu», sans lui dire mon nom, ni me dire le sien, sans doute parce que, depuis les difficultés qu’il avait eues avec mon grand-père, il tâchait autant que possible d’éviter tout trait\\r\\n d’union entre sa famille et ce genre de relations.\\r\\n </p>\\r\\n <p>—«Comme il ressemble à sa mère,» dit-elle.</p>\\r\\n <p>—«Mais vous n’avez jamais vu ma nièce qu’en photographie, dit vivement mon oncle d’un ton bourru.»</p>\\r\\n <p>\\r\\n —«Je vous demande pardon, mon cher ami, je l’ai croisée dans l’escalier l’année dernière quand vous avez été si malade. Il est vrai que je ne l’ai vue que le temps d’un éclair et que votre escalier est bien noir, mais cela m’a suffi\\r\\n pour l’admirer. Ce petit jeune homme a ses beaux yeux et aussi ça, dit-elle, en traçant avec son doigt une ligne sur le bas de son front. Est-ce que madame votre nièce porte le même nom que vous, ami? demanda-t-elle à mon oncle.»\\r\\n </p>\\r\\n <p>—«Il ressemble surtout à son père, grogna mon oncle qui ne se souciait pas plus de faire des présentations à distance en disant le nom de maman que d’en faire de près. C’est tout à fait son père et aussi ma pauvre mère.»</p>\\r\\n <p>—«Je ne connais pas son père, dit la dame en rose avec une légère inclinaison de la tête, et je n’ai jamais connu votre pauvre mère, mon ami. Vous vous souvenez, c’est peu après votre grand chagrin que nous nous sommes connus.»</p>\\r\\n <p>\\r\\n J’éprouvais une petite déception, car cette jeune dame ne différait pas des autres jolies femmes que j’avais vues quelquefois dans ma famille notamment de la fille d’un de nos cousins chez lequel j’allais tous les ans le premier\\r\\n janvier. Mieux habillée seulement, l’amie de mon oncle avait le même regard vif et bon, elle avait l’air aussi franc et aimant. Je ne lui trouvais rien de l’aspect théâtral que j’admirais dans les photographies d’actrices, ni de\\r\\n l’expression diabolique qui eût été en rapport avec la vie qu’elle devait mener. J’avais peine à croire que ce fût une cocotte et surtout je n’aurais pas cru que ce fût une cocotte chic si je n’avais pas vu la voiture à deux chevaux,\\r\\n la robe rose, le collier de perles, si je n’avais pas su que mon oncle n’en connaissait que de la plus haute volée. Mais je me demandais comment le millionnaire qui lui donnait sa voiture et son hôtel et ses bijoux pouvait avoir du\\r\\n plaisir à manger sa fortune pour une personne qui avait l’air si simple et comme il faut. Et pourtant en pensant à ce que devait être sa vie, l’immoralité m’en troublait peut-être plus que si elle avait été concrétisée devant moi en\\r\\n une apparence spéciale,—d’être ainsi invisible comme le secret de quelque roman, de quelque scandale qui avait fait sortir de chez ses parents bourgeois et voué à tout le monde, qui avait fait épanouir en beauté et haussé jusqu’au\\r\\n demi-monde et à la notoriété celle que ses jeux de physionomie, ses intonations de voix, pareils à tant d’autres que je connaissais déjà, me faisaient malgré moi considérer comme une jeune fille de bonne famille, qui n’était plus\\r\\n d’aucune famille.\\r\\n </p>\\r\\n <p>On était passé dans le «cabinet de travail», et mon oncle, d’un air un peu gêné par ma présence, lui offrit des cigarettes.</p>\\r\\n <p>\\r\\n —«Non, dit-elle, cher, vous savez que je suis habituée à celles que le grand-duc m’envoie. Je lui ai dit que vous en étiez jaloux.» Et elle tira d’un étui des cigarettes couvertes d’inscriptions étrangères et dorées. «Mais si,\\r\\n reprit-elle tout d’un coup, je dois avoir rencontré chez vous le père de ce jeune homme. N’est-ce pas votre neveu? Comment ai-je pu l’oublier? Il a été tellement bon, tellement exquis pour moi, dit-elle d’un air modeste et sensible.»\\r\\n Mais en pensant à ce qu’avait pu être l’accueil rude qu’elle disait avoir trouvé exquis, de mon père, moi qui connaissais sa réserve et sa froideur, j’étais gêné, comme par une indélicatesse qu’il aurait commise, de cette inégalité\\r\\n entre la reconnaissance excessive qui lui était accordée et son amabilité insuffisante. Il m’a semblé plus tard que c’était un des côtés touchants du rôle de ces femmes oisives et studieuses qu’elles consacrent leur générosité, leur\\r\\n talent, un rêve disponible de beauté sentimentale—car, comme les artistes, elles ne le réalisent pas, ne le font pas entrer dans les cadres de l’existence commune,—et un or qui leur coûte peu, à enrichir d’un sertissage précieux et\\r\\n fin la vie fruste et mal dégrossie des hommes. Comme celle-ci, dans le fumoir où mon oncle était en vareuse pour la recevoir, répandait son corps si doux, sa robe de soie rose, ses perles, l’élégance qui émane de l’amitié d’un\\r\\n grand-duc, de même elle avait pris quelque propos insignifiant de mon père, elle l’avait travaillé avec délicatesse, lui avait donné un tour, une appellation précieuse et y enchâssant un de ses regards d’une si belle eau, nuancé\\r\\n d’humilité et de gratitude, elle le rendait changé en un bijou artiste, en quelque chose de «tout à fait exquis».\\r\\n </p>\\r\\n <p>—«Allons, voyons, il est l’heure que tu t’en ailles», me dit mon oncle.</p>\\r\\n <p>\\r\\n Je me levai, j’avais une envie irrésistible de baiser la main de la dame en rose, mais il me semblait que c’eût été quelque chose d’audacieux comme un enlèvement. Mon cœur battait tandis que je me disais: «Faut-il le faire, faut-il ne\\r\\n pas le faire», puis je cessai de me demander ce qu’il fallait faire pour pouvoir faire quelque chose. Et d’un geste aveugle et insensé, dépouillé de toutes les raisons que je trouvais il y avait un moment en sa faveur, je portai à mes\\r\\n lèvres la main qu’elle me tendait.\\r\\n </p>\\r\\n <p>\\r\\n —«Comme il est gentil! il est déjà galant, il a un petit œil pour les femmes: il tient de son oncle. Ce sera un parfait gentleman», ajouta-t-elle en serrant les dents pour donner à la phrase un accent légèrement britannique. «Est-ce\\r\\n qu’il ne pourrait pas venir une fois prendre a cup of tea, comme disent nos voisins les Anglais; il n’aurait qu’à m’envoyer un «bleu» le matin.\\r\\n </p>\\r\\n <p>\\r\\n Je ne savais pas ce que c’était qu’un «bleu». Je ne comprenais pas la moitié des mots que disait la dame, mais la crainte que n’y fut cachée quelque question à laquelle il eût été impoli de ne pas répondre, m’empêchait de cesser de\\r\\n les écouter avec attention, et j’en éprouvais une grande fatigue.\\r\\n </p>\\r\\n <p>\\r\\n —«Mais non, c’est impossible, dit mon oncle, en haussant les épaules, il est très tenu, il travaille beaucoup. Il a tous les prix à son cours, ajouta-t-il, à voix basse pour que je n’entende pas ce mensonge et que je n’y contredise\\r\\n pas. Qui sait, ce sera peut-être un petit Victor Hugo, une espèce de Vaulabelle, vous savez.»\\r\\n </p>\\r\\n <p>\\r\\n —«J’adore les artistes, répondit la dame en rose, il n’y a qu’eux qui comprennent les femmes... Qu’eux et les êtres d’élite comme vous. Excusez mon ignorance, ami. Qui est Vaulabelle? Est-ce les volumes dorés qu’il y a dans la petite\\r\\n bibliothèque vitrée de votre boudoir? Vous savez que vous m’avez promis de me les prêter, j’en aurai grand soin.»\\r\\n </p>\\r\\n <p>\\r\\n Mon oncle qui détestait prêter ses livres ne répondit rien et me conduisit jusqu’à l’antichambre. Éperdu d’amour pour la dame en rose, je couvris de baisers fous les joues pleines de tabac de mon vieil oncle, et tandis qu’avec assez\\r\\n d’embarras il me laissait entendre sans oser me le dire ouvertement qu’il aimerait autant que je ne parlasse pas de cette visite à mes parents, je lui disais, les larmes aux yeux, que le souvenir de sa bonté était en moi si fort que\\r\\n je trouverais bien un jour le moyen de lui témoigner ma reconnaissance. Il était si fort en effet que deux heures plus tard, après quelques phrases mystérieuses et qui ne me parurent pas donner à mes parents une idée assez nette de la\\r\\n nouvelle importance dont j’étais doué, je trouvai plus explicite de leur raconter dans les moindres détails la visite que je venais de faire. Je ne croyais pas ainsi causer d’ennuis à mon oncle. Comment l’aurais-je cru, puisque je ne\\r\\n le désirais pas. Et je ne pouvais supposer que mes parents trouveraient du mal dans une visite où je n’en trouvais pas. N’arrive-t-il pas tous les jours qu’un ami nous demande de ne pas manquer de l’excuser auprès d’une femme à qui il\\r\\n a été empêché d’écrire, et que nous négligions de le faire jugeant que cette personne ne peut pas attacher d’importance à un silence qui n’en a pas pour nous? Je m’imaginais, comme tout le monde, que le cerveau des autres était un\\r\\n réceptacle inerte et docile, sans pouvoir de réaction spécifique sur ce qu’on y introduisait; et je ne doutais pas qu’en déposant dans celui de mes parents la nouvelle de la connaissance que mon oncle m’avait fait faire, je ne leur\\r\\n transmisse en même temps comme je le souhaitais, le jugement bienveillant que je portais sur cette présentation. Mes parents malheureusement s’en remirent à des principes entièrement différents de ceux que je leur suggérais d’adopter,\\r\\n quand ils voulurent apprécier l’action de mon oncle. Mon père et mon grand-père eurent avec lui des explications violentes; j’en fus indirectement informé. Quelques jours après, croisant dehors mon oncle qui passait en voiture\\r\\n découverte, je ressentis la douleur, la reconnaissance, le remords que j’aurais voulu lui exprimer. A côté de leur immensité, je trouvai qu’un coup de chapeau serait mesquin et pourrait faire supposer à mon oncle que je ne me croyais\\r\\n pas tenu envers lui à plus qu’à une banale politesse. Je résolus de m’abstenir de ce geste insuffisant et je détournai la tête. Mon oncle pensa que je suivais en cela les ordres de mes parents, il ne le leur pardonna pas, et il est\\r\\n mort bien des années après sans qu’aucun de nous l’ait jamais revu.\\r\\n </p>\\r\\n <p>\\r\\n Aussi je n’entrais plus dans le cabinet de repos maintenant fermé, de mon oncle Adolphe, et après m’être attardé aux abords de l’arrière-cuisine, quand Françoise, apparaissant sur le parvis, me disait: «Je vais laisser ma fille de\\r\\n cuisine servir le café et monter l’eau chaude, il faut que je me sauve chez M<sup>me</sup> Octave», je me décidais à rentrer et montais directement lire chez moi. La fille de cuisine était une personne morale, une institution\\r\\n permanente à qui des attributions invariables assuraient une sorte de continuité et d’identité, à travers la succession des formes passagères en lesquelles elle s’incarnait: car nous n’eûmes jamais la même deux ans de suite. L’année\\r\\n où nous mangeâmes tant d’asperges, la fille de cuisine habituellement chargée de les «plumer» était une pauvre créature maladive, dans un état de grossesse déjà assez avancé quand nous arrivâmes à Pâques, et on s’étonnait même que\\r\\n Françoise lui laissât faire tant de courses et de besogne, car elle commençait à porter difficilement devant elle la mystérieuse corbeille, chaque jour plus remplie, dont on devinait sous ses amples sarraus la forme magnifique.\\r\\n Ceux-ci rappelaient les houppelandes qui revêtent certaines des figures symboliques de Giotto dont M. Swann m’avait donné des photographies. C’est lui-même qui nous l’avait fait remarquer et quand il nous demandait des nouvelles de la\\r\\n fille de cuisine, il nous disait: «Comment va la Charité de Giotto?» D’ailleurs elle-même, la pauvre fille, engraissée par sa grossesse, jusqu’à la figure, jusqu’aux joues qui tombaient droites et carrées, ressemblait en effet assez à\\r\\n ces vierges, fortes et hommasses, matrones plutôt, dans lesquelles les vertus sont personnifiées à l’Arena. Et je me rends compte maintenant que ces Vertus et ces Vices de Padoue lui ressemblaient encore d’une autre manière. De même\\r\\n que l’image de cette fille était accrue par le symbole ajouté qu’elle portait devant son ventre, sans avoir l’air d’en comprendre le sens, sans que rien dans son visage en traduisît la beauté et l’esprit, comme un simple et pesant\\r\\n fardeau, de même c’est sans paraître s’en douter que la puissante ménagère qui est représentée à l’Arena au-dessous du nom «Caritas» et dont la reproduction était accrochée au mur de ma salle d’études, à Combray, incarne cette vertu,\\r\\n c’est sans qu’aucune pensée de charité semble avoir jamais pu être exprimée par son visage énergique et vulgaire. Par une belle invention du peintre elle foule aux pieds les trésors de la terre, mais absolument comme si elle piétinait\\r\\n des raisins pour en extraire le jus ou plutôt comme elle aurait monté sur des sacs pour se hausser; et elle tend à Dieu son cœur enflammé, disons mieux, elle le lui «passe», comme une cuisinière passe un tire-bouchon par le soupirail\\r\\n de son sous-sol à quelqu’un qui le lui demande à la fenêtre du rez-de-chaussée. L’Envie, elle, aurait eu davantage une certaine expression d’envie. Mais dans cette fresque-là encore, le symbole tient tant de place et est représenté\\r\\n comme si réel, le serpent qui siffle aux lèvres de l’Envie est si gros, il lui remplit si complètement sa bouche grande ouverte, que les muscles de sa figure sont distendus pour pouvoir le contenir, comme ceux d’un enfant qui gonfle\\r\\n un ballon avec son souffle, et que l’attention de l’Envie—et la nôtre du même coup—tout entière concentrée sur l’action de ses lèvres, n’a guère de temps à donner à d’envieuses pensées.\\r\\n </p>\\r\\n <p>\\r\\n Malgré toute l’admiration que M. Swann professait pour ces figures de Giotto, je n’eus longtemps aucun plaisir à considérer dans notre salle d’études, où on avait accroché les copies qu’il m’en avait rapportées, cette Charité sans\\r\\n charité, cette Envie qui avait l’air d’une planche illustrant seulement dans un livre de médecine la compression de la glotte ou de la luette par une tumeur de la langue ou par l’introduction de l’instrument de l’opérateur, une\\r\\n Justice, dont le visage grisâtre et mesquinement régulier était celui-là même qui, à Combray, caractérisait certaines jolies bourgeoises pieuses et sèches que je voyais à la messe et dont plusieurs étaient enrôlées d’avance dans les\\r\\n milices de réserve de l’Injustice. Mais plus tard j’ai compris que l’étrangeté saisissante, la beauté spéciale de ces fresques tenait à la grande place que le symbole y occupait, et que le fait qu’il fût représenté non comme un\\r\\n symbole puisque la pensée symbolisée n’était pas exprimée, mais comme réel, comme effectivement subi ou matériellement manié, donnait à la signification de l’œuvre quelque chose de plus littéral et de plus précis, à son enseignement\\r\\n quelque chose de plus concret et de plus frappant. Chez la pauvre fille de cuisine, elle aussi, l’attention n’était-elle pas sans cesse ramenée à son ventre par le poids qui le tirait; et de même encore, bien souvent la pensée des\\r\\n agonisants est tournée vers le côté effectif, douloureux, obscur, viscéral, vers cet envers de la mort qui est précisément le côté qu’elle leur présente, qu’elle leur fait rudement sentir et qui ressemble beaucoup plus à un fardeau\\r\\n qui les écrase, à une difficulté de respirer, à un besoin de boire, qu’à ce que nous appelons l’idée de la mort.\\r\\n </p>\\r\\n <p>\\r\\n Il fallait que ces Vertus et ces Vices de Padoue eussent en eux bien de la réalité puisqu’ils m’apparaissaient comme aussi vivants que la servante enceinte, et qu’elle-même ne me semblait pas beaucoup moins allégorique. Et peut-être\\r\\n cette non-participation (du moins apparente) de l’âme d’un être à la vertu qui agit par lui, a aussi en dehors de sa valeur esthétique une réalité sinon psychologique, au moins, comme on dit, physiognomonique. Quand, plus tard, j’ai\\r\\n eu l’occasion de rencontrer, au cours de ma vie, dans des couvents par exemple, des incarnations vraiment saintes de la charité active, elles avaient généralement un air allègre, positif, indifférent et brusque de chirurgien pressé,\\r\\n ce visage où ne se lit aucune commisération, aucun attendrissement devant la souffrance humaine, aucune crainte de la heurter, et qui est le visage sans douceur, le visage antipathique et sublime de la vraie bonté.\\r\\n </p>\\r\\n <p>\\r\\n Pendant que la fille de cuisine,—faisant briller involontairement la supériorité de Françoise, comme l’Erreur, par le contraste, rend plus éclatant le triomphe de la Vérité—servait du café qui, selon maman n’était que de l’eau chaude,\\r\\n et montait ensuite dans nos chambres de l’eau chaude qui était à peine tiède, je m’étais étendu sur mon lit, un livre à la main, dans ma chambre qui protégeait en tremblant sa fraîcheur transparente et fragile contre le soleil de\\r\\n l’après-midi derrière ses volets presque clos où un reflet de jour avait pourtant trouvé moyen de faire passer ses ailes jaunes, et restait immobile entre le bois et le vitrage, dans un coin, comme un papillon posé. Il faisait à peine\\r\\n assez clair pour lire, et la sensation de la splendeur de la lumière ne m’était donnée que par les coups frappés dans la rue de la Cure par Camus (averti par Françoise que ma tante ne «reposait pas» et qu’on pouvait faire du bruit)\\r\\n contre des caisses poussiéreuses, mais qui, retentissant dans l’atmosphère sonore, spéciale aux temps chauds, semblaient faire voler au loin des astres écarlates; et aussi par les mouches qui exécutaient devant moi, dans leur petit\\r\\n concert, comme la musique de chambre de l’été: elle ne l’évoque pas à la façon d’un air de musique humaine, qui, entendu par hasard à la belle saison, vous la rappelle ensuite; elle est unie à l’été par un lien plus nécessaire: née\\r\\n des beaux jours, ne renaissant qu’avec eux, contenant un peu de leur essence, elle n’en réveille pas seulement l’image dans notre mémoire, elle en certifie le retour, la présence effective, ambiante, immédiatement accessible.\\r\\n </p>\\r\\n <p>\\r\\n Cette obscure fraîcheur de ma chambre était au plein soleil de la rue, ce que l’ombre est au rayon, c’est-à-dire aussi lumineuse que lui, et offrait à mon imagination le spectacle total de l’été dont mes sens si j’avais été en\\r\\n promenade, n’auraient pu jouir que par morceaux; et ainsi elle s’accordait bien à mon repos qui (grâce aux aventures racontées par mes livres et qui venaient l’émouvoir) supportait pareil au repos d’une main immobile au milieu d’une\\r\\n eau courante, le choc et l’animation d’un torrent d’activité.\\r\\n </p>\\r\\n <p>\\r\\n Mais ma grand’mère, même si le temps trop chaud s’était gâté, si un orage ou seulement un grain était survenu, venait me supplier de sortir. Et ne voulant pas renoncer à ma lecture, j’allais du moins la continuer au jardin, sous le\\r\\n marronnier, dans une petite guérite en sparterie et en toile au fond de laquelle j’étais assis et me croyais caché aux yeux des personnes qui pourraient venir faire visite à mes parents.\\r\\n </p>\\r\\n <p>\\r\\n Et ma pensée n’était-elle pas aussi comme une autre crèche au fond de laquelle je sentais que je restais enfoncé, même pour regarder ce qui se passait au dehors? Quand je voyais un objet extérieur, la conscience que je le voyais\\r\\n restait entre moi et lui, le bordait d’un mince liseré spirituel qui m’empêchait de jamais toucher directement sa matière; elle se volatilisait en quelque sorte avant que je prisse contact avec elle, comme un corps incandescent qu’on\\r\\n approche d’un objet mouillé ne touche pas son humidité parce qu’il se fait toujours précéder d’une zone d’évaporation. Dans l’espèce d’écran diapré d’états différents que, tandis que je lisais, déployait simultanément ma conscience,\\r\\n et qui allaient des aspirations les plus profondément cachées en moi-même jusqu’à la vision tout extérieure de l’horizon que j’avais, au bout du jardin, sous les yeux, ce qu’il y avait d’abord en moi, de plus intime, la poignée sans\\r\\n cesse en mouvement qui gouvernait le reste, c’était ma croyance en la richesse philosophique, en la beauté du livre que je lisais, et mon désir de me les approprier, quel que fût ce livre. Car, même si je l’avais acheté à Combray, en\\r\\n l’apercevant devant l’épicerie Borange, trop distante de la maison pour que Françoise pût s’y fournir comme chez Camus, mais mieux achalandée comme papeterie et librairie, retenu par des ficelles dans la mosaïque des brochures et des\\r\\n livraisons qui revêtaient les deux vantaux de sa porte plus mystérieuse, plus semée de pensées qu’une porte de cathédrale, c’est que je l’avais reconnu pour m’avoir été cité comme un ouvrage remarquable par le professeur ou le\\r\\n camarade qui me paraissait à cette époque détenir le secret de la vérité et de la beauté à demi pressenties, à demi incompréhensibles, dont la connaissance était le but vague mais permanent de ma pensée.\\r\\n </p>\\r\\n <p>\\r\\n Après cette croyance centrale qui, pendant ma lecture, exécutait d’incessants mouvements du dedans au dehors, vers la découverte de la vérité, venaient les émotions que me donnait l’action à laquelle je prenais part, car ces\\r\\n après-midi-là étaient plus remplis d’événements dramatiques que ne l’est souvent toute une vie. C’était les événements qui survenaient dans le livre que je lisais; il est vrai que les personnages qu’ils affectaient n’étaient pas\\r\\n «Réels», comme disait Françoise. Mais tous les sentiments que nous font éprouver la joie ou l’infortune d’un personnage réel ne se produisent en nous que par l’intermédiaire d’une image de cette joie ou de cette infortune;\\r\\n l’ingéniosité du premier romancier consista à comprendre que dans l’appareil de nos émotions, l’image étant le seul élément essentiel, la simplification qui consisterait à supprimer purement et simplement les personnages réels serait\\r\\n un perfectionnement décisif. Un être réel, si profondément que nous sympathisions avec lui, pour une grande part est perçu par nos sens, c’est-à-dire nous reste opaque, offre un poids mort que notre sensibilité ne peut soulever. Qu’un\\r\\n malheur le frappe, ce n’est qu’en une petite partie de la notion totale que nous avons de lui, que nous pourrons en être émus; bien plus, ce n’est qu’en une partie de la notion totale qu’il a de soi qu’il pourra l’être lui-même. La\\r\\n trouvaille du romancier a été d’avoir l’idée de remplacer ces parties impénétrables à l’âme par une quantité égale de parties immatérielles, c’est-à-dire que notre âme peut s’assimiler. Qu’importe dès lors que les actions, les\\r\\n émotions de ces êtres d’un nouveau genre nous apparaissent comme vraies, puisque nous les avons faites nôtres, puisque c’est en nous qu’elles se produisent, qu’elles tiennent sous leur dépendance, tandis que nous tournons\\r\\n fiévreusement les pages du livre, la rapidité de notre respiration et l’intensité de notre regard. Et une fois que le romancier nous a mis dans cet état, où comme dans tous les états purement intérieurs, toute émotion est décuplée, où\\r\\n son livre va nous troubler à la façon d’un rêve mais d’un rêve plus clair que ceux que nous avons en dormant et dont le souvenir durera davantage, alors, voici qu’il déchaîne en nous pendant une heure tous les bonheurs et tous les\\r\\n malheurs possibles dont nous mettrions dans la vie des années à connaître quelques-uns, et dont les plus intenses ne nous seraient jamais révélés parce que la lenteur avec laquelle ils se produisent nous en ôte la perception; (ainsi\\r\\n notre cœur change, dans la vie, et c’est la pire douleur; mais nous ne la connaissons que dans la lecture, en imagination: dans la réalité il change, comme certains phénomènes de la nature se produisent, assez lentement pour que, si\\r\\n nous pouvons constater successivement chacun de ses états différents, en revanche la sensation même du changement nous soit épargnée).\\r\\n </p>\\r\\n <p>\\r\\n Déjà moins intérieur à mon corps que cette vie des personnages, venait ensuite, à demi projeté devant moi, le paysage où se déroulait l’action et qui exerçait sur ma pensée une bien plus grande influence que l’autre, que celui que\\r\\n j’avais sous les yeux quand je les levais du livre. C’est ainsi que pendant deux étés, dans la chaleur du jardin de Combray, j’ai eu, à cause du livre que je lisais alors, la nostalgie d’un pays montueux et fluviatile, où je verrais\\r\\n beaucoup de scieries et où, au fond de l’eau claire, des morceaux de bois pourrissaient sous des touffes de cresson: non loin montaient le long de murs bas, des grappes de fleurs violettes et rougeâtres. Et comme le rêve d’une femme\\r\\n qui m’aurait aimé était toujours présent à ma pensée, ces étés-là ce rêve fut imprégné de la fraîcheur des eaux courantes; et quelle que fût la femme que j’évoquais, des grappes de fleurs violettes et rougeâtres s’élevaient aussitôt\\r\\n de chaque côté d’elle comme des couleurs complémentaires.\\r\\n </p>\\r\\n <p>\\r\\n Ce n’était pas seulement parce qu’une image dont nous rêvons reste toujours marquée, s’embellit et bénéficie du reflet des couleurs étrangères qui par hasard l’entourent dans notre rêverie; car ces paysages des livres que je lisais\\r\\n n’étaient pas pour moi que des paysages plus vivement représentés à mon imagination que ceux que Combray mettait sous mes yeux, mais qui eussent été analogues. Par le choix qu’en avait fait l’auteur, par la foi avec laquelle ma pensée\\r\\n allait au-devant de sa parole comme d’une révélation, ils me semblaient être—impression que ne me donnait guère le pays où je me trouvais, et surtout notre jardin, produit sans prestige de la correcte fantaisie du jardinier que\\r\\n méprisait ma grand’mère—une part véritable de la Nature elle-même, digne d’être étudiée et approfondie.\\r\\n </p>\\r\\n <p>\\r\\n Si mes parents m’avaient permis, quand je lisais un livre, d’aller visiter la région qu’il décrivait, j’aurais cru faire un pas inestimable dans la conquête de la vérité. Car si on a la sensation d’être toujours entouré de son âme, ce\\r\\n n’est pas comme d’une prison immobile: plutôt on est comme emporté avec elle dans un perpétuel élan pour la dépasser, pour atteindre à l’extérieur, avec une sorte de découragement, entendant toujours autour de soi cette sonorité\\r\\n identique qui n’est pas écho du dehors mais retentissement d’une vibration interne. On cherche à retrouver dans les choses, devenues par là précieuses, le reflet que notre âme a projeté sur elles; on est déçu en constatant qu’elles\\r\\n semblent dépourvues dans la nature, du charme qu’elles devaient, dans notre pensée, au voisinage de certaines idées; parfois on convertit toutes les forces de cette âme en habileté, en splendeur pour agir sur des êtres dont nous\\r\\n sentons bien qu’ils sont situés en dehors de nous et que nous ne les atteindrons jamais. Aussi, si j’imaginais toujours autour de la femme que j’aimais, les lieux que je désirais le plus alors, si j’eusse voulu que ce fût elle qui me\\r\\n les fît visiter, qui m’ouvrît l’accès d’un monde inconnu, ce n’était pas par le hasard d’une simple association de pensée; non, c’est que mes rêves de voyage et d’amour n’étaient que des moments—que je sépare artificiellement\\r\\n aujourd’hui comme si je pratiquais des sections à des hauteurs différentes d’un jet d’eau irisé et en apparence immobile—dans un même et infléchissable jaillissement de toutes les forces de ma vie.\\r\\n </p>\\r\\n <p>\\r\\n Enfin, en continuant à suivre du dedans au dehors les états simultanément juxtaposés dans ma conscience, et avant d’arriver jusqu’à l’horizon réel qui les enveloppait, je trouve des plaisirs d’un autre genre, celui d’être bien assis,\\r\\n de sentir la bonne odeur de l’air, de ne pas être dérangé par une visite; et, quand une heure sonnait au clocher de Saint-Hilaire, de voir tomber morceau par morceau ce qui de l’après-midi était déjà consommé, jusqu’à ce que\\r\\n j’entendisse le dernier coup qui me permettait de faire le total et après lequel, le long silence qui le suivait, semblait faire commencer, dans le ciel bleu, toute la partie qui m’était encore concédée pour lire jusqu’au bon dîner\\r\\n qu’apprêtait Françoise et qui me réconforterait des fatigues prises, pendant la lecture du livre, à la suite de son héros. Et à chaque heure il me semblait que c’était quelques instants seulement auparavant que la précédente avait\\r\\n sonné; la plus récente venait s’inscrire tout près de l’autre dans le ciel et je ne pouvais croire que soixante minutes eussent tenu dans ce petit arc bleu qui était compris entre leurs deux marques d’or. Quelquefois même cette heure\\r\\n prématurée sonnait deux coups de plus que la dernière; il y en avait donc une que je n’avais pas entendue, quelque chose qui avait eu lieu n’avait pas eu lieu pour moi; l’intérêt de la lecture, magique comme un profond sommeil, avait\\r\\n donné le change à mes oreilles hallucinées et effacé la cloche d’or sur la surface azurée du silence. Beaux après-midi du dimanche sous le marronnier du jardin de Combray, soigneusement vidés par moi des incidents médiocres de mon\\r\\n existence personnelle que j’y avais remplacés par une vie d’aventures et d’aspirations étranges au sein d’un pays arrosé d’eaux vives, vous m’évoquez encore cette vie quand je pense à vous et vous la contenez en effet pour l’avoir peu\\r\\n à peu contournée et enclose—tandis que je progressais dans ma lecture et que tombait la chaleur du jour—dans le cristal successif, lentement changeant et traversé de feuillages, de vos heures silencieuses, sonores, odorantes et\\r\\n limpides.\\r\\n </p>\\r\\n <p>\\r\\n Quelquefois j’étais tiré de ma lecture, dès le milieu de l’après-midi par la fille du jardinier, qui courait comme une folle, renversant sur son passage un oranger, se coupant un doigt, se cassant une dent et criant: «Les voilà, les\\r\\n voilà!» pour que Françoise et moi nous accourions et ne manquions rien du spectacle. C’était les jours où, pour des manœuvres de garnison, la troupe traversait Combray, prenant généralement la rue Sainte-Hildegarde. Tandis que nos\\r\\n domestiques, assis en rang sur des chaises en dehors de la grille, regardaient les promeneurs dominicaux de Combray et se faisaient voir d’eux, la fille du jardinier par la fente que laissaient entre elles deux maisons lointaines de\\r\\n l’avenue de la Gare, avait aperçu l’éclat des casques. Les domestiques avaient rentré précipitamment leurs chaises, car quand les cuirassiers défilaient rue Sainte-Hildegarde, ils en remplissaient toute la largeur, et le galop des\\r\\n chevaux rasait les maisons couvrant les trottoirs submergés comme des berges qui offrent un lit trop étroit à un torrent déchaîné.\\r\\n </p>\\r\\n <p>\\r\\n —«Pauvres enfants, disait Françoise à peine arrivée à la grille et déjà en larmes; pauvre jeunesse qui sera fauchée comme un pré; rien que d’y penser j’en suis choquée», ajoutait-elle en mettant la main sur son cœur, là où elle avait\\r\\n reçu ce choc.\\r\\n </p>\\r\\n <p>—«C’est beau, n’est-ce pas, madame Françoise, de voir des jeunes gens qui ne tiennent pas à la vie? disait le jardinier pour la faire «monter».</p>\\r\\n <p>Il n’avait pas parlé en vain:</p>\\r\\n <p>\\r\\n —«De ne pas tenir à la vie? Mais à quoi donc qu’il faut tenir, si ce n’est pas à la vie, le seul cadeau que le bon Dieu ne fasse jamais deux fois. Hélas! mon Dieu! C’est pourtant vrai qu’ils n’y tiennent pas! Je les ai vus en 70; ils\\r\\n n’ont plus peur de la mort, dans ces misérables guerres; c’est ni plus ni moins des fous; et puis ils ne valent plus la corde pour les pendre, ce n’est pas des hommes, c’est des lions.» (Pour Françoise la comparaison d’un homme à un\\r\\n lion, qu’elle prononçait li-on, n’avait rien de flatteur.)\\r\\n </p>\\r\\n <p>\\r\\n La rue Sainte-Hildegarde tournait trop court pour qu’on pût voir venir de loin, et c’était par cette fente entre les deux maisons de l’avenue de la gare qu’on apercevait toujours de nouveaux casques courant et brillant au soleil. Le\\r\\n jardinier aurait voulu savoir s’il y en avait encore beaucoup à passer, et il avait soif, car le soleil tapait. Alors tout d’un coup, sa fille s’élançant comme d’une place assiégée, faisait une sortie, atteignait l’angle de la rue, et\\r\\n après avoir bravé cent fois la mort, venait nous rapporter, avec une carafe de coco, la nouvelle qu’ils étaient bien un mille qui venaient sans arrêter, du côté de Thiberzy et de Méséglise. Françoise et le jardinier, réconciliés,\\r\\n discutaient sur la conduite à tenir en cas de guerre:\\r\\n </p>\\r\\n <p>—«Voyez-vous, Françoise, disait le jardinier, la révolution vaudrait mieux, parce que quand on la déclare il n’y a que ceux qui veulent partir qui y vont.»</p>\\r\\n <p>—«Ah! oui, au moins je comprends cela, c’est plus franc.»</p>\\r\\n <p>Le jardinier croyait qu’à la déclaration de guerre on arrêtait tous les chemins de fer.</p>\\r\\n <p>—«Pardi, pour pas qu’on se sauve», disait Françoise.</p>\\r\\n <p>\\r\\n Et le jardinier: «Ah! ils sont malins», car il n’admettait pas que la guerre ne fût pas une espèce de mauvais tour que l’État essayait de jouer au peuple et que, si on avait eu le moyen de le faire, il n’est pas une seule personne qui\\r\\n n’eût filé.\\r\\n </p>\\r\\n <p>\\r\\n Mais Françoise se hâtait de rejoindre ma tante, je retournais à mon livre, les domestiques se réinstallaient devant la porte à regarder tomber la poussière et l’émotion qu’avaient soulevées les soldats. Longtemps après que l’accalmie\\r\\n était venue, un flot inaccoutumé de promeneurs noircissait encore les rues de Combray. Et devant chaque maison, même celles où ce n’était pas l’habitude, les domestiques ou même les maîtres, assis et regardant, festonnaient le seuil\\r\\n d’un liséré capricieux et sombre comme celui des algues et des coquilles dont une forte marée laisse le crêpe et la broderie au rivage, après qu’elle s’est éloignée.\\r\\n </p>\\r\\n <p>\\r\\n Sauf ces jours-là, je pouvais d’habitude, au contraire, lire tranquille. Mais l’interruption et le commentaire qui furent apportés une fois par une visite de Swann à la lecture que j’étais en train de faire du livre d’un auteur tout\\r\\n nouveau pour moi, Bergotte, eut cette conséquence que, pour longtemps, ce ne fut plus sur un mur décoré de fleurs violettes en quenouille, mais sur un fond tout autre, devant le portail d’une cathédrale gothique, que se détacha\\r\\n désormais l’image d’une des femmes dont je rêvais.\\r\\n </p>\\r\\n <p>\\r\\n J’avais entendu parler de Bergotte pour la première fois par un de mes camarades plus âgé que moi et pour qui j’avais une grande admiration, Bloch. En m’entendant lui avouer mon admiration pour la Nuit d’Octobre, il avait fait éclater\\r\\n un rire bruyant comme une trompette et m’avait dit: «Défie-toi de ta dilection assez basse pour le sieur de Musset. C’est un coco des plus malfaisants et une assez sinistre brute. Je dois confesser, d’ailleurs, que lui et même le\\r\\n nommé Racine, ont fait chacun dans leur vie un vers assez bien rythmé, et qui a pour lui, ce qui est selon moi le mérite suprême, de ne signifier absolument rien. C’est: «La blanche Oloossone et la blanche Camire» et «La fille de\\r\\n Minos et de Pasiphaé». Ils m’ont été signalés à la décharge de ces deux malandrins par un article de mon très cher maître, le père Leconte, agréable aux Dieux Immortels. A propos voici un livre que je n’ai pas le temps de lire en ce\\r\\n moment qui est recommandé, paraît-il, par cet immense bonhomme. Il tient, m’a-t-on dit, l’auteur, le sieur Bergotte, pour un coco des plus subtils; et bien qu’il fasse preuve, des fois, de mansuétudes assez mal explicables, sa parole\\r\\n est pour moi oracle delphique. Lis donc ces proses lyriques, et si le gigantesque assembleur de rythmes qui a écrit Bhagavat et le Levrier de Magnus a dit vrai, par Apollôn, tu goûteras, cher maître, les joies nectaréennes de\\r\\n l’Olympos.» C’est sur un ton sarcastique qu’il m’avait demandé de l’appeler «cher maître» et qu’il m’appelait lui-même ainsi. Mais en réalité nous prenions un certain plaisir à ce jeu, étant encore rapprochés de l’âge où on croit\\r\\n qu’on crée ce qu’on nomme.\\r\\n </p>\\r\\n <p>\\r\\n Malheureusement, je ne pus pas apaiser en causant avec Bloch et en lui demandant des explications, le trouble où il m’avait jeté quand il m’avait dit que les beaux vers (à moi qui n’attendais d’eux rien moins que la révélation de la\\r\\n vérité) étaient d’autant plus beaux qu’ils ne signifiaient rien du tout. Bloch en effet ne fut pas réinvité à la maison. Il y avait d’abord été bien accueilli. Mon grand-père, il est vrai, prétendait que chaque fois que je me liais\\r\\n avec un de mes camarades plus qu’avec les autres et que je l’amenais chez nous, c’était toujours un juif, ce qui ne lui eût pas déplu en principe—même son ami Swann était d’origine juive—s’il n’avait trouvé que ce n’était pas\\r\\n d’habitude parmi les meilleurs que je le choisissais. Aussi quand j’amenais un nouvel ami il était bien rare qu’il ne fredonnât pas: «O Dieu de nos Pères» de la Juive ou bien «Israël romps ta chaîne», ne chantant que l’air\\r\\n naturellement (Ti la lam ta lam, talim), mais j’avais peur que mon camarade ne le connût et ne rétablît les paroles.\\r\\n </p>\\r\\n <p>\\r\\n Avant de les avoir vus, rien qu’en entendant leur nom qui, bien souvent, n’avait rien de particulièrement israélite, il devinait non seulement l’origine juive de ceux de mes amis qui l’étaient en effet, mais même ce qu’il y avait\\r\\n quelquefois de fâcheux dans leur famille.\\r\\n </p>\\r\\n <p>—«Et comment s’appelle-t-il ton ami qui vient ce soir?»</p>\\r\\n <p>—«Dumont, grand-père.»</p>\\r\\n <p>—«Dumont! Oh! je me méfie.»</p>\\r\\n <p>Et il chantait:</p>\\r\\n <p class=\\\"poem\\\">\\r\\n «Archers, faites bonne garde!<br />\\r\\n Veillez sans trêve et sans bruit»;\\r\\n </p>\\r\\n <p>\\r\\n Et après nous avoir posé adroitement quelques questions plus précises, il s’écriait: «À la garde! À la garde!» ou, si c’était le patient lui-même déjà arrivé qu’il avait forcé à son insu, par un interrogatoire dissimulé, à confesser\\r\\n ses origines, alors pour nous montrer qu’il n’avait plus aucun doute, il se contentait de nous regarder en fredonnant imperceptiblement:\\r\\n </p>\\r\\n <p class=\\\"poem\\\">\\r\\n «De ce timide Israëlite<br />\\r\\n Quoi! vous guidez ici les pas!»\\r\\n </p>\\r\\n <p>ou:</p>\\r\\n <p class=\\\"poem\\\">«Champs paternels, Hébron, douce vallée.»</p>\\r\\n <p>ou encore:</p>\\r\\n <p class=\\\"poem\\\">«Oui, je suis de la race élue.»</p>\\r\\n <p>\\r\\n Ces petites manies de mon grand-père n’impliquaient aucun sentiment malveillant à l’endroit de mes camarades. Mais Bloch avait déplu à mes parents pour d’autres raisons. Il avait commencé par agacer mon père qui, le voyant mouillé,\\r\\n lui avait dit avec intérêt:\\r\\n </p>\\r\\n <p>—«Mais, monsieur Bloch, quel temps fait-il donc, est-ce qu’il a plu? Je n’y comprends rien, le baromètre était excellent.»</p>\\r\\n <p>Il n’en avait tiré que cette réponse:</p>\\r\\n <p>—«Monsieur, je ne puis absolument vous dire s’il a plu. Je vis si résolument en dehors des contingences physiques que mes sens ne prennent pas la peine de me les notifier.»</p>\\r\\n <p>—«Mais, mon pauvre fils, il est idiot ton ami, m’avait dit mon père quand Bloch fut parti. Comment! il ne peut même pas me dire le temps qu’il fait! Mais il n’y a rien de plus intéressant! C’est un imbécile.</p>\\r\\n <p>Puis Bloch avait déplu à ma grand’mère parce que, après le déjeuner comme elle disait qu’elle était un peu souffrante, il avait étouffé un sanglot et essuyé des larmes.</p>\\r\\n <p>—«Comment veux-tu que ça soit sincère, me dit-elle, puisqu’il ne me connaît pas; ou bien alors il est fou.»</p>\\r\\n <p>Et enfin il avait mécontenté tout le monde parce que, étant venu déjeuner une heure et demie en retard et couvert de boue, au lieu de s’excuser, il avait dit:</p>\\r\\n <p>\\r\\n —«Je ne me laisse jamais influencer par les perturbations de l’atmosphère ni par les divisions conventionnelles du temps. Je réhabiliterais volontiers l’usage de la pipe d’opium et du kriss malais, mais j’ignore celui de ces\\r\\n instruments infiniment plus pernicieux et d’ailleurs platement bourgeois, la montre et le parapluie.»\\r\\n </p>\\r\\n <p>\\r\\n Il serait malgré tout revenu à Combray. Il n’était pas pourtant l’ami que mes parents eussent souhaité pour moi; ils avaient fini par penser que les larmes que lui avait fait verser l’indisposition de ma grand’mère n’étaient pas\\r\\n feintes; mais ils savaient d’instinct ou par expérience que les élans de notre sensibilité ont peu d’empire sur la suite de nos actes et la conduite de notre vie, et que le respect des obligations morales, la fidélité aux amis,\\r\\n l’exécution d’une œuvre, l’observance d’un régime, ont un fondement plus sûr dans des habitudes aveugles que dans ces transports momentanés, ardents et stériles. Ils auraient préféré pour moi à Bloch des compagnons qui ne me\\r\\n donneraient pas plus qu’il n’est convenu d’accorder à ses amis, selon les règles de la morale bourgeoise; qui ne m’enverraient pas inopinément une corbeille de fruits parce qu’ils auraient ce jour-là pensé à moi avec tendresse, mais\\r\\n qui, n’étant pas capables de faire pencher en ma faveur la juste balance des devoirs et des exigences de l’amitié sur un simple mouvement de leur imagination et de leur sensibilité, ne la fausseraient pas davantage à mon préjudice.\\r\\n Nos torts même font difficilement départir de ce qu’elles nous doivent ces natures dont ma grand’tante était le modèle, elle qui brouillée depuis des années avec une nièce à qui elle ne parlait jamais, ne modifia pas pour cela le\\r\\n testament où elle lui laissait toute sa fortune, parce que c’était sa plus proche parente et que cela «se devait».\\r\\n </p>\\r\\n <p>\\r\\n Mais j’aimais Bloch, mes parents voulaient me faire plaisir, les problèmes insolubles que je me posais à propos de la beauté dénuée de signification de la fille de Minos et de Pasiphaé me fatiguaient davantage et me rendaient plus\\r\\n souffrant que n’auraient fait de nouvelles conversations avec lui, bien que ma mère les jugeât pernicieuses. Et on l’aurait encore reçu à Combray si, après ce dîner, comme il venait de m’apprendre—nouvelle qui plus tard eut beaucoup\\r\\n d’influence sur ma vie, et la rendit plus heureuse, puis plus malheureuse—que toutes les femmes ne pensaient qu’à l’amour et qu’il n’y en a pas dont on ne pût vaincre les résistances, il ne m’avait assuré avoir entendu dire de la\\r\\n façon la plus certaine que ma grand’tante avait eu une jeunesse orageuse et avait été publiquement entretenue. Je ne pus me tenir de répéter ces propos à mes parents, on le mit à la porte quand il revint, et quand je l’abordai ensuite\\r\\n dans la rue, il fut extrêmement froid pour moi.\\r\\n </p>\\r\\n <p>Mais au sujet de Bergotte il avait dit vrai.</p>\\r\\n <p><!--end chapter--></p>\\r\\n <p>The rest of the text has been removed for performance reasons.</p>\\r\\n <div style=\\\"display: block; margin-top: 4em\\\"></div>\\r\\n <section class=\\\"pg-boilerplate pgheader\\\" id=\\\"pg-footer\\\" lang=\\\"en\\\">\\r\\n <div id=\\\"pg-end-separator\\\">\\r\\n <span>*** END OF THE PROJECT GUTENBERG EBOOK DU CÔTÉ DE CHEZ SWANN ***</span>\\r\\n </div>\\r\\n\\r\\n <div>Updated editions will replace the previous one—the old editions will be renamed.</div>\\r\\n\\r\\n <div>\\r\\n Creating the works from print editions not protected by U.S. copyright law means that no one owns a United States copyright in these works, so the Foundation (and you!) can copy and distribute it in the United States without\\r\\n permission and without paying copyright royalties. Special rules, set forth in the General Terms of Use part of this license, apply to copying and distributing Project Gutenberg™ electronic works to protect the PROJECT GUTENBERG™\\r\\n concept and trademark. Project Gutenberg is a registered trademark, and may not be used if you charge for an eBook, except by following the terms of the trademark license, including paying royalties for use of the Project Gutenberg\\r\\n trademark. If you do not charge anything for copies of this eBook, complying with the trademark license is very easy. You may use this eBook for nearly any purpose such as creation of derivative works, reports, performances and\\r\\n research. Project Gutenberg eBooks may be modified and printed and given away—you may do practically ANYTHING in the United States with eBooks not protected by U.S. copyright law. Redistribution is subject to the trademark license,\\r\\n especially commercial redistribution.\\r\\n </div>\\r\\n\\r\\n <div id=\\\"project-gutenberg-license\\\">START: FULL LICENSE</div>\\r\\n <h2 id=\\\"pg-footer-heading\\\">THE FULL PROJECT GUTENBERG LICENSE</h2>\\r\\n <div class=\\\"agate\\\">PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK</div>\\r\\n\\r\\n <div>\\r\\n To protect the Project Gutenberg™ mission of promoting the free distribution of electronic works, by using or distributing this work (or any other work associated in any way with the phrase “Project Gutenberg”), you agree to comply\\r\\n with all the terms of the Full Project Gutenberg™ License available with this file or online at www.gutenberg.org/license.\\r\\n </div>\\r\\n\\r\\n <div class=\\\"secthead\\\">Section 1. General Terms of Use and Redistributing Project Gutenberg™ electronic works</div>\\r\\n\\r\\n <div>\\r\\n 1.A. By reading or using any part of this Project Gutenberg™ electronic work, you indicate that you have read, understand, agree to and accept all the terms of this license and intellectual property (trademark/copyright) agreement. If\\r\\n you do not agree to abide by all the terms of this agreement, you must cease using and return or destroy all copies of Project Gutenberg™ electronic works in your possession. If you paid a fee for obtaining a copy of or access to a\\r\\n Project Gutenberg™ electronic work and you do not agree to be bound by the terms of this agreement, you may obtain a refund from the person or entity to whom you paid the fee as set forth in paragraph 1.E.8.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.B. “Project Gutenberg” is a registered trademark. It may only be used on or associated in any way with an electronic work by people who agree to be bound by the terms of this agreement. There are a few things that you can do with\\r\\n most Project Gutenberg™ electronic works even without complying with the full terms of this agreement. See paragraph 1.C below. There are a lot of things you can do with Project Gutenberg™ electronic works if you follow the terms of\\r\\n this agreement and help preserve free future access to Project Gutenberg™ electronic works. See paragraph 1.E below.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.C. The Project Gutenberg Literary Archive Foundation (“the Foundation” or PGLAF), owns a compilation copyright in the collection of Project Gutenberg™ electronic works. Nearly all the individual works in the collection are in the\\r\\n public domain in the United States. If an individual work is unprotected by copyright law in the United States and you are located in the United States, we do not claim a right to prevent you from copying, distributing, performing,\\r\\n displaying or creating derivative works based on the work as long as all references to Project Gutenberg are removed. Of course, we hope that you will support the Project Gutenberg™ mission of promoting free access to electronic works\\r\\n by freely sharing Project Gutenberg™ works in compliance with the terms of this agreement for keeping the Project Gutenberg™ name associated with the work. You can easily comply with the terms of this agreement by keeping this work in\\r\\n the same format with its attached full Project Gutenberg™ License when you share it without charge with others.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.D. The copyright laws of the place where you are located also govern what you can do with this work. Copyright laws in most countries are in a constant state of change. If you are outside the United States, check the laws of your\\r\\n country in addition to the terms of this agreement before downloading, copying, displaying, performing, distributing or creating derivative works based on this work or any other Project Gutenberg™ work. The Foundation makes no\\r\\n representations concerning the copyright status of any work in any country other than the United States.\\r\\n </div>\\r\\n\\r\\n <div>1.E. Unless you have removed all references to Project Gutenberg:</div>\\r\\n\\r\\n <div>\\r\\n 1.E.1. The following sentence, with active links to, or other immediate access to, the full Project Gutenberg™ License must appear prominently whenever any copy of a Project Gutenberg™ work (any work on which the phrase “Project\\r\\n Gutenberg” appears, or with which the phrase “Project Gutenberg” is associated) is accessed, displayed, performed, viewed, copied or distributed:\\r\\n </div>\\r\\n\\r\\n <blockquote>\\r\\n <div>\\r\\n This eBook is for the use of anyone anywhere in the United States and most other parts of the world at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Project\\r\\n Gutenberg License included with this eBook or online at <a href=\\\"https://www.gutenberg.org\\\">www.gutenberg.org</a>. If you are not located in the United States, you will have to check the laws of the country where you are located\\r\\n before using this eBook.\\r\\n </div>\\r\\n </blockquote>\\r\\n\\r\\n <div>\\r\\n 1.E.2. If an individual Project Gutenberg™ electronic work is derived from texts not protected by U.S. copyright law (does not contain a notice indicating that it is posted with permission of the copyright holder), the work can be\\r\\n copied and distributed to anyone in the United States without paying any fees or charges. If you are redistributing or providing access to a work with the phrase “Project Gutenberg” associated with or appearing on the work, you must\\r\\n comply either with the requirements of paragraphs 1.E.1 through 1.E.7 or obtain permission for the use of the work and the Project Gutenberg™ trademark as set forth in paragraphs 1.E.8 or 1.E.9.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.E.3. If an individual Project Gutenberg™ electronic work is posted with the permission of the copyright holder, your use and distribution must comply with both paragraphs 1.E.1 through 1.E.7 and any additional terms imposed by the\\r\\n copyright holder. Additional terms will be linked to the Project Gutenberg™ License for all works posted with the permission of the copyright holder found at the beginning of this work.\\r\\n </div>\\r\\n\\r\\n <div>1.E.4. Do not unlink or detach or remove the full Project Gutenberg™ License terms from this work, or any files containing a part of this work or any other work associated with Project Gutenberg™.</div>\\r\\n\\r\\n <div>\\r\\n 1.E.5. Do not copy, display, perform, distribute or redistribute this electronic work, or any part of this electronic work, without prominently displaying the sentence set forth in paragraph 1.E.1 with active links or immediate access\\r\\n to the full terms of the Project Gutenberg™ License.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.E.6. You may convert to and distribute this work in any binary, compressed, marked up, nonproprietary or proprietary form, including any word processing or hypertext form. However, if you provide access to or distribute copies of a\\r\\n Project Gutenberg™ work in a format other than “Plain Vanilla ASCII” or other format used in the official version posted on the official Project Gutenberg™ website (www.gutenberg.org), you must, at no additional cost, fee or expense\\r\\n to the user, provide a copy, a means of exporting a copy, or a means of obtaining a copy upon request, of the work in its original “Plain Vanilla ASCII” or other form. Any alternate format must include the full Project Gutenberg™\\r\\n License as specified in paragraph 1.E.1.\\r\\n </div>\\r\\n\\r\\n <div>1.E.7. Do not charge a fee for access to, viewing, displaying, performing, copying or distributing any Project Gutenberg™ works unless you comply with paragraph 1.E.8 or 1.E.9.</div>\\r\\n\\r\\n <div>1.E.8. You may charge a reasonable fee for copies of or providing access to or distributing Project Gutenberg™ electronic works provided that:</div>\\r\\n\\r\\n <ul>\\r\\n <li>\\r\\n • You pay a royalty fee of 20% of the gross profits you derive from the use of Project Gutenberg™ works calculated using the method you already use to calculate your applicable taxes. The fee is owed to the owner of the Project\\r\\n Gutenberg™ trademark, but he has agreed to donate royalties under this paragraph to the Project Gutenberg Literary Archive Foundation. Royalty payments must be paid within 60 days following each date on which you prepare (or are\\r\\n legally required to prepare) your periodic tax returns. Royalty payments should be clearly marked as such and sent to the Project Gutenberg Literary Archive Foundation at the address specified in Section 4, “Information about\\r\\n donations to the Project Gutenberg Literary Archive Foundation.”\\r\\n </li>\\r\\n\\r\\n <li>\\r\\n • You provide a full refund of any money paid by a user who notifies you in writing (or by e-mail) within 30 days of receipt that s/he does not agree to the terms of the full Project Gutenberg™ License. You must require such a\\r\\n user to return or destroy all copies of the works possessed in a physical medium and discontinue all use of and all access to other copies of Project Gutenberg™ works.\\r\\n </li>\\r\\n\\r\\n <li>• You provide, in accordance with paragraph 1.F.3, a full refund of any money paid for a work or a replacement copy, if a defect in the electronic work is discovered and reported to you within 90 days of receipt of the work.</li>\\r\\n\\r\\n <li>• You comply with all other terms of this agreement for free distribution of Project Gutenberg™ works.</li>\\r\\n </ul>\\r\\n\\r\\n <div>\\r\\n 1.E.9. If you wish to charge a fee or distribute a Project Gutenberg™ electronic work or group of works on different terms than are set forth in this agreement, you must obtain permission in writing from the Project Gutenberg Literary\\r\\n Archive Foundation, the manager of the Project Gutenberg™ trademark. Contact the Foundation as set forth in Section 3 below.\\r\\n </div>\\r\\n\\r\\n <div>1.F.</div>\\r\\n\\r\\n <div>\\r\\n 1.F.1. Project Gutenberg volunteers and employees expend considerable effort to identify, do copyright research on, transcribe and proofread works not protected by U.S. copyright law in creating the Project Gutenberg™ collection.\\r\\n Despite these efforts, Project Gutenberg™ electronic works, and the medium on which they may be stored, may contain “Defects,” such as, but not limited to, incomplete, inaccurate or corrupt data, transcription errors, a copyright or\\r\\n other intellectual property infringement, a defective or damaged disk or other medium, a computer virus, or computer codes that damage or cannot be read by your equipment.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the “Right of Replacement or Refund” described in paragraph 1.F.3, the Project Gutenberg Literary Archive Foundation, the owner of the Project Gutenberg™ trademark, and any\\r\\n other party distributing a Project Gutenberg™ electronic work under this agreement, disclaim all liability to you for damages, costs and expenses, including legal fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT\\r\\n LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE TO YOU FOR ACTUAL, DIRECT,\\r\\n INDIRECT, CONSEQUENTIAL, PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a defect in this electronic work within 90 days of receiving it, you can receive a refund of the money (if any) you paid for it by sending a written explanation to the\\r\\n person you received the work from. If you received the work on a physical medium, you must return the medium with your written explanation. The person or entity that provided you with the defective work may elect to provide a\\r\\n replacement copy in lieu of a refund. If you received the work electronically, the person or entity providing it to you may choose to give you a second opportunity to receive the work electronically in lieu of a refund. If the second\\r\\n copy is also defective, you may demand a refund in writing without further opportunities to fix the problem.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.F.4. Except for the limited right of replacement or refund set forth in paragraph 1.F.3, this work is provided to you ‘AS-IS’, WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF\\r\\n MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.F.5. Some states do not allow disclaimers of certain implied warranties or the exclusion or limitation of certain types of damages. If any disclaimer or limitation set forth in this agreement violates the law of the state applicable\\r\\n to this agreement, the agreement shall be interpreted to make the maximum disclaimer or limitation permitted by the applicable state law. The invalidity or unenforceability of any provision of this agreement shall not void the\\r\\n remaining provisions.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n 1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the trademark owner, any agent or employee of the Foundation, anyone providing copies of Project Gutenberg™ electronic works in accordance with this agreement, and any\\r\\n volunteers associated with the production, promotion and distribution of Project Gutenberg™ electronic works, harmless from all liability, costs and expenses, including legal fees, that arise directly or indirectly from any of the\\r\\n following which you do or cause to occur: (a) distribution of this or any Project Gutenberg™ work, (b) alteration, modification, or additions or deletions to any Project Gutenberg™ work, and (c) any Defect you cause.\\r\\n </div>\\r\\n\\r\\n <div class=\\\"secthead\\\">Section 2. Information about the Mission of Project Gutenberg™</div>\\r\\n\\r\\n <div>\\r\\n Project Gutenberg™ is synonymous with the free distribution of electronic works in formats readable by the widest variety of computers including obsolete, old, middle-aged and new computers. It exists because of the efforts of\\r\\n hundreds of volunteers and donations from people in all walks of life.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n Volunteers and financial support to provide volunteers with the assistance they need are critical to reaching Project Gutenberg™’s goals and ensuring that the Project Gutenberg™ collection will remain freely available for generations\\r\\n to come. In 2001, the Project Gutenberg Literary Archive Foundation was created to provide a secure and permanent future for Project Gutenberg™ and future generations. To learn more about the Project Gutenberg Literary Archive\\r\\n Foundation and how your efforts and donations can help, see Sections 3 and 4 and the Foundation information page at www.gutenberg.org.\\r\\n </div>\\r\\n\\r\\n <div class=\\\"secthead\\\">Section 3. Information about the Project Gutenberg Literary Archive Foundation</div>\\r\\n\\r\\n <div>\\r\\n The Project Gutenberg Literary Archive Foundation is a non-profit 501(c)(3) educational corporation organized under the laws of the state of Mississippi and granted tax exempt status by the Internal Revenue Service. The Foundation’s\\r\\n EIN or federal tax identification number is 64-6221541. Contributions to the Project Gutenberg Literary Archive Foundation are tax deductible to the full extent permitted by U.S. federal laws and your state’s laws.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n The Foundation’s business office is located at 809 North 1500 West, Salt Lake City, UT 84116, (801) 596-1887. Email contact links and up to date contact information can be found at the Foundation’s website and official page at\\r\\n www.gutenberg.org/contact\\r\\n </div>\\r\\n\\r\\n <div class=\\\"secthead\\\">Section 4. Information about Donations to the Project Gutenberg Literary Archive Foundation</div>\\r\\n\\r\\n <div>\\r\\n Project Gutenberg™ depends upon and cannot survive without widespread public support and donations to carry out its mission of increasing the number of public domain and licensed works that can be freely distributed in\\r\\n machine-readable form accessible by the widest array of equipment including outdated equipment. Many small donations ($1 to $5,000) are particularly important to maintaining tax exempt status with the IRS.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n The Foundation is committed to complying with the laws regulating charities and charitable donations in all 50 states of the United States. Compliance requirements are not uniform and it takes a considerable effort, much paperwork and\\r\\n many fees to meet and keep up with these requirements. We do not solicit donations in locations where we have not received written confirmation of compliance. To SEND DONATIONS or determine the status of compliance for any particular\\r\\n state visit <a href=\\\"https://www.gutenberg.org/donate/\\\">www.gutenberg.org/donate</a>.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n While we cannot and do not solicit contributions from states where we have not met the solicitation requirements, we know of no prohibition against accepting unsolicited donations from donors in such states who approach us with offers\\r\\n to donate.\\r\\n </div>\\r\\n\\r\\n <div>International donations are gratefully accepted, but we cannot make any statements concerning tax treatment of donations received from outside the United States. U.S. laws alone swamp our small staff.</div>\\r\\n\\r\\n <div>\\r\\n Please check the Project Gutenberg web pages for current donation methods and addresses. Donations are accepted in a number of other ways including checks, online payments and credit card donations. To donate, please visit:\\r\\n www.gutenberg.org/donate\\r\\n </div>\\r\\n\\r\\n <div class=\\\"secthead\\\">Section 5. General Information About Project Gutenberg™ electronic works</div>\\r\\n\\r\\n <div>\\r\\n Professor Michael S. Hart was the originator of the Project Gutenberg™ concept of a library of electronic works that could be freely shared with anyone. For forty years, he produced and distributed Project Gutenberg™ eBooks with only\\r\\n a loose network of volunteer support.\\r\\n </div>\\r\\n\\r\\n <div>\\r\\n Project Gutenberg™ eBooks are often created from several printed editions, all of which are confirmed as not protected by copyright in the U.S. unless a copyright notice is included. Thus, we do not necessarily keep eBooks in\\r\\n compliance with any particular paper edition.\\r\\n </div>\\r\\n\\r\\n <div>Most people start at our website which has the main PG search facility: <a href=\\\"https://www.gutenberg.org\\\">www.gutenberg.org</a>.</div>\\r\\n\\r\\n <div>\\r\\n This website includes information about Project Gutenberg™, including how to make donations to the Project Gutenberg Literary Archive Foundation, how to help produce our new eBooks, and how to subscribe to our email newsletter to hear\\r\\n about new eBooks.\\r\\n </div>\\r\\n </section>\\r\\n\"","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n this.content = content;\n}\n\nOrderedMap.prototype = {\n constructor: OrderedMap,\n\n find: function(key) {\n for (var i = 0; i < this.content.length; i += 2)\n if (this.content[i] === key) return i\n return -1\n },\n\n // :: (string) → ?any\n // Retrieve the value stored under `key`, or return undefined when\n // no such key exists.\n get: function(key) {\n var found = this.find(key);\n return found == -1 ? undefined : this.content[found + 1]\n },\n\n // :: (string, any, ?string) → OrderedMap\n // Create a new map by replacing the value of `key` with a new\n // value, or adding a binding to the end of the map. If `newKey` is\n // given, the key of the binding will be replaced with that key.\n update: function(key, value, newKey) {\n var self = newKey && newKey != key ? this.remove(newKey) : this;\n var found = self.find(key), content = self.content.slice();\n if (found == -1) {\n content.push(newKey || key, value);\n } else {\n content[found + 1] = value;\n if (newKey) content[found] = newKey;\n }\n return new OrderedMap(content)\n },\n\n // :: (string) → OrderedMap\n // Return a map with the given key removed, if it existed.\n remove: function(key) {\n var found = this.find(key);\n if (found == -1) return this\n var content = this.content.slice();\n content.splice(found, 2);\n return new OrderedMap(content)\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the start of the map.\n addToStart: function(key, value) {\n return new OrderedMap([key, value].concat(this.remove(key).content))\n },\n\n // :: (string, any) → OrderedMap\n // Add a new key to the end of the map.\n addToEnd: function(key, value) {\n var content = this.remove(key).content.slice();\n content.push(key, value);\n return new OrderedMap(content)\n },\n\n // :: (string, string, any) → OrderedMap\n // Add a key after the given key. If `place` is not found, the new\n // key is added to the end.\n addBefore: function(place, key, value) {\n var without = this.remove(key), content = without.content.slice();\n var found = without.find(place);\n content.splice(found == -1 ? content.length : found, 0, key, value);\n return new OrderedMap(content)\n },\n\n // :: ((key: string, value: any))\n // Call the given function for each key/value pair in the map, in\n // order.\n forEach: function(f) {\n for (var i = 0; i < this.content.length; i += 2)\n f(this.content[i], this.content[i + 1]);\n },\n\n // :: (union<Object, OrderedMap>) → OrderedMap\n // Create a new map by prepending the keys in this map that don't\n // appear in `map` before the keys in `map`.\n prepend: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(map.content.concat(this.subtract(map).content))\n },\n\n // :: (union<Object, OrderedMap>) → OrderedMap\n // Create a new map by appending the keys in this map that don't\n // appear in `map` after the keys in `map`.\n append: function(map) {\n map = OrderedMap.from(map);\n if (!map.size) return this\n return new OrderedMap(this.subtract(map).content.concat(map.content))\n },\n\n // :: (union<Object, OrderedMap>) → OrderedMap\n // Create a map containing all the keys in this map that don't\n // appear in `map`.\n subtract: function(map) {\n var result = this;\n map = OrderedMap.from(map);\n for (var i = 0; i < map.content.length; i += 2)\n result = result.remove(map.content[i]);\n return result\n },\n\n // :: () → Object\n // Turn ordered map into a plain object.\n toObject: function() {\n var result = {};\n this.forEach(function(key, value) { result[key] = value; });\n return result\n },\n\n // :: number\n // The amount of keys in this map.\n get size() {\n return this.content.length >> 1\n }\n};\n\n// :: (?union<Object, OrderedMap>) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n if (value instanceof OrderedMap) return value\n var content = [];\n if (value) for (var prop in value) content.push(prop, value[prop]);\n return new OrderedMap(content)\n};\n\nexport default OrderedMap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n for (let i = 0;; i++) {\n if (i == a.childCount || i == b.childCount)\n return a.childCount == b.childCount ? null : pos;\n let childA = a.child(i), childB = b.child(i);\n if (childA == childB) {\n pos += childA.nodeSize;\n continue;\n }\n if (!childA.sameMarkup(childB))\n return pos;\n if (childA.isText && childA.text != childB.text) {\n for (let j = 0; childA.text[j] == childB.text[j]; j++)\n pos++;\n return pos;\n }\n if (childA.content.size || childB.content.size) {\n let inner = findDiffStart(childA.content, childB.content, pos + 1);\n if (inner != null)\n return inner;\n }\n pos += childA.nodeSize;\n }\n}\nfunction findDiffEnd(a, b, posA, posB) {\n for (let iA = a.childCount, iB = b.childCount;;) {\n if (iA == 0 || iB == 0)\n return iA == iB ? null : { a: posA, b: posB };\n let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n if (childA == childB) {\n posA -= size;\n posB -= size;\n continue;\n }\n if (!childA.sameMarkup(childB))\n return { a: posA, b: posB };\n if (childA.isText && childA.text != childB.text) {\n let same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n same++;\n posA--;\n posB--;\n }\n return { a: posA, b: posB };\n }\n if (childA.content.size || childB.content.size) {\n let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n if (inner)\n return inner;\n }\n posA -= size;\n posB -= size;\n }\n}\n\n/**\nA fragment represents a node's collection of child nodes.\n\nLike nodes, fragments are persistent data structures, and you\nshould not mutate them or their content. Rather, you create new\ninstances whenever needed. The API tries to make this easy.\n*/\nclass Fragment {\n /**\n @internal\n */\n constructor(\n /**\n @internal\n */\n content, size) {\n this.content = content;\n this.size = size || 0;\n if (size == null)\n for (let i = 0; i < content.length; i++)\n this.size += content[i].nodeSize;\n }\n /**\n Invoke a callback for all descendant nodes between the given two\n positions (relative to start of this fragment). Doesn't descend\n into a node when the callback returns `false`.\n */\n nodesBetween(from, to, f, nodeStart = 0, parent) {\n for (let i = 0, pos = 0; pos < to; i++) {\n let child = this.content[i], end = pos + child.nodeSize;\n if (end > from && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) {\n let start = pos + 1;\n child.nodesBetween(Math.max(0, from - start), Math.min(child.content.size, to - start), f, nodeStart + start);\n }\n pos = end;\n }\n }\n /**\n Call the given callback for every descendant node. `pos` will be\n relative to the start of the fragment. The callback may return\n `false` to prevent traversal of a given node's children.\n */\n descendants(f) {\n this.nodesBetween(0, this.size, f);\n }\n /**\n Extract the text between `from` and `to`. See the same method on\n [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).\n */\n textBetween(from, to, blockSeparator, leafText) {\n let text = \"\", separated = true;\n this.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n text += node.text.slice(Math.max(from, pos) - pos, to - pos);\n separated = !blockSeparator;\n }\n else if (node.isLeaf) {\n if (leafText) {\n text += typeof leafText === \"function\" ? leafText(node) : leafText;\n }\n else if (node.type.spec.leafText) {\n text += node.type.spec.leafText(node);\n }\n separated = !blockSeparator;\n }\n else if (!separated && node.isBlock) {\n text += blockSeparator;\n separated = true;\n }\n }, 0);\n return text;\n }\n /**\n Create a new fragment containing the combined content of this\n fragment and the other.\n */\n append(other) {\n if (!other.size)\n return this;\n if (!this.size)\n return other;\n let last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n if (last.isText && last.sameMarkup(first)) {\n content[content.length - 1] = last.withText(last.text + first.text);\n i = 1;\n }\n for (; i < other.content.length; i++)\n content.push(other.content[i]);\n return new Fragment(content, this.size + other.size);\n }\n /**\n Cut out the sub-fragment between the two given positions.\n */\n cut(from, to = this.size) {\n if (from == 0 && to == this.size)\n return this;\n let result = [], size = 0;\n if (to > from)\n for (let i = 0, pos = 0; pos < to; i++) {\n let child = this.content[i], end = pos + child.nodeSize;\n if (end > from) {\n if (pos < from || end > to) {\n if (child.isText)\n child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos));\n else\n child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1));\n }\n result.push(child);\n size += child.nodeSize;\n }\n pos = end;\n }\n return new Fragment(result, size);\n }\n /**\n @internal\n */\n cutByIndex(from, to) {\n if (from == to)\n return Fragment.empty;\n if (from == 0 && to == this.content.length)\n return this;\n return new Fragment(this.content.slice(from, to));\n }\n /**\n Create a new fragment in which the node at the given index is\n replaced by the given node.\n */\n replaceChild(index, node) {\n let current = this.content[index];\n if (current == node)\n return this;\n let copy = this.content.slice();\n let size = this.size + node.nodeSize - current.nodeSize;\n copy[index] = node;\n return new Fragment(copy, size);\n }\n /**\n Create a new fragment by prepending the given node to this\n fragment.\n */\n addToStart(node) {\n return new Fragment([node].concat(this.content), this.size + node.nodeSize);\n }\n /**\n Create a new fragment by appending the given node to this\n fragment.\n */\n addToEnd(node) {\n return new Fragment(this.content.concat(node), this.size + node.nodeSize);\n }\n /**\n Compare this fragment to another one.\n */\n eq(other) {\n if (this.content.length != other.content.length)\n return false;\n for (let i = 0; i < this.content.length; i++)\n if (!this.content[i].eq(other.content[i]))\n return false;\n return true;\n }\n /**\n The first child of the fragment, or `null` if it is empty.\n */\n get firstChild() { return this.content.length ? this.content[0] : null; }\n /**\n The last child of the fragment, or `null` if it is empty.\n */\n get lastChild() { return this.content.length ? this.content[this.content.length - 1] : null; }\n /**\n The number of child nodes in this fragment.\n */\n get childCount() { return this.content.length; }\n /**\n Get the child node at the given index. Raise an error when the\n index is out of range.\n */\n child(index) {\n let found = this.content[index];\n if (!found)\n throw new RangeError(\"Index \" + index + \" out of range for \" + this);\n return found;\n }\n /**\n Get the child node at the given index, if it exists.\n */\n maybeChild(index) {\n return this.content[index] || null;\n }\n /**\n Call `f` for every child node, passing the node, its offset\n into this parent node, and its index.\n */\n forEach(f) {\n for (let i = 0, p = 0; i < this.content.length; i++) {\n let child = this.content[i];\n f(child, p, i);\n p += child.nodeSize;\n }\n }\n /**\n Find the first position at which this fragment and another\n fragment differ, or `null` if they are the same.\n */\n findDiffStart(other, pos = 0) {\n return findDiffStart(this, other, pos);\n }\n /**\n Find the first position, searching from the end, at which this\n fragment and the given fragment differ, or `null` if they are\n the same. Since this position will not be the same in both\n nodes, an object with two separate positions is returned.\n */\n findDiffEnd(other, pos = this.size, otherPos = other.size) {\n return findDiffEnd(this, other, pos, otherPos);\n }\n /**\n Find the index and inner offset corresponding to a given relative\n position in this fragment. The result object will be reused\n (overwritten) the next time the function is called. (Not public.)\n */\n findIndex(pos, round = -1) {\n if (pos == 0)\n return retIndex(0, pos);\n if (pos == this.size)\n return retIndex(this.content.length, pos);\n if (pos > this.size || pos < 0)\n throw new RangeError(`Position ${pos} outside of fragment (${this})`);\n for (let i = 0, curPos = 0;; i++) {\n let cur = this.child(i), end = curPos + cur.nodeSize;\n if (end >= pos) {\n if (end == pos || round > 0)\n return retIndex(i + 1, end);\n return retIndex(i, curPos);\n }\n curPos = end;\n }\n }\n /**\n Return a debugging string that describes this fragment.\n */\n toString() { return \"<\" + this.toStringInner() + \">\"; }\n /**\n @internal\n */\n toStringInner() { return this.content.join(\", \"); }\n /**\n Create a JSON-serializeable representation of this fragment.\n */\n toJSON() {\n return this.content.length ? this.content.map(n => n.toJSON()) : null;\n }\n /**\n Deserialize a fragment from its JSON representation.\n */\n static fromJSON(schema, value) {\n if (!value)\n return Fragment.empty;\n if (!Array.isArray(value))\n throw new RangeError(\"Invalid input for Fragment.fromJSON\");\n return new Fragment(value.map(schema.nodeFromJSON));\n }\n /**\n Build a fragment from an array of nodes. Ensures that adjacent\n text nodes with the same marks are joined together.\n */\n static fromArray(array) {\n if (!array.length)\n return Fragment.empty;\n let joined, size = 0;\n for (let i = 0; i < array.length; i++) {\n let node = array[i];\n size += node.nodeSize;\n if (i && node.isText && array[i - 1].sameMarkup(node)) {\n if (!joined)\n joined = array.slice(0, i);\n joined[joined.length - 1] = node\n .withText(joined[joined.length - 1].text + node.text);\n }\n else if (joined) {\n joined.push(node);\n }\n }\n return new Fragment(joined || array, size);\n }\n /**\n Create a fragment from something that can be interpreted as a\n set of nodes. For `null`, it returns the empty fragment. For a\n fragment, the fragment itself. For a node or array of nodes, a\n fragment containing those nodes.\n */\n static from(nodes) {\n if (!nodes)\n return Fragment.empty;\n if (nodes instanceof Fragment)\n return nodes;\n if (Array.isArray(nodes))\n return this.fromArray(nodes);\n if (nodes.attrs)\n return new Fragment([nodes], nodes.nodeSize);\n throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"));\n }\n}\n/**\nAn empty fragment. Intended to be reused whenever a node doesn't\ncontain anything (rather than allocating a new empty fragment for\neach leaf node).\n*/\nFragment.empty = new Fragment([], 0);\nconst found = { index: 0, offset: 0 };\nfunction retIndex(index, offset) {\n found.index = index;\n found.offset = offset;\n return found;\n}\n\nfunction compareDeep(a, b) {\n if (a === b)\n return true;\n if (!(a && typeof a == \"object\") ||\n !(b && typeof b == \"object\"))\n return false;\n let array = Array.isArray(a);\n if (Array.isArray(b) != array)\n return false;\n if (array) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!compareDeep(a[i], b[i]))\n return false;\n }\n else {\n for (let p in a)\n if (!(p in b) || !compareDeep(a[p], b[p]))\n return false;\n for (let p in b)\n if (!(p in a))\n return false;\n }\n return true;\n}\n\n/**\nA mark is a piece of information that can be attached to a node,\nsuch as it being emphasized, in code font, or a link. It has a\ntype and optionally a set of attributes that provide further\ninformation (such as the target of the link). Marks are created\nthrough a `Schema`, which controls which types exist and which\nattributes they have.\n*/\nclass Mark {\n /**\n @internal\n */\n constructor(\n /**\n The type of this mark.\n */\n type, \n /**\n The attributes associated with this mark.\n */\n attrs) {\n this.type = type;\n this.attrs = attrs;\n }\n /**\n Given a set of marks, create a new set which contains this one as\n well, in the right position. If this mark is already in the set,\n the set itself is returned. If any marks that are set to be\n [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,\n those are replaced by this one.\n */\n addToSet(set) {\n let copy, placed = false;\n for (let i = 0; i < set.length; i++) {\n let other = set[i];\n if (this.eq(other))\n return set;\n if (this.type.excludes(other.type)) {\n if (!copy)\n copy = set.slice(0, i);\n }\n else if (other.type.excludes(this.type)) {\n return set;\n }\n else {\n if (!placed && other.type.rank > this.type.rank) {\n if (!copy)\n copy = set.slice(0, i);\n copy.push(this);\n placed = true;\n }\n if (copy)\n copy.push(other);\n }\n }\n if (!copy)\n copy = set.slice();\n if (!placed)\n copy.push(this);\n return copy;\n }\n /**\n Remove this mark from the given set, returning a new set. If this\n mark is not in the set, the set itself is returned.\n */\n removeFromSet(set) {\n for (let i = 0; i < set.length; i++)\n if (this.eq(set[i]))\n return set.slice(0, i).concat(set.slice(i + 1));\n return set;\n }\n /**\n Test whether this mark is in the given set of marks.\n */\n isInSet(set) {\n for (let i = 0; i < set.length; i++)\n if (this.eq(set[i]))\n return true;\n return false;\n }\n /**\n Test whether this mark has the same type and attributes as\n another mark.\n */\n eq(other) {\n return this == other ||\n (this.type == other.type && compareDeep(this.attrs, other.attrs));\n }\n /**\n Convert this mark to a JSON-serializeable representation.\n */\n toJSON() {\n let obj = { type: this.type.name };\n for (let _ in this.attrs) {\n obj.attrs = this.attrs;\n break;\n }\n return obj;\n }\n /**\n Deserialize a mark from JSON.\n */\n static fromJSON(schema, json) {\n if (!json)\n throw new RangeError(\"Invalid input for Mark.fromJSON\");\n let type = schema.marks[json.type];\n if (!type)\n throw new RangeError(`There is no mark type ${json.type} in this schema`);\n return type.create(json.attrs);\n }\n /**\n Test whether two sets of marks are identical.\n */\n static sameSet(a, b) {\n if (a == b)\n return true;\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!a[i].eq(b[i]))\n return false;\n return true;\n }\n /**\n Create a properly sorted mark set from null, a single mark, or an\n unsorted array of marks.\n */\n static setFrom(marks) {\n if (!marks || Array.isArray(marks) && marks.length == 0)\n return Mark.none;\n if (marks instanceof Mark)\n return [marks];\n let copy = marks.slice();\n copy.sort((a, b) => a.type.rank - b.type.rank);\n return copy;\n }\n}\n/**\nThe empty set of marks.\n*/\nMark.none = [];\n\n/**\nError type raised by [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) when\ngiven an invalid replacement.\n*/\nclass ReplaceError extends Error {\n}\n/*\nReplaceError = function(this: any, message: string) {\n let err = Error.call(this, message)\n ;(err as any).__proto__ = ReplaceError.prototype\n return err\n} as any\n\nReplaceError.prototype = Object.create(Error.prototype)\nReplaceError.prototype.constructor = ReplaceError\nReplaceError.prototype.name = \"ReplaceError\"\n*/\n/**\nA slice represents a piece cut out of a larger document. It\nstores not only a fragment, but also the depth up to which nodes on\nboth side are ‘open’ (cut through).\n*/\nclass Slice {\n /**\n Create a slice. When specifying a non-zero open depth, you must\n make sure that there are nodes of at least that depth at the\n appropriate side of the fragment—i.e. if the fragment is an\n empty paragraph node, `openStart` and `openEnd` can't be greater\n than 1.\n \n It is not necessary for the content of open nodes to conform to\n the schema's content constraints, though it should be a valid\n start/end/middle for such a node, depending on which sides are\n open.\n */\n constructor(\n /**\n The slice's content.\n */\n content, \n /**\n The open depth at the start of the fragment.\n */\n openStart, \n /**\n The open depth at the end.\n */\n openEnd) {\n this.content = content;\n this.openStart = openStart;\n this.openEnd = openEnd;\n }\n /**\n The size this slice would add when inserted into a document.\n */\n get size() {\n return this.content.size - this.openStart - this.openEnd;\n }\n /**\n @internal\n */\n insertAt(pos, fragment) {\n let content = insertInto(this.content, pos + this.openStart, fragment);\n return content && new Slice(content, this.openStart, this.openEnd);\n }\n /**\n @internal\n */\n removeBetween(from, to) {\n return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd);\n }\n /**\n Tests whether this slice is equal to another slice.\n */\n eq(other) {\n return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd;\n }\n /**\n @internal\n */\n toString() {\n return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\";\n }\n /**\n Convert a slice to a JSON-serializable representation.\n */\n toJSON() {\n if (!this.content.size)\n return null;\n let json = { content: this.content.toJSON() };\n if (this.openStart > 0)\n json.openStart = this.openStart;\n if (this.openEnd > 0)\n json.openEnd = this.openEnd;\n return json;\n }\n /**\n Deserialize a slice from its JSON representation.\n */\n static fromJSON(schema, json) {\n if (!json)\n return Slice.empty;\n let openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n throw new RangeError(\"Invalid input for Slice.fromJSON\");\n return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd);\n }\n /**\n Create a slice from a fragment by taking the maximum possible\n open value on both side of the fragment.\n */\n static maxOpen(fragment, openIsolating = true) {\n let openStart = 0, openEnd = 0;\n for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild)\n openStart++;\n for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild)\n openEnd++;\n return new Slice(fragment, openStart, openEnd);\n }\n}\n/**\nThe empty slice.\n*/\nSlice.empty = new Slice(Fragment.empty, 0, 0);\nfunction removeRange(content, from, to) {\n let { index, offset } = content.findIndex(from), child = content.maybeChild(index);\n let { index: indexTo, offset: offsetTo } = content.findIndex(to);\n if (offset == from || child.isText) {\n if (offsetTo != to && !content.child(indexTo).isText)\n throw new RangeError(\"Removing non-flat range\");\n return content.cut(0, from).append(content.cut(to));\n }\n if (index != indexTo)\n throw new RangeError(\"Removing non-flat range\");\n return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)));\n}\nfunction insertInto(content, dist, insert, parent) {\n let { index, offset } = content.findIndex(dist), child = content.maybeChild(index);\n if (offset == dist || child.isText) {\n if (parent && !parent.canReplace(index, index, insert))\n return null;\n return content.cut(0, dist).append(insert).append(content.cut(dist));\n }\n let inner = insertInto(child.content, dist - offset - 1, insert);\n return inner && content.replaceChild(index, child.copy(inner));\n}\nfunction replace($from, $to, slice) {\n if (slice.openStart > $from.depth)\n throw new ReplaceError(\"Inserted content deeper than insertion position\");\n if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n throw new ReplaceError(\"Inconsistent open depths\");\n return replaceOuter($from, $to, slice, 0);\n}\nfunction replaceOuter($from, $to, slice, depth) {\n let index = $from.index(depth), node = $from.node(depth);\n if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n let inner = replaceOuter($from, $to, slice, depth + 1);\n return node.copy(node.content.replaceChild(index, inner));\n }\n else if (!slice.content.size) {\n return close(node, replaceTwoWay($from, $to, depth));\n }\n else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n let parent = $from.parent, content = parent.content;\n return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)));\n }\n else {\n let { start, end } = prepareSliceForReplace(slice, $from);\n return close(node, replaceThreeWay($from, start, end, $to, depth));\n }\n}\nfunction checkJoin(main, sub) {\n if (!sub.type.compatibleContent(main.type))\n throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name);\n}\nfunction joinable($before, $after, depth) {\n let node = $before.node(depth);\n checkJoin(node, $after.node(depth));\n return node;\n}\nfunction addNode(child, target) {\n let last = target.length - 1;\n if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n target[last] = child.withText(target[last].text + child.text);\n else\n target.push(child);\n}\nfunction addRange($start, $end, depth, target) {\n let node = ($end || $start).node(depth);\n let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n if ($start) {\n startIndex = $start.index(depth);\n if ($start.depth > depth) {\n startIndex++;\n }\n else if ($start.textOffset) {\n addNode($start.nodeAfter, target);\n startIndex++;\n }\n }\n for (let i = startIndex; i < endIndex; i++)\n addNode(node.child(i), target);\n if ($end && $end.depth == depth && $end.textOffset)\n addNode($end.nodeBefore, target);\n}\nfunction close(node, content) {\n node.type.checkContent(content);\n return node.copy(content);\n}\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n let openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n let openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n let content = [];\n addRange(null, $from, depth, content);\n if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n checkJoin(openStart, openEnd);\n addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n }\n else {\n if (openStart)\n addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content);\n addRange($start, $end, depth, content);\n if (openEnd)\n addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content);\n}\nfunction replaceTwoWay($from, $to, depth) {\n let content = [];\n addRange(null, $from, depth, content);\n if ($from.depth > depth) {\n let type = joinable($from, $to, depth + 1);\n addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n }\n addRange($to, null, depth, content);\n return new Fragment(content);\n}\nfunction prepareSliceForReplace(slice, $along) {\n let extra = $along.depth - slice.openStart, parent = $along.node(extra);\n let node = parent.copy(slice.content);\n for (let i = extra - 1; i >= 0; i--)\n node = $along.node(i).copy(Fragment.from(node));\n return { start: node.resolveNoCache(slice.openStart + extra),\n end: node.resolveNoCache(node.content.size - slice.openEnd - extra) };\n}\n\n/**\nYou can [_resolve_](https://prosemirror.net/docs/ref/#model.Node.resolve) a position to get more\ninformation about it. Objects of this class represent such a\nresolved position, providing various pieces of context\ninformation, and some helper methods.\n\nThroughout this interface, methods that take an optional `depth`\nparameter will interpret undefined as `this.depth` and negative\nnumbers as `this.depth + value`.\n*/\nclass ResolvedPos {\n /**\n @internal\n */\n constructor(\n /**\n The position that was resolved.\n */\n pos, \n /**\n @internal\n */\n path, \n /**\n The offset this position has into its parent node.\n */\n parentOffset) {\n this.pos = pos;\n this.path = path;\n this.parentOffset = parentOffset;\n this.depth = path.length / 3 - 1;\n }\n /**\n @internal\n */\n resolveDepth(val) {\n if (val == null)\n return this.depth;\n if (val < 0)\n return this.depth + val;\n return val;\n }\n /**\n The parent node that the position points into. Note that even if\n a position points into a text node, that node is not considered\n the parent—text nodes are ‘flat’ in this model, and have no content.\n */\n get parent() { return this.node(this.depth); }\n /**\n The root node in which the position was resolved.\n */\n get doc() { return this.node(0); }\n /**\n The ancestor node at the given level. `p.node(p.depth)` is the\n same as `p.parent`.\n */\n node(depth) { return this.path[this.resolveDepth(depth) * 3]; }\n /**\n The index into the ancestor at the given level. If this points\n at the 3rd node in the 2nd paragraph on the top level, for\n example, `p.index(0)` is 1 and `p.index(1)` is 2.\n */\n index(depth) { return this.path[this.resolveDepth(depth) * 3 + 1]; }\n /**\n The index pointing after this position into the ancestor at the\n given level.\n */\n indexAfter(depth) {\n depth = this.resolveDepth(depth);\n return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1);\n }\n /**\n The (absolute) position at the start of the node at the given\n level.\n */\n start(depth) {\n depth = this.resolveDepth(depth);\n return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n }\n /**\n The (absolute) position at the end of the node at the given\n level.\n */\n end(depth) {\n depth = this.resolveDepth(depth);\n return this.start(depth) + this.node(depth).content.size;\n }\n /**\n The (absolute) position directly before the wrapping node at the\n given level, or, when `depth` is `this.depth + 1`, the original\n position.\n */\n before(depth) {\n depth = this.resolveDepth(depth);\n if (!depth)\n throw new RangeError(\"There is no position before the top-level node\");\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1];\n }\n /**\n The (absolute) position directly after the wrapping node at the\n given level, or the original position when `depth` is `this.depth + 1`.\n */\n after(depth) {\n depth = this.resolveDepth(depth);\n if (!depth)\n throw new RangeError(\"There is no position after the top-level node\");\n return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize;\n }\n /**\n When this position points into a text node, this returns the\n distance between the position and the start of the text node.\n Will be zero for positions that point between nodes.\n */\n get textOffset() { return this.pos - this.path[this.path.length - 1]; }\n /**\n Get the node directly after the position, if any. If the position\n points into a text node, only the part of that node after the\n position is returned.\n */\n get nodeAfter() {\n let parent = this.parent, index = this.index(this.depth);\n if (index == parent.childCount)\n return null;\n let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n return dOff ? parent.child(index).cut(dOff) : child;\n }\n /**\n Get the node directly before the position, if any. If the\n position points into a text node, only the part of that node\n before the position is returned.\n */\n get nodeBefore() {\n let index = this.index(this.depth);\n let dOff = this.pos - this.path[this.path.length - 1];\n if (dOff)\n return this.parent.child(index).cut(0, dOff);\n return index == 0 ? null : this.parent.child(index - 1);\n }\n /**\n Get the position at the given index in the parent node at the\n given depth (which defaults to `this.depth`).\n */\n posAtIndex(index, depth) {\n depth = this.resolveDepth(depth);\n let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n for (let i = 0; i < index; i++)\n pos += node.child(i).nodeSize;\n return pos;\n }\n /**\n Get the marks at this position, factoring in the surrounding\n marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the\n position is at the start of a non-empty node, the marks of the\n node after it (if any) are returned.\n */\n marks() {\n let parent = this.parent, index = this.index();\n // In an empty parent, return the empty array\n if (parent.content.size == 0)\n return Mark.none;\n // When inside a text node, just return the text node's marks\n if (this.textOffset)\n return parent.child(index).marks;\n let main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n // If the `after` flag is true of there is no node before, make\n // the node after this position the main reference.\n if (!main) {\n let tmp = main;\n main = other;\n other = tmp;\n }\n // Use all marks in the main node, except those that have\n // `inclusive` set to false and are not present in the other node.\n let marks = main.marks;\n for (var i = 0; i < marks.length; i++)\n if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n marks = marks[i--].removeFromSet(marks);\n return marks;\n }\n /**\n Get the marks after the current position, if any, except those\n that are non-inclusive and not present at position `$end`. This\n is mostly useful for getting the set of marks to preserve after a\n deletion. Will return `null` if this position is at the end of\n its parent node or its parent node isn't a textblock (in which\n case no marks should be preserved).\n */\n marksAcross($end) {\n let after = this.parent.maybeChild(this.index());\n if (!after || !after.isInline)\n return null;\n let marks = after.marks, next = $end.parent.maybeChild($end.index());\n for (var i = 0; i < marks.length; i++)\n if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n marks = marks[i--].removeFromSet(marks);\n return marks;\n }\n /**\n The depth up to which this position and the given (non-resolved)\n position share the same parent nodes.\n */\n sharedDepth(pos) {\n for (let depth = this.depth; depth > 0; depth--)\n if (this.start(depth) <= pos && this.end(depth) >= pos)\n return depth;\n return 0;\n }\n /**\n Returns a range based on the place where this position and the\n given position diverge around block content. If both point into\n the same textblock, for example, a range around that textblock\n will be returned. If they point into different blocks, the range\n around those blocks in their shared ancestor is returned. You can\n pass in an optional predicate that will be called with a parent\n node to see if a range into that parent is acceptable.\n */\n blockRange(other = this, pred) {\n if (other.pos < this.pos)\n return other.blockRange(this);\n for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n return new NodeRange(this, other, d);\n return null;\n }\n /**\n Query whether the given position shares the same parent node.\n */\n sameParent(other) {\n return this.pos - this.parentOffset == other.pos - other.parentOffset;\n }\n /**\n Return the greater of this and the given position.\n */\n max(other) {\n return other.pos > this.pos ? other : this;\n }\n /**\n Return the smaller of this and the given position.\n */\n min(other) {\n return other.pos < this.pos ? other : this;\n }\n /**\n @internal\n */\n toString() {\n let str = \"\";\n for (let i = 1; i <= this.depth; i++)\n str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1);\n return str + \":\" + this.parentOffset;\n }\n /**\n @internal\n */\n static resolve(doc, pos) {\n if (!(pos >= 0 && pos <= doc.content.size))\n throw new RangeError(\"Position \" + pos + \" out of range\");\n let path = [];\n let start = 0, parentOffset = pos;\n for (let node = doc;;) {\n let { index, offset } = node.content.findIndex(parentOffset);\n let rem = parentOffset - offset;\n path.push(node, index, start + offset);\n if (!rem)\n break;\n node = node.child(index);\n if (node.isText)\n break;\n parentOffset = rem - 1;\n start += offset + 1;\n }\n return new ResolvedPos(pos, path, parentOffset);\n }\n /**\n @internal\n */\n static resolveCached(doc, pos) {\n for (let i = 0; i < resolveCache.length; i++) {\n let cached = resolveCache[i];\n if (cached.pos == pos && cached.doc == doc)\n return cached;\n }\n let result = resolveCache[resolveCachePos] = ResolvedPos.resolve(doc, pos);\n resolveCachePos = (resolveCachePos + 1) % resolveCacheSize;\n return result;\n }\n}\nlet resolveCache = [], resolveCachePos = 0, resolveCacheSize = 12;\n/**\nRepresents a flat range of content, i.e. one that starts and\nends in the same node.\n*/\nclass NodeRange {\n /**\n Construct a node range. `$from` and `$to` should point into the\n same node until at least the given `depth`, since a node range\n denotes an adjacent set of nodes in a single parent node.\n */\n constructor(\n /**\n A resolved position along the start of the content. May have a\n `depth` greater than this object's `depth` property, since\n these are the positions that were used to compute the range,\n not re-resolved positions directly at its boundaries.\n */\n $from, \n /**\n A position along the end of the content. See\n caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).\n */\n $to, \n /**\n The depth of the node that this range points into.\n */\n depth) {\n this.$from = $from;\n this.$to = $to;\n this.depth = depth;\n }\n /**\n The position at the start of the range.\n */\n get start() { return this.$from.before(this.depth + 1); }\n /**\n The position at the end of the range.\n */\n get end() { return this.$to.after(this.depth + 1); }\n /**\n The parent node that the range points into.\n */\n get parent() { return this.$from.node(this.depth); }\n /**\n The start index of the range in the parent node.\n */\n get startIndex() { return this.$from.index(this.depth); }\n /**\n The end index of the range in the parent node.\n */\n get endIndex() { return this.$to.indexAfter(this.depth); }\n}\n\nconst emptyAttrs = Object.create(null);\n/**\nThis class represents a node in the tree that makes up a\nProseMirror document. So a document is an instance of `Node`, with\nchildren that are also instances of `Node`.\n\nNodes are persistent data structures. Instead of changing them, you\ncreate new ones with the content you want. Old ones keep pointing\nat the old document shape. This is made cheaper by sharing\nstructure between the old and new data as much as possible, which a\ntree shape like this (without back pointers) makes easy.\n\n**Do not** directly mutate the properties of a `Node` object. See\n[the guide](/docs/guide/#doc) for more information.\n*/\nclass Node {\n /**\n @internal\n */\n constructor(\n /**\n The type of node that this is.\n */\n type, \n /**\n An object mapping attribute names to values. The kind of\n attributes allowed and required are\n [determined](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) by the node type.\n */\n attrs, \n // A fragment holding the node's children.\n content, \n /**\n The marks (things like whether it is emphasized or part of a\n link) applied to this node.\n */\n marks = Mark.none) {\n this.type = type;\n this.attrs = attrs;\n this.marks = marks;\n this.content = content || Fragment.empty;\n }\n /**\n The size of this node, as defined by the integer-based [indexing\n scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n amount of characters. For other leaf nodes, it is one. For\n non-leaf nodes, it is the size of the content plus two (the\n start and end token).\n */\n get nodeSize() { return this.isLeaf ? 1 : 2 + this.content.size; }\n /**\n The number of children that the node has.\n */\n get childCount() { return this.content.childCount; }\n /**\n Get the child node at the given index. Raises an error when the\n index is out of range.\n */\n child(index) { return this.content.child(index); }\n /**\n Get the child node at the given index, if it exists.\n */\n maybeChild(index) { return this.content.maybeChild(index); }\n /**\n Call `f` for every child node, passing the node, its offset\n into this parent node, and its index.\n */\n forEach(f) { this.content.forEach(f); }\n /**\n Invoke a callback for all descendant nodes recursively between\n the given two positions that are relative to start of this\n node's content. The callback is invoked with the node, its\n parent-relative position, its parent node, and its child index.\n When the callback returns false for a given node, that node's\n children will not be recursed over. The last parameter can be\n used to specify a starting position to count from.\n */\n nodesBetween(from, to, f, startPos = 0) {\n this.content.nodesBetween(from, to, f, startPos, this);\n }\n /**\n Call the given callback for every descendant node. Doesn't\n descend into a node when the callback returns `false`.\n */\n descendants(f) {\n this.nodesBetween(0, this.content.size, f);\n }\n /**\n Concatenates all the text nodes found in this fragment and its\n children.\n */\n get textContent() {\n return (this.isLeaf && this.type.spec.leafText)\n ? this.type.spec.leafText(this)\n : this.textBetween(0, this.content.size, \"\");\n }\n /**\n Get all text between positions `from` and `to`. When\n `blockSeparator` is given, it will be inserted to separate text\n from different block nodes. If `leafText` is given, it'll be\n inserted for every non-text leaf node encountered, otherwise\n [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used.\n */\n textBetween(from, to, blockSeparator, leafText) {\n return this.content.textBetween(from, to, blockSeparator, leafText);\n }\n /**\n Returns this node's first child, or `null` if there are no\n children.\n */\n get firstChild() { return this.content.firstChild; }\n /**\n Returns this node's last child, or `null` if there are no\n children.\n */\n get lastChild() { return this.content.lastChild; }\n /**\n Test whether two nodes represent the same piece of document.\n */\n eq(other) {\n return this == other || (this.sameMarkup(other) && this.content.eq(other.content));\n }\n /**\n Compare the markup (type, attributes, and marks) of this node to\n those of another. Returns `true` if both have the same markup.\n */\n sameMarkup(other) {\n return this.hasMarkup(other.type, other.attrs, other.marks);\n }\n /**\n Check whether this node's markup correspond to the given type,\n attributes, and marks.\n */\n hasMarkup(type, attrs, marks) {\n return this.type == type &&\n compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n Mark.sameSet(this.marks, marks || Mark.none);\n }\n /**\n Create a new node with the same markup as this node, containing\n the given content (or empty, if no content is given).\n */\n copy(content = null) {\n if (content == this.content)\n return this;\n return new Node(this.type, this.attrs, content, this.marks);\n }\n /**\n Create a copy of this node, with the given set of marks instead\n of the node's own marks.\n */\n mark(marks) {\n return marks == this.marks ? this : new Node(this.type, this.attrs, this.content, marks);\n }\n /**\n Create a copy of this node with only the content between the\n given positions. If `to` is not given, it defaults to the end of\n the node.\n */\n cut(from, to = this.content.size) {\n if (from == 0 && to == this.content.size)\n return this;\n return this.copy(this.content.cut(from, to));\n }\n /**\n Cut out the part of the document between the given positions, and\n return it as a `Slice` object.\n */\n slice(from, to = this.content.size, includeParents = false) {\n if (from == to)\n return Slice.empty;\n let $from = this.resolve(from), $to = this.resolve(to);\n let depth = includeParents ? 0 : $from.sharedDepth(to);\n let start = $from.start(depth), node = $from.node(depth);\n let content = node.content.cut($from.pos - start, $to.pos - start);\n return new Slice(content, $from.depth - depth, $to.depth - depth);\n }\n /**\n Replace the part of the document between the given positions with\n the given slice. The slice must 'fit', meaning its open sides\n must be able to connect to the surrounding content, and its\n content nodes must be valid children for the node they are placed\n into. If any of this is violated, an error of type\n [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.\n */\n replace(from, to, slice) {\n return replace(this.resolve(from), this.resolve(to), slice);\n }\n /**\n Find the node directly after the given position.\n */\n nodeAt(pos) {\n for (let node = this;;) {\n let { index, offset } = node.content.findIndex(pos);\n node = node.maybeChild(index);\n if (!node)\n return null;\n if (offset == pos || node.isText)\n return node;\n pos -= offset + 1;\n }\n }\n /**\n Find the (direct) child node after the given offset, if any,\n and return it along with its index and offset relative to this\n node.\n */\n childAfter(pos) {\n let { index, offset } = this.content.findIndex(pos);\n return { node: this.content.maybeChild(index), index, offset };\n }\n /**\n Find the (direct) child node before the given offset, if any,\n and return it along with its index and offset relative to this\n node.\n */\n childBefore(pos) {\n if (pos == 0)\n return { node: null, index: 0, offset: 0 };\n let { index, offset } = this.content.findIndex(pos);\n if (offset < pos)\n return { node: this.content.child(index), index, offset };\n let node = this.content.child(index - 1);\n return { node, index: index - 1, offset: offset - node.nodeSize };\n }\n /**\n Resolve the given position in the document, returning an\n [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.\n */\n resolve(pos) { return ResolvedPos.resolveCached(this, pos); }\n /**\n @internal\n */\n resolveNoCache(pos) { return ResolvedPos.resolve(this, pos); }\n /**\n Test whether a given mark or mark type occurs in this document\n between the two given positions.\n */\n rangeHasMark(from, to, type) {\n let found = false;\n if (to > from)\n this.nodesBetween(from, to, node => {\n if (type.isInSet(node.marks))\n found = true;\n return !found;\n });\n return found;\n }\n /**\n True when this is a block (non-inline node)\n */\n get isBlock() { return this.type.isBlock; }\n /**\n True when this is a textblock node, a block node with inline\n content.\n */\n get isTextblock() { return this.type.isTextblock; }\n /**\n True when this node allows inline content.\n */\n get inlineContent() { return this.type.inlineContent; }\n /**\n True when this is an inline node (a text node or a node that can\n appear among text).\n */\n get isInline() { return this.type.isInline; }\n /**\n True when this is a text node.\n */\n get isText() { return this.type.isText; }\n /**\n True when this is a leaf node.\n */\n get isLeaf() { return this.type.isLeaf; }\n /**\n True when this is an atom, i.e. when it does not have directly\n editable content. This is usually the same as `isLeaf`, but can\n be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)\n on a node's spec (typically used when the node is displayed as\n an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).\n */\n get isAtom() { return this.type.isAtom; }\n /**\n Return a string representation of this node for debugging\n purposes.\n */\n toString() {\n if (this.type.spec.toDebugString)\n return this.type.spec.toDebugString(this);\n let name = this.type.name;\n if (this.content.size)\n name += \"(\" + this.content.toStringInner() + \")\";\n return wrapMarks(this.marks, name);\n }\n /**\n Get the content match in this node at the given index.\n */\n contentMatchAt(index) {\n let match = this.type.contentMatch.matchFragment(this.content, 0, index);\n if (!match)\n throw new Error(\"Called contentMatchAt on a node with invalid content\");\n return match;\n }\n /**\n Test whether replacing the range between `from` and `to` (by\n child index) with the given replacement fragment (which defaults\n to the empty fragment) would leave the node's content valid. You\n can optionally pass `start` and `end` indices into the\n replacement fragment.\n */\n canReplace(from, to, replacement = Fragment.empty, start = 0, end = replacement.childCount) {\n let one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n let two = one && one.matchFragment(this.content, to);\n if (!two || !two.validEnd)\n return false;\n for (let i = start; i < end; i++)\n if (!this.type.allowsMarks(replacement.child(i).marks))\n return false;\n return true;\n }\n /**\n Test whether replacing the range `from` to `to` (by index) with\n a node of the given type would leave the node's content valid.\n */\n canReplaceWith(from, to, type, marks) {\n if (marks && !this.type.allowsMarks(marks))\n return false;\n let start = this.contentMatchAt(from).matchType(type);\n let end = start && start.matchFragment(this.content, to);\n return end ? end.validEnd : false;\n }\n /**\n Test whether the given node's content could be appended to this\n node. If that node is empty, this will only return true if there\n is at least one node type that can appear in both nodes (to avoid\n merging completely incompatible nodes).\n */\n canAppend(other) {\n if (other.content.size)\n return this.canReplace(this.childCount, this.childCount, other.content);\n else\n return this.type.compatibleContent(other.type);\n }\n /**\n Check whether this node and its descendants conform to the\n schema, and raise error when they do not.\n */\n check() {\n this.type.checkContent(this.content);\n let copy = Mark.none;\n for (let i = 0; i < this.marks.length; i++)\n copy = this.marks[i].addToSet(copy);\n if (!Mark.sameSet(copy, this.marks))\n throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map(m => m.type.name)}`);\n this.content.forEach(node => node.check());\n }\n /**\n Return a JSON-serializeable representation of this node.\n */\n toJSON() {\n let obj = { type: this.type.name };\n for (let _ in this.attrs) {\n obj.attrs = this.attrs;\n break;\n }\n if (this.content.size)\n obj.content = this.content.toJSON();\n if (this.marks.length)\n obj.marks = this.marks.map(n => n.toJSON());\n return obj;\n }\n /**\n Deserialize a node from its JSON representation.\n */\n static fromJSON(schema, json) {\n if (!json)\n throw new RangeError(\"Invalid input for Node.fromJSON\");\n let marks = null;\n if (json.marks) {\n if (!Array.isArray(json.marks))\n throw new RangeError(\"Invalid mark data for Node.fromJSON\");\n marks = json.marks.map(schema.markFromJSON);\n }\n if (json.type == \"text\") {\n if (typeof json.text != \"string\")\n throw new RangeError(\"Invalid text node in JSON\");\n return schema.text(json.text, marks);\n }\n let content = Fragment.fromJSON(schema, json.content);\n return schema.nodeType(json.type).create(json.attrs, content, marks);\n }\n}\nNode.prototype.text = undefined;\nclass TextNode extends Node {\n /**\n @internal\n */\n constructor(type, attrs, content, marks) {\n super(type, attrs, null, marks);\n if (!content)\n throw new RangeError(\"Empty text nodes are not allowed\");\n this.text = content;\n }\n toString() {\n if (this.type.spec.toDebugString)\n return this.type.spec.toDebugString(this);\n return wrapMarks(this.marks, JSON.stringify(this.text));\n }\n get textContent() { return this.text; }\n textBetween(from, to) { return this.text.slice(from, to); }\n get nodeSize() { return this.text.length; }\n mark(marks) {\n return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks);\n }\n withText(text) {\n if (text == this.text)\n return this;\n return new TextNode(this.type, this.attrs, text, this.marks);\n }\n cut(from = 0, to = this.text.length) {\n if (from == 0 && to == this.text.length)\n return this;\n return this.withText(this.text.slice(from, to));\n }\n eq(other) {\n return this.sameMarkup(other) && this.text == other.text;\n }\n toJSON() {\n let base = super.toJSON();\n base.text = this.text;\n return base;\n }\n}\nfunction wrapMarks(marks, str) {\n for (let i = marks.length - 1; i >= 0; i--)\n str = marks[i].type.name + \"(\" + str + \")\";\n return str;\n}\n\n/**\nInstances of this class represent a match state of a node type's\n[content expression](https://prosemirror.net/docs/ref/#model.NodeSpec.content), and can be used to\nfind out whether further content matches here, and whether a given\nposition is a valid end of the node.\n*/\nclass ContentMatch {\n /**\n @internal\n */\n constructor(\n /**\n True when this match state represents a valid end of the node.\n */\n validEnd) {\n this.validEnd = validEnd;\n /**\n @internal\n */\n this.next = [];\n /**\n @internal\n */\n this.wrapCache = [];\n }\n /**\n @internal\n */\n static parse(string, nodeTypes) {\n let stream = new TokenStream(string, nodeTypes);\n if (stream.next == null)\n return ContentMatch.empty;\n let expr = parseExpr(stream);\n if (stream.next)\n stream.err(\"Unexpected trailing text\");\n let match = dfa(nfa(expr));\n checkForDeadEnds(match, stream);\n return match;\n }\n /**\n Match a node type, returning a match after that node if\n successful.\n */\n matchType(type) {\n for (let i = 0; i < this.next.length; i++)\n if (this.next[i].type == type)\n return this.next[i].next;\n return null;\n }\n /**\n Try to match a fragment. Returns the resulting match when\n successful.\n */\n matchFragment(frag, start = 0, end = frag.childCount) {\n let cur = this;\n for (let i = start; cur && i < end; i++)\n cur = cur.matchType(frag.child(i).type);\n return cur;\n }\n /**\n @internal\n */\n get inlineContent() {\n return this.next.length != 0 && this.next[0].type.isInline;\n }\n /**\n Get the first matching node type at this match position that can\n be generated.\n */\n get defaultType() {\n for (let i = 0; i < this.next.length; i++) {\n let { type } = this.next[i];\n if (!(type.isText || type.hasRequiredAttrs()))\n return type;\n }\n return null;\n }\n /**\n @internal\n */\n compatible(other) {\n for (let i = 0; i < this.next.length; i++)\n for (let j = 0; j < other.next.length; j++)\n if (this.next[i].type == other.next[j].type)\n return true;\n return false;\n }\n /**\n Try to match the given fragment, and if that fails, see if it can\n be made to match by inserting nodes in front of it. When\n successful, return a fragment of inserted nodes (which may be\n empty if nothing had to be inserted). When `toEnd` is true, only\n return a fragment if the resulting match goes to the end of the\n content expression.\n */\n fillBefore(after, toEnd = false, startIndex = 0) {\n let seen = [this];\n function search(match, types) {\n let finished = match.matchFragment(after, startIndex);\n if (finished && (!toEnd || finished.validEnd))\n return Fragment.from(types.map(tp => tp.createAndFill()));\n for (let i = 0; i < match.next.length; i++) {\n let { type, next } = match.next[i];\n if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n seen.push(next);\n let found = search(next, types.concat(type));\n if (found)\n return found;\n }\n }\n return null;\n }\n return search(this, []);\n }\n /**\n Find a set of wrapping node types that would allow a node of the\n given type to appear at this position. The result may be empty\n (when it fits directly) and will be null when no such wrapping\n exists.\n */\n findWrapping(target) {\n for (let i = 0; i < this.wrapCache.length; i += 2)\n if (this.wrapCache[i] == target)\n return this.wrapCache[i + 1];\n let computed = this.computeWrapping(target);\n this.wrapCache.push(target, computed);\n return computed;\n }\n /**\n @internal\n */\n computeWrapping(target) {\n let seen = Object.create(null), active = [{ match: this, type: null, via: null }];\n while (active.length) {\n let current = active.shift(), match = current.match;\n if (match.matchType(target)) {\n let result = [];\n for (let obj = current; obj.type; obj = obj.via)\n result.push(obj.type);\n return result.reverse();\n }\n for (let i = 0; i < match.next.length; i++) {\n let { type, next } = match.next[i];\n if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) {\n active.push({ match: type.contentMatch, type, via: current });\n seen[type.name] = true;\n }\n }\n }\n return null;\n }\n /**\n The number of outgoing edges this node has in the finite\n automaton that describes the content expression.\n */\n get edgeCount() {\n return this.next.length;\n }\n /**\n Get the _n_th outgoing edge from this node in the finite\n automaton that describes the content expression.\n */\n edge(n) {\n if (n >= this.next.length)\n throw new RangeError(`There's no ${n}th edge in this content match`);\n return this.next[n];\n }\n /**\n @internal\n */\n toString() {\n let seen = [];\n function scan(m) {\n seen.push(m);\n for (let i = 0; i < m.next.length; i++)\n if (seen.indexOf(m.next[i].next) == -1)\n scan(m.next[i].next);\n }\n scan(this);\n return seen.map((m, i) => {\n let out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n for (let i = 0; i < m.next.length; i++)\n out += (i ? \", \" : \"\") + m.next[i].type.name + \"->\" + seen.indexOf(m.next[i].next);\n return out;\n }).join(\"\\n\");\n }\n}\n/**\n@internal\n*/\nContentMatch.empty = new ContentMatch(true);\nclass TokenStream {\n constructor(string, nodeTypes) {\n this.string = string;\n this.nodeTypes = nodeTypes;\n this.inline = null;\n this.pos = 0;\n this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n if (this.tokens[this.tokens.length - 1] == \"\")\n this.tokens.pop();\n if (this.tokens[0] == \"\")\n this.tokens.shift();\n }\n get next() { return this.tokens[this.pos]; }\n eat(tok) { return this.next == tok && (this.pos++ || true); }\n err(str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\"); }\n}\nfunction parseExpr(stream) {\n let exprs = [];\n do {\n exprs.push(parseExprSeq(stream));\n } while (stream.eat(\"|\"));\n return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n}\nfunction parseExprSeq(stream) {\n let exprs = [];\n do {\n exprs.push(parseExprSubscript(stream));\n } while (stream.next && stream.next != \")\" && stream.next != \"|\");\n return exprs.length == 1 ? exprs[0] : { type: \"seq\", exprs };\n}\nfunction parseExprSubscript(stream) {\n let expr = parseExprAtom(stream);\n for (;;) {\n if (stream.eat(\"+\"))\n expr = { type: \"plus\", expr };\n else if (stream.eat(\"*\"))\n expr = { type: \"star\", expr };\n else if (stream.eat(\"?\"))\n expr = { type: \"opt\", expr };\n else if (stream.eat(\"{\"))\n expr = parseExprRange(stream, expr);\n else\n break;\n }\n return expr;\n}\nfunction parseNum(stream) {\n if (/\\D/.test(stream.next))\n stream.err(\"Expected number, got '\" + stream.next + \"'\");\n let result = Number(stream.next);\n stream.pos++;\n return result;\n}\nfunction parseExprRange(stream, expr) {\n let min = parseNum(stream), max = min;\n if (stream.eat(\",\")) {\n if (stream.next != \"}\")\n max = parseNum(stream);\n else\n max = -1;\n }\n if (!stream.eat(\"}\"))\n stream.err(\"Unclosed braced range\");\n return { type: \"range\", min, max, expr };\n}\nfunction resolveName(stream, name) {\n let types = stream.nodeTypes, type = types[name];\n if (type)\n return [type];\n let result = [];\n for (let typeName in types) {\n let type = types[typeName];\n if (type.groups.indexOf(name) > -1)\n result.push(type);\n }\n if (result.length == 0)\n stream.err(\"No node type or group '\" + name + \"' found\");\n return result;\n}\nfunction parseExprAtom(stream) {\n if (stream.eat(\"(\")) {\n let expr = parseExpr(stream);\n if (!stream.eat(\")\"))\n stream.err(\"Missing closing paren\");\n return expr;\n }\n else if (!/\\W/.test(stream.next)) {\n let exprs = resolveName(stream, stream.next).map(type => {\n if (stream.inline == null)\n stream.inline = type.isInline;\n else if (stream.inline != type.isInline)\n stream.err(\"Mixing inline and block content\");\n return { type: \"name\", value: type };\n });\n stream.pos++;\n return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n }\n else {\n stream.err(\"Unexpected token '\" + stream.next + \"'\");\n }\n}\n/**\nConstruct an NFA from an expression as returned by the parser. The\nNFA is represented as an array of states, which are themselves\narrays of edges, which are `{term, to}` objects. The first state is\nthe entry state and the last node is the success state.\n\nNote that unlike typical NFAs, the edge ordering in this one is\nsignificant, in that it is used to contruct filler content when\nnecessary.\n*/\nfunction nfa(expr) {\n let nfa = [[]];\n connect(compile(expr, 0), node());\n return nfa;\n function node() { return nfa.push([]) - 1; }\n function edge(from, to, term) {\n let edge = { term, to };\n nfa[from].push(edge);\n return edge;\n }\n function connect(edges, to) {\n edges.forEach(edge => edge.to = to);\n }\n function compile(expr, from) {\n if (expr.type == \"choice\") {\n return expr.exprs.reduce((out, expr) => out.concat(compile(expr, from)), []);\n }\n else if (expr.type == \"seq\") {\n for (let i = 0;; i++) {\n let next = compile(expr.exprs[i], from);\n if (i == expr.exprs.length - 1)\n return next;\n connect(next, from = node());\n }\n }\n else if (expr.type == \"star\") {\n let loop = node();\n edge(from, loop);\n connect(compile(expr.expr, loop), loop);\n return [edge(loop)];\n }\n else if (expr.type == \"plus\") {\n let loop = node();\n connect(compile(expr.expr, from), loop);\n connect(compile(expr.expr, loop), loop);\n return [edge(loop)];\n }\n else if (expr.type == \"opt\") {\n return [edge(from)].concat(compile(expr.expr, from));\n }\n else if (expr.type == \"range\") {\n let cur = from;\n for (let i = 0; i < expr.min; i++) {\n let next = node();\n connect(compile(expr.expr, cur), next);\n cur = next;\n }\n if (expr.max == -1) {\n connect(compile(expr.expr, cur), cur);\n }\n else {\n for (let i = expr.min; i < expr.max; i++) {\n let next = node();\n edge(cur, next);\n connect(compile(expr.expr, cur), next);\n cur = next;\n }\n }\n return [edge(cur)];\n }\n else if (expr.type == \"name\") {\n return [edge(from, undefined, expr.value)];\n }\n else {\n throw new Error(\"Unknown expr type\");\n }\n }\n}\nfunction cmp(a, b) { return b - a; }\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n let result = [];\n scan(node);\n return result.sort(cmp);\n function scan(node) {\n let edges = nfa[node];\n if (edges.length == 1 && !edges[0].term)\n return scan(edges[0].to);\n result.push(node);\n for (let i = 0; i < edges.length; i++) {\n let { term, to } = edges[i];\n if (!term && result.indexOf(to) == -1)\n scan(to);\n }\n }\n}\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n let labeled = Object.create(null);\n return explore(nullFrom(nfa, 0));\n function explore(states) {\n let out = [];\n states.forEach(node => {\n nfa[node].forEach(({ term, to }) => {\n if (!term)\n return;\n let set;\n for (let i = 0; i < out.length; i++)\n if (out[i][0] == term)\n set = out[i][1];\n nullFrom(nfa, to).forEach(node => {\n if (!set)\n out.push([term, set = []]);\n if (set.indexOf(node) == -1)\n set.push(node);\n });\n });\n });\n let state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n for (let i = 0; i < out.length; i++) {\n let states = out[i][1].sort(cmp);\n state.next.push({ type: out[i][0], next: labeled[states.join(\",\")] || explore(states) });\n }\n return state;\n }\n}\nfunction checkForDeadEnds(match, stream) {\n for (let i = 0, work = [match]; i < work.length; i++) {\n let state = work[i], dead = !state.validEnd, nodes = [];\n for (let j = 0; j < state.next.length; j++) {\n let { type, next } = state.next[j];\n nodes.push(type.name);\n if (dead && !(type.isText || type.hasRequiredAttrs()))\n dead = false;\n if (work.indexOf(next) == -1)\n work.push(next);\n }\n if (dead)\n stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\");\n }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n let defaults = Object.create(null);\n for (let attrName in attrs) {\n let attr = attrs[attrName];\n if (!attr.hasDefault)\n return null;\n defaults[attrName] = attr.default;\n }\n return defaults;\n}\nfunction computeAttrs(attrs, value) {\n let built = Object.create(null);\n for (let name in attrs) {\n let given = value && value[name];\n if (given === undefined) {\n let attr = attrs[name];\n if (attr.hasDefault)\n given = attr.default;\n else\n throw new RangeError(\"No value supplied for attribute \" + name);\n }\n built[name] = given;\n }\n return built;\n}\nfunction initAttrs(attrs) {\n let result = Object.create(null);\n if (attrs)\n for (let name in attrs)\n result[name] = new Attribute(attrs[name]);\n return result;\n}\n/**\nNode types are objects allocated once per `Schema` and used to\n[tag](https://prosemirror.net/docs/ref/#model.Node.type) `Node` instances. They contain information\nabout the node type, such as its name and what kind of node it\nrepresents.\n*/\nclass NodeType {\n /**\n @internal\n */\n constructor(\n /**\n The name the node type has in this schema.\n */\n name, \n /**\n A link back to the `Schema` the node type belongs to.\n */\n schema, \n /**\n The spec that this type is based on\n */\n spec) {\n this.name = name;\n this.schema = schema;\n this.spec = spec;\n /**\n The set of marks allowed in this node. `null` means all marks\n are allowed.\n */\n this.markSet = null;\n this.groups = spec.group ? spec.group.split(\" \") : [];\n this.attrs = initAttrs(spec.attrs);\n this.defaultAttrs = defaultAttrs(this.attrs);\n this.contentMatch = null;\n this.inlineContent = null;\n this.isBlock = !(spec.inline || name == \"text\");\n this.isText = name == \"text\";\n }\n /**\n True if this is an inline type.\n */\n get isInline() { return !this.isBlock; }\n /**\n True if this is a textblock type, a block that contains inline\n content.\n */\n get isTextblock() { return this.isBlock && this.inlineContent; }\n /**\n True for node types that allow no content.\n */\n get isLeaf() { return this.contentMatch == ContentMatch.empty; }\n /**\n True when this node is an atom, i.e. when it does not have\n directly editable content.\n */\n get isAtom() { return this.isLeaf || !!this.spec.atom; }\n /**\n The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.\n */\n get whitespace() {\n return this.spec.whitespace || (this.spec.code ? \"pre\" : \"normal\");\n }\n /**\n Tells you whether this node type has any required attributes.\n */\n hasRequiredAttrs() {\n for (let n in this.attrs)\n if (this.attrs[n].isRequired)\n return true;\n return false;\n }\n /**\n Indicates whether this node allows some of the same content as\n the given node type.\n */\n compatibleContent(other) {\n return this == other || this.contentMatch.compatible(other.contentMatch);\n }\n /**\n @internal\n */\n computeAttrs(attrs) {\n if (!attrs && this.defaultAttrs)\n return this.defaultAttrs;\n else\n return computeAttrs(this.attrs, attrs);\n }\n /**\n Create a `Node` of this type. The given attributes are\n checked and defaulted (you can pass `null` to use the type's\n defaults entirely, if no required attributes exist). `content`\n may be a `Fragment`, a node, an array of nodes, or\n `null`. Similarly `marks` may be `null` to default to the empty\n set of marks.\n */\n create(attrs = null, content, marks) {\n if (this.isText)\n throw new Error(\"NodeType.create can't construct text nodes\");\n return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks));\n }\n /**\n Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content\n against the node type's content restrictions, and throw an error\n if it doesn't match.\n */\n createChecked(attrs = null, content, marks) {\n content = Fragment.from(content);\n this.checkContent(content);\n return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks));\n }\n /**\n Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is\n necessary to add nodes to the start or end of the given fragment\n to make it fit the node. If no fitting wrapping can be found,\n return null. Note that, due to the fact that required nodes can\n always be created, this will always succeed if you pass null or\n `Fragment.empty` as content.\n */\n createAndFill(attrs = null, content, marks) {\n attrs = this.computeAttrs(attrs);\n content = Fragment.from(content);\n if (content.size) {\n let before = this.contentMatch.fillBefore(content);\n if (!before)\n return null;\n content = before.append(content);\n }\n let matched = this.contentMatch.matchFragment(content);\n let after = matched && matched.fillBefore(Fragment.empty, true);\n if (!after)\n return null;\n return new Node(this, attrs, content.append(after), Mark.setFrom(marks));\n }\n /**\n Returns true if the given fragment is valid content for this node\n type with the given attributes.\n */\n validContent(content) {\n let result = this.contentMatch.matchFragment(content);\n if (!result || !result.validEnd)\n return false;\n for (let i = 0; i < content.childCount; i++)\n if (!this.allowsMarks(content.child(i).marks))\n return false;\n return true;\n }\n /**\n Throws a RangeError if the given fragment is not valid content for this\n node type.\n @internal\n */\n checkContent(content) {\n if (!this.validContent(content))\n throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`);\n }\n /**\n Check whether the given mark type is allowed in this node.\n */\n allowsMarkType(markType) {\n return this.markSet == null || this.markSet.indexOf(markType) > -1;\n }\n /**\n Test whether the given set of marks are allowed in this node.\n */\n allowsMarks(marks) {\n if (this.markSet == null)\n return true;\n for (let i = 0; i < marks.length; i++)\n if (!this.allowsMarkType(marks[i].type))\n return false;\n return true;\n }\n /**\n Removes the marks that are not allowed in this node from the given set.\n */\n allowedMarks(marks) {\n if (this.markSet == null)\n return marks;\n let copy;\n for (let i = 0; i < marks.length; i++) {\n if (!this.allowsMarkType(marks[i].type)) {\n if (!copy)\n copy = marks.slice(0, i);\n }\n else if (copy) {\n copy.push(marks[i]);\n }\n }\n return !copy ? marks : copy.length ? copy : Mark.none;\n }\n /**\n @internal\n */\n static compile(nodes, schema) {\n let result = Object.create(null);\n nodes.forEach((name, spec) => result[name] = new NodeType(name, schema, spec));\n let topType = schema.spec.topNode || \"doc\";\n if (!result[topType])\n throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\");\n if (!result.text)\n throw new RangeError(\"Every schema needs a 'text' type\");\n for (let _ in result.text.attrs)\n throw new RangeError(\"The text node type should not have attributes\");\n return result;\n }\n}\n// Attribute descriptors\nclass Attribute {\n constructor(options) {\n this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n this.default = options.default;\n }\n get isRequired() {\n return !this.hasDefault;\n }\n}\n// Marks\n/**\nLike nodes, marks (which are associated with nodes to signify\nthings like emphasis or being part of a link) are\n[tagged](https://prosemirror.net/docs/ref/#model.Mark.type) with type objects, which are\ninstantiated once per `Schema`.\n*/\nclass MarkType {\n /**\n @internal\n */\n constructor(\n /**\n The name of the mark type.\n */\n name, \n /**\n @internal\n */\n rank, \n /**\n The schema that this mark type instance is part of.\n */\n schema, \n /**\n The spec on which the type is based.\n */\n spec) {\n this.name = name;\n this.rank = rank;\n this.schema = schema;\n this.spec = spec;\n this.attrs = initAttrs(spec.attrs);\n this.excluded = null;\n let defaults = defaultAttrs(this.attrs);\n this.instance = defaults ? new Mark(this, defaults) : null;\n }\n /**\n Create a mark of this type. `attrs` may be `null` or an object\n containing only some of the mark's attributes. The others, if\n they have defaults, will be added.\n */\n create(attrs = null) {\n if (!attrs && this.instance)\n return this.instance;\n return new Mark(this, computeAttrs(this.attrs, attrs));\n }\n /**\n @internal\n */\n static compile(marks, schema) {\n let result = Object.create(null), rank = 0;\n marks.forEach((name, spec) => result[name] = new MarkType(name, rank++, schema, spec));\n return result;\n }\n /**\n When there is a mark of this type in the given set, a new set\n without it is returned. Otherwise, the input set is returned.\n */\n removeFromSet(set) {\n for (var i = 0; i < set.length; i++)\n if (set[i].type == this) {\n set = set.slice(0, i).concat(set.slice(i + 1));\n i--;\n }\n return set;\n }\n /**\n Tests whether there is a mark of this type in the given set.\n */\n isInSet(set) {\n for (let i = 0; i < set.length; i++)\n if (set[i].type == this)\n return set[i];\n }\n /**\n Queries whether a given mark type is\n [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.\n */\n excludes(other) {\n return this.excluded.indexOf(other) > -1;\n }\n}\n/**\nA document schema. Holds [node](https://prosemirror.net/docs/ref/#model.NodeType) and [mark\ntype](https://prosemirror.net/docs/ref/#model.MarkType) objects for the nodes and marks that may\noccur in conforming documents, and provides functionality for\ncreating and deserializing such documents.\n\nWhen given, the type parameters provide the names of the nodes and\nmarks in this schema.\n*/\nclass Schema {\n /**\n Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).\n */\n constructor(spec) {\n /**\n An object for storing whatever values modules may want to\n compute and cache per schema. (If you want to store something\n in it, try to use property names unlikely to clash.)\n */\n this.cached = Object.create(null);\n let instanceSpec = this.spec = {};\n for (let prop in spec)\n instanceSpec[prop] = spec[prop];\n instanceSpec.nodes = OrderedMap.from(spec.nodes),\n instanceSpec.marks = OrderedMap.from(spec.marks || {}),\n this.nodes = NodeType.compile(this.spec.nodes, this);\n this.marks = MarkType.compile(this.spec.marks, this);\n let contentExprCache = Object.create(null);\n for (let prop in this.nodes) {\n if (prop in this.marks)\n throw new RangeError(prop + \" can not be both a node and a mark\");\n let type = this.nodes[prop], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n type.contentMatch = contentExprCache[contentExpr] ||\n (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n type.inlineContent = type.contentMatch.inlineContent;\n type.markSet = markExpr == \"_\" ? null :\n markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n markExpr == \"\" || !type.inlineContent ? [] : null;\n }\n for (let prop in this.marks) {\n let type = this.marks[prop], excl = type.spec.excludes;\n type.excluded = excl == null ? [type] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n }\n this.nodeFromJSON = this.nodeFromJSON.bind(this);\n this.markFromJSON = this.markFromJSON.bind(this);\n this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n this.cached.wrappings = Object.create(null);\n }\n /**\n Create a node in this schema. The `type` may be a string or a\n `NodeType` instance. Attributes will be extended with defaults,\n `content` may be a `Fragment`, `null`, a `Node`, or an array of\n nodes.\n */\n node(type, attrs = null, content, marks) {\n if (typeof type == \"string\")\n type = this.nodeType(type);\n else if (!(type instanceof NodeType))\n throw new RangeError(\"Invalid node type: \" + type);\n else if (type.schema != this)\n throw new RangeError(\"Node type from different schema used (\" + type.name + \")\");\n return type.createChecked(attrs, content, marks);\n }\n /**\n Create a text node in the schema. Empty text nodes are not\n allowed.\n */\n text(text, marks) {\n let type = this.nodes.text;\n return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks));\n }\n /**\n Create a mark with the given type and attributes.\n */\n mark(type, attrs) {\n if (typeof type == \"string\")\n type = this.marks[type];\n return type.create(attrs);\n }\n /**\n Deserialize a node from its JSON representation. This method is\n bound.\n */\n nodeFromJSON(json) {\n return Node.fromJSON(this, json);\n }\n /**\n Deserialize a mark from its JSON representation. This method is\n bound.\n */\n markFromJSON(json) {\n return Mark.fromJSON(this, json);\n }\n /**\n @internal\n */\n nodeType(name) {\n let found = this.nodes[name];\n if (!found)\n throw new RangeError(\"Unknown node type: \" + name);\n return found;\n }\n}\nfunction gatherMarks(schema, marks) {\n let found = [];\n for (let i = 0; i < marks.length; i++) {\n let name = marks[i], mark = schema.marks[name], ok = mark;\n if (mark) {\n found.push(mark);\n }\n else {\n for (let prop in schema.marks) {\n let mark = schema.marks[prop];\n if (name == \"_\" || (mark.spec.group && mark.spec.group.split(\" \").indexOf(name) > -1))\n found.push(ok = mark);\n }\n }\n if (!ok)\n throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\");\n }\n return found;\n}\n\n/**\nA DOM parser represents a strategy for parsing DOM content into a\nProseMirror document conforming to a given schema. Its behavior is\ndefined by an array of [rules](https://prosemirror.net/docs/ref/#model.ParseRule).\n*/\nclass DOMParser {\n /**\n Create a parser that targets the given schema, using the given\n parsing rules.\n */\n constructor(\n /**\n The schema into which the parser parses.\n */\n schema, \n /**\n The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser\n uses, in order of precedence.\n */\n rules) {\n this.schema = schema;\n this.rules = rules;\n /**\n @internal\n */\n this.tags = [];\n /**\n @internal\n */\n this.styles = [];\n rules.forEach(rule => {\n if (rule.tag)\n this.tags.push(rule);\n else if (rule.style)\n this.styles.push(rule);\n });\n // Only normalize list elements when lists in the schema can't directly contain themselves\n this.normalizeLists = !this.tags.some(r => {\n if (!/^(ul|ol)\\b/.test(r.tag) || !r.node)\n return false;\n let node = schema.nodes[r.node];\n return node.contentMatch.matchType(node);\n });\n }\n /**\n Parse a document from the content of a DOM node.\n */\n parse(dom, options = {}) {\n let context = new ParseContext(this, options, false);\n context.addAll(dom, options.from, options.to);\n return context.finish();\n }\n /**\n Parses the content of the given DOM node, like\n [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of\n options. But unlike that method, which produces a whole node,\n this one returns a slice that is open at the sides, meaning that\n the schema constraints aren't applied to the start of nodes to\n the left of the input and the end of nodes at the end.\n */\n parseSlice(dom, options = {}) {\n let context = new ParseContext(this, options, true);\n context.addAll(dom, options.from, options.to);\n return Slice.maxOpen(context.finish());\n }\n /**\n @internal\n */\n matchTag(dom, context, after) {\n for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n let rule = this.tags[i];\n if (matches(dom, rule.tag) &&\n (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n (!rule.context || context.matchesContext(rule.context))) {\n if (rule.getAttrs) {\n let result = rule.getAttrs(dom);\n if (result === false)\n continue;\n rule.attrs = result || undefined;\n }\n return rule;\n }\n }\n }\n /**\n @internal\n */\n matchStyle(prop, value, context, after) {\n for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n let rule = this.styles[i], style = rule.style;\n if (style.indexOf(prop) != 0 ||\n rule.context && !context.matchesContext(rule.context) ||\n // Test that the style string either precisely matches the prop,\n // or has an '=' sign after the prop, followed by the given\n // value.\n style.length > prop.length &&\n (style.charCodeAt(prop.length) != 61 || style.slice(prop.length + 1) != value))\n continue;\n if (rule.getAttrs) {\n let result = rule.getAttrs(value);\n if (result === false)\n continue;\n rule.attrs = result || undefined;\n }\n return rule;\n }\n }\n /**\n @internal\n */\n static schemaRules(schema) {\n let result = [];\n function insert(rule) {\n let priority = rule.priority == null ? 50 : rule.priority, i = 0;\n for (; i < result.length; i++) {\n let next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n if (nextPriority < priority)\n break;\n }\n result.splice(i, 0, rule);\n }\n for (let name in schema.marks) {\n let rules = schema.marks[name].spec.parseDOM;\n if (rules)\n rules.forEach(rule => {\n insert(rule = copy(rule));\n if (!(rule.mark || rule.ignore || rule.clearMark))\n rule.mark = name;\n });\n }\n for (let name in schema.nodes) {\n let rules = schema.nodes[name].spec.parseDOM;\n if (rules)\n rules.forEach(rule => {\n insert(rule = copy(rule));\n if (!(rule.node || rule.ignore || rule.mark))\n rule.node = name;\n });\n }\n return result;\n }\n /**\n Construct a DOM parser using the parsing rules listed in a\n schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by\n [priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority).\n */\n static fromSchema(schema) {\n return schema.cached.domParser ||\n (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));\n }\n}\nconst blockTags = {\n address: true, article: true, aside: true, blockquote: true, canvas: true,\n dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\nconst ignoreTags = {\n head: true, noscript: true, object: true, script: true, style: true, title: true\n};\nconst listTags = { ol: true, ul: true };\n// Using a bitfield for node context options\nconst OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\nfunction wsOptionsFor(type, preserveWhitespace, base) {\n if (preserveWhitespace != null)\n return (preserveWhitespace ? OPT_PRESERVE_WS : 0) |\n (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0);\n return type && type.whitespace == \"pre\" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;\n}\nclass NodeContext {\n constructor(type, attrs, \n // Marks applied to this node itself\n marks, \n // Marks that can't apply here, but will be used in children if possible\n pendingMarks, solid, match, options) {\n this.type = type;\n this.attrs = attrs;\n this.marks = marks;\n this.pendingMarks = pendingMarks;\n this.solid = solid;\n this.options = options;\n this.content = [];\n // Marks applied to the node's children\n this.activeMarks = Mark.none;\n // Nested Marks with same type\n this.stashMarks = [];\n this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n }\n findWrapping(node) {\n if (!this.match) {\n if (!this.type)\n return [];\n let fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n if (fill) {\n this.match = this.type.contentMatch.matchFragment(fill);\n }\n else {\n let start = this.type.contentMatch, wrap;\n if (wrap = start.findWrapping(node.type)) {\n this.match = start;\n return wrap;\n }\n else {\n return null;\n }\n }\n }\n return this.match.findWrapping(node.type);\n }\n finish(openEnd) {\n if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n let last = this.content[this.content.length - 1], m;\n if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n let text = last;\n if (last.text.length == m[0].length)\n this.content.pop();\n else\n this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length));\n }\n }\n let content = Fragment.from(this.content);\n if (!openEnd && this.match)\n content = content.append(this.match.fillBefore(Fragment.empty, true));\n return this.type ? this.type.create(this.attrs, content, this.marks) : content;\n }\n popFromStashMark(mark) {\n for (let i = this.stashMarks.length - 1; i >= 0; i--)\n if (mark.eq(this.stashMarks[i]))\n return this.stashMarks.splice(i, 1)[0];\n }\n applyPending(nextType) {\n for (let i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n let mark = pending[i];\n if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&\n !mark.isInSet(this.activeMarks)) {\n this.activeMarks = mark.addToSet(this.activeMarks);\n this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n }\n }\n }\n inlineContext(node) {\n if (this.type)\n return this.type.inlineContent;\n if (this.content.length)\n return this.content[0].isInline;\n return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase());\n }\n}\nclass ParseContext {\n constructor(\n // The parser we are using.\n parser, \n // The options passed to this parse.\n options, isOpen) {\n this.parser = parser;\n this.options = options;\n this.isOpen = isOpen;\n this.open = 0;\n let topNode = options.topNode, topContext;\n let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);\n if (topNode)\n topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions);\n else if (isOpen)\n topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions);\n else\n topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions);\n this.nodes = [topContext];\n this.find = options.findPositions;\n this.needsBlock = false;\n }\n get top() {\n return this.nodes[this.open];\n }\n // Add a DOM node to the content. Text is inserted as text node,\n // otherwise, the node is passed to `addElement` or, if it has a\n // `style` attribute, `addElementWithStyles`.\n addDOM(dom) {\n if (dom.nodeType == 3) {\n this.addTextNode(dom);\n }\n else if (dom.nodeType == 1) {\n let style = dom.getAttribute(\"style\");\n if (!style) {\n this.addElement(dom);\n }\n else {\n let marks = this.readStyles(parseStyles(style));\n if (!marks)\n return; // A style with ignore: true\n let [addMarks, removeMarks] = marks, top = this.top;\n for (let i = 0; i < removeMarks.length; i++)\n this.removePendingMark(removeMarks[i], top);\n for (let i = 0; i < addMarks.length; i++)\n this.addPendingMark(addMarks[i]);\n this.addElement(dom);\n for (let i = 0; i < addMarks.length; i++)\n this.removePendingMark(addMarks[i], top);\n for (let i = 0; i < removeMarks.length; i++)\n this.addPendingMark(removeMarks[i]);\n }\n }\n }\n addTextNode(dom) {\n let value = dom.nodeValue;\n let top = this.top;\n if (top.options & OPT_PRESERVE_WS_FULL ||\n top.inlineContext(dom) ||\n /[^ \\t\\r\\n\\u000c]/.test(value)) {\n if (!(top.options & OPT_PRESERVE_WS)) {\n value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n // If this starts with whitespace, and there is no node before it, or\n // a hard break, or a text node that ends with whitespace, strip the\n // leading space.\n if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n let nodeBefore = top.content[top.content.length - 1];\n let domNodeBefore = dom.previousSibling;\n if (!nodeBefore ||\n (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n value = value.slice(1);\n }\n }\n else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n value = value.replace(/\\r?\\n|\\r/g, \" \");\n }\n else {\n value = value.replace(/\\r\\n?/g, \"\\n\");\n }\n if (value)\n this.insertNode(this.parser.schema.text(value));\n this.findInText(dom);\n }\n else {\n this.findInside(dom);\n }\n }\n // Try to find a handler for the given tag and use that to parse. If\n // none is found, the element's content nodes are added directly.\n addElement(dom, matchAfter) {\n let name = dom.nodeName.toLowerCase(), ruleID;\n if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)\n normalizeList(dom);\n let rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n (ruleID = this.parser.matchTag(dom, this, matchAfter));\n if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n this.findInside(dom);\n this.ignoreFallback(dom);\n }\n else if (!rule || rule.skip || rule.closeParent) {\n if (rule && rule.closeParent)\n this.open = Math.max(0, this.open - 1);\n else if (rule && rule.skip.nodeType)\n dom = rule.skip;\n let sync, top = this.top, oldNeedsBlock = this.needsBlock;\n if (blockTags.hasOwnProperty(name)) {\n if (top.content.length && top.content[0].isInline && this.open) {\n this.open--;\n top = this.top;\n }\n sync = true;\n if (!top.type)\n this.needsBlock = true;\n }\n else if (!dom.firstChild) {\n this.leafFallback(dom);\n return;\n }\n this.addAll(dom);\n if (sync)\n this.sync(top);\n this.needsBlock = oldNeedsBlock;\n }\n else {\n this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : undefined);\n }\n }\n // Called for leaf DOM nodes that would otherwise be ignored\n leafFallback(dom) {\n if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\"));\n }\n // Called for ignored nodes\n ignoreFallback(dom) {\n // Ignored BR nodes should at least create an inline context\n if (dom.nodeName == \"BR\" && (!this.top.type || !this.top.type.inlineContent))\n this.findPlace(this.parser.schema.text(\"-\"));\n }\n // Run any style parser associated with the node's styles. Either\n // return an array of marks, or null to indicate some of the styles\n // had a rule with `ignore` set.\n readStyles(styles) {\n let add = Mark.none, remove = Mark.none;\n style: for (let i = 0; i < styles.length; i += 2) {\n for (let after = undefined;;) {\n let rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after);\n if (!rule)\n continue style;\n if (rule.ignore)\n return null;\n if (rule.clearMark) {\n this.top.pendingMarks.forEach(m => {\n if (rule.clearMark(m))\n remove = m.addToSet(remove);\n });\n }\n else {\n add = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(add);\n }\n if (rule.consuming === false)\n after = rule;\n else\n break;\n }\n }\n return [add, remove];\n }\n // Look up a handler for the given node. If none are found, return\n // false. Otherwise, apply it, use its return value to drive the way\n // the node's content is wrapped, and return true.\n addElementByRule(dom, rule, continueAfter) {\n let sync, nodeType, mark;\n if (rule.node) {\n nodeType = this.parser.schema.nodes[rule.node];\n if (!nodeType.isLeaf) {\n sync = this.enter(nodeType, rule.attrs || null, rule.preserveWhitespace);\n }\n else if (!this.insertNode(nodeType.create(rule.attrs))) {\n this.leafFallback(dom);\n }\n }\n else {\n let markType = this.parser.schema.marks[rule.mark];\n mark = markType.create(rule.attrs);\n this.addPendingMark(mark);\n }\n let startIn = this.top;\n if (nodeType && nodeType.isLeaf) {\n this.findInside(dom);\n }\n else if (continueAfter) {\n this.addElement(dom, continueAfter);\n }\n else if (rule.getContent) {\n this.findInside(dom);\n rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node));\n }\n else {\n let contentDOM = dom;\n if (typeof rule.contentElement == \"string\")\n contentDOM = dom.querySelector(rule.contentElement);\n else if (typeof rule.contentElement == \"function\")\n contentDOM = rule.contentElement(dom);\n else if (rule.contentElement)\n contentDOM = rule.contentElement;\n this.findAround(dom, contentDOM, true);\n this.addAll(contentDOM);\n }\n if (sync && this.sync(startIn))\n this.open--;\n if (mark)\n this.removePendingMark(mark, startIn);\n }\n // Add all child nodes between `startIndex` and `endIndex` (or the\n // whole node, if not given). If `sync` is passed, use it to\n // synchronize after every block element.\n addAll(parent, startIndex, endIndex) {\n let index = startIndex || 0;\n for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {\n this.findAtPoint(parent, index);\n this.addDOM(dom);\n }\n this.findAtPoint(parent, index);\n }\n // Try to find a way to fit the given node type into the current\n // context. May add intermediate wrappers and/or leave non-solid\n // nodes that we're in.\n findPlace(node) {\n let route, sync;\n for (let depth = this.open; depth >= 0; depth--) {\n let cx = this.nodes[depth];\n let found = cx.findWrapping(node);\n if (found && (!route || route.length > found.length)) {\n route = found;\n sync = cx;\n if (!found.length)\n break;\n }\n if (cx.solid)\n break;\n }\n if (!route)\n return false;\n this.sync(sync);\n for (let i = 0; i < route.length; i++)\n this.enterInner(route[i], null, false);\n return true;\n }\n // Try to insert the given node, adjusting the context when needed.\n insertNode(node) {\n if (node.isInline && this.needsBlock && !this.top.type) {\n let block = this.textblockFromContext();\n if (block)\n this.enterInner(block);\n }\n if (this.findPlace(node)) {\n this.closeExtra();\n let top = this.top;\n top.applyPending(node.type);\n if (top.match)\n top.match = top.match.matchType(node.type);\n let marks = top.activeMarks;\n for (let i = 0; i < node.marks.length; i++)\n if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n marks = node.marks[i].addToSet(marks);\n top.content.push(node.mark(marks));\n return true;\n }\n return false;\n }\n // Try to start a node of the given type, adjusting the context when\n // necessary.\n enter(type, attrs, preserveWS) {\n let ok = this.findPlace(type.create(attrs));\n if (ok)\n this.enterInner(type, attrs, true, preserveWS);\n return ok;\n }\n // Open a node of the given type\n enterInner(type, attrs = null, solid = false, preserveWS) {\n this.closeExtra();\n let top = this.top;\n top.applyPending(type);\n top.match = top.match && top.match.matchType(type);\n let options = wsOptionsFor(type, preserveWS, top.options);\n if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0)\n options |= OPT_OPEN_LEFT;\n this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n this.open++;\n }\n // Make sure all nodes above this.open are finished and added to\n // their parents\n closeExtra(openEnd = false) {\n let i = this.nodes.length - 1;\n if (i > this.open) {\n for (; i > this.open; i--)\n this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd));\n this.nodes.length = this.open + 1;\n }\n }\n finish() {\n this.open = 0;\n this.closeExtra(this.isOpen);\n return this.nodes[0].finish(this.isOpen || this.options.topOpen);\n }\n sync(to) {\n for (let i = this.open; i >= 0; i--)\n if (this.nodes[i] == to) {\n this.open = i;\n return true;\n }\n return false;\n }\n get currentPos() {\n this.closeExtra();\n let pos = 0;\n for (let i = this.open; i >= 0; i--) {\n let content = this.nodes[i].content;\n for (let j = content.length - 1; j >= 0; j--)\n pos += content[j].nodeSize;\n if (i)\n pos++;\n }\n return pos;\n }\n findAtPoint(parent, offset) {\n if (this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].node == parent && this.find[i].offset == offset)\n this.find[i].pos = this.currentPos;\n }\n }\n findInside(parent) {\n if (this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n this.find[i].pos = this.currentPos;\n }\n }\n findAround(parent, content, before) {\n if (parent != content && this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n let pos = content.compareDocumentPosition(this.find[i].node);\n if (pos & (before ? 2 : 4))\n this.find[i].pos = this.currentPos;\n }\n }\n }\n findInText(textNode) {\n if (this.find)\n for (let i = 0; i < this.find.length; i++) {\n if (this.find[i].node == textNode)\n this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset);\n }\n }\n // Determines whether the given context string matches this context.\n matchesContext(context) {\n if (context.indexOf(\"|\") > -1)\n return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this);\n let parts = context.split(\"/\");\n let option = this.options.context;\n let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n let match = (i, depth) => {\n for (; i >= 0; i--) {\n let part = parts[i];\n if (part == \"\") {\n if (i == parts.length - 1 || i == 0)\n continue;\n for (; depth >= minDepth; depth--)\n if (match(i - 1, depth))\n return true;\n return false;\n }\n else {\n let next = depth > 0 || (depth == 0 && useRoot) ? this.nodes[depth].type\n : option && depth >= minDepth ? option.node(depth - minDepth).type\n : null;\n if (!next || (next.name != part && next.groups.indexOf(part) == -1))\n return false;\n depth--;\n }\n }\n return true;\n };\n return match(parts.length - 1, this.open);\n }\n textblockFromContext() {\n let $context = this.options.context;\n if ($context)\n for (let d = $context.depth; d >= 0; d--) {\n let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n if (deflt && deflt.isTextblock && deflt.defaultAttrs)\n return deflt;\n }\n for (let name in this.parser.schema.nodes) {\n let type = this.parser.schema.nodes[name];\n if (type.isTextblock && type.defaultAttrs)\n return type;\n }\n }\n addPendingMark(mark) {\n let found = findSameMarkInSet(mark, this.top.pendingMarks);\n if (found)\n this.top.stashMarks.push(found);\n this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n }\n removePendingMark(mark, upto) {\n for (let depth = this.open; depth >= 0; depth--) {\n let level = this.nodes[depth];\n let found = level.pendingMarks.lastIndexOf(mark);\n if (found > -1) {\n level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n }\n else {\n level.activeMarks = mark.removeFromSet(level.activeMarks);\n let stashMark = level.popFromStashMark(mark);\n if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n level.activeMarks = stashMark.addToSet(level.activeMarks);\n }\n if (level == upto)\n break;\n }\n }\n}\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n if (name && listTags.hasOwnProperty(name) && prevItem) {\n prevItem.appendChild(child);\n child = prevItem;\n }\n else if (name == \"li\") {\n prevItem = child;\n }\n else if (name) {\n prevItem = null;\n }\n }\n}\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector);\n}\n// Tokenize a style attribute into property/value pairs.\nfunction parseStyles(style) {\n let re = /\\s*([\\w-]+)\\s*:\\s*([^;]+)/g, m, result = [];\n while (m = re.exec(style))\n result.push(m[1], m[2].trim());\n return result;\n}\nfunction copy(obj) {\n let copy = {};\n for (let prop in obj)\n copy[prop] = obj[prop];\n return copy;\n}\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n let nodes = nodeType.schema.nodes;\n for (let name in nodes) {\n let parent = nodes[name];\n if (!parent.allowsMarkType(markType))\n continue;\n let seen = [], scan = (match) => {\n seen.push(match);\n for (let i = 0; i < match.edgeCount; i++) {\n let { type, next } = match.edge(i);\n if (type == nodeType)\n return true;\n if (seen.indexOf(next) < 0 && scan(next))\n return true;\n }\n };\n if (scan(parent.contentMatch))\n return true;\n }\n}\nfunction findSameMarkInSet(mark, set) {\n for (let i = 0; i < set.length; i++) {\n if (mark.eq(set[i]))\n return set[i];\n }\n}\n\n/**\nA DOM serializer knows how to convert ProseMirror nodes and\nmarks of various types to DOM nodes.\n*/\nclass DOMSerializer {\n /**\n Create a serializer. `nodes` should map node names to functions\n that take a node and return a description of the corresponding\n DOM. `marks` does the same for mark names, but also gets an\n argument that tells it whether the mark's content is block or\n inline content (for typical use, it'll always be inline). A mark\n serializer may be `null` to indicate that marks of that type\n should not be serialized.\n */\n constructor(\n /**\n The node serialization functions.\n */\n nodes, \n /**\n The mark serialization functions.\n */\n marks) {\n this.nodes = nodes;\n this.marks = marks;\n }\n /**\n Serialize the content of this fragment to a DOM fragment. When\n not in the browser, the `document` option, containing a DOM\n document, should be passed so that the serializer can create\n nodes.\n */\n serializeFragment(fragment, options = {}, target) {\n if (!target)\n target = doc(options).createDocumentFragment();\n let top = target, active = [];\n fragment.forEach(node => {\n if (active.length || node.marks.length) {\n let keep = 0, rendered = 0;\n while (keep < active.length && rendered < node.marks.length) {\n let next = node.marks[rendered];\n if (!this.marks[next.type.name]) {\n rendered++;\n continue;\n }\n if (!next.eq(active[keep][0]) || next.type.spec.spanning === false)\n break;\n keep++;\n rendered++;\n }\n while (keep < active.length)\n top = active.pop()[1];\n while (rendered < node.marks.length) {\n let add = node.marks[rendered++];\n let markDOM = this.serializeMark(add, node.isInline, options);\n if (markDOM) {\n active.push([add, top]);\n top.appendChild(markDOM.dom);\n top = markDOM.contentDOM || markDOM.dom;\n }\n }\n }\n top.appendChild(this.serializeNodeInner(node, options));\n });\n return target;\n }\n /**\n @internal\n */\n serializeNodeInner(node, options) {\n let { dom, contentDOM } = DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node));\n if (contentDOM) {\n if (node.isLeaf)\n throw new RangeError(\"Content hole not allowed in a leaf node spec\");\n this.serializeFragment(node.content, options, contentDOM);\n }\n return dom;\n }\n /**\n Serialize this node to a DOM node. This can be useful when you\n need to serialize a part of a document, as opposed to the whole\n document. To serialize a whole document, use\n [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on\n its [content](https://prosemirror.net/docs/ref/#model.Node.content).\n */\n serializeNode(node, options = {}) {\n let dom = this.serializeNodeInner(node, options);\n for (let i = node.marks.length - 1; i >= 0; i--) {\n let wrap = this.serializeMark(node.marks[i], node.isInline, options);\n if (wrap) {\n (wrap.contentDOM || wrap.dom).appendChild(dom);\n dom = wrap.dom;\n }\n }\n return dom;\n }\n /**\n @internal\n */\n serializeMark(mark, inline, options = {}) {\n let toDOM = this.marks[mark.type.name];\n return toDOM && DOMSerializer.renderSpec(doc(options), toDOM(mark, inline));\n }\n /**\n Render an [output spec](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) to a DOM node. If\n the spec has a hole (zero) in it, `contentDOM` will point at the\n node with the hole.\n */\n static renderSpec(doc, structure, xmlNS = null) {\n if (typeof structure == \"string\")\n return { dom: doc.createTextNode(structure) };\n if (structure.nodeType != null)\n return { dom: structure };\n if (structure.dom && structure.dom.nodeType != null)\n return structure;\n let tagName = structure[0], space = tagName.indexOf(\" \");\n if (space > 0) {\n xmlNS = tagName.slice(0, space);\n tagName = tagName.slice(space + 1);\n }\n let contentDOM;\n let dom = (xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName));\n let attrs = structure[1], start = 1;\n if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n start = 2;\n for (let name in attrs)\n if (attrs[name] != null) {\n let space = name.indexOf(\" \");\n if (space > 0)\n dom.setAttributeNS(name.slice(0, space), name.slice(space + 1), attrs[name]);\n else\n dom.setAttribute(name, attrs[name]);\n }\n }\n for (let i = start; i < structure.length; i++) {\n let child = structure[i];\n if (child === 0) {\n if (i < structure.length - 1 || i > start)\n throw new RangeError(\"Content hole must be the only child of its parent node\");\n return { dom, contentDOM: dom };\n }\n else {\n let { dom: inner, contentDOM: innerContent } = DOMSerializer.renderSpec(doc, child, xmlNS);\n dom.appendChild(inner);\n if (innerContent) {\n if (contentDOM)\n throw new RangeError(\"Multiple content holes\");\n contentDOM = innerContent;\n }\n }\n }\n return { dom, contentDOM };\n }\n /**\n Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)\n properties in a schema's node and mark specs.\n */\n static fromSchema(schema) {\n return schema.cached.domSerializer ||\n (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)));\n }\n /**\n Gather the serializers in a schema's node specs into an object.\n This can be useful as a base to build a custom serializer from.\n */\n static nodesFromSchema(schema) {\n let result = gatherToDOM(schema.nodes);\n if (!result.text)\n result.text = node => node.text;\n return result;\n }\n /**\n Gather the serializers in a schema's mark specs into an object.\n */\n static marksFromSchema(schema) {\n return gatherToDOM(schema.marks);\n }\n}\nfunction gatherToDOM(obj) {\n let result = {};\n for (let name in obj) {\n let toDOM = obj[name].spec.toDOM;\n if (toDOM)\n result[name] = toDOM;\n }\n return result;\n}\nfunction doc(options) {\n return options.document || window.document;\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n /**\n @internal\n */\n constructor(\n /**\n The mapped version of the position.\n */\n pos, \n /**\n @internal\n */\n delInfo, \n /**\n @internal\n */\n recover) {\n this.pos = pos;\n this.delInfo = delInfo;\n this.recover = recover;\n }\n /**\n Tells you whether the position was deleted, that is, whether the\n step removed the token on the side queried (via the `assoc`)\n argument from the document.\n */\n get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n /**\n Tells you whether the token before the mapped position was deleted.\n */\n get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n /**\n True when the token after the mapped position was deleted.\n */\n get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n /**\n Tells whether any of the steps mapped through deletes across the\n position (including both the token before and after the\n position).\n */\n get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n /**\n Create a position map. The modifications to the document are\n represented as an array of numbers, in which each group of three\n represents a modified chunk as `[start, oldSize, newSize]`.\n */\n constructor(\n /**\n @internal\n */\n ranges, \n /**\n @internal\n */\n inverted = false) {\n this.ranges = ranges;\n this.inverted = inverted;\n if (!ranges.length && StepMap.empty)\n return StepMap.empty;\n }\n /**\n @internal\n */\n recover(value) {\n let diff = 0, index = recoverIndex(value);\n if (!this.inverted)\n for (let i = 0; i < index; i++)\n diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n return this.ranges[index * 3] + diff + recoverOffset(value);\n }\n mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n /**\n @internal\n */\n _map(pos, assoc, simple) {\n let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (let i = 0; i < this.ranges.length; i += 3) {\n let start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos)\n break;\n let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n if (pos <= end) {\n let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n let result = start + diff + (side < 0 ? 0 : newSize);\n if (simple)\n return result;\n let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n if (assoc < 0 ? pos != start : pos != end)\n del |= DEL_SIDE;\n return new MapResult(result, del, recover);\n }\n diff += newSize - oldSize;\n }\n return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n }\n /**\n @internal\n */\n touches(pos, recover) {\n let diff = 0, index = recoverIndex(recover);\n let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (let i = 0; i < this.ranges.length; i += 3) {\n let start = this.ranges[i] - (this.inverted ? diff : 0);\n if (start > pos)\n break;\n let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n if (pos <= end && i == index * 3)\n return true;\n diff += this.ranges[i + newIndex] - oldSize;\n }\n return false;\n }\n /**\n Calls the given function on each of the changed ranges included in\n this map.\n */\n forEach(f) {\n let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n diff += newSize - oldSize;\n }\n }\n /**\n Create an inverted version of this map. The result can be used to\n map positions in the post-step document to the pre-step document.\n */\n invert() {\n return new StepMap(this.ranges, !this.inverted);\n }\n /**\n @internal\n */\n toString() {\n return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n }\n /**\n Create a map that moves all positions by offset `n` (which may be\n negative). This can be useful when applying steps meant for a\n sub-document to a larger document, or vice-versa.\n */\n static offset(n) {\n return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n /**\n Create a new mapping with the given position maps.\n */\n constructor(\n /**\n The step maps in this mapping.\n */\n maps = [], \n /**\n @internal\n */\n mirror, \n /**\n The starting position in the `maps` array, used when `map` or\n `mapResult` is called.\n */\n from = 0, \n /**\n The end position in the `maps` array.\n */\n to = maps.length) {\n this.maps = maps;\n this.mirror = mirror;\n this.from = from;\n this.to = to;\n }\n /**\n Create a mapping that maps only through a part of this one.\n */\n slice(from = 0, to = this.maps.length) {\n return new Mapping(this.maps, this.mirror, from, to);\n }\n /**\n @internal\n */\n copy() {\n return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to);\n }\n /**\n Add a step map to the end of this mapping. If `mirrors` is\n given, it should be the index of the step map that is the mirror\n image of this one.\n */\n appendMap(map, mirrors) {\n this.to = this.maps.push(map);\n if (mirrors != null)\n this.setMirror(this.maps.length - 1, mirrors);\n }\n /**\n Add all the step maps in a given mapping to this one (preserving\n mirroring information).\n */\n appendMapping(mapping) {\n for (let i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n let mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n }\n }\n /**\n Finds the offset of the step map that mirrors the map at the\n given offset, in this mapping (as per the second argument to\n `appendMap`).\n */\n getMirror(n) {\n if (this.mirror)\n for (let i = 0; i < this.mirror.length; i++)\n if (this.mirror[i] == n)\n return this.mirror[i + (i % 2 ? -1 : 1)];\n }\n /**\n @internal\n */\n setMirror(n, m) {\n if (!this.mirror)\n this.mirror = [];\n this.mirror.push(n, m);\n }\n /**\n Append the inverse of the given mapping to this one.\n */\n appendMappingInverted(mapping) {\n for (let i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n let mirr = mapping.getMirror(i);\n this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n }\n }\n /**\n Create an inverted version of this mapping.\n */\n invert() {\n let inverse = new Mapping;\n inverse.appendMappingInverted(this);\n return inverse;\n }\n /**\n Map a position through this mapping.\n */\n map(pos, assoc = 1) {\n if (this.mirror)\n return this._map(pos, assoc, true);\n for (let i = this.from; i < this.to; i++)\n pos = this.maps[i].map(pos, assoc);\n return pos;\n }\n /**\n Map a position through this mapping, returning a mapping\n result.\n */\n mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n /**\n @internal\n */\n _map(pos, assoc, simple) {\n let delInfo = 0;\n for (let i = this.from; i < this.to; i++) {\n let map = this.maps[i], result = map.mapResult(pos, assoc);\n if (result.recover != null) {\n let corr = this.getMirror(i);\n if (corr != null && corr > i && corr < this.to) {\n i = corr;\n pos = this.maps[corr].recover(result.recover);\n continue;\n }\n }\n delInfo |= result.delInfo;\n pos = result.pos;\n }\n return simple ? pos : new MapResult(pos, delInfo, null);\n }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n /**\n Get the step map that represents the changes made by this step,\n and which can be used to transform between positions in the old\n and the new document.\n */\n getMap() { return StepMap.empty; }\n /**\n Try to merge this step with another one, to be applied directly\n after it. Returns the merged step when possible, null if the\n steps can't be merged.\n */\n merge(other) { return null; }\n /**\n Deserialize a step from its JSON representation. Will call\n through to the step class' own implementation of this method.\n */\n static fromJSON(schema, json) {\n if (!json || !json.stepType)\n throw new RangeError(\"Invalid input for Step.fromJSON\");\n let type = stepsByID[json.stepType];\n if (!type)\n throw new RangeError(`No step type ${json.stepType} defined`);\n return type.fromJSON(schema, json);\n }\n /**\n To be able to serialize steps to JSON, each step needs a string\n ID to attach to its JSON representation. Use this method to\n register an ID for your step classes. Try to pick something\n that's unlikely to clash with steps from other modules.\n */\n static jsonID(id, stepClass) {\n if (id in stepsByID)\n throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n stepsByID[id] = stepClass;\n stepClass.prototype.jsonID = id;\n return stepClass;\n }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n /**\n @internal\n */\n constructor(\n /**\n The transformed document, if successful.\n */\n doc, \n /**\n The failure message, if unsuccessful.\n */\n failed) {\n this.doc = doc;\n this.failed = failed;\n }\n /**\n Create a successful step result.\n */\n static ok(doc) { return new StepResult(doc, null); }\n /**\n Create a failed step result.\n */\n static fail(message) { return new StepResult(null, message); }\n /**\n Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n arguments. Create a successful result if it succeeds, and a\n failed one if it throws a `ReplaceError`.\n */\n static fromReplace(doc, from, to, slice) {\n try {\n return StepResult.ok(doc.replace(from, to, slice));\n }\n catch (e) {\n if (e instanceof ReplaceError)\n return StepResult.fail(e.message);\n throw e;\n }\n }\n}\n\nfunction mapFragment(fragment, f, parent) {\n let mapped = [];\n for (let i = 0; i < fragment.childCount; i++) {\n let child = fragment.child(i);\n if (child.content.size)\n child = child.copy(mapFragment(child.content, f, child));\n if (child.isInline)\n child = f(child, parent, i);\n mapped.push(child);\n }\n return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n /**\n Create a mark step.\n */\n constructor(\n /**\n The start of the marked range.\n */\n from, \n /**\n The end of the marked range.\n */\n to, \n /**\n The mark to add.\n */\n mark) {\n super();\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n apply(doc) {\n let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n let parent = $from.node($from.sharedDepth(this.to));\n let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n return node;\n return node.mark(this.mark.addToSet(node.marks));\n }, parent), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice);\n }\n invert() {\n return new RemoveMarkStep(this.from, this.to, this.mark);\n }\n map(mapping) {\n let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos)\n return null;\n return new AddMarkStep(from.pos, to.pos, this.mark);\n }\n merge(other) {\n if (other instanceof AddMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n return null;\n }\n toJSON() {\n return { stepType: \"addMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to };\n }\n /**\n @internal\n */\n static fromJSON(schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n /**\n Create a mark-removing step.\n */\n constructor(\n /**\n The start of the unmarked range.\n */\n from, \n /**\n The end of the unmarked range.\n */\n to, \n /**\n The mark to remove.\n */\n mark) {\n super();\n this.from = from;\n this.to = to;\n this.mark = mark;\n }\n apply(doc) {\n let oldSlice = doc.slice(this.from, this.to);\n let slice = new Slice(mapFragment(oldSlice.content, node => {\n return node.mark(this.mark.removeFromSet(node.marks));\n }, doc), oldSlice.openStart, oldSlice.openEnd);\n return StepResult.fromReplace(doc, this.from, this.to, slice);\n }\n invert() {\n return new AddMarkStep(this.from, this.to, this.mark);\n }\n map(mapping) {\n let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deleted && to.deleted || from.pos >= to.pos)\n return null;\n return new RemoveMarkStep(from.pos, to.pos, this.mark);\n }\n merge(other) {\n if (other instanceof RemoveMarkStep &&\n other.mark.eq(this.mark) &&\n this.from <= other.to && this.to >= other.from)\n return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n return null;\n }\n toJSON() {\n return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n from: this.from, to: this.to };\n }\n /**\n @internal\n */\n static fromJSON(schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n /**\n Create a node mark step.\n */\n constructor(\n /**\n The position of the target node.\n */\n pos, \n /**\n The mark to add.\n */\n mark) {\n super();\n this.pos = pos;\n this.mark = mark;\n }\n apply(doc) {\n let node = doc.nodeAt(this.pos);\n if (!node)\n return StepResult.fail(\"No node at mark step's position\");\n let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n }\n invert(doc) {\n let node = doc.nodeAt(this.pos);\n if (node) {\n let newSet = this.mark.addToSet(node.marks);\n if (newSet.length == node.marks.length) {\n for (let i = 0; i < node.marks.length; i++)\n if (!node.marks[i].isInSet(newSet))\n return new AddNodeMarkStep(this.pos, node.marks[i]);\n return new AddNodeMarkStep(this.pos, this.mark);\n }\n }\n return new RemoveNodeMarkStep(this.pos, this.mark);\n }\n map(mapping) {\n let pos = mapping.mapResult(this.pos, 1);\n return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n }\n toJSON() {\n return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n }\n /**\n @internal\n */\n static fromJSON(schema, json) {\n if (typeof json.pos != \"number\")\n throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n /**\n Create a mark-removing step.\n */\n constructor(\n /**\n The position of the target node.\n */\n pos, \n /**\n The mark to remove.\n */\n mark) {\n super();\n this.pos = pos;\n this.mark = mark;\n }\n apply(doc) {\n let node = doc.nodeAt(this.pos);\n if (!node)\n return StepResult.fail(\"No node at mark step's position\");\n let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n }\n invert(doc) {\n let node = doc.nodeAt(this.pos);\n if (!node || !this.mark.isInSet(node.marks))\n return this;\n return new AddNodeMarkStep(this.pos, this.mark);\n }\n map(mapping) {\n let pos = mapping.mapResult(this.pos, 1);\n return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n }\n toJSON() {\n return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n }\n /**\n @internal\n */\n static fromJSON(schema, json) {\n if (typeof json.pos != \"number\")\n throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n /**\n The given `slice` should fit the 'gap' between `from` and\n `to`—the depths must line up, and the surrounding nodes must be\n able to be joined with the open sides of the slice. When\n `structure` is true, the step will fail if the content between\n from and to is not just a sequence of closing and then opening\n tokens (this is to guard against rebased replace steps\n overwriting something they weren't supposed to).\n */\n constructor(\n /**\n The start position of the replaced range.\n */\n from, \n /**\n The end position of the replaced range.\n */\n to, \n /**\n The slice to insert.\n */\n slice, \n /**\n @internal\n */\n structure = false) {\n super();\n this.from = from;\n this.to = to;\n this.slice = slice;\n this.structure = structure;\n }\n apply(doc) {\n if (this.structure && contentBetween(doc, this.from, this.to))\n return StepResult.fail(\"Structure replace would overwrite content\");\n return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n }\n getMap() {\n return new StepMap([this.from, this.to - this.from, this.slice.size]);\n }\n invert(doc) {\n return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n }\n map(mapping) {\n let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n if (from.deletedAcross && to.deletedAcross)\n return null;\n return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice);\n }\n merge(other) {\n if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n return null;\n if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n }\n else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n return new ReplaceStep(other.from, this.to, slice, this.structure);\n }\n else {\n return null;\n }\n }\n toJSON() {\n let json = { stepType: \"replace\", from: this.from, to: this.to };\n if (this.slice.size)\n json.slice = this.slice.toJSON();\n if (this.structure)\n json.structure = true;\n return json;\n }\n /**\n @internal\n */\n static fromJSON(schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\")\n throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n }\n}\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n /**\n Create a replace-around step with the given range and gap.\n `insert` should be the point in the slice into which the content\n of the gap should be moved. `structure` has the same meaning as\n it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n */\n constructor(\n /**\n The start position of the replaced range.\n */\n from, \n /**\n The end position of the replaced range.\n */\n to, \n /**\n The start of preserved range.\n */\n gapFrom, \n /**\n The end of preserved range.\n */\n gapTo, \n /**\n The slice to insert.\n */\n slice, \n /**\n The position in the slice where the preserved range should be\n inserted.\n */\n insert, \n /**\n @internal\n */\n structure = false) {\n super();\n this.from = from;\n this.to = to;\n this.gapFrom = gapFrom;\n this.gapTo = gapTo;\n this.slice = slice;\n this.insert = insert;\n this.structure = structure;\n }\n apply(doc) {\n if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n contentBetween(doc, this.gapTo, this.to)))\n return StepResult.fail(\"Structure gap-replace would overwrite content\");\n let gap = doc.slice(this.gapFrom, this.gapTo);\n if (gap.openStart || gap.openEnd)\n return StepResult.fail(\"Gap is not a flat range\");\n let inserted = this.slice.insertAt(this.insert, gap.content);\n if (!inserted)\n return StepResult.fail(\"Content does not fit in gap\");\n return StepResult.fromReplace(doc, this.from, this.to, inserted);\n }\n getMap() {\n return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n }\n invert(doc) {\n let gap = this.gapTo - this.gapFrom;\n return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n }\n map(mapping) {\n let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n let gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n return null;\n return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n }\n toJSON() {\n let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n if (this.slice.size)\n json.slice = this.slice.toJSON();\n if (this.structure)\n json.structure = true;\n return json;\n }\n /**\n @internal\n */\n static fromJSON(schema, json) {\n if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n depth--;\n dist--;\n }\n if (dist > 0) {\n let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n while (dist > 0) {\n if (!next || next.isLeaf)\n return true;\n next = next.firstChild;\n dist--;\n }\n }\n return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n let removed = [], added = [];\n let removing, adding;\n tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n if (!node.isInline)\n return;\n let marks = node.marks;\n if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n let newSet = mark.addToSet(marks);\n for (let i = 0; i < marks.length; i++) {\n if (!marks[i].isInSet(newSet)) {\n if (removing && removing.to == start && removing.mark.eq(marks[i]))\n removing.to = end;\n else\n removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n }\n }\n if (adding && adding.to == start)\n adding.to = end;\n else\n added.push(adding = new AddMarkStep(start, end, mark));\n }\n });\n removed.forEach(s => tr.step(s));\n added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n let matched = [], step = 0;\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline)\n return;\n step++;\n let toRemove = null;\n if (mark instanceof MarkType) {\n let set = node.marks, found;\n while (found = mark.isInSet(set)) {\n (toRemove || (toRemove = [])).push(found);\n set = found.removeFromSet(set);\n }\n }\n else if (mark) {\n if (mark.isInSet(node.marks))\n toRemove = [mark];\n }\n else {\n toRemove = node.marks;\n }\n if (toRemove && toRemove.length) {\n let end = Math.min(pos + node.nodeSize, to);\n for (let i = 0; i < toRemove.length; i++) {\n let style = toRemove[i], found;\n for (let j = 0; j < matched.length; j++) {\n let m = matched[j];\n if (m.step == step - 1 && style.eq(matched[j].style))\n found = m;\n }\n if (found) {\n found.to = end;\n found.step = step;\n }\n else {\n matched.push({ style, from: Math.max(pos, from), to: end, step });\n }\n }\n }\n });\n matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch) {\n let node = tr.doc.nodeAt(pos);\n let delSteps = [], cur = pos + 1;\n for (let i = 0; i < node.childCount; i++) {\n let child = node.child(i), end = cur + child.nodeSize;\n let allowed = match.matchType(child.type);\n if (!allowed) {\n delSteps.push(new ReplaceStep(cur, end, Slice.empty));\n }\n else {\n match = allowed;\n for (let j = 0; j < child.marks.length; j++)\n if (!parentType.allowsMarkType(child.marks[j].type))\n tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n }\n cur = end;\n }\n if (!match.validEnd) {\n let fill = match.fillBefore(Fragment.empty, true);\n tr.replace(cur, cur, new Slice(fill, 0, 0));\n }\n for (let i = delSteps.length - 1; i >= 0; i--)\n tr.step(delSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n return (start == 0 || node.canReplace(start, node.childCount)) &&\n (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n let parent = range.parent;\n let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n for (let depth = range.depth;; --depth) {\n let node = range.$from.node(depth);\n let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n if (depth < range.depth && node.canReplace(index, endIndex, content))\n return depth;\n if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n break;\n }\n return null;\n}\nfunction lift(tr, range, target) {\n let { $from, $to, depth } = range;\n let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n let start = gapStart, end = gapEnd;\n let before = Fragment.empty, openStart = 0;\n for (let d = depth, splitting = false; d > target; d--)\n if (splitting || $from.index(d) > 0) {\n splitting = true;\n before = Fragment.from($from.node(d).copy(before));\n openStart++;\n }\n else {\n start--;\n }\n let after = Fragment.empty, openEnd = 0;\n for (let d = depth, splitting = false; d > target; d--)\n if (splitting || $to.after(d + 1) < $to.end(d)) {\n splitting = true;\n after = Fragment.from($to.node(d).copy(after));\n openEnd++;\n }\n else {\n end++;\n }\n tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n let around = findWrappingOutside(range, nodeType);\n let inner = around && findWrappingInside(innerRange, nodeType);\n if (!inner)\n return null;\n return around.map(withAttrs)\n .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n let { parent, startIndex, endIndex } = range;\n let around = parent.contentMatchAt(startIndex).findWrapping(type);\n if (!around)\n return null;\n let outer = around.length ? around[0] : type;\n return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n let { parent, startIndex, endIndex } = range;\n let inner = parent.child(startIndex);\n let inside = type.contentMatch.findWrapping(inner.type);\n if (!inside)\n return null;\n let lastType = inside.length ? inside[inside.length - 1] : type;\n let innerMatch = lastType.contentMatch;\n for (let i = startIndex; innerMatch && i < endIndex; i++)\n innerMatch = innerMatch.matchType(parent.child(i).type);\n if (!innerMatch || !innerMatch.validEnd)\n return null;\n return inside;\n}\nfunction wrap(tr, range, wrappers) {\n let content = Fragment.empty;\n for (let i = wrappers.length - 1; i >= 0; i--) {\n if (content.size) {\n let match = wrappers[i].type.contentMatch.matchFragment(content);\n if (!match || !match.validEnd)\n throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n }\n content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n }\n let start = range.start, end = range.end;\n tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n if (!type.isTextblock)\n throw new RangeError(\"Type given to setBlockType should be a textblock\");\n let mapFrom = tr.steps.length;\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n // Ensure all markup that isn't allowed in the new node type is cleared\n tr.clearIncompatible(tr.mapping.slice(mapFrom).map(pos, 1), type);\n let mapping = tr.mapping.slice(mapFrom);\n let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n return false;\n }\n });\n}\nfunction canChangeType(doc, pos, type) {\n let $pos = doc.resolve(pos), index = $pos.index();\n return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n let node = tr.doc.nodeAt(pos);\n if (!node)\n throw new RangeError(\"No node at given position\");\n if (!type)\n type = node.type;\n let newNode = type.create(attrs, null, marks || node.marks);\n if (node.isLeaf)\n return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n if (!type.validContent(node.content))\n throw new RangeError(\"Invalid content for node type \" + type.name);\n tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n let $pos = doc.resolve(pos), base = $pos.depth - depth;\n let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating ||\n !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n return false;\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n let node = $pos.node(d), index = $pos.index(d);\n if (node.type.spec.isolating)\n return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n let after = (typesAfter && typesAfter[i]) || node;\n if (after != node)\n rest = rest.replaceChild(0, after.type.create(after.attrs));\n if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n return false;\n }\n let index = $pos.indexAfter(base);\n let baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n before = Fragment.from($pos.node(d).copy(before));\n let typeAfter = typesAfter && typesAfter[i];\n after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n }\n tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n let $pos = doc.resolve(pos), index = $pos.index();\n return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n $pos.parent.canReplace(index, index + 1);\n}\nfunction joinable(a, b) {\n return !!(a && b && !a.isLeaf && a.canAppend(b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n let $pos = doc.resolve(pos);\n for (let d = $pos.depth;; d--) {\n let before, after, index = $pos.index(d);\n if (d == $pos.depth) {\n before = $pos.nodeBefore;\n after = $pos.nodeAfter;\n }\n else if (dir > 0) {\n before = $pos.node(d + 1);\n index++;\n after = $pos.node(d).maybeChild(index);\n }\n else {\n before = $pos.node(d).maybeChild(index - 1);\n after = $pos.node(d + 1);\n }\n if (before && !before.isTextblock && joinable(before, after) &&\n $pos.node(d).canReplace(index, index + 1))\n return pos;\n if (d == 0)\n break;\n pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n }\n}\nfunction join(tr, pos, depth) {\n let step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n tr.step(step);\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n let $pos = doc.resolve(pos);\n if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n return pos;\n if ($pos.parentOffset == 0)\n for (let d = $pos.depth - 1; d >= 0; d--) {\n let index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType))\n return $pos.before(d + 1);\n if (index > 0)\n return null;\n }\n if ($pos.parentOffset == $pos.parent.content.size)\n for (let d = $pos.depth - 1; d >= 0; d--) {\n let index = $pos.indexAfter(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType))\n return $pos.after(d + 1);\n if (index < $pos.node(d).childCount)\n return null;\n }\n return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n let $pos = doc.resolve(pos);\n if (!slice.content.size)\n return pos;\n let content = slice.content;\n for (let i = 0; i < slice.openStart; i++)\n content = content.firstChild.content;\n for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n for (let d = $pos.depth; d >= 0; d--) {\n let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n let parent = $pos.node(d), fits = false;\n if (pass == 1) {\n fits = parent.canReplace(insertPos, insertPos, content);\n }\n else {\n let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n }\n if (fits)\n return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n }\n }\n return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n if (from == to && !slice.size)\n return null;\n let $from = doc.resolve(from), $to = doc.resolve(to);\n // Optimization -- avoid work if it's obvious that it's not needed.\n if (fitsTrivially($from, $to, slice))\n return new ReplaceStep(from, to, slice);\n return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n// - `frontier` holds a stack of `{type, match}` objects that\n// represent the open side of the replacement. It starts at\n// `$from`, then moves forward as content is placed, and is finally\n// reconciled with `$to`.\n//\n// - `unplaced` is a slice that represents the content that hasn't\n// been placed yet.\n//\n// - `placed` is a fragment of placed content. Its open-start value\n// is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n constructor($from, $to, unplaced) {\n this.$from = $from;\n this.$to = $to;\n this.unplaced = unplaced;\n this.frontier = [];\n this.placed = Fragment.empty;\n for (let i = 0; i <= $from.depth; i++) {\n let node = $from.node(i);\n this.frontier.push({\n type: node.type,\n match: node.contentMatchAt($from.indexAfter(i))\n });\n }\n for (let i = $from.depth; i > 0; i--)\n this.placed = Fragment.from($from.node(i).copy(this.placed));\n }\n get depth() { return this.frontier.length - 1; }\n fit() {\n // As long as there's unplaced content, try to place some of it.\n // If that fails, either increase the open score of the unplaced\n // slice, or drop nodes from it, and then try again.\n while (this.unplaced.size) {\n let fit = this.findFittable();\n if (fit)\n this.placeNodes(fit);\n else\n this.openMore() || this.dropNode();\n }\n // When there's inline content directly after the frontier _and_\n // directly after `this.$to`, we must generate a `ReplaceAround`\n // step that pulls that content into the node after the frontier.\n // That means the fitting must be done to the end of the textblock\n // node after `this.$to`, not `this.$to` itself.\n let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n if (!$to)\n return null;\n // If closing to `$to` succeeded, create a step\n let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n content = content.firstChild.content;\n openStart--;\n openEnd--;\n }\n let slice = new Slice(content, openStart, openEnd);\n if (moveInline > -1)\n return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n return new ReplaceStep($from.pos, $to.pos, slice);\n return null;\n }\n // Find a position on the start spine of `this.unplaced` that has\n // content that can be moved somewhere on the frontier. Returns two\n // depths, one for the slice and one for the frontier.\n findFittable() {\n let startDepth = this.unplaced.openStart;\n for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n let node = cur.firstChild;\n if (cur.childCount > 1)\n openEnd = 0;\n if (node.type.spec.isolating && openEnd <= d) {\n startDepth = d;\n break;\n }\n cur = node.content;\n }\n // Only try wrapping nodes (pass 2) after finding a place without\n // wrapping failed.\n for (let pass = 1; pass <= 2; pass++) {\n for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n let fragment, parent = null;\n if (sliceDepth) {\n parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n fragment = parent.content;\n }\n else {\n fragment = this.unplaced.content;\n }\n let first = fragment.firstChild;\n for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n // In pass 1, if the next node matches, or there is no next\n // node but the parents look compatible, we've found a\n // place.\n if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n : parent && type.compatibleContent(parent.type)))\n return { sliceDepth, frontierDepth, parent, inject };\n // In pass 2, look for a set of wrapping nodes that make\n // `first` fit here.\n else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n return { sliceDepth, frontierDepth, parent, wrap };\n // Don't continue looking further up if the parent node\n // would fit here.\n if (parent && match.matchType(parent.type))\n break;\n }\n }\n }\n }\n openMore() {\n let { content, openStart, openEnd } = this.unplaced;\n let inner = contentAt(content, openStart);\n if (!inner.childCount || inner.firstChild.isLeaf)\n return false;\n this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n return true;\n }\n dropNode() {\n let { content, openStart, openEnd } = this.unplaced;\n let inner = contentAt(content, openStart);\n if (inner.childCount <= 1 && openStart > 0) {\n let openAtEnd = content.size - openStart <= openStart + inner.size;\n this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n }\n else {\n this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n }\n }\n // Move content from the unplaced slice at `sliceDepth` to the\n // frontier node at `frontierDepth`. Close that frontier node when\n // applicable.\n placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n while (this.depth > frontierDepth)\n this.closeFrontierNode();\n if (wrap)\n for (let i = 0; i < wrap.length; i++)\n this.openFrontierNode(wrap[i]);\n let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n let openStart = slice.openStart - sliceDepth;\n let taken = 0, add = [];\n let { match, type } = this.frontier[frontierDepth];\n if (inject) {\n for (let i = 0; i < inject.childCount; i++)\n add.push(inject.child(i));\n match = match.matchFragment(inject);\n }\n // Computes the amount of (end) open nodes at the end of the\n // fragment. When 0, the parent is open, but no more. When\n // negative, nothing is open.\n let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n // Scan over the fragment, fitting as many child nodes as\n // possible.\n while (taken < fragment.childCount) {\n let next = fragment.child(taken), matches = match.matchType(next.type);\n if (!matches)\n break;\n taken++;\n if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n match = matches;\n add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n }\n }\n let toEnd = taken == fragment.childCount;\n if (!toEnd)\n openEndCount = -1;\n this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n this.frontier[frontierDepth].match = match;\n // If the parent types match, and the entire node was moved, and\n // it's not open, close this frontier node right away.\n if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n this.closeFrontierNode();\n // Add new frontier nodes for any open nodes at the end.\n for (let i = 0, cur = fragment; i < openEndCount; i++) {\n let node = cur.lastChild;\n this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n cur = node.content;\n }\n // Update `this.unplaced`. Drop the entire node from which we\n // placed it we got to its end, otherwise just drop the placed\n // nodes.\n this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n : sliceDepth == 0 ? Slice.empty\n : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n }\n mustMoveInline() {\n if (!this.$to.parent.isTextblock)\n return -1;\n let top = this.frontier[this.depth], level;\n if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n return -1;\n let { depth } = this.$to, after = this.$to.after(depth);\n while (depth > 1 && after == this.$to.end(--depth))\n ++after;\n return after;\n }\n findCloseLevel($to) {\n scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n let { match, type } = this.frontier[i];\n let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n let fit = contentAfterFits($to, i, type, match, dropInner);\n if (!fit)\n continue;\n for (let d = i - 1; d >= 0; d--) {\n let { match, type } = this.frontier[d];\n let matches = contentAfterFits($to, d, type, match, true);\n if (!matches || matches.childCount)\n continue scan;\n }\n return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n }\n }\n close($to) {\n let close = this.findCloseLevel($to);\n if (!close)\n return null;\n while (this.depth > close.depth)\n this.closeFrontierNode();\n if (close.fit.childCount)\n this.placed = addToFragment(this.placed, close.depth, close.fit);\n $to = close.move;\n for (let d = close.depth + 1; d <= $to.depth; d++) {\n let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n this.openFrontierNode(node.type, node.attrs, add);\n }\n return $to;\n }\n openFrontierNode(type, attrs = null, content) {\n let top = this.frontier[this.depth];\n top.match = top.match.matchType(type);\n this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n this.frontier.push({ type, match: type.contentMatch });\n }\n closeFrontierNode() {\n let open = this.frontier.pop();\n let add = open.match.fillBefore(Fragment.empty, true);\n if (add.childCount)\n this.placed = addToFragment(this.placed, this.frontier.length, add);\n }\n}\nfunction dropFromFragment(fragment, depth, count) {\n if (depth == 0)\n return fragment.cutByIndex(count, fragment.childCount);\n return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n if (depth == 0)\n return fragment.append(content);\n return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n for (let i = 0; i < depth; i++)\n fragment = fragment.firstChild.content;\n return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n if (openStart <= 0)\n return node;\n let frag = node.content;\n if (openStart > 1)\n frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n if (openStart > 0) {\n frag = node.type.contentMatch.fillBefore(frag).append(frag);\n if (openEnd <= 0)\n frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n }\n return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n if (index == node.childCount && !type.compatibleContent(node.type))\n return null;\n let fit = match.fillBefore(node.content, true, index);\n return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n for (let i = start; i < fragment.childCount; i++)\n if (!type.allowsMarks(fragment.child(i).marks))\n return true;\n return false;\n}\nfunction definesContent(type) {\n return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n if (!slice.size)\n return tr.deleteRange(from, to);\n let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n if (fitsTrivially($from, $to, slice))\n return tr.step(new ReplaceStep(from, to, slice));\n let targetDepths = coveredDepths($from, tr.doc.resolve(to));\n // Can't replace the whole document, so remove 0 if it's present\n if (targetDepths[targetDepths.length - 1] == 0)\n targetDepths.pop();\n // Negative numbers represent not expansion over the whole node at\n // that depth, but replacing from $from.before(-D) to $to.pos.\n let preferredTarget = -($from.depth + 1);\n targetDepths.unshift(preferredTarget);\n // This loop picks a preferred target depth, if one of the covering\n // depths is not outside of a defining node, and adds negative\n // depths for any depth that has $from at its start and does not\n // cross a defining node.\n for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n let spec = $from.node(d).type.spec;\n if (spec.defining || spec.definingAsContext || spec.isolating)\n break;\n if (targetDepths.indexOf(d) > -1)\n preferredTarget = d;\n else if ($from.before(d) == pos)\n targetDepths.splice(1, 0, -d);\n }\n // Try to fit each possible depth of the slice into each possible\n // target depth, starting with the preferred depths.\n let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n let leftNodes = [], preferredDepth = slice.openStart;\n for (let content = slice.content, i = 0;; i++) {\n let node = content.firstChild;\n leftNodes.push(node);\n if (i == slice.openStart)\n break;\n content = node.content;\n }\n // Back up preferredDepth to cover defining textblocks directly\n // above it, possibly skipping a non-defining textblock.\n for (let d = preferredDepth - 1; d >= 0; d--) {\n let type = leftNodes[d].type, def = definesContent(type);\n if (def && $from.node(preferredTargetIndex).type != type)\n preferredDepth = d;\n else if (def || !type.isTextblock)\n break;\n }\n for (let j = slice.openStart; j >= 0; j--) {\n let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n let insert = leftNodes[openDepth];\n if (!insert)\n continue;\n for (let i = 0; i < targetDepths.length; i++) {\n // Loop over possible expansion levels, starting with the\n // preferred one\n let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n if (targetDepth < 0) {\n expand = false;\n targetDepth = -targetDepth;\n }\n let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n }\n }\n let startSteps = tr.steps.length;\n for (let i = targetDepths.length - 1; i >= 0; i--) {\n tr.replace(from, to, slice);\n if (tr.steps.length > startSteps)\n break;\n let depth = targetDepths[i];\n if (depth < 0)\n continue;\n from = $from.before(depth);\n to = $to.after(depth);\n }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n if (depth < oldOpen) {\n let first = fragment.firstChild;\n fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n }\n if (depth > newOpen) {\n let match = parent.contentMatchAt(0);\n let start = match.fillBefore(fragment).append(fragment);\n fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n }\n return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n let point = insertPoint(tr.doc, from, node.type);\n if (point != null)\n from = to = point;\n }\n tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n let covered = coveredDepths($from, $to);\n for (let i = 0; i < covered.length; i++) {\n let depth = covered[i], last = i == covered.length - 1;\n if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n return tr.delete($from.start(depth), $to.end(depth));\n if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n return tr.delete($from.before(depth), $to.after(depth));\n }\n for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n return tr.delete($from.before(d), to);\n }\n tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n let result = [], minDepth = Math.min($from.depth, $to.depth);\n for (let d = minDepth; d >= 0; d--) {\n let start = $from.start(d);\n if (start < $from.pos - ($from.depth - d) ||\n $to.end(d) > $to.pos + ($to.depth - d) ||\n $from.node(d).type.spec.isolating ||\n $to.node(d).type.spec.isolating)\n break;\n if (start == $to.start(d) ||\n (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n d && $to.start(d - 1) == start - 1))\n result.push(d);\n }\n return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n /**\n Construct an attribute step.\n */\n constructor(\n /**\n The position of the target node.\n */\n pos, \n /**\n The attribute to set.\n */\n attr, \n // The attribute's new value.\n value) {\n super();\n this.pos = pos;\n this.attr = attr;\n this.value = value;\n }\n apply(doc) {\n let node = doc.nodeAt(this.pos);\n if (!node)\n return StepResult.fail(\"No node at attribute step's position\");\n let attrs = Object.create(null);\n for (let name in node.attrs)\n attrs[name] = node.attrs[name];\n attrs[this.attr] = this.value;\n let updated = node.type.create(attrs, null, node.marks);\n return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n }\n getMap() {\n return StepMap.empty;\n }\n invert(doc) {\n return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n }\n map(mapping) {\n let pos = mapping.mapResult(this.pos, 1);\n return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n }\n toJSON() {\n return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n }\n static fromJSON(schema, json) {\n if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n return new AttrStep(json.pos, json.attr, json.value);\n }\n}\nStep.jsonID(\"attr\", AttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n let err = Error.call(this, message);\n err.__proto__ = TransformError.prototype;\n return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n /**\n Create a transform that starts with the given document.\n */\n constructor(\n /**\n The current document (the result of applying the steps in the\n transform).\n */\n doc) {\n this.doc = doc;\n /**\n The steps in this transform.\n */\n this.steps = [];\n /**\n The documents before each of the steps.\n */\n this.docs = [];\n /**\n A mapping with the maps for each of the steps in this transform.\n */\n this.mapping = new Mapping;\n }\n /**\n The starting document.\n */\n get before() { return this.docs.length ? this.docs[0] : this.doc; }\n /**\n Apply a new step in this transform, saving the result. Throws an\n error when the step fails.\n */\n step(step) {\n let result = this.maybeStep(step);\n if (result.failed)\n throw new TransformError(result.failed);\n return this;\n }\n /**\n Try to apply a step in this transformation, ignoring it if it\n fails. Returns the step result.\n */\n maybeStep(step) {\n let result = step.apply(this.doc);\n if (!result.failed)\n this.addStep(step, result.doc);\n return result;\n }\n /**\n True when the document has been changed (when there are any\n steps).\n */\n get docChanged() {\n return this.steps.length > 0;\n }\n /**\n @internal\n */\n addStep(step, doc) {\n this.docs.push(this.doc);\n this.steps.push(step);\n this.mapping.appendMap(step.getMap());\n this.doc = doc;\n }\n /**\n Replace the part of the document between `from` and `to` with the\n given `slice`.\n */\n replace(from, to = from, slice = Slice.empty) {\n let step = replaceStep(this.doc, from, to, slice);\n if (step)\n this.step(step);\n return this;\n }\n /**\n Replace the given range with the given content, which may be a\n fragment, node, or array of nodes.\n */\n replaceWith(from, to, content) {\n return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n }\n /**\n Delete the content between the given positions.\n */\n delete(from, to) {\n return this.replace(from, to, Slice.empty);\n }\n /**\n Insert the given content at the given position.\n */\n insert(pos, content) {\n return this.replaceWith(pos, pos, content);\n }\n /**\n Replace a range of the document with a given slice, using\n `from`, `to`, and the slice's\n [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n than fixed start and end points. This method may grow the\n replaced area or close open nodes in the slice in order to get a\n fit that is more in line with WYSIWYG expectations, by dropping\n fully covered parent nodes of the replaced region when they are\n marked [non-defining as\n context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n open parent node from the slice that _is_ marked as [defining\n its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n \n This is the method, for example, to handle paste. The similar\n [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n primitive tool which will _not_ move the start and end of its given\n range, and is useful in situations where you need more precise\n control over what happens.\n */\n replaceRange(from, to, slice) {\n replaceRange(this, from, to, slice);\n return this;\n }\n /**\n Replace the given range with a node, but use `from` and `to` as\n hints, rather than precise positions. When from and to are the same\n and are at the start or end of a parent node in which the given\n node doesn't fit, this method may _move_ them out towards a parent\n that does allow the given node to be placed. When the given range\n completely covers a parent node, this method may completely replace\n that parent node.\n */\n replaceRangeWith(from, to, node) {\n replaceRangeWith(this, from, to, node);\n return this;\n }\n /**\n Delete the given range, expanding it to cover fully covered\n parent nodes until a valid replace is found.\n */\n deleteRange(from, to) {\n deleteRange(this, from, to);\n return this;\n }\n /**\n Split the content in the given range off from its parent, if there\n is sibling content before or after it, and move it up the tree to\n the depth specified by `target`. You'll probably want to use\n [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n sure the lift is valid.\n */\n lift(range, target) {\n lift(this, range, target);\n return this;\n }\n /**\n Join the blocks around the given position. If depth is 2, their\n last and first siblings are also joined, and so on.\n */\n join(pos, depth = 1) {\n join(this, pos, depth);\n return this;\n }\n /**\n Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n The wrappers are assumed to be valid in this position, and should\n probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n */\n wrap(range, wrappers) {\n wrap(this, range, wrappers);\n return this;\n }\n /**\n Set the type of all textblocks (partly) between `from` and `to` to\n the given node type with the given attributes.\n */\n setBlockType(from, to = from, type, attrs = null) {\n setBlockType(this, from, to, type, attrs);\n return this;\n }\n /**\n Change the type, attributes, and/or marks of the node at `pos`.\n When `type` isn't given, the existing node type is preserved,\n */\n setNodeMarkup(pos, type, attrs = null, marks) {\n setNodeMarkup(this, pos, type, attrs, marks);\n return this;\n }\n /**\n Set a single attribute on a given node to a new value.\n */\n setNodeAttribute(pos, attr, value) {\n this.step(new AttrStep(pos, attr, value));\n return this;\n }\n /**\n Add a mark to the node at position `pos`.\n */\n addNodeMark(pos, mark) {\n this.step(new AddNodeMarkStep(pos, mark));\n return this;\n }\n /**\n Remove a mark (or a mark of the given type) from the node at\n position `pos`.\n */\n removeNodeMark(pos, mark) {\n if (!(mark instanceof Mark)) {\n let node = this.doc.nodeAt(pos);\n if (!node)\n throw new RangeError(\"No node at position \" + pos);\n mark = mark.isInSet(node.marks);\n if (!mark)\n return this;\n }\n this.step(new RemoveNodeMarkStep(pos, mark));\n return this;\n }\n /**\n Split the node at the given position, and optionally, if `depth` is\n greater than one, any number of nodes above that. By default, the\n parts split off will inherit the node type of the original node.\n This can be changed by passing an array of types and attributes to\n use after the split.\n */\n split(pos, depth = 1, typesAfter) {\n split(this, pos, depth, typesAfter);\n return this;\n }\n /**\n Add the given mark to the inline content between `from` and `to`.\n */\n addMark(from, to, mark) {\n addMark(this, from, to, mark);\n return this;\n }\n /**\n Remove marks from inline nodes between `from` and `to`. When\n `mark` is a single mark, remove precisely that mark. When it is\n a mark type, remove all marks of that type. When it is null,\n remove all marks of any type.\n */\n removeMark(from, to, mark) {\n removeMark(this, from, to, mark);\n return this;\n }\n /**\n Removes all marks and nodes from the content of the node at\n `pos` that don't match the given new parent node type. Accepts\n an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n third argument.\n */\n clearIncompatible(pos, parentType, match) {\n clearIncompatible(this, pos, parentType, match);\n return this;\n }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nconst classesById = Object.create(null);\n/**\nSuperclass for editor selections. Every selection type should\nextend this. Should not be instantiated directly.\n*/\nclass Selection {\n /**\n Initialize a selection with the head and anchor and ranges. If no\n ranges are given, constructs a single range across `$anchor` and\n `$head`.\n */\n constructor(\n /**\n The resolved anchor of the selection (the side that stays in\n place when the selection is modified).\n */\n $anchor, \n /**\n The resolved head of the selection (the side that moves when\n the selection is modified).\n */\n $head, ranges) {\n this.$anchor = $anchor;\n this.$head = $head;\n this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n }\n /**\n The selection's anchor, as an unresolved position.\n */\n get anchor() { return this.$anchor.pos; }\n /**\n The selection's head.\n */\n get head() { return this.$head.pos; }\n /**\n The lower bound of the selection's main range.\n */\n get from() { return this.$from.pos; }\n /**\n The upper bound of the selection's main range.\n */\n get to() { return this.$to.pos; }\n /**\n The resolved lower bound of the selection's main range.\n */\n get $from() {\n return this.ranges[0].$from;\n }\n /**\n The resolved upper bound of the selection's main range.\n */\n get $to() {\n return this.ranges[0].$to;\n }\n /**\n Indicates whether the selection contains any content.\n */\n get empty() {\n let ranges = this.ranges;\n for (let i = 0; i < ranges.length; i++)\n if (ranges[i].$from.pos != ranges[i].$to.pos)\n return false;\n return true;\n }\n /**\n Get the content of this selection as a slice.\n */\n content() {\n return this.$from.doc.slice(this.from, this.to, true);\n }\n /**\n Replace the selection with a slice or, if no slice is given,\n delete the selection. Will append to the given transaction.\n */\n replace(tr, content = Slice.empty) {\n // Put the new selection at the position after the inserted\n // content. When that ended in an inline node, search backwards,\n // to get the position after that node. If not, search forward.\n let lastNode = content.content.lastChild, lastParent = null;\n for (let i = 0; i < content.openEnd; i++) {\n lastParent = lastNode;\n lastNode = lastNode.lastChild;\n }\n let mapFrom = tr.steps.length, ranges = this.ranges;\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content);\n if (i == 0)\n selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1);\n }\n }\n /**\n Replace the selection with the given node, appending the changes\n to the given transaction.\n */\n replaceWith(tr, node) {\n let mapFrom = tr.steps.length, ranges = this.ranges;\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n let from = mapping.map($from.pos), to = mapping.map($to.pos);\n if (i) {\n tr.deleteRange(from, to);\n }\n else {\n tr.replaceRangeWith(from, to, node);\n selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n }\n }\n }\n /**\n Find a valid cursor or leaf node selection starting at the given\n position and searching back if `dir` is negative, and forward if\n positive. When `textOnly` is true, only consider cursor\n selections. Will return null when no valid selection position is\n found.\n */\n static findFrom($pos, dir, textOnly = false) {\n let inner = $pos.parent.inlineContent ? new TextSelection($pos)\n : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n if (inner)\n return inner;\n for (let depth = $pos.depth - 1; depth >= 0; depth--) {\n let found = dir < 0\n ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n if (found)\n return found;\n }\n return null;\n }\n /**\n Find a valid cursor or leaf node selection near the given\n position. Searches forward first by default, but if `bias` is\n negative, it will search backwards first.\n */\n static near($pos, bias = 1) {\n return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0));\n }\n /**\n Find the cursor or leaf node selection closest to the start of\n the given document. Will return an\n [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position\n exists.\n */\n static atStart(doc) {\n return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc);\n }\n /**\n Find the cursor or leaf node selection closest to the end of the\n given document.\n */\n static atEnd(doc) {\n return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc);\n }\n /**\n Deserialize the JSON representation of a selection. Must be\n implemented for custom classes (as a static class method).\n */\n static fromJSON(doc, json) {\n if (!json || !json.type)\n throw new RangeError(\"Invalid input for Selection.fromJSON\");\n let cls = classesById[json.type];\n if (!cls)\n throw new RangeError(`No selection type ${json.type} defined`);\n return cls.fromJSON(doc, json);\n }\n /**\n To be able to deserialize selections from JSON, custom selection\n classes must register themselves with an ID string, so that they\n can be disambiguated. Try to pick something that's unlikely to\n clash with classes from other modules.\n */\n static jsonID(id, selectionClass) {\n if (id in classesById)\n throw new RangeError(\"Duplicate use of selection JSON ID \" + id);\n classesById[id] = selectionClass;\n selectionClass.prototype.jsonID = id;\n return selectionClass;\n }\n /**\n Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection,\n which is a value that can be mapped without having access to a\n current document, and later resolved to a real selection for a\n given document again. (This is used mostly by the history to\n track and restore old selections.) The default implementation of\n this method just converts the selection to a text selection and\n returns the bookmark for that.\n */\n getBookmark() {\n return TextSelection.between(this.$anchor, this.$head).getBookmark();\n }\n}\nSelection.prototype.visible = true;\n/**\nRepresents a selected range in a document.\n*/\nclass SelectionRange {\n /**\n Create a range.\n */\n constructor(\n /**\n The lower bound of the range.\n */\n $from, \n /**\n The upper bound of the range.\n */\n $to) {\n this.$from = $from;\n this.$to = $to;\n }\n}\nlet warnedAboutTextSelection = false;\nfunction checkTextSelection($pos) {\n if (!warnedAboutTextSelection && !$pos.parent.inlineContent) {\n warnedAboutTextSelection = true;\n console[\"warn\"](\"TextSelection endpoint not pointing into a node with inline content (\" + $pos.parent.type.name + \")\");\n }\n}\n/**\nA text selection represents a classical editor selection, with a\nhead (the moving side) and anchor (immobile side), both of which\npoint into textblock nodes. It can be empty (a regular cursor\nposition).\n*/\nclass TextSelection extends Selection {\n /**\n Construct a text selection between the given points.\n */\n constructor($anchor, $head = $anchor) {\n checkTextSelection($anchor);\n checkTextSelection($head);\n super($anchor, $head);\n }\n /**\n Returns a resolved position if this is a cursor selection (an\n empty text selection), and null otherwise.\n */\n get $cursor() { return this.$anchor.pos == this.$head.pos ? this.$head : null; }\n map(doc, mapping) {\n let $head = doc.resolve(mapping.map(this.head));\n if (!$head.parent.inlineContent)\n return Selection.near($head);\n let $anchor = doc.resolve(mapping.map(this.anchor));\n return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head);\n }\n replace(tr, content = Slice.empty) {\n super.replace(tr, content);\n if (content == Slice.empty) {\n let marks = this.$from.marksAcross(this.$to);\n if (marks)\n tr.ensureMarks(marks);\n }\n }\n eq(other) {\n return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head;\n }\n getBookmark() {\n return new TextBookmark(this.anchor, this.head);\n }\n toJSON() {\n return { type: \"text\", anchor: this.anchor, head: this.head };\n }\n /**\n @internal\n */\n static fromJSON(doc, json) {\n if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n throw new RangeError(\"Invalid input for TextSelection.fromJSON\");\n return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n }\n /**\n Create a text selection from non-resolved positions.\n */\n static create(doc, anchor, head = anchor) {\n let $anchor = doc.resolve(anchor);\n return new this($anchor, head == anchor ? $anchor : doc.resolve(head));\n }\n /**\n Return a text selection that spans the given positions or, if\n they aren't text positions, find a text selection near them.\n `bias` determines whether the method searches forward (default)\n or backwards (negative number) first. Will fall back to calling\n [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document\n doesn't contain a valid text position.\n */\n static between($anchor, $head, bias) {\n let dPos = $anchor.pos - $head.pos;\n if (!bias || dPos)\n bias = dPos >= 0 ? 1 : -1;\n if (!$head.parent.inlineContent) {\n let found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n if (found)\n $head = found.$head;\n else\n return Selection.near($head, bias);\n }\n if (!$anchor.parent.inlineContent) {\n if (dPos == 0) {\n $anchor = $head;\n }\n else {\n $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n if (($anchor.pos < $head.pos) != (dPos < 0))\n $anchor = $head;\n }\n }\n return new TextSelection($anchor, $head);\n }\n}\nSelection.jsonID(\"text\", TextSelection);\nclass TextBookmark {\n constructor(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping) {\n return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head));\n }\n resolve(doc) {\n return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head));\n }\n}\n/**\nA node selection is a selection that points at a single node. All\nnodes marked [selectable](https://prosemirror.net/docs/ref/#model.NodeSpec.selectable) can be the\ntarget of a node selection. In such a selection, `from` and `to`\npoint directly before and after the selected node, `anchor` equals\n`from`, and `head` equals `to`..\n*/\nclass NodeSelection extends Selection {\n /**\n Create a node selection. Does not verify the validity of its\n argument.\n */\n constructor($pos) {\n let node = $pos.nodeAfter;\n let $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n super($pos, $end);\n this.node = node;\n }\n map(doc, mapping) {\n let { deleted, pos } = mapping.mapResult(this.anchor);\n let $pos = doc.resolve(pos);\n if (deleted)\n return Selection.near($pos);\n return new NodeSelection($pos);\n }\n content() {\n return new Slice(Fragment.from(this.node), 0, 0);\n }\n eq(other) {\n return other instanceof NodeSelection && other.anchor == this.anchor;\n }\n toJSON() {\n return { type: \"node\", anchor: this.anchor };\n }\n getBookmark() { return new NodeBookmark(this.anchor); }\n /**\n @internal\n */\n static fromJSON(doc, json) {\n if (typeof json.anchor != \"number\")\n throw new RangeError(\"Invalid input for NodeSelection.fromJSON\");\n return new NodeSelection(doc.resolve(json.anchor));\n }\n /**\n Create a node selection from non-resolved positions.\n */\n static create(doc, from) {\n return new NodeSelection(doc.resolve(from));\n }\n /**\n Determines whether the given node may be selected as a node\n selection.\n */\n static isSelectable(node) {\n return !node.isText && node.type.spec.selectable !== false;\n }\n}\nNodeSelection.prototype.visible = false;\nSelection.jsonID(\"node\", NodeSelection);\nclass NodeBookmark {\n constructor(anchor) {\n this.anchor = anchor;\n }\n map(mapping) {\n let { deleted, pos } = mapping.mapResult(this.anchor);\n return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos);\n }\n resolve(doc) {\n let $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n if (node && NodeSelection.isSelectable(node))\n return new NodeSelection($pos);\n return Selection.near($pos);\n }\n}\n/**\nA selection type that represents selecting the whole document\n(which can not necessarily be expressed with a text selection, when\nthere are for example leaf block nodes at the start or end of the\ndocument).\n*/\nclass AllSelection extends Selection {\n /**\n Create an all-selection over the given document.\n */\n constructor(doc) {\n super(doc.resolve(0), doc.resolve(doc.content.size));\n }\n replace(tr, content = Slice.empty) {\n if (content == Slice.empty) {\n tr.delete(0, tr.doc.content.size);\n let sel = Selection.atStart(tr.doc);\n if (!sel.eq(tr.selection))\n tr.setSelection(sel);\n }\n else {\n super.replace(tr, content);\n }\n }\n toJSON() { return { type: \"all\" }; }\n /**\n @internal\n */\n static fromJSON(doc) { return new AllSelection(doc); }\n map(doc) { return new AllSelection(doc); }\n eq(other) { return other instanceof AllSelection; }\n getBookmark() { return AllBookmark; }\n}\nSelection.jsonID(\"all\", AllSelection);\nconst AllBookmark = {\n map() { return this; },\n resolve(doc) { return new AllSelection(doc); }\n};\n// FIXME we'll need some awareness of text direction when scanning for selections\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text = false) {\n if (node.inlineContent)\n return TextSelection.create(doc, pos);\n for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n let child = node.child(i);\n if (!child.isAtom) {\n let inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n if (inner)\n return inner;\n }\n else if (!text && NodeSelection.isSelectable(child)) {\n return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0));\n }\n pos += child.nodeSize * dir;\n }\n return null;\n}\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n let last = tr.steps.length - 1;\n if (last < startLen)\n return;\n let step = tr.steps[last];\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep))\n return;\n let map = tr.mapping.maps[last], end;\n map.forEach((_from, _to, _newFrom, newTo) => { if (end == null)\n end = newTo; });\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nconst UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n/**\nAn editor state transaction, which can be applied to a state to\ncreate an updated state. Use\n[`EditorState.tr`](https://prosemirror.net/docs/ref/#state.EditorState.tr) to create an instance.\n\nTransactions track changes to the document (they are a subclass of\n[`Transform`](https://prosemirror.net/docs/ref/#transform.Transform)), but also other state changes,\nlike selection updates and adjustments of the set of [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks). In addition, you can store\nmetadata properties in a transaction, which are extra pieces of\ninformation that client code or plugins can use to describe what a\ntransaction represents, so that they can update their [own\nstate](https://prosemirror.net/docs/ref/#state.StateField) accordingly.\n\nThe [editor view](https://prosemirror.net/docs/ref/#view.EditorView) uses a few metadata properties:\nit will attach a property `\"pointer\"` with the value `true` to\nselection transactions directly caused by mouse or touch input, and\na `\"uiEvent\"` property of that may be `\"paste\"`, `\"cut\"`, or `\"drop\"`.\n*/\nclass Transaction extends Transform {\n /**\n @internal\n */\n constructor(state) {\n super(state.doc);\n // The step count for which the current selection is valid.\n this.curSelectionFor = 0;\n // Bitfield to track which aspects of the state were updated by\n // this transaction.\n this.updated = 0;\n // Object used to store metadata properties for the transaction.\n this.meta = Object.create(null);\n this.time = Date.now();\n this.curSelection = state.selection;\n this.storedMarks = state.storedMarks;\n }\n /**\n The transaction's current selection. This defaults to the editor\n selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the\n transaction, but can be overwritten with\n [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection).\n */\n get selection() {\n if (this.curSelectionFor < this.steps.length) {\n this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n this.curSelectionFor = this.steps.length;\n }\n return this.curSelection;\n }\n /**\n Update the transaction's current selection. Will determine the\n selection that the editor gets when the transaction is applied.\n */\n setSelection(selection) {\n if (selection.$from.doc != this.doc)\n throw new RangeError(\"Selection passed to setSelection must point at the current document\");\n this.curSelection = selection;\n this.curSelectionFor = this.steps.length;\n this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n this.storedMarks = null;\n return this;\n }\n /**\n Whether the selection was explicitly updated by this transaction.\n */\n get selectionSet() {\n return (this.updated & UPDATED_SEL) > 0;\n }\n /**\n Set the current stored marks.\n */\n setStoredMarks(marks) {\n this.storedMarks = marks;\n this.updated |= UPDATED_MARKS;\n return this;\n }\n /**\n Make sure the current stored marks or, if that is null, the marks\n at the selection, match the given set of marks. Does nothing if\n this is already the case.\n */\n ensureMarks(marks) {\n if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n this.setStoredMarks(marks);\n return this;\n }\n /**\n Add a mark to the set of stored marks.\n */\n addStoredMark(mark) {\n return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()));\n }\n /**\n Remove a mark or mark type from the set of stored marks.\n */\n removeStoredMark(mark) {\n return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()));\n }\n /**\n Whether the stored marks were explicitly set for this transaction.\n */\n get storedMarksSet() {\n return (this.updated & UPDATED_MARKS) > 0;\n }\n /**\n @internal\n */\n addStep(step, doc) {\n super.addStep(step, doc);\n this.updated = this.updated & ~UPDATED_MARKS;\n this.storedMarks = null;\n }\n /**\n Update the timestamp for the transaction.\n */\n setTime(time) {\n this.time = time;\n return this;\n }\n /**\n Replace the current selection with the given slice.\n */\n replaceSelection(slice) {\n this.selection.replace(this, slice);\n return this;\n }\n /**\n Replace the selection with the given node. When `inheritMarks` is\n true and the content is inline, it inherits the marks from the\n place where it is inserted.\n */\n replaceSelectionWith(node, inheritMarks = true) {\n let selection = this.selection;\n if (inheritMarks)\n node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none)));\n selection.replaceWith(this, node);\n return this;\n }\n /**\n Delete the selection.\n */\n deleteSelection() {\n this.selection.replace(this);\n return this;\n }\n /**\n Replace the given range, or the selection if no range is given,\n with a text node containing the given string.\n */\n insertText(text, from, to) {\n let schema = this.doc.type.schema;\n if (from == null) {\n if (!text)\n return this.deleteSelection();\n return this.replaceSelectionWith(schema.text(text), true);\n }\n else {\n if (to == null)\n to = from;\n to = to == null ? from : to;\n if (!text)\n return this.deleteRange(from, to);\n let marks = this.storedMarks;\n if (!marks) {\n let $from = this.doc.resolve(from);\n marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n }\n this.replaceRangeWith(from, to, schema.text(text, marks));\n if (!this.selection.empty)\n this.setSelection(Selection.near(this.selection.$to));\n return this;\n }\n }\n /**\n Store a metadata property in this transaction, keyed either by\n name or by plugin.\n */\n setMeta(key, value) {\n this.meta[typeof key == \"string\" ? key : key.key] = value;\n return this;\n }\n /**\n Retrieve a metadata property for a given name or plugin.\n */\n getMeta(key) {\n return this.meta[typeof key == \"string\" ? key : key.key];\n }\n /**\n Returns true if this transaction doesn't contain any metadata,\n and can thus safely be extended.\n */\n get isGeneric() {\n for (let _ in this.meta)\n return false;\n return true;\n }\n /**\n Indicate that the editor should scroll the selection into view\n when updated to the state produced by this transaction.\n */\n scrollIntoView() {\n this.updated |= UPDATED_SCROLL;\n return this;\n }\n /**\n True when this transaction has had `scrollIntoView` called on it.\n */\n get scrolledIntoView() {\n return (this.updated & UPDATED_SCROLL) > 0;\n }\n}\n\nfunction bind(f, self) {\n return !self || !f ? f : f.bind(self);\n}\nclass FieldDesc {\n constructor(name, desc, self) {\n this.name = name;\n this.init = bind(desc.init, self);\n this.apply = bind(desc.apply, self);\n }\n}\nconst baseFields = [\n new FieldDesc(\"doc\", {\n init(config) { return config.doc || config.schema.topNodeType.createAndFill(); },\n apply(tr) { return tr.doc; }\n }),\n new FieldDesc(\"selection\", {\n init(config, instance) { return config.selection || Selection.atStart(instance.doc); },\n apply(tr) { return tr.selection; }\n }),\n new FieldDesc(\"storedMarks\", {\n init(config) { return config.storedMarks || null; },\n apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null; }\n }),\n new FieldDesc(\"scrollToSelection\", {\n init() { return 0; },\n apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev; }\n })\n];\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nclass Configuration {\n constructor(schema, plugins) {\n this.schema = schema;\n this.plugins = [];\n this.pluginsByKey = Object.create(null);\n this.fields = baseFields.slice();\n if (plugins)\n plugins.forEach(plugin => {\n if (this.pluginsByKey[plugin.key])\n throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\");\n this.plugins.push(plugin);\n this.pluginsByKey[plugin.key] = plugin;\n if (plugin.spec.state)\n this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin));\n });\n }\n}\n/**\nThe state of a ProseMirror editor is represented by an object of\nthis type. A state is a persistent data structure—it isn't\nupdated, but rather a new state value is computed from an old one\nusing the [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) method.\n\nA state holds a number of built-in fields, and plugins can\n[define](https://prosemirror.net/docs/ref/#state.PluginSpec.state) additional fields.\n*/\nclass EditorState {\n /**\n @internal\n */\n constructor(\n /**\n @internal\n */\n config) {\n this.config = config;\n }\n /**\n The schema of the state's document.\n */\n get schema() {\n return this.config.schema;\n }\n /**\n The plugins that are active in this state.\n */\n get plugins() {\n return this.config.plugins;\n }\n /**\n Apply the given transaction to produce a new state.\n */\n apply(tr) {\n return this.applyTransaction(tr).state;\n }\n /**\n @internal\n */\n filterTransaction(tr, ignore = -1) {\n for (let i = 0; i < this.config.plugins.length; i++)\n if (i != ignore) {\n let plugin = this.config.plugins[i];\n if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n return false;\n }\n return true;\n }\n /**\n Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that\n returns the precise transactions that were applied (which might\n be influenced by the [transaction\n hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of\n plugins) along with the new state.\n */\n applyTransaction(rootTr) {\n if (!this.filterTransaction(rootTr))\n return { state: this, transactions: [] };\n let trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n // This loop repeatedly gives plugins a chance to respond to\n // transactions as new transactions are added, making sure to only\n // pass the transactions the plugin did not see before.\n for (;;) {\n let haveNew = false;\n for (let i = 0; i < this.config.plugins.length; i++) {\n let plugin = this.config.plugins[i];\n if (plugin.spec.appendTransaction) {\n let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n let tr = n < trs.length &&\n plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n if (tr && newState.filterTransaction(tr, i)) {\n tr.setMeta(\"appendedTransaction\", rootTr);\n if (!seen) {\n seen = [];\n for (let j = 0; j < this.config.plugins.length; j++)\n seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 });\n }\n trs.push(tr);\n newState = newState.applyInner(tr);\n haveNew = true;\n }\n if (seen)\n seen[i] = { state: newState, n: trs.length };\n }\n }\n if (!haveNew)\n return { state: newState, transactions: trs };\n }\n }\n /**\n @internal\n */\n applyInner(tr) {\n if (!tr.before.eq(this.doc))\n throw new RangeError(\"Applying a mismatched transaction\");\n let newInstance = new EditorState(this.config), fields = this.config.fields;\n for (let i = 0; i < fields.length; i++) {\n let field = fields[i];\n newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n }\n return newInstance;\n }\n /**\n Start a [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state.\n */\n get tr() { return new Transaction(this); }\n /**\n Create a new state.\n */\n static create(config) {\n let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n let instance = new EditorState($config);\n for (let i = 0; i < $config.fields.length; i++)\n instance[$config.fields[i].name] = $config.fields[i].init(config, instance);\n return instance;\n }\n /**\n Create a new state based on this one, but with an adjusted set\n of active plugins. State fields that exist in both sets of\n plugins are kept unchanged. Those that no longer exist are\n dropped, and those that are new are initialized using their\n [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new\n configuration object..\n */\n reconfigure(config) {\n let $config = new Configuration(this.schema, config.plugins);\n let fields = $config.fields, instance = new EditorState($config);\n for (let i = 0; i < fields.length; i++) {\n let name = fields[i].name;\n instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n }\n return instance;\n }\n /**\n Serialize this state to JSON. If you want to serialize the state\n of plugins, pass an object mapping property names to use in the\n resulting JSON object to plugin objects. The argument may also be\n a string or number, in which case it is ignored, to support the\n way `JSON.stringify` calls `toString` methods.\n */\n toJSON(pluginFields) {\n let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() };\n if (this.storedMarks)\n result.storedMarks = this.storedMarks.map(m => m.toJSON());\n if (pluginFields && typeof pluginFields == 'object')\n for (let prop in pluginFields) {\n if (prop == \"doc\" || prop == \"selection\")\n throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\");\n let plugin = pluginFields[prop], state = plugin.spec.state;\n if (state && state.toJSON)\n result[prop] = state.toJSON.call(plugin, this[plugin.key]);\n }\n return result;\n }\n /**\n Deserialize a JSON representation of a state. `config` should\n have at least a `schema` field, and should contain array of\n plugins to initialize the state with. `pluginFields` can be used\n to deserialize the state of plugins, by associating plugin\n instances with the property names they use in the JSON object.\n */\n static fromJSON(config, json, pluginFields) {\n if (!json)\n throw new RangeError(\"Invalid input for EditorState.fromJSON\");\n if (!config.schema)\n throw new RangeError(\"Required config field 'schema' missing\");\n let $config = new Configuration(config.schema, config.plugins);\n let instance = new EditorState($config);\n $config.fields.forEach(field => {\n if (field.name == \"doc\") {\n instance.doc = Node.fromJSON(config.schema, json.doc);\n }\n else if (field.name == \"selection\") {\n instance.selection = Selection.fromJSON(instance.doc, json.selection);\n }\n else if (field.name == \"storedMarks\") {\n if (json.storedMarks)\n instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON);\n }\n else {\n if (pluginFields)\n for (let prop in pluginFields) {\n let plugin = pluginFields[prop], state = plugin.spec.state;\n if (plugin.key == field.name && state && state.fromJSON &&\n Object.prototype.hasOwnProperty.call(json, prop)) {\n instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n return;\n }\n }\n instance[field.name] = field.init(config, instance);\n }\n });\n return instance;\n }\n}\n\nfunction bindProps(obj, self, target) {\n for (let prop in obj) {\n let val = obj[prop];\n if (val instanceof Function)\n val = val.bind(self);\n else if (prop == \"handleDOMEvents\")\n val = bindProps(val, self, {});\n target[prop] = val;\n }\n return target;\n}\n/**\nPlugins bundle functionality that can be added to an editor.\nThey are part of the [editor state](https://prosemirror.net/docs/ref/#state.EditorState) and\nmay influence that state and the view that contains it.\n*/\nclass Plugin {\n /**\n Create a plugin.\n */\n constructor(\n /**\n The plugin's [spec object](https://prosemirror.net/docs/ref/#state.PluginSpec).\n */\n spec) {\n this.spec = spec;\n /**\n The [props](https://prosemirror.net/docs/ref/#view.EditorProps) exported by this plugin.\n */\n this.props = {};\n if (spec.props)\n bindProps(spec.props, this, this.props);\n this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n }\n /**\n Extract the plugin's state field from an editor state.\n */\n getState(state) { return state[this.key]; }\n}\nconst keys = Object.create(null);\nfunction createKey(name) {\n if (name in keys)\n return name + \"$\" + ++keys[name];\n keys[name] = 0;\n return name + \"$\";\n}\n/**\nA key is used to [tag](https://prosemirror.net/docs/ref/#state.PluginSpec.key) plugins in a way\nthat makes it possible to find them, given an editor state.\nAssigning a key does mean only one plugin of that type can be\nactive in a state.\n*/\nclass PluginKey {\n /**\n Create a plugin key.\n */\n constructor(name = \"key\") { this.key = createKey(name); }\n /**\n Get the active plugin with this key, if any, from an editor\n state.\n */\n get(state) { return state.config.pluginsByKey[this.key]; }\n /**\n Get the plugin's state from an editor state.\n */\n getState(state) { return state[this.key]; }\n}\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n","import { TextSelection, NodeSelection, Selection, AllSelection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node)\n return index;\n }\n};\nconst parentNode = function (node) {\n let parent = node.assignedSlot || node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n let range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff)\n return true;\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n let parent = node.parentNode;\n if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n node.contentEditable == \"false\")\n return false;\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n }\n else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\")\n return false;\n off = dir < 0 ? nodeSize(node) : 0;\n }\n else {\n return false;\n }\n }\n}\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isOnEdge(node, offset, parent) {\n for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent)\n return true;\n let index = domIndex(node);\n node = node.parentNode;\n if (!node)\n return false;\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\nfunction hasBlockDesc(dom) {\n let desc;\n for (let cur = dom; cur; cur = cur.parentNode)\n if (desc = cur.pmViewDesc)\n break;\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event;\n}\nfunction deepActiveElement(doc) {\n let elt = doc.activeElement;\n while (elt && elt.shadowRoot)\n elt = elt.shadowRoot.activeElement;\n return elt;\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n return { left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n let rect = node.getBoundingClientRect();\n // Adjust for elements with style \"transform: scale()\"\n let scaleX = (rect.width / node.offsetWidth) || 1;\n let scaleY = (rect.height / node.offsetHeight) || 1;\n // Make sure scrollbar width isn't included in the rectangle\n return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n let doc = view.dom.ownerDocument;\n for (let parent = startDOM || view.dom;; parent = parentNode(parent)) {\n if (!parent)\n break;\n if (parent.nodeType != 1)\n continue;\n let elt = parent;\n let atTop = elt == doc.body;\n let bounding = atTop ? windowRect(doc) : clientRect(elt);\n let moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n moveY = rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n }\n else {\n let startX = elt.scrollLeft, startY = elt.scrollTop;\n if (moveY)\n elt.scrollTop += moveY;\n if (moveX)\n elt.scrollLeft += moveX;\n let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n }\n }\n if (atTop)\n break;\n }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n let refDOM, refTop;\n for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n let dom = view.root.elementFromPoint(x, y);\n if (!dom || dom == view.dom || !view.dom.contains(dom))\n continue;\n let localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break;\n }\n }\n return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n let stack = [], doc = dom.ownerDocument;\n for (let cur = dom; cur; cur = parentNode(cur)) {\n stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n if (dom == doc)\n break;\n }\n return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n for (let i = 0; i < stack.length; i++) {\n let { dom, top, left } = stack[i];\n if (dom.scrollTop != top + dTop)\n dom.scrollTop = top + dTop;\n if (dom.scrollLeft != left)\n dom.scrollLeft = left;\n }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive)\n return dom.setActive(); // in IE\n if (preventScrollSupported)\n return dom.focus(preventScrollSupported);\n let stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = { preventScroll: true };\n return true;\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\nfunction findOffsetInNode(node, coords) {\n let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n let rowBot = coords.top, rowTop = coords.top;\n for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n let rects;\n if (child.nodeType == 1)\n rects = child.getClientRects();\n else if (child.nodeType == 3)\n rects = textRange(child).getClientRects();\n else\n continue;\n for (let i = 0; i < rects.length; i++) {\n let rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n let dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {\n left: rect.right < coords.left ? rect.right : rect.left,\n top: coords.top\n } : coords;\n if (child.nodeType == 1 && dx)\n offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n continue;\n }\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n offset = childIndex + 1;\n }\n }\n if (closest && closest.nodeType == 3)\n return findOffsetInText(closest, coordsClosest);\n if (!closest || (dxClosest && closest.nodeType == 1))\n return { node, offset };\n return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n let len = node.nodeValue.length;\n let range = document.createRange();\n for (let i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n let rect = singleRect(range, 1);\n if (rect.top == rect.bottom)\n continue;\n if (inRect(coords, rect))\n return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n }\n return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n let parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n return parent;\n return dom;\n}\nfunction posFromElement(view, elt, coords) {\n let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n let rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n let outsideBlock = -1;\n for (let cur = node;;) {\n if (cur == view.dom)\n break;\n let desc = view.docView.nearestDesc(cur, true);\n if (!desc)\n return null;\n if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM)) {\n let rect = desc.dom.getBoundingClientRect();\n if (desc.node.isBlock && desc.parent) {\n if (rect.left > coords.left || rect.top > coords.top)\n outsideBlock = desc.posBefore;\n else if (rect.right < coords.left || rect.bottom < coords.top)\n outsideBlock = desc.posAfter;\n }\n if (!desc.contentDOM && outsideBlock < 0) {\n // If we are inside a leaf, return the side of the leaf closer to the coords\n let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n : coords.left < (rect.left + rect.right) / 2;\n return before ? desc.posBefore : desc.posAfter;\n }\n }\n cur = desc.dom.parentNode;\n }\n return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n let len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n let child = element.childNodes[i];\n if (child.nodeType == 1) {\n let rects = child.getClientRects();\n for (let j = 0; j < rects.length; j++) {\n let rect = rects[j];\n if (inRect(coords, rect))\n return elementFromPoint(child, coords, rect);\n }\n }\n if ((i = (i + 1) % len) == startI)\n break;\n }\n }\n return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n let doc = view.dom.ownerDocument, node, offset = 0;\n if (doc.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n let pos = doc.caretPositionFromPoint(coords.left, coords.top);\n if (pos)\n ({ offsetNode: node, offset } = pos);\n }\n catch (_) { }\n }\n if (!node && doc.caretRangeFromPoint) {\n let range = doc.caretRangeFromPoint(coords.left, coords.top);\n if (range)\n ({ startContainer: node, startOffset: offset } = range);\n }\n let elt = (view.root.elementFromPoint ? view.root : doc)\n .elementFromPoint(coords.left, coords.top);\n let pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n let box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box))\n return null;\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt)\n return null;\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (safari) {\n for (let p = elt; node && p; p = parentNode(p))\n if (p.draggable)\n node = undefined;\n }\n elt = targetKludge(elt, coords);\n if (node) {\n if (gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into <input> nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n let next = node.childNodes[offset], box;\n if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n box.bottom > coords.top)\n offset++;\n }\n }\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n pos = view.state.doc.content.size;\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n pos = posFromCaret(view, node, offset, coords);\n }\n if (pos == null)\n pos = posFromElement(view, elt, coords);\n let desc = view.docView.nearestDesc(elt, true);\n return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction singleRect(target, bias) {\n let rects = target.getClientRects();\n return !rects.length ? target.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1];\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n let supportEmptyRange = webkit || gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n let rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n }\n }\n return rect;\n }\n else {\n let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) {\n to++;\n takeSide = -1;\n }\n else if (side >= 0 && offset == node.nodeValue.length) {\n from--;\n takeSide = 1;\n }\n else if (side < 0) {\n from--;\n }\n else {\n to++;\n }\n return flattenV(singleRect(textRange(node, from, to), 1), takeSide < 0);\n }\n }\n let $dom = view.state.doc.resolve(pos - (atom || 0));\n // Return a horizontal line in block context\n if (!$dom.parent.inlineContent) {\n if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n if (before.nodeType == 1)\n return flattenH(before.getBoundingClientRect(), false);\n }\n if (atom == null && offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n if (after.nodeType == 1)\n return flattenH(after.getBoundingClientRect(), true);\n }\n return flattenH(node.getBoundingClientRect(), side >= 0);\n }\n // Inline, not in text node (this is not Bidi-safe)\n if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n if (target)\n return flattenV(singleRect(target, 1), false);\n }\n if (atom == null && offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n after = after.nextSibling;\n let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n : after.nodeType == 1 ? after : null;\n if (target)\n return flattenV(singleRect(target, -1), true);\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n if (rect.width == 0)\n return rect;\n let x = left ? rect.left : rect.right;\n return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n if (rect.height == 0)\n return rect;\n let y = top ? rect.top : rect.bottom;\n return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n let viewState = view.state, active = view.root.activeElement;\n if (viewState != state)\n view.updateState(state);\n if (active != view.dom)\n view.focus();\n try {\n return f();\n }\n finally {\n if (viewState != state)\n view.updateState(viewState);\n if (active != view.dom && active)\n active.focus();\n }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n let sel = state.selection;\n let $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, () => {\n let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n for (;;) {\n let nearest = view.docView.nearestDesc(dom, true);\n if (!nearest)\n break;\n if (nearest.node.isBlock) {\n dom = nearest.contentDOM || nearest.dom;\n break;\n }\n dom = nearest.dom.parentNode;\n }\n let coords = coordsAtPos(view, $pos.pos, 1);\n for (let child = dom.firstChild; child; child = child.nextSibling) {\n let boxes;\n if (child.nodeType == 1)\n boxes = child.getClientRects();\n else if (child.nodeType == 3)\n boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n else\n continue;\n for (let i = 0; i < boxes.length; i++) {\n let box = boxes[i];\n if (box.bottom > box.top + 1 &&\n (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n return false;\n }\n }\n return true;\n });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n let { $head } = state.selection;\n if (!$head.parent.isTextblock)\n return false;\n let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n let sel = view.domSelection();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n return withFlushedState(view, state, () => {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n ;\n sel.modify(\"move\", dir, \"character\");\n let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n (oldNode == newNode && oldOff == newOff);\n // Restore the previous selection\n try {\n sel.collapse(anchorNode, anchorOffset);\n if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n sel.extend(oldNode, oldOff);\n }\n catch (_) { }\n if (oldBidiLevel != null)\n sel.caretBidiLevel = oldBidiLevel;\n return result;\n });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir)\n return cachedResult;\n cachedState = state;\n cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n constructor(parent, children, dom, \n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n }\n // Used to check whether a given description corresponds to a\n // widget/mark/node.\n matchesWidget(widget) { return false; }\n matchesMark(mark) { return false; }\n matchesNode(node, outerDeco, innerDeco) { return false; }\n matchesHack(nodeName) { return false; }\n // When parsing in-editor content (in domchange.js), we allow\n // descriptions to determine the parse rules that should be used to\n // parse them.\n parseRule() { return null; }\n // Used by the editor's event handler to ignore events that come\n // from certain descs.\n stopEvent(event) { return false; }\n // The size of the content represented by this desc.\n get size() {\n let size = 0;\n for (let i = 0; i < this.children.length; i++)\n size += this.children[i].size;\n return size;\n }\n // For block nodes, this represents the space taken up by their\n // start/end tokens.\n get border() { return 0; }\n destroy() {\n this.parent = undefined;\n if (this.dom.pmViewDesc == this)\n this.dom.pmViewDesc = undefined;\n for (let i = 0; i < this.children.length; i++)\n this.children[i].destroy();\n }\n posBeforeChild(child) {\n for (let i = 0, pos = this.posAtStart;; i++) {\n let cur = this.children[i];\n if (cur == child)\n return pos;\n pos += cur.size;\n }\n }\n get posBefore() {\n return this.parent.posBeforeChild(this);\n }\n get posAtStart() {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n }\n get posAfter() {\n return this.posBefore + this.size;\n }\n get posAtEnd() {\n return this.posAtStart + this.size - 2 * this.border;\n }\n localPosFromDOM(dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n let domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n }\n else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n domBefore = domBefore.previousSibling;\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n }\n else {\n let domAfter, desc;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n }\n else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n domAfter = domAfter.nextSibling;\n return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n let atEnd;\n if (dom == this.dom && this.contentDOM) {\n atEnd = offset > domIndex(this.contentDOM);\n }\n else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n }\n else if (this.dom.firstChild) {\n if (offset == 0)\n for (let search = dom;; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = false;\n break;\n }\n if (search.previousSibling)\n break;\n }\n if (atEnd == null && offset == dom.childNodes.length)\n for (let search = dom;; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = true;\n break;\n }\n if (search.nextSibling)\n break;\n }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n }\n nearestDesc(dom, onlyNodes = false) {\n for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n let desc = this.getDesc(cur), nodeDOM;\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && (nodeDOM = desc.nodeDOM) &&\n !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n first = false;\n else\n return desc;\n }\n }\n }\n getDesc(dom) {\n let desc = dom.pmViewDesc;\n for (let cur = desc; cur; cur = cur.parent)\n if (cur == this)\n return desc;\n }\n posFromDOM(dom, offset, bias) {\n for (let scan = dom; scan; scan = scan.parentNode) {\n let desc = this.getDesc(scan);\n if (desc)\n return desc.localPosFromDOM(dom, offset, bias);\n }\n return -1;\n }\n // Find the desc for the node after the given pos, if any. (When a\n // parent node overrode rendering, there might not be one.)\n descAt(pos) {\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length)\n child = child.children[0];\n return child;\n }\n if (pos < end)\n return child.descAt(pos - offset - child.border);\n offset = end;\n }\n }\n domFromPos(pos, side) {\n if (!this.contentDOM)\n return { node: this.dom, offset: 0, atom: pos + 1 };\n // First find the position in the child array\n let i = 0, offset = 0;\n for (let curPos = 0; i < this.children.length; i++) {\n let child = this.children[i], end = curPos + child.size;\n if (end > pos || child instanceof TrailingHackViewDesc) {\n offset = pos - curPos;\n break;\n }\n curPos = end;\n }\n // If this points into the middle of a child, call through\n if (offset)\n return this.children[i].domFromPos(offset - this.children[i].border, side);\n // Go back if there were any zero-length widgets with side >= 0 before this point\n for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n // Scan towards the first useable node\n if (side <= 0) {\n let prev, enter = true;\n for (;; i--, enter = false) {\n prev = i ? this.children[i - 1] : null;\n if (!prev || prev.dom.parentNode == this.contentDOM)\n break;\n }\n if (prev && side && enter && !prev.border && !prev.domAtom)\n return prev.domFromPos(prev.size, side);\n return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n }\n else {\n let next, enter = true;\n for (;; i++, enter = false) {\n next = i < this.children.length ? this.children[i] : null;\n if (!next || next.dom.parentNode == this.contentDOM)\n break;\n }\n if (next && enter && !next.border && !next.domAtom)\n return next.domFromPos(0, side);\n return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n }\n }\n // Used to find a DOM range in a single parent for a given changed\n // range.\n parseRange(from, to, base = 0) {\n if (this.children.length == 0)\n return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n let fromOffset = -1, toOffset = -1;\n for (let offset = base, i = 0;; i++) {\n let child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n let childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n return child.parseRange(from, to, childBase);\n from = offset;\n for (let j = i; j > 0; j--) {\n let prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break;\n }\n from -= prev.size;\n }\n if (fromOffset == -1)\n fromOffset = 0;\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (let j = i + 1; j < this.children.length; j++) {\n let next = this.children[j];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break;\n }\n to += next.size;\n }\n if (toOffset == -1)\n toOffset = this.contentDOM.childNodes.length;\n break;\n }\n offset = end;\n }\n return { node: this.contentDOM, from, to, fromOffset, toOffset };\n }\n emptyChildAt(side) {\n if (this.border || !this.contentDOM || !this.children.length)\n return false;\n let child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side);\n }\n domAfterPos(pos) {\n let { node, offset } = this.domFromPos(pos, 0);\n if (node.nodeType != 1 || offset == node.childNodes.length)\n throw new RangeError(\"No node after pos \" + pos);\n return node.childNodes[offset];\n }\n // View descs are responsible for setting any selection that falls\n // entirely inside of them, so that custom implementations can do\n // custom things with the selection. Note that this falls apart when\n // a selection starts in such a node and ends in another, in which\n // case we just use whatever domFromPos produces as a best effort.\n setSelection(anchor, head, root, force = false) {\n // If the selection falls entirely in a child, give it to that child\n let from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force);\n offset = end;\n }\n let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n let domSel = root.getSelection();\n let brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((gecko || safari) && anchor == head) {\n let { node, offset } = anchorDOM;\n if (node.nodeType == 3) {\n brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n // Issue #1128\n if (brKludge && offset == node.nodeValue.length) {\n for (let scan = node, after; scan; scan = scan.parentNode) {\n if (after = scan.nextSibling) {\n if (after.nodeName == \"BR\")\n anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n break;\n }\n let desc = scan.pmViewDesc;\n if (desc && desc.node && desc.node.isBlock)\n break;\n }\n }\n }\n else {\n let prev = node.childNodes[offset - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n // Firefox can act strangely when the selection is in front of an\n // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {\n let after = domSel.focusNode.childNodes[domSel.focusOffset];\n if (after && after.contentEditable == \"false\")\n force = true;\n }\n if (!(force || brKludge && safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n return;\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n let domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head)\n domSel.extend(headDOM.node, headDOM.offset);\n domSelExtended = true;\n }\n catch (_) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n // Similarly, this could crash on Safari if the editor is hidden, and\n // there was no selection.\n }\n }\n if (!domSelExtended) {\n if (anchor > head) {\n let tmp = anchorDOM;\n anchorDOM = headDOM;\n headDOM = tmp;\n }\n let range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n }\n ignoreMutation(mutation) {\n return !this.contentDOM && mutation.type != \"selection\";\n }\n get contentLost() {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n }\n // Remove a subtree of the element tree that has been touched\n // by a DOM change, so that the next update will redraw it.\n markDirty(from, to) {\n for (let offset = 0, i = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n let startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM))\n child.dirty = NODE_DIRTY;\n else\n child.markDirty(from - startInside, to - startInside);\n return;\n }\n else {\n child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n ? CONTENT_DIRTY : NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n }\n markParentsDirty() {\n let level = 1;\n for (let node = this.parent; node; node = node.parent, level++) {\n let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty)\n node.dirty = dirty;\n }\n }\n get domAtom() { return false; }\n get ignoreForCoords() { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n constructor(parent, widget, view, pos) {\n let self, dom = widget.type.toDOM;\n if (typeof dom == \"function\")\n dom = dom(view, () => {\n if (!self)\n return pos;\n if (self.parent)\n return self.parent.posBeforeChild(self);\n });\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n let wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = \"false\";\n dom.classList.add(\"ProseMirror-widget\");\n }\n super(parent, [], dom, null);\n this.widget = widget;\n this.widget = widget;\n self = this;\n }\n matchesWidget(widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n }\n parseRule() { return { ignore: true }; }\n stopEvent(event) {\n let stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false;\n }\n ignoreMutation(mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n }\n destroy() {\n this.widget.type.destroy(this.dom);\n super.destroy();\n }\n get domAtom() { return true; }\n get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n constructor(parent, dom, textDOM, text) {\n super(parent, [], dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n get size() { return this.text.length; }\n localPosFromDOM(dom, offset) {\n if (dom != this.textDOM)\n return this.posAtStart + (offset ? this.size : 0);\n return this.posAtStart + offset;\n }\n domFromPos(pos) {\n return { node: this.textDOM, offset: pos };\n }\n ignoreMutation(mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n constructor(parent, mark, dom, contentDOM) {\n super(parent, [], dom, contentDOM);\n this.mark = mark;\n }\n static create(parent, mark, inline, view) {\n let custom = view.nodeViews[mark.type.name];\n let spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline));\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom);\n }\n parseRule() {\n if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n return null;\n return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM || undefined };\n }\n matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n markDirty(from, to) {\n super.markDirty(from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n let parent = this.parent;\n while (!parent.node)\n parent = parent.parent;\n if (parent.dirty < this.dirty)\n parent.dirty = this.dirty;\n this.dirty = NOT_DIRTY;\n }\n }\n slice(from, to, view) {\n let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n let nodes = this.children, size = this.size;\n if (to < size)\n nodes = replaceNodes(nodes, to, size, view);\n if (from > 0)\n nodes = replaceNodes(nodes, 0, from, view);\n for (let i = 0; i < nodes.length; i++)\n nodes[i].parent = copy;\n copy.children = nodes;\n return copy;\n }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n super(parent, [], dom, contentDOM);\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n this.nodeDOM = nodeDOM;\n if (contentDOM)\n this.updateChildren(view, pos);\n }\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finicky\n // implementation details to the user code that they probably will\n // never need.)\n static create(parent, node, outerDeco, innerDeco, view, pos) {\n let custom = view.nodeViews[node.type.name], descObj;\n let spec = custom && custom(node, view, () => {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj)\n return pos;\n if (descObj.parent)\n return descObj.parent.posBeforeChild(descObj);\n }, outerDeco, innerDeco);\n let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom)\n dom = document.createTextNode(node.text);\n else if (dom.nodeType != 3)\n throw new RangeError(\"Text must be rendered as a DOM text node\");\n }\n else if (!dom) {\n ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n if (!dom.hasAttribute(\"contenteditable\"))\n dom.contentEditable = \"false\";\n if (node.type.spec.draggable)\n dom.draggable = true;\n }\n let nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n if (spec)\n return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n else if (node.isText)\n return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n else\n return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n }\n parseRule() {\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView)\n return null;\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n let rule = { node: this.node.type.name, attrs: this.node.attrs };\n if (this.node.type.whitespace == \"pre\")\n rule.preserveWhitespace = \"full\";\n if (!this.contentDOM) {\n rule.getContent = () => this.node.content;\n }\n else if (!this.contentLost) {\n rule.contentElement = this.contentDOM;\n }\n else {\n // Chrome likes to randomly recreate parent nodes when\n // backspacing things. When that happens, this tries to find the\n // new parent.\n for (let i = this.children.length - 1; i >= 0; i--) {\n let child = this.children[i];\n if (this.dom.contains(child.dom.parentNode)) {\n rule.contentElement = child.dom.parentNode;\n break;\n }\n }\n if (!rule.contentElement)\n rule.getContent = () => Fragment.empty;\n }\n return rule;\n }\n matchesNode(node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n }\n get size() { return this.node.nodeSize; }\n get border() { return this.node.isLeaf ? 0 : 1; }\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n updateChildren(view, pos) {\n let inline = this.node.inlineContent, off = pos;\n let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n let localComposition = composition && composition.pos > -1 ? composition : null;\n let compositionInChild = composition && composition.pos < 0;\n let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n if (widget.spec.marks)\n updater.syncToMarks(widget.spec.marks, inline, view);\n else if (widget.type.side >= 0 && !insideNode)\n updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, (child, outerDeco, innerDeco, i) => {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Try several strategies for drawing this node\n let compIndex;\n if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n else if (compositionInChild && view.state.selection.from > off &&\n view.state.selection.to < off + child.nodeSize &&\n (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i)) ;\n else {\n // Add it as a new view\n updater.addNode(child, outerDeco, innerDeco, view, off);\n }\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks([], inline, view);\n if (this.node.isTextblock)\n updater.addTextblockHacks();\n updater.destroyRest();\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (localComposition)\n this.protectLocalComposition(view, localComposition);\n renderDescs(this.contentDOM, this.children, view);\n if (ios)\n iosHacks(this.dom);\n }\n }\n localCompositionInfo(view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node\n let { from, to } = view.state.selection;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n return null;\n let sel = view.domSelectionRange();\n let textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode))\n return null;\n if (this.node.inlineContent) {\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n let text = textNode.nodeValue;\n let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n }\n else {\n return { node: textNode, pos: -1, text: \"\" };\n }\n }\n protectLocalComposition(view, { node, pos, text }) {\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node))\n return;\n // Create a composition view for the orphaned nodes\n let topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM)\n break;\n while (topNode.previousSibling)\n topNode.parentNode.removeChild(topNode.previousSibling);\n while (topNode.nextSibling)\n topNode.parentNode.removeChild(topNode.nextSibling);\n if (topNode.pmViewDesc)\n topNode.pmViewDesc = undefined;\n }\n let desc = new CompositionViewDesc(this, topNode, node, text);\n view.input.compositionNodes.push(desc);\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n }\n // If this desc must be updated to match the given node decoration,\n // do so and return true.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node))\n return false;\n this.updateInner(node, outerDeco, innerDeco, view);\n return true;\n }\n updateInner(node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM)\n this.updateChildren(view, this.posAtStart);\n this.dirty = NOT_DIRTY;\n }\n updateOuterDeco(outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco))\n return;\n let needsWrap = this.nodeDOM.nodeType != 1;\n let oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = undefined;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n }\n // Mark this node as being the selected node.\n selectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.draggable = true;\n }\n // Remove selected node marking from this node.\n deselectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.removeAttribute(\"draggable\");\n }\n get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n return new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);\n}\nclass TextViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n }\n parseRule() {\n let skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco)\n skip = skip.parentNode;\n return { skip: (skip || true) };\n }\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node))\n return false;\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM)\n view.trackWrites = null;\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true;\n }\n inParent() {\n let parentDOM = this.parent.contentDOM;\n for (let n = this.nodeDOM; n; n = n.parentNode)\n if (n == parentDOM)\n return true;\n return false;\n }\n domFromPos(pos) {\n return { node: this.nodeDOM, offset: pos };\n }\n localPosFromDOM(dom, offset, bias) {\n if (dom == this.nodeDOM)\n return this.posAtStart + Math.min(offset, this.node.text.length);\n return super.localPosFromDOM(dom, offset, bias);\n }\n ignoreMutation(mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\";\n }\n slice(from, to, view) {\n let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n }\n markDirty(from, to) {\n super.markDirty(from, to);\n if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n this.dirty = NODE_DIRTY;\n }\n get domAtom() { return false; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n parseRule() { return { ignore: true }; }\n matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n get domAtom() { return true; }\n get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY)\n return false;\n if (this.spec.update) {\n let result = this.spec.update(node, outerDeco, innerDeco);\n if (result)\n this.updateInner(node, outerDeco, innerDeco, view);\n return result;\n }\n else if (!this.contentDOM && !node.isLeaf) {\n return false;\n }\n else {\n return super.update(node, outerDeco, innerDeco, view);\n }\n }\n selectNode() {\n this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n }\n deselectNode() {\n this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n }\n setSelection(anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n : super.setSelection(anchor, head, root, force);\n }\n destroy() {\n if (this.spec.destroy)\n this.spec.destroy();\n super.destroy();\n }\n stopEvent(event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n }\n ignoreMutation(mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n let dom = parentDOM.firstChild, written = false;\n for (let i = 0; i < descs.length; i++) {\n let desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) {\n dom = rm(dom);\n written = true;\n }\n dom = dom.nextSibling;\n }\n else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) {\n dom = rm(dom);\n written = true;\n }\n if (written && view.trackWrites == parentDOM)\n view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n if (nodeName)\n this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0)\n return noDeco;\n let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n for (let i = 0; i < outerDeco.length; i++) {\n let attrs = outerDeco[i].type.attrs;\n if (!attrs)\n continue;\n if (attrs.nodeName)\n result.push(top = new OuterDecoLevel(attrs.nodeName));\n for (let name in attrs) {\n let val = attrs[name];\n if (val == null)\n continue;\n if (needsWrap && result.length == 1)\n result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n if (name == \"class\")\n top.class = (top.class ? top.class + \" \" : \"\") + val;\n else if (name == \"style\")\n top.style = (top.style ? top.style + \";\" : \"\") + val;\n else if (name != \"nodeName\")\n top[name] = val;\n }\n }\n return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco)\n return nodeDOM;\n let curDOM = nodeDOM;\n for (let i = 0; i < curComputed.length; i++) {\n let deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n let parent;\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n }\n else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n for (let name in prev)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n dom.removeAttribute(name);\n for (let name in cur)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n dom.setAttribute(name, cur[name]);\n if (prev.class != cur.class) {\n let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n for (let i = 0; i < prevList.length; i++)\n if (curList.indexOf(prevList[i]) == -1)\n dom.classList.remove(prevList[i]);\n for (let i = 0; i < curList.length; i++)\n if (prevList.indexOf(curList[i]) == -1)\n dom.classList.add(curList[i]);\n if (dom.classList.length == 0)\n dom.removeAttribute(\"class\");\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n dom.style.removeProperty(m[1]);\n }\n if (cur.style)\n dom.style.cssText += cur.style;\n }\n}\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!a[i].type.eq(b[i].type))\n return false;\n return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n let next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n constructor(top, lock, view) {\n this.lock = lock;\n this.view = view;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n this.top = top;\n this.preMatch = preMatch(top.node.content, top);\n }\n // Destroy and remove the children between the given indices in\n // `this.top`.\n destroyBetween(start, end) {\n if (start == end)\n return;\n for (let i = start; i < end; i++)\n this.top.children[i].destroy();\n this.top.children.splice(start, end - start);\n this.changed = true;\n }\n // Destroy all remaining children in `this.top`.\n destroyRest() {\n this.destroyBetween(this.index, this.top.children.length);\n }\n // Sync the current stack of mark descs with the given array of\n // marks, reusing existing mark descs when possible.\n syncToMarks(marks, inline, view) {\n let keep = 0, depth = this.stack.length >> 1;\n let maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n keep++;\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n let found = -1;\n for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n let next = this.top.children[i];\n if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n found = i;\n break;\n }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n }\n else {\n let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n }\n // Try to find a node desc matching the given data. Skip over it and\n // return true when successful.\n findNodeMatch(node, outerDeco, innerDeco, index) {\n let found = -1, targetDesc;\n if (index >= this.preMatch.index &&\n (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n found = this.top.children.indexOf(targetDesc, this.index);\n }\n else {\n for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n let child = this.top.children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n found = i;\n break;\n }\n }\n }\n if (found < 0)\n return false;\n this.destroyBetween(this.index, found);\n this.index++;\n return true;\n }\n updateNodeAt(node, outerDeco, innerDeco, index, view) {\n let child = this.top.children[index];\n if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n child.dirty = CONTENT_DIRTY;\n if (!child.update(node, outerDeco, innerDeco, view))\n return false;\n this.destroyBetween(this.index, index);\n this.index++;\n return true;\n }\n findIndexWithChild(domNode) {\n for (;;) {\n let parent = domNode.parentNode;\n if (!parent)\n return -1;\n if (parent == this.top.contentDOM) {\n let desc = domNode.pmViewDesc;\n if (desc)\n for (let i = this.index; i < this.top.children.length; i++) {\n if (this.top.children[i] == desc)\n return i;\n }\n return -1;\n }\n domNode = parent;\n }\n }\n // Try to update the next node, if any, to the given data. Checks\n // pre-matches to avoid overwriting nodes that could still be used.\n updateNextNode(node, outerDeco, innerDeco, view, index) {\n for (let i = this.index; i < this.top.children.length; i++) {\n let next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n let preMatch = this.preMatch.matched.get(next);\n if (preMatch != null && preMatch != index)\n return false;\n let nextDOM = next.dom;\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n let locked = this.isLocked(nextDOM) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM)\n this.changed = true;\n this.index++;\n return true;\n }\n break;\n }\n }\n return false;\n }\n // Insert the node as a newly created node desc.\n addNode(node, outerDeco, innerDeco, view, pos) {\n this.top.children.splice(this.index++, 0, NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos));\n this.changed = true;\n }\n placeWidget(widget, view, pos) {\n let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) &&\n (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n }\n else {\n let desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n }\n // Make sure a textblock looks and behaves correctly in\n // contentEditable.\n addTextblockHacks() {\n let lastChild = this.top.children[this.index - 1], parent = this.top;\n while (lastChild instanceof MarkViewDesc) {\n parent = lastChild;\n lastChild = parent.children[parent.children.length - 1];\n }\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text) ||\n (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n this.addHackNode(\"IMG\", parent);\n this.addHackNode(\"BR\", this.top);\n }\n }\n addHackNode(nodeName, parent) {\n if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n this.index++;\n }\n else {\n let dom = document.createElement(nodeName);\n if (nodeName == \"IMG\") {\n dom.className = \"ProseMirror-separator\";\n dom.alt = \"\";\n }\n if (nodeName == \"BR\")\n dom.className = \"ProseMirror-trailingBreak\";\n let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n if (parent != this.top)\n parent.children.push(hack);\n else\n parent.children.splice(this.index++, 0, hack);\n this.changed = true;\n }\n }\n isLocked(node) {\n return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes. Returns the fragment index of the first node that\n// is part of the sequence of matched nodes at the end of the\n// fragment.\nfunction preMatch(frag, parentDesc) {\n let curDesc = parentDesc, descI = curDesc.children.length;\n let fI = frag.childCount, matched = new Map, matches = [];\n outer: while (fI > 0) {\n let desc;\n for (;;) {\n if (descI) {\n let next = curDesc.children[descI - 1];\n if (next instanceof MarkViewDesc) {\n curDesc = next;\n descI = next.children.length;\n }\n else {\n desc = next;\n descI--;\n break;\n }\n }\n else if (curDesc == parentDesc) {\n break outer;\n }\n else {\n // FIXME\n descI = curDesc.parent.children.indexOf(curDesc);\n curDesc = curDesc.parent;\n }\n }\n let node = desc.node;\n if (!node)\n continue;\n if (node != frag.child(fI - 1))\n break;\n --fI;\n matched.set(desc, fI);\n matches.push(desc);\n }\n return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n let locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (let i = 0; i < parent.childCount; i++) {\n let child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return;\n }\n let decoIndex = 0, active = [], restNode = null;\n for (let parentIndex = 0;;) {\n if (decoIndex < locals.length && locals[decoIndex].to == offset) {\n let widget = locals[decoIndex++], widgets;\n while (decoIndex < locals.length && locals[decoIndex].to == offset)\n (widgets || (widgets = [widget])).push(locals[decoIndex++]);\n if (widgets) {\n widgets.sort(compareSide);\n for (let i = 0; i < widgets.length; i++)\n onWidget(widgets[i], parentIndex, !!restNode);\n }\n else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n let child, index;\n if (restNode) {\n index = -1;\n child = restNode;\n restNode = null;\n }\n else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child = parent.child(parentIndex++);\n }\n else {\n break;\n }\n for (let i = 0; i < active.length; i++)\n if (active[i].to <= offset)\n active.splice(i--, 1);\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n active.push(locals[decoIndex++]);\n let end = offset + child.nodeSize;\n if (child.isText) {\n let cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n cutAt = locals[decoIndex].from;\n for (let i = 0; i < active.length; i++)\n if (active[i].to < cutAt)\n cutAt = active[i].to;\n if (cutAt < end) {\n restNode = child.cut(cutAt - offset);\n child = child.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n onNode(child, outerDeco, deco.forChild(offset, child), index);\n offset = end;\n }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n let oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\nfunction nearbyTextNode(node, offset) {\n for (;;) {\n if (node.nodeType == 3)\n return node;\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n return node.childNodes[offset];\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n }\n else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n }\n else {\n return null;\n }\n }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n let child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText)\n continue;\n let str = child.text;\n while (i < frag.childCount) {\n let next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText)\n break;\n str += next.text;\n }\n if (pos >= from) {\n let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n if (found >= 0 && found + text.length + childStart >= from)\n return childStart + found;\n if (from == to && str.length >= (to + text.length) - childStart &&\n str.slice(to - childStart, to - childStart + text.length) == text)\n return to;\n }\n }\n return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n let result = [];\n for (let i = 0, off = 0; i < nodes.length; i++) {\n let child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n }\n else {\n if (start < from)\n result.push(child.slice(0, from - start, view));\n if (replacement) {\n result.push(replacement);\n replacement = undefined;\n }\n if (end > to)\n result.push(child.slice(to - start, child.size, view));\n }\n }\n return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n let domSel = view.domSelectionRange(), doc = view.state.doc;\n if (!domSel.focusNode)\n return null;\n let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n if (head < 0)\n return null;\n let $head = doc.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node)\n nearestDesc = nearestDesc.parent;\n let nearestDescNode = nearestDesc.node;\n if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n let pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n }\n else {\n let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n if (anchor < 0)\n return null;\n $anchor = doc.resolve(anchor);\n }\n if (!selection) {\n let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection;\n}\nfunction editorOwnsSelection(view) {\n return view.editable ? view.hasFocus() :\n hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n let sel = view.state.selection;\n syncNodeSelection(view, sel);\n if (!editorOwnsSelection(view))\n return;\n // The delayed drag selection causes issues with Cell Selections\n // in Safari. And the drag selection delay is to workarond issues\n // which only present in Chrome.\n if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n if (domSel.anchorNode && curSel.anchorNode &&\n isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n view.input.mouseDown.delayedSelectionSync = true;\n view.domObserver.setCurSelection();\n return;\n }\n }\n view.domObserver.disconnectSelection();\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n }\n else {\n let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n resetEditableFrom = temporarilyEditableNear(view, sel.from);\n if (!sel.empty && !sel.$from.parent.inlineContent)\n resetEditableTo = temporarilyEditableNear(view, sel.to);\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom)\n resetEditable(resetEditableFrom);\n if (resetEditableTo)\n resetEditable(resetEditableTo);\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document)\n removeClassOnSelectionChange(view);\n }\n }\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n let { node, offset } = view.docView.domFromPos(pos, 0);\n let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n let before = offset ? node.childNodes[offset - 1] : null;\n if (safari && after && after.contentEditable == \"false\")\n return setEditable(after);\n if ((!after || after.contentEditable == \"false\") &&\n (!before || before.contentEditable == \"false\")) {\n if (after)\n return setEditable(after);\n else if (before)\n return setEditable(before);\n }\n}\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (safari && element.draggable) {\n element.draggable = false;\n element.wasDraggable = true;\n }\n return element;\n}\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) {\n element.draggable = true;\n element.wasDraggable = null;\n }\n}\nfunction removeClassOnSelectionChange(view) {\n let doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n let domSel = view.domSelectionRange();\n let node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n setTimeout(() => {\n if (!editorOwnsSelection(view) || view.state.selection.visible)\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }, 20);\n }\n });\n}\nfunction selectCursorWrapper(view) {\n let domSel = view.domSelection(), range = document.createRange();\n let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img)\n range.setEnd(node.parentNode, domIndex(node) + 1);\n else\n range.setEnd(node, 0);\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n let desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc)\n desc.selectNode();\n view.lastSelectedViewDesc = desc;\n }\n }\n else {\n clearNodeSelection(view);\n }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n view.lastSelectedViewDesc.deselectNode();\n view.lastSelectedViewDesc = undefined;\n }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n if (view.editable && !view.hasFocus())\n return false;\n return hasSelection(view);\n}\nfunction hasSelection(view) {\n let sel = view.domSelectionRange();\n if (!sel.anchorNode)\n return false;\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n }\n catch (_) {\n return false;\n }\n}\nfunction anchorInRightPlace(view) {\n let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n let domSel = view.domSelectionRange();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n let { $anchor, $head } = state.selection;\n let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (!sel.empty || mods.indexOf(\"s\") > -1) {\n return false;\n }\n else if (view.endOfTextblock(dir > 0 ? \"right\" : \"left\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n return apply(view, next);\n return false;\n }\n else if (!(mac && mods.indexOf(\"m\") > -1)) {\n let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText)\n return false;\n let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n return false;\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n }\n else if (webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n }\n else {\n return false;\n }\n }\n }\n else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n }\n else {\n let next = moveSelectionBlock(view.state, dir);\n if (next)\n return apply(view, next);\n return false;\n }\n}\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom) {\n let desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dom.nextSibling || dom.nodeName != \"BR\");\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesLeft(view) {\n let sel = view.domSelectionRange();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset]))\n force = true;\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break;\n }\n else {\n let before = node.childNodes[offset - 1];\n if (isIgnorable(before)) {\n moveNode = node;\n moveOffset = --offset;\n }\n else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n }\n else\n break;\n }\n }\n else if (isBlockNode(node)) {\n break;\n }\n else {\n let prev = node.previousSibling;\n while (prev && isIgnorable(prev)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = 0;\n }\n else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force)\n setSelFocus(view, node, offset);\n else if (moveNode)\n setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesRight(view) {\n let sel = view.domSelectionRange();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let len = nodeLen(node);\n let moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1)\n break;\n let after = node.childNodes[offset];\n if (isIgnorable(after)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else\n break;\n }\n else if (isBlockNode(node)) {\n break;\n }\n else {\n let next = node.nextSibling;\n while (next && isIgnorable(next)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = len = 0;\n }\n else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode)\n setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n let desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock;\n}\nfunction setSelFocus(view, node, offset) {\n let sel = view.domSelection();\n if (selectionCollapsed(sel)) {\n let range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n let { state } = view;\n // If no state update ends up happening, reset the selection.\n setTimeout(() => {\n if (view.state == state)\n selectionToDOM(view);\n }, 50);\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n return false;\n if (mac && mods.indexOf(\"m\") > -1)\n return false;\n let { $from, $to } = sel;\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n return apply(view, next);\n }\n if (!$from.parent.inlineContent) {\n let side = dir < 0 ? $from : $to;\n let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n return beyond ? apply(view, beyond) : false;\n }\n return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection))\n return true;\n let { $head, $anchor, empty } = view.state.selection;\n if (!$head.sameParent($anchor))\n return true;\n if (!empty)\n return false;\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n return true;\n let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n let tr = view.state.tr;\n if (dir < 0)\n tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n else\n tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n view.dispatch(tr);\n return true;\n }\n return false;\n}\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!safari || view.state.selection.$head.parentOffset > 0)\n return false;\n let { focusNode, focusOffset } = view.domSelectionRange();\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n let child = focusNode.firstChild;\n switchEditable(view, child, \"true\");\n setTimeout(() => switchEditable(view, child, \"false\"), 20);\n }\n return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n let result = \"\";\n if (event.ctrlKey)\n result += \"c\";\n if (event.metaKey)\n result += \"m\";\n if (event.altKey)\n result += \"a\";\n if (event.shiftKey)\n result += \"s\";\n return result;\n}\nfunction captureKeyDown(view, event) {\n let code = event.keyCode, mods = getMods(event);\n if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodesLeft(view);\n }\n else if (code == 46 || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodesRight(view);\n }\n else if (code == 13 || code == 27) { // Enter, Esc\n return true;\n }\n else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n return selectHorizontally(view, -1, mods) || skipIgnoredNodesLeft(view);\n }\n else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n return selectHorizontally(view, 1, mods) || skipIgnoredNodesRight(view);\n }\n else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n return selectVertically(view, -1, mods) || skipIgnoredNodesLeft(view);\n }\n else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodesRight(view);\n }\n else if (mods == (mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true;\n }\n return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n let context = [], { content, openStart, openEnd } = slice;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n let node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n let wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild)\n wrapper.appendChild(wrap.firstChild);\n wrap.appendChild(wrapper);\n wrappers++;\n }\n firstChild = wrap.firstChild;\n }\n if (firstChild && firstChild.nodeType == 1)\n firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n return { dom: wrap, text };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n let inCode = $context.parent.type.spec.code;\n let dom, slice;\n if (!html && !text)\n return null;\n let asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n if (inCode)\n return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n if (parsed) {\n slice = parsed;\n }\n else {\n let marks = $context.marks();\n let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n dom = document.createElement(\"div\");\n text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n let p = dom.appendChild(document.createElement(\"p\"));\n if (block)\n p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n });\n }\n }\n else {\n view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n dom = readHTML(html);\n if (webkit)\n restoreReplacedSpaces(dom);\n }\n let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n if (sliceData && sliceData[3])\n for (let i = +sliceData[3]; i > 0; i--) {\n let child = dom.firstChild;\n while (child && child.nodeType != 1)\n child = child.nextSibling;\n if (!child)\n break;\n dom = child;\n }\n if (!slice) {\n let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {\n preserveWhitespace: !!(asText || sliceData),\n context: $context,\n ruleFromNode(dom) {\n if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n return { ignore: true };\n return null;\n }\n });\n }\n if (sliceData) {\n slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n }\n else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n if (slice.openStart || slice.openEnd) {\n let openStart = 0, openEnd = 0;\n for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n slice = closeSlice(slice, openStart, openEnd);\n }\n }\n view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2)\n return fragment;\n for (let d = $context.depth; d >= 0; d--) {\n let parent = $context.node(d);\n let match = parent.contentMatchAt($context.index(d));\n let lastWrap, result = [];\n fragment.forEach(node => {\n if (!result)\n return;\n let wrap = match.findWrapping(node.type), inLast;\n if (!wrap)\n return result = null;\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n }\n else {\n if (result.length)\n result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n let wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type);\n lastWrap = wrap;\n }\n });\n if (result)\n return Fragment.from(result);\n }\n return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n for (let i = wrap.length - 1; i >= from; i--)\n node = wrap[i].create(null, Fragment.from(node));\n return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner)\n return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n let match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n }\n}\nfunction closeRight(node, depth) {\n if (depth == 0)\n return node;\n let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (depth < to - 1)\n inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n if (depth >= from)\n inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, fragment.childCount > 1 || openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n if (openEnd < slice.openEnd)\n slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\nlet _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"));\n}\nfunction readHTML(html) {\n let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n if (metas)\n html = html.slice(metas[0].length);\n let elt = detachedDoc().createElement(\"div\");\n let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n elt.innerHTML = html;\n if (wrap)\n for (let i = 0; i < wrap.length; i++)\n elt = elt.querySelector(wrap[i]) || elt;\n return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n for (let i = 0; i < nodes.length; i++) {\n let node = nodes[i];\n if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n }\n}\nfunction addContext(slice, context) {\n if (!slice.size)\n return slice;\n let schema = slice.content.firstChild.type.schema, array;\n try {\n array = JSON.parse(context);\n }\n catch (e) {\n return slice;\n }\n let { content, openStart, openEnd } = slice;\n for (let i = array.length - 2; i >= 0; i -= 2) {\n let type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs())\n break;\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++;\n openEnd++;\n }\n return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n constructor() {\n this.shiftKey = false;\n this.mouseDown = null;\n this.lastKeyCode = null;\n this.lastKeyCodeTime = 0;\n this.lastClick = { time: 0, x: 0, y: 0, type: \"\" };\n this.lastSelectionOrigin = null;\n this.lastSelectionTime = 0;\n this.lastIOSEnter = 0;\n this.lastIOSEnterFallbackTimeout = -1;\n this.lastFocus = 0;\n this.lastTouch = 0;\n this.lastAndroidDelete = 0;\n this.composing = false;\n this.composingTimeout = -1;\n this.compositionNodes = [];\n this.compositionEndedAt = -2e8;\n this.domChangeCount = 0;\n this.eventHandlers = Object.create(null);\n this.hideSelectionGuard = null;\n }\n}\nfunction initInput(view) {\n for (let event in handlers) {\n let handler = handlers[event];\n view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n (view.editable || !(event.type in editHandlers)))\n handler(view, event);\n }, passiveHandlers[event] ? { passive: true } : undefined);\n }\n // On Safari, for reasons beyond my understanding, adding an input\n // event handler makes an issue where the composition vanishes when\n // you press enter go away.\n if (safari)\n view.dom.addEventListener(\"input\", () => null);\n ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n view.input.lastSelectionOrigin = origin;\n view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (let type in view.input.eventHandlers)\n view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n clearTimeout(view.input.composingTimeout);\n clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", currentHandlers => {\n for (let type in currentHandlers)\n if (!view.input.eventHandlers[type])\n view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n });\n}\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", handlers => {\n let handler = handlers[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false;\n });\n}\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles)\n return true;\n if (event.defaultPrevented)\n return false;\n for (let node = event.target; node != view.dom; node = node.parentNode)\n if (!node || node.nodeType == 11 ||\n (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n return false;\n return true;\n}\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] &&\n (view.editable || !(event.type in editHandlers)))\n handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n let event = _event;\n view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event))\n return;\n view.input.lastKeyCode = event.keyCode;\n view.input.lastKeyCodeTime = Date.now();\n // Suppress enter key events on Chrome Android, because those tend\n // to be part of a confused sequence of composition events fired,\n // and handling them eagerly tends to corrupt the input.\n if (android && chrome && event.keyCode == 13)\n return;\n if (event.keyCode != 229)\n view.domObserver.forceFlush();\n // On iOS, if we preventDefault enter key presses, the virtual\n // keyboard gets confused. So the hack here is to set a flag that\n // makes the DOM change code recognize that what just happens should\n // be replaced by whatever the Enter key handlers do.\n if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n let now = Date.now();\n view.input.lastIOSEnter = now;\n view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n if (view.input.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n view.input.lastIOSEnter = 0;\n }\n }, 200);\n }\n else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n event.preventDefault();\n }\n else {\n setSelectionOrigin(view, \"key\");\n }\n};\neditHandlers.keyup = (view, event) => {\n if (event.keyCode == 16)\n view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n let event = _event;\n if (inOrNearComposition(view, event) || !event.charCode ||\n event.ctrlKey && !event.altKey || mac && event.metaKey)\n return;\n if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n event.preventDefault();\n return;\n }\n let sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n let text = String.fromCharCode(event.charCode);\n if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text)))\n view.dispatch(view.state.tr.insertText(text).scrollIntoView());\n event.preventDefault();\n }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n let dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1)\n return false;\n let $pos = view.state.doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n return true;\n }\n return false;\n}\nfunction updateSelection(view, selection, origin) {\n if (!view.focused)\n view.focus();\n let tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\")\n tr.setMeta(\"pointer\", true);\n view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1)\n return false;\n let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true;\n }\n return false;\n}\nfunction selectClickedNode(view, inside) {\n if (inside == -1)\n return false;\n let sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection)\n selectedNode = sel.node;\n let $pos = view.state.doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 &&\n i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n selectAt = $pos.before(sel.$from.depth);\n else\n selectAt = $pos.before(i);\n break;\n }\n }\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true;\n }\n else {\n return false;\n }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n if (event.button != 0)\n return false;\n let doc = view.state.doc;\n if (inside == -1) {\n if (doc.inlineContent) {\n updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n return true;\n }\n return false;\n }\n let $pos = doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n let nodePos = $pos.before(i);\n if (node.inlineContent)\n updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\");\n else if (NodeSelection.isSelectable(node))\n updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\");\n else\n continue;\n return true;\n }\n}\nfunction forceDOMFlush(view) {\n return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n let event = _event;\n view.input.shiftKey = event.shiftKey;\n let flushed = forceDOMFlush(view);\n let now = Date.now(), type = \"singleClick\";\n if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) {\n if (view.input.lastClick.type == \"singleClick\")\n type = \"doubleClick\";\n else if (view.input.lastClick.type == \"doubleClick\")\n type = \"tripleClick\";\n }\n view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type };\n let pos = view.posAtCoords(eventCoords(event));\n if (!pos)\n return;\n if (type == \"singleClick\") {\n if (view.input.mouseDown)\n view.input.mouseDown.done();\n view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);\n }\n else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n event.preventDefault();\n }\n else {\n setSelectionOrigin(view, \"pointer\");\n }\n};\nclass MouseDown {\n constructor(view, pos, event, flushed) {\n this.view = view;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.delayedSelectionSync = false;\n this.mightDrag = null;\n this.startDoc = view.state.doc;\n this.selectNode = !!event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n let targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n }\n else {\n let $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n const target = flushed ? null : event.target;\n const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc ? targetDesc.dom : null;\n let { selection } = view.state;\n if (event.button == 0 &&\n targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos)\n this.mightDrag = {\n node: targetNode,\n pos: targetPos,\n addAttr: !!(this.target && !this.target.draggable),\n setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n };\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr)\n this.target.draggable = true;\n if (this.mightDrag.setUneditable)\n setTimeout(() => {\n if (this.view.input.mouseDown == this)\n this.target.setAttribute(\"contentEditable\", \"false\");\n }, 20);\n this.view.domObserver.start();\n }\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n }\n done() {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr)\n this.target.removeAttribute(\"draggable\");\n if (this.mightDrag.setUneditable)\n this.target.removeAttribute(\"contentEditable\");\n this.view.domObserver.start();\n }\n if (this.delayedSelectionSync)\n setTimeout(() => selectionToDOM(this.view));\n this.view.input.mouseDown = null;\n }\n up(event) {\n this.done();\n if (!this.view.dom.contains(event.target))\n return;\n let pos = this.pos;\n if (this.view.state.doc != this.startDoc)\n pos = this.view.posAtCoords(eventCoords(event));\n this.updateAllowDefault(event);\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n }\n else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n }\n else if (event.button == 0 &&\n (this.flushed ||\n // Safari ignores clicks on draggable elements\n (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n (chrome && !this.view.state.selection.visible &&\n Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n }\n else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n }\n move(event) {\n this.updateAllowDefault(event);\n setSelectionOrigin(this.view, \"pointer\");\n if (event.buttons == 0)\n this.done();\n }\n updateAllowDefault(event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n Math.abs(this.event.y - event.clientY) > 4))\n this.allowDefault = true;\n }\n}\nhandlers.touchstart = view => {\n view.input.lastTouch = Date.now();\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n view.input.lastTouch = Date.now();\n setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n if (view.composing)\n return true;\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n // emitted. The keydown event triggers newline insertion, which we don't want.\n // This method returns true if the keydown event should be ignored.\n // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n // This guards against the case where compositionend is triggered without the keyboard\n // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n // afterwards- we wouldn't want to ignore the keydown event in this case.\n if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {\n view.input.compositionEndedAt = -2e8;\n return true;\n }\n return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n if (!view.composing) {\n view.domObserver.flush();\n let { state } = view, $pos = state.selection.$from;\n if (state.selection.empty &&\n (state.storedMarks ||\n (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)))) {\n // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n }\n else {\n endComposition(view);\n // In firefox, if the cursor is after but outside a marked node,\n // the inserted text won't inherit the marks. So this moves it\n // inside if necessary.\n if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n let sel = view.domSelectionRange();\n for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before)\n break;\n if (before.nodeType == 3) {\n view.domSelection().collapse(before, before.nodeValue.length);\n break;\n }\n else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.input.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\neditHandlers.compositionend = (view, event) => {\n if (view.composing) {\n view.input.composing = false;\n view.input.compositionEndedAt = event.timeStamp;\n scheduleComposeEnd(view, 20);\n }\n};\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.input.composingTimeout);\n if (delay > -1)\n view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n if (view.composing) {\n view.input.composing = false;\n view.input.compositionEndedAt = timestampFromCustomEvent();\n }\n while (view.input.compositionNodes.length > 0)\n view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction timestampFromCustomEvent() {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"event\", true, true);\n return event.timeStamp;\n}\n/**\n@internal\n*/\nfunction endComposition(view, forceUpdate = false) {\n if (android && view.domObserver.flushingSoon >= 0)\n return;\n view.domObserver.forceFlush();\n clearComposition(view);\n if (forceUpdate || view.docView && view.docView.dirty) {\n let sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection))\n view.dispatch(view.state.tr.setSelection(sel));\n else\n view.updateState(view.state);\n return true;\n }\n return false;\n}\nfunction captureCopy(view, dom) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n if (!view.dom.parentNode)\n return;\n let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n let sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n // Done because IE will fire a selectionchange moving the selection\n // to its start when removeAllRanges is called and the editor still\n // has focus (which will mess up the editor's selection state).\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(() => {\n if (wrap.parentNode)\n wrap.parentNode.removeChild(wrap);\n view.focus();\n }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n let event = _event;\n let sel = view.state.selection, cut = event.type == \"cut\";\n if (sel.empty)\n return;\n // IE and Edge's clipboard interface is completely broken\n let data = brokenClipboardAPI ? null : event.clipboardData;\n let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n if (data) {\n event.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n }\n else {\n captureCopy(view, dom);\n }\n if (cut)\n view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n if (!view.dom.parentNode)\n return;\n let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText)\n target.contentEditable = \"true\";\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n setTimeout(() => {\n view.focus();\n if (target.parentNode)\n target.parentNode.removeChild(target);\n if (plainText)\n doPaste(view, target.value, null, view.input.shiftKey, event);\n else\n doPaste(view, target.textContent, target.innerHTML, view.input.shiftKey, event);\n }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n return true;\n if (!slice)\n return false;\n let singleNode = sliceSingleNode(slice);\n let tr = singleNode\n ? view.state.tr.replaceSelectionWith(singleNode, view.input.shiftKey)\n : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true;\n}\neditHandlers.paste = (view, _event) => {\n let event = _event;\n // Handling paste from JavaScript during composition is very poorly\n // handled by browsers, so as a dodgy but preferable kludge, we just\n // let the browser do its native thing there, except on Android,\n // where the editor is almost always composing.\n if (view.composing && !android)\n return;\n let data = brokenClipboardAPI ? null : event.clipboardData;\n if (data && doPaste(view, data.getData(\"text/plain\"), data.getData(\"text/html\"), view.input.shiftKey, event))\n event.preventDefault();\n else\n capturePaste(view, event);\n};\nclass Dragging {\n constructor(slice, move) {\n this.slice = slice;\n this.move = move;\n }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nhandlers.dragstart = (view, _event) => {\n let event = _event;\n let mouseDown = view.input.mouseDown;\n if (mouseDown)\n mouseDown.done();\n if (!event.dataTransfer)\n return;\n let sel = view.state.selection;\n let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n else if (mouseDown && mouseDown.mightDrag) {\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos)));\n }\n else if (event.target && event.target.nodeType == 1) {\n let desc = view.docView.nearestDesc(event.target, true);\n if (desc && desc.node.type.spec.draggable && desc != view.docView)\n view.dispatch(view.state.tr.setSelection(NodeSelection.create(view.state.doc, desc.posBefore)));\n }\n let slice = view.state.selection.content(), { dom, text } = serializeForClipboard(view, slice);\n event.dataTransfer.clearData();\n event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n // See https://github.com/ProseMirror/prosemirror/issues/1156\n event.dataTransfer.effectAllowed = \"copyMove\";\n if (!brokenClipboardAPI)\n event.dataTransfer.setData(\"text/plain\", text);\n view.dragging = new Dragging(slice, !event[dragCopyModifier]);\n};\nhandlers.dragend = view => {\n let dragging = view.dragging;\n window.setTimeout(() => {\n if (view.dragging == dragging)\n view.dragging = null;\n }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, _event) => {\n let event = _event;\n let dragging = view.dragging;\n view.dragging = null;\n if (!event.dataTransfer)\n return;\n let eventPos = view.posAtCoords(eventCoords(event));\n if (!eventPos)\n return;\n let $mouse = view.state.doc.resolve(eventPos.pos);\n let slice = dragging && dragging.slice;\n if (slice) {\n view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n }\n else {\n slice = parseFromClipboard(view, event.dataTransfer.getData(brokenClipboardAPI ? \"Text\" : \"text/plain\"), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n }\n let move = !!(dragging && !event[dragCopyModifier]);\n if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n event.preventDefault();\n return;\n }\n if (!slice)\n return;\n event.preventDefault();\n let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null)\n insertPos = $mouse.pos;\n let tr = view.state.tr;\n if (move)\n tr.deleteSelection();\n let pos = tr.mapping.map(insertPos);\n let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n let beforeInsert = tr.doc;\n if (isNode)\n tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n else\n tr.replaceRange(pos, pos, slice);\n if (tr.doc.eq(beforeInsert))\n return;\n let $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n }\n else {\n let end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\nhandlers.focus = view => {\n view.input.lastFocus = Date.now();\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(() => {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n selectionToDOM(view);\n }, 20);\n }\n};\nhandlers.blur = (view, _event) => {\n let event = _event;\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n view.domObserver.currentSelection.clear();\n view.focused = false;\n }\n};\nhandlers.beforeinput = (view, _event) => {\n let event = _event;\n // We should probably do more with beforeinput events, but support\n // is so spotty that I'm still waiting to see where they are going.\n // Very specific hack to deal with backspace sometimes failing on\n // Chrome Android when after an uneditable node.\n if (chrome && android && event.inputType == \"deleteContentBackward\") {\n view.domObserver.flushSoon();\n let { domChangeCount } = view.input;\n setTimeout(() => {\n if (view.input.domChangeCount != domChangeCount)\n return; // Event already had some effect\n // This bug tends to close the virtual keyboard, so we refocus\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n return;\n let { $cursor } = view.state.selection;\n // Crude approximation of backspace behavior when no command handled it\n if ($cursor && $cursor.pos > 0)\n view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n }, 50);\n }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n if (a == b)\n return true;\n for (let p in a)\n if (a[p] !== b[p])\n return false;\n for (let p in b)\n if (!(p in a))\n return false;\n return true;\n}\nclass WidgetType {\n constructor(toDOM, spec) {\n this.toDOM = toDOM;\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n }\n map(mapping, span, offset, oldOffset) {\n let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n }\n valid() { return true; }\n eq(other) {\n return this == other ||\n (other instanceof WidgetType &&\n (this.spec.key && this.spec.key == other.spec.key ||\n this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n }\n destroy(node) {\n if (this.spec.destroy)\n this.spec.destroy(node);\n }\n}\nclass InlineType {\n constructor(attrs, spec) {\n this.attrs = attrs;\n this.spec = spec || noSpec;\n }\n map(mapping, span, offset, oldOffset) {\n let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this);\n }\n valid(_, span) { return span.from < span.to; }\n eq(other) {\n return this == other ||\n (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec));\n }\n static is(span) { return span.type instanceof InlineType; }\n destroy() { }\n}\nclass NodeType {\n constructor(attrs, spec) {\n this.attrs = attrs;\n this.spec = spec || noSpec;\n }\n map(mapping, span, offset, oldOffset) {\n let from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted)\n return null;\n let to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos)\n return null;\n return new Decoration(from.pos - offset, to.pos - offset, this);\n }\n valid(node, span) {\n let { index, offset } = node.content.findIndex(span.from), child;\n return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n }\n eq(other) {\n return this == other ||\n (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec));\n }\n destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n /**\n @internal\n */\n constructor(\n /**\n The start position of the decoration.\n */\n from, \n /**\n The end position. Will be the same as `from` for [widget\n decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n */\n to, \n /**\n @internal\n */\n type) {\n this.from = from;\n this.to = to;\n this.type = type;\n }\n /**\n @internal\n */\n copy(from, to) {\n return new Decoration(from, to, this.type);\n }\n /**\n @internal\n */\n eq(other, offset = 0) {\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n }\n /**\n @internal\n */\n map(mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset);\n }\n /**\n Creates a widget decoration, which is a DOM node that's shown in\n the document at the given position. It is recommended that you\n delay rendering the widget by passing a function that will be\n called when the widget is actually drawn in a view, but you can\n also directly pass a DOM node. `getPos` can be used to find the\n widget's current document position.\n */\n static widget(pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n }\n /**\n Creates an inline decoration, which adds the given attributes to\n each inline node between `from` and `to`.\n */\n static inline(from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec));\n }\n /**\n Creates a node decoration. `from` and `to` should point precisely\n before and after a node in the document. That node, and only that\n node, will receive the given attributes.\n */\n static node(from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec));\n }\n /**\n The spec provided when creating this decoration. Can be useful\n if you've stored extra information in that object.\n */\n get spec() { return this.type.spec; }\n /**\n @internal\n */\n get inline() { return this.type instanceof InlineType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n /**\n @internal\n */\n constructor(local, children) {\n this.local = local.length ? local : none;\n this.children = children.length ? children : none;\n }\n /**\n Create a set of decorations, using the structure of the given\n document.\n */\n static create(doc, decorations) {\n return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n }\n /**\n Find all decorations in this set which touch the given range\n (including decorations that start or end directly at the\n boundaries) and match the given predicate on their spec. When\n `start` and `end` are omitted, all decorations in the set are\n considered. When `predicate` isn't given, all decorations are\n assumed to match.\n */\n find(start, end, predicate) {\n let result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result;\n }\n findInner(start, end, result, offset, predicate) {\n for (let i = 0; i < this.local.length; i++) {\n let span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n result.push(span.copy(span.from + offset, span.to + offset));\n }\n for (let i = 0; i < this.children.length; i += 3) {\n if (this.children[i] < end && this.children[i + 1] > start) {\n let childOff = this.children[i] + 1;\n this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n }\n /**\n Map the set of decorations in response to a change in the\n document.\n */\n map(mapping, doc, options) {\n if (this == empty || mapping.maps.length == 0)\n return this;\n return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n }\n /**\n @internal\n */\n mapInner(mapping, node, offset, oldOffset, options) {\n let newLocal;\n for (let i = 0; i < this.local.length; i++) {\n let mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped))\n (newLocal || (newLocal = [])).push(mapped);\n else if (options.onRemove)\n options.onRemove(this.local[i].spec);\n }\n if (this.children.length)\n return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n else\n return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n }\n /**\n Add the given array of decorations to the ones in the set,\n producing a new set. Needs access to the current document to\n create the appropriate tree structure.\n */\n add(doc, decorations) {\n if (!decorations.length)\n return this;\n if (this == empty)\n return DecorationSet.create(doc, decorations);\n return this.addInner(doc, decorations, 0);\n }\n addInner(doc, decorations, offset) {\n let children, childIndex = 0;\n doc.forEach((childNode, childOffset) => {\n let baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n return;\n if (!children)\n children = this.children.slice();\n while (childIndex < children.length && children[childIndex] < childOffset)\n childIndex += 3;\n if (children[childIndex] == childOffset)\n children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n else\n children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n childIndex += 3;\n });\n let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (let i = 0; i < local.length; i++)\n if (!local[i].type.valid(doc, local[i]))\n local.splice(i--, 1);\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n }\n /**\n Create a new set that contains the decorations in this set, minus\n the ones in the given array.\n */\n remove(decorations) {\n if (decorations.length == 0 || this == empty)\n return this;\n return this.removeInner(decorations, 0);\n }\n removeInner(decorations, offset) {\n let children = this.children, local = this.local;\n for (let i = 0; i < children.length; i += 3) {\n let found;\n let from = children[i] + offset, to = children[i + 1] + offset;\n for (let j = 0, span; j < decorations.length; j++)\n if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null;\n (found || (found = [])).push(span);\n }\n }\n if (!found)\n continue;\n if (children == this.children)\n children = this.children.slice();\n let removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n }\n else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length)\n for (let i = 0, span; i < decorations.length; i++)\n if (span = decorations[i]) {\n for (let j = 0; j < local.length; j++)\n if (local[j].eq(span, offset)) {\n if (local == this.local)\n local = this.local.slice();\n local.splice(j--, 1);\n }\n }\n if (children == this.children && local == this.local)\n return this;\n return local.length || children.length ? new DecorationSet(local, children) : empty;\n }\n /**\n @internal\n */\n forChild(offset, node) {\n if (this == empty)\n return this;\n if (node.isLeaf)\n return DecorationSet.empty;\n let child, local;\n for (let i = 0; i < this.children.length; i += 3)\n if (this.children[i] >= offset) {\n if (this.children[i] == offset)\n child = this.children[i + 2];\n break;\n }\n let start = offset + 1, end = start + node.content.size;\n for (let i = 0; i < this.local.length; i++) {\n let dec = this.local[i];\n if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to)\n (local || (local = [])).push(dec.copy(from, to));\n }\n }\n if (local) {\n let localSet = new DecorationSet(local.sort(byPos), none);\n return child ? new DecorationGroup([localSet, child]) : localSet;\n }\n return child || empty;\n }\n /**\n @internal\n */\n eq(other) {\n if (this == other)\n return true;\n if (!(other instanceof DecorationSet) ||\n this.local.length != other.local.length ||\n this.children.length != other.children.length)\n return false;\n for (let i = 0; i < this.local.length; i++)\n if (!this.local[i].eq(other.local[i]))\n return false;\n for (let i = 0; i < this.children.length; i += 3)\n if (this.children[i] != other.children[i] ||\n this.children[i + 1] != other.children[i + 1] ||\n !this.children[i + 2].eq(other.children[i + 2]))\n return false;\n return true;\n }\n /**\n @internal\n */\n locals(node) {\n return removeOverlap(this.localsInner(node));\n }\n /**\n @internal\n */\n localsInner(node) {\n if (this == empty)\n return none;\n if (node.inlineContent || !this.local.some(InlineType.is))\n return this.local;\n let result = [];\n for (let i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n result.push(this.local[i]);\n }\n return result;\n }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n constructor(members) {\n this.members = members;\n }\n map(mapping, doc) {\n const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n return DecorationGroup.from(mappedDecos);\n }\n forChild(offset, child) {\n if (child.isLeaf)\n return DecorationSet.empty;\n let found = [];\n for (let i = 0; i < this.members.length; i++) {\n let result = this.members[i].forChild(offset, child);\n if (result == empty)\n continue;\n if (result instanceof DecorationGroup)\n found = found.concat(result.members);\n else\n found.push(result);\n }\n return DecorationGroup.from(found);\n }\n eq(other) {\n if (!(other instanceof DecorationGroup) ||\n other.members.length != this.members.length)\n return false;\n for (let i = 0; i < this.members.length; i++)\n if (!this.members[i].eq(other.members[i]))\n return false;\n return true;\n }\n locals(node) {\n let result, sorted = true;\n for (let i = 0; i < this.members.length; i++) {\n let locals = this.members[i].localsInner(node);\n if (!locals.length)\n continue;\n if (!result) {\n result = locals;\n }\n else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (let j = 0; j < locals.length; j++)\n result.push(locals[j]);\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n }\n // Create a group for the given array of decoration sets, or return\n // a single set when possible.\n static from(members) {\n switch (members.length) {\n case 0: return empty;\n case 1: return members[0];\n default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n }\n }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n let children = oldChildren.slice();\n // Mark the children that are directly touched by changes, and\n // move those that are after the changes.\n for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n let moved = 0;\n mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n for (let i = 0; i < children.length; i += 3) {\n let end = children[i + 1];\n if (end < 0 || oldStart > end + baseOffset - moved)\n continue;\n let start = children[i] + baseOffset - moved;\n if (oldEnd >= start) {\n children[i + 1] = oldStart <= start ? -2 : -1;\n }\n else if (newStart >= offset && dSize) {\n children[i] += dSize;\n children[i + 1] += dSize;\n }\n }\n moved += dSize;\n });\n baseOffset = mapping.maps[i].map(baseOffset, -1);\n }\n // Find the child nodes that still correspond to a single node,\n // recursively call mapInner on them and update their positions.\n let mustRebuild = false;\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] < 0) { // Touched nodes\n if (children[i + 1] == -2) {\n mustRebuild = true;\n children[i + 1] = -1;\n continue;\n }\n let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue;\n }\n // Must read oldChildren because children was tagged with -1\n let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n let childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n let mapped = children[i + 2]\n .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i] = fromLocal;\n children[i + 1] = toLocal;\n children[i + 2] = mapped;\n }\n else {\n children[i + 1] = -2;\n mustRebuild = true;\n }\n }\n else {\n mustRebuild = true;\n }\n }\n // Remaining children must be collected and rebuilt into the appropriate structure\n if (mustRebuild) {\n let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n let built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] < 0) {\n children.splice(i, 3);\n i -= 3;\n }\n for (let i = 0, j = 0; i < built.children.length; i += 3) {\n let from = built.children[i];\n while (j < children.length && children[j] < from)\n j += 3;\n children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n }\n }\n return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length)\n return spans;\n let result = [];\n for (let i = 0; i < spans.length; i++) {\n let span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n // Gather all decorations from the remaining marked children\n function gather(set, oldOffset) {\n for (let i = 0; i < set.local.length; i++) {\n let mapped = set.local[i].map(mapping, offset, oldOffset);\n if (mapped)\n decorations.push(mapped);\n else if (options.onRemove)\n options.onRemove(set.local[i].spec);\n }\n for (let i = 0; i < set.children.length; i += 3)\n gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n }\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] == -1)\n gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf)\n return null;\n let end = offset + node.nodeSize, found = null;\n for (let i = 0, span; i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n (found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found;\n}\nfunction withoutNulls(array) {\n let result = [];\n for (let i = 0; i < array.length; i++)\n if (array[i] != null)\n result.push(array[i]);\n return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n let children = [], hasNulls = false;\n node.forEach((childNode, localStart) => {\n let found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n children.push(localStart, localStart + childNode.nodeSize, subtree);\n }\n });\n let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (let i = 0; i < locals.length; i++)\n if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove)\n options.onRemove(locals[i].spec);\n locals.splice(i--, 1);\n }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n let working = spans;\n for (let i = 0; i < working.length - 1; i++) {\n let span = working[i];\n if (span.from != span.to)\n for (let j = i + 1; j < working.length; j++) {\n let next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans)\n working = spans.slice();\n // Followed by a partially overlapping larger span. Split that\n // span.\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue;\n }\n else {\n if (next.from < span.to) {\n if (working == spans)\n working = spans.slice();\n // The end of this one overlaps with a subsequent span. Split\n // this one.\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break;\n }\n }\n }\n return working;\n}\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0)\n i++;\n array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n let found = [];\n view.someProp(\"decorations\", f => {\n let result = f(view.state);\n if (result && result != empty)\n found.push(result);\n });\n if (view.cursorWrapper)\n found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n constructor() {\n this.anchorNode = null;\n this.anchorOffset = 0;\n this.focusNode = null;\n this.focusOffset = 0;\n }\n set(sel) {\n this.anchorNode = sel.anchorNode;\n this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode;\n this.focusOffset = sel.focusOffset;\n }\n clear() {\n this.anchorNode = this.focusNode = null;\n }\n eq(sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n }\n}\nclass DOMObserver {\n constructor(view, handleDOMChange) {\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = null;\n this.currentSelection = new SelectionState;\n this.onCharData = null;\n this.suppressingSelectionUpdates = false;\n this.observer = window.MutationObserver &&\n new window.MutationObserver(mutations => {\n for (let i = 0; i < mutations.length; i++)\n this.queue.push(mutations[i]);\n // IE11 will sometimes (on backspacing out a single character\n // text node after a BR node) call the observer callback\n // before actually updating the DOM, which will cause\n // ProseMirror to miss the change (see #930)\n if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n this.flushSoon();\n else\n this.flush();\n });\n if (useCharData) {\n this.onCharData = e => {\n this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n this.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n }\n flushSoon() {\n if (this.flushingSoon < 0)\n this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n }\n forceFlush() {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n }\n start() {\n if (this.observer) {\n this.observer.takeRecords();\n this.observer.observe(this.view.dom, observeOptions);\n }\n if (this.onCharData)\n this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.connectSelection();\n }\n stop() {\n if (this.observer) {\n let take = this.observer.takeRecords();\n if (take.length) {\n for (let i = 0; i < take.length; i++)\n this.queue.push(take[i]);\n window.setTimeout(() => this.flush(), 20);\n }\n this.observer.disconnect();\n }\n if (this.onCharData)\n this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.disconnectSelection();\n }\n connectSelection() {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n }\n disconnectSelection() {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n }\n suppressSelectionUpdates() {\n this.suppressingSelectionUpdates = true;\n setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n }\n onSelectionChange() {\n if (!hasFocusAndSelection(this.view))\n return;\n if (this.suppressingSelectionUpdates)\n return selectionToDOM(this.view);\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n let sel = this.view.domSelectionRange();\n // Selection.isCollapsed isn't reliable on IE\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n return this.flushSoon();\n }\n this.flush();\n }\n setCurSelection() {\n this.currentSelection.set(this.view.domSelectionRange());\n }\n ignoreSelectionChange(sel) {\n if (!sel.focusNode)\n return true;\n let ancestors = new Set, container;\n for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n ancestors.add(scan);\n for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n if (ancestors.has(scan)) {\n container = scan;\n break;\n }\n let desc = container && this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({\n type: \"selection\",\n target: container.nodeType == 3 ? container.parentNode : container\n })) {\n this.setCurSelection();\n return true;\n }\n }\n flush() {\n let { view } = this;\n if (!view.docView || this.flushingSoon > -1)\n return;\n let mutations = this.observer ? this.observer.takeRecords() : [];\n if (this.queue.length) {\n mutations = this.queue.concat(mutations);\n this.queue.length = 0;\n }\n let sel = view.domSelectionRange();\n let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n let from = -1, to = -1, typeOver = false, added = [];\n if (view.editable) {\n for (let i = 0; i < mutations.length; i++) {\n let result = this.registerMutation(mutations[i], added);\n if (result) {\n from = from < 0 ? result.from : Math.min(result.from, from);\n to = to < 0 ? result.to : Math.max(result.to, to);\n if (result.typeOver)\n typeOver = true;\n }\n }\n }\n if (gecko && added.length > 1) {\n let brs = added.filter(n => n.nodeName == \"BR\");\n if (brs.length == 2) {\n let a = brs[0], b = brs[1];\n if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n b.remove();\n else\n a.remove();\n }\n }\n let readSel = null;\n // If it looks like the browser has reset the selection to the\n // start of the document after focus, restore the selection from\n // the state\n if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n view.input.lastFocus = 0;\n selectionToDOM(view);\n this.currentSelection.set(sel);\n view.scrollToSelection();\n }\n else if (from > -1 || newSel) {\n if (from > -1) {\n view.docView.markDirty(from, to);\n checkCSS(view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (view.docView && view.docView.dirty)\n view.updateState(view.state);\n else if (!this.currentSelection.eq(sel))\n selectionToDOM(view);\n this.currentSelection.set(sel);\n }\n }\n registerMutation(mut, added) {\n // Ignore mutations inside nodes that were already noted as inserted\n if (added.indexOf(mut.target) > -1)\n return null;\n let desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" &&\n (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n // Firefox sometimes fires spurious events for null/empty styles\n (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n return null;\n if (!desc || desc.ignoreMutation(mut))\n return null;\n if (mut.type == \"childList\") {\n for (let i = 0; i < mut.addedNodes.length; i++)\n added.push(mut.addedNodes[i]);\n if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n return { from: desc.posBefore, to: desc.posAfter };\n let prev = mut.previousSibling, next = mut.nextSibling;\n if (ie && ie_version <= 11 && mut.addedNodes.length) {\n // IE11 gives us incorrect next/prev siblings for some\n // insertions, so if there are added nodes, recompute those\n for (let i = 0; i < mut.addedNodes.length; i++) {\n let { previousSibling, nextSibling } = mut.addedNodes[i];\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n prev = previousSibling;\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n next = nextSibling;\n }\n }\n let fromOffset = prev && prev.parentNode == mut.target\n ? domIndex(prev) + 1 : 0;\n let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n let toOffset = next && next.parentNode == mut.target\n ? domIndex(next) : mut.target.childNodes.length;\n let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return { from, to };\n }\n else if (mut.type == \"attributes\") {\n return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n }\n else { // \"characterData\"\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n };\n }\n }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n if (cssChecked.has(view))\n return;\n cssChecked.set(view, null);\n if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n view.requiresGeckoHackNode = gecko;\n if (cssCheckWarned)\n return;\n console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n cssCheckWarned = true;\n }\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view) {\n let found;\n function read(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n found = event.getTargetRanges()[0];\n }\n // Because Safari (at least in 2018-2022) doesn't provide regular\n // access to the selection inside a shadowRoot, we have to perform a\n // ridiculous hack to get at it—using `execCommand` to trigger a\n // `beforeInput` event so that we can read the target range from the\n // event.\n view.dom.addEventListener(\"beforeinput\", read, true);\n document.execCommand(\"indent\");\n view.dom.removeEventListener(\"beforeinput\", read, true);\n let anchorNode = found.startContainer, anchorOffset = found.startOffset;\n let focusNode = found.endContainer, focusOffset = found.endOffset;\n let currentAnchor = view.domAtPos(view.state.selection.anchor);\n // Since such a range doesn't distinguish between anchor and head,\n // use a heuristic that flips it around if its end matches the\n // current anchor.\n if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_) {\n let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n let domSel = view.domSelectionRange();\n let find;\n let anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{ node: anchor, offset: domSel.anchorOffset }];\n if (!selectionCollapsed(domSel))\n find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n }\n // Work around issue in Chrome where backspacing sometimes replaces\n // the deleted content with a random BR node (issues #799, #831)\n if (chrome && view.input.lastKeyCode === 8) {\n for (let off = toOffset; off > fromOffset; off--) {\n let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeName == \"BR\" && !desc) {\n toOffset = off;\n break;\n }\n if (!desc || desc.size)\n break;\n }\n }\n let startDoc = view.state.doc;\n let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n let $from = startDoc.resolve(from);\n let sel = null, doc = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n findPositions: find,\n ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n let anchor = find[0].pos, head = find[1] && find[1].pos;\n if (head == null)\n head = anchor;\n sel = { anchor: anchor + from, head: head + from };\n }\n return { doc, sel, from, to };\n}\nfunction ruleFromNode(dom) {\n let desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule();\n }\n else if (dom.nodeName == \"BR\" && dom.parentNode) {\n // Safari replaces the list item or table cell with a BR\n // directly in the list node (?!) if you delete the last\n // character in a list item or table cell (#708, #862)\n if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n let skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return { skip };\n }\n else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return { ignore: true };\n }\n }\n else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return { ignore: true };\n }\n return null;\n}\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n if (from < 0) {\n let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n let newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n if (chrome && android &&\n view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n return;\n let tr = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\")\n tr.setMeta(\"pointer\", true);\n else if (origin == \"key\")\n tr.scrollIntoView();\n view.dispatch(tr);\n }\n return;\n }\n let $before = view.state.doc.resolve(from);\n let shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n let sel = view.state.selection;\n let parse = parseBetween(view, from, to);\n let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n let preferredPos, preferredSide;\n // Prefer anchoring to end when Backspace is pressed\n if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n }\n else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.input.lastKeyCode = null;\n let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\" || n.nodeName == \"LI\") &&\n (!change || change.endA >= change.endB) &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n view.input.lastIOSEnter = 0;\n return;\n }\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = { start: sel.from, endA: sel.to, endB: sel.to };\n }\n else {\n if (parse.sel) {\n let sel = resolveSelection(view, view.state.doc, parse.sel);\n if (sel && !sel.eq(view.state.selection))\n view.dispatch(view.state.tr.setSelection(sel));\n }\n return;\n }\n }\n // Chrome sometimes leaves the cursor before the inserted text when\n // composing after a cursor wrapper. This moves it forward.\n if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from &&\n parse.sel.head == parse.sel.anchor) {\n let size = change.endB - change.start;\n parse.sel = { anchor: parse.sel.anchor + size, head: parse.sel.anchor + size };\n }\n view.input.domChangeCount++;\n // Handle the case where overwriting a selection by typing matches\n // the start or end of the selected content, creating a change\n // that's smaller than what was actually overwritten.\n if (view.state.selection.from < view.state.selection.to &&\n change.start == change.endB &&\n view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n view.state.selection.from >= parse.from) {\n change.start = view.state.selection.from;\n }\n else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n view.state.selection.to <= parse.to) {\n change.endB += (view.state.selection.to - change.endA);\n change.endA = view.state.selection.to;\n }\n }\n // IE11 will insert a non-breaking space _ahead_ of the space after\n // the cursor space when adding a space before another space. When\n // that happened, adjust the change to cover the space instead.\n if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n change.endA == change.start && change.start > parse.from &&\n parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n let $from = parse.doc.resolveNoCache(change.start - parse.from);\n let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n let $fromA = doc.resolve(change.start);\n let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n let nextSel;\n // If this looks like the effect of pressing Enter (or was recorded\n // as being an iOS enter press), just dispatch an Enter key instead.\n if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n (!inlineChange && $from.pos < parse.doc.content.size &&\n (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n nextSel.head == $to.pos)) &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n view.input.lastIOSEnter = 0;\n return;\n }\n // Same for backspace\n if (view.state.selection.anchor > change.start &&\n looksLikeJoin(doc, change.start, change.endA, $from, $to) &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n if (android && chrome)\n view.domObserver.suppressSelectionUpdates(); // #820\n return;\n }\n // Chrome Android will occasionally, during composition, delete the\n // entire composition and then immediately insert it again. This is\n // used to detect that situation.\n if (chrome && android && change.endB == change.start)\n view.input.lastAndroidDelete = Date.now();\n // This tries to detect Android virtual keyboard\n // enter-and-pick-suggestion action. That sometimes (see issue\n // #1059) first fires a DOM mutation, before moving the selection to\n // the newly created block. And then, because ProseMirror cleans up\n // the DOM selection, it gives up moving the selection entirely,\n // leaving the cursor in the wrong place. When that happens, we drop\n // the new paragraph from the initial change, and fire a simulated\n // enter key afterwards.\n if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(() => {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n }, 20);\n }\n let chFrom = change.start, chTo = change.endA;\n let tr, storedMarks, markChange;\n if (inlineChange) {\n if ($from.pos == $to.pos) { // Deletion\n // IE11 sometimes weirdly moves the DOM selection around after\n // backspacing out the first element in a textblock\n if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(() => selectionToDOM(view), 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n }\n else if ( // Adding or removing a mark\n change.endA == change.endB &&\n (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n tr = view.state.tr;\n if (markChange.type == \"add\")\n tr.addMark(chFrom, chTo, markChange.mark);\n else\n tr.removeMark(chFrom, chTo, markChange.mark);\n }\n else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n // Both positions in the same text node -- simply insert text\n let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text)))\n return;\n tr = view.state.tr.insertText(text, chFrom, chTo);\n }\n }\n if (!tr)\n tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n if (parse.sel) {\n let sel = resolveSelection(view, tr.doc, parse.sel);\n // Chrome Android will sometimes, during composition, report the\n // selection in the wrong place. If it looks like that is\n // happening, don't update the selection.\n // Edge just doesn't move the cursor forward when you start typing\n // in an empty block or between br nodes.\n if (sel && !(chrome && android && view.composing && sel.empty &&\n (change.start != change.endB || view.input.lastAndroidDelete < Date.now() - 100) &&\n (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n ie && sel.empty && sel.head == chFrom))\n tr.setSelection(sel);\n }\n if (storedMarks)\n tr.ensureMarks(storedMarks);\n view.dispatch(tr.scrollIntoView());\n}\nfunction resolveSelection(view, doc, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n return null;\n return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n let added = curMarks, removed = prevMarks, type, mark, update;\n for (let i = 0; i < prevMarks.length; i++)\n added = prevMarks[i].removeFromSet(added);\n for (let i = 0; i < curMarks.length; i++)\n removed = curMarks[i].removeFromSet(removed);\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = (node) => node.mark(mark.addToSet(node.marks));\n }\n else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = (node) => node.mark(mark.removeFromSet(node.marks));\n }\n else {\n return null;\n }\n let updated = [];\n for (let i = 0; i < prev.childCount; i++)\n updated.push(update(prev.child(i)));\n if (Fragment.from(updated).eq(cur))\n return { mark, type };\n}\nfunction looksLikeJoin(old, start, end, $newStart, $newEnd) {\n if (!$newStart.parent.isTextblock ||\n // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos ||\n // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n return false;\n let $start = old.resolve(start);\n // Start must be at the end of a block\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n return false;\n let $next = old.resolve(skipClosingAndOpening($start, true, true));\n // The next textblock must start before end and end near it\n if (!$next.parent.isTextblock || $next.pos > end ||\n skipClosingAndOpening($next, true, false) < end)\n return false;\n // The fragments after the join point must match\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n let start = a.findDiffStart(b, pos);\n if (start == null)\n return null;\n let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);\n if (preferredSide == \"end\") {\n let adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n endB = start + (endB - endA);\n endA = start;\n }\n else if (endB < start) {\n let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move;\n endA = start + (endA - endB);\n endB = start;\n }\n return { start, endA, endB };\n}\n\n/**\n@internal\n*/\nconst __serializeForClipboard = serializeForClipboard;\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n /**\n Create a view. `place` may be a DOM node that the editor should\n be appended to, a function that will place it into the document,\n or an object whose `mount` property holds the node to use as the\n document container. If it is `null`, the editor will not be\n added to the document.\n */\n constructor(place, props) {\n this._root = null;\n /**\n @internal\n */\n this.focused = false;\n /**\n Kludge used to work around a Chrome bug @internal\n */\n this.trackWrites = null;\n this.mounted = false;\n /**\n @internal\n */\n this.markCursor = null;\n /**\n @internal\n */\n this.cursorWrapper = null;\n /**\n @internal\n */\n this.lastSelectedViewDesc = undefined;\n /**\n @internal\n */\n this.input = new InputState;\n this.prevDirectPlugins = [];\n this.pluginViews = [];\n /**\n Holds `true` when a hack node is needed in Firefox to prevent the\n [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)\n @internal\n */\n this.requiresGeckoHackNode = false;\n /**\n When editor content is being dragged, this object contains\n information about the dragged slice and whether it is being\n copied or moved. At any other time, it is null.\n */\n this.dragging = null;\n this._props = props;\n this.state = props.state;\n this.directPlugins = props.plugins || [];\n this.directPlugins.forEach(checkStateComponent);\n this.dispatch = this.dispatch.bind(this);\n this.dom = (place && place.mount) || document.createElement(\"div\");\n if (place) {\n if (place.appendChild)\n place.appendChild(this.dom);\n else if (typeof place == \"function\")\n place(this.dom);\n else if (place.mount)\n this.mounted = true;\n }\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n this.domObserver.start();\n initInput(this);\n this.updatePluginViews();\n }\n /**\n Holds `true` when a\n [composition](https://w3c.github.io/uievents/#events-compositionevents)\n is active.\n */\n get composing() { return this.input.composing; }\n /**\n The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n */\n get props() {\n if (this._props.state != this.state) {\n let prev = this._props;\n this._props = {};\n for (let name in prev)\n this._props[name] = prev[name];\n this._props.state = this.state;\n }\n return this._props;\n }\n /**\n Update the view's props. Will immediately cause an update to\n the DOM.\n */\n update(props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents)\n ensureListeners(this);\n let prevProps = this._props;\n this._props = props;\n if (props.plugins) {\n props.plugins.forEach(checkStateComponent);\n this.directPlugins = props.plugins;\n }\n this.updateStateInner(props.state, prevProps);\n }\n /**\n Update the view by updating existing props object with the object\n given as argument. Equivalent to `view.update(Object.assign({},\n view.props, props))`.\n */\n setProps(props) {\n let updated = {};\n for (let name in this._props)\n updated[name] = this._props[name];\n updated.state = this.state;\n for (let name in props)\n updated[name] = props[name];\n this.update(updated);\n }\n /**\n Update the editor's `state` prop, without touching any of the\n other props.\n */\n updateState(state) {\n this.updateStateInner(state, this._props);\n }\n updateStateInner(state, prevProps) {\n let prev = this.state, redraw = false, updateSel = false;\n // When stored marks are added, stop composition, so that they can\n // be displayed.\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n let nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n }\n if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n ensureListeners(this);\n }\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection))\n updateSel = true;\n let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n if (updateSel) {\n this.domObserver.stop();\n // Work around an issue in Chrome, IE, and Edge where changing\n // the DOM around an active selection puts it into a broken\n // state where the thing the user sees differs from the\n // selection reported by the Selection object (#710, #973,\n // #1011, #1013, #1035).\n let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n // If the node that the selection points into is written to,\n // Chrome sometimes starts misreporting the selection, so this\n // tracks that and forces a selection reset when our update\n // did write to the node.\n let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco([]);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites)\n forceSelUpdate = true;\n }\n // Work around for an issue where an update arriving right between\n // a DOM selection change and the \"selectionchange\" event for it\n // can cause a spurious DOM selection update, disrupting mouse\n // drag selection.\n if (forceSelUpdate ||\n !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n }\n else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n this.updatePluginViews(prev);\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n }\n else if (scroll == \"to selection\") {\n this.scrollToSelection();\n }\n else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n }\n /**\n @internal\n */\n scrollToSelection() {\n let startDOM = this.domSelectionRange().focusNode;\n if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n else if (this.state.selection instanceof NodeSelection) {\n let target = this.docView.domAfterPos(this.state.selection.from);\n if (target.nodeType == 1)\n scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n }\n else {\n scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n }\n }\n destroyPluginViews() {\n let view;\n while (view = this.pluginViews.pop())\n if (view.destroy)\n view.destroy();\n }\n updatePluginViews(prevState) {\n if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n this.prevDirectPlugins = this.directPlugins;\n this.destroyPluginViews();\n for (let i = 0; i < this.directPlugins.length; i++) {\n let plugin = this.directPlugins[i];\n if (plugin.spec.view)\n this.pluginViews.push(plugin.spec.view(this));\n }\n for (let i = 0; i < this.state.plugins.length; i++) {\n let plugin = this.state.plugins[i];\n if (plugin.spec.view)\n this.pluginViews.push(plugin.spec.view(this));\n }\n }\n else {\n for (let i = 0; i < this.pluginViews.length; i++) {\n let pluginView = this.pluginViews[i];\n if (pluginView.update)\n pluginView.update(this, prevState);\n }\n }\n }\n someProp(propName, f) {\n let prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n for (let i = 0; i < this.directPlugins.length; i++) {\n let prop = this.directPlugins[i].props[propName];\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n }\n let plugins = this.state.plugins;\n if (plugins)\n for (let i = 0; i < plugins.length; i++) {\n let prop = plugins[i].props[propName];\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n }\n }\n /**\n Query whether the view has focus.\n */\n hasFocus() {\n // Work around IE not handling focus correctly if resize handles are shown.\n // If the cursor is inside an element with resize handles, activeElement\n // will be that element instead of this.dom.\n if (ie) {\n // If activeElement is within this.dom, and there are no other elements\n // setting `contenteditable` to false in between, treat it as focused.\n let node = this.root.activeElement;\n if (node == this.dom)\n return true;\n if (!node || !this.dom.contains(node))\n return false;\n while (node && this.dom != node && this.dom.contains(node)) {\n if (node.contentEditable == 'false')\n return false;\n node = node.parentElement;\n }\n return true;\n }\n return this.root.activeElement == this.dom;\n }\n /**\n Focus the editor.\n */\n focus() {\n this.domObserver.stop();\n if (this.editable)\n focusPreventScroll(this.dom);\n selectionToDOM(this);\n this.domObserver.start();\n }\n /**\n Get the document root in which the editor exists. This will\n usually be the top-level `document`, but might be a [shadow\n DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n root if the editor is inside one.\n */\n get root() {\n let cached = this._root;\n if (cached == null)\n for (let search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n if (!search.getSelection)\n Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n return this._root = search;\n }\n }\n return cached || document;\n }\n /**\n Given a pair of viewport coordinates, return the document\n position that corresponds to them. May return null if the given\n coordinates aren't inside of the editor. When an object is\n returned, its `pos` property is the position nearest to the\n coordinates, and its `inside` property holds the position of the\n inner node that the position falls inside of, or -1 if it is at\n the top level, not in any node.\n */\n posAtCoords(coords) {\n return posAtCoords(this, coords);\n }\n /**\n Returns the viewport rectangle at a given document position.\n `left` and `right` will be the same number, as this returns a\n flat cursor-ish rectangle. If the position is between two things\n that aren't directly adjacent, `side` determines which element\n is used. When < 0, the element before the position is used,\n otherwise the element after.\n */\n coordsAtPos(pos, side = 1) {\n return coordsAtPos(this, pos, side);\n }\n /**\n Find the DOM position that corresponds to the given document\n position. When `side` is negative, find the position as close as\n possible to the content before the position. When positive,\n prefer positions close to the content after the position. When\n zero, prefer as shallow a position as possible.\n \n Note that you should **not** mutate the editor's internal DOM,\n only inspect it (and even that is usually not necessary).\n */\n domAtPos(pos, side = 0) {\n return this.docView.domFromPos(pos, side);\n }\n /**\n Find the DOM node that represents the document node after the\n given position. May return `null` when the position doesn't point\n in front of a node or if the node is inside an opaque node view.\n \n This is intended to be able to call things like\n `getBoundingClientRect` on that DOM node. Do **not** mutate the\n editor DOM directly, or add styling this way, since that will be\n immediately overriden by the editor as it redraws the node.\n */\n nodeDOM(pos) {\n let desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null;\n }\n /**\n Find the document position that corresponds to a given DOM\n position. (Whenever possible, it is preferable to inspect the\n document structure directly, rather than poking around in the\n DOM, but sometimes—for example when interpreting an event\n target—you don't have a choice.)\n \n The `bias` parameter can be used to influence which side of a DOM\n node to use when the position is inside a leaf node.\n */\n posAtDOM(node, offset, bias = -1) {\n let pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null)\n throw new RangeError(\"DOM position not inside the editor\");\n return pos;\n }\n /**\n Find out whether the selection is at the end of a textblock when\n moving in a given direction. When, for example, given `\"left\"`,\n it will return true if moving left from the current cursor\n position would leave that position's parent textblock. Will apply\n to the view's current state by default, but it is possible to\n pass a different state.\n */\n endOfTextblock(dir, state) {\n return endOfTextblock(this, state || this.state, dir);\n }\n /**\n Run the editor's paste logic with the given HTML string. The\n `event`, if given, will be passed to the\n [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n */\n pasteHTML(html, event) {\n return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n }\n /**\n Run the editor's paste logic with the given plain-text input.\n */\n pasteText(text, event) {\n return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n }\n /**\n Removes the editor from the DOM and destroys all [node\n views](https://prosemirror.net/docs/ref/#view.NodeView).\n */\n destroy() {\n if (!this.docView)\n return;\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n }\n else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n }\n /**\n This is true when the view has been\n [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n used anymore).\n */\n get isDestroyed() {\n return this.docView == null;\n }\n /**\n Used for testing.\n */\n dispatchEvent(event) {\n return dispatchEvent(this, event);\n }\n /**\n Dispatch a transaction. Will call\n [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction)\n when given, and otherwise defaults to applying the transaction to\n the current state and calling\n [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result.\n This method is bound to the view instance, so that it can be\n easily passed around.\n */\n dispatch(tr) {\n let dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction)\n dispatchTransaction.call(this, tr);\n else\n this.updateState(this.state.apply(tr));\n }\n /**\n @internal\n */\n domSelectionRange() {\n return safari && this.root.nodeType === 11 && deepActiveElement(this.dom.ownerDocument) == this.dom\n ? safariShadowSelectionRange(this) : this.domSelection();\n }\n /**\n @internal\n */\n domSelection() {\n return this.root.getSelection();\n }\n}\nfunction computeDocDeco(view) {\n let attrs = Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n attrs.translate = \"no\";\n view.someProp(\"attributes\", value => {\n if (typeof value == \"function\")\n value = value(view.state);\n if (value)\n for (let attr in value) {\n if (attr == \"class\")\n attrs.class += \" \" + value[attr];\n if (attr == \"style\") {\n attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n }\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n attrs[attr] = String(value[attr]);\n }\n });\n return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n let dom = document.createElement(\"img\");\n dom.className = \"ProseMirror-separator\";\n dom.setAttribute(\"mark-placeholder\", \"true\");\n dom.setAttribute(\"alt\", \"\");\n view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) };\n }\n else {\n view.cursorWrapper = null;\n }\n}\nfunction getEditable(view) {\n return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n let result = Object.create(null);\n function add(obj) {\n for (let prop in obj)\n if (!Object.prototype.hasOwnProperty.call(result, prop))\n result[prop] = obj[prop];\n }\n view.someProp(\"nodeViews\", add);\n view.someProp(\"markViews\", add);\n return result;\n}\nfunction changedNodeViews(a, b) {\n let nA = 0, nB = 0;\n for (let prop in a) {\n if (a[prop] != b[prop])\n return true;\n nA++;\n }\n for (let _ in b)\n nB++;\n return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard, __serializeForClipboard };\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false;\nfunction normalizeKeyName(name) {\n let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\")\n result = \" \";\n let alt, ctrl, shift, meta;\n for (let i = 0; i < parts.length - 1; i++) {\n let mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod))\n meta = true;\n else if (/^a(lt)?$/i.test(mod))\n alt = true;\n else if (/^(c|ctrl|control)$/i.test(mod))\n ctrl = true;\n else if (/^s(hift)?$/i.test(mod))\n shift = true;\n else if (/^mod$/i.test(mod)) {\n if (mac)\n meta = true;\n else\n ctrl = true;\n }\n else\n throw new Error(\"Unrecognized modifier name: \" + mod);\n }\n if (alt)\n result = \"Alt-\" + result;\n if (ctrl)\n result = \"Ctrl-\" + result;\n if (meta)\n result = \"Meta-\" + result;\n if (shift)\n result = \"Shift-\" + result;\n return result;\n}\nfunction normalize(map) {\n let copy = Object.create(null);\n for (let prop in map)\n copy[normalizeKeyName(prop)] = map[prop];\n return copy;\n}\nfunction modifiers(name, event, shift = true) {\n if (event.altKey)\n name = \"Alt-\" + name;\n if (event.ctrlKey)\n name = \"Ctrl-\" + name;\n if (event.metaKey)\n name = \"Meta-\" + name;\n if (shift && event.shiftKey)\n name = \"Shift-\" + name;\n return name;\n}\n/**\nCreate a keymap plugin for the given set of bindings.\n\nBindings should map key names to [command](https://prosemirror.net/docs/ref/#commands)-style\nfunctions, which will be called with `(EditorState, dispatch,\nEditorView)` arguments, and should return true when they've handled\nthe key. Note that the view argument isn't part of the command\nprotocol, but can be used as an escape hatch if a binding needs to\ndirectly interact with the UI.\n\nKey names may be strings like `\"Shift-Ctrl-Enter\"`—a key\nidentifier prefixed with zero or more modifiers. Key identifiers\nare based on the strings that can appear in\n[`KeyEvent.key`](https:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\nUse lowercase letters to refer to letter keys (or uppercase letters\nif you want shift to be held). You may use `\"Space\"` as an alias\nfor the `\" \"` name.\n\nModifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n`a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n`Meta-`) are recognized. For characters that are created by holding\nshift, the `Shift-` prefix is implied, and should not be added\nexplicitly.\n\nYou can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\nother platforms.\n\nYou can add multiple keymap plugins to an editor. The order in\nwhich they appear determines their precedence (the ones early in\nthe array get to dispatch first).\n*/\nfunction keymap(bindings) {\n return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } });\n}\n/**\nGiven a set of bindings (using the same format as\n[`keymap`](https://prosemirror.net/docs/ref/#keymap.keymap)), return a [keydown\nhandler](https://prosemirror.net/docs/ref/#view.EditorProps.handleKeyDown) that handles them.\n*/\nfunction keydownHandler(bindings) {\n let map = normalize(bindings);\n return function (view, event) {\n let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n if (direct && direct(view.state, view.dispatch, view))\n return true;\n // A character key\n if (name.length == 1 && name != \" \") {\n if (event.shiftKey) {\n // In case the name was already modified by shift, try looking\n // it up without its shift modifier\n let noShift = map[modifiers(name, event, false)];\n if (noShift && noShift(view.state, view.dispatch, view))\n return true;\n }\n if ((event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n let fromCode = map[modifiers(baseName, event)];\n if (fromCode && fromCode(view.state, view.dispatch, view))\n return true;\n }\n }\n return false;\n };\n}\n\nexport { keydownHandler, keymap };\n","import { liftTarget, replaceStep, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection } from 'prosemirror-state';\n\n/**\nDelete the selection, if there is one.\n*/\nconst deleteSelection = (state, dispatch) => {\n if (state.selection.empty)\n return false;\n if (dispatch)\n dispatch(state.tr.deleteSelection().scrollIntoView());\n return true;\n};\nfunction atBlockStart(state, view) {\n let { $cursor } = state.selection;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n : $cursor.parentOffset > 0))\n return null;\n return $cursor;\n}\n/**\nIf the selection is empty and at the start of a textblock, try to\nreduce the distance between that block and the one before it—if\nthere's a block directly before it that can be joined, join them.\nIf not, try to move the selected block closer to the next one in\nthe document structure by lifting it out of its parent or moving it\ninto a parent of the previous block. Will use the view for accurate\n(bidi-aware) start-of-textblock detection if given.\n*/\nconst joinBackward = (state, dispatch, view) => {\n let $cursor = atBlockStart(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutBefore($cursor);\n // If there is no node before this, try to lift\n if (!$cut) {\n let range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n }\n let before = $cut.nodeBefore;\n // Apply the joining algorithm\n if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n return true;\n // If the node below has no content and the node above is\n // selectable, delete the node below and select the one above.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n if (dispatch) {\n let tr = state.tr.step(delStep);\n tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n // If the node before is an atom, delete it\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch)\n dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView());\n return true;\n }\n return false;\n};\n/**\nA more limited form of [`joinBackward`]($commands.joinBackward)\nthat only tries to join the current textblock to the one before\nit, if the cursor is at the start of a textblock.\n*/\nconst joinTextblockBackward = (state, dispatch, view) => {\n let $cursor = atBlockStart(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutBefore($cursor);\n return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n/**\nA more limited form of [`joinForward`]($commands.joinForward)\nthat only tries to join the current textblock to the one after\nit, if the cursor is at the end of a textblock.\n*/\nconst joinTextblockForward = (state, dispatch, view) => {\n let $cursor = atBlockEnd(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutAfter($cursor);\n return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nfunction joinTextblocksAround(state, $cut, dispatch) {\n let before = $cut.nodeBefore, beforeText = before, beforePos = $cut.pos - 1;\n for (; !beforeText.isTextblock; beforePos--) {\n if (beforeText.type.spec.isolating)\n return false;\n let child = beforeText.lastChild;\n if (!child)\n return false;\n beforeText = child;\n }\n let after = $cut.nodeAfter, afterText = after, afterPos = $cut.pos + 1;\n for (; !afterText.isTextblock; afterPos++) {\n if (afterText.type.spec.isolating)\n return false;\n let child = afterText.firstChild;\n if (!child)\n return false;\n afterText = child;\n }\n let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty);\n if (!step || step.from != beforePos || step.slice.size >= afterPos - beforePos)\n return false;\n if (dispatch) {\n let tr = state.tr.step(step);\n tr.setSelection(TextSelection.create(tr.doc, beforePos));\n dispatch(tr.scrollIntoView());\n }\n return true;\n}\nfunction textblockAt(node, side, only = false) {\n for (let scan = node; scan; scan = (side == \"start\" ? scan.firstChild : scan.lastChild)) {\n if (scan.isTextblock)\n return true;\n if (only && scan.childCount != 1)\n return false;\n }\n return false;\n}\n/**\nWhen the selection is empty and at the start of a textblock, select\nthe node before that textblock, if possible. This is intended to be\nbound to keys like backspace, after\n[`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward) or other deleting\ncommands, as a fall-back behavior when the schema doesn't allow\ndeletion at the selected point.\n*/\nconst selectNodeBackward = (state, dispatch, view) => {\n let { $head, empty } = state.selection, $cut = $head;\n if (!empty)\n return false;\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0)\n return false;\n $cut = findCutBefore($head);\n }\n let node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node))\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView());\n return true;\n};\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating)\n for (let i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0)\n return $pos.doc.resolve($pos.before(i + 1));\n if ($pos.node(i).type.spec.isolating)\n break;\n }\n return null;\n}\nfunction atBlockEnd(state, view) {\n let { $cursor } = state.selection;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n : $cursor.parentOffset < $cursor.parent.content.size))\n return null;\n return $cursor;\n}\n/**\nIf the selection is empty and the cursor is at the end of a\ntextblock, try to reduce or remove the boundary between that block\nand the one after it, either by joining them or by moving the other\nblock closer to this one in the tree structure. Will use the view\nfor accurate start-of-textblock detection if given.\n*/\nconst joinForward = (state, dispatch, view) => {\n let $cursor = atBlockEnd(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutAfter($cursor);\n // If there is no node after this, there's nothing to do\n if (!$cut)\n return false;\n let after = $cut.nodeAfter;\n // Try the joining algorithm\n if (deleteBarrier(state, $cut, dispatch))\n return true;\n // If the node above has no content and the node below is\n // selectable, delete the node above and select the one below.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n if (dispatch) {\n let tr = state.tr.step(delStep);\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n // If the next node is an atom, delete it\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch)\n dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView());\n return true;\n }\n return false;\n};\n/**\nWhen the selection is empty and at the end of a textblock, select\nthe node coming after that textblock, if possible. This is intended\nto be bound to keys like delete, after\n[`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward) and similar deleting\ncommands, to provide a fall-back behavior when the schema doesn't\nallow deletion at the selected point.\n*/\nconst selectNodeForward = (state, dispatch, view) => {\n let { $head, empty } = state.selection, $cut = $head;\n if (!empty)\n return false;\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n return false;\n $cut = findCutAfter($head);\n }\n let node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node))\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView());\n return true;\n};\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating)\n for (let i = $pos.depth - 1; i >= 0; i--) {\n let parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount)\n return $pos.doc.resolve($pos.after(i + 1));\n if (parent.type.spec.isolating)\n break;\n }\n return null;\n}\n/**\nJoin the selected block or, if there is a text selection, the\nclosest ancestor block of the selection that can be joined, with\nthe sibling above it.\n*/\nconst joinUp = (state, dispatch) => {\n let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from))\n return false;\n point = sel.from;\n }\n else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null)\n return false;\n }\n if (dispatch) {\n let tr = state.tr.join(point);\n if (nodeSel)\n tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\n/**\nJoin the selected block, or the closest ancestor of the selection\nthat can be joined, with the sibling after it.\n*/\nconst joinDown = (state, dispatch) => {\n let sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to))\n return false;\n point = sel.to;\n }\n else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null)\n return false;\n }\n if (dispatch)\n dispatch(state.tr.join(point).scrollIntoView());\n return true;\n};\n/**\nLift the selected block, or the closest ancestor block of the\nselection that can be lifted, out of its parent node.\n*/\nconst lift = (state, dispatch) => {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n};\n/**\nIf the selection is in a node whose type has a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, replace the\nselection with a newline character.\n*/\nconst newlineInCode = (state, dispatch) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n return false;\n if (dispatch)\n dispatch(state.tr.insertText(\"\\n\").scrollIntoView());\n return true;\n};\nfunction defaultBlockAt(match) {\n for (let i = 0; i < match.edgeCount; i++) {\n let { type } = match.edge(i);\n if (type.isTextblock && !type.hasRequiredAttrs())\n return type;\n }\n return null;\n}\n/**\nWhen the selection is in a node with a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, create a\ndefault block after the code block, and move the cursor there.\n*/\nconst exitCode = (state, dispatch) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n return false;\n let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!type || !above.canReplaceWith(after, after, type))\n return false;\n if (dispatch) {\n let pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\n/**\nIf a block node is selected, create an empty paragraph before (if\nit is its parent's first child) or after it.\n*/\nconst createParagraphNear = (state, dispatch) => {\n let sel = state.selection, { $from, $to } = sel;\n if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent)\n return false;\n let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock)\n return false;\n if (dispatch) {\n let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n let tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\n/**\nIf the cursor is in an empty textblock that can be lifted, lift the\nblock.\n*/\nconst liftEmptyBlock = (state, dispatch) => {\n let { $cursor } = state.selection;\n if (!$cursor || $cursor.parent.content.size)\n return false;\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n let before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch)\n dispatch(state.tr.split(before).scrollIntoView());\n return true;\n }\n }\n let range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n};\n/**\nCreate a variant of [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock) that uses\na custom function to determine the type of the newly split off block.\n*/\nfunction splitBlockAs(splitNode) {\n return (state, dispatch) => {\n let { $from, $to } = state.selection;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos))\n return false;\n if (dispatch)\n dispatch(state.tr.split($from.pos).scrollIntoView());\n return true;\n }\n if (!$from.parent.isBlock)\n return false;\n if (dispatch) {\n let atEnd = $to.parentOffset == $to.parent.content.size;\n let tr = state.tr;\n if (state.selection instanceof TextSelection || state.selection instanceof AllSelection)\n tr.deleteSelection();\n let deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n let splitType = splitNode && splitNode($to.parent, atEnd);\n let types = splitType ? [splitType] : atEnd && deflt ? [{ type: deflt }] : undefined;\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)) {\n if (deflt)\n types = [{ type: deflt }];\n can = true;\n }\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n if (!atEnd && !$from.parentOffset && $from.parent.type != deflt) {\n let first = tr.mapping.map($from.before()), $first = tr.doc.resolve(first);\n if (deflt && $from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt))\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\n }\n }\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\n/**\nSplit the parent block of the selection. If the selection is a text\nselection, also delete its content.\n*/\nconst splitBlock = splitBlockAs();\n/**\nActs like [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock), but without\nresetting the set of active marks at the cursor.\n*/\nconst splitBlockKeepMarks = (state, dispatch) => {\n return splitBlock(state, dispatch && (tr => {\n let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks)\n tr.ensureMarks(marks);\n dispatch(tr);\n }));\n};\n/**\nMove the selection to the node wrapping the current selection, if\nany. (Will not select the document node.)\n*/\nconst selectParentNode = (state, dispatch) => {\n let { $from, to } = state.selection, pos;\n let same = $from.sharedDepth(to);\n if (same == 0)\n return false;\n pos = $from.before(same);\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n return true;\n};\n/**\nSelect the whole document.\n*/\nconst selectAll = (state, dispatch) => {\n if (dispatch)\n dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n return true;\n};\nfunction joinMaybeClear(state, $pos, dispatch) {\n let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type))\n return false;\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch)\n dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView());\n return true;\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n return false;\n if (dispatch)\n dispatch(state.tr\n .clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount))\n .join($pos.pos)\n .scrollIntoView());\n return true;\n}\nfunction deleteBarrier(state, $cut, dispatch) {\n let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n if (before.type.spec.isolating || after.type.spec.isolating)\n return false;\n if (joinMaybeClear(state, $cut, dispatch))\n return true;\n let canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter &&\n (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (let i = conn.length - 1; i >= 0; i--)\n wrap = Fragment.from(conn[i].create(null, wrap));\n wrap = Fragment.from(before.copy(wrap));\n let tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n let joinAt = end + 2 * conn.length;\n if (canJoin(tr.doc, joinAt))\n tr.join(joinAt);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n let selAfter = Selection.findFrom($cut, 1);\n let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n }\n if (canDelAfter && textblockAt(after, \"start\", true) && textblockAt(before, \"end\")) {\n let at = before, wrap = [];\n for (;;) {\n wrap.push(at);\n if (at.isTextblock)\n break;\n at = at.lastChild;\n }\n let afterText = after, afterDepth = 1;\n for (; !afterText.isTextblock; afterText = afterText.firstChild)\n afterDepth++;\n if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n if (dispatch) {\n let end = Fragment.empty;\n for (let i = wrap.length - 1; i >= 0; i--)\n end = Fragment.from(wrap[i].copy(end));\n let tr = state.tr.step(new ReplaceAroundStep($cut.pos - wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end, wrap.length, 0), 0, true));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n return false;\n}\nfunction selectTextblockSide(side) {\n return function (state, dispatch) {\n let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n let depth = $pos.depth;\n while ($pos.node(depth).isInline) {\n if (!depth)\n return false;\n depth--;\n }\n if (!$pos.node(depth).isTextblock)\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth))));\n return true;\n };\n}\n/**\nMoves the cursor to the start of current text block.\n*/\nconst selectTextblockStart = selectTextblockSide(-1);\n/**\nMoves the cursor to the end of current text block.\n*/\nconst selectTextblockEnd = selectTextblockSide(1);\n// Parameterized commands\n/**\nWrap the selection in a node of the given type with the given\nattributes.\n*/\nfunction wrapIn(nodeType, attrs = null) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping)\n return false;\n if (dispatch)\n dispatch(state.tr.wrap(range, wrapping).scrollIntoView());\n return true;\n };\n}\n/**\nReturns a command that tries to set the selected textblocks to the\ngiven node type with the given attributes.\n*/\nfunction setBlockType(nodeType, attrs = null) {\n return function (state, dispatch) {\n let applicable = false;\n for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (applicable)\n return false;\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs))\n return;\n if (node.type == nodeType) {\n applicable = true;\n }\n else {\n let $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n }\n if (!applicable)\n return false;\n if (dispatch) {\n let tr = state.tr;\n for (let i = 0; i < state.selection.ranges.length; i++) {\n let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n tr.setBlockType(from, to, nodeType, attrs);\n }\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\nfunction markApplies(doc, ranges, type) {\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, node => {\n if (can)\n return false;\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can)\n return true;\n }\n return false;\n}\n/**\nCreate a command function that toggles the given mark with the\ngiven attributes. Will return `false` when the current selection\ndoesn't support that mark. This will remove the mark if any marks\nof that type exist in the selection, or add it otherwise. If the\nselection is empty, this applies to the [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks) instead of a range of the\ndocument.\n*/\nfunction toggleMark(markType, attrs = null) {\n return function (state, dispatch) {\n let { empty, $cursor, ranges } = state.selection;\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType))\n return false;\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n dispatch(state.tr.removeStoredMark(markType));\n else\n dispatch(state.tr.addStoredMark(markType.create(attrs)));\n }\n else {\n let has = false, tr = state.tr;\n for (let i = 0; !has && i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n }\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n if (has) {\n tr.removeMark($from.pos, $to.pos, markType);\n }\n else {\n let from = $from.pos, to = $to.pos, start = $from.nodeAfter, end = $to.nodeBefore;\n let spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n let spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) {\n from += spaceStart;\n to -= spaceEnd;\n }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return (tr) => {\n if (!tr.isGeneric)\n return dispatch(tr);\n let ranges = [];\n for (let i = 0; i < tr.mapping.maps.length; i++) {\n let map = tr.mapping.maps[i];\n for (let j = 0; j < ranges.length; j++)\n ranges[j] = map.map(ranges[j]);\n map.forEach((_s, _e, from, to) => ranges.push(from, to));\n }\n // Figure out which joinable points exist inside those ranges,\n // by checking all node boundaries in their parent nodes.\n let joinable = [];\n for (let i = 0; i < ranges.length; i += 2) {\n let from = ranges[i], to = ranges[i + 1];\n let $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n let after = parent.maybeChild(index);\n if (!after)\n break;\n if (index && joinable.indexOf(pos) == -1) {\n let before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n joinable.push(pos);\n }\n pos += after.nodeSize;\n }\n }\n // Join the joinable points\n joinable.sort((a, b) => a - b);\n for (let i = joinable.length - 1; i >= 0; i--) {\n if (canJoin(tr.doc, joinable[i]))\n tr.join(joinable[i]);\n }\n dispatch(tr);\n };\n}\n/**\nWrap a command so that, when it produces a transform that causes\ntwo joinable nodes to end up next to each other, those are joined.\nNodes are considered joinable when they are of the same type and\nwhen the `isJoinable` predicate returns true for them or, if an\narray of strings was passed, if their node type name is in that\narray.\n*/\nfunction autoJoin(command, isJoinable) {\n let canJoin = Array.isArray(isJoinable) ? (node) => isJoinable.indexOf(node.type.name) > -1\n : isJoinable;\n return (state, dispatch, view) => command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view);\n}\n/**\nCombine a number of command functions into a single function (which\ncalls them one by one until one returns true).\n*/\nfunction chainCommands(...commands) {\n return function (state, dispatch, view) {\n for (let i = 0; i < commands.length; i++)\n if (commands[i](state, dispatch, view))\n return true;\n return false;\n };\n}\nlet backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nlet del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n/**\nA basic keymap containing bindings not specific to any schema.\nBinds the following keys (when multiple commands are listed, they\nare chained with [`chainCommands`](https://prosemirror.net/docs/ref/#commands.chainCommands)):\n\n* **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n* **Mod-Enter** to `exitCode`\n* **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n* **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-a** to `selectAll`\n*/\nconst pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Shift-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\n/**\nA copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n**Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n**Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\nCtrl-Delete.\n*/\nconst macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"],\n \"Ctrl-a\": selectTextblockStart,\n \"Ctrl-e\": selectTextblockEnd\n};\nfor (let key in pcBaseKeymap)\n macBaseKeymap[key] = pcBaseKeymap[key];\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform)\n // @ts-ignore\n : typeof os != \"undefined\" && os.platform ? os.platform() == \"darwin\" : false;\n/**\nDepending on the detected platform, this will hold\n[`pcBasekeymap`](https://prosemirror.net/docs/ref/#commands.pcBaseKeymap) or\n[`macBaseKeymap`](https://prosemirror.net/docs/ref/#commands.macBaseKeymap).\n*/\nconst baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, splitBlock, splitBlockAs, splitBlockKeepMarks, toggleMark, wrapIn };\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget, canJoin } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\n\nconst olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n/**\nAn ordered list [node spec](https://prosemirror.net/docs/ref/#model.NodeSpec). Has a single\nattribute, `order`, which determines the number at which the list\nstarts counting, and defaults to 1. Represented as an `<ol>`\nelement.\n*/\nconst orderedList = {\n attrs: { order: { default: 1 } },\n parseDOM: [{ tag: \"ol\", getAttrs(dom) {\n return { order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1 };\n } }],\n toDOM(node) {\n return node.attrs.order == 1 ? olDOM : [\"ol\", { start: node.attrs.order }, 0];\n }\n};\n/**\nA bullet list node spec, represented in the DOM as `<ul>`.\n*/\nconst bulletList = {\n parseDOM: [{ tag: \"ul\" }],\n toDOM() { return ulDOM; }\n};\n/**\nA list item (`<li>`) spec.\n*/\nconst listItem = {\n parseDOM: [{ tag: \"li\" }],\n toDOM() { return liDOM; },\n defining: true\n};\nfunction add(obj, props) {\n let copy = {};\n for (let prop in obj)\n copy[prop] = obj[prop];\n for (let prop in props)\n copy[prop] = props[prop];\n return copy;\n}\n/**\nConvenience function for adding list-related node types to a map\nspecifying the nodes for a schema. Adds\n[`orderedList`](https://prosemirror.net/docs/ref/#schema-list.orderedList) as `\"ordered_list\"`,\n[`bulletList`](https://prosemirror.net/docs/ref/#schema-list.bulletList) as `\"bullet_list\"`, and\n[`listItem`](https://prosemirror.net/docs/ref/#schema-list.listItem) as `\"list_item\"`.\n\n`itemContent` determines the content expression for the list items.\nIf you want the commands defined in this module to apply to your\nlist structure, it should have a shape like `\"paragraph block*\"` or\n`\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\ngiven to assign a group name to the list node types, for example\n`\"block\"`.\n*/\nfunction addListNodes(nodes, itemContent, listGroup) {\n return nodes.append({\n ordered_list: add(orderedList, { content: \"list_item+\", group: listGroup }),\n bullet_list: add(bulletList, { content: \"list_item+\", group: listGroup }),\n list_item: add(listItem, { content: itemContent })\n });\n}\n/**\nReturns a command function that wraps the selection in a list with\nthe given type an attributes. If `dispatch` is null, only return a\nvalue to indicate whether this is possible, but don't actually\nperform the change.\n*/\nfunction wrapInList(listType, attrs = null) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), doJoin = false, outerRange = range;\n if (!range)\n return false;\n // This is at the top of an existing list item\n if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n // Don't do anything if this is the top of the list\n if ($from.index(range.depth - 1) == 0)\n return false;\n let $insert = state.doc.resolve(range.start - 2);\n outerRange = new NodeRange($insert, $insert, range.depth);\n if (range.endIndex < range.parent.childCount)\n range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth);\n doJoin = true;\n }\n let wrap = findWrapping(outerRange, listType, attrs, range);\n if (!wrap)\n return false;\n if (dispatch)\n dispatch(doWrapInList(state.tr, range, wrap, doJoin, listType).scrollIntoView());\n return true;\n };\n}\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n let content = Fragment.empty;\n for (let i = wrappers.length - 1; i >= 0; i--)\n content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end, new Slice(content, 0, 0), wrappers.length, true));\n let found = 0;\n for (let i = 0; i < wrappers.length; i++)\n if (wrappers[i].type == listType)\n found = i + 1;\n let splitDepth = wrappers.length - found;\n let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n for (let i = range.startIndex, e = range.endIndex, first = true; i < e; i++, first = false) {\n if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n tr.split(splitPos, splitDepth);\n splitPos += 2 * splitDepth;\n }\n splitPos += parent.child(i).nodeSize;\n }\n return tr;\n}\n/**\nBuild a command that splits a non-empty textblock at the top level\nof a list item by also splitting that list item.\n*/\nfunction splitListItem(itemType) {\n return function (state, dispatch) {\n let { $from, $to, node } = state.selection;\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to))\n return false;\n let grandParent = $from.node(-1);\n if (grandParent.type != itemType)\n return false;\n if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 3 || $from.node(-3).type != itemType ||\n $from.index(-2) != $from.node(-2).childCount - 1)\n return false;\n if (dispatch) {\n let wrap = Fragment.empty;\n let depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d--)\n wrap = Fragment.from($from.node(d).copy(wrap));\n let depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1\n : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n // Add a second list item with an empty default start node\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n let start = $from.before($from.depth - (depthBefore - 1));\n let tr = state.tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n let sel = -1;\n tr.doc.nodesBetween(start, tr.doc.content.size, (node, pos) => {\n if (sel > -1)\n return false;\n if (node.isTextblock && node.content.size == 0)\n sel = pos + 1;\n });\n if (sel > -1)\n tr.setSelection(Selection.near(tr.doc.resolve(sel)));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n let nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n let tr = state.tr.delete($from.pos, $to.pos);\n let types = nextType ? [null, { type: nextType }] : undefined;\n if (!canSplit(tr.doc, $from.pos, 2, types))\n return false;\n if (dispatch)\n dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/**\nCreate a command to lift the list item around the selection up into\na wrapping list.\n*/\nfunction liftListItem(itemType) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n if (!range)\n return false;\n if (!dispatch)\n return true;\n if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n return liftToOuterList(state, dispatch, itemType, range);\n else // Outer list node\n return liftOutOfList(state, dispatch, range);\n };\n}\nfunction liftToOuterList(state, dispatch, itemType, range) {\n let tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n if (end < endOfList) {\n // There are siblings after the lifted items, which must become\n // children of the last item\n tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList, new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n }\n const target = liftTarget(range);\n if (target == null)\n return false;\n tr.lift(range, target);\n let after = tr.mapping.map(end, -1) - 1;\n if (canJoin(tr.doc, after))\n tr.join(after);\n dispatch(tr.scrollIntoView());\n return true;\n}\nfunction liftOutOfList(state, dispatch, range) {\n let tr = state.tr, list = range.parent;\n // Merge the list items into a single big item\n for (let pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n pos -= list.child(i).nodeSize;\n tr.delete(pos - 1, pos + 1);\n }\n let $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n if (tr.mapping.map(range.end) != range.start + $start.nodeAfter.nodeSize)\n return false;\n let atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n let parent = $start.node(-1), indexBefore = $start.index(-1);\n if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1, item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n return false;\n let start = $start.pos, end = start + item.nodeSize;\n // Strip off the surrounding list. At the sides where we're not at\n // the end of the list, the existing list is closed. At sides where\n // this is the end, it is overwritten to its end.\n tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1, new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))), atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n dispatch(tr.scrollIntoView());\n return true;\n}\n/**\nCreate a command to sink the list item around the selection down\ninto an inner list.\n*/\nfunction sinkListItem(itemType) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n if (!range)\n return false;\n let startIndex = range.startIndex;\n if (startIndex == 0)\n return false;\n let parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type != itemType)\n return false;\n if (dispatch) {\n let nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n let inner = Fragment.from(nestedBefore ? itemType.create() : null);\n let slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))), nestedBefore ? 3 : 1, 0);\n let before = range.start, after = range.end;\n dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice, 1, true))\n .scrollIntoView());\n }\n return true;\n };\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, wrapInList };\n","import { Plugin, PluginKey, TextSelection, Selection, NodeSelection, EditorState } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\nimport { keymap } from '@tiptap/pm/keymap';\nimport { Schema, Fragment, DOMParser, DOMSerializer, Node as Node$1, Slice } from '@tiptap/pm/model';\nimport { liftTarget, ReplaceStep, ReplaceAroundStep, Transform, canSplit, canJoin, findWrapping } from '@tiptap/pm/transform';\nimport { createParagraphNear as createParagraphNear$1, deleteSelection as deleteSelection$1, exitCode as exitCode$1, joinUp as joinUp$1, joinDown as joinDown$1, joinBackward as joinBackward$1, joinForward as joinForward$1, lift as lift$1, liftEmptyBlock as liftEmptyBlock$1, newlineInCode as newlineInCode$1, selectNodeBackward as selectNodeBackward$1, selectNodeForward as selectNodeForward$1, selectParentNode as selectParentNode$1, selectTextblockEnd as selectTextblockEnd$1, selectTextblockStart as selectTextblockStart$1, setBlockType, wrapIn as wrapIn$1 } from '@tiptap/pm/commands';\nimport { liftListItem as liftListItem$1, sinkListItem as sinkListItem$1, wrapInList as wrapInList$1 } from '@tiptap/pm/schema-list';\n\nfunction createChainableState(config) {\r\n const { state, transaction } = config;\r\n let { selection } = transaction;\r\n let { doc } = transaction;\r\n let { storedMarks } = transaction;\r\n return {\r\n ...state,\r\n apply: state.apply.bind(state),\r\n applyTransaction: state.applyTransaction.bind(state),\r\n filterTransaction: state.filterTransaction,\r\n plugins: state.plugins,\r\n schema: state.schema,\r\n reconfigure: state.reconfigure.bind(state),\r\n toJSON: state.toJSON.bind(state),\r\n get storedMarks() {\r\n return storedMarks;\r\n },\r\n get selection() {\r\n return selection;\r\n },\r\n get doc() {\r\n return doc;\r\n },\r\n get tr() {\r\n selection = transaction.selection;\r\n doc = transaction.doc;\r\n storedMarks = transaction.storedMarks;\r\n return transaction;\r\n },\r\n };\r\n}\n\nclass CommandManager {\r\n constructor(props) {\r\n this.editor = props.editor;\r\n this.rawCommands = this.editor.extensionManager.commands;\r\n this.customState = props.state;\r\n }\r\n get hasCustomState() {\r\n return !!this.customState;\r\n }\r\n get state() {\r\n return this.customState || this.editor.state;\r\n }\r\n get commands() {\r\n const { rawCommands, editor, state } = this;\r\n const { view } = editor;\r\n const { tr } = state;\r\n const props = this.buildProps(tr);\r\n return Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\r\n const method = (...args) => {\r\n const callback = command(...args)(props);\r\n if (!tr.getMeta('preventDispatch') && !this.hasCustomState) {\r\n view.dispatch(tr);\r\n }\r\n return callback;\r\n };\r\n return [name, method];\r\n }));\r\n }\r\n get chain() {\r\n return () => this.createChain();\r\n }\r\n get can() {\r\n return () => this.createCan();\r\n }\r\n createChain(startTr, shouldDispatch = true) {\r\n const { rawCommands, editor, state } = this;\r\n const { view } = editor;\r\n const callbacks = [];\r\n const hasStartTransaction = !!startTr;\r\n const tr = startTr || state.tr;\r\n const run = () => {\r\n if (!hasStartTransaction\r\n && shouldDispatch\r\n && !tr.getMeta('preventDispatch')\r\n && !this.hasCustomState) {\r\n view.dispatch(tr);\r\n }\r\n return callbacks.every(callback => callback === true);\r\n };\r\n const chain = {\r\n ...Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\r\n const chainedCommand = (...args) => {\r\n const props = this.buildProps(tr, shouldDispatch);\r\n const callback = command(...args)(props);\r\n callbacks.push(callback);\r\n return chain;\r\n };\r\n return [name, chainedCommand];\r\n })),\r\n run,\r\n };\r\n return chain;\r\n }\r\n createCan(startTr) {\r\n const { rawCommands, state } = this;\r\n const dispatch = false;\r\n const tr = startTr || state.tr;\r\n const props = this.buildProps(tr, dispatch);\r\n const formattedCommands = Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\r\n return [name, (...args) => command(...args)({ ...props, dispatch: undefined })];\r\n }));\r\n return {\r\n ...formattedCommands,\r\n chain: () => this.createChain(tr, dispatch),\r\n };\r\n }\r\n buildProps(tr, shouldDispatch = true) {\r\n const { rawCommands, editor, state } = this;\r\n const { view } = editor;\r\n if (state.storedMarks) {\r\n tr.setStoredMarks(state.storedMarks);\r\n }\r\n const props = {\r\n tr,\r\n editor,\r\n view,\r\n state: createChainableState({\r\n state,\r\n transaction: tr,\r\n }),\r\n dispatch: shouldDispatch ? () => undefined : undefined,\r\n chain: () => this.createChain(tr),\r\n can: () => this.createCan(tr),\r\n get commands() {\r\n return Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\r\n return [name, (...args) => command(...args)(props)];\r\n }));\r\n },\r\n };\r\n return props;\r\n }\r\n}\n\nclass EventEmitter {\r\n constructor() {\r\n this.callbacks = {};\r\n }\r\n on(event, fn) {\r\n if (!this.callbacks[event]) {\r\n this.callbacks[event] = [];\r\n }\r\n this.callbacks[event].push(fn);\r\n return this;\r\n }\r\n emit(event, ...args) {\r\n const callbacks = this.callbacks[event];\r\n if (callbacks) {\r\n callbacks.forEach(callback => callback.apply(this, args));\r\n }\r\n return this;\r\n }\r\n off(event, fn) {\r\n const callbacks = this.callbacks[event];\r\n if (callbacks) {\r\n if (fn) {\r\n this.callbacks[event] = callbacks.filter(callback => callback !== fn);\r\n }\r\n else {\r\n delete this.callbacks[event];\r\n }\r\n }\r\n return this;\r\n }\r\n removeAllListeners() {\r\n this.callbacks = {};\r\n }\r\n}\n\nfunction getExtensionField(extension, field, context) {\r\n if (extension.config[field] === undefined && extension.parent) {\r\n return getExtensionField(extension.parent, field, context);\r\n }\r\n if (typeof extension.config[field] === 'function') {\r\n const value = extension.config[field].bind({\r\n ...context,\r\n parent: extension.parent\r\n ? getExtensionField(extension.parent, field, context)\r\n : null,\r\n });\r\n return value;\r\n }\r\n return extension.config[field];\r\n}\n\nfunction splitExtensions(extensions) {\r\n const baseExtensions = extensions.filter(extension => extension.type === 'extension');\r\n const nodeExtensions = extensions.filter(extension => extension.type === 'node');\r\n const markExtensions = extensions.filter(extension => extension.type === 'mark');\r\n return {\r\n baseExtensions,\r\n nodeExtensions,\r\n markExtensions,\r\n };\r\n}\n\n/**\r\n * Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.\r\n * @param extensions List of extensions\r\n */\r\nfunction getAttributesFromExtensions(extensions) {\r\n const extensionAttributes = [];\r\n const { nodeExtensions, markExtensions } = splitExtensions(extensions);\r\n const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions];\r\n const defaultAttribute = {\r\n default: null,\r\n rendered: true,\r\n renderHTML: null,\r\n parseHTML: null,\r\n keepOnSplit: true,\r\n isRequired: false,\r\n };\r\n extensions.forEach(extension => {\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n const addGlobalAttributes = getExtensionField(extension, 'addGlobalAttributes', context);\r\n if (!addGlobalAttributes) {\r\n return;\r\n }\r\n // TODO: remove `as GlobalAttributes`\r\n const globalAttributes = addGlobalAttributes();\r\n globalAttributes.forEach(globalAttribute => {\r\n globalAttribute.types.forEach(type => {\r\n Object\r\n .entries(globalAttribute.attributes)\r\n .forEach(([name, attribute]) => {\r\n extensionAttributes.push({\r\n type,\r\n name,\r\n attribute: {\r\n ...defaultAttribute,\r\n ...attribute,\r\n },\r\n });\r\n });\r\n });\r\n });\r\n });\r\n nodeAndMarkExtensions.forEach(extension => {\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n const addAttributes = getExtensionField(extension, 'addAttributes', context);\r\n if (!addAttributes) {\r\n return;\r\n }\r\n // TODO: remove `as Attributes`\r\n const attributes = addAttributes();\r\n Object\r\n .entries(attributes)\r\n .forEach(([name, attribute]) => {\r\n const mergedAttr = {\r\n ...defaultAttribute,\r\n ...attribute,\r\n };\r\n if ((attribute === null || attribute === void 0 ? void 0 : attribute.isRequired) && (attribute === null || attribute === void 0 ? void 0 : attribute.default) === undefined) {\r\n delete mergedAttr.default;\r\n }\r\n extensionAttributes.push({\r\n type: extension.name,\r\n name,\r\n attribute: mergedAttr,\r\n });\r\n });\r\n });\r\n return extensionAttributes;\r\n}\n\nfunction getNodeType(nameOrType, schema) {\r\n if (typeof nameOrType === 'string') {\r\n if (!schema.nodes[nameOrType]) {\r\n throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`);\r\n }\r\n return schema.nodes[nameOrType];\r\n }\r\n return nameOrType;\r\n}\n\nfunction mergeAttributes(...objects) {\r\n return objects\r\n .filter(item => !!item)\r\n .reduce((items, item) => {\r\n const mergedAttributes = { ...items };\r\n Object.entries(item).forEach(([key, value]) => {\r\n const exists = mergedAttributes[key];\r\n if (!exists) {\r\n mergedAttributes[key] = value;\r\n return;\r\n }\r\n if (key === 'class') {\r\n mergedAttributes[key] = [mergedAttributes[key], value].join(' ');\r\n }\r\n else if (key === 'style') {\r\n mergedAttributes[key] = [mergedAttributes[key], value].join('; ');\r\n }\r\n else {\r\n mergedAttributes[key] = value;\r\n }\r\n });\r\n return mergedAttributes;\r\n }, {});\r\n}\n\nfunction getRenderedAttributes(nodeOrMark, extensionAttributes) {\r\n return extensionAttributes\r\n .filter(item => item.attribute.rendered)\r\n .map(item => {\r\n if (!item.attribute.renderHTML) {\r\n return {\r\n [item.name]: nodeOrMark.attrs[item.name],\r\n };\r\n }\r\n return item.attribute.renderHTML(nodeOrMark.attrs) || {};\r\n })\r\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {});\r\n}\n\nfunction isFunction(value) {\r\n return typeof value === 'function';\r\n}\n\n/**\r\n * Optionally calls `value` as a function.\r\n * Otherwise it is returned directly.\r\n * @param value Function or any value.\r\n * @param context Optional context to bind to function.\r\n * @param props Optional props to pass to function.\r\n */\r\nfunction callOrReturn(value, context = undefined, ...props) {\r\n if (isFunction(value)) {\r\n if (context) {\r\n return value.bind(context)(...props);\r\n }\r\n return value(...props);\r\n }\r\n return value;\r\n}\n\nfunction isEmptyObject(value = {}) {\r\n return Object.keys(value).length === 0 && value.constructor === Object;\r\n}\n\nfunction fromString(value) {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n if (value.match(/^[+-]?(?:\\d*\\.)?\\d+$/)) {\r\n return Number(value);\r\n }\r\n if (value === 'true') {\r\n return true;\r\n }\r\n if (value === 'false') {\r\n return false;\r\n }\r\n return value;\r\n}\n\n/**\r\n * This function merges extension attributes into parserule attributes (`attrs` or `getAttrs`).\r\n * Cancels when `getAttrs` returned `false`.\r\n * @param parseRule ProseMirror ParseRule\r\n * @param extensionAttributes List of attributes to inject\r\n */\r\nfunction injectExtensionAttributesToParseRule(parseRule, extensionAttributes) {\r\n if (parseRule.style) {\r\n return parseRule;\r\n }\r\n return {\r\n ...parseRule,\r\n getAttrs: node => {\r\n const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs;\r\n if (oldAttributes === false) {\r\n return false;\r\n }\r\n const newAttributes = extensionAttributes.reduce((items, item) => {\r\n const value = item.attribute.parseHTML\r\n ? item.attribute.parseHTML(node)\r\n : fromString(node.getAttribute(item.name));\r\n if (value === null || value === undefined) {\r\n return items;\r\n }\r\n return {\r\n ...items,\r\n [item.name]: value,\r\n };\r\n }, {});\r\n return { ...oldAttributes, ...newAttributes };\r\n },\r\n };\r\n}\n\nfunction cleanUpSchemaItem(data) {\r\n return Object.fromEntries(Object.entries(data).filter(([key, value]) => {\r\n if (key === 'attrs' && isEmptyObject(value)) {\r\n return false;\r\n }\r\n return value !== null && value !== undefined;\r\n }));\r\n}\r\nfunction getSchemaByResolvedExtensions(extensions) {\r\n var _a;\r\n const allAttributes = getAttributesFromExtensions(extensions);\r\n const { nodeExtensions, markExtensions } = splitExtensions(extensions);\r\n const topNode = (_a = nodeExtensions.find(extension => getExtensionField(extension, 'topNode'))) === null || _a === void 0 ? void 0 : _a.name;\r\n const nodes = Object.fromEntries(nodeExtensions.map(extension => {\r\n const extensionAttributes = allAttributes.filter(attribute => attribute.type === extension.name);\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n const extraNodeFields = extensions.reduce((fields, e) => {\r\n const extendNodeSchema = getExtensionField(e, 'extendNodeSchema', context);\r\n return {\r\n ...fields,\r\n ...(extendNodeSchema ? extendNodeSchema(extension) : {}),\r\n };\r\n }, {});\r\n const schema = cleanUpSchemaItem({\r\n ...extraNodeFields,\r\n content: callOrReturn(getExtensionField(extension, 'content', context)),\r\n marks: callOrReturn(getExtensionField(extension, 'marks', context)),\r\n group: callOrReturn(getExtensionField(extension, 'group', context)),\r\n inline: callOrReturn(getExtensionField(extension, 'inline', context)),\r\n atom: callOrReturn(getExtensionField(extension, 'atom', context)),\r\n selectable: callOrReturn(getExtensionField(extension, 'selectable', context)),\r\n draggable: callOrReturn(getExtensionField(extension, 'draggable', context)),\r\n code: callOrReturn(getExtensionField(extension, 'code', context)),\r\n defining: callOrReturn(getExtensionField(extension, 'defining', context)),\r\n isolating: callOrReturn(getExtensionField(extension, 'isolating', context)),\r\n attrs: Object.fromEntries(extensionAttributes.map(extensionAttribute => {\r\n var _a;\r\n return [extensionAttribute.name, { default: (_a = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a === void 0 ? void 0 : _a.default }];\r\n })),\r\n });\r\n const parseHTML = callOrReturn(getExtensionField(extension, 'parseHTML', context));\r\n if (parseHTML) {\r\n schema.parseDOM = parseHTML.map(parseRule => injectExtensionAttributesToParseRule(parseRule, extensionAttributes));\r\n }\r\n const renderHTML = getExtensionField(extension, 'renderHTML', context);\r\n if (renderHTML) {\r\n schema.toDOM = node => renderHTML({\r\n node,\r\n HTMLAttributes: getRenderedAttributes(node, extensionAttributes),\r\n });\r\n }\r\n const renderText = getExtensionField(extension, 'renderText', context);\r\n if (renderText) {\r\n schema.toText = renderText;\r\n }\r\n return [extension.name, schema];\r\n }));\r\n const marks = Object.fromEntries(markExtensions.map(extension => {\r\n const extensionAttributes = allAttributes.filter(attribute => attribute.type === extension.name);\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n const extraMarkFields = extensions.reduce((fields, e) => {\r\n const extendMarkSchema = getExtensionField(e, 'extendMarkSchema', context);\r\n return {\r\n ...fields,\r\n ...(extendMarkSchema ? extendMarkSchema(extension) : {}),\r\n };\r\n }, {});\r\n const schema = cleanUpSchemaItem({\r\n ...extraMarkFields,\r\n inclusive: callOrReturn(getExtensionField(extension, 'inclusive', context)),\r\n excludes: callOrReturn(getExtensionField(extension, 'excludes', context)),\r\n group: callOrReturn(getExtensionField(extension, 'group', context)),\r\n spanning: callOrReturn(getExtensionField(extension, 'spanning', context)),\r\n code: callOrReturn(getExtensionField(extension, 'code', context)),\r\n attrs: Object.fromEntries(extensionAttributes.map(extensionAttribute => {\r\n var _a;\r\n return [extensionAttribute.name, { default: (_a = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a === void 0 ? void 0 : _a.default }];\r\n })),\r\n });\r\n const parseHTML = callOrReturn(getExtensionField(extension, 'parseHTML', context));\r\n if (parseHTML) {\r\n schema.parseDOM = parseHTML.map(parseRule => injectExtensionAttributesToParseRule(parseRule, extensionAttributes));\r\n }\r\n const renderHTML = getExtensionField(extension, 'renderHTML', context);\r\n if (renderHTML) {\r\n schema.toDOM = mark => renderHTML({\r\n mark,\r\n HTMLAttributes: getRenderedAttributes(mark, extensionAttributes),\r\n });\r\n }\r\n return [extension.name, schema];\r\n }));\r\n return new Schema({\r\n topNode,\r\n nodes,\r\n marks,\r\n });\r\n}\n\nfunction getSchemaTypeByName(name, schema) {\r\n return schema.nodes[name] || schema.marks[name] || null;\r\n}\n\nfunction isExtensionRulesEnabled(extension, enabled) {\r\n if (Array.isArray(enabled)) {\r\n return enabled.some(enabledExtension => {\r\n const name = typeof enabledExtension === 'string'\r\n ? enabledExtension\r\n : enabledExtension.name;\r\n return name === extension.name;\r\n });\r\n }\r\n return enabled;\r\n}\n\nconst getTextContentFromNodes = ($from, maxMatch = 500) => {\r\n let textBefore = '';\r\n const sliceEndPos = $from.parentOffset;\r\n $from.parent.nodesBetween(Math.max(0, sliceEndPos - maxMatch), sliceEndPos, (node, pos, parent, index) => {\r\n var _a, _b;\r\n const chunk = ((_b = (_a = node.type.spec).toText) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n node,\r\n pos,\r\n parent,\r\n index,\r\n }))\r\n || node.textContent\r\n || '%leaf%';\r\n textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos));\r\n });\r\n return textBefore;\r\n};\n\nfunction isRegExp(value) {\r\n return Object.prototype.toString.call(value) === '[object RegExp]';\r\n}\n\nclass InputRule {\r\n constructor(config) {\r\n this.find = config.find;\r\n this.handler = config.handler;\r\n }\r\n}\r\nconst inputRuleMatcherHandler = (text, find) => {\r\n if (isRegExp(find)) {\r\n return find.exec(text);\r\n }\r\n const inputRuleMatch = find(text);\r\n if (!inputRuleMatch) {\r\n return null;\r\n }\r\n const result = [inputRuleMatch.text];\r\n result.index = inputRuleMatch.index;\r\n result.input = text;\r\n result.data = inputRuleMatch.data;\r\n if (inputRuleMatch.replaceWith) {\r\n if (!inputRuleMatch.text.includes(inputRuleMatch.replaceWith)) {\r\n console.warn('[tiptap warn]: \"inputRuleMatch.replaceWith\" must be part of \"inputRuleMatch.text\".');\r\n }\r\n result.push(inputRuleMatch.replaceWith);\r\n }\r\n return result;\r\n};\r\nfunction run$1(config) {\r\n var _a;\r\n const { editor, from, to, text, rules, plugin, } = config;\r\n const { view } = editor;\r\n if (view.composing) {\r\n return false;\r\n }\r\n const $from = view.state.doc.resolve(from);\r\n if (\r\n // check for code node\r\n $from.parent.type.spec.code\r\n // check for code mark\r\n || !!((_a = ($from.nodeBefore || $from.nodeAfter)) === null || _a === void 0 ? void 0 : _a.marks.find(mark => mark.type.spec.code))) {\r\n return false;\r\n }\r\n let matched = false;\r\n const textBefore = getTextContentFromNodes($from) + text;\r\n rules.forEach(rule => {\r\n if (matched) {\r\n return;\r\n }\r\n const match = inputRuleMatcherHandler(textBefore, rule.find);\r\n if (!match) {\r\n return;\r\n }\r\n const tr = view.state.tr;\r\n const state = createChainableState({\r\n state: view.state,\r\n transaction: tr,\r\n });\r\n const range = {\r\n from: from - (match[0].length - text.length),\r\n to,\r\n };\r\n const { commands, chain, can } = new CommandManager({\r\n editor,\r\n state,\r\n });\r\n const handler = rule.handler({\r\n state,\r\n range,\r\n match,\r\n commands,\r\n chain,\r\n can,\r\n });\r\n // stop if there are no changes\r\n if (handler === null || !tr.steps.length) {\r\n return;\r\n }\r\n // store transform as meta data\r\n // so we can undo input rules within the `undoInputRules` command\r\n tr.setMeta(plugin, {\r\n transform: tr,\r\n from,\r\n to,\r\n text,\r\n });\r\n view.dispatch(tr);\r\n matched = true;\r\n });\r\n return matched;\r\n}\r\n/**\r\n * Create an input rules plugin. When enabled, it will cause text\r\n * input that matches any of the given rules to trigger the rule’s\r\n * action.\r\n */\r\nfunction inputRulesPlugin(props) {\r\n const { editor, rules } = props;\r\n const plugin = new Plugin({\r\n state: {\r\n init() {\r\n return null;\r\n },\r\n apply(tr, prev) {\r\n const stored = tr.getMeta(plugin);\r\n if (stored) {\r\n return stored;\r\n }\r\n return tr.selectionSet || tr.docChanged ? null : prev;\r\n },\r\n },\r\n props: {\r\n handleTextInput(view, from, to, text) {\r\n return run$1({\r\n editor,\r\n from,\r\n to,\r\n text,\r\n rules,\r\n plugin,\r\n });\r\n },\r\n handleDOMEvents: {\r\n compositionend: view => {\r\n setTimeout(() => {\r\n const { $cursor } = view.state.selection;\r\n if ($cursor) {\r\n run$1({\r\n editor,\r\n from: $cursor.pos,\r\n to: $cursor.pos,\r\n text: '',\r\n rules,\r\n plugin,\r\n });\r\n }\r\n });\r\n return false;\r\n },\r\n },\r\n // add support for input rules to trigger on enter\r\n // this is useful for example for code blocks\r\n handleKeyDown(view, event) {\r\n if (event.key !== 'Enter') {\r\n return false;\r\n }\r\n const { $cursor } = view.state.selection;\r\n if ($cursor) {\r\n return run$1({\r\n editor,\r\n from: $cursor.pos,\r\n to: $cursor.pos,\r\n text: '\\n',\r\n rules,\r\n plugin,\r\n });\r\n }\r\n return false;\r\n },\r\n },\r\n // @ts-ignore\r\n isInputRules: true,\r\n });\r\n return plugin;\r\n}\n\nfunction isNumber(value) {\r\n return typeof value === 'number';\r\n}\n\nclass PasteRule {\r\n constructor(config) {\r\n this.find = config.find;\r\n this.handler = config.handler;\r\n }\r\n}\r\nconst pasteRuleMatcherHandler = (text, find) => {\r\n if (isRegExp(find)) {\r\n return [...text.matchAll(find)];\r\n }\r\n const matches = find(text);\r\n if (!matches) {\r\n return [];\r\n }\r\n return matches.map(pasteRuleMatch => {\r\n const result = [pasteRuleMatch.text];\r\n result.index = pasteRuleMatch.index;\r\n result.input = text;\r\n result.data = pasteRuleMatch.data;\r\n if (pasteRuleMatch.replaceWith) {\r\n if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) {\r\n console.warn('[tiptap warn]: \"pasteRuleMatch.replaceWith\" must be part of \"pasteRuleMatch.text\".');\r\n }\r\n result.push(pasteRuleMatch.replaceWith);\r\n }\r\n return result;\r\n });\r\n};\r\nfunction run(config) {\r\n const { editor, state, from, to, rule, } = config;\r\n const { commands, chain, can } = new CommandManager({\r\n editor,\r\n state,\r\n });\r\n const handlers = [];\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (!node.isTextblock || node.type.spec.code) {\r\n return;\r\n }\r\n const resolvedFrom = Math.max(from, pos);\r\n const resolvedTo = Math.min(to, pos + node.content.size);\r\n const textToMatch = node.textBetween(resolvedFrom - pos, resolvedTo - pos, undefined, '\\ufffc');\r\n const matches = pasteRuleMatcherHandler(textToMatch, rule.find);\r\n matches.forEach(match => {\r\n if (match.index === undefined) {\r\n return;\r\n }\r\n const start = resolvedFrom + match.index + 1;\r\n const end = start + match[0].length;\r\n const range = {\r\n from: state.tr.mapping.map(start),\r\n to: state.tr.mapping.map(end),\r\n };\r\n const handler = rule.handler({\r\n state,\r\n range,\r\n match,\r\n commands,\r\n chain,\r\n can,\r\n });\r\n handlers.push(handler);\r\n });\r\n });\r\n const success = handlers.every(handler => handler !== null);\r\n return success;\r\n}\r\n/**\r\n * Create an paste rules plugin. When enabled, it will cause pasted\r\n * text that matches any of the given rules to trigger the rule’s\r\n * action.\r\n */\r\nfunction pasteRulesPlugin(props) {\r\n const { editor, rules } = props;\r\n let dragSourceElement = null;\r\n let isPastedFromProseMirror = false;\r\n let isDroppedFromProseMirror = false;\r\n const plugins = rules.map(rule => {\r\n return new Plugin({\r\n // we register a global drag handler to track the current drag source element\r\n view(view) {\r\n const handleDragstart = (event) => {\r\n var _a;\r\n dragSourceElement = ((_a = view.dom.parentElement) === null || _a === void 0 ? void 0 : _a.contains(event.target))\r\n ? view.dom.parentElement\r\n : null;\r\n };\r\n window.addEventListener('dragstart', handleDragstart);\r\n return {\r\n destroy() {\r\n window.removeEventListener('dragstart', handleDragstart);\r\n },\r\n };\r\n },\r\n props: {\r\n handleDOMEvents: {\r\n drop: view => {\r\n isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement;\r\n return false;\r\n },\r\n paste: (view, event) => {\r\n var _a;\r\n const html = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData('text/html');\r\n isPastedFromProseMirror = !!(html === null || html === void 0 ? void 0 : html.includes('data-pm-slice'));\r\n return false;\r\n },\r\n },\r\n },\r\n appendTransaction: (transactions, oldState, state) => {\r\n const transaction = transactions[0];\r\n const isPaste = transaction.getMeta('uiEvent') === 'paste' && !isPastedFromProseMirror;\r\n const isDrop = transaction.getMeta('uiEvent') === 'drop' && !isDroppedFromProseMirror;\r\n if (!isPaste && !isDrop) {\r\n return;\r\n }\r\n // stop if there is no changed range\r\n const from = oldState.doc.content.findDiffStart(state.doc.content);\r\n const to = oldState.doc.content.findDiffEnd(state.doc.content);\r\n if (!isNumber(from) || !to || from === to.b) {\r\n return;\r\n }\r\n // build a chainable state\r\n // so we can use a single transaction for all paste rules\r\n const tr = state.tr;\r\n const chainableState = createChainableState({\r\n state,\r\n transaction: tr,\r\n });\r\n const handler = run({\r\n editor,\r\n state: chainableState,\r\n from: Math.max(from - 1, 0),\r\n to: to.b - 1,\r\n rule,\r\n });\r\n // stop if there are no changes\r\n if (!handler || !tr.steps.length) {\r\n return;\r\n }\r\n return tr;\r\n },\r\n });\r\n });\r\n return plugins;\r\n}\n\nfunction findDuplicates(items) {\r\n const filtered = items.filter((el, index) => items.indexOf(el) !== index);\r\n return [...new Set(filtered)];\r\n}\n\nclass ExtensionManager {\r\n constructor(extensions, editor) {\r\n this.splittableMarks = [];\r\n this.editor = editor;\r\n this.extensions = ExtensionManager.resolve(extensions);\r\n this.schema = getSchemaByResolvedExtensions(this.extensions);\r\n this.extensions.forEach(extension => {\r\n var _a;\r\n // store extension storage in editor\r\n this.editor.extensionStorage[extension.name] = extension.storage;\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n editor: this.editor,\r\n type: getSchemaTypeByName(extension.name, this.schema),\r\n };\r\n if (extension.type === 'mark') {\r\n const keepOnSplit = (_a = callOrReturn(getExtensionField(extension, 'keepOnSplit', context))) !== null && _a !== void 0 ? _a : true;\r\n if (keepOnSplit) {\r\n this.splittableMarks.push(extension.name);\r\n }\r\n }\r\n const onBeforeCreate = getExtensionField(extension, 'onBeforeCreate', context);\r\n if (onBeforeCreate) {\r\n this.editor.on('beforeCreate', onBeforeCreate);\r\n }\r\n const onCreate = getExtensionField(extension, 'onCreate', context);\r\n if (onCreate) {\r\n this.editor.on('create', onCreate);\r\n }\r\n const onUpdate = getExtensionField(extension, 'onUpdate', context);\r\n if (onUpdate) {\r\n this.editor.on('update', onUpdate);\r\n }\r\n const onSelectionUpdate = getExtensionField(extension, 'onSelectionUpdate', context);\r\n if (onSelectionUpdate) {\r\n this.editor.on('selectionUpdate', onSelectionUpdate);\r\n }\r\n const onTransaction = getExtensionField(extension, 'onTransaction', context);\r\n if (onTransaction) {\r\n this.editor.on('transaction', onTransaction);\r\n }\r\n const onFocus = getExtensionField(extension, 'onFocus', context);\r\n if (onFocus) {\r\n this.editor.on('focus', onFocus);\r\n }\r\n const onBlur = getExtensionField(extension, 'onBlur', context);\r\n if (onBlur) {\r\n this.editor.on('blur', onBlur);\r\n }\r\n const onDestroy = getExtensionField(extension, 'onDestroy', context);\r\n if (onDestroy) {\r\n this.editor.on('destroy', onDestroy);\r\n }\r\n });\r\n }\r\n static resolve(extensions) {\r\n const resolvedExtensions = ExtensionManager.sort(ExtensionManager.flatten(extensions));\r\n const duplicatedNames = findDuplicates(resolvedExtensions.map(extension => extension.name));\r\n if (duplicatedNames.length) {\r\n console.warn(`[tiptap warn]: Duplicate extension names found: [${duplicatedNames\r\n .map(item => `'${item}'`)\r\n .join(', ')}]. This can lead to issues.`);\r\n }\r\n return resolvedExtensions;\r\n }\r\n static flatten(extensions) {\r\n return (extensions\r\n .map(extension => {\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n const addExtensions = getExtensionField(extension, 'addExtensions', context);\r\n if (addExtensions) {\r\n return [extension, ...this.flatten(addExtensions())];\r\n }\r\n return extension;\r\n })\r\n // `Infinity` will break TypeScript so we set a number that is probably high enough\r\n .flat(10));\r\n }\r\n static sort(extensions) {\r\n const defaultPriority = 100;\r\n return extensions.sort((a, b) => {\r\n const priorityA = getExtensionField(a, 'priority') || defaultPriority;\r\n const priorityB = getExtensionField(b, 'priority') || defaultPriority;\r\n if (priorityA > priorityB) {\r\n return -1;\r\n }\r\n if (priorityA < priorityB) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n get commands() {\r\n return this.extensions.reduce((commands, extension) => {\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n editor: this.editor,\r\n type: getSchemaTypeByName(extension.name, this.schema),\r\n };\r\n const addCommands = getExtensionField(extension, 'addCommands', context);\r\n if (!addCommands) {\r\n return commands;\r\n }\r\n return {\r\n ...commands,\r\n ...addCommands(),\r\n };\r\n }, {});\r\n }\r\n get plugins() {\r\n const { editor } = this;\r\n // With ProseMirror, first plugins within an array are executed first.\r\n // In tiptap, we provide the ability to override plugins,\r\n // so it feels more natural to run plugins at the end of an array first.\r\n // That’s why we have to reverse the `extensions` array and sort again\r\n // based on the `priority` option.\r\n const extensions = ExtensionManager.sort([...this.extensions].reverse());\r\n const inputRules = [];\r\n const pasteRules = [];\r\n const allPlugins = extensions\r\n .map(extension => {\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n editor,\r\n type: getSchemaTypeByName(extension.name, this.schema),\r\n };\r\n const plugins = [];\r\n const addKeyboardShortcuts = getExtensionField(extension, 'addKeyboardShortcuts', context);\r\n let defaultBindings = {};\r\n // bind exit handling\r\n if (extension.type === 'mark' && extension.config.exitable) {\r\n defaultBindings.ArrowRight = () => Mark.handleExit({ editor, mark: extension });\r\n }\r\n if (addKeyboardShortcuts) {\r\n const bindings = Object.fromEntries(Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => {\r\n return [shortcut, () => method({ editor })];\r\n }));\r\n defaultBindings = { ...defaultBindings, ...bindings };\r\n }\r\n const keyMapPlugin = keymap(defaultBindings);\r\n plugins.push(keyMapPlugin);\r\n const addInputRules = getExtensionField(extension, 'addInputRules', context);\r\n if (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) {\r\n inputRules.push(...addInputRules());\r\n }\r\n const addPasteRules = getExtensionField(extension, 'addPasteRules', context);\r\n if (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) {\r\n pasteRules.push(...addPasteRules());\r\n }\r\n const addProseMirrorPlugins = getExtensionField(extension, 'addProseMirrorPlugins', context);\r\n if (addProseMirrorPlugins) {\r\n const proseMirrorPlugins = addProseMirrorPlugins();\r\n plugins.push(...proseMirrorPlugins);\r\n }\r\n return plugins;\r\n })\r\n .flat();\r\n return [\r\n inputRulesPlugin({\r\n editor,\r\n rules: inputRules,\r\n }),\r\n ...pasteRulesPlugin({\r\n editor,\r\n rules: pasteRules,\r\n }),\r\n ...allPlugins,\r\n ];\r\n }\r\n get attributes() {\r\n return getAttributesFromExtensions(this.extensions);\r\n }\r\n get nodeViews() {\r\n const { editor } = this;\r\n const { nodeExtensions } = splitExtensions(this.extensions);\r\n return Object.fromEntries(nodeExtensions\r\n .filter(extension => !!getExtensionField(extension, 'addNodeView'))\r\n .map(extension => {\r\n const extensionAttributes = this.attributes.filter(attribute => attribute.type === extension.name);\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n editor,\r\n type: getNodeType(extension.name, this.schema),\r\n };\r\n const addNodeView = getExtensionField(extension, 'addNodeView', context);\r\n if (!addNodeView) {\r\n return [];\r\n }\r\n const nodeview = (node, view, getPos, decorations) => {\r\n const HTMLAttributes = getRenderedAttributes(node, extensionAttributes);\r\n return addNodeView()({\r\n editor,\r\n node,\r\n getPos,\r\n decorations,\r\n HTMLAttributes,\r\n extension,\r\n });\r\n };\r\n return [extension.name, nodeview];\r\n }));\r\n }\r\n}\n\n// see: https://github.com/mesqueeb/is-what/blob/88d6e4ca92fb2baab6003c54e02eedf4e729e5ab/src/index.ts\r\nfunction getType(value) {\r\n return Object.prototype.toString.call(value).slice(8, -1);\r\n}\r\nfunction isPlainObject(value) {\r\n if (getType(value) !== 'Object') {\r\n return false;\r\n }\r\n return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype;\r\n}\n\nfunction mergeDeep(target, source) {\r\n const output = { ...target };\r\n if (isPlainObject(target) && isPlainObject(source)) {\r\n Object.keys(source).forEach(key => {\r\n if (isPlainObject(source[key])) {\r\n if (!(key in target)) {\r\n Object.assign(output, { [key]: source[key] });\r\n }\r\n else {\r\n output[key] = mergeDeep(target[key], source[key]);\r\n }\r\n }\r\n else {\r\n Object.assign(output, { [key]: source[key] });\r\n }\r\n });\r\n }\r\n return output;\r\n}\n\nclass Extension {\r\n constructor(config = {}) {\r\n this.type = 'extension';\r\n this.name = 'extension';\r\n this.parent = null;\r\n this.child = null;\r\n this.config = {\r\n name: this.name,\r\n defaultOptions: {},\r\n };\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n };\r\n this.name = this.config.name;\r\n if (config.defaultOptions) {\r\n console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`);\r\n }\r\n // TODO: remove `addOptions` fallback\r\n this.options = this.config.defaultOptions;\r\n if (this.config.addOptions) {\r\n this.options = callOrReturn(getExtensionField(this, 'addOptions', {\r\n name: this.name,\r\n }));\r\n }\r\n this.storage = callOrReturn(getExtensionField(this, 'addStorage', {\r\n name: this.name,\r\n options: this.options,\r\n })) || {};\r\n }\r\n static create(config = {}) {\r\n return new Extension(config);\r\n }\r\n configure(options = {}) {\r\n // return a new instance so we can use the same extension\r\n // with different calls of `configure`\r\n const extension = this.extend();\r\n extension.options = mergeDeep(this.options, options);\r\n extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\r\n name: extension.name,\r\n options: extension.options,\r\n }));\r\n return extension;\r\n }\r\n extend(extendedConfig = {}) {\r\n const extension = new Extension(extendedConfig);\r\n extension.parent = this;\r\n this.child = extension;\r\n extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name;\r\n if (extendedConfig.defaultOptions) {\r\n console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`);\r\n }\r\n extension.options = callOrReturn(getExtensionField(extension, 'addOptions', {\r\n name: extension.name,\r\n }));\r\n extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\r\n name: extension.name,\r\n options: extension.options,\r\n }));\r\n return extension;\r\n }\r\n}\n\nfunction getTextBetween(startNode, range, options) {\r\n const { from, to } = range;\r\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {};\r\n let text = '';\r\n let separated = true;\r\n startNode.nodesBetween(from, to, (node, pos, parent, index) => {\r\n var _a;\r\n const textSerializer = textSerializers === null || textSerializers === void 0 ? void 0 : textSerializers[node.type.name];\r\n if (textSerializer) {\r\n if (node.isBlock && !separated) {\r\n text += blockSeparator;\r\n separated = true;\r\n }\r\n if (parent) {\r\n text += textSerializer({\r\n node,\r\n pos,\r\n parent,\r\n index,\r\n range,\r\n });\r\n }\r\n }\r\n else if (node.isText) {\r\n text += (_a = node === null || node === void 0 ? void 0 : node.text) === null || _a === void 0 ? void 0 : _a.slice(Math.max(from, pos) - pos, to - pos); // eslint-disable-line\r\n separated = false;\r\n }\r\n else if (node.isBlock && !separated) {\r\n text += blockSeparator;\r\n separated = true;\r\n }\r\n });\r\n return text;\r\n}\n\nfunction getTextSerializersFromSchema(schema) {\r\n return Object.fromEntries(Object.entries(schema.nodes)\r\n .filter(([, node]) => node.spec.toText)\r\n .map(([name, node]) => [name, node.spec.toText]));\r\n}\n\nconst ClipboardTextSerializer = Extension.create({\r\n name: 'clipboardTextSerializer',\r\n addProseMirrorPlugins() {\r\n return [\r\n new Plugin({\r\n key: new PluginKey('clipboardTextSerializer'),\r\n props: {\r\n clipboardTextSerializer: () => {\r\n const { editor } = this;\r\n const { state, schema } = editor;\r\n const { doc, selection } = state;\r\n const { ranges } = selection;\r\n const from = Math.min(...ranges.map(range => range.$from.pos));\r\n const to = Math.max(...ranges.map(range => range.$to.pos));\r\n const textSerializers = getTextSerializersFromSchema(schema);\r\n const range = { from, to };\r\n return getTextBetween(doc, range, {\r\n textSerializers,\r\n });\r\n },\r\n },\r\n }),\r\n ];\r\n },\r\n});\n\nconst blur = () => ({ editor, view }) => {\r\n requestAnimationFrame(() => {\r\n var _a;\r\n if (!editor.isDestroyed) {\r\n view.dom.blur();\r\n // Browsers should remove the caret on blur but safari does not.\r\n // See: https://github.com/ueberdosis/tiptap/issues/2405\r\n (_a = window === null || window === void 0 ? void 0 : window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();\r\n }\r\n });\r\n return true;\r\n};\n\nconst clearContent = (emitUpdate = false) => ({ commands }) => {\r\n return commands.setContent('', emitUpdate);\r\n};\n\nconst clearNodes = () => ({ state, tr, dispatch }) => {\r\n const { selection } = tr;\r\n const { ranges } = selection;\r\n if (!dispatch) {\r\n return true;\r\n }\r\n ranges.forEach(({ $from, $to }) => {\r\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\r\n if (node.type.isText) {\r\n return;\r\n }\r\n const { doc, mapping } = tr;\r\n const $mappedFrom = doc.resolve(mapping.map(pos));\r\n const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize));\r\n const nodeRange = $mappedFrom.blockRange($mappedTo);\r\n if (!nodeRange) {\r\n return;\r\n }\r\n const targetLiftDepth = liftTarget(nodeRange);\r\n if (node.type.isTextblock) {\r\n const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index());\r\n tr.setNodeMarkup(nodeRange.start, defaultType);\r\n }\r\n if (targetLiftDepth || targetLiftDepth === 0) {\r\n tr.lift(nodeRange, targetLiftDepth);\r\n }\r\n });\r\n });\r\n return true;\r\n};\n\nconst command = fn => props => {\r\n return fn(props);\r\n};\n\nconst createParagraphNear = () => ({ state, dispatch }) => {\r\n return createParagraphNear$1(state, dispatch);\r\n};\n\nconst deleteCurrentNode = () => ({ tr, dispatch }) => {\r\n const { selection } = tr;\r\n const currentNode = selection.$anchor.node();\r\n // if there is content inside the current node, break out of this command\r\n if (currentNode.content.size > 0) {\r\n return false;\r\n }\r\n const $pos = tr.selection.$anchor;\r\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\r\n const node = $pos.node(depth);\r\n if (node.type === currentNode.type) {\r\n if (dispatch) {\r\n const from = $pos.before(depth);\r\n const to = $pos.after(depth);\r\n tr.delete(from, to).scrollIntoView();\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\n\nconst deleteNode = typeOrName => ({ tr, state, dispatch }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n const $pos = tr.selection.$anchor;\r\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\r\n const node = $pos.node(depth);\r\n if (node.type === type) {\r\n if (dispatch) {\r\n const from = $pos.before(depth);\r\n const to = $pos.after(depth);\r\n tr.delete(from, to).scrollIntoView();\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\n\nconst deleteRange = range => ({ tr, dispatch }) => {\r\n const { from, to } = range;\r\n if (dispatch) {\r\n tr.delete(from, to);\r\n }\r\n return true;\r\n};\n\nconst deleteSelection = () => ({ state, dispatch }) => {\r\n return deleteSelection$1(state, dispatch);\r\n};\n\nconst enter = () => ({ commands }) => {\r\n return commands.keyboardShortcut('Enter');\r\n};\n\nconst exitCode = () => ({ state, dispatch }) => {\r\n return exitCode$1(state, dispatch);\r\n};\n\n/**\r\n * Check if object1 includes object2\r\n * @param object1 Object\r\n * @param object2 Object\r\n */\r\nfunction objectIncludes(object1, object2, options = { strict: true }) {\r\n const keys = Object.keys(object2);\r\n if (!keys.length) {\r\n return true;\r\n }\r\n return keys.every(key => {\r\n if (options.strict) {\r\n return object2[key] === object1[key];\r\n }\r\n if (isRegExp(object2[key])) {\r\n return object2[key].test(object1[key]);\r\n }\r\n return object2[key] === object1[key];\r\n });\r\n}\n\nfunction findMarkInSet(marks, type, attributes = {}) {\r\n return marks.find(item => {\r\n return item.type === type && objectIncludes(item.attrs, attributes);\r\n });\r\n}\r\nfunction isMarkInSet(marks, type, attributes = {}) {\r\n return !!findMarkInSet(marks, type, attributes);\r\n}\r\nfunction getMarkRange($pos, type, attributes = {}) {\r\n if (!$pos || !type) {\r\n return;\r\n }\r\n let start = $pos.parent.childAfter($pos.parentOffset);\r\n if ($pos.parentOffset === start.offset && start.offset !== 0) {\r\n start = $pos.parent.childBefore($pos.parentOffset);\r\n }\r\n if (!start.node) {\r\n return;\r\n }\r\n const mark = findMarkInSet([...start.node.marks], type, attributes);\r\n if (!mark) {\r\n return;\r\n }\r\n let startIndex = start.index;\r\n let startPos = $pos.start() + start.offset;\r\n let endIndex = startIndex + 1;\r\n let endPos = startPos + start.node.nodeSize;\r\n findMarkInSet([...start.node.marks], type, attributes);\r\n while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) {\r\n startIndex -= 1;\r\n startPos -= $pos.parent.child(startIndex).nodeSize;\r\n }\r\n while (endIndex < $pos.parent.childCount\r\n && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)) {\r\n endPos += $pos.parent.child(endIndex).nodeSize;\r\n endIndex += 1;\r\n }\r\n return {\r\n from: startPos,\r\n to: endPos,\r\n };\r\n}\n\nfunction getMarkType(nameOrType, schema) {\r\n if (typeof nameOrType === 'string') {\r\n if (!schema.marks[nameOrType]) {\r\n throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`);\r\n }\r\n return schema.marks[nameOrType];\r\n }\r\n return nameOrType;\r\n}\n\nconst extendMarkRange = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\r\n const type = getMarkType(typeOrName, state.schema);\r\n const { doc, selection } = tr;\r\n const { $from, from, to } = selection;\r\n if (dispatch) {\r\n const range = getMarkRange($from, type, attributes);\r\n if (range && range.from <= from && range.to >= to) {\r\n const newSelection = TextSelection.create(doc, range.from, range.to);\r\n tr.setSelection(newSelection);\r\n }\r\n }\r\n return true;\r\n};\n\nconst first = commands => props => {\r\n const items = typeof commands === 'function'\r\n ? commands(props)\r\n : commands;\r\n for (let i = 0; i < items.length; i += 1) {\r\n if (items[i](props)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\n\nfunction isTextSelection(value) {\r\n return value instanceof TextSelection;\r\n}\n\nfunction minMax(value = 0, min = 0, max = 0) {\r\n return Math.min(Math.max(value, min), max);\r\n}\n\nfunction resolveFocusPosition(doc, position = null) {\r\n if (!position) {\r\n return null;\r\n }\r\n const selectionAtStart = Selection.atStart(doc);\r\n const selectionAtEnd = Selection.atEnd(doc);\r\n if (position === 'start' || position === true) {\r\n return selectionAtStart;\r\n }\r\n if (position === 'end') {\r\n return selectionAtEnd;\r\n }\r\n const minPos = selectionAtStart.from;\r\n const maxPos = selectionAtEnd.to;\r\n if (position === 'all') {\r\n return TextSelection.create(doc, minMax(0, minPos, maxPos), minMax(doc.content.size, minPos, maxPos));\r\n }\r\n return TextSelection.create(doc, minMax(position, minPos, maxPos), minMax(position, minPos, maxPos));\r\n}\n\nfunction isiOS() {\r\n return [\r\n 'iPad Simulator',\r\n 'iPhone Simulator',\r\n 'iPod Simulator',\r\n 'iPad',\r\n 'iPhone',\r\n 'iPod',\r\n ].includes(navigator.platform)\r\n // iPad on iOS 13 detection\r\n || (navigator.userAgent.includes('Mac') && 'ontouchend' in document);\r\n}\n\nconst focus = (position = null, options = {}) => ({ editor, view, tr, dispatch, }) => {\r\n options = {\r\n scrollIntoView: true,\r\n ...options,\r\n };\r\n const delayedFocus = () => {\r\n // focus within `requestAnimationFrame` breaks focus on iOS\r\n // so we have to call this\r\n if (isiOS()) {\r\n view.dom.focus();\r\n }\r\n // For React we have to focus asynchronously. Otherwise wild things happen.\r\n // see: https://github.com/ueberdosis/tiptap/issues/1520\r\n requestAnimationFrame(() => {\r\n if (!editor.isDestroyed) {\r\n view.focus();\r\n if (options === null || options === void 0 ? void 0 : options.scrollIntoView) {\r\n editor.commands.scrollIntoView();\r\n }\r\n }\r\n });\r\n };\r\n if ((view.hasFocus() && position === null) || position === false) {\r\n return true;\r\n }\r\n // we don’t try to resolve a NodeSelection or CellSelection\r\n if (dispatch && position === null && !isTextSelection(editor.state.selection)) {\r\n delayedFocus();\r\n return true;\r\n }\r\n // pass through tr.doc instead of editor.state.doc\r\n // since transactions could change the editors state before this command has been run\r\n const selection = resolveFocusPosition(tr.doc, position) || editor.state.selection;\r\n const isSameSelection = editor.state.selection.eq(selection);\r\n if (dispatch) {\r\n if (!isSameSelection) {\r\n tr.setSelection(selection);\r\n }\r\n // `tr.setSelection` resets the stored marks\r\n // so we’ll restore them if the selection is the same as before\r\n if (isSameSelection && tr.storedMarks) {\r\n tr.setStoredMarks(tr.storedMarks);\r\n }\r\n delayedFocus();\r\n }\r\n return true;\r\n};\n\nconst forEach = (items, fn) => props => {\r\n return items.every((item, index) => fn(item, { ...props, index }));\r\n};\n\nconst insertContent = (value, options) => ({ tr, commands }) => {\r\n return commands.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options);\r\n};\n\nfunction elementFromString(value) {\r\n // add a wrapper to preserve leading and trailing whitespace\r\n const wrappedValue = `<body>${value}</body>`;\r\n return new window.DOMParser().parseFromString(wrappedValue, 'text/html').body;\r\n}\n\nfunction createNodeFromContent(content, schema, options) {\r\n options = {\r\n slice: true,\r\n parseOptions: {},\r\n ...options,\r\n };\r\n if (typeof content === 'object' && content !== null) {\r\n try {\r\n if (Array.isArray(content)) {\r\n return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)));\r\n }\r\n return schema.nodeFromJSON(content);\r\n }\r\n catch (error) {\r\n console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error);\r\n return createNodeFromContent('', schema, options);\r\n }\r\n }\r\n if (typeof content === 'string') {\r\n const parser = DOMParser.fromSchema(schema);\r\n return options.slice\r\n ? parser.parseSlice(elementFromString(content), options.parseOptions).content\r\n : parser.parse(elementFromString(content), options.parseOptions);\r\n }\r\n return createNodeFromContent('', schema, options);\r\n}\n\n// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466\r\nfunction selectionToInsertionEnd(tr, startLen, bias) {\r\n const last = tr.steps.length - 1;\r\n if (last < startLen) {\r\n return;\r\n }\r\n const step = tr.steps[last];\r\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\r\n return;\r\n }\r\n const map = tr.mapping.maps[last];\r\n let end = 0;\r\n map.forEach((_from, _to, _newFrom, newTo) => {\r\n if (end === 0) {\r\n end = newTo;\r\n }\r\n });\r\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\r\n}\n\nconst isFragment = (nodeOrFragment) => {\r\n return nodeOrFragment.toString().startsWith('<');\r\n};\r\nconst insertContentAt = (position, value, options) => ({ tr, dispatch, editor }) => {\r\n if (dispatch) {\r\n options = {\r\n parseOptions: {},\r\n updateSelection: true,\r\n ...options,\r\n };\r\n const content = createNodeFromContent(value, editor.schema, {\r\n parseOptions: {\r\n preserveWhitespace: 'full',\r\n ...options.parseOptions,\r\n },\r\n });\r\n // don’t dispatch an empty fragment because this can lead to strange errors\r\n if (content.toString() === '<>') {\r\n return true;\r\n }\r\n let { from, to } = typeof position === 'number' ? { from: position, to: position } : position;\r\n let isOnlyTextContent = true;\r\n let isOnlyBlockContent = true;\r\n const nodes = isFragment(content) ? content : [content];\r\n nodes.forEach(node => {\r\n // check if added node is valid\r\n node.check();\r\n isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false;\r\n isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false;\r\n });\r\n // check if we can replace the wrapping node by\r\n // the newly inserted content\r\n // example:\r\n // replace an empty paragraph by an inserted image\r\n // instead of inserting the image below the paragraph\r\n if (from === to && isOnlyBlockContent) {\r\n const { parent } = tr.doc.resolve(from);\r\n const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount;\r\n if (isEmptyTextBlock) {\r\n from -= 1;\r\n to += 1;\r\n }\r\n }\r\n // if there is only plain text we have to use `insertText`\r\n // because this will keep the current marks\r\n if (isOnlyTextContent) {\r\n tr.insertText(value, from, to);\r\n }\r\n else {\r\n tr.replaceWith(from, to, content);\r\n }\r\n // set cursor at end of inserted content\r\n if (options.updateSelection) {\r\n selectionToInsertionEnd(tr, tr.steps.length - 1, -1);\r\n }\r\n }\r\n return true;\r\n};\n\nconst joinUp = () => ({ state, dispatch }) => {\r\n return joinUp$1(state, dispatch);\r\n};\r\nconst joinDown = () => ({ state, dispatch }) => {\r\n return joinDown$1(state, dispatch);\r\n};\r\nconst joinBackward = () => ({ state, dispatch }) => {\r\n return joinBackward$1(state, dispatch);\r\n};\r\nconst joinForward = () => ({ state, dispatch }) => {\r\n return joinForward$1(state, dispatch);\r\n};\n\nfunction isMacOS() {\r\n return typeof navigator !== 'undefined'\r\n ? /Mac/.test(navigator.platform)\r\n : false;\r\n}\n\nfunction normalizeKeyName(name) {\r\n const parts = name.split(/-(?!$)/);\r\n let result = parts[parts.length - 1];\r\n if (result === 'Space') {\r\n result = ' ';\r\n }\r\n let alt;\r\n let ctrl;\r\n let shift;\r\n let meta;\r\n for (let i = 0; i < parts.length - 1; i += 1) {\r\n const mod = parts[i];\r\n if (/^(cmd|meta|m)$/i.test(mod)) {\r\n meta = true;\r\n }\r\n else if (/^a(lt)?$/i.test(mod)) {\r\n alt = true;\r\n }\r\n else if (/^(c|ctrl|control)$/i.test(mod)) {\r\n ctrl = true;\r\n }\r\n else if (/^s(hift)?$/i.test(mod)) {\r\n shift = true;\r\n }\r\n else if (/^mod$/i.test(mod)) {\r\n if (isiOS() || isMacOS()) {\r\n meta = true;\r\n }\r\n else {\r\n ctrl = true;\r\n }\r\n }\r\n else {\r\n throw new Error(`Unrecognized modifier name: ${mod}`);\r\n }\r\n }\r\n if (alt) {\r\n result = `Alt-${result}`;\r\n }\r\n if (ctrl) {\r\n result = `Ctrl-${result}`;\r\n }\r\n if (meta) {\r\n result = `Meta-${result}`;\r\n }\r\n if (shift) {\r\n result = `Shift-${result}`;\r\n }\r\n return result;\r\n}\r\nconst keyboardShortcut = name => ({ editor, view, tr, dispatch, }) => {\r\n const keys = normalizeKeyName(name).split(/-(?!$)/);\r\n const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item));\r\n const event = new KeyboardEvent('keydown', {\r\n key: key === 'Space'\r\n ? ' '\r\n : key,\r\n altKey: keys.includes('Alt'),\r\n ctrlKey: keys.includes('Ctrl'),\r\n metaKey: keys.includes('Meta'),\r\n shiftKey: keys.includes('Shift'),\r\n bubbles: true,\r\n cancelable: true,\r\n });\r\n const capturedTransaction = editor.captureTransaction(() => {\r\n view.someProp('handleKeyDown', f => f(view, event));\r\n });\r\n capturedTransaction === null || capturedTransaction === void 0 ? void 0 : capturedTransaction.steps.forEach(step => {\r\n const newStep = step.map(tr.mapping);\r\n if (newStep && dispatch) {\r\n tr.maybeStep(newStep);\r\n }\r\n });\r\n return true;\r\n};\n\nfunction isNodeActive(state, typeOrName, attributes = {}) {\r\n const { from, to, empty } = state.selection;\r\n const type = typeOrName ? getNodeType(typeOrName, state.schema) : null;\r\n const nodeRanges = [];\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (node.isText) {\r\n return;\r\n }\r\n const relativeFrom = Math.max(from, pos);\r\n const relativeTo = Math.min(to, pos + node.nodeSize);\r\n nodeRanges.push({\r\n node,\r\n from: relativeFrom,\r\n to: relativeTo,\r\n });\r\n });\r\n const selectionRange = to - from;\r\n const matchedNodeRanges = nodeRanges\r\n .filter(nodeRange => {\r\n if (!type) {\r\n return true;\r\n }\r\n return type.name === nodeRange.node.type.name;\r\n })\r\n .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }));\r\n if (empty) {\r\n return !!matchedNodeRanges.length;\r\n }\r\n const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0);\r\n return range >= selectionRange;\r\n}\n\nconst lift = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n const isActive = isNodeActive(state, type, attributes);\r\n if (!isActive) {\r\n return false;\r\n }\r\n return lift$1(state, dispatch);\r\n};\n\nconst liftEmptyBlock = () => ({ state, dispatch }) => {\r\n return liftEmptyBlock$1(state, dispatch);\r\n};\n\nconst liftListItem = typeOrName => ({ state, dispatch }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n return liftListItem$1(type)(state, dispatch);\r\n};\n\nconst newlineInCode = () => ({ state, dispatch }) => {\r\n return newlineInCode$1(state, dispatch);\r\n};\n\nfunction getSchemaTypeNameByName(name, schema) {\r\n if (schema.nodes[name]) {\r\n return 'node';\r\n }\r\n if (schema.marks[name]) {\r\n return 'mark';\r\n }\r\n return null;\r\n}\n\n/**\r\n * Remove a property or an array of properties from an object\r\n * @param obj Object\r\n * @param key Key to remove\r\n */\r\nfunction deleteProps(obj, propOrProps) {\r\n const props = typeof propOrProps === 'string'\r\n ? [propOrProps]\r\n : propOrProps;\r\n return Object\r\n .keys(obj)\r\n .reduce((newObj, prop) => {\r\n if (!props.includes(prop)) {\r\n newObj[prop] = obj[prop];\r\n }\r\n return newObj;\r\n }, {});\r\n}\n\nconst resetAttributes = (typeOrName, attributes) => ({ tr, state, dispatch }) => {\r\n let nodeType = null;\r\n let markType = null;\r\n const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);\r\n if (!schemaType) {\r\n return false;\r\n }\r\n if (schemaType === 'node') {\r\n nodeType = getNodeType(typeOrName, state.schema);\r\n }\r\n if (schemaType === 'mark') {\r\n markType = getMarkType(typeOrName, state.schema);\r\n }\r\n if (dispatch) {\r\n tr.selection.ranges.forEach(range => {\r\n state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\r\n if (nodeType && nodeType === node.type) {\r\n tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes));\r\n }\r\n if (markType && node.marks.length) {\r\n node.marks.forEach(mark => {\r\n if (markType === mark.type) {\r\n tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)));\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n return true;\r\n};\n\nconst scrollIntoView = () => ({ tr, dispatch }) => {\r\n if (dispatch) {\r\n tr.scrollIntoView();\r\n }\r\n return true;\r\n};\n\nconst selectAll = () => ({ tr, commands }) => {\r\n return commands.setTextSelection({\r\n from: 0,\r\n to: tr.doc.content.size,\r\n });\r\n};\n\nconst selectNodeBackward = () => ({ state, dispatch }) => {\r\n return selectNodeBackward$1(state, dispatch);\r\n};\n\nconst selectNodeForward = () => ({ state, dispatch }) => {\r\n return selectNodeForward$1(state, dispatch);\r\n};\n\nconst selectParentNode = () => ({ state, dispatch }) => {\r\n return selectParentNode$1(state, dispatch);\r\n};\n\n// @ts-ignore\r\nconst selectTextblockEnd = () => ({ state, dispatch }) => {\r\n return selectTextblockEnd$1(state, dispatch);\r\n};\n\n// @ts-ignore\r\nconst selectTextblockStart = () => ({ state, dispatch }) => {\r\n return selectTextblockStart$1(state, dispatch);\r\n};\n\nfunction createDocument(content, schema, parseOptions = {}) {\r\n return createNodeFromContent(content, schema, { slice: false, parseOptions });\r\n}\n\nconst setContent = (content, emitUpdate = false, parseOptions = {}) => ({ tr, editor, dispatch }) => {\r\n const { doc } = tr;\r\n const document = createDocument(content, editor.schema, parseOptions);\r\n if (dispatch) {\r\n tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate);\r\n }\r\n return true;\r\n};\n\n/**\r\n * Returns a new `Transform` based on all steps of the passed transactions.\r\n */\r\nfunction combineTransactionSteps(oldDoc, transactions) {\r\n const transform = new Transform(oldDoc);\r\n transactions.forEach(transaction => {\r\n transaction.steps.forEach(step => {\r\n transform.step(step);\r\n });\r\n });\r\n return transform;\r\n}\n\nfunction defaultBlockAt(match) {\r\n for (let i = 0; i < match.edgeCount; i += 1) {\r\n const { type } = match.edge(i);\r\n if (type.isTextblock && !type.hasRequiredAttrs()) {\r\n return type;\r\n }\r\n }\r\n return null;\r\n}\n\nfunction findChildren(node, predicate) {\r\n const nodesWithPos = [];\r\n node.descendants((child, pos) => {\r\n if (predicate(child)) {\r\n nodesWithPos.push({\r\n node: child,\r\n pos,\r\n });\r\n }\r\n });\r\n return nodesWithPos;\r\n}\n\n/**\r\n * Same as `findChildren` but searches only within a `range`.\r\n */\r\nfunction findChildrenInRange(node, range, predicate) {\r\n const nodesWithPos = [];\r\n // if (range.from === range.to) {\r\n // const nodeAt = node.nodeAt(range.from)\r\n // if (nodeAt) {\r\n // nodesWithPos.push({\r\n // node: nodeAt,\r\n // pos: range.from,\r\n // })\r\n // }\r\n // }\r\n node.nodesBetween(range.from, range.to, (child, pos) => {\r\n if (predicate(child)) {\r\n nodesWithPos.push({\r\n node: child,\r\n pos,\r\n });\r\n }\r\n });\r\n return nodesWithPos;\r\n}\n\nfunction findParentNodeClosestToPos($pos, predicate) {\r\n for (let i = $pos.depth; i > 0; i -= 1) {\r\n const node = $pos.node(i);\r\n if (predicate(node)) {\r\n return {\r\n pos: i > 0 ? $pos.before(i) : 0,\r\n start: $pos.start(i),\r\n depth: i,\r\n node,\r\n };\r\n }\r\n }\r\n}\n\nfunction findParentNode(predicate) {\r\n return (selection) => findParentNodeClosestToPos(selection.$from, predicate);\r\n}\n\nfunction getHTMLFromFragment(fragment, schema) {\r\n const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment);\r\n const temporaryDocument = document.implementation.createHTMLDocument();\r\n const container = temporaryDocument.createElement('div');\r\n container.appendChild(documentFragment);\r\n return container.innerHTML;\r\n}\n\nfunction getSchema(extensions) {\r\n const resolvedExtensions = ExtensionManager.resolve(extensions);\r\n return getSchemaByResolvedExtensions(resolvedExtensions);\r\n}\n\nfunction generateHTML(doc, extensions) {\r\n const schema = getSchema(extensions);\r\n const contentNode = Node$1.fromJSON(schema, doc);\r\n return getHTMLFromFragment(contentNode.content, schema);\r\n}\n\nfunction generateJSON(html, extensions) {\r\n const schema = getSchema(extensions);\r\n const dom = elementFromString(html);\r\n return DOMParser.fromSchema(schema).parse(dom).toJSON();\r\n}\n\nfunction getText(node, options) {\r\n const range = {\r\n from: 0,\r\n to: node.content.size,\r\n };\r\n return getTextBetween(node, range, options);\r\n}\n\nfunction generateText(doc, extensions, options) {\r\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {};\r\n const schema = getSchema(extensions);\r\n const contentNode = Node$1.fromJSON(schema, doc);\r\n return getText(contentNode, {\r\n blockSeparator,\r\n textSerializers: {\r\n ...getTextSerializersFromSchema(schema),\r\n ...textSerializers,\r\n },\r\n });\r\n}\n\nfunction getMarkAttributes(state, typeOrName) {\r\n const type = getMarkType(typeOrName, state.schema);\r\n const { from, to, empty } = state.selection;\r\n const marks = [];\r\n if (empty) {\r\n if (state.storedMarks) {\r\n marks.push(...state.storedMarks);\r\n }\r\n marks.push(...state.selection.$head.marks());\r\n }\r\n else {\r\n state.doc.nodesBetween(from, to, node => {\r\n marks.push(...node.marks);\r\n });\r\n }\r\n const mark = marks.find(markItem => markItem.type.name === type.name);\r\n if (!mark) {\r\n return {};\r\n }\r\n return { ...mark.attrs };\r\n}\n\nfunction getNodeAttributes(state, typeOrName) {\r\n const type = getNodeType(typeOrName, state.schema);\r\n const { from, to } = state.selection;\r\n const nodes = [];\r\n state.doc.nodesBetween(from, to, node => {\r\n nodes.push(node);\r\n });\r\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\r\n if (!node) {\r\n return {};\r\n }\r\n return { ...node.attrs };\r\n}\n\nfunction getAttributes(state, typeOrName) {\r\n const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);\r\n if (schemaType === 'node') {\r\n return getNodeAttributes(state, typeOrName);\r\n }\r\n if (schemaType === 'mark') {\r\n return getMarkAttributes(state, typeOrName);\r\n }\r\n return {};\r\n}\n\n/**\r\n * Removes duplicated values within an array.\r\n * Supports numbers, strings and objects.\r\n */\r\nfunction removeDuplicates(array, by = JSON.stringify) {\r\n const seen = {};\r\n return array.filter(item => {\r\n const key = by(item);\r\n return Object.prototype.hasOwnProperty.call(seen, key)\r\n ? false\r\n : (seen[key] = true);\r\n });\r\n}\n\n/**\r\n * Removes duplicated ranges and ranges that are\r\n * fully captured by other ranges.\r\n */\r\nfunction simplifyChangedRanges(changes) {\r\n const uniqueChanges = removeDuplicates(changes);\r\n return uniqueChanges.length === 1\r\n ? uniqueChanges\r\n : uniqueChanges.filter((change, index) => {\r\n const rest = uniqueChanges.filter((_, i) => i !== index);\r\n return !rest.some(otherChange => {\r\n return change.oldRange.from >= otherChange.oldRange.from\r\n && change.oldRange.to <= otherChange.oldRange.to\r\n && change.newRange.from >= otherChange.newRange.from\r\n && change.newRange.to <= otherChange.newRange.to;\r\n });\r\n });\r\n}\r\n/**\r\n * Returns a list of changed ranges\r\n * based on the first and last state of all steps.\r\n */\r\nfunction getChangedRanges(transform) {\r\n const { mapping, steps } = transform;\r\n const changes = [];\r\n mapping.maps.forEach((stepMap, index) => {\r\n const ranges = [];\r\n // This accounts for step changes where no range was actually altered\r\n // e.g. when setting a mark, node attribute, etc.\r\n // @ts-ignore\r\n if (!stepMap.ranges.length) {\r\n const { from, to } = steps[index];\r\n if (from === undefined || to === undefined) {\r\n return;\r\n }\r\n ranges.push({ from, to });\r\n }\r\n else {\r\n stepMap.forEach((from, to) => {\r\n ranges.push({ from, to });\r\n });\r\n }\r\n ranges.forEach(({ from, to }) => {\r\n const newStart = mapping.slice(index).map(from, -1);\r\n const newEnd = mapping.slice(index).map(to);\r\n const oldStart = mapping.invert().map(newStart, -1);\r\n const oldEnd = mapping.invert().map(newEnd);\r\n changes.push({\r\n oldRange: {\r\n from: oldStart,\r\n to: oldEnd,\r\n },\r\n newRange: {\r\n from: newStart,\r\n to: newEnd,\r\n },\r\n });\r\n });\r\n });\r\n return simplifyChangedRanges(changes);\r\n}\n\nfunction getDebugJSON(node, startOffset = 0) {\r\n const isTopNode = node.type === node.type.schema.topNodeType;\r\n const increment = isTopNode ? 0 : 1;\r\n const from = startOffset;\r\n const to = from + node.nodeSize;\r\n const marks = node.marks.map(mark => {\r\n const output = {\r\n type: mark.type.name,\r\n };\r\n if (Object.keys(mark.attrs).length) {\r\n output.attrs = { ...mark.attrs };\r\n }\r\n return output;\r\n });\r\n const attrs = { ...node.attrs };\r\n const output = {\r\n type: node.type.name,\r\n from,\r\n to,\r\n };\r\n if (Object.keys(attrs).length) {\r\n output.attrs = attrs;\r\n }\r\n if (marks.length) {\r\n output.marks = marks;\r\n }\r\n if (node.content.childCount) {\r\n output.content = [];\r\n node.forEach((child, offset) => {\r\n var _a;\r\n (_a = output.content) === null || _a === void 0 ? void 0 : _a.push(getDebugJSON(child, startOffset + offset + increment));\r\n });\r\n }\r\n if (node.text) {\r\n output.text = node.text;\r\n }\r\n return output;\r\n}\n\nfunction getMarksBetween(from, to, doc) {\r\n const marks = [];\r\n // get all inclusive marks on empty selection\r\n if (from === to) {\r\n doc\r\n .resolve(from)\r\n .marks()\r\n .forEach(mark => {\r\n const $pos = doc.resolve(from - 1);\r\n const range = getMarkRange($pos, mark.type);\r\n if (!range) {\r\n return;\r\n }\r\n marks.push({\r\n mark,\r\n ...range,\r\n });\r\n });\r\n }\r\n else {\r\n doc.nodesBetween(from, to, (node, pos) => {\r\n marks.push(...node.marks.map(mark => ({\r\n from: pos,\r\n to: pos + node.nodeSize,\r\n mark,\r\n })));\r\n });\r\n }\r\n return marks;\r\n}\n\nfunction isMarkActive(state, typeOrName, attributes = {}) {\r\n const { empty, ranges } = state.selection;\r\n const type = typeOrName ? getMarkType(typeOrName, state.schema) : null;\r\n if (empty) {\r\n return !!(state.storedMarks || state.selection.$from.marks())\r\n .filter(mark => {\r\n if (!type) {\r\n return true;\r\n }\r\n return type.name === mark.type.name;\r\n })\r\n .find(mark => objectIncludes(mark.attrs, attributes, { strict: false }));\r\n }\r\n let selectionRange = 0;\r\n const markRanges = [];\r\n ranges.forEach(({ $from, $to }) => {\r\n const from = $from.pos;\r\n const to = $to.pos;\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (!node.isText && !node.marks.length) {\r\n return;\r\n }\r\n const relativeFrom = Math.max(from, pos);\r\n const relativeTo = Math.min(to, pos + node.nodeSize);\r\n const range = relativeTo - relativeFrom;\r\n selectionRange += range;\r\n markRanges.push(...node.marks.map(mark => ({\r\n mark,\r\n from: relativeFrom,\r\n to: relativeTo,\r\n })));\r\n });\r\n });\r\n if (selectionRange === 0) {\r\n return false;\r\n }\r\n // calculate range of matched mark\r\n const matchedRange = markRanges\r\n .filter(markRange => {\r\n if (!type) {\r\n return true;\r\n }\r\n return type.name === markRange.mark.type.name;\r\n })\r\n .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))\r\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\r\n // calculate range of marks that excludes the searched mark\r\n // for example `code` doesn’t allow any other marks\r\n const excludedRange = markRanges\r\n .filter(markRange => {\r\n if (!type) {\r\n return true;\r\n }\r\n return markRange.mark.type !== type && markRange.mark.type.excludes(type);\r\n })\r\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\r\n // we only include the result of `excludedRange`\r\n // if there is a match at all\r\n const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange;\r\n return range >= selectionRange;\r\n}\n\nfunction isActive(state, name, attributes = {}) {\r\n if (!name) {\r\n return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes);\r\n }\r\n const schemaType = getSchemaTypeNameByName(name, state.schema);\r\n if (schemaType === 'node') {\r\n return isNodeActive(state, name, attributes);\r\n }\r\n if (schemaType === 'mark') {\r\n return isMarkActive(state, name, attributes);\r\n }\r\n return false;\r\n}\n\nfunction isList(name, extensions) {\r\n const { nodeExtensions } = splitExtensions(extensions);\r\n const extension = nodeExtensions.find(item => item.name === name);\r\n if (!extension) {\r\n return false;\r\n }\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n const group = callOrReturn(getExtensionField(extension, 'group', context));\r\n if (typeof group !== 'string') {\r\n return false;\r\n }\r\n return group.split(' ').includes('list');\r\n}\n\nfunction isNodeEmpty(node) {\r\n var _a;\r\n const defaultContent = (_a = node.type.createAndFill()) === null || _a === void 0 ? void 0 : _a.toJSON();\r\n const content = node.toJSON();\r\n return JSON.stringify(defaultContent) === JSON.stringify(content);\r\n}\n\nfunction isNodeSelection(value) {\r\n return value instanceof NodeSelection;\r\n}\n\nfunction posToDOMRect(view, from, to) {\r\n const minPos = 0;\r\n const maxPos = view.state.doc.content.size;\r\n const resolvedFrom = minMax(from, minPos, maxPos);\r\n const resolvedEnd = minMax(to, minPos, maxPos);\r\n const start = view.coordsAtPos(resolvedFrom);\r\n const end = view.coordsAtPos(resolvedEnd, -1);\r\n const top = Math.min(start.top, end.top);\r\n const bottom = Math.max(start.bottom, end.bottom);\r\n const left = Math.min(start.left, end.left);\r\n const right = Math.max(start.right, end.right);\r\n const width = right - left;\r\n const height = bottom - top;\r\n const x = left;\r\n const y = top;\r\n const data = {\r\n top,\r\n bottom,\r\n left,\r\n right,\r\n width,\r\n height,\r\n x,\r\n y,\r\n };\r\n return {\r\n ...data,\r\n toJSON: () => data,\r\n };\r\n}\n\nfunction canSetMark(state, tr, newMarkType) {\r\n var _a;\r\n const { selection } = tr;\r\n let cursor = null;\r\n if (isTextSelection(selection)) {\r\n cursor = selection.$cursor;\r\n }\r\n if (cursor) {\r\n const currentMarks = (_a = state.storedMarks) !== null && _a !== void 0 ? _a : cursor.marks();\r\n // There can be no current marks that exclude the new mark\r\n return (!!newMarkType.isInSet(currentMarks)\r\n || !currentMarks.some(mark => mark.type.excludes(newMarkType)));\r\n }\r\n const { ranges } = selection;\r\n return ranges.some(({ $from, $to }) => {\r\n let someNodeSupportsMark = $from.depth === 0\r\n ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)\r\n : false;\r\n state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\r\n // If we already found a mark that we can enable, return false to bypass the remaining search\r\n if (someNodeSupportsMark) {\r\n return false;\r\n }\r\n if (node.isInline) {\r\n const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType);\r\n const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks)\r\n || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType));\r\n someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType;\r\n }\r\n return !someNodeSupportsMark;\r\n });\r\n return someNodeSupportsMark;\r\n });\r\n}\r\nconst setMark = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\r\n const { selection } = tr;\r\n const { empty, ranges } = selection;\r\n const type = getMarkType(typeOrName, state.schema);\r\n if (dispatch) {\r\n if (empty) {\r\n const oldAttributes = getMarkAttributes(state, type);\r\n tr.addStoredMark(type.create({\r\n ...oldAttributes,\r\n ...attributes,\r\n }));\r\n }\r\n else {\r\n ranges.forEach(range => {\r\n const from = range.$from.pos;\r\n const to = range.$to.pos;\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n const trimmedFrom = Math.max(pos, from);\r\n const trimmedTo = Math.min(pos + node.nodeSize, to);\r\n const someHasMark = node.marks.find(mark => mark.type === type);\r\n // if there is already a mark of this type\r\n // we know that we have to merge its attributes\r\n // otherwise we add a fresh new mark\r\n if (someHasMark) {\r\n node.marks.forEach(mark => {\r\n if (type === mark.type) {\r\n tr.addMark(trimmedFrom, trimmedTo, type.create({\r\n ...mark.attrs,\r\n ...attributes,\r\n }));\r\n }\r\n });\r\n }\r\n else {\r\n tr.addMark(trimmedFrom, trimmedTo, type.create(attributes));\r\n }\r\n });\r\n });\r\n }\r\n }\r\n return canSetMark(state, tr, type);\r\n};\n\nconst setMeta = (key, value) => ({ tr }) => {\r\n tr.setMeta(key, value);\r\n return true;\r\n};\n\nconst setNode = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n // TODO: use a fallback like insertContent?\r\n if (!type.isTextblock) {\r\n console.warn('[tiptap warn]: Currently \"setNode()\" only supports text block nodes.');\r\n return false;\r\n }\r\n return (chain()\r\n // try to convert node to default node if needed\r\n .command(({ commands }) => {\r\n const canSetBlock = setBlockType(type, attributes)(state);\r\n if (canSetBlock) {\r\n return true;\r\n }\r\n return commands.clearNodes();\r\n })\r\n .command(({ state: updatedState }) => {\r\n return setBlockType(type, attributes)(updatedState, dispatch);\r\n })\r\n .run());\r\n};\n\nconst setNodeSelection = position => ({ tr, dispatch }) => {\r\n if (dispatch) {\r\n const { doc } = tr;\r\n const from = minMax(position, 0, doc.content.size);\r\n const selection = NodeSelection.create(doc, from);\r\n tr.setSelection(selection);\r\n }\r\n return true;\r\n};\n\nconst setTextSelection = position => ({ tr, dispatch }) => {\r\n if (dispatch) {\r\n const { doc } = tr;\r\n const { from, to } = typeof position === 'number' ? { from: position, to: position } : position;\r\n const minPos = TextSelection.atStart(doc).from;\r\n const maxPos = TextSelection.atEnd(doc).to;\r\n const resolvedFrom = minMax(from, minPos, maxPos);\r\n const resolvedEnd = minMax(to, minPos, maxPos);\r\n const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd);\r\n tr.setSelection(selection);\r\n }\r\n return true;\r\n};\n\nconst sinkListItem = typeOrName => ({ state, dispatch }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n return sinkListItem$1(type)(state, dispatch);\r\n};\n\nfunction getSplittedAttributes(extensionAttributes, typeName, attributes) {\r\n return Object.fromEntries(Object\r\n .entries(attributes)\r\n .filter(([name]) => {\r\n const extensionAttribute = extensionAttributes.find(item => {\r\n return item.type === typeName && item.name === name;\r\n });\r\n if (!extensionAttribute) {\r\n return false;\r\n }\r\n return extensionAttribute.attribute.keepOnSplit;\r\n }));\r\n}\n\nfunction ensureMarks(state, splittableMarks) {\r\n const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\r\n if (marks) {\r\n const filteredMarks = marks.filter(mark => splittableMarks === null || splittableMarks === void 0 ? void 0 : splittableMarks.includes(mark.type.name));\r\n state.tr.ensureMarks(filteredMarks);\r\n }\r\n}\r\nconst splitBlock = ({ keepMarks = true } = {}) => ({ tr, state, dispatch, editor, }) => {\r\n const { selection, doc } = tr;\r\n const { $from, $to } = selection;\r\n const extensionAttributes = editor.extensionManager.attributes;\r\n const newAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\r\n if (selection instanceof NodeSelection && selection.node.isBlock) {\r\n if (!$from.parentOffset || !canSplit(doc, $from.pos)) {\r\n return false;\r\n }\r\n if (dispatch) {\r\n if (keepMarks) {\r\n ensureMarks(state, editor.extensionManager.splittableMarks);\r\n }\r\n tr.split($from.pos).scrollIntoView();\r\n }\r\n return true;\r\n }\r\n if (!$from.parent.isBlock) {\r\n return false;\r\n }\r\n if (dispatch) {\r\n const atEnd = $to.parentOffset === $to.parent.content.size;\r\n if (selection instanceof TextSelection) {\r\n tr.deleteSelection();\r\n }\r\n const deflt = $from.depth === 0\r\n ? undefined\r\n : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\r\n let types = atEnd && deflt\r\n ? [\r\n {\r\n type: deflt,\r\n attrs: newAttributes,\r\n },\r\n ]\r\n : undefined;\r\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\r\n if (!types\r\n && !can\r\n && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)) {\r\n can = true;\r\n types = deflt\r\n ? [\r\n {\r\n type: deflt,\r\n attrs: newAttributes,\r\n },\r\n ]\r\n : undefined;\r\n }\r\n if (can) {\r\n tr.split(tr.mapping.map($from.pos), 1, types);\r\n if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\r\n const first = tr.mapping.map($from.before());\r\n const $first = tr.doc.resolve(first);\r\n if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {\r\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\r\n }\r\n }\r\n }\r\n if (keepMarks) {\r\n ensureMarks(state, editor.extensionManager.splittableMarks);\r\n }\r\n tr.scrollIntoView();\r\n }\r\n return true;\r\n};\n\nconst splitListItem = typeOrName => ({ tr, state, dispatch, editor, }) => {\r\n var _a;\r\n const type = getNodeType(typeOrName, state.schema);\r\n const { $from, $to } = state.selection;\r\n // @ts-ignore\r\n // eslint-disable-next-line\r\n const node = state.selection.node;\r\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\r\n return false;\r\n }\r\n const grandParent = $from.node(-1);\r\n if (grandParent.type !== type) {\r\n return false;\r\n }\r\n const extensionAttributes = editor.extensionManager.attributes;\r\n if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\r\n // In an empty block. If this is a nested list, the wrapping\r\n // list item should be split. Otherwise, bail out and let next\r\n // command handle lifting.\r\n if ($from.depth === 2\r\n || $from.node(-3).type !== type\r\n || $from.index(-2) !== $from.node(-2).childCount - 1) {\r\n return false;\r\n }\r\n if (dispatch) {\r\n let wrap = Fragment.empty;\r\n // eslint-disable-next-line\r\n const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\r\n // Build a fragment containing empty versions of the structure\r\n // from the outer list item to the parent node of the cursor\r\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {\r\n wrap = Fragment.from($from.node(d).copy(wrap));\r\n }\r\n // eslint-disable-next-line\r\n const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\r\n // Add a second list item with an empty default start node\r\n const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\r\n const nextType = ((_a = type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.createAndFill(newNextTypeAttributes)) || undefined;\r\n wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined));\r\n const start = $from.before($from.depth - (depthBefore - 1));\r\n tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\r\n let sel = -1;\r\n tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\r\n if (sel > -1) {\r\n return false;\r\n }\r\n if (n.isTextblock && n.content.size === 0) {\r\n sel = pos + 1;\r\n }\r\n });\r\n if (sel > -1) {\r\n tr.setSelection(TextSelection.near(tr.doc.resolve(sel)));\r\n }\r\n tr.scrollIntoView();\r\n }\r\n return true;\r\n }\r\n const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\r\n const newTypeAttributes = getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs);\r\n const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\r\n tr.delete($from.pos, $to.pos);\r\n const types = nextType\r\n ? [\r\n { type, attrs: newTypeAttributes },\r\n { type: nextType, attrs: newNextTypeAttributes },\r\n ]\r\n : [{ type, attrs: newTypeAttributes }];\r\n if (!canSplit(tr.doc, $from.pos, 2)) {\r\n return false;\r\n }\r\n if (dispatch) {\r\n tr.split($from.pos, 2, types).scrollIntoView();\r\n }\r\n return true;\r\n};\n\nconst joinListBackwards = (tr, listType) => {\r\n const list = findParentNode(node => node.type === listType)(tr.selection);\r\n if (!list) {\r\n return true;\r\n }\r\n const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth);\r\n if (before === undefined) {\r\n return true;\r\n }\r\n const nodeBefore = tr.doc.nodeAt(before);\r\n const canJoinBackwards = list.node.type === (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) && canJoin(tr.doc, list.pos);\r\n if (!canJoinBackwards) {\r\n return true;\r\n }\r\n tr.join(list.pos);\r\n return true;\r\n};\r\nconst joinListForwards = (tr, listType) => {\r\n const list = findParentNode(node => node.type === listType)(tr.selection);\r\n if (!list) {\r\n return true;\r\n }\r\n const after = tr.doc.resolve(list.start).after(list.depth);\r\n if (after === undefined) {\r\n return true;\r\n }\r\n const nodeAfter = tr.doc.nodeAt(after);\r\n const canJoinForwards = list.node.type === (nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.type) && canJoin(tr.doc, after);\r\n if (!canJoinForwards) {\r\n return true;\r\n }\r\n tr.join(after);\r\n return true;\r\n};\r\nconst toggleList = (listTypeOrName, itemTypeOrName) => ({ editor, tr, state, dispatch, chain, commands, can, }) => {\r\n const { extensions } = editor.extensionManager;\r\n const listType = getNodeType(listTypeOrName, state.schema);\r\n const itemType = getNodeType(itemTypeOrName, state.schema);\r\n const { selection } = state;\r\n const { $from, $to } = selection;\r\n const range = $from.blockRange($to);\r\n if (!range) {\r\n return false;\r\n }\r\n const parentList = findParentNode(node => isList(node.type.name, extensions))(selection);\r\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\r\n // remove list\r\n if (parentList.node.type === listType) {\r\n return commands.liftListItem(itemType);\r\n }\r\n // change list type\r\n if (isList(parentList.node.type.name, extensions)\r\n && listType.validContent(parentList.node.content)\r\n && dispatch) {\r\n return chain()\r\n .command(() => {\r\n tr.setNodeMarkup(parentList.pos, listType);\r\n return true;\r\n })\r\n .command(() => joinListBackwards(tr, listType))\r\n .command(() => joinListForwards(tr, listType))\r\n .run();\r\n }\r\n }\r\n return (chain()\r\n // try to convert node to default node if needed\r\n .command(() => {\r\n const canWrapInList = can().wrapInList(listType);\r\n if (canWrapInList) {\r\n return true;\r\n }\r\n return commands.clearNodes();\r\n })\r\n .wrapInList(listType)\r\n .command(() => joinListBackwards(tr, listType))\r\n .command(() => joinListForwards(tr, listType))\r\n .run());\r\n};\n\nconst toggleMark = (typeOrName, attributes = {}, options = {}) => ({ state, commands }) => {\r\n const { extendEmptyMarkRange = false } = options;\r\n const type = getMarkType(typeOrName, state.schema);\r\n const isActive = isMarkActive(state, type, attributes);\r\n if (isActive) {\r\n return commands.unsetMark(type, { extendEmptyMarkRange });\r\n }\r\n return commands.setMark(type, attributes);\r\n};\n\nconst toggleNode = (typeOrName, toggleTypeOrName, attributes = {}) => ({ state, commands }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n const toggleType = getNodeType(toggleTypeOrName, state.schema);\r\n const isActive = isNodeActive(state, type, attributes);\r\n if (isActive) {\r\n return commands.setNode(toggleType);\r\n }\r\n return commands.setNode(type, attributes);\r\n};\n\nconst toggleWrap = (typeOrName, attributes = {}) => ({ state, commands }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n const isActive = isNodeActive(state, type, attributes);\r\n if (isActive) {\r\n return commands.lift(type);\r\n }\r\n return commands.wrapIn(type, attributes);\r\n};\n\nconst undoInputRule = () => ({ state, dispatch }) => {\r\n const plugins = state.plugins;\r\n for (let i = 0; i < plugins.length; i += 1) {\r\n const plugin = plugins[i];\r\n let undoable;\r\n // @ts-ignore\r\n // eslint-disable-next-line\r\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\r\n if (dispatch) {\r\n const tr = state.tr;\r\n const toUndo = undoable.transform;\r\n for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) {\r\n tr.step(toUndo.steps[j].invert(toUndo.docs[j]));\r\n }\r\n if (undoable.text) {\r\n const marks = tr.doc.resolve(undoable.from).marks();\r\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\r\n }\r\n else {\r\n tr.delete(undoable.from, undoable.to);\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\n\nconst unsetAllMarks = () => ({ tr, dispatch }) => {\r\n const { selection } = tr;\r\n const { empty, ranges } = selection;\r\n if (empty) {\r\n return true;\r\n }\r\n if (dispatch) {\r\n ranges.forEach(range => {\r\n tr.removeMark(range.$from.pos, range.$to.pos);\r\n });\r\n }\r\n return true;\r\n};\n\nconst unsetMark = (typeOrName, options = {}) => ({ tr, state, dispatch }) => {\r\n var _a;\r\n const { extendEmptyMarkRange = false } = options;\r\n const { selection } = tr;\r\n const type = getMarkType(typeOrName, state.schema);\r\n const { $from, empty, ranges } = selection;\r\n if (!dispatch) {\r\n return true;\r\n }\r\n if (empty && extendEmptyMarkRange) {\r\n let { from, to } = selection;\r\n const attrs = (_a = $from.marks().find(mark => mark.type === type)) === null || _a === void 0 ? void 0 : _a.attrs;\r\n const range = getMarkRange($from, type, attrs);\r\n if (range) {\r\n from = range.from;\r\n to = range.to;\r\n }\r\n tr.removeMark(from, to, type);\r\n }\r\n else {\r\n ranges.forEach(range => {\r\n tr.removeMark(range.$from.pos, range.$to.pos, type);\r\n });\r\n }\r\n tr.removeStoredMark(type);\r\n return true;\r\n};\n\nconst updateAttributes = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\r\n let nodeType = null;\r\n let markType = null;\r\n const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);\r\n if (!schemaType) {\r\n return false;\r\n }\r\n if (schemaType === 'node') {\r\n nodeType = getNodeType(typeOrName, state.schema);\r\n }\r\n if (schemaType === 'mark') {\r\n markType = getMarkType(typeOrName, state.schema);\r\n }\r\n if (dispatch) {\r\n tr.selection.ranges.forEach(range => {\r\n const from = range.$from.pos;\r\n const to = range.$to.pos;\r\n state.doc.nodesBetween(from, to, (node, pos) => {\r\n if (nodeType && nodeType === node.type) {\r\n tr.setNodeMarkup(pos, undefined, {\r\n ...node.attrs,\r\n ...attributes,\r\n });\r\n }\r\n if (markType && node.marks.length) {\r\n node.marks.forEach(mark => {\r\n if (markType === mark.type) {\r\n const trimmedFrom = Math.max(pos, from);\r\n const trimmedTo = Math.min(pos + node.nodeSize, to);\r\n tr.addMark(trimmedFrom, trimmedTo, markType.create({\r\n ...mark.attrs,\r\n ...attributes,\r\n }));\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n return true;\r\n};\n\nconst wrapIn = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n return wrapIn$1(type, attributes)(state, dispatch);\r\n};\n\nconst wrapInList = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\r\n const type = getNodeType(typeOrName, state.schema);\r\n return wrapInList$1(type, attributes)(state, dispatch);\r\n};\n\nvar commands = /*#__PURE__*/Object.freeze({\n __proto__: null,\n blur: blur,\n clearContent: clearContent,\n clearNodes: clearNodes,\n command: command,\n createParagraphNear: createParagraphNear,\n deleteCurrentNode: deleteCurrentNode,\n deleteNode: deleteNode,\n deleteRange: deleteRange,\n deleteSelection: deleteSelection,\n enter: enter,\n exitCode: exitCode,\n extendMarkRange: extendMarkRange,\n first: first,\n focus: focus,\n forEach: forEach,\n insertContent: insertContent,\n insertContentAt: insertContentAt,\n joinUp: joinUp,\n joinDown: joinDown,\n joinBackward: joinBackward,\n joinForward: joinForward,\n keyboardShortcut: keyboardShortcut,\n lift: lift,\n liftEmptyBlock: liftEmptyBlock,\n liftListItem: liftListItem,\n newlineInCode: newlineInCode,\n resetAttributes: resetAttributes,\n scrollIntoView: scrollIntoView,\n selectAll: selectAll,\n selectNodeBackward: selectNodeBackward,\n selectNodeForward: selectNodeForward,\n selectParentNode: selectParentNode,\n selectTextblockEnd: selectTextblockEnd,\n selectTextblockStart: selectTextblockStart,\n setContent: setContent,\n setMark: setMark,\n setMeta: setMeta,\n setNode: setNode,\n setNodeSelection: setNodeSelection,\n setTextSelection: setTextSelection,\n sinkListItem: sinkListItem,\n splitBlock: splitBlock,\n splitListItem: splitListItem,\n toggleList: toggleList,\n toggleMark: toggleMark,\n toggleNode: toggleNode,\n toggleWrap: toggleWrap,\n undoInputRule: undoInputRule,\n unsetAllMarks: unsetAllMarks,\n unsetMark: unsetMark,\n updateAttributes: updateAttributes,\n wrapIn: wrapIn,\n wrapInList: wrapInList\n});\n\nconst Commands = Extension.create({\r\n name: 'commands',\r\n addCommands() {\r\n return {\r\n ...commands,\r\n };\r\n },\r\n});\n\nconst Editable = Extension.create({\r\n name: 'editable',\r\n addProseMirrorPlugins() {\r\n return [\r\n new Plugin({\r\n key: new PluginKey('editable'),\r\n props: {\r\n editable: () => this.editor.options.editable,\r\n },\r\n }),\r\n ];\r\n },\r\n});\n\nconst FocusEvents = Extension.create({\r\n name: 'focusEvents',\r\n addProseMirrorPlugins() {\r\n const { editor } = this;\r\n return [\r\n new Plugin({\r\n key: new PluginKey('focusEvents'),\r\n props: {\r\n handleDOMEvents: {\r\n focus: (view, event) => {\r\n editor.isFocused = true;\r\n const transaction = editor.state.tr\r\n .setMeta('focus', { event })\r\n .setMeta('addToHistory', false);\r\n view.dispatch(transaction);\r\n return false;\r\n },\r\n blur: (view, event) => {\r\n editor.isFocused = false;\r\n const transaction = editor.state.tr\r\n .setMeta('blur', { event })\r\n .setMeta('addToHistory', false);\r\n view.dispatch(transaction);\r\n return false;\r\n },\r\n },\r\n },\r\n }),\r\n ];\r\n },\r\n});\n\nconst Keymap = Extension.create({\r\n name: 'keymap',\r\n addKeyboardShortcuts() {\r\n const handleBackspace = () => this.editor.commands.first(({ commands }) => [\r\n () => commands.undoInputRule(),\r\n // maybe convert first text block node to default node\r\n () => commands.command(({ tr }) => {\r\n const { selection, doc } = tr;\r\n const { empty, $anchor } = selection;\r\n const { pos, parent } = $anchor;\r\n const isAtStart = Selection.atStart(doc).from === pos;\r\n if (!empty || !isAtStart || !parent.type.isTextblock || parent.textContent.length) {\r\n return false;\r\n }\r\n return commands.clearNodes();\r\n }),\r\n () => commands.deleteSelection(),\r\n () => commands.joinBackward(),\r\n () => commands.selectNodeBackward(),\r\n ]);\r\n const handleDelete = () => this.editor.commands.first(({ commands }) => [\r\n () => commands.deleteSelection(),\r\n () => commands.deleteCurrentNode(),\r\n () => commands.joinForward(),\r\n () => commands.selectNodeForward(),\r\n ]);\r\n const handleEnter = () => this.editor.commands.first(({ commands }) => [\r\n () => commands.newlineInCode(),\r\n () => commands.createParagraphNear(),\r\n () => commands.liftEmptyBlock(),\r\n () => commands.splitBlock(),\r\n ]);\r\n const baseKeymap = {\r\n Enter: handleEnter,\r\n 'Mod-Enter': () => this.editor.commands.exitCode(),\r\n Backspace: handleBackspace,\r\n 'Mod-Backspace': handleBackspace,\r\n 'Shift-Backspace': handleBackspace,\r\n Delete: handleDelete,\r\n 'Mod-Delete': handleDelete,\r\n 'Mod-a': () => this.editor.commands.selectAll(),\r\n };\r\n const pcKeymap = {\r\n ...baseKeymap,\r\n };\r\n const macKeymap = {\r\n ...baseKeymap,\r\n 'Ctrl-h': handleBackspace,\r\n 'Alt-Backspace': handleBackspace,\r\n 'Ctrl-d': handleDelete,\r\n 'Ctrl-Alt-Backspace': handleDelete,\r\n 'Alt-Delete': handleDelete,\r\n 'Alt-d': handleDelete,\r\n 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),\r\n 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),\r\n };\r\n if (isiOS() || isMacOS()) {\r\n return macKeymap;\r\n }\r\n return pcKeymap;\r\n },\r\n addProseMirrorPlugins() {\r\n return [\r\n // With this plugin we check if the whole document was selected and deleted.\r\n // In this case we will additionally call `clearNodes()` to convert e.g. a heading\r\n // to a paragraph if necessary.\r\n // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well\r\n // with many other commands.\r\n new Plugin({\r\n key: new PluginKey('clearDocument'),\r\n appendTransaction: (transactions, oldState, newState) => {\r\n const docChanges = transactions.some(transaction => transaction.docChanged)\r\n && !oldState.doc.eq(newState.doc);\r\n if (!docChanges) {\r\n return;\r\n }\r\n const { empty, from, to } = oldState.selection;\r\n const allFrom = Selection.atStart(oldState.doc).from;\r\n const allEnd = Selection.atEnd(oldState.doc).to;\r\n const allWasSelected = from === allFrom && to === allEnd;\r\n const isEmpty = newState.doc.textBetween(0, newState.doc.content.size, ' ', ' ').length === 0;\r\n if (empty || !allWasSelected || !isEmpty) {\r\n return;\r\n }\r\n const tr = newState.tr;\r\n const state = createChainableState({\r\n state: newState,\r\n transaction: tr,\r\n });\r\n const { commands } = new CommandManager({\r\n editor: this.editor,\r\n state,\r\n });\r\n commands.clearNodes();\r\n if (!tr.steps.length) {\r\n return;\r\n }\r\n return tr;\r\n },\r\n }),\r\n ];\r\n },\r\n});\n\nconst Tabindex = Extension.create({\r\n name: 'tabindex',\r\n addProseMirrorPlugins() {\r\n return [\r\n new Plugin({\r\n key: new PluginKey('tabindex'),\r\n props: {\r\n attributes: this.editor.isEditable ? { tabindex: '0' } : {},\r\n },\r\n }),\r\n ];\r\n },\r\n});\n\nvar extensions = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ClipboardTextSerializer: ClipboardTextSerializer,\n Commands: Commands,\n Editable: Editable,\n FocusEvents: FocusEvents,\n Keymap: Keymap,\n Tabindex: Tabindex\n});\n\nconst style = `.ProseMirror {\n position: relative;\n}\n\n.ProseMirror {\n word-wrap: break-word;\n white-space: pre-wrap;\n white-space: break-spaces;\n -webkit-font-variant-ligatures: none;\n font-variant-ligatures: none;\n font-feature-settings: \"liga\" 0; /* the above doesn't seem to work in Edge */\n}\n\n.ProseMirror [contenteditable=\"false\"] {\n white-space: normal;\n}\n\n.ProseMirror [contenteditable=\"false\"] [contenteditable=\"true\"] {\n white-space: pre-wrap;\n}\n\n.ProseMirror pre {\n white-space: pre-wrap;\n}\n\nimg.ProseMirror-separator {\n display: inline !important;\n border: none !important;\n margin: 0 !important;\n width: 1px !important;\n height: 1px !important;\n}\n\n.ProseMirror-gapcursor {\n display: none;\n pointer-events: none;\n position: absolute;\n margin: 0;\n}\n\n.ProseMirror-gapcursor:after {\n content: \"\";\n display: block;\n position: absolute;\n top: -2px;\n width: 20px;\n border-top: 1px solid black;\n animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;\n}\n\n@keyframes ProseMirror-cursor-blink {\n to {\n visibility: hidden;\n }\n}\n\n.ProseMirror-hideselection *::selection {\n background: transparent;\n}\n\n.ProseMirror-hideselection *::-moz-selection {\n background: transparent;\n}\n\n.ProseMirror-hideselection * {\n caret-color: transparent;\n}\n\n.ProseMirror-focused .ProseMirror-gapcursor {\n display: block;\n}\n\n.tippy-box[data-animation=fade][data-state=hidden] {\n opacity: 0\n}`;\n\nfunction createStyleTag(style, nonce) {\r\n const tipTapStyleTag = document.querySelector('style[data-tiptap-style]');\r\n if (tipTapStyleTag !== null) {\r\n return tipTapStyleTag;\r\n }\r\n const styleNode = document.createElement('style');\r\n if (nonce) {\r\n styleNode.setAttribute('nonce', nonce);\r\n }\r\n styleNode.setAttribute('data-tiptap-style', '');\r\n styleNode.innerHTML = style;\r\n document.getElementsByTagName('head')[0].appendChild(styleNode);\r\n return styleNode;\r\n}\n\nclass Editor extends EventEmitter {\r\n constructor(options = {}) {\r\n super();\r\n this.isFocused = false;\r\n this.extensionStorage = {};\r\n this.options = {\r\n element: document.createElement('div'),\r\n content: '',\r\n injectCSS: true,\r\n injectNonce: undefined,\r\n extensions: [],\r\n autofocus: false,\r\n editable: true,\r\n editorProps: {},\r\n parseOptions: {},\r\n enableInputRules: true,\r\n enablePasteRules: true,\r\n enableCoreExtensions: true,\r\n onBeforeCreate: () => null,\r\n onCreate: () => null,\r\n onUpdate: () => null,\r\n onSelectionUpdate: () => null,\r\n onTransaction: () => null,\r\n onFocus: () => null,\r\n onBlur: () => null,\r\n onDestroy: () => null,\r\n };\r\n this.isCapturingTransaction = false;\r\n this.capturedTransaction = null;\r\n this.setOptions(options);\r\n this.createExtensionManager();\r\n this.createCommandManager();\r\n this.createSchema();\r\n this.on('beforeCreate', this.options.onBeforeCreate);\r\n this.emit('beforeCreate', { editor: this });\r\n this.createView();\r\n this.injectCSS();\r\n this.on('create', this.options.onCreate);\r\n this.on('update', this.options.onUpdate);\r\n this.on('selectionUpdate', this.options.onSelectionUpdate);\r\n this.on('transaction', this.options.onTransaction);\r\n this.on('focus', this.options.onFocus);\r\n this.on('blur', this.options.onBlur);\r\n this.on('destroy', this.options.onDestroy);\r\n window.setTimeout(() => {\r\n if (this.isDestroyed) {\r\n return;\r\n }\r\n this.commands.focus(this.options.autofocus);\r\n this.emit('create', { editor: this });\r\n }, 0);\r\n }\r\n /**\r\n * Returns the editor storage.\r\n */\r\n get storage() {\r\n return this.extensionStorage;\r\n }\r\n /**\r\n * An object of all registered commands.\r\n */\r\n get commands() {\r\n return this.commandManager.commands;\r\n }\r\n /**\r\n * Create a command chain to call multiple commands at once.\r\n */\r\n chain() {\r\n return this.commandManager.chain();\r\n }\r\n /**\r\n * Check if a command or a command chain can be executed. Without executing it.\r\n */\r\n can() {\r\n return this.commandManager.can();\r\n }\r\n /**\r\n * Inject CSS styles.\r\n */\r\n injectCSS() {\r\n if (this.options.injectCSS && document) {\r\n this.css = createStyleTag(style, this.options.injectNonce);\r\n }\r\n }\r\n /**\r\n * Update editor options.\r\n *\r\n * @param options A list of options\r\n */\r\n setOptions(options = {}) {\r\n this.options = {\r\n ...this.options,\r\n ...options,\r\n };\r\n if (!this.view || !this.state || this.isDestroyed) {\r\n return;\r\n }\r\n if (this.options.editorProps) {\r\n this.view.setProps(this.options.editorProps);\r\n }\r\n this.view.updateState(this.state);\r\n }\r\n /**\r\n * Update editable state of the editor.\r\n */\r\n setEditable(editable, emitUpdate = true) {\r\n this.setOptions({ editable });\r\n if (emitUpdate) {\r\n this.emit('update', { editor: this, transaction: this.state.tr });\r\n }\r\n }\r\n /**\r\n * Returns whether the editor is editable.\r\n */\r\n get isEditable() {\r\n // since plugins are applied after creating the view\r\n // `editable` is always `true` for one tick.\r\n // that’s why we also have to check for `options.editable`\r\n return this.options.editable && this.view && this.view.editable;\r\n }\r\n /**\r\n * Returns the editor state.\r\n */\r\n get state() {\r\n return this.view.state;\r\n }\r\n /**\r\n * Register a ProseMirror plugin.\r\n *\r\n * @param plugin A ProseMirror plugin\r\n * @param handlePlugins Control how to merge the plugin into the existing plugins.\r\n */\r\n registerPlugin(plugin, handlePlugins) {\r\n const plugins = isFunction(handlePlugins)\r\n ? handlePlugins(plugin, [...this.state.plugins])\r\n : [...this.state.plugins, plugin];\r\n const state = this.state.reconfigure({ plugins });\r\n this.view.updateState(state);\r\n }\r\n /**\r\n * Unregister a ProseMirror plugin.\r\n *\r\n * @param nameOrPluginKey The plugins name\r\n */\r\n unregisterPlugin(nameOrPluginKey) {\r\n if (this.isDestroyed) {\r\n return;\r\n }\r\n // @ts-ignore\r\n const name = typeof nameOrPluginKey === 'string' ? `${nameOrPluginKey}$` : nameOrPluginKey.key;\r\n const state = this.state.reconfigure({\r\n // @ts-ignore\r\n plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(name)),\r\n });\r\n this.view.updateState(state);\r\n }\r\n /**\r\n * Creates an extension manager.\r\n */\r\n createExtensionManager() {\r\n const coreExtensions = this.options.enableCoreExtensions ? Object.values(extensions) : [];\r\n const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => {\r\n return ['extension', 'node', 'mark'].includes(extension === null || extension === void 0 ? void 0 : extension.type);\r\n });\r\n this.extensionManager = new ExtensionManager(allExtensions, this);\r\n }\r\n /**\r\n * Creates an command manager.\r\n */\r\n createCommandManager() {\r\n this.commandManager = new CommandManager({\r\n editor: this,\r\n });\r\n }\r\n /**\r\n * Creates a ProseMirror schema.\r\n */\r\n createSchema() {\r\n this.schema = this.extensionManager.schema;\r\n }\r\n /**\r\n * Creates a ProseMirror view.\r\n */\r\n createView() {\r\n const doc = createDocument(this.options.content, this.schema, this.options.parseOptions);\r\n const selection = resolveFocusPosition(doc, this.options.autofocus);\r\n this.view = new EditorView(this.options.element, {\r\n ...this.options.editorProps,\r\n dispatchTransaction: this.dispatchTransaction.bind(this),\r\n state: EditorState.create({\r\n doc,\r\n selection: selection || undefined,\r\n }),\r\n });\r\n // `editor.view` is not yet available at this time.\r\n // Therefore we will add all plugins and node views directly afterwards.\r\n const newState = this.state.reconfigure({\r\n plugins: this.extensionManager.plugins,\r\n });\r\n this.view.updateState(newState);\r\n this.createNodeViews();\r\n // Let’s store the editor instance in the DOM element.\r\n // So we’ll have access to it for tests.\r\n const dom = this.view.dom;\r\n dom.editor = this;\r\n }\r\n /**\r\n * Creates all node views.\r\n */\r\n createNodeViews() {\r\n this.view.setProps({\r\n nodeViews: this.extensionManager.nodeViews,\r\n });\r\n }\r\n captureTransaction(fn) {\r\n this.isCapturingTransaction = true;\r\n fn();\r\n this.isCapturingTransaction = false;\r\n const tr = this.capturedTransaction;\r\n this.capturedTransaction = null;\r\n return tr;\r\n }\r\n /**\r\n * The callback over which to send transactions (state updates) produced by the view.\r\n *\r\n * @param transaction An editor state transaction\r\n */\r\n dispatchTransaction(transaction) {\r\n if (this.isCapturingTransaction) {\r\n if (!this.capturedTransaction) {\r\n this.capturedTransaction = transaction;\r\n return;\r\n }\r\n transaction.steps.forEach(step => { var _a; return (_a = this.capturedTransaction) === null || _a === void 0 ? void 0 : _a.step(step); });\r\n return;\r\n }\r\n const state = this.state.apply(transaction);\r\n const selectionHasChanged = !this.state.selection.eq(state.selection);\r\n this.view.updateState(state);\r\n this.emit('transaction', {\r\n editor: this,\r\n transaction,\r\n });\r\n if (selectionHasChanged) {\r\n this.emit('selectionUpdate', {\r\n editor: this,\r\n transaction,\r\n });\r\n }\r\n const focus = transaction.getMeta('focus');\r\n const blur = transaction.getMeta('blur');\r\n if (focus) {\r\n this.emit('focus', {\r\n editor: this,\r\n event: focus.event,\r\n transaction,\r\n });\r\n }\r\n if (blur) {\r\n this.emit('blur', {\r\n editor: this,\r\n event: blur.event,\r\n transaction,\r\n });\r\n }\r\n if (!transaction.docChanged || transaction.getMeta('preventUpdate')) {\r\n return;\r\n }\r\n this.emit('update', {\r\n editor: this,\r\n transaction,\r\n });\r\n }\r\n /**\r\n * Get attributes of the currently selected node or mark.\r\n */\r\n getAttributes(nameOrType) {\r\n return getAttributes(this.state, nameOrType);\r\n }\r\n isActive(nameOrAttributes, attributesOrUndefined) {\r\n const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : null;\r\n const attributes = typeof nameOrAttributes === 'string' ? attributesOrUndefined : nameOrAttributes;\r\n return isActive(this.state, name, attributes);\r\n }\r\n /**\r\n * Get the document as JSON.\r\n */\r\n getJSON() {\r\n return this.state.doc.toJSON();\r\n }\r\n /**\r\n * Get the document as HTML.\r\n */\r\n getHTML() {\r\n return getHTMLFromFragment(this.state.doc.content, this.schema);\r\n }\r\n /**\r\n * Get the document as text.\r\n */\r\n getText(options) {\r\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {};\r\n return getText(this.state.doc, {\r\n blockSeparator,\r\n textSerializers: {\r\n ...textSerializers,\r\n ...getTextSerializersFromSchema(this.schema),\r\n },\r\n });\r\n }\r\n /**\r\n * Check if there is no content.\r\n */\r\n get isEmpty() {\r\n return isNodeEmpty(this.state.doc);\r\n }\r\n /**\r\n * Get the number of characters for the current document.\r\n *\r\n * @deprecated\r\n */\r\n getCharacterCount() {\r\n console.warn('[tiptap warn]: \"editor.getCharacterCount()\" is deprecated. Please use \"editor.storage.characterCount.characters()\" instead.');\r\n return this.state.doc.content.size - 2;\r\n }\r\n /**\r\n * Destroy the editor.\r\n */\r\n destroy() {\r\n this.emit('destroy');\r\n if (this.view) {\r\n this.view.destroy();\r\n }\r\n this.removeAllListeners();\r\n }\r\n /**\r\n * Check if the editor is already destroyed.\r\n */\r\n get isDestroyed() {\r\n var _a;\r\n // @ts-ignore\r\n return !((_a = this.view) === null || _a === void 0 ? void 0 : _a.docView);\r\n }\r\n}\n\n/**\r\n * Build an input rule that adds a mark when the\r\n * matched text is typed into it.\r\n */\r\nfunction markInputRule(config) {\r\n return new InputRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n const attributes = callOrReturn(config.getAttributes, undefined, match);\r\n if (attributes === false || attributes === null) {\r\n return null;\r\n }\r\n const { tr } = state;\r\n const captureGroup = match[match.length - 1];\r\n const fullMatch = match[0];\r\n let markEnd = range.to;\r\n if (captureGroup) {\r\n const startSpaces = fullMatch.search(/\\S/);\r\n const textStart = range.from + fullMatch.indexOf(captureGroup);\r\n const textEnd = textStart + captureGroup.length;\r\n const excludedMarks = getMarksBetween(range.from, range.to, state.doc)\r\n .filter(item => {\r\n // @ts-ignore\r\n const excluded = item.mark.type.excluded;\r\n return excluded.find(type => type === config.type && type !== item.mark.type);\r\n })\r\n .filter(item => item.to > textStart);\r\n if (excludedMarks.length) {\r\n return null;\r\n }\r\n if (textEnd < range.to) {\r\n tr.delete(textEnd, range.to);\r\n }\r\n if (textStart > range.from) {\r\n tr.delete(range.from + startSpaces, textStart);\r\n }\r\n markEnd = range.from + startSpaces + captureGroup.length;\r\n tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));\r\n tr.removeStoredMark(config.type);\r\n }\r\n },\r\n });\r\n}\n\n/**\r\n * Build an input rule that adds a node when the\r\n * matched text is typed into it.\r\n */\r\nfunction nodeInputRule(config) {\r\n return new InputRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n const attributes = callOrReturn(config.getAttributes, undefined, match) || {};\r\n const { tr } = state;\r\n const start = range.from;\r\n let end = range.to;\r\n if (match[1]) {\r\n const offset = match[0].lastIndexOf(match[1]);\r\n let matchStart = start + offset;\r\n if (matchStart > end) {\r\n matchStart = end;\r\n }\r\n else {\r\n end = matchStart + match[1].length;\r\n }\r\n // insert last typed character\r\n const lastChar = match[0][match[0].length - 1];\r\n tr.insertText(lastChar, start + match[0].length - 1);\r\n // insert node from input rule\r\n tr.replaceWith(matchStart, end, config.type.create(attributes));\r\n }\r\n else if (match[0]) {\r\n tr.replaceWith(start, end, config.type.create(attributes));\r\n }\r\n },\r\n });\r\n}\n\n/**\r\n * Build an input rule that changes the type of a textblock when the\r\n * matched text is typed into it. When using a regular expresion you’ll\r\n * probably want the regexp to start with `^`, so that the pattern can\r\n * only occur at the start of a textblock.\r\n */\r\nfunction textblockTypeInputRule(config) {\r\n return new InputRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n const $start = state.doc.resolve(range.from);\r\n const attributes = callOrReturn(config.getAttributes, undefined, match) || {};\r\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) {\r\n return null;\r\n }\r\n state.tr\r\n .delete(range.from, range.to)\r\n .setBlockType(range.from, range.from, config.type, attributes);\r\n },\r\n });\r\n}\n\n/**\r\n * Build an input rule that replaces text when the\r\n * matched text is typed into it.\r\n */\r\nfunction textInputRule(config) {\r\n return new InputRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n let insert = config.replace;\r\n let start = range.from;\r\n const end = range.to;\r\n if (match[1]) {\r\n const offset = match[0].lastIndexOf(match[1]);\r\n insert += match[0].slice(offset + match[1].length);\r\n start += offset;\r\n const cutOff = start - end;\r\n if (cutOff > 0) {\r\n insert = match[0].slice(offset - cutOff, offset) + insert;\r\n start = end;\r\n }\r\n }\r\n state.tr.insertText(insert, start, end);\r\n },\r\n });\r\n}\n\n/**\r\n * Build an input rule for automatically wrapping a textblock when a\r\n * given string is typed. When using a regular expresion you’ll\r\n * probably want the regexp to start with `^`, so that the pattern can\r\n * only occur at the start of a textblock.\r\n *\r\n * `type` is the type of node to wrap in.\r\n *\r\n * By default, if there’s a node with the same type above the newly\r\n * wrapped node, the rule will try to join those\r\n * two nodes. You can pass a join predicate, which takes a regular\r\n * expression match and the node before the wrapped node, and can\r\n * return a boolean to indicate whether a join should happen.\r\n */\r\nfunction wrappingInputRule(config) {\r\n return new InputRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n const attributes = callOrReturn(config.getAttributes, undefined, match) || {};\r\n const tr = state.tr.delete(range.from, range.to);\r\n const $start = tr.doc.resolve(range.from);\r\n const blockRange = $start.blockRange();\r\n const wrapping = blockRange && findWrapping(blockRange, config.type, attributes);\r\n if (!wrapping) {\r\n return null;\r\n }\r\n tr.wrap(blockRange, wrapping);\r\n const before = tr.doc.resolve(range.from - 1).nodeBefore;\r\n if (before\r\n && before.type === config.type\r\n && canJoin(tr.doc, range.from - 1)\r\n && (!config.joinPredicate || config.joinPredicate(match, before))) {\r\n tr.join(range.from - 1);\r\n }\r\n },\r\n });\r\n}\n\nclass Mark {\r\n constructor(config = {}) {\r\n this.type = 'mark';\r\n this.name = 'mark';\r\n this.parent = null;\r\n this.child = null;\r\n this.config = {\r\n name: this.name,\r\n defaultOptions: {},\r\n };\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n };\r\n this.name = this.config.name;\r\n if (config.defaultOptions) {\r\n console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`);\r\n }\r\n // TODO: remove `addOptions` fallback\r\n this.options = this.config.defaultOptions;\r\n if (this.config.addOptions) {\r\n this.options = callOrReturn(getExtensionField(this, 'addOptions', {\r\n name: this.name,\r\n }));\r\n }\r\n this.storage = callOrReturn(getExtensionField(this, 'addStorage', {\r\n name: this.name,\r\n options: this.options,\r\n })) || {};\r\n }\r\n static create(config = {}) {\r\n return new Mark(config);\r\n }\r\n configure(options = {}) {\r\n // return a new instance so we can use the same extension\r\n // with different calls of `configure`\r\n const extension = this.extend();\r\n extension.options = mergeDeep(this.options, options);\r\n extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\r\n name: extension.name,\r\n options: extension.options,\r\n }));\r\n return extension;\r\n }\r\n extend(extendedConfig = {}) {\r\n const extension = new Mark(extendedConfig);\r\n extension.parent = this;\r\n this.child = extension;\r\n extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name;\r\n if (extendedConfig.defaultOptions) {\r\n console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`);\r\n }\r\n extension.options = callOrReturn(getExtensionField(extension, 'addOptions', {\r\n name: extension.name,\r\n }));\r\n extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\r\n name: extension.name,\r\n options: extension.options,\r\n }));\r\n return extension;\r\n }\r\n static handleExit({ editor, mark }) {\r\n const { tr } = editor.state;\r\n const currentPos = editor.state.selection.$from;\r\n const isAtEnd = currentPos.pos === currentPos.end();\r\n if (isAtEnd) {\r\n const currentMarks = currentPos.marks();\r\n const isInMark = !!currentMarks.find(m => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name);\r\n if (!isInMark) {\r\n return false;\r\n }\r\n const removeMark = currentMarks.find(m => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name);\r\n if (removeMark) {\r\n tr.removeStoredMark(removeMark);\r\n }\r\n tr.insertText(' ', currentPos.pos);\r\n editor.view.dispatch(tr);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\n\nclass Node {\r\n constructor(config = {}) {\r\n this.type = 'node';\r\n this.name = 'node';\r\n this.parent = null;\r\n this.child = null;\r\n this.config = {\r\n name: this.name,\r\n defaultOptions: {},\r\n };\r\n this.config = {\r\n ...this.config,\r\n ...config,\r\n };\r\n this.name = this.config.name;\r\n if (config.defaultOptions) {\r\n console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`);\r\n }\r\n // TODO: remove `addOptions` fallback\r\n this.options = this.config.defaultOptions;\r\n if (this.config.addOptions) {\r\n this.options = callOrReturn(getExtensionField(this, 'addOptions', {\r\n name: this.name,\r\n }));\r\n }\r\n this.storage = callOrReturn(getExtensionField(this, 'addStorage', {\r\n name: this.name,\r\n options: this.options,\r\n })) || {};\r\n }\r\n static create(config = {}) {\r\n return new Node(config);\r\n }\r\n configure(options = {}) {\r\n // return a new instance so we can use the same extension\r\n // with different calls of `configure`\r\n const extension = this.extend();\r\n extension.options = mergeDeep(this.options, options);\r\n extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\r\n name: extension.name,\r\n options: extension.options,\r\n }));\r\n return extension;\r\n }\r\n extend(extendedConfig = {}) {\r\n const extension = new Node(extendedConfig);\r\n extension.parent = this;\r\n this.child = extension;\r\n extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name;\r\n if (extendedConfig.defaultOptions) {\r\n console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`);\r\n }\r\n extension.options = callOrReturn(getExtensionField(extension, 'addOptions', {\r\n name: extension.name,\r\n }));\r\n extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\r\n name: extension.name,\r\n options: extension.options,\r\n }));\r\n return extension;\r\n }\r\n}\n\nclass NodeView {\r\n constructor(component, props, options) {\r\n this.isDragging = false;\r\n this.component = component;\r\n this.editor = props.editor;\r\n this.options = {\r\n stopEvent: null,\r\n ignoreMutation: null,\r\n ...options,\r\n };\r\n this.extension = props.extension;\r\n this.node = props.node;\r\n this.decorations = props.decorations;\r\n this.getPos = props.getPos;\r\n this.mount();\r\n }\r\n mount() {\r\n // eslint-disable-next-line\r\n return;\r\n }\r\n get dom() {\r\n return this.editor.view.dom;\r\n }\r\n get contentDOM() {\r\n return null;\r\n }\r\n onDragStart(event) {\r\n var _a, _b, _c, _d, _e, _f, _g;\r\n const { view } = this.editor;\r\n const target = event.target;\r\n // get the drag handle element\r\n // `closest` is not available for text nodes so we may have to use its parent\r\n const dragHandle = target.nodeType === 3\r\n ? (_a = target.parentElement) === null || _a === void 0 ? void 0 : _a.closest('[data-drag-handle]')\r\n : target.closest('[data-drag-handle]');\r\n if (!this.dom || ((_b = this.contentDOM) === null || _b === void 0 ? void 0 : _b.contains(target)) || !dragHandle) {\r\n return;\r\n }\r\n let x = 0;\r\n let y = 0;\r\n // calculate offset for drag element if we use a different drag handle element\r\n if (this.dom !== dragHandle) {\r\n const domBox = this.dom.getBoundingClientRect();\r\n const handleBox = dragHandle.getBoundingClientRect();\r\n // In React, we have to go through nativeEvent to reach offsetX/offsetY.\r\n const offsetX = (_c = event.offsetX) !== null && _c !== void 0 ? _c : (_d = event.nativeEvent) === null || _d === void 0 ? void 0 : _d.offsetX;\r\n const offsetY = (_e = event.offsetY) !== null && _e !== void 0 ? _e : (_f = event.nativeEvent) === null || _f === void 0 ? void 0 : _f.offsetY;\r\n x = handleBox.x - domBox.x + offsetX;\r\n y = handleBox.y - domBox.y + offsetY;\r\n }\r\n (_g = event.dataTransfer) === null || _g === void 0 ? void 0 : _g.setDragImage(this.dom, x, y);\r\n // we need to tell ProseMirror that we want to move the whole node\r\n // so we create a NodeSelection\r\n const selection = NodeSelection.create(view.state.doc, this.getPos());\r\n const transaction = view.state.tr.setSelection(selection);\r\n view.dispatch(transaction);\r\n }\r\n stopEvent(event) {\r\n var _a;\r\n if (!this.dom) {\r\n return false;\r\n }\r\n if (typeof this.options.stopEvent === 'function') {\r\n return this.options.stopEvent({ event });\r\n }\r\n const target = event.target;\r\n const isInElement = this.dom.contains(target) && !((_a = this.contentDOM) === null || _a === void 0 ? void 0 : _a.contains(target));\r\n // any event from child nodes should be handled by ProseMirror\r\n if (!isInElement) {\r\n return false;\r\n }\r\n const isDropEvent = event.type === 'drop';\r\n const isInput = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'].includes(target.tagName) || target.isContentEditable;\r\n // any input event within node views should be ignored by ProseMirror\r\n if (isInput && !isDropEvent) {\r\n return true;\r\n }\r\n const { isEditable } = this.editor;\r\n const { isDragging } = this;\r\n const isDraggable = !!this.node.type.spec.draggable;\r\n const isSelectable = NodeSelection.isSelectable(this.node);\r\n const isCopyEvent = event.type === 'copy';\r\n const isPasteEvent = event.type === 'paste';\r\n const isCutEvent = event.type === 'cut';\r\n const isClickEvent = event.type === 'mousedown';\r\n const isDragEvent = event.type.startsWith('drag');\r\n // ProseMirror tries to drag selectable nodes\r\n // even if `draggable` is set to `false`\r\n // this fix prevents that\r\n if (!isDraggable && isSelectable && isDragEvent) {\r\n event.preventDefault();\r\n }\r\n if (isDraggable && isDragEvent && !isDragging) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n // we have to store that dragging started\r\n if (isDraggable && isEditable && !isDragging && isClickEvent) {\r\n const dragHandle = target.closest('[data-drag-handle]');\r\n const isValidDragHandle = dragHandle && (this.dom === dragHandle || this.dom.contains(dragHandle));\r\n if (isValidDragHandle) {\r\n this.isDragging = true;\r\n document.addEventListener('dragend', () => {\r\n this.isDragging = false;\r\n }, { once: true });\r\n document.addEventListener('mouseup', () => {\r\n this.isDragging = false;\r\n }, { once: true });\r\n }\r\n }\r\n // these events are handled by prosemirror\r\n if (isDragging\r\n || isDropEvent\r\n || isCopyEvent\r\n || isPasteEvent\r\n || isCutEvent\r\n || (isClickEvent && isSelectable)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n ignoreMutation(mutation) {\r\n if (!this.dom || !this.contentDOM) {\r\n return true;\r\n }\r\n if (typeof this.options.ignoreMutation === 'function') {\r\n return this.options.ignoreMutation({ mutation });\r\n }\r\n // a leaf/atom node is like a black box for ProseMirror\r\n // and should be fully handled by the node view\r\n if (this.node.isLeaf || this.node.isAtom) {\r\n return true;\r\n }\r\n // ProseMirror should handle any selections\r\n if (mutation.type === 'selection') {\r\n return false;\r\n }\r\n // try to prevent a bug on iOS that will break node views on enter\r\n // this is because ProseMirror can’t preventDispatch on enter\r\n // this will lead to a re-render of the node view on enter\r\n // see: https://github.com/ueberdosis/tiptap/issues/1214\r\n if (this.dom.contains(mutation.target)\r\n && mutation.type === 'childList'\r\n && isiOS()\r\n && this.editor.isFocused) {\r\n const changedNodes = [\r\n ...Array.from(mutation.addedNodes),\r\n ...Array.from(mutation.removedNodes),\r\n ];\r\n // we’ll check if every changed node is contentEditable\r\n // to make sure it’s probably mutated by ProseMirror\r\n if (changedNodes.every(node => node.isContentEditable)) {\r\n return false;\r\n }\r\n }\r\n // we will allow mutation contentDOM with attributes\r\n // so we can for example adding classes within our node view\r\n if (this.contentDOM === mutation.target && mutation.type === 'attributes') {\r\n return true;\r\n }\r\n // ProseMirror should handle any changes within contentDOM\r\n if (this.contentDOM.contains(mutation.target)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n updateAttributes(attributes) {\r\n this.editor.commands.command(({ tr }) => {\r\n const pos = this.getPos();\r\n tr.setNodeMarkup(pos, undefined, {\r\n ...this.node.attrs,\r\n ...attributes,\r\n });\r\n return true;\r\n });\r\n }\r\n deleteNode() {\r\n const from = this.getPos();\r\n const to = from + this.node.nodeSize;\r\n this.editor.commands.deleteRange({ from, to });\r\n }\r\n}\n\n/**\r\n * Build an paste rule that adds a mark when the\r\n * matched text is pasted into it.\r\n */\r\nfunction markPasteRule(config) {\r\n return new PasteRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n const attributes = callOrReturn(config.getAttributes, undefined, match);\r\n if (attributes === false || attributes === null) {\r\n return null;\r\n }\r\n const { tr } = state;\r\n const captureGroup = match[match.length - 1];\r\n const fullMatch = match[0];\r\n let markEnd = range.to;\r\n if (captureGroup) {\r\n const startSpaces = fullMatch.search(/\\S/);\r\n const textStart = range.from + fullMatch.indexOf(captureGroup);\r\n const textEnd = textStart + captureGroup.length;\r\n const excludedMarks = getMarksBetween(range.from, range.to, state.doc)\r\n .filter(item => {\r\n // @ts-ignore\r\n const excluded = item.mark.type.excluded;\r\n return excluded.find(type => type === config.type && type !== item.mark.type);\r\n })\r\n .filter(item => item.to > textStart);\r\n if (excludedMarks.length) {\r\n return null;\r\n }\r\n if (textEnd < range.to) {\r\n tr.delete(textEnd, range.to);\r\n }\r\n if (textStart > range.from) {\r\n tr.delete(range.from + startSpaces, textStart);\r\n }\r\n markEnd = range.from + startSpaces + captureGroup.length;\r\n tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));\r\n tr.removeStoredMark(config.type);\r\n }\r\n },\r\n });\r\n}\n\n// source: https://stackoverflow.com/a/6969486\r\nfunction escapeForRegEx(string) {\r\n return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n}\n\nfunction isString(value) {\r\n return typeof value === 'string';\r\n}\n\n/**\r\n * Build an paste rule that adds a node when the\r\n * matched text is pasted into it.\r\n */\r\nfunction nodePasteRule(config) {\r\n return new PasteRule({\r\n find: config.find,\r\n handler({ match, chain, range }) {\r\n const attributes = callOrReturn(config.getAttributes, undefined, match);\r\n if (attributes === false || attributes === null) {\r\n return null;\r\n }\r\n if (match.input) {\r\n chain().deleteRange(range).insertContentAt(range.from, {\r\n type: config.type.name,\r\n attrs: attributes,\r\n });\r\n }\r\n },\r\n });\r\n}\n\n/**\r\n * Build an paste rule that replaces text when the\r\n * matched text is pasted into it.\r\n */\r\nfunction textPasteRule(config) {\r\n return new PasteRule({\r\n find: config.find,\r\n handler: ({ state, range, match }) => {\r\n let insert = config.replace;\r\n let start = range.from;\r\n const end = range.to;\r\n if (match[1]) {\r\n const offset = match[0].lastIndexOf(match[1]);\r\n insert += match[0].slice(offset + match[1].length);\r\n start += offset;\r\n const cutOff = start - end;\r\n if (cutOff > 0) {\r\n insert = match[0].slice(offset - cutOff, offset) + insert;\r\n start = end;\r\n }\r\n }\r\n state.tr.insertText(insert, start, end);\r\n },\r\n });\r\n}\n\nclass Tracker {\r\n constructor(transaction) {\r\n this.transaction = transaction;\r\n this.currentStep = this.transaction.steps.length;\r\n }\r\n map(position) {\r\n let deleted = false;\r\n const mappedPosition = this.transaction.steps\r\n .slice(this.currentStep)\r\n .reduce((newPosition, step) => {\r\n const mapResult = step.getMap().mapResult(newPosition);\r\n if (mapResult.deleted) {\r\n deleted = true;\r\n }\r\n return mapResult.pos;\r\n }, position);\r\n return {\r\n position: mappedPosition,\r\n deleted,\r\n };\r\n }\r\n}\n\nexport { CommandManager, Editor, Extension, InputRule, Mark, Node, NodeView, PasteRule, Tracker, callOrReturn, combineTransactionSteps, createStyleTag, defaultBlockAt, deleteProps, elementFromString, escapeForRegEx, extensions, findChildren, findChildrenInRange, findDuplicates, findParentNode, findParentNodeClosestToPos, fromString, generateHTML, generateJSON, generateText, getAttributes, getChangedRanges, getDebugJSON, getExtensionField, getHTMLFromFragment, getMarkAttributes, getMarkRange, getMarkType, getMarksBetween, getNodeAttributes, getNodeType, getSchema, getText, getTextBetween, getTextContentFromNodes, getTextSerializersFromSchema, inputRulesPlugin, isActive, isEmptyObject, isFunction, isList, isMacOS, isMarkActive, isNodeActive, isNodeEmpty, isNodeSelection, isNumber, isPlainObject, isRegExp, isString, isTextSelection, isiOS, markInputRule, markPasteRule, mergeAttributes, mergeDeep, minMax, nodeInputRule, nodePasteRule, objectIncludes, pasteRulesPlugin, posToDOMRect, removeDuplicates, textInputRule, textPasteRule, textblockTypeInputRule, wrappingInputRule };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core';\n\nconst inputRegex = /^\\s*>\\s$/;\r\nconst Blockquote = Node.create({\r\n name: 'blockquote',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n content: 'block+',\r\n group: 'block',\r\n defining: true,\r\n parseHTML() {\r\n return [\r\n { tag: 'blockquote' },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['blockquote', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setBlockquote: () => ({ commands }) => {\r\n return commands.wrapIn(this.name);\r\n },\r\n toggleBlockquote: () => ({ commands }) => {\r\n return commands.toggleWrap(this.name);\r\n },\r\n unsetBlockquote: () => ({ commands }) => {\r\n return commands.lift(this.name);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Shift-b': () => this.editor.commands.toggleBlockquote(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n wrappingInputRule({\r\n find: inputRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { Blockquote, Blockquote as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\nconst starInputRegex = /(?:^|\\s)((?:\\*\\*)((?:[^*]+))(?:\\*\\*))$/;\r\nconst starPasteRegex = /(?:^|\\s)((?:\\*\\*)((?:[^*]+))(?:\\*\\*))/g;\r\nconst underscoreInputRegex = /(?:^|\\s)((?:__)((?:[^__]+))(?:__))$/;\r\nconst underscorePasteRegex = /(?:^|\\s)((?:__)((?:[^__]+))(?:__))/g;\r\nconst Bold = Mark.create({\r\n name: 'bold',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'strong',\r\n },\r\n {\r\n tag: 'b',\r\n getAttrs: node => node.style.fontWeight !== 'normal' && null,\r\n },\r\n {\r\n style: 'font-weight',\r\n getAttrs: value => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null,\r\n },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['strong', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setBold: () => ({ commands }) => {\r\n return commands.setMark(this.name);\r\n },\r\n toggleBold: () => ({ commands }) => {\r\n return commands.toggleMark(this.name);\r\n },\r\n unsetBold: () => ({ commands }) => {\r\n return commands.unsetMark(this.name);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-b': () => this.editor.commands.toggleBold(),\r\n 'Mod-B': () => this.editor.commands.toggleBold(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n markInputRule({\r\n find: starInputRegex,\r\n type: this.type,\r\n }),\r\n markInputRule({\r\n find: underscoreInputRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n addPasteRules() {\r\n return [\r\n markPasteRule({\r\n find: starPasteRegex,\r\n type: this.type,\r\n }),\r\n markPasteRule({\r\n find: underscorePasteRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { Bold, Bold as default, starInputRegex, starPasteRegex, underscoreInputRegex, underscorePasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core';\n\nconst inputRegex = /^\\s*([-+*])\\s$/;\r\nconst BulletList = Node.create({\r\n name: 'bulletList',\r\n addOptions() {\r\n return {\r\n itemTypeName: 'listItem',\r\n HTMLAttributes: {},\r\n };\r\n },\r\n group: 'block list',\r\n content() {\r\n return `${this.options.itemTypeName}+`;\r\n },\r\n parseHTML() {\r\n return [\r\n { tag: 'ul' },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['ul', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n toggleBulletList: () => ({ commands }) => {\r\n return commands.toggleList(this.name, this.options.itemTypeName);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Shift-8': () => this.editor.commands.toggleBulletList(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n wrappingInputRule({\r\n find: inputRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { BulletList, BulletList as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\nconst inputRegex = /(?:^|\\s)((?:`)((?:[^`]+))(?:`))$/;\r\nconst pasteRegex = /(?:^|\\s)((?:`)((?:[^`]+))(?:`))/g;\r\nconst Code = Mark.create({\r\n name: 'code',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n excludes: '_',\r\n code: true,\r\n exitable: true,\r\n parseHTML() {\r\n return [\r\n { tag: 'code' },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['code', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setCode: () => ({ commands }) => {\r\n return commands.setMark(this.name);\r\n },\r\n toggleCode: () => ({ commands }) => {\r\n return commands.toggleMark(this.name);\r\n },\r\n unsetCode: () => ({ commands }) => {\r\n return commands.unsetMark(this.name);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-e': () => this.editor.commands.toggleCode(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n markInputRule({\r\n find: inputRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n addPasteRules() {\r\n return [\r\n markPasteRule({\r\n find: pasteRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { Code, Code as default, inputRegex, pasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/core';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\n\nconst backtickInputRegex = /^```([a-z]+)?[\\s\\n]$/;\r\nconst tildeInputRegex = /^~~~([a-z]+)?[\\s\\n]$/;\r\nconst CodeBlock = Node.create({\r\n name: 'codeBlock',\r\n addOptions() {\r\n return {\r\n languageClassPrefix: 'language-',\r\n exitOnTripleEnter: true,\r\n exitOnArrowDown: true,\r\n HTMLAttributes: {},\r\n };\r\n },\r\n content: 'text*',\r\n marks: '',\r\n group: 'block',\r\n code: true,\r\n defining: true,\r\n addAttributes() {\r\n return {\r\n language: {\r\n default: null,\r\n parseHTML: element => {\r\n var _a;\r\n const { languageClassPrefix } = this.options;\r\n const classNames = [...(((_a = element.firstElementChild) === null || _a === void 0 ? void 0 : _a.classList) || [])];\r\n const languages = classNames\r\n .filter(className => className.startsWith(languageClassPrefix))\r\n .map(className => className.replace(languageClassPrefix, ''));\r\n const language = languages[0];\r\n if (!language) {\r\n return null;\r\n }\r\n return language;\r\n },\r\n rendered: false,\r\n },\r\n };\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'pre',\r\n preserveWhitespace: 'full',\r\n },\r\n ];\r\n },\r\n renderHTML({ node, HTMLAttributes }) {\r\n return [\r\n 'pre',\r\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\r\n [\r\n 'code',\r\n {\r\n class: node.attrs.language\r\n ? this.options.languageClassPrefix + node.attrs.language\r\n : null,\r\n },\r\n 0,\r\n ],\r\n ];\r\n },\r\n addCommands() {\r\n return {\r\n setCodeBlock: attributes => ({ commands }) => {\r\n return commands.setNode(this.name, attributes);\r\n },\r\n toggleCodeBlock: attributes => ({ commands }) => {\r\n return commands.toggleNode(this.name, 'paragraph', attributes);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Alt-c': () => this.editor.commands.toggleCodeBlock(),\r\n // remove code block when at start of document or code block is empty\r\n Backspace: () => {\r\n const { empty, $anchor } = this.editor.state.selection;\r\n const isAtStart = $anchor.pos === 1;\r\n if (!empty || $anchor.parent.type.name !== this.name) {\r\n return false;\r\n }\r\n if (isAtStart || !$anchor.parent.textContent.length) {\r\n return this.editor.commands.clearNodes();\r\n }\r\n return false;\r\n },\r\n // exit node on triple enter\r\n Enter: ({ editor }) => {\r\n if (!this.options.exitOnTripleEnter) {\r\n return false;\r\n }\r\n const { state } = editor;\r\n const { selection } = state;\r\n const { $from, empty } = selection;\r\n if (!empty || $from.parent.type !== this.type) {\r\n return false;\r\n }\r\n const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2;\r\n const endsWithDoubleNewline = $from.parent.textContent.endsWith('\\n\\n');\r\n if (!isAtEnd || !endsWithDoubleNewline) {\r\n return false;\r\n }\r\n return editor\r\n .chain()\r\n .command(({ tr }) => {\r\n tr.delete($from.pos - 2, $from.pos);\r\n return true;\r\n })\r\n .exitCode()\r\n .run();\r\n },\r\n // exit node on arrow down\r\n ArrowDown: ({ editor }) => {\r\n if (!this.options.exitOnArrowDown) {\r\n return false;\r\n }\r\n const { state } = editor;\r\n const { selection, doc } = state;\r\n const { $from, empty } = selection;\r\n if (!empty || $from.parent.type !== this.type) {\r\n return false;\r\n }\r\n const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2;\r\n if (!isAtEnd) {\r\n return false;\r\n }\r\n const after = $from.after();\r\n if (after === undefined) {\r\n return false;\r\n }\r\n const nodeAfter = doc.nodeAt(after);\r\n if (nodeAfter) {\r\n return false;\r\n }\r\n return editor.commands.exitCode();\r\n },\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n textblockTypeInputRule({\r\n find: backtickInputRegex,\r\n type: this.type,\r\n getAttributes: match => ({\r\n language: match[1],\r\n }),\r\n }),\r\n textblockTypeInputRule({\r\n find: tildeInputRegex,\r\n type: this.type,\r\n getAttributes: match => ({\r\n language: match[1],\r\n }),\r\n }),\r\n ];\r\n },\r\n addProseMirrorPlugins() {\r\n return [\r\n // this plugin creates a code block for pasted content from VS Code\r\n // we can also detect the copied code language\r\n new Plugin({\r\n key: new PluginKey('codeBlockVSCodeHandler'),\r\n props: {\r\n handlePaste: (view, event) => {\r\n if (!event.clipboardData) {\r\n return false;\r\n }\r\n // don’t create a new code block within code blocks\r\n if (this.editor.isActive(this.type.name)) {\r\n return false;\r\n }\r\n const text = event.clipboardData.getData('text/plain');\r\n const vscode = event.clipboardData.getData('vscode-editor-data');\r\n const vscodeData = vscode ? JSON.parse(vscode) : undefined;\r\n const language = vscodeData === null || vscodeData === void 0 ? void 0 : vscodeData.mode;\r\n if (!text || !language) {\r\n return false;\r\n }\r\n const { tr } = view.state;\r\n // create an empty code block\r\n tr.replaceSelectionWith(this.type.create({ language }));\r\n // put cursor inside the newly created code block\r\n tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, tr.selection.from - 2))));\r\n // add text to code block\r\n // strip carriage return chars from text pasted as code\r\n // see: https://github.com/ProseMirror/prosemirror-view/commit/a50a6bcceb4ce52ac8fcc6162488d8875613aacd\r\n tr.insertText(text.replace(/\\r\\n?/g, '\\n'));\r\n // store meta information\r\n // this is useful for other plugins that depends on the paste event\r\n // like the paste rule plugin\r\n tr.setMeta('paste', true);\r\n view.dispatch(tr);\r\n return true;\r\n },\r\n },\r\n }),\r\n ];\r\n },\r\n});\n\nexport { CodeBlock, backtickInputRegex, CodeBlock as default, tildeInputRegex };\n//# sourceMappingURL=index.js.map\n","import { Node } from '@tiptap/core';\n\nconst Document = Node.create({\r\n name: 'doc',\r\n topNode: true,\r\n content: 'block+',\r\n});\n\nexport { Document, Document as default };\n//# sourceMappingURL=index.js.map\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n/**\nCreate a plugin that, when added to a ProseMirror instance,\ncauses a decoration to show up at the drop position when something\nis dragged over the editor.\n\nNodes may add a `disableDropCursor` property to their spec to\ncontrol the showing of a drop cursor inside them. This may be a\nboolean or a function, which will be called with a view and a\nposition, and should return a boolean.\n*/\nfunction dropCursor(options = {}) {\n return new Plugin({\n view(editorView) { return new DropCursorView(editorView, options); }\n });\n}\nclass DropCursorView {\n constructor(editorView, options) {\n this.editorView = editorView;\n this.cursorPos = null;\n this.element = null;\n this.timeout = -1;\n this.width = options.width || 1;\n this.color = options.color || \"black\";\n this.class = options.class;\n this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(name => {\n let handler = (e) => { this[name](e); };\n editorView.dom.addEventListener(name, handler);\n return { name, handler };\n });\n }\n destroy() {\n this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler));\n }\n update(editorView, prevState) {\n if (this.cursorPos != null && prevState.doc != editorView.state.doc) {\n if (this.cursorPos > editorView.state.doc.content.size)\n this.setCursor(null);\n else\n this.updateOverlay();\n }\n }\n setCursor(pos) {\n if (pos == this.cursorPos)\n return;\n this.cursorPos = pos;\n if (pos == null) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n }\n else {\n this.updateOverlay();\n }\n }\n updateOverlay() {\n let $pos = this.editorView.state.doc.resolve(this.cursorPos);\n let isBlock = !$pos.parent.inlineContent, rect;\n if (isBlock) {\n let before = $pos.nodeBefore, after = $pos.nodeAfter;\n if (before || after) {\n let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0));\n if (node) {\n let nodeRect = node.getBoundingClientRect();\n let top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after)\n top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2;\n rect = { left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2 };\n }\n }\n }\n if (!rect) {\n let coords = this.editorView.coordsAtPos(this.cursorPos);\n rect = { left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom };\n }\n let parent = this.editorView.dom.offsetParent;\n if (!this.element) {\n this.element = parent.appendChild(document.createElement(\"div\"));\n if (this.class)\n this.element.className = this.class;\n this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none; background-color: \" + this.color;\n }\n this.element.classList.toggle(\"prosemirror-dropcursor-block\", isBlock);\n this.element.classList.toggle(\"prosemirror-dropcursor-inline\", !isBlock);\n let parentLeft, parentTop;\n if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n parentLeft = -pageXOffset;\n parentTop = -pageYOffset;\n }\n else {\n let rect = parent.getBoundingClientRect();\n parentLeft = rect.left - parent.scrollLeft;\n parentTop = rect.top - parent.scrollTop;\n }\n this.element.style.left = (rect.left - parentLeft) + \"px\";\n this.element.style.top = (rect.top - parentTop) + \"px\";\n this.element.style.width = (rect.right - rect.left) + \"px\";\n this.element.style.height = (rect.bottom - rect.top) + \"px\";\n }\n scheduleRemoval(timeout) {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(() => this.setCursor(null), timeout);\n }\n dragover(event) {\n if (!this.editorView.editable)\n return;\n let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY });\n let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside);\n let disableDropCursor = node && node.type.spec.disableDropCursor;\n let disabled = typeof disableDropCursor == \"function\" ? disableDropCursor(this.editorView, pos, event) : disableDropCursor;\n if (pos && !disabled) {\n let target = pos.pos;\n if (this.editorView.dragging && this.editorView.dragging.slice) {\n target = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n if (target == null)\n return this.setCursor(null);\n }\n this.setCursor(target);\n this.scheduleRemoval(5000);\n }\n }\n dragend() {\n this.scheduleRemoval(20);\n }\n drop() {\n this.scheduleRemoval(20);\n }\n dragleave(event) {\n if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n this.setCursor(null);\n }\n}\n\nexport { dropCursor };\n","import { Extension } from '@tiptap/core';\nimport { dropCursor } from '@tiptap/pm/dropcursor';\n\nconst Dropcursor = Extension.create({\r\n name: 'dropCursor',\r\n addOptions() {\r\n return {\r\n color: 'currentColor',\r\n width: 1,\r\n class: undefined,\r\n };\r\n },\r\n addProseMirrorPlugins() {\r\n return [\r\n dropCursor(this.options),\r\n ];\r\n },\r\n});\n\nexport { Dropcursor, Dropcursor as default };\n//# sourceMappingURL=index.js.map\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { Selection, NodeSelection, TextSelection, Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\n\n/**\nGap cursor selections are represented using this class. Its\n`$anchor` and `$head` properties both point at the cursor position.\n*/\nclass GapCursor extends Selection {\n /**\n Create a gap cursor.\n */\n constructor($pos) {\n super($pos, $pos);\n }\n map(doc, mapping) {\n let $pos = doc.resolve(mapping.map(this.head));\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n }\n content() { return Slice.empty; }\n eq(other) {\n return other instanceof GapCursor && other.head == this.head;\n }\n toJSON() {\n return { type: \"gapcursor\", pos: this.head };\n }\n /**\n @internal\n */\n static fromJSON(doc, json) {\n if (typeof json.pos != \"number\")\n throw new RangeError(\"Invalid input for GapCursor.fromJSON\");\n return new GapCursor(doc.resolve(json.pos));\n }\n /**\n @internal\n */\n getBookmark() { return new GapBookmark(this.anchor); }\n /**\n @internal\n */\n static valid($pos) {\n let parent = $pos.parent;\n if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos))\n return false;\n let override = parent.type.spec.allowGapCursor;\n if (override != null)\n return override;\n let deflt = parent.contentMatchAt($pos.index()).defaultType;\n return deflt && deflt.isTextblock;\n }\n /**\n @internal\n */\n static findGapCursorFrom($pos, dir, mustMove = false) {\n search: for (;;) {\n if (!mustMove && GapCursor.valid($pos))\n return $pos;\n let pos = $pos.pos, next = null;\n // Scan up from this position\n for (let d = $pos.depth;; d--) {\n let parent = $pos.node(d);\n if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n break;\n }\n else if (d == 0) {\n return null;\n }\n pos += dir;\n let $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur))\n return $cur;\n }\n // And then down into the next node\n for (;;) {\n let inside = dir > 0 ? next.firstChild : next.lastChild;\n if (!inside) {\n if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n mustMove = false;\n continue search;\n }\n break;\n }\n next = inside;\n pos += dir;\n let $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur))\n return $cur;\n }\n return null;\n }\n }\n}\nGapCursor.prototype.visible = false;\nGapCursor.findFrom = GapCursor.findGapCursorFrom;\nSelection.jsonID(\"gapcursor\", GapCursor);\nclass GapBookmark {\n constructor(pos) {\n this.pos = pos;\n }\n map(mapping) {\n return new GapBookmark(mapping.map(this.pos));\n }\n resolve(doc) {\n let $pos = doc.resolve(this.pos);\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n }\n}\nfunction closedBefore($pos) {\n for (let d = $pos.depth; d >= 0; d--) {\n let index = $pos.index(d), parent = $pos.node(d);\n // At the start of this parent, look at next one\n if (index == 0) {\n if (parent.type.spec.isolating)\n return true;\n continue;\n }\n // See if the node before (or its first ancestor) is closed\n for (let before = parent.child(index - 1);; before = before.lastChild) {\n if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating)\n return true;\n if (before.inlineContent)\n return false;\n }\n }\n // Hit start of document\n return true;\n}\nfunction closedAfter($pos) {\n for (let d = $pos.depth; d >= 0; d--) {\n let index = $pos.indexAfter(d), parent = $pos.node(d);\n if (index == parent.childCount) {\n if (parent.type.spec.isolating)\n return true;\n continue;\n }\n for (let after = parent.child(index);; after = after.firstChild) {\n if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating)\n return true;\n if (after.inlineContent)\n return false;\n }\n }\n return true;\n}\n\n/**\nCreate a gap cursor plugin. When enabled, this will capture clicks\nnear and arrow-key-motion past places that don't have a normally\nselectable position nearby, and create a gap cursor selection for\nthem. The cursor is drawn as an element with class\n`ProseMirror-gapcursor`. You can either include\n`style/gapcursor.css` from the package's directory or add your own\nstyles to make it visible.\n*/\nfunction gapCursor() {\n return new Plugin({\n props: {\n decorations: drawGapCursor,\n createSelectionBetween(_view, $anchor, $head) {\n return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null;\n },\n handleClick,\n handleKeyDown,\n handleDOMEvents: { beforeinput: beforeinput }\n }\n });\n}\nconst handleKeyDown = keydownHandler({\n \"ArrowLeft\": arrow(\"horiz\", -1),\n \"ArrowRight\": arrow(\"horiz\", 1),\n \"ArrowUp\": arrow(\"vert\", -1),\n \"ArrowDown\": arrow(\"vert\", 1)\n});\nfunction arrow(axis, dir) {\n const dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n return function (state, dispatch, view) {\n let sel = state.selection;\n let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n if (sel instanceof TextSelection) {\n if (!view.endOfTextblock(dirStr) || $start.depth == 0)\n return false;\n mustMove = false;\n $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n }\n let $found = GapCursor.findGapCursorFrom($start, dir, mustMove);\n if (!$found)\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(new GapCursor($found)));\n return true;\n };\n}\nfunction handleClick(view, pos, event) {\n if (!view || !view.editable)\n return false;\n let $pos = view.state.doc.resolve(pos);\n if (!GapCursor.valid($pos))\n return false;\n let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside)))\n return false;\n view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n return true;\n}\n// This is a hack that, when a composition starts while a gap cursor\n// is active, quickly creates an inline context for the composition to\n// happen in, to avoid it being aborted by the DOM selection being\n// moved into a valid position.\nfunction beforeinput(view, event) {\n if (event.inputType != \"insertCompositionText\" || !(view.state.selection instanceof GapCursor))\n return false;\n let { $from } = view.state.selection;\n let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text);\n if (!insert)\n return false;\n let frag = Fragment.empty;\n for (let i = insert.length - 1; i >= 0; i--)\n frag = Fragment.from(insert[i].createAndFill(null, frag));\n let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0));\n tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1)));\n view.dispatch(tr);\n return false;\n}\nfunction drawGapCursor(state) {\n if (!(state.selection instanceof GapCursor))\n return null;\n let node = document.createElement(\"div\");\n node.className = \"ProseMirror-gapcursor\";\n return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: \"gapcursor\" })]);\n}\n\nexport { GapCursor, gapCursor };\n","import { Extension, callOrReturn, getExtensionField } from '@tiptap/core';\nimport { gapCursor } from '@tiptap/pm/gapcursor';\n\nconst Gapcursor = Extension.create({\r\n name: 'gapCursor',\r\n addProseMirrorPlugins() {\r\n return [\r\n gapCursor(),\r\n ];\r\n },\r\n extendNodeSchema(extension) {\r\n var _a;\r\n const context = {\r\n name: extension.name,\r\n options: extension.options,\r\n storage: extension.storage,\r\n };\r\n return {\r\n allowGapCursor: (_a = callOrReturn(getExtensionField(extension, 'allowGapCursor', context))) !== null && _a !== void 0 ? _a : null,\r\n };\r\n },\r\n});\n\nexport { Gapcursor, Gapcursor as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes } from '@tiptap/core';\n\nconst HardBreak = Node.create({\r\n name: 'hardBreak',\r\n addOptions() {\r\n return {\r\n keepMarks: true,\r\n HTMLAttributes: {},\r\n };\r\n },\r\n inline: true,\r\n group: 'inline',\r\n selectable: false,\r\n parseHTML() {\r\n return [\r\n { tag: 'br' },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['br', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\r\n },\r\n renderText() {\r\n return '\\n';\r\n },\r\n addCommands() {\r\n return {\r\n setHardBreak: () => ({ commands, chain, state, editor, }) => {\r\n return commands.first([\r\n () => commands.exitCode(),\r\n () => commands.command(() => {\r\n const { selection, storedMarks } = state;\r\n if (selection.$from.parent.type.spec.isolating) {\r\n return false;\r\n }\r\n const { keepMarks } = this.options;\r\n const { splittableMarks } = editor.extensionManager;\r\n const marks = storedMarks\r\n || (selection.$to.parentOffset && selection.$from.marks());\r\n return chain()\r\n .insertContent({ type: this.name })\r\n .command(({ tr, dispatch }) => {\r\n if (dispatch && marks && keepMarks) {\r\n const filteredMarks = marks\r\n .filter(mark => splittableMarks.includes(mark.type.name));\r\n tr.ensureMarks(filteredMarks);\r\n }\r\n return true;\r\n })\r\n .run();\r\n }),\r\n ]);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Enter': () => this.editor.commands.setHardBreak(),\r\n 'Shift-Enter': () => this.editor.commands.setHardBreak(),\r\n };\r\n },\r\n});\n\nexport { HardBreak, HardBreak as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/core';\n\nconst Heading = Node.create({\r\n name: 'heading',\r\n addOptions() {\r\n return {\r\n levels: [1, 2, 3, 4, 5, 6],\r\n HTMLAttributes: {},\r\n };\r\n },\r\n content: 'inline*',\r\n group: 'block',\r\n defining: true,\r\n addAttributes() {\r\n return {\r\n level: {\r\n default: 1,\r\n rendered: false,\r\n },\r\n };\r\n },\r\n parseHTML() {\r\n return this.options.levels\r\n .map((level) => ({\r\n tag: `h${level}`,\r\n attrs: { level },\r\n }));\r\n },\r\n renderHTML({ node, HTMLAttributes }) {\r\n const hasLevel = this.options.levels.includes(node.attrs.level);\r\n const level = hasLevel\r\n ? node.attrs.level\r\n : this.options.levels[0];\r\n return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setHeading: attributes => ({ commands }) => {\r\n if (!this.options.levels.includes(attributes.level)) {\r\n return false;\r\n }\r\n return commands.setNode(this.name, attributes);\r\n },\r\n toggleHeading: attributes => ({ commands }) => {\r\n if (!this.options.levels.includes(attributes.level)) {\r\n return false;\r\n }\r\n return commands.toggleNode(this.name, 'paragraph', attributes);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return this.options.levels.reduce((items, level) => ({\r\n ...items,\r\n ...{\r\n [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }),\r\n },\r\n }), {});\r\n },\r\n addInputRules() {\r\n return this.options.levels.map(level => {\r\n return textblockTypeInputRule({\r\n find: new RegExp(`^(#{1,${level}})\\\\s$`),\r\n type: this.type,\r\n getAttributes: {\r\n level,\r\n },\r\n });\r\n });\r\n },\r\n});\n\nexport { Heading, Heading as default };\n//# sourceMappingURL=index.js.map\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class<T> A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n if (!other.length) { return this }\n other = RopeSequence.from(other);\n\n return (!this.length && other) ||\n (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n if (!other.length) { return this }\n return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence<T>\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from >= to) { return RopeSequence.empty }\n return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n if (i < 0 || i >= this.length) { return undefined }\n return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from <= to)\n { this.forEachInner(f, from, to, 0); }\n else\n { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n var result = [];\n this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n return result\n};\n\n// :: (?union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n if (values instanceof RopeSequence) { return values }\n return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n function Leaf(values) {\n RopeSequence.call(this);\n this.values = values;\n }\n\n if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Leaf.prototype.constructor = Leaf;\n\n var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n Leaf.prototype.flatten = function flatten () {\n return this.values\n };\n\n Leaf.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n return new Leaf(this.values.slice(from, to))\n };\n\n Leaf.prototype.getInner = function getInner (i) {\n return this.values[i]\n };\n\n Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n for (var i = from; i < to; i++)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n for (var i = from - 1; i >= to; i--)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.leafAppend = function leafAppend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(this.values.concat(other.flatten())) }\n };\n\n Leaf.prototype.leafPrepend = function leafPrepend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(other.flatten().concat(this.values)) }\n };\n\n prototypeAccessors.length.get = function () { return this.values.length };\n\n prototypeAccessors.depth.get = function () { return 0 };\n\n Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n function Append(left, right) {\n RopeSequence.call(this);\n this.left = left;\n this.right = right;\n this.length = left.length + right.length;\n this.depth = Math.max(left.depth, right.depth) + 1;\n }\n\n if ( RopeSequence ) Append.__proto__ = RopeSequence;\n Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Append.prototype.constructor = Append;\n\n Append.prototype.flatten = function flatten () {\n return this.left.flatten().concat(this.right.flatten())\n };\n\n Append.prototype.getInner = function getInner (i) {\n return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n };\n\n Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from < leftLen &&\n this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n { return false }\n if (to > leftLen &&\n this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n { return false }\n };\n\n Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from > leftLen &&\n this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n { return false }\n if (to < leftLen &&\n this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n { return false }\n };\n\n Append.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n var leftLen = this.left.length;\n if (to <= leftLen) { return this.left.slice(from, to) }\n if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n };\n\n Append.prototype.leafAppend = function leafAppend (other) {\n var inner = this.right.leafAppend(other);\n if (inner) { return new Append(this.left, inner) }\n };\n\n Append.prototype.leafPrepend = function leafPrepend (other) {\n var inner = this.left.leafPrepend(other);\n if (inner) { return new Append(inner, this.right) }\n };\n\n Append.prototype.appendInner = function appendInner (other) {\n if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n { return new Append(this.left, new Append(this.right, other)) }\n return new Append(this, other)\n };\n\n return Append;\n}(RopeSequence));\n\nvar ropeSequence = RopeSequence;\n\nexport default ropeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n// Used to schedule history compression\nconst max_empty_items = 500;\nclass Branch {\n constructor(items, eventCount) {\n this.items = items;\n this.eventCount = eventCount;\n }\n // Pop the latest event off the branch's history and apply it\n // to a document transform.\n popEvent(state, preserveItems) {\n if (this.eventCount == 0)\n return null;\n let end = this.items.length;\n for (;; end--) {\n let next = this.items.get(end - 1);\n if (next.selection) {\n --end;\n break;\n }\n }\n let remap, mapFrom;\n if (preserveItems) {\n remap = this.remapping(end, this.items.length);\n mapFrom = remap.maps.length;\n }\n let transform = state.tr;\n let selection, remaining;\n let addAfter = [], addBefore = [];\n this.items.forEach((item, i) => {\n if (!item.step) {\n if (!remap) {\n remap = this.remapping(end, i + 1);\n mapFrom = remap.maps.length;\n }\n mapFrom--;\n addBefore.push(item);\n return;\n }\n if (remap) {\n addBefore.push(new Item(item.map));\n let step = item.step.map(remap.slice(mapFrom)), map;\n if (step && transform.maybeStep(step).doc) {\n map = transform.mapping.maps[transform.mapping.maps.length - 1];\n addAfter.push(new Item(map, undefined, undefined, addAfter.length + addBefore.length));\n }\n mapFrom--;\n if (map)\n remap.appendMap(map, mapFrom);\n }\n else {\n transform.maybeStep(item.step);\n }\n if (item.selection) {\n selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n remaining = new Branch(this.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);\n return false;\n }\n }, this.items.length, 0);\n return { remaining: remaining, transform, selection: selection };\n }\n // Create a new branch with the given transform added.\n addTransform(transform, selection, histOptions, preserveItems) {\n let newItems = [], eventCount = this.eventCount;\n let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n for (let i = 0; i < transform.steps.length; i++) {\n let step = transform.steps[i].invert(transform.docs[i]);\n let item = new Item(transform.mapping.maps[i], step, selection), merged;\n if (merged = lastItem && lastItem.merge(item)) {\n item = merged;\n if (i)\n newItems.pop();\n else\n oldItems = oldItems.slice(0, oldItems.length - 1);\n }\n newItems.push(item);\n if (selection) {\n eventCount++;\n selection = undefined;\n }\n if (!preserveItems)\n lastItem = item;\n }\n let overflow = eventCount - histOptions.depth;\n if (overflow > DEPTH_OVERFLOW) {\n oldItems = cutOffEvents(oldItems, overflow);\n eventCount -= overflow;\n }\n return new Branch(oldItems.append(newItems), eventCount);\n }\n remapping(from, to) {\n let maps = new Mapping;\n this.items.forEach((item, i) => {\n let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n ? maps.maps.length - item.mirrorOffset : undefined;\n maps.appendMap(item.map, mirrorPos);\n }, from, to);\n return maps;\n }\n addMaps(array) {\n if (this.eventCount == 0)\n return this;\n return new Branch(this.items.append(array.map(map => new Item(map))), this.eventCount);\n }\n // When the collab module receives remote changes, the history has\n // to know about those, so that it can adjust the steps that were\n // rebased on top of the remote changes, and include the position\n // maps for the remote changes in its array of items.\n rebased(rebasedTransform, rebasedCount) {\n if (!this.eventCount)\n return this;\n let rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n let mapping = rebasedTransform.mapping;\n let newUntil = rebasedTransform.steps.length;\n let eventCount = this.eventCount;\n this.items.forEach(item => { if (item.selection)\n eventCount--; }, start);\n let iRebased = rebasedCount;\n this.items.forEach(item => {\n let pos = mapping.getMirror(--iRebased);\n if (pos == null)\n return;\n newUntil = Math.min(newUntil, pos);\n let map = mapping.maps[pos];\n if (item.step) {\n let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n if (selection)\n eventCount++;\n rebasedItems.push(new Item(map, step, selection));\n }\n else {\n rebasedItems.push(new Item(map));\n }\n }, start);\n let newMaps = [];\n for (let i = rebasedCount; i < newUntil; i++)\n newMaps.push(new Item(mapping.maps[i]));\n let items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n let branch = new Branch(items, eventCount);\n if (branch.emptyItemCount() > max_empty_items)\n branch = branch.compress(this.items.length - rebasedItems.length);\n return branch;\n }\n emptyItemCount() {\n let count = 0;\n this.items.forEach(item => { if (!item.step)\n count++; });\n return count;\n }\n // Compressing a branch means rewriting it to push the air (map-only\n // items) out. During collaboration, these naturally accumulate\n // because each remote change adds one. The `upto` argument is used\n // to ensure that only the items below a given level are compressed,\n // because `rebased` relies on a clean, untouched set of items in\n // order to associate old items with rebased steps.\n compress(upto = this.items.length) {\n let remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n let items = [], events = 0;\n this.items.forEach((item, i) => {\n if (i >= upto) {\n items.push(item);\n if (item.selection)\n events++;\n }\n else if (item.step) {\n let step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n mapFrom--;\n if (map)\n remap.appendMap(map, mapFrom);\n if (step) {\n let selection = item.selection && item.selection.map(remap.slice(mapFrom));\n if (selection)\n events++;\n let newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n if (merged = items.length && items[last].merge(newItem))\n items[last] = merged;\n else\n items.push(newItem);\n }\n }\n else if (item.map) {\n mapFrom--;\n }\n }, this.items.length, 0);\n return new Branch(RopeSequence.from(items.reverse()), events);\n }\n}\nBranch.empty = new Branch(RopeSequence.empty, 0);\nfunction cutOffEvents(items, n) {\n let cutPoint;\n items.forEach((item, i) => {\n if (item.selection && (n-- == 0)) {\n cutPoint = i;\n return false;\n }\n });\n return items.slice(cutPoint);\n}\nclass Item {\n constructor(\n // The (forward) step map for this item.\n map, \n // The inverted step\n step, \n // If this is non-null, this item is the start of a group, and\n // this selection is the starting selection for the group (the one\n // that was active before the first step was applied)\n selection, \n // If this item is the inverse of a previous mapping on the stack,\n // this points at the inverse's offset\n mirrorOffset) {\n this.map = map;\n this.step = step;\n this.selection = selection;\n this.mirrorOffset = mirrorOffset;\n }\n merge(other) {\n if (this.step && other.step && !other.selection) {\n let step = other.step.merge(this.step);\n if (step)\n return new Item(step.getMap().invert(), step, this.selection);\n }\n }\n}\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nclass HistoryState {\n constructor(done, undone, prevRanges, prevTime) {\n this.done = done;\n this.undone = undone;\n this.prevRanges = prevRanges;\n this.prevTime = prevTime;\n }\n}\nconst DEPTH_OVERFLOW = 20;\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n let historyTr = tr.getMeta(historyKey), rebased;\n if (historyTr)\n return historyTr.historyState;\n if (tr.getMeta(closeHistoryKey))\n history = new HistoryState(history.done, history.undone, null, 0);\n let appended = tr.getMeta(\"appendedTransaction\");\n if (tr.steps.length == 0) {\n return history;\n }\n else if (appended && appended.getMeta(historyKey)) {\n if (appended.getMeta(historyKey).redo)\n return new HistoryState(history.done.addTransform(tr, undefined, options, mustPreserveItems(state)), history.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history.prevTime);\n else\n return new HistoryState(history.done, history.undone.addTransform(tr, undefined, options, mustPreserveItems(state)), null, history.prevTime);\n }\n else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n // Group transforms that occur in quick succession into one event.\n let newGroup = history.prevTime == 0 || !appended && (history.prevTime < (tr.time || 0) - options.newGroupDelay ||\n !isAdjacentTo(tr, history.prevRanges));\n let prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);\n return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : undefined, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time);\n }\n else if (rebased = tr.getMeta(\"rebased\")) {\n // Used by the collab module to tell the history that some of its\n // content has been rebased.\n return new HistoryState(history.done.rebased(tr, rebased), history.undone.rebased(tr, rebased), mapRanges(history.prevRanges, tr.mapping), history.prevTime);\n }\n else {\n return new HistoryState(history.done.addMaps(tr.mapping.maps), history.undone.addMaps(tr.mapping.maps), mapRanges(history.prevRanges, tr.mapping), history.prevTime);\n }\n}\nfunction isAdjacentTo(transform, prevRanges) {\n if (!prevRanges)\n return false;\n if (!transform.docChanged)\n return true;\n let adjacent = false;\n transform.mapping.maps[0].forEach((start, end) => {\n for (let i = 0; i < prevRanges.length; i += 2)\n if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n adjacent = true;\n });\n return adjacent;\n}\nfunction rangesFor(map) {\n let result = [];\n map.forEach((_from, _to, from, to) => result.push(from, to));\n return result;\n}\nfunction mapRanges(ranges, mapping) {\n if (!ranges)\n return null;\n let result = [];\n for (let i = 0; i < ranges.length; i += 2) {\n let from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n if (from <= to)\n result.push(from, to);\n }\n return result;\n}\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, dispatch, redo) {\n let preserveItems = mustPreserveItems(state);\n let histOptions = historyKey.get(state).spec.config;\n let pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n if (!pop)\n return;\n let selection = pop.selection.resolve(pop.transform.doc);\n let added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);\n let newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0);\n dispatch(pop.transform.setSelection(selection).setMeta(historyKey, { redo, historyState: newHist }).scrollIntoView());\n}\nlet cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n let plugins = state.plugins;\n if (cachedPreserveItemsPlugins != plugins) {\n cachedPreserveItems = false;\n cachedPreserveItemsPlugins = plugins;\n for (let i = 0; i < plugins.length; i++)\n if (plugins[i].spec.historyPreserveItems) {\n cachedPreserveItems = true;\n break;\n }\n }\n return cachedPreserveItems;\n}\n/**\nSet a flag on the given transaction that will prevent further steps\nfrom being appended to an existing history event (so that they\nrequire a separate undo command to undo).\n*/\nfunction closeHistory(tr) {\n return tr.setMeta(closeHistoryKey, true);\n}\nconst historyKey = new PluginKey(\"history\");\nconst closeHistoryKey = new PluginKey(\"closeHistory\");\n/**\nReturns a plugin that enables the undo history for an editor. The\nplugin will track undo and redo stacks, which can be used with the\n[`undo`](https://prosemirror.net/docs/ref/#history.undo) and [`redo`](https://prosemirror.net/docs/ref/#history.redo) commands.\n\nYou can set an `\"addToHistory\"` [metadata\nproperty](https://prosemirror.net/docs/ref/#state.Transaction.setMeta) of `false` on a transaction\nto prevent it from being rolled back by undo.\n*/\nfunction history(config = {}) {\n config = { depth: config.depth || 100,\n newGroupDelay: config.newGroupDelay || 500 };\n return new Plugin({\n key: historyKey,\n state: {\n init() {\n return new HistoryState(Branch.empty, Branch.empty, null, 0);\n },\n apply(tr, hist, state) {\n return applyTransaction(hist, state, tr, config);\n }\n },\n config,\n props: {\n handleDOMEvents: {\n beforeinput(view, e) {\n let inputType = e.inputType;\n let command = inputType == \"historyUndo\" ? undo : inputType == \"historyRedo\" ? redo : null;\n if (!command)\n return false;\n e.preventDefault();\n return command(view.state, view.dispatch);\n }\n }\n }\n });\n}\n/**\nA command function that undoes the last change, if any.\n*/\nconst undo = (state, dispatch) => {\n let hist = historyKey.getState(state);\n if (!hist || hist.done.eventCount == 0)\n return false;\n if (dispatch)\n histTransaction(hist, state, dispatch, false);\n return true;\n};\n/**\nA command function that redoes the last undone change, if any.\n*/\nconst redo = (state, dispatch) => {\n let hist = historyKey.getState(state);\n if (!hist || hist.undone.eventCount == 0)\n return false;\n if (dispatch)\n histTransaction(hist, state, dispatch, true);\n return true;\n};\n/**\nThe amount of undoable events available in a given state.\n*/\nfunction undoDepth(state) {\n let hist = historyKey.getState(state);\n return hist ? hist.done.eventCount : 0;\n}\n/**\nThe amount of redoable events available in a given editor state.\n*/\nfunction redoDepth(state) {\n let hist = historyKey.getState(state);\n return hist ? hist.undone.eventCount : 0;\n}\n\nexport { closeHistory, history, redo, redoDepth, undo, undoDepth };\n","import { Extension } from '@tiptap/core';\nimport { undo, redo, history } from '@tiptap/pm/history';\n\nconst History = Extension.create({\r\n name: 'history',\r\n addOptions() {\r\n return {\r\n depth: 100,\r\n newGroupDelay: 500,\r\n };\r\n },\r\n addCommands() {\r\n return {\r\n undo: () => ({ state, dispatch }) => {\r\n return undo(state, dispatch);\r\n },\r\n redo: () => ({ state, dispatch }) => {\r\n return redo(state, dispatch);\r\n },\r\n };\r\n },\r\n addProseMirrorPlugins() {\r\n return [\r\n history(this.options),\r\n ];\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-z': () => this.editor.commands.undo(),\r\n 'Mod-y': () => this.editor.commands.redo(),\r\n 'Shift-Mod-z': () => this.editor.commands.redo(),\r\n // Russian keyboard layouts\r\n 'Mod-я': () => this.editor.commands.undo(),\r\n 'Shift-Mod-я': () => this.editor.commands.redo(),\r\n };\r\n },\r\n});\n\nexport { History, History as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, nodeInputRule } from '@tiptap/core';\nimport { TextSelection } from '@tiptap/pm/state';\n\nconst HorizontalRule = Node.create({\r\n name: 'horizontalRule',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n group: 'block',\r\n parseHTML() {\r\n return [{ tag: 'hr' }];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['hr', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\r\n },\r\n addCommands() {\r\n return {\r\n setHorizontalRule: () => ({ chain }) => {\r\n return (chain()\r\n .insertContent({ type: this.name })\r\n // set cursor after horizontal rule\r\n .command(({ tr, dispatch }) => {\r\n var _a;\r\n if (dispatch) {\r\n const { $to } = tr.selection;\r\n const posAfter = $to.end();\r\n if ($to.nodeAfter) {\r\n tr.setSelection(TextSelection.create(tr.doc, $to.pos));\r\n }\r\n else {\r\n // add node after horizontal rule if it’s the end of the document\r\n const node = (_a = $to.parent.type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.create();\r\n if (node) {\r\n tr.insert(posAfter, node);\r\n tr.setSelection(TextSelection.create(tr.doc, posAfter));\r\n }\r\n }\r\n tr.scrollIntoView();\r\n }\r\n return true;\r\n })\r\n .run());\r\n },\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n nodeInputRule({\r\n find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { HorizontalRule, HorizontalRule as default };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\nconst starInputRegex = /(?:^|\\s)((?:\\*)((?:[^*]+))(?:\\*))$/;\r\nconst starPasteRegex = /(?:^|\\s)((?:\\*)((?:[^*]+))(?:\\*))/g;\r\nconst underscoreInputRegex = /(?:^|\\s)((?:_)((?:[^_]+))(?:_))$/;\r\nconst underscorePasteRegex = /(?:^|\\s)((?:_)((?:[^_]+))(?:_))/g;\r\nconst Italic = Mark.create({\r\n name: 'italic',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'em',\r\n },\r\n {\r\n tag: 'i',\r\n getAttrs: node => node.style.fontStyle !== 'normal' && null,\r\n },\r\n {\r\n style: 'font-style=italic',\r\n },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['em', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setItalic: () => ({ commands }) => {\r\n return commands.setMark(this.name);\r\n },\r\n toggleItalic: () => ({ commands }) => {\r\n return commands.toggleMark(this.name);\r\n },\r\n unsetItalic: () => ({ commands }) => {\r\n return commands.unsetMark(this.name);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-i': () => this.editor.commands.toggleItalic(),\r\n 'Mod-I': () => this.editor.commands.toggleItalic(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n markInputRule({\r\n find: starInputRegex,\r\n type: this.type,\r\n }),\r\n markInputRule({\r\n find: underscoreInputRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n addPasteRules() {\r\n return [\r\n markPasteRule({\r\n find: starPasteRegex,\r\n type: this.type,\r\n }),\r\n markPasteRule({\r\n find: underscorePasteRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { Italic, Italic as default, starInputRegex, starPasteRegex, underscoreInputRegex, underscorePasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes } from '@tiptap/core';\n\nconst ListItem = Node.create({\r\n name: 'listItem',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n content: 'paragraph block*',\r\n defining: true,\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'li',\r\n },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n Enter: () => this.editor.commands.splitListItem(this.name),\r\n Tab: () => this.editor.commands.sinkListItem(this.name),\r\n 'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\r\n };\r\n },\r\n});\n\nexport { ListItem, ListItem as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core';\n\nconst inputRegex = /^(\\d+)\\.\\s$/;\r\nconst OrderedList = Node.create({\r\n name: 'orderedList',\r\n addOptions() {\r\n return {\r\n itemTypeName: 'listItem',\r\n HTMLAttributes: {},\r\n };\r\n },\r\n group: 'block list',\r\n content() {\r\n return `${this.options.itemTypeName}+`;\r\n },\r\n addAttributes() {\r\n return {\r\n start: {\r\n default: 1,\r\n parseHTML: element => {\r\n return element.hasAttribute('start')\r\n ? parseInt(element.getAttribute('start') || '', 10)\r\n : 1;\r\n },\r\n },\r\n };\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 'ol',\r\n },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { start, ...attributesWithoutStart } = HTMLAttributes;\r\n return start === 1\r\n ? ['ol', mergeAttributes(this.options.HTMLAttributes, attributesWithoutStart), 0]\r\n : ['ol', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n toggleOrderedList: () => ({ commands }) => {\r\n return commands.toggleList(this.name, this.options.itemTypeName);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Shift-7': () => this.editor.commands.toggleOrderedList(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n wrappingInputRule({\r\n find: inputRegex,\r\n type: this.type,\r\n getAttributes: match => ({ start: +match[1] }),\r\n joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1],\r\n }),\r\n ];\r\n },\r\n});\n\nexport { OrderedList, OrderedList as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes } from '@tiptap/core';\n\nconst Paragraph = Node.create({\r\n name: 'paragraph',\r\n priority: 1000,\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n group: 'block',\r\n content: 'inline*',\r\n parseHTML() {\r\n return [\r\n { tag: 'p' },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['p', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setParagraph: () => ({ commands }) => {\r\n return commands.setNode(this.name);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Alt-0': () => this.editor.commands.setParagraph(),\r\n };\r\n },\r\n});\n\nexport { Paragraph, Paragraph as default };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\nconst inputRegex = /(?:^|\\s)((?:~~)((?:[^~]+))(?:~~))$/;\r\nconst pasteRegex = /(?:^|\\s)((?:~~)((?:[^~]+))(?:~~))/g;\r\nconst Strike = Mark.create({\r\n name: 'strike',\r\n addOptions() {\r\n return {\r\n HTMLAttributes: {},\r\n };\r\n },\r\n parseHTML() {\r\n return [\r\n {\r\n tag: 's',\r\n },\r\n {\r\n tag: 'del',\r\n },\r\n {\r\n tag: 'strike',\r\n },\r\n {\r\n style: 'text-decoration',\r\n consuming: false,\r\n getAttrs: style => (style.includes('line-through') ? {} : false),\r\n },\r\n ];\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n return ['s', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n },\r\n addCommands() {\r\n return {\r\n setStrike: () => ({ commands }) => {\r\n return commands.setMark(this.name);\r\n },\r\n toggleStrike: () => ({ commands }) => {\r\n return commands.toggleMark(this.name);\r\n },\r\n unsetStrike: () => ({ commands }) => {\r\n return commands.unsetMark(this.name);\r\n },\r\n };\r\n },\r\n addKeyboardShortcuts() {\r\n return {\r\n 'Mod-Shift-x': () => this.editor.commands.toggleStrike(),\r\n };\r\n },\r\n addInputRules() {\r\n return [\r\n markInputRule({\r\n find: inputRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n addPasteRules() {\r\n return [\r\n markPasteRule({\r\n find: pasteRegex,\r\n type: this.type,\r\n }),\r\n ];\r\n },\r\n});\n\nexport { Strike, Strike as default, inputRegex, pasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node } from '@tiptap/core';\n\nconst Text = Node.create({\r\n name: 'text',\r\n group: 'inline',\r\n});\n\nexport { Text, Text as default };\n//# sourceMappingURL=index.js.map\n","import { Extension } from '@tiptap/core';\nimport { Blockquote } from '@tiptap/extension-blockquote';\nimport { Bold } from '@tiptap/extension-bold';\nimport { BulletList } from '@tiptap/extension-bullet-list';\nimport { Code } from '@tiptap/extension-code';\nimport { CodeBlock } from '@tiptap/extension-code-block';\nimport { Document } from '@tiptap/extension-document';\nimport { Dropcursor } from '@tiptap/extension-dropcursor';\nimport { Gapcursor } from '@tiptap/extension-gapcursor';\nimport { HardBreak } from '@tiptap/extension-hard-break';\nimport { Heading } from '@tiptap/extension-heading';\nimport { History } from '@tiptap/extension-history';\nimport { HorizontalRule } from '@tiptap/extension-horizontal-rule';\nimport { Italic } from '@tiptap/extension-italic';\nimport { ListItem } from '@tiptap/extension-list-item';\nimport { OrderedList } from '@tiptap/extension-ordered-list';\nimport { Paragraph } from '@tiptap/extension-paragraph';\nimport { Strike } from '@tiptap/extension-strike';\nimport { Text } from '@tiptap/extension-text';\n\nconst StarterKit = Extension.create({\r\n name: 'starterKit',\r\n addExtensions() {\r\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\r\n const extensions = [];\r\n if (this.options.blockquote !== false) {\r\n extensions.push(Blockquote.configure((_a = this.options) === null || _a === void 0 ? void 0 : _a.blockquote));\r\n }\r\n if (this.options.bold !== false) {\r\n extensions.push(Bold.configure((_b = this.options) === null || _b === void 0 ? void 0 : _b.bold));\r\n }\r\n if (this.options.bulletList !== false) {\r\n extensions.push(BulletList.configure((_c = this.options) === null || _c === void 0 ? void 0 : _c.bulletList));\r\n }\r\n if (this.options.code !== false) {\r\n extensions.push(Code.configure((_d = this.options) === null || _d === void 0 ? void 0 : _d.code));\r\n }\r\n if (this.options.codeBlock !== false) {\r\n extensions.push(CodeBlock.configure((_e = this.options) === null || _e === void 0 ? void 0 : _e.codeBlock));\r\n }\r\n if (this.options.document !== false) {\r\n extensions.push(Document.configure((_f = this.options) === null || _f === void 0 ? void 0 : _f.document));\r\n }\r\n if (this.options.dropcursor !== false) {\r\n extensions.push(Dropcursor.configure((_g = this.options) === null || _g === void 0 ? void 0 : _g.dropcursor));\r\n }\r\n if (this.options.gapcursor !== false) {\r\n extensions.push(Gapcursor.configure((_h = this.options) === null || _h === void 0 ? void 0 : _h.gapcursor));\r\n }\r\n if (this.options.hardBreak !== false) {\r\n extensions.push(HardBreak.configure((_j = this.options) === null || _j === void 0 ? void 0 : _j.hardBreak));\r\n }\r\n if (this.options.heading !== false) {\r\n extensions.push(Heading.configure((_k = this.options) === null || _k === void 0 ? void 0 : _k.heading));\r\n }\r\n if (this.options.history !== false) {\r\n extensions.push(History.configure((_l = this.options) === null || _l === void 0 ? void 0 : _l.history));\r\n }\r\n if (this.options.horizontalRule !== false) {\r\n extensions.push(HorizontalRule.configure((_m = this.options) === null || _m === void 0 ? void 0 : _m.horizontalRule));\r\n }\r\n if (this.options.italic !== false) {\r\n extensions.push(Italic.configure((_o = this.options) === null || _o === void 0 ? void 0 : _o.italic));\r\n }\r\n if (this.options.listItem !== false) {\r\n extensions.push(ListItem.configure((_p = this.options) === null || _p === void 0 ? void 0 : _p.listItem));\r\n }\r\n if (this.options.orderedList !== false) {\r\n extensions.push(OrderedList.configure((_q = this.options) === null || _q === void 0 ? void 0 : _q.orderedList));\r\n }\r\n if (this.options.paragraph !== false) {\r\n extensions.push(Paragraph.configure((_r = this.options) === null || _r === void 0 ? void 0 : _r.paragraph));\r\n }\r\n if (this.options.strike !== false) {\r\n extensions.push(Strike.configure((_s = this.options) === null || _s === void 0 ? void 0 : _s.strike));\r\n }\r\n if (this.options.text !== false) {\r\n extensions.push(Text.configure((_t = this.options) === null || _t === void 0 ? void 0 : _t.text));\r\n }\r\n return extensions;\r\n },\r\n});\n\nexport { StarterKit, StarterKit as default };\n//# sourceMappingURL=index.js.map\n","// https://tiptap.dev/examples/default\nimport { Editor } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\n\nexport default function (element, value) {\n let editor = new Editor({\n element,\n extensions: [StarterKit],\n content: value,\n editorProps: {\n attributes: {\n spellcheck: \"false\",\n },\n },\n });\n return {\n editor,\n // Anything before this promise resolves will happen before timing starts\n ready: Promise.resolve(),\n getScrollHeight() {\n return element.scrollHeight;\n },\n getScrollTop() {\n return element.scrollTop;\n },\n setScrollTop(value) {\n element.scrollTop = value;\n },\n setValue(value) {\n // Recommendation is to call focus before most commands\n // https://tiptap.dev/api/commands#chain-commands\n editor.chain().focus().setContent(value).setTextSelection(0).run();\n element.scrollTop = 0;\n },\n format(on) {\n if (on)\n editor.chain().focus().selectAll().setBold().setTextSelection(0).run();\n else\n editor.chain().focus().selectAll().unsetBold().setTextSelection(0).run();\n },\n };\n}\n","\n import { text as shorttext } from \"./shorttext.js\";\n import { text as longtext } from \"./longtext.js\";\n import editor from \"./tiptap.js\";\n\n let editorContainer = document.querySelector(\"#editor\");\n let editorInstance = null;\n\n let buttons = {\n create: document.querySelector(\"#create\"),\n highlight: document.querySelector(\"#highlight\"),\n unhighlight: document.querySelector(\"#unhighlight\"),\n long: document.querySelector(\"#long\"),\n short: document.querySelector(\"#short\"),\n scroll: document.querySelector(\"#scroll\"),\n layout: document.querySelector(\"#layout\"),\n };\n buttons.scroll.addEventListener(\"click\", scroll);\n buttons.highlight.addEventListener(\"click\", highlight);\n buttons.unhighlight.addEventListener(\"click\", unhighlight);\n buttons.long.addEventListener(\"click\", long);\n buttons.short.addEventListener(\"click\", short);\n buttons.layout.addEventListener(\"click\", layout);\n\n buttons.create.addEventListener(\"click\", (e) => {\n if (!editorInstance) {\n editorInstance = editor(editorContainer);\n editorInstance.ready.then(() => {\n buttons.unhighlight.classList.add(\"active\", \"true\");\n buttons.create.setAttribute(\"disabled\", \"true\");\n });\n }\n });\n\n function layout() {\n // Todo - is this necessary with the runner?\n const body = document.body.getBoundingClientRect();\n layout.e = document.elementFromPoint((body.width / 2) | 0, (body.height / 2) | 0);\n }\n\n function highlight() {\n buttons.unhighlight.classList.toggle(\"active\", false);\n buttons.highlight.classList.toggle(\"active\", true);\n editorInstance.format(true);\n }\n function unhighlight() {\n buttons.unhighlight.classList.toggle(\"active\", true);\n buttons.highlight.classList.toggle(\"active\", false);\n editorInstance.format(false);\n }\n function long() {\n buttons.short.classList.toggle(\"active\", false);\n buttons.long.classList.toggle(\"active\", true);\n editorInstance.setValue(longtext);\n }\n function short() {\n buttons.short.classList.toggle(\"active\", true);\n buttons.long.classList.toggle(\"active\", false);\n editorInstance.setValue(shorttext);\n }\n\n function scroll() {\n let isTop = editorInstance.getScrollTop() == 0;\n editorInstance.setScrollTop(isTop ? editorInstance.getScrollHeight() : 0);\n }\n "],"names":["found","map","from","text","first","copy","Mark","slice","joinable","doc","Node","base","i","type","nfa","edge","expr","node","states","NodeType","mark","style","wrap","space","parent","lift","setBlockType","index","matches","match","close","deleteRange","TransformError","selectionToInsertionEnd","mac","pos","enter","preMatch","empty","dom","event","handlers","oldOffset","anchor","tr","sel","scroll","prop","normalizeKeyName","deleteSelection","joinBackward","selectNodeBackward","joinForward","selectNodeForward","joinUp","joinDown","newlineInCode","defaultBlockAt","exitCode","createParagraphNear","liftEmptyBlock","selectParentNode","selectTextblockStart","selectTextblockEnd","wrapIn","wrapInList","liftListItem","sinkListItem","editor","command","run","extensions","_a","commands","range","keys","isActive","document","newNextTypeAttributes","nextType","focus","blur","removeMark","inputRegex","starInputRegex","starPasteRegex","underscoreInputRegex","underscorePasteRegex","pasteRegex","rect","RopeSequence","forEach","Leaf","Append","appendInner","history","redo","value","shorttext"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]}