CINXE.COM
AiEditor: AiEditor 是一个面向 AI 的下一代富文本编辑器。
<!DOCTYPE html> <html lang='zh-CN'> <head> <title>AiEditor: AiEditor 是一个面向 AI 的下一代富文本编辑器。</title> <meta content='on' http-equiv='x-dns-prefetch-control'> <link href='//e.gitee.com' rel='dns-prefetch'> <link href='//files.gitee.com' rel='dns-prefetch'> <link href='//toscode.gitee.com' rel='dns-prefetch'> <link href='https://cn-assets.gitee.com' rel='dns-prefetch'> <link href='https://portrait.gitee.com' rel='dns-prefetch'> <link rel="shortcut icon" type="image/vnd.microsoft.icon" href="https://cn-assets.gitee.com/assets/favicon-9007bd527d8a7851c8330e783151df58.ico" /> <link rel="canonical" href="https://gitee.com/aieditor-team/aieditor" /> <meta content='gitee.com/aieditor-team/aieditor git https://gitee.com/aieditor-team/aieditor.git' name='go-import'> <meta charset='utf-8'> <meta content='always' name='referrer'> <meta content='Gitee' property='og:site_name'> <meta content='Object' property='og:type'> <meta content='https://gitee.com/aieditor-team/aieditor' property='og:url'> <meta content='https://foruda.gitee.com/avatar/1701394311539139892/12757463_aieditor-team_1701394311.png' itemprop='image' property='og:image'> <meta content='aieditor-team/AiEditor' itemprop='name' property='og:title'> <meta content='AiEditor 是一个面向 AI 的下一代富文本编辑器。' property='og:description'> <meta content='AiEditor' name='Keywords'> <meta content='AiEditor 是一个面向 AI 的下一代富文本编辑器。' itemprop='description' name='Description'> <meta content='pc,mobile' name='applicable-device'> <meta content="IE=edge" http-equiv="X-UA-Compatible" /> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="JOmbNmayCMiNYIxFf0YP1rQC1JaJqBN8tv+jtsvL47c7oH4t3MvcaZA/DIaP/d9xYMCJ87twh0gT5CpjcwLyXw==" /> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/assets/application-f2d171f1e5dda88a3841003dc29dccdc.css" /> <script> //<![CDATA[ window.gon = {};gon.locale="zh-CN";gon.sentry_dsn=null;gon.baidu_register_hm_push=null;gon.sensor={"server_url":"https://haveaniceday.gitee.com:3443/sa?project=production","sdk_url":"https://cn-assets.gitee.com/assets/static/sensors-sdk-2f850fa5b654ad55ac0993fda2f37ba5.js","page_type":"仓库页面"};gon.info={"controller_path":"projects","action_name":"show","current_user":false};gon.tour_env={"current_user":null,"action_name":"show","original_url":"https://gitee.com/aieditor-team/aieditor","controller_path":"projects"};gon.http_clone="https://gitee.com/aieditor-team/aieditor.git";gon.user_project="aieditor-team/aieditor";gon.manage_branch="管理分支";gon.manage_tag="管理标签";gon.enterprise_id=0;gon.create_reaction_path="/aieditor-team/aieditor/reactions";gon.ipipe_base_url="https://go-api.gitee.com";gon.artifact_base_url="https://go-repo.gitee.com";gon.gitee_go_remote_url="https://go.gitee.com/assets";gon.gitee_go_active=false;gon.current_project_is_mirror=false;gon.show_repo_comment=false;gon.diagram_viewer_path="https://diagram-viewer.giteeusercontent.com";gon.ent_host="e.gitee.com";gon.cp="点击复制";gon.aready_cp="已复制";gon.is_fork=false;gon.ref="main"; //]]> </script> <script src="https://cn-assets.gitee.com/assets/static/sentry-5.1.0-a823fb0be1b61c5d7ca4a89f0536cb0a.js"></script> <script src="https://cn-assets.gitee.com/assets/application-2df5e1e8054d1881948765b0c19263a9.js"></script> <script src="https://cn-assets.gitee.com/assets/lib/jquery.timeago.zh-CN-4a4818e98c1978d2419ab19fabcba740.js"></script> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/assets/projects/application-46b94c31ba11ae8c37eacce2bdb5603e.css" /> <script src="https://cn-assets.gitee.com/assets/projects/app-d12a9669fdb51296206208f0535e46c6.js"></script> <script type='text/x-mathjax-config'> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], displayMath: [["$$","$$"],["\\[","\\]"]], processEscapes: true, skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], ignoreClass: "container|files", processClass: "markdown-body" } }); </script> <script src="https://cn-assets.gitee.com/uploads/resources/MathJax-2.7.2/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> <script> (function () { var messages = { 'zh-CN': { addResult: '增加 <b>{term}</b>', count: '已选择 {count}', maxSelections: '最多 {maxCount} 个选择', noResults: '未找到结果', serverError: '连接服务器时发生错误' }, 'zh-TW': { addResult: '增加 <b>{term}</b>', count: '已選擇 {count}', maxSelections: '最多 {maxCount} 個選擇', noResults: '未找到結果', serverError: '連接服務器時發生錯誤' } } if (messages[gon.locale]) { $.fn.dropdown.settings.message = messages[gon.locale] } }()); </script> <script> var userAgent = navigator.userAgent; var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1; if(isLessIE11){ var can_access = "" if (can_access != "true"){ window.location.href = "/incompatible.html"; } } document.addEventListener("error", function (ev) { var elem = ev.target; if (elem.tagName.toLowerCase() === 'img') { elem.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAAAAACIM/FCAAACh0lEQVR4Ae3ch5W0OgyG4dt/mQJ2xgQPzJoM1m3AbALrxzrf28FzsoP0HykJEEAAAUQTBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEkKK0789+GK/I2ezfQB522PnS1qc8pGgXvr4tE4aY0XOUWlGImThWgyCk6DleixzE7qwBkg/MGiDPlVVAyp1VQGrPKiACDhFI6VkF5LmzCki+sg7IwDoglnVAil0IMkeG9CyUiwsxLFUVFzJJOQaKCjFCDN9RXMjIX7W6ztZXZDKKCyn8sWJvH+nca7WHDN9lROlAliPH9iRKCPI4cswFJQWxB46toLQgQ9jhn5QYZA9DOkoMUoQde5YapAxDWkoNYsOQR3KQd9CxUnIQF4S49CB9ENKlBxmDEKsFUgMCCCCAAHIrSF61f6153Ajy8nyiPr8L5MXnmm4CyT2fzN4DUvHZ+ntA2tOQBRBAAAEEEEAAAQQQ7ZBaC6TwSiDUaYHQ2yuB0MN+ft+43whyrs4rgVCjBUKTFshLC6TUAjGA3AxSaYFYLZBOC2RUAsk8h5qTg9QcbEoOsoQhQ2qQhsO5xCD5dgB5JQaZ+KBKGtKecvR81Ic0ZDjByKdDx0rSEDZ/djQbH+bkIdvfJFm98BfV8hD2zprfVdlu9PxVeyYAkciREohRAplJCaRSAplJCcQogTjSAdlyHRBvSAekJR0QRzogA+mADJkOiCPSAPEtqYBshlRAXC43hxix2QiOuEZkVERykGyNo9idIZKE0HO7XrG6OiMShlDWjstVzdPgXtUH9v0CEidAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQP4HgjZxTpdEii0AAAAASUVORK5CYII="; } }, true); </script> </head> <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script> var title = document.title.replace(/( - Gitee| - 码云)$/, '') imgUrl = ''; document.addEventListener('DOMContentLoaded', function(event) { var imgUrlEl = document.querySelector('.readme-box .markdown-body > img, .readme-box .markdown-body :not(a) > img'); imgUrl = imgUrlEl && imgUrlEl.getAttribute('src'); if (!imgUrl) { imgUrlEl = document.querySelector('meta[itemprop=image]'); imgUrl = imgUrlEl && imgUrlEl.getAttribute('content'); imgUrl = imgUrl || "https://gitee.com/static/images/logo_themecolor.png"; } wx.config({ debug: false, appId: "wxff219d611a159737", timestamp: "1732434881", nonceStr: "d872bfc83a901101820bfc71a4241cec", signature: "6b70ad0fe79fb3909cb060360d88a1c84c296f17", jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage' ] }); wx.ready(function () { wx.onMenuShareTimeline({ title: title, // 分享标题 link: "https://gitee.com/aieditor-team/aieditor", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl // 分享图标 }); wx.onMenuShareAppMessage({ title: title, // 分享标题 link: "https://gitee.com/aieditor-team/aieditor", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 desc: document.querySelector('meta[name=Description]').getAttribute('content'), imgUrl: imgUrl // 分享图标 }); }); wx.error(function(res){ console.error('err', res) }); }) </script> <body class='git-project lang-zh-CN'> <header class='common-header fixed noborder' id='git-header-nav'> <div class='ui container'> <div class='ui menu header-menu header-container'> <div class='git-nav-expand-bar'> <i class='iconfont icon-mode-table'></i> </div> <div class='gitee-nav__sidebar'> <div class='gitee-nav__sidebar-container'> <div class='gitee-nav__sidebar-top'> <div class='gitee-nav__avatar-box'></div> <div class='gitee-nav__buttons-box'> <a class="ui button small fluid orange" href="/login">登录</a> <a class="ui button small fluid basic is-register" href="/signup">注册</a> </div> </div> <div class='gitee-nav__sidebar-middle'> <div class='gitee-nav__sidebar-list'> <ul> <li class='gitee-nav__sidebar-item'> <a href="/explore"><i class='iconfont icon-ic-discover'></i> <span class='gitee-nav__sidebar-name'>开源</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/enterprises"><i class='iconfont icon-ic-enterprise'></i> <span class='gitee-nav__sidebar-name'>企业版</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/education"><i class='iconfont icon-ic-education'></i> <span class='gitee-nav__sidebar-name'>高校版</span> </a></li> <li class='gitee-nav__sidebar-item split-line'></li> <li class='gitee-nav__sidebar-item'> <a href="/search"><i class='iconfont icon-ic-search'></i> <span class='gitee-nav__sidebar-name'>搜索</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/help"><i class='iconfont icon-help-circle'></i> <span class='gitee-nav__sidebar-name'>帮助中心</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/terms"><i class='iconfont icon-file'></i> <span class='gitee-nav__sidebar-name'>使用条款</span> </a></li> <li class='gitee-nav__sidebar-item'> <a href="/about_us"><i class='iconfont icon-issuepx'></i> <span class='gitee-nav__sidebar-name'>关于我们</span> </a></li> </ul> </div> </div> <div class='gitee-nav__sidebar-bottom'> <div class='gitee-nav__sidebar-close-button'> <i class='fa fa-angle-double-left'></i> </div> </div> </div> </div> <!-- /todo 10周年活动结束后 恢复 --> <div class='item gitosc-logo'> <a href="https://gitee.com"><img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline image' height='28' src='/static/images/logo.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='95'> <img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline black image' height='28' src='/static/images/logo-black.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='95'> </a></div> <a title="开源" class="item " href="/explore">开源 </a><a title="企业版" class="item " sa_evt="click_GiteeCommunity_tab_En" href="/enterprises">企业版 </a><a title="高校版" class="item " href="/education">高校版 </a><a title="私有云" class="item" target="_blank" href="https://gitee.cn?utm_source=giteecom">私有云 </a><a title="Gitee AI" class="item mr-3" id="gitee-blog" target="_blank" href="https://ai.gitee.com/?utm_sources=site_nav">Gitee AI <sup class='ui red label'> NEW </sup> </a><div class='center responsive-logo'> <a href="https://gitee.com"><img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline image' height='24' src='/static/images/logo.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='85'> <img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='ui inline black image' height='24' src='/static/images/logo-black.svg?t=158106664' title='Gitee - 基于 Git 的代码托管和研发协作平台' width='85'> </a></div> <div class='right menu userbar right-header' id='git-nav-user-bar'> <form class="ui item" id="navbar-search-form" data-text-require="搜索关键字不能少于1个" data-text-filter="搜索格式不正确" action="/search" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓" /> <input type="hidden" name="type" id="navbar-search-type" /> <input type="hidden" name="fork_filter" id="fork_filter" value="on" /> <div class='ui search header-search'> <input type="text" name="q" id="navbar-search-input" value="" class="prompt" placeholder="搜开源" /> </div> </form> <script> var can_search_in_repo = 1, repo = "VFhwRk5VNVVaelJPUkZwb1RucFplbHBuUFQxaE56WXpaZz09YTc2M2Y=", reponame = "aieditor-team/aieditor"; $(function() { var $search = $('#navbar-search-form .ui.search'); $search.search({ apiSettings: { url: '/search/relative_project?q={query}', onResponse: function (res) { if (res && res.status === 200 && res.data) { var query = htmlSafe($search.search('get value')); res.data.map(function (item) { item.path_ns = '/' + item.path_ns; item.icon = 'iconfont icon-project-public'; }); res.data.unshift({ name_ns: "在全站搜索 <b class='hl'>" + query +"</b> 相关项目", path_ns: '/search?fork_filter=on&q=' + query, icon: 'iconfont icon-search' }); return res; } else { return { data: [] }; } } }, fields: { results: 'data', description: 'name_ns', url: 'path_ns', icon: 'icon' }, minCharacters: 1, maxResults: 10, searchDelay: 250, showNoResults: false, transition: 'fade' }); }); </script> <div class='ui item' id='feature-update-notice'> <div class='notice-update-icon'> <a class="notice-update-popup click-knowed" title="" href="javascript:void(0)"><img alt="功能更新" title="" class="bubl_icon bubl-off-icon" src="https://cn-assets.gitee.com/assets/bulb_off-24ee940be20998aace89a3f040cbc704.svg" /> <img alt="功能更新" title="" class="bubl_icon bubl-on-icon" src="https://cn-assets.gitee.com/assets/bulb_on-3986b1dc417285398e3d15671bd8f261.svg" /> </a></div> <div class='feature-update-notice-panel menu'> <div class='notice-img'> <img alt="" title="" class="notice-img-show" src="" /> </div> <div class='notice-update-title'></div> <div class='notice-update-des'></div> <div class='notice-btn-list d-flex-between'> <button name="button" type="button" class="ui basic orange button btn-notice btn-knowed click-knowed" style="margin-right: 0">我知道了</button> <a class="ui button orange btn-notice btn-details click-knowed" target="_blank" href="">查看详情</a> </div> </div> </div> <a class="item git-nav-user__login-item" sa_evt="login_show" sa_referrer_url="" sa_referrer_action="站导航右上角-登录按钮" sa_referrer_type="仓库页面" href="/login">登录 </a><a class="item git-nav-user__register-item" sa_evt="register_show" sa_referrer_url="" sa_referrer_action="站导航右上角-注册按钮" sa_referrer_type="仓库页面" href="/signup">注册 </a><script> $('.destroy-user-session').on('click', function() { $.cookie('access_token', null, { path: '/' }); }) </script> </div> </div> </div> </header> <script> Gitee.initNavbar() Gitee.initRepoRemoteWay() $.cookie('user_locale',null) </script> <script> var userAgent = navigator.userAgent; var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1; if(isLessIE11){ var can_access = "" if (can_access != "true"){ window.location.href = "/incompatible.html"; } } </script> <div class='fixed-notice-infos'> <div class='all-messages'> </div> <div class='ui container'> <div class='flash-messages' id='messages-container'></div> </div> <script> (function() { $(function() { var $error_box, alertTip, notify_content, notify_options, template; template = '<div data-notify="container" class="ui {0} message" role="alert">' + '<i data-notify="dismiss" class="close icon"></i>' + '<span data-notify="message">{2}</span>' + '</div>'; notify_content = null; notify_options = {}; alertTip = ''; $error_box = $(".flash_error.flash_error_box"); if (notify_options.type === 'error' && $error_box.length > 0 && !$.isEmptyObject(notify_content.message)) { if (notify_content.message === 'captcha_fail') { alertTip = "验证码不正确"; } else if (notify_content.message === 'captcha_expired') { alertTip = "验证码已过期,请点击刷新"; } else if (notify_content.message === 'not_found_in_database') { alertTip = "帐号或者密码错误"; } else if (notify_content.message === 'not_found_and_show_captcha') { alertTip = "帐号或者密码错误"; } else if (notify_content.message === 'phone_captcha_fail') { alertTip = "手机验证码不通过"; } else { alertTip = notify_content.message; } return $error_box.html(alertTip).show(); } else if (notify_content) { if ("show" === 'third_party_binding') { return $('#third_party_binding-message').html(notify_content.message).addClass('ui message red'); } notify_options.delay = 3000; notify_options.template = template; notify_options.offset = { x: 10, y: 30 }; notify_options.element = '#messages-container'; return $.notify(notify_content, notify_options); } }); }).call(this); </script> </div> <script> (function() { $(function() { var setCookie; setCookie = function(name, value) { $.cookie(name, value, { path: '/', expires: 365 }); }; $('#remove-bulletin, #remove-bulletin-dashboard').on('click', function() { setCookie('remove_bulletin', "gitee-maintain-1730772695"); $('#git-bulletin').hide(); }); $('#remove-member-bulletin').on('click', function() { setCookie('remove_member_bulletin', "gitee_member_bulletin"); $(this).parent().hide(); }); return $('#remove-gift-bulletin').on('click', function() { setCookie('remove_gift_bulletin', "gitee-gift-bulletin"); $(this).parent().hide(); }); }); }).call(this); </script> <script> function closeMessageBanner(pthis, type, val) { var json = {} val = typeof val === 'undefined' ? null : val $(pthis).parent().remove() if (type === 'out_of_enterprise_member') { json = {type: type, data: val} } else if (type === 'enterprise_overdue') { json = {type: type, data: val} } $.post('/profile/close_flash_tip', json) } </script> <div class='site-content'> <div class='git-project-header'> <div class='fixed-notice-infos'> <div class='ui info icon floating message green' id='fetch-ok' style='display: none'> <div class='content'> <div class='header status-title'> <i class='info icon status-icon'></i> 代码拉取完成,页面将自动刷新 </div> </div> </div> <div class='ui info icon floating message error' id='fetch-error' style='display: none'> <div class='content'> <div class='header status-title'> <i class='info icon status-icon'></i> <span class='error_msg'></span> </div> </div> </div> </div> <div class='ui container'> <div class='git-project-categories'> <a href="/explore">开源项目</a> <span class='symbol'>></span> <a href="/explore/application-tools">应用工具</a> <span class='symbol'>></span> <a href="/explore/text-editor">文本编辑</a> <span class='symbol and-symbol'>&&</span> </div> <div class='git-project-header-details'> <div class='git-project-header-container'> <div class='git-project-header-actions'> <div class='ui tiny modal project-donate-modal' id='project-donate-modal'> <i class='iconfont icon-close close'></i> <div class='header'>捐赠</div> <div class='content'> 捐赠前请先登录 </div> <div class='actions'> <a class='ui blank button cancel'>取消</a> <a class='ui orange ok button' href='/login'>前往登录</a> </div> </div> <div class='ui small modal wepay-qrcode'> <i class='iconfont icon-close close'></i> <div class='header'> 扫描微信二维码支付 <span class='wepay-cash'></span> </div> <div class='content weqcode-center'> <img id='wepay-qrcode' src=''> </div> <div class='actions'> <div class='ui cancel blank button'>取消</div> <div class='ui ok orange button'>支付完成</div> </div> </div> <div class='ui mini modal' id='confirm-alipay-modal'> <div class='header'>支付提示</div> <div class='content'> 将跳转至支付宝完成支付 </div> <div class='actions'> <div class='ui approve orange button'>确定</div> <div class='ui blank cancel button'>取消</div> </div> </div> <span class='ui buttons basic watch-container'> <div class='ui dropdown button js-project-watch' data-watch-type='unwatch'> <input type='hidden' value=''> <i class='iconfont icon-watch'></i> <div class='text'> Watch </div> <i class='dropdown icon'></i> <div class='menu'> <a data-value="unwatch" class="item" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Watch" sa_referrer_type="仓库页面" rel="nofollow" data-method="post" href="/aieditor-team/aieditor/unwatch"><i class='iconfont icon-msg-read'></i> 不关注 </a><a data-value="watching" class="item" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Watch" sa_referrer_type="仓库页面" rel="nofollow" data-method="post" href="/aieditor-team/aieditor/watch"><i class='iconfont icon-msg-read'></i> 关注所有动态 </a><a data-value="releases_only" class="disabled item" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Watch" sa_referrer_type="仓库页面" rel="nofollow" data-method="post" href="/aieditor-team/aieditor/release_only_watch"><i class='iconfont icon-msg-read'></i> 仅关注版本发行动态 </a><a data-value="ignoring" class="item" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Watch" sa_referrer_type="仓库页面" rel="nofollow" data-method="post" href="/aieditor-team/aieditor/ignoring_watch"><i class='iconfont icon-msg-read'></i> 关注但不提醒动态 </a></div> </div> <style> .js-project-watch .text .iconfont { display: none; } .js-project-watch a, .js-project-watch a:hover { color: #000; } .js-project-watch .item > .iconfont { visibility: hidden; margin-left: -10px; } .js-project-watch .selected .iconfont { visibility: visible; } .js-project-watch .menu { margin-top: 4px !important; } </style> <script> $('.js-project-watch').dropdown({ action: 'select', onChange: function(value, text, $selectedItem) { var type = value === 'unwatch' ? 'Watch' : 'Watching'; $(this).children('.text').text(type); $(this).dropdown('set selected', value) } }); </script> <a class="ui button action-social-count" title="91" href="/aieditor-team/aieditor/watchers">91 </a></span> <span class='basic buttons star-container ui'> <a class="ui button star" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Star" sa_referrer_type="仓库页面" href="/login"><i class='iconfont icon-star'></i> Star </a><a class="ui button action-social-count " title="1164" href="/aieditor-team/aieditor/stargazers">1.2K </a></span> <span class='ui basic buttons fork-container' title='无权 Fork 此仓库'> <a class="ui button fork" title="你必须登录后才可以fork一个仓库" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Fork" sa_referrer_type="仓库页面" href="/login"><i class='iconfont icon-fork'></i> Fork </a><a class="ui button action-social-count disabled-style" title="204" href="/aieditor-team/aieditor/members">204 </a></span> </div> <h2 class='git-project-title mt-0 mb-0'> <a title="GVP - Gitee 最有价值开源项目" class="ui small label git-project-gvp-badge" target="_blank" href="/gvp">GVP</a><a title="aieditor-team" class="author" href="/aieditor-team">aieditor-team</a>/<a title="AiEditor" class="repository" target="" style="padding-bottom: 0px; margin-right: 4px" sa_evt="repoClick" sa_location="仓库页面" sa_url="" sa_repo_id="31958846" href="/aieditor-team/aieditor">AiEditor</a> <input type="hidden" name="recomm_at" id="recomm_at" value="2023-11-13 10:53" /> <input type="hidden" name="project_title" id="project_title" value="aieditor-team/AiEditor" /> </h2> </div> </div> </div> <script> var title_import_url = "false"; var title_post_url = "/aieditor-team/aieditor/update_import"; var title_fork_url = "/aieditor-team/aieditor/sync_fork"; var title_project_path = "aieditor"; var title_p_name = "AiEditor"; var title_p_id= "31958846"; var title_description = "AiEditor 是一个面向 AI 的下一代富文本编辑器。"; var title_form_authenticity_token = "blu6tEp32NJt0/C7KQplJeAvb7hcrzyL+LjAh9HcdMZxEl+v8A4Mc3CMcHjZsbWCNO0y3W53qL9do0lSaRVlLg=="; var watch_type = "unwatch"; var checkFirst = false; $('.js-project-watch').dropdown('set selected', watch_type); $('.checkbox.sync-wiki').checkbox(); $('.checkbox.sync-prune').checkbox(); $('.checkbox.team-member-checkbox').checkbox(); </script> <style> i.loading, .icon-sync.loading { -webkit-animation: icon-loading 1.2s linear infinite; animation: icon-loading 1.2s linear infinite; } .qrcode_cs { float: left; } .check-sync-wiki { float: left; height: 28px; line-height: 28px; } .sync-wiki-warn { color: #e28560; } </style> <div class='git-project-nav'> <div class='ui container'> <div class='ui secondary pointing menu'> <a class="item active " href="/aieditor-team/aieditor"><i class='iconfont icon-code'></i> 代码 </a><a class="item " href="/aieditor-team/aieditor/issues"><i class='iconfont icon-task'></i> Issues <span class='ui mini circular label'> 45 </span> </a><a class="item " href="/aieditor-team/aieditor/pulls"><i class='iconfont icon-pull-request'></i> Pull Requests <span class='ui mini circular label'> 0 </span> </a><a class="item " href="/aieditor-team/aieditor/wikis"><i class='iconfont icon-wiki'></i> Wiki </a><a class="item " href="/aieditor-team/aieditor/graph/main"><i class='iconfont icon-statistics'></i> 统计 </a><a class="item " href="/aieditor-team/aieditor/gitee_go"><i class='iconfont icon-workflow'></i> 流水线 </a><div class='item'> <div class='ui pointing top right dropdown git-project-service'> <div> <i class='iconfont icon-service'></i> 服务 <i class='dropdown icon'></i> </div> <div class='menu' style='display:none'> <a class="item" href="/aieditor-team/aieditor/pages"><img src="/static/images/logo-en.svg" alt="Logo en" /> <div class='item-title'> Gitee Pages </div> </a><a class="item" href="/aieditor-team/aieditor/javadoc"><img src="https://cn-assets.gitee.com/assets/maven-bd58aee84f266d64d4b8ce5b006a9fcf.png" alt="Maven" /> <div class='item-title'> JavaDoc </div> </a><a class="item" href="/aieditor-team/aieditor/phpdoc"><img src="https://cn-assets.gitee.com/assets/phpdoc-a99f87c2feaa2fd99e5065377a39487e.png" alt="Phpdoc" /> <div class='item-title'> PHPDoc </div> </a><a class="item" href="/aieditor-team/aieditor/quality_analyses?platform=sonar_qube"><img src="https://cn-assets.gitee.com/assets/sonar_mini-5e1b54bb9f6c951d97fb778ef623afea.png" alt="Sonar mini" /> <div class='item-title'> 质量分析 </div> </a><a class="item" target="_blank" href="https://gitee.com/help/articles/4193"><img src="https://cn-assets.gitee.com/assets/jenkins_for_gitee-554ec65c490d0f1f18de632c48acc4e7.png" alt="Jenkins for gitee" /> <div class='item-title'> Jenkins for Gitee </div> </a><a class="item" target="_blank" href="https://gitee.com/help/articles/4318"><img src="https://cn-assets.gitee.com/assets/cloudbase-1197b95ea3398aff1df7fe17c65a6d42.png?20200925" alt="Cloudbase" /> <div class='item-title'> 腾讯云托管 </div> </a><a class="item" target="_blank" href="https://gitee.com/help/articles/4330"><img src="https://cn-assets.gitee.com/assets/cloud_serverless-686cf926ced5d6d2f1d6e606d270b81e.png" alt="Cloud serverless" /> <div class='item-title'> 腾讯云 Serverless </div> </a><a class="item" href="/aieditor-team/aieditor/open_sca"><img src="https://cn-assets.gitee.com/assets/open_sca/logo-9049ced662b2f9936b8001e6f9cc4952.png" alt="Logo" /> <div class='item-title'> 悬镜安全 </div> </a><a class="item" target="_blank" href="https://help.gitee.com/devops/connect/Aliyun-SAE"><img src="https://cn-assets.gitee.com/assets/SAE-f3aa9366a1e2b7fff4747402eb8f10c3.png" alt="Sae" /> <div class='item-title'> 阿里云 SAE </div> </a><a class="item" id="update-codeblitz-link" target="_blank" href="https://codeblitz.cloud.alipay.com/gitee/aieditor-team/aieditor/tree/main/"><img style="width:100px;margin-top:4px" src="https://cn-assets.gitee.com/assets/Codeblitz-8824e38875a106e16e29ff57ec977b08.png" alt="Codeblitz" /> <div class='item-title'> Codeblitz </div> </a><button class='ui orange basic button quit-button' id='quiting-button'> 我知道了,不再自动展开 </button> </div> </div> </div> </div> </div> </div> <script> $('.git-project-nav .ui.dropdown').dropdown({ action: 'nothing' }); var gitee_reward_config = JSON.parse(localStorage.getItem('gitee_reward_config') || null) || false var $settingText = $('.setting-text') // 如果没有访问过 if(!gitee_reward_config) $settingText.addClass('red-dot') $('.git-project-service').dropdown({ on: 'click', action: 'nothing', onShow: function () { const branch = 'main' let newUrl = `https://codeblitz.cloud.alipay.com/gitee/aieditor-team/aieditor/tree/` const url = decodeURIComponent(window.location.pathname); const startIndex = url.indexOf('main'); if (startIndex !== -1) { newUrl = newUrl + url.substring(startIndex); // 从分支名开始截取 }else{ newUrl = newUrl + branch } const linkElement = document.getElementById("update-codeblitz-link"); linkElement.setAttribute("href", newUrl); }, }) </script> <style> .git-project-nav i.checkmark.icon { color: green; } #quiting-button { display: none; } .git-project-nav .dropdown .menu.hidden:after { visibility: hidden !important; } </style> <script> isSignIn = false isClickGuide = false $('#git-versions.dropdown').dropdown(); $.ajax({ url:"/aieditor-team/aieditor/access/add_access_log", type:"GET" }); $('#quiting-button').on('click',function() { $('.git-project-service').click(); if (isSignIn) { $.post("/projects/set_service_guide") } $.cookie("Serve_State", true, { expires: 3650, path: '/'}) $('#quiting-button').hide(); }); if (!(isClickGuide || $.cookie("Serve_State") == 'true')) { $('.git-project-service').click() $('#quiting-button').show() } </script> </div> <div class='ui container'> <div class='register-guide'> <div class='register-container'> <div class='regist'> 加入 Gitee </div> <div class='description'> 与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :) </div> <a class="ui orange button free-registion" sa_evt="register_show" sa_referrer_url="" sa_referrer_action="免费加入" sa_referrer_type="仓库页面" href="/signup?from=project-guide">免费加入</a> <div class='login'> 已有帐号? <a href="/login?from=project-guide">立即登录</a> </div> </div> </div> <div class='git-project-content-wrapper'> <div class='ui grid tree-bbb' id='project-wrapper'> <div class='project-left-side-contaner wide column' id='project-left-side-contaner' style='display: none;'> <link href='/webpacks/osc-element-ui-theme/index.css' rel='stylesheet' type='text/css'> <div class='left-side-container' style='height: 100%'> <div class='d-flex-between'> <div class='d-align-center' id='left-head_root_file'> <div class='file-iconify-item' onclick="$('.project-left-side-contaner').hide();$('#file-iconify-wrapper').removeClass('hide').addClass('d-align-center')"> <span class='iconify' data-icon='gitee:sidebar-expand' style='font-size: 16px;'></span> </div> <span class='text-bold'>文件</span> </div> <div class='ml-1' id='left-head_root_actions' style='flex: 1'> <div class='ui horizontal list repo-action-list d-flex d-align-center repo-action-list-right'> <div class='item search-box-container'> <div class='ui icon input search-input' id='search-box'> <input class='search-file-name' maxlength='40' placeholder='搜索文件' type='text'> </div> <a class='d-flex d-align-center head-search-file-btn' id='search-file-btn'> <span class='iconify' data-icon='gitee:search' style='font-size: 16px;color:#979CAC;margin-right:10px'></span> </a> <div class='filter-file-container' style='display: none;'></div> </div> <div class='item plus-box'> <div class='ui pointing right top dropdown git-project-file' id='git-project-file'> <span class='iconify' data-icon='gitee:plus' style='font-size: 16px;color:#979CAC'></span> <div class='menu repo-dropdown-box pt-1 pb-1'> <a title="新建文件" id="new_file_bread" class="item repo-action d-flex d-align-center" href="/aieditor-team/aieditor/new/main"><span class='iconify' data-icon='gitee:file' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建文件 </span> </a><a title="新建 Diagram 文件" class="item repo-action d-flex d-align-center" href="/aieditor-team/aieditor/new/main?ext=drawio"><span class='iconify' data-icon='gitee:lan' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建 Diagram 文件 </span> </a><div class='disabled item d-flex d-align-center'> <span class='iconify' data-icon='gitee:folder-sub' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建子模块 </span> </div> <div class='disabled item d-flex d-align-center'> <span class='iconify' data-icon='gitee:upload' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 上传文件 </span> </div> </div> </div> </div> <div class='item toschina-content__hidden webIDE-box' data-content='Web IDE'> <a class="ui d-flex d-align-center webide" target="_blank" href="/-/ide/project/aieditor-team/aieditor/edit/main/-/"><span class='iconify' data-icon='gitee:computer' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> </a></div> </div> <script> $('.git-project-file').dropdown({ action: 'hide', onHide: function () { $('.plus-box').removeClass('click-active') }, onShow: function () { $('.plus-box').addClass('click-active') } }); </script> <script> $('.webIDE-box').popup() </script> <script src="https://cn-assets.gitee.com/assets/file_search/app-70df5c0292ce154e1b175402e02e32f4.js"></script> <style> .filter-file-container-hide { display: none !important; } </style> </div> </div> <div class='left-project-branch-item git-project-branch-item'> <input type="hidden" name="path" id="path" value="" /> <div class='ui top left pointing dropdown gradient button dropdown-has-tabs' id='git-project-branch'> <input type="hidden" name="ref" id="ref" value="main" /> <div class='default text'> main </div> <i class='dropdown icon'></i> <div class='menu'> <div class='ui left icon input'> <i class='iconfont icon-search dropdown-search-icon'></i> <input class='search-branch' placeholder='搜索分支' type='text'> </div> <div class='tab-menu project-branch-tab-menu d-flex'> <div class='tab-menu-item' data-placeholder='搜索分支' data-tab='branches'> 分支 (1) </div> <div class='tab-menu-item' data-placeholder='搜索标签' data-tab='tags'> 标签 (44) </div> <div class='d-align-center' style='flex:1;justify-content:end;'> <div class='tab-menu-action' data-tab='branches'> <a class="ui link button" href="/aieditor-team/aieditor/branches">管理</a> </div> <div class='tab-menu-action' data-tab='tags'> <a class="ui link button" href="/aieditor-team/aieditor/tags">管理</a> </div> </div> </div> <div class='tab scrolling menu' data-tab='branches' id='branches_panel'> <div data-value="main" class="item" title="main"><span>main</span></div> </div> <div class='tab scrolling menu' data-tab='tags' id='tags_panel'> <div class='item' data-value='v1.2.7'>v1.2.7</div> <div class='item' data-value='v1.2.6'>v1.2.6</div> <div class='item' data-value='v1.2.5'>v1.2.5</div> <div class='item' data-value='v1.2.4'>v1.2.4</div> <div class='item' data-value='v1.2.3'>v1.2.3</div> <div class='item' data-value='v1.2.2'>v1.2.2</div> <div class='item' data-value='v1.2.1'>v1.2.1</div> <div class='item' data-value='v1.2.0'>v1.2.0</div> <div class='item' data-value='v1.1.7'>v1.1.7</div> <div class='item' data-value='v1.1.6'>v1.1.6</div> <div class='item' data-value='v1.1.5'>v1.1.5</div> <div class='item' data-value='v1.1.4'>v1.1.4</div> <div class='item' data-value='v1.1.3'>v1.1.3</div> <div class='item' data-value='v1.1.2'>v1.1.2</div> <div class='item' data-value='v1.1.1'>v1.1.1</div> <div class='item' data-value='v1.1.0'>v1.1.0</div> <div class='item' data-value='v1.0.16'>v1.0.16</div> <div class='item' data-value='v1.0.15'>v1.0.15</div> <div class='item' data-value='v1.0.14'>v1.0.14</div> <div class='item' data-value='v1.0.13'>v1.0.13</div> </div> </div> </div> <style> .iconfont.icon-shieldlock { color: #8c92a4; } .dropdown-search-icon { position: absolute; top: 8px; left: 11px; } </style> <style> #git-project-branch .project-branch-tab-menu, .project-branch-item .project-branch-tab-menu { padding-left: 0px !important; padding-right: 0px !important; margin: 0 11px !important; border-bottom: 1px solid #dfe3e9 !important; } #git-project-branch .ui.dropdown .menu, .project-branch-item .ui.dropdown .menu { width: 360px !important; } #git-project-branch .ui.dropdown .menu .item, .project-branch-item .ui.dropdown .menu .item { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } #git-project-branch .tab-menu-actions, .project-branch-item .tab-menu-actions { position: absolute; right: 0px !important; bottom: 0.357em; } #git-project-branch .tab-menu-action, .project-branch-item .tab-menu-action { position: relative !important; right: 0px !important; bottom: 0px !important; } #git-project-branch .menu::after, .project-branch-item .menu::after { display: none !important; } </style> <script> var $branchesDropdown = $('#branches_panel'); var $tagsDropdown = $('#tags_panel'); var $searchNameInput = $('.search-branch'); var concurrentRequestLock = false; var filterXSS = window.filterXSS; var search_text = ""; var branch_page_number = 1; var branch_total_pager = Math.ceil(1 / 20) || 1 var flag_is_loading = false; var flag_page_number = 1; var flag_total_pager = Math.ceil(44 / 20) || 1 $branchesDropdown.scroll(function() { var branchesPanel = document.getElementById('branches_panel'); var numOfBranches = $branchesDropdown.children().length; if (branchesPanel.clientHeight + branchesPanel.scrollTop + 37 > branchesPanel.scrollHeight && numOfBranches < 1) { debounceLoadMoreBranches.call(); } }); function resetFlagVal() { flag_is_loading = false; flag_page_number = 1; flag_total_pager = 1; concurrentRequestLock = false search_text = ""; branch_page_number = 1; branch_total_pager = 1 } $searchNameInput.on('input', window.globalUtils.debouce(function (e) { resetFlagVal() var $currentTab = $('.tab-menu-action.active'); var numOfBranches = $branchesDropdown.children().length; var searchWord = $searchNameInput.val().trim(); search_text = searchWord if($currentTab.data('tab') === 'branches') { if (searchWord !== "") { loadData(searchWord,1); } else { loadData(); } } var numOfTags = $tagsDropdown.children().length; if($currentTab.data('tab') === 'tags') { if (searchWord !== "") { fetchTags(searchWord,1); } else { fetchTags(); } } }, 500)); function toggleNoResultView($popPanel) { let no_data_html= `<div class='mt-1 mb-1 d-flex-center'> <span>暂无数据</span> </div>` $popPanel.append(no_data_html) } var debounceLoadMoreBranches = window.globalUtils.debouce(function () { if (concurrentRequestLock) return; branch_page_number += 1; if (branch_page_number > branch_total_pager) return; loadData(search_text, branch_page_number); }, 350); function loadData(search, page) { if (concurrentRequestLock) { return; } concurrentRequestLock = true; var searchParams = search || ""; var pageParams = page || 1; $.ajax({ url: "/" + gon.user_project + "/branches/names.json", type: 'GET', data: { search: searchParams, page: pageParams, }, dataType: 'json', success: function (data) { branch_total_pager = data.total_pages; var html = ''; if (pageParams === 1) { $branchesDropdown.empty(); } data.branches.forEach(function (branch) { var protectRule = ''; var branchName = filterXSS(branch.name); if(branch.branch_type.value === 1) { var rule = filterXSS(branch.protection_rule.wildcard); protectRule = `<i class="iconfont icon-shieldlock protected-branch-popup" data-title="受保护分支" data-content='保护规则: ${rule}' > </i>` } html += `<div data-value='${branchName}' class="item"> <span>${branchName}</span> ${protectRule} </div>` }); $branchesDropdown.append(html); $('.protected-branch-popup').popup() if (pageParams === 1 && data.count === 0) { toggleNoResultView($branchesDropdown); } }, complete: function () { concurrentRequestLock = false; } }); } $tagsDropdown.scroll(function() { var tagsPanel = document.getElementById('tags_panel'); var numOfTags = $tagsDropdown.children().length; if (tagsPanel.clientHeight + tagsPanel.scrollTop + 37 > tagsPanel.scrollHeight && numOfTags < 44) { debounceLoadMore.call(); } }); var debounceLoadMore = window.globalUtils.debouce(function () { if (flag_is_loading) return; flag_page_number += 1; if (flag_page_number > flag_total_pager) return; fetchTags(search_text, flag_page_number); }, 350); function fetchTags(search, page) { var searchParams = search || ""; var pageParams = page || 1; if (flag_is_loading) return; flag_is_loading = true; $.ajax({ url: "/" + gon.user_project + "/tags/names.json", data: { search: searchParams, page: pageParams, }, type: "GET", xhrFields: { withCredentials: true, }, success: function (data) { flag_total_pager = data.total_pages; if (pageParams === 1) { $tagsDropdown.html(''); } data.tags.forEach((tag) => { const itemDiv = document.createElement('div'); itemDiv.classList.add('item'); itemDiv.setAttribute('data-value', tag.name); itemDiv.innerText = window.filterXSS(tag.name); $tagsDropdown.append(itemDiv) }); if (pageParams === 1 && data.count === 0) { toggleNoResultView($tagsDropdown); } }, error: function () { }, complete: function () { flag_is_loading = false; }, }); } $('.project-branch-tab-menu').on('click','.tab-menu-item', function (e) { var $currentTab = $(this).data('tab') if($currentTab === 'branches') { $searchNameInput.val('') search_text = ''; loadData() } if($currentTab === 'tags') { $searchNameInput.val('') search_text = ''; fetchTags(); } }) </script> <script> $(function () { var curNode = $('.git-project-branch-item') if (false ){ curNode = $('.left-project-branch-item') }else { curNode = $('.git-project-branch-item') } Gitee.initTabsInDropdown(curNode.find('#git-project-branch').dropdown({ fullTextSearch: true, selectOnKeydown: false, action: function (text,value,el) { var oItemOrInitObject = el[0] || el var isNotSelect = oItemOrInitObject.dataset.tab && oItemOrInitObject.dataset.tab === 'branches' if(isNotSelect){ console.warn("You didn't choose a branch") return } var path = $('#path').val(); var href = ['/aieditor-team/aieditor/tree', encodeURIComponent(value), path].join('/'); window.location.href = href; return true }, onNoResults: function (searchTerm) { //未找到结果 return true }, })); $('.protected-branch-popup').popup() }) </script> </div> <div id='project-tree-container'></div> </div> <style> .left-side-container { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .left-side-container .file-iconify-item { display: -webkit-box; display: -ms-flexbox; display: flex; padding: 8px; border-radius: 4px; margin-right: 8px; width: 32px; height: 32px; text-align: center; } .left-side-container .file-iconify-item:hover { background-color: #f5f7fa; } </style> <script> if (!true && window.Gitee.setFullscreen){ window.Gitee.setFullscreen(true); }else { window.Gitee.setFullscreen(false); } </script> <script src="https://cn-assets.gitee.com/webpacks/vendors_lib-7ff466a6da368d391eda.js"></script> <script src="https://cn-assets.gitee.com/webpacks/project_tree-9072d403d6574c940655.bundle.js"></script> </div> <div class='twelve wide column right-wrapper'> <div id='git-project-search-panel' style='display: none;'> <a href='javascript: void(0);' id='back-to-list'> <i class='angle left icon'></i> 返回 </a> <div class='ui icon input search-input'> <i class='iconfont icon-search icon'></i> <input id='search-name' maxlength='40' placeholder='搜索文件' type='text'> </div> </div> <div class='git-project-content' id='git-project-content'> <div class='git-project-desc-wrapper'> <script> $('.git-project-desc-wrapper .ui.dropdown').dropdown(); if (false) { gon.project_new_blob_path = "/aieditor-team/aieditor/new/main" bindShowModal({ el: $('.no-license .project-license__create'), complete: function(data, modal) { if (!data.haveNoChoice && !data.data) { Flash.show('请选择一项开源许可证') } else { location.href = gon.project_new_blob_path + '?license=' + data.data } }, skip: function () { location.href = gon.project_new_blob_path + '?license' } }); } $(".project-admin-action-box .reject").click(function() { var reason = $('[name=review-reject-reason]').val(); if (!reason) { Flash.error('请选择不通过理由') return } $.ajax({ type: 'POST', url: "/admin/shumei_content/shumei_check/reject_project_public", data: { reason: reason, status: 'rejected', project_id: 31958846 }, success: function(result){ if(result.status == 'success'){ window.location.reload(); }else{ Flash.error(result.message) } } }) }) $(".project-admin-action-box .approve").click(function(){ $.ajax({ type: 'POST', url: "/admin/shumei_content/shumei_check/reject_project_public", data: { status: 'approved', project_id: 31958846 }, success: function(result){ if(result.status == 'success'){ window.location.reload(); }else{ Flash.error(result.message) } } }) }) $(".project-admin-action-box .waiting").click(function(){ $.ajax({ type: 'POST', url: "/admin/shumei_content/shumei_check/reject_project_public", data: { status: 'waiting', project_id: 31958846 }, success: function(result){ if(result.status == 'success'){ window.location.reload(); }else{ Flash.error(result.message) } } }) }) $('i.help.circle.icon').popup({ popup: '.no-license .ui.popup', position: 'right center' }); $('#remove-no-license-message').on('click', function() { $.cookie("skip_repo_no_license_message_31958846", 'hide', { expires: 365 }); $('#user-no-license-message').hide(); return; }); </script> </div> <div class='git-project-bread' id='git-project-bread'> <div class='ui horizontal list mr-1' id='git-branch-dropdown' style=''> <div class='item git-project-branch-item'> <input type="hidden" name="path" id="path" value="" /> <div class='ui top left pointing dropdown gradient button dropdown-has-tabs' id='git-project-branch'> <input type="hidden" name="ref" id="ref" value="main" /> <div class='default text'> main </div> <i class='dropdown icon'></i> <div class='menu'> <div class='ui left icon input'> <i class='iconfont icon-search dropdown-search-icon'></i> <input class='search-branch' placeholder='搜索分支' type='text'> </div> <div class='tab-menu project-branch-tab-menu d-flex'> <div class='tab-menu-item' data-placeholder='搜索分支' data-tab='branches'> 分支 (1) </div> <div class='tab-menu-item' data-placeholder='搜索标签' data-tab='tags'> 标签 (44) </div> <div class='d-align-center' style='flex:1;justify-content:end;'> <div class='tab-menu-action' data-tab='branches'> <a class="ui link button" href="/aieditor-team/aieditor/branches">管理</a> </div> <div class='tab-menu-action' data-tab='tags'> <a class="ui link button" href="/aieditor-team/aieditor/tags">管理</a> </div> </div> </div> <div class='tab scrolling menu' data-tab='branches' id='branches_panel'> <div data-value="main" class="item" title="main"><span>main</span></div> </div> <div class='tab scrolling menu' data-tab='tags' id='tags_panel'> <div class='item' data-value='v1.2.7'>v1.2.7</div> <div class='item' data-value='v1.2.6'>v1.2.6</div> <div class='item' data-value='v1.2.5'>v1.2.5</div> <div class='item' data-value='v1.2.4'>v1.2.4</div> <div class='item' data-value='v1.2.3'>v1.2.3</div> <div class='item' data-value='v1.2.2'>v1.2.2</div> <div class='item' data-value='v1.2.1'>v1.2.1</div> <div class='item' data-value='v1.2.0'>v1.2.0</div> <div class='item' data-value='v1.1.7'>v1.1.7</div> <div class='item' data-value='v1.1.6'>v1.1.6</div> <div class='item' data-value='v1.1.5'>v1.1.5</div> <div class='item' data-value='v1.1.4'>v1.1.4</div> <div class='item' data-value='v1.1.3'>v1.1.3</div> <div class='item' data-value='v1.1.2'>v1.1.2</div> <div class='item' data-value='v1.1.1'>v1.1.1</div> <div class='item' data-value='v1.1.0'>v1.1.0</div> <div class='item' data-value='v1.0.16'>v1.0.16</div> <div class='item' data-value='v1.0.15'>v1.0.15</div> <div class='item' data-value='v1.0.14'>v1.0.14</div> <div class='item' data-value='v1.0.13'>v1.0.13</div> </div> </div> </div> <style> .iconfont.icon-shieldlock { color: #8c92a4; } .dropdown-search-icon { position: absolute; top: 8px; left: 11px; } </style> <style> #git-project-branch .project-branch-tab-menu, .project-branch-item .project-branch-tab-menu { padding-left: 0px !important; padding-right: 0px !important; margin: 0 11px !important; border-bottom: 1px solid #dfe3e9 !important; } #git-project-branch .ui.dropdown .menu, .project-branch-item .ui.dropdown .menu { width: 360px !important; } #git-project-branch .ui.dropdown .menu .item, .project-branch-item .ui.dropdown .menu .item { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } #git-project-branch .tab-menu-actions, .project-branch-item .tab-menu-actions { position: absolute; right: 0px !important; bottom: 0.357em; } #git-project-branch .tab-menu-action, .project-branch-item .tab-menu-action { position: relative !important; right: 0px !important; bottom: 0px !important; } #git-project-branch .menu::after, .project-branch-item .menu::after { display: none !important; } </style> <script> var $branchesDropdown = $('#branches_panel'); var $tagsDropdown = $('#tags_panel'); var $searchNameInput = $('.search-branch'); var concurrentRequestLock = false; var filterXSS = window.filterXSS; var search_text = ""; var branch_page_number = 1; var branch_total_pager = Math.ceil(1 / 20) || 1 var flag_is_loading = false; var flag_page_number = 1; var flag_total_pager = Math.ceil(44 / 20) || 1 $branchesDropdown.scroll(function() { var branchesPanel = document.getElementById('branches_panel'); var numOfBranches = $branchesDropdown.children().length; if (branchesPanel.clientHeight + branchesPanel.scrollTop + 37 > branchesPanel.scrollHeight && numOfBranches < 1) { debounceLoadMoreBranches.call(); } }); function resetFlagVal() { flag_is_loading = false; flag_page_number = 1; flag_total_pager = 1; concurrentRequestLock = false search_text = ""; branch_page_number = 1; branch_total_pager = 1 } $searchNameInput.on('input', window.globalUtils.debouce(function (e) { resetFlagVal() var $currentTab = $('.tab-menu-action.active'); var numOfBranches = $branchesDropdown.children().length; var searchWord = $searchNameInput.val().trim(); search_text = searchWord if($currentTab.data('tab') === 'branches') { if (searchWord !== "") { loadData(searchWord,1); } else { loadData(); } } var numOfTags = $tagsDropdown.children().length; if($currentTab.data('tab') === 'tags') { if (searchWord !== "") { fetchTags(searchWord,1); } else { fetchTags(); } } }, 500)); function toggleNoResultView($popPanel) { let no_data_html= `<div class='mt-1 mb-1 d-flex-center'> <span>暂无数据</span> </div>` $popPanel.append(no_data_html) } var debounceLoadMoreBranches = window.globalUtils.debouce(function () { if (concurrentRequestLock) return; branch_page_number += 1; if (branch_page_number > branch_total_pager) return; loadData(search_text, branch_page_number); }, 350); function loadData(search, page) { if (concurrentRequestLock) { return; } concurrentRequestLock = true; var searchParams = search || ""; var pageParams = page || 1; $.ajax({ url: "/" + gon.user_project + "/branches/names.json", type: 'GET', data: { search: searchParams, page: pageParams, }, dataType: 'json', success: function (data) { branch_total_pager = data.total_pages; var html = ''; if (pageParams === 1) { $branchesDropdown.empty(); } data.branches.forEach(function (branch) { var protectRule = ''; var branchName = filterXSS(branch.name); if(branch.branch_type.value === 1) { var rule = filterXSS(branch.protection_rule.wildcard); protectRule = `<i class="iconfont icon-shieldlock protected-branch-popup" data-title="受保护分支" data-content='保护规则: ${rule}' > </i>` } html += `<div data-value='${branchName}' class="item"> <span>${branchName}</span> ${protectRule} </div>` }); $branchesDropdown.append(html); $('.protected-branch-popup').popup() if (pageParams === 1 && data.count === 0) { toggleNoResultView($branchesDropdown); } }, complete: function () { concurrentRequestLock = false; } }); } $tagsDropdown.scroll(function() { var tagsPanel = document.getElementById('tags_panel'); var numOfTags = $tagsDropdown.children().length; if (tagsPanel.clientHeight + tagsPanel.scrollTop + 37 > tagsPanel.scrollHeight && numOfTags < 44) { debounceLoadMore.call(); } }); var debounceLoadMore = window.globalUtils.debouce(function () { if (flag_is_loading) return; flag_page_number += 1; if (flag_page_number > flag_total_pager) return; fetchTags(search_text, flag_page_number); }, 350); function fetchTags(search, page) { var searchParams = search || ""; var pageParams = page || 1; if (flag_is_loading) return; flag_is_loading = true; $.ajax({ url: "/" + gon.user_project + "/tags/names.json", data: { search: searchParams, page: pageParams, }, type: "GET", xhrFields: { withCredentials: true, }, success: function (data) { flag_total_pager = data.total_pages; if (pageParams === 1) { $tagsDropdown.html(''); } data.tags.forEach((tag) => { const itemDiv = document.createElement('div'); itemDiv.classList.add('item'); itemDiv.setAttribute('data-value', tag.name); itemDiv.innerText = window.filterXSS(tag.name); $tagsDropdown.append(itemDiv) }); if (pageParams === 1 && data.count === 0) { toggleNoResultView($tagsDropdown); } }, error: function () { }, complete: function () { flag_is_loading = false; }, }); } $('.project-branch-tab-menu').on('click','.tab-menu-item', function (e) { var $currentTab = $(this).data('tab') if($currentTab === 'branches') { $searchNameInput.val('') search_text = ''; loadData() } if($currentTab === 'tags') { $searchNameInput.val('') search_text = ''; fetchTags(); } }) </script> <script> $(function () { var curNode = $('.git-project-branch-item') if (false ){ curNode = $('.left-project-branch-item') }else { curNode = $('.git-project-branch-item') } Gitee.initTabsInDropdown(curNode.find('#git-project-branch').dropdown({ fullTextSearch: true, selectOnKeydown: false, action: function (text,value,el) { var oItemOrInitObject = el[0] || el var isNotSelect = oItemOrInitObject.dataset.tab && oItemOrInitObject.dataset.tab === 'branches' if(isNotSelect){ console.warn("You didn't choose a branch") return } var path = $('#path').val(); var href = ['/aieditor-team/aieditor/tree', encodeURIComponent(value), path].join('/'); window.location.href = href; return true }, onNoResults: function (searchTerm) { //未找到结果 return true }, })); $('.protected-branch-popup').popup() }) </script> </div> </div> <div class='git-project-right-actions pull-right'> <div class='ui orange button' id='btn-dl-or-clone'> 克隆/下载 <i class='dropdown icon'></i> </div> <div class='ui small modal' id='git-project-download-panel'> <i class='iconfont icon-close close'></i> <div class='header'> 克隆/下载 </div> <div class='content'> <div class='ui secondary pointing menu mb-2 menu-container'> <a class='item active' data-text='' data-type='http' data-url='https://gitee.com/aieditor-team/aieditor.git'>HTTPS</a> <a class='item' data-text='' data-type='ssh' data-url='git@gitee.com:aieditor-team/aieditor.git'>SSH</a> <a class='item' data-text="该仓库未启用SVN访问,请仓库管理员前往【<a target='_blank' href=/aieditor-team/aieditor/settings#function>仓库设置</a>】开启。" data-type='svn' data-url=''>SVN</a> <a class='item' data-text="该仓库未启用SVN访问,请仓库管理员前往【<a target='_blank' href=/aieditor-team/aieditor/settings#function>仓库设置</a>】开启。" data-type='svn_ssh' data-url=''>SVN+SSH</a> <a class="ui basic orange button button-box unlogin-download-btn" sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="克隆/下载" sa_referrer_type="仓库页面" href="javascript:void(0);"><i class='icon download'></i> 下载ZIP </a><div class='ui custom popup popup'> <div class='popup-container actions'> <div class='content'> 该操作需登录 Gitee 帐号,请先登录后再操作。 </div> <a class="ui orange button ok icon" href="/login?from=download_repository_zip">立即登录 </a><a class="ui blank button cancel" href="/signup?from=download_repository_zip">没有帐号,去注册 </a></div> </div> </div> <div class='ui fluid right labeled small input download-url-panel mb-2'> <input type="text" name="project_url_clone" id="project_url_clone" value="https://gitee.com/aieditor-team/aieditor.git" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#project_url_clone' id='btn-copy-project_clone_url1'></i> </div> </div> <div class='tip-box mb-2'> 提示 </div> <div class='mb-1 clone-url-title'> 下载代码请复制以下命令到终端执行 </div> <div class='ui fluid right labeled small input download-url-panel mb-2'> <input type="text" name="project_clone_url" id="project_clone_url" value="https://gitee.com/aieditor-team/aieditor.git" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#project_clone_url' id='btn-copy-project_clone_url'></i> </div> </div> <div class='ui fluid right labeled warning-text forbid-warning-text'> </div> <div class='http-ssh-item mb-2'> <div> 为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置 </div> <div class='textarea-box mt-2'> <textarea class='textarea-content-box' id='global-config-clone' readonly>git config --global user.name userName 
git config --global user.email userEmail</textarea> <i class='icon iconfont icon-clone mr-2 btn-copy-clone text-dark' data-clipboard-target='#global-config-clone' id='btn-copy-global-config'></i> </div> </div> <div class='ssh-item item-panel-box'> <div class='mb-2'> 初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置 </div> <div class='mb-1'> <span>1</span> 生成 RSA 密钥 </div> <div class='ui fluid right labeled small input mb-2'> <input type="text" name="ssh_keygen_clone" id="ssh_keygen_clone" value="ssh-keygen -t rsa" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#ssh_keygen_clone' id='btn-copy-ssh_keygen'></i> </div> </div> <div class='mb-1'> <span>2</span> 获取 RSA 公钥内容,并配置到<a href='/profile/sshkeys' target="_blank"> SSH公钥 </a> 中 </div> <div class='ui fluid right labeled small input mb-2'> <input type="text" name="id_rsa_clone" id="id_rsa_clone" value="cat ~/.ssh/id_rsa.pub" onclick="focus();select()" readonly="readonly" /> <div class='ui basic label copy-icon-box'> <i class='icon iconfont icon-clone mr-0 btn-copy-clone' data-clipboard-target='#id_rsa_clone' id='btn-copy-d_rsa'></i> </div> </div> </div> <div class='svn-item item-panel-box'> <div class='mb-1 mt-2'> 在 Gitee 上使用 SVN,请访问<a href='https://help.gitee.com/enterprise/code-manage/%E4%BB%A3%E7%A0%81%E6%89%98%E7%AE%A1/%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93/Gitee%20SVN%E6%94%AF%E6%8C%81' target="_blank"> 使用指南 </a> </div> </div> <div class='http-item item-panel-box'> <div class='mb-2 mt-2'> 使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议<a href='/profile/personal_access_tokens' target="_blank"> 配置并使用私人令牌 </a>替代登录密码进行克隆、推送等操作 </div> <div>Username for 'https://gitee.com': userName</div> <div class='mb-1'> <span>Password for 'https://userName@gitee.com':</span> <span>#</span> <span> 私人令牌 </span> </div> </div> </div> </div> <style> #git-project-download-panel { top: 90px !important; } #git-project-download-panel input { color: #40485b !important; } #git-project-download-panel .textarea-box { width: 100%; height: 60px; color: #9d9d9d; border-radius: 2px; background-color: #F5F5F5 !important; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } #git-project-download-panel .menu-container { font-weight: bold; border-color: rgba(0, 0, 0, 0.1) !important; border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; } #git-project-download-panel .menu-container .item { padding: 7px 12px !important; } #git-project-download-panel .hr-item { color: rgba(39, 41, 43, 0.15) !important; } #git-project-download-panel .textarea-content-box { width: 100%; height: 60px; resize: none; border: 0px !important; background-color: #F5F5F5 !important; color: #40485b !important; } #git-project-download-panel .btn-copy-clone { cursor: pointer; color: rgba(0, 0, 0, 0.87) !important; } #git-project-download-panel .copy-icon-box { background-color: #F5F5F5 !important; border-left: 0px !important; } #git-project-download-panel .button-box { border: 0px !important; float: right !important; padding-right: 0 !important; } #git-project-download-panel .tip-box { border-bottom: 1px solid rgba(0, 0, 0, 0.1) !important; padding-bottom: 4px; font-weight: 700; } #git-project-download-panel .popup-container { padding: 8px 12px 4px 12px; text-align: center; font-size: 14px; } #git-project-download-panel .popup-container .ok { margin: 12px auto; width: 25%; min-width: 125px; display: block; } #git-project-download-panel .popup-container .cancel { margin-left: 0; } </style> <script> $(function () { var $btnClone = $('#btn-dl-or-clone') var $modalDownload = $('#git-project-download-panel'); var $input = $('#project_clone_url') var $inputUrl = $('#project_url_clone') var cloneUrlTitle= $('.clone-url-title') $('#btn-dl-or-clone').on('click', function (e) { e.preventDefault(); $modalDownload.modal('show'); }) $modalDownload.find('.menu > .item').on('click', function(e) { var $item = $(this).addClass('active'); $item.siblings().removeClass('active'); var dataUrl = $item.attr('data-url'); var cloneUrl = $item.attr('data-url'); var dataType = $item.attr('data-type') var cloneToLocal = '下载代码请复制以下命令到终端执行' if(dataType=='http'){ $modalDownload.find('.http-item').show(); $('.content > .item-panel-box:not(.http-item)').hide(); $modalDownload.find('.http-ssh-item').show(); cloneUrl = 'git clone '+dataUrl }else if(dataType=='ssh'){ $modalDownload.find('.ssh-item').show(); $('.content > .item-panel-box:not(.ssh-item)').hide(); $modalDownload.find('.http-ssh-item').show(); cloneUrl = 'git clone '+dataUrl }else if(dataType=='svn') { $('.content > .item-panel-box:not(.svn-item)').hide(); $modalDownload.find('.svn-item').show(); $modalDownload.find('.http-ssh-item').hide(); cloneUrl = 'svn checkout '+dataUrl }else { $('.content > .item-panel-box:not(.svn-item)').hide(); $modalDownload.find('.svn-item').show(); $modalDownload.find('.http-ssh-item').hide(); cloneUrl = 'svn checkout '+dataUrl } if (dataUrl) { $modalDownload.find('.download-url-panel').show(); $input.val(cloneUrl); $inputUrl.val(dataUrl) cloneUrlTitle.show(); $modalDownload.find('.forbid-warning-text').html(''); } else { $modalDownload.find('.download-url-panel').hide(); //$modalDownload.find('.svn-item').hide(); cloneUrlTitle.hide(); $modalDownload.find('.forbid-warning-text').html($item.attr('data-text') || ''); } $.cookie('remote_way', $item.attr('data-type'), { expires: 365, path: '/' }); }).filter('[data-type="' + ($.cookie('remote_way') || 'http') + '"]').trigger('click'); $('.btn-copy-clone').popup({ content: '点击复制', }).on('click', function(e) { e.stopPropagation(); return false; }).each(function(_, btnCopy) { var $btnCopy = $(btnCopy); new Clipboard(btnCopy).on('success', function() { $btnCopy.popup('destroy').popup({ content: '已复制', on: 'manual' }).popup('show'); setTimeout(function() { $btnCopy.popup('destroy').popup({ content: '点击复制' }); }, 2000); }); }); var $downloadBtn= $('.unlogin-download-btn') var $popupContainer = $('.popup-container') $downloadBtn.popup({ popup : $('.custom.popup'), position : 'bottom right', }).on('click', function(e) { $downloadBtn.popup('destroy').popup({ popup : $('.custom.popup'), on: 'manual', position : 'bottom right', }).popup('show'); setTimeout(function() { $downloadBtn.popup('hide'); }, 2000); }) }) </script> </div> <div class='d-inline pull-right' id='git-project-root-actions'> <div class='ui horizontal list repo-action-list d-flex d-align-center repo-action-list-right'> <div class='item search-box-container'> <div class='ui icon input search-input' id='search-box'> <input class='search-file-name' maxlength='40' placeholder='搜索文件' type='text'> </div> <a class='d-flex d-align-center head-search-file-btn' id='search-file-btn'> <span class='iconify' data-icon='gitee:search' style='font-size: 16px;color:#979CAC;margin-right:10px'></span> </a> <div class='filter-file-container' style='display: none;'></div> </div> <div class='item plus-box'> <div class='ui pointing right top dropdown git-project-file' id='git-project-file'> <span class='iconify' data-icon='gitee:plus' style='font-size: 16px;color:#979CAC'></span> <div class='menu repo-dropdown-box pt-1 pb-1'> <a title="新建文件" id="new_file_bread" class="item repo-action d-flex d-align-center" href="/aieditor-team/aieditor/new/main"><span class='iconify' data-icon='gitee:file' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建文件 </span> </a><a title="新建 Diagram 文件" class="item repo-action d-flex d-align-center" href="/aieditor-team/aieditor/new/main?ext=drawio"><span class='iconify' data-icon='gitee:lan' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建 Diagram 文件 </span> </a><div class='disabled item d-flex d-align-center'> <span class='iconify' data-icon='gitee:folder-sub' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 新建子模块 </span> </div> <div class='disabled item d-flex d-align-center'> <span class='iconify' data-icon='gitee:upload' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> <span> 上传文件 </span> </div> </div> </div> </div> <div class='item toschina-content__hidden webIDE-box' data-content='Web IDE'> <a class="ui d-flex d-align-center webide" target="_blank" href="/-/ide/project/aieditor-team/aieditor/edit/main/-/"><span class='iconify' data-icon='gitee:computer' style='font-size: 16px;color:#979CAC;margin-right:12px'></span> </a></div> </div> <script> $('.git-project-file').dropdown({ action: 'hide', onHide: function () { $('.plus-box').removeClass('click-active') }, onShow: function () { $('.plus-box').addClass('click-active') } }); </script> <script> $('.webIDE-box').popup() </script> <script src="https://cn-assets.gitee.com/assets/file_search/app-70df5c0292ce154e1b175402e02e32f4.js"></script> <style> .filter-file-container-hide { display: none !important; } </style> </div> <div class='breadcrumb_path path-breadcrumb-contrainer' id='git-project-breadcrumb'> </div> <div class='ui horizontal list repo-action-list branches-tags' style=''> <div class='item'> <a class="ui blank button" href="/aieditor-team/aieditor/branches"><i class='iconfont icon-branches'></i> 分支 1 </a></div> <div class='item mr-3'> <a class="ui blank button" href="/aieditor-team/aieditor/tags"><i class='iconfont icon-tag'></i> 标签 44 </a></div> </div> </div> <script src="https://cn-assets.gitee.com/webpacks/parse_blob_form_scheme-ea7503b4330a77e025e6.bundle.js"></script> <script> if(window.gon.locale == 'en') $('.branches-tags').css('margin-top', '12px') // 仓库页面切换路径时: 刷新 yaml 错误检查 $(window).on('pjax-complete:file-show', function () { window.parseBlobFormScheme && window.parseBlobFormScheme($('.js-blob-data').data('blob')); }); </script> <style> .ui.dropdown .menu > .header { text-transform: none; } </style> <script> $(function () { var $tip = $('#apk-download-tip'); if (!$tip.length) { return; } $tip.find('.btn-close').on('click', function () { $tip.hide(); }); }); (function(){ function pathAutoRender() { var $parent = $('#git-project-bread'), $child = $('#git-project-bread').children('.ui.horizontal.list'), mainWidth = 0; $child.each(function (i,item) { mainWidth += $(item).width() }); $('.breadcrumb.path.fork-path').remove(); if (mainWidth > 995) { $('#path-breadcrumb').hide(); $parent.append('<div class="ui breadcrumb path fork-path">' + $('#path-breadcrumb').html() + '<div/>') } else { $('#path-breadcrumb').show(); } } window.pathAutoRender = pathAutoRender; pathAutoRender(); })(); </script> <div class='branch-diff-notice-bar hide'> <div class='left-section'></div> <div class='right-section'> <div class='ui button gradient contribute'> 贡献代码 <i class='dropdown icon'></i> </div> <div class='ui button gradient branch-sync hide'> 同步代码 <i class='dropdown icon'></i> </div> </div> </div> <div class='ui popup contribute branch-diff-pop-panel contribute-pop'> <div class='notice-title'></div> <div class='notice-sub-title'></div> <div class='notice-content'></div> <a class='ui button orange fluid disabled create-pr' href='/' target='_blank'> 创建 Pull Request </a> </div> <div class='ui popup branch-diff-pop-panel branch-sync-pop'> <div class='notice-title'></div> <div class='notice-content'></div> <div class='known-more'> <a href='/help/articles/4395' target='_blank'> 了解更多 </a> </div> <div class='btn-group'> <div class='ui button basic red discard-btn hide'></div> <a class='ui button orange basic diff-btn hide' href='/' target='_blank'> 对比差异 </a> <a class='ui button gradient pr-sync-btn hide' href='/' target='_blank'> 通过 Pull Request 同步 </a> <div class='ui buttons basic dropdown-group-btn hide'> <div class='ui button branch-sync-btn'> 同步更新到分支 </div> <div class='ui button dropdown dropdown-create-pr'> <i class='icon dropdown'></i> <div class='menu'> <div class='disabled item'> <div> 通过 Pull Request 同步 <div class='text-muted fs-12 mt-1'> 将会在向当前分支创建一个 Pull <br/>Request,合入后将完成同步 </div> </div> </div> </div> </div> </div> </div> </div> <script> (function () { const i18_compare_current_branch = `当前分支与 <a href="URL">BRANCH</a> 相比` const i18_branch_ahead_commit = `,领先 <a href="URL">NUM 个 Commit</a>` const i18_branch_behind_commit = `,落后 <a href="URL">NUM 个 Commit</a>` const i18_contribute_ahead_title = `当前分支比 BRANCH 领先了 NUM 次提交。` const i18_contribute_pr_create = `创建一个 Pull Request 贡献代码。` const i18_contribute_has_pr = `已创建了 Pull Request` const i18_contribute_no_ahead = `这个分支没有领先于 BRANCH 的代码提交。` const i18_branch_sync_behind = `这个分支已落后于 BRANCH 分支` const i18_branch_sync_behind_desc = `从 BRANCH 分支同步 NUM 个提交来更新分支以保持当前分支代码是最新的。` const i18_branch_sync_out_of_date = `此分支已过时` const i18_branch_sync_out_of_date_desc = `你可以将 BRANCH 分支中的最新更改合并到此分支中。或丢弃当前分支上的提交以使当前分支与 BRANCH 分支匹配。这将从当前分支中删除 NUM 个提交。` const i18_branch_discard_diff = `丢弃 NUM 个提交` const i18_branch_sync_success = `同步成功` const i18_branch_sync_fail = `同步失败` const i18_branch_discard_success = `丢弃成功` const i18_branch_discard_fail = `丢弃失败` window.locale_temple_branch_diff = { i18_compare_current_branch, i18_branch_ahead_commit, i18_branch_behind_commit, i18_contribute_ahead_title, i18_contribute_pr_create, i18_contribute_has_pr, i18_contribute_no_ahead, i18_branch_sync_behind, i18_branch_sync_behind_desc, i18_branch_sync_out_of_date, i18_branch_sync_out_of_date_desc, i18_branch_discard_diff, i18_branch_sync_success, i18_branch_sync_fail, i18_branch_discard_success, i18_branch_discard_fail } })(); </script> <div class='row column tree-holder' id='tree-holder'> <div class='tree-content-holder' id='tree-content-holder'> <div class='ui flat nopadding segment tree-content'> <div class='git-project-recent-commit' id='git-project-info'> <div class='recent-commit'> <a class="commit-author-link js-popover-card " data-username="fuhai" href="/fuhai"><img class="avatar circular ui image 20 mini" width="20" alt="" src="https://foruda.gitee.com/avatar/1716893681414311163/61279_fuhai_1716893681.png!avatar30" /> <span class="commit-author-name">Michael Yang</span></a> <span> <a class="repo-index-commit-msg" title="chore: update demos" href="/aieditor-team/aieditor/commit/8a0c7e8b4229a08ace4ec4933114b40f713de537">chore: update demos</a> </span> <span>8a0c7e8</span> <span class='timeago' datetime='2024-11-22 12:16' title='2024-11-22 12:16:56 +0800'></span> <check-runs branch='main' commit-id='8a0c7e8b4229a08ace4ec4933114b40f713de537' project-path='aieditor-team/aieditor'></check-runs> <build-status commit-id='8a0c7e8b4229a08ace4ec4933114b40f713de537'></build-status> </div> <div class='all-commits'> <a href="/aieditor-team/aieditor/commits/main"><i class='iconfont icon-commit'></i> 674 次提交 </a></div> </div> <div class='grid list selection table_da39a3ee5e6b4b0d3255bfef95601890afd80709 tree-table ui' id='tree-slider'> <div class='create-folder-form form ui'> <form id="folder_form-edit" action="/aieditor-team/aieditor/new/main" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="jrHoiJgSvmzo5CdilzjefgW2n4vs4wakZS+AQh4vYTiR+A2TImtqzfW7p6Fngw7Z0XTC7t47kpDANAmXpuZw0A==" /> <div class='fields'> <div class='field'> <input type="hidden" name="new_file_path" id="new_file_path" /> <input type="hidden" name="content" id="content" /> <input id='new_folder_path' name='new_folder_path' placeholder='新建文件夹' type='text'> </div> <div class='field'> <button name="button" type="submit" class="ui primary button orange submit field-init-btn js-submit-btn">提交</button> <a class="ui basic white button cancel field-init-btn" href="javascript:void(0)">取消</a> </div> <div class='ui mid-center small message notice'> <strong>提示:</strong> 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件 </div> </div> </form> </div> <div class='file_4c40eab00f24304ca400313319c58d461788ff5e row tree-item' data-branch='main' data-type='folder' file_hex='file_4c40eab00f24304ca400313319c58d461788ff5e'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='.github/workflows' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title=".github/workflows" href="/aieditor-team/aieditor/tree/main/.github/workflows"><span class='simplified-path'>.github/</span>workflows <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_4c40eab00f24304ca400313319c58d461788ff5e row tree-item tree-item-rename' file_hex='file_4c40eab00f24304ca400313319c58d461788ff5e' style='display:none'> <div class='ui column form' path='tree/main/.github/workflows'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='workflows'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_6668acef4dfdfb88ac3e20a1ac2f49aeb7ee2969 row tree-item' data-branch='main' data-type='folder' file_hex='file_6668acef4dfdfb88ac3e20a1ac2f49aeb7ee2969'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='demos' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="demos" href="/aieditor-team/aieditor/tree/main/demos"><span class='simplified-path'></span>demos <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_6668acef4dfdfb88ac3e20a1ac2f49aeb7ee2969 row tree-item tree-item-rename' file_hex='file_6668acef4dfdfb88ac3e20a1ac2f49aeb7ee2969' style='display:none'> <div class='ui column form' path='tree/main/demos'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='demos'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_024500726b0338bc6cd058d72a8ba911f248bd1f row tree-item' data-branch='main' data-type='folder' file_hex='file_024500726b0338bc6cd058d72a8ba911f248bd1f'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='dist' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="dist" href="/aieditor-team/aieditor/tree/main/dist"><span class='simplified-path'></span>dist <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_024500726b0338bc6cd058d72a8ba911f248bd1f row tree-item tree-item-rename' file_hex='file_024500726b0338bc6cd058d72a8ba911f248bd1f' style='display:none'> <div class='ui column form' path='tree/main/dist'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='dist'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_71ab8b6afb1bae3df247e0286da35e0da16564ff row tree-item' data-branch='main' data-type='folder' file_hex='file_71ab8b6afb1bae3df247e0286da35e0da16564ff'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='docs' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="docs" href="/aieditor-team/aieditor/tree/main/docs"><span class='simplified-path'></span>docs <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_71ab8b6afb1bae3df247e0286da35e0da16564ff row tree-item tree-item-rename' file_hex='file_71ab8b6afb1bae3df247e0286da35e0da16564ff' style='display:none'> <div class='ui column form' path='tree/main/docs'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='docs'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9 row tree-item' data-branch='main' data-type='folder' file_hex='file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9'> <div class='five wide column tree-item-file-name tree-folder tree-list-item d-align-center' data-path='src' data-type='folder'> <i class='iconfont icon-folders file-icon-item'></i> <a class="tree-folder-item" title="src" href="/aieditor-team/aieditor/tree/main/src"><span class='simplified-path'></span>src <div class='js-tree-row-lfs'></div> </a></div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9 row tree-item tree-item-rename' file_hex='file_f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9' style='display:none'> <div class='ui column form' path='tree/main/src'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='src'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_e360fad5b6efa2ddba75769ed72a37505224b2ea row tree-item' data-branch='main' data-type='file' file_hex='file_e360fad5b6efa2ddba75769ed72a37505224b2ea'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='.eslintrc.cjs' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title=".eslintrc.cjs" href="/aieditor-team/aieditor/blob/main/.eslintrc.cjs">.eslintrc.cjs</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_e360fad5b6efa2ddba75769ed72a37505224b2ea row tree-item tree-item-rename' file_hex='file_e360fad5b6efa2ddba75769ed72a37505224b2ea' style='display:none'> <div class='ui column form' path='blob/main/.eslintrc.cjs'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='.eslintrc.cjs'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_a5cc2925ca8258af241be7e5b0381edf30266302 row tree-item' data-branch='main' data-type='file' file_hex='file_a5cc2925ca8258af241be7e5b0381edf30266302'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='.gitignore' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title=".gitignore" href="/aieditor-team/aieditor/blob/main/.gitignore">.gitignore</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_a5cc2925ca8258af241be7e5b0381edf30266302 row tree-item tree-item-rename' file_hex='file_a5cc2925ca8258af241be7e5b0381edf30266302' style='display:none'> <div class='ui column form' path='blob/main/.gitignore'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='.gitignore'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_0398ccd0f49298b10a3d76a47800d2ebecd49859 row tree-item' data-branch='main' data-type='file' file_hex='file_0398ccd0f49298b10a3d76a47800d2ebecd49859'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='LICENSE' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="LICENSE" href="/aieditor-team/aieditor/blob/main/LICENSE">LICENSE</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_0398ccd0f49298b10a3d76a47800d2ebecd49859 row tree-item tree-item-rename' file_hex='file_0398ccd0f49298b10a3d76a47800d2ebecd49859' style='display:none'> <div class='ui column form' path='blob/main/LICENSE'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='LICENSE'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_6193d1197aab193342913d157c58c6cfd40ddfc6 row tree-item' data-branch='main' data-type='file' file_hex='file_6193d1197aab193342913d157c58c6cfd40ddfc6'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='changes.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="changes.md" href="/aieditor-team/aieditor/blob/main/changes.md">changes.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_6193d1197aab193342913d157c58c6cfd40ddfc6 row tree-item tree-item-rename' file_hex='file_6193d1197aab193342913d157c58c6cfd40ddfc6' style='display:none'> <div class='ui column form' path='blob/main/changes.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='changes.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_f6013a00b362253c64368d6eebc50ea2131754e2 row tree-item' data-branch='main' data-type='file' file_hex='file_f6013a00b362253c64368d6eebc50ea2131754e2'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='index.html' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="index.html" href="/aieditor-team/aieditor/blob/main/index.html">index.html</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_f6013a00b362253c64368d6eebc50ea2131754e2 row tree-item tree-item-rename' file_hex='file_f6013a00b362253c64368d6eebc50ea2131754e2' style='display:none'> <div class='ui column form' path='blob/main/index.html'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='index.html'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_fa288d1472d29beccb489a676f68739ad365fc47 row tree-item' data-branch='main' data-type='file' file_hex='file_fa288d1472d29beccb489a676f68739ad365fc47'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='package-lock.json' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="package-lock.json" href="/aieditor-team/aieditor/blob/main/package-lock.json">package-lock.json</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_fa288d1472d29beccb489a676f68739ad365fc47 row tree-item tree-item-rename' file_hex='file_fa288d1472d29beccb489a676f68739ad365fc47' style='display:none'> <div class='ui column form' path='blob/main/package-lock.json'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='package-lock.json'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_7030d0b2f71b999ff89a343de08c414af32fc93a row tree-item' data-branch='main' data-type='file' file_hex='file_7030d0b2f71b999ff89a343de08c414af32fc93a'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='package.json' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="package.json" href="/aieditor-team/aieditor/blob/main/package.json">package.json</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_7030d0b2f71b999ff89a343de08c414af32fc93a row tree-item tree-item-rename' file_hex='file_7030d0b2f71b999ff89a343de08c414af32fc93a' style='display:none'> <div class='ui column form' path='blob/main/package.json'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='package.json'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_662d1f8e97de8a81f46250b3479e1668f6ce5188 row tree-item' data-branch='main' data-type='file' file_hex='file_662d1f8e97de8a81f46250b3479e1668f6ce5188'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='readme.ja.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="readme.ja.md" href="/aieditor-team/aieditor/blob/main/readme.ja.md">readme.ja.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_662d1f8e97de8a81f46250b3479e1668f6ce5188 row tree-item tree-item-rename' file_hex='file_662d1f8e97de8a81f46250b3479e1668f6ce5188' style='display:none'> <div class='ui column form' path='blob/main/readme.ja.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='readme.ja.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_275d783e298228506068436512433d343feb52aa row tree-item' data-branch='main' data-type='file' file_hex='file_275d783e298228506068436512433d343feb52aa'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='readme.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="readme.md" href="/aieditor-team/aieditor/blob/main/readme.md">readme.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_275d783e298228506068436512433d343feb52aa row tree-item tree-item-rename' file_hex='file_275d783e298228506068436512433d343feb52aa' style='display:none'> <div class='ui column form' path='blob/main/readme.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='readme.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_1701dc2bee1a2c245d98d343c063cdb6378cd9c8 row tree-item' data-branch='main' data-type='file' file_hex='file_1701dc2bee1a2c245d98d343c063cdb6378cd9c8'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='readme.zh.md' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="readme.zh.md" href="/aieditor-team/aieditor/blob/main/readme.zh.md">readme.zh.md</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_1701dc2bee1a2c245d98d343c063cdb6378cd9c8 row tree-item tree-item-rename' file_hex='file_1701dc2bee1a2c245d98d343c063cdb6378cd9c8' style='display:none'> <div class='ui column form' path='blob/main/readme.zh.md'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='readme.zh.md'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_61ebb9fd6e8cf9082658121d5d81e297791dacd0 row tree-item' data-branch='main' data-type='file' file_hex='file_61ebb9fd6e8cf9082658121d5d81e297791dacd0'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='tsconfig.json' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="tsconfig.json" href="/aieditor-team/aieditor/blob/main/tsconfig.json">tsconfig.json</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_61ebb9fd6e8cf9082658121d5d81e297791dacd0 row tree-item tree-item-rename' file_hex='file_61ebb9fd6e8cf9082658121d5d81e297791dacd0' style='display:none'> <div class='ui column form' path='blob/main/tsconfig.json'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='tsconfig.json'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_75ea7f3ea6d80d54bb5b2357996972d1632a5038 row tree-item' data-branch='main' data-type='file' file_hex='file_75ea7f3ea6d80d54bb5b2357996972d1632a5038'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='vite.config.ts' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="vite.config.ts" href="/aieditor-team/aieditor/blob/main/vite.config.ts">vite.config.ts</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_75ea7f3ea6d80d54bb5b2357996972d1632a5038 row tree-item tree-item-rename' file_hex='file_75ea7f3ea6d80d54bb5b2357996972d1632a5038' style='display:none'> <div class='ui column form' path='blob/main/vite.config.ts'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='vite.config.ts'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> <div class='file_53585a096fe3a3b96321113856ae62602995a33b row tree-item' data-branch='main' data-type='file' file_hex='file_53585a096fe3a3b96321113856ae62602995a33b'> <div class='five wide column tree-item-file-name tree-list-item d-align-center' data-path='yarn.lock' data-type='file'> <i class="iconfont icon-file"></i> <a class="tree-folder-item" title="yarn.lock" href="/aieditor-team/aieditor/blob/main/yarn.lock">yarn.lock</a> <div class='js-tree-row-lfs'></div> </div> <div class='js-tree-row-commit'></div> </div> <div class='rename-file_53585a096fe3a3b96321113856ae62602995a33b row tree-item tree-item-rename' file_hex='file_53585a096fe3a3b96321113856ae62602995a33b' style='display:none'> <div class='ui column form' path='blob/main/yarn.lock'> <div class='two fields'> <div class='five wide field'> <input class='ui input' name='new_filename' type='text' value='yarn.lock'> </div> <div class='five wide field'> <button class='ui blue button popup-save' type='submit'>保存</button> <button class='ui basic button popup-close'>取消</button> </div> </div> </div> </div> </div> </div> <div class='ui tree_progress' data-logs-path='/aieditor-team/aieditor/refs/main/logs_tree/'> <div class='ui active inverted dimmer'> <div class='ui small text loader'>Loading...</div> </div> </div> <div class='readme-box' id='git-readme'> <div class='ui flat nopadding segment file_holder'> <div class='file_title d-flex-between file_readme_title'> <div class='d-flex'> <div class='file_title_readme mr-1 pb-1 active-title pr-1 pl-1'> <i class='iconfont icon-readme mr-05'></i> <span class='file_name'>README</span> </div> <div class='file_title_license pb-1 pl-1 pr-1'> <i class='iconfont icon-licence mr-05'></i> <span class='file_name'> LGPL-2.1 </span> </div> </div> <div> <div class='readme-edit'> <a class='text-muted edit_path edit-blob' href='/aieditor-team/aieditor/edit/main/readme.zh.md' title='只有登陆后才可以编辑'> <i class='iconfont icon-edit mr-05'></i> </a> </div> <div class='hide lisence-edit'> <a class='text-muted edit_path edit-blob' href='/aieditor-team/aieditor/edit/main/LICENSE' title='只有登陆后才可以编辑'> <i class='iconfont icon-edit mr-05'></i> </a> </div> </div> </div> <div class='readme-content'> <div class='file_catalog'> <div class='toggle'> <i class='icon angle left'></i> </div> <div class='scroll-container'> <div class='container'> <div class='skeleton'> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> </div> </div> </div> </div> <div class='file_content markdown-body'> <blob-markdown-renderer data-dir='' data-path-with-namespace='/aieditor-team/aieditor'>
<textarea class='content' style='display:none;'><h4 align="right"><a href="./readme.md">English</a> | <strong>简体中文</strong> | <a href="./readme.ja.md">日本語</a></h4>


