@ -0,0 +1,242 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
* Arabic Translation By daif alotaibi (http://daif.net/)
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.lang({ |
||||
|
source : 'عرض المصدر', |
||||
|
preview : 'معاينة الصفحة', |
||||
|
undo : 'تراجع(Ctrl+Z)', |
||||
|
redo : 'إعادة التراجع(Ctrl+Y)', |
||||
|
cut : 'قص(Ctrl+X)', |
||||
|
copy : 'نسخ(Ctrl+C)', |
||||
|
paste : 'لصق(Ctrl+V)', |
||||
|
plainpaste : 'لصق كنص عادي', |
||||
|
wordpaste : 'لصق من مايكروسفت ورد', |
||||
|
selectall : 'تحديد الكل', |
||||
|
justifyleft : 'محاذاه لليسار', |
||||
|
justifycenter : 'محاذاه للوسط', |
||||
|
justifyright : 'محاذاه لليمين', |
||||
|
justifyfull : 'محاذاه تلقائية', |
||||
|
insertorderedlist : 'قائمة مرقمه', |
||||
|
insertunorderedlist : 'قائمة نقطية', |
||||
|
indent : 'إزاحه النص', |
||||
|
outdent : 'إلغاء الازاحة', |
||||
|
subscript : 'أسفل النص', |
||||
|
superscript : 'أعلى النص', |
||||
|
formatblock : 'Paragraph format', |
||||
|
fontname : 'نوع الخط', |
||||
|
fontsize : 'حجم الخط', |
||||
|
forecolor : 'لون النص', |
||||
|
hilitecolor : 'لون خلفية النص', |
||||
|
bold : 'عريض(Ctrl+B)', |
||||
|
italic : 'مائل(Ctrl+I)', |
||||
|
underline : 'خط تحت النص(Ctrl+U)', |
||||
|
strikethrough : 'خط على النص', |
||||
|
removeformat : 'إزالة التنسيق', |
||||
|
image : 'إدراج صورة', |
||||
|
multiimage : 'Multi image', |
||||
|
flash : 'إدراج فلاش', |
||||
|
media : 'إدراج وسائط متعددة', |
||||
|
table : 'إدراج جدول', |
||||
|
tablecell : 'خلية', |
||||
|
hr : 'إدراج خط أفقي', |
||||
|
emoticons : 'إدراج وجه ضاحك', |
||||
|
link : 'رابط', |
||||
|
unlink : 'إزالة الرابط', |
||||
|
fullscreen : 'محرر ملئ الشاشة', |
||||
|
about : 'حول', |
||||
|
print : 'طباعة', |
||||
|
filemanager : 'مدير الملفات', |
||||
|
code : 'إدراج نص برمجي', |
||||
|
map : 'خرائط قووقل', |
||||
|
baidumap : 'خرائط قووقل', |
||||
|
lineheight : 'إرتفاع السطر', |
||||
|
clearhtml : 'مسح كود HTML', |
||||
|
pagebreak : 'إدراج فاصل صفحات', |
||||
|
quickformat : 'تنسيق سريع', |
||||
|
insertfile : 'إدراج ملف', |
||||
|
template : 'إدراج قالب', |
||||
|
anchor : 'رابط', |
||||
|
yes : 'موافق', |
||||
|
no : 'إلغاء', |
||||
|
close : 'إغلاق', |
||||
|
editImage : 'خصائص الصورة', |
||||
|
deleteImage : 'حذفالصورة', |
||||
|
editFlash : 'خصائص الفلاش', |
||||
|
deleteFlash : 'حذف الفلاش', |
||||
|
editMedia : 'خصائص الوسائط', |
||||
|
deleteMedia : 'حذف الوسائط', |
||||
|
editLink : 'خصائص الرابط', |
||||
|
deleteLink : 'إزالة الرابط', |
||||
|
editAnchor : 'Anchor properties', |
||||
|
deleteAnchor : 'Delete Anchor', |
||||
|
tableprop : 'خصائص الجدول', |
||||
|
tablecellprop : 'خصائص الخلية', |
||||
|
tableinsert : 'إدراج جدول', |
||||
|
tabledelete : 'حذف جدول', |
||||
|
tablecolinsertleft : 'إدراج عمود لليسار', |
||||
|
tablecolinsertright : 'إدراج عمود لليسار', |
||||
|
tablerowinsertabove : 'إدراج صف للأعلى', |
||||
|
tablerowinsertbelow : 'إدراج صف للأسفل', |
||||
|
tablerowmerge : 'دمج للأسفل', |
||||
|
tablecolmerge : 'دمج لليمين', |
||||
|
tablerowsplit : 'تقسم الصف', |
||||
|
tablecolsplit : 'تقسيم العمود', |
||||
|
tablecoldelete : 'حذف العمود', |
||||
|
tablerowdelete : 'حذف الصف', |
||||
|
noColor : 'إفتراضي', |
||||
|
pleaseSelectFile : 'Please select file.', |
||||
|
invalidImg : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: jpg,gif,bmp,png", |
||||
|
invalidMedia : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb", |
||||
|
invalidWidth : "العرض يجب أن يكون رقم.", |
||||
|
invalidHeight : "الإرتفاع يجب أن يكون رقم.", |
||||
|
invalidBorder : "عرض الحد يجب أن يكون رقم.", |
||||
|
invalidUrl : "الرجاء إدخال رابط حيح.", |
||||
|
invalidRows : 'صفوف غير صحيح.', |
||||
|
invalidCols : 'أعمدة غير صحيحة.', |
||||
|
invalidPadding : 'The padding must be number.', |
||||
|
invalidSpacing : 'The spacing must be number.', |
||||
|
invalidJson : 'Invalid JSON string.', |
||||
|
uploadSuccess : 'تم رفع الملف بنجاح.', |
||||
|
cutError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+X).', |
||||
|
copyError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+C).', |
||||
|
pasteError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+V).', |
||||
|
ajaxLoading : 'Loading ...', |
||||
|
uploadLoading : 'Uploading ...', |
||||
|
uploadError : 'Upload Error', |
||||
|
'plainpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.', |
||||
|
'wordpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.', |
||||
|
'code.pleaseInput' : 'Please input code.', |
||||
|
'link.url' : 'الرابط', |
||||
|
'link.linkType' : 'الهدف', |
||||
|
'link.newWindow' : 'نافذة جديدة', |
||||
|
'link.selfWindow' : 'نفس النافذة', |
||||
|
'flash.url' : 'الرابط', |
||||
|
'flash.width' : 'العرض', |
||||
|
'flash.height' : 'الإرتفاع', |
||||
|
'flash.upload' : 'رفع', |
||||
|
'flash.viewServer' : 'أستعراض', |
||||
|
'media.url' : 'الرابط', |
||||
|
'media.width' : 'العرض', |
||||
|
'media.height' : 'الإرتفاع', |
||||
|
'media.autostart' : 'تشغيل تلقائي', |
||||
|
'media.upload' : 'رفع', |
||||
|
'media.viewServer' : 'أستعراض', |
||||
|
'image.remoteImage' : 'إدراج الرابط', |
||||
|
'image.localImage' : 'رفع', |
||||
|
'image.remoteUrl' : 'الرابط', |
||||
|
'image.localUrl' : 'الملف', |
||||
|
'image.size' : 'الحجم', |
||||
|
'image.width' : 'العرض', |
||||
|
'image.height' : 'الإرتفاع', |
||||
|
'image.resetSize' : 'إستعادة الأبعاد', |
||||
|
'image.align' : 'محاذاة', |
||||
|
'image.defaultAlign' : 'الإفتراضي', |
||||
|
'image.leftAlign' : 'اليسار', |
||||
|
'image.rightAlign' : 'اليمين', |
||||
|
'image.imgTitle' : 'العنوان', |
||||
|
'image.upload' : 'أستعراض', |
||||
|
'image.viewServer' : 'أستعراض', |
||||
|
'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>', |
||||
|
'multiimage.startUpload' : 'Start upload', |
||||
|
'multiimage.clearAll' : 'Clear all', |
||||
|
'multiimage.insertAll' : 'Insert all', |
||||
|
'multiimage.queueLimitExceeded' : 'Queue limit exceeded.', |
||||
|
'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.', |
||||
|
'multiimage.zeroByteFile' : 'Zero byte file.', |
||||
|
'multiimage.invalidFiletype' : 'Invalid file type.', |
||||
|
'multiimage.unknownError' : 'Unknown upload error.', |
||||
|
'multiimage.pending' : 'Pending ...', |
||||
|
'multiimage.uploadError' : 'Upload error', |
||||
|
'filemanager.emptyFolder' : 'فارغ', |
||||
|
'filemanager.moveup' : 'المجلد الأب', |
||||
|
'filemanager.viewType' : 'العرض: ', |
||||
|
'filemanager.viewImage' : 'مصغرات', |
||||
|
'filemanager.listImage' : 'قائمة', |
||||
|
'filemanager.orderType' : 'الترتيب: ', |
||||
|
'filemanager.fileName' : 'بالإسم', |
||||
|
'filemanager.fileSize' : 'بالحجم', |
||||
|
'filemanager.fileType' : 'بالنوع', |
||||
|
'insertfile.url' : 'الرابط', |
||||
|
'insertfile.title' : 'العنوان', |
||||
|
'insertfile.upload' : 'رفع', |
||||
|
'insertfile.viewServer' : 'أستعراض', |
||||
|
'table.cells' : 'خلايا', |
||||
|
'table.rows' : 'صفوف', |
||||
|
'table.cols' : 'أعمدة', |
||||
|
'table.size' : 'الأبعاد', |
||||
|
'table.width' : 'العرض', |
||||
|
'table.height' : 'الإرتفاع', |
||||
|
'table.percent' : '%', |
||||
|
'table.px' : 'px', |
||||
|
'table.space' : 'الخارج', |
||||
|
'table.padding' : 'الداخل', |
||||
|
'table.spacing' : 'الفراغات', |
||||
|
'table.align' : 'محاذاه', |
||||
|
'table.textAlign' : 'افقى', |
||||
|
'table.verticalAlign' : 'رأسي', |
||||
|
'table.alignDefault' : 'إفتراضي', |
||||
|
'table.alignLeft' : 'يسار', |
||||
|
'table.alignCenter' : 'وسط', |
||||
|
'table.alignRight' : 'يمين', |
||||
|
'table.alignTop' : 'أعلى', |
||||
|
'table.alignMiddle' : 'منتصف', |
||||
|
'table.alignBottom' : 'أسفل', |
||||
|
'table.alignBaseline' : 'Baseline', |
||||
|
'table.border' : 'الحدود', |
||||
|
'table.borderWidth' : 'العرض', |
||||
|
'table.borderColor' : 'اللون', |
||||
|
'table.backgroundColor' : 'الخلفية', |
||||
|
'map.address' : 'العنوان: ', |
||||
|
'map.search' : 'بحث', |
||||
|
'baidumap.address' : 'العنوان: ', |
||||
|
'baidumap.search' : 'بحث', |
||||
|
'baidumap.insertDynamicMap' : 'Dynamic Map', |
||||
|
'anchor.name' : 'إسم الرابط', |
||||
|
'formatblock.formatBlock' : { |
||||
|
h1 : 'عنوان 1', |
||||
|
h2 : 'عنوان 2', |
||||
|
h3 : 'عنوان 3', |
||||
|
h4 : 'عنوان 4', |
||||
|
p : 'عادي' |
||||
|
}, |
||||
|
'fontname.fontName' : { |
||||
|
'Arial' : 'Arial', |
||||
|
'Arial Black' : 'Arial Black', |
||||
|
'Comic Sans MS' : 'Comic Sans MS', |
||||
|
'Courier New' : 'Courier New', |
||||
|
'Garamond' : 'Garamond', |
||||
|
'Georgia' : 'Georgia', |
||||
|
'Tahoma' : 'Tahoma', |
||||
|
'Times New Roman' : 'Times New Roman', |
||||
|
'Trebuchet MS' : 'Trebuchet MS', |
||||
|
'Verdana' : 'Verdana' |
||||
|
}, |
||||
|
'lineheight.lineHeight' : [ |
||||
|
{'1' : 'إرتفاع السطر 1'}, |
||||
|
{'1.5' : 'إرتفاع السطر 1.5'}, |
||||
|
{'2' : 'إرتفاع السطر 2'}, |
||||
|
{'2.5' : 'إرتفاع السطر 2.5'}, |
||||
|
{'3' : 'إرتفاع السطر 3'} |
||||
|
], |
||||
|
'template.selectTemplate' : 'قالب', |
||||
|
'template.replaceContent' : 'إستبدال المحتوى الحالي', |
||||
|
'template.fileList' : { |
||||
|
'1.html' : 'صورة ونص', |
||||
|
'2.html' : 'جدول', |
||||
|
'3.html' : 'قائمة' |
||||
|
} |
||||
|
}, 'ar'); |
||||
|
|
||||
|
KindEditor.each(KindEditor.options.items, function(i, name) { |
||||
|
if (name == 'baidumap') { |
||||
|
KindEditor.options.items[i] = 'map'; |
||||
|
} |
||||
|
}); |
||||
|
KindEditor.options.langType = 'ar'; |
||||
@ -0,0 +1,241 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.lang({ |
||||
|
source : 'Source', |
||||
|
preview : 'Preview', |
||||
|
undo : 'Undo(Ctrl+Z)', |
||||
|
redo : 'Redo(Ctrl+Y)', |
||||
|
cut : 'Cut(Ctrl+X)', |
||||
|
copy : 'Copy(Ctrl+C)', |
||||
|
paste : 'Paste(Ctrl+V)', |
||||
|
plainpaste : 'Paste as plain text', |
||||
|
wordpaste : 'Paste from Word', |
||||
|
selectall : 'Select all', |
||||
|
justifyleft : 'Align left', |
||||
|
justifycenter : 'Align center', |
||||
|
justifyright : 'Align right', |
||||
|
justifyfull : 'Align full', |
||||
|
insertorderedlist : 'Ordered list', |
||||
|
insertunorderedlist : 'Unordered list', |
||||
|
indent : 'Increase indent', |
||||
|
outdent : 'Decrease indent', |
||||
|
subscript : 'Subscript', |
||||
|
superscript : 'Superscript', |
||||
|
formatblock : 'Paragraph format', |
||||
|
fontname : 'Font family', |
||||
|
fontsize : 'Font size', |
||||
|
forecolor : 'Text color', |
||||
|
hilitecolor : 'Highlight color', |
||||
|
bold : 'Bold(Ctrl+B)', |
||||
|
italic : 'Italic(Ctrl+I)', |
||||
|
underline : 'Underline(Ctrl+U)', |
||||
|
strikethrough : 'Strikethrough', |
||||
|
removeformat : 'Remove format', |
||||
|
image : 'Image', |
||||
|
multiimage : 'Multi image', |
||||
|
flash : 'Flash', |
||||
|
media : 'Embeded media', |
||||
|
table : 'Table', |
||||
|
tablecell : 'Cell', |
||||
|
hr : 'Insert horizontal line', |
||||
|
emoticons : 'Insert emoticon', |
||||
|
link : 'Link', |
||||
|
unlink : 'Unlink', |
||||
|
fullscreen : 'Toggle fullscreen mode', |
||||
|
about : 'About', |
||||
|
print : 'Print', |
||||
|
filemanager : 'File Manager', |
||||
|
code : 'Insert code', |
||||
|
map : 'Google Maps', |
||||
|
baidumap : 'Baidu Maps', |
||||
|
lineheight : 'Line height', |
||||
|
clearhtml : 'Clear HTML code', |
||||
|
pagebreak : 'Insert Page Break', |
||||
|
quickformat : 'Quick Format', |
||||
|
insertfile : 'Insert file', |
||||
|
template : 'Insert Template', |
||||
|
anchor : 'Anchor', |
||||
|
yes : 'OK', |
||||
|
no : 'Cancel', |
||||
|
close : 'Close', |
||||
|
editImage : 'Image properties', |
||||
|
deleteImage : 'Delete image', |
||||
|
editFlash : 'Flash properties', |
||||
|
deleteFlash : 'Delete flash', |
||||
|
editMedia : 'Media properties', |
||||
|
deleteMedia : 'Delete media', |
||||
|
editLink : 'Link properties', |
||||
|
deleteLink : 'Unlink', |
||||
|
editAnchor : 'Anchor properties', |
||||
|
deleteAnchor : 'Delete Anchor', |
||||
|
tableprop : 'Table properties', |
||||
|
tablecellprop : 'Cell properties', |
||||
|
tableinsert : 'Insert table', |
||||
|
tabledelete : 'Delete table', |
||||
|
tablecolinsertleft : 'Insert column left', |
||||
|
tablecolinsertright : 'Insert column right', |
||||
|
tablerowinsertabove : 'Insert row above', |
||||
|
tablerowinsertbelow : 'Insert row below', |
||||
|
tablerowmerge : 'Merge down', |
||||
|
tablecolmerge : 'Merge right', |
||||
|
tablerowsplit : 'Split row', |
||||
|
tablecolsplit : 'Split column', |
||||
|
tablecoldelete : 'Delete column', |
||||
|
tablerowdelete : 'Delete row', |
||||
|
noColor : 'Default', |
||||
|
pleaseSelectFile : 'Please select file.', |
||||
|
invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png", |
||||
|
invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb", |
||||
|
invalidWidth : "The width must be number.", |
||||
|
invalidHeight : "The height must be number.", |
||||
|
invalidBorder : "The border must be number.", |
||||
|
invalidUrl : "Please type valid URL.", |
||||
|
invalidRows : 'Invalid rows.', |
||||
|
invalidCols : 'Invalid columns.', |
||||
|
invalidPadding : 'The padding must be number.', |
||||
|
invalidSpacing : 'The spacing must be number.', |
||||
|
invalidJson : 'Invalid JSON string.', |
||||
|
uploadSuccess : 'Upload success.', |
||||
|
cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.', |
||||
|
copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.', |
||||
|
pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.', |
||||
|
ajaxLoading : 'Loading ...', |
||||
|
uploadLoading : 'Uploading ...', |
||||
|
uploadError : 'Upload Error', |
||||
|
'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.', |
||||
|
'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.', |
||||
|
'code.pleaseInput' : 'Please input code.', |
||||
|
'link.url' : 'URL', |
||||
|
'link.linkType' : 'Target', |
||||
|
'link.newWindow' : 'New window', |
||||
|
'link.selfWindow' : 'Same window', |
||||
|
'flash.url' : 'URL', |
||||
|
'flash.width' : 'Width', |
||||
|
'flash.height' : 'Height', |
||||
|
'flash.upload' : 'Upload', |
||||
|
'flash.viewServer' : 'Browse', |
||||
|
'media.url' : 'URL', |
||||
|
'media.width' : 'Width', |
||||
|
'media.height' : 'Height', |
||||
|
'media.autostart' : 'Auto start', |
||||
|
'media.upload' : 'Upload', |
||||
|
'media.viewServer' : 'Browse', |
||||
|
'image.remoteImage' : 'Insert URL', |
||||
|
'image.localImage' : 'Upload', |
||||
|
'image.remoteUrl' : 'URL', |
||||
|
'image.localUrl' : 'File', |
||||
|
'image.size' : 'Size', |
||||
|
'image.width' : 'Width', |
||||
|
'image.height' : 'Height', |
||||
|
'image.resetSize' : 'Reset dimensions', |
||||
|
'image.align' : 'Align', |
||||
|
'image.defaultAlign' : 'Default', |
||||
|
'image.leftAlign' : 'Left', |
||||
|
'image.rightAlign' : 'Right', |
||||
|
'image.imgTitle' : 'Title', |
||||
|
'image.upload' : 'Browse', |
||||
|
'image.viewServer' : 'Browse', |
||||
|
'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>', |
||||
|
'multiimage.startUpload' : 'Start upload', |
||||
|
'multiimage.clearAll' : 'Clear all', |
||||
|
'multiimage.insertAll' : 'Insert all', |
||||
|
'multiimage.queueLimitExceeded' : 'Queue limit exceeded.', |
||||
|
'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.', |
||||
|
'multiimage.zeroByteFile' : 'Zero byte file.', |
||||
|
'multiimage.invalidFiletype' : 'Invalid file type.', |
||||
|
'multiimage.unknownError' : 'Unknown upload error.', |
||||
|
'multiimage.pending' : 'Pending ...', |
||||
|
'multiimage.uploadError' : 'Upload error', |
||||
|
'filemanager.emptyFolder' : 'Blank', |
||||
|
'filemanager.moveup' : 'Parent folder', |
||||
|
'filemanager.viewType' : 'Display: ', |
||||
|
'filemanager.viewImage' : 'Thumbnails', |
||||
|
'filemanager.listImage' : 'List', |
||||
|
'filemanager.orderType' : 'Sorting: ', |
||||
|
'filemanager.fileName' : 'By name', |
||||
|
'filemanager.fileSize' : 'By size', |
||||
|
'filemanager.fileType' : 'By type', |
||||
|
'insertfile.url' : 'URL', |
||||
|
'insertfile.title' : 'Title', |
||||
|
'insertfile.upload' : 'Upload', |
||||
|
'insertfile.viewServer' : 'Browse', |
||||
|
'table.cells' : 'Cells', |
||||
|
'table.rows' : 'Rows', |
||||
|
'table.cols' : 'Columns', |
||||
|
'table.size' : 'Dimensions', |
||||
|
'table.width' : 'Width', |
||||
|
'table.height' : 'Height', |
||||
|
'table.percent' : '%', |
||||
|
'table.px' : 'px', |
||||
|
'table.space' : 'Space', |
||||
|
'table.padding' : 'Padding', |
||||
|
'table.spacing' : 'Spacing', |
||||
|
'table.align' : 'Align', |
||||
|
'table.textAlign' : 'Horizontal', |
||||
|
'table.verticalAlign' : 'Vertical', |
||||
|
'table.alignDefault' : 'Default', |
||||
|
'table.alignLeft' : 'Left', |
||||
|
'table.alignCenter' : 'Center', |
||||
|
'table.alignRight' : 'Right', |
||||
|
'table.alignTop' : 'Top', |
||||
|
'table.alignMiddle' : 'Middle', |
||||
|
'table.alignBottom' : 'Bottom', |
||||
|
'table.alignBaseline' : 'Baseline', |
||||
|
'table.border' : 'Border', |
||||
|
'table.borderWidth' : 'Width', |
||||
|
'table.borderColor' : 'Color', |
||||
|
'table.backgroundColor' : 'Background', |
||||
|
'map.address' : 'Address: ', |
||||
|
'map.search' : 'Search', |
||||
|
'baidumap.address' : 'Address: ', |
||||
|
'baidumap.search' : 'Search', |
||||
|
'baidumap.insertDynamicMap' : 'Dynamic Map', |
||||
|
'anchor.name' : 'Anchor name', |
||||
|
'formatblock.formatBlock' : { |
||||
|
h1 : 'Heading 1', |
||||
|
h2 : 'Heading 2', |
||||
|
h3 : 'Heading 3', |
||||
|
h4 : 'Heading 4', |
||||
|
p : 'Normal' |
||||
|
}, |
||||
|
'fontname.fontName' : { |
||||
|
'Arial' : 'Arial', |
||||
|
'Arial Black' : 'Arial Black', |
||||
|
'Comic Sans MS' : 'Comic Sans MS', |
||||
|
'Courier New' : 'Courier New', |
||||
|
'Garamond' : 'Garamond', |
||||
|
'Georgia' : 'Georgia', |
||||
|
'Tahoma' : 'Tahoma', |
||||
|
'Times New Roman' : 'Times New Roman', |
||||
|
'Trebuchet MS' : 'Trebuchet MS', |
||||
|
'Verdana' : 'Verdana' |
||||
|
}, |
||||
|
'lineheight.lineHeight' : [ |
||||
|
{'1' : 'Line height 1'}, |
||||
|
{'1.5' : 'Line height 1.5'}, |
||||
|
{'2' : 'Line height 2'}, |
||||
|
{'2.5' : 'Line height 2.5'}, |
||||
|
{'3' : 'Line height 3'} |
||||
|
], |
||||
|
'template.selectTemplate' : 'Template', |
||||
|
'template.replaceContent' : 'Replace current content', |
||||
|
'template.fileList' : { |
||||
|
'1.html' : 'Image and Text', |
||||
|
'2.html' : 'Table', |
||||
|
'3.html' : 'List' |
||||
|
} |
||||
|
}, 'en'); |
||||
|
|
||||
|
KindEditor.each(KindEditor.options.items, function(i, name) { |
||||
|
if (name == 'baidumap') { |
||||
|
KindEditor.options.items[i] = 'map'; |
||||
|
} |
||||
|
}); |
||||
|
KindEditor.options.langType = 'en'; |
||||
@ -0,0 +1,246 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Composite <ukjinplant@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.lang({ |
||||
|
source : '소스', |
||||
|
preview : '미리보기', |
||||
|
undo : '작업취소(Ctrl+Z)', |
||||
|
redo : '작업재개(Ctrl+Y)', |
||||
|
cut : '잘라내기(Ctrl+X)', |
||||
|
copy : '복사(Ctrl+C)', |
||||
|
paste : '붙여넣기(Ctrl+V)', |
||||
|
plainpaste : '일반 텍스트로 붙여넣기', |
||||
|
wordpaste : '워드 문서로 붙여넣기', |
||||
|
selectall : '전체 선택', |
||||
|
justifyleft : '왼쪽 정렬', |
||||
|
justifycenter : '가운데 정렬', |
||||
|
justifyright : '오른쪽 정렬', |
||||
|
justifyfull : '양쪽 정렬', |
||||
|
insertorderedlist : '순서 목록', |
||||
|
insertunorderedlist : '비순서 목록', |
||||
|
indent : '들여쓰기', |
||||
|
outdent : '내어쓰기', |
||||
|
subscript : '아랫첨자', |
||||
|
superscript : '윗첨자', |
||||
|
formatblock : '문단 형식', |
||||
|
fontname : '글꼴', |
||||
|
fontsize : '글자 크기', |
||||
|
forecolor : '글자색', |
||||
|
hilitecolor : '강조색', |
||||
|
bold : '굵게(Ctrl+B)', |
||||
|
italic : '이텔릭(Ctrl+I)', |
||||
|
underline : '빝줄(Ctrl+U)', |
||||
|
strikethrough : '취소선', |
||||
|
removeformat : '형식 제거', |
||||
|
image : '이미지 추가', |
||||
|
multiimage : '여러 이미지 추가', |
||||
|
flash : '플래시 추가', |
||||
|
media : '미디어 추가', |
||||
|
table : '표', |
||||
|
tablecell : '열', |
||||
|
hr : '구분선 추가', |
||||
|
emoticons : '이모티콘 추가', |
||||
|
link : '링크', |
||||
|
unlink : '링크 제거', |
||||
|
fullscreen : '전체 화면 모드', |
||||
|
about : '이 에디터는...', |
||||
|
print : '인쇄', |
||||
|
filemanager : '파일 관리자', |
||||
|
code : '코드 추가', |
||||
|
map : '구글 맵 추가', |
||||
|
baidumap : '바이두 맵 추가', |
||||
|
lineheight : '행 간격', |
||||
|
clearhtml : 'HTML 코드 정리', |
||||
|
pagebreak : '페이지 구분 추가', |
||||
|
quickformat : '빠른 형식', |
||||
|
insertfile : '파일 추가', |
||||
|
template : '템플릿 추가', |
||||
|
anchor : '책갈피', |
||||
|
yes : '확인', |
||||
|
no : '취소', |
||||
|
close : '닫기', |
||||
|
editImage : '이미지 속성', |
||||
|
deleteImage : '이미지 삭제', |
||||
|
editFlash : '플래시 속성', |
||||
|
deleteFlash : '플래시 삭제', |
||||
|
editMedia : '미디어 속성', |
||||
|
deleteMedia : '미디어 삭제', |
||||
|
editLink : '링크 속성', |
||||
|
deleteLink : '링크 삭제', |
||||
|
editAnchor : 'Anchor properties', |
||||
|
deleteAnchor : 'Delete Anchor', |
||||
|
tableprop : '표 속성', |
||||
|
tablecellprop : '열 속성', |
||||
|
tableinsert : '표 추가', |
||||
|
tabledelete : '표 삭제', |
||||
|
tablecolinsertleft : '왼쪽으로 열 추가', |
||||
|
tablecolinsertright : '오른쪽으로 열 추가', |
||||
|
tablerowinsertabove : '위쪽으로 열 추가', |
||||
|
tablerowinsertbelow : '아래쪽으로 열 추가', |
||||
|
tablerowmerge : '아래로 병합', |
||||
|
tablecolmerge : '오른쪽으로 병합', |
||||
|
tablerowsplit : '행 나누기', |
||||
|
tablecolsplit : '열 나누기', |
||||
|
tablecoldelete : '열 삭제', |
||||
|
tablerowdelete : '행 삭제', |
||||
|
noColor : '기본색', |
||||
|
pleaseSelectFile : '파일 선택', |
||||
|
invalidImg : "올바른 주소를 입력하세요.\njpg,gif,bmp,png 형식이 가능합니다.", |
||||
|
invalidMedia : "올바른 주소를 입력하세요.\nswf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb 형식이 가능합니다.", |
||||
|
invalidWidth : "넓이 값은 숫자여야 합니다.", |
||||
|
invalidHeight : "높이 값은 숫자여야 합니다.", |
||||
|
invalidBorder : "굵기 값은 숫자여야 합니다.", |
||||
|
invalidUrl : "올바른 주소를 입력하세요.", |
||||
|
invalidRows : '올바른 행이 아닙니다.', |
||||
|
invalidCols : '올바른 열이 아닙니다.', |
||||
|
invalidPadding : '안쪽 여백 값은 숫자여야 합니다.', |
||||
|
invalidSpacing : '간격 길이 값은 숫자여야 합니다.', |
||||
|
invalidJson : '올바른 JSON 형식이 아닙니다.', |
||||
|
uploadSuccess : '업로드가 완료되었습니다.', |
||||
|
cutError : '브라우저가 잘라내기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)', |
||||
|
copyError : '브라우저가 복사 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)', |
||||
|
pasteError : '브라우저가 붙여넣기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)', |
||||
|
ajaxLoading : '불러오는 중 ...', |
||||
|
uploadLoading : '업로드 중 ...', |
||||
|
uploadError : '업로드 오류', |
||||
|
'plainpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 텍스트를 붙여넣으세요.', |
||||
|
'wordpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 워드 텍스트를 붙여넣으세요.', |
||||
|
'code.pleaseInput' : 'Please input code.', |
||||
|
'link.url' : '주소', |
||||
|
'link.linkType' : '창', |
||||
|
'link.newWindow' : '새 창', |
||||
|
'link.selfWindow' : '현재 창', |
||||
|
'flash.url' : '주소', |
||||
|
'flash.width' : '넓이', |
||||
|
'flash.height' : '높이', |
||||
|
'flash.upload' : '업로드', |
||||
|
'flash.viewServer' : '찾아보기', |
||||
|
'media.url' : '주소', |
||||
|
'media.width' : '넓이', |
||||
|
'media.height' : '높이', |
||||
|
'media.autostart' : '자동 시작', |
||||
|
'media.upload' : '업로드', |
||||
|
'media.viewServer' : '찾아보기', |
||||
|
'image.remoteImage' : '외부 이미지', |
||||
|
'image.localImage' : '내부 이미지', |
||||
|
'image.remoteUrl' : '주소', |
||||
|
'image.localUrl' : '파일', |
||||
|
'image.size' : '크기', |
||||
|
'image.width' : '넓이', |
||||
|
'image.height' : '높이', |
||||
|
'image.resetSize' : '기본 크기로', |
||||
|
'image.align' : '정렬', |
||||
|
'image.defaultAlign' : '기본', |
||||
|
'image.leftAlign' : '왼쪽', |
||||
|
'image.rightAlign' : '오른쪽', |
||||
|
'image.imgTitle' : '제목', |
||||
|
'image.upload' : '찾아보기', |
||||
|
'image.viewServer' : '찾아보기', |
||||
|
'multiimage.uploadDesc' : '최대 이미지 개수: <%=uploadLimit%>개, 개당 이미지 크기: <%=sizeLimit%>', |
||||
|
'multiimage.startUpload' : '업로드 시작', |
||||
|
'multiimage.clearAll' : '모두 삭제', |
||||
|
'multiimage.insertAll' : '모두 삽입', |
||||
|
'multiimage.queueLimitExceeded' : '업로드 개수가 초과되었습니다.', |
||||
|
'multiimage.fileExceedsSizeLimit' : '업로드 크기가 초과되었습니다.', |
||||
|
'multiimage.zeroByteFile' : '파일 크기가 없습니다.', |
||||
|
'multiimage.invalidFiletype' : '올바른 이미지가 아닙니다.', |
||||
|
'multiimage.unknownError' : '알 수 없는 업로드 오류가 발생하였습니다.', |
||||
|
'multiimage.pending' : '처리 중 ...', |
||||
|
'multiimage.uploadError' : '업로드 오류', |
||||
|
'filemanager.emptyFolder' : '빈 폴더', |
||||
|
'filemanager.moveup' : '위로', |
||||
|
'filemanager.viewType' : '보기 방식: ', |
||||
|
'filemanager.viewImage' : '미리 보기', |
||||
|
'filemanager.listImage' : '목록', |
||||
|
'filemanager.orderType' : '정렬 방식: ', |
||||
|
'filemanager.fileName' : '이름별', |
||||
|
'filemanager.fileSize' : '크기별', |
||||
|
'filemanager.fileType' : '종류별', |
||||
|
'insertfile.url' : '주소', |
||||
|
'insertfile.title' : '제목', |
||||
|
'insertfile.upload' : '업로드', |
||||
|
'insertfile.viewServer' : '찾아보기', |
||||
|
'table.cells' : '열', |
||||
|
'table.rows' : '행', |
||||
|
'table.cols' : '열', |
||||
|
'table.size' : '표 크기', |
||||
|
'table.width' : '넓이', |
||||
|
'table.height' : '높이', |
||||
|
'table.percent' : '%', |
||||
|
'table.px' : 'px', |
||||
|
'table.space' : '간격', |
||||
|
'table.padding' : '안쪽여백', |
||||
|
'table.spacing' : '간격', |
||||
|
'table.align' : '정렬', |
||||
|
'table.textAlign' : '수직', |
||||
|
'table.verticalAlign' : '수평', |
||||
|
'table.alignDefault' : '기본', |
||||
|
'table.alignLeft' : '왼쪽', |
||||
|
'table.alignCenter' : '가운데', |
||||
|
'table.alignRight' : '오른쪽', |
||||
|
'table.alignTop' : '위쪽', |
||||
|
'table.alignMiddle' : '중간', |
||||
|
'table.alignBottom' : '아래쪽', |
||||
|
'table.alignBaseline' : '글자기준', |
||||
|
'table.border' : '테두리', |
||||
|
'table.borderWidth' : '크기', |
||||
|
'table.borderColor' : '색상', |
||||
|
'table.backgroundColor' : '배경', |
||||
|
'map.address' : '주소: ', |
||||
|
'map.search' : '검색', |
||||
|
'baidumap.address' : '주소: ', |
||||
|
'baidumap.search' : '검색', |
||||
|
'baidumap.insertDynamicMap' : '동적 지도', |
||||
|
'anchor.name' : '책갈피명', |
||||
|
'formatblock.formatBlock' : { |
||||
|
h1 : '제목 1', |
||||
|
h2 : '제목 2', |
||||
|
h3 : '제목 3', |
||||
|
h4 : '제목 4', |
||||
|
p : '본문' |
||||
|
}, |
||||
|
'fontname.fontName' : { |
||||
|
'Gulim' : '굴림', |
||||
|
'Dotum' : '돋움', |
||||
|
'Batang' : '바탕', |
||||
|
'Gungsuh' : '궁서', |
||||
|
'Malgun Gothic' : '맑은 고딕', |
||||
|
'Arial' : 'Arial', |
||||
|
'Arial Black' : 'Arial Black', |
||||
|
'Comic Sans MS' : 'Comic Sans MS', |
||||
|
'Courier New' : 'Courier New', |
||||
|
'Garamond' : 'Garamond', |
||||
|
'Georgia' : 'Georgia', |
||||
|
'Tahoma' : 'Tahoma', |
||||
|
'Times New Roman' : 'Times New Roman', |
||||
|
'Trebuchet MS' : 'Trebuchet MS', |
||||
|
'Verdana' : 'Verdana' |
||||
|
}, |
||||
|
'lineheight.lineHeight' : [ |
||||
|
{'1' : '행간 1'}, |
||||
|
{'1.5' : '행간 1.5'}, |
||||
|
{'2' : '행간 2'}, |
||||
|
{'2.5' : '행간 2.5'}, |
||||
|
{'3' : '행간 3'} |
||||
|
], |
||||
|
'template.selectTemplate' : '템플릿', |
||||
|
'template.replaceContent' : '내용 바꾸기', |
||||
|
'template.fileList' : { |
||||
|
'1.html' : '이미지와 텍스트', |
||||
|
'2.html' : '표', |
||||
|
'3.html' : '목록' |
||||
|
} |
||||
|
}, 'ko'); |
||||
|
|
||||
|
KindEditor.each(KindEditor.options.items, function(i, name) { |
||||
|
if (name == 'baidumap') { |
||||
|
KindEditor.options.items[i] = 'map'; |
||||
|
} |
||||
|
}); |
||||
|
KindEditor.options.langType = 'ko'; |
||||
@ -0,0 +1,242 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
* Translated to Russian by Valery Votintsev (http://codersclub.org/)
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.lang({ |
||||
|
source : 'Source', |
||||
|
preview : 'Preview', |
||||
|
undo : 'Отмена(Ctrl+Z)', |
||||
|
redo : 'Повтор(Ctrl+Y)', |
||||
|
cut : 'Вырезать(Ctrl+X)', |
||||
|
copy : 'Копировать(Ctrl+C)', |
||||
|
paste : 'Вставить(Ctrl+V)', |
||||
|
plainpaste : 'Вставить как простой текст', |
||||
|
wordpaste : 'Вставить из Word', |
||||
|
selectall : 'Выбрать все', |
||||
|
justifyleft : 'Выравнивание влево', |
||||
|
justifycenter : 'Выравнивание по центру', |
||||
|
justifyright : 'Выравнивание вправо', |
||||
|
justifyfull : 'Выравнивание по обеим сторонам', |
||||
|
insertorderedlist : 'Нумерованый список', |
||||
|
insertunorderedlist : 'Ненумерованый список', |
||||
|
indent : 'Добавить отступ', |
||||
|
outdent : 'Убрать отступ', |
||||
|
subscript : 'Надстрочный', |
||||
|
superscript : 'Подстрочный', |
||||
|
formatblock : 'Формат параграфа', |
||||
|
fontname : 'Шрифт', |
||||
|
fontsize : 'Размер', |
||||
|
forecolor : 'Цвет текста', |
||||
|
hilitecolor : 'Цвет фона', |
||||
|
bold : 'Жирный(Ctrl+B)', |
||||
|
italic : 'Наклонный(Ctrl+I)', |
||||
|
underline : 'Подчёркнутый(Ctrl+U)', |
||||
|
strikethrough : 'Перечёркнутый', |
||||
|
removeformat : 'Удалить формат', |
||||
|
image : 'Изображение', |
||||
|
multiimage : 'Мульти-загрузка', |
||||
|
flash : 'Flash', |
||||
|
media : 'Встроенные данные', |
||||
|
table : 'Таблица', |
||||
|
tablecell : 'Ячейка', |
||||
|
hr : 'Горизонтальный разделитель', |
||||
|
emoticons : 'Смайл', |
||||
|
link : 'Ссылка', |
||||
|
unlink : 'Убрать ссылку', |
||||
|
fullscreen : 'На весь экран', |
||||
|
about : 'О программе', |
||||
|
print : 'Печать', |
||||
|
filemanager : 'Файлы', |
||||
|
code : 'Код', |
||||
|
map : 'Карта Google', |
||||
|
baidumap : 'Карта Baidu', |
||||
|
lineheight : 'Межстрочный интервал', |
||||
|
clearhtml : 'Очистить HTML код', |
||||
|
pagebreak : 'Разрыв страницы', |
||||
|
quickformat : 'Быстрый формат', |
||||
|
insertfile : 'Вставить файл', |
||||
|
template : 'Вставить шаблон', |
||||
|
anchor : 'Якорь', |
||||
|
yes : 'OK', |
||||
|
no : 'Отмена', |
||||
|
close : 'Закрыть', |
||||
|
editImage : 'Свойства изображения', |
||||
|
deleteImage : 'Удалить изображение', |
||||
|
editFlash : 'Свойства Flash', |
||||
|
deleteFlash : 'Удалить Flash', |
||||
|
editMedia : 'Свойства Media', |
||||
|
deleteMedia : 'Удалить Media', |
||||
|
editLink : 'Свойства ссылки', |
||||
|
deleteLink : 'Удалить ссылку', |
||||
|
editAnchor : 'Anchor properties', |
||||
|
deleteAnchor : 'Delete Anchor', |
||||
|
tableprop : 'Свойства таблицы', |
||||
|
tablecellprop : 'Свойства ячейки', |
||||
|
tableinsert : 'Вставить таблицу', |
||||
|
tabledelete : 'Удалить таблицу', |
||||
|
tablecolinsertleft : 'Добавить столбец слева', |
||||
|
tablecolinsertright : 'Добавить столбец справа', |
||||
|
tablerowinsertabove : 'Добавить строку выше', |
||||
|
tablerowinsertbelow : 'Добавить строку ниже', |
||||
|
tablerowmerge : 'Объединить вниз', |
||||
|
tablecolmerge : 'Объединить вправо', |
||||
|
tablerowsplit : 'Разделить строку', |
||||
|
tablecolsplit : 'Разделить столбец', |
||||
|
tablecoldelete : 'Удалить столбец', |
||||
|
tablerowdelete : 'Удалить строку', |
||||
|
noColor : 'По умолчанию', |
||||
|
pleaseSelectFile : 'Выберите файл.', |
||||
|
invalidImg : "Укажите корректный URL изображения.\nРазрешённые форматы: jpg,gif,bmp,png", |
||||
|
invalidMedia : "Укажите корректный тип медиа-объекта.\nРазрешённые типы: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb", |
||||
|
invalidWidth : "Ширина должна быть числом.", |
||||
|
invalidHeight : "Высота должна быть числом.", |
||||
|
invalidBorder : "Ширина рамки должна быть числом.", |
||||
|
invalidUrl : "Укажите корректный URL.", |
||||
|
invalidRows : 'Неверные строки.', |
||||
|
invalidCols : 'Неверные столбцы.', |
||||
|
invalidPadding : 'padding должен быть числом.', |
||||
|
invalidSpacing : 'spacing должен быть числом.', |
||||
|
invalidJson : 'Неверная JSON строка.', |
||||
|
uploadSuccess : 'Загрузка завершена.', |
||||
|
cutError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+X).', |
||||
|
copyError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+C).', |
||||
|
pasteError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+V).', |
||||
|
ajaxLoading : 'Загрузка ...', |
||||
|
uploadLoading : 'Загрузка ...', |
||||
|
uploadError : 'Сбой загрузки', |
||||
|
'plainpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).', |
||||
|
'wordpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).', |
||||
|
'code.pleaseInput' : 'Введите код.', |
||||
|
'link.url' : 'URL', |
||||
|
'link.linkType' : 'Открывать ссылку', |
||||
|
'link.newWindow' : 'в новом окне', |
||||
|
'link.selfWindow' : 'в том же окне', |
||||
|
'flash.url' : 'URL', |
||||
|
'flash.width' : 'Ширина', |
||||
|
'flash.height' : 'Высота', |
||||
|
'flash.upload' : 'Загрузить', |
||||
|
'flash.viewServer' : 'Выбрать', |
||||
|
'media.url' : 'URL', |
||||
|
'media.width' : 'Ширина', |
||||
|
'media.height' : 'Высота', |
||||
|
'media.autostart' : 'Автостарт', |
||||
|
'media.upload' : 'Загрузить', |
||||
|
'media.viewServer' : 'Выбрать', |
||||
|
'image.remoteImage' : 'Вставить URL изображения', |
||||
|
'image.localImage' : 'Загрузить', |
||||
|
'image.remoteUrl' : 'URL', |
||||
|
'image.localUrl' : 'Файл', |
||||
|
'image.size' : 'Размер', |
||||
|
'image.width' : 'Ширина', |
||||
|
'image.height' : 'Высота', |
||||
|
'image.resetSize' : 'Сбросить размеры', |
||||
|
'image.align' : 'Выравнивание', |
||||
|
'image.defaultAlign' : 'По умолчанию', |
||||
|
'image.leftAlign' : 'Влево', |
||||
|
'image.rightAlign' : 'Вправо', |
||||
|
'image.imgTitle' : 'Название', |
||||
|
'image.upload' : 'Загрузить', |
||||
|
'image.viewServer' : 'Выбрать', |
||||
|
'multiimage.uploadDesc' : 'Максимальное кол-во изображений: <%=uploadLimit%>, Максимальный размер одного изображения: <%=sizeLimit%>', |
||||
|
'multiimage.startUpload' : 'Начать загрузку', |
||||
|
'multiimage.clearAll' : 'Очистить все', |
||||
|
'multiimage.insertAll' : 'Вставить все', |
||||
|
'multiimage.queueLimitExceeded' : 'Превышен лимит очереди.', |
||||
|
'multiimage.fileExceedsSizeLimit' : 'Превышен максимальный размер файла.', |
||||
|
'multiimage.zeroByteFile' : 'Файл нулевой длины.', |
||||
|
'multiimage.invalidFiletype' : 'Недопустимый тип файла.', |
||||
|
'multiimage.unknownError' : 'Непредвиденная ошибка загрузки.', |
||||
|
'multiimage.pending' : 'Ожидает ...', |
||||
|
'multiimage.uploadError' : 'Ошибка загрузки', |
||||
|
'filemanager.emptyFolder' : 'Папка пуста', |
||||
|
'filemanager.moveup' : 'Наверх', |
||||
|
'filemanager.viewType' : 'Тип показа: ', |
||||
|
'filemanager.viewImage' : 'Превьюшки', |
||||
|
'filemanager.listImage' : 'Список', |
||||
|
'filemanager.orderType' : 'Сортировка: ', |
||||
|
'filemanager.fileName' : 'По имени', |
||||
|
'filemanager.fileSize' : 'По размеру', |
||||
|
'filemanager.fileType' : 'По типу', |
||||
|
'insertfile.url' : 'URL', |
||||
|
'insertfile.title' : 'Название', |
||||
|
'insertfile.upload' : 'Загрузить', |
||||
|
'insertfile.viewServer' : 'Выбрать', |
||||
|
'table.cells' : 'Ячейки', |
||||
|
'table.rows' : 'Строки', |
||||
|
'table.cols' : 'Столбцы', |
||||
|
'table.size' : 'Размеры', |
||||
|
'table.width' : 'Ширина', |
||||
|
'table.height' : 'Высота', |
||||
|
'table.percent' : '%', |
||||
|
'table.px' : 'px', |
||||
|
'table.space' : 'Space', |
||||
|
'table.padding' : 'Padding', |
||||
|
'table.spacing' : 'Spacing', |
||||
|
'table.align' : 'Выравнивание', |
||||
|
'table.textAlign' : 'По горизонтали', |
||||
|
'table.verticalAlign' : 'По вертикали', |
||||
|
'table.alignDefault' : 'По умолчанию', |
||||
|
'table.alignLeft' : 'Влево', |
||||
|
'table.alignCenter' : 'По центру', |
||||
|
'table.alignRight' : 'Вправо', |
||||
|
'table.alignTop' : 'Вверх', |
||||
|
'table.alignMiddle' : 'Посередине', |
||||
|
'table.alignBottom' : 'Вниз', |
||||
|
'table.alignBaseline' : 'По базовой линии', |
||||
|
'table.border' : 'Рамка', |
||||
|
'table.borderWidth' : 'Ширина', |
||||
|
'table.borderColor' : 'Цвет', |
||||
|
'table.backgroundColor' : 'Цвет фона', |
||||
|
'map.address' : 'Адрес: ', |
||||
|
'map.search' : 'Поиск', |
||||
|
'baidumap.address' : 'Адрес: ', |
||||
|
'baidumap.search' : 'Поиск', |
||||
|
'baidumap.insertDynamicMap' : 'Динамическая карта', |
||||
|
'anchor.name' : 'Имя якоря', |
||||
|
'formatblock.formatBlock' : { |
||||
|
h1 : 'Заголовок 1', |
||||
|
h2 : 'Заголовок 2', |
||||
|
h3 : 'Заголовок 3', |
||||
|
h4 : 'Заголовок 4', |
||||
|
p : 'Обычный текст' |
||||
|
}, |
||||
|
'fontname.fontName' : { |
||||
|
'Arial' : 'Arial', |
||||
|
'Arial Black' : 'Arial Black', |
||||
|
'Comic Sans MS' : 'Comic Sans MS', |
||||
|
'Courier New' : 'Courier New', |
||||
|
'Garamond' : 'Garamond', |
||||
|
'Georgia' : 'Georgia', |
||||
|
'Tahoma' : 'Tahoma', |
||||
|
'Times New Roman' : 'Times New Roman', |
||||
|
'Trebuchet MS' : 'Trebuchet MS', |
||||
|
'Verdana' : 'Verdana' |
||||
|
}, |
||||
|
'lineheight.lineHeight' : [ |
||||
|
{'1' : '1'}, |
||||
|
{'1.5' : '1.5'}, |
||||
|
{'2' : '2'}, |
||||
|
{'2.5' : '2.5'}, |
||||
|
{'3' : '3'} |
||||
|
], |
||||
|
'template.selectTemplate' : 'Шаблон', |
||||
|
'template.replaceContent' : 'Заменить текущий шаблон', |
||||
|
'template.fileList' : { |
||||
|
'1.html' : 'Текст и изображения', |
||||
|
'2.html' : 'Таблица', |
||||
|
'3.html' : 'Список' |
||||
|
} |
||||
|
}, 'en'); |
||||
|
|
||||
|
KindEditor.each(KindEditor.options.items, function(i, name) { |
||||
|
if (name == 'baidumap') { |
||||
|
KindEditor.options.items[i] = 'map'; |
||||
|
} |
||||
|
}); |
||||
|
KindEditor.options.langType = 'ru'; |
||||
@ -0,0 +1,238 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.lang({ |
||||
|
source : 'HTML代码', |
||||
|
preview : '预览', |
||||
|
undo : '后退(Ctrl+Z)', |
||||
|
redo : '前进(Ctrl+Y)', |
||||
|
cut : '剪切(Ctrl+X)', |
||||
|
copy : '复制(Ctrl+C)', |
||||
|
paste : '粘贴(Ctrl+V)', |
||||
|
plainpaste : '粘贴为无格式文本', |
||||
|
wordpaste : '从Word粘贴', |
||||
|
selectall : '全选(Ctrl+A)', |
||||
|
justifyleft : '左对齐', |
||||
|
justifycenter : '居中', |
||||
|
justifyright : '右对齐', |
||||
|
justifyfull : '两端对齐', |
||||
|
insertorderedlist : '编号', |
||||
|
insertunorderedlist : '项目符号', |
||||
|
indent : '增加缩进', |
||||
|
outdent : '减少缩进', |
||||
|
subscript : '下标', |
||||
|
superscript : '上标', |
||||
|
formatblock : '段落', |
||||
|
fontname : '字体', |
||||
|
fontsize : '文字大小', |
||||
|
forecolor : '文字颜色', |
||||
|
hilitecolor : '文字背景', |
||||
|
bold : '粗体(Ctrl+B)', |
||||
|
italic : '斜体(Ctrl+I)', |
||||
|
underline : '下划线(Ctrl+U)', |
||||
|
strikethrough : '删除线', |
||||
|
removeformat : '删除格式', |
||||
|
image : '图片', |
||||
|
multiimage : '批量图片上传', |
||||
|
flash : 'Flash', |
||||
|
media : '视音频', |
||||
|
table : '表格', |
||||
|
tablecell : '单元格', |
||||
|
hr : '插入横线', |
||||
|
emoticons : '插入表情', |
||||
|
link : '超级链接', |
||||
|
unlink : '取消超级链接', |
||||
|
fullscreen : '全屏显示', |
||||
|
about : '关于', |
||||
|
print : '打印(Ctrl+P)', |
||||
|
filemanager : '文件空间', |
||||
|
code : '插入程序代码', |
||||
|
map : 'Google地图', |
||||
|
baidumap : '百度地图', |
||||
|
lineheight : '行距', |
||||
|
clearhtml : '清理HTML代码', |
||||
|
pagebreak : '插入分页符', |
||||
|
quickformat : '一键排版', |
||||
|
insertfile : '插入文件', |
||||
|
template : '插入模板', |
||||
|
anchor : '锚点', |
||||
|
yes : '确定', |
||||
|
no : '取消', |
||||
|
close : '关闭', |
||||
|
editImage : '图片属性', |
||||
|
deleteImage : '删除图片', |
||||
|
editFlash : 'Flash属性', |
||||
|
deleteFlash : '删除Flash', |
||||
|
editMedia : '视音频属性', |
||||
|
deleteMedia : '删除视音频', |
||||
|
editLink : '超级链接属性', |
||||
|
deleteLink : '取消超级链接', |
||||
|
editAnchor : '锚点属性', |
||||
|
deleteAnchor : '删除锚点', |
||||
|
tableprop : '表格属性', |
||||
|
tablecellprop : '单元格属性', |
||||
|
tableinsert : '插入表格', |
||||
|
tabledelete : '删除表格', |
||||
|
tablecolinsertleft : '左侧插入列', |
||||
|
tablecolinsertright : '右侧插入列', |
||||
|
tablerowinsertabove : '上方插入行', |
||||
|
tablerowinsertbelow : '下方插入行', |
||||
|
tablerowmerge : '向下合并单元格', |
||||
|
tablecolmerge : '向右合并单元格', |
||||
|
tablerowsplit : '拆分行', |
||||
|
tablecolsplit : '拆分列', |
||||
|
tablecoldelete : '删除列', |
||||
|
tablerowdelete : '删除行', |
||||
|
noColor : '无颜色', |
||||
|
pleaseSelectFile : '请选择文件。', |
||||
|
invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。", |
||||
|
invalidMedia : "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。", |
||||
|
invalidWidth : "宽度必须为数字。", |
||||
|
invalidHeight : "高度必须为数字。", |
||||
|
invalidBorder : "边框必须为数字。", |
||||
|
invalidUrl : "请输入有效的URL地址。", |
||||
|
invalidRows : '行数为必选项,只允许输入大于0的数字。', |
||||
|
invalidCols : '列数为必选项,只允许输入大于0的数字。', |
||||
|
invalidPadding : '边距必须为数字。', |
||||
|
invalidSpacing : '间距必须为数字。', |
||||
|
invalidJson : '服务器发生故障。', |
||||
|
uploadSuccess : '上传成功。', |
||||
|
cutError : '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。', |
||||
|
copyError : '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。', |
||||
|
pasteError : '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。', |
||||
|
ajaxLoading : '加载中,请稍候 ...', |
||||
|
uploadLoading : '上传中,请稍候 ...', |
||||
|
uploadError : '上传错误', |
||||
|
'plainpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。', |
||||
|
'wordpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。', |
||||
|
'code.pleaseInput' : '请输入程序代码。', |
||||
|
'link.url' : 'URL', |
||||
|
'link.linkType' : '打开类型', |
||||
|
'link.newWindow' : '新窗口', |
||||
|
'link.selfWindow' : '当前窗口', |
||||
|
'flash.url' : 'URL', |
||||
|
'flash.width' : '宽度', |
||||
|
'flash.height' : '高度', |
||||
|
'flash.upload' : '上传', |
||||
|
'flash.viewServer' : '文件空间', |
||||
|
'media.url' : 'URL', |
||||
|
'media.width' : '宽度', |
||||
|
'media.height' : '高度', |
||||
|
'media.autostart' : '自动播放', |
||||
|
'media.upload' : '上传', |
||||
|
'media.viewServer' : '文件空间', |
||||
|
'image.remoteImage' : '网络图片', |
||||
|
'image.localImage' : '本地上传', |
||||
|
'image.remoteUrl' : '图片地址', |
||||
|
'image.localUrl' : '上传文件', |
||||
|
'image.size' : '图片大小', |
||||
|
'image.width' : '宽', |
||||
|
'image.height' : '高', |
||||
|
'image.resetSize' : '重置大小', |
||||
|
'image.align' : '对齐方式', |
||||
|
'image.defaultAlign' : '默认方式', |
||||
|
'image.leftAlign' : '左对齐', |
||||
|
'image.rightAlign' : '右对齐', |
||||
|
'image.imgTitle' : '图片说明', |
||||
|
'image.upload' : '浏览...', |
||||
|
'image.viewServer' : '图片空间', |
||||
|
'multiimage.uploadDesc' : '允许用户同时上传<%=uploadLimit%>张图片,单张图片容量不超过<%=sizeLimit%>', |
||||
|
'multiimage.startUpload' : '开始上传', |
||||
|
'multiimage.clearAll' : '全部清空', |
||||
|
'multiimage.insertAll' : '全部插入', |
||||
|
'multiimage.queueLimitExceeded' : '文件数量超过限制。', |
||||
|
'multiimage.fileExceedsSizeLimit' : '文件大小超过限制。', |
||||
|
'multiimage.zeroByteFile' : '无法上传空文件。', |
||||
|
'multiimage.invalidFiletype' : '文件类型不正确。', |
||||
|
'multiimage.unknownError' : '发生异常,无法上传。', |
||||
|
'multiimage.pending' : '等待上传', |
||||
|
'multiimage.uploadError' : '上传失败', |
||||
|
'filemanager.emptyFolder' : '空文件夹', |
||||
|
'filemanager.moveup' : '移到上一级文件夹', |
||||
|
'filemanager.viewType' : '显示方式:', |
||||
|
'filemanager.viewImage' : '缩略图', |
||||
|
'filemanager.listImage' : '详细信息', |
||||
|
'filemanager.orderType' : '排序方式:', |
||||
|
'filemanager.fileName' : '名称', |
||||
|
'filemanager.fileSize' : '大小', |
||||
|
'filemanager.fileType' : '类型', |
||||
|
'insertfile.url' : 'URL', |
||||
|
'insertfile.title' : '文件说明', |
||||
|
'insertfile.upload' : '上传', |
||||
|
'insertfile.viewServer' : '文件空间', |
||||
|
'table.cells' : '单元格数', |
||||
|
'table.rows' : '行数', |
||||
|
'table.cols' : '列数', |
||||
|
'table.size' : '大小', |
||||
|
'table.width' : '宽度', |
||||
|
'table.height' : '高度', |
||||
|
'table.percent' : '%', |
||||
|
'table.px' : 'px', |
||||
|
'table.space' : '边距间距', |
||||
|
'table.padding' : '边距', |
||||
|
'table.spacing' : '间距', |
||||
|
'table.align' : '对齐方式', |
||||
|
'table.textAlign' : '水平对齐', |
||||
|
'table.verticalAlign' : '垂直对齐', |
||||
|
'table.alignDefault' : '默认', |
||||
|
'table.alignLeft' : '左对齐', |
||||
|
'table.alignCenter' : '居中', |
||||
|
'table.alignRight' : '右对齐', |
||||
|
'table.alignTop' : '顶部', |
||||
|
'table.alignMiddle' : '中部', |
||||
|
'table.alignBottom' : '底部', |
||||
|
'table.alignBaseline' : '基线', |
||||
|
'table.border' : '边框', |
||||
|
'table.borderWidth' : '边框', |
||||
|
'table.borderColor' : '颜色', |
||||
|
'table.backgroundColor' : '背景颜色', |
||||
|
'map.address' : '地址: ', |
||||
|
'map.search' : '搜索', |
||||
|
'baidumap.address' : '地址: ', |
||||
|
'baidumap.search' : '搜索', |
||||
|
'baidumap.insertDynamicMap' : '插入动态地图', |
||||
|
'anchor.name' : '锚点名称', |
||||
|
'formatblock.formatBlock' : { |
||||
|
h1 : '标题 1', |
||||
|
h2 : '标题 2', |
||||
|
h3 : '标题 3', |
||||
|
h4 : '标题 4', |
||||
|
p : '正 文' |
||||
|
}, |
||||
|
'fontname.fontName' : { |
||||
|
'SimSun' : '宋体', |
||||
|
'NSimSun' : '新宋体', |
||||
|
'FangSong_GB2312' : '仿宋_GB2312', |
||||
|
'KaiTi_GB2312' : '楷体_GB2312', |
||||
|
'SimHei' : '黑体', |
||||
|
'Microsoft YaHei' : '微软雅黑', |
||||
|
'Arial' : 'Arial', |
||||
|
'Arial Black' : 'Arial Black', |
||||
|
'Times New Roman' : 'Times New Roman', |
||||
|
'Courier New' : 'Courier New', |
||||
|
'Tahoma' : 'Tahoma', |
||||
|
'Verdana' : 'Verdana' |
||||
|
}, |
||||
|
'lineheight.lineHeight' : [ |
||||
|
{'1' : '单倍行距'}, |
||||
|
{'1.5' : '1.5倍行距'}, |
||||
|
{'2' : '2倍行距'}, |
||||
|
{'2.5' : '2.5倍行距'}, |
||||
|
{'3' : '3倍行距'} |
||||
|
], |
||||
|
'template.selectTemplate' : '可选模板', |
||||
|
'template.replaceContent' : '替换当前内容', |
||||
|
'template.fileList' : { |
||||
|
'1.html' : '图片和文字', |
||||
|
'2.html' : '表格', |
||||
|
'3.html' : '项目编号' |
||||
|
} |
||||
|
}, 'zh-CN'); |
||||
|
|
||||
|
KindEditor.options.langType = 'zh-CN'; |
||||
@ -0,0 +1,243 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.lang({ |
||||
|
source : '原始碼', |
||||
|
preview : '預覽', |
||||
|
undo : '復原(Ctrl+Z)', |
||||
|
redo : '重複(Ctrl+Y)', |
||||
|
cut : '剪下(Ctrl+X)', |
||||
|
copy : '複製(Ctrl+C)', |
||||
|
paste : '貼上(Ctrl+V)', |
||||
|
plainpaste : '貼為純文字格式', |
||||
|
wordpaste : '自Word貼上', |
||||
|
selectall : '全選(Ctrl+A)', |
||||
|
justifyleft : '靠左對齊', |
||||
|
justifycenter : '置中', |
||||
|
justifyright : '靠右對齊', |
||||
|
justifyfull : '左右對齊', |
||||
|
insertorderedlist : '編號清單', |
||||
|
insertunorderedlist : '項目清單', |
||||
|
indent : '增加縮排', |
||||
|
outdent : '減少縮排', |
||||
|
subscript : '下標', |
||||
|
superscript : '上標', |
||||
|
formatblock : '標題', |
||||
|
fontname : '字體', |
||||
|
fontsize : '文字大小', |
||||
|
forecolor : '文字顏色', |
||||
|
hilitecolor : '背景顏色', |
||||
|
bold : '粗體(Ctrl+B)', |
||||
|
italic : '斜體(Ctrl+I)', |
||||
|
underline : '底線(Ctrl+U)', |
||||
|
strikethrough : '刪除線', |
||||
|
removeformat : '清除格式', |
||||
|
image : '影像', |
||||
|
multiimage : '批量影像上傳', |
||||
|
flash : 'Flash', |
||||
|
media : '多媒體', |
||||
|
table : '表格', |
||||
|
tablecell : '儲存格', |
||||
|
hr : '插入水平線', |
||||
|
emoticons : '插入表情', |
||||
|
link : '超連結', |
||||
|
unlink : '移除超連結', |
||||
|
fullscreen : '最大化', |
||||
|
about : '關於', |
||||
|
print : '列印(Ctrl+P)', |
||||
|
filemanager : '瀏覽伺服器', |
||||
|
code : '插入程式代碼', |
||||
|
map : 'Google地圖', |
||||
|
baidumap : 'Baidu地圖', |
||||
|
lineheight : '行距', |
||||
|
clearhtml : '清理HTML代碼', |
||||
|
pagebreak : '插入分頁符號', |
||||
|
quickformat : '快速排版', |
||||
|
insertfile : '插入文件', |
||||
|
template : '插入樣板', |
||||
|
anchor : '錨點', |
||||
|
yes : '確定', |
||||
|
no : '取消', |
||||
|
close : '關閉', |
||||
|
editImage : '影像屬性', |
||||
|
deleteImage : '刪除影像', |
||||
|
editFlash : 'Flash屬性', |
||||
|
deleteFlash : '删除Flash', |
||||
|
editMedia : '多媒體屬性', |
||||
|
deleteMedia : '删除多媒體', |
||||
|
editLink : '超連結屬性', |
||||
|
deleteLink : '移除超連結', |
||||
|
editAnchor : '锚点属性', |
||||
|
deleteAnchor : '删除锚点', |
||||
|
tableprop : '表格屬性', |
||||
|
tablecellprop : '儲存格屬性', |
||||
|
tableinsert : '插入表格', |
||||
|
tabledelete : '刪除表格', |
||||
|
tablecolinsertleft : '向左插入列', |
||||
|
tablecolinsertright : '向右插入列', |
||||
|
tablerowinsertabove : '向上插入欄', |
||||
|
tablerowinsertbelow : '下方插入欄', |
||||
|
tablerowmerge : '向下合併單元格', |
||||
|
tablecolmerge : '向右合併單元格', |
||||
|
tablerowsplit : '分割欄', |
||||
|
tablecolsplit : '分割列', |
||||
|
tablecoldelete : '删除列', |
||||
|
tablerowdelete : '删除欄', |
||||
|
noColor : '自動', |
||||
|
pleaseSelectFile : '請選擇文件。', |
||||
|
invalidImg : "請輸入有效的URL。\n只允許jpg,gif,bmp,png格式。", |
||||
|
invalidMedia : "請輸入有效的URL。\n只允許swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。", |
||||
|
invalidWidth : "寬度必須是數字。", |
||||
|
invalidHeight : "高度必須是數字。", |
||||
|
invalidBorder : "邊框必須是數字。", |
||||
|
invalidUrl : "請輸入有效的URL。", |
||||
|
invalidRows : '欄數是必須輸入項目,只允許輸入大於0的數字。', |
||||
|
invalidCols : '列數是必須輸入項目,只允許輸入大於0的數字。', |
||||
|
invalidPadding : '內距必須是數字。', |
||||
|
invalidSpacing : '間距必須是數字。', |
||||
|
invalidJson : '伺服器發生故障。', |
||||
|
uploadSuccess : '上傳成功。', |
||||
|
cutError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+X)完成。', |
||||
|
copyError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+C)完成。', |
||||
|
pasteError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+V)完成。', |
||||
|
ajaxLoading : '加載中,請稍候 ...', |
||||
|
uploadLoading : '上傳中,請稍候 ...', |
||||
|
uploadError : '上傳錯誤', |
||||
|
'plainpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。', |
||||
|
'wordpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。', |
||||
|
'code.pleaseInput' : 'Please input code.', |
||||
|
'link.url' : 'URL', |
||||
|
'link.linkType' : '打開類型', |
||||
|
'link.newWindow' : '新窗口', |
||||
|
'link.selfWindow' : '本頁窗口', |
||||
|
'flash.url' : 'URL', |
||||
|
'flash.width' : '寬度', |
||||
|
'flash.height' : '高度', |
||||
|
'flash.upload' : '上傳', |
||||
|
'flash.viewServer' : '瀏覽', |
||||
|
'media.url' : 'URL', |
||||
|
'media.width' : '寬度', |
||||
|
'media.height' : '高度', |
||||
|
'media.autostart' : '自動播放', |
||||
|
'media.upload' : '上傳', |
||||
|
'media.viewServer' : '瀏覽', |
||||
|
'image.remoteImage' : '網絡影像', |
||||
|
'image.localImage' : '上傳影像', |
||||
|
'image.remoteUrl' : '影像URL', |
||||
|
'image.localUrl' : '影像URL', |
||||
|
'image.size' : '影像大小', |
||||
|
'image.width' : '寬度', |
||||
|
'image.height' : '高度', |
||||
|
'image.resetSize' : '原始大小', |
||||
|
'image.align' : '對齊方式', |
||||
|
'image.defaultAlign' : '未設定', |
||||
|
'image.leftAlign' : '向左對齊', |
||||
|
'image.rightAlign' : '向右對齊', |
||||
|
'image.imgTitle' : '影像說明', |
||||
|
'image.upload' : '瀏覽...', |
||||
|
'image.viewServer' : '瀏覽...', |
||||
|
'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>', |
||||
|
'multiimage.startUpload' : 'Start upload', |
||||
|
'multiimage.clearAll' : 'Clear all', |
||||
|
'multiimage.insertAll' : 'Insert all', |
||||
|
'multiimage.queueLimitExceeded' : 'Queue limit exceeded.', |
||||
|
'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.', |
||||
|
'multiimage.zeroByteFile' : 'Zero byte file.', |
||||
|
'multiimage.invalidFiletype' : 'Invalid file type.', |
||||
|
'multiimage.unknownError' : 'Unknown upload error.', |
||||
|
'multiimage.pending' : 'Pending ...', |
||||
|
'multiimage.uploadError' : 'Upload error', |
||||
|
'filemanager.emptyFolder' : '空文件夾', |
||||
|
'filemanager.moveup' : '至上一級文件夾', |
||||
|
'filemanager.viewType' : '顯示方式:', |
||||
|
'filemanager.viewImage' : '縮略圖', |
||||
|
'filemanager.listImage' : '詳細信息', |
||||
|
'filemanager.orderType' : '排序方式:', |
||||
|
'filemanager.fileName' : '名稱', |
||||
|
'filemanager.fileSize' : '大小', |
||||
|
'filemanager.fileType' : '類型', |
||||
|
'insertfile.url' : 'URL', |
||||
|
'insertfile.title' : '文件說明', |
||||
|
'insertfile.upload' : '上傳', |
||||
|
'insertfile.viewServer' : '瀏覽', |
||||
|
'table.cells' : '儲存格數', |
||||
|
'table.rows' : '欄數', |
||||
|
'table.cols' : '列數', |
||||
|
'table.size' : '表格大小', |
||||
|
'table.width' : '寬度', |
||||
|
'table.height' : '高度', |
||||
|
'table.percent' : '%', |
||||
|
'table.px' : 'px', |
||||
|
'table.space' : '內距間距', |
||||
|
'table.padding' : '內距', |
||||
|
'table.spacing' : '間距', |
||||
|
'table.align' : '對齊方式', |
||||
|
'table.textAlign' : '水平對齊', |
||||
|
'table.verticalAlign' : '垂直對齊', |
||||
|
'table.alignDefault' : '未設定', |
||||
|
'table.alignLeft' : '向左對齊', |
||||
|
'table.alignCenter' : '置中', |
||||
|
'table.alignRight' : '向右對齊', |
||||
|
'table.alignTop' : '靠上', |
||||
|
'table.alignMiddle' : '置中', |
||||
|
'table.alignBottom' : '靠下', |
||||
|
'table.alignBaseline' : '基線', |
||||
|
'table.border' : '表格邊框', |
||||
|
'table.borderWidth' : '邊框', |
||||
|
'table.borderColor' : '顏色', |
||||
|
'table.backgroundColor' : '背景顏色', |
||||
|
'map.address' : '住所: ', |
||||
|
'map.search' : '尋找', |
||||
|
'baidumap.address' : '住所: ', |
||||
|
'baidumap.search' : '尋找', |
||||
|
'baidumap.insertDynamicMap' : '插入動態地圖', |
||||
|
'anchor.name' : '錨點名稱', |
||||
|
'formatblock.formatBlock' : { |
||||
|
h1 : '標題 1', |
||||
|
h2 : '標題 2', |
||||
|
h3 : '標題 3', |
||||
|
h4 : '標題 4', |
||||
|
p : '一般' |
||||
|
}, |
||||
|
'fontname.fontName' : { |
||||
|
'MingLiU' : '細明體', |
||||
|
'PMingLiU' : '新細明體', |
||||
|
'DFKai-SB' : '標楷體', |
||||
|
'SimSun' : '宋體', |
||||
|
'NSimSun' : '新宋體', |
||||
|
'FangSong' : '仿宋體', |
||||
|
'Arial' : 'Arial', |
||||
|
'Arial Black' : 'Arial Black', |
||||
|
'Times New Roman' : 'Times New Roman', |
||||
|
'Courier New' : 'Courier New', |
||||
|
'Tahoma' : 'Tahoma', |
||||
|
'Verdana' : 'Verdana' |
||||
|
}, |
||||
|
'lineheight.lineHeight' : [ |
||||
|
{'1' : '单倍行距'}, |
||||
|
{'1.5' : '1.5倍行距'}, |
||||
|
{'2' : '2倍行距'}, |
||||
|
{'2.5' : '2.5倍行距'}, |
||||
|
{'3' : '3倍行距'} |
||||
|
], |
||||
|
'template.selectTemplate' : '可選樣板', |
||||
|
'template.replaceContent' : '取代當前內容', |
||||
|
'template.fileList' : { |
||||
|
'1.html' : '影像和文字', |
||||
|
'2.html' : '表格', |
||||
|
'3.html' : '项目清單' |
||||
|
} |
||||
|
}, 'zh-TW'); |
||||
|
|
||||
|
KindEditor.each(KindEditor.options.items, function(i, name) { |
||||
|
if (name == 'baidumap') { |
||||
|
KindEditor.options.items[i] = 'map'; |
||||
|
} |
||||
|
}); |
||||
|
KindEditor.options.langType = 'zh-TW'; |
||||
@ -0,0 +1,502 @@ |
|||||
|
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! |
||||
@ -0,0 +1,806 @@ |
|||||
|
<?php |
||||
|
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
||||
|
|
||||
|
/** |
||||
|
* Converts to and from JSON format. |
||||
|
* |
||||
|
* JSON (JavaScript Object Notation) is a lightweight data-interchange |
||||
|
* format. It is easy for humans to read and write. It is easy for machines |
||||
|
* to parse and generate. It is based on a subset of the JavaScript |
||||
|
* Programming Language, Standard ECMA-262 3rd Edition - December 1999. |
||||
|
* This feature can also be found in Python. JSON is a text format that is |
||||
|
* completely language independent but uses conventions that are familiar |
||||
|
* to programmers of the C-family of languages, including C, C++, C#, Java, |
||||
|
* JavaScript, Perl, TCL, and many others. These properties make JSON an |
||||
|
* ideal data-interchange language. |
||||
|
* |
||||
|
* This package provides a simple encoder and decoder for JSON notation. It |
||||
|
* is intended for use with client-side Javascript applications that make |
||||
|
* use of HTTPRequest to perform server communication functions - data can |
||||
|
* be encoded into JSON notation for use in a client-side javascript, or |
||||
|
* decoded from incoming Javascript requests. JSON format is native to |
||||
|
* Javascript, and can be directly eval()'ed with no further parsing |
||||
|
* overhead |
||||
|
* |
||||
|
* All strings should be in ASCII or UTF-8 format! |
||||
|
* |
||||
|
* LICENSE: Redistribution and use in source and binary forms, with or |
||||
|
* without modification, are permitted provided that the following |
||||
|
* conditions are met: Redistributions of source code must retain the |
||||
|
* above copyright notice, this list of conditions and the following |
||||
|
* disclaimer. Redistributions in binary form must reproduce the above |
||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||
|
* in the documentation and/or other materials provided with the |
||||
|
* distribution. |
||||
|
* |
||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED |
||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN |
||||
|
* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR |
||||
|
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE |
||||
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
||||
|
* DAMAGE. |
||||
|
* |
||||
|
* @category |
||||
|
* @package Services_JSON |
||||
|
* @author Michal Migurski <mike-json@teczno.com> |
||||
|
* @author Matt Knapp <mdknapp[at]gmail[dot]com> |
||||
|
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com> |
||||
|
* @copyright 2005 Michal Migurski |
||||
|
* @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ |
||||
|
* @license http://www.opensource.org/licenses/bsd-license.php |
||||
|
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Marker constant for Services_JSON::decode(), used to flag stack state |
||||
|
*/ |
||||
|
define('SERVICES_JSON_SLICE', 1); |
||||
|
|
||||
|
/** |
||||
|
* Marker constant for Services_JSON::decode(), used to flag stack state |
||||
|
*/ |
||||
|
define('SERVICES_JSON_IN_STR', 2); |
||||
|
|
||||
|
/** |
||||
|
* Marker constant for Services_JSON::decode(), used to flag stack state |
||||
|
*/ |
||||
|
define('SERVICES_JSON_IN_ARR', 3); |
||||
|
|
||||
|
/** |
||||
|
* Marker constant for Services_JSON::decode(), used to flag stack state |
||||
|
*/ |
||||
|
define('SERVICES_JSON_IN_OBJ', 4); |
||||
|
|
||||
|
/** |
||||
|
* Marker constant for Services_JSON::decode(), used to flag stack state |
||||
|
*/ |
||||
|
define('SERVICES_JSON_IN_CMT', 5); |
||||
|
|
||||
|
/** |
||||
|
* Behavior switch for Services_JSON::decode() |
||||
|
*/ |
||||
|
define('SERVICES_JSON_LOOSE_TYPE', 16); |
||||
|
|
||||
|
/** |
||||
|
* Behavior switch for Services_JSON::decode() |
||||
|
*/ |
||||
|
define('SERVICES_JSON_SUPPRESS_ERRORS', 32); |
||||
|
|
||||
|
/** |
||||
|
* Converts to and from JSON format. |
||||
|
* |
||||
|
* Brief example of use: |
||||
|
* |
||||
|
* <code> |
||||
|
* // create a new instance of Services_JSON |
||||
|
* $json = new Services_JSON(); |
||||
|
* |
||||
|
* // convert a complexe value to JSON notation, and send it to the browser |
||||
|
* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); |
||||
|
* $output = $json->encode($value); |
||||
|
* |
||||
|
* print($output); |
||||
|
* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] |
||||
|
* |
||||
|
* // accept incoming POST data, assumed to be in JSON notation |
||||
|
* $input = file_get_contents('php://input', 1000000); |
||||
|
* $value = $json->decode($input); |
||||
|
* </code> |
||||
|
*/ |
||||
|
class Services_JSON |
||||
|
{ |
||||
|
/** |
||||
|
* constructs a new JSON instance |
||||
|
* |
||||
|
* @param int $use object behavior flags; combine with boolean-OR |
||||
|
* |
||||
|
* possible values: |
||||
|
* - SERVICES_JSON_LOOSE_TYPE: loose typing. |
||||
|
* "{...}" syntax creates associative arrays |
||||
|
* instead of objects in decode(). |
||||
|
* - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. |
||||
|
* Values which can't be encoded (e.g. resources) |
||||
|
* appear as NULL instead of throwing errors. |
||||
|
* By default, a deeply-nested resource will |
||||
|
* bubble up with an error, so all return values |
||||
|
* from encode() should be checked with isError() |
||||
|
*/ |
||||
|
function Services_JSON($use = 0) |
||||
|
{ |
||||
|
$this->use = $use; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* convert a string from one UTF-16 char to one UTF-8 char |
||||
|
* |
||||
|
* Normally should be handled by mb_convert_encoding, but |
||||
|
* provides a slower PHP-only method for installations |
||||
|
* that lack the multibye string extension. |
||||
|
* |
||||
|
* @param string $utf16 UTF-16 character |
||||
|
* @return string UTF-8 character |
||||
|
* @access private |
||||
|
*/ |
||||
|
function utf162utf8($utf16) |
||||
|
{ |
||||
|
// oh please oh please oh please oh please oh please |
||||
|
if(function_exists('mb_convert_encoding')) { |
||||
|
return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); |
||||
|
} |
||||
|
|
||||
|
$bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); |
||||
|
|
||||
|
switch(true) { |
||||
|
case ((0x7F & $bytes) == $bytes): |
||||
|
// this case should never be reached, because we are in ASCII range |
||||
|
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
return chr(0x7F & $bytes); |
||||
|
|
||||
|
case (0x07FF & $bytes) == $bytes: |
||||
|
// return a 2-byte UTF-8 character |
||||
|
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
return chr(0xC0 | (($bytes >> 6) & 0x1F)) |
||||
|
. chr(0x80 | ($bytes & 0x3F)); |
||||
|
|
||||
|
case (0xFFFF & $bytes) == $bytes: |
||||
|
// return a 3-byte UTF-8 character |
||||
|
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
return chr(0xE0 | (($bytes >> 12) & 0x0F)) |
||||
|
. chr(0x80 | (($bytes >> 6) & 0x3F)) |
||||
|
. chr(0x80 | ($bytes & 0x3F)); |
||||
|
} |
||||
|
|
||||
|
// ignoring UTF-32 for now, sorry |
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* convert a string from one UTF-8 char to one UTF-16 char |
||||
|
* |
||||
|
* Normally should be handled by mb_convert_encoding, but |
||||
|
* provides a slower PHP-only method for installations |
||||
|
* that lack the multibye string extension. |
||||
|
* |
||||
|
* @param string $utf8 UTF-8 character |
||||
|
* @return string UTF-16 character |
||||
|
* @access private |
||||
|
*/ |
||||
|
function utf82utf16($utf8) |
||||
|
{ |
||||
|
// oh please oh please oh please oh please oh please |
||||
|
if(function_exists('mb_convert_encoding')) { |
||||
|
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); |
||||
|
} |
||||
|
|
||||
|
switch(strlen($utf8)) { |
||||
|
case 1: |
||||
|
// this case should never be reached, because we are in ASCII range |
||||
|
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
return $utf8; |
||||
|
|
||||
|
case 2: |
||||
|
// return a UTF-16 character from a 2-byte UTF-8 char |
||||
|
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
return chr(0x07 & (ord($utf8{0}) >> 2)) |
||||
|
. chr((0xC0 & (ord($utf8{0}) << 6)) |
||||
|
| (0x3F & ord($utf8{1}))); |
||||
|
|
||||
|
case 3: |
||||
|
// return a UTF-16 character from a 3-byte UTF-8 char |
||||
|
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
return chr((0xF0 & (ord($utf8{0}) << 4)) |
||||
|
| (0x0F & (ord($utf8{1}) >> 2))) |
||||
|
. chr((0xC0 & (ord($utf8{1}) << 6)) |
||||
|
| (0x7F & ord($utf8{2}))); |
||||
|
} |
||||
|
|
||||
|
// ignoring UTF-32 for now, sorry |
||||
|
return ''; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* encodes an arbitrary variable into JSON format |
||||
|
* |
||||
|
* @param mixed $var any number, boolean, string, array, or object to be encoded. |
||||
|
* see argument 1 to Services_JSON() above for array-parsing behavior. |
||||
|
* if var is a strng, note that encode() always expects it |
||||
|
* to be in ASCII or UTF-8 format! |
||||
|
* |
||||
|
* @return mixed JSON string representation of input var or an error if a problem occurs |
||||
|
* @access public |
||||
|
*/ |
||||
|
function encode($var) |
||||
|
{ |
||||
|
switch (gettype($var)) { |
||||
|
case 'boolean': |
||||
|
return $var ? 'true' : 'false'; |
||||
|
|
||||
|
case 'NULL': |
||||
|
return 'null'; |
||||
|
|
||||
|
case 'integer': |
||||
|
return (int) $var; |
||||
|
|
||||
|
case 'double': |
||||
|
case 'float': |
||||
|
return (float) $var; |
||||
|
|
||||
|
case 'string': |
||||
|
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT |
||||
|
$ascii = ''; |
||||
|
$strlen_var = strlen($var); |
||||
|
|
||||
|
/* |
||||
|
* Iterate over every character in the string, |
||||
|
* escaping with a slash or encoding to UTF-8 where necessary |
||||
|
*/ |
||||
|
for ($c = 0; $c < $strlen_var; ++$c) { |
||||
|
|
||||
|
$ord_var_c = ord($var{$c}); |
||||
|
|
||||
|
switch (true) { |
||||
|
case $ord_var_c == 0x08: |
||||
|
$ascii .= '\b'; |
||||
|
break; |
||||
|
case $ord_var_c == 0x09: |
||||
|
$ascii .= '\t'; |
||||
|
break; |
||||
|
case $ord_var_c == 0x0A: |
||||
|
$ascii .= '\n'; |
||||
|
break; |
||||
|
case $ord_var_c == 0x0C: |
||||
|
$ascii .= '\f'; |
||||
|
break; |
||||
|
case $ord_var_c == 0x0D: |
||||
|
$ascii .= '\r'; |
||||
|
break; |
||||
|
|
||||
|
case $ord_var_c == 0x22: |
||||
|
case $ord_var_c == 0x2F: |
||||
|
case $ord_var_c == 0x5C: |
||||
|
// double quote, slash, slosh |
||||
|
$ascii .= '\\'.$var{$c}; |
||||
|
break; |
||||
|
|
||||
|
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): |
||||
|
// characters U-00000000 - U-0000007F (same as ASCII) |
||||
|
$ascii .= $var{$c}; |
||||
|
break; |
||||
|
|
||||
|
case (($ord_var_c & 0xE0) == 0xC0): |
||||
|
// characters U-00000080 - U-000007FF, mask 110XXXXX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$char = pack('C*', $ord_var_c, ord($var{$c + 1})); |
||||
|
$c += 1; |
||||
|
$utf16 = $this->utf82utf16($char); |
||||
|
$ascii .= sprintf('\u%04s', bin2hex($utf16)); |
||||
|
break; |
||||
|
|
||||
|
case (($ord_var_c & 0xF0) == 0xE0): |
||||
|
// characters U-00000800 - U-0000FFFF, mask 1110XXXX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$char = pack('C*', $ord_var_c, |
||||
|
ord($var{$c + 1}), |
||||
|
ord($var{$c + 2})); |
||||
|
$c += 2; |
||||
|
$utf16 = $this->utf82utf16($char); |
||||
|
$ascii .= sprintf('\u%04s', bin2hex($utf16)); |
||||
|
break; |
||||
|
|
||||
|
case (($ord_var_c & 0xF8) == 0xF0): |
||||
|
// characters U-00010000 - U-001FFFFF, mask 11110XXX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$char = pack('C*', $ord_var_c, |
||||
|
ord($var{$c + 1}), |
||||
|
ord($var{$c + 2}), |
||||
|
ord($var{$c + 3})); |
||||
|
$c += 3; |
||||
|
$utf16 = $this->utf82utf16($char); |
||||
|
$ascii .= sprintf('\u%04s', bin2hex($utf16)); |
||||
|
break; |
||||
|
|
||||
|
case (($ord_var_c & 0xFC) == 0xF8): |
||||
|
// characters U-00200000 - U-03FFFFFF, mask 111110XX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$char = pack('C*', $ord_var_c, |
||||
|
ord($var{$c + 1}), |
||||
|
ord($var{$c + 2}), |
||||
|
ord($var{$c + 3}), |
||||
|
ord($var{$c + 4})); |
||||
|
$c += 4; |
||||
|
$utf16 = $this->utf82utf16($char); |
||||
|
$ascii .= sprintf('\u%04s', bin2hex($utf16)); |
||||
|
break; |
||||
|
|
||||
|
case (($ord_var_c & 0xFE) == 0xFC): |
||||
|
// characters U-04000000 - U-7FFFFFFF, mask 1111110X |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$char = pack('C*', $ord_var_c, |
||||
|
ord($var{$c + 1}), |
||||
|
ord($var{$c + 2}), |
||||
|
ord($var{$c + 3}), |
||||
|
ord($var{$c + 4}), |
||||
|
ord($var{$c + 5})); |
||||
|
$c += 5; |
||||
|
$utf16 = $this->utf82utf16($char); |
||||
|
$ascii .= sprintf('\u%04s', bin2hex($utf16)); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return '"'.$ascii.'"'; |
||||
|
|
||||
|
case 'array': |
||||
|
/* |
||||
|
* As per JSON spec if any array key is not an integer |
||||
|
* we must treat the the whole array as an object. We |
||||
|
* also try to catch a sparsely populated associative |
||||
|
* array with numeric keys here because some JS engines |
||||
|
* will create an array with empty indexes up to |
||||
|
* max_index which can cause memory issues and because |
||||
|
* the keys, which may be relevant, will be remapped |
||||
|
* otherwise. |
||||
|
* |
||||
|
* As per the ECMA and JSON specification an object may |
||||
|
* have any string as a property. Unfortunately due to |
||||
|
* a hole in the ECMA specification if the key is a |
||||
|
* ECMA reserved word or starts with a digit the |
||||
|
* parameter is only accessible using ECMAScript's |
||||
|
* bracket notation. |
||||
|
*/ |
||||
|
|
||||
|
// treat as a JSON object |
||||
|
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { |
||||
|
$properties = array_map(array($this, 'name_value'), |
||||
|
array_keys($var), |
||||
|
array_values($var)); |
||||
|
|
||||
|
foreach($properties as $property) { |
||||
|
if(Services_JSON::isError($property)) { |
||||
|
return $property; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return '{' . join(',', $properties) . '}'; |
||||
|
} |
||||
|
|
||||
|
// treat it like a regular array |
||||
|
$elements = array_map(array($this, 'encode'), $var); |
||||
|
|
||||
|
foreach($elements as $element) { |
||||
|
if(Services_JSON::isError($element)) { |
||||
|
return $element; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return '[' . join(',', $elements) . ']'; |
||||
|
|
||||
|
case 'object': |
||||
|
$vars = get_object_vars($var); |
||||
|
|
||||
|
$properties = array_map(array($this, 'name_value'), |
||||
|
array_keys($vars), |
||||
|
array_values($vars)); |
||||
|
|
||||
|
foreach($properties as $property) { |
||||
|
if(Services_JSON::isError($property)) { |
||||
|
return $property; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return '{' . join(',', $properties) . '}'; |
||||
|
|
||||
|
default: |
||||
|
return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) |
||||
|
? 'null' |
||||
|
: new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* array-walking function for use in generating JSON-formatted name-value pairs |
||||
|
* |
||||
|
* @param string $name name of key to use |
||||
|
* @param mixed $value reference to an array element to be encoded |
||||
|
* |
||||
|
* @return string JSON-formatted name-value pair, like '"name":value' |
||||
|
* @access private |
||||
|
*/ |
||||
|
function name_value($name, $value) |
||||
|
{ |
||||
|
$encoded_value = $this->encode($value); |
||||
|
|
||||
|
if(Services_JSON::isError($encoded_value)) { |
||||
|
return $encoded_value; |
||||
|
} |
||||
|
|
||||
|
return $this->encode(strval($name)) . ':' . $encoded_value; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* reduce a string by removing leading and trailing comments and whitespace |
||||
|
* |
||||
|
* @param $str string string value to strip of comments and whitespace |
||||
|
* |
||||
|
* @return string string value stripped of comments and whitespace |
||||
|
* @access private |
||||
|
*/ |
||||
|
function reduce_string($str) |
||||
|
{ |
||||
|
$str = preg_replace(array( |
||||
|
|
||||
|
// eliminate single line comments in '// ...' form |
||||
|
'#^\s*//(.+)$#m', |
||||
|
|
||||
|
// eliminate multi-line comments in '/* ... */' form, at start of string |
||||
|
'#^\s*/\*(.+)\*/#Us', |
||||
|
|
||||
|
// eliminate multi-line comments in '/* ... */' form, at end of string |
||||
|
'#/\*(.+)\*/\s*$#Us' |
||||
|
|
||||
|
), '', $str); |
||||
|
|
||||
|
// eliminate extraneous space |
||||
|
return trim($str); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* decodes a JSON string into appropriate variable |
||||
|
* |
||||
|
* @param string $str JSON-formatted string |
||||
|
* |
||||
|
* @return mixed number, boolean, string, array, or object |
||||
|
* corresponding to given JSON input string. |
||||
|
* See argument 1 to Services_JSON() above for object-output behavior. |
||||
|
* Note that decode() always returns strings |
||||
|
* in ASCII or UTF-8 format! |
||||
|
* @access public |
||||
|
*/ |
||||
|
function decode($str) |
||||
|
{ |
||||
|
$str = $this->reduce_string($str); |
||||
|
|
||||
|
switch (strtolower($str)) { |
||||
|
case 'true': |
||||
|
return true; |
||||
|
|
||||
|
case 'false': |
||||
|
return false; |
||||
|
|
||||
|
case 'null': |
||||
|
return null; |
||||
|
|
||||
|
default: |
||||
|
$m = array(); |
||||
|
|
||||
|
if (is_numeric($str)) { |
||||
|
// Lookie-loo, it's a number |
||||
|
|
||||
|
// This would work on its own, but I'm trying to be |
||||
|
// good about returning integers where appropriate: |
||||
|
// return (float)$str; |
||||
|
|
||||
|
// Return float or int, as appropriate |
||||
|
return ((float)$str == (integer)$str) |
||||
|
? (integer)$str |
||||
|
: (float)$str; |
||||
|
|
||||
|
} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { |
||||
|
// STRINGS RETURNED IN UTF-8 FORMAT |
||||
|
$delim = substr($str, 0, 1); |
||||
|
$chrs = substr($str, 1, -1); |
||||
|
$utf8 = ''; |
||||
|
$strlen_chrs = strlen($chrs); |
||||
|
|
||||
|
for ($c = 0; $c < $strlen_chrs; ++$c) { |
||||
|
|
||||
|
$substr_chrs_c_2 = substr($chrs, $c, 2); |
||||
|
$ord_chrs_c = ord($chrs{$c}); |
||||
|
|
||||
|
switch (true) { |
||||
|
case $substr_chrs_c_2 == '\b': |
||||
|
$utf8 .= chr(0x08); |
||||
|
++$c; |
||||
|
break; |
||||
|
case $substr_chrs_c_2 == '\t': |
||||
|
$utf8 .= chr(0x09); |
||||
|
++$c; |
||||
|
break; |
||||
|
case $substr_chrs_c_2 == '\n': |
||||
|
$utf8 .= chr(0x0A); |
||||
|
++$c; |
||||
|
break; |
||||
|
case $substr_chrs_c_2 == '\f': |
||||
|
$utf8 .= chr(0x0C); |
||||
|
++$c; |
||||
|
break; |
||||
|
case $substr_chrs_c_2 == '\r': |
||||
|
$utf8 .= chr(0x0D); |
||||
|
++$c; |
||||
|
break; |
||||
|
|
||||
|
case $substr_chrs_c_2 == '\\"': |
||||
|
case $substr_chrs_c_2 == '\\\'': |
||||
|
case $substr_chrs_c_2 == '\\\\': |
||||
|
case $substr_chrs_c_2 == '\\/': |
||||
|
if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || |
||||
|
($delim == "'" && $substr_chrs_c_2 != '\\"')) { |
||||
|
$utf8 .= $chrs{++$c}; |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): |
||||
|
// single, escaped unicode character |
||||
|
$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) |
||||
|
. chr(hexdec(substr($chrs, ($c + 4), 2))); |
||||
|
$utf8 .= $this->utf162utf8($utf16); |
||||
|
$c += 5; |
||||
|
break; |
||||
|
|
||||
|
case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): |
||||
|
$utf8 .= $chrs{$c}; |
||||
|
break; |
||||
|
|
||||
|
case ($ord_chrs_c & 0xE0) == 0xC0: |
||||
|
// characters U-00000080 - U-000007FF, mask 110XXXXX |
||||
|
//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$utf8 .= substr($chrs, $c, 2); |
||||
|
++$c; |
||||
|
break; |
||||
|
|
||||
|
case ($ord_chrs_c & 0xF0) == 0xE0: |
||||
|
// characters U-00000800 - U-0000FFFF, mask 1110XXXX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$utf8 .= substr($chrs, $c, 3); |
||||
|
$c += 2; |
||||
|
break; |
||||
|
|
||||
|
case ($ord_chrs_c & 0xF8) == 0xF0: |
||||
|
// characters U-00010000 - U-001FFFFF, mask 11110XXX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$utf8 .= substr($chrs, $c, 4); |
||||
|
$c += 3; |
||||
|
break; |
||||
|
|
||||
|
case ($ord_chrs_c & 0xFC) == 0xF8: |
||||
|
// characters U-00200000 - U-03FFFFFF, mask 111110XX |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$utf8 .= substr($chrs, $c, 5); |
||||
|
$c += 4; |
||||
|
break; |
||||
|
|
||||
|
case ($ord_chrs_c & 0xFE) == 0xFC: |
||||
|
// characters U-04000000 - U-7FFFFFFF, mask 1111110X |
||||
|
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 |
||||
|
$utf8 .= substr($chrs, $c, 6); |
||||
|
$c += 5; |
||||
|
break; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
return $utf8; |
||||
|
|
||||
|
} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { |
||||
|
// array, or object notation |
||||
|
|
||||
|
if ($str{0} == '[') { |
||||
|
$stk = array(SERVICES_JSON_IN_ARR); |
||||
|
$arr = array(); |
||||
|
} else { |
||||
|
if ($this->use & SERVICES_JSON_LOOSE_TYPE) { |
||||
|
$stk = array(SERVICES_JSON_IN_OBJ); |
||||
|
$obj = array(); |
||||
|
} else { |
||||
|
$stk = array(SERVICES_JSON_IN_OBJ); |
||||
|
$obj = new stdClass(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
array_push($stk, array('what' => SERVICES_JSON_SLICE, |
||||
|
'where' => 0, |
||||
|
'delim' => false)); |
||||
|
|
||||
|
$chrs = substr($str, 1, -1); |
||||
|
$chrs = $this->reduce_string($chrs); |
||||
|
|
||||
|
if ($chrs == '') { |
||||
|
if (reset($stk) == SERVICES_JSON_IN_ARR) { |
||||
|
return $arr; |
||||
|
|
||||
|
} else { |
||||
|
return $obj; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//print("\nparsing {$chrs}\n"); |
||||
|
|
||||
|
$strlen_chrs = strlen($chrs); |
||||
|
|
||||
|
for ($c = 0; $c <= $strlen_chrs; ++$c) { |
||||
|
|
||||
|
$top = end($stk); |
||||
|
$substr_chrs_c_2 = substr($chrs, $c, 2); |
||||
|
|
||||
|
if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { |
||||
|
// found a comma that is not inside a string, array, etc., |
||||
|
// OR we've reached the end of the character list |
||||
|
$slice = substr($chrs, $top['where'], ($c - $top['where'])); |
||||
|
array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); |
||||
|
//print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); |
||||
|
|
||||
|
if (reset($stk) == SERVICES_JSON_IN_ARR) { |
||||
|
// we are in an array, so just push an element onto the stack |
||||
|
array_push($arr, $this->decode($slice)); |
||||
|
|
||||
|
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { |
||||
|
// we are in an object, so figure |
||||
|
// out the property name and set an |
||||
|
// element in an associative array, |
||||
|
// for now |
||||
|
$parts = array(); |
||||
|
|
||||
|
if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { |
||||
|
// "name":value pair |
||||
|
$key = $this->decode($parts[1]); |
||||
|
$val = $this->decode($parts[2]); |
||||
|
|
||||
|
if ($this->use & SERVICES_JSON_LOOSE_TYPE) { |
||||
|
$obj[$key] = $val; |
||||
|
} else { |
||||
|
$obj->$key = $val; |
||||
|
} |
||||
|
} elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { |
||||
|
// name:value pair, where name is unquoted |
||||
|
$key = $parts[1]; |
||||
|
$val = $this->decode($parts[2]); |
||||
|
|
||||
|
if ($this->use & SERVICES_JSON_LOOSE_TYPE) { |
||||
|
$obj[$key] = $val; |
||||
|
} else { |
||||
|
$obj->$key = $val; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { |
||||
|
// found a quote, and we are not inside a string |
||||
|
array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); |
||||
|
//print("Found start of string at {$c}\n"); |
||||
|
|
||||
|
} elseif (($chrs{$c} == $top['delim']) && |
||||
|
($top['what'] == SERVICES_JSON_IN_STR) && |
||||
|
((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { |
||||
|
// found a quote, we're in a string, and it's not escaped |
||||
|
// we know that it's not escaped becase there is _not_ an |
||||
|
// odd number of backslashes at the end of the string so far |
||||
|
array_pop($stk); |
||||
|
//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); |
||||
|
|
||||
|
} elseif (($chrs{$c} == '[') && |
||||
|
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { |
||||
|
// found a left-bracket, and we are in an array, object, or slice |
||||
|
array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); |
||||
|
//print("Found start of array at {$c}\n"); |
||||
|
|
||||
|
} elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { |
||||
|
// found a right-bracket, and we're in an array |
||||
|
array_pop($stk); |
||||
|
//print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); |
||||
|
|
||||
|
} elseif (($chrs{$c} == '{') && |
||||
|
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { |
||||
|
// found a left-brace, and we are in an array, object, or slice |
||||
|
array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); |
||||
|
//print("Found start of object at {$c}\n"); |
||||
|
|
||||
|
} elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { |
||||
|
// found a right-brace, and we're in an object |
||||
|
array_pop($stk); |
||||
|
//print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); |
||||
|
|
||||
|
} elseif (($substr_chrs_c_2 == '/*') && |
||||
|
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { |
||||
|
// found a comment start, and we are in an array, object, or slice |
||||
|
array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); |
||||
|
$c++; |
||||
|
//print("Found start of comment at {$c}\n"); |
||||
|
|
||||
|
} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { |
||||
|
// found a comment end, and we're in one now |
||||
|
array_pop($stk); |
||||
|
$c++; |
||||
|
|
||||
|
for ($i = $top['where']; $i <= $c; ++$i) |
||||
|
$chrs = substr_replace($chrs, ' ', $i, 1); |
||||
|
|
||||
|
//print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
if (reset($stk) == SERVICES_JSON_IN_ARR) { |
||||
|
return $arr; |
||||
|
|
||||
|
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { |
||||
|
return $obj; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @todo Ultimately, this should just call PEAR::isError() |
||||
|
*/ |
||||
|
function isError($data, $code = null) |
||||
|
{ |
||||
|
if (class_exists('pear')) { |
||||
|
return PEAR::isError($data, $code); |
||||
|
} elseif (is_object($data) && (get_class($data) == 'services_json_error' || |
||||
|
is_subclass_of($data, 'services_json_error'))) { |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (class_exists('PEAR_Error')) { |
||||
|
|
||||
|
class Services_JSON_Error extends PEAR_Error |
||||
|
{ |
||||
|
function Services_JSON_Error($message = 'unknown error', $code = null, |
||||
|
$mode = null, $options = null, $userinfo = null) |
||||
|
{ |
||||
|
parent::PEAR_Error($message, $code, $mode, $options, $userinfo); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
/** |
||||
|
* @todo Ultimately, this class shall be descended from PEAR_Error |
||||
|
*/ |
||||
|
class Services_JSON_Error |
||||
|
{ |
||||
|
function Services_JSON_Error($message = 'unknown error', $code = null, |
||||
|
$mode = null, $options = null, $userinfo = null) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
?> |
||||
@ -0,0 +1,137 @@ |
|||||
|
<?php |
||||
|
/** |
||||
|
* KindEditor PHP |
||||
|
* |
||||
|
* 本PHP程序是演示程序,建议不要直接在实际项目中使用。 |
||||
|
* 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。 |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
require_once 'JSON.php'; |
||||
|
|
||||
|
$php_path = dirname(__FILE__) . '/'; |
||||
|
$php_url = dirname($_SERVER['PHP_SELF']) . '/'; |
||||
|
|
||||
|
//根目录路径,可以指定绝对路径,比如 /var/www/attached/ |
||||
|
$root_path = $php_path . '../attached/'; |
||||
|
//根目录URL,可以指定绝对路径,比如 http://www.yoursite.com/attached/ |
||||
|
$root_url = $php_url . '../attached/'; |
||||
|
//图片扩展名 |
||||
|
$ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp'); |
||||
|
|
||||
|
//目录名 |
||||
|
$dir_name = empty($_GET['dir']) ? '' : trim($_GET['dir']); |
||||
|
if (!in_array($dir_name, array('', 'image', 'flash', 'media', 'file'))) { |
||||
|
echo "Invalid Directory name."; |
||||
|
exit; |
||||
|
} |
||||
|
if ($dir_name !== '') { |
||||
|
$root_path .= $dir_name . "/"; |
||||
|
$root_url .= $dir_name . "/"; |
||||
|
if (!file_exists($root_path)) { |
||||
|
mkdir($root_path); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//根据path参数,设置各路径和URL |
||||
|
if (empty($_GET['path'])) { |
||||
|
$current_path = realpath($root_path) . '/'; |
||||
|
$current_url = $root_url; |
||||
|
$current_dir_path = ''; |
||||
|
$moveup_dir_path = ''; |
||||
|
} else { |
||||
|
$current_path = realpath($root_path) . '/' . $_GET['path']; |
||||
|
$current_url = $root_url . $_GET['path']; |
||||
|
$current_dir_path = $_GET['path']; |
||||
|
$moveup_dir_path = preg_replace('/(.*?)[^\/]+\/$/', '$1', $current_dir_path); |
||||
|
} |
||||
|
//echo realpath($root_path); |
||||
|
//排序形式,name or size or type |
||||
|
$order = empty($_GET['order']) ? 'name' : strtolower($_GET['order']); |
||||
|
|
||||
|
//不允许使用..移动到上一级目录 |
||||
|
if (preg_match('/\.\./', $current_path)) { |
||||
|
echo 'Access is not allowed.'; |
||||
|
exit; |
||||
|
} |
||||
|
//最后一个字符不是/ |
||||
|
if (!preg_match('/\/$/', $current_path)) { |
||||
|
echo 'Parameter is not valid.'; |
||||
|
exit; |
||||
|
} |
||||
|
//目录不存在或不是目录 |
||||
|
if (!file_exists($current_path) || !is_dir($current_path)) { |
||||
|
echo 'Directory does not exist.'; |
||||
|
exit; |
||||
|
} |
||||
|
|
||||
|
//遍历目录取得文件信息 |
||||
|
$file_list = array(); |
||||
|
if ($handle = opendir($current_path)) { |
||||
|
$i = 0; |
||||
|
while (false !== ($filename = readdir($handle))) { |
||||
|
if ($filename{0} == '.') continue; |
||||
|
$file = $current_path . $filename; |
||||
|
if (is_dir($file)) { |
||||
|
$file_list[$i]['is_dir'] = true; //是否文件夹 |
||||
|
$file_list[$i]['has_file'] = (count(scandir($file)) > 2); //文件夹是否包含文件 |
||||
|
$file_list[$i]['filesize'] = 0; //文件大小 |
||||
|
$file_list[$i]['is_photo'] = false; //是否图片 |
||||
|
$file_list[$i]['filetype'] = ''; //文件类别,用扩展名判断 |
||||
|
} else { |
||||
|
$file_list[$i]['is_dir'] = false; |
||||
|
$file_list[$i]['has_file'] = false; |
||||
|
$file_list[$i]['filesize'] = filesize($file); |
||||
|
$file_list[$i]['dir_path'] = ''; |
||||
|
$file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); |
||||
|
$file_list[$i]['is_photo'] = in_array($file_ext, $ext_arr); |
||||
|
$file_list[$i]['filetype'] = $file_ext; |
||||
|
} |
||||
|
$file_list[$i]['filename'] = $filename; //文件名,包含扩展名 |
||||
|
$file_list[$i]['datetime'] = date('Y-m-d H:i:s', filemtime($file)); //文件最后修改时间 |
||||
|
$i++; |
||||
|
} |
||||
|
closedir($handle); |
||||
|
} |
||||
|
|
||||
|
//排序 |
||||
|
function cmp_func($a, $b) { |
||||
|
global $order; |
||||
|
if ($a['is_dir'] && !$b['is_dir']) { |
||||
|
return -1; |
||||
|
} else if (!$a['is_dir'] && $b['is_dir']) { |
||||
|
return 1; |
||||
|
} else { |
||||
|
if ($order == 'size') { |
||||
|
if ($a['filesize'] > $b['filesize']) { |
||||
|
return 1; |
||||
|
} else if ($a['filesize'] < $b['filesize']) { |
||||
|
return -1; |
||||
|
} else { |
||||
|
return 0; |
||||
|
} |
||||
|
} else if ($order == 'type') { |
||||
|
return strcmp($a['filetype'], $b['filetype']); |
||||
|
} else { |
||||
|
return strcmp($a['filename'], $b['filename']); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
usort($file_list, 'cmp_func'); |
||||
|
|
||||
|
$result = array(); |
||||
|
//相对于根目录的上一级目录 |
||||
|
$result['moveup_dir_path'] = $moveup_dir_path; |
||||
|
//相对于根目录的当前目录 |
||||
|
$result['current_dir_path'] = $current_dir_path; |
||||
|
//当前目录的URL |
||||
|
$result['current_url'] = $current_url; |
||||
|
//文件数 |
||||
|
$result['total_count'] = count($file_list); |
||||
|
//文件列表数组 |
||||
|
$result['file_list'] = $file_list; |
||||
|
|
||||
|
//输出JSON字符串 |
||||
|
header('Content-type: application/json; charset=UTF-8'); |
||||
|
$json = new Services_JSON(); |
||||
|
echo $json->encode($result); |
||||
@ -0,0 +1,139 @@ |
|||||
|
<?php |
||||
|
/** |
||||
|
* KindEditor PHP |
||||
|
* |
||||
|
* 本PHP程序是演示程序,建议不要直接在实际项目中使用。 |
||||
|
* 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。 |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
require_once 'JSON.php'; |
||||
|
|
||||
|
$php_path = dirname(__FILE__) . '/'; |
||||
|
$php_url = dirname($_SERVER['PHP_SELF']) . '/'; |
||||
|
|
||||
|
//文件保存目录路径 |
||||
|
$save_path = $php_path . '../attached/'; |
||||
|
//文件保存目录URL |
||||
|
$save_url = $php_url . '../attached/'; |
||||
|
//定义允许上传的文件扩展名 |
||||
|
$ext_arr = array( |
||||
|
'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'), |
||||
|
'flash' => array('swf', 'flv'), |
||||
|
'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'), |
||||
|
'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt','txt'), |
||||
|
); |
||||
|
//最大文件大小 |
||||
|
$max_size = 1000000; |
||||
|
|
||||
|
$save_path = realpath($save_path) . '/'; |
||||
|
|
||||
|
//PHP上传失败 |
||||
|
if (!empty($_FILES['imgFile']['error'])) { |
||||
|
switch($_FILES['imgFile']['error']){ |
||||
|
case '1': |
||||
|
$error = '超过php.ini允许的大小。'; |
||||
|
break; |
||||
|
case '2': |
||||
|
$error = '超过表单允许的大小。'; |
||||
|
break; |
||||
|
case '3': |
||||
|
$error = '图片只有部分被上传。'; |
||||
|
break; |
||||
|
case '4': |
||||
|
$error = '请选择图片。'; |
||||
|
break; |
||||
|
case '6': |
||||
|
$error = '找不到临时目录。'; |
||||
|
break; |
||||
|
case '7': |
||||
|
$error = '写文件到硬盘出错。'; |
||||
|
break; |
||||
|
case '8': |
||||
|
$error = 'File upload stopped by extension。'; |
||||
|
break; |
||||
|
case '999': |
||||
|
default: |
||||
|
$error = '未知错误。'; |
||||
|
} |
||||
|
alert($error); |
||||
|
} |
||||
|
|
||||
|
//有上传文件时 |
||||
|
if (empty($_FILES) === false) { |
||||
|
//原文件名 |
||||
|
$file_name = $_FILES['imgFile']['name']; |
||||
|
//服务器上临时文件名 |
||||
|
$tmp_name = $_FILES['imgFile']['tmp_name']; |
||||
|
//文件大小 |
||||
|
$file_size = $_FILES['imgFile']['size']; |
||||
|
//检查文件名 |
||||
|
if (!$file_name) { |
||||
|
alert("请选择文件。"); |
||||
|
} |
||||
|
//检查目录 |
||||
|
if (@is_dir($save_path) === false) { |
||||
|
alert("上传目录不存在。"); |
||||
|
} |
||||
|
//检查目录写权限 |
||||
|
if (@is_writable($save_path) === false) { |
||||
|
alert("上传目录没有写权限。"); |
||||
|
} |
||||
|
//检查是否已上传 |
||||
|
if (@is_uploaded_file($tmp_name) === false) { |
||||
|
alert("上传失败。"); |
||||
|
} |
||||
|
//检查文件大小 |
||||
|
if ($file_size > $max_size) { |
||||
|
alert("上传文件大小超过限制。"); |
||||
|
} |
||||
|
//检查目录名 |
||||
|
$dir_name = empty($_GET['dir']) ? 'image' : trim($_GET['dir']); |
||||
|
if (empty($ext_arr[$dir_name])) { |
||||
|
alert("目录名不正确。"); |
||||
|
} |
||||
|
//获得文件扩展名 |
||||
|
$temp_arr = explode(".", $file_name); |
||||
|
$file_ext = array_pop($temp_arr); |
||||
|
$file_ext = trim($file_ext); |
||||
|
$file_ext = strtolower($file_ext); |
||||
|
//检查扩展名 |
||||
|
if (in_array($file_ext, $ext_arr[$dir_name]) === false) { |
||||
|
alert("上传文件扩展名是不允许的扩展名。\n只允许" . implode(",", $ext_arr[$dir_name]) . "格式。"); |
||||
|
} |
||||
|
//创建文件夹 |
||||
|
if ($dir_name !== '') { |
||||
|
$save_path .= $dir_name . "/"; |
||||
|
$save_url .= $dir_name . "/"; |
||||
|
if (!file_exists($save_path)) { |
||||
|
mkdir($save_path); |
||||
|
} |
||||
|
} |
||||
|
$ymd = date("Ymd"); |
||||
|
$save_path .= $ymd . "/"; |
||||
|
$save_url .= $ymd . "/"; |
||||
|
if (!file_exists($save_path)) { |
||||
|
mkdir($save_path); |
||||
|
} |
||||
|
//新文件名 |
||||
|
$new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $file_ext; |
||||
|
//移动文件 |
||||
|
$file_path = $save_path . $new_file_name; |
||||
|
if (move_uploaded_file($tmp_name, $file_path) === false) { |
||||
|
alert("上传文件失败。"); |
||||
|
} |
||||
|
@chmod($file_path, 0644); |
||||
|
$file_url = $save_url . $new_file_name; |
||||
|
|
||||
|
header('Content-type: text/html; charset=UTF-8'); |
||||
|
$json = new Services_JSON(); |
||||
|
echo $json->encode(array('error' => 0, 'url' => $file_url)); |
||||
|
exit; |
||||
|
} |
||||
|
|
||||
|
function alert($msg) { |
||||
|
header('Content-type: text/html; charset=UTF-8'); |
||||
|
$json = new Services_JSON(); |
||||
|
echo $json->encode(array('error' => 1, 'message' => $msg)); |
||||
|
exit; |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('anchor', function(K) { |
||||
|
var self = this, name = 'anchor', lang = self.lang(name + '.'); |
||||
|
self.plugin.anchor = { |
||||
|
edit : function() { |
||||
|
var html = ['<div style="padding:20px;">', |
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keName">' + lang.name + '</label>', |
||||
|
'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />', |
||||
|
'</div>', |
||||
|
'</div>'].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 300, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
var div = dialog.div, |
||||
|
nameBox = K('input[name="name"]', div); |
||||
|
var img = self.plugin.getSelectedAnchor(); |
||||
|
if (img) { |
||||
|
nameBox.val(unescape(img.attr('data-ke-name'))); |
||||
|
} |
||||
|
nameBox[0].focus(); |
||||
|
nameBox[0].select(); |
||||
|
}, |
||||
|
'delete' : function() { |
||||
|
self.plugin.getSelectedAnchor().remove(); |
||||
|
} |
||||
|
}; |
||||
|
self.clickToolbar(name, self.plugin.anchor.edit); |
||||
|
}); |
||||
@ -0,0 +1,54 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('autoheight', function(K) { |
||||
|
var self = this; |
||||
|
|
||||
|
if (!self.autoHeightMode) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var minHeight; |
||||
|
|
||||
|
function hideScroll() { |
||||
|
var edit = self.edit; |
||||
|
var body = edit.doc.body; |
||||
|
edit.iframe[0].scroll = 'no'; |
||||
|
body.style.overflowY = 'hidden'; |
||||
|
} |
||||
|
|
||||
|
function resetHeight() { |
||||
|
var edit = self.edit; |
||||
|
var body = edit.doc.body; |
||||
|
edit.iframe.height(minHeight); |
||||
|
self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight)); |
||||
|
} |
||||
|
|
||||
|
function init() { |
||||
|
minHeight = K.removeUnit(self.height); |
||||
|
|
||||
|
self.edit.afterChange(resetHeight); |
||||
|
hideScroll(); |
||||
|
resetHeight(); |
||||
|
} |
||||
|
|
||||
|
if (self.isCreated) { |
||||
|
init(); |
||||
|
} else { |
||||
|
self.afterCreate(init); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
/* |
||||
|
* 如何实现真正的自动高度? |
||||
|
* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。 |
||||
|
* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。 |
||||
|
* 由此就实现了真正的自动高度 |
||||
|
* 测试:chrome、firefox、IE9、IE8 |
||||
|
* */ |
||||
@ -0,0 +1,93 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
|
||||
|
|
||||
|
KindEditor.plugin('baidumap', function(K) { |
||||
|
var self = this, name = 'baidumap', lang = self.lang(name + '.'); |
||||
|
var mapWidth = K.undef(self.mapWidth, 558); |
||||
|
var mapHeight = K.undef(self.mapHeight, 360); |
||||
|
self.clickToolbar(name, function() { |
||||
|
var html = ['<div style="padding:10px 20px;">', |
||||
|
'<div class="ke-header">', |
||||
|
// left start
|
||||
|
'<div class="ke-left">', |
||||
|
lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ', |
||||
|
'<span class="ke-button-common ke-button-outer">', |
||||
|
'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />', |
||||
|
'</span>', |
||||
|
'</div>', |
||||
|
// right start
|
||||
|
'<div class="ke-right">', |
||||
|
'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" value="1" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>', |
||||
|
'</div>', |
||||
|
'<div class="ke-clearfix"></div>', |
||||
|
'</div>', |
||||
|
'<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>', |
||||
|
'</div>'].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : mapWidth + 42, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var map = win.map; |
||||
|
var centerObj = map.getCenter(); |
||||
|
var center = centerObj.lng + ',' + centerObj.lat; |
||||
|
var zoom = map.getZoom(); |
||||
|
var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'http://api.map.baidu.com/staticimage', |
||||
|
'?center=' + encodeURIComponent(center), |
||||
|
'&zoom=' + encodeURIComponent(zoom), |
||||
|
'&width=' + mapWidth, |
||||
|
'&height=' + mapHeight, |
||||
|
'&markers=' + encodeURIComponent(center), |
||||
|
'&markerStyles=' + encodeURIComponent('l,A')].join(''); |
||||
|
if (checkbox[0].checked) { |
||||
|
self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>'); |
||||
|
} else { |
||||
|
self.exec('insertimage', url); |
||||
|
} |
||||
|
self.hideDialog().focus(); |
||||
|
} |
||||
|
}, |
||||
|
beforeRemove : function() { |
||||
|
searchBtn.remove(); |
||||
|
if (doc) { |
||||
|
doc.write(''); |
||||
|
} |
||||
|
iframe.remove(); |
||||
|
} |
||||
|
}); |
||||
|
var div = dialog.div, |
||||
|
addressBox = K('[name="address"]', div), |
||||
|
searchBtn = K('[name="searchBtn"]', div), |
||||
|
checkbox = K('[name="insertDynamicMap"]', dialog.div), |
||||
|
win, doc; |
||||
|
var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>'); |
||||
|
function ready() { |
||||
|
win = iframe[0].contentWindow; |
||||
|
doc = K.iframeDoc(iframe); |
||||
|
} |
||||
|
iframe.bind('load', function() { |
||||
|
iframe.unbind('load'); |
||||
|
if (K.IE) { |
||||
|
ready(); |
||||
|
} else { |
||||
|
setTimeout(ready, 0); |
||||
|
} |
||||
|
}); |
||||
|
K('.ke-map', div).replaceWith(iframe); |
||||
|
// search map
|
||||
|
searchBtn.click(function() { |
||||
|
win.search(addressBox.val()); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,83 @@ |
|||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
||||
|
<html xmlns="http://www.w3.org/1999/xhtml"> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
<meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具" /> |
||||
|
<meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图" /> |
||||
|
<title>百度地图API自定义地图</title> |
||||
|
<!--引用百度地图API--> |
||||
|
<style type="text/css"> |
||||
|
html,body{margin:0;padding:0;} |
||||
|
.iw_poi_title {color:#CC5522;font-size:14px;font-weight:bold;overflow:hidden;padding-right:13px;white-space:nowrap} |
||||
|
.iw_poi_content {font:12px arial,sans-serif;overflow:visible;padding-top:4px;white-space:-moz-pre-wrap;word-wrap:break-word} |
||||
|
</style> |
||||
|
<script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script> |
||||
|
</head> |
||||
|
|
||||
|
<body onload="initMap();"> |
||||
|
<!--百度地图容器--> |
||||
|
<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div> |
||||
|
</body> |
||||
|
<script type="text/javascript"> |
||||
|
function getParam(name) { |
||||
|
return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : ''; |
||||
|
} |
||||
|
var centerParam = getParam('center'); |
||||
|
var zoomParam = getParam('zoom'); |
||||
|
var widthParam = getParam('width'); |
||||
|
var heightParam = getParam('height'); |
||||
|
var markersParam = getParam('markers'); |
||||
|
var markerStylesParam = getParam('markerStyles'); |
||||
|
|
||||
|
//创建和初始化地图函数: |
||||
|
function initMap(){ |
||||
|
// [FF]切换模式后报错 |
||||
|
if (!window.BMap) { |
||||
|
return; |
||||
|
} |
||||
|
var dituContent = document.getElementById('dituContent'); |
||||
|
dituContent.style.width = widthParam + 'px'; |
||||
|
dituContent.style.height = heightParam + 'px'; |
||||
|
|
||||
|
createMap();//创建地图 |
||||
|
setMapEvent();//设置地图事件 |
||||
|
addMapControl();//向地图添加控件 |
||||
|
|
||||
|
// 创建标注 |
||||
|
var markersArr = markersParam.split(','); |
||||
|
var point = new BMap.Point(markersArr[0], markersArr[1]); |
||||
|
var marker = new BMap.Marker(point); |
||||
|
map.addOverlay(marker); // 将标注添加到地图中 |
||||
|
} |
||||
|
|
||||
|
//创建地图函数: |
||||
|
function createMap(){ |
||||
|
var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图 |
||||
|
var centerArr = centerParam.split(','); |
||||
|
var point = new BMap.Point(centerArr[0], centerArr[1]);//定义一个中心点坐标 |
||||
|
map.centerAndZoom(point, zoomParam);//设定地图的中心点和坐标并将地图显示在地图容器中 |
||||
|
window.map = map;//将map变量存储在全局 |
||||
|
} |
||||
|
|
||||
|
//地图事件设置函数: |
||||
|
function setMapEvent(){ |
||||
|
map.enableDragging();//启用地图拖拽事件,默认启用(可不写) |
||||
|
map.enableScrollWheelZoom();//启用地图滚轮放大缩小 |
||||
|
map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写) |
||||
|
map.enableKeyboard();//启用键盘上下左右键移动地图 |
||||
|
} |
||||
|
|
||||
|
//地图控件添加函数: |
||||
|
function addMapControl(){ |
||||
|
//向地图中添加缩放控件 |
||||
|
var ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_LEFT,type:BMAP_NAVIGATION_CONTROL_LARGE}); |
||||
|
map.addControl(ctrl_nav); |
||||
|
//向地图中添加缩略图控件 |
||||
|
var ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:1}); |
||||
|
map.addControl(ctrl_ove); |
||||
|
//向地图中添加比例尺控件 |
||||
|
var ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT}); |
||||
|
map.addControl(ctrl_sca); |
||||
|
} |
||||
|
</script> |
||||
|
</html> |
||||
@ -0,0 +1,43 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
<title>Baidu Maps</title> |
||||
|
<style> |
||||
|
html { height: 100% } |
||||
|
body { height: 100%; margin: 0; padding: 0; background-color: #FFF } |
||||
|
</style> |
||||
|
<script charset="utf-8" src="http://api.map.baidu.com/api?v=1.3"></script> |
||||
|
<script> |
||||
|
var map, geocoder; |
||||
|
function initialize() { |
||||
|
map = new BMap.Map('map_canvas'); |
||||
|
var point = new BMap.Point(121.473704, 31.230393); |
||||
|
map.centerAndZoom(point, 11); |
||||
|
map.addControl(new BMap.NavigationControl()); |
||||
|
map.enableScrollWheelZoom(); |
||||
|
|
||||
|
var gc = new BMap.Geocoder(); |
||||
|
gc.getLocation(point, function(rs){ |
||||
|
var addComp = rs.addressComponents; |
||||
|
var address = [addComp.city].join(''); |
||||
|
parent.document.getElementById("kindeditor_plugin_map_address").value = address; |
||||
|
}); |
||||
|
} |
||||
|
function search(address) { |
||||
|
if (!map) return; |
||||
|
var local = new BMap.LocalSearch(map, { |
||||
|
renderOptions: { |
||||
|
map: map, |
||||
|
autoViewport: true, |
||||
|
selectFirstResult: false |
||||
|
} |
||||
|
}); |
||||
|
local.search(address); |
||||
|
} |
||||
|
</script> |
||||
|
</head> |
||||
|
<body onload="initialize();"> |
||||
|
<div id="map_canvas" style="width:100%; height:100%"></div> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,29 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('clearhtml', function(K) { |
||||
|
var self = this, name = 'clearhtml'; |
||||
|
self.clickToolbar(name, function() { |
||||
|
self.focus(); |
||||
|
var html = self.html(); |
||||
|
html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, ''); |
||||
|
html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, ''); |
||||
|
html = K.formatHtml(html, { |
||||
|
a : ['href', 'target'], |
||||
|
embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'], |
||||
|
img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'], |
||||
|
table : ['border'], |
||||
|
'td,th' : ['rowspan', 'colspan'], |
||||
|
'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [] |
||||
|
}); |
||||
|
self.html(html); |
||||
|
self.cmd.selection(true); |
||||
|
self.addBookmark(); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,62 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
// google code prettify: http://google-code-prettify.googlecode.com/
|
||||
|
// http://google-code-prettify.googlecode.com/
|
||||
|
|
||||
|
KindEditor.plugin('code', function(K) { |
||||
|
var self = this, name = 'code'; |
||||
|
self.clickToolbar(name, function() { |
||||
|
var lang = self.lang(name + '.'), |
||||
|
html = ['<div style="padding:10px 20px;">', |
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<select class="ke-code-type">', |
||||
|
'<option value="js">JavaScript</option>', |
||||
|
'<option value="html">HTML</option>', |
||||
|
'<option value="css">CSS</option>', |
||||
|
'<option value="php">PHP</option>', |
||||
|
'<option value="pl">Perl</option>', |
||||
|
'<option value="py">Python</option>', |
||||
|
'<option value="rb">Ruby</option>', |
||||
|
'<option value="java">Java</option>', |
||||
|
'<option value="vb">ASP/VB</option>', |
||||
|
'<option value="cpp">C/C++</option>', |
||||
|
'<option value="cs">C#</option>', |
||||
|
'<option value="xml">XML</option>', |
||||
|
'<option value="bsh">Shell</option>', |
||||
|
'<option value="">Other</option>', |
||||
|
'</select>', |
||||
|
'</div>', |
||||
|
'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>', |
||||
|
'</div>'].join(''), |
||||
|
dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var type = K('.ke-code-type', dialog.div).val(), |
||||
|
code = textarea.val(), |
||||
|
cls = type === '' ? '' : ' lang-' + type, |
||||
|
html = '<pre class="prettyprint' + cls + '">\n' + K.escape(code) + '</pre> '; |
||||
|
if (K.trim(code) === '') { |
||||
|
alert(lang.pleaseInput); |
||||
|
textarea[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
self.insertHtml(html).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
textarea = K('textarea', dialog.div); |
||||
|
textarea[0].focus(); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,13 @@ |
|||||
|
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} |
||||
|
|
||||
|
pre.prettyprint { |
||||
|
border: 0; |
||||
|
border-left: 3px solid rgb(204, 204, 204); |
||||
|
margin-left: 2em; |
||||
|
padding: 0.5em; |
||||
|
font-size: 110%; |
||||
|
display: block; |
||||
|
font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; |
||||
|
margin: 1em 0px; |
||||
|
white-space: pre; |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; |
||||
|
(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= |
||||
|
[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c< |
||||
|
f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&& |
||||
|
(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r= |
||||
|
{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length, |
||||
|
t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b=== |
||||
|
"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), |
||||
|
l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, |
||||
|
q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, |
||||
|
q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, |
||||
|
"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), |
||||
|
a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} |
||||
|
for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value", |
||||
|
m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m= |
||||
|
a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue= |
||||
|
j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], |
||||
|
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], |
||||
|
H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], |
||||
|
J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ |
||||
|
I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), |
||||
|
["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", |
||||
|
/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), |
||||
|
["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", |
||||
|
hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b= |
||||
|
!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m, |
||||
|
250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit", |
||||
|
PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})(); |
||||
@ -0,0 +1,189 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('filemanager', function(K) { |
||||
|
var self = this, name = 'filemanager', |
||||
|
fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'), |
||||
|
imgPath = self.pluginsPath + name + '/images/', |
||||
|
lang = self.lang(name + '.'); |
||||
|
function makeFileTitle(filename, filesize, datetime) { |
||||
|
return filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')'; |
||||
|
} |
||||
|
function bindTitle(el, data) { |
||||
|
if (data.is_dir) { |
||||
|
el.attr('title', data.filename); |
||||
|
} else { |
||||
|
el.attr('title', makeFileTitle(data.filename, data.filesize, data.datetime)); |
||||
|
} |
||||
|
} |
||||
|
self.plugin.filemanagerDialog = function(options) { |
||||
|
var width = K.undef(options.width, 650), |
||||
|
height = K.undef(options.height, 510), |
||||
|
dirName = K.undef(options.dirName, ''), |
||||
|
viewType = K.undef(options.viewType, 'VIEW').toUpperCase(), // "LIST" or "VIEW"
|
||||
|
clickFn = options.clickFn; |
||||
|
var html = [ |
||||
|
'<div style="padding:10px 20px;">', |
||||
|
// header start
|
||||
|
'<div class="ke-plugin-filemanager-header">', |
||||
|
// left start
|
||||
|
'<div class="ke-left">', |
||||
|
'<img class="ke-inline-block" name="moveupImg" src="' + imgPath + 'go-up.gif" width="16" height="16" border="0" alt="" /> ', |
||||
|
'<a class="ke-inline-block" name="moveupLink" href="javascript:;">' + lang.moveup + '</a>', |
||||
|
'</div>', |
||||
|
// right start
|
||||
|
'<div class="ke-right">', |
||||
|
lang.viewType + ' <select class="ke-inline-block" name="viewType">', |
||||
|
'<option value="VIEW">' + lang.viewImage + '</option>', |
||||
|
'<option value="LIST">' + lang.listImage + '</option>', |
||||
|
'</select> ', |
||||
|
lang.orderType + ' <select class="ke-inline-block" name="orderType">', |
||||
|
'<option value="NAME">' + lang.fileName + '</option>', |
||||
|
'<option value="SIZE">' + lang.fileSize + '</option>', |
||||
|
'<option value="TYPE">' + lang.fileType + '</option>', |
||||
|
'</select>', |
||||
|
'</div>', |
||||
|
'<div class="ke-clearfix"></div>', |
||||
|
'</div>', |
||||
|
// body start
|
||||
|
'<div class="ke-plugin-filemanager-body"></div>', |
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : width, |
||||
|
height : height, |
||||
|
title : self.lang(name), |
||||
|
body : html |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
bodyDiv = K('.ke-plugin-filemanager-body', div), |
||||
|
moveupImg = K('[name="moveupImg"]', div), |
||||
|
moveupLink = K('[name="moveupLink"]', div), |
||||
|
viewServerBtn = K('[name="viewServer"]', div), |
||||
|
viewTypeBox = K('[name="viewType"]', div), |
||||
|
orderTypeBox = K('[name="orderType"]', div); |
||||
|
function reloadPage(path, order, func) { |
||||
|
var param = 'path=' + path + '&order=' + order + '&dir=' + dirName; |
||||
|
dialog.showLoading(self.lang('ajaxLoading')); |
||||
|
K.ajax(K.addParam(fileManagerJson, param + '&' + new Date().getTime()), function(data) { |
||||
|
dialog.hideLoading(); |
||||
|
func(data); |
||||
|
}); |
||||
|
} |
||||
|
var elList = []; |
||||
|
function bindEvent(el, result, data, createFunc) { |
||||
|
var fileUrl = K.formatUrl(result.current_url + data.filename, 'absolute'), |
||||
|
dirPath = encodeURIComponent(result.current_dir_path + data.filename + '/'); |
||||
|
if (data.is_dir) { |
||||
|
el.click(function(e) { |
||||
|
reloadPage(dirPath, orderTypeBox.val(), createFunc); |
||||
|
}); |
||||
|
} else if (data.is_photo) { |
||||
|
el.click(function(e) { |
||||
|
clickFn.call(this, fileUrl, data.filename); |
||||
|
}); |
||||
|
} else { |
||||
|
el.click(function(e) { |
||||
|
clickFn.call(this, fileUrl, data.filename); |
||||
|
}); |
||||
|
} |
||||
|
elList.push(el); |
||||
|
} |
||||
|
function createCommon(result, createFunc) { |
||||
|
// remove events
|
||||
|
K.each(elList, function() { |
||||
|
this.unbind(); |
||||
|
}); |
||||
|
moveupLink.unbind(); |
||||
|
viewTypeBox.unbind(); |
||||
|
orderTypeBox.unbind(); |
||||
|
// add events
|
||||
|
if (result.current_dir_path) { |
||||
|
moveupLink.click(function(e) { |
||||
|
reloadPage(result.moveup_dir_path, orderTypeBox.val(), createFunc); |
||||
|
}); |
||||
|
} |
||||
|
function changeFunc() { |
||||
|
if (viewTypeBox.val() == 'VIEW') { |
||||
|
reloadPage(result.current_dir_path, orderTypeBox.val(), createView); |
||||
|
} else { |
||||
|
reloadPage(result.current_dir_path, orderTypeBox.val(), createList); |
||||
|
} |
||||
|
} |
||||
|
viewTypeBox.change(changeFunc); |
||||
|
orderTypeBox.change(changeFunc); |
||||
|
bodyDiv.html(''); |
||||
|
} |
||||
|
function createList(result) { |
||||
|
createCommon(result, createList); |
||||
|
var table = document.createElement('table'); |
||||
|
table.className = 'ke-table'; |
||||
|
table.cellPadding = 0; |
||||
|
table.cellSpacing = 0; |
||||
|
table.border = 0; |
||||
|
bodyDiv.append(table); |
||||
|
var fileList = result.file_list; |
||||
|
for (var i = 0, len = fileList.length; i < len; i++) { |
||||
|
var data = fileList[i], row = K(table.insertRow(i)); |
||||
|
row.mouseover(function(e) { |
||||
|
K(this).addClass('ke-on'); |
||||
|
}) |
||||
|
.mouseout(function(e) { |
||||
|
K(this).removeClass('ke-on'); |
||||
|
}); |
||||
|
var iconUrl = imgPath + (data.is_dir ? 'folder-16.gif' : 'file-16.gif'), |
||||
|
img = K('<img src="' + iconUrl + '" width="16" height="16" alt="' + data.filename + '" align="absmiddle" />'), |
||||
|
cell0 = K(row[0].insertCell(0)).addClass('ke-cell ke-name').append(img).append(document.createTextNode(' ' + data.filename)); |
||||
|
if (!data.is_dir || data.has_file) { |
||||
|
row.css('cursor', 'pointer'); |
||||
|
cell0.attr('title', data.filename); |
||||
|
bindEvent(cell0, result, data, createList); |
||||
|
} else { |
||||
|
cell0.attr('title', lang.emptyFolder); |
||||
|
} |
||||
|
K(row[0].insertCell(1)).addClass('ke-cell ke-size').html(data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB'); |
||||
|
K(row[0].insertCell(2)).addClass('ke-cell ke-datetime').html(data.datetime); |
||||
|
} |
||||
|
} |
||||
|
function createView(result) { |
||||
|
createCommon(result, createView); |
||||
|
var fileList = result.file_list; |
||||
|
for (var i = 0, len = fileList.length; i < len; i++) { |
||||
|
var data = fileList[i], |
||||
|
div = K('<div class="ke-inline-block ke-item"></div>'); |
||||
|
bodyDiv.append(div); |
||||
|
var photoDiv = K('<div class="ke-inline-block ke-photo"></div>') |
||||
|
.mouseover(function(e) { |
||||
|
K(this).addClass('ke-on'); |
||||
|
}) |
||||
|
.mouseout(function(e) { |
||||
|
K(this).removeClass('ke-on'); |
||||
|
}); |
||||
|
div.append(photoDiv); |
||||
|
var fileUrl = result.current_url + data.filename, |
||||
|
iconUrl = data.is_dir ? imgPath + 'folder-64.gif' : (data.is_photo ? fileUrl : imgPath + 'file-64.gif'); |
||||
|
var img = K('<img src="' + iconUrl + '" width="80" height="80" alt="' + data.filename + '" />'); |
||||
|
if (!data.is_dir || data.has_file) { |
||||
|
photoDiv.css('cursor', 'pointer'); |
||||
|
bindTitle(photoDiv, data); |
||||
|
bindEvent(photoDiv, result, data, createView); |
||||
|
} else { |
||||
|
photoDiv.attr('title', lang.emptyFolder); |
||||
|
} |
||||
|
photoDiv.append(img); |
||||
|
div.append('<div class="ke-name" title="' + data.filename + '">' + data.filename + '</div>'); |
||||
|
} |
||||
|
} |
||||
|
viewTypeBox.val(viewType); |
||||
|
reloadPage('', orderTypeBox.val(), viewType == 'VIEW' ? createView : createList); |
||||
|
return dialog; |
||||
|
} |
||||
|
|
||||
|
}); |
||||
|
After Width: | Height: | Size: 170 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 226 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 562 B |
@ -0,0 +1,35 @@ |
|||||
|
/** |
||||
|
* Created by chenyihong on 14/12/4. |
||||
|
*/ |
||||
|
|
||||
|
KindEditor.plugin('fixtoolbar', function (K) { |
||||
|
var self = this; |
||||
|
if (!self.fixToolBar) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
function init() { |
||||
|
var toolbar = K('.ke-toolbar'); |
||||
|
var originY = toolbar.pos().y; |
||||
|
K(window).bind('scroll', function () { |
||||
|
if (toolbar.css('position') == 'fixed') { |
||||
|
if(document.body.scrollTop - originY < 0){ |
||||
|
toolbar.css('position', 'static'); |
||||
|
toolbar.css('top', 'auto'); |
||||
|
} |
||||
|
} else { |
||||
|
if (toolbar.pos().y - document.body.scrollTop < 0) { |
||||
|
toolbar.css('position', 'fixed'); |
||||
|
toolbar.css('top', 0); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
if (self.isCreated) { |
||||
|
init(); |
||||
|
} else { |
||||
|
self.afterCreate(init); |
||||
|
} |
||||
|
|
||||
|
}); |
||||
@ -0,0 +1,161 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('flash', function(K) { |
||||
|
var self = this, name = 'flash', lang = self.lang(name + '.'), |
||||
|
allowFlashUpload = K.undef(self.allowFlashUpload, true), |
||||
|
allowFileManager = K.undef(self.allowFileManager, false), |
||||
|
formatUploadUrl = K.undef(self.formatUploadUrl, true), |
||||
|
extraParams = K.undef(self.extraFileUploadParams, {}), |
||||
|
filePostName = K.undef(self.filePostName, 'imgFile'), |
||||
|
uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'); |
||||
|
self.plugin.flash = { |
||||
|
edit : function() { |
||||
|
var html = [ |
||||
|
'<div style="padding:20px;">', |
||||
|
//url
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keUrl" style="width:60px;">' + lang.url + '</label>', |
||||
|
'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> ', |
||||
|
'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> ', |
||||
|
'<span class="ke-button-common ke-button-outer">', |
||||
|
'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />', |
||||
|
'</span>', |
||||
|
'</div>', |
||||
|
//width
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keWidth" style="width:60px;">' + lang.width + '</label>', |
||||
|
'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ', |
||||
|
'</div>', |
||||
|
//height
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keHeight" style="width:60px;">' + lang.height + '</label>', |
||||
|
'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ', |
||||
|
'</div>', |
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var url = K.trim(urlBox.val()), |
||||
|
width = widthBox.val(), |
||||
|
height = heightBox.val(); |
||||
|
if (url == 'http://' || K.invalidUrl(url)) { |
||||
|
alert(self.lang('invalidUrl')); |
||||
|
urlBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(width)) { |
||||
|
alert(self.lang('invalidWidth')); |
||||
|
widthBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(height)) { |
||||
|
alert(self.lang('invalidHeight')); |
||||
|
heightBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
var html = K.mediaImg(self.themesPath + 'common/blank.gif', { |
||||
|
src : url, |
||||
|
type : K.mediaType('.swf'), |
||||
|
width : width, |
||||
|
height : height, |
||||
|
quality : 'high' |
||||
|
}); |
||||
|
self.insertHtml(html).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
urlBox = K('[name="url"]', div), |
||||
|
viewServerBtn = K('[name="viewServer"]', div), |
||||
|
widthBox = K('[name="width"]', div), |
||||
|
heightBox = K('[name="height"]', div); |
||||
|
urlBox.val('http://'); |
||||
|
|
||||
|
if (allowFlashUpload) { |
||||
|
var uploadbutton = K.uploadbutton({ |
||||
|
button : K('.ke-upload-button', div)[0], |
||||
|
fieldName : filePostName, |
||||
|
extraParams : extraParams, |
||||
|
url : K.addParam(uploadJson, 'dir=flash'), |
||||
|
afterUpload : function(data) { |
||||
|
dialog.hideLoading(); |
||||
|
if (data.error === 0) { |
||||
|
var url = data.url; |
||||
|
if (formatUploadUrl) { |
||||
|
url = K.formatUrl(url, 'absolute'); |
||||
|
} |
||||
|
urlBox.val(url); |
||||
|
if (self.afterUpload) { |
||||
|
self.afterUpload.call(self, url, data, name); |
||||
|
} |
||||
|
alert(self.lang('uploadSuccess')); |
||||
|
} else { |
||||
|
alert(data.message); |
||||
|
} |
||||
|
}, |
||||
|
afterError : function(html) { |
||||
|
dialog.hideLoading(); |
||||
|
self.errorDialog(html); |
||||
|
} |
||||
|
}); |
||||
|
uploadbutton.fileBox.change(function(e) { |
||||
|
dialog.showLoading(self.lang('uploadLoading')); |
||||
|
uploadbutton.submit(); |
||||
|
}); |
||||
|
} else { |
||||
|
K('.ke-upload-button', div).hide(); |
||||
|
} |
||||
|
|
||||
|
if (allowFileManager) { |
||||
|
viewServerBtn.click(function(e) { |
||||
|
self.loadPlugin('filemanager', function() { |
||||
|
self.plugin.filemanagerDialog({ |
||||
|
viewType : 'LIST', |
||||
|
dirName : 'flash', |
||||
|
clickFn : function(url, title) { |
||||
|
if (self.dialogs.length > 1) { |
||||
|
K('[name="url"]', div).val(url); |
||||
|
if (self.afterSelectFile) { |
||||
|
self.afterSelectFile.call(self, url); |
||||
|
} |
||||
|
self.hideDialog(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
} else { |
||||
|
viewServerBtn.hide(); |
||||
|
} |
||||
|
|
||||
|
var img = self.plugin.getSelectedFlash(); |
||||
|
if (img) { |
||||
|
var attrs = K.mediaAttrs(img.attr('data-ke-tag')); |
||||
|
urlBox.val(attrs.src); |
||||
|
widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0); |
||||
|
heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0); |
||||
|
} |
||||
|
urlBox[0].focus(); |
||||
|
urlBox[0].select(); |
||||
|
}, |
||||
|
'delete' : function() { |
||||
|
self.plugin.getSelectedFlash().remove(); |
||||
|
// [IE] 删除图片后立即点击图片按钮出错
|
||||
|
self.addBookmark(); |
||||
|
} |
||||
|
}; |
||||
|
self.clickToolbar(name, self.plugin.flash.edit); |
||||
|
}); |
||||
@ -0,0 +1,328 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('image', function(K) { |
||||
|
var self = this, name = 'image', |
||||
|
allowImageUpload = K.undef(self.allowImageUpload, true), |
||||
|
allowImageRemote = K.undef(self.allowImageRemote, true), |
||||
|
formatUploadUrl = K.undef(self.formatUploadUrl, true), |
||||
|
allowFileManager = K.undef(self.allowFileManager, false), |
||||
|
uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'), |
||||
|
imageTabIndex = K.undef(self.imageTabIndex, 0), |
||||
|
imgPath = self.pluginsPath + 'image/images/', |
||||
|
extraParams = K.undef(self.extraFileUploadParams, {}), |
||||
|
filePostName = K.undef(self.filePostName, 'imgFile'), |
||||
|
fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false), |
||||
|
lang = self.lang(name + '.'); |
||||
|
|
||||
|
self.plugin.imageDialog = function(options) { |
||||
|
var imageUrl = options.imageUrl, |
||||
|
imageWidth = K.undef(options.imageWidth, ''), |
||||
|
imageHeight = K.undef(options.imageHeight, ''), |
||||
|
imageTitle = K.undef(options.imageTitle, ''), |
||||
|
imageAlign = K.undef(options.imageAlign, ''), |
||||
|
showRemote = K.undef(options.showRemote, true), |
||||
|
showLocal = K.undef(options.showLocal, true), |
||||
|
tabIndex = K.undef(options.tabIndex, 0), |
||||
|
clickFn = options.clickFn; |
||||
|
var target = 'kindeditor_upload_iframe_' + new Date().getTime(); |
||||
|
var hiddenElements = []; |
||||
|
for(var k in extraParams){ |
||||
|
hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />'); |
||||
|
} |
||||
|
var html = [ |
||||
|
'<div style="padding:20px;">', |
||||
|
//tabs
|
||||
|
'<div class="tabs"></div>', |
||||
|
//remote image - start
|
||||
|
'<div class="tab1" style="display:none;">', |
||||
|
//url
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="remoteUrl" style="width:60px;">' + lang.remoteUrl + '</label>', |
||||
|
'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:200px;" /> ', |
||||
|
'<span class="ke-button-common ke-button-outer">', |
||||
|
'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />', |
||||
|
'</span>', |
||||
|
'</div>', |
||||
|
//size
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="remoteWidth" style="width:60px;">' + lang.size + '</label>', |
||||
|
lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ', |
||||
|
lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ', |
||||
|
'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />', |
||||
|
'</div>', |
||||
|
//align
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label style="width:60px;">' + lang.align + '</label>', |
||||
|
'<input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> <img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" />', |
||||
|
' <input type="radio" name="align" class="ke-inline-block" value="left" /> <img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" />', |
||||
|
' <input type="radio" name="align" class="ke-inline-block" value="right" /> <img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" />', |
||||
|
'</div>', |
||||
|
//title
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="remoteTitle" style="width:60px;">' + lang.imgTitle + '</label>', |
||||
|
'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:200px;" />', |
||||
|
'</div>', |
||||
|
'</div>', |
||||
|
//remote image - end
|
||||
|
//local upload - start
|
||||
|
'<div class="tab2" style="display:none;">', |
||||
|
'<iframe name="' + target + '" style="display:none;"></iframe>', |
||||
|
'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'dir=image') + '">', |
||||
|
//file
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
hiddenElements.join(''), |
||||
|
'<label style="width:60px;">' + lang.localUrl + '</label>', |
||||
|
'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" /> ', |
||||
|
'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />', |
||||
|
'</div>', |
||||
|
'</form>', |
||||
|
'</div>', |
||||
|
//local upload - end
|
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var dialogWidth = showLocal || allowFileManager ? 450 : 400, |
||||
|
dialogHeight = showLocal && showRemote ? 300 : 250; |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : dialogWidth, |
||||
|
height : dialogHeight, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
|
||||
|
if (dialog.isLoading) { |
||||
|
return; |
||||
|
} |
||||
|
// insert local image
|
||||
|
if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) { |
||||
|
if (uploadbutton.fileBox.val() == '') { |
||||
|
alert(self.lang('pleaseSelectFile')); |
||||
|
return; |
||||
|
} |
||||
|
dialog.showLoading(self.lang('uploadLoading')); |
||||
|
uploadbutton.submit(); |
||||
|
localUrlBox.val(''); |
||||
|
return; |
||||
|
} |
||||
|
// insert remote image
|
||||
|
var url = K.trim(urlBox.val()), |
||||
|
width = widthBox.val(), |
||||
|
height = heightBox.val(), |
||||
|
title = titleBox.val(), |
||||
|
align = ''; |
||||
|
alignBox.each(function() { |
||||
|
if (this.checked) { |
||||
|
align = this.value; |
||||
|
return false; |
||||
|
} |
||||
|
}); |
||||
|
if (url == 'http://' || K.invalidUrl(url)) { |
||||
|
alert(self.lang('invalidUrl')); |
||||
|
urlBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(width)) { |
||||
|
alert(self.lang('invalidWidth')); |
||||
|
widthBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(height)) { |
||||
|
alert(self.lang('invalidHeight')); |
||||
|
heightBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
clickFn.call(self, url, title, width, height, 0, align); |
||||
|
} |
||||
|
}, |
||||
|
beforeRemove : function() { |
||||
|
viewServerBtn.unbind(); |
||||
|
widthBox.unbind(); |
||||
|
heightBox.unbind(); |
||||
|
refreshBtn.unbind(); |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div; |
||||
|
|
||||
|
var urlBox = K('[name="url"]', div), |
||||
|
localUrlBox = K('[name="localUrl"]', div), |
||||
|
viewServerBtn = K('[name="viewServer"]', div), |
||||
|
widthBox = K('.tab1 [name="width"]', div), |
||||
|
heightBox = K('.tab1 [name="height"]', div), |
||||
|
refreshBtn = K('.ke-refresh-btn', div), |
||||
|
titleBox = K('.tab1 [name="title"]', div), |
||||
|
alignBox = K('.tab1 [name="align"]', div); |
||||
|
|
||||
|
var tabs; |
||||
|
if (showRemote && showLocal) { |
||||
|
tabs = K.tabs({ |
||||
|
src : K('.tabs', div), |
||||
|
afterSelect : function(i) {} |
||||
|
}); |
||||
|
tabs.add({ |
||||
|
title : lang.remoteImage, |
||||
|
panel : K('.tab1', div) |
||||
|
}); |
||||
|
tabs.add({ |
||||
|
title : lang.localImage, |
||||
|
panel : K('.tab2', div) |
||||
|
}); |
||||
|
tabs.select(tabIndex); |
||||
|
} else if (showRemote) { |
||||
|
K('.tab1', div).show(); |
||||
|
} else if (showLocal) { |
||||
|
K('.tab2', div).show(); |
||||
|
} |
||||
|
|
||||
|
var uploadbutton = K.uploadbutton({ |
||||
|
button : K('.ke-upload-button', div)[0], |
||||
|
fieldName : filePostName, |
||||
|
form : K('.ke-form', div), |
||||
|
target : target, |
||||
|
width: 60, |
||||
|
afterUpload : function(data) { |
||||
|
dialog.hideLoading(); |
||||
|
if (data.error === 0) { |
||||
|
var url = data.url; |
||||
|
if (formatUploadUrl) { |
||||
|
url = K.formatUrl(url, 'absolute'); |
||||
|
} |
||||
|
if (self.afterUpload) { |
||||
|
self.afterUpload.call(self, url, data, name); |
||||
|
} |
||||
|
if (!fillDescAfterUploadImage) { |
||||
|
clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align); |
||||
|
} else { |
||||
|
K(".ke-dialog-row #remoteUrl", div).val(url); |
||||
|
K(".ke-tabs-li", div)[0].click(); |
||||
|
K(".ke-refresh-btn", div).click(); |
||||
|
} |
||||
|
} else { |
||||
|
alert(data.message); |
||||
|
} |
||||
|
}, |
||||
|
afterError : function(html) { |
||||
|
dialog.hideLoading(); |
||||
|
self.errorDialog(html); |
||||
|
} |
||||
|
}); |
||||
|
uploadbutton.fileBox.change(function(e) { |
||||
|
localUrlBox.val(uploadbutton.fileBox.val()); |
||||
|
}); |
||||
|
if (allowFileManager) { |
||||
|
viewServerBtn.click(function(e) { |
||||
|
self.loadPlugin('filemanager', function() { |
||||
|
self.plugin.filemanagerDialog({ |
||||
|
viewType : 'VIEW', |
||||
|
dirName : 'image', |
||||
|
clickFn : function(url, title) { |
||||
|
if (self.dialogs.length > 1) { |
||||
|
K('[name="url"]', div).val(url); |
||||
|
if (self.afterSelectFile) { |
||||
|
self.afterSelectFile.call(self, url); |
||||
|
} |
||||
|
self.hideDialog(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
} else { |
||||
|
viewServerBtn.hide(); |
||||
|
} |
||||
|
var originalWidth = 0, originalHeight = 0; |
||||
|
function setSize(width, height) { |
||||
|
widthBox.val(width); |
||||
|
heightBox.val(height); |
||||
|
originalWidth = width; |
||||
|
originalHeight = height; |
||||
|
} |
||||
|
refreshBtn.click(function(e) { |
||||
|
var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({ |
||||
|
position : 'absolute', |
||||
|
visibility : 'hidden', |
||||
|
top : 0, |
||||
|
left : '-1000px' |
||||
|
}); |
||||
|
tempImg.bind('load', function() { |
||||
|
setSize(tempImg.width(), tempImg.height()); |
||||
|
tempImg.remove(); |
||||
|
}); |
||||
|
K(document.body).append(tempImg); |
||||
|
}); |
||||
|
widthBox.change(function(e) { |
||||
|
if (originalWidth > 0) { |
||||
|
heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10))); |
||||
|
} |
||||
|
}); |
||||
|
heightBox.change(function(e) { |
||||
|
if (originalHeight > 0) { |
||||
|
widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10))); |
||||
|
} |
||||
|
}); |
||||
|
urlBox.val(options.imageUrl); |
||||
|
setSize(options.imageWidth, options.imageHeight); |
||||
|
titleBox.val(options.imageTitle); |
||||
|
alignBox.each(function() { |
||||
|
if (this.value === options.imageAlign) { |
||||
|
this.checked = true; |
||||
|
return false; |
||||
|
} |
||||
|
}); |
||||
|
if (showRemote && tabIndex === 0) { |
||||
|
urlBox[0].focus(); |
||||
|
urlBox[0].select(); |
||||
|
} |
||||
|
return dialog; |
||||
|
}; |
||||
|
self.plugin.image = { |
||||
|
edit : function() { |
||||
|
var img = self.plugin.getSelectedImage(); |
||||
|
self.plugin.imageDialog({ |
||||
|
imageUrl : img ? img.attr('data-ke-src') : 'http://', |
||||
|
imageWidth : img ? img.width() : '', |
||||
|
imageHeight : img ? img.height() : '', |
||||
|
imageTitle : img ? img.attr('title') : '', |
||||
|
imageAlign : img ? img.attr('align') : '', |
||||
|
showRemote : allowImageRemote, |
||||
|
showLocal : allowImageUpload, |
||||
|
tabIndex: img ? 0 : imageTabIndex, |
||||
|
clickFn : function(url, title, width, height, border, align) { |
||||
|
if (img) { |
||||
|
img.attr('src', url); |
||||
|
img.attr('data-ke-src', url); |
||||
|
img.attr('width', width); |
||||
|
img.attr('height', height); |
||||
|
img.attr('title', title); |
||||
|
img.attr('align', align); |
||||
|
img.attr('alt', title); |
||||
|
} else { |
||||
|
self.exec('insertimage', url, title, width, height, border, align); |
||||
|
} |
||||
|
// Bugfix: [Firefox] 上传图片后,总是出现正在加载的样式,需要延迟执行hideDialog
|
||||
|
setTimeout(function() { |
||||
|
self.hideDialog().focus(); |
||||
|
}, 0); |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
'delete' : function() { |
||||
|
var target = self.plugin.getSelectedImage(); |
||||
|
if (target.parent().name == 'a') { |
||||
|
target = target.parent(); |
||||
|
} |
||||
|
target.remove(); |
||||
|
// [IE] 删除图片后立即点击图片按钮出错
|
||||
|
self.addBookmark(); |
||||
|
} |
||||
|
}; |
||||
|
self.clickToolbar(name, self.plugin.image.edit); |
||||
|
}); |
||||
|
After Width: | Height: | Size: 639 B |
|
After Width: | Height: | Size: 636 B |
|
After Width: | Height: | Size: 625 B |
|
After Width: | Height: | Size: 800 B |
@ -0,0 +1,138 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('insertfile', function(K) { |
||||
|
var self = this, name = 'insertfile', |
||||
|
allowFileUpload = K.undef(self.allowFileUpload, true), |
||||
|
allowFileManager = K.undef(self.allowFileManager, false), |
||||
|
formatUploadUrl = K.undef(self.formatUploadUrl, true), |
||||
|
uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'), |
||||
|
extraParams = K.undef(self.extraFileUploadParams, {}), |
||||
|
filePostName = K.undef(self.filePostName, 'imgFile'), |
||||
|
lang = self.lang(name + '.'); |
||||
|
self.plugin.fileDialog = function(options) { |
||||
|
var fileUrl = K.undef(options.fileUrl, 'http://'), |
||||
|
fileTitle = K.undef(options.fileTitle, ''), |
||||
|
clickFn = options.clickFn; |
||||
|
var html = [ |
||||
|
'<div style="padding:20px;">', |
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keUrl" style="width:60px;">' + lang.url + '</label>', |
||||
|
'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> ', |
||||
|
'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> ', |
||||
|
'<span class="ke-button-common ke-button-outer">', |
||||
|
'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />', |
||||
|
'</span>', |
||||
|
'</div>', |
||||
|
//title
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keTitle" style="width:60px;">' + lang.title + '</label>', |
||||
|
'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>', |
||||
|
'</div>', |
||||
|
//form end
|
||||
|
'</form>', |
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var url = K.trim(urlBox.val()), |
||||
|
title = titleBox.val(); |
||||
|
if (url == 'http://' || K.invalidUrl(url)) { |
||||
|
alert(self.lang('invalidUrl')); |
||||
|
urlBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (K.trim(title) === '') { |
||||
|
title = url; |
||||
|
} |
||||
|
clickFn.call(self, url, title); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div; |
||||
|
|
||||
|
var urlBox = K('[name="url"]', div), |
||||
|
viewServerBtn = K('[name="viewServer"]', div), |
||||
|
titleBox = K('[name="title"]', div); |
||||
|
|
||||
|
if (allowFileUpload) { |
||||
|
var uploadbutton = K.uploadbutton({ |
||||
|
button : K('.ke-upload-button', div)[0], |
||||
|
fieldName : filePostName, |
||||
|
url : K.addParam(uploadJson, 'dir=file'), |
||||
|
extraParams : extraParams, |
||||
|
afterUpload : function(data) { |
||||
|
dialog.hideLoading(); |
||||
|
if (data.error === 0) { |
||||
|
var url = data.url; |
||||
|
if (formatUploadUrl) { |
||||
|
url = K.formatUrl(url, 'absolute'); |
||||
|
} |
||||
|
urlBox.val(url); |
||||
|
if (self.afterUpload) { |
||||
|
self.afterUpload.call(self, url, data, name); |
||||
|
} |
||||
|
alert(self.lang('uploadSuccess')); |
||||
|
} else { |
||||
|
alert(data.message); |
||||
|
} |
||||
|
}, |
||||
|
afterError : function(html) { |
||||
|
dialog.hideLoading(); |
||||
|
self.errorDialog(html); |
||||
|
} |
||||
|
}); |
||||
|
uploadbutton.fileBox.change(function(e) { |
||||
|
dialog.showLoading(self.lang('uploadLoading')); |
||||
|
uploadbutton.submit(); |
||||
|
}); |
||||
|
} else { |
||||
|
K('.ke-upload-button', div).hide(); |
||||
|
} |
||||
|
if (allowFileManager) { |
||||
|
viewServerBtn.click(function(e) { |
||||
|
self.loadPlugin('filemanager', function() { |
||||
|
self.plugin.filemanagerDialog({ |
||||
|
viewType : 'LIST', |
||||
|
dirName : 'file', |
||||
|
clickFn : function(url, title) { |
||||
|
if (self.dialogs.length > 1) { |
||||
|
K('[name="url"]', div).val(url); |
||||
|
if (self.afterSelectFile) { |
||||
|
self.afterSelectFile.call(self, url); |
||||
|
} |
||||
|
self.hideDialog(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
} else { |
||||
|
viewServerBtn.hide(); |
||||
|
} |
||||
|
urlBox.val(fileUrl); |
||||
|
titleBox.val(fileTitle); |
||||
|
urlBox[0].focus(); |
||||
|
urlBox[0].select(); |
||||
|
}; |
||||
|
self.clickToolbar(name, function() { |
||||
|
self.plugin.fileDialog({ |
||||
|
clickFn : function(url, title) { |
||||
|
var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>'; |
||||
|
self.insertHtml(html).hideDialog().focus(); |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,38 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('lineheight', function(K) { |
||||
|
var self = this, name = 'lineheight', lang = self.lang(name + '.'); |
||||
|
self.clickToolbar(name, function() { |
||||
|
var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'}); |
||||
|
if (commonNode) { |
||||
|
curVal = commonNode.css('line-height'); |
||||
|
} |
||||
|
var menu = self.createMenu({ |
||||
|
name : name, |
||||
|
width : 150 |
||||
|
}); |
||||
|
K.each(lang.lineHeight, function(i, row) { |
||||
|
K.each(row, function(key, val) { |
||||
|
menu.addItem({ |
||||
|
title : val, |
||||
|
checked : curVal === key, |
||||
|
click : function() { |
||||
|
self.cmd.toggle('<span style="line-height:' + key + ';"></span>', { |
||||
|
span : '.line-height=' + key |
||||
|
}); |
||||
|
self.updateState(); |
||||
|
self.addBookmark(); |
||||
|
self.hideMenu(); |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,66 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('link', function(K) { |
||||
|
var self = this, name = 'link'; |
||||
|
self.plugin.link = { |
||||
|
edit : function() { |
||||
|
var lang = self.lang(name + '.'), |
||||
|
html = '<div style="padding:20px;">' + |
||||
|
//url
|
||||
|
'<div class="ke-dialog-row">' + |
||||
|
'<label for="keUrl" style="width:60px;">' + lang.url + '</label>' + |
||||
|
'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" /></div>' + |
||||
|
//type
|
||||
|
'<div class="ke-dialog-row"">' + |
||||
|
'<label for="keType" style="width:60px;">' + lang.linkType + '</label>' + |
||||
|
'<select id="keType" name="type"></select>' + |
||||
|
'</div>' + |
||||
|
'</div>', |
||||
|
dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var url = K.trim(urlBox.val()); |
||||
|
if (url == 'http://' || K.invalidUrl(url)) { |
||||
|
alert(self.lang('invalidUrl')); |
||||
|
urlBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
self.exec('createlink', url, typeBox.val()).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
urlBox = K('input[name="url"]', div), |
||||
|
typeBox = K('select[name="type"]', div); |
||||
|
urlBox.val('http://'); |
||||
|
typeBox[0].options[0] = new Option(lang.newWindow, '_blank'); |
||||
|
typeBox[0].options[1] = new Option(lang.selfWindow, ''); |
||||
|
self.cmd.selection(); |
||||
|
var a = self.plugin.getSelectedLink(); |
||||
|
if (a) { |
||||
|
self.cmd.range.selectNode(a[0]); |
||||
|
self.cmd.select(); |
||||
|
urlBox.val(a.attr('data-ke-src')); |
||||
|
typeBox.val(a.attr('target')); |
||||
|
} |
||||
|
urlBox[0].focus(); |
||||
|
urlBox[0].select(); |
||||
|
}, |
||||
|
'delete' : function() { |
||||
|
self.exec('unlink', null); |
||||
|
} |
||||
|
}; |
||||
|
self.clickToolbar(name, self.plugin.link.edit); |
||||
|
}); |
||||
@ -0,0 +1,57 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> |
||||
|
<style> |
||||
|
html { height: 100% } |
||||
|
body { height: 100%; margin: 0; padding: 0; background-color: #FFF } |
||||
|
#map_canvas { height: 100% } |
||||
|
</style> |
||||
|
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=zh_CN"></script> |
||||
|
<script> |
||||
|
var map, geocoder; |
||||
|
function initialize() { |
||||
|
var latlng = new google.maps.LatLng(-34.397, 150.644); |
||||
|
var options = { |
||||
|
zoom: 11, |
||||
|
center: latlng, |
||||
|
disableDefaultUI: true, |
||||
|
panControl: true, |
||||
|
zoomControl: true, |
||||
|
mapTypeControl: true, |
||||
|
scaleControl: true, |
||||
|
streetViewControl: false, |
||||
|
overviewMapControl: true, |
||||
|
mapTypeId: google.maps.MapTypeId.ROADMAP |
||||
|
}; |
||||
|
map = new google.maps.Map(document.getElementById("map_canvas"), options); |
||||
|
geocoder = new google.maps.Geocoder(); |
||||
|
geocoder.geocode({latLng: latlng}, function(results, status) { |
||||
|
if (status == google.maps.GeocoderStatus.OK) { |
||||
|
if (results[3]) { |
||||
|
parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address; |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
function search(address) { |
||||
|
if (!map) return; |
||||
|
geocoder.geocode({address : address}, function(results, status) { |
||||
|
if (status == google.maps.GeocoderStatus.OK) { |
||||
|
map.setZoom(11); |
||||
|
map.setCenter(results[0].geometry.location); |
||||
|
var marker = new google.maps.Marker({ |
||||
|
map: map, |
||||
|
position: results[0].geometry.location |
||||
|
}); |
||||
|
} else { |
||||
|
alert("Invalid address: " + address); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
</script> |
||||
|
</head> |
||||
|
<body onload="initialize();"> |
||||
|
<div id="map_canvas" style="width:100%; height:100%"></div> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,137 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
// Google Maps: http://code.google.com/apis/maps/index.html
|
||||
|
|
||||
|
KindEditor.plugin('map', function(K) { |
||||
|
var self = this, name = 'map', lang = self.lang(name + '.'); |
||||
|
self.clickToolbar(name, function() { |
||||
|
var html = ['<div style="padding:10px 20px;">', |
||||
|
'<div class="ke-dialog-row">', |
||||
|
lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ', |
||||
|
'<span class="ke-button-common ke-button-outer">', |
||||
|
'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />', |
||||
|
'</span>', |
||||
|
'</div>', |
||||
|
'<div class="ke-map" style="width:558px;height:360px;"></div>', |
||||
|
'</div>'].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 600, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var geocoder = win.geocoder, |
||||
|
map = win.map, |
||||
|
center = map.getCenter().lat() + ',' + map.getCenter().lng(), |
||||
|
zoom = map.getZoom(), |
||||
|
maptype = map.getMapTypeId(), |
||||
|
url = 'http://maps.googleapis.com/maps/api/staticmap'; |
||||
|
url += '?center=' + encodeURIComponent(center); |
||||
|
url += '&zoom=' + encodeURIComponent(zoom); |
||||
|
url += '&size=558x360'; |
||||
|
url += '&maptype=' + encodeURIComponent(maptype); |
||||
|
url += '&markers=' + encodeURIComponent(center); |
||||
|
url += '&language=' + self.langType; |
||||
|
url += '&sensor=false'; |
||||
|
self.exec('insertimage', url).hideDialog().focus(); |
||||
|
} |
||||
|
}, |
||||
|
beforeRemove : function() { |
||||
|
searchBtn.remove(); |
||||
|
if (doc) { |
||||
|
doc.write(''); |
||||
|
} |
||||
|
iframe.remove(); |
||||
|
} |
||||
|
}); |
||||
|
var div = dialog.div, |
||||
|
addressBox = K('[name="address"]', div), |
||||
|
searchBtn = K('[name="searchBtn"]', div), |
||||
|
win, doc; |
||||
|
var iframeHtml = ['<!doctype html><html><head>', |
||||
|
'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />', |
||||
|
'<style>', |
||||
|
' html { height: 100% }', |
||||
|
' body { height: 100%; margin: 0; padding: 0; background-color: #FFF }', |
||||
|
' #map_canvas { height: 100% }', |
||||
|
'</style>', |
||||
|
'<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>', |
||||
|
'<script>', |
||||
|
'var map, geocoder;', |
||||
|
'function initialize() {', |
||||
|
' var latlng = new google.maps.LatLng(31.230393, 121.473704);', |
||||
|
' var options = {', |
||||
|
' zoom: 11,', |
||||
|
' center: latlng,', |
||||
|
' disableDefaultUI: true,', |
||||
|
' panControl: true,', |
||||
|
' zoomControl: true,', |
||||
|
' mapTypeControl: true,', |
||||
|
' scaleControl: true,', |
||||
|
' streetViewControl: false,', |
||||
|
' overviewMapControl: true,', |
||||
|
' mapTypeId: google.maps.MapTypeId.ROADMAP', |
||||
|
' };', |
||||
|
' map = new google.maps.Map(document.getElementById("map_canvas"), options);', |
||||
|
' geocoder = new google.maps.Geocoder();', |
||||
|
' geocoder.geocode({latLng: latlng}, function(results, status) {', |
||||
|
' if (status == google.maps.GeocoderStatus.OK) {', |
||||
|
' if (results[3]) {', |
||||
|
' parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;', |
||||
|
' }', |
||||
|
' }', |
||||
|
' });', |
||||
|
'}', |
||||
|
'function search(address) {', |
||||
|
' if (!map) return;', |
||||
|
' geocoder.geocode({address : address}, function(results, status) {', |
||||
|
' if (status == google.maps.GeocoderStatus.OK) {', |
||||
|
' map.setZoom(11);', |
||||
|
' map.setCenter(results[0].geometry.location);', |
||||
|
' var marker = new google.maps.Marker({', |
||||
|
' map: map,', |
||||
|
' position: results[0].geometry.location', |
||||
|
' });', |
||||
|
' } else {', |
||||
|
' alert("Invalid address: " + address);', |
||||
|
' }', |
||||
|
' });', |
||||
|
'}', |
||||
|
'</script>', |
||||
|
'</head>', |
||||
|
'<body onload="initialize();">', |
||||
|
'<div id="map_canvas" style="width:100%; height:100%"></div>', |
||||
|
'</body></html>'].join('\n'); |
||||
|
// TODO:用doc.write(iframeHtml)方式加载时,在IE6上第一次加载报错,暂时使用src方式
|
||||
|
var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>'); |
||||
|
function ready() { |
||||
|
win = iframe[0].contentWindow; |
||||
|
doc = K.iframeDoc(iframe); |
||||
|
//doc.open();
|
||||
|
//doc.write(iframeHtml);
|
||||
|
//doc.close();
|
||||
|
} |
||||
|
iframe.bind('load', function() { |
||||
|
iframe.unbind('load'); |
||||
|
if (K.IE) { |
||||
|
ready(); |
||||
|
} else { |
||||
|
setTimeout(ready, 0); |
||||
|
} |
||||
|
}); |
||||
|
K('.ke-map', div).replaceWith(iframe); |
||||
|
// search map
|
||||
|
searchBtn.click(function() { |
||||
|
win.search(addressBox.val()); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,170 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('media', function(K) { |
||||
|
var self = this, name = 'media', lang = self.lang(name + '.'), |
||||
|
allowMediaUpload = K.undef(self.allowMediaUpload, true), |
||||
|
allowFileManager = K.undef(self.allowFileManager, false), |
||||
|
formatUploadUrl = K.undef(self.formatUploadUrl, true), |
||||
|
extraParams = K.undef(self.extraFileUploadParams, {}), |
||||
|
filePostName = K.undef(self.filePostName, 'imgFile'), |
||||
|
uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'); |
||||
|
self.plugin.media = { |
||||
|
edit : function() { |
||||
|
var html = [ |
||||
|
'<div style="padding:20px;">', |
||||
|
//url
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keUrl" style="width:60px;">' + lang.url + '</label>', |
||||
|
'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> ', |
||||
|
'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> ', |
||||
|
'<span class="ke-button-common ke-button-outer">', |
||||
|
'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />', |
||||
|
'</span>', |
||||
|
'</div>', |
||||
|
//width
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keWidth" style="width:60px;">' + lang.width + '</label>', |
||||
|
'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />', |
||||
|
'</div>', |
||||
|
//height
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keHeight" style="width:60px;">' + lang.height + '</label>', |
||||
|
'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />', |
||||
|
'</div>', |
||||
|
//autostart
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keAutostart">' + lang.autostart + '</label>', |
||||
|
'<input type="checkbox" id="keAutostart" name="autostart" value="" /> ', |
||||
|
'</div>', |
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
height : 230, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var url = K.trim(urlBox.val()), |
||||
|
width = widthBox.val(), |
||||
|
height = heightBox.val(); |
||||
|
if (url == 'http://' || K.invalidUrl(url)) { |
||||
|
alert(self.lang('invalidUrl')); |
||||
|
urlBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(width)) { |
||||
|
alert(self.lang('invalidWidth')); |
||||
|
widthBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(height)) { |
||||
|
alert(self.lang('invalidHeight')); |
||||
|
heightBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
var html = K.mediaImg(self.themesPath + 'common/blank.gif', { |
||||
|
src : url, |
||||
|
type : K.mediaType(url), |
||||
|
width : width, |
||||
|
height : height, |
||||
|
autostart : autostartBox[0].checked ? 'true' : 'false', |
||||
|
loop : 'true' |
||||
|
}); |
||||
|
self.insertHtml(html).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
urlBox = K('[name="url"]', div), |
||||
|
viewServerBtn = K('[name="viewServer"]', div), |
||||
|
widthBox = K('[name="width"]', div), |
||||
|
heightBox = K('[name="height"]', div), |
||||
|
autostartBox = K('[name="autostart"]', div); |
||||
|
urlBox.val('http://'); |
||||
|
|
||||
|
if (allowMediaUpload) { |
||||
|
var uploadbutton = K.uploadbutton({ |
||||
|
button : K('.ke-upload-button', div)[0], |
||||
|
fieldName : filePostName, |
||||
|
extraParams : extraParams, |
||||
|
url : K.addParam(uploadJson, 'dir=media'), |
||||
|
afterUpload : function(data) { |
||||
|
dialog.hideLoading(); |
||||
|
if (data.error === 0) { |
||||
|
var url = data.url; |
||||
|
if (formatUploadUrl) { |
||||
|
url = K.formatUrl(url, 'absolute'); |
||||
|
} |
||||
|
urlBox.val(url); |
||||
|
if (self.afterUpload) { |
||||
|
self.afterUpload.call(self, url, data, name); |
||||
|
} |
||||
|
alert(self.lang('uploadSuccess')); |
||||
|
} else { |
||||
|
alert(data.message); |
||||
|
} |
||||
|
}, |
||||
|
afterError : function(html) { |
||||
|
dialog.hideLoading(); |
||||
|
self.errorDialog(html); |
||||
|
} |
||||
|
}); |
||||
|
uploadbutton.fileBox.change(function(e) { |
||||
|
dialog.showLoading(self.lang('uploadLoading')); |
||||
|
uploadbutton.submit(); |
||||
|
}); |
||||
|
} else { |
||||
|
K('.ke-upload-button', div).hide(); |
||||
|
} |
||||
|
|
||||
|
if (allowFileManager) { |
||||
|
viewServerBtn.click(function(e) { |
||||
|
self.loadPlugin('filemanager', function() { |
||||
|
self.plugin.filemanagerDialog({ |
||||
|
viewType : 'LIST', |
||||
|
dirName : 'media', |
||||
|
clickFn : function(url, title) { |
||||
|
if (self.dialogs.length > 1) { |
||||
|
K('[name="url"]', div).val(url); |
||||
|
if (self.afterSelectFile) { |
||||
|
self.afterSelectFile.call(self, url); |
||||
|
} |
||||
|
self.hideDialog(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
} else { |
||||
|
viewServerBtn.hide(); |
||||
|
} |
||||
|
|
||||
|
var img = self.plugin.getSelectedMedia(); |
||||
|
if (img) { |
||||
|
var attrs = K.mediaAttrs(img.attr('data-ke-tag')); |
||||
|
urlBox.val(attrs.src); |
||||
|
widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0); |
||||
|
heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0); |
||||
|
autostartBox[0].checked = (attrs.autostart === 'true'); |
||||
|
} |
||||
|
urlBox[0].focus(); |
||||
|
urlBox[0].select(); |
||||
|
}, |
||||
|
'delete' : function() { |
||||
|
self.plugin.getSelectedMedia().remove(); |
||||
|
// [IE] 删除图片后立即点击图片按钮出错
|
||||
|
self.addBookmark(); |
||||
|
} |
||||
|
}; |
||||
|
self.clickToolbar(name, self.plugin.media.edit); |
||||
|
}); |
||||
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 484 B |
|
After Width: | Height: | Size: 481 B |
@ -0,0 +1,27 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('pagebreak', function(K) { |
||||
|
var self = this; |
||||
|
var name = 'pagebreak'; |
||||
|
var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />'); |
||||
|
|
||||
|
self.clickToolbar(name, function() { |
||||
|
var cmd = self.cmd, range = cmd.range; |
||||
|
self.focus(); |
||||
|
var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<span id="__kindeditor_tail_tag__"></span>'; |
||||
|
self.insertHtml(pagebreakHtml + tail); |
||||
|
if (tail !== '') { |
||||
|
var p = K('#__kindeditor_tail_tag__', self.edit.doc); |
||||
|
range.selectNodeContents(p[0]); |
||||
|
p.removeAttr('id'); |
||||
|
cmd.select(); |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,41 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('plainpaste', function(K) { |
||||
|
var self = this, name = 'plainpaste'; |
||||
|
self.clickToolbar(name, function() { |
||||
|
var lang = self.lang(name + '.'), |
||||
|
html = '<div style="padding:10px 20px;">' + |
||||
|
'<div style="margin-bottom:10px;">' + lang.comment + '</div>' + |
||||
|
'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' + |
||||
|
'</div>', |
||||
|
dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var html = textarea.val(); |
||||
|
html = K.escape(html); |
||||
|
html = html.replace(/ {2}/g, ' '); |
||||
|
if (self.newlineTag == 'p') { |
||||
|
html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>'); |
||||
|
} else { |
||||
|
html = html.replace(/\n/g, '<br />$&'); |
||||
|
} |
||||
|
self.insertHtml(html).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
textarea = K('textarea', dialog.div); |
||||
|
textarea[0].focus(); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,31 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('preview', function(K) { |
||||
|
var self = this, name = 'preview', undefined; |
||||
|
self.clickToolbar(name, function() { |
||||
|
var lang = self.lang(name + '.'), |
||||
|
html = '<div style="padding:10px 20px;">' + |
||||
|
'<iframe class="ke-textarea" frameborder="0" style="width:708px;height:400px;"></iframe>' + |
||||
|
'</div>', |
||||
|
dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 750, |
||||
|
title : self.lang(name), |
||||
|
body : html |
||||
|
}), |
||||
|
iframe = K('iframe', dialog.div), |
||||
|
doc = K.iframeDoc(iframe); |
||||
|
doc.open(); |
||||
|
doc.write(self.fullHtml()); |
||||
|
doc.close(); |
||||
|
K(doc.body).css('background-color', '#FFF'); |
||||
|
iframe[0].contentWindow.focus(); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,81 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('quickformat', function(K) { |
||||
|
var self = this, name = 'quickformat', |
||||
|
blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p'); |
||||
|
function getFirstChild(knode) { |
||||
|
var child = knode.first(); |
||||
|
while (child && child.first()) { |
||||
|
child = child.first(); |
||||
|
} |
||||
|
return child; |
||||
|
} |
||||
|
self.clickToolbar(name, function() { |
||||
|
self.focus(); |
||||
|
var doc = self.edit.doc, |
||||
|
range = self.cmd.range, |
||||
|
child = K(doc.body).first(), next, |
||||
|
nodeList = [], subList = [], |
||||
|
bookmark = range.createBookmark(true); |
||||
|
while(child) { |
||||
|
next = child.next(); |
||||
|
var firstChild = getFirstChild(child); |
||||
|
if (!firstChild || firstChild.name != 'img') { |
||||
|
if (blockMap[child.name]) { |
||||
|
child.html(child.html().replace(/^(\s| | )+/ig, '')); |
||||
|
child.css('text-indent', '2em'); |
||||
|
} else { |
||||
|
subList.push(child); |
||||
|
} |
||||
|
if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) { |
||||
|
if (subList.length > 0) { |
||||
|
nodeList.push(subList); |
||||
|
} |
||||
|
subList = []; |
||||
|
} |
||||
|
} |
||||
|
child = next; |
||||
|
} |
||||
|
K.each(nodeList, function(i, subList) { |
||||
|
var wrapper = K('<p style="text-indent:2em;"></p>', doc); |
||||
|
subList[0].before(wrapper); |
||||
|
K.each(subList, function(i, knode) { |
||||
|
wrapper.append(knode); |
||||
|
}); |
||||
|
}); |
||||
|
range.moveToBookmark(bookmark); |
||||
|
self.addBookmark(); |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
-------------------------- |
||||
|
abcd<br /> |
||||
|
1234<br /> |
||||
|
|
||||
|
to |
||||
|
|
||||
|
<p style="text-indent:2em;"> |
||||
|
abcd<br /> |
||||
|
1234<br /> |
||||
|
</p> |
||||
|
|
||||
|
-------------------------- |
||||
|
|
||||
|
abcd<img>1233 |
||||
|
<p>1234</p> |
||||
|
|
||||
|
to |
||||
|
|
||||
|
<p style="text-indent:2em;">abcd<img>1233</p> |
||||
|
<p style="text-indent:2em;">1234</p> |
||||
|
|
||||
|
-------------------------- |
||||
|
*/ |
||||
@ -0,0 +1,712 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('table', function(K) { |
||||
|
var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder'; |
||||
|
// 设置颜色
|
||||
|
function _setColor(box, color) { |
||||
|
color = color.toUpperCase(); |
||||
|
box.css('background-color', color); |
||||
|
box.css('color', color === '#000000' ? '#FFFFFF' : '#000000'); |
||||
|
box.html(color); |
||||
|
} |
||||
|
// 初始化取色器
|
||||
|
var pickerList = []; |
||||
|
function _initColorPicker(dialogDiv, colorBox) { |
||||
|
colorBox.bind('click,mousedown', function(e){ |
||||
|
e.stopPropagation(); |
||||
|
}); |
||||
|
function removePicker() { |
||||
|
K.each(pickerList, function() { |
||||
|
this.remove(); |
||||
|
}); |
||||
|
pickerList = []; |
||||
|
K(document).unbind('click,mousedown', removePicker); |
||||
|
dialogDiv.unbind('click,mousedown', removePicker); |
||||
|
} |
||||
|
colorBox.click(function(e) { |
||||
|
removePicker(); |
||||
|
var box = K(this), |
||||
|
pos = box.pos(); |
||||
|
var picker = K.colorpicker({ |
||||
|
x : pos.x, |
||||
|
y : pos.y + box.height(), |
||||
|
z : 811214, |
||||
|
selectedColor : K(this).html(), |
||||
|
colors : self.colorTable, |
||||
|
noColor : self.lang('noColor'), |
||||
|
shadowMode : self.shadowMode, |
||||
|
click : function(color) { |
||||
|
_setColor(box, color); |
||||
|
removePicker(); |
||||
|
} |
||||
|
}); |
||||
|
pickerList.push(picker); |
||||
|
K(document).bind('click,mousedown', removePicker); |
||||
|
dialogDiv.bind('click,mousedown', removePicker); |
||||
|
}); |
||||
|
} |
||||
|
// 取得下一行cell的index
|
||||
|
function _getCellIndex(table, row, cell) { |
||||
|
var rowSpanCount = 0; |
||||
|
for (var i = 0, len = row.cells.length; i < len; i++) { |
||||
|
if (row.cells[i] == cell) { |
||||
|
break; |
||||
|
} |
||||
|
rowSpanCount += row.cells[i].rowSpan - 1; |
||||
|
} |
||||
|
return cell.cellIndex - rowSpanCount; |
||||
|
} |
||||
|
self.plugin.table = { |
||||
|
//insert or modify table
|
||||
|
prop : function(isInsert) { |
||||
|
var html = [ |
||||
|
'<div style="padding:20px;">', |
||||
|
//rows, cols
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keRows" style="width:90px;">' + lang.cells + '</label>', |
||||
|
lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> ', |
||||
|
lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />', |
||||
|
'</div>', |
||||
|
//width, height
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keWidth" style="width:90px;">' + lang.size + '</label>', |
||||
|
lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ', |
||||
|
'<select name="widthType">', |
||||
|
'<option value="%">' + lang.percent + '</option>', |
||||
|
'<option value="px">' + lang.px + '</option>', |
||||
|
'</select> ', |
||||
|
lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ', |
||||
|
'<select name="heightType">', |
||||
|
'<option value="%">' + lang.percent + '</option>', |
||||
|
'<option value="px">' + lang.px + '</option>', |
||||
|
'</select>', |
||||
|
'</div>', |
||||
|
//space, padding
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="kePadding" style="width:90px;">' + lang.space + '</label>', |
||||
|
lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> ', |
||||
|
lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />', |
||||
|
'</div>', |
||||
|
//align
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keAlign" style="width:90px;">' + lang.align + '</label>', |
||||
|
'<select id="keAlign" name="align">', |
||||
|
'<option value="">' + lang.alignDefault + '</option>', |
||||
|
'<option value="left">' + lang.alignLeft + '</option>', |
||||
|
'<option value="center">' + lang.alignCenter + '</option>', |
||||
|
'<option value="right">' + lang.alignRight + '</option>', |
||||
|
'</select>', |
||||
|
'</div>', |
||||
|
//border
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keBorder" style="width:90px;">' + lang.border + '</label>', |
||||
|
lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> ', |
||||
|
lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>', |
||||
|
'</div>', |
||||
|
//background color
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>', |
||||
|
'<span class="ke-inline-block ke-input-color"></span>', |
||||
|
'</div>', |
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var bookmark = self.cmd.range.createBookmark(); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 500, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
beforeRemove : function() { |
||||
|
colorBox.unbind(); |
||||
|
}, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var rows = rowsBox.val(), |
||||
|
cols = colsBox.val(), |
||||
|
width = widthBox.val(), |
||||
|
height = heightBox.val(), |
||||
|
widthType = widthTypeBox.val(), |
||||
|
heightType = heightTypeBox.val(), |
||||
|
padding = paddingBox.val(), |
||||
|
spacing = spacingBox.val(), |
||||
|
align = alignBox.val(), |
||||
|
border = borderBox.val(), |
||||
|
borderColor = K(colorBox[0]).html() || '', |
||||
|
bgColor = K(colorBox[1]).html() || ''; |
||||
|
if (rows == 0 || !/^\d+$/.test(rows)) { |
||||
|
alert(self.lang('invalidRows')); |
||||
|
rowsBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (cols == 0 || !/^\d+$/.test(cols)) { |
||||
|
alert(self.lang('invalidRows')); |
||||
|
colsBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(width)) { |
||||
|
alert(self.lang('invalidWidth')); |
||||
|
widthBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(height)) { |
||||
|
alert(self.lang('invalidHeight')); |
||||
|
heightBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(padding)) { |
||||
|
alert(self.lang('invalidPadding')); |
||||
|
paddingBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(spacing)) { |
||||
|
alert(self.lang('invalidSpacing')); |
||||
|
spacingBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(border)) { |
||||
|
alert(self.lang('invalidBorder')); |
||||
|
borderBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
//modify table
|
||||
|
if (table) { |
||||
|
if (width !== '') { |
||||
|
table.width(width + widthType); |
||||
|
} else { |
||||
|
table.css('width', ''); |
||||
|
} |
||||
|
if (table[0].width !== undefined) { |
||||
|
table.removeAttr('width'); |
||||
|
} |
||||
|
if (height !== '') { |
||||
|
table.height(height + heightType); |
||||
|
} else { |
||||
|
table.css('height', ''); |
||||
|
} |
||||
|
if (table[0].height !== undefined) { |
||||
|
table.removeAttr('height'); |
||||
|
} |
||||
|
table.css('background-color', bgColor); |
||||
|
if (table[0].bgColor !== undefined) { |
||||
|
table.removeAttr('bgColor'); |
||||
|
} |
||||
|
if (padding !== '') { |
||||
|
table[0].cellPadding = padding; |
||||
|
} else { |
||||
|
table.removeAttr('cellPadding'); |
||||
|
} |
||||
|
if (spacing !== '') { |
||||
|
table[0].cellSpacing = spacing; |
||||
|
} else { |
||||
|
table.removeAttr('cellSpacing'); |
||||
|
} |
||||
|
if (align !== '') { |
||||
|
table[0].align = align; |
||||
|
} else { |
||||
|
table.removeAttr('align'); |
||||
|
} |
||||
|
if (border !== '') { |
||||
|
table.attr('border', border); |
||||
|
} else { |
||||
|
table.removeAttr('border'); |
||||
|
} |
||||
|
if (border === '' || border === '0') { |
||||
|
table.addClass(zeroborder); |
||||
|
} else { |
||||
|
table.removeClass(zeroborder); |
||||
|
} |
||||
|
if (borderColor !== '') { |
||||
|
table.attr('borderColor', borderColor); |
||||
|
} else { |
||||
|
table.removeAttr('borderColor'); |
||||
|
} |
||||
|
self.hideDialog().focus(); |
||||
|
self.cmd.range.moveToBookmark(bookmark); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
return; |
||||
|
} |
||||
|
//insert new table
|
||||
|
var style = ''; |
||||
|
if (width !== '') { |
||||
|
style += 'width:' + width + widthType + ';'; |
||||
|
} |
||||
|
if (height !== '') { |
||||
|
style += 'height:' + height + heightType + ';'; |
||||
|
} |
||||
|
if (bgColor !== '') { |
||||
|
style += 'background-color:' + bgColor + ';'; |
||||
|
} |
||||
|
var html = '<table'; |
||||
|
if (style !== '') { |
||||
|
html += ' style="' + style + '"'; |
||||
|
} |
||||
|
if (padding !== '') { |
||||
|
html += ' cellpadding="' + padding + '"'; |
||||
|
} |
||||
|
if (spacing !== '') { |
||||
|
html += ' cellspacing="' + spacing + '"'; |
||||
|
} |
||||
|
if (align !== '') { |
||||
|
html += ' align="' + align + '"'; |
||||
|
} |
||||
|
if (border !== '') { |
||||
|
html += ' border="' + border + '"'; |
||||
|
} |
||||
|
if (border === '' || border === '0') { |
||||
|
html += ' class="' + zeroborder + '"'; |
||||
|
} |
||||
|
if (borderColor !== '') { |
||||
|
html += ' bordercolor="' + borderColor + '"'; |
||||
|
} |
||||
|
html += '>'; |
||||
|
for (var i = 0; i < rows; i++) { |
||||
|
html += '<tr>'; |
||||
|
for (var j = 0; j < cols; j++) { |
||||
|
html += '<td>' + (K.IE ? ' ' : '<br />') + '</td>'; |
||||
|
} |
||||
|
html += '</tr>'; |
||||
|
} |
||||
|
html += '</table>'; |
||||
|
if (!K.IE) { |
||||
|
html += '<br />'; |
||||
|
} |
||||
|
self.insertHtml(html); |
||||
|
self.select().hideDialog().focus(); |
||||
|
self.addBookmark(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
rowsBox = K('[name="rows"]', div).val(3), |
||||
|
colsBox = K('[name="cols"]', div).val(2), |
||||
|
widthBox = K('[name="width"]', div).val(100), |
||||
|
heightBox = K('[name="height"]', div), |
||||
|
widthTypeBox = K('[name="widthType"]', div), |
||||
|
heightTypeBox = K('[name="heightType"]', div), |
||||
|
paddingBox = K('[name="padding"]', div).val(2), |
||||
|
spacingBox = K('[name="spacing"]', div).val(0), |
||||
|
alignBox = K('[name="align"]', div), |
||||
|
borderBox = K('[name="border"]', div).val(1), |
||||
|
colorBox = K('.ke-input-color', div); |
||||
|
_initColorPicker(div, colorBox.eq(0)); |
||||
|
_initColorPicker(div, colorBox.eq(1)); |
||||
|
_setColor(colorBox.eq(0), '#000000'); |
||||
|
_setColor(colorBox.eq(1), ''); |
||||
|
// foucs and select
|
||||
|
rowsBox[0].focus(); |
||||
|
rowsBox[0].select(); |
||||
|
var table; |
||||
|
if (isInsert) { |
||||
|
return; |
||||
|
} |
||||
|
//get selected table node
|
||||
|
table = self.plugin.getSelectedTable(); |
||||
|
if (table) { |
||||
|
rowsBox.val(table[0].rows.length); |
||||
|
colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0); |
||||
|
rowsBox.attr('disabled', true); |
||||
|
colsBox.attr('disabled', true); |
||||
|
var match, |
||||
|
tableWidth = table[0].style.width || table[0].width, |
||||
|
tableHeight = table[0].style.height || table[0].height; |
||||
|
if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) { |
||||
|
widthBox.val(match[1]); |
||||
|
widthTypeBox.val(match[2]); |
||||
|
} else { |
||||
|
widthBox.val(''); |
||||
|
} |
||||
|
if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) { |
||||
|
heightBox.val(match[1]); |
||||
|
heightTypeBox.val(match[2]); |
||||
|
} |
||||
|
paddingBox.val(table[0].cellPadding || ''); |
||||
|
spacingBox.val(table[0].cellSpacing || ''); |
||||
|
alignBox.val(table[0].align || ''); |
||||
|
borderBox.val(table[0].border === undefined ? '' : table[0].border); |
||||
|
_setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || '')); |
||||
|
_setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || '')); |
||||
|
widthBox[0].focus(); |
||||
|
widthBox[0].select(); |
||||
|
} |
||||
|
}, |
||||
|
//modify cell
|
||||
|
cellprop : function() { |
||||
|
var html = [ |
||||
|
'<div style="padding:20px;">', |
||||
|
//width, height
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keWidth" style="width:90px;">' + lang.size + '</label>', |
||||
|
lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ', |
||||
|
'<select name="widthType">', |
||||
|
'<option value="%">' + lang.percent + '</option>', |
||||
|
'<option value="px">' + lang.px + '</option>', |
||||
|
'</select> ', |
||||
|
lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ', |
||||
|
'<select name="heightType">', |
||||
|
'<option value="%">' + lang.percent + '</option>', |
||||
|
'<option value="px">' + lang.px + '</option>', |
||||
|
'</select>', |
||||
|
'</div>', |
||||
|
//align
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keAlign" style="width:90px;">' + lang.align + '</label>', |
||||
|
lang.textAlign + ' <select id="keAlign" name="textAlign">', |
||||
|
'<option value="">' + lang.alignDefault + '</option>', |
||||
|
'<option value="left">' + lang.alignLeft + '</option>', |
||||
|
'<option value="center">' + lang.alignCenter + '</option>', |
||||
|
'<option value="right">' + lang.alignRight + '</option>', |
||||
|
'</select> ', |
||||
|
lang.verticalAlign + ' <select name="verticalAlign">', |
||||
|
'<option value="">' + lang.alignDefault + '</option>', |
||||
|
'<option value="top">' + lang.alignTop + '</option>', |
||||
|
'<option value="middle">' + lang.alignMiddle + '</option>', |
||||
|
'<option value="bottom">' + lang.alignBottom + '</option>', |
||||
|
'<option value="baseline">' + lang.alignBaseline + '</option>', |
||||
|
'</select>', |
||||
|
'</div>', |
||||
|
//border
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keBorder" style="width:90px;">' + lang.border + '</label>', |
||||
|
lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> ', |
||||
|
lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>', |
||||
|
'</div>', |
||||
|
//background color
|
||||
|
'<div class="ke-dialog-row">', |
||||
|
'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>', |
||||
|
'<span class="ke-inline-block ke-input-color"></span>', |
||||
|
'</div>', |
||||
|
'</div>' |
||||
|
].join(''); |
||||
|
var bookmark = self.cmd.range.createBookmark(); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 500, |
||||
|
title : self.lang('tablecell'), |
||||
|
body : html, |
||||
|
beforeRemove : function() { |
||||
|
colorBox.unbind(); |
||||
|
}, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var width = widthBox.val(), |
||||
|
height = heightBox.val(), |
||||
|
widthType = widthTypeBox.val(), |
||||
|
heightType = heightTypeBox.val(), |
||||
|
padding = paddingBox.val(), |
||||
|
spacing = spacingBox.val(), |
||||
|
textAlign = textAlignBox.val(), |
||||
|
verticalAlign = verticalAlignBox.val(), |
||||
|
border = borderBox.val(), |
||||
|
borderColor = K(colorBox[0]).html() || '', |
||||
|
bgColor = K(colorBox[1]).html() || ''; |
||||
|
if (!/^\d*$/.test(width)) { |
||||
|
alert(self.lang('invalidWidth')); |
||||
|
widthBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(height)) { |
||||
|
alert(self.lang('invalidHeight')); |
||||
|
heightBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
if (!/^\d*$/.test(border)) { |
||||
|
alert(self.lang('invalidBorder')); |
||||
|
borderBox[0].focus(); |
||||
|
return; |
||||
|
} |
||||
|
cell.css({ |
||||
|
width : width !== '' ? (width + widthType) : '', |
||||
|
height : height !== '' ? (height + heightType) : '', |
||||
|
'background-color' : bgColor, |
||||
|
'text-align' : textAlign, |
||||
|
'vertical-align' : verticalAlign, |
||||
|
'border-width' : border, |
||||
|
'border-style' : border !== '' ? 'solid' : '', |
||||
|
'border-color' : borderColor |
||||
|
}); |
||||
|
self.hideDialog().focus(); |
||||
|
self.cmd.range.moveToBookmark(bookmark); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
widthBox = K('[name="width"]', div).val(100), |
||||
|
heightBox = K('[name="height"]', div), |
||||
|
widthTypeBox = K('[name="widthType"]', div), |
||||
|
heightTypeBox = K('[name="heightType"]', div), |
||||
|
paddingBox = K('[name="padding"]', div).val(2), |
||||
|
spacingBox = K('[name="spacing"]', div).val(0), |
||||
|
textAlignBox = K('[name="textAlign"]', div), |
||||
|
verticalAlignBox = K('[name="verticalAlign"]', div), |
||||
|
borderBox = K('[name="border"]', div).val(1), |
||||
|
colorBox = K('.ke-input-color', div); |
||||
|
_initColorPicker(div, colorBox.eq(0)); |
||||
|
_initColorPicker(div, colorBox.eq(1)); |
||||
|
_setColor(colorBox.eq(0), '#000000'); |
||||
|
_setColor(colorBox.eq(1), ''); |
||||
|
// foucs and select
|
||||
|
widthBox[0].focus(); |
||||
|
widthBox[0].select(); |
||||
|
// get selected cell
|
||||
|
var cell = self.plugin.getSelectedCell(); |
||||
|
var match, |
||||
|
cellWidth = cell[0].style.width || cell[0].width || '', |
||||
|
cellHeight = cell[0].style.height || cell[0].height || ''; |
||||
|
if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) { |
||||
|
widthBox.val(match[1]); |
||||
|
widthTypeBox.val(match[2]); |
||||
|
} else { |
||||
|
widthBox.val(''); |
||||
|
} |
||||
|
if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) { |
||||
|
heightBox.val(match[1]); |
||||
|
heightTypeBox.val(match[2]); |
||||
|
} |
||||
|
textAlignBox.val(cell[0].style.textAlign || ''); |
||||
|
verticalAlignBox.val(cell[0].style.verticalAlign || ''); |
||||
|
var border = cell[0].style.borderWidth || ''; |
||||
|
if (border) { |
||||
|
border = parseInt(border); |
||||
|
} |
||||
|
borderBox.val(border); |
||||
|
_setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || '')); |
||||
|
_setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || '')); |
||||
|
widthBox[0].focus(); |
||||
|
widthBox[0].select(); |
||||
|
}, |
||||
|
insert : function() { |
||||
|
this.prop(true); |
||||
|
}, |
||||
|
'delete' : function() { |
||||
|
var table = self.plugin.getSelectedTable(); |
||||
|
self.cmd.range.setStartBefore(table[0]).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
table.remove(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
colinsert : function(offset) { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
index = cell.cellIndex + offset; |
||||
|
// 取得第一行的index
|
||||
|
index += table.rows[0].cells.length - row.cells.length; |
||||
|
|
||||
|
for (var i = 0, len = table.rows.length; i < len; i++) { |
||||
|
var newRow = table.rows[i], |
||||
|
newCell = newRow.insertCell(index); |
||||
|
newCell.innerHTML = K.IE ? '' : '<br />'; |
||||
|
// 调整下一行的单元格index
|
||||
|
index = _getCellIndex(table, newRow, newCell); |
||||
|
} |
||||
|
self.cmd.range.selectNodeContents(cell).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
colinsertleft : function() { |
||||
|
this.colinsert(0); |
||||
|
}, |
||||
|
colinsertright : function() { |
||||
|
this.colinsert(1); |
||||
|
}, |
||||
|
rowinsert : function(offset) { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0]; |
||||
|
var rowIndex = row.rowIndex; |
||||
|
if (offset === 1) { |
||||
|
rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset; |
||||
|
} |
||||
|
var newRow = table.insertRow(rowIndex); |
||||
|
|
||||
|
for (var i = 0, len = row.cells.length; i < len; i++) { |
||||
|
// 调整cell个数
|
||||
|
if (row.cells[i].rowSpan > 1) { |
||||
|
len -= row.cells[i].rowSpan - 1; |
||||
|
} |
||||
|
var newCell = newRow.insertCell(i); |
||||
|
// copy colspan
|
||||
|
if (offset === 1 && row.cells[i].colSpan > 1) { |
||||
|
newCell.colSpan = row.cells[i].colSpan; |
||||
|
} |
||||
|
newCell.innerHTML = K.IE ? '' : '<br />'; |
||||
|
} |
||||
|
// 调整rowspan
|
||||
|
for (var j = rowIndex; j >= 0; j--) { |
||||
|
var cells = table.rows[j].cells; |
||||
|
if (cells.length > i) { |
||||
|
for (var k = cell.cellIndex; k >= 0; k--) { |
||||
|
if (cells[k].rowSpan > 1) { |
||||
|
cells[k].rowSpan += 1; |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
self.cmd.range.selectNodeContents(cell).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
rowinsertabove : function() { |
||||
|
this.rowinsert(0); |
||||
|
}, |
||||
|
rowinsertbelow : function() { |
||||
|
this.rowinsert(1); |
||||
|
}, |
||||
|
rowmerge : function() { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
rowIndex = row.rowIndex, // 当前行的index
|
||||
|
nextRowIndex = rowIndex + cell.rowSpan, // 下一行的index
|
||||
|
nextRow = table.rows[nextRowIndex]; // 下一行
|
||||
|
// 最后一行不能合并
|
||||
|
if (table.rows.length <= nextRowIndex) { |
||||
|
return; |
||||
|
} |
||||
|
var cellIndex = cell.cellIndex; // 下一行单元格的index
|
||||
|
if (nextRow.cells.length <= cellIndex) { |
||||
|
return; |
||||
|
} |
||||
|
var nextCell = nextRow.cells[cellIndex]; // 下一行单元格
|
||||
|
// 上下行的colspan不一致时不能合并
|
||||
|
if (cell.colSpan !== nextCell.colSpan) { |
||||
|
return; |
||||
|
} |
||||
|
cell.rowSpan += nextCell.rowSpan; |
||||
|
nextRow.deleteCell(cellIndex); |
||||
|
self.cmd.range.selectNodeContents(cell).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
colmerge : function() { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
rowIndex = row.rowIndex, // 当前行的index
|
||||
|
cellIndex = cell.cellIndex, |
||||
|
nextCellIndex = cellIndex + 1; |
||||
|
// 最后一列不能合并
|
||||
|
if (row.cells.length <= nextCellIndex) { |
||||
|
return; |
||||
|
} |
||||
|
var nextCell = row.cells[nextCellIndex]; |
||||
|
// 左右列的rowspan不一致时不能合并
|
||||
|
if (cell.rowSpan !== nextCell.rowSpan) { |
||||
|
return; |
||||
|
} |
||||
|
cell.colSpan += nextCell.colSpan; |
||||
|
row.deleteCell(nextCellIndex); |
||||
|
self.cmd.range.selectNodeContents(cell).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
rowsplit : function() { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
rowIndex = row.rowIndex; |
||||
|
// 不是可分割单元格
|
||||
|
if (cell.rowSpan === 1) { |
||||
|
return; |
||||
|
} |
||||
|
var cellIndex = _getCellIndex(table, row, cell); |
||||
|
for (var i = 1, len = cell.rowSpan; i < len; i++) { |
||||
|
var newRow = table.rows[rowIndex + i], |
||||
|
newCell = newRow.insertCell(cellIndex); |
||||
|
if (cell.colSpan > 1) { |
||||
|
newCell.colSpan = cell.colSpan; |
||||
|
} |
||||
|
newCell.innerHTML = K.IE ? '' : '<br />'; |
||||
|
// 调整下一行的单元格index
|
||||
|
cellIndex = _getCellIndex(table, newRow, newCell); |
||||
|
} |
||||
|
K(cell).removeAttr('rowSpan'); |
||||
|
self.cmd.range.selectNodeContents(cell).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
colsplit : function() { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
cellIndex = cell.cellIndex; |
||||
|
// 不是可分割单元格
|
||||
|
if (cell.colSpan === 1) { |
||||
|
return; |
||||
|
} |
||||
|
for (var i = 1, len = cell.colSpan; i < len; i++) { |
||||
|
var newCell = row.insertCell(cellIndex + i); |
||||
|
if (cell.rowSpan > 1) { |
||||
|
newCell.rowSpan = cell.rowSpan; |
||||
|
} |
||||
|
newCell.innerHTML = K.IE ? '' : '<br />'; |
||||
|
} |
||||
|
K(cell).removeAttr('colSpan'); |
||||
|
self.cmd.range.selectNodeContents(cell).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
coldelete : function() { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
index = cell.cellIndex; |
||||
|
for (var i = 0, len = table.rows.length; i < len; i++) { |
||||
|
var newRow = table.rows[i], |
||||
|
newCell = newRow.cells[index]; |
||||
|
if (newCell.colSpan > 1) { |
||||
|
newCell.colSpan -= 1; |
||||
|
if (newCell.colSpan === 1) { |
||||
|
K(newCell).removeAttr('colSpan'); |
||||
|
} |
||||
|
} else { |
||||
|
newRow.deleteCell(index); |
||||
|
} |
||||
|
// 跳过不需要删除的行
|
||||
|
if (newCell.rowSpan > 1) { |
||||
|
i += newCell.rowSpan - 1; |
||||
|
} |
||||
|
} |
||||
|
if (row.cells.length === 0) { |
||||
|
self.cmd.range.setStartBefore(table).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
K(table).remove(); |
||||
|
} else { |
||||
|
self.cmd.selection(true); |
||||
|
} |
||||
|
self.addBookmark(); |
||||
|
}, |
||||
|
rowdelete : function() { |
||||
|
var table = self.plugin.getSelectedTable()[0], |
||||
|
row = self.plugin.getSelectedRow()[0], |
||||
|
cell = self.plugin.getSelectedCell()[0], |
||||
|
rowIndex = row.rowIndex; |
||||
|
// 从下到上删除
|
||||
|
for (var i = cell.rowSpan - 1; i >= 0; i--) { |
||||
|
table.deleteRow(rowIndex + i); |
||||
|
} |
||||
|
if (table.rows.length === 0) { |
||||
|
self.cmd.range.setStartBefore(table).collapse(true); |
||||
|
self.cmd.select(); |
||||
|
K(table).remove(); |
||||
|
} else { |
||||
|
self.cmd.selection(true); |
||||
|
} |
||||
|
self.addBookmark(); |
||||
|
} |
||||
|
}; |
||||
|
self.clickToolbar(name, self.plugin.table.prop); |
||||
|
}); |
||||
@ -0,0 +1,14 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
</head> |
||||
|
<body> |
||||
|
<h3> |
||||
|
<img align="left" height="100" style="margin-right: 10px" width="100" />在此处输入标题 |
||||
|
</h3> |
||||
|
<p> |
||||
|
在此处输入内容 |
||||
|
</p> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,42 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
</head> |
||||
|
<body> |
||||
|
<h3> |
||||
|
标题 |
||||
|
</h3> |
||||
|
<table style="width:100%;" cellpadding="2" cellspacing="0" border="1"> |
||||
|
<tbody> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<h3>标题1</h3> |
||||
|
</td> |
||||
|
<td> |
||||
|
<h3>标题1</h3> |
||||
|
</td> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<td> |
||||
|
内容1 |
||||
|
</td> |
||||
|
<td> |
||||
|
内容2 |
||||
|
</td> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<td> |
||||
|
内容3 |
||||
|
</td> |
||||
|
<td> |
||||
|
内容4 |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
<p> |
||||
|
表格说明 |
||||
|
</p> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,36 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8" /> |
||||
|
</head> |
||||
|
<body> |
||||
|
<p> |
||||
|
在此处输入内容 |
||||
|
</p> |
||||
|
<ol> |
||||
|
<li> |
||||
|
描述1 |
||||
|
</li> |
||||
|
<li> |
||||
|
描述2 |
||||
|
</li> |
||||
|
<li> |
||||
|
描述3 |
||||
|
</li> |
||||
|
</ol> |
||||
|
<p> |
||||
|
在此处输入内容 |
||||
|
</p> |
||||
|
<ul> |
||||
|
<li> |
||||
|
描述1 |
||||
|
</li> |
||||
|
<li> |
||||
|
描述2 |
||||
|
</li> |
||||
|
<li> |
||||
|
描述3 |
||||
|
</li> |
||||
|
</ul> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,58 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('template', function(K) { |
||||
|
var self = this, name = 'template', lang = self.lang(name + '.'), |
||||
|
htmlPath = self.pluginsPath + name + '/html/'; |
||||
|
function getFilePath(fileName) { |
||||
|
return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION); |
||||
|
} |
||||
|
self.clickToolbar(name, function() { |
||||
|
var lang = self.lang(name + '.'), |
||||
|
arr = ['<div style="padding:10px 20px;">', |
||||
|
'<div class="ke-header">', |
||||
|
// left start
|
||||
|
'<div class="ke-left">', |
||||
|
lang. selectTemplate + ' <select>']; |
||||
|
K.each(lang.fileList, function(key, val) { |
||||
|
arr.push('<option value="' + key + '">' + val + '</option>'); |
||||
|
}); |
||||
|
html = [arr.join(''), |
||||
|
'</select></div>', |
||||
|
// right start
|
||||
|
'<div class="ke-right">', |
||||
|
'<input type="checkbox" id="keReplaceFlag" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>', |
||||
|
'</div>', |
||||
|
'<div class="ke-clearfix"></div>', |
||||
|
'</div>', |
||||
|
'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>', |
||||
|
'</div>'].join(''); |
||||
|
var dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 500, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var doc = K.iframeDoc(iframe); |
||||
|
self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
var selectBox = K('select', dialog.div), |
||||
|
checkbox = K('[name="replaceFlag"]', dialog.div), |
||||
|
iframe = K('iframe', dialog.div); |
||||
|
checkbox[0].checked = true; |
||||
|
iframe.attr('src', getFilePath(selectBox.val())); |
||||
|
selectBox.change(function() { |
||||
|
iframe.attr('src', getFilePath(this.value)); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,51 @@ |
|||||
|
/******************************************************************************* |
||||
|
* KindEditor - WYSIWYG HTML Editor for Internet |
||||
|
* Copyright (C) 2006-2011 kindsoft.net |
||||
|
* |
||||
|
* @author Roddy <luolonghao@gmail.com> |
||||
|
* @site http://www.kindsoft.net/
|
||||
|
* @licence http://www.kindsoft.net/license.php
|
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
KindEditor.plugin('wordpaste', function(K) { |
||||
|
var self = this, name = 'wordpaste'; |
||||
|
self.clickToolbar(name, function() { |
||||
|
var lang = self.lang(name + '.'), |
||||
|
html = '<div style="padding:10px 20px;">' + |
||||
|
'<div style="margin-bottom:10px;">' + lang.comment + '</div>' + |
||||
|
'<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' + |
||||
|
'</div>', |
||||
|
dialog = self.createDialog({ |
||||
|
name : name, |
||||
|
width : 450, |
||||
|
title : self.lang(name), |
||||
|
body : html, |
||||
|
yesBtn : { |
||||
|
name : self.lang('yes'), |
||||
|
click : function(e) { |
||||
|
var str = doc.body.innerHTML; |
||||
|
str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags); |
||||
|
self.insertHtml(str).hideDialog().focus(); |
||||
|
} |
||||
|
} |
||||
|
}), |
||||
|
div = dialog.div, |
||||
|
iframe = K('iframe', div), |
||||
|
doc = K.iframeDoc(iframe); |
||||
|
if (!K.IE) { |
||||
|
doc.designMode = 'on'; |
||||
|
} |
||||
|
doc.open(); |
||||
|
doc.write('<!doctype html><html><head><title>WordPaste</title></head>'); |
||||
|
doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">'); |
||||
|
if (!K.IE) { |
||||
|
doc.write('<br />'); |
||||
|
} |
||||
|
doc.write('</body></html>'); |
||||
|
doc.close(); |
||||
|
if (K.IE) { |
||||
|
doc.body.contentEditable = 'true'; |
||||
|
} |
||||
|
iframe[0].contentWindow.focus(); |
||||
|
}); |
||||
|
}); |
||||
|
After Width: | Height: | Size: 371 B |
|
After Width: | Height: | Size: 43 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 989 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,143 @@ |
|||||
|
/* container */ |
||||
|
.ke-container-qq { |
||||
|
display: block; |
||||
|
border: 1px solid #c3c3c3; |
||||
|
background-color: #FFF; |
||||
|
overflow: hidden; |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
} |
||||
|
/* toolbar */ |
||||
|
.ke-container-qq .ke-toolbar { |
||||
|
border-bottom: 1px solid #c3c3c3; |
||||
|
background-color: #FFFFFF; |
||||
|
padding: 2px 5px; |
||||
|
text-align: left; |
||||
|
overflow: hidden; |
||||
|
zoom: 1; |
||||
|
} |
||||
|
.ke-toolbar-icon-url { |
||||
|
background-image: url(editor.gif); |
||||
|
width:18px; |
||||
|
*xwidth:20px; |
||||
|
height:18px; |
||||
|
*xheight:20px; |
||||
|
} |
||||
|
.ke-icon-checked{ |
||||
|
background-image: url(../default/default.png); |
||||
|
width:16px; |
||||
|
height:16px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-bold{ |
||||
|
background-position: 4px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-italic{ |
||||
|
background-position: -27px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-italic{ |
||||
|
background-position: -28px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-underline{ |
||||
|
background-position: -60px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-fontname{ |
||||
|
background-position: -95px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-fontsize{ |
||||
|
background-position: -128px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-forecolor{ |
||||
|
background-position: -159px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-hilitecolor{ |
||||
|
background-position: -190px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-plug-align{ |
||||
|
background-position: -223px 1px; |
||||
|
} |
||||
|
.plug-align-justifyleft{ |
||||
|
background-position: -350px 1px; |
||||
|
} |
||||
|
.plug-align-justifycenter{ |
||||
|
background-position: -382px 1px; |
||||
|
} |
||||
|
.plug-align-justifyright{ |
||||
|
background-position: -414px 1px; |
||||
|
} |
||||
|
.plug-order-insertorderedlist{ |
||||
|
background-position: -446px 1px; |
||||
|
} |
||||
|
.plug-order-insertunorderedlist{ |
||||
|
background-position: -477px 1px; |
||||
|
} |
||||
|
.plug-indent-indent{ |
||||
|
background-position: -513px 1px; |
||||
|
} |
||||
|
.plug-indent-outdent{ |
||||
|
background-position: -545px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-plug-order{ |
||||
|
background-position: -255px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-plug-indent{ |
||||
|
background-position: -287px 1px; |
||||
|
} |
||||
|
.ke-container-qq .ke-icon-link{ |
||||
|
background-position: -319px 1px; |
||||
|
} |
||||
|
|
||||
|
.ke-container-qq .ke-toolbar .ke-outline { |
||||
|
cursor: default; |
||||
|
padding:0px; |
||||
|
border:1px solid #fff; |
||||
|
} |
||||
|
.ke-container-qq .ke-toolbar .ke-on { |
||||
|
border-left:1px solid white; |
||||
|
border-top:1px solid white; |
||||
|
border-right:1px solid gray; |
||||
|
border-bottom:1px solid gray; |
||||
|
background-color: #FFFFFF; |
||||
|
} |
||||
|
.ke-container-qq .ke-toolbar .ke-selected { |
||||
|
border-left:1px solid gray; |
||||
|
border-top:1px solid gray; |
||||
|
border-right:1px solid white; |
||||
|
border-bottom:1px solid white; |
||||
|
background-color: #FFFFFF; |
||||
|
} |
||||
|
.ke-container-qq .ke-toolbar .ke-disabled { |
||||
|
cursor: default; |
||||
|
} |
||||
|
|
||||
|
.ke-colorpicker-qq{ |
||||
|
background:#fff; |
||||
|
} |
||||
|
/* statusbar */ |
||||
|
.ke-container-qq .ke-statusbar { |
||||
|
display:none; |
||||
|
} |
||||
|
/* menu */ |
||||
|
.ke-menu-qq { |
||||
|
border:1px solid #a6a6a6; |
||||
|
position:absolute; |
||||
|
background:#fff; |
||||
|
-moz-box-shadow:2px 2px 4px #DDDDDD; |
||||
|
z-index:999; |
||||
|
left:-400px; |
||||
|
top:-386px; |
||||
|
right:218px; |
||||
|
width:130px; |
||||
|
} |
||||
|
.ke-menu-qq .ke-menu-item { |
||||
|
padding:0px; |
||||
|
background:#fff; |
||||
|
} |
||||
|
.ke-menu-qq .ke-menu-item-on { |
||||
|
border:1px solid #000080;background:#FFEEC2;color:#036; |
||||
|
} |
||||
|
.ke-menu-qq .ke-toolbar .ke-selected { |
||||
|
border:1px solid #9a9afb; |
||||
|
} |
||||
|
.ke-menu-qq .ke-menu-item-left{ |
||||
|
width:auto; |
||||
|
} |
||||
@ -0,0 +1,100 @@ |
|||||
|
/* container */ |
||||
|
.ke-container-simple { |
||||
|
display: block; |
||||
|
border: 1px solid #CCC; |
||||
|
background-color: #FFF; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
/* toolbar */ |
||||
|
.ke-container-simple .ke-toolbar { |
||||
|
border-bottom: 1px solid #CCC; |
||||
|
background-color: #FFF; |
||||
|
padding: 2px 5px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.ke-container-simple .ke-toolbar .ke-outline { |
||||
|
border: 1px solid #FFF; |
||||
|
background-color: transparent; |
||||
|
margin: 1px; |
||||
|
padding: 1px 2px; |
||||
|
font-size: 0; |
||||
|
line-height: 0; |
||||
|
overflow: hidden; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.ke-container-simple .ke-toolbar .ke-on { |
||||
|
border: 1px solid #5690D2; |
||||
|
} |
||||
|
.ke-container-simple .ke-toolbar .ke-selected { |
||||
|
border: 1px solid #5690D2; |
||||
|
background-color: #E9EFF6; |
||||
|
} |
||||
|
.ke-container-simple .ke-toolbar .ke-disabled { |
||||
|
cursor: default; |
||||
|
} |
||||
|
/* statusbar */ |
||||
|
.ke-container-simple .ke-statusbar { |
||||
|
position: relative; |
||||
|
background-color: #FFF; |
||||
|
border-top: 1px solid #CCCCCC; |
||||
|
font-size: 0; |
||||
|
line-height: 0; |
||||
|
*height: 12px; |
||||
|
overflow: hidden; |
||||
|
text-align: center; |
||||
|
cursor: s-resize; |
||||
|
} |
||||
|
/* menu */ |
||||
|
.ke-menu-simple { |
||||
|
border: 1px solid #A0A0A0; |
||||
|
background-color: #FFF; |
||||
|
color: #222222; |
||||
|
padding: 2px; |
||||
|
font-family: "sans serif",tahoma,verdana,helvetica; |
||||
|
font-size: 12px; |
||||
|
text-align: left; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
.ke-menu-simple .ke-menu-item { |
||||
|
border: 1px solid #FFF; |
||||
|
background-color: #FFF; |
||||
|
color: #222222; |
||||
|
height: 24px; |
||||
|
overflow: hidden; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.ke-menu-simple .ke-menu-item-on { |
||||
|
border: 1px solid #5690D2; |
||||
|
background-color: #FFF; |
||||
|
} |
||||
|
/* colorpicker */ |
||||
|
.ke-colorpicker-simple { |
||||
|
border: 1px solid #A0A0A0; |
||||
|
background-color: #FEFEFE; |
||||
|
color: #222222; |
||||
|
padding: 2px; |
||||
|
} |
||||
|
.ke-colorpicker-simple .ke-colorpicker-cell { |
||||
|
font-size: 0; |
||||
|
line-height: 0; |
||||
|
border: 1px solid #FEFEFE; |
||||
|
cursor: pointer; |
||||
|
margin:3px; |
||||
|
padding:0; |
||||
|
} |
||||
|
.ke-colorpicker-simple .ke-colorpicker-cell-top { |
||||
|
font-family: "sans serif",tahoma,verdana,helvetica; |
||||
|
font-size: 12px; |
||||
|
line-height: 24px; |
||||
|
border: 1px solid #FEFEFE; |
||||
|
cursor: pointer; |
||||
|
margin:0; |
||||
|
padding:0; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.ke-colorpicker-simple .ke-colorpicker-cell-on { |
||||
|
border: 1px solid #5690D2; |
||||
|
} |
||||
|
.ke-colorpicker-simple .ke-colorpicker-cell-selected { |
||||
|
border: 1px solid #2446AB; |
||||
|
} |
||||