Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: console.log(式); //=> 評価結果 に表記を統一 #212

Merged
merged 7 commits into from
Mar 28, 2017
2 changes: 1 addition & 1 deletion source/basic/array/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ JavaScriptでは、プリミティブ型のデータ以外はすべてオブジ
このことは、`typeof`演算子の結果を見てみることでもわかります。

```js
typeof ["A", "B", "C"]; // => "object"
console.log(typeof ["A", "B", "C"]); // => "object"
```

しかし、`Object`のインスタンスにはない`Array#map`などのメソッドや特殊な動作を持っています。
Expand Down
20 changes: 10 additions & 10 deletions source/basic/data-type/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ TODO: リテラルとはプログラム上で数値や文字列など、直接
それぞれは`true`と`false`の値を返すリテラルとなります。

```js
true; // => true
false; // => false
console.log(true); // => true
console.log(false); // => false
```

### 数値(Number)
Expand Down Expand Up @@ -127,10 +127,10 @@ JavaScriptの浮動小数点数は[IEEE 754][]を採用しています。
- `3.14159` のような `.`(ドット)を含んだ数値
- `2e8` のような `e` または `E` を含んだ数値

`0`から始まる浮動小数点数は、`0`を省略し書くことができます
`0`から始まる浮動小数点数は、`0`を省略して書くことができます

```js
.123; // => 0.123
console.log(.123); // => 0.123
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この変も微妙なのかな?

```

しかし、JavaScriptでは`.`をオブジェクトにおいて利用する機会が多いため、
Expand Down Expand Up @@ -165,7 +165,7 @@ PHPやRubyなどとは違い、どちらのリテラルでも評価結果は全

{{book.console}}
```js
'8 o\'clock'; // => "8 o'clock"
console.log('8 o\'clock'); // => "8 o'clock"
```

<!-- textlint-enable eslint -->
Expand All @@ -174,7 +174,7 @@ PHPやRubyなどとは違い、どちらのリテラルでも評価結果は全

{{book.console}}
```js
"8 o'clock"; // => "8 o'clock"
console.log("8 o'clock"); // => "8 o'clock"
```

ダブルクオートとシングルクオートどちらも改行をそのまま入力することはできません。
Expand All @@ -201,9 +201,9 @@ PHPやRubyなどとは違い、どちらのリテラルでも評価結果は全

