# lv-markdown-in **Repository Path**: luvi/lv-markdown-in ## Basic Information - **Project Name**: lv-markdown-in - **Description**: 🔥 由原生技术主导的渲染,让 Markdown 在鸿蒙世界原生绽放! lv-markdown-in 支持在 OpenHarmony、HarmonyOS 系统运行。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: https://ohpm.openharmony.cn/#/cn/detail/@luvi%2Flv-markdown-in - **GVP Project**: No ## Statistics - **Stars**: 34 - **Forks**: 6 - **Created**: 2023-11-26 - **Last Updated**: 2025-10-14 ## Categories & Tags **Categories**: markdown-utils **Tags**: lv-markdown-in, Markdown, HarmonyOS, OpenHarmony ## README ## 如何运行? 1. 拉取代码,使用**自动生成的签名**即可运行。 2. entry 模块做调试使用。 3. markdown 模块中为项目关键代码。 --- ![宣传图](https://agc-storage-drcn.platform.dbankcloud.cn/v0/shangshu-data-rfayj/markdown_banner.png?token=207bf00f-9060-4ec6-9c67-5de906c4da42) ## 简介 鸿蒙原生 **Markdown** 解析与渲染三方库,一款专为 **OpenHarmony** 与 **HarmonyOS** 系统设计的原生 Markdown 渲染解决方案。让 Markdown 内容在界面中拥有更平滑的性能表现与更统一的视觉体验。 该库以高性能与原生体验为核心,提供 **30+ 可定制样式 API**,助力开发者灵活定义 Markdown 内容的视觉风格与交互体验。从基础文本排版到复杂组件布局,都能精确适配系统特性。 充分结合鸿蒙资源机制,支持 **三种内容加载模式**: - 纯文本加载:适用于动态内容; - 资源文件加载:便于内置模板与预设内容展示; - 沙箱文件加载:保障用户内容安全与私有化存储。 适配 **$rawfile 原生资源图片加载能力** ,并支持 **html常用标签解析** 与 **图片加载代理**,兼顾 Markdown 与富文本场景的灵活性。 ## lv-markdown-in 目前支持 | 基本语法 | 拓展语法 | |---------------------------------------------------------------------|-------------------------------------------------------------------------| | [标题](https://markdown.com.cn/basic-syntax/headings.html) | [表格](https://markdown.com.cn/extended-syntax/tables.html) | | [段落](https://markdown.com.cn/basic-syntax/paragraphs.html) | [代码块](https://markdown.com.cn/extended-syntax/fenced-code-blocks.html) | | [换行](https://markdown.com.cn/basic-syntax/line-breaks.html) | [脚注](https://markdown.com.cn/extended-syntax/footnotes.html) | | [强调(粗体、斜体、粗斜体)](https://markdown.com.cn/basic-syntax/emphasis.html) | [任务列表](https://markdown.com.cn/extended-syntax/task-lists.html) | | [引用块](https://markdown.com.cn/basic-syntax/blockquotes.html) | [删除线](https://markdown.com.cn/extended-syntax/strikethrough.html) | | [列表](https://markdown.com.cn/basic-syntax/lists.html) | [支持html常用标签解析](https://ohpm.openharmony.cn/#/cn/detail/@luvi%2Fhtml2md) | | [代码](https://markdown.com.cn/basic-syntax/code.html) | | | [分割线](https://markdown.com.cn/basic-syntax/horizontal-rules.html) | | | [链接](https://markdown.com.cn/basic-syntax/links.html) | | | [图片](https://markdown.com.cn/basic-syntax/images.html) | | ## 立即使用 1.运行命令 ``` shell ohpm install @luvi/lv-markdown-in ``` 2.在项目中引入插件 ``` javascript import { Markdown } from @luvi/lv-markdown-in ``` 3.在代码中使用 ``` javascript Markdown({ text: "想让文字像在原生世界里呼吸,就得从**渲染**开始" }) ``` ## 升级指南 2.0 及之前版本中的 LvMarkdownIn() 组件已弃用,可以**使用 3.0 及以上导出的 Markdown() 组件,体验最新版本的改动**。 **组件及字段变更:** | 旧版本 | 变更 | 说明 | |------------------|-------------|-------------------------------------------------------------| | ~~LvMarkdownIn~~ | Markdown | **使用 Markdown() 组件,体验最新版本的改动**。 | | | controller | 新增 MarkdownController 控制器。
样式、图片,超链接点击监听拦截、图片代理均由此控制器完成。 | | text | text | markdown 文本内容,保持不变。 | | ~~loadMode~~ | mode | 加载模式,字段名称调整。 | | context | context | 上下文,保持不变。 | | rawfilePath | rawfilePath | 资源文件路径,保持不变。 | | sandboxPath | sandboxPath | 沙箱文件路径,保持不变。 | | ~~loadCallBack~~ | callback | 字段名称调整。 | ## 多种内容加载模式(纯文本、资源文件、沙箱文件) ### 1. 纯文本模式(text) ``` javascript Markdown({ text: "想让文字像在原生世界里呼吸,就得从**渲染**开始", mode: "text", // 默认 text 可省略 callback: { // callback 可省略 complete: () => { console.log("Markdown component load success.") }, fail: (code: number, message: string) => { console.error("Markdown component load error. code: " + code + ", message: " + message) } } }) ``` ### 2. 资源文件模式(rawfile) 使用资源文件模式,`需要将 mode 字段设置为 rawfile`,rawfilePath 需要填写模块中 rawfile 目录的文件路径,同时需要传递应用上下文context,callback 为可选参数,用于资源加载时的回调检查。 ``` javascript Markdown({ mode: "rawfile", context: getContext(), // 资源文件模式必填参数 rawfilePath: "t/text.md", // 资源文件地址 callback: { // callback 可省略 complete: () => { console.log("Markdown component load success.") }, fail: (code: number, message: string) => { console.error("Markdown component load error. code: " + code + ", message: " + message) } } }) ``` ### 3. 沙箱文件模式(sandbox) 使用沙箱文件模式,`需要将 mode 字段设置为 sandbox`,callback 为可选参数,用于资源加载时的回调检查。 ``` javascript Markdown({ mode: "sandbox", sandboxPath: getContext().getApplicationContext().filesDir + "/t2/text.md", callback: { // callback 可省略 complete: () => { console.log("Markdown component load success.") }, fail: (code: number, message: string) => { console.error("Markdown component load error. code: " + code + ", message: " + message) } } }) ``` ## 超链接、图片点击,自定义控制跳转行为 需要注意的是,使用拦截行为后,`return true` 才可拦截正常拦截库中默认打开行为,`return false` 则不拦截,但会进入该逻辑。 ``` javascript // 导入 MarkdownController import { MarkdownController } from '@luvi/lv-markdown-in' // 注册超链接点击回调,return true 则表示拦截,自行处理超链接跳转逻辑 this.markdownController.setHyperlinkClickListener((title: string, src: string) => { console.log("拦截跳转 title: " + title) // 标题 console.log("拦截跳转 src: " + src) // 网页地址 promptAction.showToast({ message: title + "\n" + src }) return true }) // 注册图像点击回调,return true 则表示拦截,自行处理图像展示逻辑 this.markdownController.setImageClickListener((src: string) => { console.log("拦截跳转 src: " + src) // 图片地址 promptAction.showToast({ message: src }) return true }) ``` ## 动态样式改变 需在 Markdown 渲染完成后动态改变样式,可以**绑定 MarkdownController 至对应 Markdown 组件**后直接**调用 MarkdownController 的多样化接口设置样式**。 ## 深色模式 在代码中引用自定义的颜色资源值,使用 `$r` 加载自定义颜色资源,系统将自动在应用深浅色变化时,加载对应限定词目录下的资源文件,从而改变 Markdown 元素的颜色完成深浅色适配。详细可参阅文章:[ArkUI深色模式适配指南](https://developer.huawei.com/consumer/cn/blog/topic/03195774342899131) ```arkts import { Markdown, MarkdownController } from '@luvi/lv-markdown-in'; @Entry @Component struct Dark { controller: MarkdownController = new MarkdownController() @State content: string = ` ## 鸿蒙原生应用开发笔记 *鸿蒙原生*,意味着**纯净**与**性能**的平衡。 > 想让文字像在原生世界里呼吸,就得从渲染开始。 ` aboutToAppear(): void { // 深色模式适配 this.controller .setTitleColor($r("app.color.title")) .setTextColor($r("app.color.primary_text")) .setQuoteBackgroundColor($r("app.color.quote_bgc")) } build() { Scroll() { Markdown({ controller: this.controller, text: this.content }) } .padding({ left: 15, right: 15, top: 60, }) } } ``` ## Markdown 承载 Markdown 内容渲染的组件。项目采用 v1 + v2 装饰器混合开发,可同时在 v1 或 v2 项目中使用。 **装饰器类型:** @Component **参数** | 名称 | 类型 | 必填 | 装饰器类型 | 说明 | |-------------|-----------------------------------------------|----|-------|-------------------------------------------------------------------------------------------------------------------------------------| | controller | string \| undefined | 否 | @Prop | 通过 MarkdownController 可以控制 Markdown 组件各种行为,如:自定义样式、设置图片点击拦截、设置超链接点击拦截等。 | | text | string \| undefined | 否 | @Prop | markdown 文本内容。 | | mode | "text" \| "rawfile" \| "sandbox" \| undefined | 否 | @Prop | Markdown 组件加载模式,支持纯文本加载、沙箱文件加载、资源文件加载,不填默认为 "text"。 | | context | Context \| undefined | 否 | / | mode 字段设置为 rawfile 时, context 为必填项。 | | rawfilePath | string \| undefined | 否 | @Prop | mode 字段设置为 rawfile 时, rawfilePath 为必填项,需传入 resources/rawfile 目录下对应的 rawfile 文件路径。 | | sandboxPath | string \| undefined | 否 | @Prop | mode 字段设置为 sandbox 时, sandboxPath 为必填项,需传入沙箱 text/md 文件的完整沙箱路径。
例:getContext().getApplicationContext().filesDir + "/t2/text.md"。 | | callback | MdCallback \| undefined | 否 | / | Markdown 组件加载状态结果告知。用于组件加载完成时,组件加载失败时回调,并返回错误码 code,错误信息 message,可用于问题分析。 | ## MarkdownController Markdown 组件的控制器。可以将此对象绑定至 Markdown 组件,然后通过它控制 Markdown 组件的自定义样式。同一个控制器可以控制多个 Markdown 组件,**多个 API 支持链式调用语法**。 - v1 版本开发中不支持使用 @State 装饰器进行修饰,无需使用装饰器修饰。 - v2 版本开发中可支持 v2 装饰器使用。 - 当然,您也可以完全不选择使用装饰器,这并不影响组件的正常渲染。 ### 导入对象 ``` javascript // 导入 MarkdownController import { MarkdownController } from '@luvi/lv-markdown-in' // 获取对象 markdownController: MarkdownController = new MarkdownController() ``` ### setTitleColor setTitleColor(color: ResourceColor) 设置标题字体颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------|---------------|----|----------------| | color | ResourceColor | 是 | 设置标题字体颜色,默认:32 | **使用示例** ``` javascript this.controller.setTitleColor("#000") ``` ### setTitleSize setTitleSize( titleSize: [ResourceStr | number, ResourceStr | number, ResourceStr | number, ResourceStr | number, ResourceStr | number, ResourceStr | number]) 设置标题字号(1-6级)。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-----------|---------------------------------------------------------------------------------------------------------------------------------------------|----|--------------------------------------------------------------| | titleSize | [ResourceStr \| number, ResourceStr \| number, ResourceStr \| number, ResourceStr \| number, ResourceStr \| number, ResourceStr \| number] | 是 | 设置标题1-6级字号。数组中0-5项分别为1-6级标题字号,默认: [30, 28, 24, 20, 18, 16] 。 | **使用示例** ``` javascript this.controller.setTitleSize([30, 28, 24, 20, 18, 16]) ``` ### setTitleLineHeight 设置标题行高(1-6级)。 setTitleLineHeight( lineHeights: [ResourceStr | number, ResourceStr | number, ResourceStr | number, ResourceStr | number, ResourceStr | number, ResourceStr | number]) **参数** | 参数名 | 类型 | 必填 | 说明 | |-------------|---------------------------------------------------------------------------------------------------------------------------------------------|----|--------------------------------------------------------------| | lineHeights | [ResourceStr \| number, ResourceStr \| number, ResourceStr \| number, ResourceStr \| number, ResourceStr \| number, ResourceStr \| number] | 是 | 设置标题1-6级行高。数组中0-5项分别为1-6级标题行高,默认: [36, 34, 30, 26, 24, 22] 。 | **使用示例** ``` javascript this.controller.setTitleLineHeight([36, 34, 30, 26, 24, 22]) ``` ### setTextColor setTextColor(textColor: ResourceColor) 设置普通文本字体颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-----------|---------------|----|----------------------------| | textColor | ResourceColor | 是 | 设置普通文本的颜色,默认:"#e61f1f39" 。 | **使用示例** ``` javascript this.controller.setTextColor("#e61f1f39") ``` ### setTextLineHeight setTextLineHeight(textLineHeight: ResourceStr | number) 设置普通文本字体行高。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------------|-----------------------|----|---------------------| | textLineHeight | ResourceStr \| number | 是 | 设置普通文本的行高,默认:24vp 。 | **使用示例** ``` javascript this.controller.setTextLineHeight(24) ``` ### setTextSize setTextSize(textSize: ResourceStr | number) 设置普通文本字号。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------|-----------------------|----|---------------------| | textSize | ResourceStr \| number | 是 | 设置普通文本的字号,默认:16fp 。 | **使用示例** ``` javascript this.controller.setTextSize(16) ``` ### setInlineCodeColor setInlineCodeColor(inlineCodeColor: ResourceColor) 设置行内代码颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-----------------|---------------|----|--------------------------| | inlineCodeColor | ResourceColor | 是 | 设置行内代码的颜色,默认:"#F4271C" 。 | **使用示例** ``` javascript this.controller.setInlineCodeColor("#F4271C") ``` ### setInlineCodeBackgroundColor setInlineCodeBackgroundColor(inlineCodeBackgroundColor: ResourceColor) 设置行内代码背景颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |---------------------------|---------------|----|------------------------------| | inlineCodeBackgroundColor | ResourceColor | 是 | 设置行内代码的背景颜色,默认:"#0eff0000" 。 | **使用示例** ``` javascript this.controller.setInlineCodeBackgroundColor("#0eff0000") ``` ### setQuoteBorderColor setQuoteBorderColor(quoteBorderColor: ResourceColor) 设置引用块左边颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |------------------|---------------|----|---------------------------| | quoteBorderColor | ResourceColor | 是 | 设置引用块左边的颜色,默认:"#F4271C" 。 | **使用示例** ``` javascript this.controller.setQuoteBorderColor("#F4271C") ``` ### setQuoteBackgroundColor setQuoteBackgroundColor(quoteBackgroundColor: ResourceColor) 设置引用块背景颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------------------|---------------|----|-----------------------------| | quoteBackgroundColor | ResourceColor | 是 | 设置引用块的背景颜色,默认:"#ccf5f7fa" 。 | **使用示例** ``` javascript this.controller.setQuoteBackgroundColor("#ccf5f7fa") ``` ### setCodeBlockTheme setCodeBlockTheme(codeBlockTheme: CodeTheme) 设置代码块主题。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------------|-------------------|----|-----------------------| | codeBlockTheme | "light" \| "dark" | 是 | 设置代码块的主题,默认:"light" 。 | **使用示例** ``` javascript this.controller.setCodeBlockTheme("light") ``` ### setCodeBlockIdxState setCodeBlockIdxState(codeBlockIdxState: boolean) 设置代码块索引展示状态。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------------------|---------|----|-------------------------| | codeBlockIdxState | boolean | 是 | 设置代码块索引的展示状态,默认:false 。 | **使用示例** ``` javascript this.controller.setCodeBlockIdxState(false) ``` ### setImageWidth setImageWidth(imageWidth: ResourceStr | number | null) 设置图片宽度。 **参数** | 参数名 | 类型 | 必填 | 说明 | |------------|-------------------------------|----|---------------------| | imageWidth | ResourceStr \| number \| null | 是 | 设置图片的宽度,默认:"100%" 。 | **使用示例** ``` javascript this.controller.setImageWidth("100%") ``` ### setImageMaxWidth setImageMaxWidth(imageMaxWidth: ResourceStr | number | null) 设置图片最大宽度。 **参数** | 参数名 | 类型 | 必填 | 说明 | |---------------|-------------------------------|----|---------------------| | imageMaxWidth | ResourceStr \| number \| null | 是 | 设置图片的最大宽度,默认:null 。 | **使用示例** ``` javascript this.controller.setImageMaxWidth(null) ``` ### setImageHeight setImageHeight(imageHeight: ResourceStr | number | null) 设置图片高度。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------------|-------------------------------|----|-------------------| | imageHeight | ResourceStr \| number \| null | 是 | 设置图片的高度,默认:null 。 | **使用示例** ``` javascript this.controller.setImageHeight(null) ``` ### setImageMaxHeight setImageMaxHeight(imageMaxHeight: ResourceStr | number | null) 设置图片最大高度。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------------|-------------------------------|----|---------------------| | imageMaxHeight | ResourceStr \| number \| null | 是 | 设置图片的最大高度,默认:null 。 | **使用示例** ``` javascript this.controller.setImageMaxHeight(null) ``` ### setImageClickListener setImageClickListener(event: (src: string) => boolean) 设置图片点击监听回调,**return false 不拦截,return true 拦截**。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------|--------------------------|----|----------------------------------------------------| | event | (src: string) => boolean | 是 | 设置图片的点击监听回调,默认:(src: string) => { return false } 。 | **使用示例** ``` javascript this.controller.setImageClickListener((src: string) => { console.log("拦截跳转 src: " + src) // 图片地址 promptAction.showToast({ message: src }) return true }) ``` ### setImageLoadProxy setImageLoadProxy(event: (src: string) => string) 设置图片加载代理,回调图片加载前的 src ,返回值需返回处理后的 src 。 仅支持 http, https 协议的图片设置加载代理,$rawfile 本地资源图片不支持设置代理。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------|-------------------------|----|-----------------------------------------------| | event | (src: string) => string | 是 | 设置图片加载代理,默认:(src: string) => { return src } 。 | **使用示例** ``` javascript this.controller.setImageLoadProxy((src) => { console.log("imageLoadSrc > " + src) // 在这里处理完整的图片 url 后 return 即可。 src = "http://xxxx.example/" + src return src }) ``` ### setHyperlinkTextColor setHyperlinkTextColor(hyperlinkTextColor: ResourceColor) 设置超链接文字颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |--------------------|---------------|----|---------------------------| | hyperlinkTextColor | ResourceColor | 是 | 设置超链接的文字颜色,默认:"#0664EC" 。 | **使用示例** ``` javascript this.controller.setHyperlinkTextColor("#0664EC") ``` ### setHyperlinkUnderlineState setHyperlinkUnderlineState(hyperlinkUnderlineState: boolean) 设置超链接下划线展示状态。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------------------------|---------|----|-----------------------------| | hyperlinkUnderlineState | boolean | 是 | 设置超链接下划线的展示状态,默认:false 不展示。 | **使用示例** ``` javascript this.controller.setHyperlinkUnderlineState(false) ``` ### setHyperlinkClickListener setHyperlinkClickListener(event: (title: string, src: string) => boolean) 设置超链接点击监听回调,**return false 不拦截,return true 拦截**。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------|-----------------------------------------|----|-----------------------------------------------------| | event | (title: string, src: string) => boolean | 是 | 设置超链接的点击监听回调,默认:(src: string) => { return false } 。 | **使用示例** ``` javascript this.controller.setHyperlinkClickListener((src: string) => { console.log("拦截跳转 title: " + title) // 标题 console.log("拦截跳转 src: " + src) // 网页地址 promptAction.showToast({ message: title + "\n" + src }) return true }) ``` ### setTableBackgroundColor setTableBackgroundColor(tableBackgroundColor: ResourceColor) 设置表格背景色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------------------|---------------|----|-------------------------| | tableBackgroundColor | ResourceColor | 是 | 设置表格的背景色,默认:"#FFFFFF" 。 | **使用示例** ``` javascript this.controller.setTableBackgroundColor("#FFFFFF") ``` ### setTableTitleBackgroundColor setTableTitleBackgroundColor(tableTitleBackgroundColor: ResourceColor) 设置表格表头背景色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |---------------------------|---------------|----|---------------------------| | tableTitleBackgroundColor | ResourceColor | 是 | 设置表格表头的背景色,默认:"#F5F7FA" 。 | **使用示例** ``` javascript this.controller.setTableTitleBackgroundColor("#F5F7FA") ``` ### setTableInterleaveBackgroundColor setTableInterleaveBackgroundColor(tableInterleaveBackgroundColor: ResourceColor) 设置表格错行背景色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |--------------------------------|---------------|----|-----------------------------| | tableInterleaveBackgroundColor | ResourceColor | 是 | 设置表格错行的背景色,默认:"#80f5f7fa" 。 | **使用示例** ``` javascript this.controller.setTableInterleaveBackgroundColor("#80f5f7fa") ``` ### setTodoSelectedColor setTodoSelectedColor(todoSelectedColor: ResourceColor) 设置任务列表选中颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------------------|---------------|----|----------------------------| | todoSelectedColor | ResourceColor | 是 | 设置任务列表的选中颜色,默认:"#0A59F7" 。 | **使用示例** ``` javascript this.controller.setTodoSelectedColor("#0A59F7") ``` ### setTodoSelectSize setTodoSelectSize(todoSelectSize: ResourceStr | number) 设置任务列表选项大小。 **参数** | 参数名 | 类型 | 必填 | 说明 | |----------------|-----------------------|----|-----------------------| | todoSelectSize | ResourceStr \| number | 是 | 设置任务列表选项的大小,默认:16vp 。 | **使用示例** ``` javascript this.controller.setTodoSelectSize(16) ``` ### setFootnoteTextColor setFootnoteTextColor(footnoteTextColor: ResourceColor) 设置脚注文字颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-------------------|---------------|----|----------------------------| | footnoteTextColor | ResourceColor | 是 | 设置脚注的文字颜色,默认:"#fffa460d" 。 | **使用示例** ``` javascript this.controller.setFootnoteTextColor("#fffa460d") ``` ### setLineColor setLineColor(lineColor: ResourceColor) 设置分割线颜色。 **参数** | 参数名 | 类型 | 必填 | 说明 | |-----------|---------------|----|----------------------| | lineColor | ResourceColor | 是 | 设置分割线的颜色,默认:"#EEE" 。 | **使用示例** ``` javascript this.controller.setLineColor("#EEE") ``` ## 在 CSDN 上查看 详细用法请参考CSDN文章:[lv-markdown-in for CSDN](https://blog.csdn.net/weixin_44640245/article/details/153220959) 。 ## 其他 有关 Markdown 的更多信息,请参阅 Markdown 官方教程 [Markdown](https://markdown.com.cn/) 。 使用过程中发现任何问题都可以提出 [Issues](https://gitee.com/luvi/lv-markdown-in/issues) 。 ## 版权声明 本项目采用 MIT 开源协议,允许商用,修改,再分发。再分发时请注明原作者及原仓库地址。