中国古代才女苏蕙和她的织锦《璇玑图》

博客讲述了才女苏蕙织锦《璇玑图》的故事。其丈夫窦滔被贬又复起后纳偏房,夫妻反目。苏蕙思夫心切或悲愤哀怜,用五彩丝线织成回文《璇玑图》相赠,诗文纵横反复皆成章句,窦滔读之感动,夫妻和好如初。
  引子:在中外语言中,回文向来是显示语言魅力之一面和使用者智力之一斑的一种文字游戏,在不同背景下,历代产生了许多这样的作品。通过分析回文可以展示一个民族语言的多面性、准确性和灵活性,以及所隐含素养之深奥和巨大的艺术表现能力。我们每一个人都要珍视自己的民族语言,切勿有愧于先人的创造与发扬。同时,也应看到时代的发展,不要妄自尊大或者妄自菲薄,轻言一种语言的优劣。

“一代才女,一腔幽怨,一幅旷古绝后的织锦图!”

一个工学博士来谈古论今、评中国古代文学,似有不自知之明之嫌疑,网络上有数不尽专家学者,再去班门弄斧恐怕就要献丑了。因此,为求快捷用彼得整天折腾的Google去搜了一下。果然如我所预见,所得甚多,其中不乏大家之作。恐为追求详尽、转而陷入专业史料研究,随强迫自己任意抽取几家作为参考 [i],在其中随意剪贴。目的以明了大概为准,还望专业学者见谅,万勿责怪鄙人生吞活剥。

回文诗是中国文苑一奇葩,很多是古代妇女在不能直言幽情暗恨时之苦心之作。其中以奇巧多变、文彩斐然而著称的,当推前秦苏蕙的《璇玑图》。朱存孝《回文类聚序》云:“自苏伯玉妻《盘中诗》为肇端,窦滔妻作《璇玑图》而大备。”

盘中诗,是将诗句写于盘中,屈曲成文,词意回环。它以晋苏伯玉妻的《盘中诗》而得名。其中不少诗句可以倒读,已是道地的回文。此后仿作者众,如唐初某女子有《磐(下为革)鉴图·转轮构枝八花鉴铭》,王勃称它“藻丽反复,文字萦回,句读曲屈,韵谐高雅”。唐会昌中,又有侯氏《绣龟形诗》(见《全唐诗》)。因此,《盘中诗》不妨认为是回文诗的雏型。


盘中诗
    
山树高,鸟鸣悲。泉水深,鲤鱼肥。
空仓雀,常苦饥。吏人妇,会夫稀。
出门望,见白衣。谓当是,而更非。
还入门,中心悲。北上堂,西入阶。
急机绞,杼声催。长叹息,当语谁?
君有行,妾念之。出有日,还无期。
 结巾带,长相思。君忘妾   未知之;

 妾忘君   罪當治。妾有行,宜知之。

 黄者金,白者玉。高者山,下者谷。

  姓为苏,字伯玉。 人才多,智谋足;

 家居长安身在蜀,何惜马蹄归不数。
 羊肉千斤酒面斛,令君马肥麦与粟。
 今时人,直四足。与其书,不能读。
当从中央周四角。

据唐代房玄龄《晋书》卷九十六记载:窦滔妻苏氏,名蕙,字若兰,始平(今陕西兴平)人,善属文。她的丈夫窦滔为符坚时的秦州(今四川)刺史,后被徙流沙(今甘肃敦煌),苏蕙思夫心切,于是织锦为回文《璇玑图》相赠。共841字,回环宛转,词语凄惋。

 

 

