max 1 月之前
父节点
当前提交
51f54d738a

+ 21 - 21
001/Ops/093.html

@@ -1,22 +1,22 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title>CHAPTER LXXVI</title>
-</head>
-<body>
-<h2 class="h21"><a id="a479"></a><a id="a480"></a><a id="a481"></a>CHAPTER LXXVI</h2>
-<p class="p28"><span class="t25"><img src="images/img23.jpg" width="135" height="32" alt="img23.jpg"/></span></p>
-<p class="p29"><span class="t29">A</span><span class="t28">RTHUR</span><span class="t27"> </span><span class="t28">READ</span><span class="t27"> </span><span class="t28">HIS</span><span class="t27"> </span>letter, and his heart burnt with passionate love of the true woman he had dared to doubt. Then he flung himself upon the grass and looked at the ocean that sparkled and heaved before him, and tried to think; but as yet he could not. The engines of his mind were reversed full speed, whilst his mind itself, with quick shudders and confusion, still forged ahead upon its former course. He rose, and cast upon the scene around him that long look we give to the place where a great happiness has found us.</p>
-<p class="p34">The sun was sinking fast behind the mountains, turning their slabbed sides and soaring pinnacles to giant shields and spears of fire. Beneath their mass, shadows &#8212; forerunners of the night &#8212; crept over the forests and the crested rollers, whilst further from him the ocean heaved in a rosy glow. Above, the ever-changing vault of heaven was of a beauty that no brush could paint. On a ground-work of burning red were piled, height upon height, deep ridges of purples and of crimsons. Nearer the horizon the colours brightened to a dazzling gold, till at length they narrowed to the white intensity of the half- hidden eye of the sun vanishing behind the mountains; whilst underlying the steady splendour of the upper skies flushed soft and melting shades of rose and lilac. Blue space above him was broken up by fantastic clouds that floated all on fire, and glowed like molten metal. The reflection, too, of all these massed and varied lights in the azure of the eastern skies was full of sharp contrasts and soft surprises, and a travelling eagle, sailing through space before them, seemed to gather all their tints upon his vivid wings, and, as he passed away, to leave a rainbow track of broken light.</p>
-<p class="p34">But such a glory was too bright to last. The sun sank swiftly, the celestial fires paled, the purples grew faint and died, and, where they had been, night trailed her sombre plumes across the sea and sky.</p>
-<p class="p34">But still the quiet glow of evening lingered, and presently a line of light was shot athwart it, cutting a track of glory across the shadowed sea, so weird and sudden, that it might well have been the first ray of a resurrection morn breaking in upon the twilight of the dead.</p>
-<p class="p34">He gazed almost in awe, till the majestic sight stilled the tumult of his heart, and his thoughts went up in thanks to the Creator for the pure love he had found again, and which had not betrayed him. Then he looked up, and there, stately and radiant, standing out clear against the shadows, her face illumined by that soft, yet vivid light, her trembling arms outstretched to clasp him &#8212; was his lost Angela.</p>
-<p class="p34">He saw her questioning glances fall upon him, and the red blood waver on her cheek; he saw the love-lights gather in her eyes; and then he saw no more, for she was in his arms, murmuring sweet broken words.</p>
-<p class="p34">Happy are those who thus shall find their Angela, whether it be here or &#8212; on the further shore of yonder solemn sea!</p>
-<p class="p34">And Mildred? She lay there before the stone symbol of inexorable judgment, and sobbed till the darkness covered her, and her heart broke in the silence.<a id="a482"></a></p>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title>第七十六章</title>
+</head>
+<body>
+<h2 class="h21"><a id="a479"></a><a id="a480"></a><a id="a481"></a>第七十六章</h2>
+<p class="p28"><span class="t25"><img src="images/img23.jpg" width="135" height="32" alt="img23.jpg"/></span></p>
+<p class="p29"><span class="t29">阿</span><span class="t28">瑟</span><span class="t27"> </span><span class="t28">读</span><span class="t27"> </span><span class="t28">完</span><span class="t27"> </span><span class="t28">信</span><span class="t27">,</span>心中燃起对这位真性情女子炽热的爱意——他竟曾斗胆怀疑过她。随后他猛地扑倒在草地上,望着眼前波光粼粼、起伏不定的海面试图思考;但此刻他做不到。他思维的引擎正全速倒转,而心灵却带着战栗与混乱,仍沿着原先的轨道疾驰。他站起身,向四周投去那种我们在获得巨大幸福之地总会流露的悠长目光。</p>
+<p class="p34">夕阳正急速沉入山后,将层叠的山岩与高耸的峰峦染成巨大的火焰盾矛。山体投下的阴影——黑夜的先驱——正悄然漫过森林与浪峰,而远处海面在玫瑰色暮霭中起伏。穹顶之上变幻的天光美得任何画笔都难以描摹:灼红的底色上堆叠着层层叠叠的绛紫与猩红山脊,靠近地平线处渐变为炫目的金黄,最终收束成半掩日轮刺目的白光。上层天幕稳定的辉煌之下,柔和的玫瑰色与淡紫如融化的糖霜般晕染。碧空被燃烧的奇形云朵割裂,那些云团如同熔化的金属般炽亮。东天蔚蓝中倒映着这万千光芒,既呈现强烈对比又暗藏柔和惊喜。一只翱翔的雄鹰掠过这片天幕,鲜亮的羽翼仿佛汇聚了所有色彩,飞逝时在破碎的光线中拖出一道虹迹。</p>
+<p class="p34">然而这般辉煌过于耀眼,终难持久。夕阳急速沉坠,天界焰火渐熄,紫霞由浓转淡终至消散。当暮色褪尽之处,黑夜已展开它幽暗的羽翼,横贯海天。</p>
+<p class="p34">然而,暮色的静谧微光依然徘徊不去。倏忽间,一束光芒斜贯天际,在幽暗的海面划出璀璨轨迹。这束光来得如此诡谲突兀,恍若复活节清晨的第一缕曙光,正刺破亡者的薄暮。</p>
+<p class="p34">他近乎敬畏地凝视着,直到这壮丽的景象平息了他内心的喧嚣,思绪升腾而起,向造物主感恩,因他重获那份纯净的爱,而这份爱未曾辜负他。继而抬头望去——她端庄而璀璨,在暗影中轮廓分明,柔和却生动的光芒映照着面庞,颤抖的双臂向他张开,渴望拥抱他——那正是他失而复得的安吉拉。</p>
+<p class="p34">他看到她投来探询的目光,红晕在她脸颊上若隐若现;他看见爱意在眼眸中流转;而后他再也看不见了——因为她已在他怀中,呢喃着甜蜜而断续的情话。</p>
+<p class="p34">那些如此找到他们安吉拉的人有福了,无论在此处——还是在那片肃穆之海的遥远彼岸!</p>
+<p class="p34">而米尔德丽德呢?她躺在那无情的审判石像前,啜泣直至黑暗将她笼罩,在寂静中,她的心碎了。<a id="a482"></a></p>
+</body>
 </html>

+ 14 - 14
001/Ops/094.html

@@ -1,15 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title>The Witch&rsquo;s Head (1884)</title>
-</head>
-<body>
-<h1 class="h12"><a id="a483"></a><a id="a484"></a><a id="a485"></a><a id="a486"></a><a id="a487"></a>The Witch&rsquo;s Head (1884<a id="a488"></a>)</h1>
-<p class="p33"><img src="images/img24.png" width="235" height="14" alt="img24.png"/></p>
-<p class="p29">Haggard&rsquo;s second novel was published the same year as his first, indicating the awakened fervour he felt for writing.&nbsp; The novel reveals the writer&rsquo;s first interest in themes of the paranormal.</p>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title>《女巫之首》(1884年)</title>
+</head>
+<body>
+<h1 class="h12"><a id="a483"></a><a id="a484"></a><a id="a485"></a><a id="a486"></a><a id="a487"></a>女巫之首(1884年<a id="a488"></a>)</h1>
+<p class="p33"><img src="images/img24.png" width="235" height="14" alt="img24.png"/></p>
+<p class="p29">哈格德的第二部小说与处女作同年出版,显示出他对写作迸发的热忱。这部小说首次展露了作家对超自然主题的兴趣。</p>
+</body>
 </html>

+ 13 - 13
001/Ops/095.html

@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title></title>
-</head>
-<body>
-<p class="p35"><img src="images/img25.png" width="584" height="500" alt="img25.png"/></p>
-<p class="p32"><span class="t24">The first edition</span></p>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title></title>
+</head>
+<body>
+<p class="p35"><img src="images/img25.png" width="584" height="500" alt="img25.png"/></p>
+<p class="p32"><span class="t24">第一版</span></p>
+</body>
 </html>

+ 62 - 62
001/Ops/096.html

@@ -1,63 +1,63 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title>CONTENTS</title>
-</head>
-<body>
-<h2 class="h21">CONTENTS</h2>
-<p class="p36"><a href="098.html#a542">BOOK I</a></p>
-<p class="p36"><a href="099.html#a546">CHAPTER I</a></p>
-<p class="p36"><a href="100.html#a551">CHAPTER II</a></p>
-<p class="p36"><a href="101.html#a556">CHAPTER III</a></p>
-<p class="p36"><a href="102.html#a561">CHAPTER IV</a></p>
-<p class="p36"><a href="103.html#a566">CHAPTER V</a></p>
-<p class="p36"><a href="104.html#a571">CHAPTER VI</a></p>
-<p class="p36"><a href="105.html#a576">CHAPTER VII</a></p>
-<p class="p36"><a href="106.html#a581">CHAPTER VIII</a></p>
-<p class="p36"><a href="107.html#a586">CHAPTER IX</a></p>
-<p class="p36"><a href="108.html#a591">CHAPTER X</a></p>
-<p class="p36"><a href="109.html#a596">CHAPTER XI</a></p>
-<p class="p36"><a href="110.html#a601">CHAPTER XII</a></p>
-<p class="p36"><a href="111.html#a606">CHAPTER XIII</a></p>
-<p class="p36"><a href="112.html#a611">CHAPTER XIV</a></p>
-<p class="p36"><a href="113.html#a616">CHAPTER XV</a></p>
-<p class="p36"><a href="114.html#a621">CHAPTER XVI</a></p>
-<p class="p36"><a href="115.html#a624">BOOK II</a></p>
-<p class="p36"><a href="116.html#a628">CHAPTER I</a></p>
-<p class="p36"><a href="117.html#a633">CHAPTER II</a></p>
-<p class="p36"><a href="118.html#a638">CHAPTER III</a></p>
-<p class="p36"><a href="119.html#a643">CHAPTER IV</a></p>
-<p class="p36"><a href="120.html#a648">CHAPTER V</a></p>
-<p class="p36"><a href="121.html#a653">CHAPTER VI</a></p>
-<p class="p36"><a href="122.html#a658">CHAPTER VII</a></p>
-<p class="p36"><a href="123.html#a663">CHAPTER VIII</a></p>
-<p class="p36"><a href="124.html#a668">CHAPTER IX</a></p>
-<p class="p36"><a href="125.html#a673">CHAPTER X</a></p>
-<p class="p36"><a href="126.html#a678">CHAPTER XI</a></p>
-<p class="p36"><a href="127.html#a683">CHAPTER XII</a></p>
-<p class="p36"><a href="128.html#a688">CHAPTER XIII</a></p>
-<p class="p36"><a href="129.html#a693">CHAPTER XIV</a></p>
-<p class="p36"><a href="130.html#a698">CHAPTER XV</a></p>
-<p class="p36"><a href="131.html#a703">CHAPTER XVI</a></p>
-<p class="p36"><a href="132.html#a708">CHAPTER XVII</a></p>
-<p class="p36"><a href="133.html#a713">CHAPTER XVIII</a></p>
-<p class="p36"><a href="134.html#a718">CHAPTER XIX</a></p>
-<p class="p36"><a href="135.html#a723">CHAPTER XX</a></p>
-<p class="p36"><a href="136.html#a726">BOOK III</a></p>
-<p class="p36"><a href="137.html#a730">CHAPTER I</a></p>
-<p class="p36"><a href="138.html#a735">CHAPTER II</a></p>
-<p class="p36"><a href="139.html#a740">CHAPTER III</a></p>
-<p class="p36"><a href="140.html#a745">CHAPTER IV</a></p>
-<p class="p36"><a href="141.html#a750">CHAPTER V</a></p>
-<p class="p36"><a href="142.html#a755">CHAPTER VI</a></p>
-<p class="p36"><a href="143.html#a760">CHAPTER VII</a></p>
-<p class="p36"><a href="144.html#a765">CHAPTER VIII</a></p>
-<p class="p36"><a href="145.html#a770">CHAPTER IX</a></p>
-<p class="p36"><a href="146.html#a775">CHAPTER X</a></p>
-<p class="p29">&nbsp;</p>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title>目录</title>
+</head>
+<body>
+<h2 class="h21">目录</h2>
+<p class="p36"><a href="098.html#a542">第一卷</a></p>
+<p class="p36"><a href="099.html#a546">第一章</a></p>
+<p class="p36"><a href="100.html#a551">第二章</a></p>
+<p class="p36"><a href="101.html#a556">第三章</a></p>
+<p class="p36"><a href="102.html#a561">第四章</a></p>
+<p class="p36"><a href="103.html#a566">第五章</a></p>
+<p class="p36"><a href="104.html#a571">第六章</a></p>
+<p class="p36"><a href="105.html#a576">第七章</a></p>
+<p class="p36"><a href="106.html#a581">第八章</a></p>
+<p class="p36"><a href="107.html#a586">第九章</a></p>
+<p class="p36"><a href="108.html#a591">第十章</a></p>
+<p class="p36"><a href="109.html#a596">第十一章</a></p>
+<p class="p36"><a href="110.html#a601">第十二章</a></p>
+<p class="p36"><a href="111.html#a606">第十三章</a></p>
+<p class="p36"><a href="112.html#a611">第十四章</a></p>
+<p class="p36"><a href="113.html#a616">第十五章</a></p>
+<p class="p36"><a href="114.html#a621">第十六章</a></p>
+<p class="p36"><a href="115.html#a624">第二卷</a></p>
+<p class="p36"><a href="116.html#a628">第一章</a></p>
+<p class="p36"><a href="117.html#a633">第二章</a></p>
+<p class="p36"><a href="118.html#a638">第三章</a></p>
+<p class="p36"><a href="119.html#a643">第四章</a></p>
+<p class="p36"><a href="120.html#a648">第五章</a></p>
+<p class="p36"><a href="121.html#a653">第六章</a></p>
+<p class="p36"><a href="122.html#a658">第七章</a></p>
+<p class="p36"><a href="123.html#a663">第八章</a></p>
+<p class="p36"><a href="124.html#a668">第九章</a></p>
+<p class="p36"><a href="125.html#a673">第十章</a></p>
+<p class="p36"><a href="126.html#a678">第十一章</a></p>
+<p class="p36"><a href="127.html#a683">第十二章</a></p>
+<p class="p36"><a href="128.html#a688">第十三章</a></p>
+<p class="p36"><a href="129.html#a693">第十四章</a></p>
+<p class="p36"><a href="130.html#a698">第十五章</a></p>
+<p class="p36"><a href="131.html#a703">第十六章</a></p>
+<p class="p36"><a href="132.html#a708">第十七章</a></p>
+<p class="p36"><a href="133.html#a713">第十八章</a></p>
+<p class="p36"><a href="134.html#a718">第十九章</a></p>
+<p class="p36"><a href="135.html#a723">第二十章</a></p>
+<p class="p36"><a href="136.html#a726">第三卷</a></p>
+<p class="p36"><a href="137.html#a730">第一章</a></p>
+<p class="p36"><a href="138.html#a735">第二章</a></p>
+<p class="p36"><a href="139.html#a740">第三章</a></p>
+<p class="p36"><a href="140.html#a745">第四章</a></p>
+<p class="p36"><a href="141.html#a750">第五章</a></p>
+<p class="p36"><a href="142.html#a755">第六章</a></p>
+<p class="p36"><a href="143.html#a760">第七章</a></p>
+<p class="p36"><a href="144.html#a765">第八章</a></p>
+<p class="p36"><a href="145.html#a770">第九章</a></p>
+<p class="p36"><a href="146.html#a775">第十章</a></p>
+<p class="p29">&nbsp;</p>
+</body>
 </html>

