From c74e7820e350be2e8e3507e77b9320b47b21dd2e Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Wed, 12 Feb 2014 21:34:30 -0500 Subject: [PATCH 01/14] Add frontend doc menu items and shells, start of JavaScript styleguide --- manual/en-US/coding-standards/chapters/css.md | 0 .../en-US/coding-standards/chapters/html.md | 0 .../coding-standards/chapters/javascript.md | 413 ++++++++++++++++++ manual/en-US/menu.md | 4 + 4 files changed, 417 insertions(+) create mode 100644 manual/en-US/coding-standards/chapters/css.md create mode 100644 manual/en-US/coding-standards/chapters/html.md create mode 100644 manual/en-US/coding-standards/chapters/javascript.md diff --git a/manual/en-US/coding-standards/chapters/css.md b/manual/en-US/coding-standards/chapters/css.md new file mode 100644 index 00000000..e69de29b diff --git a/manual/en-US/coding-standards/chapters/html.md b/manual/en-US/coding-standards/chapters/html.md new file mode 100644 index 00000000..e69de29b diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md new file mode 100644 index 00000000..852320ef --- /dev/null +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -0,0 +1,413 @@ +## Naming Conventions + +Use descriptive words or terse phrases for names. + +Variables and Functions should be camel case, starting with a lowercase letter: `likeThis` + +### Strings + +**Use names that describe what the string is:** + +`var element = document.getElementByID('elementId');` + +**Iterators are the exception** + +Use i for index in a loop (and subsequent letters when necessary for nested iteration). + +### Functions + +**Use names that describe what the function does:** + +``` +function getSomeData() { + // statements +} +``` + +### Reserved Words + +Do not use reserved words for anything other than their intended use. The list of: [Reserved Words](http://es5.github.io/#x7.6.1) + +--- + +## Syntax Style + +### Indentation +- Don't mix tabs and spaces. +- Tabs, 4 spaces + + +### Spacing +- No whitespace at the end of line or on blank lines. +- Unary special-character operators (e.g., !, ++) must not have space next to their operand. +- Any , and ; must not have preceding space. +- Any ; used as a statement terminator must be at the end of the line. +- Any : after a property name in an object definition must not have preceding space. +- The ? and : in a ternary conditional must have space on both sides. +- No filler spaces in empty constructs (e.g., {}, [], fn()) +- New line at the end of each file. + +**Array:** + +``` +var array = [ 'foo', 'bar' ]; +``` + +**Function call:** + +``` +foo( arg ); +``` + +**Function call with multiple arguments:** + +``` +foo( 'string', object ); +``` + +**Conditional Statements** + +``` +if ( condition ) { + // statements +} else { + // statements +} +``` + +``` +while ( condition ) { + // statements +} +``` + +``` +for ( prop in object ) { + // statements +} +``` + + +#### Exceptions + +** First or only argument is an object, array or callback function.** + +**No space before the first argument:** + +``` +foo({ + a: 'bar', + b: 'baz' +}); +``` + +``` +foo(function() { + // statements +}, options ); // space after options argument +``` + +**Function with a callback, object, or array as the last argument:** + +``` + +**No space after the last argument:** + +``` +foo( data, function() { + // statements +}); +``` + + +### Commas + +**Place commas after:** + +- variable declarations +- key/value pairs + +#### Arrays + +Do not include a trailing comma, this will add 1 to your array's length. + +**No:** + +``` +array = [ 'foo', 'bar', ]; +``` + +**Yes:** + +``` +array = [ 'foo', 'bar' ]; +``` + + +### Semicolons + +Use them where expected. + +Semicolons should be included at the end of function expressions, but not at the end of function declarations. + +**Function Expression:** + +``` +var foo = function() { + return true; +}; +``` + +**Function Declaration:** + +``` +function foo() { + return true; +} +``` + +### Quotes + +Use ' instead of " + + +--- + + +## Variables + +### Avoid Global Variables + +**No:** + +``` +foo = 'bar'; +``` + +**No: implied global** + +``` +function() { + foo = 'bar'; +} +``` + +**Yes:** + +``` +var foo = 'bar'; +``` + +### Multiple Variable Declarations + +Use one `var` declaration and separate each variable on a newline ending with a comma. + +**No:** + +``` +var foo = 'bar'; +var bar = 'baz'; +var baz = 'qux'; +``` + +**Yes:** + +``` +var foo = 'bar', + bar = 'baz', + baz = 'qux'; +``` + +## Types + +### String + +Concatenate long strings. Space separating each string should be at the end with the concatenation operator at the front of each subsequent string. + +``` +var longString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' + + 'Sed placerat, tellus eget egestas tincidunt, lectus dui ' + + 'sagittis massa, id mollis est tortor a enim. In hac ' + + 'habitasse platea dictumst. Duis erat justo, tincidunt ac ' + + 'enim iaculis, malesuada condimentum mauris. Vestibulum vel ' + + 'cursus mauris.'; +``` + +``` +var foo = 'bar'; +``` + +### Number + +Use `parseInt()` or `parseFloat()` instead of unary plus, for readability. + +**No:** + +``` +var count = +document.getElementById('inputId').value; +``` + +**Yes:** + +``` +var count = parseInt(document.getElementById('inputId').value); +``` + +### Type Checks + +- String: `typeof object === 'string'` +- Number: `typeof object === 'number'` +- Boolean: `typeof object === 'boolean'` +- Object: `typeof object === 'object'` +- Plain Object: `jQuery.isPlainObject( object )` +- Function: `jQuery.isFunction( object )` +- Array: `jQuery.isArray( object )` +- Element: `object.nodeType` +- null: `object === null` +- null or undefined: `object == null` + +**Undefined:** + +- Global Variables: `typeof variable === 'undefined'` +- Local Variables: `variable === undefined` +- Properties: `object.prop === undefined` + +### Objects + +Use the literal, not constructor, syntax. + +**No:** + +``` +var myObj = new Object(); +``` +**Yes:** + +``` +var myObj = {}; +``` + +If an object contains more than one key/value pair or an array as a value, each key/value pair should be on its own line. + +``` +var myObj = { + foo: 'bar', + bar: 'baz', + baz: 'qux' +}; +``` + +### Arrays + +Use the literal, not constructor, syntax + +**No:** + +``` +var myArr = new Array(); +``` +**Yes:** + +``` +var myArr = []; +``` + +If you don't know array length use push method. This will replace the current array. + +``` +var myArr = []; +myArr.push('foo'); +``` + +## Functions + +### Properties + +// TODO + +### Hoisting + +// TODO + +### Chaining Method Calls + +// TODO + +## Conditional Statements + +// TODO ternary/with braces + +**Cache length in variable for performance:** + +``` +var i, + j = myArr.length; + +for ( i = 0; i < j; i++ ) { + // statements +} +``` + +**With more than one condition:** + +``` +if ( condition + && condition2 + && condition3 ) { + // statements +} else { + // statements +} +``` + +### Switch Statements + +// TODO + + +### Equality + +// TODO + + +## Events + +// TODO + + +## Blocks & Multi-line Statements + +Use curly braces on blocks that have more than one statement. + +**Block with one statement:** + +``` +if ( test ) return false; +``` + +**Block with more than one statement:** + +``` +if ( test ) { + var foo = 'some string'; + return foo; +} +``` + + +## Comments + +// TODO + +--- + +#### TODO + +- Finish Conditionals +- Functions/subsections +- Switch Statements +- Equality Operators +- Events +- Comments +- Add jQuery examples +- Double check accuracy of all examples \ No newline at end of file diff --git a/manual/en-US/menu.md b/manual/en-US/menu.md index 554523e1..25f0dce8 100644 --- a/manual/en-US/menu.md +++ b/manual/en-US/menu.md @@ -5,6 +5,10 @@ - [Inline Code Comments](coding-standards/chapters/inline-comments.md) - [DocBlocks](coding-standards/chapters/docblocks.md) - [PHP Code](coding-standards/chapters/php.md) +- **Clientside Syntax Styleguides** + - [HTML](coding-standards/chapters/html.md) + - [CSS](coding-standards/chapters/css.md) + - [JavaScript](coding-standards/chapters/javascript.md) - **Appendices** - [Code Analysis Tools](appendices/analysis.md) - [Examples](appendices/examples.md) \ No newline at end of file From 55e1f26d7c9affdfa65953f3bfe10e419b6142b4 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:18:33 -0500 Subject: [PATCH 02/14] placeholder files for html and css style guides --- manual/en-US/coding-standards/chapters/css.md | 3 +++ manual/en-US/coding-standards/chapters/html.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/manual/en-US/coding-standards/chapters/css.md b/manual/en-US/coding-standards/chapters/css.md index e69de29b..d8d201e8 100644 --- a/manual/en-US/coding-standards/chapters/css.md +++ b/manual/en-US/coding-standards/chapters/css.md @@ -0,0 +1,3 @@ +## CSS + +@TODO - Add styleguide \ No newline at end of file diff --git a/manual/en-US/coding-standards/chapters/html.md b/manual/en-US/coding-standards/chapters/html.md index e69de29b..b97371a5 100644 --- a/manual/en-US/coding-standards/chapters/html.md +++ b/manual/en-US/coding-standards/chapters/html.md @@ -0,0 +1,3 @@ +## HTML + +@TODO - Add styleguide \ No newline at end of file From c979fb00726efef9f2e08cb0d9a2a4f3e50302cf Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:19:51 -0500 Subject: [PATCH 03/14] placeholder files for html and css style guides --- manual/en-US/coding-standards/chapters/css.md | 2 +- manual/en-US/coding-standards/chapters/html.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/css.md b/manual/en-US/coding-standards/chapters/css.md index d8d201e8..d3fb28b0 100644 --- a/manual/en-US/coding-standards/chapters/css.md +++ b/manual/en-US/coding-standards/chapters/css.md @@ -1,3 +1,3 @@ ## CSS -@TODO - Add styleguide \ No newline at end of file +@TODO - Add style guide \ No newline at end of file diff --git a/manual/en-US/coding-standards/chapters/html.md b/manual/en-US/coding-standards/chapters/html.md index b97371a5..a6dca9dc 100644 --- a/manual/en-US/coding-standards/chapters/html.md +++ b/manual/en-US/coding-standards/chapters/html.md @@ -1,3 +1,3 @@ ## HTML -@TODO - Add styleguide \ No newline at end of file +@TODO - Add style guide \ No newline at end of file From 33b2a19f72e02ce6ac9b7a4d753a21bb1b5c5b34 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:23:01 -0500 Subject: [PATCH 04/14] Operators at end of line --- .../coding-standards/chapters/javascript.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 852320ef..7bc17f12 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -225,12 +225,12 @@ var foo = 'bar', Concatenate long strings. Space separating each string should be at the end with the concatenation operator at the front of each subsequent string. ``` -var longString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' - + 'Sed placerat, tellus eget egestas tincidunt, lectus dui ' - + 'sagittis massa, id mollis est tortor a enim. In hac ' - + 'habitasse platea dictumst. Duis erat justo, tincidunt ac ' - + 'enim iaculis, malesuada condimentum mauris. Vestibulum vel ' - + 'cursus mauris.'; +var longString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' + + 'Sed placerat, tellus eget egestas tincidunt, lectus dui ' + + 'sagittis massa, id mollis est tortor a enim. In hac ' + + 'habitasse platea dictumst. Duis erat justo, tincidunt ac ' + + 'enim iaculis, malesuada condimentum mauris. Vestibulum vel ' + + 'cursus mauris.'; ``` ``` @@ -351,9 +351,9 @@ for ( i = 0; i < j; i++ ) { **With more than one condition:** ``` -if ( condition - && condition2 - && condition3 ) { +if ( condition && + condition2 && + condition3 ) { // statements } else { // statements From 3166301eee4ca53e0e51f5aa69d5088b05018c02 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:28:23 -0500 Subject: [PATCH 05/14] Add credits --- manual/en-US/coding-standards/chapters/javascript.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 7bc17f12..9cc179e0 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -410,4 +410,8 @@ if ( test ) { - Events - Comments - Add jQuery examples -- Double check accuracy of all examples \ No newline at end of file +- Double check accuracy of all examples +**With help from:** + +- [jQuery JS Style Guide](https://contribute.jquery.org/style-guide/js) +- [Idiomatic JS](https://github.com/rwaldron/idiomatic.js) \ No newline at end of file From 2d4afb52781fc3c9c0dfa96b720967b363d7c3ec Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:28:50 -0500 Subject: [PATCH 06/14] Add comments rules --- .../coding-standards/chapters/javascript.md | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 9cc179e0..2ad33167 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -397,7 +397,26 @@ if ( test ) { ## Comments -// TODO +**Single Line** + +- Place above the code it refers to. +- A space between double forward slashes and comment text. + +`// I am a single line comment.` + +**Multiline** + +- Place above the code it refers to. +- Opening token placed on the line above first comment line, closing placed below last comment line. +- Each comment line begins with two astericks followed by a space. + +``` +/* +** I am a multiline comment. +** Line two +** Line three +*/ +``` --- @@ -408,7 +427,6 @@ if ( test ) { - Switch Statements - Equality Operators - Events -- Comments - Add jQuery examples - Double check accuracy of all examples **With help from:** From 856a4f2e027c74f36045ea047178bb9010a02570 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:31:05 -0500 Subject: [PATCH 07/14] Add chaining rules --- manual/en-US/coding-standards/chapters/javascript.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 2ad33167..561f9b4f 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -322,14 +322,19 @@ myArr.push('foo'); ## Functions ### Properties +### Chaining Method Calls -// TODO +``` +$('.someElement') + .hide() + .delay(1000) + .fadeIn(); +``` ### Hoisting // TODO -### Chaining Method Calls // TODO From 55d8b21a661b647f2b04501e57c8d9ef5f982633 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:31:27 -0500 Subject: [PATCH 08/14] Add conditionals rules --- .../coding-standards/chapters/javascript.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 561f9b4f..2e42a99b 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -332,15 +332,26 @@ $('.someElement') ``` ### Hoisting +## Conditional Statements -// TODO +Use ternary syntax if: +- One condition +- Result of either evaluation is one operation. -// TODO +``` +joomlaRocks ? 'This is true' : 'else it is false'; +``` -## Conditional Statements +Otherwise, use standard syntax: -// TODO ternary/with braces +``` +if ( condition ) { + // statements +} else { + // statements +} +``` **Cache length in variable for performance:** From 7a5b92568b1a623b8d09b1ab2635d2a6eb404568 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:32:08 -0500 Subject: [PATCH 09/14] Omit Switch statements section --- manual/en-US/coding-standards/chapters/javascript.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 2e42a99b..978616bc 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -376,11 +376,6 @@ if ( condition && } ``` -### Switch Statements - -// TODO - - ### Equality // TODO @@ -440,11 +435,12 @@ if ( test ) { - Finish Conditionals - Functions/subsections -- Switch Statements - Equality Operators - Events +- Switch Statements vs other methods like Objects - Add jQuery examples - Double check accuracy of all examples + **With help from:** - [jQuery JS Style Guide](https://contribute.jquery.org/style-guide/js) From 91b325ab6ac3935a09ea98b2392270712c70a993 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:33:12 -0500 Subject: [PATCH 10/14] Add equality rules --- manual/en-US/coding-standards/chapters/javascript.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 978616bc..e4c1e543 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -378,12 +378,21 @@ if ( condition && ### Equality -// TODO +Use strict equality operator === so that type is considered in comparison. Using == can produce false positives. +// evaluates true ## Events +``` +1 == "1" +``` + +// evaluates false // TODO +``` +1 === "1" +``` ## Blocks & Multi-line Statements From 8c7f233e028723fb4f4008ad31715561d6468e1b Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:33:49 -0500 Subject: [PATCH 11/14] Clean up todos and unnecessary sections --- manual/en-US/coding-standards/chapters/javascript.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index e4c1e543..9b1f5069 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -321,7 +321,6 @@ myArr.push('foo'); ## Functions -### Properties ### Chaining Method Calls ``` @@ -331,7 +330,6 @@ $('.someElement') .fadeIn(); ``` -### Hoisting ## Conditional Statements Use ternary syntax if: @@ -382,14 +380,12 @@ Use strict equality operator === so that type is considered in comparison. Using // evaluates true -## Events ``` 1 == "1" ``` // evaluates false -// TODO ``` 1 === "1" ``` @@ -442,10 +438,6 @@ if ( test ) { #### TODO -- Finish Conditionals -- Functions/subsections -- Equality Operators -- Events - Switch Statements vs other methods like Objects - Add jQuery examples - Double check accuracy of all examples From d64dd8942673b2f7079a434f15c25ab87f00decc Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:34:49 -0500 Subject: [PATCH 12/14] More readable list of string rules --- manual/en-US/coding-standards/chapters/javascript.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 9b1f5069..b44279f2 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -222,7 +222,9 @@ var foo = 'bar', ### String -Concatenate long strings. Space separating each string should be at the end with the concatenation operator at the front of each subsequent string. +- Concatenate long strings. +- Place space before closing quote at the end of each string. +- Concatenation operator at the end of each subsequent string. ``` var longString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' + From d4283aca423a47b3f37b8468425de65f16478f87 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:45:58 -0500 Subject: [PATCH 13/14] Fix md formatting issues --- .../en-US/coding-standards/chapters/javascript.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index b44279f2..180afaeb 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -90,7 +90,7 @@ for ( prop in object ) { #### Exceptions -** First or only argument is an object, array or callback function.** +**First or only argument is an object, array or callback function.** **No space before the first argument:** @@ -109,8 +109,6 @@ foo(function() { **Function with a callback, object, or array as the last argument:** -``` - **No space after the last argument:** ``` @@ -214,7 +212,7 @@ var baz = 'qux'; ``` var foo = 'bar', - bar = 'baz', + bar = 'baz', baz = 'qux'; ``` @@ -420,7 +418,10 @@ if ( test ) { - Place above the code it refers to. - A space between double forward slashes and comment text. -`// I am a single line comment.` +``` +// I am a single line comment. +``` + **Multiline** @@ -447,4 +448,4 @@ if ( test ) { **With help from:** - [jQuery JS Style Guide](https://contribute.jquery.org/style-guide/js) -- [Idiomatic JS](https://github.com/rwaldron/idiomatic.js) \ No newline at end of file +- [Idiomatic JS](https://github.com/rwaldron/idiomatic.js) From 5f7b42f61b7fca75fa8361f03a87edbab829a6a0 Mon Sep 17 00:00:00 2001 From: Cristina Solana Date: Thu, 20 Feb 2014 02:50:01 -0500 Subject: [PATCH 14/14] Fix content formatting/placement --- manual/en-US/coding-standards/chapters/javascript.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/manual/en-US/coding-standards/chapters/javascript.md b/manual/en-US/coding-standards/chapters/javascript.md index 180afaeb..8229609f 100644 --- a/manual/en-US/coding-standards/chapters/javascript.md +++ b/manual/en-US/coding-standards/chapters/javascript.md @@ -109,7 +109,7 @@ foo(function() { **Function with a callback, object, or array as the last argument:** -**No space after the last argument:** +No space after the last argument. ``` foo( data, function() { @@ -378,15 +378,14 @@ if ( condition && Use strict equality operator === so that type is considered in comparison. Using == can produce false positives. -// evaluates true ``` +// evaluates true 1 == "1" ``` -// evaluates false - ``` +// evaluates false 1 === "1" ```