图1   美女苏蕙之《璇玑图》

  古今论《璇玑图》者甚多,而以唐代武则天记叙较详,影响较大。武则天记叙苏蕙织锦的缘由与《晋书》迥然不同。武则天当权执政后,于“听政之暇,留心坟典,散帙之次,偶见斯图,因述若兰之才,复美连波之悔过”,于是撰有《窦滔妻苏氏织锦回文记》,按武则天的说法,苏蕙是武功(今属陕西)人,陈留令苏道质第三女,她“识知精明,仪容秀丽,谦默自守,不求显扬”,长到16岁时,嫁给秦州刺史窦滔,深得丈夫的敬重。窦滔,字连波,右将军窦子真之孙窦朗之第二子,长得风神用伟,又精通经史,能文善武。苻坚对他十分器重,委以显职,皆有政绩,颇有口碑。迁任秦州刺史,因忤旨谪戌敦煌。后因攻下晋之襄阳(379年),复起用窦滔为安南将军,镇守襄阳。谁知窦滔天长日久,纳了偏房,夫妻自此反目。若兰悲愤哀怜,月夜空帐,孤寂怨恨,思君心伤,竟成诗七千九百多首。因无法表达自己忠贞不渝之爱,于是情丝绵绵用五彩丝线织成诗文,长宽八寸,八百四十一字,“五采相宜,莹心耀目。其锦纵横八寸,题诗二百余首,计八百余言,纵横反复,皆成章句。其文点画无缺,才情之妙,超今迈古,名曰《璇玑图》。”一片衷情倾注其中。窦滔接到织锦回文诗,反覆吟咏,不觉泣下,盛礼迎接若兰,夫妻和好如初,恩爱愈重。

由于苏蕙的回文织锦,奇巧绝伦,在后世产生的影响极大,世人竟抄不绝,王侯抄藏于大内,文士摹贮于箱箧,商旅书题于驿馆,流传甚广。宋代桑世昌把它编入《回文类聚》书中;明弘治年间康万民、康禹民专门撰写了《璇玑图诗读法》一书;清代李汝珍在小说《镜花园》第四十一回《观奇图喜遇佳文,述御旨欣逢盛典》中褒其事;清代李渔则有《合锦回文传》小说16卷;宋代才女朱淑真曾重金购得《璇玑图》,玩赏之余,手书有《璇玑图记》,影响之大可与武则天之记相提并论;不少著名戏曲家还将苏蕙织锦回文写成剧本,元代戏曲大家关汉卿曾创作有《苏氏造织锦回纹》杂剧;明代无名氏又有《织锦回文》传奇(见《五宫正始》);又明成化刻本《新刊耀目冠场擢奇风月锦囊》中亦收有《窦滔回文记》;清代著名戏曲家洪升撰有《回文锦》传奇;孔广林则有《璇玑图》杂剧;苏蕙作为才女的形象,还被人撰文作诗加以赞颂,或绘成彩像以寄近思,更有人仿效她写成回文诗、词、曲、赋、铭、对联和断句,或制作回文,写成形形色色、变幻多端的图案绘刻在器物上。苏蕙的《璇玑图》风靡千百年来的文苑艺坛。

织锦回文诗许多人看不懂,苏若兰笑言:“徘徊宛转,自为语言,非我佳人,莫之能解。”

对于《璇玑图》如何读,古人曾专门有研究,说法很多,不能一一备述。朱淑真考据图上有五言、四言、三言和七言回文诗,可周流而读;武则天说图内诗“纵横反复,皆成章句”,是言可以顺读、反读、横读、斜读、交互读、蛇行读、退一字读、叠一字读、间一句读、左右旋读,皆成诗词,构思奇巧,旷古绝后。每首诗语句节奏明快,对仗工整,韵律和谐。如诉如怨;情真意切。读之,伤感处催人泪下,愉快处使人破涕而笑,真可谓妙手天成。故宋代著名诗人黄庭坚有诗称赞云:千诗织就回文锦,如此阳台暮雨何?亦自英灵苏蕙子,只无悔过窦连波。

璇玑回文诗虽然是一种杂体诗,但在我国文学艺术史上却占有特殊地位,一千六百多年来,研究它的人世代不绝。唐代武则天推崇备至,据其《织锦回文记》中说,可读诗二百余首,但读法失传。宋代,因原诗色彩脱落,迷其句读,均不过百首。黄庭坚曰“千诗织就回文锦”,也未能读到千首。到了明孝宗时起宗道人把璇玑图分解为七个分图,读诗达三千五百七十二首。后来康万民读诗达四千二百零六首,乾隆四十六年,扶风知事熊家振撰修的扶风县志,言其读诗达九千九百五十八首。至今尚无定数。

兹仅录组诗数首以飨读者:

仁智怀德圣虞唐,贞妙显华重荣章。

臣贤唯圣配英里,伦匹离飘浮江湘。