+ 26 - 26
001/Ops/097.html

@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title>THE WITCH&rsquo;S HEAD</title>
-</head>
-<body>
-<h2 class="h21"><a id="a539"></a><span class="th25">THE WITCH&rsquo;S HEAD</span></h2>
-<p class="p28"><span class="t25"><img src="images/img26.jpg" width="135" height="32" alt="img26.jpg"/></span></p>
-<p class="p29"><span class="t32">S</span><span class="t35">WELL</span><span class="t34"> </span><span class="t35">OUT</span><span class="t34">, </span><span class="t35">SAD</span><span class="t34"> </span><span class="t24">harmonies,</span></p>
-<p class="p37"><span class="t24">From the slow cadence of the gathering years;</span></p>
-<p class="p37"><span class="t24">For Life is bitter-sweet, yet bounds the flood</span></p>
-<p class="p37"><span class="t24">Of human fears</span></p>
-<p class="p37"><span class="t24">A death-crowned queen, from her hid throne she scatters</span></p>
-<p class="p37"><span class="t24">Smiles and tears</span></p>
-<p class="p37"><span class="t24">Until Time turn aside,</span></p>
-<p class="p37"><span class="t24">And we slip past him towards the wide increase</span></p>
-<p class="p37"><span class="t24">Of all things beautiful, then finding there</span></p>
-<p class="p37"><span class="t24">Our rest and peace;</span></p>
-<p class="p37"><span class="t24">The mournful strain is ended. Sorrow and song</span></p>
-<p class="p37"><span class="t24">Together cease.</span></p>
-<p class="p37">A. M. Barber.</p>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title>女巫之首</title>
+</head>
+<body>
+<h2 class="h21"><a id="a539"></a><span class="th25">女巫之首</span></h2>
+<p class="p28"><span class="t25"><img src="images/img26.jpg" width="135" height="32" alt="img26.jpg"/></span></p>
+<p class="p29"><span class="t32">涌</span><span class="t35">出</span><span class="t34"> </span><span class="t35">忧伤</span><span class="t34">的</span><span class="t24">和声,</span></p>
+<p class="p37"><span class="t24">从岁月缓缓汇聚的韵律中;</span></p>
+<p class="p37"><span class="t24">因生命苦乐参半,却仍奔涌如潮</span></p>
+<p class="p37"><span class="t24">人类恐惧录</span></p>
+<p class="p37"><span class="t24">一位头戴死亡王冠的女王,自她隐匿的王座撒播</span></p>
+<p class="p37"><span class="t24">微笑与泪水</span></p>
+<p class="p37"><span class="t24">直到时间偏转,</span></p>
+<p class="p37"><span class="t24">我们悄然掠过他 奔向辽阔的延伸</span></p>
+<p class="p37"><span class="t24">于万千美好之中 终在此处寻得</span></p>
+<p class="p37"><span class="t24">我们的安宁与平静;</span></p>
+<p class="p37"><span class="t24">哀伤的曲调已终。悲恸与歌声</span></p>
+<p class="p37"><span class="t24">共同停歇。</span></p>
+<p class="p37">A. M. 巴伯。</p>
+</body>
 </html>

+ 12 - 12
001/Ops/098.html

@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title>BOOK I</title>
-</head>
-<body>
-<h2 class="h21"><a id="a540"></a><a id="a541"></a><a id="a542"></a>BOOK I</h2>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title>第一卷</title>
+</head>
+<body>
+<h2 class="h21"><a id="a540"></a><a id="a541"></a><a id="a542"></a>第一卷</h2>
+</body>
 </html>

+ 75 - 73
001/Ops/099.html