![](./docs/assets/image/readme-banner.png)



<h1 align="center"><a href="https://aieditor.dev/zh/" target="_blank">AIEditor.dev</a></h1>
<h4 align="center"><a href='https://gitee.com/aieditor-team/aieditor/stargazers'><img src='https://gitee.com/aieditor-team/aieditor/badge/star.svg?theme=gvp' alt='star' /></a></h4>

<h2 align="center">AI 驱动的开源富文本编辑器</h2>
<h3 align="center">开箱即用、支持所有前端框架、支持 Markdown 书写模式</h4>


![](./docs/assets/image/index-banner1.png)

## 开始关注并使用 AIEditor

给我们 star,这样,在我们发布新的版本时,您可以及时获得通知。


![](./docs/assets/image/star.gif)


## 什么是 AIEditor

AiEditor 是一个面向 AI 的下一代富文本编辑器,她基于 Web Component,因此支持 Layui、Vue、React、Angular 等几乎任何前端框架。她适配了 PC Web 
端和手机端,并提供了 亮色 和 暗色 两个主题。除此之外,她还提供了灵活的配置,开发者可以方便的使用其开发任何文字编辑的应用。

更多关于 AiEditor,请访问官网: https://aieditor.dev 


## AIEditor 的与众不同之处

### 1、AI 驱动的编辑器
AIEditor 的目标是打造一个完全由 AI 驱动的富文本编辑器,同时支持对接任意大模型,包括私有的大模型。允许用户使用自己私有的大模型 ApiKey。
不仅如此,AIEditor 其所有的 AI 功能,都允许用户自定义自己的 prompt,以及扩展的 AI 菜单。