钦岑幽岩峻嵯峨,深渊重涯经网罗。

林阳潜曜翳英华,沉浮翼逝颓流沙。


岑幽岩峻嵯峨深,渊重涯经网罗林。

阳潜曜翳英华沉,浮翼逝颓流砂鳞。


邵南周风,兴自后妃。

卫郑楚樊,历节中围,

咏歌长叹,不能奋飞。

齐南双发,歌我哀衣。

曜流华观,冶容为谁?

情微宫羽,同声相追。

诗情明显怨,怨义兴理辞;

辞丽作比端,端无终始诗。

嗟叹怀,所离经。

遐旷路;伤中情。

家无君,房帏清,

华饰容,朗镜明。

葩粉光,珠曜英。

多思感,谁为荣?


怀所离经,伤路旷遐。

君房帏清,朗容饰华。

光珠曜英,谁感思多?

寒岁识凋松,贞物知始终。

颜丧改华容,仁贤别行士。

嗟叹怀所离径,遐旷路伤中情;

家无君房帏清,华饰容朗镜明。

葩纷光珠耀英,多思感谁为荣?

周风兴自后妃,楚樊厉节中闲。

长叹不能奋飞,双发歌我衮衣;

华观冶容为谁?宫羽同声相追。

象这样的诗可以组成很多,有兴趣时不妨自己尝试一下去发现新的读法。

即使撇开回文诗不论,单就织锦工艺来说,这也是中国织锦史上第一次用文字织成的锦,一反过去织花纹图案的常规,800多字织在8寸见方的锦上。而且“点画无缺”,又“五采相宜,莹心耀目”,论其技艺,可谓超古迈今,为千古绝艺,这确实是一个了不起的创举。实际上,就中国工艺美术史而言,苏蕙称得上为最早见诸文献记载的织锦女工艺家,她的回文织锦《璇玑图》则是弥为珍贵的史料。

附录1: 苏蕙简介

  苏惠,字若兰,武功人,约生于秦王苻坚永兴元年(公元357年)。当地百姓传说,若兰容貌秀丽,举止娴雅。她自小聪颖过人,三岁学画,四岁作诗,五岁抚琴,九岁便学会了织锦。十岁刚过,即可描龙绣凤,琴棋书画的神韵,全被她运用到了织锦之中。远近乡邻将她的超人之才,传成了神话。一些豪门望族上门求婚,均被谢绝。一日,逢法门寺庙会,巧遇一射飞雁、穿池鱼的英武少年,其为右将军窦真之孙,名叫窦滔,自幼习文练武,相貌不凡,若兰顿生爱慕之情。经人提亲,结成百年之好。

不料好景不长,窦滔因厌战不从军令,被革职发配到流沙(今甘肃敦煌),后来遇到了歌妓赵阳台,娶作了偏房。这赵阳台,不但能歌善舞,而且娇媚可人,引得窦滔对她宠爱不已。后来,窦滔奉命出镇襄阳,本欲携妻妾同往,可苏蕙为赵妾之事赌气不从,窦滔只带着赵阳台赴任。

苏蕙独守长安空闺中,日子稍长,便感寂寞难耐。丈夫在身边时,不能感觉出他太多好处,现在一离开,思念之情却是刻骨铭心,不由得悔恨当初的负气。悔恨之余,她便用吟诗作文来排遣孤寂的时光。后突发奇想,又经反复推敲构思,将所写诗词编排整理暗藏在29行、29列的文字里。然后怀着满腔幽思、废寝忘食地把诗词织在八寸锦缎上。苏蕙把这副锦缎命名为“璇玑图”。璇玑,原意是指天上的北斗星,之所以取名璇玑是指这副图上的文字,排列象天上的星辰一样玄妙而有致,知之者可识,不知者望之茫然。其中更暗寓她对丈夫的恋情,就象星星一样深邃而不变。

    “璇玑图”织好后,苏蕙派人送往襄阳交给窦滔。旁边的人见了这图,都不明其意,可窦滔捧着“璇玑图”,细细体味,竟完全读懂了妻子的一片深情。当即,窦滔派遣了人马,到长安接来了苏蕙。自此,夫妻恩爱偕老。

附录2: 织锦回文记(唐武则天)