@@ -1,74 +1,76 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
-<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
-<link rel="stylesheet" type="text/css" href="style.css"/>
-<title>CHAPTER I</title>
-</head>
-<body>
-<h2 class="h22"><a id="a543"></a><a id="a544"></a><a id="a545"></a><a id="a546"></a>CHAPTER I</h2>
-<p class="p28"><span class="t25">ERNEST&rsquo;S APPEARANCE</span></p>
-<p class="p38"><span class="t25"><img src="images/img26.jpg" width="135" height="32" alt="img26.jpg"/></span></p>
-<p class="p32">&ldquo;Come here, boy, let me look at you.&rdquo;</p>
-<p class="p29"><span class="t29">E</span><span class="t28">RNEST</span><span class="t27"> </span><span class="t28">ADVANCED</span><span class="t27"> </span><span class="t28">A</span><span class="t27"> </span>step or two and looked his uncle in the face. He was a noble-looking lad of about thirteen, with large dark eyes, black hair that curled over his head, and the unmistakable air of breeding that marks Englishmen of good race.</p>
-<p class="p34">His uncle let his wandering glance stray round him, but, wandering as it was, it seemed to take him in from top to toe. Presently he spoke again:</p>
-<p class="p34">&ldquo;I like you, boy.&rdquo;</p>
-<p class="p34">Ernest said nothing.</p>
-<p class="p34">&ldquo;Let me see &#8212; your second name is Beyton. I am glad they called you Beyton; it was your grandmother&rsquo;s maiden name, and a good old name too. Ernest Beyton Kershaw. By the way, have you ever seen anything of your other uncle, Sir Hugh Kershaw?&rdquo;</p>
-<p class="p34">The boy&rsquo;s cheek flushed.</p>
-<p class="p34">&ldquo;No, I have not; and I never wish to,&rdquo; he answered.</p>
-<p class="p34">&ldquo;Why not?&rdquo;</p>
-<p class="p34">&ldquo;Because when my mother wrote to him before she died&rdquo; &#8212; here the lad&rsquo;s voice choked&#8212;&rdquo;just after the bank broke and she lost all her money, he wrote back and said that because his brother &#8212; I mean my father &#8212; had made a low marriage, that was no reason why he should support his child and widow; but he sent her five pounds to go on with. She sent it back.&rdquo;</p>
-<p class="p34">&ldquo;That was like your mother, she always had a high spirit. He must be a cur, and he does not speak the truth. Your mother comes of a better stock than the Kershaws. The Carduses are one of the oldest families in the Eastern counties. Why, boy, our family lived down in the Fens by Lynn there for centuries, until your grandfather, poor weak man, got involved in his great lawsuit and ruined us all. There, there, it has gone into the law, but it is coming back, it is coming back fast. This Sir Hugh has only one son, by the way. Do you know that if anything happened to him you would be next in the entail? At any rate you would get the baronetcy.&rdquo;</p>
-<p class="p34">&ldquo;I don&rsquo;t want his baronetcy,&rdquo; said Ernest, sulkily; &ldquo;I will have nothing of his.&rdquo;</p>
-<p class="p34">&ldquo;A title, boy, is an incorporeal hereditament, for which the holder is indebted to nobody. It does not descend to him, it vests in him. But tell me, how long was this before your mother died &#8212; that he sent the five pounds, I mean?&rdquo;</p>
-<p class="p34">&ldquo;About three months.&rdquo;</p>
-<p class="p34">Mr. Cardus hesitated a little before he spoke again, tapping his white fingers nervously on the table.</p>
-<p class="p34">&ldquo;I hope my sister was not in want, Ernest?&rdquo; he said, jerkily.</p>
-<p class="p34">&ldquo;For a fortnight before she died we had scarcely enough to eat,&rdquo; was the blunt reply.</p>
-<p class="p34">Mr. Cardus turned himself to the window, and for a minute the light of the dull December day shone and glistened upon his brow and head, which was perfectly bald. Then before he spoke he drew himself back into the shadow, perhaps to hide something like a tear that shone in his soft black eyes.</p>
-<p class="p34">&ldquo;And why did she not appeal to me? I could have helped her.&rdquo;</p>
-<p class="p34">&ldquo;She said that when you had quarrelled with her about her marrying my father, you told her never to write or speak to you again, and that she never would.&rdquo;</p>
-<p class="p34">&ldquo;Then why did you not do it, boy? You knew how things were.&rdquo;</p>
-<p class="p34">&ldquo;Because we had begged once, and I would not beg again.&rdquo;</p>
-<p class="p34">&ldquo;Ah,&rdquo; muttered Mr. Cardus, &ldquo;the old spirit cropping up. Poor Rose, nearly starving, and dying too, and I with so much which I do not want. O, boy, boy, when you are a man never set up an idol, for it frightens good spirits away. Nothing else can live in its temple; it is a place where all things are forgotten &#8212; duty, and the claims of blood, and sometimes those of honour too. Look now, I have my idol, and it has made me forget my sister and your mother. Had she not written at last when she was dying, I should have forgotten you too.&rdquo;</p>
-<p class="p34">The boy looked up puzzled.</p>
-<p class="p34">&ldquo;An idol!&rdquo;</p>
-<p class="p34">&ldquo;Yes,&rdquo; went on his uncle in his dreamy way&#8212;&rdquo;an idol. Many people have them; they keep them in the cupboard with their family skeleton; sometimes the two are identical. And they call them by many names, too; frequently it is a woman&rsquo;s name; sometimes that of a passion; sometimes that of a vice, but a virtue&rsquo;s &#8212; not often.&rdquo;</p>
-<p class="p34">&ldquo;And what is the name of yours, uncle?&rdquo; asked the wondering boy.</p>
-<p class="p34">&ldquo;Mine? O, never mind!&rdquo;</p>
-<p class="p34">At this moment a swing-door in the side of the room was opened, and a tall, bony woman, with beady eyes, came through.</p>
-<p class="p34">&ldquo;Mr. de Talor to see you, sir, in the office.&rdquo;</p>
-<p class="p34">Mr. Cardus whistled softly.</p>
-<p class="p34">&ldquo;Ah,&rdquo; he said, &ldquo;tell him I am coming. By the way, Grice, this young gentleman has come to live here; his room is ready, is it not?&rdquo;</p>
-<p class="p34">&ldquo;Yes, sir; Miss Dorothy has been seeing to it.&rdquo;</p>
-<p class="p34">&ldquo;Good; where is Miss Dorothy?&rdquo;</p>
-<p class="p34">&ldquo;She has walked into Kesterwick, sir.&rdquo;</p>
-<p class="p34">&ldquo;O, and Master Jeremy?&rdquo;</p>
-<p class="p34">&ldquo;He is about, sir; I saw him pass with a ferret a while back.&rdquo;</p>
-<p class="p34">&ldquo;Tell Sampson or the groom to find him and send him to Master Ernest here. That will do, thank you. Now, Ernest, I must go. I hope that you will be pretty happy here, my boy, when your trouble has worn off a bit. You will have Jeremy for a companion; he is a lout, and an unpleasant lout, it is true, but I suppose that he is better than nobody. And then there is Dorothy&rdquo; &#8212; and his voice softened as he muttered her name&#8212;&rdquo;but she is a girl.&rdquo;</p>
-<p class="p34">&ldquo;Who are Dorothy and Jeremy?&rdquo; broke in his nephew; &ldquo;are they your children?&rdquo;</p>
-<p class="p34">Mr. Cardus started perceptibly, and his thick white eyebrows contracted over his dark eyes till they almost met.</p>
-<p class="p34">&ldquo;Children!&rdquo; he said, sharply; &ldquo;I have no children. They are my wards. Their name is Jones;&rdquo; and he left the room.</p>
-<p class="p34">&ldquo;Well, he <span class="t31">is</span> a rum sort,&rdquo; reflected Ernest to himself, &ldquo;and I don&rsquo;t think I ever saw such a shiny head before. I wonder if he oils it? But, at any rate, he is kind to me. Perhaps it would have been better if mother had written to him before. She might have gone on living then.&rdquo;</p>
-<p class="p34">Rubbing his hand across his face to clear away the water gathering in his eyes at the thought of his dead mother. Ernest made his way to the wide fireplace at the top end of the room, peeped into the ancient inglenooks on each side, and at the old Dutch tiles with which it was lined, and then, lifting his coat after a grown-up fashion, proceeded to warm himself and inspect his surroundings. It was a curious room in which he stood, and its leading feature was old oak-panelling. All down its considerable length the walls were oak-clad to the low ceiling, which was supported by enormous beams of the same material; the shutters of the narrow windows which looked out on the sea were oak, so were the doors and table, and even the mantelshelf. The general idea given by the display of so much timber was certainly one of stolidity, but it could scarcely be called cheerful &#8212; not even the numerous suits of armour and shining weapons which were placed about upon the walls could make it cheerful. It was a remarkable room, but its effect upon the observer was undoubtedly depressing.</p>
-<p class="p34">Just as Ernest was beginning to realise this fact, things were made more lively by the sudden appearance through the swing-door of a large savage-looking bull-terrier, which began to steer for the fireplace, where evidently it was accustomed to lie. On seeing Ernest it stopped and sniffed.</p>
-<p class="p34">&ldquo;Hullo, good dog!&rdquo; said Ernest.</p>
-<p class="p34">The terrier growled and showed its teeth.</p>
-<p class="p34">Ernest put out his leg towards it as a caution to keep it off. It acknowledged the compliment by sending its teeth through his trousers. Then the lad, growing wroth, and being not free from fear, seized the poker and hit the dog over the head so shrewdly that the blood streamed from the blow, and the brute, losing his grip, turned and fled howling.</p>
-<p class="p34">While Ernest was yet warm with the glow of victory, the door once more swung open, violently this time, and through it there came a boy of about his own age, a dirty deep-chested boy, with uncut hair, and a slow heavy face in which were set great grey eyes, just now ablaze with indignation. On seeing Ernest he pulled up much as the dog had done, and regarded him angrily.</p>
-<p class="p34">&ldquo;Did you hit my dog?&rdquo; he asked.</p>
-<p class="p34">&ldquo;I hit a dog,&rdquo; replied Ernest politely, &ldquo;but &#8212; &#8212;&rdquo;</p>
-<p class="p34">&ldquo;I don&rsquo;t want your &lsquo;buts.&rsquo; Can you fight?&rdquo;</p>
-<p class="p34">Ernest inquired whether this question was put with a view of gaining general information or for any particular purpose.</p>
-<p class="p34">&ldquo;Can you fight?&rdquo; was the only rejoinder.</p>
-<p class="p34">Slightly nettled, Ernest replied that under certain circumstances he could fight like a tom-cat.</p>
-<p class="p34">&ldquo;Then look out; I&rsquo;m going to make your head as you have made my dog&rsquo;s.&rdquo;</p>
-<p class="p34">Ernest, in the polite language of youth, opined that there would be hair and toe-nails flying first.</p>
-<p class="p34">To this sally, Jeremy Jones, for it was he, replied only by springing at him, his hair streaming behind like a Red Indian&rsquo;s, and, smiting him severely in the left eye, caused him to measure his length upon the floor. Arising quickly, Ernest returned the compliment with interest; but this time they both went down together, pummelling each other heartily. With whom the victory would ultimately have remained could scarcely be doubtful, for Jeremy, who even at that age gave promise of enormous physical strength which afterwards made him such a noted character, must have crushed his antagonist in the end. But while his strength still endured Ernest was fighting with such ungovernable fury, and such a complete disregard of personal consequences, that he was for a while, at any rate, getting the best of it. And luckily for him, while matters were yet in the balanced scales of Fate, an interruption occurred. For at that moment there rose before the blurred sight of the struggling boys a vision of a small woman &#8212; at least she looked like a woman &#8212; with an indignant little face and an uplifted forefinger.</p>
-<p class="p34">&ldquo;O, you wicked boys! what will Reginald say, I should like to know? O, you bad Jeremy! I am ashamed to have such a brother. Get up!&rdquo;</p>
-<p class="p34">&ldquo;My eye!&rdquo; said Jeremy thickly, for his lip was cut, &ldquo;it&rsquo;s Dolly!&rdquo;</p>
-</body>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
+<meta name="Generator" content="Atlantis Word Processor 4.0.6.6"/>
+<link rel="stylesheet" type="text/css" href="style.css"/>
+<title>第一章</title>
+</head>
+<body>
+<h2 class="h22"><a id="a543"></a><a id="a544"></a><a id="a545"></a><a id="a546"></a>第一章</h2>
+<p class="p28"><span class="t25">欧内斯特的外貌</span></p>
+<p class="p38"><span class="t25"><img src="images/img26.jpg" width="135" height="32" alt="img26.jpg"/></span></p>
+<p class="p32">“过来,孩子,让我好好看看你。”</p>
+<p class="p29"><span class="t29">欧</span><span class="t28">内斯特</span><span class="t27"> </span><span class="t28">向前</span><span class="t27"> </span><span class="t28">迈了</span><span class="t27"> </span>一两步,直视着他的叔叔。他是个约莫十三岁的俊秀少年,长着大大的深色眼睛,乌黑的卷发覆在头顶,浑身散发着纯正英国上流社会子弟特有的高贵气质。</p>
+<p class="p34">他的叔叔漫不经心地环顾四周,然而,尽管目光游离,却仿佛将他从头到脚打量了个遍。片刻之后,他又开口说道:</p>
+<p class="p34">“我喜欢你,小伙子。”</p>
+<p class="p34">欧内斯特一言不发。</p>
+<p class="p34">“让我想想——你的姓氏是贝顿。我很高兴他们给你取了这个姓;这是你祖母的娘家姓,也是个古老的好姓氏。欧内斯特·贝顿·克肖。顺便问一句,你见过你另一位叔叔休·克肖爵士吗?”</p>
+<p class="p34">男孩的脸颊泛红了。</p>
+<p class="p34">“不,我没有;而且我永远不希望有,”他回答道。</p>
+<p class="p34">“为什么不呢?”</p>
+<p class="p34">“因为在我母亲临终前给他写信时”——说到这里,男孩的声音哽咽了——“就在银行破产、她失去所有钱财后,他回信说,由于他的兄弟——我是说我父亲——结了一门低贱的亲事,这不能成为他必须抚养兄弟遗孤的理由;但他还是寄了五英镑接济。她把钱退回去了。”</p>
+<p class="p34">“那很像你母亲,她总是精神饱满。他肯定是个卑鄙小人,说的不是实话。你母亲的出身可比克肖家高贵多了。卡杜斯家族是东部地区最古老的家族之一。嘿,孩子,我们家祖祖辈辈都住在林恩附近的沼泽地,直到你祖父——那个可怜的软弱之人——卷入那场大官司,害得我们倾家荡产。好了好了,家产虽然都赔进了官司里,但现在正在回来,回来得很快。对了,这位休爵士只有一个儿子。你知道吗?要是他有个三长两短,你就是限定继承的下一顺位。至少你也能继承准男爵爵位。”</p>
+<p class="p34">“我不想要他的准男爵头衔,”欧内斯特闷闷不乐地说,“他的任何东西我都不要。”</p>
+<p class="p34">“孩子,爵位是一种无形遗产,拥有者无需向任何人感恩。它不是传承而来,而是与生俱来。不过告诉我,你母亲去世前多久——我是说,他寄来那五英镑是什么时候的事?”</p>
+<p class="p34">“大约三个月。”</p>
+<p class="p34">卡杜斯先生再次开口前略显犹豫,苍白的手指紧张地轻叩着桌面。</p>
+<p class="p34">“我希望我妹妹没有缺衣少食,欧内斯特?”他结结巴巴地说道。</p>
+<p class="p34">“在她去世前的两周里,我们几乎没什么可吃的。”回答直截了当。</p>
+<p class="p34">卡杜斯先生转身面向窗户,十二月的晦暗天光在他光洁如镜的额顶闪烁了一分钟。就在开口前,他突然退回阴影里——或许是为了掩饰那双温柔黑眸中闪动的泪光。</p>
+<p class="p34">“她为何不向我求助?我本可以帮她的。”</p>
+<p class="p34">“她说,当你因为她要嫁给我父亲而与她争吵时,你告诉她永远不要再写信或与你说话,而她确实再也没有这样做。”</p>
+<p class="p34">“那你为何不动手,小子?你明知局势如何。”</p>
+<p class="p34">“因为我们曾经乞讨过一次,而我不会再乞讨第二次。”</p>
+<p class="p34">“唉,”卡杜斯先生低语道,“那股旧日的执念又冒出来了。可怜的罗丝,几乎饿死,也快病死了,而我却拥有这么多根本不需要的东西。哦,孩子啊孩子,等你长大成人后,千万别树立偶像,因为它会把善良的灵魂都吓跑。在它的神庙里容不下其他任何东西;那是个遗忘一切的场所——责任、血缘亲情,有时甚至包括荣誉。看看现在的我,供奉着自己的偶像,结果连亲妹妹和你母亲都忘了。若不是她临终前终于写了信,我恐怕连你也要遗忘。”</p>
+<p class="p34">男孩困惑地抬起头。</p>
+<p class="p34">“一个偶像!”</p>
+<p class="p34">"是啊,"他的叔叔继续用梦幻般的语气说道——"一个偶像。许多人都有偶像;他们把偶像和家族秘密一起锁在橱柜里;有时这两者本就是一体。人们给偶像冠以各种名号:往往是个女性名字;有时是某种激情之名;有时则代表恶习,但若是美德之名——倒不多见。"</p>
+<p class="p34">“那你的名字是什么呢,叔叔?”男孩好奇地问道。</p>
+<p class="p34">“我的?哦,别在意!”</p>
+<p class="p34">就在这时,房间侧面的弹簧门突然打开,一位瘦骨嶙峋的高个女人走了进来,那双圆溜溜的眼睛像珠子般发亮。</p>
+<p class="p34">“德·泰勒先生来办公室见您,先生。”</p>
+<p class="p34">卡杜斯先生轻轻吹起了口哨。</p>
+<p class="p34">“啊,”他说道,“告诉他我马上就来。对了,格莱斯,这位年轻先生要住在这里;他的房间准备好了吧?”</p>
+<p class="p34">“是的,先生;多萝西小姐一直在负责这件事。”</p>
+<p class="p34">“很好;多萝西小姐在哪里?”</p>
+<p class="p34">“她走进凯斯特威克镇了,先生。”</p>
+<p class="p34">“哦,还有杰里米少爷呢?”</p>
+<p class="p34">“他就在附近,先生;我刚才还看到他带着一只雪貂经过。”</p>
+<p class="p34">“让桑普森或马夫去找他,然后带他来见欧内斯特少爷。就这样,谢谢。现在,欧内斯特,我得走了。希望等你的痛苦稍减后,能在这里过得愉快些,孩子。杰里米可以陪你;虽然他是个粗人,确实不讨喜,但总比没人强。还有多萝西——”他低声念出她的名字时,语气变得柔和,“但她是个姑娘家。”</p>
+<p class="p34">“多萝西和杰里米是谁?”他的侄子插嘴问道,“他们是你的孩子吗?”</p>
+<p class="p34">卡杜斯先生明显地惊跳了一下,浓密的白眉毛在深色眼睛上方皱起,几乎要连在一起。</p>
+<p class="p34">“孩子们!”他厉声说道,“我没有孩子。他们是我的被监护人。他们姓琼斯。”说完,他便离开了房间。</p>
+<p class="p34">“嗯,他<span class="t31">确实</span>是个怪人,”欧内斯特暗自思忖,“我从未见过这么油光发亮的脑袋。莫非他抹了发油?不过无论如何,他待我很友善。要是母亲早点儿给他写信就好了,说不定她现在还活着。”</p>
+<p class="p34">一想到逝去的母亲,欧内斯特眼中便泛起泪水,他抬手抹了抹脸。他走向房间尽头的宽大壁炉,窥探两侧古老的壁炉角落,又看了看铺砌的古老荷兰瓷砖。随后,他学着大人的样子撩起外套下摆,一边取暖一边打量四周。</p>
+
+<p class="p34">他所在的房间透着古怪,最显著的特征是那些古老的橡木镶板。整个相当宽敞的房间内,墙壁直到低矮的天花板都覆着橡木,天花由同样材质的粗大横梁支撑;面朝大海的窄窗配有橡木百叶窗,房门、桌子乃至壁炉架也全是橡木制成。如此大量木材的运用固然给人以坚实之感,却难称明快——就连墙上陈列的众多铠甲和闪亮武器也无法驱散这种沉闷。这是个非凡的房间,但给观者带来的感受无疑是压抑的。</p>
+<p class="p34">就在欧内斯特开始意识到这一点时,一只面目狰狞的大型牛头梗突然从旋转门冲进来,让场面顿时热闹起来。这畜生熟门熟路地朝壁炉方向走去——那里显然是它惯常的休憩处。当发现欧内斯特时,它突然停步,翕动着鼻翼。</p>
+<p class="p34">“你好啊,乖狗狗!”欧内斯特说道。</p>
+<p class="p34">那只梗犬发出低吼并露出了牙齿。</p>
+<p class="p34">欧内斯特伸腿示意它退开,以示警告。那畜生却以牙还礼,一口咬穿了他的裤管。少年又惊又怒,抄起火钳朝狗头狠狠一击,打得它鲜血直流。那畜生吃痛松口,转身哀嚎着逃走了。</p>
+<p class="p34">欧内斯特还沉浸在胜利的喜悦中,房门再次猛然洞开。这次闯进来的是个与他年纪相仿的男孩——胸膛厚实的邋遢少年,蓬乱头发下是张呆滞的胖脸,嵌着双正喷薄怒火的灰色大眼睛。这男孩一瞧见欧内斯特便猛然刹住脚步,活像先前那条狗,正用凶狠的目光瞪视着他。</p>
+<p class="p34">“你撞到我的狗了吗?”他问道。</p>
+<p class="p34">“我撞到了一条狗,”欧内斯特礼貌地回答,“但是——”</p>
+<p class="p34">“我不想听你的‘但是’。你能打吗?”</p>
+<p class="p34">欧内斯特询问,提出这个问题是为了获取一般性信息,还是出于某种特定目的。</p>
+<p class="p34">“你能打吗?”是唯一的回应。</p>
+<p class="p34">欧内斯特有些恼火,回答说在某些情况下他可以像公猫一样凶猛战斗。</p>
+<p class="p34">“那你可要小心了;我会让你的脑袋变得跟我那条狗一样。”</p>
+<p class="p34">欧内斯特用年轻人特有的礼貌措辞表示,届时必将毛发与趾甲齐飞。</p>
+<p class="p34">面对这番挑衅,杰里米·琼斯(没错正是他)二话不说就扑了上去,头发像印第安人那样在脑后飞扬。他一记重拳打在对方左眼上,欧内斯特顿时四仰八叉摔倒在地。欧内斯特迅速爬起,加倍奉还了这一拳,但这次两人扭打着同时倒地,拳头如雨点般落在彼此身上。若不是半路杀出个程咬金,这场较量本不会有悬念——即便在那个年纪,杰里米已展现出日后令他声名远扬的惊人膂力,最终定能碾压对手。但欧内斯特此刻正以失控的狂暴姿态应战,完全不计后果,至少短时间内竟占了上风。就在胜负天平尚未完全倾斜之际,两个扭打男孩模糊的视野中,突然出现一个娇小身影——至少看起来是个女性——那张愤怒的小脸和高高翘起的食指,宛如神兵天降。</p>
+<p class="p34">“哦,你们这些淘气的孩子!我倒想知道雷金纳德会怎么说?哦,你这个坏杰里米!有你这样的兄弟真让我羞愧。快起来!”</p>
+<p class="p34">“我的天!”杰里米含糊不清地说道,因为他的嘴唇破了,“是朵莉!”</p>
+</body>
 </html>