### 2、简单、友好、易用

AIEditor 基于 Web Component 开发,支持与任意主流的前端框架集成。AIEditor 使用更加友好的 LGPL 开源协议,通过 `npm i aieditor` 使用,
不用担心 GPL 协议可能带来的 GPL 传染问题。


### 3、除了开源版,还提供商业 Pro 版
除了开源版以外,我们还提供了功能更加强大的商业,商业 Pro 版不限制用户量、不限制应用数量。更多商业 Pro 版的对比,
可以参考这里:https://aieditor.dev/versions.html


## 在线演示

- 现代风格(类腾讯文档): http://doc.aieditor.com.cn
- 经典/传统风格: https://aieditor.dev/demo.html


## 已完善

- [x] **基础**:标题、正文、字体、字号、加粗、斜体、下划线、删除线、链接、行内代码、上标、下标、分割线、引用、打印
- [x] **增强**:撤回、重做、格式刷、橡皮擦、待办事项、字体颜色、背景颜色、Emoji 表情、对齐方式、行高、有(无)序列表、段落缩进、强制换行
- [x] **附件**:支持图片、视频、文件功能,支持选择上传、粘贴上传、拖拽上传、支持拖动调整大小...
- [x] **代码**:行内代码、代码块、语言类型选择、**AI 自动注释**、**AI 代码解释**...
- [x] **表格**:左增右增、左减右减、上增下增、上减下减、合并单元格、解除合并
- [x] **Markdown**:标题、引用、表格、图片、代码块、**高亮块(类似 vuepress 的 :::)**、各种列表、粗体、斜体、删除线...
- [x] **A I**:AI 续写、AI 优化、AI 校对、AI 翻译、自定义 AI 菜单及其 Prompts
- [x] **更多**:国际化、亮色主题、暗色主题、手机适配、全屏编辑、@某某某(提及)...
- [x] 类腾讯文档现代 UI 风格

