From c8fe45350e9cfdfb4782ef67084f49ad7c6575df Mon Sep 17 00:00:00 2001 From: Rachael Sewell Date: Tue, 26 Sep 2023 09:48:46 -0700 Subject: [PATCH 1/4] Liquid linter rule conditional quotes (#43013) Co-authored-by: Peter Bengtsson --- .../lib/helpers/liquid-utils.js | 43 ++++++++ src/content-linter/lib/linting-rules/index.js | 2 + .../liquid-quoted-conditional-arg.js | 56 ++++++++++ src/content-linter/style/github-docs.js | 5 + src/content-linter/tests/lint-versioning.js | 12 -- .../unit/liquid-quoted-conditional-args.js | 104 ++++++++++++++++++ 6 files changed, 210 insertions(+), 12 deletions(-) create mode 100644 src/content-linter/lib/helpers/liquid-utils.js create mode 100644 src/content-linter/lib/linting-rules/liquid-quoted-conditional-arg.js create mode 100644 src/content-linter/tests/unit/liquid-quoted-conditional-args.js diff --git a/src/content-linter/lib/helpers/liquid-utils.js b/src/content-linter/lib/helpers/liquid-utils.js new file mode 100644 index 000000000000..660c256b7e35 --- /dev/null +++ b/src/content-linter/lib/helpers/liquid-utils.js @@ -0,0 +1,43 @@ +import { Tokenizer } from 'liquidjs' + +const liquidTokenCache = new Map() + +export function getLiquidTokens(content) { + if (!content) return [] + + if (liquidTokenCache.has(content)) { + return liquidTokenCache.get(content) + } + + const tokenizer = new Tokenizer(content) + const tokens = tokenizer.readTopLevelTokens() + liquidTokenCache.set(content, tokens) + return liquidTokenCache.get(content) +} + +export const OUTPUT_OPEN = '{%' +export const OUTPUT_CLOSE = '%}' +export const TAG_OPEN = '{{' +export const TAG_CLOSE = '}}' + +export const conditionalTags = ['if', 'elseif', 'unless', 'case', 'ifversion'] + +export function getPositionData(token, lines) { + // Liquid indexes are 0-based, but we want to + // covert to the system used by Markdownlint + const begin = token.begin + 1 + const end = token.end + 1 + // Account for the newline character at the end + // of each line that is not represented in the + // `lines` array + const lineLengths = lines.map((line) => line.length + 1) + + let count = begin + let lineNumber = 1 + for (const lineLength of lineLengths) { + if (count - lineLength <= 0) break + count = count - lineLength + lineNumber++ + } + return { lineNumber, column: count, length: end - begin } +} diff --git a/src/content-linter/lib/linting-rules/index.js b/src/content-linter/lib/linting-rules/index.js index 5e462c649d23..a78a2e288ccb 100644 --- a/src/content-linter/lib/linting-rules/index.js +++ b/src/content-linter/lib/linting-rules/index.js @@ -11,6 +11,7 @@ import { listFirstWordCapitalization } from './list-first-word-capitalization.js import { linkPunctuation } from './link-punctuation.js' import { earlyAccessReferences } from './early-access-references.js' import { yamlScheduledJobs } from './yaml-scheduled-jobs.js' +import { liquidQuotedConditionalArg } from './liquid-quoted-conditional-arg.js' export const gitHubDocsMarkdownlint = { rules: [ @@ -26,5 +27,6 @@ export const gitHubDocsMarkdownlint = { linkPunctuation, earlyAccessReferences, yamlScheduledJobs, + liquidQuotedConditionalArg, ], } diff --git a/src/content-linter/lib/linting-rules/liquid-quoted-conditional-arg.js b/src/content-linter/lib/linting-rules/liquid-quoted-conditional-arg.js new file mode 100644 index 000000000000..e25f792b4d10 --- /dev/null +++ b/src/content-linter/lib/linting-rules/liquid-quoted-conditional-arg.js @@ -0,0 +1,56 @@ +import { TokenKind } from 'liquidjs' +import { addError } from 'markdownlint-rule-helpers' + +import { getLiquidTokens, conditionalTags, getPositionData } from '../helpers/liquid-utils.js' +import { isStringQuoted } from '../helpers/utils.js' + +/* + Checks for instances where a Liquid conditional tag's argument is + quoted because it will always evaluate to true. + + For example, the following would be flagged: + {% if "foo" %} + {% ifversion "bar" %} +*/ +export const liquidQuotedConditionalArg = { + names: ['LQ111', 'liquid-quoted-conditional-arg'], + description: 'Liquid conditional tags should not quote the conditional argument.', + tags: ['liquid', 'formatting'], + function: function LQ111(params, onError) { + const content = params.lines.join('\n') + const tokens = getLiquidTokens(content) + .filter((token) => token.kind === TokenKind.Tag) + .filter((token) => conditionalTags.includes(token.name)) + .filter((token) => { + const tokensArray = token.args.split(/\s+/g) + if (tokensArray.some((arg) => isStringQuoted(arg))) return true + return false + }) + + if (!tokens.length) return + + for (const token of tokens) { + const lines = params.lines + const { lineNumber, column, length } = getPositionData(token, lines) + // LineNumber starts at 1, but lines is 0-based + const line = lines[lineNumber - 1].slice(column - 1, column + length) + // Trim the first and last character off of the token args + const replaceWith = token.args.slice(1, token.args.length - 1) + const replaceString = line.replace(token.args, replaceWith) + + addError( + onError, + lineNumber, + "A conditional Liquid tag's argument is quoted, meaning it will always evaluate to true. Remove the quotes to allow Liquid to evaluate variable.", + token.content, + [column, length], + { + lineNumber, + editColumn: column, + deleteCount: length, + insertText: replaceString, + }, + ) + } + }, +} diff --git a/src/content-linter/style/github-docs.js b/src/content-linter/style/github-docs.js index d7ee01043f70..4afd374bd5a5 100644 --- a/src/content-linter/style/github-docs.js +++ b/src/content-linter/style/github-docs.js @@ -53,6 +53,11 @@ export const githubDocsConfig = { severity: 'error', 'partial-markdown-files': true, }, + 'liquid-quoted-conditional-arg': { + // LQ111 + severity: 'error', + 'partial-markdown-files': true, + }, } export const searchReplaceConfig = { diff --git a/src/content-linter/tests/lint-versioning.js b/src/content-linter/tests/lint-versioning.js index a68e3f511ea3..a53818bba44c 100644 --- a/src/content-linter/tests/lint-versioning.js +++ b/src/content-linter/tests/lint-versioning.js @@ -57,10 +57,6 @@ describe('lint feature versions', () => { const allFiles = walkFiles('content', '.md').concat(walkFiles('data', ['.yml', '.md'])) -// Quoted strings in Liquid, like {% if "foo" %}, will always evaluate true _because_ they are strings. -// Instead we need to use unquoted variables, like {% if foo %}. -const stringInLiquidRegex = /{% (?:if|ifversion|elseif|unless) (?:"|').+?%}/g - // Make sure the `if` and `ifversion` Liquid tags in content and data files are valid. describe('lint Liquid versioning', () => { describe.each(allFiles)('%s', (file) => { @@ -89,14 +85,6 @@ describe('lint Liquid versioning', () => { ${ifsForVersioning.join('\n')}` expect(ifsForVersioning.length, errorMessage).toBe(0) }) - - test('does not contain Liquid that evaluates strings (because they are always true)', async () => { - const matches = fileContents.match(stringInLiquidRegex) || [] - const message = - 'Found Liquid conditionals that evaluate a string instead of a variable. Remove the quotes around the variable!' - const errorMessage = `${message}\n - ${matches.join('\n - ')}` - expect(matches.length, errorMessage).toBe(0) - }) }) }) diff --git a/src/content-linter/tests/unit/liquid-quoted-conditional-args.js b/src/content-linter/tests/unit/liquid-quoted-conditional-args.js new file mode 100644 index 000000000000..5127eeeedd66 --- /dev/null +++ b/src/content-linter/tests/unit/liquid-quoted-conditional-args.js @@ -0,0 +1,104 @@ +import { runRule } from '../../lib/init-test.js' +import { liquidQuotedConditionalArg } from '../../lib/linting-rules/liquid-quoted-conditional-arg.js' + +describe(liquidQuotedConditionalArg.names.join(' - '), () => { + test('if conditional with quote args fails', async () => { + const markdown = [ + '---', + 'title: Good sample page', + '---', + '', + ' - One', + '{% if product.title == "Awesome Shoes" %}', + "{% elseif 'ghes' %}", + '{% elseif "ghec" %}', + '{% endif %}', + '{% data variables.stuff.foo%}', + ].join('\n') + const result = await runRule(liquidQuotedConditionalArg, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(2) + expect(errors.map((error) => error.lineNumber)).toEqual([7, 8]) + expect(errors[0].errorRange).toEqual([1, 19]) + expect(errors[1].errorRange).toEqual([1, 19]) + }) + test('ifversion conditional with quote args fails', async () => { + const markdown = [ + '---', + 'title: Good sample page', + '---', + '', + ' - One', + '{% ifversion "ghec" %}', + '{% ifversion "fpt" or ghec %}', + '{% ifversion fpt and "ghec" %}', + '{{name | capitalize}}', + '{% endif %}', + '{% data variables.stuff.foo%}', + ].join('\n') + const result = await runRule(liquidQuotedConditionalArg, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(3) + expect(errors.map((error) => error.lineNumber)).toEqual([6, 7, 8]) + expect(errors[0].errorRange).toEqual([1, 22], [1, 29], [1, 23]) + }) + test('unless conditional with quote args fails', async () => { + const markdown = [ + '---', + 'title: Good sample page', + '---', + '', + ' - One', + '{% unless "this" %}', + '- Three', + '{% data variables.stuff.foo%}', + ].join('\n') + const result = await runRule(liquidQuotedConditionalArg, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(1) + expect(errors.map((error) => error.lineNumber)).toEqual([6]) + expect(errors[0].errorRange).toEqual([1, 19]) + }) + test('case conditional with quote args fails', async () => { + const markdown = [ + '---', + 'title: Good sample page', + '---', + '', + '{% case "product.type" %}', + "{% when 'Health' %}", + 'This is a health potion.', + '{% when "Love" %}', + 'This is a love potion.', + '{% else %}', + 'This is a potion.', + '{% endcase %}', + '- Three', + '{% data variables.stuff.foo%}', + ].join('\n') + const result = await runRule(liquidQuotedConditionalArg, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(1) + expect(errors.map((error) => error.lineNumber)).toEqual([5]) + expect(errors[0].errorRange).toEqual([1, 25]) + }) + test('conditional without quote args pass', async () => { + const markdown = [ + '---', + 'title: Good sample page', + '---', + '', + '{% case product.type %}', + "{% when 'Health' %}", + '{% unless this %}', + '{% ifversion ghec %}', + '{% elseif ghes %}', + '{% if ghae %}', + '- Three', + '{% data variables.stuff.foo%}', + ].join('\n') + const result = await runRule(liquidQuotedConditionalArg, { strings: { markdown } }) + const errors = result.markdown + expect(errors.length).toBe(0) + }) +}) From e1cc8b36f536fe251774506551eaacc86e370688 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 26 Sep 2023 12:52:55 -0400 Subject: [PATCH 2/4] Clean up image names that aren't "kebab case" (IV) (#43324) --- .../images/help/issues/issues-labels-button.png | Bin 0 -> 49631 bytes ...otifications-general-existence-indicator.png | Bin 0 -> 9977 bytes .../notifications/access_notifications.md | 2 +- data/reusables/project-management/labels.md | 2 +- data/reusables/project-management/milestones.md | 2 +- .../select-items-in-issue-or-pr-list.md | 2 +- 6 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 assets/images/help/issues/issues-labels-button.png create mode 100644 assets/images/help/notifications/notifications-general-existence-indicator.png diff --git a/assets/images/help/issues/issues-labels-button.png b/assets/images/help/issues/issues-labels-button.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a8113f664ade959d981f3f8055a6a0d3ce8f5f GIT binary patch literal 49631 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 SWEuPWzlzUPpO(rPz5hSi>g|>Q literal 0 HcmV?d00001 diff --git a/assets/images/help/notifications/notifications-general-existence-indicator.png b/assets/images/help/notifications/notifications-general-existence-indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..dbca6f5802a711ffa3c7a18c281e837fbf7020be GIT binary patch literal 9977 zcmbVyWmFu^)-?_pf?I$f!F6yaxCVz{VesHKKyW9)ErADj0trs=!QI_u1{j>+?()sO z-@WVo@&0>PukO{g`mE~eU8nl&b81Ivsw?6EC;&)ENI1$$a@t5p$dicsWh@lLHGSq= z7!ndwr?Q;%M{nfA`4ELZ&9?(*tA#c8(3*FJ3R2k8Y??B8WQH!2>}aoVNKROAV*K7>F-=IpGh6cu_@E&-w^V%P-LJ}+r=w8#vp8s* z1DD4;%Ij4q)Z^(qLqMn(&g18bXg+w)6mi}LiDdqc@i-IH<#B9wA2op)hr$C_h3v4} z2bTQ@@OyrV4IK8xA%#8&9HR^6?1*J$BX_C20@6Z4v9W-Nvl5OH8j~#z4nqvLiv%PE zCP19%WcZ-N*P-la|204uu|tC47B={xcliG?KtmXHp`$f2gkn1`@nBMk^su~M8}S|Z z1Z@z>S#E&lQO{XxHr{CVwgoT09e96H_FzfHvAQ)hl=@XD5CgwbLMQb%m*cp@9VbZbx`Rw~wm12yHlDGUy!$3F%vzqfvmXU)a^6Exhr{an=)PZ&|v<89C<}ueq9! zHmsG-&O-F>4z*`fhMP%*6er}E%@~v8!$I7VQi$m z)TR1CWCoIxqQWmLrbt@T1%Kd&D@|?W;_0ygSKKHj)=6^CY|Xl1q!ZS{XHY zw`Cz01hmh%Wy;yOcA-84;T&!kG7xfmo%A`Vmni=`^YxVz9CsEqlKjUn$;jQ=ib&g4 z)wSUX#^uXlV4UP0fwGgE9DrI>QmlzaweD;#Jo;P!ofH4qA4&Bx0XaZ&O!J_&jwyMy zfM>^6tx429XEkx6fRD&$_9G?7lBj#id|KtS+OHLPYZI(Sx22V9`jcjj$85Uy%rDmr z4z~NuM~bUEUMFGTF3Ib06kusN&Sv1+az%?nMOll3&Ic8x#VB+@=wh>HOw`KC3TM9d z^oo*~lE!3(k*PQs=9)#G_Jhjo&BW9D)wS*MbayV-m-dVKAK8BXFf zv?)~ifLoOL`rEhd6g%2*x-hfEFiD}eHn{}5IrQ0K48|cSsUO@JCriPz*|HDS7_9_w$Bdf>YwOA^exYXUpAY$2ni&w=A9=+VIkeWj-s@;aHub+%MW$ ze(_9>R|EA7c#w}DQT(yWgg!xhF?V4-25k#UY@!BzYZxNu zSnI?}Yvz{eQ(r9fdVLbySYqgtHRP(rASvvJk(S1_eX*|%7o@>|E9zTN-uf66uNGK9HAgiGq`u#unfBz+w4G(i-%l3vgRr$z@R%T0N1u{>c;m>`gJ4UUvb z?}}Xt2;75Ky-bMuS~eX0@ju%7k)wmf@r-&RU6ho$);~u2^UKx4^J0}v)oRNPmHNo| zE_G55@Tt!)=D^G=0nA|5@&9CLo#3bbhUh; zY+0S070-%5hvC-gmD5Uq47_eTKj*ipZKLywk$-!=!$M$M?Avl+^wUZ?g!orhm=yAd40vTs*)MpfH*%6CMx zo1-+gC0cnUfaJAF8e`;j{BVbPDCYecQX|TkjW(^PrgBqKk9r0@->d&AraDFHZ&apN zVOE6FQsV|dAbYvuwdQpUD+-9fMU28>=9ikoV^28Oa{b9-wa(4)TDJ$cszQTCE=~L0 z4(0Qb=$FG=L8kPV{oe67^-*EBa}-|zB~f=)uwt<-Rw3u(E5HYPl+-yb(_0xYzwqar zP>q@`(H$|#pK-)sy{_-v2pY! zHF=whYx!Q1Jm=~cR{97;=s)9`KTErnnxcZ&-@hC+t_e#%Mh@=T@x`&6Gcag|qakfU znF_b(e`vus$S0drQo}Kv6LQ+(@iU=WUk+)Me|a3kEYS+=XW~EXkCy7IC>1I`)+R;3hji_Z}?sAElqY( z341Gjd=y((ZuzTafO5ns(F+h{Bkty zP6ih$mtuI|xLa6{YJ@=R3aWX(D8hoa_}ND)`pW(c z{K#T=RRE$__Om?wX(YJfc8LlvRny@OD6LM;uZ}Zr<-@^*U~5uXlRu)?-n zRn}&74w~>S@SE2KE(JH3yTsS_n;iP4&(32L;PJ!IDAcxEF*Fu|j4)Wpadnsyn0XbJ z&|Dr3>s=XU51kd{n-#2;u*Z(sH3-0N`D9d0CXUhldU)h(xLvx1`lxCM^jkqE72R*! z23vHtmTwIw84kQOcc`2c4h{>ID|4AQW_s9sZtRm;`no!b+Tw`+{CTu}3+Ih{j(c6H zbdllv9b}paI|_DAHyy*wg662A=BSe9ChG~0@`iMrKZ$LfJlUHuc;+iSv!k5<$Dj0pA@rp-yU^^ z%69LIK~LYY>5%M*Yk$fvZw(pZN{-`5j{D37*Dach`u8icL|DNk6oxPltJE*)lGN}+11|e`ksxlAb3pZQQLjHAn^kDper5`4q=S@iRWViQykxaAAR2qu>RpjZyvM zFQ?4;qveJY(hojHjm~lQYbh+SC$F(`bJY32V8Ow(soyh~B6FOl*b0`ufi5_D_gCK-S}9gvPX%P*$OhgnM^Q(+n-&SJ$74 zY*z;>sI;WQk}ybc35&upAEn~>3!^Y%MGL|Sagz0^`T9PO4-;WHe>5Q|{lg(+ zt`!Uev8N9yM%bp~X-|?$;GqL`f1;8xqK@df;1Bb%NC;pGvPD`N=Ol5>btJ@?@?}1uk8jF zju^G!Eli*zG{#S;&{zC!a18vLLL_>8X#@OwBT~qlES?;>0h*Ft=Q47@v|8;aSt3Zv z#t$`awEE59OTq$XMI3g4-O&P>u-32gHDDcYPLMYeuJfmiBM13O!;CklIoZ$eB+KaD zmkJN75ih6odbipXKI)B@k46GfJi9c0+Au-1smGB-fio+*=AUfS9$=oT5!b694V34if3oN^)ArWyVaRK-#@8cpQ9s{nb_ zGPyLeVq85RaG@!EGlYmlo)EFy-HF7B_#ENXjPwXUe8!rHFEP@*0JTHiyiQ%cndSj> zSjY2y3`*nQ;0Li?G6HfEOQ{g3+!N7k-DTyP4+mh7mSZ#0gB&8_J#AqX-+^<+@R*XD zPC{zy(sXsV+}DNYOj^{R!iX^|Z3Kt#v+f1hMYV0GD30vjt+hY;`6w&biJ1)JRc8u* zBC>m(g}nl~z&a?3@y;~}#5s7-h9h|8JMh(jI;h_IDNIFQUSG|!XV~te9 z%HKDg;ClW=)O}u3Nxa*VBi@PZTsSr} z-AlU>38`@*Vm3xrxe{*njtNXM_;$2)=TI;()(PTyCSPlL`O{^m5+Ww!vvr-FQnuif zCD@~>rlY7}^49?g7(4bNFr}xfYh}>@&xMKS01W6h+StV#y?rwYz*BSF9HR1HQo;rb zzZ@-J{S1p?1Um|oR;r-0&-|SPhK}zZq%bs#=x#HGIeS_a=@BQQ6G+h#|LD0G|4>1xEYhUJvIm zj*s`j&x>L~ri262pwH@**Ug~I{5&VvGXpAHNjJB$hThMmx*fLn% zsc@&HHWf^n`#0+9r%eNwBh_J+III;Fb*WJ zuUnkwB+1|bjof_Xa=3~noK7?FZa*&kpblH3Xcl$Be~S0qSm-?bg(JZK>Fhh4`dP&N zEGsgmVJjtr0PJ-n8I4aQ@zrwWTiv1mM;zJ&0imk5RMzh2!fapl`S+Z%Rwxr%@NzVA zM5)wuLuEEuEvLnE2<7NF^Fzn50^BBE=93R2C!-I03$Se7iI`6v2entJo?U?@Y9f+} zUyPKgeXwaO%LEIoMqCDUtw;GqgZ_qJA!x#Cm+R0{J4B4RD*C7Tj*E5}iJx2;fIY1lz9eB2@3tzvQ~;p>|o_o^W-1PW_sBa zV~kG+LXr=;TtEqe6yEWe${(M6H;z=RgscmahY@A2QCYg~~1x}WZIkS^!k;R2reYk*ZoHO$e{C^*mCfr`oW2EUgz9ArQg}Pz;P}C z^=;XLOVkY;x10IF*&{Cu_I`cjI~YFQjoA$n7rDygbk3P<5J9;)jk@?|Ww(TW;s&Tq zV}zGX785IZ9UN~uuQc~y9nH3{R3=|+W*slAi<;dV{%&p8#XlG2I<-nXx@vxUeWQN( zSZPEy8p~wqcTE$n%YK(fP5 z2izVcHMXpQ8WC}EC@(~0W80Q8=sz}dr=%WZjdI{_Rk}?U6RZ^7|);62P151VblxZ%bynp{1$+63p|t8 zhzURhTPzqBZOPtE_zyYT)=oT7H6NMCtJb=rP60tVUGb%lmH==LFRy4nmGyfOZ6TJ6f%;tvQ6F z9*}i31<>^!@lbHkUMG`1Hq*{h6OZHh_Tm1q!dxbu74~<_#K=%wOlh7)yn0+AzcvhJt)tLc~zBE9$M`)gT0RqNVS9%bv*vizk#96daf zbZiM?J06a%;IK0xGrwTbGh{t8K&d{P&HX`5-dQP^dJX3-|Kh0sRFjGjK0ZAGH>e=6 zQ{K-s-w;sn;4WXv__Gt;=?6QUKOzGt!WK^@*KP3`lJd8{yV{f}nf=^+2v3%G2 z7yCfSDbvZeys+@n>BgDcz`V}$Xg1$ySAC`BBQ~b7nAah!8g;g6ErEzxT~NTtw%Yxq z;z8rb%Y&dOd7yzg5O+NckIO{FolN2swQ;o_om-CEi4}~qo8dM?YUJvA*3U_b^Q41h z!0CCs=ZmQjIltI)y5yiw;&HVa@L>D* zuSuH+P1bgog~ur;JB^e38sv^*JX>+v<6yDb;{;a`Z17QA#vb_Mcty%fK5p7ZUzq~= z)^s~5Yx}UZR9S$k_cI65rxx4HAf9hn9}9U%PelR z@4auZKT^nd*q!ZZiVek8zo4kzlAx0m5@whkSkRCPphpKnFqWAZ7+e>a`g;4jcAR<# zJYH##(Y!gY;TE!(J8^{iD30d>hqa3nu@X z0_siM`66$t+H=y@_jQaD6{tp3HkkF816xUX2>Z>h3IC9Gnp*2L;C#DQ&x6aZcy9=kpgd-H}8H-)@;<~+E?G}6n=Thlu$$e=E%WuhjzOw4m1Ez#nAPCS)Z zw@a`kN9uDxLe5|%<9DZpO3|m7w`HXX4AwOU-%1{3El&fq;DXdxa8aqI_Zor*{xXCK zgoGm9sT;&LpQzyle(Iaeu86es8wZ_T`{*&BHdcjCP?<9JSbUDl)3F1~k2PS2c}4j2LZX2ybC}p0S6UY=NBQ4sumaCo)k6Pqzh6`0Q z0NaADbhgN7!8H8!;cOG%I2eSf^GmG}79^*jP)PwEVWo%P;Fnww5}f|C7Rzg)!^uGBFi$JZMdjqMv+tqyH=-s>{74)D__b$f(88d zVuAOei8X9W%MDIq)8eoFgz+^GRni>z7cNKd%FrOE%%eO!nHJnhNc#FNmu(STSl}Q6 z8t@bwhq$1wv|(HI(<@@g&&&R9^AFL!nf|Dz002NEOH@oo{wpHG(w`otQP4=czmL;@ zFVPBZbu+m>pb*Byz@fgk?0Ak$j+>ngXGW$r`u-)p`tK6<0u~riP_naV?lil1#0Arc zH;{^fT~!vGB{wR0es(&E<9BAYdhAli^a0t~$;#b;$x*r>J~CqB*^i+>x+7v1Fdo(W zv-KWkI9;oV$Gzi+P9}ag#bW!zWv?w7QElZ51%*KLRvcS~er#Ay+bNc6u2nDcaeymo zD*r3K44c*7XS8L`*RRY&JucA{Z?&^FGRO_NV8un9*;b!NEo%Q&E!TrScf7=JiEP;A z+joP)qA+SvyDeTsuIy2rCrsLQxj>>bVCNoWvU>ZfEb)WfTtxMPF}agb!8uS`+RCaZ zNDBWillolUsP5dXNZ>V~d=>-6xyq!C3}|RBY-56o-1v);-tsO(P1|MlU%A`-+H7)G zH>drUdXDoO!gLk|I0boTP7~Pa4YKozL`+IWZ#o7FaMY-5VSH?~wWzc2qN=bo>f=&# z*m3-+pE41+#8##P{$x;T(=t$DP#sLRxGa>Na^?Cohxd1S1HDENQGQ-YM zA-JqU?0!d<9R-$)`FhwowRZ5eW*d+yGb;`hW1SMH65_W5lP8p_@{=`qU8bZ&4lXJF z5%UF|U+}Sejz)r;fSuj{1=zusqf3ybRp-3Wg_|w?ib~Ddh_;|H!;ve}k zMauNe+qE@+`l|feqkSC|SWdvbZxN{iFB_pjayq(h+J4Mn%nt+a+wM8Bu?fUiU0t4c z*|&6u7~#St5-H%?S_B`5UhC%|wwR7^K2JK)JZ?rf2M|{{cUlc|1yv5jj@q7(NvSsP1$PoeeD>Qd&|vX+e!XY z(ych}L`-49LP;O;(zZz0iF`4ix=eX_Q${1dEyjT^3wWwVV>s0M<44#y3{%7DAUc+$ z4R3_CRvG!N4$$20Ziu&jrsvTO% zdB3v6a&r0hCzmmi9BuS4O)u+O1gyimq*s-t7?*=!bURL~h(v-vLu+BWhr-r?T1~|! zHX|I@Rt1};xSe_jH(5W!0a0-iO{es13e)v0VbEk+9B-o@4GqJN&AAwD+w18>Zg1U~ z=q>wWKH=-nZ^!k(GlU!qV?OKsL&9+~s$CcpKo=-_FdOEu$)rKU@RL@pt|-~MZaOxa zSKoDiRK!{09n7cdtbACXH8dTYh-8Ni`IynP9|w55nlRi!l%q)NH_S=dz%3%NnZrK$ zhtbVPKXJ73^D~uDjQXe)VOZ%eAemFqpoa>g;G-fRfQ|IlYZc`b^LMGAZ}^wHAEJaZ|uL`M!Q2&1sgGGYW$imgqps);turNhT)knF_V4@t2VZX4xRas zcv1R20!av6IHtq^L~Zn@A^d_gPhJ#;^4q?@q4*3IoppbeFon;d~{D1 zlkEOLS(AAe_ge`g;@&nq7FU)#FBYS?&G&9qQ8{qA-UUcEyhY8gHl2bbY2 z;zY0HM@@~6o{U>q&gS;mY339=5%*swBg`J+z+mj7yHxPDuxfNaF-Mh6dgm4m(|>zQ zq9>$@h-TVTMa&{HS6v0$4!G2k4|{zMxp_+eKrN)#eCzP=qLk{Yy~OGl{T#$8 zA;>k3r1<|+TX%qBQ{nOSN@py!5@znRH+$!R;K2woF8_yJToA_tkUmPNnf9egz8!ga zq5tR$w z;g~bDe(fB7_H|(Vt%U3IWRyD=qm{ zBRs0+!>YvpufczXNB>)yWLp8JLr9VS)!U+o6nMfKLn0jR+js!>{T|)2baW4KxAyuq z>DiS{LH_&(#h$)aOvknb-oI(0&uJu!;q`O!S64PUm9IpVmc!sIIV?^l6GMo!KRgFl ztZapX_q;o8S;h}j=pI8skQsxE^Z~fwTMT)f>BCoZfc76@7ee6mKf Date: Tue, 26 Sep 2023 09:53:39 -0700 Subject: [PATCH 3/4] [Auto review] Update to match function names in custom rules (#43334) Co-authored-by: Rachael Sewell --- .../lib/linting-rules/image-alt-text-end-punctuation.js | 2 +- src/content-linter/lib/linting-rules/image-alt-text-length.js | 2 +- src/content-linter/lib/linting-rules/image-file-kebab.js | 2 +- src/content-linter/lib/linting-rules/internal-links-lang.js | 2 +- src/content-linter/lib/linting-rules/internal-links-slash.js | 2 +- src/content-linter/style/github-docs.js | 1 + 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js b/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js index 4b477b8148e1..8693e61cc74b 100644 --- a/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js +++ b/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js @@ -12,7 +12,7 @@ export const imageAltTextEndPunctuation = { description: 'Alternate text for images should end with a punctuation.', tags: ['accessibility', 'images'], information: new URL('https://github.com/github/docs/blob/main/src/content-linter/README.md'), - function: function GHD003(params, onError) { + function: function GHD002(params, onError) { forEachInlineChild(params, 'image', function forToken(token) { const imageAltText = token.content.trim() diff --git a/src/content-linter/lib/linting-rules/image-alt-text-length.js b/src/content-linter/lib/linting-rules/image-alt-text-length.js index b5689203c79b..6b4db2344e84 100644 --- a/src/content-linter/lib/linting-rules/image-alt-text-length.js +++ b/src/content-linter/lib/linting-rules/image-alt-text-length.js @@ -10,7 +10,7 @@ export const incorrectAltTextLength = { tags: ['accessibility', 'images'], asynchronous: true, information: new URL('https://github.com/github/docs/blob/main/src/content-linter/README.md'), - function: function GHD004(params, onError) { + function: function GHD003(params, onError) { forEachInlineChild(params, 'image', async function forToken(token) { let renderedString = token.content diff --git a/src/content-linter/lib/linting-rules/image-file-kebab.js b/src/content-linter/lib/linting-rules/image-file-kebab.js index 27d41125f51a..89a545714fd7 100644 --- a/src/content-linter/lib/linting-rules/image-file-kebab.js +++ b/src/content-linter/lib/linting-rules/image-file-kebab.js @@ -7,7 +7,7 @@ export const imageFileKebab = { description: 'Image file names should always be lowercase kebab case', tags: ['accessibility', 'images'], information: new URL('https://github.com/github/docs/blob/main/src/content-linter/README.md'), - function: function GHD005(params, onError) { + function: function GHD004(params, onError) { forEachInlineChild(params, 'image', async function forToken(token) { const imageFileName = token.attrs[0][1].split('/').pop().split('.')[0] const nonKebabRegex = /([A-Z]|_)/ diff --git a/src/content-linter/lib/linting-rules/internal-links-lang.js b/src/content-linter/lib/linting-rules/internal-links-lang.js index c35d7d536bab..706e5f17c5a4 100644 --- a/src/content-linter/lib/linting-rules/internal-links-lang.js +++ b/src/content-linter/lib/linting-rules/internal-links-lang.js @@ -7,7 +7,7 @@ export const internalLinksLang = { description: 'Internal links must not have a hardcoded language code', tags: ['links', 'url'], information: new URL('https://github.com/github/docs/blob/main/src/content-linter/README.md'), - function: function GHD006(params, onError) { + function: function GHD005(params, onError) { filterTokens(params, 'inline', (token) => { for (const child of token.children) { if (child.type !== 'link_open') continue diff --git a/src/content-linter/lib/linting-rules/internal-links-slash.js b/src/content-linter/lib/linting-rules/internal-links-slash.js index 52d2250f2035..a0a7fee8d284 100644 --- a/src/content-linter/lib/linting-rules/internal-links-slash.js +++ b/src/content-linter/lib/linting-rules/internal-links-slash.js @@ -7,7 +7,7 @@ export const internalLinksSlash = { description: 'Internal links must start with a /', tags: ['links', 'url'], information: new URL('https://github.com/github/docs/blob/main/src/content-linter/README.md'), - function: function GHD007(params, onError) { + function: function GHD006(params, onError) { filterTokens(params, 'inline', (token) => { for (const child of token.children) { if (child.type !== 'link_open') continue diff --git a/src/content-linter/style/github-docs.js b/src/content-linter/style/github-docs.js index 4afd374bd5a5..e3f423507555 100644 --- a/src/content-linter/style/github-docs.js +++ b/src/content-linter/style/github-docs.js @@ -50,6 +50,7 @@ export const githubDocsConfig = { 'partial-markdown-files': true, }, 'early-access-references': { + // GH035 severity: 'error', 'partial-markdown-files': true, }, From f48d317e4c2f302040a83259df748de197d45485 Mon Sep 17 00:00:00 2001 From: Rachael Sewell Date: Tue, 26 Sep 2023 09:59:58 -0700 Subject: [PATCH 4/4] Set link punctuation rule to error (#43289) --- .../analyzing-your-code-with-codeql-queries.md | 4 ++-- .../automating-dependabot-with-github-actions.md | 2 +- .../managing-repository-access-for-your-codespaces.md | 2 +- content/contributing/writing-for-github-docs/style-guide.md | 2 +- .../migration-support-for-github-enterprise-importer.md | 2 +- content/rest/enterprise-admin/ldap.md | 2 +- content/rest/enterprise-admin/management-console.md | 2 +- content/rest/guides/discovering-resources-for-a-user.md | 2 +- content/rest/guides/rendering-data-as-graphs.md | 4 ++-- src/content-linter/style/github-docs.js | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/content/code-security/codeql-cli/getting-started-with-the-codeql-cli/analyzing-your-code-with-codeql-queries.md b/content/code-security/codeql-cli/getting-started-with-the-codeql-cli/analyzing-your-code-with-codeql-queries.md index 6b331b6b4a34..b9b9631ceabb 100644 --- a/content/code-security/codeql-cli/getting-started-with-the-codeql-cli/analyzing-your-code-with-codeql-queries.md +++ b/content/code-security/codeql-cli/getting-started-with-the-codeql-cli/analyzing-your-code-with-codeql-queries.md @@ -347,7 +347,7 @@ corresponding query. Alternatively, for consistency with the standard {% data va you can write query help in the `.qhelp` format. Query help written in `.qhelp` files can’t be included in SARIF files, and they can’t be processed by code scanning so must be converted to markdown before running -the analysis. For more information, see ["Query help files"](https://codeql.github.com/docs/writing-codeql-queries/query-help-files/#query-help-files) +the analysis. For more information, see "[Query help files](https://codeql.github.com/docs/writing-codeql-queries/query-help-files/#query-help-files)" and "[AUTOTITLE](/code-security/codeql-cli/using-the-advanced-functionality-of-the-codeql-cli/testing-query-help-files)." ## Results @@ -380,4 +380,4 @@ IDE. ## Further reading -- ["Analyzing your projects in {% data variables.product.prodname_codeql %} for VS Code"](https://codeql.github.com/docs/codeql-for-visual-studio-code/analyzing-your-projects/#analyzing-your-projects) +- "[Analyzing your projects in {% data variables.product.prodname_codeql %} for VS Code](https://codeql.github.com/docs/codeql-for-visual-studio-code/analyzing-your-projects/#analyzing-your-projects)" diff --git a/content/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions.md b/content/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions.md index 7e132ad90464..572e687eaf46 100644 --- a/content/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions.md +++ b/content/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions.md @@ -41,7 +41,7 @@ For workflows initiated by {% data variables.product.prodname_dependabot %} (`gi {% ifversion actions-stable-actor-ids %}These restrictions apply even if the workflow is re-run by a different actor.{% endif %} -For more information, see ["Keeping your GitHub Actions and workflows secure: Preventing pwn requests"](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/). +For more information, see "[Keeping your GitHub Actions and workflows secure: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/)." {% ifversion fpt or ghec or ghes %} diff --git a/content/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces.md b/content/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces.md index feca37f8a1fa..a71cbc333b49 100644 --- a/content/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces.md +++ b/content/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces.md @@ -21,7 +21,7 @@ By default, your codespace is assigned a token scoped with `read` permission or For more information, see "[AUTOTITLE](/codespaces/codespaces-reference/security-in-github-codespaces#authentication)." -If your project needs additional permissions for other repositories, you can configure this in the `devcontainer.json` file, as described in ["Setting additional repository permissions"](#setting-additional-repository-permissions) later in this article. When permissions are listed in the `devcontainer.json` file, you will be prompted to review and authorize the additional permissions as part of codespace creation for that repository. Once you've authorized the listed permissions, {% data variables.product.prodname_github_codespaces %} will remember your choice and will not prompt you for authorization unless the permissions in the `devcontainer.json` file change. +If your project needs additional permissions for other repositories, you can configure this in the `devcontainer.json` file, as described in "[Setting additional repository permissions](#setting-additional-repository-permissions)" later in this article. When permissions are listed in the `devcontainer.json` file, you will be prompted to review and authorize the additional permissions as part of codespace creation for that repository. Once you've authorized the listed permissions, {% data variables.product.prodname_github_codespaces %} will remember your choice and will not prompt you for authorization unless the permissions in the `devcontainer.json` file change. {% note %} diff --git a/content/contributing/writing-for-github-docs/style-guide.md b/content/contributing/writing-for-github-docs/style-guide.md index bee1f3dfb81f..5c7428f3e7ef 100644 --- a/content/contributing/writing-for-github-docs/style-guide.md +++ b/content/contributing/writing-for-github-docs/style-guide.md @@ -256,7 +256,7 @@ Use alt text to express the core idea of the image, without duplicating the webp > Diagram showing a five-step process by which a {% data variables.product.prodname_actions %} runner can be automatically added to named classes of runners and then requested by specific jobs. -For example, see [accompanying explanation of this diagram in the Actions documentation.](/free-pro-team@latest/actions/using-github-hosted-runners/using-larger-runners#architectural-overview-of-larger-runners). +For example, see [accompanying explanation of this diagram in the Actions documentation](/free-pro-team@latest/actions/using-github-hosted-runners/using-larger-runners#architectural-overview-of-larger-runners). #### Alt text for images of command-line interfaces diff --git a/content/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/migration-support-for-github-enterprise-importer.md b/content/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/migration-support-for-github-enterprise-importer.md index a608338f27c2..18b784e5d746 100644 --- a/content/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/migration-support-for-github-enterprise-importer.md +++ b/content/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/migration-support-for-github-enterprise-importer.md @@ -90,7 +90,7 @@ When you migrate a repository, either directly or as part of an organization mig - Active webhooks - Repository topics - Repository settings - - Branch protections (see ["Branch protections"](#branch-protections) for more details) + - Branch protections (see "[Branch protections](#branch-protections)" for more details) - {% data variables.product.prodname_pages %} settings - Autolink references - {% data variables.product.prodname_GH_advanced_security %} settings diff --git a/content/rest/enterprise-admin/ldap.md b/content/rest/enterprise-admin/ldap.md index 6394207c6a6f..98b60ee05370 100644 --- a/content/rest/enterprise-admin/ldap.md +++ b/content/rest/enterprise-admin/ldap.md @@ -13,7 +13,7 @@ autogenerated: rest ## About LDAP -You can use these endpoints to update the Distinguished Name (DN) that a user or team maps to. Note that in most cases, you must have [LDAP Sync enabled](/admin/identity-and-access-management/using-ldap-for-enterprise-iam/using-ldap) for your {% data variables.product.product_name %} appliance. The ["Update LDAP mapping for a user"](#update-ldap-mapping-for-a-user) endpoint can be used when LDAP is enabled, even if LDAP Sync is disabled. +You can use these endpoints to update the Distinguished Name (DN) that a user or team maps to. Note that in most cases, you must have [LDAP Sync enabled](/admin/identity-and-access-management/using-ldap-for-enterprise-iam/using-ldap) for your {% data variables.product.product_name %} appliance. The "[Update LDAP mapping for a user](#update-ldap-mapping-for-a-user)" endpoint can be used when LDAP is enabled, even if LDAP Sync is disabled. {% data reusables.user-settings.enterprise-admin-api-classic-pat-only %} diff --git a/content/rest/enterprise-admin/management-console.md b/content/rest/enterprise-admin/management-console.md index 37b53bedbdac..d60f2842f17c 100644 --- a/content/rest/enterprise-admin/management-console.md +++ b/content/rest/enterprise-admin/management-console.md @@ -24,7 +24,7 @@ You may also need to add the [`-k` flag](http://curl.haxx.se/docs/manpage.html#- ### Authentication {% ifversion enterprise-management-console-multi-user-auth %}as the root site administrator{% endif %} -You need to pass your [{% ifversion enterprise-management-console-multi-user-auth %}root site administrator{% else %}{% data variables.enterprise.management_console %}{% endif %} password](/admin/configuration/administering-your-instance-from-the-management-console/managing-access-to-the-management-console) as an authentication token to every endpoint in this category except ["Create a license"](#create-a-github-enterprise-server-license). +You need to pass your [{% ifversion enterprise-management-console-multi-user-auth %}root site administrator{% else %}{% data variables.enterprise.management_console %}{% endif %} password](/admin/configuration/administering-your-instance-from-the-management-console/managing-access-to-the-management-console) as an authentication token to every endpoint in this category except "[Create a license](#create-a-github-enterprise-server-license)." Use the `api_key` parameter to send this token with each request. For example: diff --git a/content/rest/guides/discovering-resources-for-a-user.md b/content/rest/guides/discovering-resources-for-a-user.md index cdb925740c04..e88395b048aa 100644 --- a/content/rest/guides/discovering-resources-for-a-user.md +++ b/content/rest/guides/discovering-resources-for-a-user.md @@ -22,7 +22,7 @@ To interact with the {% ifversion fpt or ghec %}{% data variables.product.prodna ## Getting started -If you haven't already, you should read the ["Basics of Authentication"][basics-of-authentication] guide before working through the examples below. The examples below assume that you have [registered an {% data variables.product.prodname_oauth_app %}][register-oauth-app] and that your [application has an OAuth token for a user][make-authenticated-request-for-user]. +If you haven't already, you should read the "[Basics of Authentication][basics-of-authentication]" guide before working through the examples below. The examples below assume that you have [registered an {% data variables.product.prodname_oauth_app %}][register-oauth-app] and that your [application has an OAuth token for a user][make-authenticated-request-for-user]. ## Discover the repositories that your app can access for a user diff --git a/content/rest/guides/rendering-data-as-graphs.md b/content/rest/guides/rendering-data-as-graphs.md index 0e7c1387d6a0..1962c7d7af3b 100644 --- a/content/rest/guides/rendering-data-as-graphs.md +++ b/content/rest/guides/rendering-data-as-graphs.md @@ -20,7 +20,7 @@ that we own, and the programming languages that make them up. Then, we'll visualize that information in a couple of different ways using the [D3.js][D3.js] library. To interact with the {% ifversion fpt or ghec %}{% data variables.product.prodname_dotcom %}{% else %}{% data variables.product.product_name %}{% endif %} API, we'll be using the excellent Ruby library, [Octokit][Octokit]. -If you haven't already, you should read the ["Basics of Authentication"][basics-of-authentication] +If you haven't already, you should read the "[Basics of Authentication][basics-of-authentication]" guide before starting this example. You can find the complete source code for this project in the [platform-samples][platform samples] repository. Let's jump right in! @@ -141,7 +141,7 @@ our counts into D3 to get a neat bar graph representing the popularity of the la D3.js, or just D3, is a comprehensive library for creating many kinds of charts, graphs, and interactive visualizations. Using D3 in detail is beyond the scope of this guide, but for a good introductory article, -check out ["D3 for Mortals"][D3 mortals]. +check out "[D3 for Mortals][D3 mortals]." D3 is a JavaScript library, and likes working with data as arrays. So, let's convert our Ruby hash into a JSON array for use by JavaScript in the browser. diff --git a/src/content-linter/style/github-docs.js b/src/content-linter/style/github-docs.js index e3f423507555..fec22d625a3c 100644 --- a/src/content-linter/style/github-docs.js +++ b/src/content-linter/style/github-docs.js @@ -36,7 +36,7 @@ export const githubDocsConfig = { }, 'link-punctuation': { // GHD008 - severity: 'warning', + severity: 'error', 'partial-markdown-files': true, }, 'yaml-scheduled-jobs': {