前秦荷坚时,秦州刺史,扶风窦滔妻苏氏,陈留令武功道质第三女也。名慧,字若兰。识知精明,仪容秀丽;谦默自守,不为显场。年十六归于窦氏,滔甚爱之;然苏性近于急,颇伤嫉妨。滔字连波,右将军于真之孙朗之第二子也。风神秀伟,精通经史,允文允武,时论尚之,苻坚委以心普之任,备历显职,皆有政闻,迁秦州刺史。件旨,谪戊敦煌。会坚克晋襄阳,虑有危逼,藉滔才略,乃拜安南将军,留镇襄阳。初,滔有宠姬赵阳台,歌舞之妙,无出其右,滔置之别所。苏氏知之,求而获焉,苦加捶辱,滔深以为憾。阳台又专苏氏之短,谗毁交至,益恨焉。苏氏时年二十一,滔将镇襄阳,邀苏同往,苏氏忿之,不与偕行。滔携阳台之任,绝苏音问。苏氏悔恨自伤。因织锦为回文,五彩相宣,莹心耀目,纵横八寸,题诗二百余首,计八百余言,纵横反复,皆成文章。其文点画无缺,才情之妙,超古迈今,名曰《璇玑图》。然读者不能悉通。苏氏笑曰:徘徊宛转,自成于章。非我佳人,莫之能解,遂发苍头,至襄阳焉。滔省览锦云,感其妙绝,因渝阳台令谢怒;而具车徒,感礼邀迎苏氏,归于汉南,恩好愈重。苏氏著文词五千余言,属隋季丧乱,文章散落,追求不获,而锦字回文盛见传写,是近代闺怨之宗旨。属文之土,咸龟镜焉。朕听政之暇,留心坟典,散帐之次,偶见斯图,因述若兰之多才,复美连波之悔过,遂制此记,以示将来也。

另:

苏蕙之特别提醒

女人:“二奶”的问题可能要绵延几千年,要与“二奶”斗智,莫要斗气;

男人:你们和“二奶”之间也会有麻烦的。

苏蕙定律

破镜重圆的几率约等于《璇玑图》出现的几率。

苏蕙写真照

暂无,更可能永远无。

参考链接: http://unit.xjtu.edu.cn/unit/yyb/xsh/campuslife/fantasy/section/by-talk/huiwen.htm