## 商业 Pro 版
- [x] 类 Notion 内容块拖拽功能
- [x] Word 导入、Word 导出
- [x] PDF 导出
- [x] Latex 数学公式编辑
- [x] 团队协作(多个人同时编辑一份文档)
- [x] 批注功能,类似 word 选择一段文字进行批注评论的功能

商业 Pro 版演示:http://pro.aieditor.com.cn/

## 开发中...

- [ ] AI 插入图片
- [ ] AI 图生图(AI 图片优化)
- [ ] AI 一键排版
- [ ] 进一步增强粘贴功能
- [ ] 上传视频自动获取缩略图


## 快速开始

访问官网:https://aieditor.dev/zh/getting-started.html

## 交流

QQ 群:560291578

![qq-group.png](docs%2Fassets%2Fimage%2Fqq-group.png)</textarea>
<div class='loader-wrapper'>
<div class='ui inline mini active loader'></div>
</div></blob-markdown-renderer>
</div> <div class='file_line'></div> </div> <div class='hide lisence-content'> <div class='file_content code'> <div class='d-block lines mb-1 ml-3 mr-3 mt-1 white'> <div class='preformatted'>
 GNU LESSER GENERAL PUBLIC LICENSE
 Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL. It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

 Preamble

 The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

 This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

 When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

 To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

 For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.

 We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

 To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

 Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

 Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

 When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.

 We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.

 For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

 In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

 Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

 The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

 GNU LESSER GENERAL PUBLIC LICENSE
 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

 0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

 A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

 The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)

 "Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

 Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.

 1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

 You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

 2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

 a) The modified work must itself be a software library.

 b) You must cause the files modified to carry prominent notices
 stating that you changed the files and the date of any change.

 c) You must cause the whole of the work to be licensed at no
 charge to all third parties under the terms of this License.

 d) If a facility in the modified Library refers to a function or a
 table of data to be supplied by an application program that uses
 the facility, other than as an argument passed when the facility
 is invoked, then you must make a good faith effort to ensure that,
 in the event an application does not supply such function or
 table, the facility still operates, and performs whatever part of
 its purpose remains meaningful.

 (For example, a function in a library to compute square roots has
 a purpose that is entirely well-defined independent of the
 application. Therefore, Subsection 2d requires that any
 application-supplied function or table used by this function must
 be optional: if the application does not supply it, the square
 root function must still compute square roots.)

