@ -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; |
|||
} |
|||