#freeze
[[雑品倉庫]]

近年いろいろあって、C#版をフルスクラッチから作り直したいと思ったのね。そんなわけで試作中。

2016/02/15版Novel.cs本体→ &ref(Novel.cs);

* 今回の更新内容 [#a0e80f92]

小説コンテンツを指定ディレクトリにサブタイつきで吐き出し、タイムスタンプを原稿にあわせるまでを行った。テキストを吐き出しただけでHTML加工等はなし。

* 稼働用サンプル [#qf921613]

現時点では、小説単体の頭出ししか機能しない。小説データは20世紀から伝統的に以下の構造を保っている。

- 一行目にタイトル
- 二行目に作者名
- 三行目にジャンル名、そして「、」の後にその補足テキスト
- 四行目は何もない空行。
- 五行目から本文が始まる。
- また、章立てがある場合は、サブタイトルを入れるとそこが境界になる。たとえば以下のように。

 ------ここから
 サンプル小説
 シロウ
 スペースオペラ、謎の宇宙船にさらわれ、カレイドスコープの賢者の待つ異星へ。あやうし!
 
 ここからまえがき。(章立てがない時は、ここが本文になる)
 :
 :
 :
 
 * 第一章のサブタイトル
 
 第一章の本文

 * 第二章のサブタイトル
 
 第二章の本文
 
 :
 :
 

とまぁ、こんな構造になっている。ちなみにルビは独自の二重括弧形式か青空文庫方式のどちらかをサポートする。リンクも独自の一重カッコ形式。

規則性としてはこれだけ。古い形式は画像はりつけもサポートしていたけど、今は画像貼り付けを使う作品がないのでサポートしていない。

古くは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.BaseName);
            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);
                }
            }
            novel.writeNovel(indir + "/Documents");
            Console.ReadLine();
        }
    }
 }

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS