xref: /aosp_15_r20/external/google-styleguide/docguide/style.md (revision 8c35d5ee8e2913d4bd6623e2b93232b1da0ab719)
1*8c35d5eeSXin Li# Markdown style guide
2*8c35d5eeSXin Li
3*8c35d5eeSXin LiMuch of what makes Markdown great is the ability to write plain text, and get
4*8c35d5eeSXin Ligreat formatted output as a result. To keep the slate clean for the next author,
5*8c35d5eeSXin Liyour Markdown should be simple and consistent with the whole corpus wherever
6*8c35d5eeSXin Lipossible.
7*8c35d5eeSXin Li
8*8c35d5eeSXin LiWe seek to balance three goals:
9*8c35d5eeSXin Li
10*8c35d5eeSXin Li1. *Source text is readable and portable.*
11*8c35d5eeSXin Li2. *Markdown files are maintainable over time and across teams.*
12*8c35d5eeSXin Li3. *The syntax is simple and easy to remember.*
13*8c35d5eeSXin Li
14*8c35d5eeSXin LiContents:
15*8c35d5eeSXin Li
16*8c35d5eeSXin Li1.  [Document layout](#document-layout)
17*8c35d5eeSXin Li1.  [Character line limit](#character-line-limit)
18*8c35d5eeSXin Li1.  [Trailing whitespace](#trailing-whitespace)
19*8c35d5eeSXin Li1.  [Headings](#headings)
20*8c35d5eeSXin Li    1.  [ATX-style headings](#atx-style-headings)
21*8c35d5eeSXin Li    1.  [Add spacing to headings](#add-spacing-to-headings)
22*8c35d5eeSXin Li1.  [Lists](#lists)
23*8c35d5eeSXin Li    1.  [Use lazy numbering for long lists](#use-lazy-numbering-for-long-lists)
24*8c35d5eeSXin Li    1.  [Nested list spacing](#nested-list-spacing)
25*8c35d5eeSXin Li1.  [Code](#code)
26*8c35d5eeSXin Li    1.  [Inline](#inline)
27*8c35d5eeSXin Li    1.  [Codeblocks](#codeblocks)
28*8c35d5eeSXin Li    1.  [Declare the language](#declare-the-language)
29*8c35d5eeSXin Li    1.  [Escape newlines](#escape-newlines)
30*8c35d5eeSXin Li    1.  [Nest codeblocks within lists](#nest-codeblocks-within-lists)
31*8c35d5eeSXin Li1.  [Links](#links)
32*8c35d5eeSXin Li    1.  [Use informative Markdown link titles](#use-informative-markdown-link-titles)
33*8c35d5eeSXin Li1.  [Images](#images)
34*8c35d5eeSXin Li1.  [Prefer lists to tables](#prefer-lists-to-tables)
35*8c35d5eeSXin Li1.  [Strongly prefer Markdown to HTML](#strongly-prefer-markdown-to-html)
36*8c35d5eeSXin Li
37*8c35d5eeSXin Li## Document layout
38*8c35d5eeSXin Li
39*8c35d5eeSXin LiIn general, most documents benefit from some variation of the following layout:
40*8c35d5eeSXin Li
41*8c35d5eeSXin Li```markdown
42*8c35d5eeSXin Li# Document Title
43*8c35d5eeSXin Li
44*8c35d5eeSXin LiShort introduction.
45*8c35d5eeSXin Li
46*8c35d5eeSXin Li[TOC]
47*8c35d5eeSXin Li
48*8c35d5eeSXin Li## Topic
49*8c35d5eeSXin Li
50*8c35d5eeSXin LiContent.
51*8c35d5eeSXin Li
52*8c35d5eeSXin Li## See also
53*8c35d5eeSXin Li
54*8c35d5eeSXin Li* https://link-to-more-info
55*8c35d5eeSXin Li```
56*8c35d5eeSXin Li
57*8c35d5eeSXin Li1.  `# Document Title`: The first heading should be a level one heading, and
58*8c35d5eeSXin Li    should ideally be the same or nearly the same as the filename. The first
59*8c35d5eeSXin Li    level one heading is used as the page `<title>`.
60*8c35d5eeSXin Li
61*8c35d5eeSXin Li1.  `author`: *Optional*. If you'd like to claim ownership of the document or
62*8c35d5eeSXin Li    if you are very proud of it, add yourself under the title. However,
63*8c35d5eeSXin Li    revision history generally suffices.
64*8c35d5eeSXin Li
65*8c35d5eeSXin Li1.  `Short introduction.` 1-3 sentences providing a high-level overview of the
66*8c35d5eeSXin Li    topic. Imagine yourself as a complete newbie, who landed on your "Extending
67*8c35d5eeSXin Li    Foo" doc and needs to know the most basic assumptions you take for granted.
68*8c35d5eeSXin Li    "What is Foo? Why would I extend it?"
69*8c35d5eeSXin Li
70*8c35d5eeSXin Li1.  `[TOC]`: if you use hosting that supports table of contents, such as Gitiles,
71*8c35d5eeSXin Li    put `[TOC]` after the short introduction. See
72*8c35d5eeSXin Li    [`[TOC]` documentation](https://gerrit.googlesource.com/gitiles/+/master/Documentation/markdown.md#Table-of-contents).
73*8c35d5eeSXin Li
74*8c35d5eeSXin Li1.  `## Topic`: The rest of your headings should start from level 2.
75*8c35d5eeSXin Li
76*8c35d5eeSXin Li1.  `## See also`: Put miscellaneous links at the bottom for the user who wants
77*8c35d5eeSXin Li    to know more or didn't find what she needed.
78*8c35d5eeSXin Li
79*8c35d5eeSXin Li## Character line limit
80*8c35d5eeSXin Li
81*8c35d5eeSXin LiObey projects' character line limit wherever possible. Long URLs and tables are
82*8c35d5eeSXin Lithe usual suspects when breaking the rule. (Headings also can't be wrapped, but
83*8c35d5eeSXin Liwe encourage keeping them short). Otherwise, wrap your text:
84*8c35d5eeSXin Li
85*8c35d5eeSXin Li```markdown
86*8c35d5eeSXin LiLorem ipsum dolor sit amet, nec eius volumus patrioque cu, nec et commodo
87*8c35d5eeSXin Lihendrerit, id nobis saperet fuisset ius.
88*8c35d5eeSXin Li
89*8c35d5eeSXin Li*   Malorum moderatius vim eu. In vix dico persecuti. Te nam saperet percipitur
90*8c35d5eeSXin Li    interesset. See the [foo docs](https://gerrit.googlesource.com/gitiles/+/master/Documentation/markdown.md).
91*8c35d5eeSXin Li```
92*8c35d5eeSXin Li
93*8c35d5eeSXin LiOften, inserting a newline before a long link preserves readability while
94*8c35d5eeSXin Liminimizing the overflow:
95*8c35d5eeSXin Li
96*8c35d5eeSXin Li```markdown
97*8c35d5eeSXin LiLorem ipsum dolor sit amet. See the
98*8c35d5eeSXin Li[foo docs](https://gerrit.googlesource.com/gitiles/+/master/Documentation/markdown.md)
99*8c35d5eeSXin Lifor details.
100*8c35d5eeSXin Li```
101*8c35d5eeSXin Li
102*8c35d5eeSXin Li## Trailing whitespace
103*8c35d5eeSXin Li
104*8c35d5eeSXin LiDon't use trailing whitespace, use a trailing backslash.
105*8c35d5eeSXin Li
106*8c35d5eeSXin LiThe [CommonMark spec](http://spec.commonmark.org/0.20/#hard-line-breaks) decrees
107*8c35d5eeSXin Lithat two spaces at the end of a line should insert a `<br />` tag. However, many
108*8c35d5eeSXin Lidirectories have a trailing whitespace presubmit check in place, and many IDEs
109*8c35d5eeSXin Liwill clean it up anyway.
110*8c35d5eeSXin Li
111*8c35d5eeSXin LiBest practice is to avoid the need for a `<br />` altogether. Markdown creates
112*8c35d5eeSXin Liparagraph tags for you simply with newlines: get used to that.
113*8c35d5eeSXin Li
114*8c35d5eeSXin Li## Headings
115*8c35d5eeSXin Li
116*8c35d5eeSXin Li### ATX-style headings
117*8c35d5eeSXin Li
118*8c35d5eeSXin Li```markdown
119*8c35d5eeSXin Li## Heading 2
120*8c35d5eeSXin Li```
121*8c35d5eeSXin Li
122*8c35d5eeSXin LiHeadings with `=` or `-` underlines can be annoying to maintain and don't fit
123*8c35d5eeSXin Liwith the rest of the heading syntax. The user has to ask: Does `---` mean H1 or
124*8c35d5eeSXin LiH2?
125*8c35d5eeSXin Li
126*8c35d5eeSXin Li```markdown
127*8c35d5eeSXin LiHeading - do you remember what level? DO NOT DO THIS.
128*8c35d5eeSXin Li---------
129*8c35d5eeSXin Li```
130*8c35d5eeSXin Li
131*8c35d5eeSXin Li### Add spacing to headings
132*8c35d5eeSXin Li
133*8c35d5eeSXin LiPrefer spacing after `#` and newlines before and after:
134*8c35d5eeSXin Li
135*8c35d5eeSXin Li```markdown
136*8c35d5eeSXin Li...text before.
137*8c35d5eeSXin Li
138*8c35d5eeSXin Li# Heading 1
139*8c35d5eeSXin Li
140*8c35d5eeSXin LiText after...
141*8c35d5eeSXin Li```
142*8c35d5eeSXin Li
143*8c35d5eeSXin LiLack of spacing makes it a little harder to read in source:
144*8c35d5eeSXin Li
145*8c35d5eeSXin Li```markdown
146*8c35d5eeSXin Li...text before.
147*8c35d5eeSXin Li
148*8c35d5eeSXin Li#Heading 1
149*8c35d5eeSXin LiText after... DO NOT DO THIS.
150*8c35d5eeSXin Li```
151*8c35d5eeSXin Li
152*8c35d5eeSXin Li## Lists
153*8c35d5eeSXin Li
154*8c35d5eeSXin Li### Use lazy numbering for long lists
155*8c35d5eeSXin Li
156*8c35d5eeSXin LiMarkdown is smart enough to let the resulting HTML render your numbered lists
157*8c35d5eeSXin Licorrectly. For longer lists that may change, especially long nested lists, use
158*8c35d5eeSXin Li"lazy" numbering:
159*8c35d5eeSXin Li
160*8c35d5eeSXin Li```markdown
161*8c35d5eeSXin Li1.  Foo.
162*8c35d5eeSXin Li1.  Bar.
163*8c35d5eeSXin Li    1.  Foofoo.
164*8c35d5eeSXin Li    1.  Barbar.
165*8c35d5eeSXin Li1.  Baz.
166*8c35d5eeSXin Li```
167*8c35d5eeSXin Li
168*8c35d5eeSXin LiHowever, if the list is small and you don't anticipate changing it, prefer fully
169*8c35d5eeSXin Linumbered lists, because it's nicer to read in source:
170*8c35d5eeSXin Li
171*8c35d5eeSXin Li```markdown
172*8c35d5eeSXin Li1.  Foo.
173*8c35d5eeSXin Li2.  Bar.
174*8c35d5eeSXin Li3.  Baz.
175*8c35d5eeSXin Li```
176*8c35d5eeSXin Li
177*8c35d5eeSXin Li### Nested list spacing
178*8c35d5eeSXin Li
179*8c35d5eeSXin LiWhen nesting lists, use a 4 space indent for both numbered and bulleted lists:
180*8c35d5eeSXin Li
181*8c35d5eeSXin Li```markdown
182*8c35d5eeSXin Li1.  2 spaces after a numbered list.
183*8c35d5eeSXin Li    4 space indent for wrapped text.
184*8c35d5eeSXin Li2.  2 spaces again.
185*8c35d5eeSXin Li
186*8c35d5eeSXin Li*   3 spaces after a bullet.
187*8c35d5eeSXin Li    4 space indent for wrapped text.
188*8c35d5eeSXin Li    1.  2 spaces after a numbered list.
189*8c35d5eeSXin Li        8 space indent for the wrapped text of a nested list.
190*8c35d5eeSXin Li    2.  Looks nice, don't it?
191*8c35d5eeSXin Li*   3 spaces after a bullet.
192*8c35d5eeSXin Li```
193*8c35d5eeSXin Li
194*8c35d5eeSXin LiThe following works, but it's very messy:
195*8c35d5eeSXin Li
196*8c35d5eeSXin Li```markdown
197*8c35d5eeSXin Li* One space,
198*8c35d5eeSXin Liwith no indent for wrapped text.
199*8c35d5eeSXin Li     1. Irregular nesting... DO NOT DO THIS.
200*8c35d5eeSXin Li```
201*8c35d5eeSXin Li
202*8c35d5eeSXin LiEven when there's no nesting, using the 4 space indent makes layout consistent
203*8c35d5eeSXin Lifor wrapped text:
204*8c35d5eeSXin Li
205*8c35d5eeSXin Li```markdown
206*8c35d5eeSXin Li*   Foo,
207*8c35d5eeSXin Li    wrapped.
208*8c35d5eeSXin Li
209*8c35d5eeSXin Li1.  2 spaces
210*8c35d5eeSXin Li    and 4 space indenting.
211*8c35d5eeSXin Li2.  2 spaces again.
212*8c35d5eeSXin Li```
213*8c35d5eeSXin Li
214*8c35d5eeSXin LiHowever, when lists are small, not nested, and a single line, one space can
215*8c35d5eeSXin Lisuffice for both kinds of lists:
216*8c35d5eeSXin Li
217*8c35d5eeSXin Li```markdown
218*8c35d5eeSXin Li* Foo
219*8c35d5eeSXin Li* Bar
220*8c35d5eeSXin Li* Baz.
221*8c35d5eeSXin Li
222*8c35d5eeSXin Li1. Foo.
223*8c35d5eeSXin Li2. Bar.
224*8c35d5eeSXin Li```
225*8c35d5eeSXin Li
226*8c35d5eeSXin Li## Code
227*8c35d5eeSXin Li
228*8c35d5eeSXin Li### Inline
229*8c35d5eeSXin Li
230*8c35d5eeSXin Li&#96;Backticks&#96; designate `inline code`, and will render all wrapped content
231*8c35d5eeSXin Liliterally. Use them for short code quotations and field names:
232*8c35d5eeSXin Li
233*8c35d5eeSXin Li```markdown
234*8c35d5eeSXin LiYou'll want to run `really_cool_script.sh arg`.
235*8c35d5eeSXin Li
236*8c35d5eeSXin LiPay attention to the `foo_bar_whammy` field in that table.
237*8c35d5eeSXin Li```
238*8c35d5eeSXin Li
239*8c35d5eeSXin LiUse inline code when referring to file types in an abstract sense, rather than a
240*8c35d5eeSXin Lispecific file:
241*8c35d5eeSXin Li
242*8c35d5eeSXin Li```markdown
243*8c35d5eeSXin LiBe sure to update your `README.md`!
244*8c35d5eeSXin Li```
245*8c35d5eeSXin Li
246*8c35d5eeSXin LiBackticks are the most common approach for "escaping" Markdown metacharacters;
247*8c35d5eeSXin Liin most situations where escaping would be needed, code font just makes sense
248*8c35d5eeSXin Lianyway.
249*8c35d5eeSXin Li
250*8c35d5eeSXin Li### Codeblocks
251*8c35d5eeSXin Li
252*8c35d5eeSXin LiFor code quotations longer than a single line, use a codeblock:
253*8c35d5eeSXin Li
254*8c35d5eeSXin Li<pre>
255*8c35d5eeSXin Li```python
256*8c35d5eeSXin Lidef Foo(self, bar):
257*8c35d5eeSXin Li  self.bar = bar
258*8c35d5eeSXin Li```
259*8c35d5eeSXin Li</pre>
260*8c35d5eeSXin Li
261*8c35d5eeSXin Li#### Declare the language
262*8c35d5eeSXin Li
263*8c35d5eeSXin LiIt is best practice to explicitly declare the language, so that neither the
264*8c35d5eeSXin Lisyntax highlighter nor the next editor must guess.
265*8c35d5eeSXin Li
266*8c35d5eeSXin Li#### Indented codeblocks are sometimes cleaner
267*8c35d5eeSXin Li
268*8c35d5eeSXin LiFour-space indenting is also interpreted as a codeblock. These can look
269*8c35d5eeSXin Licleaner and be easier to read in source, but there is no way to specify the
270*8c35d5eeSXin Lilanguage. We encourage their use when writing many short snippets:
271*8c35d5eeSXin Li
272*8c35d5eeSXin Li```markdown
273*8c35d5eeSXin LiYou'll need to run:
274*8c35d5eeSXin Li
275*8c35d5eeSXin Li    bazel run :thing -- --foo
276*8c35d5eeSXin Li
277*8c35d5eeSXin LiAnd then:
278*8c35d5eeSXin Li
279*8c35d5eeSXin Li    bazel run :another_thing -- --bar
280*8c35d5eeSXin Li
281*8c35d5eeSXin LiAnd again:
282*8c35d5eeSXin Li
283*8c35d5eeSXin Li    bazel run :yet_again -- --baz
284*8c35d5eeSXin Li```
285*8c35d5eeSXin Li
286*8c35d5eeSXin Li#### Escape newlines
287*8c35d5eeSXin Li
288*8c35d5eeSXin LiBecause most commandline snippets are intended to be copied and pasted directly
289*8c35d5eeSXin Liinto a terminal, it's best practice to escape any newlines. Use a single
290*8c35d5eeSXin Libackslash at the end of the line:
291*8c35d5eeSXin Li
292*8c35d5eeSXin Li<pre>
293*8c35d5eeSXin Li```shell
294*8c35d5eeSXin Libazel run :target -- --flag --foo=longlonglonglonglongvalue \
295*8c35d5eeSXin Li--bar=anotherlonglonglonglonglonglonglonglonglonglongvalue
296*8c35d5eeSXin Li```
297*8c35d5eeSXin Li</pre>
298*8c35d5eeSXin Li
299*8c35d5eeSXin Li#### Nest codeblocks within lists
300*8c35d5eeSXin Li
301*8c35d5eeSXin LiIf you need a codeblock within a list, make sure to indent it so as to not break
302*8c35d5eeSXin Lithe list:
303*8c35d5eeSXin Li
304*8c35d5eeSXin Li```markdown
305*8c35d5eeSXin Li*   Bullet.
306*8c35d5eeSXin Li
307*8c35d5eeSXin Li    ```c++
308*8c35d5eeSXin Li    int foo;
309*8c35d5eeSXin Li    ```
310*8c35d5eeSXin Li
311*8c35d5eeSXin Li*   Next bullet.
312*8c35d5eeSXin Li```
313*8c35d5eeSXin Li
314*8c35d5eeSXin LiYou can also create a nested code block with 4 spaces. Simply indent 4
315*8c35d5eeSXin Liadditional spaces from the list indentation:
316*8c35d5eeSXin Li
317*8c35d5eeSXin Li```markdown
318*8c35d5eeSXin Li*   Bullet.
319*8c35d5eeSXin Li
320*8c35d5eeSXin Li        int foo;
321*8c35d5eeSXin Li
322*8c35d5eeSXin Li*   Next bullet.
323*8c35d5eeSXin Li```
324*8c35d5eeSXin Li
325*8c35d5eeSXin Li## Links
326*8c35d5eeSXin Li
327*8c35d5eeSXin LiLong links make source Markdown difficult to read and break the 80 character
328*8c35d5eeSXin Liwrapping. **Wherever possible, shorten your links**.
329*8c35d5eeSXin Li
330*8c35d5eeSXin Li### Use informative Markdown link titles
331*8c35d5eeSXin Li
332*8c35d5eeSXin LiMarkdown link syntax allows you to set a link title, just as HTML does. Use it
333*8c35d5eeSXin Liwisely.
334*8c35d5eeSXin Li
335*8c35d5eeSXin LiTitling your links as "link" or "here" tells the reader precisely nothing when
336*8c35d5eeSXin Liquickly scanning your doc and is a waste of space:
337*8c35d5eeSXin Li
338*8c35d5eeSXin Li```markdown
339*8c35d5eeSXin LiSee the syntax guide for more info: [link](syntax_guide.md).
340*8c35d5eeSXin LiOr, check out the style guide [here](style_guide.md).
341*8c35d5eeSXin LiDO NOT DO THIS.
342*8c35d5eeSXin Li```
343*8c35d5eeSXin Li
344*8c35d5eeSXin LiInstead, write the sentence naturally, then go back and wrap the most
345*8c35d5eeSXin Liappropriate phrase with the link:
346*8c35d5eeSXin Li
347*8c35d5eeSXin Li```markdown
348*8c35d5eeSXin LiSee the [syntax guide](syntax_guide.md) for more info.
349*8c35d5eeSXin LiOr, check out the [style guide](style_guide.md).
350*8c35d5eeSXin Li```
351*8c35d5eeSXin Li
352*8c35d5eeSXin Li## Images
353*8c35d5eeSXin Li
354*8c35d5eeSXin LiUse images sparingly, and prefer simple screenshots. This guide is designed
355*8c35d5eeSXin Liaround the idea that plain text gets users down to the business of communication
356*8c35d5eeSXin Lifaster with less reader distraction and author procrastination. However, it's
357*8c35d5eeSXin Lisometimes very helpful to show what you mean.
358*8c35d5eeSXin Li
359*8c35d5eeSXin LiSee [image syntax](https://gerrit.googlesource.com/gitiles/+/master/Documentation/markdown.md#Images).
360*8c35d5eeSXin Li
361*8c35d5eeSXin Li## Prefer lists to tables
362*8c35d5eeSXin Li
363*8c35d5eeSXin LiAny tables in your Markdown should be small. Complex, large tables are difficult
364*8c35d5eeSXin Lito read in source and most importantly, **a pain to modify later**.
365*8c35d5eeSXin Li
366*8c35d5eeSXin Li```markdown
367*8c35d5eeSXin LiFruit | Attribute | Notes
368*8c35d5eeSXin Li--- | --- | --- | ---
369*8c35d5eeSXin LiApple | [Juicy](https://example.com/SomeReallyReallyReallyReallyReallyReallyReallyReallyLongQuery), Firm, Sweet | Apples keep doctors away.
370*8c35d5eeSXin LiBanana | [Convenient](https://example.com/SomeDifferentReallyReallyReallyReallyReallyReallyReallyReallyLongQuery), Soft, Sweet | Contrary to popular belief, most apes prefer mangoes.
371*8c35d5eeSXin Li
372*8c35d5eeSXin LiDO NOT DO THIS
373*8c35d5eeSXin Li```
374*8c35d5eeSXin Li
375*8c35d5eeSXin Li[Lists](#lists) and subheadings usually suffice to present the same information
376*8c35d5eeSXin Liin a slightly less compact, though much more edit-friendly way:
377*8c35d5eeSXin Li
378*8c35d5eeSXin Li```markdown
379*8c35d5eeSXin Li## Fruits
380*8c35d5eeSXin Li
381*8c35d5eeSXin Li### Apple
382*8c35d5eeSXin Li
383*8c35d5eeSXin Li* [Juicy](https://SomeReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLongURL)
384*8c35d5eeSXin Li* Firm
385*8c35d5eeSXin Li* Sweet
386*8c35d5eeSXin Li
387*8c35d5eeSXin LiApples keep doctors away.
388*8c35d5eeSXin Li
389*8c35d5eeSXin Li### Banana
390*8c35d5eeSXin Li
391*8c35d5eeSXin Li* [Convenient](https://example.com/SomeDifferentReallyReallyReallyReallyReallyReallyReallyReallyLongQuery)
392*8c35d5eeSXin Li* Soft
393*8c35d5eeSXin Li* Sweet
394*8c35d5eeSXin Li
395*8c35d5eeSXin LiContrary to popular belief, most apes prefer mangoes.
396*8c35d5eeSXin Li```
397*8c35d5eeSXin Li
398*8c35d5eeSXin LiHowever, there are times when a small table is called for:
399*8c35d5eeSXin Li
400*8c35d5eeSXin Li```markdown
401*8c35d5eeSXin LiTransport | Favored by | Advantages
402*8c35d5eeSXin Li--- | --- | ---
403*8c35d5eeSXin LiSwallow | Coconuts | Otherwise unladen
404*8c35d5eeSXin LiBicycle | Miss Gulch | Weatherproof
405*8c35d5eeSXin LiX-34 landspeeder | Whiny farmboys | Cheap since the X-38 came out
406*8c35d5eeSXin Li```
407*8c35d5eeSXin Li
408*8c35d5eeSXin Li## Strongly prefer Markdown to HTML
409*8c35d5eeSXin Li
410*8c35d5eeSXin LiPlease prefer standard Markdown syntax wherever possible and avoid HTML hacks.
411*8c35d5eeSXin LiIf you can't seem to accomplish what you want, reconsider whether you really
412*8c35d5eeSXin Lineed it. Except for [big tables](#prefer-lists-to-tables), Markdown meets almost
413*8c35d5eeSXin Liall needs already.
414*8c35d5eeSXin Li
415*8c35d5eeSXin LiEvery bit of HTML or Javascript hacking reduces the readability and portability.
416*8c35d5eeSXin LiThis in turn limits the usefulness of integrations with
417*8c35d5eeSXin Liother tools, which may either present the source as plain text or render it. See
418*8c35d5eeSXin Li[Philosophy](philosophy.md).
419*8c35d5eeSXin Li
420*8c35d5eeSXin LiGitiles does not render HTML.
421