summaryrefslogtreecommitdiff
path: root/src/server/web/docs/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/web/docs/api')
-rw-r--r--src/server/web/docs/api/endpoints/posts/create.yaml53
-rw-r--r--src/server/web/docs/api/endpoints/posts/timeline.yaml32
-rw-r--r--src/server/web/docs/api/endpoints/style.styl21
-rw-r--r--src/server/web/docs/api/endpoints/view.pug32
-rw-r--r--src/server/web/docs/api/entities/drive-file.yaml73
-rw-r--r--src/server/web/docs/api/entities/post.yaml168
-rw-r--r--src/server/web/docs/api/entities/style.styl1
-rw-r--r--src/server/web/docs/api/entities/user.yaml173
-rw-r--r--src/server/web/docs/api/entities/view.pug20
-rw-r--r--src/server/web/docs/api/gulpfile.ts188
-rw-r--r--src/server/web/docs/api/mixins.pug37
-rw-r--r--src/server/web/docs/api/style.styl11
12 files changed, 0 insertions, 809 deletions
diff --git a/src/server/web/docs/api/endpoints/posts/create.yaml b/src/server/web/docs/api/endpoints/posts/create.yaml
deleted file mode 100644
index 11d9f40c54..0000000000
--- a/src/server/web/docs/api/endpoints/posts/create.yaml
+++ /dev/null
@@ -1,53 +0,0 @@
-endpoint: "posts/create"
-
-desc:
- ja: "投稿します。"
- en: "Compose new post."
-
-params:
- - name: "text"
- type: "string"
- optional: true
- desc:
- ja: "投稿の本文"
- en: "The text of your post"
- - name: "mediaIds"
- type: "id(DriveFile)[]"
- optional: true
- desc:
- ja: "添付するメディア(1~4つ)"
- en: "Media you want to attach (1~4)"
- - name: "replyId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "返信する投稿"
- en: "The post you want to reply"
- - name: "repostId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "引用する投稿"
- en: "The post you want to quote"
- - name: "poll"
- type: "object"
- optional: true
- desc:
- ja: "投票"
- en: "The poll"
- defName: "poll"
- def:
- - name: "choices"
- type: "string[]"
- optional: false
- desc:
- ja: "投票の選択肢"
- en: "Choices of a poll"
-
-res:
- - name: "createdPost"
- type: "entity(Post)"
- optional: false
- desc:
- ja: "作成した投稿"
- en: "A post that created"
diff --git a/src/server/web/docs/api/endpoints/posts/timeline.yaml b/src/server/web/docs/api/endpoints/posts/timeline.yaml
deleted file mode 100644
index 9c44dd736a..0000000000
--- a/src/server/web/docs/api/endpoints/posts/timeline.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-endpoint: "posts/timeline"
-
-desc:
- ja: "タイムラインを取得します。"
- en: "Get your timeline."
-
-params:
- - name: "limit"
- type: "number"
- optional: true
- desc:
- ja: "取得する最大の数"
- - name: "sinceId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "指定すると、この投稿を基点としてより新しい投稿を取得します"
- - name: "untilId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "指定すると、この投稿を基点としてより古い投稿を取得します"
- - name: "sinceDate"
- type: "number"
- optional: true
- desc:
- ja: "指定した時間を基点としてより新しい投稿を取得します。数値は、1970 年 1 月 1 日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。"
- - name: "untilDate"
- type: "number"
- optional: true
- desc:
- ja: "指定した時間を基点としてより古い投稿を取得します。数値は、1970 年 1 月 1 日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。"
diff --git a/src/server/web/docs/api/endpoints/style.styl b/src/server/web/docs/api/endpoints/style.styl
deleted file mode 100644
index 2af9fe9a77..0000000000
--- a/src/server/web/docs/api/endpoints/style.styl
+++ /dev/null
@@ -1,21 +0,0 @@
-@import "../style"
-
-#url
- padding 8px 12px 8px 8px
- font-family Consolas, 'Courier New', Courier, Monaco, monospace
- color #fff
- background #222e40
- border-radius 4px
-
- > .method
- display inline-block
- margin 0 8px 0 0
- padding 0 6px
- color #f4fcff
- background #17afc7
- border-radius 4px
- user-select none
- pointer-events none
-
- > .host
- opacity 0.7
diff --git a/src/server/web/docs/api/endpoints/view.pug b/src/server/web/docs/api/endpoints/view.pug
deleted file mode 100644
index d271a5517a..0000000000
--- a/src/server/web/docs/api/endpoints/view.pug
+++ /dev/null
@@ -1,32 +0,0 @@
-extends ../../layout.pug
-include ../mixins
-
-block meta
- link(rel="stylesheet" href="/assets/api/endpoints/style.css")
-
-block main
- h1= endpoint
-
- p#url
- span.method POST
- span.host
- = url.host
- | /
- span.path= url.path
-
- p#desc= desc[lang] || desc['ja']
-
- section
- h2 %i18n:docs.api.endpoints.params%
- +propTable(params)
-
- if paramDefs
- each paramDef in paramDefs
- section(id= paramDef.name)
- h3= paramDef.name
- +propTable(paramDef.params)
-
- if res
- section
- h2 %i18n:docs.api.endpoints.res%
- +propTable(res)
diff --git a/src/server/web/docs/api/entities/drive-file.yaml b/src/server/web/docs/api/entities/drive-file.yaml
deleted file mode 100644
index 02ab0d608e..0000000000
--- a/src/server/web/docs/api/entities/drive-file.yaml
+++ /dev/null
@@ -1,73 +0,0 @@
-name: "DriveFile"
-
-desc:
- ja: "ドライブのファイル。"
- en: "A file of Drive."
-
-props:
- - name: "id"
- type: "id"
- optional: false
- desc:
- ja: "ファイルID"
- en: "The ID of this file"
- - name: "createdAt"
- type: "date"
- optional: false
- desc:
- ja: "アップロード日時"
- en: "The upload date of this file"
- - name: "userId"
- type: "id(User)"
- optional: false
- desc:
- ja: "所有者ID"
- en: "The ID of the owner of this file"
- - name: "user"
- type: "entity(User)"
- optional: true
- desc:
- ja: "所有者"
- en: "The owner of this file"
- - name: "name"
- type: "string"
- optional: false
- desc:
- ja: "ファイル名"
- en: "The name of this file"
- - name: "md5"
- type: "string"
- optional: false
- desc:
- ja: "ファイルのMD5ハッシュ値"
- en: "The md5 hash value of this file"
- - name: "type"
- type: "string"
- optional: false
- desc:
- ja: "ファイルの種類"
- en: "The type of this file"
- - name: "datasize"
- type: "number"
- optional: false
- desc:
- ja: "ファイルサイズ(bytes)"
- en: "The size of this file (bytes)"
- - name: "url"
- type: "string"
- optional: false
- desc:
- ja: "ファイルのURL"
- en: "The URL of this file"
- - name: "folderId"
- type: "id(DriveFolder)"
- optional: true
- desc:
- ja: "フォルダID"
- en: "The ID of the folder of this file"
- - name: "folder"
- type: "entity(DriveFolder)"
- optional: true
- desc:
- ja: "フォルダ"
- en: "The folder of this file"
diff --git a/src/server/web/docs/api/entities/post.yaml b/src/server/web/docs/api/entities/post.yaml
deleted file mode 100644
index 74d7973e38..0000000000
--- a/src/server/web/docs/api/entities/post.yaml
+++ /dev/null
@@ -1,168 +0,0 @@
-name: "Post"
-
-desc:
- ja: "投稿。"
- en: "A post."
-
-props:
- - name: "id"
- type: "id"
- optional: false
- desc:
- ja: "投稿ID"
- en: "The ID of this post"
- - name: "createdAt"
- type: "date"
- optional: false
- desc:
- ja: "投稿日時"
- en: "The posted date of this post"
- - name: "viaMobile"
- type: "boolean"
- optional: true
- desc:
- ja: "モバイル端末から投稿したか否か(自己申告であることに留意)"
- en: "Whether this post sent via a mobile device"
- - name: "text"
- type: "string"
- optional: true
- desc:
- ja: "投稿の本文"
- en: "The text of this post"
- - name: "mediaIds"
- type: "id(DriveFile)[]"
- optional: true
- desc:
- ja: "添付されているメディアのID"
- en: "The IDs of the attached media"
- - name: "media"
- type: "entity(DriveFile)[]"
- optional: true
- desc:
- ja: "添付されているメディア"
- en: "The attached media"
- - name: "userId"
- type: "id(User)"
- optional: false
- desc:
- ja: "投稿者ID"
- en: "The ID of author of this post"
- - name: "user"
- type: "entity(User)"
- optional: true
- desc:
- ja: "投稿者"
- en: "The author of this post"
- - name: "myReaction"
- type: "string"
- optional: true
- desc:
- ja: "この投稿に対する自分の<a href='/docs/api/reactions'>リアクション</a>"
- en: "The your <a href='/docs/api/reactions'>reaction</a> of this post"
- - name: "reactionCounts"
- type: "object"
- optional: false
- desc:
- ja: "<a href='/docs/api/reactions'>リアクション</a>をキーとし、この投稿に対するそのリアクションの数を値としたオブジェクト"
- - name: "replyId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "返信した投稿のID"
- en: "The ID of the replyed post"
- - name: "reply"
- type: "entity(Post)"
- optional: true
- desc:
- ja: "返信した投稿"
- en: "The replyed post"
- - name: "repostId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "引用した投稿のID"
- en: "The ID of the quoted post"
- - name: "repost"
- type: "entity(Post)"
- optional: true
- desc:
- ja: "引用した投稿"
- en: "The quoted post"
- - name: "poll"
- type: "object"
- optional: true
- desc:
- ja: "投票"
- en: "The poll"
- defName: "poll"
- def:
- - name: "choices"
- type: "object[]"
- optional: false
- desc:
- ja: "投票の選択肢"
- en: "The choices of this poll"
- defName: "choice"
- def:
- - name: "id"
- type: "number"
- optional: false
- desc:
- ja: "選択肢ID"
- en: "The ID of this choice"
- - name: "isVoted"
- type: "boolean"
- optional: true
- desc:
- ja: "自分がこの選択肢に投票したかどうか"
- en: "Whether you voted to this choice"
- - name: "text"
- type: "string"
- optional: false
- desc:
- ja: "選択肢本文"
- en: "The text of this choice"
- - name: "votes"
- type: "number"
- optional: false
- desc:
- ja: "この選択肢に投票された数"
- en: "The number voted for this choice"
- - name: "geo"
- type: "object"
- optional: true
- desc:
- ja: "位置情報"
- en: "Geo location"
- defName: "geo"
- def:
- - name: "coordinates"
- type: "number[]"
- optional: false
- desc:
- ja: "座標。最初に経度:-180〜180で表す。最後に緯度:-90〜90で表す。"
- - name: "altitude"
- type: "number"
- optional: false
- desc:
- ja: "高度。メートル単位で表す。"
- - name: "accuracy"
- type: "number"
- optional: false
- desc:
- ja: "緯度、経度の精度。メートル単位で表す。"
- - name: "altitudeAccuracy"
- type: "number"
- optional: false
- desc:
- ja: "高度の精度。メートル単位で表す。"
- - name: "heading"
- type: "number"
- optional: false
- desc:
- ja: "方角。0〜360の角度で表す。0が北、90が東、180が南、270が西。"
- - name: "speed"
- type: "number"
- optional: false
- desc:
- ja: "速度。メートル / 秒数で表す。"
diff --git a/src/server/web/docs/api/entities/style.styl b/src/server/web/docs/api/entities/style.styl
deleted file mode 100644
index bddf0f53ab..0000000000
--- a/src/server/web/docs/api/entities/style.styl
+++ /dev/null
@@ -1 +0,0 @@
-@import "../style"
diff --git a/src/server/web/docs/api/entities/user.yaml b/src/server/web/docs/api/entities/user.yaml
deleted file mode 100644
index a1fae1482b..0000000000
--- a/src/server/web/docs/api/entities/user.yaml
+++ /dev/null
@@ -1,173 +0,0 @@
-name: "User"
-
-desc:
- ja: "ユーザー。"
- en: "A user."
-
-props:
- - name: "id"
- type: "id"
- optional: false
- desc:
- ja: "ユーザーID"
- en: "The ID of this user"
- - name: "createdAt"
- type: "date"
- optional: false
- desc:
- ja: "アカウント作成日時"
- en: "The registered date of this user"
- - name: "username"
- type: "string"
- optional: false
- desc:
- ja: "ユーザー名"
- en: "The username of this user"
- - name: "description"
- type: "string"
- optional: false
- desc:
- ja: "アカウントの説明(自己紹介)"
- en: "The description of this user"
- - name: "avatarId"
- type: "id(DriveFile)"
- optional: true
- desc:
- ja: "アバターのID"
- en: "The ID of the avatar of this user"
- - name: "avatarUrl"
- type: "string"
- optional: false
- desc:
- ja: "アバターのURL"
- en: "The URL of the avatar of this user"
- - name: "bannerId"
- type: "id(DriveFile)"
- optional: true
- desc:
- ja: "バナーのID"
- en: "The ID of the banner of this user"
- - name: "bannerUrl"
- type: "string"
- optional: false
- desc:
- ja: "バナーのURL"
- en: "The URL of the banner of this user"
- - name: "followersCount"
- type: "number"
- optional: false
- desc:
- ja: "フォロワーの数"
- en: "The number of the followers for this user"
- - name: "followingCount"
- type: "number"
- optional: false
- desc:
- ja: "フォローしているユーザーの数"
- en: "The number of the following users for this user"
- - name: "isFollowing"
- type: "boolean"
- optional: true
- desc:
- ja: "自分がこのユーザーをフォローしているか"
- - name: "isFollowed"
- type: "boolean"
- optional: true
- desc:
- ja: "自分がこのユーザーにフォローされているか"
- - name: "isMuted"
- type: "boolean"
- optional: true
- desc:
- ja: "自分がこのユーザーをミュートしているか"
- en: "Whether you muted this user"
- - name: "postsCount"
- type: "number"
- optional: false
- desc:
- ja: "投稿の数"
- en: "The number of the posts of this user"
- - name: "pinnedPost"
- type: "entity(Post)"
- optional: true
- desc:
- ja: "ピン留めされた投稿"
- en: "The pinned post of this user"
- - name: "pinnedPostId"
- type: "id(Post)"
- optional: true
- desc:
- ja: "ピン留めされた投稿のID"
- en: "The ID of the pinned post of this user"
- - name: "driveCapacity"
- type: "number"
- optional: false
- desc:
- ja: "ドライブの容量(bytes)"
- en: "The capacity of drive of this user (bytes)"
- - name: "host"
- type: "string | null"
- optional: false
- desc:
- ja: "ホスト (例: example.com:3000)"
- en: "Host (e.g. example.com:3000)"
- - name: "account"
- type: "object"
- optional: false
- desc:
- ja: "このサーバーにおけるアカウント"
- en: "The account of this user on this server"
- defName: "account"
- def:
- - name: "lastUsedAt"
- type: "date"
- optional: false
- desc:
- ja: "最終利用日時"
- en: "The last used date of this user"
- - name: "isBot"
- type: "boolean"
- optional: true
- desc:
- ja: "botか否か(自己申告であることに留意)"
- en: "Whether is bot or not"
- - name: "twitter"
- type: "object"
- optional: true
- desc:
- ja: "連携されているTwitterアカウント情報"
- en: "The info of the connected twitter account of this user"
- defName: "twitter"
- def:
- - name: "userId"
- type: "string"
- optional: false
- desc:
- ja: "ユーザーID"
- en: "The user ID"
- - name: "screenName"
- type: "string"
- optional: false
- desc:
- ja: "ユーザー名"
- en: "The screen name of this user"
- - name: "profile"
- type: "object"
- optional: false
- desc:
- ja: "プロフィール"
- en: "The profile of this user"
- defName: "profile"
- def:
- - name: "location"
- type: "string"
- optional: true
- desc:
- ja: "場所"
- en: "The location of this user"
- - name: "birthday"
- type: "string"
- optional: true
- desc:
- ja: "誕生日 (YYYY-MM-DD)"
- en: "The birthday of this user (YYYY-MM-DD)"
diff --git a/src/server/web/docs/api/entities/view.pug b/src/server/web/docs/api/entities/view.pug
deleted file mode 100644
index 2156463dc7..0000000000
--- a/src/server/web/docs/api/entities/view.pug
+++ /dev/null
@@ -1,20 +0,0 @@
-extends ../../layout.pug
-include ../mixins
-
-block meta
- link(rel="stylesheet" href="/assets/api/entities/style.css")
-
-block main
- h1= name
-
- p#desc= desc[lang] || desc['ja']
-
- section
- h2 %i18n:docs.api.entities.properties%
- +propTable(props)
-
- if propDefs
- each propDef in propDefs
- section(id= propDef.name)
- h3= propDef.name
- +propTable(propDef.params)
diff --git a/src/server/web/docs/api/gulpfile.ts b/src/server/web/docs/api/gulpfile.ts
deleted file mode 100644
index 37935413de..0000000000
--- a/src/server/web/docs/api/gulpfile.ts
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * Gulp tasks
- */
-
-import * as fs from 'fs';
-import * as path from 'path';
-import * as glob from 'glob';
-import * as gulp from 'gulp';
-import * as pug from 'pug';
-import * as yaml from 'js-yaml';
-import * as mkdirp from 'mkdirp';
-
-import locales from '../../../../../locales';
-import I18nReplacer from '../../../../build/i18n';
-import fa from '../../../../build/fa';
-import config from './../../../../conf';
-
-import generateVars from '../vars';
-
-const langs = Object.keys(locales);
-
-const kebab = string => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
-
-const parseParam = param => {
- const id = param.type.match(/^id\((.+?)\)|^id/);
- const entity = param.type.match(/^entity\((.+?)\)/);
- const isObject = /^object/.test(param.type);
- const isDate = /^date/.test(param.type);
- const isArray = /\[\]$/.test(param.type);
- if (id) {
- param.kind = 'id';
- param.type = 'string';
- param.entity = id[1];
- if (isArray) {
- param.type += '[]';
- }
- }
- if (entity) {
- param.kind = 'entity';
- param.type = 'object';
- param.entity = entity[1];
- if (isArray) {
- param.type += '[]';
- }
- }
- if (isObject) {
- param.kind = 'object';
- }
- if (isDate) {
- param.kind = 'date';
- param.type = 'string';
- if (isArray) {
- param.type += '[]';
- }
- }
-
- return param;
-};
-
-const sortParams = params => {
- params.sort((a, b) => {
- if (a.name < b.name)
- return -1;
- if (a.name > b.name)
- return 1;
- return 0;
- });
- return params;
-};
-
-const extractDefs = params => {
- let defs = [];
-
- params.forEach(param => {
- if (param.def) {
- defs.push({
- name: param.defName,
- params: sortParams(param.def.map(p => parseParam(p)))
- });
-
- const childDefs = extractDefs(param.def);
-
- defs = defs.concat(childDefs);
- }
- });
-
- return sortParams(defs);
-};
-
-gulp.task('doc:api', [
- 'doc:api:endpoints',
- 'doc:api:entities'
-]);
-
-gulp.task('doc:api:endpoints', async () => {
- const commonVars = await generateVars();
- glob('./src/server/web/docs/api/endpoints/**/*.yaml', (globErr, files) => {
- if (globErr) {
- console.error(globErr);
- return;
- }
- //console.log(files);
- files.forEach(file => {
- const ep = yaml.safeLoad(fs.readFileSync(file, 'utf-8'));
- const vars = {
- endpoint: ep.endpoint,
- url: {
- host: config.api_url,
- path: ep.endpoint
- },
- desc: ep.desc,
- params: sortParams(ep.params.map(p => parseParam(p))),
- paramDefs: extractDefs(ep.params),
- res: ep.res ? sortParams(ep.res.map(p => parseParam(p))) : null,
- resDefs: ep.res ? extractDefs(ep.res) : null,
- };
- langs.forEach(lang => {
- pug.renderFile('./src/server/web/docs/api/endpoints/view.pug', Object.assign({}, vars, {
- lang,
- title: ep.endpoint,
- src: `https://github.com/syuilo/misskey/tree/master/src/server/web/docs/api/endpoints/${ep.endpoint}.yaml`,
- kebab,
- common: commonVars
- }), (renderErr, html) => {
- if (renderErr) {
- console.error(renderErr);
- return;
- }
- const i18n = new I18nReplacer(lang);
- html = html.replace(i18n.pattern, i18n.replacement);
- html = fa(html);
- const htmlPath = `./built/server/web/docs/${lang}/api/endpoints/${ep.endpoint}.html`;
- mkdirp(path.dirname(htmlPath), (mkdirErr) => {
- if (mkdirErr) {
- console.error(mkdirErr);
- return;
- }
- fs.writeFileSync(htmlPath, html, 'utf-8');
- });
- });
- });
- });
- });
-});
-
-gulp.task('doc:api:entities', async () => {
- const commonVars = await generateVars();
- glob('./src/server/web/docs/api/entities/**/*.yaml', (globErr, files) => {
- if (globErr) {
- console.error(globErr);
- return;
- }
- files.forEach(file => {
- const entity = yaml.safeLoad(fs.readFileSync(file, 'utf-8'));
- const vars = {
- name: entity.name,
- desc: entity.desc,
- props: sortParams(entity.props.map(p => parseParam(p))),
- propDefs: extractDefs(entity.props),
- };
- langs.forEach(lang => {
- pug.renderFile('./src/server/web/docs/api/entities/view.pug', Object.assign({}, vars, {
- lang,
- title: entity.name,
- src: `https://github.com/syuilo/misskey/tree/master/src/server/web/docs/api/entities/${kebab(entity.name)}.yaml`,
- kebab,
- common: commonVars
- }), (renderErr, html) => {
- if (renderErr) {
- console.error(renderErr);
- return;
- }
- const i18n = new I18nReplacer(lang);
- html = html.replace(i18n.pattern, i18n.replacement);
- html = fa(html);
- const htmlPath = `./built/server/web/docs/${lang}/api/entities/${kebab(entity.name)}.html`;
- mkdirp(path.dirname(htmlPath), (mkdirErr) => {
- if (mkdirErr) {
- console.error(mkdirErr);
- return;
- }
- fs.writeFileSync(htmlPath, html, 'utf-8');
- });
- });
- });
- });
- });
-});
diff --git a/src/server/web/docs/api/mixins.pug b/src/server/web/docs/api/mixins.pug
deleted file mode 100644
index 686bf6a2b6..0000000000
--- a/src/server/web/docs/api/mixins.pug
+++ /dev/null
@@ -1,37 +0,0 @@
-mixin propTable(props)
- table.props
- thead: tr
- th %i18n:docs.api.props.name%
- th %i18n:docs.api.props.type%
- th %i18n:docs.api.props.optional%
- th %i18n:docs.api.props.description%
- tbody
- each prop in props
- tr
- td.name= prop.name
- td.type
- i= prop.type
- if prop.kind == 'id'
- if prop.entity
- | (
- a(href=`/${lang}/api/entities/${kebab(prop.entity)}`)= prop.entity
- | ID)
- else
- | (ID)
- else if prop.kind == 'entity'
- | (
- a(href=`/${lang}/api/entities/${kebab(prop.entity)}`)= prop.entity
- | )
- else if prop.kind == 'object'
- if prop.def
- | (
- a(href=`#${prop.defName}`)= prop.defName
- | )
- else if prop.kind == 'date'
- | (Date)
- td.optional
- if prop.optional
- | %i18n:docs.api.props.yes%
- else
- | %i18n:docs.api.props.no%
- td.desc!= prop.desc[lang] || prop.desc['ja']
diff --git a/src/server/web/docs/api/style.styl b/src/server/web/docs/api/style.styl
deleted file mode 100644
index 3675a4da6f..0000000000
--- a/src/server/web/docs/api/style.styl
+++ /dev/null
@@ -1,11 +0,0 @@
-@import "../style"
-
-table.props
- .name
- font-weight bold
-
- .name
- .type
- .optional
- font-family Consolas, 'Courier New', Courier, Monaco, monospace
-