@@ -5,9 +5,9 @@ template = "doc.html"
55aliases = ["docs/using/sail-and-udon/"]
66+++
77
8−Sail is Hoon markup that’s used to render a web page with XML. But what makes it special is that you can run arbitrary Hoon code within such a web page without using a separate markup language.
8+Sail is Hoon markup that's used to render a web page with XML. But what makes it special is that you can run arbitrary Hoon code within such a web page without using a separate markup language.
99
10−Udon is a way to write content for the web. It’s a minimalist markup language for creating and rendering text documents, with a Markdown-inspired syntax. It’s integrated with our Hoon programming language, allowing it to be used as standalone prose in its own file or embedded inside a Hoon source file, in which case it will be parsed into a tree of HTML nodes using Sail.
10+Udon is a way to write content for the web. It's a minimalist markup language for creating and rendering text documents, with a Markdown-inspired syntax. It's integrated with our Hoon programming language, allowing it to be used as standalone prose in its own file or embedded inside a Hoon source file, in which case it will be parsed into a tree of HTML nodes using Sail.
1111
1212This document will be divided into two main sections: the Sail guide and the Udon guide. Also, you should read the Getting Started section below, which applies to both Udon and Sail.
1313
@@ -25,9 +25,9 @@ Before starting with either Sail or Udon, make sure that your ship is
2525[mounted to Unix](@/using/install.md).
2626
2727To host that output, your ship also has a web-server that can be found at
28−`http://localhost/` (default port 80) if it’s your first ship that’s running on the
29−machine, `http://localhost:8081/` if it’s the second ship on that same machine,
30−and so on. In the startup messages, a ship will tell you which HTTP port it’s
28+`http://localhost/` (default port 80) if it's your first ship that's running on the
29+machine, `http://localhost:8081/` if it's the second ship on that same machine,
30+and so on. In the startup messages, a ship will tell you which HTTP port it's
3131using.
3232
3333Udon and Sail files are often run as independent files (`.udon` and `.hoon`
@@ -35,7 +35,7 @@ respectively), but for the purpose of this guide, we will run them out of the
3535`frontpage.hoon` file located in the `/gen` directory. The default content of
3636`frontpage.hoon` is Sail code.
3737
38−To use `frontpage.hoon`, we use a `|serve` command like this one in your ship’s
38+To use `frontpage.hoon`, we use a `|serve` command like this one in your ship's
3939Dojo:
4040
4141```
@@ -54,13 +54,13 @@ Run the command `|serve /test %home /gen/frontpage/hoon`. Now navigate to
5454`http://localhost/test` (or `http://localhost:8081/test` if your ship is on that port) in your
5555browser, and you should see the rendered Sail.
5656
57−**Note:** Important to remember that every time you edit a file in your ship’s
57+**Note:** Important to remember that every time you edit a file in your ship's
5858pier (Unix directory), including `frontpage.hoon`, you need to run `|commit %home`
5959to copy those changes to Urbit.
6060
6161## <a name="sail"></a>Sail: A Guide
6262
63−It’s easy to see how Sail can directly translate to HTML:
63+It's easy to see how Sail can directly translate to HTML:
6464
6565### Sail code
6666
@@ -72,7 +72,7 @@ It’s easy to see how Sail can directly translate to HTML:
7272 ;body
7373 ;h1: Welcome!
7474 ; Hello, world!
75− ; We’re on the web.
75+ ; We're on the web.
7676 ;div;
7777 ;script@"http://unsafely.tracking.you/cookiemonster.js";
7878 ==
@@ -89,7 +89,7 @@ It’s easy to see how Sail can directly translate to HTML:
8989 <body>
9090 <h1>Welcome!</h1>
9191 Hello, world!
92− We’re on the web.
92+ We're on the web.
9393 <div></div>
9494 <script src="http://unsafely.tracking.you/cookiemonster.js"></script>
9595 </body>
@@ -98,17 +98,17 @@ It’s easy to see how Sail can directly translate to HTML:
9898
9999You can test above Sail code by placing it
100100under `^- manx` in your `frontpage.hoon` file, and then running `|commit %home`
101−in the Dojo. If you’ve already run the `|serve` command code from the first
101+in the Dojo. If you've already run the `|serve` command code from the first
102102section, the new content should appear at `http://localhost/test`.
103103
104−It shouldn’t be hard to see the similarities between Sail and HTML. So let’s go
104+It shouldn't be hard to see the similarities between Sail and HTML. So let's go
105105into more detail about what the differences are.
106106
107107### Tags and Closing
108108
109109In Sail, tag heads are written with the tag name prepended by `;`. Unlike in
110110HTML, there are different ways on closing tags, depending on the needs of the
111−tag. One of the nice things about Hoon is that you don’t have to be constantly
111+tag. One of the nice things about Hoon is that you don't have to be constantly
112112closing expressions; Sail inherits this convenience.
113113
114114#### Empty
@@ -172,7 +172,7 @@ those untagged lines with `;`.
172172;body
173173 ;h1: Welcome!
174174 ; Hello, world!
175− ; We’re on the web.
175+ ; We're on the web.
176176==
177177```
178178
@@ -182,7 +182,7 @@ Equals:
182182<body>
183183 <h1>Welcome!</h1>
184184 Hello, world!
185− We’re on the web.
185+ We're on the web.
186186</body>
187187```
188188
@@ -194,15 +194,15 @@ Adding attributes is simple: just add the desired attribute between parentheses,
194194right after the tag name without a space. We separate different attributes of
195195the same node by using `,`.
196196
197−Attributes can be used in two forms: flat, which uses one line; and tall, which
198−uses multiple lines, when a single line would not be practical. Flat forms and
197+Attributes can be used in two forms: wide, which uses one line; and tall, which
198+uses multiple lines, when a single line would not be practical. Wide forms and
199199tall forms are two syntaxes of semantically equivalent expressions.
200200
201201#### Generic
202202
203−The code below produces a “Submit” button on the page.
203+The code below produces a "Submit" button on the page.
204204
205−Flat-form Sail:
205+Wide-form Sail:
206206
207207```
208208;input(type "submit", value "Submit");
@@ -299,7 +299,7 @@ with Hoon code.
299299One place where Sail diverges from HTML is that it supports string
300300interpolation. In Sail, the contents of all tags are a string type called `tape`
301301unless otherwise designated. Tapes are delineated by the double quotes `""`.
302−That’s important, because tapes can be interpolated with Hoon expressions,
302+That's important, because tapes can be interpolated with Hoon expressions,
303303provided that those expressions produce something a tape as well. Interpolation
304304is done by wrapping the code to be inserted in `{}`. In your Dojo prompt, try
305305the command below (without the `>`):
@@ -322,7 +322,7 @@ following command in your Dojo:
32232233
323323```
324324
325−This should work, producing `33`, an atom. That’s our problem. The
325+This should work, producing `33`, an atom. That's our problem. The
326326interpolation expression expects a tape, but our first command tried to
327327interpolate with something that results in an atom. Try this now:
328328
@@ -331,8 +331,8 @@ interpolate with something that results in an atom. Try this now:
331331"33"
332332```
333333
334−We get a similar result, but we know that it’s a tape because it’s wrapped in
335−`""`. Bingo! With this knowledge, let’s perform a successful interpolation:
334+We get a similar result, but we know that it's a tape because it's wrapped in
335+`""`. Bingo! With this knowledge, let's perform a successful interpolation:
336336
337337```
338338> "I am a l{<(mul 3 11)>}t Urbit user."
@@ -365,7 +365,7 @@ Then enter the following command in the Dojo:
365365> .
366366```
367367
368−You’ll notice that the Sail subject is like a stripped-down version of the Dojo
368+You'll notice that the Sail subject is like a stripped-down version of the Dojo
369369subject. Its final line should match the Dojo subject.
370370
371371Now swap the code below into your Sail file.
@@ -380,15 +380,15 @@ Now swap the code below into your Sail file.
380380==
381381```
382382
383−You’ll find that the resulting Sail subject is much larger. If you look closely,
384−you’ll see that there’s some new similarities with the Dojo subject, such as
385−containing the name of your ship. There’s also some new differences, since
383+You'll find that the resulting Sail subject is much larger. If you look closely,
384+you'll see that there's some new similarities with the Dojo subject, such as
385+containing the name of your ship. There's also some new differences, since
386386`fuel:html` contains things that are specifically useful for performing
387387web-related operations.
388388
389389### A More Interesting Example
390390
391−Now let’s apply knowledge of string interpolation and the Sail subject in a Sail
391+Now let's apply knowledge of string interpolation and the Sail subject in a Sail
392392source file. The following code produces more interesting things than the
393393example we saw before.
394394
@@ -414,13 +414,13 @@ example we saw before.
414414 ;span: Check it out!
415415 ;+ ?: show-list
416416 ;ol
417− ;li(style "color: green"): We’re doing interesting stuff now.
418− ;li: We’re pretty-printing this sum with Hoon: {<(add 50 50)>}.
417+ ;li(style "color: green"): We're doing interesting stuff now.
418+ ;li: We're pretty-printing this sum with Hoon: {<(add 50 50)>}.
419419 ;li: The code above is shorthand for {(scow %ud (add 50 50))}.
420420 ;li: I am {(trip '~lodleb-ritrul')}.
421− ;li: Actually, my name is {<p.bem.gas>}. I’m a {what-kind}.
421+ ;li: Actually, my name is {<p.bem.gas>}. I'm a {what-kind}.
422422 ==
423− ;div: My name is {<p.bem.gas>}. I’m a {what-kind}.
423+ ;div: My name is {<p.bem.gas>}. I'm a {what-kind}.
424424 ==
425425==
426426```
@@ -429,7 +429,7 @@ Save the above Sail code in to `home/web/pages/secondsail.hoon` and access the
429429resulting page by navigating to `http://localhost:8080/pages/secondsail` in
430430your browser.
431431
432−There are some interesting things here. Let’s go through this code piece by
432+There are some interesting things here. Let's go through this code piece by
433433piece.
434434
435435```
@@ -443,17 +443,17 @@ against its own subject, `our` is not part of the default subject. To augment
443443our subject with the information that we need, we use `/= gas /$ fuel:html`.
444444
445445The above expression uses two Ford runes, `/=` and `/$`, to add the relevant
446−information to the current subject. We can pull the ship’s name out of this
447−augmented subject later. It’s important to note that these runes are not part of
446+information to the current subject. We can pull the ship's name out of this
447+augmented subject later. It's important to note that these runes are not part of
448448Hoon. They are part of Ford, our build system.
449449
450450`/$` is used to get data from the environment, and `/=` adds that data to
451451subject in the face `gas`. The
452452[Ford user manual](https://urbit.org/docs/arvo/internals/ford/runes/) has
453−details on these and other Ford runes, but understanding these runes isn’t
453+details on these and other Ford runes, but understanding these runes isn't
454454necessary for the purposes of this tutorial.
455455
456−`fuel:html` gets extra data from your ship’s Eyre module, which handles all
456+`fuel:html` gets extra data from your ship's Eyre module, which handles all
457457things HTTP, and sticks it in the subject when Eyre renders a page. This
458458includes the name of the ship, which is what we look for in the next line, but
459459it includes much more.
@@ -485,7 +485,7 @@ the source code.
485485 "comet"
486486```
487487
488−This code chunk is a series of conditionals that checks the host ship’s name to
488+This code chunk is a series of conditionals that checks the host ship's name to
489489see what its value is.
490490
491491The first line, `=+ wid=(met 3 p.bem.gas)`, combines a new noun with the
@@ -493,7 +493,7 @@ subject and gives it the face `wid`. This noun is produced by the the
493493standard-library function [`met`](/docs/reference/library/2c), which measures the number of
494494[blocks](/docs/reference/library/1c/) of size `a` within `b`. Blocks are units that have a
495495bitwidth of `2^a`. So, in this case, it measures how many bytes (blocks of size
496−3 are bitwidths of 8; `2^3 = 8`) are fully contained in your ship’s address.
496+3 are bitwidths of 8; `2^3 = 8`) are fully contained in your ship's address.
497497
498498Galaxies contain zero to one 3-blocks; stars contain two 3-blocks; planets
499499contain three to four 3-blocks; moons contain five to eight 3-blocks; comets
@@ -554,25 +554,25 @@ In the following lines, we begin to use some Hoon expressions again.
554554In the top line in the chunk above, we use the `;+` Sail rune, which
555555resolves an expression to a single node. That expression, in this case, is
556556`?:`, which tests the truth value of `show-list`, which we assigned the value
557−`&` (meaning `true`) at the beginning of the program. It’s closed by the `==` on
557+`&` (meaning `true`) at the beginning of the program. It's closed by the `==` on
558558the last line.
559559
560560Thus, this program resolves to the first child of `show-list`, the node `;ol`.
561561That node creates an ordered list, and the items contained within that node.
562562
563563```
564− ;li(style "color: green"): We’re doing more interesting stuff now.
564+ ;li(style "color: green"): We're doing more interesting stuff now.
565565```
566566
567567The line above is the only element of this list that does not use
568568Hoon proper. The line renders as green, as interpreted by the browser,
569569because of the Sail attribute.
570570
571−The next items in the list use `{}`. Recall that these braces, pronounced “lob”
572−and “rob” in Hoon-speak, allow for the interpolation of code within a string.
571+The next items in the list use `{}`. Recall that these braces, pronounced "lob"
572+and "rob" in Hoon-speak, allow for the interpolation of code within a string.
573573
574574```
575− ;li: We’re pretty-printing this sum with Hoon: {<(add 50 50)>}.
575+ ;li: We're pretty-printing this sum with Hoon: {<(add 50 50)>}.
576576```
577577
578578The line above is interpolated with Hoon code that produces the sum of 50 plus
@@ -585,7 +585,7 @@ tape, like the rest of the line.
585585
586586The `{(scow %ud (add 50 50)}` on this line is just a different way
587587writing the `{<(add 50 50)>}` expression. `scow` is a Hoon function that turns a
588−noun into a `tape`, Hoon’s string type. `%ud` tells `scow` that its argument
588+noun into a `tape`, Hoon's string type. `%ud` tells `scow` that its argument
589589should be displayed in the form of an unsigned decimal.
590590
591591```
@@ -599,7 +599,7 @@ tape. So, by converting `~lodleb-ritrul` to a tape, it can be included in the
599599tape that we are trying to insert it into without getting a type error.
600600
601601```
602− ;li: Actually, my name is {<p.bem.gas>}. I’m a {what-kind}.
602+ ;li: Actually, my name is {<p.bem.gas>}. I'm a {what-kind}.
603603 ==
604604```
605605
@@ -613,23 +613,23 @@ within `gas`, which happens to be where the name of the ship is located.
613613Note that `{what-kind}` does not have a `<>` wrapper. Why do you think this is?
614614
615615```
616− ;div; My name is {<p.bem.gas>}. I’m a {ship}.
616+ ;div; My name is {<p.bem.gas>}. I'm a {ship}.
617617 ==
618618==
619619```
620620
621621The `;div;` node above is only rendered, as an alternative to the above list,
622−if `show-list` is evaluated as `true`. This means it won’t be shown with your
622+if `show-list` is evaluated as `true`. This means it won't be shown with your
623623default code. To show this line, change the `&` on line 2 to `|` (`false`).
624624
625625### Sail Runes
626626
627−In the previous example, we used a few special runes that aren’t used in typical
627+In the previous example, we used a few special runes that aren't used in typical
628628Hoon code. But there are others that are worth learning about at this point.
629629
630630`;+` is an expression that resolves to a single node. We saw this on line 20
631631in our Sail example above: `;+ ?: show-list` resolves to the node `;ol` and
632−all of that node’s children.
632+all of that node's children.
633633
634634`;*` is an expression that resolves to a list of nodes. If we want to render
635635multiple nodes side-by-side, and not just the children of a single node, this
@@ -637,7 +637,7 @@ is the expression that we use.
637637
638638`;=` turns a tuple of nodes into a list of nodes.
639639
640−To see how these runes work, let’s take a chunk of our previous code starting at
640+To see how these runes work, let's take a chunk of our previous code starting at
641641line 20 and modify it a bit:
642642
643643```
@@ -647,7 +647,7 @@ line 20 and modify it a bit:
647647 ;li: Actually, my name is {<p.bem.gas>}.
648648 ==
649649 ;=
650− ;div: My name is {<p.bem.gas>}. I’m a {what-kind}.
650+ ;div: My name is {<p.bem.gas>}. I'm a {what-kind}.
651651 ;div: No list here!
652652 ==
653653 ==
@@ -659,8 +659,8 @@ side-by-side -- notice that the `;ol` is absent from the first branch.
659659We begin with the `;*` rune, which resolves to a list of nodes, instead of the
660660`;+` rune, which only resolves to a single node.
661661
662−But that’s not enough on its own. `;*` needs to resolve to a list, and a few
663−Sail nodes aren’t lists until they are explicitly made into lists. Until we wrap
662+But that's not enough on its own. `;*` needs to resolve to a list, and a few
663+Sail nodes aren't lists until they are explicitly made into lists. Until we wrap
664664those nodes in `;=`, the nodes treated as mere tuples. All branches must be
665665valid lists for the `;* ?: show-list` expression to resolve.
666666
@@ -676,15 +676,15 @@ learn more about how the renderer works, take a look at the
676676
677677## Udon: A Guide {#udon}
678678
679−Udon is a way to write content for the web. It’s a minimalist
679+Udon is a way to write content for the web. It's a minimalist
680680markup language for creating and rendering text documents, with a
681−Markdown-inspired syntax. It’s integrated with our Hoon programming language,
681+Markdown-inspired syntax. It's integrated with our Hoon programming language,
682682allowing it to be used as standalone prose in its own file or embedded inside a
683683Hoon source file, in which case it will be parsed into a tree of HTML nodes
684−using Hoon’s XML-templating syntax, Sail.
684+using Hoon's XML-templating syntax, Sail.
685685
686686There are quite a few similarities between Udon and the
687−CommonMark standard, but there are enough differences that you shouldn’t rely on
687+CommonMark standard, but there are enough differences that you shouldn't rely on
688688existing knowledge of the latter. Udon generally supports only one
689689syntax for each type of HTML node it emits. Udon is also stricter than
690690Markdown: some syntax errors will prevent the file from being parsed at all.
@@ -696,7 +696,7 @@ will use the `frontpage.hoon` method that we are already familiar with.
696696
697697To test out Udon, put a `;>` under the `^- manx` in your `frontpage.hoon` file,
698698and then put all your Udon code under that `;>`. Then run `|commit %home`
699−in the Dojo. If you’ve already run the `|serve` command code from the first
699+in the Dojo. If you've already run the `|serve` command code from the first
700700section, the new content should appear at `http://localhost/test`.
701701
702702## Udon Syntax
@@ -710,7 +710,7 @@ The first thing on a `.udon` file is a chunk of code called the front matter. It
710710contains metadata about your page, such as date, title, and position relative
711711to sibling pages.
712712
713−As an example, let’s look at the front matter of this very page:
713+As an example, let's look at the front matter of this very page:
714714
715715```
716716:- :~ navhome/'/docs/'
@@ -720,14 +720,14 @@ As an example, let’s look at the front matter of this very page:
720720;>
721721```
722722
723−What’s going on here?
723+What's going on here?
724724
725725`:-`, the Hoon rune for creating a cell, creates a cell composed of
726726the `:~` Hoon rune for creating a list, and `;>`, which is a Sail rune
727727for Udon.
728728
729729`:~` creates a list out of the three elements: `navhome/'/docs/'`, which
730−indicates that navigating “home” will bring you to the urbit.org/docs section
730+indicates that navigating "home" will bring you to the urbit.org/docs section
731731of the website; `sort/'28'`, which assigns it the 28th position of the
732732immediate section that contains it, the one you see in the sidebar;
733733and `title/'Udon'`, which gives the page its title. The `==` digraph
@@ -735,7 +735,7 @@ terminates the list.
735735
736736`;>` is a Sail rune that creates a node that contains everything that follows
737737it, telling the parser that this text should be interpreted as Udon.
738−It’s not technically front matter, but you’ll always find it following the
738+It's not technically front matter, but you'll always find it following the
739739front matter, since all Udon must come after this rune.
740740
741741The categories listed in the example above -- `navhome`, `sort`, and `title` --
@@ -803,22 +803,22 @@ the _same line_.
803803**Example:**
804804
805805```
806−Here’s the first line.
806+Here's the first line.
807807
808−This second line is separated by two newlines, so it’s a separate paragraph.
808+This second line is separated by two newlines, so it's a separate paragraph.
809809
810−This line looks like a distinct paragraph, but …
811−It’s only separated by a single newline, so it’s included in the same paragraph.
810+This line looks like a distinct paragraph, but ...
811+It's only separated by a single newline, so it's included in the same paragraph.
812812```
813813
814814**Produces:**
815815
816−Here’s the first line.
816+Here's the first line.
817817
818−This second line is separated by two newlines, so it’s a separate paragraph.
818+This second line is separated by two newlines, so it's a separate paragraph.
819819
820−This line looks like a distinct paragraph, but …
821−It’s only separated by a single newline, so it’s included in the same paragraph.
820+This line looks like a distinct paragraph, but ...
821+It's only separated by a single newline, so it's included in the same paragraph.
822822
823823#### Backslash Line Break
824824
@@ -871,13 +871,13 @@ New list elements are delineated by newlines beginning with list symbols of
871871the appropriate type (`-` or `+`).
872872
873873Just as with non-list text, text on a bare newline will appear on the line before,
874−separated by a space. A `\\` is used to create a line-break that isn’t the list
875−itself and isn’t a list. Both of these kinds of newlines must be indented by two
874+separated by a space. A `\\` is used to create a line-break that isn't the list
875+itself and isn't a list. Both of these kinds of newlines must be indented by two
876876spaces, or else the page will not parse.
877877
878878Indentation is also used for creating nested sub-lists. Sub-lists of one kind
879−can be used with parent lists of the other kind. Sub-lists can’t be nested
880−directly after either kind of aforementioned newline that isn’t a list element;
879+can be used with parent lists of the other kind. Sub-lists can't be nested
880+directly after either kind of aforementioned newline that isn't a list element;
881881only lines that are themselves list elements can nest sub-lists.
882882
883883A newline after a blank line is interpreted as a new paragraph in normal text.
@@ -895,15 +895,15 @@ followed by a `\\` on its own line.
895895- Chicken\
896896 Make sure that you get enough for the barbecue
897897- Bread
898− + Ask the baker what’s fresh
898+ + Ask the baker what's fresh
899899 + Buy the second-freshest batch
900900- Cereal
901901
902902\
903903+ First, separate eggs into a bowl
904904+ Then, add a splash of cream
905− - If you don’t have cream, you can use milk, but cream is preferred
906− + If you don’t have milk or cream, melt an eighth of a stick of butter on
905+ - If you don't have cream, you can use milk, but cream is preferred
906+ + If you don't have milk or cream, melt an eighth of a stick of butter on
907907 a skillet
908908 + Scramble the eggs in the bowl
909909 + Pour the eggs onto the skillet before the butter browns
@@ -925,15 +925,15 @@ Produces
925925- Chicken\
926926 Make sure that you get enough for the barbecue
927927- Bread
928− 1. Ask the baker what’s fresh
928+ 1. Ask the baker what's fresh
929929 1. Buy the second-freshest batch
930930- Cereal
931931
932932\
9339331. First, separate eggs into a bowl
9349341. Then, add a splash of cream
935− - If you don’t have cream, you can use milk, but cream is preferred
936− 1. If you don’t have milk or cream, melt an eighth of a stick of butter on
935+ - If you don't have cream, you can use milk, but cream is preferred
936+ 1. If you don't have milk or cream, melt an eighth of a stick of butter on
937937 a skillet
938938 1. Scramble the eggs in the bowl
939939 1. Pour the eggs onto the skillet before the butter browns
@@ -956,26 +956,26 @@ destination.
956956**Example:**
957957
958958```
959−[I’m an inline-style link](https://urbit.org/operations/#using-the-shell)
959+[I'm an inline-style link](https://urbit.org/operations/#using-the-shell)
960960```
961961
962962**Produces:**
963963
964−[I’m an inline-style link](https://urbit.org/operations/#using-the-shell)
964+[I'm an inline-style link](https://urbit.org/operations/#using-the-shell)
965965
966966The second type is a reference-style link, which uses a relative path, based on
967−the current page’s location. Instead of the full url, we use `..` to fill in
967+the current page's location. Instead of the full url, we use `..` to fill in
968968all of the URL that the destination has in common with the origin page.
969969
970970**Example:**
971971
972972```
973−[I’m a reference-style link](../shell)
973+[I'm a reference-style link](../shell)
974974```
975975
976976**Produces:**
977977
978−[I’m a reference-style link](../shell)
978+[I'm a reference-style link](../shell)
979979
980980If this page is located at `https://www.urbit.org/docs/reference/`, then these two
981981examples should have the same destination.
@@ -997,9 +997,9 @@ Note that each HTML element `id` should be unique and not be used more than once
997997```
998998Check out this [section](#here-we-are) that we want to jump to.
999999
1000−Four score and seven years ago …
1000+Four score and seven years ago ...
10011001
1002−It was the best of times, it was the worst of times …
1002+It was the best of times, it was the worst of times ...
10031003
10041004## Here we are!
10051005```
@@ -1008,16 +1008,16 @@ It was the best of times, it was the worst of times …
10081008
10091009Check out this [section](#here-we-are) that we want to jump to.
10101010
1011−Four score and seven years ago …
1011+Four score and seven years ago ...
10121012
1013−It was the best of times, it was the worst of times …
1013+It was the best of times, it was the worst of times ...
10141014
10151015## Here we are!
10161016
10171017### Double Quote
10181018
10191019Text enclosed in double quotes (`"`) will be rendered with
1020−opening and closing quotes -- that is, `“` and `”`.
1020+opening and closing quotes -- that is, `"` and `"`.
10211021
10221022**Example:**
10231023```
@@ -1026,7 +1026,7 @@ opening and closing quotes -- that is, `“` and `”`.
10261026
10271027**Produces:**
10281028
1029−“Yes,” he said. “That is the way with him.”
1029+"Yes," he said. "That is the way with him."
10301030
10311031### Code Literal
10321032
@@ -1048,21 +1048,21 @@ inside a `<code>` HTML element with monospace font and highlighted with a
10481048different background color.
10491049
10501050Using `` ` `` is useful when you want to designate only part of a line as code.
1051−Since this page is written in Udon, we’ve been using this operation
1051+Since this page is written in Udon, we've been using this operation
10521052throughout this guide to _format text_ to distinguish `code` from prose.
10531053
10541054**Example:**
10551055
10561056```
1057−`*[a 2 b c] -> *[*[a b] *[a c]]` is like lisp’s `apply`.
1057+`*[a 2 b c] -> *[*[a b] *[a c]]` is like lisp's `apply`.
10581058```
10591059
10601060**Produces:**
10611061
1062−`*[a 2 b c] -> *[*[a b] *[a c]]` is like lisp’s `apply`.
1062+`*[a 2 b c] -> *[*[a b] *[a c]]` is like lisp's `apply`.
10631063
10641064Also, using the `++` prefix before a word will cause the word to be rendered as
1065−code with the `++` displayed, since that’s the standard notation for an arm in
1065+code with the `++` displayed, since that's the standard notation for an arm in
10661066Hoon.
10671067
10681068**Example:**
@@ -1127,7 +1127,7 @@ Produces:\
11271127### Horizontal Rule
11281128
11291129Three or more hyphens, such as `---`, on their own line produce an `<hr>`
1130−element, the “horizontal rule”. This is rendered as a horizontal line the
1130+element, the "horizontal rule". This is rendered as a horizontal line the
11311131width of its containing paragraph.
11321132
11331133**Example:**
@@ -1211,7 +1211,7 @@ indent the text in question with **eight spaces**.
12111211
12121212## Sail Expressions
12131213
1214−It’s possible to use Udon as an HTML templating language akin to
1214+It's possible to use Udon as an HTML templating language akin to
12151215PHP, ERB, JSP, or Handlebars templates. This facility derives
12161216in part from the support for embedding Hoon code inside the markup.
12171217
@@ -1226,7 +1226,7 @@ Example:
12261226```
12271227;=
12281228 ;p
1229− ;strong: Don’t panic!
1229+ ;strong: Don't panic!
12301230 ;br;
12311231 ;small: [reactive publishing intensifies]
12321232 ==
@@ -1236,7 +1236,7 @@ Example:
12361236Produces:
12371237
12381238<p>
1239− <strong>Don’t panic!</strong>
1239+ <strong>Don't panic!</strong>
12401240 <br />
12411241 <small>[reactive publishing intensifies]</small>
12421242</p>