diff --git a/public/ueditor/lang/en/en.js b/public/ueditor/lang/en/en.js
new file mode 100644
index 0000000..c7e22f5
--- /dev/null
+++ b/public/ueditor/lang/en/en.js
@@ -0,0 +1,684 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午6:57
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['en'] = {
+ 'labelMap':{
+ 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen',
+ 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border',
+ 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote',
+ 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview',
+ 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date',
+ 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown',
+ 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code',
+ 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle',
+ 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable",
+ 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',
+ 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
+ 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter',
+ 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL',
+ 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight',
+ 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default',
+ 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage',
+ 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset',
+ 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable',
+ 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts'
+ },
+ 'insertorderedlist':{
+ 'num':'1,2,3...',
+ 'num1':'1),2),3)...',
+ 'num2':'(1),(2),(3)...',
+ 'cn':'一,二,三....',
+ 'cn1':'一),二),三)....',
+ 'cn2':'(一),(二),(三)....',
+ 'decimal':'1,2,3...',
+ 'lower-alpha':'a,b,c...',
+ 'lower-roman':'i,ii,iii...',
+ 'upper-alpha':'A,B,C...',
+ 'upper-roman':'I,II,III...'
+ },
+ 'insertunorderedlist':{
+ 'circle':'○ Circle',
+ 'disc':'● Circle dot',
+ 'square':'■ Rectangle ',
+ 'dash' :'- Dash',
+ 'dot' : '。dot'
+ },
+ 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'},
+ 'fontfamily':{
+ 'songti':'Sim Sun',
+ 'kaiti':'Sim Kai',
+ 'heiti':'Sim Hei',
+ 'lishu':'Sim Li',
+ 'yahei': 'Microsoft YaHei',
+ 'andaleMono':'Andale Mono',
+ 'arial': 'Arial',
+ 'arialBlack':'Arial Black',
+ 'comicSansMs':'Comic Sans MS',
+ 'impact':'Impact',
+ 'timesNewRoman':'Times New Roman'
+ },
+ 'customstyle':{
+ 'tc':'Title center',
+ 'tl':'Title left',
+ 'im':'Important',
+ 'hi':'Highlight'
+ },
+ 'autoupload': {
+ 'exceedSizeError': 'File Size Exceed',
+ 'exceedTypeError': 'File Type Not Allow',
+ 'jsonEncodeError': 'Server Return Format Error',
+ 'loading':"loading...",
+ 'loadError':"load error",
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ },
+ 'simpleupload':{
+ 'exceedSizeError': 'File Size Exceed',
+ 'exceedTypeError': 'File Type Not Allow',
+ 'jsonEncodeError': 'Server Return Format Error',
+ 'loading':"loading...",
+ 'loadError':"load error",
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ },
+ 'elementPathTip':"Path",
+ 'wordCountTip':"Word Count",
+ 'wordCountMsg':'{#count} characters entered,{#leave} left. ',
+ 'wordOverFlowMsg':'The number of characters has exceeded allowable maximum values, the server may refuse to save!',
+ 'ok':"OK",
+ 'cancel':"Cancel",
+ 'closeDialog':"closeDialog",
+ 'tableDrag':"You must import the file uiUtils.js before drag! ",
+ 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
+ 'loadconfigError': 'Get server config error.',
+ 'loadconfigFormatError': 'Server config format error.',
+ 'loadconfigHttpError': 'Get server config http error.',
+ 'snapScreen_plugin':{
+ 'browserMsg':"Only IE supported!",
+ 'callBackErrorMsg':"The callback data is wrong,please check the config!",
+ 'uploadErrorMsg':"Upload error,please check your server environment! "
+ },
+ 'insertcode':{
+ 'as3':'ActionScript 3',
+ 'bash':'Bash/Shell',
+ 'cpp':'C/C++',
+ 'css':'CSS',
+ 'cf':'ColdFusion',
+ 'c#':'C#',
+ 'delphi':'Delphi',
+ 'diff':'Diff',
+ 'erlang':'Erlang',
+ 'groovy':'Groovy',
+ 'html':'HTML',
+ 'java':'Java',
+ 'jfx':'JavaFX',
+ 'js':'JavaScript',
+ 'pl':'Perl',
+ 'php':'PHP',
+ 'plain':'Plain Text',
+ 'ps':'PowerShell',
+ 'python':'Python',
+ 'ruby':'Ruby',
+ 'scala':'Scala',
+ 'sql':'SQL',
+ 'vb':'Visual Basic',
+ 'xml':'XML'
+ },
+ 'confirmClear':"Do you confirm to clear the Document?",
+ 'contextMenu':{
+ 'delete':"Delete",
+ 'selectall':"Select all",
+ 'deletecode':"Delete Code",
+ 'cleardoc':"Clear Document",
+ 'confirmclear':"Do you confirm to clear the Document?",
+ 'unlink':"Unlink",
+ 'paragraph':"Paragraph",
+ 'edittable':"Table property",
+ 'aligncell':'Align cell',
+ 'aligntable':'Table alignment',
+ 'tableleft':'Left float',
+ 'tablecenter':'Center',
+ 'tableright':'Right float',
+ 'aligntd':'Cell alignment',
+ 'edittd':"Cell property",
+ 'setbordervisible':'set table edge visible',
+ 'table':"Table",
+ 'justifyleft':'Justify Left',
+ 'justifyright':'Justify Right',
+ 'justifycenter':'Justify Center',
+ 'justifyjustify':'Default',
+ 'deletetable':"Delete table",
+ 'insertparagraphbefore':"InsertedBeforeLine",
+ 'insertparagraphafter':'InsertedAfterLine',
+ 'inserttable':'Insert table',
+ 'insertcaption':'Insert caption',
+ 'deletecaption':'Delete Caption',
+ 'inserttitle':'Insert Title',
+ 'deletetitle':'Delete Title',
+ 'inserttitlecol':'Insert Title Col',
+ 'deletetitlecol':'Delete Title Col',
+ 'averageDiseRow':'AverageDise Row',
+ 'averageDisCol':'AverageDis Col',
+ 'deleterow':"Delete row",
+ 'deletecol':"Delete col",
+ 'insertrow':"Insert row",
+ 'insertcol':"Insert col",
+ 'insertrownext':'Insert Row Next',
+ 'insertcolnext':'Insert Col Next',
+ 'mergeright':"Merge right",
+ 'mergeleft':"Merge left",
+ 'mergedown':"Merge down",
+ 'mergecells':"Merge cells",
+ 'splittocells':"Split to cells",
+ 'splittocols':"Split to Cols",
+ 'splittorows':"Split to Rows",
+ 'tablesort':'Table sorting',
+ 'enablesort':'Sorting Enable',
+ 'disablesort':'Sorting Disable',
+ 'reversecurrent':'Reverse current',
+ 'orderbyasc':'Order By ASCII',
+ 'reversebyasc':'Reverse By ASCII',
+ 'orderbynum':'Order By Num',
+ 'reversebynum':'Reverse By Num',
+ 'borderbk':'Border shading',
+ 'setcolor':'interlaced color',
+ 'unsetcolor':'Cancel interlacedcolor',
+ 'setbackground':'Background interlaced',
+ 'unsetbackground':'Cancel Bk interlaced',
+ 'redandblue':'Blue and red',
+ 'threecolorgradient':'Three-color gradient',
+ 'copy':"Copy(Ctrl + c)",
+ 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!",
+ 'paste':"Paste(Ctrl + v)",
+ 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!"
+ },
+ 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!",
+ 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!",
+ 'anthorMsg':"Link",
+ 'clearColor':'Clear',
+ 'standardColor':'Standard color',
+ 'themeColor':'Theme color',
+ 'property':'Property',
+ 'default':'Default',
+ 'modify':'Modify',
+ 'justifyleft':'Justify Left',
+ 'justifyright':'Justify Right',
+ 'justifycenter':'Justify Center',
+ 'justify':'Default',
+ 'clear':'Clear',
+ 'anchorMsg':'Anchor',
+ 'delete':'Delete',
+ 'clickToUpload':"Click to upload",
+ 'unset':'Language hasn\'t been set!',
+ 't_row':'row',
+ 't_col':'col',
+ 'pasteOpt':'Paste Option',
+ 'pasteSourceFormat':"Keep Source Formatting",
+ 'tagFormat':'Keep tag',
+ 'pasteTextFormat':'Keep Text only',
+ 'more':'More',
+ 'autoTypeSet':{
+ 'mergeLine':"Merge empty line",
+ 'delLine':"Del empty line",
+ 'removeFormat':"Remove format",
+ 'indent':"Indent",
+ 'alignment':"Alignment",
+ 'imageFloat':"Image float",
+ 'removeFontsize':"Remove font size",
+ 'removeFontFamily':"Remove fontFamily",
+ 'removeHtml':"Remove redundant HTML code",
+ 'pasteFilter':"Paste filter",
+ 'run':"Done",
+ 'symbol':'Symbol Conversion',
+ 'bdc2sb':'Full-width to Half-width',
+ 'tobdc':'Half-width to Full-width'
+ },
+
+ 'background':{
+ 'static':{
+ 'lang_background_normal':'Normal',
+ 'lang_background_local':'Online',
+ 'lang_background_set':'Background Set',
+ 'lang_background_none':'No Background',
+ 'lang_background_colored':'Colored Background',
+ 'lang_background_color':'Color Set',
+ 'lang_background_netimg':'Net-Image',
+ 'lang_background_align':'Align Type',
+ 'lang_background_position':'Position',
+ 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]}
+ },
+ 'noUploadImage':"No pictures has been uploaded!",
+ 'toggleSelect':'Change the active state by click!\n Image Size: '
+ },
+ //===============dialog i18N=======================
+ 'insertimage':{
+ 'static':{
+ 'lang_tab_remote':"Insert",
+ 'lang_tab_upload':"Local",
+ 'lang_tab_online':"Manager",
+ 'lang_tab_search':"Search",
+ 'lang_input_url':"Address:",
+ 'lang_input_size':"Size:",
+ 'lang_input_width':"Width",
+ 'lang_input_height':"Height",
+ 'lang_input_border':"Border:",
+ 'lang_input_vhspace':"Margins:",
+ 'lang_input_title':"Title:",
+ 'lang_input_align':'Image Float Style:',
+ 'lang_imgLoading':"Loading...",
+ 'lang_start_upload':"Start Upload",
+ 'lock':{'title':"Lock rate"},
+ 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]},
+ 'searchTxt':{'value':"Enter the search keyword!"},
+ 'searchBtn':{'value':"Search"},
+ 'searchReset':{'value':"Clear"},
+ 'noneAlign':{'title':'None Float'},
+ 'leftAlign':{'title':'Left Float'},
+ 'rightAlign':{'title':'Right Float'},
+ 'centerAlign':{'title':'Center In A Line'}
+ },
+ 'uploadSelectFile':'Select File',
+ 'uploadAddFile':'Add File',
+ 'uploadStart':'Start Upload',
+ 'uploadPause':'Pause Upload',
+ 'uploadContinue':'Continue Upload',
+ 'uploadRetry':'Retry Upload',
+ 'uploadDelete':'Delete',
+ 'uploadTurnLeft':'Turn Left',
+ 'uploadTurnRight':'Turn Right',
+ 'uploadPreview':'Doing Preview',
+ 'uploadNoPreview':'Can Not Preview',
+ 'updateStatusReady': 'Selected _ pictures, total _KB.',
+ 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
+ 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully',
+ 'updateStatusError': ' and _ upload failed',
+ 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ 'errorExceedSize':'File Size Exceed',
+ 'errorFileType':'File Type Not Allow',
+ 'errorInterrupt':'File Upload Interrupted',
+ 'errorUploadRetry':'Upload Error, Please Retry.',
+ 'errorHttp':'Http Error',
+ 'errorServerUpload':'Server Result Error.',
+ 'remoteLockError':"Cannot Lock the Proportion between width and height",
+ 'numError':"Please enter the correct Num. e.g 123,400",
+ 'imageUrlError':"The image format may be wrong!",
+ 'imageLoadError':"Error,please check the network or URL!",
+ 'searchRemind':"Enter the search keyword!",
+ 'searchLoading':"Image is loading,please wait...",
+ 'searchRetry':" Sorry,can't find the image,please try again!"
+ },
+ 'attachment':{
+ 'static':{
+ 'lang_tab_upload': 'Upload',
+ 'lang_tab_online': 'Online',
+ 'lang_start_upload':"Start upload",
+ 'lang_drop_remind':"You can drop files here, a single maximum of 300 files"
+ },
+ 'uploadSelectFile':'Select File',
+ 'uploadAddFile':'Add File',
+ 'uploadStart':'Start Upload',
+ 'uploadPause':'Pause Upload',
+ 'uploadContinue':'Continue Upload',
+ 'uploadRetry':'Retry Upload',
+ 'uploadDelete':'Delete',
+ 'uploadTurnLeft':'Turn Left',
+ 'uploadTurnRight':'Turn Right',
+ 'uploadPreview':'Doing Preview',
+ 'updateStatusReady': 'Selected _ files, total _KB.',
+ 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
+ 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
+ 'updateStatusError': ' and _ upload failed',
+ 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ 'errorExceedSize':'File Size Exceed',
+ 'errorFileType':'File Type Not Allow',
+ 'errorInterrupt':'File Upload Interrupted',
+ 'errorUploadRetry':'Upload Error, Please Retry.',
+ 'errorHttp':'Http Error',
+ 'errorServerUpload':'Server Result Error.'
+ },
+
+ 'insertvideo':{
+ 'static':{
+ 'lang_tab_insertV':"Video",
+ 'lang_tab_searchV':"Search",
+ 'lang_tab_uploadV':"Upload",
+ 'lang_video_url':" URL ",
+ 'lang_video_size':"Video Size",
+ 'lang_videoW':"Width",
+ 'lang_videoH':"Height",
+ 'lang_alignment':"Alignment",
+ 'videoSearchTxt':{'value':"Enter the search keyword!"},
+ 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]},
+ 'videoSearchBtn':{'value':"Search in Baidu"},
+ 'videoSearchReset':{'value':"Clear result"},
+
+ 'lang_input_fileStatus':' No file uploaded!',
+ 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
+
+ 'lang_upload_size':"Video Size",
+ 'lang_upload_width':"Width",
+ 'lang_upload_height':"Height",
+ 'lang_upload_alignment':"Alignment",
+ 'lang_format_advice':"Recommends mp4 format."
+ },
+ 'numError':"Please enter the correct Num. e.g 123,400",
+ 'floatLeft':"Float left",
+ 'floatRight':"Float right",
+ 'default':"Default",
+ 'block':"Display in block",
+ 'urlError':"The video url format may be wrong!",
+ 'loading':" The video is loading, please wait…",
+ 'clickToSelect':"Click to select",
+ 'goToSource':'Visit source video ',
+ 'noVideo':" Sorry,can't find the video,please try again!",
+
+ 'browseFiles':'Open files',
+ 'uploadSuccess':'Upload Successful!',
+ 'delSuccessFile':'Remove from the success of the queue',
+ 'delFailSaveFile':'Remove the save failed file',
+ 'statusPrompt':' file(s) uploaded! ',
+ 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!',
+ 'flashLoadingError':'The Flash failed loading! Please check the path or network state',
+ 'fileUploadReady':'Wait for uploading...',
+ 'delUploadQueue':'Remove from the uploading queue ',
+ 'limitPrompt1':'Can not choose more than single',
+ 'limitPrompt2':'file(s)!Please choose again!',
+ 'delFailFile':'Remove failure file',
+ 'fileSizeLimit':'File size exceeds the limit!',
+ 'emptyFile':'Can not upload an empty file!',
+ 'fileTypeError':'File type error!',
+ 'unknownError':'Unknown error!',
+ 'fileUploading':'Uploading,please wait...',
+ 'cancelUpload':'Cancel upload',
+ 'netError':'Network error',
+ 'failUpload':'Upload failed',
+ 'serverIOError':'Server IO error!',
+ 'noAuthority':'No Permission!',
+ 'fileNumLimit':'Upload limit to the number',
+ 'failCheck':'Authentication fails, the upload is skipped!',
+ 'fileCanceling':'Cancel, please wait...',
+ 'stopUploading':'Upload has stopped...',
+
+ 'uploadSelectFile':'Select File',
+ 'uploadAddFile':'Add File',
+ 'uploadStart':'Start Upload',
+ 'uploadPause':'Pause Upload',
+ 'uploadContinue':'Continue Upload',
+ 'uploadRetry':'Retry Upload',
+ 'uploadDelete':'Delete',
+ 'uploadTurnLeft':'Turn Left',
+ 'uploadTurnRight':'Turn Right',
+ 'uploadPreview':'Doing Preview',
+ 'updateStatusReady': 'Selected _ files, total _KB.',
+ 'updateStatusConfirm': '_ uploaded successfully and _ upload failed',
+ 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully',
+ 'updateStatusError': ' and _ upload failed',
+ 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player',
+ 'errorLoadConfig': 'Server config not loaded, upload can not work.',
+ 'errorExceedSize':'File Size Exceed',
+ 'errorFileType':'File Type Not Allow',
+ 'errorInterrupt':'File Upload Interrupted',
+ 'errorUploadRetry':'Upload Error, Please Retry.',
+ 'errorHttp':'Http Error',
+ 'errorServerUpload':'Server Result Error.'
+ },
+ 'webapp':{
+ 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!",
+ 'tip2':"And then open the file ueditor.config.js to set it! ",
+ 'applyFor':"APPLY FOR",
+ 'anthorApi':"Baidu API"
+ },
+ 'template':{
+ 'static':{
+ 'lang_template_bkcolor':'Background Color',
+ 'lang_template_clear' : 'Keep Content',
+ 'lang_template_select':'Select Template'
+ },
+ 'blank':"Blank",
+ 'blog':"Blog",
+ 'resume':"Resume",
+ 'richText':"Rich Text",
+ 'scrPapers':"Scientific Papers"
+ },
+ scrawl:{
+ 'static':{
+ 'lang_input_previousStep':"Previous",
+ 'lang_input_nextsStep':"Next",
+ 'lang_input_clear':'Clear',
+ 'lang_input_addPic':'AddImage',
+ 'lang_input_ScalePic':'ScaleImage',
+ 'lang_input_removePic':'RemoveImage',
+ 'J_imgTxt':{title:'Add background image'}
+ },
+ 'noScarwl':"No paint, a white paper...",
+ 'scrawlUpLoading':"Image is uploading, please wait...",
+ 'continueBtn':"Try again",
+ 'imageError':"Image failed to load!",
+ 'backgroundUploading':'Image is uploading,please wait...'
+ },
+ 'music':{
+ 'static':{
+ 'lang_input_tips':"Input singer/song/album, search you interested in music!",
+ 'J_searchBtn':{value:'Search songs'}
+ },
+ 'emptyTxt':'Not search to the relevant music results, please change a keyword try.',
+ 'chapter':'Songs',
+ 'singer':'Singer',
+ 'special':'Album',
+ 'listenTest':'Audition'
+ },
+ anchor:{
+ 'static':{
+ 'lang_input_anchorName':'Anchor Name:'
+ }
+ },
+ 'charts':{
+ 'static':{
+ 'lang_data_source':'Data source:',
+ 'lang_chart_format': 'Chart format:',
+ 'lang_data_align': 'Align',
+ 'lang_chart_align_same': 'Consistent with the X-axis Y-axis',
+ 'lang_chart_align_reverse': 'X-axis Y-axis opposite',
+ 'lang_chart_title': 'Title',
+ 'lang_chart_main_title': 'main title:',
+ 'lang_chart_sub_title': 'sub title:',
+ 'lang_chart_x_title': 'X-axis title:',
+ 'lang_chart_y_title': 'Y-axis title:',
+ 'lang_chart_tip': 'Prompt',
+ 'lang_cahrt_tip_prefix': 'prefix:',
+ 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
+ 'lang_chart_data_unit': 'Unit',
+ 'lang_chart_data_unit_title': 'unit:',
+ 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
+ 'lang_chart_type': 'Chart type:',
+ 'lang_prev_btn': 'Previous',
+ 'lang_next_btn': 'Next'
+ }
+ },
+ emotion:{
+ 'static':{
+ 'lang_input_choice':'Choice',
+ 'lang_input_Tuzki':'Tuzki',
+ 'lang_input_lvdouwa':'LvDouWa',
+ 'lang_input_BOBO':'BOBO',
+ 'lang_input_babyCat':'BabyCat',
+ 'lang_input_bubble':'Bubble',
+ 'lang_input_youa':'YouA'
+ }
+ },
+ gmap:{
+ 'static':{
+ 'lang_input_address':'Address:',
+ 'lang_input_search':'Search',
+ 'address':{value:"Beijing"}
+ },
+ searchError:'Unable to locate the address!'
+ },
+ help:{
+ 'static':{
+ 'lang_input_about':'About',
+ 'lang_input_shortcuts':'Shortcuts',
+ 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.",
+ 'lang_Txt_shortcuts':'Shortcuts',
+ 'lang_Txt_func':'Function',
+ 'lang_Txt_bold':'Bold',
+ 'lang_Txt_copy':'Copy',
+ 'lang_Txt_cut':'Cut',
+ 'lang_Txt_Paste':'Paste',
+ 'lang_Txt_undo':'Undo',
+ 'lang_Txt_redo':'Redo',
+ 'lang_Txt_italic':'Italic',
+ 'lang_Txt_underline':'Underline',
+ 'lang_Txt_selectAll':'Select All',
+ 'lang_Txt_visualEnter':'Submit',
+ 'lang_Txt_fullscreen':'Fullscreen'
+ }
+ },
+ insertframe:{
+ 'static':{
+ 'lang_input_address':'Address:',
+ 'lang_input_width':'Width:',
+ 'lang_input_height':'height:',
+ 'lang_input_isScroll':'Enable scrollbars:',
+ 'lang_input_frameborder':'Show frame border:',
+ 'lang_input_alignMode':'Alignment:',
+ 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]}
+ },
+ 'enterAddress':'Please enter an address!'
+ },
+ link:{
+ 'static':{
+ 'lang_input_text':'Text:',
+ 'lang_input_url':'URL:',
+ 'lang_input_title':'Title:',
+ 'lang_input_target':'open in new window:'
+ },
+ 'validLink':'Supports only effective when a link is selected',
+ 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!'
+ },
+ map:{
+ 'static':{
+ lang_city:"City",
+ lang_address:"Address",
+ city:{value:"Beijing"},
+ lang_search:"Search",
+ lang_dynamicmap:"Dynamic map"
+ },
+ cityMsg:"Please enter the city name!",
+ errorMsg:"Can't find the place!"
+ },
+ searchreplace:{
+ 'static':{
+ lang_tab_search:"Search",
+ lang_tab_replace:"Replace",
+ lang_search1:"Search",
+ lang_search2:"Search",
+ lang_replace:"Replace",
+ lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
+ lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"',
+ lang_case_sensitive1:"Case sense",
+ lang_case_sensitive2:"Case sense",
+ nextFindBtn:{value:"Next"},
+ preFindBtn:{value:"Preview"},
+ nextReplaceBtn:{value:"Next"},
+ preReplaceBtn:{value:"Preview"},
+ repalceBtn:{value:"Replace"},
+ repalceAllBtn:{value:"Replace all"}
+ },
+ getEnd:"Has the search to the bottom!",
+ getStart:"Has the search to the top!",
+ countMsg:"Altogether replaced {#count} character(s)!"
+ },
+ snapscreen:{
+ 'static':{
+ lang_showMsg:"You should install the UEditor screenshots program first!",
+ lang_download:"Download!",
+ lang_step1:"Step1:Download the program and then run it",
+ lang_step2:"Step2:After complete install,try to click the button again"
+ }
+ },
+ spechars:{
+ 'static':{},
+ tsfh:"Special",
+ lmsz:"Roman",
+ szfh:"Numeral",
+ rwfh:"Japanese",
+ xlzm:"The Greek",
+ ewzm:"Russian",
+ pyzm:"Phonetic",
+ yyyb:"English",
+ zyzf:"Others"
+ },
+ 'edittable':{
+ 'static':{
+ 'lang_tableStyle':'Table style',
+ 'lang_insertCaption':'Add table header row',
+ 'lang_insertTitle':'Add table title row',
+ 'lang_insertTitleCol':'Add table title col',
+ 'lang_tableSize':'Automatically adjust table size',
+ 'lang_autoSizeContent':'Adaptive by form text',
+ 'lang_orderbycontent':"Table of contents sortable",
+ 'lang_autoSizePage':'Page width adaptive',
+ 'lang_example':'Example',
+ 'lang_borderStyle':'Table Border',
+ 'lang_color':'Color:'
+ },
+ captionName:'Caption',
+ titleName:'Title',
+ cellsName:'text',
+ errorMsg:'There are merged cells, can not sort.'
+ },
+ 'edittip':{
+ 'static':{
+ lang_delRow:'Delete entire row',
+ lang_delCol:'Delete entire col'
+ }
+ },
+ 'edittd':{
+ 'static':{
+ lang_tdBkColor:'Background Color:'
+ }
+ },
+ 'formula':{
+ 'static':{
+ }
+ },
+ wordimage:{
+ 'static':{
+ lang_resave:"The re-save step",
+ uploadBtn:{src:"upload.png", alt:"Upload"},
+ clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
+ lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process."
+ },
+ fileType:"Image",
+ flashError:"Flash initialization failed!",
+ netError:"Network error! Please try again!",
+ copySuccess:"URL has been copied!",
+
+ 'flashI18n':{
+ lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ),
+ uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ),
+ imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ),
+ textEncoding:"utf-8",
+ addImageSkinURL:"addImage.png",
+ allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png",
+ allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png",
+ rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png",
+ rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png",
+ rotateRightBtnEnableSkinURL:"rotateRightEnable.png",
+ rotateRightBtnDisableSkinURL:"rotateRightDisable.png",
+ deleteBtnEnableSkinURL:"deleteEnable.png",
+ deleteBtnDisableSkinURL:"deleteDisable.png",
+ backgroundURL:'',
+ listBackgroundURL:'',
+ buttonURL:'button.png'
+ }
+ },
+ 'autosave': {
+ 'success':'Local conservation success'
+ }
+};
diff --git a/public/ueditor/lang/en/images/addimage.png b/public/ueditor/lang/en/images/addimage.png
new file mode 100644
index 0000000..3a2fd17
Binary files /dev/null and b/public/ueditor/lang/en/images/addimage.png differ
diff --git a/public/ueditor/lang/en/images/alldeletebtnhoverskin.png b/public/ueditor/lang/en/images/alldeletebtnhoverskin.png
new file mode 100644
index 0000000..355eeab
Binary files /dev/null and b/public/ueditor/lang/en/images/alldeletebtnhoverskin.png differ
diff --git a/public/ueditor/lang/en/images/alldeletebtnupskin.png b/public/ueditor/lang/en/images/alldeletebtnupskin.png
new file mode 100644
index 0000000..61658ce
Binary files /dev/null and b/public/ueditor/lang/en/images/alldeletebtnupskin.png differ
diff --git a/public/ueditor/lang/en/images/background.png b/public/ueditor/lang/en/images/background.png
new file mode 100644
index 0000000..d5bf5fd
Binary files /dev/null and b/public/ueditor/lang/en/images/background.png differ
diff --git a/public/ueditor/lang/en/images/button.png b/public/ueditor/lang/en/images/button.png
new file mode 100644
index 0000000..098874c
Binary files /dev/null and b/public/ueditor/lang/en/images/button.png differ
diff --git a/public/ueditor/lang/en/images/copy.png b/public/ueditor/lang/en/images/copy.png
new file mode 100644
index 0000000..f982e8b
Binary files /dev/null and b/public/ueditor/lang/en/images/copy.png differ
diff --git a/public/ueditor/lang/en/images/deletedisable.png b/public/ueditor/lang/en/images/deletedisable.png
new file mode 100644
index 0000000..c8ee750
Binary files /dev/null and b/public/ueditor/lang/en/images/deletedisable.png differ
diff --git a/public/ueditor/lang/en/images/deleteenable.png b/public/ueditor/lang/en/images/deleteenable.png
new file mode 100644
index 0000000..26acc88
Binary files /dev/null and b/public/ueditor/lang/en/images/deleteenable.png differ
diff --git a/public/ueditor/lang/en/images/listbackground.png b/public/ueditor/lang/en/images/listbackground.png
new file mode 100644
index 0000000..4f82ccd
Binary files /dev/null and b/public/ueditor/lang/en/images/listbackground.png differ
diff --git a/public/ueditor/lang/en/images/localimage.png b/public/ueditor/lang/en/images/localimage.png
new file mode 100644
index 0000000..12c8e6a
Binary files /dev/null and b/public/ueditor/lang/en/images/localimage.png differ
diff --git a/public/ueditor/lang/en/images/music.png b/public/ueditor/lang/en/images/music.png
new file mode 100644
index 0000000..2f495fe
Binary files /dev/null and b/public/ueditor/lang/en/images/music.png differ
diff --git a/public/ueditor/lang/en/images/rotateleftdisable.png b/public/ueditor/lang/en/images/rotateleftdisable.png
new file mode 100644
index 0000000..741526e
Binary files /dev/null and b/public/ueditor/lang/en/images/rotateleftdisable.png differ
diff --git a/public/ueditor/lang/en/images/rotateleftenable.png b/public/ueditor/lang/en/images/rotateleftenable.png
new file mode 100644
index 0000000..e164ddb
Binary files /dev/null and b/public/ueditor/lang/en/images/rotateleftenable.png differ
diff --git a/public/ueditor/lang/en/images/rotaterightdisable.png b/public/ueditor/lang/en/images/rotaterightdisable.png
new file mode 100644
index 0000000..5a78c26
Binary files /dev/null and b/public/ueditor/lang/en/images/rotaterightdisable.png differ
diff --git a/public/ueditor/lang/en/images/rotaterightenable.png b/public/ueditor/lang/en/images/rotaterightenable.png
new file mode 100644
index 0000000..d768531
Binary files /dev/null and b/public/ueditor/lang/en/images/rotaterightenable.png differ
diff --git a/public/ueditor/lang/en/images/upload.png b/public/ueditor/lang/en/images/upload.png
new file mode 100644
index 0000000..7bb15b3
Binary files /dev/null and b/public/ueditor/lang/en/images/upload.png differ
diff --git a/public/ueditor/lang/zh-cn/images/copy.png b/public/ueditor/lang/zh-cn/images/copy.png
new file mode 100644
index 0000000..b2536aa
Binary files /dev/null and b/public/ueditor/lang/zh-cn/images/copy.png differ
diff --git a/public/ueditor/lang/zh-cn/images/localimage.png b/public/ueditor/lang/zh-cn/images/localimage.png
new file mode 100644
index 0000000..7303c36
Binary files /dev/null and b/public/ueditor/lang/zh-cn/images/localimage.png differ
diff --git a/public/ueditor/lang/zh-cn/images/music.png b/public/ueditor/lang/zh-cn/images/music.png
new file mode 100644
index 0000000..354edeb
Binary files /dev/null and b/public/ueditor/lang/zh-cn/images/music.png differ
diff --git a/public/ueditor/lang/zh-cn/images/upload.png b/public/ueditor/lang/zh-cn/images/upload.png
new file mode 100644
index 0000000..08d4d92
Binary files /dev/null and b/public/ueditor/lang/zh-cn/images/upload.png differ
diff --git a/public/ueditor/lang/zh-cn/zh-cn.js b/public/ueditor/lang/zh-cn/zh-cn.js
new file mode 100644
index 0000000..fa9a2b8
--- /dev/null
+++ b/public/ueditor/lang/zh-cn/zh-cn.js
@@ -0,0 +1,669 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午5:02
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['zh-cn'] = {
+ 'labelMap':{
+ 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
+ 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
+ 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
+ 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
+ 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
+ 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
+ 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
+ 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
+ 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
+ 'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
+ 'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图',
+ 'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
+ 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
+ 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
+ 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
+ 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
+ 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',
+ 'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
+ 'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
+ },
+ 'insertorderedlist':{
+ 'num':'1,2,3...',
+ 'num1':'1),2),3)...',
+ 'num2':'(1),(2),(3)...',
+ 'cn':'一,二,三....',
+ 'cn1':'一),二),三)....',
+ 'cn2':'(一),(二),(三)....',
+ 'decimal':'1,2,3...',
+ 'lower-alpha':'a,b,c...',
+ 'lower-roman':'i,ii,iii...',
+ 'upper-alpha':'A,B,C...',
+ 'upper-roman':'I,II,III...'
+ },
+ 'insertunorderedlist':{
+ 'circle':'○ 大圆圈',
+ 'disc':'● 小黑点',
+ 'square':'■ 小方块 ',
+ 'dash' :'— 破折号',
+ 'dot':' 。 小圆圈'
+ },
+ 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
+ 'fontfamily':{
+ 'songti':'宋体',
+ 'kaiti':'楷体',
+ 'heiti':'黑体',
+ 'lishu':'隶书',
+ 'yahei':'微软雅黑',
+ 'andaleMono':'andale mono',
+ 'arial': 'arial',
+ 'arialBlack':'arial black',
+ 'comicSansMs':'comic sans ms',
+ 'impact':'impact',
+ 'timesNewRoman':'times new roman'
+ },
+ 'customstyle':{
+ 'tc':'标题居中',
+ 'tl':'标题居左',
+ 'im':'强调',
+ 'hi':'明显强调'
+ },
+ 'autoupload': {
+ 'exceedSizeError': '文件大小超出限制',
+ 'exceedTypeError': '文件格式不允许',
+ 'jsonEncodeError': '服务器返回格式错误',
+ 'loading':"正在上传...",
+ 'loadError':"上传错误",
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+ },
+ 'simpleupload':{
+ 'exceedSizeError': '文件大小超出限制',
+ 'exceedTypeError': '文件格式不允许',
+ 'jsonEncodeError': '服务器返回格式错误',
+ 'loading':"正在上传...",
+ 'loadError':"上传错误",
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+ },
+ 'elementPathTip':"元素路径",
+ 'wordCountTip':"字数统计",
+ 'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
+ 'wordOverFlowMsg':'字数超出最大允许值,服务器可能拒绝保存!',
+ 'ok':"确认",
+ 'cancel':"取消",
+ 'closeDialog':"关闭对话框",
+ 'tableDrag':"表格拖动必须引入uiUtils.js文件!",
+ 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!",
+ 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!',
+ 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!',
+ 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!',
+ 'snapScreen_plugin':{
+ 'browserMsg':"仅支持IE浏览器!",
+ 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。",
+ 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! "
+ },
+ 'insertcode':{
+ 'as3':'ActionScript 3',
+ 'bash':'Bash/Shell',
+ 'cpp':'C/C++',
+ 'css':'CSS',
+ 'cf':'ColdFusion',
+ 'c#':'C#',
+ 'delphi':'Delphi',
+ 'diff':'Diff',
+ 'erlang':'Erlang',
+ 'groovy':'Groovy',
+ 'html':'HTML',
+ 'java':'Java',
+ 'jfx':'JavaFX',
+ 'js':'JavaScript',
+ 'pl':'Perl',
+ 'php':'PHP',
+ 'plain':'Plain Text',
+ 'ps':'PowerShell',
+ 'python':'Python',
+ 'ruby':'Ruby',
+ 'scala':'Scala',
+ 'sql':'SQL',
+ 'vb':'Visual Basic',
+ 'xml':'XML'
+ },
+ 'confirmClear':"确定清空当前文档么?",
+ 'contextMenu':{
+ 'delete':"删除",
+ 'selectall':"全选",
+ 'deletecode':"删除代码",
+ 'cleardoc':"清空文档",
+ 'confirmclear':"确定清空当前文档么?",
+ 'unlink':"删除超链接",
+ 'paragraph':"段落格式",
+ 'edittable':"表格属性",
+ 'aligntd':"单元格对齐方式",
+ 'aligntable':'表格对齐方式',
+ 'tableleft':'左浮动',
+ 'tablecenter':'居中显示',
+ 'tableright':'右浮动',
+ 'edittd':"单元格属性",
+ 'setbordervisible':'设置表格边线可见',
+ 'justifyleft':'左对齐',
+ 'justifyright':'右对齐',
+ 'justifycenter':'居中对齐',
+ 'justifyjustify':'两端对齐',
+ 'table':"表格",
+ 'inserttable':'插入表格',
+ 'deletetable':"删除表格",
+ 'insertparagraphbefore':"前插入段落",
+ 'insertparagraphafter':'后插入段落',
+ 'deleterow':"删除当前行",
+ 'deletecol':"删除当前列",
+ 'insertrow':"前插入行",
+ 'insertcol':"左插入列",
+ 'insertrownext':'后插入行',
+ 'insertcolnext':'右插入列',
+ 'insertcaption':'插入表格名称',
+ 'deletecaption':'删除表格名称',
+ 'inserttitle':'插入表格标题行',
+ 'deletetitle':'删除表格标题行',
+ 'inserttitlecol':'插入表格标题列',
+ 'deletetitlecol':'删除表格标题列',
+ 'averageDiseRow':'平均分布各行',
+ 'averageDisCol':'平均分布各列',
+ 'mergeright':"向右合并",
+ 'mergeleft':"向左合并",
+ 'mergedown':"向下合并",
+ 'mergecells':"合并单元格",
+ 'splittocells':"完全拆分单元格",
+ 'splittocols':"拆分成列",
+ 'splittorows':"拆分成行",
+ 'tablesort':'表格排序',
+ 'enablesort':'设置表格可排序',
+ 'disablesort':'取消表格可排序',
+ 'reversecurrent':'逆序当前',
+ 'orderbyasc':'按ASCII字符升序',
+ 'reversebyasc':'按ASCII字符降序',
+ 'orderbynum':'按数值大小升序',
+ 'reversebynum':'按数值大小降序',
+ 'borderbk':'边框底纹',
+ 'setcolor':'表格隔行变色',
+ 'unsetcolor':'取消表格隔行变色',
+ 'setbackground':'选区背景隔行',
+ 'unsetbackground':'取消选区背景',
+ 'redandblue':'红蓝相间',
+ 'threecolorgradient':'三色渐变',
+ 'copy':"复制(Ctrl + c)",
+ 'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
+ 'paste':"粘贴(Ctrl + v)",
+ 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'"
+ },
+ 'copymsg': "浏览器不支持,请使用 'Ctrl + c'",
+ 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'",
+ 'anthorMsg':"链接",
+ 'clearColor':'清空颜色',
+ 'standardColor':'标准颜色',
+ 'themeColor':'主题颜色',
+ 'property':'属性',
+ 'default':'默认',
+ 'modify':'修改',
+ 'justifyleft':'左对齐',
+ 'justifyright':'右对齐',
+ 'justifycenter':'居中',
+ 'justify':'默认',
+ 'clear':'清除',
+ 'anchorMsg':'锚点',
+ 'delete':'删除',
+ 'clickToUpload':"点击上传",
+ 'unset':'尚未设置语言文件',
+ 't_row':'行',
+ 't_col':'列',
+ 'more':'更多',
+ 'pasteOpt':'粘贴选项',
+ 'pasteSourceFormat':"保留源格式",
+ 'tagFormat':'只保留标签',
+ 'pasteTextFormat':'只保留文本',
+ 'autoTypeSet':{
+ 'mergeLine':"合并空行",
+ 'delLine':"清除空行",
+ 'removeFormat':"清除格式",
+ 'indent':"首行缩进",
+ 'alignment':"对齐方式",
+ 'imageFloat':"图片浮动",
+ 'removeFontsize':"清除字号",
+ 'removeFontFamily':"清除字体",
+ 'removeHtml':"清除冗余HTML代码",
+ 'pasteFilter':"粘贴过滤",
+ 'run':"执行",
+ 'symbol':'符号转换',
+ 'bdc2sb':'全角转半角',
+ 'tobdc':'半角转全角'
+ },
+
+ 'background':{
+ 'static':{
+ 'lang_background_normal':'背景设置',
+ 'lang_background_local':'在线图片',
+ 'lang_background_set':'选项',
+ 'lang_background_none':'无背景色',
+ 'lang_background_colored':'有背景色',
+ 'lang_background_color':'颜色设置',
+ 'lang_background_netimg':'网络图片',
+ 'lang_background_align':'对齐方式',
+ 'lang_background_position':'精确定位',
+ 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]}
+
+ },
+ 'noUploadImage':"当前未上传过任何图片!",
+ 'toggleSelect':"单击可切换选中状态\n原图尺寸: "
+ },
+ //===============dialog i18N=======================
+ 'insertimage':{
+ 'static':{
+ 'lang_tab_remote':"插入图片", //节点
+ 'lang_tab_upload':"本地上传",
+ 'lang_tab_online':"本地图片",
+ 'lang_tab_search':"图片搜索",
+ 'lang_input_url':"地 址:",
+ 'lang_input_size':"大 小:",
+ 'lang_input_width':"宽度",
+ 'lang_input_height':"高度",
+ 'lang_input_border':"边 框:",
+ 'lang_input_vhspace':"边 距:",
+ 'lang_input_title':"描 述:",
+ 'lang_input_align':'图片浮动方式:',
+ 'lang_imgLoading':" 图片加载中……",
+ 'lang_start_upload':"开始上传",
+ 'lock':{'title':"锁定宽高比例"}, //属性
+ 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option
+ 'searchTxt':{'value':"请输入搜索关键词"},
+ 'searchBtn':{'value':"百度一下"},
+ 'searchReset':{'value':"清空搜索"},
+ 'noneAlign':{'title':'无浮动'},
+ 'leftAlign':{'title':'左浮动'},
+ 'rightAlign':{'title':'右浮动'},
+ 'centerAlign':{'title':'居中独占一行'}
+ },
+ 'uploadSelectFile':'点击选择图片',
+ 'uploadAddFile':'继续添加',
+ 'uploadStart':'开始上传',
+ 'uploadPause':'暂停上传',
+ 'uploadContinue':'继续上传',
+ 'uploadRetry':'重试上传',
+ 'uploadDelete':'删除',
+ 'uploadTurnLeft':'向左旋转',
+ 'uploadTurnRight':'向右旋转',
+ 'uploadPreview':'预览中',
+ 'uploadNoPreview':'不能预览',
+ 'updateStatusReady': '选中_张图片,共_KB。',
+ 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败',
+ 'updateStatusFinish': '共_张(_KB),_张上传成功',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize':'文件大小超出',
+ 'errorFileType':'文件格式不允许',
+ 'errorInterrupt':'文件传输中断',
+ 'errorUploadRetry':'上传失败,请重试',
+ 'errorHttp':'http请求错误',
+ 'errorServerUpload':'服务器返回出错',
+ 'remoteLockError':"宽高不正确,不能所定比例",
+ 'numError':"请输入正确的长度或者宽度值!例如:123,400",
+ 'imageUrlError':"不允许的图片格式或者图片域!",
+ 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!",
+ 'searchRemind':"请输入搜索关键词",
+ 'searchLoading':"图片加载中,请稍后……",
+ 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!"
+ },
+ 'attachment':{
+ 'static':{
+ 'lang_tab_upload': '上传附件',
+ 'lang_tab_online': '在线附件',
+ 'lang_start_upload':"开始上传",
+ 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件"
+ },
+ 'uploadSelectFile':'点击选择文件',
+ 'uploadAddFile':'继续添加',
+ 'uploadStart':'开始上传',
+ 'uploadPause':'暂停上传',
+ 'uploadContinue':'继续上传',
+ 'uploadRetry':'重试上传',
+ 'uploadDelete':'删除',
+ 'uploadTurnLeft':'向左旋转',
+ 'uploadTurnRight':'向右旋转',
+ 'uploadPreview':'预览中',
+ 'updateStatusReady': '选中_个文件,共_KB。',
+ 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败',
+ 'updateStatusFinish': '共_个(_KB),_个上传成功',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize':'文件大小超出',
+ 'errorFileType':'文件格式不允许',
+ 'errorInterrupt':'文件传输中断',
+ 'errorUploadRetry':'上传失败,请重试',
+ 'errorHttp':'http请求错误',
+ 'errorServerUpload':'服务器返回出错'
+ },
+ 'insertvideo':{
+ 'static':{
+ 'lang_tab_insertV':"插入视频",
+ 'lang_tab_searchV':"搜索视频",
+ 'lang_tab_uploadV':"上传视频",
+ 'lang_video_url':"视频网址",
+ 'lang_video_size':"视频尺寸",
+ 'lang_videoW':"宽度",
+ 'lang_videoH':"高度",
+ 'lang_alignment':"对齐方式",
+ 'videoSearchTxt':{'value':"请输入搜索关键字!"},
+ 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
+ 'videoSearchBtn':{'value':"百度一下"},
+ 'videoSearchReset':{'value':"清空结果"},
+
+ 'lang_input_fileStatus':' 当前未上传文件',
+ 'startUpload':{'style':"background:url(upload.png) no-repeat;"},
+
+ 'lang_upload_size':"视频尺寸",
+ 'lang_upload_width':"宽度",
+ 'lang_upload_height':"高度",
+ 'lang_upload_alignment':"对齐方式",
+ 'lang_format_advice':"建议使用mp4格式."
+
+ },
+ 'numError':"请输入正确的数值,如123,400",
+ 'floatLeft':"左浮动",
+ 'floatRight':"右浮动",
+ '"default"':"默认",
+ 'block':"独占一行",
+ 'urlError':"输入的视频地址有误,请检查后再试!",
+ 'loading':" 视频加载中,请等待……",
+ 'clickToSelect':"点击选中",
+ 'goToSource':'访问源视频',
+ 'noVideo':" 抱歉,找不到对应的视频,请重试!",
+
+ 'browseFiles':'浏览文件',
+ 'uploadSuccess':'上传成功!',
+ 'delSuccessFile':'从成功队列中移除',
+ 'delFailSaveFile':'移除保存失败文件',
+ 'statusPrompt':' 个文件已上传! ',
+ 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!',
+ 'flashLoadingError':'Flash加载失败!请检查路径或网络状态',
+ 'fileUploadReady':'等待上传……',
+ 'delUploadQueue':'从上传队列中移除',
+ 'limitPrompt1':'单次不能选择超过',
+ 'limitPrompt2':'个文件!请重新选择!',
+ 'delFailFile':'移除失败文件',
+ 'fileSizeLimit':'文件大小超出限制!',
+ 'emptyFile':'空文件无法上传!',
+ 'fileTypeError':'文件类型不允许!',
+ 'unknownError':'未知错误!',
+ 'fileUploading':'上传中,请等待……',
+ 'cancelUpload':'取消上传',
+ 'netError':'网络错误',
+ 'failUpload':'上传失败!',
+ 'serverIOError':'服务器IO错误!',
+ 'noAuthority':'无权限!',
+ 'fileNumLimit':'上传个数限制',
+ 'failCheck':'验证失败,本次上传被跳过!',
+ 'fileCanceling':'取消中,请等待……',
+ 'stopUploading':'上传已停止……',
+
+ 'uploadSelectFile':'点击选择文件',
+ 'uploadAddFile':'继续添加',
+ 'uploadStart':'开始上传',
+ 'uploadPause':'暂停上传',
+ 'uploadContinue':'继续上传',
+ 'uploadRetry':'重试上传',
+ 'uploadDelete':'删除',
+ 'uploadTurnLeft':'向左旋转',
+ 'uploadTurnRight':'向右旋转',
+ 'uploadPreview':'预览中',
+ 'updateStatusReady': '选中_个文件,共_KB。',
+ 'updateStatusConfirm': '成功上传_个,_个失败',
+ 'updateStatusFinish': '共_个(_KB),_个成功上传',
+ 'updateStatusError': ',_张上传失败。',
+ 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。',
+ 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!',
+ 'errorExceedSize':'文件大小超出',
+ 'errorFileType':'文件格式不允许',
+ 'errorInterrupt':'文件传输中断',
+ 'errorUploadRetry':'上传失败,请重试',
+ 'errorHttp':'http请求错误',
+ 'errorServerUpload':'服务器返回出错'
+ },
+ 'webapp':{
+ 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!",
+ 'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ",
+ 'applyFor':"点此申请",
+ 'anthorApi':"百度API"
+ },
+ 'template':{
+ 'static':{
+ 'lang_template_bkcolor':'背景颜色',
+ 'lang_template_clear' : '保留原有内容',
+ 'lang_template_select' : '选择模板'
+ },
+ 'blank':"空白文档",
+ 'blog':"博客文章",
+ 'resume':"个人简历",
+ 'richText':"图文混排",
+ 'sciPapers':"科技论文"
+
+
+ },
+ 'scrawl':{
+ 'static':{
+ 'lang_input_previousStep':"上一步",
+ 'lang_input_nextsStep':"下一步",
+ 'lang_input_clear':'清空',
+ 'lang_input_addPic':'添加背景',
+ 'lang_input_ScalePic':'缩放背景',
+ 'lang_input_removePic':'删除背景',
+ 'J_imgTxt':{title:'添加背景图片'}
+ },
+ 'noScarwl':"尚未作画,白纸一张~",
+ 'scrawlUpLoading':"涂鸦上传中,别急哦~",
+ 'continueBtn':"继续",
+ 'imageError':"糟糕,图片读取失败了!",
+ 'backgroundUploading':'背景图片上传中,别急哦~'
+ },
+ 'music':{
+ 'static':{
+ 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!",
+ 'J_searchBtn':{value:'搜索歌曲'}
+ },
+ 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。',
+ 'chapter':'歌曲',
+ 'singer':'歌手',
+ 'special':'专辑',
+ 'listenTest':'试听'
+ },
+ 'anchor':{
+ 'static':{
+ 'lang_input_anchorName':'锚点名字:'
+ }
+ },
+ 'charts':{
+ 'static':{
+ 'lang_data_source':'数据源:',
+ 'lang_chart_format': '图表格式:',
+ 'lang_data_align': '数据对齐方式',
+ 'lang_chart_align_same': '数据源与图表X轴Y轴一致',
+ 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反',
+ 'lang_chart_title': '图表标题',
+ 'lang_chart_main_title': '主标题:',
+ 'lang_chart_sub_title': '子标题:',
+ 'lang_chart_x_title': 'X轴标题:',
+ 'lang_chart_y_title': 'Y轴标题:',
+ 'lang_chart_tip': '提示文字',
+ 'lang_cahrt_tip_prefix': '提示文字前缀:',
+ 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀',
+ 'lang_chart_data_unit': '数据单位',
+ 'lang_chart_data_unit_title': '单位:',
+ 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃',
+ 'lang_chart_type': '图表类型:',
+ 'lang_prev_btn': '上一个',
+ 'lang_next_btn': '下一个'
+ }
+ },
+ 'emotion':{
+ 'static':{
+ 'lang_input_choice':'精选',
+ 'lang_input_Tuzki':'兔斯基',
+ 'lang_input_BOBO':'BOBO',
+ 'lang_input_lvdouwa':'绿豆蛙',
+ 'lang_input_babyCat':'baby猫',
+ 'lang_input_bubble':'泡泡',
+ 'lang_input_youa':'有啊'
+ }
+ },
+ 'gmap':{
+ 'static':{
+ 'lang_input_address':'地址',
+ 'lang_input_search':'搜索',
+ 'address':{value:"北京"}
+ },
+ searchError:'无法定位到该地址!'
+ },
+ 'help':{
+ 'static':{
+ 'lang_input_about':'关于UEditor',
+ 'lang_input_shortcuts':'快捷键',
+ 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。',
+ 'lang_Txt_shortcuts':'快捷键',
+ 'lang_Txt_func':'功能',
+ 'lang_Txt_bold':'给选中字设置为加粗',
+ 'lang_Txt_copy':'复制选中内容',
+ 'lang_Txt_cut':'剪切选中内容',
+ 'lang_Txt_Paste':'粘贴',
+ 'lang_Txt_undo':'重新执行上次操作',
+ 'lang_Txt_redo':'撤销上一次操作',
+ 'lang_Txt_italic':'给选中字设置为斜体',
+ 'lang_Txt_underline':'给选中字加下划线',
+ 'lang_Txt_selectAll':'全部选中',
+ 'lang_Txt_visualEnter':'软回车',
+ 'lang_Txt_fullscreen':'全屏'
+ }
+ },
+ 'insertframe':{
+ 'static':{
+ 'lang_input_address':'地址:',
+ 'lang_input_width':'宽度:',
+ 'lang_input_height':'高度:',
+ 'lang_input_isScroll':'允许滚动条:',
+ 'lang_input_frameborder':'显示框架边框:',
+ 'lang_input_alignMode':'对齐方式:',
+ 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]}
+ },
+ 'enterAddress':'请输入地址!'
+ },
+ 'link':{
+ 'static':{
+ 'lang_input_text':'文本内容:',
+ 'lang_input_url':'链接地址:',
+ 'lang_input_title':'标题:',
+ 'lang_input_target':'是否在新窗口打开:'
+ },
+ 'validLink':'只支持选中一个链接时生效',
+ 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀'
+ },
+ 'map':{
+ 'static':{
+ lang_city:"城市",
+ lang_address:"地址",
+ city:{value:"北京"},
+ lang_search:"搜索",
+ lang_dynamicmap:"插入动态地图"
+ },
+ cityMsg:"请选择城市",
+ errorMsg:"抱歉,找不到该位置!"
+ },
+ 'searchreplace':{
+ 'static':{
+ lang_tab_search:"查找",
+ lang_tab_replace:"替换",
+ lang_search1:"查找",
+ lang_search2:"查找",
+ lang_replace:"替换",
+ lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
+ lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”',
+ lang_case_sensitive1:"区分大小写",
+ lang_case_sensitive2:"区分大小写",
+ nextFindBtn:{value:"下一个"},
+ preFindBtn:{value:"上一个"},
+ nextReplaceBtn:{value:"下一个"},
+ preReplaceBtn:{value:"上一个"},
+ repalceBtn:{value:"替换"},
+ repalceAllBtn:{value:"全部替换"}
+ },
+ getEnd:"已经搜索到文章末尾!",
+ getStart:"已经搜索到文章头部",
+ countMsg:"总共替换了{#count}处!"
+ },
+ 'snapscreen':{
+ 'static':{
+ lang_showMsg:"截图功能需要首先安装UEditor截图插件! ",
+ lang_download:"点此下载",
+ lang_step1:"第一步,下载UEditor截图插件并运行安装。",
+ lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!"
+ }
+ },
+ 'spechars':{
+ 'static':{},
+ tsfh:"特殊字符",
+ lmsz:"罗马字符",
+ szfh:"数学字符",
+ rwfh:"日文字符",
+ xlzm:"希腊字母",
+ ewzm:"俄文字符",
+ pyzm:"拼音字母",
+ yyyb:"英语音标",
+ zyzf:"其他"
+ },
+ 'edittable':{
+ 'static':{
+ 'lang_tableStyle':'表格样式',
+ 'lang_insertCaption':'添加表格名称行',
+ 'lang_insertTitle':'添加表格标题行',
+ 'lang_insertTitleCol':'添加表格标题列',
+ 'lang_orderbycontent':"使表格内容可排序",
+ 'lang_tableSize':'自动调整表格尺寸',
+ 'lang_autoSizeContent':'按表格文字自适应',
+ 'lang_autoSizePage':'按页面宽度自适应',
+ 'lang_example':'示例',
+ 'lang_borderStyle':'表格边框',
+ 'lang_color':'颜色:'
+ },
+ captionName:'表格名称',
+ titleName:'标题',
+ cellsName:'内容',
+ errorMsg:'有合并单元格,不可排序'
+ },
+ 'edittip':{
+ 'static':{
+ lang_delRow:'删除整行',
+ lang_delCol:'删除整列'
+ }
+ },
+ 'edittd':{
+ 'static':{
+ lang_tdBkColor:'背景颜色:'
+ }
+ },
+ 'formula':{
+ 'static':{
+ }
+ },
+ 'wordimage':{
+ 'static':{
+ lang_resave:"转存步骤",
+ uploadBtn:{src:"upload.png",alt:"上传"},
+ clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"},
+ lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。"
+ },
+ 'fileType':"图片",
+ 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!",
+ 'netError':"网络连接错误,请重试!",
+ 'copySuccess':"图片地址已经复制!",
+ 'flashI18n':{} //留空默认中文
+ },
+ 'autosave': {
+ 'saving':'保存中...',
+ 'success':'本地保存成功'
+ }
+};
diff --git a/public/ueditor/third-party/SyntaxHighlighter/shCore.js b/public/ueditor/third-party/SyntaxHighlighter/shCore.js
new file mode 100644
index 0000000..3249184
--- /dev/null
+++ b/public/ueditor/third-party/SyntaxHighlighter/shCore.js
@@ -0,0 +1,3655 @@
+// XRegExp 1.5.1
+// (c) 2007-2012 Steven Levithan
+// MIT License
+//
+// Provides an augmented, extensible, cross-browser implementation of regular expressions,
+// including support for additional syntax, flags, and methods
+
+var XRegExp;
+
+if (XRegExp) {
+ // Avoid running twice, since that would break references to native globals
+ throw Error("can't load XRegExp twice in the same frame");
+}
+
+// Run within an anonymous function to protect variables and avoid new globals
+(function (undefined) {
+
+ //---------------------------------
+ // Constructor
+ //---------------------------------
+
+ // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native
+ // regular expression in that additional syntax and flags are supported and cross-browser
+ // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and
+ // converts to type XRegExp
+ XRegExp = function (pattern, flags) {
+ var output = [],
+ currScope = XRegExp.OUTSIDE_CLASS,
+ pos = 0,
+ context, tokenResult, match, chr, regex;
+
+ if (XRegExp.isRegExp(pattern)) {
+ if (flags !== undefined)
+ throw TypeError("can't supply flags when constructing one RegExp from another");
+ return clone(pattern);
+ }
+ // Tokens become part of the regex construction process, so protect against infinite
+ // recursion when an XRegExp is constructed within a token handler or trigger
+ if (isInsideConstructor)
+ throw Error("can't call the XRegExp constructor within token definition functions");
+
+ flags = flags || "";
+ context = { // `this` object for custom tokens
+ hasNamedCapture: false,
+ captureNames: [],
+ hasFlag: function (flag) {return flags.indexOf(flag) > -1;},
+ setFlag: function (flag) {flags += flag;}
+ };
+
+ while (pos < pattern.length) {
+ // Check for custom tokens at the current position
+ tokenResult = runTokens(pattern, pos, currScope, context);
+
+ if (tokenResult) {
+ output.push(tokenResult.output);
+ pos += (tokenResult.match[0].length || 1);
+ } else {
+ // Check for native multicharacter metasequences (excluding character classes) at
+ // the current position
+ if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) {
+ output.push(match[0]);
+ pos += match[0].length;
+ } else {
+ chr = pattern.charAt(pos);
+ if (chr === "[")
+ currScope = XRegExp.INSIDE_CLASS;
+ else if (chr === "]")
+ currScope = XRegExp.OUTSIDE_CLASS;
+ // Advance position one character
+ output.push(chr);
+ pos++;
+ }
+ }
+ }
+
+ regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, ""));
+ regex._xregexp = {
+ source: pattern,
+ captureNames: context.hasNamedCapture ? context.captureNames : null
+ };
+ return regex;
+ };
+
+
+ //---------------------------------
+ // Public properties
+ //---------------------------------
+
+ XRegExp.version = "1.5.1";
+
+ // Token scope bitflags
+ XRegExp.INSIDE_CLASS = 1;
+ XRegExp.OUTSIDE_CLASS = 2;
+
+
+ //---------------------------------
+ // Private variables
+ //---------------------------------
+
+ var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g,
+ flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags
+ quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/,
+ isInsideConstructor = false,
+ tokens = [],
+ // Copy native globals for reference ("native" is an ES3 reserved keyword)
+ nativ = {
+ exec: RegExp.prototype.exec,
+ test: RegExp.prototype.test,
+ match: String.prototype.match,
+ replace: String.prototype.replace,
+ split: String.prototype.split
+ },
+ compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups
+ compliantLastIndexIncrement = function () {
+ var x = /^/g;
+ nativ.test.call(x, "");
+ return !x.lastIndex;
+ }(),
+ hasNativeY = RegExp.prototype.sticky !== undefined,
+ nativeTokens = {};
+
+ // `nativeTokens` match native multicharacter metasequences only (including deprecated octals,
+ // excluding character classes)
+ nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/;
+ nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/;
+
+
+ //---------------------------------
+ // Public methods
+ //---------------------------------
+
+ // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by
+ // the XRegExp library and can be used to create XRegExp plugins. This function is intended for
+ // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can
+ // be disabled by `XRegExp.freezeTokens`
+ XRegExp.addToken = function (regex, handler, scope, trigger) {
+ tokens.push({
+ pattern: clone(regex, "g" + (hasNativeY ? "y" : "")),
+ handler: handler,
+ scope: scope || XRegExp.OUTSIDE_CLASS,
+ trigger: trigger || null
+ });
+ };
+
+ // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag
+ // combination has previously been cached, the cached copy is returned; otherwise the newly
+ // created regex is cached
+ XRegExp.cache = function (pattern, flags) {
+ var key = pattern + "/" + (flags || "");
+ return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags));
+ };
+
+ // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh
+ // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global`
+ // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve
+ // special properties required for named capture
+ XRegExp.copyAsGlobal = function (regex) {
+ return clone(regex, "g");
+ };
+
+ // Accepts a string; returns the string with regex metacharacters escaped. The returned string
+ // can safely be used at any point within a regex to match the provided literal string. Escaped
+ // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace
+ XRegExp.escape = function (str) {
+ return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+ };
+
+ // Accepts a string to search, regex to search with, position to start the search within the
+ // string (default: 0), and an optional Boolean indicating whether matches must start at-or-
+ // after the position or at the specified position only. This function ignores the `lastIndex`
+ // of the provided regex in its own handling, but updates the property for compatibility
+ XRegExp.execAt = function (str, regex, pos, anchored) {
+ var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")),
+ match;
+ r2.lastIndex = pos = pos || 0;
+ match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.)
+ if (anchored && match && match.index !== pos)
+ match = null;
+ if (regex.global)
+ regex.lastIndex = match ? r2.lastIndex : 0;
+ return match;
+ };
+
+ // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing
+ // syntax and flag changes. Should be run after XRegExp and any plugins are loaded
+ XRegExp.freezeTokens = function () {
+ XRegExp.addToken = function () {
+ throw Error("can't run addToken after freezeTokens");
+ };
+ };
+
+ // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object.
+ // Note that this is also `true` for regex literals and regexes created by the `XRegExp`
+ // constructor. This works correctly for variables created in another frame, when `instanceof`
+ // and `constructor` checks would fail to work as intended
+ XRegExp.isRegExp = function (o) {
+ return Object.prototype.toString.call(o) === "[object RegExp]";
+ };
+
+ // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to
+ // iterate over regex matches compared to the traditional approaches of subverting
+ // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop
+ XRegExp.iterate = function (str, regex, callback, context) {
+ var r2 = clone(regex, "g"),
+ i = -1, match;
+ while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)
+ if (regex.global)
+ regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback`
+ callback.call(context, match, ++i, str, regex);
+ if (r2.lastIndex === match.index)
+ r2.lastIndex++;
+ }
+ if (regex.global)
+ regex.lastIndex = 0;
+ };
+
+ // Accepts a string and an array of regexes; returns the result of using each successive regex
+ // to search within the matches of the previous regex. The array of regexes can also contain
+ // objects with `regex` and `backref` properties, in which case the named or numbered back-
+ // references specified are passed forward to the next regex or returned. E.g.:
+ // var xregexpImgFileNames = XRegExp.matchChain(html, [
+ // {regex: /
]+)>/i, backref: 1}, //
tag attributes
+ // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values
+ // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths
+ // /[^\/]+$/ // filenames (strip directory paths)
+ // ]);
+ XRegExp.matchChain = function (str, chain) {
+ return function recurseChain (values, level) {
+ var item = chain[level].regex ? chain[level] : {regex: chain[level]},
+ regex = clone(item.regex, "g"),
+ matches = [], i;
+ for (i = 0; i < values.length; i++) {
+ XRegExp.iterate(values[i], regex, function (match) {
+ matches.push(item.backref ? (match[item.backref] || "") : match[0]);
+ });
+ }
+ return ((level === chain.length - 1) || !matches.length) ?
+ matches : recurseChain(matches, level + 1);
+ }([str], 0);
+ };
+
+
+ //---------------------------------
+ // New RegExp prototype methods
+ //---------------------------------
+
+ // Accepts a context object and arguments array; returns the result of calling `exec` with the
+ // first value in the arguments array. the context is ignored but is accepted for congruity
+ // with `Function.prototype.apply`
+ RegExp.prototype.apply = function (context, args) {
+ return this.exec(args[0]);
+ };
+
+ // Accepts a context object and string; returns the result of calling `exec` with the provided
+ // string. the context is ignored but is accepted for congruity with `Function.prototype.call`
+ RegExp.prototype.call = function (context, str) {
+ return this.exec(str);
+ };
+
+
+ //---------------------------------
+ // Overriden native methods
+ //---------------------------------
+
+ // Adds named capture support (with backreferences returned as `result.name`), and fixes two
+ // cross-browser issues per ES3:
+ // - Captured values for nonparticipating capturing groups should be returned as `undefined`,
+ // rather than the empty string.
+ // - `lastIndex` should not be incremented after zero-length matches.
+ RegExp.prototype.exec = function (str) {
+ var match, name, r2, origLastIndex;
+ if (!this.global)
+ origLastIndex = this.lastIndex;
+ match = nativ.exec.apply(this, arguments);
+ if (match) {
+ // Fix browsers whose `exec` methods don't consistently return `undefined` for
+ // nonparticipating capturing groups
+ if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) {
+ r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", ""));
+ // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
+ // matching due to characters outside the match
+ nativ.replace.call((str + "").slice(match.index), r2, function () {
+ for (var i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined)
+ match[i] = undefined;
+ }
+ });
+ }
+ // Attach named capture properties
+ if (this._xregexp && this._xregexp.captureNames) {
+ for (var i = 1; i < match.length; i++) {
+ name = this._xregexp.captureNames[i - 1];
+ if (name)
+ match[name] = match[i];
+ }
+ }
+ // Fix browsers that increment `lastIndex` after zero-length matches
+ if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
+ this.lastIndex--;
+ }
+ if (!this.global)
+ this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
+ return match;
+ };
+
+ // Fix browser bugs in native method
+ RegExp.prototype.test = function (str) {
+ // Use the native `exec` to skip some processing overhead, even though the altered
+ // `exec` would take care of the `lastIndex` fixes
+ var match, origLastIndex;
+ if (!this.global)
+ origLastIndex = this.lastIndex;
+ match = nativ.exec.call(this, str);
+ // Fix browsers that increment `lastIndex` after zero-length matches
+ if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))
+ this.lastIndex--;
+ if (!this.global)
+ this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
+ return !!match;
+ };
+
+ // Adds named capture support and fixes browser bugs in native method
+ String.prototype.match = function (regex) {
+ if (!XRegExp.isRegExp(regex))
+ regex = RegExp(regex); // Native `RegExp`
+ if (regex.global) {
+ var result = nativ.match.apply(this, arguments);
+ regex.lastIndex = 0; // Fix IE bug
+ return result;
+ }
+ return regex.exec(this); // Run the altered `exec`
+ };
+
+ // Adds support for `${n}` tokens for named and numbered backreferences in replacement text,
+ // and provides named backreferences to replacement functions as `arguments[0].name`. Also
+ // fixes cross-browser differences in replacement text syntax when performing a replacement
+ // using a nonregex search value, and the value of replacement regexes' `lastIndex` property
+ // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary
+ // third (`flags`) parameter
+ String.prototype.replace = function (search, replacement) {
+ var isRegex = XRegExp.isRegExp(search),
+ captureNames, result, str, origLastIndex;
+
+ // There are too many combinations of search/replacement types/values and browser bugs that
+ // preclude passing to native `replace`, so don't try
+ //if (...)
+ // return nativ.replace.apply(this, arguments);
+
+ if (isRegex) {
+ if (search._xregexp)
+ captureNames = search._xregexp.captureNames; // Array or `null`
+ if (!search.global)
+ origLastIndex = search.lastIndex;
+ } else {
+ search = search + ""; // Type conversion
+ }
+
+ if (Object.prototype.toString.call(replacement) === "[object Function]") {
+ result = nativ.replace.call(this + "", search, function () {
+ if (captureNames) {
+ // Change the `arguments[0]` string primitive to a String object which can store properties
+ arguments[0] = new String(arguments[0]);
+ // Store named backreferences on `arguments[0]`
+ for (var i = 0; i < captureNames.length; i++) {
+ if (captureNames[i])
+ arguments[0][captureNames[i]] = arguments[i + 1];
+ }
+ }
+ // Update `lastIndex` before calling `replacement` (fix browsers)
+ if (isRegex && search.global)
+ search.lastIndex = arguments[arguments.length - 2] + arguments[0].length;
+ return replacement.apply(null, arguments);
+ });
+ } else {
+ str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`)
+ result = nativ.replace.call(str, search, function () {
+ var args = arguments; // Keep this function's `arguments` available through closure
+ return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) {
+ // Numbered backreference (without delimiters) or special variable
+ if ($1) {
+ switch ($1) {
+ case "$": return "$";
+ case "&": return args[0];
+ case "`": return args[args.length - 1].slice(0, args[args.length - 2]);
+ case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length);
+ // Numbered backreference
+ default:
+ // What does "$10" mean?
+ // - Backreference 10, if 10 or more capturing groups exist
+ // - Backreference 1 followed by "0", if 1-9 capturing groups exist
+ // - Otherwise, it's the string "$10"
+ // Also note:
+ // - Backreferences cannot be more than two digits (enforced by `replacementToken`)
+ // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01"
+ // - There is no "$0" token ("$&" is the entire match)
+ var literalNumbers = "";
+ $1 = +$1; // Type conversion; drop leading zero
+ if (!$1) // `$1` was "0" or "00"
+ return $0;
+ while ($1 > args.length - 3) {
+ literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers;
+ $1 = Math.floor($1 / 10); // Drop the last digit
+ }
+ return ($1 ? args[$1] || "" : "$") + literalNumbers;
+ }
+ // Named backreference or delimited numbered backreference
+ } else {
+ // What does "${n}" mean?
+ // - Backreference to numbered capture n. Two differences from "$n":
+ // - n can be more than two digits
+ // - Backreference 0 is allowed, and is the entire match
+ // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture
+ // - Otherwise, it's the string "${n}"
+ var n = +$2; // Type conversion; drop leading zeros
+ if (n <= args.length - 3)
+ return args[n];
+ n = captureNames ? indexOf(captureNames, $2) : -1;
+ return n > -1 ? args[n + 1] : $0;
+ }
+ });
+ });
+ }
+
+ if (isRegex) {
+ if (search.global)
+ search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows)
+ else
+ search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows)
+ }
+
+ return result;
+ };
+
+ // A consistent cross-browser, ES3 compliant `split`
+ String.prototype.split = function (s /* separator */, limit) {
+ // If separator `s` is not a regex, use the native `split`
+ if (!XRegExp.isRegExp(s))
+ return nativ.split.apply(this, arguments);
+
+ var str = this + "", // Type conversion
+ output = [],
+ lastLastIndex = 0,
+ match, lastLength;
+
+ // Behavior for `limit`: if it's...
+ // - `undefined`: No limit
+ // - `NaN` or zero: Return an empty array
+ // - A positive number: Use `Math.floor(limit)`
+ // - A negative number: No limit
+ // - Other: Type-convert, then use the above rules
+ if (limit === undefined || +limit < 0) {
+ limit = Infinity;
+ } else {
+ limit = Math.floor(+limit);
+ if (!limit)
+ return [];
+ }
+
+ // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero
+ // and restore it to its original value when we're done using the regex
+ s = XRegExp.copyAsGlobal(s);
+
+ while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.)
+ if (s.lastIndex > lastLastIndex) {
+ output.push(str.slice(lastLastIndex, match.index));
+
+ if (match.length > 1 && match.index < str.length)
+ Array.prototype.push.apply(output, match.slice(1));
+
+ lastLength = match[0].length;
+ lastLastIndex = s.lastIndex;
+
+ if (output.length >= limit)
+ break;
+ }
+
+ if (s.lastIndex === match.index)
+ s.lastIndex++;
+ }
+
+ if (lastLastIndex === str.length) {
+ if (!nativ.test.call(s, "") || lastLength)
+ output.push("");
+ } else {
+ output.push(str.slice(lastLastIndex));
+ }
+
+ return output.length > limit ? output.slice(0, limit) : output;
+ };
+
+
+ //---------------------------------
+ // Private helper functions
+ //---------------------------------
+
+ // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp`
+ // instance with a fresh `lastIndex` (set to zero), preserving properties required for named
+ // capture. Also allows adding new flags in the process of copying the regex
+ function clone (regex, additionalFlags) {
+ if (!XRegExp.isRegExp(regex))
+ throw TypeError("type RegExp expected");
+ var x = regex._xregexp;
+ regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || ""));
+ if (x) {
+ regex._xregexp = {
+ source: x.source,
+ captureNames: x.captureNames ? x.captureNames.slice(0) : null
+ };
+ }
+ return regex;
+ }
+
+ function getNativeFlags (regex) {
+ return (regex.global ? "g" : "") +
+ (regex.ignoreCase ? "i" : "") +
+ (regex.multiline ? "m" : "") +
+ (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3
+ (regex.sticky ? "y" : "");
+ }
+
+ function runTokens (pattern, index, scope, context) {
+ var i = tokens.length,
+ result, match, t;
+ // Protect against constructing XRegExps within token handler and trigger functions
+ isInsideConstructor = true;
+ // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws
+ try {
+ while (i--) { // Run in reverse order
+ t = tokens[i];
+ if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) {
+ t.pattern.lastIndex = index;
+ match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc.
+ if (match && match.index === index) {
+ result = {
+ output: t.handler.call(context, match, scope),
+ match: match
+ };
+ break;
+ }
+ }
+ }
+ } catch (err) {
+ throw err;
+ } finally {
+ isInsideConstructor = false;
+ }
+ return result;
+ }
+
+ function indexOf (array, item, from) {
+ if (Array.prototype.indexOf) // Use the native array method if available
+ return array.indexOf(item, from);
+ for (var i = from || 0; i < array.length; i++) {
+ if (array[i] === item)
+ return i;
+ }
+ return -1;
+ }
+
+
+ //---------------------------------
+ // Built-in tokens
+ //---------------------------------
+
+ // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the
+ // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS`
+
+ // Comment pattern: (?# )
+ XRegExp.addToken(
+ /\(\?#[^)]*\)/,
+ function (match) {
+ // Keep tokens separated unless the following token is a quantifier
+ return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)";
+ }
+ );
+
+ // Capturing group (match the opening parenthesis only).
+ // Required for support of named capturing groups
+ XRegExp.addToken(
+ /\((?!\?)/,
+ function () {
+ this.captureNames.push(null);
+ return "(";
+ }
+ );
+
+ // Named capturing group (match the opening delimiter only): (?
+ XRegExp.addToken(
+ /\(\?<([$\w]+)>/,
+ function (match) {
+ this.captureNames.push(match[1]);
+ this.hasNamedCapture = true;
+ return "(";
+ }
+ );
+
+ // Named backreference: \k
+ XRegExp.addToken(
+ /\\k<([\w$]+)>/,
+ function (match) {
+ var index = indexOf(this.captureNames, match[1]);
+ // Keep backreferences separate from subsequent literal numbers. Preserve back-
+ // references to named groups that are undefined at this point as literal strings
+ return index > -1 ?
+ "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") :
+ match[0];
+ }
+ );
+
+ // Empty character class: [] or [^]
+ XRegExp.addToken(
+ /\[\^?]/,
+ function (match) {
+ // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
+ // (?!) should work like \b\B, but is unreliable in Firefox
+ return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]";
+ }
+ );
+
+ // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx)
+ // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc.
+ XRegExp.addToken(
+ /^\(\?([imsx]+)\)/,
+ function (match) {
+ this.setFlag(match[1]);
+ return "";
+ }
+ );
+
+ // Whitespace and comments, in free-spacing (aka extended) mode only
+ XRegExp.addToken(
+ /(?:\s+|#.*)+/,
+ function (match) {
+ // Keep tokens separated unless the following token is a quantifier
+ return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)";
+ },
+ XRegExp.OUTSIDE_CLASS,
+ function () {return this.hasFlag("x");}
+ );
+
+ // Dot, in dotall (aka singleline) mode only
+ XRegExp.addToken(
+ /\./,
+ function () {return "[\\s\\S]";},
+ XRegExp.OUTSIDE_CLASS,
+ function () {return this.hasFlag("s");}
+ );
+
+
+ //---------------------------------
+ // Backward compatibility
+ //---------------------------------
+
+ // Uncomment the following block for compatibility with XRegExp 1.0-1.2:
+ /*
+ XRegExp.matchWithinChain = XRegExp.matchChain;
+ RegExp.prototype.addFlags = function (s) {return clone(this, s);};
+ RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;};
+ RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);};
+ RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;};
+ */
+
+})();
+
+//
+// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
+//
+if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() {
+
+// CommonJS
+ if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined')
+ {
+ XRegExp = require('XRegExp').XRegExp;
+ }
+
+// Shortcut object which will be assigned to the SyntaxHighlighter variable.
+// This is a shorthand for local reference in order to avoid long namespace
+// references to SyntaxHighlighter.whatever...
+ var sh = {
+ defaults : {
+ /** Additional CSS class names to be added to highlighter elements. */
+ 'class-name' : '',
+
+ /** First line number. */
+ 'first-line' : 1,
+
+ /**
+ * Pads line numbers. Possible values are:
+ *
+ * false - don't pad line numbers.
+ * true - automaticaly pad numbers with minimum required number of leading zeroes.
+ * [int] - length up to which pad line numbers.
+ */
+ 'pad-line-numbers' : false,
+
+ /** Lines to highlight. */
+ 'highlight' : false,
+
+ /** Title to be displayed above the code block. */
+ 'title' : null,
+
+ /** Enables or disables smart tabs. */
+ 'smart-tabs' : true,
+
+ /** Gets or sets tab size. */
+ 'tab-size' : 4,
+
+ /** Enables or disables gutter. */
+ 'gutter' : true,
+
+ /** Enables or disables toolbar. */
+ 'toolbar' : true,
+
+ /** Enables quick code copy and paste from double click. */
+ 'quick-code' : true,
+
+ /** Forces code view to be collapsed. */
+ 'collapse' : false,
+
+ /** Enables or disables automatic links. */
+ 'auto-links' : false,
+
+ /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
+ 'light' : false,
+
+ 'unindent' : true,
+
+ 'html-script' : false
+ },
+
+ config : {
+ space : ' ',
+
+ /** Enables use of tags. */
+ useScriptTags : true,
+
+ /** Blogger mode flag. */
+ bloggerMode : false,
+
+ stripBrs : false,
+
+ /** Name of the tag that SyntaxHighlighter will automatically look for. */
+ tagName : 'pre',
+
+ strings : {
+ expandSource : 'expand source',
+ help : '?',
+ alert: 'SyntaxHighlighter\n\n',
+ noBrush : 'Can\'t find brush for: ',
+ brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+ // this is populated by the build script
+ aboutDialog : '@ABOUT@'
+ }
+ },
+
+ /** Internal 'global' variables. */
+ vars : {
+ discoveredBrushes : null,
+ highlighters : {}
+ },
+
+ /** This object is populated by user included external brush files. */
+ brushes : {},
+
+ /** Common regular expressions. */
+ regexLib : {
+ multiLineCComments : /\/\*[\s\S]*?\*\//gm,
+ singleLineCComments : /\/\/.*$/gm,
+ singleLinePerlComments : /#.*$/gm,
+ doubleQuotedString : /"([^\\"\n]|\\.)*"/g,
+ singleQuotedString : /'([^\\'\n]|\\.)*'/g,
+ multiLineDoubleQuotedString : new XRegExp('"([^\\\\"]|\\\\.)*"', 'gs'),
+ multiLineSingleQuotedString : new XRegExp("'([^\\\\']|\\\\.)*'", 'gs'),
+ xmlComments : /(<|<)!--[\s\S]*?--(>|>)/gm,
+ url : /\w+:\/\/[\w-.\/?%&=:@;#]*/g,
+
+ /** = ?> tags. */
+ phpScriptTags : { left: /(<|<)\?(?:=|php)?/g, right: /\?(>|>)/g, 'eof' : true },
+
+ /** <%= %> tags. */
+ aspScriptTags : { left: /(<|<)%=?/g, right: /%(>|>)/g },
+
+ /**