+ 59 - 59
001/Ops/100.html

@@ -8,65 +8,65 @@
 <title>第二章</title>
 </head>
 <body>
-<h2 class="h21"><a id="a547"></a><a id="a548"></a><a id="a549"></a><a id="a550"></a><a id="a551"></a>CHAPTER II</h2>
-<p class="p28"><span class="t25">REGINALD CARDUS, ESQ., MISANTHROPE</span></p>
+<h2 class="h21"><a id="a547"></a><a id="a548"></a><a id="a549"></a><a id="a550"></a><a id="a551"></a>第二章</h2>
+<p class="p28"><span class="t25">雷金纳德·卡杜斯阁下,厌世者</span></p>
 <p class="p38"><span class="t25"><img src="images/img26.jpg" width="135" height="32" alt="img26.jpg"/></span></p>
-<p class="p29"><span class="t29">W</span><span class="t28">HEN</span><span class="t27"> M</span><span class="t28">R</span><span class="t27">. C</span><span class="t28">ARDUS</span><span class="t27"> </span>left the sitting-room where he had been talking to Ernest, he passed down a passage in the rambling old house which led him into a courtyard. On the farther side of the yard, which was walled in, stood a neat red-brick building one story high, consisting of two rooms and a passage. On to this building were attached a series of low green-houses, and against the wall at the farther end of these houses was a lean-to in which stood the boiler that supplied the pipes with hot water. The little red-brick building was Mr. Cardus&rsquo;s office, for he was a lawyer by profession; the long tail of glass behind it were his orchid-houses, for orchid-growing was his sole amusement. The <span class="t31">tout ensemble</span>, office and orchid-houses, seemed curiously out of place in the grey and ancient courtyard where they stood, looking as they did on to the old one-storied house, scarred by the passage of centuries of tempestuous weather. Some such idea seemed to strike Mr. Cardus as he closed the door behind him, preparatory to crossing the courtyard.</p>
-<p class="p34">&ldquo;Queer contrast,&rdquo; he muttered to himself; &ldquo;very queer. Something like that between Reginald Cardus, Esquire, Misanthrope, of Dum&rsquo;s Ness, and Mr. Reginald Cardus, Solicitor, Chairman of the Stokesly Board of Guardians, Bailiff of Kesterwick, &amp;c. And yet in both cases they are part of the same establishment. Case of old and new style!&rdquo;</p>
-<p class="p34">Mr. Cardus did not make his way straight to the office. He struck off to the right, and entered the long line of glasshouses, walking up from house to house, till he reached the compartment where the temperate sorts were placed to bloom, which was connected with his office by a glass door. Through this last he walked softly, with a cat-like step, till he reached the door, where he paused to observe a large coarse man, who was standing at the far end of the room, looking out intently on the courtyard.</p>
-<p class="p34">&ldquo;Ah, my friend,&rdquo; he said to himself, &ldquo;so the shoe is beginning to pinch. Well, it is time.&rdquo; Then he pushed the door softly open, passed into the room with the same cat-like step, closed it, and, seating himself at his writing-table, took up a pen. Apparently the coarse-looking man at the window was too much absorbed in his own thoughts to hear him, for he still stood staring into space.</p>
-<p class="p34">&ldquo;Well, Mr. de Talor,&rdquo; said the lawyer presently, in his soft, jerky voice, &ldquo;I am at your service.&rdquo;</p>
-<p class="p34">The person addressed started violently, and turned sharply round. &ldquo;Good &lsquo;eavens, Cardus, how did you get in?&rdquo;</p>
-<p class="p34">&ldquo;Through the door, of course; do you suppose I came down the chimney?&rdquo;</p>
-<p class="p34">&ldquo;It&rsquo;s very strange, Cardus, but I never &lsquo;eard you come. You&rsquo;ve given me quite a start.&rdquo;</p>
-<p class="p34">Mr. Cardus laughed, a hard little laugh. &ldquo;You were too much occupied with your own thoughts, Mr. de Talor. I fear that they are not pleasant ones. Can I help you?&rdquo;</p>
-<p class="p34">&ldquo;How do you know that my thoughts are not pleasant, Cardus? I never said so.&rdquo;</p>
-<p class="p34">&ldquo;If we lawyers waited for our clients to tell us all their thoughts, Mr. de Talor, it would often take us a long time to reach the truth. We have to read their faces, or even their backs sometimes. You have no idea of how much expression a back is capable, if you make such things your study; yours, for instance, looks very uncomfortable to-day: nothing gone wrong, I hope?&rdquo;</p>
-<p class="p34">&ldquo;No, Cardus, no,&rdquo; answered Mr. de Talor, dropping the subject of backs, which was, he felt, beyond him; &ldquo;that is, nothing much, merely a question of business, on which I have come to ask your advice as a shrewd man.&rdquo;</p>
-<p class="p34">&ldquo;My best advice is at your service, Mr. de Talor: what is it?&rdquo;</p>
-<p class="p34">&ldquo;Well, Cardus, it&rsquo;s this.&rdquo; And Mr. de Talor seated his portly frame in an easy-chair, and turned his broad, vulgar face towards the lawyer. &ldquo;It&rsquo;s about the railway-grease business &#8212; &#8212;&rdquo;</p>
-<p class="p34">&ldquo;Which you own up in Manchester?&rdquo;</p>
-<p class="p34">&ldquo;Yes, that&rsquo;s it.&rdquo;</p>
-<p class="p34">&ldquo;Well, then, it ought to be a satisfactory subject to talk of. It pays hand over fist, does it not?&rdquo;</p>
-<p class="p34">&ldquo;No, Cardus, that is just the point: it did pay, it don&rsquo;t now.&rdquo;</p>
-<p class="p34">&ldquo;How&rsquo;s that?&rdquo;</p>
-<p class="p34">&ldquo;Well, you see, when my father took out the patent, and started the business, his &lsquo;ouse was the only &lsquo;ouse on the market, and he made a pot, and I don&rsquo;t mind telling you, I&rsquo;ve made a pot too; but now, what do you think? &#8212; there&rsquo;s a beggarly firm called Rastrick &amp; Codley that took out a new patent last year, and is underselling us with a better stuff at a cheaper price than we can turn ours out.&rdquo;</p>
-<p class="p34">&ldquo;Well!&rdquo;</p>
-<p class="p34">&ldquo;Well, we&rsquo;ve lowered our price to theirs, but we are doing business at a loss. We hoped to burst them, but they don&rsquo;t burst: there&rsquo;s somebody backing them, confound them, for Rastrick &amp; Codley ain&rsquo;t worth a sixpence. Who it is the Lord only knows. I don&rsquo;t believe they know themselves.&rdquo;</p>
-<p class="p34">&ldquo;That is unfortunate, but what about it?&rdquo;</p>
-<p class="p34">&ldquo;Just this, Cardus. I want to ask your advice about selling out. Our credit is good, and we could sell up for a large pile &#8212; not so large as we could have done, but still large &#8212; and I don&rsquo;t know whether to sell or hold.&rdquo;</p>
-<p class="p34">Mr. Cardus looked thoughtful. &ldquo;It is a difficult point, Mr. de Talor, but for myself I am always against caving in. The other firm may smash after all, and then you would be sorry. If you were to sell now you would probably make their fortunes, which I suppose you don&rsquo;t want to do.&rdquo;</p>
-<p class="p34">&ldquo;No, indeed.&rdquo;</p>
-<p class="p34">&ldquo;Then you are a very wealthy man; you are not dependent on this grease business. Even if things were to go wrong, you have all your landed property here at Ceswick&rsquo;s Ness to fall back on. I should hold, if I were you, even if it was at a loss for a time, and trust to the fortune of war.&rdquo;</p>
-<p class="p34">Mr. de Talor gave a sigh of relief. &ldquo;That&rsquo;s my view, too, Cardus. You are a shrewd man, and I am glad you jump with me. Damn Rastrick &amp; Codley, say I!&rdquo;</p>
-<p class="p34">&ldquo;O yes, damn them by all means,&rdquo; answered the lawyer, with a smile, as he rose to show his client to the door.</p>
-<p class="p34">On the farther side of the passage was another door, with a glass top to it, which gave on to a room furnished after the ordinary fashion of a clerk&rsquo;s office. Opposite this door Mr. de Talor stopped to look at a man who was within, sitting at a table writing. The man was old, of large size, very powerfully built, and dressed with extreme neatness in hunting costume &#8212; boots, breeches, spurs and all. Over his large head grew tufts of coarse grey hair, which hung down in dishevelled locks about his face, giving him a wild appearance, that was added to by a curious distortion of the mouth. His left arm, too, hung almost helpless by his side.</p>
-<p class="p34">Mr. Cardus laughed as he followed his visitor&rsquo;s gaze. &ldquo;A curious sort of clerk, eh?&rdquo; he said. &ldquo;Mad, dumb, and half-paralysed &#8212; not many lawyers could show such another.&rdquo;</p>
-<p class="p34">Mr. de Talor glanced at the object of their observation uneasily.</p>
-<p class="p34">&ldquo;If he&rsquo;s so mad, how can he do clerk&rsquo;s work?&rdquo; he asked.</p>
-<p class="p34">&ldquo;O, he&rsquo;s only mad in a way; he copies beautifully.&rdquo;</p>
-<p class="p34">&ldquo;He has quite lost his memory, I suppose?&rdquo; said de Talor, with another uneasy glance.</p>
-<p class="p34">&ldquo;Yes,&rdquo; answered Mr. Cardus, with a smile, &ldquo;he has. Perhaps it is as well. He remembers nothing now but his delusions.&rdquo;</p>
-<p class="p34">Mr. de Talor looked relieved. &ldquo;He has been with you many years now, hasn&rsquo;t he, Cardus?&rdquo;</p>
-<p class="p34">&ldquo;Yes, a great many.&rdquo;</p>
-<p class="p34">&ldquo;Why did you bring him &lsquo;ere at all?&rdquo;</p>
-<p class="p34">&ldquo;Did I never tell you the story? Then if you care to step back into my office I will. It is not a long one. You remember when our friend&rdquo; &#8212; he nodded towards the office&#8212;&rdquo;kept the hounds, and they used to call him &lsquo;Hard-riding Atterleigh&rsquo;?&rdquo;</p>
-<p class="p34">&ldquo;Yes, I remember, and ruined himself over them, like a fool.&rdquo;</p>
-<p class="p34">&ldquo;And of course you remember Mary Atterleigh, his daughter, with whom we were all in love when we were young?&rdquo;</p>
-<p class="p34">Mr. de Talor&rsquo;s broad cheek took a deeper shade of crimson as he nodded assent.</p>
-<p class="p34">&ldquo;Then,&rdquo; went on Mr. Cardus, in a voice meant to be indifferent, but which now and again gave traces of emotion, &ldquo;you will also remember that I was the fortunate man, and, with her father&rsquo;s consent, was engaged to be married to Mary Atterleigh so soon as I could show him that my income reached a certain sum.&rdquo; Here Mr. Cardus paused a moment, and then continued, &ldquo;But I had to go to America about the great Norwich bank case, and it was a long job, and travelling was slow in those days. When I got back, Mary was &#8212; married to a man called Jones, a friend of yours, Mr. de Talor. He was staying at your house, Ceswick&rsquo;s Ness, when he met her. But perhaps you are better acquainted with that part of the tale than I am.&rdquo;</p>
-<p class="p34">Mr. de Talor was looking very uneasy again now.</p>
-<p class="p34">&ldquo;No, I know nothing about it. Jones fell in love with her like the rest, and the next I heard of it was that they were to be married. It was rather rough on you, eh, Cardus? but, Lord, you shouldn&rsquo;t have been fool enough to trust her.&rdquo;</p>
-<p class="p34">Mr. Cardus smiled, a bitter smile. &ldquo;Yes, it was a little rough, but that has nothing to do with my story. The marriage did not turn out well; a curious fatality pursued all who had any hand in it. Mary had two children; and then did the best thing she could do &#8212; died of shame and sorrow. Jones, who was rich, went fraudulently bankrupt, and ended by committing suicide. &lsquo;Hard-riding Atterleigh&rsquo; flourished for a while. Then lost his money on horses and a ship-building speculation, and got a paralytic stroke that took away all his speech and most of his reason. I brought him here to save him from the madhouse.&rdquo;</p>
-<p class="p34">&ldquo;That was kind of you, Cardus.&rdquo;</p>
-<p class="p34">&ldquo;Oh no, he is worth his keep, and besides, he is poor Mary&rsquo;s father. He is under the fixed impression that I am the devil; but that does not matter.&rdquo;</p>
-<p class="p34">&ldquo;You&rsquo;ve got her children, too, eh?&rdquo;</p>
-<p class="p34">&ldquo;Yes, I have adopted them. The girl reminds me of her mother, though she will never have her mother&rsquo;s looks. The boy is like old Atterleigh. I do not care about the boy. But, thank God, they are neither of them like their father.&rdquo;</p>
-<p class="p34">&ldquo;So you knew Jones?&rdquo; said de Talor, sharply.</p>
-<p class="p34">&ldquo;Yes, I met him after his marriage. Oddly enough, I was with him a few minutes before he destroyed himself. There, Mr. de Talor, I will not detain you any longer. I thought that you could perhaps tell me something of the details of Mary&rsquo;s marriage. The story has a fascination for me, its results upon my own life have been so far-reaching. I am sure that I am not at the bottom of it yet. Mary wrote to me when she was dying, and hinted at something that I cannot understand. There was somebody behind who arranged the matter, who assisted Jones&rsquo; suit. Well, well, I shall find it all out in time, and whoever it is will no doubt pay the price of his wickedness, like the others. Providence has strange ways, Mr. de Talor, but in the end it is a terrible avenger. What! are you going? Queer talk for a lawyer&rsquo;s office, isn&rsquo;t it?&rdquo;</p>
-<p class="p34">Here Mr. de Talor rose, looking pale, and, merely nodding to Mr. Cardus, left the room.</p>
-<p class="p34">The lawyer watched him till the door had closed, when suddenly his whole face changed. The white eyebrows drew close together, the delicate features worked, and in the soft eyes there shone a look of hate. He clenched his fists, and shook them towards the door.</p>
-<p class="p34">&ldquo;You liar, you hound!&rdquo; he said aloud. &ldquo;God grant that I may live long enough to do to you as I have done to them! One a suicide, and one a paralytic madman; you &#8212; you shall be a beggar, if it takes me twenty years to make you so. Yes, that will hit you hardest. O Mary! Mary! dead and dishonoured through you, you scoundrel! O my darling, shall I ever find you again?&rdquo;</p>
-<p class="p34">And this strange man dropped his head upon the desk before him, and groaned.</p>
+<p class="p29"><span class="t29">当</span><span class="t28">卡杜斯</span><span class="t27">先</span><span class="t28">生</span><span class="t27">离</span><span class="t28">开</span><span class="t27">客厅——他方才在那儿与欧内斯特交谈——穿过这幢布局凌乱的老宅走廊时,他踏入了一个庭院。院子尽头有堵围墙,墙边矗立着一座整洁的单层红砖建筑,包含两个房间和一条过道。建筑后方连着一排低矮的温室,温室尽头的墙边搭着间披屋,里面安放着为管道输送热水的锅炉。这座红砖小屋是卡杜斯先生的办公室,他的职业是律师;屋后那排玻璃建筑则是他的兰花房,培育兰花是他唯一的消遣。这</span><span class="t31">整套</span><span class="t27">办公室与兰花园的组合,在灰暗古旧的庭院中显得格格不入,它们正对着那栋历经数百年风雨侵蚀的单层老宅。当卡杜斯先生关门准备穿过庭院时,似乎也意识到了这种突兀感。</span></p>  
+<p class="p34">“真是古怪的对比,”他自言自语道,“太古怪了。就像邓斯内斯的厌世者、绅士雷金纳德·卡杜斯先生,与斯托克斯利济贫院董事会主席、凯斯特威克执达吏、律师雷金纳德·卡杜斯先生之间的差别。但两者其实同属一个体系。不过是新旧风格之别!”</p>
+<p class="p34">卡杜斯先生并未径直走向办公室。他转向右侧,步入那排长长的玻璃温室,逐间穿行而上,直至抵达培育温带花卉的隔间——那里有道玻璃门与他的办公室相连。他放轻脚步,如猫般悄然穿过最后这道门,停在办公室门口,凝神打量着远处那个面向庭院、正专注眺望的粗犷大汉。</p>
+<p class="p34">“啊,我的朋友,”他自言自语道,“看来麻烦开始找上门了。好吧,是时候了。”接着,他轻轻推开门,以同样猫一般轻巧的步伐走进房间,关上门,在写字台前坐下,拿起一支笔。显然,窗边那个粗犷的男人太过沉浸在自己的思绪中,没有听见他的动静,依然站在那里凝视着虚空。</p>
+<p class="p34">"那么,德·泰勒先生,"律师随即用他那柔和而断续的声音说道,"我随时为您效劳。"</p>
+<p class="p34">被叫到的人猛地一震,迅速转过身来。"天哪,卡杜斯,你是怎么进来的?"</p>
+<p class="p34">“当然是从门进来的,难道你以为我是从烟囱里钻下来的?”</p>
+<p class="p34">“真是奇怪,卡杜斯,我完全没听到你进来。你可把我吓了一跳。”</p>
+<p class="p34">卡杜斯先生笑了,那是一种生硬而短促的笑声。"您太沉浸在自己的思绪里了,德·泰勒先生。恐怕这些想法并不愉快。我能帮到您吗?"</p>
+<p class="p34">“卡杜斯,你怎么知道我的想法不愉快呢?我可从没这么说过。”</p>
+<p class="p34">“德泰勒先生,如果我们律师只等着客户主动吐露心声,那查明真相往往要耗费很长时间。我们得学会解读他们的表情,有时甚至要观察背影。若您专研此道便会明白,人的后背能传递多少情绪;比如您今天的背影就透着坐立不安——但愿没出什么岔子?”</p>
+<p class="p34">“不,卡杜斯,不,”德·泰勒先生回答道,放弃了关于背部的话题,他觉得自己对此无能为力;“其实没什么,只是一点生意上的小事,我来是想请教你这位精明人的意见。”</p>
+<p class="p34">“德·泰勒先生,我随时为您提供最佳建议:您需要什么?”</p>
+<p class="p34">“好吧,卡达斯,事情是这样的。”德·泰勒先生将他那魁梧的身躯安顿在一把安乐椅中,将他那张粗俗的宽脸转向律师。“是关于铁路润滑油生意的事——”</p>
+<p class="p34">“你在曼彻斯特承认了什么?”</p>
+<p class="p34">“是的,就是这样。”</p>
+<p class="p34">“既然如此,这个话题应该很值得一谈。它赚得盆满钵满,不是吗?”</p>
+<p class="p34">“不,卡杜斯,关键就在这儿:过去能赚钱,现在不行了。”</p>
+<p class="p34">“怎么样?”</p>
+<p class="p34">“唉,你瞧,当初我父亲申请专利并创办这生意时,市场上就咱们一家独大,他赚得盆满钵满——我也不瞒你,我也跟着发了财;可如今呢?去年冒出个叫拉斯克里克-科德利的寒酸公司,他们搞出新专利,用比我们成本价还低的价钱卖质量更好的货,硬生生把咱们挤兑得够呛。”</p>
+<p class="p34">“好吧!”</p>
+<p class="p34">“唉,我们已经把价格降到和他们一样了,可这完全是在亏本经营。我们本想挤垮他们,但他们却屹立不倒——背后肯定有人撑腰,真见鬼,因为拉斯特里克和科德利那帮家伙根本不值一提。至于幕后黑手是谁,恐怕只有老天爷知道了。我甚至怀疑他们自己都不清楚。”</p>
+<p class="p34">“这确实很不幸,但又能怎样呢?”</p>
+<p class="p34">"就这事,卡杜斯。我想请教你关于清盘出售的建议。我们的信用良好,可以卖个好价钱——虽然不如从前能卖得那么高,但依然可观——我不知道该抛售还是继续持有。"</p>
+<p class="p34">卡杜斯先生露出沉思的神情。"这是个棘手的问题,德·泰勒先生,但就我个人而言,我始终反对屈服让步。毕竟对方公司可能会破产,到那时您会后悔的。如果您现在出售,很可能是在为他们创造财富,我想这不是您希望看到的。"</p>
+<p class="p34">“不,确实没有。”</p>
+<p class="p34">“那么您可算得上是个大富翁了;您并不靠这油脂生意过活。即便生意出了岔子,您在塞斯维克岬角还有大片地产可以依靠。换作是我,哪怕暂时亏本也会坚持经营,静待时来运转。”</p>
+<p class="p34">德·泰勒先生松了一口气。“卡德斯,我也是这么想的。你是个精明人,很高兴你和我意见一致。要我说,让拉斯特里克和科德利见鬼去吧!”</p>
+<p class="p34">“哦,当然,让他们见鬼去吧,”律师微笑着回答,起身将他的委托人送到门口。</p>
+<p class="p34">通道更远处还有一扇门,门的上部装有玻璃,通向一间按普通职员办公室风格布置的房间。德·泰勒先生在这扇门前停下脚步,打量着里面坐在桌边写字的人。那人年事已高,身材魁梧,体格异常强壮,穿着极其整洁的猎装——长靴、马裤、马刺一应俱全。他硕大的脑袋上长着几簇粗糙灰发,蓬乱地垂落在脸庞周围,加上嘴角古怪的扭曲,更添几分狂野气质。他的左臂也几乎无力地垂在身侧。</p>
+<p class="p34">卡杜斯先生顺着访客的视线看去,不禁笑了起来。"很特别的书记员,对吧?"他说,"又疯又哑,还半身不遂——能找出第二个这样的律师可不多。"</p>
+<p class="p34">德·泰勒先生不安地瞥了一眼他们观察的对象。</p>
+<p class="p34">“如果他疯得这么厉害,怎么能做文书工作呢?”他问道。</p>
+<p class="p34">“哦,他只是有点疯癫;但他模仿得惟妙惟肖。”</p>
+<p class="p34">“我想,他大概是完全失去记忆了吧?”德·泰勒说着,又不安地瞥了一眼。</p>
+<p class="p34">“是的,”卡杜斯先生微笑着回答,“他确实如此。也许这样也好。现在除了他的妄想,他什么都不记得了。”</p>
+<p class="p34">德泰勒先生看起来松了口气。"卡杜斯,他现在已经跟随你很多年了吧?"</p>
+<p class="p34">“是的,非常多。”</p>
+<p class="p34">“你干嘛非要把他带到这儿来?”</p>
+<p class="p34">“我从未给你讲过这个故事吗?那么,如果你愿意回到我的办公室,我就讲给你听。故事并不长。你还记得我们的朋友”——他朝办公室方向点了点头——“养着那群猎犬的时候吗?那时人们都叫他‘骑术高手阿特利’?”</p>
+<p class="p34">“是的,我记得,他像个傻瓜一样被这些东西毁了。”</p>
+<p class="p34">"你肯定还记得玛丽·阿特利吧?他那位令我们年少时都倾心不已的女儿。"</p>
+<p class="p34">德·泰勒先生宽阔的脸颊泛起更深的红晕,他点头表示同意。</p>
+<p class="p34">"那么,"卡杜斯先生继续说道,声音刻意显得漫不经心,却不时流露出几分激动,"您应该还记得,我曾是那个幸运儿——在征得她父亲同意后,只要我能证明收入达到某个数额,就可以和玛丽·阿特利结婚。"说到此处他略作停顿,"但当时我必须去美国处理诺里奇银行大案,那是个漫长的差事,何况那年月交通不便。等我回来时,玛丽已经...嫁给了一个叫琼斯的人,德·泰勒先生,那人还是您的朋友。他在您家塞斯威克庄园做客时结识了玛丽。不过这段故事,或许您比我更清楚。"</p>
+<p class="p34">德·泰勒先生此刻又显得非常不安。</p>
+<p class="p34">"不,我对此一无所知。琼斯和其他人一样爱上了她,后来我听说他们要结婚了。这对你来说挺残酷的,是吧,卡杜斯?不过,天哪,你当初就不该傻到去相信她。"</p>
+<p class="p34">卡杜斯先生苦笑了一下。“是的,确实有些坎坷,但这与我的故事无关。那段婚姻并不美满;所有参与其中的人都遭遇了离奇的不幸。玛丽生了两个孩子后,做了她所能做的最好的事——在羞愧与悲伤中离世。原本富有的琼斯因欺诈破产,最终以自杀收场。‘骑术高手阿特利’风光了一阵子,后来在赛马和造船投机中倾家荡产,还得了中风,丧失了语言能力和大半理智。我把他接到这里,免得他被送进疯人院。”</p>
+<p class="p34">“你真是太好了,卡杜斯。”</p>
+<p class="p34">“噢不,他值得留下,何况他还是可怜的玛丽的父亲。他固执地认为我是魔鬼,但这无关紧要。”</p>
+<p class="p34">“你连她的孩子也抓来了,嗯?”</p>
+<p class="p34">“是的,我已收养了他们。那女孩让我想起她母亲,尽管她永远不会有母亲的美貌。男孩则像老阿特利。我对男孩并不在意。但谢天谢地,他们俩都不像他们的父亲。”</p>
+<p class="p34">“这么说你认识琼斯?”德·泰勒尖锐地问道。</p>
+<p class="p34">"是的,在他婚后我见过他。说来也怪,就在他自寻短见前几分钟,我还和他在一起。好了,德·泰勒先生,我就不再耽搁您的时间了。我原以为您或许能告诉我一些玛丽婚姻的细节。这段往事对我有种奇特的吸引力,它对我人生的影响可谓深远。我确信至今仍未触及真相的核心。玛丽临终前曾给我写信,暗示了一些我至今无法理解的事。背后有人策划了这一切,有人协助了琼斯的求婚。不过没关系,我迟早会查明一切,无论幕后黑手是谁,都会像其他人一样为他的恶行付出代价。天道循环自有其玄妙之处,德·泰勒先生,但最终它会是可怕的复仇者。怎么!您要走了?在律师事务所谈这些怪力乱神的事,是不是很荒唐?"</p>
+<p class="p34">这时德·泰勒先生站了起来,面色苍白,只是朝卡杜斯先生点了点头,便离开了房间。</p>
+<p class="p34">律师目送他直到房门关上,突然间整张脸都变了样。白眉毛紧紧拧在一起,精致的五官扭曲着,柔和的眼中迸射出憎恨的光芒。他攥紧拳头,朝着房门方向狠狠挥舞。</p>
+<p class="p34">“你这个骗子,卑鄙小人!”他大声喊道。“愿上帝让我活得足够长久,好让我像对付他们那样对付你!一个自杀了,一个成了瘫痪的疯子;而你——我要让你沦为乞丐,哪怕花上二十年也在所不惜。没错,这才最能刺痛你。噢,玛丽!玛丽!因你而死,因你而蒙羞,你这恶棍!噢,我的挚爱,我还能再找到你吗?”</p>
+<p class="p34">这个古怪的男人将头垂在面前的桌子上,发出一声呻吟。</p>
 </body>
 </html>

