A place to cache linked articles (think custom and personal wayback machine)
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.html 17KB

  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Quotebacks and hypertexts (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f0f0ea">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f0f0ea">
  26. <!-- Documented, feel free to shoot an email. -->
  27. <link rel="stylesheet" href="/static/david/css/style_2020-06-19.css">
  28. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  29. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  30. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  31. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  32. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  35. <script type="text/javascript">
  36. function toggleTheme(themeName) {
  37. document.documentElement.classList.toggle(
  38. 'forced-dark',
  39. themeName === 'dark'
  40. )
  41. document.documentElement.classList.toggle(
  42. 'forced-light',
  43. themeName === 'light'
  44. )
  45. }
  46. const selectedTheme = localStorage.getItem('theme')
  47. if (selectedTheme !== 'undefined') {
  48. toggleTheme(selectedTheme)
  49. }
  50. </script>
  51. <meta name="robots" content="noindex, nofollow">
  52. <meta content="origin-when-cross-origin" name="referrer">
  53. <!-- Canonical URL for SEO purposes -->
  54. <link rel="canonical" href="http://interconnected.org/home/2020/06/16/quotebacks">
  55. <body class="remarkdown h1-underline h2-underline h3-underline hr-center ul-star pre-tick">
  56. <article>
  57. <header>
  58. <h1>Quotebacks and hypertexts</h1>
  59. </header>
  60. <nav>
  61. <p class="center">
  62. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  63. <a href="http://interconnected.org/home/2020/06/16/quotebacks" title="Lien vers le contenu original">Source originale</a>
  64. </p>
  65. </nav>
  66. <hr>
  67. <main>
  68. <p>If you’re reading this on my website, you’ll notice that the next chunk of text looks a bit different. That’s because it’s a <em>quoteback.</em></p>
  69. <blockquote cite="https://quotebacks.net" class="quoteback bl bw1 pl2 b--light-red ml0 italic i" data-author="Quotebacks" data-title="Introducing Quotebacks">
  70. <p>Quotebacks are like a quote retweet, but for any piece of content on the web. They work on any webpage, and gracefully fall back to a standard blockquote.</p>
  71. <p>Thus, “Quotebacks” is three things:</p>
  72. <p>1. A web-native citation standard and quoting UX pattern</p>
  73. <p>2. A tiny library, <code>quoteback.js</code>, that converts HTML <code>&lt;blockquote&gt;</code> tags into elegant interactive webcomponents</p>
  74. <p>3. A browser extension to create quoteback components and store any quotes you save to publish later.</p>
  75. </blockquote>
  76. <p>Quotebacks is a project? invention? <em>protocol?</em> by Toby Shorin and Tom Critchlow. <a href="https://tomcritchlow.com/2020/06/09/quotebacks/">Here’s Tom’s introductory post:</a> which has some background. <q>The ultimate goal is to encourage and activate a deeper cross-blogger discusson space. To promote diverse voices and encourage networked writing to flourish.</q></p>
  77. <p>I’m seeing a bunch of folks <a href="https://www.kickscondor.com/admiring-quotebacks-strategy">trying</a> <a href="http://peterbihr.com/2020/06/quotebacks-are-great/">out</a> <a href="https://warrenellis.ltd/isles/quotebacks/">quotebacks</a>. If you keep a blog yourself, I urge you to give it a go. I’ll talk about why later in this post.</p>
  78. <h3 class="measure f4 f3-l lh-copy black-80 pt3 pt4-l pb0 mb0">Me? I’ve written a Quotebacks extension for Python-Markdown</h3>
  79. <p>I’m not using the Chrome extension to collect quotes myself. I have my own weird workflow for <a href="https://www.dw.com/en/coronavirus-scare-when-will-hamsterkauf-become-an-english-word/a-52635400">hamsterkaufing</a> the web.</p>
  80. <p>But I <em>do</em> want to display quoteback embeds, and you can see one at the top of this post. <em>(If you’re reading this in RSS or email, check the website.)</em></p>
  81. <p>How? I write quotes in a special format in the Markdown text documents that lie behind this blog. (I keep everything in various forms of plain text and have done for a couple decades.)</p>
  82. <p>These text docs are transformed into HTML for the blog using <a href="https://python-markdown.github.io">Python-Markdown</a>. So I’ve written a Python-Markdown extension called <strong>quotebacks-mdx</strong> to transform this special format into the quotebacks embed HTML.</p>
  83. <p>I’d also like feedback on the Markdown format I’m using – if people implement extensions in other languages, it would be good if something like this became a de facto standard. </p>
  84. <p>Why did I do it this way?</p>
  85. <ul>
  86. <li>Markdown deserves to have a way to include a citation in blockquotes – afaik there isn’t a consensus way to do this right now.</li>
  87. <li>I can include nicely-cited quotes in my blog posts without including custom HTML. So in another 10 years, I know I’ll still have my easy-to-access plain text.</li>
  88. <li>The fallback for Markdown (without the extension) and for HTML (without the Javascript) is still readable and still looks good.</li>
  89. </ul>
  90. <p>And, even though I’m not using the Quotebacks browser extension, I’m adopting the embed format - the protocol - because of what we might one day build on top.</p>
  91. <p><hr class="h1 xh2-ns w1 xw2-ns ml4 mv4 bb bw1 b--white"/>
  92. <h3 class="measure f4 f3-l lh-copy black-80 pt3 pt4-l pb0 mb0">Some history: the Memex</h3>
  93. <p>Back in 1945, Vannevar Bush published his insanely visionary essay <strong>As We May Think</strong> in <em>The Atlantic.</em> Through his imagined machine called the <strong>memex</strong> he predicted the web and its effect on human knowledge, work, and conversation:</p>
  94. <blockquote class="bl bw1 pl2 b--light-red ml0 italic i">
  95. <p>Consider a future device … in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.</p>
  96. </blockquote>
  97. <p>Phones!</p>
  98. <p><a href="https://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/">Here’s the original essay</a> though the <a href="https://en.wikipedia.org/wiki/As_We_May_Think">Wikipedia summary</a> is short and good.</p>
  99. <p>The core feature of the memex is <strong>trails.</strong> It isn’t just a library.</p>
  100. <blockquote class="bl bw1 pl2 b--light-red ml0 italic i">
  101. <p>Wholly new forms of encyclopedias will appear, ready made with a mesh of associative trails running through them, ready to be dropped into the memex and there amplified. The lawyer has at his touch the associated opinions and decisions of his whole experience, and of the experience of friends and authorities. The patent attorney has on call the millions of issued patents, with familiar trails to every point of his client’s interest. [Etc.]</p>
  102. </blockquote>
  103. <p>Wikipedia! Work!</p>
  104. <p>WELL.</p>
  105. <p>And… bloggers:</p>
  106. <blockquote class="bl bw1 pl2 b--light-red ml0 italic i">
  107. <p>There is a new profession of trail blazers, those who find delight in the task of establishing useful trails through the enormous mass of the common record.</p>
  108. </blockquote>
  109. <p>Flash forward…</p>
  110. <h3 class="measure f4 f3-l lh-copy black-80 pt3 pt4-l pb0 mb0">Hypertext and transclusion</h3>
  111. <p>In the early 1960s, Ted Nelson coined the text <strong>hypertext</strong>. The web is a hypertext, and the <a href="https://www.w3.org/History/1989/proposal.html">original 1989 proposal</a> cited Nelson’s work.</p>
  112. <p>His project <strong>Xanadu</strong> - although never completed - was an expansion of what he meant by this original concept.</p>
  113. <p>Hypertexts are connected texts. But Nelson saw <em>two</em> types of connections: links (which we have) and something else called <em>transclusion.</em> </p>
  114. <p>From one paper <a href="http://xanadu.com.au/ted/XUsurvey/xuDation.html">about Project Xanadu</a>:</p>
  115. <blockquote class="bl bw1 pl2 b--light-red ml0 italic i">
  116. <p>This may be simplified to: connections between things which are <em>different</em>, and connections between things which are <em>the same</em>. They must be implemented differently and orthogonally, in order that linked materials may be transcluded and vice versa. This double structure of abstracted literary connection – <em>content links</em> and <em>transclusion</em> – constitute xanalogical structure.</p>
  117. </blockquote>
  118. <p>Transclusion:</p>
  119. <blockquote class="bl bw1 pl2 b--light-red ml0 italic i">
  120. <p>Transclusion is what quotation, copying and cross-referencing merely attempt: they are ways that people have had to <em>imitate</em> transclusion, which is the true abstract relationship that paper cannot show. Transclusions are not copies and they are not instances, but <em>the same thing knowably and visibly in more than once place</em>. This is a simple point which is remarkably difficult to get across.</p>
  121. </blockquote>
  122. <p>And later in the paper:</p>
  123. <blockquote class="bl bw1 pl2 b--light-red ml0 italic i">
  124. <p>Note also that the famous “trails” of Vannevar Bush’s memex system (103) were to be built from transclusions, not links.</p>
  125. </blockquote>
  126. <p><a href="https://en.wikipedia.org/wiki/Transclusion">Here’s Wikipedia on transclusion.</a></p>
  127. <h3 class="measure f4 f3-l lh-copy black-80 pt3 pt4-l pb0 mb0">Back to Quotebacks</h3>
  128. <p>What I love about the web is that it’s a hypertext. (Though in recent years it has mostly been used as a janky app delivery platform.)</p>
  129. <p>And what I like about Quotebacks is that it already feels like an essential part of that hypertext toolbox! The Chrome extension meet the needs of Bush’s trailblazers; the embed format mimics Nelson’s transclusion.</p>
  130. <p>Now the Quotebacks projects doesn’t immediately fulfil on this grand promise. But the great thing about a protocol is that I can adopt it and support it, and <em>you</em> can adopt it and support it, and if there’s enough of a consensus, we can build more on top. So what I’d be interested to see:</p>
  131. <ul>
  132. <li><strong>an index, accessible to all:</strong> could quoteback embeds be centrally tracked somehow?</li>
  133. <li><strong>a serendipity machine:</strong> could my browser tell me when I’m on a page which has been cited – could I see the “trails” that are crossing this page, and chose to pivot and follow one? And could I see when one of those trails was authored by a friend?</li>
  134. <li><strong>a robot research aide:</strong> could I index the quotebacks in my <em>own</em> database… and find holes? i.e. texts that are regularly cited by the ones I’ve quoted, but somehow I’ve never discovered them myself?</li>
  135. </ul>
  136. <p><em>(I’m less bothered about finding out specifically when people use one of my posts in a quoteback. That would be neat I guess, but tracking mentions is a first-order problem and besides it’s a spam honeypot.)</em></p>
  137. <p>What I’m talking about is the kind of hypertext that I love, one in which my blog is a place for thinking out loud.</p>
  138. <p>My blog is not my notebook, and it’s not my marketing platform.</p>
  139. <p>My blog is my laboratory workbench where I go through the ideas and paragraphs I’ve picked up along my way, and I twist them and turn them and I see if they fit together. I do that by narrating my way between them. And if they do fit, I try to add another piece, and then another. Writing a post is a process of experimental construction.</p>
  140. <p>And then I follow the trail, and see where it takes me.</p></p>
  141. </main>
  142. </article>
  143. <hr>
  144. <footer>
  145. <p>
  146. <a href="/david/" title="Aller à l’accueil">🏠</a> •
  147. <a href="/david/log/" title="Accès au flux RSS">🤖</a> •
  148. <a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
  149. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
  150. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
  151. </p>
  152. <template id="theme-selector">
  153. <form>
  154. <fieldset>
  155. <legend>Thème</legend>
  156. <label>
  157. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  158. </label>
  159. <label>
  160. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  161. </label>
  162. <label>
  163. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  164. </label>
  165. </fieldset>
  166. </form>
  167. </template>
  168. </footer>
  169. <script type="text/javascript">
  170. function loadThemeForm(templateName) {
  171. const themeSelectorTemplate = document.querySelector(templateName)
  172. const form = themeSelectorTemplate.content.firstElementChild
  173. themeSelectorTemplate.replaceWith(form)
  174. form.addEventListener('change', (e) => {
  175. const chosenColorScheme = e.target.value
  176. localStorage.setItem('theme', chosenColorScheme)
  177. toggleTheme(chosenColorScheme)
  178. })
  179. const selectedTheme = localStorage.getItem('theme')
  180. if (selectedTheme && selectedTheme !== 'undefined') {
  181. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  182. }
  183. }
  184. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  185. window.addEventListener('load', () => {
  186. let hasDarkRules = false
  187. for (const styleSheet of Array.from(document.styleSheets)) {
  188. let mediaRules = []
  189. for (const cssRule of styleSheet.cssRules) {
  190. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  191. continue
  192. }
  193. // WARNING: Safari does not have/supports `conditionText`.
  194. if (cssRule.conditionText) {
  195. if (cssRule.conditionText !== prefersColorSchemeDark) {
  196. continue
  197. }
  198. } else {
  199. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  200. continue
  201. }
  202. }
  203. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  204. }
  205. // WARNING: do not try to insert a Rule to a styleSheet you are
  206. // currently iterating on, otherwise the browser will be stuck
  207. // in a infinite loop…
  208. for (const mediaRule of mediaRules) {
  209. styleSheet.insertRule(mediaRule.cssText)
  210. hasDarkRules = true
  211. }
  212. }
  213. if (hasDarkRules) {
  214. loadThemeForm('#theme-selector')
  215. }
  216. })
  217. </script>
  218. </body>
  219. </html>