#freeze
[[雑品倉庫]]
近年いろいろあって、C#版をフルスクラッチから作り直したいと思ったのね。そんなわけで試作開始。
昔と違うのは、本体をインターフェイスと完全分離するところ。コンソールでもGUIでも動かせるようにね。(あの頃は小さなスクリプター丸出しだったから。うん)
2016/02/15版Novel.cs本体→ &ref(Novel.cs);
* 使い方 [#iab2022b]
現時点では、小説単体の頭出ししか機能しない。小説データは20世紀から伝統的に以下の構造を保っている。
- 一行目にタイトル
- 二行目に作者名
- 三行目にジャンル名、そして「、」の後にその補足テキスト
- 四行目は何もない空行。
- 五行目から本文が始まる。
- また、章立てがある場合は、サブタイトルを入れるとそこが境界になる。たとえば以下のように。
------ここから
サンプル小説
シロウ
スペースオペラ、謎の宇宙船にさらわれ、カレイドスコープの賢者の待つ異星へ。あやうし!
ここからまえがき。(章立てがない時は、ここが本文になる)
:
:
:
* 第一章のサブタイトル
第一章の本文
* 第二章のサブタイトル
第二章の本文
:
:
とまぁ、こんな構造になっている。ちなみにルビは独自の二重括弧形式か青空文庫方式のどちらかをサポートする。リンクも独自の一重カッコ形式。
文字コードは、20世紀にはEUC日本語だったけど、2000年前後に表現的理由からUTF-8に全面移行済み。ゆえにコード変換は全く行っていない。
規則性としてはこれだけ。古い形式は画像はりつけもサポートしていたけど、今は画像貼り付けを使う作品がないのでサポートしていない。
古くはEpub変換なんかもやっていたけど今回はいいでしょう。そういうのは別途考えます。
とりあえず今日のところはサブタイトルまでとる処理しかしていないので、呼び出しサンプルを以下のように書いてみました。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//
// 作成したノベル導入用定義
using Novels;
namespace testnovel1
{
class Program
{
/// <summary>
/// loadfile
/// </summary>
/// <param name="fn"></param>
/// <returns></returns>
private static string loadfile(string fn)
{
string text = "";
try
{
StreamReader sr = new StreamReader(fn, Encoding.GetEncoding("UTF-8"));
text = sr.ReadToEnd();
sr.Close();
}
catch (Exception e) // 例外
{
text = e.Message;
}
return (text);
}
static void Main(string[] args)
{
Novel novel = new Novel();
string indir = System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
string infile = "/Dropbox/doc/Heya5/genko/earthquake.txt";
string txtfile = indir + infile;
novel.loadData(txtfile);
Console.WriteLine("タイトル: {0}", novel.Title);
Console.WriteLine("作者名: {0}", novel.Author);
Console.WriteLine("ジャンル: {0}", novel.Genre);
Console.WriteLine("補足テキスト: {0}", novel.GenreText);
Console.WriteLine("フルパス名: {0}", novel.FullPathName);
Console.WriteLine("最終更新日付: {0}", novel.timestamp);
Console.WriteLine("章立て: {0}件", novel.Dlist.Count);
if (novel.Dlist.Count > 1) // 章立てが存在する。
{
Console.WriteLine("短編ではないようなので、サブタイトルも列記します。");
for (int i = 0; i < novel.Dlist.Count; i++)
{
Console.WriteLine("{0}: {1}", i, novel.Dlist[i].Subtitle);
}
}
Console.ReadLine();
}
}
}
うん、こんなものかな。
#ref(novel0215.png)