http://www.chinanews.com.cn/news/2004year/2004-05-20/26/438823.shtmlhttp://www.cj888.com/book/ji/p/z/zgld/007.htmhttp://www.yasue.cc/si_chui1.htmlhttp://sxxx.sei.sn.cn/xxb/business/fms/qingsi.htm
你的问题中提到“使用才女安神”,这似乎是一个输入错误或误解的表达,因为“才女安神”不是一个已知的技术、库、框架或编程术语。结合上下文你可能是想问: > **“我如何实现 list 数据显示一个流程,使用 Canvas?”** 如果是这样,那么我们可以理解为: 你有一组列表(list)形式的数据(比如 JSON 数组),每个元素代表一个节点或连接关系,你想用 HTML5 的 `<canvas>` 来把这些数据显示成一个**流程**。 下面我将基于这个正确理解来详细回答。 --- ## ✅ 目标:使用 Canvas 将 List 数据渲染为流程 假设你有一个如下结构的 `list` 数据(节点列表 + 连线关系): ```js const data = { nodes: [ { id: 1, label: '开始', x: 100, y: 100 }, { id: 2, label: '处理数据', x: 300, y: 100 }, { id: 3, label: '判断结果', x: 500, y: 100 }, { id: 4, label: '结束', x: 700, y: 100 } ], edges: [ { from: 1, to: 2 }, { from: 2, to: 3 }, { from: 3, to: 4 } ] }; ``` 我们要做的就是: 1. 解析这个 list 数据; 2. 在 Canvas 上绘制矩形节点带箭头的连线; 3. 支持基本交互(如拖拽)。 --- ### ✅ 完整代码示例:用 List 数据驱动 Canvas 流程 ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <title>Canvas - List 数据绘制流程</title> <style> canvas { border: 1px solid #aaa; display: block; margin: 20px auto; cursor: move; } </style> </head> <body> <h3 style="text-align: center;">基于 List 数据的 Canvas 流程</h3> <canvas id="canvas" width="900" height="400"></canvas> <script> const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // 输入:List 数据(可来自接口) const flowData = { nodes: [ { id: 1, label: '开始', x: 100, y: 100, width: 100, height: 40 }, { id: 2, label: '处理数据', x: 300, y: 100, width: 100, height: 40 }, { id: 3, label: '判断结果', x: 500, y: 100, width: 100, height: 40 }, { id: 4, label: '结束', x: 700, y: 100, width: 100, height: 40 } ], edges: [ { from: 1, to: 2 }, { from: 2, to: 3 }, { from: 3, to: 4 } ] }; let dragging = false; let selectedNode = null; // 工具函数:判断点是否在节点内 function isInside(point, node) { return point.x > node.x && point.x < node.x + node.width && point.y > node.y && point.y < node.y + node.height; } // 绘制节点 function drawNode(node) { const { x, y, width, height, label } = node; // 节点背景 ctx.fillStyle = '#f0f8ff'; ctx.fillRect(x, y, width, height); ctx.strokeStyle = '#333'; ctx.lineWidth = 1.5; ctx.strokeRect(x, y, width, height); // 文字居中 ctx.fillStyle = '#000'; ctx.font = '14px sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText(label, x + width / 2, y + height / 2); } // 绘制带箭头的连线 function drawEdge(fromNode, toNode) { const fromX = fromNode.x + fromNode.width / 2; const fromY = fromNode.y + fromNode.height; const toX = toNode.x + toNode.width / 2; const toY = toNode.y; const angle = Math.atan2(toY - fromY, toX - fromX); const headLen = 10; ctx.beginPath(); ctx.moveTo(fromX, fromY); ctx.lineTo(toX, toY); ctx.strokeStyle = '#333'; ctx.lineWidth = 2; ctx.stroke(); // 箭头 ctx.beginPath(); ctx.moveTo(toX, toY); ctx.lineTo(toX - headLen * Math.cos(angle - 0.3), toY - headLen * Math.sin(angle - 0.3)); ctx.lineTo(toX - headLen * Math.cos(angle + 0.3), toY - headLen * Math.sin(angle + 0.3)); ctx.closePath(); ctx.fillStyle = '#333'; ctx.fill(); } // 渲染整个流程 function render() { ctx.clearRect(0, 0, canvas.width, canvas.height); // 先画边(避免盖住节点) flowData.edges.forEach(edge => { const from = flowData.nodes.find(n => n.id === edge.from); const to = flowData.nodes.find(n => n.id === edge.to); if (from && to) { drawEdge(from, to); } }); // 再画节点 flowData.nodes.forEach(drawNode); } // 鼠标事件支持拖拽 canvas.addEventListener('mousedown', e => { const rect = canvas.getBoundingClientRect(); const point = { x: e.clientX - rect.left, y: e.clientY - rect.top }; for (const node of flowData.nodes) { if (isInside(point, node)) { dragging = true; selectedNode = node; break; } } }); canvas.addEventListener('mousemove', e => { if (dragging && selectedNode) { const rect = canvas.getBoundingClientRect(); selectedNode.x = e.clientX - rect.left - selectedNode.width / 2; selectedNode.y = e.clientY - rect.top - selectedNode.height / 2; render(); // 实时更新 } }); canvas.addEventListener('mouseup', () => { dragging = false; selectedNode = null; }); // 初始渲染 render(); </script> </body> </html> ``` --- ### 🔍 代码说明: | 功能 | 实现方式 | |------|----------| | 数据驱动 | 使用 `flowData.nodes` `flowData.edges` 存储流程信息 | | 渲染顺序 | 先画边后画节点,防止线条覆盖节点 | | 拖拽交互 | 通过鼠标事件 + 坐标检测实现 | | 箭头绘制 | 使用三角函数算箭头方向 | --- ### 📦 可扩展性建议: - **从后端获取数据**:把 `flowData` 替换为 `fetch('/api/process')` 返回的 JSON。 - **添加新节点**:提供按钮,点击后在数据中 push 新节点并重新 render。 - **自动布局**:引入简单算法(如横向排布、DAG 布局)自动定位节点位置。 - **保存状态**:将修改后的 `flowData` 同步回服务器或本地存储。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值