Skip to content

Commit 1c2186c

Browse files
authored
Merge pull request #141 from ut-code/rust
Rust追加など
2 parents 49b48ab + 430a619 commit 1c2186c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+6683
-2570
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ npm run lint
6464
- nを8, 10, 12, 15 など変えて何回か出力させ、それを統合していい感じの章立てを決める
6565
- 実際にドキュメントを書かせる
6666
> 以下の内容で`言語名`チュートリアルの第`n`章を書いてください。他の言語でのプログラミングは経験がある人を対象にします。
67-
> タイトルにはレベル1の見出し(#), それ以降の見出しにはレベル2以下(##)を使用してください。
68-
REPLで動作可能なコード例はスクリプトではなくREPLの実行例として書いてください。
67+
> タイトルにはレベル1の見出し(#), それ以降の見出しにはレベル2以下(##)を使用してください。
68+
> canvasは使わずに出力してください。
69+
> REPLで動作可能なコード例はスクリプトではなくREPLの実行例として書いてください。
6970
> コード例はREPLの実行例では \`\`\``言語名`-repl 、ソースファイルの場合は \`\`\``言語名`:ファイル名`.拡張子` ではじまるコードブロックで示してください。ファイル名は被らないようにしてください。
7071
> また、ファイルの場合は \`\`\``言語名`-exec:ファイル名`.拡張子` のコードブロック内に実行結果例を記載してください。
7172
> また、最後には この章のまとめ セクションと、練習問題を2つほど書いてください。練習問題はこの章で学んだ内容を活用してコードを書かせるものにしてください。
@@ -81,7 +82,6 @@ npm run lint
8182
>
8283
- Gemini出力の調整
8384
- Canvasを使われた場合はやり直す。(Canvasはファイル名付きコードブロックで壊れる)
84-
- 箇条書きの最後に `<!-- end list -->` と出力される場合がある。消す
8585
- 太字がなぜか `**キーワード**` の代わりに `\*\*キーワード\*\*` となっている場合がある。 `\*\*``**` の置き換えで対応
8686
- 見出しの前に `-----` (水平線)が入る場合がある。my.code();は水平線の表示に対応しているが、消す方向で統一
8787
- `言語名-repl` にはページ内で一意なIDを追加する (例: `言語名-repl:1`)

app/[docs_id]/markdown.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import Markdown, { Components, ExtraProps } from "react-markdown";
22
import remarkGfm from "remark-gfm";
3+
import removeComments from "remark-remove-comments";
4+
import remarkCjkFriendly from "remark-cjk-friendly";
35
import { EditorComponent, getAceLang } from "../terminal/editor";
46
import { ExecFile } from "../terminal/exec";
57
import { JSX, ReactNode } from "react";
@@ -13,7 +15,10 @@ import {
1315

1416
export function StyledMarkdown({ content }: { content: string }) {
1517
return (
16-
<Markdown remarkPlugins={[remarkGfm]} components={components}>
18+
<Markdown
19+
remarkPlugins={[remarkGfm, removeComments, remarkCjkFriendly]}
20+
components={components}
21+
>
1722
{content}
1823
</Markdown>
1924
);

app/[docs_id]/page.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { splitMarkdown } from "./splitMarkdown";
77
import { PageContent } from "./pageContent";
88
import { ChatHistoryProvider } from "./chatHistory";
99
import { getChatFromCache } from "@/lib/chatHistory";
10-
import { getLanguageName } from "@/pagesList";
10+
import { getLanguageName, pagesList } from "@/pagesList";
1111

1212
async function getMarkdownContent(docs_id: string): Promise<string> {
1313
try {
@@ -61,6 +61,14 @@ export default async function Page({
6161
}) {
6262
const { docs_id } = await params;
6363

64+
if (
65+
!pagesList
66+
.find((lang) => docs_id.startsWith(`${lang.id}-`))
67+
?.pages.find((page) => docs_id.endsWith(`-${page.id}`))
68+
) {
69+
notFound();
70+
}
71+
6472
const mdContent = getMarkdownContent(docs_id);
6573
const splitMdContent = mdContent.then((text) => splitMarkdown(text));
6674
const initialChatHistories = getChatFromCache(docs_id);

app/[docs_id]/pageContent.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,15 @@ export function PageContent(props: PageContentProps) {
8484

8585
return (
8686
<div
87-
className="p-4 mx-auto grid"
87+
className="p-4 mx-auto max-w-full grid"
8888
style={{
8989
gridTemplateColumns: `1fr auto`,
9090
}}
9191
>
9292
{dynamicMdContent.map((section, index) => (
9393
<Fragment key={index}>
9494
<div
95-
className="max-w-200"
95+
className="min-w-1/2 max-w-200 text-justify"
9696
id={`${index}`} // 目次からaタグで飛ぶために必要
9797
ref={(el) => {
9898
sectionRefs.current[index] = el;

app/[docs_id]/styledSyntaxHighlighter.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,21 @@ export type MarkdownLang =
2424
| "rb"
2525
| "cpp"
2626
| "c++"
27+
| "rust"
28+
| "rs"
2729
| "javascript"
2830
| "js"
2931
| "typescript"
3032
| "ts"
3133
| "bash"
3234
| "sh"
35+
| "powershell"
3336
| "json"
37+
| "toml"
3438
| "csv"
3539
| "html"
40+
| "makefile"
41+
| "cmake"
3642
| "text"
3743
| "txt";
3844

@@ -43,11 +49,16 @@ export type SyntaxHighlighterLang =
4349
| "ruby"
4450
| "c"
4551
| "cpp"
52+
| "rust"
4653
| "javascript"
4754
| "typescript"
4855
| "bash"
56+
| "powershell"
4957
| "html"
50-
| "json";
58+
| "json"
59+
| "ini"
60+
| "makefile"
61+
| "cmake";
5162
export function getSyntaxHighlighterLang(
5263
lang: MarkdownLang | undefined
5364
): SyntaxHighlighterLang | undefined {
@@ -61,6 +72,9 @@ export function getSyntaxHighlighterLang(
6172
case "cpp":
6273
case "c++":
6374
return "cpp";
75+
case "rust":
76+
case "rs":
77+
return "rust";
6478
case "javascript":
6579
case "js":
6680
return "javascript";
@@ -70,18 +84,28 @@ export function getSyntaxHighlighterLang(
7084
case "bash":
7185
case "sh":
7286
return "bash";
87+
case "powershell":
88+
return "powershell";
7389
case "json":
7490
return "json";
91+
case "toml":
92+
return "ini";
7593
case "html":
7694
return "html";
95+
case "makefile":
96+
return "makefile";
97+
case "cmake":
98+
return "cmake";
7799
case "csv": // not supported
78100
case "text":
79101
case "txt":
80102
case undefined:
81103
return undefined;
82104
default:
83105
lang satisfies never;
84-
console.error(`getSyntaxHighlighterLang() does not handle language ${lang}`);
106+
console.error(
107+
`getSyntaxHighlighterLang() does not handle language ${lang}`
108+
);
85109
return undefined;
86110
}
87111
}

app/accountMenu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function AccountMenu() {
4242
}
4343
};
4444

45-
if (isPending) {
45+
if (isPending || !session) {
4646
return <div className="w-10 h-10 skeleton rounded-full"></div>;
4747
}
4848

app/error.tsx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"use client"; // Error boundaries must be Client Components
2+
3+
import clsx from "clsx";
4+
import Link from "next/link";
5+
6+
export default function Error({
7+
error,
8+
reset,
9+
}: {
10+
error: Error & { digest?: string };
11+
reset: () => void;
12+
}) {
13+
return (
14+
<div className="p-4 flex-1 w-max max-w-full mx-auto flex flex-col items-center justify-center">
15+
<h1 className="text-2xl font-bold mb-4">エラー</h1>
16+
<p>ページの読み込み中にエラーが発生しました。</p>
17+
<pre
18+
className={clsx(
19+
"border-2 border-current/20 mt-4 rounded-box p-4! bg-base-300! text-base-content!",
20+
"max-w-full whitespace-pre-wrap"
21+
)}
22+
>
23+
{error.message}
24+
</pre>
25+
{error.digest && (
26+
<p className="mt-2 text-sm text-base-content/50">
27+
Digest: {error.digest}
28+
</p>
29+
)}
30+
<div className="divider w-full self-auto!" />
31+
<div className="flex flex-row gap-4">
32+
<button
33+
className="btn btn-warning"
34+
onClick={
35+
// Attempt to recover by trying to re-render the segment
36+
() => reset()
37+
}
38+
>
39+
やりなおす
40+
</button>
41+
<Link href="/" className="btn btn-primary">
42+
トップに戻る
43+
</Link>
44+
</div>
45+
</div>
46+
);
47+
}

app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default function RootLayout({
2727
{/* mocha.css がbodyに背景色などを設定してしまうので、それを上書きしている */}
2828
<AutoAnonymousLogin />
2929
<SidebarMdProvider>
30-
<div className="drawer lg:drawer-open">
30+
<div className="drawer lg:drawer-open min-h-screen">
3131
<input
3232
id="drawer-toggle"
3333
type="checkbox"

app/not-found.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Link from "next/link";
2+
3+
export default function NotFound() {
4+
return (
5+
<div className="p-4 flex-1 w-max max-w-full mx-auto flex flex-col items-center justify-center">
6+
<h1 className="text-2xl font-bold mb-4">404</h1>
7+
<p>指定されたページが見つかりません。</p>
8+
<div className="divider w-full self-auto!" />
9+
<Link href="/" className="btn btn-primary">
10+
トップに戻る
11+
</Link>
12+
</div>
13+
);
14+
}

app/pagesList.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,37 @@ export const pagesList = [
7777
description: "C++の基本から高度な機能までを学べるチュートリアル",
7878
pages: [
7979
{ id: 1, title: "C++の世界へようこそ" },
80-
{ id: 2, title: "型システムとメモリ" },
81-
{ id: 3, title: "関数と参照" },
82-
{ id: 4, title: "ポインタと動的メモリ" },
83-
{ id: 5, title: "クラスの基礎" },
84-
{ id: 6, title: "クラスを使いこなす" },
85-
{ id: 7, title: "継承とポリモーフィズム" },
86-
{ id: 8, title: "テンプレート" },
87-
{ id: 9, title: "STL ①:コンテナ" },
88-
{ id: 10, title: "STL ②:アルゴリズムとラムダ式" },
89-
{ id: 11, title: "RAIIとスマートポインタ" },
90-
{ id: 12, title: "プロジェクトの分割とビルド" },
80+
{ id: 2, title: "型システムと制御構造" },
81+
{ id: 3, title: "データ集合とモダンな操作" },
82+
{ id: 4, title: "ポインタとメモリ管理" },
83+
{ id: 5, title: "関数と参照渡し" },
84+
{ id: 6, title: "プロジェクトの分割とビルド" },
85+
{ id: 7, title: "クラスの基礎" },
86+
{ id: 8, title: "クラスを使いこなす" },
87+
{ id: 9, title: "継承とポリモーフィズム" },
88+
{ id: 10, title: "テンプレート" },
89+
{ id: 11, title: "STL ①:コンテナ" },
90+
{ id: 12, title: "STL ②:アルゴリズムとラムダ式" },
91+
{ id: 13, title: "RAIIとスマートポインタ" },
92+
],
93+
},
94+
{
95+
id: "rust",
96+
lang: "Rust",
97+
description: "a",
98+
pages: [
99+
{ id: 1, title: "Rustの世界へようこそ" },
100+
{ id: 2, title: "基本構文と「不変性」" },
101+
{ id: 3, title: "関数と制御フロー" },
102+
{ id: 4, title: "所有権" },
103+
{ id: 5, title: "借用とスライス" },
104+
{ id: 6, title: "構造体とメソッド構文" },
105+
{ id: 7, title: "列挙型とパターンマッチ" },
106+
{ id: 8, title: "モジュールシステムとパッケージ管理" },
107+
{ id: 9, title: "コレクションと文字列" },
108+
{ id: 10, title: "エラーハンドリング" },
109+
{ id: 11, title: "ジェネリクスとトレイト" },
110+
{ id: 12, title: "ライフタイム" },
91111
],
92112
},
93113
] as const;

0 commit comments

Comments
 (0)