Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
# Normalize all text files to LF, regardless of the platform or the
# contributor's core.autocrlf setting, so Prettier (which writes LF) never
# disagrees with what's checked out on Windows.
* text=auto eol=lf

test/** linguist-vendored
17 changes: 16 additions & 1 deletion .prettierrc.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
{
"tabWidth": 2
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": false,
"quoteProps": "as-needed",
"jsxSingleQuote": false,
"trailingComma": "es5",
"bracketSpacing": true,
"bracketSameLine": false,
"arrowParens": "always",
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css",
"embeddedLanguageFormatting": "auto",
"singleAttributePerLine": false,
"endOfLine": "lf"
}
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ PRに適切なラベルを付与してください

## 説明

- 冷笑のパターン(regex)を追加する場合
- [./src/lib/regex.ts](./src/lib/regex.ts) にパターンを追加してください
- [テストケース](./test/regex.test.ts) に該当の冷笑を追加してください
- 冷笑のパターンを追加する場合
- [./src/lib/patterns.ts](./src/lib/patterns.ts) の `patterns` 配列に `PatternDefinition` を1つ追加してください(`id` / `strict` / `source` / `samples`)
- `samples` に書いたサンプル文字列は自動でテスト化されます([test/patterns.test.ts](./test/patterns.test.ts))。個別にテストコードを書く必要はありません
- 可能であれば **ひらがな** , **カタカナ** , **半角カナ** , **小文字** も同様に含めてください
- 追加するパターンが明らかに冷笑な場合は `regexStrict` のほうに、冷笑か怪しい場合や文脈によっては冷笑ではないパターンは `relaxedOnly` に追加してください
- 追加するパターンが明らかに冷笑な場合は `strict: true` に、冷笑か怪しい場合や文脈によっては冷笑ではないパターンは `strict: false` (relaxedモードでのみ検知)にしてください

- 機能の追加をする場合
- PRの説明欄に機能についての説明を記載してください
Expand Down
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,19 @@ const { findAll, contains } = require('dowa');
findAll('←うおw、爆笑'); // => ['うおw', '爆笑']
contains('うおw'); // => true
// relaxed モード(検知範囲を拡大)
contains('どわー', true);
contains('どわー', { relaxed: true });
```

> [!Important]
> v2 で `relaxed` は第2引数の boolean からオプションオブジェクトに変わりました。
> `findAll(text, true)` → `findAll(text, { relaxed: true })`

## API

- `findAll(text: string, relaxed = false): string[] | null` — マッチした冷笑の配列を返すw(見つからなければ `null`)
- `contains(text: string, relaxed = false): boolean` — 冷笑が含まれるかを真偽値で返すw
- `findAll(text: string, options?: DowaOptions): string[] | null` — マッチした冷笑の配列を返すw(見つからなければ `null`)
- `contains(text: string, options?: DowaOptions): boolean` — 冷笑が含まれるかを真偽値で返すw
- `DowaOptions`
- `relaxed?: boolean` (デフォルト: `false`) — `true` で検知範囲を拡大する

## 貢献について

Expand Down
2 changes: 1 addition & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ export default tseslint.config(
js.configs.recommended,
tseslint.configs.recommended,
{ languageOptions: { globals: { ...globals.node, ...globals.browser } } },
eslintConfigPrettier,
eslintConfigPrettier
);
66 changes: 0 additions & 66 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 27 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,43 @@
import { regexStrict, regexRelaxed } from "./lib/regex";

export function findAll(text: string, relaxed = false): string[] | null {
export interface DowaOptions {
/** 検知範囲を拡大するか (デフォルト: false) */
relaxed?: boolean;
}

/**
* テキスト中の冷笑パターンをすべて検出する。
* @param text 検査対象の文字列
* @param options.relaxed true で検知範囲を拡大する (デフォルト: false)
* @returns マッチした文字列の配列。見つからなければ null
*/
export function findAll(
text: string,
options: DowaOptions = {}
): string[] | null {
if (typeof text !== "string") {
throw new TypeError('"text" must be a string.');
}
if (typeof options !== "object" || options === null) {
throw new TypeError('"options" must be an object.');
}
const { relaxed = false } = options;
if (typeof relaxed !== "boolean") {
throw new TypeError('"relaxed" must be a boolean.');
throw new TypeError('"options.relaxed" must be a boolean.');
}
const re = relaxed ? regexRelaxed : regexStrict;
re.lastIndex = 0;
const m = text.match(re);
return m && m.length ? m : null;
}

export function contains(text: string, relaxed = false): boolean {
return !!findAll(text, relaxed);
/**
* テキストに冷笑パターンが含まれるかを判定する。
* @param text 検査対象の文字列
* @param options.relaxed true で検知範囲を拡大する (デフォルト: false)
*/
export function contains(text: string, options: DowaOptions = {}): boolean {
return !!findAll(text, options);
}

export { regexStrict, regexRelaxed };
Loading
Loading