+ 1 - 1
README.md

@@ -36,4 +36,4 @@ FROM group_progress
 ORDER BY file_path, group_index;
 ```
 
-目前翻译最稳定的是 translate_epub_v4(单线程版本)V2.py 脚本
+# 目前翻译最稳定的是 translate_epub_v4(单线程版本)V3.py 脚本

+ 104 - 1
code/translate_epub_v4(单线程版本).py

@@ -17,7 +17,110 @@ import hashlib
 import yaml
 from pathlib import Path
 
-
+# 配置管理
+class Config:
+    def __init__(self, config_path='config.yaml'):
+        self.config_path = config_path
+        self.config = self.load_config()
+        
+        # 设置日志
+        self.setup_logging()
+        
+        # 初始化OpenAI客户端
+        self.setup_openai()
+    
+    def load_config(self):
+        """加载配置文件"""
+        if not os.path.exists(self.config_path):
+            # 创建默认配置
+            default_config = {
+                'logging': {
+                    'level': 'INFO',
+                    'format': '%(asctime)s - %(levelname)s - %(message)s',
+                    'file': 'translation.log'
+                },
+                'openai': {
+                    'base_url': 'https://api.siliconflow.cn/v1',
+                    'api_key': 'sk-',
+                    'model_name': 'deepseek-ai/DeepSeek-R1',
+                    'max_retries': 3,
+                    'retry_delay': 2,
+                    'timeout': 30,
+                    'max_concurrent_requests': 5
+                },
+                'translation': {
+                    'min_line_count': 1,
+                    'max_line_count': 5,
+                    'initial_line_count': 2,
+                    'error_threshold': 3,
+                    'success_threshold': 5,
+                    'error_cooldown': 60,
+                    'cache_size': 1000
+                },
+                'database': {
+                    'path': 'translation_progress.db',
+                    'pool_size': 5
+                },
+                'paths': {
+                    'input_dir': '002/Ops',
+                    'output_dir': '002/Ops_translated'
+                }
+            }
+            
+            # 保存默认配置
+            with open(self.config_path, 'w', encoding='utf-8') as f:
+                yaml.dump(default_config, f, allow_unicode=True)
+            
+            return default_config
+        
+        # 加载现有配置
+        with open(self.config_path, 'r', encoding='utf-8') as f:
+            return yaml.safe_load(f)
+    
+    def setup_logging(self):
+        """设置日志"""
+        logging.basicConfig(
+            level=getattr(logging, self.config['logging']['level']),
+            format=self.config['logging']['format'],
+            handlers=[
+                logging.FileHandler(self.config['logging']['file']),
+                logging.StreamHandler()
+            ]
+        )
+    
+    def setup_openai(self):
+        """设置OpenAI客户端"""
+        self.client = openai.OpenAI(
+            base_url=self.config['openai']['base_url'],
+            api_key=self.config['openai']['api_key']
+        )
+    
+    def get(self, *keys):
+        """获取配置值"""
+        value = self.config
+        for key in keys:
+            value = value[key]
+        return value
+    
+    def update(self, updates):
+        """更新配置"""
+        def deep_update(d, u):
+            for k, v in u.items():
+                if isinstance(v, dict):
+                    d[k] = deep_update(d.get(k, {}), v)
+                else:
+                    d[k] = v
+            return d
+        
+        self.config = deep_update(self.config, updates)
+        
+        # 保存更新后的配置
+        with open(self.config_path, 'w', encoding='utf-8') as f:
+            yaml.dump(self.config, f, allow_unicode=True)
+        
+        # 重新设置日志和OpenAI客户端
+        self.setup_logging()
+        self.setup_openai()
 
 # 创建全局的配置实例
 config = Config()

+ 190 - 64
code/translate_epub_v4(单线程版本)V2.py

@@ -6,9 +6,12 @@ from tqdm import tqdm
 import sqlite3
 from datetime import datetime
 import logging
+from logging.handlers import RotatingFileHandler
 from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
 import asyncio
 import yaml
+import threading
+from collections import deque
 
 # 配置管理
 class Config:
@@ -16,12 +19,32 @@ class Config:
         self.config_path = config_path
         self.config = self.load_config()
         
+        # 验证配置
+        self.validate_config()
+        
         # 设置日志
         self.setup_logging()
         
         # 初始化OpenAI客户端
         self.setup_openai()
     
+    def validate_config(self):
+        """验证配置项"""
+        required_fields = {
+            'logging': ['level', 'format', 'file'],
+            'openai': ['base_url', 'api_key', 'model_name', 'max_retries', 'retry_delay', 'timeout', 'max_concurrent_requests'],
+            'translation': ['min_line_count', 'max_line_count', 'initial_line_count', 'error_threshold', 'success_threshold', 'error_cooldown', 'cache_size'],
+            'database': ['path', 'pool_size'],
+            'paths': ['input_dir', 'output_dir']
+        }
+        
+        for section, fields in required_fields.items():
+            if section not in self.config:
+                raise ValueError(f"缺少配置节: {section}")
+            for field in fields:
+                if field not in self.config[section]:
+                    raise ValueError(f"缺少配置项: {section}.{field}")
+    
     def load_config(self):
         """加载配置文件"""
         if not os.path.exists(self.config_path):
@@ -72,14 +95,30 @@ class Config:
     
     def setup_logging(self):
         """设置日志"""
-        logging.basicConfig(
-            level=getattr(logging, self.config['logging']['level']),
-            format=self.config['logging']['format'],
-            handlers=[
-                logging.FileHandler(self.config['logging']['file']),
-                logging.StreamHandler()
-            ]
+        log_file = self.config['logging']['file']
+        log_dir = os.path.dirname(log_file)
+        if log_dir and not os.path.exists(log_dir):
+            os.makedirs(log_dir)
+            
+        # 创建日志处理器
+        file_handler = RotatingFileHandler(
+            log_file,
+            maxBytes=10*1024*1024,  # 10MB
+            backupCount=5,
+            encoding='utf-8'
         )
+        console_handler = logging.StreamHandler()
+        
+        # 设置日志格式
+        formatter = logging.Formatter(self.config['logging']['format'])
+        file_handler.setFormatter(formatter)
+        console_handler.setFormatter(formatter)
+        
+        # 配置根日志记录器
+        root_logger = logging.getLogger()
+        root_logger.setLevel(getattr(logging, self.config['logging']['level']))
+        root_logger.addHandler(file_handler)
+        root_logger.addHandler(console_handler)
     
     def setup_openai(self):
         """设置OpenAI客户端"""
@@ -176,6 +215,8 @@ class DatabaseManager:
     def __init__(self):
         self.db_path = config.get('database', 'path')
         self.conn = None
+        self.batch_size = 100  # 批量更新的大小
+        self.pending_updates = []  # 待更新的操作
         self.init_db()
     
     def get_connection(self):
@@ -183,14 +224,91 @@ class DatabaseManager:
         if self.conn is None:
             self.conn = sqlite3.connect(self.db_path)
             self.conn.row_factory = sqlite3.Row
+            # 启用外键约束
+            self.conn.execute("PRAGMA foreign_keys = ON")
+            # 设置WAL模式提高并发性能
+            self.conn.execute("PRAGMA journal_mode = WAL")
         return self.conn
     
     def close(self):
         """关闭数据库连接"""
         if self.conn:
+            # 提交所有待处理的更新
+            self.flush_updates()
             self.conn.close()
             self.conn = None
     
+    def flush_updates(self):
+        """提交所有待处理的更新"""
+        if not self.pending_updates:
+            return
+            
+        try:
+            self.begin_transaction()
+            for update in self.pending_updates:
+                update()
+            self.commit_transaction()
+        except Exception as e:
+            self.rollback_transaction()
+            logging.error(f"批量更新失败: {str(e)}")
+            raise
+        finally:
+            self.pending_updates = []
+    
+    def add_update(self, update_func):
+        """添加待处理的更新操作"""
+        self.pending_updates.append(update_func)
+        if len(self.pending_updates) >= self.batch_size:
+            self.flush_updates()
+    
+    def update_file_progress(self, file_path, total_lines, processed_lines, status):
+        """更新文件翻译进度"""
+        def update():
+            c = self.get_connection().cursor()
+            c.execute('''
+                INSERT OR REPLACE INTO file_progress 
+                (file_path, total_lines, processed_lines, status, last_updated)
+                VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
+            ''', (file_path, total_lines, processed_lines, status))
+        
+        self.add_update(update)
+    
+    def update_line_progress(self, file_path, line_index, original_text, translated_text, status):
+        """更新行翻译进度"""
+        def update():
+            c = self.get_connection().cursor()
+            c.execute('''
+                INSERT OR REPLACE INTO line_progress 
+                (file_path, line_index, original_text, translated_text, status, updated_at)
+                VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
+            ''', (file_path, line_index, original_text, translated_text, status))
+        
+        self.add_update(update)
+    
+    def update_group_progress(self, file_path, group_index, original_text, translated_text, status):
+        """更新翻译组进度"""
+        def update():
+            c = self.get_connection().cursor()
+            c.execute('''
+                INSERT OR REPLACE INTO group_progress 
+                (file_path, group_index, original_text, translated_text, status, version, updated_at)
+                VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
+            ''', (file_path, group_index, original_text, translated_text, status, VERSION))
+        
+        self.add_update(update)
+    
+    def log_error(self, file_path, line_index, error_type, error_message):
+        """记录错误"""
+        def update():
+            c = self.get_connection().cursor()
+            c.execute('''
+                INSERT INTO error_log 
+                (file_path, line_index, error_type, error_message)
+                VALUES (?, ?, ?, ?)
+            ''', (file_path, line_index, error_type, error_message))
+        
+        self.add_update(update)
+    
     def init_db(self):
         """初始化数据库"""
         conn = self.get_connection()
@@ -276,16 +394,6 @@ class DatabaseManager:
         c.execute('SELECT * FROM file_progress WHERE file_path = ?', (file_path,))
         return c.fetchone()
     
-    def update_file_progress(self, file_path, total_lines, processed_lines, status):
-        """更新文件翻译进度"""
-        c = self.get_connection().cursor()
-        c.execute('''
-            INSERT OR REPLACE INTO file_progress 
-            (file_path, total_lines, processed_lines, status, last_updated)
-            VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
-        ''', (file_path, total_lines, processed_lines, status))
-        self.get_connection().commit()
-    
     def get_line_progress(self, file_path, line_index):
         """获取行翻译进度"""
         c = self.get_connection().cursor()
@@ -295,36 +403,6 @@ class DatabaseManager:
         ''', (file_path, line_index))
         return c.fetchone()
     
-    def update_line_progress(self, file_path, line_index, original_text, translated_text, status):
-        """更新行翻译进度"""
-        c = self.get_connection().cursor()
-        c.execute('''
-            INSERT OR REPLACE INTO line_progress 
-            (file_path, line_index, original_text, translated_text, status, updated_at)
-            VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
-        ''', (file_path, line_index, original_text, translated_text, status))
-        self.get_connection().commit()
-    
-    def log_error(self, file_path, line_index, error_type, error_message):
-        """记录错误"""
-        c = self.get_connection().cursor()
-        c.execute('''
-            INSERT INTO error_log 
-            (file_path, line_index, error_type, error_message)
-            VALUES (?, ?, ?, ?)
-        ''', (file_path, line_index, error_type, error_message))
-        self.get_connection().commit()
-    
-    def update_group_progress(self, file_path, group_index, original_text, translated_text, status):
-        """更新翻译组进度"""
-        c = self.get_connection().cursor()
-        c.execute('''
-            INSERT OR REPLACE INTO group_progress 
-            (file_path, group_index, original_text, translated_text, status, version, updated_at)
-            VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
-        ''', (file_path, group_index, original_text, translated_text, status, VERSION))
-        self.get_connection().commit()
-    
     def get_error_stats(self):
         """获取错误统计信息"""
         c = self.get_connection().cursor()
@@ -371,9 +449,37 @@ def get_completed_groups(conn, file_path):
     ''', (file_path, VERSION))
     return c.fetchall()
 
-# """ - 输出内容要求用代码块包裹起来
-# ,只在必要时提供相应的语言注释
-#  """
+class TokenBucket:
+    """令牌桶限流器"""
+    def __init__(self, rate, capacity):
+        self.rate = rate  # 令牌产生速率(每秒)
+        self.capacity = capacity  # 桶容量
+        self.tokens = capacity  # 当前令牌数
+        self.last_update = time.time()
+        self.lock = threading.Lock()
+    
+    def get_token(self):
+        """获取一个令牌"""
+        with self.lock:
+            now = time.time()
+            # 计算新增的令牌
+            new_tokens = (now - self.last_update) * self.rate
+            self.tokens = min(self.capacity, self.tokens + new_tokens)
+            self.last_update = now
+            
+            if self.tokens >= 1:
+                self.tokens -= 1
+                return True
+            return False
+    
+    def wait_for_token(self):
+        """等待直到获得令牌"""
+        while not self.get_token():
+            time.sleep(0.1)
+
+# 创建全局的令牌桶实例
+token_bucket = TokenBucket(rate=2, capacity=10)  # 每秒2个请求,最多10个并发
+
 @retry(
     stop=stop_after_attempt(MODEL_CONFIG['max_retries']),
     wait=wait_exponential(multiplier=1, min=4, max=10),
@@ -387,6 +493,9 @@ def translate_text(text):
         return text
         
     try:
+        # 等待获取令牌
+        token_bucket.wait_for_token()
+        
         messages = [
             {
                 "role": "system",
@@ -440,6 +549,22 @@ def translate_text(text):
         translation_stats.update_stats(text, "", False)
         raise
 
+def calculate_group_size(text_length):
+    """根据文本长度动态计算分组大小"""
+    if text_length < 1000:
+        return 4
+    elif text_length < 2000:
+        return 3
+    else:
+        return 2
+
+def resume_translation(file_path, db_manager):
+    """获取断点续传的起始位置"""
+    progress = db_manager.get_file_progress(file_path)
+    if progress and progress['status'] == 'interrupted':
+        return progress['processed_lines']
+    return 0
+
 def process_html_file(file_path, conn):
     """处理HTML文件"""
     # 检查文件进度
@@ -487,12 +612,8 @@ def process_html_file(file_path, conn):
             else:
                 logging.info("跳过空标题")
         
-        # 按行分割内容,保留所有HTML标签行,但只翻译包含 <p class 的行
-        lines = []
-        for line in body_content.split('\n'):
-            line = line.strip()
-            if line and line.startswith('<'):
-                lines.append(line)
+        # 按行分割内容,保留所有非空行
+        lines = [line.strip() for line in body_content.split('\n') if line.strip()]
         
         total_lines = len(lines)
         logging.info(f"文件 {file_path} 共有 {total_lines} 行需要处理")
@@ -501,6 +622,9 @@ def process_html_file(file_path, conn):
         completed_lines = get_completed_groups(conn, file_path)
         completed_indices = {line[0] for line in completed_lines}
         
+        # 获取断点续传位置
+        start_line = resume_translation(file_path, db_manager)
+        
         # 计算已处理的进度
         if progress:
             progress_percentage = round(progress['processed_lines']*100/progress['total_lines'], 2)
@@ -509,9 +633,11 @@ def process_html_file(file_path, conn):
         # 逐行处理内容
         translated_lines = []
         try:
-            with tqdm(range(0, len(lines), line_count), desc=f"处理文件 {os.path.basename(file_path)}", unit="组") as pbar:
-                for i in range(0, len(lines), line_count):
-                    group_index = i // line_count
+            with tqdm(range(start_line, len(lines)), desc=f"处理文件 {os.path.basename(file_path)}", unit="行") as pbar:
+                for i in range(start_line, len(lines)):
+                    # 计算当前组的大小
+                    current_group_size = calculate_group_size(len(lines[i]))
+                    group_index = i // current_group_size
                     
                     # 检查是否已完成
                     if group_index in completed_indices:
@@ -520,11 +646,11 @@ def process_html_file(file_path, conn):
                             if line[0] == group_index:
                                 translated_lines.extend(line[1].split('\n'))
                                 break
-                        pbar.update(1)
+                        pbar.update(current_group_size)
                         continue
                     
                     # 获取当前组的行
-                    group = lines[i:i+line_count]
+                    group = lines[i:i+current_group_size]
                     if group:
                         try:
                             # 收集需要翻译的段落
@@ -539,7 +665,7 @@ def process_html_file(file_path, conn):
                             if paragraphs_to_translate:
                                 # 将所有需要翻译的段落合并成一个文本
                                 combined_text = "\n".join(paragraphs_to_translate)
-                                logging.info(f"开始翻译第 {i+1}-{min(i+line_count, len(lines))} 行")
+                                logging.info(f"开始翻译第 {i+1}-{min(i+current_group_size, len(lines))} 行")
                                 translated_text = translate_text(combined_text)
                                 
                                 # 分割翻译后的文本
@@ -563,7 +689,7 @@ def process_html_file(file_path, conn):
                             translated_lines.extend(translated_group)
                             
                             # 更新文件进度
-                            processed_lines = min((group_index + 1) * line_count, total_lines)
+                            processed_lines = min((group_index + 1) * current_group_size, total_lines)
                             db_manager.update_file_progress(file_path, total_lines, processed_lines, 'in_progress')
                             
                             # 显示当前统计信息
@@ -579,7 +705,7 @@ def process_html_file(file_path, conn):
                             db_manager.log_error(file_path, group_index, "group_processing_error", str(e))
                             continue
                     
-                    pbar.update(1)
+                    pbar.update(current_group_size)
             
             # 替换原始内容
             if translated_lines:

+ 610 - 0
code/translate_epub_v4(单线程版本)V3.py

@@ -0,0 +1,610 @@
+import os
+import re
+from bs4 import BeautifulSoup
+import openai
+import time
+from tqdm import tqdm
+import sqlite3
+import json
+from datetime import datetime
+import logging
+from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
+import asyncio
+import aiohttp
+from concurrent.futures import ThreadPoolExecutor
+from functools import lru_cache
+import hashlib
+import yaml
+from pathlib import Path
+
+# 配置管理
+class Config:
+    def __init__(self, config_path='config.yaml'):
+        self.config_path = config_path
+        self.config = self.load_config()
+        
+        # 设置日志
+        self.setup_logging()
+        
+        # 初始化OpenAI客户端
+        self.setup_openai()
+    
+    def load_config(self):
+        """加载配置文件"""
+        if not os.path.exists(self.config_path):
+            # 创建默认配置
+            default_config = {
+                'logging': {
+                    'level': 'INFO',
+                    'format': '%(asctime)s - %(levelname)s - %(message)s',
+                    'file': 'translation.log'
+                },
+                'openai': {
+                    'base_url': 'https://api.siliconflow.cn/v1',
+                    'api_key': 'sk-',
+                    'model_name': 'deepseek-ai/DeepSeek-R1',
+                    'max_retries': 3,
+                    'retry_delay': 2,
+                    'timeout': 30,
+                    'max_concurrent_requests': 5
+                },
+                'translation': {
+                    'min_line_count': 1,
+                    'max_line_count': 5,
+                    'initial_line_count': 2,
+                    'error_threshold': 3,
+                    'success_threshold': 5,
+                    'error_cooldown': 60,
+                    'cache_size': 1000
+                },
+                'database': {
+                    'path': 'translation_progress.db',
+                    'pool_size': 5
+                },
+                'paths': {
+                    'input_dir': '002/Ops',
+                    'output_dir': '002/Ops_translated'
+                }
+            }
+            
+            # 保存默认配置
+            with open(self.config_path, 'w', encoding='utf-8') as f:
+                yaml.dump(default_config, f, allow_unicode=True)
+            
+            return default_config
+        
+        # 加载现有配置
+        with open(self.config_path, 'r', encoding='utf-8') as f:
+            return yaml.safe_load(f)
+    
+    def setup_logging(self):
+        """设置日志"""
+        logging.basicConfig(
+            level=getattr(logging, self.config['logging']['level']),
+            format=self.config['logging']['format'],
+            handlers=[
+                logging.FileHandler(self.config['logging']['file']),
+                logging.StreamHandler()
+            ]
+        )
+    
+    def setup_openai(self):
+        """设置OpenAI客户端"""
+        self.client = openai.OpenAI(
+            base_url=self.config['openai']['base_url'],
+            api_key=self.config['openai']['api_key']
+        )
+    
+    def get(self, *keys):
+        """获取配置值"""
+        value = self.config
+        for key in keys:
+            value = value[key]
+        return value
+    
+    def update(self, updates):
+        """更新配置"""
+        def deep_update(d, u):
+            for k, v in u.items():
+                if isinstance(v, dict):
+                    d[k] = deep_update(d.get(k, {}), v)
+                else:
+                    d[k] = v
+            return d
+        
+        self.config = deep_update(self.config, updates)
+        
+        # 保存更新后的配置
+        with open(self.config_path, 'w', encoding='utf-8') as f:
+            yaml.dump(self.config, f, allow_unicode=True)
+        
+        # 重新设置日志和OpenAI客户端
+        self.setup_logging()
+        self.setup_openai()
+
+# 创建全局的配置实例
+config = Config()
+
+# 更新全局变量
+MODEL_CONFIG = {
+    "model_name": config.get('openai', 'model_name'),
+    "max_retries": config.get('openai', 'max_retries'),
+    "retry_delay": config.get('openai', 'retry_delay'),
+    "timeout": config.get('openai', 'timeout'),
+    "max_concurrent_requests": config.get('openai', 'max_concurrent_requests'),
+    "cache_size": config.get('translation', 'cache_size')
+}
+
+MIN_LINE_COUNT = config.get('translation', 'min_line_count')
+MAX_LINE_COUNT = config.get('translation', 'max_line_count')
+INITIAL_LINE_COUNT = config.get('translation', 'initial_line_count')
+ERROR_THRESHOLD = config.get('translation', 'error_threshold')
+SUCCESS_THRESHOLD = config.get('translation', 'success_threshold')
+
+# 更新其他类的初始化参数
+class TranslationStats:
+    def __init__(self):
+        self.start_time = time.time()
+        self.total_chars = 0
+        self.translated_chars = 0
+        self.total_requests = 0
+        self.successful_requests = 0
+        self.failed_requests = 0
+    
+    def update_stats(self, original_text, translated_text, success=True):
+        self.total_chars += len(original_text)
+        self.translated_chars += len(translated_text)
+        self.total_requests += 1
+        if success:
+            self.successful_requests += 1
+        else:
+            self.failed_requests += 1
+    
+    def get_stats(self):
+        elapsed_time = time.time() - self.start_time
+        chars_per_second = self.translated_chars / elapsed_time if elapsed_time > 0 else 0
+        success_rate = (self.successful_requests / self.total_requests * 100) if self.total_requests > 0 else 0
+        
+        return {
+            "总字符数": self.total_chars,
+            "已翻译字符数": self.translated_chars,
+            "翻译速度": f"{chars_per_second:.2f} 字符/秒",
+            "成功率": f"{success_rate:.1f}%",
+            "总请求数": self.total_requests,
+            "成功请求": self.successful_requests,
+            "失败请求": self.failed_requests,
+            "运行时间": f"{elapsed_time:.1f} 秒"
+        }
+
+# 创建全局的统计对象
+translation_stats = TranslationStats()
+
+class DatabaseManager:
+    def __init__(self):
+        self.db_path = config.get('database', 'path')
+        self.conn = None
+        self.init_db()
+    
+    def get_connection(self):
+        """获取数据库连接"""
+        if self.conn is None:
+            self.conn = sqlite3.connect(self.db_path)
+            self.conn.row_factory = sqlite3.Row
+        return self.conn
+    
+    def close(self):
+        """关闭数据库连接"""
+        if self.conn:
+            self.conn.close()
+            self.conn = None
+    
+    def init_db(self):
+        """初始化数据库"""
+        conn = self.get_connection()
+        c = conn.cursor()
+        
+        # 创建文件进度表
+        c.execute('''
+            CREATE TABLE IF NOT EXISTS file_progress (
+                file_path TEXT PRIMARY KEY,
+                total_lines INTEGER,
+                processed_lines INTEGER,
+                status TEXT,
+                last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                error_count INTEGER DEFAULT 0,
+                retry_count INTEGER DEFAULT 0
+            )
+        ''')
+        
+        # 创建行进度表
+        c.execute('''
+            CREATE TABLE IF NOT EXISTS line_progress (
+                id INTEGER PRIMARY KEY AUTOINCREMENT,
+                file_path TEXT,
+                line_index INTEGER,
+                original_text TEXT,
+                translated_text TEXT,
+                status TEXT,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                error_count INTEGER DEFAULT 0,
+                retry_count INTEGER DEFAULT 0,
+                UNIQUE(file_path, line_index)
+            )
+        ''')
+        
+        # 创建错误日志表
+        c.execute('''
+            CREATE TABLE IF NOT EXISTS error_log (
+                id INTEGER PRIMARY KEY AUTOINCREMENT,
+                file_path TEXT,
+                line_index INTEGER,
+                error_type TEXT,
+                error_message TEXT,
+                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                resolved_at TIMESTAMP,
+                resolution TEXT
+            )
+        ''')
+        
+        conn.commit()
+    
+    def begin_transaction(self):
+        """开始事务"""
+        self.get_connection().execute('BEGIN TRANSACTION')
+    
+    def commit_transaction(self):
+        """提交事务"""
+        self.get_connection().commit()
+    
+    def rollback_transaction(self):
+        """回滚事务"""
+        self.get_connection().rollback()
+    
+    def get_file_progress(self, file_path):
+        """获取文件翻译进度"""
+        c = self.get_connection().cursor()
+        c.execute('SELECT * FROM file_progress WHERE file_path = ?', (file_path,))
+        return c.fetchone()
+    
+    def update_file_progress(self, file_path, total_lines, processed_lines, status):
+        """更新文件翻译进度"""
+        c = self.get_connection().cursor()
+        c.execute('''
+            INSERT OR REPLACE INTO file_progress 
+            (file_path, total_lines, processed_lines, status, last_updated)
+            VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
+        ''', (file_path, total_lines, processed_lines, status))
+        self.get_connection().commit()
+    
+    def get_line_progress(self, file_path, line_index):
+        """获取行翻译进度"""
+        c = self.get_connection().cursor()
+        c.execute('''
+            SELECT * FROM line_progress 
+            WHERE file_path = ? AND line_index = ?
+        ''', (file_path, line_index))
+        return c.fetchone()
+    
+    def update_line_progress(self, file_path, line_index, original_text, translated_text, status):
+        """更新行翻译进度"""
+        c = self.get_connection().cursor()
+        c.execute('''
+            INSERT OR REPLACE INTO line_progress 
+            (file_path, line_index, original_text, translated_text, status, updated_at)
+            VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
+        ''', (file_path, line_index, original_text, translated_text, status))
+        self.get_connection().commit()
+    
+    def log_error(self, file_path, line_index, error_type, error_message):
+        """记录错误"""
+        c = self.get_connection().cursor()
+        c.execute('''
+            INSERT INTO error_log 
+            (file_path, line_index, error_type, error_message)
+            VALUES (?, ?, ?, ?)
+        ''', (file_path, line_index, error_type, error_message))
+        self.get_connection().commit()
+    
+    def get_error_stats(self):
+        """获取错误统计信息"""
+        c = self.get_connection().cursor()
+        c.execute('''
+            SELECT 
+                COUNT(*) as total_errors,
+                COUNT(CASE WHEN resolved_at IS NULL THEN 1 END) as unresolved_errors,
+                COUNT(CASE WHEN created_at > datetime('now', '-1 hour') THEN 1 END) as recent_errors
+            FROM error_log
+        ''')
+        return c.fetchone()
+
+class AsyncTranslationManager:
+    def __init__(self):
+        self.semaphore = asyncio.Semaphore(config.get('openai', 'max_concurrent_requests'))
+        self.session = None
+
+class TranslationCache:
+    def __init__(self):
+        self.cache = {}
+        self.max_size = config.get('translation', 'cache_size')
+        self.hits = 0
+        self.misses = 0
+
+# 创建全局实例
+line_count_manager = TranslationStats()
+db_manager = DatabaseManager()
+async_translation_manager = AsyncTranslationManager()
+translation_cache = TranslationCache()
+
+# 添加版本控制
+VERSION = "1.0.1" # 版本号,用于区分不同版本的翻译
+line_count = 2 # 每组行数,越大越快,但越容易出错
+
+def get_completed_groups(conn, file_path):
+    """获取已完成的翻译行"""
+    c = conn.cursor()
+    c.execute('''
+        SELECT line_index, translated_text 
+        FROM line_progress 
+        WHERE file_path = ? AND status = 'completed'
+        ORDER BY line_index
+    ''', (file_path,))
+    return c.fetchall()
+
+# """ - 输出内容要求用代码块包裹起来
+# ,只在必要时提供相应的语言注释
+#  """
+@retry(
+    stop=stop_after_attempt(MODEL_CONFIG['max_retries']),
+    wait=wait_exponential(multiplier=1, min=4, max=10),
+    retry=retry_if_exception_type((openai.APIError, openai.APITimeoutError)),
+    before_sleep=lambda retry_state: logging.warning(f"重试第 {retry_state.attempt_number} 次...")
+)
+def translate_text(text):
+    """翻译文本,使用流式输出"""
+    try:
+        messages = [
+            {
+                "role": "system",
+                "content": "- 你名为epub翻译大师,专注于将任意语言的文本翻译成中文。- 你在翻译过程中,力求保留原文语意,确保翻译的准确性和完整性。- 你特别注重翻译结果要贴合现代人的阅读习惯,使译文更加流畅易懂。- 在处理包含代码结构的文本时,你会特别注意保持代码的原样。- 你的服务旨在为用户提供高效、便捷的翻译体验,帮助用户跨越语言障碍。- 在回答问题的时候,尽可能保留原来的代码结构。- 在回答问题的时候,尽可能只返回翻译后的内容和代码结构,不要返回任何其他内容。"
+            },
+            {
+                "role": "user",
+                "content": text
+            }
+        ]
+        
+        # 使用流式输出
+        stream = config.client.chat.completions.create(
+            model=MODEL_CONFIG['model_name'],
+            messages=messages,
+            timeout=MODEL_CONFIG['timeout'],
+            stream=True  # 启用流式输出
+        )
+        
+        # 收集流式输出的内容
+        translated_text = ""
+        for chunk in stream:
+            if chunk.choices[0].delta.content is not None:
+                content = chunk.choices[0].delta.content
+                translated_text += content
+                # 实时打印翻译内容
+                print(content, end='', flush=True)
+        
+        print()  # 换行
+        
+        # 更新统计信息
+        translation_stats.update_stats(text, translated_text, True)
+        
+        return translated_text
+        
+    except Exception as e:
+        logging.error(f"翻译出错: {str(e)}")
+        
+        # 更新统计信息
+        translation_stats.update_stats(text, "", False)
+        
+        raise
+
+def process_html_file(file_path, conn):
+    """处理HTML文件"""
+    # 检查文件进度
+    progress = db_manager.get_file_progress(file_path)
+    
+    try:
+        # 尝试不同的编码方式读取文件
+        encodings = ['utf-8', 'gbk', 'gb2312', 'latin1']
+        content = None
+        
+        for encoding in encodings:
+            try:
+                with open(file_path, 'r', encoding=encoding) as f:
+                    content = f.read()
+                break
+            except UnicodeDecodeError:
+                continue
+        
+        if content is None:
+            raise Exception(f"无法使用支持的编码读取文件: {file_path}")
+    
+        # 使用正则表达式提取body标签内的内容和title标签
+        body_pattern = re.compile(r'<body[^>]*>(.*?)</body>', re.DOTALL)
+        title_pattern = re.compile(r'<title>(.*?)</title>', re.DOTALL)
+        
+        body_match = body_pattern.search(content)
+        title_match = title_pattern.search(content)
+        
+        if not body_match:
+            print(f"警告: {file_path} 中没有找到body标签")
+            return
+        
+        body_content = body_match.group(1)
+        
+        # 处理title标签
+        if title_match:
+            title_content = title_match.group(1).strip()
+            if title_content:  # 只有当标题内容不为空时才处理
+                print(f"\n翻译标题: {title_content}")
+                translated_title = translate_text(title_content)
+                # 替换原始title内容
+                content = content.replace(f"<title>{title_content}</title>", f"<title>{translated_title}</title>")
+            else:
+                print("\n跳过空标题")
+        
+        # 按行分割body内容
+        lines = [line.strip() for line in body_content.split('\n') if line.strip()]
+        total_lines = len(lines)
+        
+        # 获取已完成的翻译
+        completed_lines = get_completed_groups(conn, file_path)
+        completed_indices = {line[0] for line in completed_lines}
+        
+        # 计算已处理的进度
+        if progress:
+            print(f"文件 {file_path} 已处理进度: {progress['processed_lines']}/{progress['total_lines']} 行 ({round(progress['processed_lines']*100/progress['total_lines'], 2)}%)")
+        
+        # 按4行一组处理内容
+        translated_lines = []
+        try:
+            with tqdm(range(0, len(lines), 4), desc=f"处理文件 {os.path.basename(file_path)}", unit="组") as pbar:
+                for i in pbar:
+                    # 获取当前组的行
+                    group_lines = lines[i:i+4]
+                    
+                    # 检查是否已完成
+                    if all(i+j in completed_indices for j in range(len(group_lines))):
+                        # 使用已完成的翻译
+                        for j in range(len(group_lines)):
+                            for line in completed_lines:
+                                if line[0] == i+j:
+                                    translated_lines.append(line[1])
+                                    break
+                        continue
+                    
+                    # 将当前组的行合并成一个字符串
+                    group_text = '\n'.join(group_lines)
+                    print(f"\n翻译第 {i+1}-{min(i+4, len(lines))}/{len(lines)} 行:")
+                    
+                    # 翻译当前组
+                    translated_group = translate_text(group_text)
+                    
+                    # 将翻译结果按行分割并添加到结果列表
+                    translated_lines.extend(translated_group.split('\n'))
+                    
+                    # 更新文件进度
+                    db_manager.update_file_progress(file_path, total_lines, min(i+4, len(lines)), 'in_progress')
+                    
+                    # 显示当前统计信息
+                    stats = translation_stats.get_stats()
+                    pbar.set_postfix(stats)
+                    
+                    # 添加较小的延迟以避免API限制
+                    time.sleep(0.1)
+            
+            # 替换原始内容
+            if translated_lines:
+                # 构建新的body内容
+                new_body_content = '\n'.join(translated_lines)
+                
+                # 替换原始内容中的body部分
+                new_content = content.replace(body_content, new_body_content)
+                
+                # 保存修改后的文件
+                output_dir = config.get('paths', 'output_dir')
+                os.makedirs(output_dir, exist_ok=True)
+                output_path = os.path.join(output_dir, os.path.basename(file_path))
+                
+                with open(output_path, 'w', encoding='utf-8') as f:
+                    f.write(new_content)
+                
+                # 更新完成状态
+                db_manager.update_file_progress(file_path, total_lines, total_lines, 'completed')
+                print(f"文件 {file_path} 翻译完成,已保存到 {output_path}")
+                
+                # 显示最终统计信息
+                print("\n翻译统计信息:")
+                for key, value in translation_stats.get_stats().items():
+                    print(f"{key}: {value}")
+                
+        except KeyboardInterrupt:
+            print("\n检测到中断,保存当前进度...")
+            if 'processed_lines' in locals():
+                db_manager.update_file_progress(file_path, total_lines, processed_lines, 'interrupted')
+            # 显示中断时的统计信息
+            print("\n中断时的统计信息:")
+            for key, value in translation_stats.get_stats().items():
+                print(f"{key}: {value}")
+            raise
+        except Exception as e:
+            print(f"处理文件时出错: {str(e)}")
+            if 'processed_lines' in locals():
+                db_manager.update_file_progress(file_path, total_lines, processed_lines, 'error')
+            raise
+            
+    except Exception as e:
+        print(f"读取文件时出错: {str(e)}")
+        return
+
+def main():
+    ops_dir = config.get('paths', 'input_dir')
+    html_files = [f for f in os.listdir(ops_dir) if f.endswith('.html')]
+    
+    # 按文件名排序
+    html_files.sort()
+    
+    total_files = len(html_files)
+    print(f"找到 {total_files} 个HTML文件需要处理")
+    print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
+    
+    # 初始化数据库连接
+    conn = db_manager.get_connection()
+    
+    try:
+        for file_index, filename in enumerate(html_files, 1):
+            file_path = os.path.join(ops_dir, filename)
+            print(f"\n开始处理第 {file_index}/{total_files} 个文件: {filename}")
+            print("-" * 50)
+            
+            # 检查文件是否已完成
+            progress = db_manager.get_file_progress(file_path)
+            if progress and progress['status'] == 'completed':
+                print(f"文件 {filename} 已经完成翻译,跳过")
+                continue
+            
+            try:
+                process_html_file(file_path, conn)
+                print(f"\n完成第 {file_index}/{total_files} 个文件: {filename}")
+                print("-" * 50)
+            except Exception as e:
+                print(f"\n处理文件 {filename} 时出错: {str(e)}")
+                print("继续处理下一个文件...")
+                continue
+            
+            # 显示当前总体进度
+            completed_files = sum(1 for f in html_files[:file_index] 
+                                if db_manager.get_file_progress(os.path.join(ops_dir, f)) and 
+                                db_manager.get_file_progress(os.path.join(ops_dir, f))['status'] == 'completed')
+            print(f"\n总体进度: {completed_files}/{total_files} 个文件完成 "
+                  f"({round(completed_files*100/total_files, 2)}%)")
+            
+            # 显示统计信息
+            print("\n当前统计信息:")
+            for key, value in translation_stats.get_stats().items():
+                print(f"{key}: {value}")
+            
+            # 在文件之间添加短暂延迟
+            if file_index < total_files:
+                print("\n等待 5 秒后处理下一个文件...")
+                time.sleep(5)
+    
+    except KeyboardInterrupt:
+        print("\n程序被用户中断")
+    finally:
+        db_manager.close()
+        print(f"\n结束时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
+        print("\n最终统计信息:")
+        for key, value in translation_stats.get_stats().items():
+            print(f"{key}: {value}")
+
+if __name__ == "__main__":
+    main()