{{book.console}}
```js
`複数行の
console.log(`複数行の
文字列を
入れたい`; // => "複数行の\n文字列を\n入れたい"
入れたい`); // => "複数行の\n文字列を\n入れたい"
```

また、名前のとおりテンプレートのような機能を持っています。
Expand Down Expand Up @@ -245,7 +245,7 @@ foo;// "ReferenceError: foo is not defined"
{{book.console}}
```js
var foo = null;
foo; // => null
console.log(foo); // => null
```

### オブジェクトリテラル {#object}
Expand Down Expand Up @@ -343,7 +343,7 @@ console.log(array[array.length - 1]); // => "2番目"
```js
var numberRegExp = /\d+/; // 1文字以上の数字にマッチする正規表現
// 123が正規表現にマッチするかをテストする
numberRegExp.test(123); // => true
console.log(numberRegExp.test(123)); // => true
```

文字列から正規表現オブジェクトを作成することもできますが、
Expand Down
4 changes: 2 additions & 2 deletions source/basic/function-method/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ function multiple(num) {
return num * 2;
}

multiple(10); // => 20
console.log(multiple(10)); // => 20
```

値を返していない又は空の`return;`と書いた場合、関数は`undefined`を返します。
Expand All @@ -68,7 +68,7 @@ multiple(10); // => 20
function noop() {
}

noop(); // => undefined;
console.log(noop()); // => undefined;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これも不要っぽい

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

と思ったけど値として返ってくるという話なのであったほうがいいか

```

### 可変長引数
Expand Down
6 changes: 3 additions & 3 deletions source/basic/operator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,11 @@ Math.pow(2, 4); // => 16
{{book.console}}
```js
// 自分自身とも一致しない
NaN === NaN; // => false
console.log(NaN === NaN); // => false
// Number型である
typeof NaN; // => "number"
console.log(typeof NaN); // => "number"
// Number.isNaNでNaNかどうかを判定
Number.isNaN(NaN); // => true
console.log(Number.isNaN(NaN)); // => true
```

しかし、単項演算子の`+`は文字列から数値への変換に使うべきではありません。
Expand Down
8 changes: 4 additions & 4 deletions source/basic/string/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,14 @@ ES2015で追加された`String#codePointAt`メソッドを使うことで、そ

```js
// 文字列"あ"の0番目のCode Pointを取得
"あ".codePointAt(0); // => 12354
console.log("あ".codePointAt(0)); // => 12354
```

逆に、`String.fromCodePoint`メソッドを使うことで、指定したCode Pointの文字を取得できます。

```js
// 符号位置12354の文字を取得する
String.fromCodePoint(12354); // => "あ"
console.log(String.fromCodePoint(12354)); // => "あ"
```

また、文字列リテラル中にはUnicodeエスケープシーケンスで、直接Code Pointを書くこともできます。
Expand All @@ -128,7 +128,7 @@ Code Pointは`\u{Code Pointの16進数の値}`で書くことができます。
```js
// "あ"のCode Pointは12354
// 12354の16進数表現は3042
"\u{3042}"; // => "あ"
console.log("\u{3042}"); // => "あ"
```

Code Pointの16進数表現は次のようにして求めることができます。
Expand All @@ -139,7 +139,7 @@ var codePointOfあ = "あ".codePointAt(0);
// 12354の16進数表現は"3042"
var hexOfCodePoint = codePointOfあ.toString(16);
// \はエスケープシーケンスであるため、\自体を表現するにはエスケープが必要
"\\u{" + hexOfCodePoint + "}"; // => "\\u{3042}"
console.log("\\u{" + hexOfCodePoint + "}"); // => "\\u{3042}"
```

直接キーボードから入力が難しい特殊な文字や絵文字などは、Unicodeエスケープシーケンスを使うことでソースコード上に安全に書くことができます。
Expand Down
41 changes: 41 additions & 0 deletions test/lib/console-comment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// MIT © 2017 azu
"use strict";
const path = require("path");
const ignoreFileList = [
// 演算子はいいかな
"source/basic/operator",
// 文字列リテラルそのものなので無視
"source/basic/string",
// これもリテラルの話なので…
"source/basic/implicit-coercion"
];
/**
* lineが問題ある行ならばErrorオブジェクトを返す
* @param {string} line
* @param {string} filePath ファイルパスは無視したい対象の指定に使う
* @returns {Error|undefined}
*/
module.exports = function shouldConsoleWithComment(line, filePath) {
const isIgnored = ignoreFileList.some(ignoreFilePath => {
return filePath.includes(path.normalize(ignoreFilePath));
});
if (isIgnored) {
return;
}
if (!/\/\/\s*=>\s*/.test(line)) {
return;
}
if (line.includes("console.")) {
return;
}
// エラーの場合は無視
if (/=>.*Error/.test(line)) {
return;
}
// template literalっぽいのは無視
if (line.includes("`")) {
return;
}
return new Error(`console.log(式); // => 評価結果 にそろえてください
該当コード: ${line}`);
};
15 changes: 14 additions & 1 deletion test/markdown-doc-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const sourceDir = path.join(__dirname, "..", "source");
const toDoc = require("power-doctest");
const remark = require("remark")();
const select = require('unist-util-select');
const shouldConsoleWithComment = require('./lib/console-comment');

/**
* 指定した文字列を含んだコードは実行環境によってはサポートされてないので無視する
Expand All @@ -21,7 +22,11 @@ const ESVersions = ["ES2016", "ES2017"];
* CodeBlockは必ず実行できるとは限らないので、
* AssertionError(doctestにおける失敗)以外は成功したことにして無視する
* Node.js v6はES2016-が実行できないのでスルーする
* 詳細は CONTRIBUTING.md を読む
*
* `console.log(式); // => 結果` の書式で書かれているをチェックする
* https://github.com/asciidwango/js-primer/issues/195
*
* その他詳細は CONTRIBUTING.md を読む
**/
describe("doctest:md", function() {
const files = globby.sync([`${sourceDir}/**/*.md`, `!${sourceDir}/**/node_modules{,/**}`]);
Expand All @@ -38,6 +43,14 @@ describe("doctest:md", function() {
return codeValue.includes(version);
});
try {
// console.logと// => の書式をチェック
const lines = codeBlock.value.split("\n");
lines.forEach(line => {
const error = shouldConsoleWithComment(line, filePath);
if (error instanceof Error) {
throw error;
}
});
const poweredCode = toDoc.convertCode(codeBlock.value, filePath);
strictEval(poweredCode);
} catch (error) {
Expand Down