These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

 3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.

 Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

 This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

 4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

 If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

 5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

 However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

 When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.

 If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

 Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

 6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

 You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:

 a) Accompany the work with the complete corresponding
 machine-readable source code for the Library including whatever
 changes were used in the work (which must be distributed under
 Sections 1 and 2 above); and, if the work is an executable linked
 with the Library, with the complete machine-readable "work that
 uses the Library", as object code and/or source code, so that the
 user can modify the Library and then relink to produce a modified
 executable containing the modified Library. (It is understood
 that the user who changes the contents of definitions files in the
 Library will not necessarily be able to recompile the application
 to use the modified definitions.)

 b) Use a suitable shared library mechanism for linking with the
 Library. A suitable mechanism is one that (1) uses at run time a
 copy of the library already present on the user's computer system,
 rather than copying library functions into the executable, and (2)
 will operate properly with a modified version of the library, if
 the user installs one, as long as the modified version is
 interface-compatible with the version that the work was made with.

 c) Accompany the work with a written offer, valid for at
 least three years, to give the same user the materials
 specified in Subsection 6a, above, for a charge no more
 than the cost of performing this distribution.

 d) If distribution of the work is made by offering access to copy
 from a designated place, offer equivalent access to copy the above
 specified materials from the same place.

 e) Verify that the user has already received a copy of these
 materials or that you have already sent this user a copy.

 For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

 It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

 7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

 a) Accompany the combined library with a copy of the same work
 based on the Library, uncombined with any other library
 facilities. This must be distributed under the terms of the
 Sections above.

 b) Give prominent notice with the combined library of the fact
 that part of it is a work based on the Library, and explaining
 where to find the accompanying uncombined form of the same work.

 8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

 9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

 10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

 11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

 12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.

 13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

 14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

 NO WARRANTY

 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

 END OF TERMS AND CONDITIONS

 How to Apply These Terms to Your New Libraries

 If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

 To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

 <one line to give the library's name and a brief idea of what it does.>
 Copyright (C) <year> <name of author>

 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
 USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:

 Yoyodyne, Inc., hereby disclaims all copyright interest in the
 library `Frob' (a library for tweaking knobs) written by James Random
 Hacker.

 <signature of Ty Coon>, 1 April 1990
 Ty Coon, President of Vice

That's all there is to it!

</div></div> </div> </div> </div> </div> <script> "use strict"; if ($('.markdown-body').children("style").length != 0) { var i, array = $('.markdown-body').children("style"); array.first().attr('scoped',''); $.scoped(); } $('.appeal_message').removeClass('text-center') $(".file_title_readme").click(function(event) { $('.lisence-content').hide() $('.readme-content').show() $('.lisence-edit').hide() $('.readme-edit').show() $('.file_title_readme').addClass('active-title') $('.file_title_license').removeClass('active-title') }); $(".file_title_license").click(function(event) { $('.lisence-content').show() $('.readme-content').hide() $('.lisence-edit').show() $('.readme-edit').hide() $('.file_title_license').addClass('active-title') $('.file_title_readme').removeClass('active-title') }); try { if((gon.wait_fork!=undefined && gon.wait_fork==true) || (gon.wait_fetch!=undefined && gon.wait_fetch==true)){ $('.edit-blob').popup({content:"当前仓库正在后台处理中,暂时无法编辑", on: 'hover', delay: { show: 200, hide: 200 }}); $('.edit-blob').click(function(e){ e.preventDefault(); }) } }catch (error) {} $('.disabled-edit-readonly').popup({ content: "只读文件不可编辑", className: { popup: 'ui popup', }, position: 'bottom center', }) $('.disabled-edit-readonly, .disabled-edit-status').click(function() { return false }) $('.has_tooltip').popup({ position: 'top center' }); </script> <style> .txt-style { background: #FFF !important; padding: 0 !important; } .file_readme_title { padding-bottom: 0 !important; cursor: pointer; } .active-title { border-bottom: 2px solid #fe7300; } .preformatted { font-family: monospace; word-wrap: break-word; white-space: pre-wrap; word-break: keep-all; } .disabled-edit-readonly, .has_tooltip { color: #40485b !important; cursor: default !important; opacity: 0.3 !important; } </style> </div> <div class='project__footer-container'> <div class='actions'> <div class='item star-container'> <div class='unstar'> <a sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Star" sa_referrer_type="仓库页面" href="/login"><div class='circle'> <i class='iconfont icon-star-solid'></i> </div> </a><a class="content" href="/aieditor-team/aieditor/stargazers"><div class='title'> Starred </div> <div class='desc action-social-count'> 1.2K </div> </a></div> <div class='star'> <a sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Star" sa_referrer_type="仓库页面" href="/login"><div class='circle'> <i class='iconfont icon-star'></i> </div> </a><a class="content" href="/aieditor-team/aieditor/stargazers"><div class='title'> Star </div> <div class='desc action-social-count'> 1.2K </div> </a></div> </div> <div class='item fork-container'> <a sa_evt="loginInform_show" sa_referrer_url="" sa_referrer_action="Fork" sa_referrer_type="仓库页面" href="/login"><div class='circle'> <i class='iconfont icon-fork'></i> </div> </a><a href="/aieditor-team/aieditor/members"><div class='content'> <div class='title'> Fork </div> <div class='desc'> 204 </div> </div> </a></div> <div class='item donate-container'> <div class='circle'> <i class='iconfont icon-donate'></i> </div> <div class='content'> <div class='title'>捐赠</div> <div class='desc'> 0 人次 </div> </div> </div> </div> </div> <script> var $donateModal = $('.project-donate-modal'); $('.donate-container').on('click', '.circle, .content', function () { $donateModal.modal('show'); }); </script> <script id='tree-item-context-menu-template' type='text/plain'> <div class='ui menu compact vertical tree-context'> <a class='btn-open-new-tab item tree-operation'> <i class='file outline icon'></i> 新标签打开 </a> <a class='btn-copy item tree-operation'> <i class='copy icon'></i> 复制 </a> <a class='btn-rename item tree-operation'> <i class='edit icon'></i> 重命名 </a> <a class='btn-delete item tree-operation'> <i class='trash icon'></i> 删除 </a> </div> </script> <script id='tree-item-submodule-context-menu-template' type='text/plain'> <div class='ui menu compact vertical tree-context'> <a class='btn-copy item tree-operation'> <i class='copy icon'></i> 复制 </a> <a class='btn-compact-edit item tree-operation submodule_item'> <i class='edit icon'></i> 编辑 </a> <a class='btn-submodule-delete item tree-operation submodule_item'> <i class='trash icon'></i> 删除 </a> </div> </script> <script src="/static/javascripts/file-icons.js"></script> <script> $(function() { $(".tree-list-item").each(function(){ $this = $(this) var path = $this.attr('data-path') var type = $this.attr('data-type') $icon = $this.find('i') if(type==='file'){ let iconClass=''; try { iconClass = FileIcons.getClassWithColor(path) || 'file-generic'; } catch (err) {} if(iconClass) $icon.attr('class', "file-icon-item iconfont icon-file ".concat(iconClass)); } }) var $createFolderForm = $('.create-folder-form'), $createFolderSubmitBtn = $('.create-folder-form .js-submit-btn') $folderPath = $('#new_folder_path'), $message = $('.create-folder-form .notice'), folders = [".github","demos","dist","docs","src"], folderReg = new RegExp(/\/+/); var INDEX_BEGIN_WITH_READONLY_DIR = 0 var gitGCModal = new GiteeModalHelper({ approveText: "确认", cancelText: "取消", okText: "确认", }) function checkFolder(folder) { var i, itemArr; if (folder == '') { return false; } for (i = 0; i< folders.length; i++) { itemArr = folders[i].split('/'); if (itemArr[0] == folder){ return true } } return false; } function createFolderShow () { $createFolderForm.show(); $folderPath.focus(); } $('.create-folder-form .cancel').click(function () { $createFolderForm.hide(); }) $folderPath.on('input', function (e) { if($(this).parent().hasClass('error')) { $message.removeClass('warn').html("<strong>提示:</strong> 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件"); $(this).parent().removeClass('error'); } $createFolderSubmitBtn.removeClass('disabled'); }) $createFolderForm.submit(function (e) { var value = $folderPath.val(); if (!folderReg.test(value) && !checkFolder(value) && value) { $('#new_file_path').val(value + '/.keep'); } else { $message.addClass('warn').html("文件夹名不为空,不含有字符(/)且不能与当前目录文件夹同名"); $folderPath.parent().addClass('error'); e.preventDefault(); } $createFolderSubmitBtn.addClass('disabled'); }) $('.create-folder').click(createFolderShow) $('#create-folder').click(createFolderShow); window.createFolderShow = createFolderShow; window.hasTreeContextMenu = false; var contextMenuTemplate = $('#tree-item-context-menu-template').html(); var submoduleContextMenuTemplate = $("#tree-item-submodule-context-menu-template").html(); if ("true" == "false" || "true" == "false" || "false" == "false") { return; } function createContextMenu($item, x, y) { if (hasTreeContextMenu) { $('.tree-context').remove(); hasTreeContextMenu = false; return; } hasTreeContextMenu = true; var isSubmodule = $item.hasClass('tree-item-submodule-name') var path = $item.parent().find('a').attr('href'); var $menu = isSubmodule ? $(submoduleContextMenuTemplate).appendTo('body') : $(contextMenuTemplate).appendTo('body'); var readonly = $item.attr('data-readonly') !== undefined var submoduleEditUrl = $item.closest('.tree-item').attr('edit_url') var submoduleDeleteUrl = $item.closest('.tree-item').attr('delete_url') var hasNormal = $item.closest('.tree-item')[0].hasAttribute('normal') if ($('.btn-readonly')[0]) { if (readonly) { $('.btn-readonly')[0].children[0].className = 'icon unlock' $('.btn-readonly')[0].lastChild.data = "取消只读" } else { $('.btn-readonly')[0].lastChild.data = "标记为只读" } } $menu.css({ left: x, top: y , 'min-width': '90px'}); $menu.find('.btn-open-new-tab').attr({ href: path, target: '_blank' }); window.Clipboard && new Clipboard('.btn-copy', { text: function () { return $item.text().trim(); } }); // submodule 菜单事件 // 编辑子模块 if (!hasNormal) { $menu.find('.btn-compact-edit').addClass('disabled') } $menu.find('.btn-compact-edit').on('click', function(event) { if (!hasNormal) { return } window.location.href = submoduleEditUrl }); // 删除子模块 $menu.find('.btn-submodule-delete').on('click', function(event) { removeSubmodule(submoduleDeleteUrl, $item) }); // 普通文件 菜单事件 $menu.find('.btn-rename').on('click', function(event) { rename($item.parent().attr('file_hex')); }); $menu.find('.btn-delete').on('click', function(event) { removeFile($item.parent().next().find('.ui.form').attr('path').replace(/\+/g, '%20'), $item.find('a').text()); }) $menu.find('.btn-readonly').on('click', function(event) { var obj = $item.parent().next().find('.ui.form').attr('path').replace(/\+/g, '%20') var readonly = $item.attr('data-readonly') !== undefined if (readonly) { removeReadonlyMark(obj, $item) } else { addReadonlyMark(obj, $item) } }) $menu.find('.btn-readonly-is-uncharged-enterprise').popup({ content: "仅付费企业版可使用文件只读功能", className: { popup: 'ui popup', }, position: 'bottom center' }) $menu.find('.btn-readonly-is-open-svn').popup({ content: "仓库已开启 SVN 支持,无法标记只读文件/目录", className: { popup: 'ui popup', }, position: 'bottom center' }) } // submodule 右键菜单事件 var editing = false $(document).on('click',function(event){ if (hasTreeContextMenu && event.button !== 2) { setTimeout(function () { $('.tree-context').remove(); hasTreeContextMenu = false; }, 200); } }) $('.tree-item').on('click',function(event){ if (hasTreeContextMenu) { event.preventDefault(); } }) function isReadonly(path) { if (!gon.readonlyItems) { return false } else { var item_path = getItemPath(path, 'folder') return isTreeItemReadonly(item_path, gon.readonlyItems) } } function isParentsReadonly(path) { var self_path = path.replace(/\/$/, '') var parentPathArray = self_path.split('/') if (parentPathArray.length < 2) { return false } parentPathArray.pop() var parentPath = parentPathArray.join('/') + '/' return isReadonly(parentPath) } // 删除只读标记 function removeReadonlyMark(path, $item) { var $icon = $($item.context.children[0]) var $parent = $item.parent('.tree-item') var type = $parent.data('type') var branch = $parent.data('branch') var readonly_item = $item.data('path') if (type !== 'file') { readonly_item += "/" } var confirmString = "\n <p>所属分支: <code class=\"readonly-branch\">".concat(htmlSafe(branch), "</code></p> <p>文件路径: <code class=\"readonly-path\">").concat(htmlSafe(readonly_item), "</code></p> <strong>确认取消分支上这个路径的只读标记?</strong>\n "); gitGCModal.confirm("取消只读", confirmString, function() { var parentsReadonly = isParentsReadonly(readonly_item) if (parentsReadonly) { return gitGCModal.alert('提示', '只读记录不存在,或父级目录为只读',function () { location.reload() }) } $.ajax({ url: "/aieditor-team/aieditor/readonly", type: 'DELETE', data: { branch: branch, path: readonly_item }, success: function(res) { if (res.code !== 0) { gitGCModal.alert("提示", res.msg, function() { location.reload(); }) }else { $parent.removeClass('readonly-item') if (gon.readonlyItems) { gon.readonlyItems.splice(gon.readonlyItems.indexOf(readonly_item), 1) } if (type === 'file') { $icon.removeClass('icon-file-readonly readonly-icon') $icon.addClass('icon-file') } else { $icon.removeClass('icon-folder-readonly readonly-icon') $icon.addClass('icon-folders') } $icon.popup('destroy') $item.removeAttr('data-readonly') location.reload(); } } }) }) } // 只读过滤 function isTreeItemReadonly(path, readonlyItems) { var item = readonlyItems.find(function(item) { if (item.slice(-1) === '/') { return path.indexOf(item) === INDEX_BEGIN_WITH_READONLY_DIR } else { return path === item } }) return item !== undefined } function getItemPath(path) { var path_type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'file'; return path_type === 'file' ? path : "".concat(path, "/"); } // 启用异步只读差异化的次数 var is_can_readonly = false // 异步对文件树进行只读差异化显示 function markTree() { $.ajax({ url: "/aieditor-team/aieditor/readonly", method: 'get', data: { "branch": "main" }, success:function(result) { var readonlyItems = result.readonly_items gon.readonlyItems = readonlyItems $(".tree-list-item").each(function(){ $this = $(this) var path = $this.attr('data-path') var type = $this.attr('data-type') var item_path = getItemPath(path, type) var readonly = isTreeItemReadonly(item_path, readonlyItems) $icon = $this.find('i') $parent = $this.parent('.tree-item') if (readonly) { $parent.addClass('readonly-item') $this.attr('data-readonly', '') $icon.attr('class', "iconfont icon-".concat(type, "-readonly readonly-icon")); $icon.attr('data-readonly', '') $icon.popup({ content: "只读", className : { popup: 'ui popup dark', }, position: 'top center' }) } else { var className = type === 'file' ? 'file' : 'folders' $this.removeAttr('data-readonly') $icon.attr('class', "iconfont icon-".concat(className)); $icon.removeAttr('data-readonly') } }) } }) } // 若已开启只读功能,对目录进行只读差异化标记 if (is_can_readonly) { markTree() } // 添加只读标记 function addReadonlyMark(path, $item) { var $icon = $($item.context.children[0]) var $parent = $item.parent('.tree-item') var type = $parent.data('type') var branch = $parent.data('branch') var readonly_item = $item.data('path') if (type !== 'file') { readonly_item += "/" } var confirmString = "\n <p>所属分支: <code class=\"readonly-branch\">".concat(htmlSafe(branch), "</code></p> <p>文件路径: <code class=\"readonly-path\">").concat(htmlSafe(readonly_item), "</code></p> <strong>确认将分支上的这个路径标记为只读?</strong>\n "); gitGCModal.confirm("标记只读", confirmString,function (){ $.ajax({ url: "/aieditor-team/aieditor/readonly", type: 'POST', data: { branch: branch, path: readonly_item, }, success: function(res) { if (res.code !== 0) { gitGCModal.alert("提示", res.msg,function (){ location.reload(); }) } else { // 之前未开启只读功能 if (!is_can_readonly) { is_can_readonly = true return markTree() } $parent.addClass('readonly-item') var existReadonlyItems = gon.readonlyItems || [] existReadonlyItems.push(readonly_item) gon.readonlyItems = existReadonlyItems $icon.popup({ content: "只读", className : { popup: 'ui popup dark', }, position: 'top center' }) if (type === 'file') { $icon.removeClass('icon-file') $icon.addClass('icon-file-readonly readonly-icon') } else { $icon.removeClass('icon-folders') $icon.addClass('icon-folder-readonly readonly-icon') } $item.attr('data-readonly', '') location.reload(); } } }) }) } function removeFile(path, file_name) { var file_name = file_name || path var content = "确定要删除 %{name} 吗?".replace('%{name}', htmlSafe(file_name)); gitGCModal.confirm("删除", content, function() { $.ajax({ type: "DELETE", dataType: "JSON", url: "/aieditor-team/aieditor/delete/" + path, success: function(res) { if (res.status != 1) { var alert_message = res.message || "删除失败" return gitGCModal.alert("提示", alert_message) } if ($('.tree-item-file-name').length == 2) { window.location.href = '/' + gon.user_project; if(file_name.toUpperCase()==='LICENSE'){ window.location.reload(); } } else { window.location.href = window.location.pathname; if(file_name.toUpperCase()==='LICENSE'){ window.location.reload(); } } } }); }) } // 删除子模块 function removeSubmodule(deleteUrl, $item) { if (!deleteUrl) return var file_name = $item.text().trim() var content = "此操作无法恢复,确定要删除子模块%{name}?".replace('%{name}', htmlSafe(file_name)); new GiteeModalHelper({ approveText: "删除并提交推送", cancelText: "取消", okText: "删除并提交推送", }).confirm("删除", content, function() { $.ajax({ type: "DELETE", dataType: "JSON", url: deleteUrl, success: function(res) { if (res.status == 200) { $item.closest('.row.tree-item').remove(); window.location.reload(); } else { Flash.error(res.message, 5000) } }, error: function (err) { err.responseJSON && Flash.error(err.responseJSON.message); }, }); }) } function rename(file_hex) { $(".row.tree-item").show(); $(".tree-item-rename").hide(); if($("."+file_hex).is(':hidden') == true) return; $("."+file_hex).hide(); var _t = $(".rename-"+file_hex); src = _t.attr('src_text') if(src==undefined){ newName = _t.find("[name='new_filename']").val() _t.attr('src_text',newName) }else{ _t.find("[name='new_filename']").val(_t.attr('src_text')) } $(".rename-"+file_hex).css("display",""); } setTimeout(function(){ $(".popup-save").click(function(){ form = $(this).parents(".ui.form") file_hex = $(this).parents(".row.tree-item").attr("file_hex"); new_filename = $.trim(form.find("[name='new_filename']").val()) overwrite = false $('.tree-item-file-name').find('a').each(function(a){ title = $(this).attr('title'); if(title != undefined){ if (title.split('/')[0] == new_filename) { overwrite = true; } } }); if(overwrite){ form.find("[name='new_filename']").focus(); gitGCModal.alert("提示", "存在相同的文件名,请修改后重试") return; } $.ajax({ type: 'POST', url: "/aieditor-team/aieditor/rename/"+ form.attr('path').replace(/\+/g, '%20'), data: { new_filename: new_filename }, success: function(o){ if(o.status == 1){ href = window.location.href.split('?')[0] window.location.href = href; }else { var alert_message = o.message || "重命名失败" gitGCModal.alert("提示", alert_message) } }, dataType: "json" }); }) $(".popup-close").click(function(){ $(".row.tree-item").show(); $(".tree-item-rename").hide(); }) $('.tree-item-file-name, .tree-item-submodule-name').each(function() { var $this = $(this); if (typeof $this.parent().attr('file_hex') === 'undefined') { return; } $this.on('contextmenu', function(event) { event.preventDefault(); createContextMenu($this, event.pageX, event.pageY); }) }) },1000) }) </script> <style> .readonly-item { background-color: #FBFBFB !important; } .readonly-path,.readonly-branch { display: block; white-space: normal; word-break: break-word; line-height: 1.8; margin-top: 1em; } .btn-readonly-is-uncharged-enterprise, .btn-readonly-is-open-svn { background-color: #f5f5f5 !important; color: #757575 !important; } </style> <div class='complaint'> <div class='ui modal small form' id='landing-comments-complaint-modal'> <i class='iconfont icon-close close'></i> <div class='header'> 举报 </div> <div class='content'> <div class='appeal-success-tip hide'> <i class='iconfont icon-ic_msg_success'></i> <div class='appeal-success-text'> 举报成功 </div> <span> 我们将于2个工作日内通过站内信反馈结果给你! </span> </div> <div class='appeal-tip'> 请认真填写举报原因,尽可能描述详细。 </div> <div class='ui form appeal-form'> <div class='inline field'> <label class='left-part appeal-type-wrap'> 举报类型 </label> <div class='ui dropdown selection' id='appeal-comments-types'> <div class='text default'> 请选择举报类型 </div> <i class='dropdown icon'></i> <div class='menu'></div> </div> </div> <div class='inline field'> <label class='left-part'> 举报原因 </label> <textarea class='appeal-reason' id='appeal-comment-reason' name='msg' placeholder='请说明举报原因' rows='3'></textarea> </div> <div class='ui message callback-msg hide'></div> <div class='ui small error text message exceeded-size-tip'></div> </div> </div> <div class='actions'> <div class='ui button blank cancel'> 取消 </div> <div class='ui orange icon button disabled ok' id='complaint-comment-confirm'> 发送 </div> </div> </div> <script> var $complaintCommentsModal = $('#landing-comments-complaint-modal'), $complainCommentType = $complaintCommentsModal.find('#appeal-comments-types'), $complaintModalTip = $complaintCommentsModal.find('.callback-msg'), $complaintCommentsContent = $complaintCommentsModal.find('.appeal-reason'), $complaintCommentBtn = $complaintCommentsModal.find('#complaint-comment-confirm'), complaintSending = false, initedCommentsType = false; function initCommentsTypeList() { if (!initedCommentsType) { $.ajax({ url: "/appeals/fetch_types", method: 'get', data: {'type': 'comment'}, success: function (data) { var result = ''; for (var i = 0; i < data.length; i++) { result = result + "<div class='item' data-value='" + data[i].id + "'>" + data[i].name + "</div>"; } $complainCommentType.find('.menu').html(result); } }); $complainCommentType.dropdown({showOnFocus: false}); initedCommentsType = true; } } $complainCommentType.on('click', function() { $complaintCommentsModal.modal({ autofocus: false, onApprove: function() { return false; }, onHidden: function() { restoreCommonentDefault(); } }).modal('show'); }); $complaintCommentsContent.on('change keyup', function(e) { var content = $(this).val(); if ($.trim(content).length > 0 && $complainCommentType.dropdown('get value').length > 0 ) { $complaintCommentBtn.removeClass('disabled'); return; } $complaintCommentBtn.addClass('disabled'); }); $complainCommentType.dropdown({ showOnFocus: false, onChange: function(value, text, $selectedItem) { if (value.length > 0 && $.trim($complaintCommentsContent.val()).length > 0) { $complaintCommentBtn.removeClass('disabled'); return } $complaintCommentBtn.addClass('disabled'); } }); function restoreCommonentDefault() { $complainCommentType.dropdown('restore defaults'); $complaintCommentsContent.val(''); $('.exceeded-size-tip').text('').hide(); $complaintModalTip.text('').hide(); setTimeout(function() { setCommentSendTip(false); }, 1500); } $complaintCommentBtn.on('click',function(e){ var reason = $complaintCommentsContent.val(); var appealableId = $('#landing-comments-complaint-modal').attr('data-id'); if (complaintSending) { return; } var appealType = $complainCommentType.dropdown('get value'); var formData = new FormData(); formData.append('appeal_type_id', appealType); formData.append('reason', reason); formData.append('appeal_type','Note'); formData.append('target_id',appealableId); $.ajax({ type: 'POST', url: "/appeals", cache: false, contentType: false, processData: false, data: formData, beforeSend: function() { setCommentSendStatus(true); }, success: function(res) { if (res.status == 200) { setCommentSendTip(true); setTimeout(function() { $complaintCommentsModal.modal('hide'); restoreCommonentDefault(); }, 3000); } setCommentSendStatus(false); }, error: function(err) { showCommonTips(err.responseJSON.message, 'error'); setCommentSendStatus(false); } }) }); function showCommonTips(text, type) { $complaintModalTip.text(text).show(); if (type == 'error') { $complaintModalTip.removeClass('success').addClass('error'); } else { $complaintModalTip.removeClass('error').addClass('success'); } } function setCommentSendStatus(value) { complaintSending = value; if (complaintSending) { $complaintCommentBtn.addClass('loading'); $complaintCommentsContent.attr('readonly', true); $complainCommentType.attr('readonly', true); } else { $complaintCommentBtn.removeClass('loading'); $complaintCommentsContent.attr('readonly', false); $complainCommentType.attr('readonly', false); } } function setCommentSendTip(value) { if (value) { $('.appeal-success-tip').removeClass('hide'); $('.appeal-tip').addClass('hide'); $('.appeal-form').addClass('hide'); $('#landing-comments-complaint-modal .actions').addClass('hide'); } else { $('.appeal-success-tip').addClass('hide'); $('.appeal-tip').removeClass('hide'); $('.appeal-form').removeClass('hide'); $('#landing-comments-complaint-modal .actions').removeClass('hide'); } } </script> <div class='ui small modal' id='misjudgment_appeal_modal'> <i class='close icon'></i> <div class='header dividing ui'> 误判申诉 </div> <div class='content'> <p>此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。</p> <p>如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。</p> <div class='buttons'> <div class='ui button blank cancel'>取消</div> <div class='ui button orange submit'>提交</div> </div> </div> </div> <style> #misjudgment_appeal_modal .buttons { float: right; margin-top: 30px; margin-bottom: 20px; } #misjudgment_appeal_modal .buttons .cancel { margin-right: 20px; } </style> <script> var $misjudgmentAppealModal = $('#misjudgment_appeal_modal'); $('.cancel').on('click',function(){ $misjudgmentAppealModal.modal('hide'); }); var $jsSubmitAppeal = $misjudgmentAppealModal.find('.submit') $jsSubmitAppeal.on('click', function(e) { e.preventDefault(); $(this).addClass('loading').addClass('disabled'); var type = $(this).attr('data-type'); var id = $(this).attr('data-id'); var projectId = $(this).attr('data-project-id'); var appealType = $(this).attr('data-appeal-type'); $.ajax({ type: "PUT", url: "/misjudgment_appeal", data: { type: type, id: id, project_id: projectId, appeal_type: appealType }, success: function(data) { Flash.info('提交成功'); $jsSubmitAppeal.removeClass('loading'); $misjudgmentAppealModal.modal('hide'); location.reload() }, error: function(e) { Flash.error('提交失败:'+e.responseText); $jsSubmitAppeal.removeClass('loading').removeClass('disabled'); location.reload() } }); }) </script> </div> <script> "use strict"; $('.js-check-star').checkbox('set unchecked') </script> </div> <script> (function() { $(function() { Tree.init(); return TreeCommentActions.init(); }); }).call(this); </script> </div> </div> <div class='four wide column' style=''> <div class='project__right-side'> <div class='side-item intro'> <div class='header'> <h4>简介</h4> </div> <div class='content'> <span class='git-project-desc-text'>AiEditor 是一个面向 AI 的下一代富文本编辑器。</span> <a class='hide spread' href='javascript:void(0);'> 展开 <i class='caret down icon'></i> </a> <a class='retract hide' href='javascript:void(0);'> 收起 <i class='caret up icon'></i> </a> <div class='intro-list'> <div class='d-flex d-flex-between dropdown item js-project-label_show label-list-line-feed project-label-list ui' data-labels='[{"id":48,"name":"AI","related_name":"AI","author_id":1,"ident":"AI","label_type":1,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-01T20:10:53+08:00","updated_at":"2021-07-01T20:10:53+08:00"},{"id":2021,"name":"编辑器","related_name":"编辑器","author_id":5170040,"ident":"编辑器","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-18T20:06:45+08:00","updated_at":"2021-07-18T20:06:45+08:00"},{"id":4028,"name":"editor","related_name":"editor","author_id":5410342,"ident":"editor","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-13T17:35:58+08:00","updated_at":"2021-08-13T17:35:58+08:00"},{"id":13876,"name":"wysiwyg","related_name":"wysiwyg","author_id":8841044,"ident":"wysiwyg","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-09-27T18:09:29+08:00","updated_at":"2021-09-27T18:09:29+08:00"}]' data-url='/aieditor-team/aieditor/update_description'> <div class='mixed-label'> <a title="AI" class="project-label-item-box" target="_blank" href="/explore/topic/AI"><div class='project-label-item'>AI</div> </a><a title="编辑器" class="project-label-item-box" target="_blank" href="/explore/topic/%E7%BC%96%E8%BE%91%E5%99%A8"><div class='project-label-item'>编辑器</div> </a><a title="editor" class="project-label-item-box" target="_blank" href="/explore/topic/editor"><div class='project-label-item'>editor</div> </a><a title="wysiwyg" class="project-label-item-box" target="_blank" href="/explore/topic/wysiwyg"><div class='project-label-item'>wysiwyg</div> </a></div> <div class='default'>暂无标签</div> </div> <div class='item'> <i class='iconfont icon-link'></i> <span class='git-project-homepage'> <a rel="nofollow" id="homepage" target="_blank" href="https://gitee.com/link?target=https%3A%2F%2Faieditor.com.cn%2Fzh%2Findex.html">https://aieditor.com.cn/zh/index.html</a> </span> </div> <div class='item'> <i class='iconfont icon-tag-program'></i> <span class='summary-languages'> TypeScript <span class='text-muted'> 等 4 种语言 <i class='icon dropdown'></i> </span> </span> <div class='ui popup summary-languages-popup'> <div class='row'> <div class='lang'> <a href="/explore/all?lang=TypeScript">TypeScript</a> </div> <div class='lang-bar'> <div class='bar' style='width: 92.1%;'></div> </div> <a class="percentage" href="/explore/all?lang=TypeScript">92.1%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=Less">Less</a> </div> <div class='lang-bar'> <div class='bar' style='width: 7.3%;'></div> </div> <a class="percentage" href="/explore/all?lang=Less">7.3%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=HTML">HTML</a> </div> <div class='lang-bar'> <div class='bar' style='width: 0.5%;'></div> </div> <a class="percentage" href="/explore/all?lang=HTML">0.5%</a> </div> <div class='row'> <div class='lang'> <a href="/explore/all?lang=JavaScript">JavaScript</a> </div> <div class='lang-bar'> <div class='bar' style='width: 0.1%;'></div> </div> <a class="percentage" href="/explore/all?lang=JavaScript">0.1%</a> </div> </div> </div> <div class='item box-licence'> <i class='iconfont icon-licence'></i> <span id='license-popup'> LGPL-2.1 </span> <div class='ui popup dark'>使用 LGPL-2.1 开源许可协议</div> </div> <!-- - page = @project.page --> <!-- - if page&.status? --> <!-- .item --> <!-- %i.iconfont.icon-giteepage --> <!-- Pages: --> <!-- = link_to page.domain_url, page.domain_url, target: '_blank' --> </div> </div> <div class='content intro-form'> <div class='ui small input'> <textarea name='project[description]' placeholder='描述' rows='5'></textarea> </div> <div class='ui small input'> <input data-regex-value='(^$)|(^(http|https):\/\/(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).*)|(^(http|https):\/\/[a-zA-Z0-9]+([_\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,10}(:[0-9]{1,10})?(\?.*)?(\/.*)?$)' name='project[homepage]' placeholder='主页(eg: https://gitee.com)' type='text'> </div> <button class='ui orange button mt-1 btn-save'> 保存更改 </button> <div class='ui blank button btn-cancel-edit'> 取消 </div> </div> </div> <div class='side-item release'> <div class='header'> <h4> 发行版 <span class='text-muted'> (39) </span> </h4> <a class="ui link button pull-right" href="/aieditor-team/aieditor/releases">全部</a> </div> <div class='content ml-3'> <i class='iconfont icon-release'></i> <div class='desc'> <a href="/aieditor-team/aieditor/releases/tag/v1.2.7">v1.2.7</a> </div> <span class='timeago' datetime='2024-11-21 14:41' title='2024-11-21 14:41:00 +0800'></span> </div> </div> <div class='side-item compass'> <div class='header mb-1 d-align-center'> <h4 class='limit-length compass-label mr-1'></h4> <a class="ui link button compass-qa" href="https://compass.gitee.com/zh/docs/dimensions-define"><i class='iconfont icon-help-circle'></i> </a></div> <div class='content'> <div class='compass-echart-container'> <div data-url='/aieditor-team/aieditor/compass/chart_data' id='compass-metrics'> <div class='wrap'></div> <div class='ui popup radar-popup'> <h4 class='title'>开源评估指数源自 OSS-Compass 评估体系,评估体系围绕以下三个维度对项目展开评估:</h4> <div class='project-radar-list'> <div class='descript-contianer'> <div class='descript-title'> <p class='mb-1'>1. 开源生态</p> <ul class='mb-1 mt-1'> <li>生产力:来评估开源项目输出软件制品和开源价值的能力。</li> <li>创新力:用于评估开源软件及其生态系统的多样化程度。</li> <li>稳健性:用于评估开源项目面对多变的发展环境,抵御内外干扰并自我恢复的能力。</li> </ul> <p>2. 协作、人、软件</p> <ul> <li>协作:代表了开源开发行为中协作的程度和深度。</li> <li>人:观察开源项目核心人员在开源项目中的影响力,并通过第三方视角考察用户和开发者对开源项目的评价。</li> <li>软件:从开源项目对外输出的制品评估其价值最终落脚点。也是开源评估最“古老”的主流方向之一“开源软件” 的具体表现。</li> </ul> <p>3. 评估模型</p> <ul> 基于“开源生态”与“协作、人、软件”的维度,找到与该目标直接或间接相关的可量化指标,对开源项目健康与生态进行量化评估,最终形成开源评估指数。 </ul> </div> </div> </div> <div class='finaltime'></div> </div> <div class='legend-box ml-1'> <div class='dimension d-flex'></div> <div class='compass-type d-flex'></div> </div> </div> </div> <script src="/static/javascripts/echarts.min.js"></script> <script src="/static/javascripts/echarts-gl.min.js"></script> <script src="https://cn-assets.gitee.com/assets/skill_radar/rep_compass_chart-a170f1ecfff8cd448229c0a3b82b074a.js"></script> </div> </div> <div class='side-item contrib' data-url='/aieditor-team/aieditor/contributors_count?ref=main' id='contributor'> <div class='header'> <h4> 贡献者 <span class='text-muted' id='contributor-count'></span> </h4> <a class="ui link button pull-right" href="/aieditor-team/aieditor/contributors?ref=main">全部</a> </div> <div class='content' id='contributor-list'></div> <div class='ui active centered inline loader' id='contributor-loader'></div> </div> <div class='side-item events' data-url='/aieditor-team/aieditor/events.json' id='proj-events'> <div class='header'> <h4>近期动态</h4> </div> <div class='content'> <div class='ui comments' id='event-list'></div> <a class="loadmore hide" href="javascript:void(0);">加载更多 <i class='icon dropdown'></i> </a><center> <div class='text-muted nomore hide'>不能加载更多了</div> <div class='ui inline loader active'></div> </center> </div> </div> </div> <div class='ui modal tiny' id='edit-project-description'> <i class='iconfont icon-close close'></i> <div class='header'>编辑仓库简介</div> <div class='content'> <div class='item mb-2'> <div class='title label'>简介内容</div> <div class='ui small input'> <textarea maxlength='200' name='project[description]' placeholder='描述' rows='5'>AiEditor 是一个面向 AI 的下一代富文本编辑器。</textarea> </div> </div> <div class='item mb-2'> <div class='title label'>主页</div> <div class='ui small input'> <input data-regex-value='(^$)|(^(http|https):\/\/(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).*)|(^(http|https):\/\/[a-zA-Z0-9]+([_\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,10}(:[0-9]{1,10})?(\?.*)?(\/.*)?$)' name='project[homepage]' placeholder='主页(eg: https://gitee.com)' type='text' value='https://aieditor.com.cn/zh/index.html'> </div> </div> </div> <div class='actions'> <button class='ui button blank cancel'>取消</button> <button class='ui button orange btn-save'>保存更改</button> </div> </div> <style> #license-popup { color: #005980; cursor: pointer; } </style> <script> window.gon.projectRightSide = { homepage: "https://aieditor.com.cn/zh/index.html", description: "AiEditor 是一个面向 AI 的下一代富文本编辑器。", url: '/aieditor-team/aieditor/update_description', i18n: { invalidHomepage: '不是有效的 http 地址', descriptionLimitExceeded: '简介长度不得超过%{limit}个字符', noDescription: '暂无描述', noPermission: '无权限操作!', requestError: '修改发生错误,请稍后重试!' } } window.gon.cloneArrSelectedLabel = [{"id":48,"name":"AI","related_name":"AI","author_id":1,"ident":"AI","label_type":1,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-01T20:10:53+08:00","updated_at":"2021-07-01T20:10:53+08:00"},{"id":2021,"name":"编辑器","related_name":"编辑器","author_id":5170040,"ident":"编辑器","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-07-18T20:06:45+08:00","updated_at":"2021-07-18T20:06:45+08:00"},{"id":4028,"name":"editor","related_name":"editor","author_id":5410342,"ident":"editor","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-08-13T17:35:58+08:00","updated_at":"2021-08-13T17:35:58+08:00"},{"id":13876,"name":"wysiwyg","related_name":"wysiwyg","author_id":8841044,"ident":"wysiwyg","label_type":0,"synonym_id":0,"description":null,"display_description":0,"block":0,"created_at":"2021-09-27T18:09:29+08:00","updated_at":"2021-09-27T18:09:29+08:00"}] || [] $(function () { var $editModal = $('#edit-project-description') $editModal.modal({ onShow: function () { window.globalUtils.getFocus($editModal.find('textarea')) } }) $('.project__right-side').on('click', '.header .btn-edit', function () { $editModal.modal('show') }) $('#license-popup').popup({ position: 'bottom center', lastResort: 'bottom center' }) $('.js-project-label_show').projectLabel({ i18n: { empty: "标签名不能为空", verify: "标签名只允许包含中文、字母、数字或者中划线(-),不能以中划线开头,且长度少于35个字符", max: "最多选择 5 个标签" } }) }) </script> </div> <div class='project-right-side-contaner' id='code-parsing'> <div class='d-flex-between mb-2'> <div class='title fs-16 d-align-center'> <img class='mr-1' height='32' src='/static/images/mjc_icon@2x.png' width='32'> <span class='ai-file-name'>马建仓 AI 助手</span> </div> <div> <i class='iconfont icon-close close gitee-icon-close'></i> </div> </div> <div class='code-parsing-content'> <div class='sub_title'></div> <div class='markdown-body'></div> <div class='bottom-content'> <div class='js-code-parsing-img'></div> <div class='ai_code_btns_simple'> <div class='ai_code_btns_simple_container'> <div class='mr-1 test-more'>尝试更多</div> <div class='btn_box' data-text='代码解读' data-value='parsing'> <div class='btn_box_title'>代码解读</div> </div> <div class='btn_box' data-text='代码找茬' data-value='analysis'> <div class='btn_box_title'>代码找茬</div> </div> <div class='btn_box' data-text='代码优化' data-value='optimize'> <div class='btn_box_title'>代码优化</div> </div> </div> </div> </div> </div> <div class='skeleton'> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line4'></div> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line4'></div> <div class='line line1'></div> <div class='line line2'></div> <div class='line line3'></div> <div class='line line4'></div> </div> <div class='resize-handle'> <div class='resize-handle-line'></div> </div> <script src="/static/javascripts/markdown-it.min.js"></script> <script src="https://cn-assets.gitee.com/assets/ai_code_parsing/app-667254dc80e793cb047ec2e07574f422.js"></script> <script> $(function() { var maxWidthPercentage = 0.5; $("#code-parsing").resizable({ handles: 'e, w', // 通过左边调整大小 minWidth: 350, // 设置 代码解析框 的最小宽度 resize: function(event, ui) { var parentWidth = $(this).parent().width(); var newWidthDiv2 = ui.size.width; var newWidthDiv1 = parentWidth - newWidthDiv2; // 计算最大宽度 var maxWidthDiv2 = parentWidth * maxWidthPercentage; // 确保 代码解析框 不超过最大宽度 newWidthDiv2 = Math.min(newWidthDiv2, maxWidthDiv2); // 确保 文件详情 至少有最小宽度 newWidthDiv1 = Math.max(parentWidth - newWidthDiv2, 750); var percentageCode = (newWidthDiv2 / parentWidth) * 100; var percentageProject = (newWidthDiv1 / parentWidth) * 100; $('#code-parsing').css('width',percentageCode+"%") $('.git-project-content-wrapper').find('#sixteen').attr('style', 'width: ' + percentageProject + '% !important;'); $('.right-wrapper').attr('style', 'width: ' + percentageProject + '% !important;'); $('.project-conter-container').attr('style', 'width: ' + percentageProject + '% !important;'); } }); }) </script> </div> </div> </div> <style> .team-member-checkbox .ui.radio.checkbox.checked label:after { top: 7px !important; } </style> <script> function scrollToReadmeBox() { var readmeBox = document.getElementById('git-readme'); if (readmeBox) { const topPos = readmeBox.offsetTop; window.scrollTo({ top: topPos, behavior: "smooth" }); } } $(".box-licence").click(function(event) { $('.lisence-content').show() $('.lisence-edit').show() $('.readme-content').hide() $('.readme-edit').hide() $('#git-readme').removeClass('unshow') $('.file_title_license').addClass('active-title') $('.file_title_readme').removeClass('active-title') scrollToReadmeBox() }); var rightWrapperHeight = $('.right-wrapper').height() try { if ($("#project-left-side-contaner").resizable) { var maxWidthPercentage = 0.5; $("#project-left-side-contaner").resizable({ handles: "e", minWidth: 360, resize: function(event, ui) { var parentWidth = $(this).parent().width(); var newWidthDiv2 = ui.size.width; var newWidthDiv1 = parentWidth - newWidthDiv2; // 计算最大宽度 var maxWidthDiv2 = parentWidth * maxWidthPercentage; // 确保 代码解析框 不超过最大宽度 newWidthDiv2 = Math.min(newWidthDiv2, maxWidthDiv2); // 确保 文件树 至少有最小宽度 newWidthDiv1 = Math.max(parentWidth - newWidthDiv2, 360); var percentageCode = (newWidthDiv2 / parentWidth) * 100; var percentageProject = (newWidthDiv1 / parentWidth) * 100; $('#project-left-side-contaner').css('width',percentageCode+"%") $('.git-project-content-wrapper').find('#sixteen').attr('style', 'width: ' + percentageProject + '% !important;'); $('.right-wrapper').attr('style', 'width: ' + percentageProject + '% !important;'); $('.project-conter-container').attr('style', 'width: ' + percentageProject + '% !important;'); } }); } } catch(err) { console.error(err) } </script> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/assets/markdown_preview-001478f1b12f2725f1b1f76f36b9ce4e.css" /> <script src="https://cn-assets.gitee.com/assets/markdown_preview-772822b3442a45aaf94af83c38fdbaf4.js"></script> <script src="https://cn-assets.gitee.com/webpacks/markdown_render-f5de5a38a7a20521cfd7.bundle.js" defer="defer"></script> </div> <script> (function() { var donateModal; Gitee.modalHelper = new GiteeModalHelper({ alertText: '提示', okText: '确定' }); donateModal = new ProjectDonateModal({ el: '#project-donate-modal', alipayUrl: '/aieditor-team/aieditor/alipay', wepayUrl: '/aieditor-team/aieditor/wepay', nameIsBlank: '名称不能为空', nameTooLong: '名称过长(最多为 36 个字符)', modalHelper: Gitee.modalHelper }); if (null === 'true') { donateModal.show(); } $('#project-donate').on('click', function() { return donateModal.show(); }); }).call(this); </script> <script> Tree.initHighlightTheme('white') </script> </div> <div class='gitee-project-extension'> <div class='extension public'>1</div> <div class='extension https'>https://gitee.com/aieditor-team/aieditor.git</div> <div class='extension ssh'>git@gitee.com:aieditor-team/aieditor.git</div> <div class='extension namespace'>aieditor-team</div> <div class='extension repo'>aieditor</div> <div class='extension name'>AiEditor</div> <div class='extension branch'>main</div> </div> <script> $(function() { GitLab.GfmAutoComplete.dataSource = "/aieditor-team/aieditor/autocomplete_sources" GitLab.GfmAutoComplete.Emoji.assetBase = '/assets/emoji' GitLab.GfmAutoComplete.setup(); }); </script> <footer id='git-footer-main'> <div class='ui container'> <div class='logo-row'> <a href="https://gitee.com"><img alt='Gitee - 基于 Git 的代码托管和研发协作平台' class='logo-img' src='/static/images/logo-black.svg?t=158106666'> </a></div> <div class='name-important'> 深圳市奥思网络科技有限公司版权所有 </div> <div class='ui two column grid d-flex-center'> <div class='eight wide column git-footer-left'> <div class='ui four column grid' id='footer-left'> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/all-about-git">Git 大全</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://help.gitee.com/learn-Git-Branching/">Git 命令学习</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://copycat.gitee.com/">CopyCat 代码克隆检测</a> </div> <div class='item'> <a class="item" href="/appclient">APP与插件下载</a> </div> </div> </div> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/gitee_reward">Gitee Reward</a> </div> <div class='item'> <a class="item" href="/gitee-stars">Gitee 封面人物</a> </div> <div class='item'> <a class="item" href="/gvp">GVP 项目</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://blog.gitee.com/">Gitee 博客</a> </div> <div class='item'> <a class="item" href="/enterprises#nonprofit-plan">Gitee 公益计划</a> </div> <div class='item'> <a class="item" href="https://gitee.com/features/gitee-go">Gitee 持续集成</a> </div> </div> </div> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/api/v5/swagger">OpenAPI</a> </div> <div class='item'> <a class="item" href="https://help.gitee.com">帮助文档</a> </div> <div class='item'> <a class="item" href="/self_services">在线自助服务</a> </div> <div class='item'> <a class="item" href="/help/articles/4378">更新日志</a> </div> </div> </div> <div class='column'> <div class='ui link list'> <div class='item'> <a class="item" href="/about_us">关于我们</a> </div> <div class='item'> <a class="item" rel="nofollow" href="https://www.oschina.net/news/131099/oschina-hiring">加入我们</a> </div> <div class='item'> <a class="item" href="/terms">使用条款</a> </div> <div class='item'> <a class="item" href="/oschina/git-osc/issues">意见建议</a> </div> <div class='item'> <a class="item" href="/links.html">合作伙伴</a> </div> </div> </div> </div> </div> <div class='eight wide column right aligned followus git-footer-right'> <div class='qrcode mr-1'> <div class='qrcode-box'> <img alt="技术交流QQ群" src="https://cn-assets.gitee.com/assets/contact_qr-5e2c2a8da453396590e56a545bce4974.jpg" /> </div> <p class='mt-1 mini_app-text'>技术交流QQ群</p> </div> <div class='qrcode'> <div class='qrcode-box'> <img alt="微信服务号" class="weixin-qr" src="https://cn-assets.gitee.com/assets/qrcode-weixin@2x-b74cc97a2ea80123ea53a737f709836d.png" /> </div> <p class='mt-1 weixin-text'>微信服务号</p> </div> <div class='phone-and-qq column'> <div class='ui list official-support-container'> <div class='item'></div> <div class='item mail-and-zhihu'> <a rel="nofollow" href="mailto: client@oschina.cn"><i class='iconfont icon-msg-mail'></i> <span id='git-footer-email'>client#oschina.cn</span> </a></div> <div class='item tel'> <a> <i class='iconfont icon-tel'></i> <span>企业版在线使用:400-606-0201</span> </a> </div> <div class='item tel'> <a class='d-flex'> <i class='iconfont icon-tel mt-05 mr-05'></i> <span>专业版私有部署:</span> <div> <div>13670252304</div> <div>13352947997</div> </div> </a> </div> </div> </div> </div> </div> </div> <div class='bottombar'> <div class='ui container'> <div class='ui d-flex d-flex-between'> <div class='seven wide column partner d-flex'> <div class='open-atom d-flex-center'> <img class="logo-openatom mr-1" alt="开放原子开源基金会" src="https://cn-assets.gitee.com/assets/logo-openatom-d083391cc8a54e283529f3fc11cc38ca.svg" /> <a target="_blank" rel="nofollow" href="https://www.openatom.org/">开放原子开源基金会</a> <div class='sub-title ml-1'>合作代码托管平台</div> </div> <div class='report-12377 d-flex-center ml-3'> <img class="report-12377__logo mr-1" alt="违法和不良信息举报中心" src="https://cn-assets.gitee.com/assets/12377@2x-1aa42ed2d2256f82a61ecf57be1ec244.png" /> <a target="_blank" rel="nofollow" href="https://12377.cn">违法和不良信息举报中心</a> </div> <div class='copyright ml-3'> <a rel="nofollow" href="http://beian.miit.gov.cn/">粤ICP备12009483号</a> </div> </div> <div class='nine wide column right aligned'> <i class='icon world'></i> <a href="/language/zh-CN">简 体</a> / <a href="/language/zh-TW">繁 體</a> / <a href="/language/en">English</a> </div> </div> </div> </div> </footer> <script> var officialEmail = $('#git-footer-email').text() $('#git-footer-main .icon-popup').popup({ position: 'bottom center' }) $('#git-footer-email').text(officialEmail.replace('#', '@')) window.gon.popover_card_locale = { follow:"关注", unfollow:"已关注", gvp_title: "GVP - Gitee 最有价值开源项目", project: "项目", org: "开源组织", member: "", author: "作者", user_blocked: "该用户已被屏蔽或已注销", net_error: "网络错误", unknown_exception: "未知异常" } window.gon.select_message = { placeholder: "请输入个人空间地址或完整的邮箱地址" } </script> <script src="https://cn-assets.gitee.com/webpacks/popover_card-7fd8f0b6d97d23b1039f.bundle.js"></script> <link rel="stylesheet" media="all" href="https://cn-assets.gitee.com/webpacks/css/gitee_nps-ae0dbee40f6ddc72015a.css" /> <script src="https://cn-assets.gitee.com/webpacks/gitee_nps-30c2a3673b61c539fcf7.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/gitee_icons-3e0958ebe5da9ee7c12c.bundle.js"></script> <div class='side-toolbar'> <div class='button toolbar-help'> <i class='iconfont icon-help'></i> </div> <div class='ui popup left center dark'>点此查找更多帮助</div> <div class='toolbar-help-dialog'> <div class='toolbar-dialog-header'> <h3 class='toolbar-dialog-title'>搜索帮助</h3> <form class="toolbar-help-search-form" action="/help/load_keywords_data" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓" /> <div class='ui icon input fluid toolbar-help-search'> <input name='keywords' placeholder='请输入产品名称或问题' type='text'> <i class='icon search'></i> </div> </form> <i class='iconfont icon-close toolbar-dialog-close-icon'></i> </div> <div class='toolbar-dialog-content'> <div class='toolbar-help-hot-search'> <div class='toolbar-roll'> <a class="init active" title="Git 命令在线学习" href="https://oschina.gitee.io/learn-git-branching/?utm_source==gitee-help-widget"><i class='Blue icon icon-command iconfont'></i> <span>Git 命令在线学习</span> </a><a class="init " title="如何在 Gitee 导入 GitHub 仓库" href="https://gitee.com/help/articles/4261?utm_source==gitee-help-widget"><i class='icon icon-clipboard iconfont orange'></i> <span>如何在 Gitee 导入 GitHub 仓库</span> </a></div> <div class='toolbar-list'> <div class='toolbar-list-item'> <a href="/help/articles/4114">Git 仓库基础操作</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4166">企业版和社区版功能对比</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4191">SSH 公钥设置</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4194">如何处理代码冲突</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4232">仓库体积过大,如何减小?</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4279">如何找回被删除的仓库数据</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4283">Gitee 产品配额说明</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4284">GitHub仓库快速导入Gitee及同步更新</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4328">什么是 Release(发行版)</a> </div> <div class='toolbar-list-item'> <a href="/help/articles/4354">将 PHP 项目自动发布到 packagist.org</a> </div> </div> </div> <div class='toolbar-help-search-reseult'></div> </div> </div> <script> var opt = { position: 'left center'}; var $helpSideToolbar = $('.button.toolbar-help'); var $toolbarRoll = $('.toolbar-roll'); $(function() { if (false) { $helpSideToolbar.popup(opt).popup({lastResort:'left center'}) } else { $helpSideToolbar.popup({lastResort:'left center'}).popup('show', opt); setTimeout(function() { $helpSideToolbar.popup('hide', opt); }, 3000); } if ($toolbarRoll.length) { setInterval(function() { var $nextActiveLink = $toolbarRoll.find('a.active').next(); if (!$nextActiveLink.length) { $nextActiveLink = $toolbarRoll.find('a:first-child'); } $nextActiveLink.attr('class', 'active').siblings().removeClass('active init'); }, 5000); } }) </script> <div class='popup button' id='home-comment'> <i class='iconfont icon-comment'></i> </div> <div class='ui popup dark'>评论</div> <div class='toolbar-appeal popup button'> <i class='iconfont icon-report'></i> </div> <div class='ui popup dark'> 仓库举报 </div> <script> $('.toolbar-appeal').popup({ position: 'left center' }); </script> <div class='button gotop popup' id='gotop'> <i class='iconfont icon-top'></i> </div> <div class='ui popup dark'>回到顶部</div> </div> <div class='form modal normal-modal tiny ui' id='unlanding-complaint-modal'> <i class='iconfont icon-close close'></i> <div class='header'> 登录提示 </div> <div class='container actions'> <div class='content'> 该操作需登录 Gitee 帐号,请先登录后再操作。 </div> <div class='ui orange icon large button ok'> 立即登录 </div> <div class='ui button blank cancel'> 没有帐号,去注册 </div> </div> </div> <script> var $elm = $('.toolbar-appeal'); $elm.on('click', function() { var modals = $("#unlanding-complaint-modal.normal-modal"); if (modals.length > 1) { modals.eq(0).modal('show'); } else { modals.modal('show'); } }) $("#unlanding-complaint-modal.normal-modal").modal({ onDeny: function() { window.location.href = "/signup?from="; }, onApprove: function() { window.location.href = "/login?from="; } }) </script> <style> .side-toolbar .bdsharebuttonbox a { font-size: 24px; color: white !important; opacity: 0.9; margin: 6px 6px 0px 6px; background-image: none; text-indent: 0; height: auto; width: auto; } </style> <style> #udesk_btn a { margin: 0px 20px 167px 0px !important; } </style> <script> (function() { $('#project-user-message').popup({ position: 'left center' }); }).call(this); </script> <script> Gitee.initSideToolbar({ hasComment: true, commentUrl: '/aieditor-team/aieditor#tree_comm_title' }) </script> <script> (function() { this.__gac = { domain: 'www.oschina.net' }; }).call(this); </script> <script src="https://cn-assets.gitee.com/assets/bdstatic/app-070a9e339ac82bf2bf7ef20375cd4121.js"></script> <script src="https://hm.baidu.com/hm.js?9fd447a0f9e62a84d1b752a2cacb2c6b" async="async"></script> <script src="https://cn-assets.gitee.com/webpacks/build_status-fb432ebafd78f50ac52f.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/scan_status-7a19032286b03591b228.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/mermaid_render-669e055f02596b5d8886.bundle.js"></script> <script src="https://cn-assets.gitee.com/webpacks/check_runs-8bae3ab16844e5860cc5.bundle.js"></script> </body> </html>