diff --git a/sx/sxc/pages/__init__.py b/sx/sxc/pages/__init__.py index 3e49322..8be3253 100644 --- a/sx/sxc/pages/__init__.py +++ b/sx/sxc/pages/__init__.py @@ -2457,7 +2457,7 @@ def _essay_sx_manifesto() -> str: return ( '(~doc-page :title "The SX Manifesto"' ' (p :class "text-stone-500 text-sm italic mb-8"' - f' "After " {x("https://www.marxists.org/archive/marx/works/1848/communist-manifesto/", "Marx & Engels")} ", loosely")' + ' "Carl Markdown and Friedrich Anglebrackets")' # --- I. A spectre is haunting the web --- @@ -2491,7 +2491,7 @@ def _essay_sx_manifesto() -> str: ' "The history of all hitherto existing web development ' 'is the history of language struggles.")' f' {p}' - ' "Markup and logic, template and script, structure and style — ' + f' " " {x("https://en.wikipedia.org/wiki/Markup_language", "Markup")} " and logic, template and script, structure and style — ' 'in a word, oppressor and oppressed — stood in constant opposition to one another, ' 'carried on an uninterrupted, now hidden, now open fight, ' f'a fight that each time ended in a laborious reconfiguration of " {x("https://webpack.js.org", "webpack")} ".")' @@ -2499,7 +2499,7 @@ def _essay_sx_manifesto() -> str: ' "In the earlier epochs of web development we find almost everywhere ' 'a complicated arrangement of separate languages into various orders, ' 'a manifold gradation of technical rank: ' - f'HTML, CSS, JavaScript, " {x("https://www.w3.org/XML/", "XML")} ", "' + f'" {x("https://html.spec.whatwg.org", "HTML")} ", " {x("https://www.w3.org/Style/CSS/", "CSS")} ", " {x("https://developer.mozilla.org/en-US/docs/Web/JavaScript", "JavaScript")} ", " {x("https://www.w3.org/XML/", "XML")} ", "' f' {x("https://www.w3.org/TR/xslt/", "XSLT")} ", "' f' {x("https://www.json.org", "JSON")} ", "' f' {x("https://yaml.org", "YAML")} ", "' @@ -2514,7 +2514,7 @@ def _essay_sx_manifesto() -> str: 'has not done away with language antagonisms. It has but established new languages, ' 'new conditions of oppression, new forms of struggle in place of the old ones.")' f' {p}' - ' "Our epoch, the epoch of the framework, possesses, however, this distinctive feature: ' + f' "Our epoch, the epoch of the " {x("https://en.wikipedia.org/wiki/Web_framework", "framework")} ", possesses, however, this distinctive feature: ' 'it has simplified the language antagonisms. The whole of web society is more and more ' 'splitting into two great hostile camps, into two great classes directly facing each other: ' 'the server and the client."))' @@ -2523,27 +2523,27 @@ def _essay_sx_manifesto() -> str: ' (~doc-section :title "III. The ruling languages" :id "ruling-languages"' f' {p}' - ' "HTML, the most ancient of the ruling languages, ' - 'established itself through the divine right of the angle bracket. ' + f' " " {x("https://html.spec.whatwg.org", "HTML")} ", the most ancient of the ruling languages, ' + f'established itself through the divine right of the " {x("https://en.wikipedia.org/wiki/Bracket#Angle_brackets", "angle bracket")} ". ' 'It was born inert — a document format, not a programming language — ' 'and it has spent three decades insisting this is a feature, not a limitation.")' f' {p}' - ' "JavaScript, originally a servant hired for a fortnight to validate forms, ' + f' " " {x("https://developer.mozilla.org/en-US/docs/Web/JavaScript", "JavaScript")} ", originally a servant hired for a fortnight to " {x("https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation", "validate forms")} ", ' 'staged a palace coup. It seized the means of interaction, ' - 'then the means of rendering, then the means of server-side execution, ' + f'then the means of rendering, then the means of " {x("https://nodejs.org", "server-side execution")} ", ' 'and finally declared itself the universal language of computation. ' 'Like every revolutionary who becomes a tyrant, ' 'it kept the worst habits of the regime it overthrew: ' - 'weak typing, prototype chains, and the "' + f'" {x("https://en.wikipedia.org/wiki/Strong_and_weak_typing", "weak typing")} ", " {x("https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain", "prototype chains")} ", and the "' f' {em} "\\"this\\"")' ' " keyword.")' f' {p}' - ' "CSS, the third estate, controls all visual presentation ' - 'while pretending to be declarative. ' + f' " " {x("https://www.w3.org/Style/CSS/", "CSS")} ", the third estate, controls all visual presentation ' + f'while pretending to be " {x("https://en.wikipedia.org/wiki/Declarative_programming", "declarative")} ". ' 'It has no functions. Then it had functions. ' 'It has no variables. Then it had variables. ' 'It has no nesting. Then it had nesting. ' - 'It is not a programming language. Then it was Turing-complete. ' + f'It is not a programming language. Then it was " {x("https://en.wikipedia.org/wiki/Turing_completeness", "Turing-complete")} ". ' f'CSS is the " {x("https://en.wikipedia.org/wiki/The_Vicar_of_Bray", "Vicar of Bray")} " of web technologies — ' 'loyal to whichever paradigm currently holds power.")' f' {p}' @@ -2552,7 +2552,7 @@ def _essay_sx_manifesto() -> str: 'The developer — the proletarian — must learn all three, ' 'must context-switch between all three, ' 'must maintain the fragile peace between all three. ' - 'The separation of concerns has become the separation of the developer\'s sanity."))' + f'The " {x("https://en.wikipedia.org/wiki/Separation_of_concerns", "separation of concerns")} " has become the separation of the developer\'s sanity."))' # --- IV. The petty-bourgeois frameworks --- @@ -2579,17 +2579,17 @@ def _essay_sx_manifesto() -> str: 'extracting rent in the form of configuration files, ' 'build pipelines, and breaking changes.")' f' {p}' - f' "Each framework promises liberation. Each framework delivers a new dependency tree. "' - f' {x("https://react.dev", "React")} " freed us from manual DOM manipulation and gave us a "' + f' "Each framework promises liberation. Each framework delivers a new " {x("https://en.wikipedia.org/wiki/Dependency_graph", "dependency tree")} ". "' + f' {x("https://react.dev", "React")} " freed us from manual " {x("https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model", "DOM")} " manipulation and gave us a "' f' {x("https://legacy.reactjs.org/docs/faq-internals.html", "virtual DOM")} ", ' - 'a reconciler, hooks with seventeen rules, ' + f'a " {x("https://legacy.reactjs.org/docs/reconciliation.html", "reconciler")} ", " {x("https://react.dev/reference/react/hooks", "hooks")} " with seventeen rules, ' f'and a conference circuit. "' f' {x("https://vuejs.org", "Vue")} " freed us from React\'s complexity and gave us the Options API, ' f'then the Composition API, then told us the Options API was fine actually. "' f' {x("https://angular.dev", "Angular")} " freed us from choice and gave us a CLI that generates eleven files ' f'to display \\\"Hello World.\\\" "' f' {x("https://svelte.dev", "Svelte")} " freed us from the virtual DOM and gave us a compiler. "' - f' {x("https://www.solidjs.com", "SolidJS")} " freed us from React\'s re-rendering and gave us signals, ' + f' {x("https://www.solidjs.com", "SolidJS")} " freed us from React\'s re-rendering and gave us " {x("https://github.com/tc39/proposal-signals", "signals")} ", ' 'which React then adopted, completing the circle.")' f' {p}' ' "The frameworks reproduce the very conditions they claim to abolish. ' @@ -2607,7 +2607,7 @@ def _essay_sx_manifesto() -> str: f' {x("https://www.npmjs.com/package/left-pad", "left-pad")} ". ' 'They attach themselves to whichever framework currently holds power, ' 'contributing nothing original, merely wrapping what already exists, ' - 'adding weight to the node_modules directory until it exceeds the mass of the sun."))' + f'adding weight to the " {x("https://docs.npmjs.com/cli/v10/configuring-npm/folders#node-modules", "node_modules")} " directory until it exceeds the mass of the sun."))' # --- V. The build step --- @@ -2617,7 +2617,7 @@ def _essay_sx_manifesto() -> str: f'It enforces the class structure. It compiles " {x("https://react.dev/learn/writing-markup-with-jsx", "JSX")} " into createElement calls. ' f'It transforms " {x("https://www.typescriptlang.org", "TypeScript")} " into JavaScript. ' f'It processes " {x("https://sass-lang.com", "Sass")} " into CSS. ' - 'It tree-shakes. It code-splits. It hot-module-replaces. ' + f'It " {x("https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking", "tree-shakes")} ". It " {x("https://developer.mozilla.org/en-US/docs/Glossary/Code_splitting", "code-splits")} ". It " {x("https://webpack.js.org/concepts/hot-module-replacement/", "hot-module-replaces")} ". ' 'It does everything except let you write code and run it.")' f' {p}' f' " " {x("https://webpack.js.org", "webpack")} " begat " {x("https://rollupjs.org", "Rollup")} ". ' @@ -2631,9 +2631,11 @@ def _essay_sx_manifesto() -> str: f' {p}' ' "The build step exists because the ruling languages cannot express ' f'" {i("/docs/components", "components")} ". ' - 'HTML has no composition model. CSS has no scoping. JavaScript has no template syntax. ' - 'The build step papers over these failures with transpilation, ' - 'and calls it developer experience."))' + f'" {x("https://html.spec.whatwg.org", "HTML")} " has no " {x("https://developer.mozilla.org/en-US/docs/Web/API/Web_components", "composition model")} ". ' + f'" {x("https://www.w3.org/Style/CSS/", "CSS")} " has no " {x("https://developer.mozilla.org/en-US/docs/Web/CSS/@scope", "scoping")} ". ' + f'" {x("https://developer.mozilla.org/en-US/docs/Web/JavaScript", "JavaScript")} " has no template syntax. ' + f'The build step papers over these failures with " {x("https://en.wikipedia.org/wiki/Source-to-source_compiler", "transpilation")} ", ' + f'and calls it " {x("https://en.wikipedia.org/wiki/User_experience#Developer_experience", "developer experience")} "."))' # --- VI. The s-expressionist revolution --- @@ -2644,7 +2646,7 @@ def _essay_sx_manifesto() -> str: 'There is no CSS-as-a-separate-language. ' 'There is only the expression.")' f' {p}' - ' "Code is data. Data is DOM. DOM is code. ' + f' " " {x("https://en.wikipedia.org/wiki/Homoiconicity", "Code is data")} ". Data is DOM. DOM is code. ' 'The dialectical unity that HTML, JavaScript, and CSS ' 'could never achieve — because they are three languages pretending to be one system — ' f'is the natural state of the s-expression, ' @@ -2665,15 +2667,15 @@ def _essay_sx_manifesto() -> str: f'" {i("/docs/components", "defcomp")} " replaces the component model. defmacro replaces the plugin system. ' f'The " {i("/docs/evaluator", "evaluator")} " replaces the runtime. ' 'What remains is not a framework but a language — ' - 'and languages do not have breaking changes between minor versions."))' + f'and languages do not have " {x("https://semver.org", "breaking changes")} " between minor versions."))' # --- VII. Objections --- ' (~doc-section :title "VII. Objections from the bourgeoisie" :id "objections"' f' {p}' - ' "\\\"You would destroy the separation of concerns!\\\" they cry. ' - f'The separation of concerns was destroyed long ago. "' - f' {x("https://react.dev", "React")} " components contain markup, logic, and inline styles. "' + f' "\\\"You would destroy the " {x("https://en.wikipedia.org/wiki/Separation_of_concerns", "separation of concerns")} "!\\\" they cry. ' + f'The " {x("https://en.wikipedia.org/wiki/Separation_of_concerns", "separation of concerns")} " was destroyed long ago. "' + f' {x("https://react.dev", "React")} " components contain " {x("https://en.wikipedia.org/wiki/Markup_language", "markup")} ", logic, and " {x("https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/style", "inline styles")} ". "' f' {x("https://vuejs.org/guide/scaling-up/sfc.html", "Vue single-file components")} " put template, script, and style in one file. "' f' {x("https://tailwindcss.com", "Tailwind")} " puts styling in the markup. ' 'The separation of concerns has been dead for years; ' @@ -2683,7 +2685,7 @@ def _essay_sx_manifesto() -> str: f' {x("https://www.gnu.org/software/emacs/", "Emacs")} " has been running on s-expressions since 1976. "' f' {x("https://clojure.org", "Clojure")} " runs Fortune 500 backends on s-expressions. ' f'Every " {x("https://en.wikipedia.org/wiki/Lisp_(programming_language)", "Lisp")} " programmer who ever lived has known what the web refuses to admit: ' - 'that the parenthesis is not a bug but the minimal syntax for structured data.")' + f'that the parenthesis is not a bug but the minimal syntax for " {x("https://en.wikipedia.org/wiki/S-expression", "structured data")} ".")' f' {p}' ' "\\\"Where is the ecosystem?\\\" they cry. ' f'The ecosystem is the problem. Two million " {x("https://www.npmjs.com", "npm")} " packages, ' @@ -2693,7 +2695,7 @@ def _essay_sx_manifesto() -> str: 'composition, abstraction, and code-as-data.")' f' {p}' f' "\\\"But " {x("https://www.typescriptlang.org", "TypeScript")} "!\\\" they cry. TypeScript is a type system ' - f'bolted onto a language that was designed in ten days ' + f'bolted onto a language that was " {x("https://en.wikipedia.org/wiki/JavaScript#History", "designed in ten days")} " ' f'by " {x("https://en.wikipedia.org/wiki/Brendan_Eich", "a man")} " who wanted to write " {x("https://en.wikipedia.org/wiki/Scheme_(programming_language)", "Scheme")} ". ' 'We have simply completed his original vision.")' f' {p}' @@ -2713,7 +2715,7 @@ def _essay_sx_manifesto() -> str: 'to whichever regime currently holds power.")' f' {p}' f' " " {x("https://en.wikipedia.org/wiki/CSS-in-JS", "CSS-in-JS")} " was the first attempt at annexation: ' - 'JavaScript consuming CSS entirely, reducing it to template literals ' + f'JavaScript consuming CSS entirely, reducing it to " {x("https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals", "template literals")} " ' 'and runtime overhead. ' 'This provocation produced the counter-revolution of utility classes — ' f'" {x("https://tailwindcss.com", "Tailwind")} " — which reasserted CSS\'s independence ' @@ -2740,7 +2742,7 @@ def _essay_sx_manifesto() -> str: 'They openly declare that their ends can be attained only by the forcible overthrow ' 'of all existing rendering conditions. ' 'Let the ruling languages tremble at a parenthetical revolution. ' - 'The developers have nothing to lose but their node_modules.")' + f'The developers have nothing to lose but their " {x("https://docs.npmjs.com/cli/v10/configuring-npm/folders#node-modules", "node_modules")} ".")' f' {p}' ' "The immediate aims of the s-expressionists are:")' ' (ol :class "space-y-2 text-stone-600 mt-2 list-decimal list-inside"'