From 23ed660c1ee262a84e85d70de028d1c52bbdd419 Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 14:08:27 +0000 Subject: [PATCH 001/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20chptc?= =?UTF-8?q?ha=EC=95=A0=EB=93=9C=EC=98=A8=20=EB=B2=88=EC=97=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5865 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/captcha/conf/info.xml | 48 +++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml index 86ac1a3b1..e838fc5a6 100644 --- a/addons/captcha/conf/info.xml +++ b/addons/captcha/conf/info.xml @@ -1,12 +1,17 @@ Captcha 애드온 + 验证码插件 Captchaアドオン Captcha元件 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다. 로그인하지 않은 경우에만 해당됩니다. + + 为了解决互联网垃圾而开发的验证码机制。 + 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。 + ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを入力する際、ランダムな文字や数字の列を画面に表示し、表示されたものと同じ情報を入力して、データを登録させるアドオンです。 ログインしてない時だけ、動作します。 @@ -20,45 +25,54 @@ zero - zero + zero + zero zero Captcha 표시 대상 - Captchaを表示する対象 - Captcha顯示的目標 + 应用对象 + Captchaを表示する対象 + Captcha顯示的目標 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 - 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 - 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 + 可以指定验证码应用对象(管理员除外)。 + 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 + 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 로그인하지 않은 사용자 - ログインしてないユーザー - 無法登入的用戶 + 非登录用户 + ログインしてないユーザー + 無法登入的用戶 모든 사용자 - すべてのユーザー - 所有用戶 + 所有用户 + すべてのユーザー + 所有用戶 동작 방식 - 動作方式 - 行為模式 + 验证方式 + 動作方式 + 行為模式 "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 - "1回だけ表示"を選択すると、1回だけ動作した後、その情報を保存して次回からはCaptchaを見せないようにし、もう一つのオプションは毎回Captchaを表示します。 - 選擇"單次",在發生第一次行為後,該行為會儲存,下次不會再顯示;選擇"每次"則會一直顯示。 + "一次"就是每个IP只出现一次验证。 + "1回だけ表示"を選択すると、1回だけ動作した後、その情報を保存して次回からはCaptchaを見せないようにし、もう一つのオプションは毎回Captchaを表示します。 + 選擇"單次",在發生第一次行為後,該行為會儲存,下次不會再顯示;選擇"每次"則會一直顯示。 1번만 동작 - 1回だけ表示 - 單次 + 一次 + 1回だけ表示 + 單次 매번 동작 - 毎回表示 - 每次 + 每次 + 毎回表示 + 每次 From 6482144a8a9e5b625defa91c15ca599f1e2b2797 Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 14:58:58 +0000 Subject: [PATCH 002/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=B6=84=20=EB=B2=88=EC=97=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5866 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/captcha/lang/zh-CN.lang.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 addons/captcha/lang/zh-CN.lang.php diff --git a/addons/captcha/lang/zh-CN.lang.php b/addons/captcha/lang/zh-CN.lang.php new file mode 100644 index 000000000..01b475e15 --- /dev/null +++ b/addons/captcha/lang/zh-CN.lang.php @@ -0,0 +1,21 @@ +about_captcha = "请选择与显示名称相一致的图片。"; + $lang->target_captcha = array( + "airplane" => "飞机", + "apple" => "苹果", + "book" => "书", + "camera" => "摄像机", + "dog" => "狗", + "earth" => "地球", + "flag" => "旗帜", + "mobile" => "手机", + "note" => "音符", + "skeleton" => "骷髅", + ); +?> From c7959bfb8b434be691249a7da4d3db32bee2eeef Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 14:59:17 +0000 Subject: [PATCH 003/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=B6=84=20=EB=B2=88=EC=97=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5867 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/keyword_link/conf/info.xml | 34 +++++++++++++++---------------- addons/wiki_link/conf/info.xml | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addons/keyword_link/conf/info.xml b/addons/keyword_link/conf/info.xml index 9820dfcfe..a83f631bc 100644 --- a/addons/keyword_link/conf/info.xml +++ b/addons/keyword_link/conf/info.xml @@ -18,7 +18,7 @@ 此插件将自动给主题正文及评论中的关键字添加相应的预设链接。 多个关键字可以用逗号(,)来区分输入。 - 多个关键字的优先级以输入顺序准。 + 多个关键字的优先级以输入顺序为准。 將文章與評論中和關鍵字相對應的文字自動作連結。 @@ -45,7 +45,7 @@ cssquery - cssquery + cssquery cssquery cssquery cssquery @@ -53,7 +53,7 @@ xe_board 게시판 스킨이면 공백으로 두면 됩니다. jQuery cssquery的部份可以置換。 如果是使用xe_board討論板面板,請留白。 - 替换部分的jQuery cssquery。 + 替换部分的jQuery cssquery。 如果正使用的是官方默认皮肤(xe_board),此处留空即可。 置き換える部分のjQuery cssqueryです。 xe_board掲示板スキンの場合、空白にして下さい。 @@ -63,13 +63,13 @@ 링크 방법 - 链接方式 + 链接方式 連結方式 リンクの貼りつけ方 The way to make a link 키워드가 여러개 있을때 "첫번째 키워드"에만 링크를 걸 것인지 "모든 키워드"에 걸 것인지 선택합니다. - 有多个预设关键字时,在此可以指定链接方式。 + 有多个预设关键字时,在此可以指定链接方式。 키워드가 여러개 있을때 "첫번째 키워드"에만 링크를 걸 것인지 "모든 키워드"에 걸 것인지 선택합니다. @@ -78,14 +78,14 @@ For the multiple keywords, choose if make a link to the first keyword, or all the keywords 첫번째 키워드 - 首个关键字 + 首个关键字 第一關鍵字 最初のキーワード First keyword 모든 키워드 - 所有关键字 + 所有关键字 所有關鍵字 全てのキーワード All keywords @@ -94,70 +94,70 @@ 키워드 - 关键字 + 关键字 關鍵字 キーワード Keyword 링크 - 链接 + 链接 連結 リンク Link 키워드 - 关键字 + 关键字 關鍵字 キーワード Keyword 링크 - 链接 + 链接 連結 リンク Link 키워드 - 关键字 + 关键字 關鍵字 キーワード Keyword 링크 - 链接 + 链接 連結 リンク Link 키워드 - 关键字 + 关键字 關鍵字 キーワード Keyword 링크 - 链接 + 链接 連結 リンク Link 키워드 - 关键字 + 关键字 關鍵字 キーワード Keyword 링크 - 链接 + 链接 連結 リンク Link diff --git a/addons/wiki_link/conf/info.xml b/addons/wiki_link/conf/info.xml index 2a22f9e3e..4f402bb74 100644 --- a/addons/wiki_link/conf/info.xml +++ b/addons/wiki_link/conf/info.xml @@ -21,7 +21,7 @@ haneul - haneul + haneul haneul haneul From 274baa1de74a8f5cf525c41ea4977a37cee73a1e Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 15:00:20 +0000 Subject: [PATCH 004/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=EB=B2=88=EC=97=AD=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5868 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/zh-CN.lang.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lang/zh-CN.lang.php b/common/lang/zh-CN.lang.php index c7abcecc5..e2e7b2d8a 100644 --- a/common/lang/zh-CN.lang.php +++ b/common/lang/zh-CN.lang.php @@ -269,7 +269,7 @@ $lang->is_required = '必填'; // ftp 相关 - $lang->ftp_form_title = '输入FTP信息'; + $lang->ftp_form_title = '设置FTP信息'; $lang->ftp = 'FTP'; $lang->ftp_port = 'FTP port'; $lang->cmd_check_ftp_connect = '测试FTP连接'; From 2b39c09737ac5d56ad6dea8771792c88ab339b38 Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 15:01:04 +0000 Subject: [PATCH 005/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=B6=84=20=EB=B2=88=EC=97=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5869 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/cafeXE/conf/info.xml | 4 +- layouts/cafeXE/lang/zh-CN.lang.php | 4 +- modules/homepage/conf/info.xml | 8 +- modules/install/lang/zh-CN.lang.php | 18 ++-- modules/layout/faceoff/conf/info.xml | 10 +- modules/layout/lang/zh-CN.lang.php | 151 +++++++++++++-------------- 6 files changed, 98 insertions(+), 97 deletions(-) diff --git a/layouts/cafeXE/conf/info.xml b/layouts/cafeXE/conf/info.xml index 090af86b0..baa9d8f06 100644 --- a/layouts/cafeXE/conf/info.xml +++ b/layouts/cafeXE/conf/info.xml @@ -1,13 +1,13 @@ XE Cafe 공식 레이아웃 - 官方站点模块布局 + 站点模块官方布局 虛擬網站官網版面 XE Cafe 공식 레이아웃입니다. - 官方站点模块布局。 + 站点模块官方布局。 虛擬網站官網版面。 diff --git a/layouts/cafeXE/lang/zh-CN.lang.php b/layouts/cafeXE/lang/zh-CN.lang.php index 5a515145b..098589955 100644 --- a/layouts/cafeXE/lang/zh-CN.lang.php +++ b/layouts/cafeXE/lang/zh-CN.lang.php @@ -1,5 +1,5 @@ new_members = '有什么新成员'; + $lang->new_members = '新会员'; $lang->document_ranking = '发帖排行'; - $lang->comment_ranking = '评论排名'; + $lang->comment_ranking = '评论排行'; ?> diff --git a/modules/homepage/conf/info.xml b/modules/homepage/conf/info.xml index fec263966..83d0b703f 100644 --- a/modules/homepage/conf/info.xml +++ b/modules/homepage/conf/info.xml @@ -18,10 +18,10 @@ zero - zero - zero - zero - zero + zero + zero + zero + zero zero diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index 1208ae745..73262a9f1 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -2,13 +2,13 @@ /** * @file zh-CN.lang.php * @author zero (zero@nzeo.com) - * @brief 中文语言包 (只收录了基本内容) + * @brief 安装模块简体中文语言包 **/ - $lang->introduce_title = '安装 XE'; + $lang->introduce_title = 'XE GNU通用许可协议'; $lang->license = <<GNU通用公共许可证 - 翻译文 @@ -184,7 +184,7 @@ END OF TERMS AND CONDITIONS EndOfLicense; - $lang->install_condition_title = "确认安装所需环境。"; + $lang->install_condition_title = "检测运行环境"; $lang->install_checklist_title = array( 'php_version' => 'PHP版本', @@ -213,9 +213,9 @@ EndOfLicense; $lang->install_session_auto_start = 'PHP设置中设置成session.auto_start==1,可能处理session时发生错误。'; $lang->install_permission_denied = '安装目录属性不是707!'; - $lang->cmd_agree_license = '同意条款'; + $lang->cmd_agree_license = '同意'; $lang->cmd_install_fix_checklist = '已设置了必要的安装条件。'; - $lang->cmd_install_next = '开始进行安装'; + $lang->cmd_install_next = '开始安装'; $lang->cmd_ignore = '忽略'; $lang->db_desc = array( @@ -228,10 +228,10 @@ EndOfLicense; 'firebird' => '使用Firebird DB。', ); - $lang->form_title = '输入数据库及管理员信息'; + $lang->form_title = '数据库及管理员基本信息'; $lang->db_title = '输入数据库信息'; $lang->db_type = '数据库类型'; - $lang->select_db_type = '请选择要使用的数据库。'; + $lang->select_db_type = '选择数据库'; $lang->db_hostname = '服务器名'; $lang->db_port = '数据库端口'; $lang->db_userid = 'DB用户名'; diff --git a/modules/layout/faceoff/conf/info.xml b/modules/layout/faceoff/conf/info.xml index fd012d65c..14de00072 100644 --- a/modules/layout/faceoff/conf/info.xml +++ b/modules/layout/faceoff/conf/info.xml @@ -1,8 +1,10 @@ XE Face off 레이아웃 + XE Face off官方布局 XE Face off 版面 XE FaceOff 레이아웃입니다. + XE Face off官方布局。 XE FaceOff版面 0.1 2009-01-02 @@ -68,7 +70,7 @@ 로고 글자 ロゴ文字 - 标志字符 + 网站标题 Logo文字 LOGO characters LOGO Zeichen @@ -76,7 +78,7 @@ LOGO caracteres 레이아웃의 상단에 표시될 로고 글자를 입력해주세요. 로고 이미지가 있으면 표시되지 않습니다. レイアウトの上部に表示されるロゴの文字を入力してください。ロゴ画像がある場合は表示されません。 - 顶部的徽标上的显示布局,请输入字母。如果图片不显示徽标。 + 请输入网站标题(如已经使用了LOGO图片,此标题将不会显示出来)。 請輸入要顯示在版面上方的文字。 Logo at the top of the display layout, please enter the letters. If the image does not display the logo. Logo am oberen Rand des Displays Layout, geben Sie bitte die Buchstaben. Wenn das Bild nicht das Logo. @@ -86,7 +88,7 @@ 카피라이트 문구 Copyright文具 - 版权所有文具 + 网站版权文档 版權所有 Copyright Stationery Copyright Stationery @@ -94,7 +96,7 @@ Papel del derecho de autor 하단에 표시될 카피라이트 문구를 설정할 수 있습니다 レイアウトの下部に表示されるcopyrightフレーズを入力してください。 - 布局显示在下方的版权声明请。 + 请输入网站版权文档。 請輸入要顯示在版面下方的版權聲明。 Layout displayed in the bottom of the copyright notice please. Layout angezeigt, im unteren Teil der Urheberrechtsschutz bitte. diff --git a/modules/layout/lang/zh-CN.lang.php b/modules/layout/lang/zh-CN.lang.php index 2114021e9..acbe36481 100644 --- a/modules/layout/lang/zh-CN.lang.php +++ b/modules/layout/lang/zh-CN.lang.php @@ -1,14 +1,12 @@ - * @brief 布局(layout) 模块语言包 + * @author zero 翻译:guny + * @brief 布局(layout) 模块简体中文语言包 **/ $lang->cmd_layout_management = '布局设置'; $lang->cmd_layout_edit = '布局编辑'; - $lang->cmd_preview = '预览'; - $lang->cmd_reset = '初始化'; $lang->layout_name = '布局名'; $lang->layout_maker = "布局作者"; @@ -31,84 +29,85 @@ $lang->about_layout_code = "修改的布局代码保存后即可生效。 保存之前请必须先预览后再保存。 - XE 布局语法请参考XE 模板。"; + XE布局语法请参考XE模板。"; + + $lang->layout_export = '导出'; + $lang->layout_btn_export = '下载布局设置'; + $lang->about_layout_export = '可以导出当前已修改好的布局。'; + $lang->layout_import = '导入'; + $lang->about_layout_import = '导入之前请利用导出功能备份好当前的布局及设置,因为导入会删除当前的布局及设置。'; - $lang->layout_export = '내보내기'; - $lang->layout_btn_export = '내 레이아웃 다운로드'; - $lang->about_layout_export = '현재 수정된 레이아웃을 내보내기를 합니다.'; - $lang->layout_import = '가져오기'; - $lang->about_layout_import = '가져오기를 할 경우 기존 수정된 레이아웃을 삭제가 됩니다. 가져오기를 하기전에 내보내기를 통해 백업을 하시기 바랍니다.'; $lang->layout_manager = array( - 0 => '레이아웃 매니저', - 1 => '저장', - 2 => '취소', - 3 => '형태', - 4 => '배열', - 5 => '정렬', - 6 => '고정 레이아웃', - 7 => '가변 레이아웃', - 8 => '고정+가변(내용)', - 9 => '1칸', - 10 => '2칸 (내용 왼쪽)', - 11 => '2칸 (내용 오른쪽)', - 12 => '3칸 (내용 왼쪽)', - 13 => '3칸 (내용 가운데)', - 14 => '3칸 (내용 오른쪽)', - 15 => '왼쪽', - 16 => '가운데', - 17 => '오른쪽', - 18 => '전체', - 19 => '레이아웃', - 20 => '위젯 추가', - 21 => '내용 위젯 추가', - 22 => '속성', - 23 => '위젯 스타일', - 24 => '수정', - 25 => '삭제', - 26 => '정렬', - 27 => '한줄 차지', - 28 => '왼쪽', - 29 => '오른쪽', - 30 => '가로 너비', - 31 => '높이', - 32 => '바깥 여백', - 33 => '안쪽 여백', - 34 => '위', - 35 => '왼', - 36 => '오른', - 37 => '아래', - 38 => '테두리', - 39 => '없음', - 40 => '배경', - 41 => '색상', - 42 => '그림', - 43 => '선택', - 44 => '배경 그림 반복', - 45 => '반복', - 46 => '반복 안함', - 47 => '가로 반복', - 48 => '세로 반복', - 49 => '적용', - 50 => '취소', - 51 => '초기화', - 52 => '글자', - 53 => '글자 폰트', - 54 => '글자 색', + 0 => '布局管理器', + 1 => '保存', + 2 => '取消', + 3 => '宽度', + 4 => '版式', + 5 => '对齐', + 6 => '固定宽度', + 7 => '自适应宽度', + 8 => '固定+自适应(内容)', + 9 => '1栏', + 10 => '2栏 (左侧内容区)', + 11 => '2栏 (右侧内容区)', + 12 => '3栏 (左侧内容区)', + 13 => '3栏 (剧中内容区)', + 14 => '3栏 (右侧内容区)', + 15 => '左对齐', + 16 => '剧中对齐', + 17 => '右对齐', + 18 => '全局', + 19 => '布局', + 20 => '添加控件', + 21 => '添加内容', + 22 => '属性', + 23 => '控件样式', + 24 => '修改', + 25 => '删除', + 26 => '对齐', + 27 => '占段落', + 28 => '左对齐', + 29 => '右对齐', + 30 => '宽度', + 31 => '高度', + 32 => '外边距', + 33 => '内填充', + 34 => '上', + 35 => '左', + 36 => '右', + 37 => '下', + 38 => '边框', + 39 => '无', + 40 => '背景', + 41 => '颜色', + 42 => '图片', + 43 => '选择', + 44 => '背景重复', + 45 => '平铺', + 46 => '不重复', + 47 => '水平重复', + 48 => '垂直重复', + 49 => '应用', + 50 => '取消', + 51 => '初始化', + 52 => '字体', + 53 => '字体', + 54 => '文字颜色', ); - $lang->layout_image_repository = '레이아웃 파일 저장소'; - $lang->about_layout_image_repository = '선택된 레이아웃에 사용될 이미지/플래시파일등을 올릴 수 있습니다. 내보내기에 같이 포함이 됩니다'; - $lang->msg_layout_image_target = 'gif, png, jpg, swf, flv파일만 가능합니다'; - $lang->layout_migration = '레이아웃 내보내기/ 들이기'; - $lang->about_layout_migration = '수정된 레이아웃을 tar 파일로 내보내거나 tar 파일로 저장된 것을 불러올 수 있습니다'."\n".'(아직은 faceOff레이아웃만 내보내기/들이기가 됩니다'; + $lang->layout_image_repository = '布局文件库'; + $lang->about_layout_image_repository = '可以上传要在所选布局中使用的图片/FLASH文件(导出时包含此库文件)。'; + $lang->msg_layout_image_target = '只允许上传gif, png, jpg, swf, flv文件。'; + $lang->layout_migration = '导入/导出'; + $lang->about_layout_migration = '可以把已修改好的布局导出为tar文件或把已有的tar文件直接导入。'."\n".'(目前此功能只能在faceOff布局中使用)'; $lang->about_faceoff = array( - 'title' => 'XpressEngine FaceOff Layout 관리자', - 'description' => 'FaceOff Layout관리자는 웹상에서 쉽게 레이아웃을 꾸밀 수 있습니다.
아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요', - 'layout' => 'FaceOff는 위와 같은 HTML 구조로 되어 있습니다.
이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
위젯 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', - 'setting' => '좌측 상단의 메뉴에 대해 설명 드립니다.
  • 저장 : 설정된 내용을 저장합니다.
  • 취소 : 설정한 내용을 저장하지 않고 돌아갑니다.
  • 초기화 : 아무 설정도 되어 있지 않은 백지 상태로 돌립니다
  • 형태 : 고정/ 가변/ 고정+가변(내용)의 형태를 지정합니다.
  • 배열 : Extension 2개와 Content를 배열합니다.
  • 정렬 : 레이아웃의 위치를 정렬시킬 수 있습니다.
', - 'hotkey' => '마우스로 각 영역을 선택하면서 Hot Key를 이용하시면 더 쉽게 꾸미실 수 있습니다.
  • tab 키 : 위젯이 선택되어 있지 않으면 Header, Body, Footer 순으로 선택됩니다. 위젯이 선택되어 있다면 다음 위젯으로 선택이 이동됩니다.
  • Shift + tab키 : tab키와 반대 역할을 합니다.
  • Esc : 아무것도 선택되어 있지 않을때 Esc를 누르면 Neck, Extension(e1,e2),Knee 순서대로 선택이 되며 위젯이 선택되어 있다면 선택된 위젯을 감싸는 영역이 선택됩니다.
  • 방향키 : 위젯이 선택되어 있을때 방향키를 이용하여 위젯을 다른 영역으로 이동시킬 수 있습니다.
', - 'attribute' => '위젯을 제외한 각 영역들은 모두 배경 색/ 이미지를 지정할 수 있고 글자색(a 태그 포함됨)을 정할 수 있습니다.', + 'title' => 'XpressEngine FaceOff布局管理工具', + 'description' => '利用FaceOff布局管理工具,可以在线随意布置您的布局。
请仔细查看下面的布局示意图和功能简介后,尽情发挥吧!
FaceOff的布局示意图如下:', + 'layout' => '根据布局示意图,对其进行宽度/版式/对齐方式的调整。
控件插入区为Extension(e1, e2)区和Neck, Knee区。
另外的Body, Layout, Header, Body, Footer区可以使用Style来进行渲染,Content区是内容显示区。', + 'setting' => '布局管理工具顶部左侧菜单说明:
  • 保存 : 保存已修改的设置
  • 取消 : 不保存返回
  • 初始化 : 重置为空白布局
  • 宽度 : 可指定固定/自适应/固定+自适应(内容)布局宽度样式
  • 版式 : 可布置2个Extension区和Content区的样式
  • 对齐 : 布局对齐方式
', + 'hotkey' => '选取各个区域可以利用鼠标,还可以利用快捷键:
  • tab键 : 当前没有被选取的控件,选取顺序为: Header, Body, Footer;已有被选取的控件,将选取下一个控件。
  • Shift + tab键 : 与tab键作用相反。
  • Esc键 : 当前没有被选取的区域,选取顺序为: Neck, Extension(e1,e2),Knee;已有被选取的控件,将选取包含此控件的区域。
  • 方向键 : 已有被选取的控件时,可以利用方向键移到别的区域。
', + 'attribute' => '除控件之外的各个区域都可以对其指定背景色/背景图片及字体颜色(包括a标签)。', ); ?> From b6cb9a104520c0703134c69f2bb0b5c8435fce9b Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 15:04:47 +0000 Subject: [PATCH 006/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=B6=84=20=EB=B2=88=EC=97=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5870 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/ldap/conf/info.xml | 4 +-- modules/ldap/lang/zh-CN.lang.php | 33 +++++++++++++++++++ modules/member/lang/zh-CN.lang.php | 8 ++--- modules/planet/lang/zh-CN.lang.php | 2 +- modules/wiki/lang/zh-CN.lang.php | 13 ++++++++ modules/wiki/skins/xe_wiki/skin.xml | 2 +- widgets/content/conf/info.xml | 10 +++--- widgets/logged_members/conf/info.xml | 14 ++++---- widgets/logged_members/skins/default/skin.xml | 2 +- widgets/navigator/conf/info.xml | 2 ++ .../navigator/skins/horiNavigator/skin.xml | 11 +++++++ widgets/navigator/skins/tree/skin.xml | 2 +- .../navigator/skins/vertNavigator/skin.xml | 4 +++ .../newest_comment/skins/xe_official/skin.xml | 2 +- .../skins/xe_official/skin.xml | 2 +- .../newest_images/skins/xe_official/skin.xml | 2 +- widgets/planet_document/conf/info.xml | 5 ++- widgets/rank_count/conf/info.xml | 2 +- widgets/rank_count/skins/default/skin.xml | 3 ++ widgets/rank_point/conf/info.xml | 2 +- widgets/rank_point/skins/default/skin.xml | 3 ++ widgets/site_info/conf/info.xml | 4 +-- widgets/site_info/skins/default/skin.xml | 4 +-- 23 files changed, 104 insertions(+), 32 deletions(-) create mode 100644 modules/ldap/lang/zh-CN.lang.php create mode 100644 modules/wiki/lang/zh-CN.lang.php diff --git a/modules/ldap/conf/info.xml b/modules/ldap/conf/info.xml index 62131e057..2b7e629f9 100644 --- a/modules/ldap/conf/info.xml +++ b/modules/ldap/conf/info.xml @@ -35,8 +35,8 @@ interlock zero - zero - zero + zero + zero zero zero diff --git a/modules/ldap/lang/zh-CN.lang.php b/modules/ldap/lang/zh-CN.lang.php new file mode 100644 index 000000000..5416ad41d --- /dev/null +++ b/modules/ldap/lang/zh-CN.lang.php @@ -0,0 +1,33 @@ + 翻译:guny + * @brief LDAP认证模块中文语言包 + **/ + + $lang->ldap = 'LDAP认证'; + $lang->use_ldap = '使用LDAP认证'; + $lang->ldap_server = 'LDAP服务器地址'; + $lang->ldap_port = 'LDAP服务器端口号'; + $lang->ldap_userdn_prefix = '用户前缀'; + $lang->ldap_userdn_suffix = '用户后缀'; + $lang->ldap_basedn = '基准DN'; + + $lang->ldap_email_entry = 'Email字段名'; + $lang->ldap_nickname_entry = '昵称字段名'; + $lang->ldap_username_entry = '用户名字段名'; + $lang->ldap_group_entry = '用户组字段名'; + + $lang->about_use_ldap = '洋相使用LDAP认证,请先勾选此项。'; + $lang->about_ldap_server = '请输入LDAP服务器地址。'; + $lang->about_ldap_port = '请输入LDAP服务器端口号。'; + $lang->about_ldap_userdn_prefix = '请输入用户前缀(例: cn= )。'; + $lang->about_ldap_userdn_suffix = '请输入用户后缀(例: @abc.com)。'; + $lang->about_ldap_basedn = '请输入基准DN(例: dc=abc,dc=com)。'; + + $lang->about_ldap_email_entry = '请输入在LDAP信息中,使用为Email信息的字段名(禁止重复)。'; + $lang->about_ldap_username_entry = '请输入在LDAP信息中,使用为用户名信息的字段名(禁止重复)。'; + $lang->about_ldap_nickname_entry = '请输入在LDAP信息中,使用为昵称信息的字段名(禁止重复)。'; + $lang->about_ldap_group_entry = '请输入在LDAP信息中,使用为用户组信息的字段名。'; + +?> diff --git a/modules/member/lang/zh-CN.lang.php b/modules/member/lang/zh-CN.lang.php index 47f14863c..867c7416a 100644 --- a/modules/member/lang/zh-CN.lang.php +++ b/modules/member/lang/zh-CN.lang.php @@ -36,10 +36,10 @@ $lang->image_mark = '用户图标'; $lang->image_mark_max_width = '宽度限制'; $lang->image_mark_max_height = '高度限制'; - $lang->group_image_mark = 'Group Image Mark'; + $lang->group_image_mark = '用户组图标'; $lang->group_image_mark_max_width = '宽度限制'; $lang->group_image_mark_max_height = '高度限制'; - $lang->group_image_mark_order = '그룹 이미지 마크 순서'; + $lang->group_image_mark_order = '用户组图标顺序'; $lang->signature_max_height = '签名高度限制'; $lang->enable_openid = '支持OpenID'; $lang->enable_join = '允许会员注册'; @@ -148,7 +148,7 @@ $lang->msg_not_uploaded_profile_image = '不能登录签名图像!'; $lang->msg_not_uploaded_image_name = '不能登录昵称图像!'; $lang->msg_not_uploaded_image_mark = '不能登录用户图标!'; - $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; + $lang->msg_not_uploaded_group_image_mark = '可以指定用户组图标。'; $lang->msg_accept_agreement = '您必须同意条款。'; @@ -191,7 +191,7 @@ $lang->about_image_name = '用户昵称可以用小图片来替代显示。'; $lang->about_image_mark = '显示在用户昵称前的小图标。'; - $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; + $lang->about_group_image_mark = '用户名前显示用户组图标。'; $lang->about_profile_image = '可以使用签名图片。'; $lang->about_signature_max_height = '可以限制签名栏高度(0或留空为不限制)。'; $lang->about_accept_agreement = '已阅读全部条款并同意。'; diff --git a/modules/planet/lang/zh-CN.lang.php b/modules/planet/lang/zh-CN.lang.php index c8e3629af..7c6bf0e7f 100644 --- a/modules/planet/lang/zh-CN.lang.php +++ b/modules/planet/lang/zh-CN.lang.php @@ -12,7 +12,7 @@ $lang->planet_whos_planet = "%s的微博"; $lang->planet_whos_favorite = "%s的收藏"; $lang->planet_whos_favorite_list = "'%s'的收藏"; - $lang->planet_favorite = "的微博"; + $lang->planet_favorite = "收藏"; $lang->planet_welcome = "欢迎您来到个人微博!"; diff --git a/modules/wiki/lang/zh-CN.lang.php b/modules/wiki/lang/zh-CN.lang.php new file mode 100644 index 000000000..20f0c8707 --- /dev/null +++ b/modules/wiki/lang/zh-CN.lang.php @@ -0,0 +1,13 @@ +wiki = '维基'; + $lang->not_exist = '无法找到该文档!您可以新建相关文档,当然前提是您有足够的权限。'; + $lang->cmd_create = '新建文档'; + $lang->cmd_wiki_list = '目录'; + $lang->cmd_view_info = '维基信息'; +?> diff --git a/modules/wiki/skins/xe_wiki/skin.xml b/modules/wiki/skins/xe_wiki/skin.xml index d8f27792c..d2d06eb8d 100644 --- a/modules/wiki/skins/xe_wiki/skin.xml +++ b/modules/wiki/skins/xe_wiki/skin.xml @@ -21,7 +21,7 @@ haneul - haneul + haneul haneul haneul diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index ecff6929a..2493845b6 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -24,14 +24,14 @@ select - 추출대상 - 추출대상 - 对象 - 目標 + 추출대상 + 추출대상 + 对象 + 目標 document 게시물 - 게시물 + 게시물 主题 diff --git a/widgets/logged_members/conf/info.xml b/widgets/logged_members/conf/info.xml index 35b860ee3..b0d8d97d3 100644 --- a/widgets/logged_members/conf/info.xml +++ b/widgets/logged_members/conf/info.xml @@ -19,7 +19,7 @@ zero zero zero - zero + zero zero zero @@ -30,13 +30,13 @@ 목록수 リストへの表示数 List Count - Lista Conde + Lista Conde 目录数 列表數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) リストに表示する数の設定です。 (デフォルト5個) You may set number of list to be displayed. (default 5) - Usted puede configurar el número de lista que se muestra. (por defecto 5) + Usted puede configurar el número de lista que se muestra. (por defecto 5) 可设置要显示的目录数。 (默认为5个) 可設置要顯示的列表數。 (預設是5個) @@ -45,13 +45,13 @@ 대상 지정 対象指定 Target - Meta + Meta 模块对象 目標模組 대상을 전체로 하면 홈페이지 접속자 모두가 출력되고 Mid 구분으로 하게 되면 접속한 Mid에 같이 접속한 회원만 출력이 됩니다. 「全体」に指定するとサイトにログインした全ての会員が表示され、「Mid区分」にすると該当Midにアクセスしている会員のみ表示されます。 All on-line members will be displayed when you set target as 'All', or members in same Mid will be displayed when target is 'By Mid'. - Todos los miembros en línea se mostrará cuando establece como objetivo «todos», o de los miembros en el mismo medio se visualizará cuando el objetivo es "a mediados". + Todos los miembros en línea se mostrará cuando establece como objetivo «todos», o de los miembros en el mismo medio se visualizará cuando el objetivo es "a mediados". 选择“全部”将显示全部在线会员,“区分Mid”为显示各模块中的在线会员。 選擇“全部”會顯示全部線上會員,“以 Mid”是顯示各模組中的線上會員。 @@ -59,7 +59,7 @@ 전체 全体 All - Todo + Todo 全部 全部 @@ -68,7 +68,7 @@ Mid 구분 Mid区分 By Mid - Por Mid + Por Mid 区分Mid 以 Mid
diff --git a/widgets/logged_members/skins/default/skin.xml b/widgets/logged_members/skins/default/skin.xml index 00942fc6a..5010c0996 100644 --- a/widgets/logged_members/skins/default/skin.xml +++ b/widgets/logged_members/skins/default/skin.xml @@ -20,7 +20,7 @@ 제로 Zero zero - zero + zero Zero Zero diff --git a/widgets/navigator/conf/info.xml b/widgets/navigator/conf/info.xml index 753cbf6bf..22934ad85 100644 --- a/widgets/navigator/conf/info.xml +++ b/widgets/navigator/conf/info.xml @@ -31,6 +31,8 @@ 开始深度 階層數 출력될 메뉴의 시작 깊이(depth)를 지정할 수 있습니다. 1이 최상단이고 2부터는 선택된 상위 메뉴가 있으면 출력하게 됩니다 + 请指定要显示的菜单开始深度(1为完整菜单,2开始只显示该处一级菜单下的2级菜单)。 + 출력될 메뉴의 시작 깊이(depth)를 지정할 수 있습니다. 1이 최상단이고 2부터는 선택된 상위 메뉴가 있으면 출력하게 됩니다 1 1 depth diff --git a/widgets/navigator/skins/horiNavigator/skin.xml b/widgets/navigator/skins/horiNavigator/skin.xml index 4d027c54f..4aa740465 100755 --- a/widgets/navigator/skins/horiNavigator/skin.xml +++ b/widgets/navigator/skins/horiNavigator/skin.xml @@ -1,36 +1,47 @@ 가로 메뉴 출력 + 横向菜单皮肤 지정된 메뉴 정보를 가로 출력하는 기본 위젯입니다. DHTML 기능을 사용으로 하시면 메뉴에 마우스 오버시 하부 메뉴가 나타나게 됩니다. + + 横向菜单皮肤。 + 0.1 2009-02-19 http://www.zeroboard.com zero + zero 회색 + 灰色 초록색 + 绿色 파란색 + 蓝色 청록색 + 青绿色 오렌지색 + 橙色 빨간색 + 红色 diff --git a/widgets/navigator/skins/tree/skin.xml b/widgets/navigator/skins/tree/skin.xml index d80bc7d57..3e858e0c1 100644 --- a/widgets/navigator/skins/tree/skin.xml +++ b/widgets/navigator/skins/tree/skin.xml @@ -12,7 +12,7 @@ zero - zero + zero zero diff --git a/widgets/navigator/skins/vertNavigator/skin.xml b/widgets/navigator/skins/vertNavigator/skin.xml index 5bd9f40a7..481b51152 100755 --- a/widgets/navigator/skins/vertNavigator/skin.xml +++ b/widgets/navigator/skins/vertNavigator/skin.xml @@ -1,10 +1,14 @@ 세로 메뉴 출력 스킨 + 竖向菜单皮肤 지정된 메뉴 정보를 세로 출력하는 기본 위젯입니다. DHTML기능을 사용으로 하시면 하위메뉴가 마우스 오버시에 레이어로 뜨게 되고 사용으로 하지 않으시면 바로 출력이 됩니다 + + 竖向菜单皮肤。 + 0.1 2009-02-10 http://www.zeroboard.com diff --git a/widgets/newest_comment/skins/xe_official/skin.xml b/widgets/newest_comment/skins/xe_official/skin.xml index 8eca3e929..c75d12c66 100644 --- a/widgets/newest_comment/skins/xe_official/skin.xml +++ b/widgets/newest_comment/skins/xe_official/skin.xml @@ -2,7 +2,7 @@ XE 공식 레이아웃용 최신 댓글 스킨 XE 공식 레이아웃용 최신 댓글 스킨 - XE官方网站最新评论列表皮肤 + 官网最新评论列表皮肤 XE 공식 레이아웃용 최신 댓글 스킨 XE 공식 레이아웃용 최신 댓글 스킨 댓글을 출력합니다 diff --git a/widgets/newest_document/skins/xe_official/skin.xml b/widgets/newest_document/skins/xe_official/skin.xml index b6820dbb5..f6a963994 100644 --- a/widgets/newest_document/skins/xe_official/skin.xml +++ b/widgets/newest_document/skins/xe_official/skin.xml @@ -2,7 +2,7 @@ XE 공식 레이아웃용 최신글 스킨 XE公式 レイアウト用の最新コンテンツ表示スキン - XE官方网站最新主题列表皮肤 + 官网最新主题列表皮肤 XE Official Layout's newest document skin XE官方網站最新主題列表面板 diff --git a/widgets/newest_images/skins/xe_official/skin.xml b/widgets/newest_images/skins/xe_official/skin.xml index dc222987e..f335b61be 100644 --- a/widgets/newest_images/skins/xe_official/skin.xml +++ b/widgets/newest_images/skins/xe_official/skin.xml @@ -2,7 +2,7 @@ 최신 이미지 위젯 기본 스킨 最新イメージ表示のデフォルトスキン - 官方网站图片列表皮肤 + 官网最新图片列表皮肤 Newest Image Widget Default Skin 官方網站最新圖片預設面板 최신 이미지 위젯의 기본 스킨입니다. diff --git a/widgets/planet_document/conf/info.xml b/widgets/planet_document/conf/info.xml index b113a3de4..f90c2c930 100644 --- a/widgets/planet_document/conf/info.xml +++ b/widgets/planet_document/conf/info.xml @@ -75,7 +75,10 @@ 是否重複 Y로 하시면 플래닛 멤버들의 중복을 검사하지 않고 무조건 최신순으로 글을 추출하여 출력합니다 Y로 하시면 플래닛 멤버들의 중복을 검사하지 않고 무조건 최신순으로 글을 추출하여 출력합니다 - 允许重复:不管你发布了多少个主题,按时间顺列出;不重复:只列出每个用户的最近一个主题。 + + 允许重复:不管你发布了多少个主题,按时间顺列出; + 不重复:只列出每个用户的最近一个主题。 + Y로 하시면 플래닛 멤버들의 중복을 검사하지 않고 무조건 최신순으로 글을 추출하여 출력합니다 Y로 하시면 플래닛 멤버들의 중복을 검사하지 않고 무조건 최신순으로 글을 추출하여 출력합니다 可重複:按照時間順序排列顯示主題;不重複:只會顯示用戶最近發表的主題。 diff --git a/widgets/rank_count/conf/info.xml b/widgets/rank_count/conf/info.xml index de39951ec..60bfd2dc8 100644 --- a/widgets/rank_count/conf/info.xml +++ b/widgets/rank_count/conf/info.xml @@ -123,7 +123,7 @@ 用戶組 출력할 회원 그룹명을 입력하세요. 예)준회원,정회원, (선택이 되지 않으면 출력이 되지 않습니다.) 出力する会員グループ名を入力してください(例:準会員、正会員)。(선택이 되지 않으면 출력이 되지 않습니다.) - 请输入要显示的会员组。例)准会员,正会员 (선택이 되지 않으면 출력이 되지 않습니다.) + 请选择要显示的用戶组。例)准会员,正会员。 Enables group's ranking (선택이 되지 않으면 출력이 되지 않습니다.) Permite grupo de la clasificación (선택이 되지 않으면 출력이 되지 않습니다.) Включает учет рейтинга группы (선택이 되지 않으면 출력이 되지 않습니다.) diff --git a/widgets/rank_count/skins/default/skin.xml b/widgets/rank_count/skins/default/skin.xml index e4715b1d4..91a42de47 100644 --- a/widgets/rank_count/skins/default/skin.xml +++ b/widgets/rank_count/skins/default/skin.xml @@ -1,13 +1,16 @@ 기본 회원 랭킹 스킨 + 会员排行默认皮肤 글/댓글/파일업로드 추천/조회수로 회원 랭킹을 출력하는 기본 스킨입니다 + 显示会员排行的默认皮肤(发布主题数/评论数/附件数及推荐/查看数排行)。 0.1 2009-02-23 http://www.zeroboard.com zero + zero diff --git a/widgets/rank_point/conf/info.xml b/widgets/rank_point/conf/info.xml index 71919d168..5e4ebfa07 100644 --- a/widgets/rank_point/conf/info.xml +++ b/widgets/rank_point/conf/info.xml @@ -95,7 +95,7 @@ 出力する会員のグループ名を入力してください(例:準会員、正会員)。 Please input name of group to include. ex) Associate, Regular Group Introduce nombre de grupo a incluir. Ex) Asociado, Grupo Regular - 请输入要显示的会员组。例)准会员,正会员 + 请选择要显示的会员组。例)准会员,正会员 Пожалуйста, введите имя группы для включения. например: Общая, Обычная (Associate, Regular Group) 請輸入要顯示的會員組。例)準會員,正會員
diff --git a/widgets/rank_point/skins/default/skin.xml b/widgets/rank_point/skins/default/skin.xml index da837a8b3..64c430a64 100644 --- a/widgets/rank_point/skins/default/skin.xml +++ b/widgets/rank_point/skins/default/skin.xml @@ -1,13 +1,16 @@ 기본 회원 포인트 랭킹 스킨 + 积分排行默认皮肤 회원의 포인트 랭킹 출력 위젯 기본 스킨 + 积分排行默认皮肤。 0.1 2009-02-23 http://www.zeroboard.com zero + zero diff --git a/widgets/site_info/conf/info.xml b/widgets/site_info/conf/info.xml index 7cd5c9021..2f20aa17b 100644 --- a/widgets/site_info/conf/info.xml +++ b/widgets/site_info/conf/info.xml @@ -11,8 +11,8 @@ zero - zero - zero + zero + zero diff --git a/widgets/site_info/skins/default/skin.xml b/widgets/site_info/skins/default/skin.xml index 5a32711d5..3b7886bf2 100644 --- a/widgets/site_info/skins/default/skin.xml +++ b/widgets/site_info/skins/default/skin.xml @@ -12,8 +12,8 @@ zero - zero - zero + zero + zero From ed53a57a5ded012d43fb89435a7e78ec1ad071f2 Mon Sep 17 00:00:00 2001 From: guny Date: Thu, 12 Mar 2009 15:05:20 +0000 Subject: [PATCH 007/202] =?UTF-8?q?=EC=A4=91=EA=B5=AD=EC=96=B4=20-=20?= =?UTF-8?q?=EC=9C=84=ED=82=A4=20=EB=B2=88=EC=97=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5871 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/wiki/conf/info.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/wiki/conf/info.xml b/modules/wiki/conf/info.xml index 4a10b8f47..0d6eea8a5 100644 --- a/modules/wiki/conf/info.xml +++ b/modules/wiki/conf/info.xml @@ -17,7 +17,7 @@ haneul haneul - haneul + haneul haneul haneul From 7ba0f7e127a30824df52fba5a78bdafaabc7924b Mon Sep 17 00:00:00 2001 From: clench Date: Fri, 13 Mar 2009 04:40:31 +0000 Subject: [PATCH 008/202] =?UTF-8?q?actFinish()=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=BF=BC=EB=A6=AC=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EC=8B=9C=20$str=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EB=A1=9C=EA=B7=B8=EC=97=90=20=EA=B8=B0=EB=A1=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=EC=A0=90=20$str=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=A5=BC=20$log=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5872 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 20d34ea8e..a4045e3e9 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -160,7 +160,7 @@ if(__DEBUG_DB_OUTPUT__ == 1) { $debug_file = _XE_PATH_."files/_debug_db_query.php"; - $buff = sprintf("%s\n",print_r($str,true)); + $buff = sprintf("%s\n",print_r($log,true)); if($display_line) $buff = "\n\n"; From e2259b21f8fb75b0d01843da2c2c352c63fe6201 Mon Sep 17 00:00:00 2001 From: clench Date: Fri, 13 Mar 2009 04:45:22 +0000 Subject: [PATCH 009/202] =?UTF-8?q?join=20=EC=BF=BC=EB=A6=AC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EC=8B=9C=20=EB=8D=94=EB=B8=94=EC=BF=BC=ED=84=B0=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=EC=A0=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5873 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBFirebird.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/db/DBFirebird.class.php b/classes/db/DBFirebird.class.php index ee59b71cb..7f521038c 100644 --- a/classes/db/DBFirebird.class.php +++ b/classes/db/DBFirebird.class.php @@ -794,7 +794,7 @@ foreach($left_tables as $key => $val) { $condition = $this->getLeftCondition($output->left_conditions[$key],$output->column_type,$output->tables); if($condition){ - $left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as '.$key . ' on (' . $condition . ')'; + $left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as "'.$key.'" on (' . $condition . ')'; } } From e119070fae6d9e30d0bfafa6da68171daad2e876 Mon Sep 17 00:00:00 2001 From: royallin Date: Fri, 13 Mar 2009 08:13:47 +0000 Subject: [PATCH 010/202] Modified traditional Chinese git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5874 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/captcha/conf/info.xml | 52 +++++++++---------- addons/wiki_link/conf/info.xml | 2 +- modules/addon/lang/zh-TW.lang.php | 4 +- modules/admin/lang/zh-TW.lang.php | 4 +- modules/board/lang/zh-TW.lang.php | 6 +-- modules/comment/lang/zh-TW.lang.php | 2 +- modules/communication/lang/zh-TW.lang.php | 4 +- modules/counter/lang/zh-TW.lang.php | 2 +- modules/document/lang/zh-TW.lang.php | 4 +- modules/editor/lang/zh-TW.lang.php | 2 +- modules/file/lang/zh-TW.lang.php | 2 +- modules/homepage/lang/zh-TW.lang.php | 4 +- modules/importer/lang/zh-TW.lang.php | 4 +- modules/install/lang/zh-TW.lang.php | 4 +- .../integration_search/lang/zh-TW.lang.php | 2 +- modules/issuetracker/lang/zh-TW.lang.php | 12 ++--- modules/krzip/lang/zh-TW.lang.php | 6 +-- modules/layout/lang/zh-TW.lang.php | 8 +-- modules/ldap/conf/info.xml | 6 +-- modules/ldap/lang/zh-TW.lang.php | 28 +++++----- modules/lifepod/lang/zh-TW.lang.php | 4 +- modules/member/lang/zh-TW.lang.php | 16 +++--- modules/menu/lang/zh-TW.lang.php | 6 +-- modules/message/lang/zh-TW.lang.php | 2 +- modules/module/lang/zh-TW.lang.php | 6 +-- modules/opage/lang/zh-TW.lang.php | 4 +- modules/page/lang/zh-TW.lang.php | 4 +- modules/planet/lang/zh-TW.lang.php | 6 +-- modules/point/lang/zh-TW.lang.php | 6 +-- modules/poll/lang/zh-TW.lang.php | 4 +- modules/rss/lang/zh-TW.lang.php | 2 +- modules/spamfilter/lang/zh-TW.lang.php | 2 +- modules/springnote/lang/zh-TW.lang.php | 6 +-- modules/trackback/lang/zh-TW.lang.php | 2 +- modules/widget/lang/zh-TW.lang.php | 2 +- modules/wiki/conf/info.xml | 2 +- modules/wiki/lang/zh-TW.lang.php | 4 +- modules/wiki/skins/xe_wiki/skin.xml | 2 +- widgets/content/skins/default/skin.xml | 2 +- .../navigator/skins/horiNavigator/skin.xml | 14 ++++- .../navigator/skins/vertNavigator/skin.xml | 7 ++- widgets/rank_count/skins/default/skin.xml | 5 +- 42 files changed, 143 insertions(+), 123 deletions(-) diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml index e838fc5a6..2afdc0797 100644 --- a/addons/captcha/conf/info.xml +++ b/addons/captcha/conf/info.xml @@ -25,54 +25,54 @@ zero - zero - zero + zero + zero zero Captcha 표시 대상 - 应用对象 - Captchaを表示する対象 - Captcha顯示的目標 + 应用对象 + Captchaを表示する対象 + Captcha顯示的目標 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 - 可以指定验证码应用对象(管理员除外)。 - 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 - 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 + 可以指定验证码应用对象(管理员除外)。 + 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 + 管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。 로그인하지 않은 사용자 - 非登录用户 - ログインしてないユーザー - 無法登入的用戶 + 非登录用户 + ログインしてないユーザー + 無法登入的用戶 모든 사용자 - 所有用户 - すべてのユーザー - 所有用戶 + 所有用户 + すべてのユーザー + 所有用戶 동작 방식 - 验证方式 - 動作方式 - 行為模式 + 验证方式 + 動作方式 + 行為模式 "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 - "一次"就是每个IP只出现一次验证。 - "1回だけ表示"を選択すると、1回だけ動作した後、その情報を保存して次回からはCaptchaを見せないようにし、もう一つのオプションは毎回Captchaを表示します。 - 選擇"單次",在發生第一次行為後,該行為會儲存,下次不會再顯示;選擇"每次"則會一直顯示。 + "一次"就是每个IP只出现一次验证。 + "1回だけ表示"を選択すると、1回だけ動作した後、その情報を保存して次回からはCaptchaを見せないようにし、もう一つのオプションは毎回Captchaを表示します。 + 選擇"單次",在發生第一次行為後,該行為會儲存,下次不會再顯示;選擇"每次"則會一直顯示。 1번만 동작 - 一次 - 1回だけ表示 - 單次 + 一次 + 1回だけ表示 + 單次 매번 동작 - 每次 - 毎回表示 - 每次 + 每次 + 毎回表示 + 每次 diff --git a/addons/wiki_link/conf/info.xml b/addons/wiki_link/conf/info.xml index 4f402bb74..2a22f9e3e 100644 --- a/addons/wiki_link/conf/info.xml +++ b/addons/wiki_link/conf/info.xml @@ -21,7 +21,7 @@ haneul - haneul + haneul haneul haneul diff --git a/modules/addon/lang/zh-TW.lang.php b/modules/addon/lang/zh-TW.lang.php index 8a6b99d63..5f7dccf19 100644 --- a/modules/addon/lang/zh-TW.lang.php +++ b/modules/addon/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ addon = "附加元件"; diff --git a/modules/admin/lang/zh-TW.lang.php b/modules/admin/lang/zh-TW.lang.php index a0a8300a8..6e88e1e98 100644 --- a/modules/admin/lang/zh-TW.lang.php +++ b/modules/admin/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ admin_info = '管理員資訊'; diff --git a/modules/board/lang/zh-TW.lang.php b/modules/board/lang/zh-TW.lang.php index a09e5f699..fc0968c66 100644 --- a/modules/board/lang/zh-TW.lang.php +++ b/modules/board/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ board = '討論板'; @@ -25,7 +25,7 @@ $lang->cmd_view_info = '討論板資料'; $lang->cmd_list_setting = '列表設定'; - // 信息、提示.. + // 訊息、提示.. $lang->about_layout_setup = '可直接編輯部落格版面設計原始碼。可把控件原始碼插入到您喜歡的位置。'; $lang->about_board_category = '可以新增/刪除分類項目
分類有異常情況時,可以嘗試重新建立暫存檔。'; $lang->about_except_notice = '設置公告列表項目,不再重複顯示到普通列表當中。'; diff --git a/modules/comment/lang/zh-TW.lang.php b/modules/comment/lang/zh-TW.lang.php index 36ab7a284..524caed1b 100644 --- a/modules/comment/lang/zh-TW.lang.php +++ b/modules/comment/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/comment/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 評論(comment)模組語言 + * @brief 評論(comment)模組正體中文語言 **/ $lang->cmd_comment_do = '將此評論..'; diff --git a/modules/communication/lang/zh-TW.lang.php b/modules/communication/lang/zh-TW.lang.php index a29397541..91ecc392a 100644 --- a/modules/communication/lang/zh-TW.lang.php +++ b/modules/communication/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ communication = '交流'; diff --git a/modules/counter/lang/zh-TW.lang.php b/modules/counter/lang/zh-TW.lang.php index 53e2a6028..317e79577 100644 --- a/modules/counter/lang/zh-TW.lang.php +++ b/modules/counter/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/counter/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 正體中文語言 + * @brief 訪問統計(counter)模組正體中文語言 **/ $lang->counter = "訪問統計"; diff --git a/modules/document/lang/zh-TW.lang.php b/modules/document/lang/zh-TW.lang.php index 4d183dcc4..5ecc79dbe 100644 --- a/modules/document/lang/zh-TW.lang.php +++ b/modules/document/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/document/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 文章(document)模組語言 + * @brief 文章(document)模組正體中文語言 **/ $lang->document_list = '主題列表'; @@ -26,7 +26,7 @@ $lang->about_category_title = '請輸入分類名稱。'; $lang->about_expand = '選擇此項將維持展開狀態。'; $lang->about_category_group_srls = '被選擇的群組才可以檢視此分類。'; - $lang->about_category_color = '設定分類顏色。例)#ff0000'; + $lang->about_category_color = '設定分類顏色。例)紅色為#ff0000'; $lang->cmd_search_next = '繼續搜尋'; diff --git a/modules/editor/lang/zh-TW.lang.php b/modules/editor/lang/zh-TW.lang.php index 25f1f917b..3f4566dac 100644 --- a/modules/editor/lang/zh-TW.lang.php +++ b/modules/editor/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/editor/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 網頁編輯器(editor)模組語言 + * @brief 網頁編輯器(editor)模組正體中文語言 **/ $lang->editor = '網頁編輯器'; diff --git a/modules/file/lang/zh-TW.lang.php b/modules/file/lang/zh-TW.lang.php index b4a637207..64a964be0 100644 --- a/modules/file/lang/zh-TW.lang.php +++ b/modules/file/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/file/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 附加檔案(file)模組語言 + * @brief 附加檔案(file)模組正體中文語言 **/ $lang->file = '附加檔案'; diff --git a/modules/homepage/lang/zh-TW.lang.php b/modules/homepage/lang/zh-TW.lang.php index 7a60c424e..58a35f0ff 100644 --- a/modules/homepage/lang/zh-TW.lang.php +++ b/modules/homepage/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ cafe = "虛擬網站"; diff --git a/modules/importer/lang/zh-TW.lang.php b/modules/importer/lang/zh-TW.lang.php index 30e05ad51..27e40996f 100644 --- a/modules/importer/lang/zh-TW.lang.php +++ b/modules/importer/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ introduce_title = 'XE程式安裝'; diff --git a/modules/integration_search/lang/zh-TW.lang.php b/modules/integration_search/lang/zh-TW.lang.php index 7c16a5721..f2f66efba 100644 --- a/modules/integration_search/lang/zh-TW.lang.php +++ b/modules/integration_search/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/integration_search/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 正體中文語言 + * @brief 綜合搜尋(integration_search)模組正體中文語言 **/ $lang->integration_search = "搜尋"; diff --git a/modules/issuetracker/lang/zh-TW.lang.php b/modules/issuetracker/lang/zh-TW.lang.php index 14d923c44..3d05511b6 100644 --- a/modules/issuetracker/lang/zh-TW.lang.php +++ b/modules/issuetracker/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/issuetracker/lang/zh-TW.lang.php * @author zero (zero@nzeo.com) 翻譯:royallin - * @brief 問題追蹤(Issuetracker)模組語言 + * @brief 問題追蹤(Issuetracker)模組正體中文語言 **/ $lang->issuetracker = '問題追蹤'; @@ -22,15 +22,15 @@ $lang->cmd_accept = '接受'; $lang->svn_url = 'SVN位址'; - $lang->about_svn_url = '請輸入專案的 SVN 位址。'; + $lang->about_svn_url = '請輸入專案的SVN位址。'; $lang->svn_cmd = 'SVN應用程式位置'; - $lang->about_svn_cmd = '請輸入 SVN Client 應用程式位置。(例: /usr/bin/svn)'; + $lang->about_svn_cmd = '請輸入SVN Client應用程式位置。(例: /usr/bin/svn)'; $lang->diff_cmd = 'DIFF應用程式位置'; - $lang->about_diff_cmd = '為了比較 SVN 版本,請輸入 diff 應用程式位置。 (例: /usr/bin/diff)'; + $lang->about_diff_cmd = '為了比較SVN版本,請輸入diff應用程式位置。(例: /usr/bin/diff)'; $lang->svn_userid = 'SVN帳號'; - $lang->about_svn_userid = '必須要驗證時,請輸入帳號來登入 SVN 檔案庫'; + $lang->about_svn_userid = '必須要驗證時,請輸入帳號來登入SVN檔案庫'; $lang->svn_passwd = 'SVN密碼'; - $lang->about_svn_passwd = '必須要驗證時,請輸入密碼來登入 SVN 檔案庫'; + $lang->about_svn_passwd = '必須要驗證時,請輸入密碼來登入SVN檔案庫'; $lang->issue = '問題'; $lang->total_issue = '所有問題'; diff --git a/modules/krzip/lang/zh-TW.lang.php b/modules/krzip/lang/zh-TW.lang.php index 9e2062cfc..dea0022bb 100644 --- a/modules/krzip/lang/zh-TW.lang.php +++ b/modules/krzip/lang/zh-TW.lang.php @@ -2,10 +2,10 @@ /** * @file modules/krzip/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 正體中文語言(包含基本內容) + * @brief 韓國郵編(krzip)模組正體中文語言 **/ - // 一般單詞 + // 一般詞語 $lang->krzip = "韓國郵編"; $lang->krzip_server_hostname = "郵編檢測主機名稱"; $lang->krzip_server_port = "郵編檢測主機端口"; @@ -14,7 +14,7 @@ // 說明 $lang->about_krzip_server_hostname = "請輸入要匯入的檢測結果目錄服務器域名。"; $lang->about_krzip_server_port = "請輸入郵編檢測主機端口。"; - $lang->about_krzip_server_query = "請輸入向郵編檢主機器發出請求的 query url。"; + $lang->about_krzip_server_query = "請輸入向郵編檢主機器發出請求的query url。"; // 錯誤提示 $lang->msg_not_exists_addr = "沒有要搜尋的對象!"; diff --git a/modules/layout/lang/zh-TW.lang.php b/modules/layout/lang/zh-TW.lang.php index ac6792ea1..1067ea077 100644 --- a/modules/layout/lang/zh-TW.lang.php +++ b/modules/layout/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/layout/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 版面設計(layout)模組語言 + * @brief 版面設計(layout)模組正體中文語言 **/ $lang->cmd_layout_management = '版面設置'; @@ -31,10 +31,10 @@ 儲存之前,請先預覽後再儲存。 XE版面設計語法,請參考XE 樣版。"; - $lang->layout_export = '내보내기'; + $lang->layout_export = '匯出'; $lang->layout_btn_export = '내 레이아웃 다운로드'; $lang->about_layout_export = '현재 수정된 레이아웃을 내보내기를 합니다.'; - $lang->layout_import = '가져오기'; + $lang->layout_import = '匯入'; $lang->about_layout_import = '가져오기를 할 경우 기존 수정된 레이아웃을 삭제가 됩니다. 가져오기를 하기전에 내보내기를 통해 백업을 하시기 바랍니다.'; $lang->layout_manager = array( @@ -97,7 +97,7 @@ $lang->layout_image_repository = '레이아웃 파일 저장소'; $lang->about_layout_image_repository = '선택된 레이아웃에 사용될 이미지/플래시파일등을 올릴 수 있습니다. 내보내기에 같이 포함이 됩니다'; - $lang->msg_layout_image_target = 'gif, png, jpg, swf, flv파일만 가능합니다'; + $lang->msg_layout_image_target = '只允許上傳gif, png, jpg, swf, flv等檔案格式。'; $lang->layout_migration = '레이아웃 내보내기/ 들이기'; $lang->about_layout_migration = '수정된 레이아웃을 tar 파일로 내보내거나 tar 파일로 저장된 것을 불러올 수 있습니다'."\n".'(아직은 faceOff레이아웃만 내보내기/들이기가 됩니다'; diff --git a/modules/ldap/conf/info.xml b/modules/ldap/conf/info.xml index 2b7e629f9..4b77e490e 100644 --- a/modules/ldap/conf/info.xml +++ b/modules/ldap/conf/info.xml @@ -24,7 +24,7 @@
LDAP認證模組。 - 感謝적수님(http://ggang.net)提供非常大的幫助。 + 感謝JeokSu(http://ggang.net)的幫忙。 LDAP認証連動モジュール @@ -35,8 +35,8 @@ interlock zero - zero - zero + zero + zero zero zero diff --git a/modules/ldap/lang/zh-TW.lang.php b/modules/ldap/lang/zh-TW.lang.php index 4a480df9d..2d8d218e3 100644 --- a/modules/ldap/lang/zh-TW.lang.php +++ b/modules/ldap/lang/zh-TW.lang.php @@ -2,32 +2,32 @@ /** * @file modules/ldap/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 正體中文語言(包含基本內容) + * @brief LDAP模組正體中文語言 **/ $lang->ldap = 'LDAP'; - $lang->use_ldap = '使用 LDAP'; - $lang->ldap_server = 'LDAP 主機位置'; - $lang->ldap_port = 'LDAP 主機埠口'; + $lang->use_ldap = '使用LDAP'; + $lang->ldap_server = 'LDAP主機位置'; + $lang->ldap_port = 'LDAP主機埠口'; $lang->ldap_userdn_prefix = '前置字元'; $lang->ldap_userdn_suffix = '後綴'; $lang->ldap_basedn = 'base DN'; - $lang->ldap_email_entry = '請輸入 Email'; + $lang->ldap_email_entry = '請輸入Email'; $lang->ldap_nickname_entry = '請輸入暱稱'; $lang->ldap_username_entry = '請輸入使用者名稱'; $lang->ldap_group_entry = '請輸入群組'; $lang->about_use_ldap = '請輸入並檢查所有必填的資料。'; - $lang->about_ldap_server = '請輸入已授權的 LDAP 主機資料。'; - $lang->about_ldap_port = '請輸入 LDAP 主機埠口。'; - $lang->about_ldap_userdn_prefix = '請輸入已授權的 userdn 前置字元。 例) cn='; - $lang->about_ldap_userdn_suffix = '請輸入已授權的 userdn 後綴。例) @abc.com'; - $lang->about_ldap_basedn = '請輸入 base DN 資料夾。 例) dc=abc,dc=com'; + $lang->about_ldap_server = '請輸入已授權的LDAP主機資料。'; + $lang->about_ldap_port = '請輸入LDAP主機埠口。'; + $lang->about_ldap_userdn_prefix = '請輸入已授權的userdn前置字元。 例) cn='; + $lang->about_ldap_userdn_suffix = '請輸入已授權的userdn後綴。例) @abc.com'; + $lang->about_ldap_basedn = '請輸入base DN資料夾。 例) dc=abc,dc=com'; - $lang->about_ldap_email_entry = '請輸入 LDAP 電子郵件資料。(禁止重複)'; - $lang->about_ldap_username_entry = '請輸入 LDAP 使用者名稱。(允許重複)'; - $lang->about_ldap_nickname_entry = '請輸入 LDAP 暱稱。(禁止重複)'; - $lang->about_ldap_group_entry = '請輸入 LDAP 群組資料。'; + $lang->about_ldap_email_entry = '請輸入LDAP電子郵件資料。(禁止重複)'; + $lang->about_ldap_username_entry = '請輸入LDAP使用者名稱。(允許重複)'; + $lang->about_ldap_nickname_entry = '請輸入LDAP暱稱。(禁止重複)'; + $lang->about_ldap_group_entry = '請輸入LDAP群組資料。'; ?> diff --git a/modules/lifepod/lang/zh-TW.lang.php b/modules/lifepod/lang/zh-TW.lang.php index b77a54e9d..5b2821ed1 100644 --- a/modules/lifepod/lang/zh-TW.lang.php +++ b/modules/lifepod/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ lifepod = "Lifepod API"; diff --git a/modules/member/lang/zh-TW.lang.php b/modules/member/lang/zh-TW.lang.php index bc9ced735..06fe93984 100644 --- a/modules/member/lang/zh-TW.lang.php +++ b/modules/member/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ member = '會員'; @@ -36,10 +36,10 @@ $lang->image_mark = '用戶圖示'; $lang->image_mark_max_width = '寬度限制'; $lang->image_mark_max_height = '高度限制'; - $lang->group_image_mark = 'Group Image Mark'; + $lang->group_image_mark = '群組圖示'; $lang->group_image_mark_max_width = '寬度限制'; $lang->group_image_mark_max_height = '高度限制'; - $lang->group_image_mark_order = '그룹 이미지 마크 순서'; + $lang->group_image_mark_order = '群組圖示順序'; $lang->signature_max_height = '簽名檔高度限制'; $lang->enable_openid = '支援OpenID'; $lang->enable_join = '允許會員註冊'; @@ -147,7 +147,7 @@ $lang->msg_not_uploaded_profile_image = '無法登錄個人圖片!'; $lang->msg_not_uploaded_image_name = '無法登錄暱稱圖片!'; $lang->msg_not_uploaded_image_mark = '無法登錄用戶圖示!'; - $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; + $lang->msg_not_uploaded_group_image_mark = '無法登錄群組圖示!'; $lang->msg_accept_agreement = '您必須同意條款。'; @@ -190,18 +190,18 @@ $lang->about_image_name = '用戶暱稱可以用圖片替代。'; $lang->about_image_mark = '顯示在用戶暱稱前的圖示。'; - $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; + $lang->about_group_image_mark = '顯示在用戶群組前的圖示。'; $lang->about_profile_image = '可以使用個人圖片。'; $lang->about_signature_max_height = '可以限制簽名檔高度(0或留空為不限制)。'; $lang->about_accept_agreement = '已閱讀全部條款並同意。'; - $lang->about_member_default = '將成為註冊會員時的預設用戶組。'; + $lang->about_member_default = '將成為註冊會員時的預設群組。'; $lang->about_openid = '用OpenID註冊時,該網站只儲存帳號和郵件等基本資料,密碼和認證處理是在提供OpenID服務的網站中得到解決。'; $lang->about_openid_leave = '刪除OpenID就等於永久刪除站內會員的資料。
被刪除後,再重新登錄就等於新會員註冊,因此對以前自己寫的主題將失去其權限。'; $lang->about_find_member_account = '帳號/密碼將發送到您註冊時,所輸入的電子郵件當中。
輸入註冊時的電子郵件地址後,請按「查詢帳號/密碼」按鈕。
'; - $lang->about_member = "可以新增/修改/刪除會員及管理用戶組或註冊表單的會員管理模組。\n此模組不僅可以建立預設用戶組以外的其他用戶組來管理會員,並且通過註冊表單的管理獲得除會員基本資料以外的延伸資料。"; + $lang->about_member = "可以新增/修改/刪除會員及管理群組或註冊表單的會員管理模組。\n此模組不僅可以建立預設群組以外的其他群組來管理會員,並且通過註冊表單的管理獲得會員基本資料以外的延伸資料。"; $lang->about_ssl_port = '請輸入想要使用預設SSL埠口以外的埠口。'; $lang->add_openid = 'Add OpenID'; ?> diff --git a/modules/menu/lang/zh-TW.lang.php b/modules/menu/lang/zh-TW.lang.php index db527847c..2477aea25 100644 --- a/modules/menu/lang/zh-TW.lang.php +++ b/modules/menu/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/menu/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 選單(menu) 模組的基本語言 + * @brief 選單(menu) 模組正體中文語言 **/ $lang->cmd_menu_insert = '建立選單'; @@ -14,7 +14,7 @@ $lang->depth = '層級'; $lang->parent_menu_name = '主選單名稱'; $lang->menu_name = '選單名稱'; - $lang->menu_srl = '選單固有編號'; + $lang->menu_srl = '選單編號'; $lang->menu_id = '選單名稱'; $lang->menu_url = '連結'; $lang->menu_open_window = '新視窗'; @@ -23,7 +23,7 @@ $lang->menu_normal_btn = '普通'; $lang->menu_hover_btn = '滑鼠移過'; $lang->menu_active_btn = '啟動連結'; - $lang->menu_group_srls = '用戶組'; + $lang->menu_group_srls = '群組'; $lang->layout_maker = "版面作者"; $lang->layout_history = "更新列表"; $lang->layout_info = "版面資料"; diff --git a/modules/message/lang/zh-TW.lang.php b/modules/message/lang/zh-TW.lang.php index 1b43d249f..fee8c19b2 100644 --- a/modules/message/lang/zh-TW.lang.php +++ b/modules/message/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/message/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 正體中文語言(包含基本內容) + * @brief 訊息(message)模組正體中文語言 **/ $lang->message = '錯誤提示'; diff --git a/modules/module/lang/zh-TW.lang.php b/modules/module/lang/zh-TW.lang.php index b392431dd..45f73417b 100644 --- a/modules/module/lang/zh-TW.lang.php +++ b/modules/module/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ virtual_site = "虛擬網站"; @@ -35,7 +35,7 @@ $lang->filebox = "Filebox"; $lang->header_script = "Header Script"; - $lang->about_header_script = "可以直接輸入,並插入到 HTML的<head>之間。
可使用<script>, <style> 或 <meta> 等標籤。"; + $lang->about_header_script = "可以直接輸入,並插入到HTML的<head>之間。
可使用<script>,<style>或<meta>等標籤。"; $lang->grant_access = "訪問"; $lang->grant_manager = "管理"; diff --git a/modules/opage/lang/zh-TW.lang.php b/modules/opage/lang/zh-TW.lang.php index e0a46fe5b..033892a68 100644 --- a/modules/opage/lang/zh-TW.lang.php +++ b/modules/opage/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ opage = "外部頁面"; diff --git a/modules/page/lang/zh-TW.lang.php b/modules/page/lang/zh-TW.lang.php index a39a6d0e0..b7a3625b7 100644 --- a/modules/page/lang/zh-TW.lang.php +++ b/modules/page/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ page = "頁面"; diff --git a/modules/planet/lang/zh-TW.lang.php b/modules/planet/lang/zh-TW.lang.php index ff22959fc..4defe0264 100644 --- a/modules/planet/lang/zh-TW.lang.php +++ b/modules/planet/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ planet = "微型部落格"; @@ -20,7 +20,7 @@ $lang->about_planet = "XE微型部落格模組,可讓會員建立自己的微型部落格。 - 網站模組所使用的網域名稱無法用於微型部落格模組。 + 虛擬網站模組所使用的網域名稱無法用於微型部落格模組。 如果想將微型部落格當作首頁,請先在網站模組中設定其他的網域名稱。"; $lang->planet_mid = "微型部落格連結網址"; diff --git a/modules/point/lang/zh-TW.lang.php b/modules/point/lang/zh-TW.lang.php index a92863e99..cf74de6b7 100644 --- a/modules/point/lang/zh-TW.lang.php +++ b/modules/point/lang/zh-TW.lang.php @@ -8,7 +8,7 @@ $lang->point = "點數"; $lang->level = "等級"; - $lang->about_point_module = "點數系統可以在發表/刪除主題,發表/刪除評論,上傳/下載/刪除/檔案等動作時,付出相對應的點數。
點數系統模組只能設置各項點數,不能記錄點數。只有開啟插件後,才可以正常記錄相關點數。"; + $lang->about_point_module = "點數系統可以在發表/刪除主題,發表/刪除評論,上傳/下載/刪除/檔案等動作時,付出相對應的點數。
點數系統模組只能設置各項點數,不能記錄點數。只有啟用元件後,才可以正常記錄相關點數。"; $lang->about_act_config = "討論板,部落格等模組都有發表/刪除主題,發表/刪除評論等動作。
想要與討論板/部落格之外的模組關聯點數功能時,新增與其各模組功能適合的act值即可。"; $lang->max_level = '最高等級'; @@ -35,9 +35,9 @@ $lang->about_cmd_point_recal = '重置點數。即只保留文章/評論/附加檔案/新會員註冊的相關點數項目。
其中,重置後的新會員註冊點數,將在會員有相關動作(例如:發表主題/評論等)時,才付與其相對應的點數。
此項功能請務必慎用!此項功能只能在資料轉移或真的需要重置所有點數時才可以使用。'; $lang->point_link_group = '自動升級'; - $lang->about_point_link_group = '即用戶組隨等級變化。當等級達到指定等級時,會員所屬用戶組將自動更新成相對應的用戶組。但是更新成新的用戶組時,之前的預設用戶組將自動被刪除。'; + $lang->about_point_link_group = '即群組隨等級變化。當等級達到指定等級時,會員所屬群組將自動更新成相對應的群組。但是更新成新的群組時,之前的預設群組將自動被刪除。'; - $lang->about_module_point = '可以分別對各模組進行點數設置,沒有被設置的模組將使用預設值。
所有點數在相反動作下恢復原始值。即:發表主題後再刪除得到的點數為0分。'; + $lang->about_module_point = '可以分別對各模組進行點數設置,沒有設置的模組將使用預設值。
所有動作在反向操作下將恢復原始值。即:發表主題後再刪除得到的點數為零。'; $lang->point_signup = '註冊'; $lang->point_insert_document = '發表主題'; diff --git a/modules/poll/lang/zh-TW.lang.php b/modules/poll/lang/zh-TW.lang.php index 0ebba7dee..08083d1ae 100644 --- a/modules/poll/lang/zh-TW.lang.php +++ b/modules/poll/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/poll/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 投票調查 (poll) 模組的基本語言 + * @brief 投票調查 (poll) 模組正體中文語言 **/ $lang->poll = "投票調查"; @@ -33,6 +33,6 @@ $lang->search_target_list = array( 'title' => '標題', 'regdate' => '登錄日期', - 'ipaddress' => 'IP 位址', + 'ipaddress' => 'IP位址', ); ?> diff --git a/modules/rss/lang/zh-TW.lang.php b/modules/rss/lang/zh-TW.lang.php index 018cb9106..845fbad67 100644 --- a/modules/rss/lang/zh-TW.lang.php +++ b/modules/rss/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/rss/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief RSS模組正體中文語言 (包含基本內容) + * @brief RSS模組正體中文語言 **/ // 一般語言 diff --git a/modules/spamfilter/lang/zh-TW.lang.php b/modules/spamfilter/lang/zh-TW.lang.php index 627949f6b..8bd197404 100644 --- a/modules/spamfilter/lang/zh-TW.lang.php +++ b/modules/spamfilter/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/spamfilter/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 垃圾過濾(spamfilter)模組正體中文語言(包含基本內容) + * @brief 垃圾過濾(spamfilter)模組正體中文語言 **/ // action 相關 diff --git a/modules/springnote/lang/zh-TW.lang.php b/modules/springnote/lang/zh-TW.lang.php index dfdc984b7..2225373ac 100644 --- a/modules/springnote/lang/zh-TW.lang.php +++ b/modules/springnote/lang/zh-TW.lang.php @@ -1,13 +1,13 @@ springnote = "Springnote"; $lang->springnote_openid = "Open ID"; - $lang->springnote_userkey = "用戶 Key"; + $lang->springnote_userkey = "User Key"; $lang->springnote_pageid = "頁號"; $lang->springnote_pageid_setup = '頁號設置'; $lang->springnote_pageid_option_only = '只顯示指定頁面(不顯示列表)。'; diff --git a/modules/trackback/lang/zh-TW.lang.php b/modules/trackback/lang/zh-TW.lang.php index c1f4877da..10d4690b0 100644 --- a/modules/trackback/lang/zh-TW.lang.php +++ b/modules/trackback/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/trackback/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 引用(trackback)模組的基本語言 + * @brief 引用(trackback)模組正體中文語言 **/ $lang->cmd_toggle_checked_trackback = '反選'; $lang->cmd_delete_checked_trackback = '刪除所選'; diff --git a/modules/widget/lang/zh-TW.lang.php b/modules/widget/lang/zh-TW.lang.php index dc611d59a..308fc9dc5 100644 --- a/modules/widget/lang/zh-TW.lang.php +++ b/modules/widget/lang/zh-TW.lang.php @@ -2,7 +2,7 @@ /** * @file modules/widget/lang/zh-TW.lang.php * @author zero 翻譯:royallin - * @brief 控件(widget)模組語言 + * @brief 控件(widget)模組正體中文語言 **/ $lang->cmd_generate_code = '建立原始碼'; diff --git a/modules/wiki/conf/info.xml b/modules/wiki/conf/info.xml index 0d6eea8a5..4a10b8f47 100644 --- a/modules/wiki/conf/info.xml +++ b/modules/wiki/conf/info.xml @@ -17,7 +17,7 @@ haneul haneul - haneul + haneul haneul haneul diff --git a/modules/wiki/lang/zh-TW.lang.php b/modules/wiki/lang/zh-TW.lang.php index c8ff706fc..10f541c97 100644 --- a/modules/wiki/lang/zh-TW.lang.php +++ b/modules/wiki/lang/zh-TW.lang.php @@ -1,8 +1,8 @@ wiki = '維基'; diff --git a/modules/wiki/skins/xe_wiki/skin.xml b/modules/wiki/skins/xe_wiki/skin.xml index d2d06eb8d..d8f27792c 100644 --- a/modules/wiki/skins/xe_wiki/skin.xml +++ b/modules/wiki/skins/xe_wiki/skin.xml @@ -21,7 +21,7 @@ haneul - haneul + haneul haneul haneul diff --git a/widgets/content/skins/default/skin.xml b/widgets/content/skins/default/skin.xml index 58fd98cbc..7e0dee7c7 100644 --- a/widgets/content/skins/default/skin.xml +++ b/widgets/content/skins/default/skin.xml @@ -2,7 +2,7 @@ Content 위젯 기본 스킨 全局内容控件默认皮肤 - 全局内容控件預設面板 + 内容組件預設面板 Content 위젯 기본 스킨 입니다. Html/Publish: 정찬명 Design : mada diff --git a/widgets/navigator/skins/horiNavigator/skin.xml b/widgets/navigator/skins/horiNavigator/skin.xml index 4aa740465..affedd852 100755 --- a/widgets/navigator/skins/horiNavigator/skin.xml +++ b/widgets/navigator/skins/horiNavigator/skin.xml @@ -1,11 +1,16 @@ 가로 메뉴 출력 + 橫向選單面板 横向菜单皮肤 지정된 메뉴 정보를 가로 출력하는 기본 위젯입니다. DHTML 기능을 사용으로 하시면 메뉴에 마우스 오버시 하부 메뉴가 나타나게 됩니다. + + 可將所指定的選單以水平的方式顯示。 + 使用DHTML功能,當滑鼠移到選單上時才會顯示子選單。 + 横向菜单皮肤。 @@ -15,33 +20,40 @@ zero + zero zero 회색 + 灰色 灰色 초록색 + 綠色 绿色 파란색 + 藍色 蓝色 청록색 + 青色 青绿色 오렌지색 + 橘色 橙色 빨간색 - 红色 + 紅色 + 红色 diff --git a/widgets/navigator/skins/vertNavigator/skin.xml b/widgets/navigator/skins/vertNavigator/skin.xml index 481b51152..b0c1a8cf5 100755 --- a/widgets/navigator/skins/vertNavigator/skin.xml +++ b/widgets/navigator/skins/vertNavigator/skin.xml @@ -1,11 +1,16 @@ 세로 메뉴 출력 스킨 + 縱向選單面板 竖向菜单皮肤 지정된 메뉴 정보를 세로 출력하는 기본 위젯입니다. DHTML기능을 사용으로 하시면 하위메뉴가 마우스 오버시에 레이어로 뜨게 되고 사용으로 하지 않으시면 바로 출력이 됩니다 + + 可將所指定的選單以垂直的方式顯示。 + 使用DHTML功能,當滑鼠移到選單上時才會顯示子選單。 + 竖向菜单皮肤。 @@ -15,7 +20,7 @@ zero - zero + zero zero diff --git a/widgets/rank_count/skins/default/skin.xml b/widgets/rank_count/skins/default/skin.xml index 91a42de47..0fe5e4c3f 100644 --- a/widgets/rank_count/skins/default/skin.xml +++ b/widgets/rank_count/skins/default/skin.xml @@ -2,15 +2,18 @@ 기본 회원 랭킹 스킨 会员排行默认皮肤 + 會員排行預設面板 글/댓글/파일업로드 추천/조회수로 회원 랭킹을 출력하는 기본 스킨입니다 显示会员排行的默认皮肤(发布主题数/评论数/附件数及推荐/查看数排行)。 + 顯示會員排行的預設面板(主題/評論/附加檔案及推薦/點閱數與會員排行)。 0.1 2009-02-23 http://www.zeroboard.com zero - zero + zero + zero From ac7397c38466aeb323cc7e3e578bc82fbc1df038 Mon Sep 17 00:00:00 2001 From: royallin Date: Sat, 14 Mar 2009 00:53:38 +0000 Subject: [PATCH 011/202] Modified common traditional Chinese lang git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5875 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/zh-TW.lang.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index 8242c57b1..fbdfdcf3c 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -205,9 +205,9 @@ $lang->about_layout = '版面設計是佈置網站的外觀模組,在上端版面選單中,可以進行管理'; // 訊息 - $lang->msg_call_server = '系統正在連結服務器,請稍後。'; + $lang->msg_call_server = '系統正在連接伺服器,請稍後。'; $lang->msg_db_not_setted = '還沒有設定資料庫'; - $lang->msg_dbconnect_failed = "連接資料庫時發生錯誤。\n請重新確認資料庫資訊。"; + $lang->msg_dbconnect_failed = '連接資料庫時發生錯誤。\n請重新確認資料庫資訊。'; $lang->msg_invalid_queryid = 'Query ID值指定錯誤'; $lang->msg_not_permitted = '沒有權限'; $lang->msg_input_password = '請輸入密碼'; @@ -293,7 +293,7 @@ $lang->filter->outofrange = '請確認%s字數'; $lang->filter->equalto = '%s值有誤。'; $lang->filter->invalid_email = '%s格式有誤。(例:zbxe@zeroboard.com)'; - $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s只能用英文,數字和 _,第一個字母必須是英文。"; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s只能用英文,數字和 _,開頭必須是英文。"; $lang->filter->invalid_homepage = '%s格式有誤。(例: http://www.zeroboard.com)'; $lang->filter->invalid_korean = '%s只能輸入中文'; $lang->filter->invalid_korean_number = '%s只能輸入中文或數字'; From ca1245f3d5f493c47e1fe248bfb1e8debf170d41 Mon Sep 17 00:00:00 2001 From: misol Date: Sat, 14 Mar 2009 07:05:45 +0000 Subject: [PATCH 012/202] #17846213 It should view the Current Version, not released version. git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5876 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index 60b378b9d..cf387a6fd 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -159,7 +159,7 @@
{$lang->current_version}
- {$released_version} [{$lang->cmd_view}] + {$current_version} [{$lang->cmd_view}] From 310edf30968f88386fab8f37e6c203e2f9202e62 Mon Sep 17 00:00:00 2001 From: misol Date: Sat, 14 Mar 2009 07:08:08 +0000 Subject: [PATCH 013/202] r5876 refix. git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5877 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index cf387a6fd..b7b6f5f09 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -159,7 +159,7 @@
{$lang->current_version}
- {$current_version} [{$lang->cmd_view}] + {$current_version} [{$lang->cmd_view}] From 79ebd516eb4205847c443f232ce847cf1edd6deb Mon Sep 17 00:00:00 2001 From: royallin Date: Sat, 14 Mar 2009 13:34:54 +0000 Subject: [PATCH 014/202] Modified traditional Chinese -modules(file,module) -widgets(content,newes_comment,rank_count) git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5878 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/file/lang/zh-TW.lang.php | 2 +- modules/module/lang/zh-TW.lang.php | 18 +++---- widgets/content/conf/info.xml | 54 ++++++++++++++++--- widgets/content/skins/default/skin.xml | 2 +- .../newest_comment/skins/xe_official/skin.xml | 2 +- widgets/rank_count/conf/info.xml | 14 ++--- 6 files changed, 67 insertions(+), 25 deletions(-) diff --git a/modules/file/lang/zh-TW.lang.php b/modules/file/lang/zh-TW.lang.php index 64a964be0..248658c57 100644 --- a/modules/file/lang/zh-TW.lang.php +++ b/modules/file/lang/zh-TW.lang.php @@ -19,7 +19,7 @@ $lang->allowed_filesize = '檔案大小限制'; $lang->allowed_attach_size = '上傳限制'; $lang->allowed_filetypes = '允許檔案類型'; - $lang->enable_download_group = '允許下載的用戶組'; + $lang->enable_download_group = '允許下載的群組'; $lang->about_allow_outlink = '是否允許連結外部檔案。(*.wmv, *.mp3等影音檔案除外)'; $lang->about_allow_outlink_format = '파일 외부 링크 설정에 관계 없이 허용하는 파일 확장자입니다. 여러개 입력시에 쉼표(,)을 이용해서 구분해주세요.
例)hwp,doc,zip,pdf'; diff --git a/modules/module/lang/zh-TW.lang.php b/modules/module/lang/zh-TW.lang.php index 45f73417b..31d89347f 100644 --- a/modules/module/lang/zh-TW.lang.php +++ b/modules/module/lang/zh-TW.lang.php @@ -25,14 +25,14 @@ $lang->skin_author = '面板作者'; $lang->skin_license = '版權'; $lang->skin_history = '更新事項'; - $lang->module_copy = "複製模組"; - $lang->module_selector = "模組選擇器"; - $lang->do_selected = "選擇項目..."; - $lang->bundle_setup = "整體預設值"; - $lang->bundle_addition_setup = "新增批次設定"; - $lang->bundle_grant_setup = "整體權限設定"; - $lang->lang_code = "語言代碼"; - $lang->filebox = "Filebox"; + $lang->module_copy = '複製模組'; + $lang->module_selector = '模組選擇器'; + $lang->do_selected = '選擇項目...'; + $lang->bundle_setup = '批次設定-設置'; + $lang->bundle_addition_setup = '批次設定-延伸設置'; + $lang->bundle_grant_setup = '批次設定-權限管理'; + $lang->lang_code = '語言代碼'; + $lang->filebox = '檔案管理'; $lang->header_script = "Header Script"; $lang->about_header_script = "可以直接輸入,並插入到HTML的<head>之間。
可使用<script>,<style>或<meta>等標籤。"; @@ -85,6 +85,6 @@ $lang->about_extra_vars_default_value = '當復選或單選的預設值需要很多個時,用逗號(,)區隔。'; $lang->about_search_virtual_site = "請輸入想要搜尋的虛擬網站(XE網咖等)的網域名稱。
가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 不用輸入)"; - $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; + $lang->about_langcode = "想要實現多國語言功能,請按[語言代碼]按鈕。"; $lang->about_file_extension= "只允許%s檔案。"; ?> diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index 2493845b6..2ddba68a6 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -33,30 +33,35 @@ 게시물 게시물 主题 + 主題 comment 댓글 댓글 评论 + 評論 image 첨부이미지 첨부이미지 图片 + 圖片 trackback 트랙백 트랙백 引用 + 引用 rss RSS RSS RSS + RSS @@ -64,29 +69,34 @@ 내용형태 내용형태 内容样式 + 內容樣式 normal 제목 제목 标题 + 標題 image_title 이미지+제목 이미지+제목 图片+标题 + 圖片+標題 gallery 겔러리 겔러리 相册 + 相簿 image_title_content 이미지+제목+내용 이미지+제목+내용 图片+标题+内容 + 圖片+標題+內容 @@ -94,23 +104,27 @@ 탭형태 탭형태 选项卡样式 + 分頁樣式 none 없음 없음 + tab_top 상단 탭형 상단 탭형 顶端选项卡 + 頂端分頁 tab_left 왼쪽 탭형 왼쪽 탭형 左侧选项卡 + 左側分頁 @@ -119,35 +133,41 @@ 표시항목 및 순서 표시항목 및 순서 显示项及顺序 + 顯示項目順序 title 제목 제목 标题 + 標題 thumbnail 섬네일 섬네일 缩略图 + 縮圖 regdate 등록일 등록일 发布日期 + 發表日期 nickname 글쓴이 글쓴이 发布者 + 作者 content 내용 내용 内容 + 內容 @@ -156,17 +176,20 @@ 게시판 이름 표시 게시판 이름 표시 显示版面名称 + 討論板名稱 Y 출력 출력 显示 + 顯示 N 출력하지 않음 출력하지 않음 不显示 + 不顯示 @@ -175,17 +198,20 @@ 댓글수 표시 댓글수 표시 显示评论数 + 評論數 Y 출력 출력 显示 + 顯示 N 출력하지 않음 출력하지 않음 不显示 + 不顯示 @@ -194,17 +220,20 @@ 엮인글수 표시 엮인글수 표시 显示引用数 + 引用數 Y 출력 출력 显示 + 顯示 N 출력하지 않음 출력하지 않음 不显示 + 不顯示 @@ -212,17 +241,20 @@ 분류 표시 분류 표시 显示分类 + 分類 Y 출력 출력 显示 + 顯示 N 출력하지 않음 출력하지 않음 不显示 + 不顯示 @@ -230,17 +262,20 @@ 아이콘 표시 아이콘 표시 显示图标 + 圖示 Y 출력 출력 显示 + 顯示 N 출력하지 않음 출력하지 않음 不显示 + 不顯示 @@ -424,24 +459,29 @@ select 페이지수 - 分页 + 分页 + 頁數 1 1 - 1 + 1 + 1 2 2 - 2 + 2 + 2 3 3 - 3 + 3 + 3 페이지수 2이상일 경우 이전/다음 버튼이 나타납니다. - 分页数在2以上时,将会出现上一页/下一页按钮。 + 分页数在2以上时,将会出现上一页/下一页按钮。 + 頁數在2以上時,會出現上一頁/下一頁按鈕。 text @@ -478,7 +518,8 @@ text 내용 글자수 - 内容摘要字数 + 内容摘要字数 + 內容字數 module_srl_list @@ -506,6 +547,7 @@ RSS URL RSS URL RSS URL은 타입이 RSS일 경우 등록되어야 합니다. + RSS URL은 타입이 RSS일 경우 등록되어야 합니다. text diff --git a/widgets/content/skins/default/skin.xml b/widgets/content/skins/default/skin.xml index 7e0dee7c7..f0d3d7eab 100644 --- a/widgets/content/skins/default/skin.xml +++ b/widgets/content/skins/default/skin.xml @@ -13,7 +13,7 @@ Design : mada Programming : SOL
- 全局内容控件預設面板。 + 内容控件預設面板。 Html/Publish: Chan-Myung Jeong Design : mada Programming : SOL diff --git a/widgets/newest_comment/skins/xe_official/skin.xml b/widgets/newest_comment/skins/xe_official/skin.xml index c75d12c66..907765989 100644 --- a/widgets/newest_comment/skins/xe_official/skin.xml +++ b/widgets/newest_comment/skins/xe_official/skin.xml @@ -4,7 +4,7 @@ XE 공식 레이아웃용 최신 댓글 스킨 官网最新评论列表皮肤 XE 공식 레이아웃용 최신 댓글 스킨 - XE 공식 레이아웃용 최신 댓글 스킨 + XE官網最新評論面板 댓글을 출력합니다 댓글을 출력합니다 显示评论列表。 diff --git a/widgets/rank_count/conf/info.xml b/widgets/rank_count/conf/info.xml index 60bfd2dc8..751f51e99 100644 --- a/widgets/rank_count/conf/info.xml +++ b/widgets/rank_count/conf/info.xml @@ -6,14 +6,14 @@ El artículo, el comentario ranking 会员各项活动排行榜 Рейтинг статей, комментариев - 主題,回覆排行榜 + 主題、評論排行榜 글, 댓글 작성 순위를 출력합니다. 書き込み、コメント作成順位を出力します。 This widget displays articles and comments ranking. Este widget muestra de artículos y comentarios ranking. 按发表主题/评论/附件/推荐/查看数显示会员排行的控件。 Этот виджет отображает рейтинг статей и комментариев. - 顯示會員主題數與回覆數的排行榜。 + 顯示會員發表主題/評論/附檔/推薦/點閱排行的控件。 1.5 2009-02-23 @@ -69,7 +69,7 @@ Article Artículo Статья - 發表主題 + 主題 comment @@ -79,7 +79,7 @@ Comment Comentario Комментарий - 發表評論 + 評論 attach @@ -89,7 +89,7 @@ Attach Adjuntar Вложение - 附件 + 附檔 vote @@ -120,14 +120,14 @@ With Group Con Grupo С группой - 用戶組 + 群組 출력할 회원 그룹명을 입력하세요. 예)준회원,정회원, (선택이 되지 않으면 출력이 되지 않습니다.) 出力する会員グループ名を入力してください(例:準会員、正会員)。(선택이 되지 않으면 출력이 되지 않습니다.) 请选择要显示的用戶组。例)准会员,正会员。 Enables group's ranking (선택이 되지 않으면 출력이 되지 않습니다.) Permite grupo de la clasificación (선택이 되지 않으면 출력이 되지 않습니다.) Включает учет рейтинга группы (선택이 되지 않으면 출력이 되지 않습니다.) - 請輸入要顯示的會員組。例)準會員,正式會員 (선택이 되지 않으면 출력이 되지 않습니다.) + 請輸入要顯示的群組。例)準會員,正式會員 (如果都沒選擇,就不會輸出顯示) text From c796cf467e6f805633f8b71a85634140690bc761 Mon Sep 17 00:00:00 2001 From: royallin Date: Sun, 15 Mar 2009 13:34:47 +0000 Subject: [PATCH 015/202] Add traditional Chinese into widgetstyles git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5879 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/box/skin.xml | 4 ++-- widgetstyles/colorbox/skin.xml | 6 ++++++ widgetstyles/line/skin.xml | 8 ++++++++ widgetstyles/memo/skin.xml | 5 +++++ widgetstyles/round/skin.xml | 9 +++++++++ widgetstyles/simple/skin.xml | 4 ++-- 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/widgetstyles/box/skin.xml b/widgetstyles/box/skin.xml index 96649cc1d..e6b0b41bc 100644 --- a/widgetstyles/box/skin.xml +++ b/widgetstyles/box/skin.xml @@ -2,10 +2,10 @@ 박스 위젯스타일 盒状控件样式 - 盒狀控件樣式 + 外框樣式 박스 위젯스타일 可指定控件盒的样式。 - 可指定盒狀控件樣式。 + 可指定控件箱的外框樣式。 0.1 2009-02-03 diff --git a/widgetstyles/colorbox/skin.xml b/widgetstyles/colorbox/skin.xml index f31c352b2..4d27e5ecb 100644 --- a/widgetstyles/colorbox/skin.xml +++ b/widgetstyles/colorbox/skin.xml @@ -1,7 +1,9 @@ 칼라박스 위젯스타일 + 彩色框樣式 색상이 있는 박스로 꾸며진 위젯스타일 입니다. + 可變換多種色彩外框的控件樣式。 0.1 2009-03-10 preview.gif @@ -17,17 +19,21 @@ 스타일 + 樣式 widgetBoxFblue 파랑색 + 藍色 widgetBoxFgreen 녹색 + 綠色 widgetBoxFred 빨강색 + 紅色 diff --git a/widgetstyles/line/skin.xml b/widgetstyles/line/skin.xml index e75ebfb39..cc654a238 100644 --- a/widgetstyles/line/skin.xml +++ b/widgetstyles/line/skin.xml @@ -1,7 +1,9 @@ 라인 위젯스타일 + 線條樣式 선으로 꾸며진 위젯스타일 입니다. + 可變換多種線條外框的控件樣式。 0.1 2009-03-10 preview.gif @@ -17,25 +19,31 @@ 스타일 + 樣式 widgetBoxA 구분선 + 分隔線 widgetBoxB 박스 + 外框 widgetBoxC 라운드 박스 + 圓角外框 widgetBoxG 제목 박스 + 標題框 widgetBoxJ 색상 박스 + 彩色框 diff --git a/widgetstyles/memo/skin.xml b/widgetstyles/memo/skin.xml index 81de2aec1..ee5c0f28f 100644 --- a/widgetstyles/memo/skin.xml +++ b/widgetstyles/memo/skin.xml @@ -1,7 +1,9 @@ 메모 위젯스타일 + 留言樣式 메모지 처럼 꾸며진 위젯스타일 입니다. + 可變換多種留言外框的控件樣式。 0.1 2009-03-10 preview.gif @@ -17,13 +19,16 @@ 스타일 + 樣式 widgetBoxH 흰색 + 白色 widgetBoxI 노랑 + 黃色 diff --git a/widgetstyles/round/skin.xml b/widgetstyles/round/skin.xml index 306acabc8..8fb778559 100644 --- a/widgetstyles/round/skin.xml +++ b/widgetstyles/round/skin.xml @@ -1,7 +1,9 @@ 라운드 위젯스타일 + 圓角外框樣式 외각이 라운드로 꾸며진 위젯스타일 입니다. + 可變換多種圓角外框的控件樣式。 0.1 2009-03-10 preview.gif @@ -17,29 +19,36 @@ 스타일 + 樣式 widgetBoxDred 빨강색 선 + 紅框 widgetBoxDgreen 녹색 선 + 綠框 widgetBoxDblue 파랑색 선 + 藍框 widgetBoxEred 빨강색 + 紅色 widgetBoxEgreen 녹색 + 綠色 widgetBoxEblue 파랑색 + 藍色 diff --git a/widgetstyles/simple/skin.xml b/widgetstyles/simple/skin.xml index cf659a1e9..700a9b81c 100644 --- a/widgetstyles/simple/skin.xml +++ b/widgetstyles/simple/skin.xml @@ -2,10 +2,10 @@ 제목, more버튼 위젯스타일 简易控件样式 - 標題、more按紐控件樣式 + 簡單樣式 제목과 more버튼만 있는 간단한 위젯 스타일 只有栏目名和查看更多(more)选项的简易控件样式。 - 標題與more按紐的簡單控件樣式。 + 只有標題與more按紐的簡單控件樣式。 0.1 2009-02-03 From b058303c223b8f29beabd663f508cf14f2571211 Mon Sep 17 00:00:00 2001 From: misol Date: Sun, 15 Mar 2009 16:27:32 +0000 Subject: [PATCH 016/202] =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF,=20RSS=20=EA=B8=B0=EB=8A=A5=EC=97=90=20ATOM1.0,RSS1.0?= =?UTF-8?q?=20=EC=9D=BD=EA=B8=B0=20=EB=8A=A5=EB=A0=A5=20=EB=B6=80=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5880 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/content.class.php | 187 +++++++++++++++++++++++++----- 1 file changed, 160 insertions(+), 27 deletions(-) diff --git a/widgets/content/content.class.php b/widgets/content/content.class.php index 709045a3b..7bf3dafb8 100644 --- a/widgets/content/content.class.php +++ b/widgets/content/content.class.php @@ -397,7 +397,7 @@ * @brief rss 주소로 부터 내용을 받아오는 함수 * tistory 의 경우 원본 주소가 location 헤더를 뿜는다. (내용은 없음)이를 해결하기 위한 수정 - rss_reader 위젯과 방식 동일 **/ - function requestRssContents($rss_url) { + function requestFeedContents($rss_url) { // request rss $rss_url = Context::convertEncodingStr($rss_url); $URL_parsed = parse_url($rss_url); @@ -430,7 +430,7 @@ } $header = $oReqeust->getResponseHeader(); if($header['location']) { - return $this->requestRssContents(trim($header['location'])); + return $this->requestFeedContents(trim($header['location'])); } else { return $oReqeust->getResponseBody(); @@ -441,46 +441,179 @@ // 날짜 형태 $DATE_FORMAT = $args->date_format ? $args->date_format : "Y-m-d H:i:s"; - $buff = $this->requestRssContents($args->rss_url); + $buff = $this->requestFeedContents($args->rss_url); $encoding = preg_match("/<\?xml.*encoding=\"(.+)\".*\?>/i", $buff, $matches); - if($encoding && !preg_match("/UTF-8/i", $matches[1])) $buff = trim(iconv($matches[1]=="ks_c_5601-1987"?"EUC-KR":$matches[1], "UTF-8", $buff)); + if($encoding && !preg_match("/UTF-8/i", $matches[1])) $buff = Context::convertEncodingStr($buff); $buff = preg_replace("/<\?xml.*\?>/i", "", $buff); $oXmlParser = new XmlParser(); $xml_doc = $oXmlParser->parse($buff); - $rss->title = $xml_doc->rss->channel->title->body; - $rss->link = $xml_doc->rss->channel->link->body; + if($xml_doc->rss) { + $rss->title = $xml_doc->rss->channel->title->body; + $rss->link = $xml_doc->rss->channel->link->body; - $items = $xml_doc->rss->channel->item; + $items = $xml_doc->rss->channel->item; - if(!$items) return; - if($items && !is_array($items)) $items = array($items); + if(!$items) return; + if($items && !is_array($items)) $items = array($items); - $content_items = array(); + $content_items = array(); - foreach ($items as $key => $value) { - if($key >= $args->list_count * $args->page_count) break; - unset($item); + foreach ($items as $key => $value) { + if($key >= $args->list_count * $args->page_count) break; + unset($item); - foreach($value as $key2 => $value2) { - if(is_array($value2)) $value2 = array_shift($value2); - $item->{$key2} = $this->_getRssBody($value2); + foreach($value as $key2 => $value2) { + if(is_array($value2)) $value2 = array_shift($value2); + $item->{$key2} = $this->_getRssBody($value2); + } + + $content_item = new contentItem($rss->title); + $content_item->setContentsLink($rss->link); + $content_item->setTitle($item->title); + $content_item->setNickName(max($item->author,$item->{'dc:creator'})); + //$content_item->setCategory($item->category); + $item->description = preg_replace('!pubdate,$item->pubDate,$item->{'dc:date'}))); + $content_item->setRegdate($date); + + $content_items[] = $content_item; } + } elseif($xml_doc->{'rdf:RDF'}) { + $rss->title = $xml_doc->{'rdf:RDF'}->channel->title->body; + $rss->link = $xml_doc->{'rdf:RDF'}->channel->link->body; - $content_item = new contentItem($rss->title); - $content_item->setContentsLink($rss->link); - $content_item->setTitle($item->title); - $content_item->setNickName(max($item->author,$item->{'dc:creator'})); - //$content_item->setCategory($item->category); - $item->description = preg_replace('!pubdate,$item->pubDate,$item->{'dc:date'}))); - $content_item->setRegdate($date); + $items = $xml_doc->{'rdf:RDF'}->item; - $content_items[] = $content_item; + if(!$items) return; + if($items && !is_array($items)) $items = array($items); + + $content_items = array(); + + foreach ($items as $key => $value) { + if($key >= $args->list_count * $args->page_count) break; + unset($item); + + foreach($value as $key2 => $value2) { + if(is_array($value2)) $value2 = array_shift($value2); + $item->{$key2} = $this->_getRssBody($value2); + } + + $content_item = new contentItem($rss->title); + $content_item->setContentsLink($rss->link); + $content_item->setTitle($item->title); + $content_item->setNickName(max($item->author,$item->{'dc:creator'})); + //$content_item->setCategory($item->category); + $item->description = preg_replace('!pubdate,$item->pubDate,$item->{'dc:date'}))); + $content_item->setRegdate($date); + + $content_items[] = $content_item; + } + } elseif($xml_doc->{'rdf:rdf'}) { + $rss->title = $xml_doc->{'rdf:rdf'}->channel->title->body; + $rss->link = $xml_doc->{'rdf:rdf'}->channel->link->body; + + $items = $xml_doc->{'rdf:rdf'}->item; + + if(!$items) return; + if($items && !is_array($items)) $items = array($items); + + $content_items = array(); + + foreach ($items as $key => $value) { + if($key >= $args->list_count * $args->page_count) break; + unset($item); + + foreach($value as $key2 => $value2) { + if(is_array($value2)) $value2 = array_shift($value2); + $item->{$key2} = $this->_getRssBody($value2); + } + + $content_item = new contentItem($rss->title); + $content_item->setContentsLink($rss->link); + $content_item->setTitle($item->title); + $content_item->setNickName(max($item->author,$item->{'dc:creator'})); + //$content_item->setCategory($item->category); + $item->description = preg_replace('!pubdate,$item->pubDate,$item->{'dc:date'}))); + $content_item->setRegdate($date); + + $content_items[] = $content_item; + } + } elseif($xml_doc->feed && $xml_doc->feed->attrs->xmlns == 'http://www.w3.org/2005/Atom') { + $rss->title = $xml_doc->feed->title->body; + $links = $xml_doc->feed->link; + if(is_array($links)) { + foreach ($links as $value) { + if($value->attrs->rel == 'alternate') { + $rss->link = $value->attrs->href; + break; + } + } + } + elseif($links->attrs->rel == 'alternate') $rss->link = $links->attrs->href; + + $items = $xml_doc->feed->entry; + + if(!$items) return; + if($items && !is_array($items)) $items = array($items); + + $content_items = array(); + + foreach ($items as $key => $value) { + if($key >= $args->list_count * $args->page_count) break; + unset($item); + + foreach($value as $key2 => $value2) { + if(is_array($value2)) $value2 = array_shift($value2); + $item->{$key2} = $this->_getRssBody($value2); + } + + $content_item = new contentItem($rss->title); + $links = $value->link; + if(is_array($links)) { + foreach ($links as $val) { + if($val->attrs->rel == 'alternate') { + $item->link = $val->attrs->href; + break; + } + } + } + elseif($links->attrs->rel == 'alternate') $item->link = $links->attrs->href; + + $content_item->setContentsLink($rss->link); + if($item->title) { + if(!preg_match("/html/i", $value->title->attrs->type)) $item->title = $value->title->body; + } + $content_item->setTitle($item->title); + $content_item->setNickName(max($item->author,$item->{'dc:creator'})); + //$content_item->setCategory($item->category); + $item->description = preg_replace('!published,$item->updated,$item->{'dc:date'}))); + $content_item->setRegdate($date); + + $content_items[] = $content_item; + } } return $content_items; } From 6e897213c2efa0917553f4fd197cff0b016e616c Mon Sep 17 00:00:00 2001 From: clench Date: Mon, 16 Mar 2009 05:03:46 +0000 Subject: [PATCH 017/202] =?UTF-8?q?-=20=EA=B0=92=EC=97=90=20URL=EC=9D=B4?= =?UTF-8?q?=20=EB=93=A4=EC=96=B4=EA=B0=88=EA=B2=BD=EC=9A=B0=20=EC=8A=AC?= =?UTF-8?q?=EB=9F=AC=EC=8B=9C=EB=A5=BC=20=EC=82=AC=EC=B9=99=EC=97=B0?= =?UTF-8?q?=EC=82=B0=EC=9C=BC=EB=A1=9C=20=EC=B2=98=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=EC=A0=90=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?-=20=ED=95=A8=EC=88=98=EC=9D=98=20=EA=B4=84=ED=98=B8=20?= =?UTF-8?q?=EC=95=88=EC=97=90=20=EB=93=A4=EC=96=B4=EA=B0=80=EB=8A=94=20?= =?UTF-8?q?=EA=B0=92=EC=9D=98=20=EB=8D=94=EB=B8=94=EC=BF=BC=ED=84=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5881 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBFirebird.class.php | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/classes/db/DBFirebird.class.php b/classes/db/DBFirebird.class.php index 7f521038c..b167f92a1 100644 --- a/classes/db/DBFirebird.class.php +++ b/classes/db/DBFirebird.class.php @@ -175,20 +175,17 @@ $as = $this->addDoubleQuotes($as); } - // 함수 사용시 + // 함수 사용시 + $tmpFunc1 = null; + $tmpFunc2 = null; if(($no1 = strpos($string,'('))!==false && ($no2 = strpos($string, ')'))!==false) { - $tmpString1 = substr($string, 0, $no1+1); - $tmpString2 = substr($string, $no1+1, $no2-$no1-1); - $tmpString3 = substr($string, $no2, strlen($string)-$no2+1); - - $tmpString2 = trim($tmpString2); - - if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2); - - $string = $tmpString1.$tmpString2.$tmpString3; + $tmpFunc1 = substr($string, 0, $no1+1); + $tmpFunc2 = substr($string, $no2, strlen($string)-$no2+1); + $string = trim(substr($string, $no1+1, $no2-$no1-1)); } - // 테이블.필드 - else if(($no1 = strpos($string,'.'))!==false) { + + // 테이블.필드 + if(($no1 = strpos($string,'.'))!==false) { $tmpString1 = substr($string, 0, $no1); // table $tmpString2 = substr($string, $no1+1, strlen($string)-$no1+1); // field @@ -199,12 +196,14 @@ if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2); $string = $tmpString1.".".$tmpString2; - } else { $string = $this->addDoubleQuotes($string); } + if($tmpFunc1 != null) $string = $tmpFunc1.$string; + if($tmpFunc2 != null) $string = $string.$tmpFunc2; + if($as !== false) $string = $string." as ".$as; return $string; } @@ -731,7 +730,10 @@ $pos = strpos($value, '+'); if($pos == 0) $pos = strpos($value, '-'); if($pos == 0) $pos = strpos($value, '*'); - if($pos == 0) $pos = strpos($value, '/'); + if($pos == 0) { + $pos = strpos($value, '/'); + if(substr_count($value, ".") > 1) $pos = 0; // value에 url주소가 들어가는경우 + } if($pos != 0) { $substr = substr($value, 0, $pos); From 6c25d6f583a2aacd7654b0d27e8c2b43fe75e5db Mon Sep 17 00:00:00 2001 From: misol Date: Mon, 16 Mar 2009 13:12:32 +0000 Subject: [PATCH 018/202] =?UTF-8?q?Content=20=EC=9C=84=EC=A0=AF,=20RSS?= =?UTF-8?q?=EB=A6=AC=EB=8D=94=20=EA=B8=B0=EB=8A=A5=20=EA=B0=95=ED=99=94.?= =?UTF-8?q?=20(ATOM=201.0=20Spec=20=EC=82=AC=EC=9A=A9=EC=8B=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=ED=99=88=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EA=B0=80=20=EC=9E=88=EC=9C=BC=EB=A9=B4=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=EB=90=98=EA=B2=8C=20=EC=88=98=EC=A0=95,=20Fe?= =?UTF-8?q?ed=EC=97=90=20=EC=9B=90=EB=B3=B8=20=ED=99=88=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=A7=81=ED=81=AC=20=ED=91=9C=EC=8B=9C=20=EB=90=98?= =?UTF-8?q?=EA=B2=8C=20=EC=8A=A4=ED=82=A8=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5882 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/conf/info.xml | 1187 +++++++++++---------- widgets/content/content.class.php | 80 +- widgets/content/skins/default/normal.html | 4 +- 3 files changed, 643 insertions(+), 628 deletions(-) diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index 2ddba68a6..9640d9754 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -1,593 +1,594 @@ - - - Content 위젯 - Content widget - 全局内容控件 - 內容組件 - 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. - 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. - 以各种样式显示主题,评论,附件等站内内容的全局控件。 - 是種可輸出討論板、評論,附加檔案等內容的控件。 - 0.1 - 2009-02-10 - - - sol - sol - sol - sol - sol - sol - sol - - - - - select - 추출대상 - 추출대상 - 对象 - 目標 - - document - 게시물 - 게시물 - 主题 - 主題 - - - comment - 댓글 - 댓글 - 评论 - 評論 - - - image - 첨부이미지 - 첨부이미지 - 图片 - 圖片 - - - trackback - 트랙백 - 트랙백 - 引用 - 引用 - - - rss - RSS - RSS - RSS - RSS - - - - select - 내용형태 - 내용형태 - 内容样式 - 內容樣式 - - normal - 제목 - 제목 - 标题 - 標題 - - - image_title - 이미지+제목 - 이미지+제목 - 图片+标题 - 圖片+標題 - - - gallery - 겔러리 - 겔러리 - 相册 - 相簿 - - - image_title_content - 이미지+제목+내용 - 이미지+제목+내용 - 图片+标题+内容 - 圖片+標題+內容 - - - - select - 탭형태 - 탭형태 - 选项卡样式 - 分頁樣式 - - none - 없음 - 없음 - - - - - tab_top - 상단 탭형 - 상단 탭형 - 顶端选项卡 - 頂端分頁 - - - tab_left - 왼쪽 탭형 - 왼쪽 탭형 - 左侧选项卡 - 左側分頁 - - - - - select-multi-order - 표시항목 및 순서 - 표시항목 및 순서 - 显示项及顺序 - 顯示項目順序 - - title - 제목 - 제목 - 标题 - 標題 - - - thumbnail - 섬네일 - 섬네일 - 缩略图 - 縮圖 - - - regdate - 등록일 - 등록일 - 发布日期 - 發表日期 - - - nickname - 글쓴이 - 글쓴이 - 发布者 - 作者 - - - content - 내용 - 내용 - 内容 - 內容 - - - - - select - 게시판 이름 표시 - 게시판 이름 표시 - 显示版面名称 - 討論板名稱 - - Y - 출력 - 출력 - 显示 - 顯示 - - - N - 출력하지 않음 - 출력하지 않음 - 不显示 - 不顯示 - - - - - select - 댓글수 표시 - 댓글수 표시 - 显示评论数 - 評論數 - - Y - 출력 - 출력 - 显示 - 顯示 - - - N - 출력하지 않음 - 출력하지 않음 - 不显示 - 不顯示 - - - - - select - 엮인글수 표시 - 엮인글수 표시 - 显示引用数 - 引用數 - - Y - 출력 - 출력 - 显示 - 顯示 - - - N - 출력하지 않음 - 출력하지 않음 - 不显示 - 不顯示 - - - - select - 분류 표시 - 분류 표시 - 显示分类 - 分類 - - Y - 출력 - 출력 - 显示 - 顯示 - - - N - 출력하지 않음 - 출력하지 않음 - 不显示 - 不顯示 - - - - select - 아이콘 표시 - 아이콘 표시 - 显示图标 - 圖示 - - Y - 출력 - 출력 - 显示 - 顯示 - - - N - 출력하지 않음 - 출력하지 않음 - 不显示 - 不顯示 - - - - - - - select - 정렬 대상 - 排序对象 - ソート対象 - Target to be sorted - Objetivo para ser ordenados - Назначение для сортировки - 排列順序 - 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. - 可以按照指定的顺序进行排序。 - 登録順、変更順にソートできます。 - The list of newewst articles may be sorted by submitted order or modified order. - La lista de los documentos recientes pueden ser ordenados en el orden del agregado o en el de modificados. - Список последних статей может быть отсортирован по дате размещения или изменения. - 按照指定的順序進行排列。 - - list_order - 최신 등록순 - 最新发表顺 - 最新登録順 - Newest Submitted Order - Orden de agregados recientemente - Порядок размещенных статей - 最新發表 - - - update_order - 최근 변경순 - 最新修改顺 - 最新変更順 - Newest Modified Order - Orden de modificados recientemente - Порядок измененных статей - 最新修改 - - - - select - 정렬 방법 - 排序方式 - ソートタイプ - Sorting Type - Tipo de ordenamiento - Тип сортировки - 排列方式 - 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. - 对其排序对象可进行升序/降序方式排序。 - ソートタイプを、降順、昇順にソートできます。 - You can sort target articles by asending or desending order. - Usted puede ordenar los documentos en orden acendente o en orden descendente. - Вы можете сортировать статьи в порядке возрастания или убывания. - 可選擇升冪/降冪的方式對所選目標進行排列。 - - desc - 내림차순 - 降序 - 降順 - Desending order - Orden Descendente - По убыванию - 降冪 - - - asc - 올림차순 - 升序 - 昇順 - Asending order - Orden Acendente - По возрастанию - 升冪 - - - - - select - 썸네일 생성 방법 - 生成方法 - 缩略图生成方式 - Thumbnail Type - Тип миниатюры - 縮圖建立方式 - 썸네일 생성 방법을 선택할 수 있습니다. (crop : 꽉 채우기, ratio : 비율 맞추기) - サムネールの生成方法を選択します(Crop : 刈り込み, Ratio : 比率)。 - 可以选择缩略图生成方式。 (crop : 裁减, ratio : 比例) - Thumbnail Type may be set here. - Тип миниатюры может быть установлен здесь. - 可選擇縮圖建立方式。(crop : 裁減, ratio : 比例) - - crop - Crop (채우기) - Crop (刈り込み) - Crop (裁减) - Crop - Crop (Обрезание) - Crop (裁減) - - - ratio - Ratio (비율 맞추기) - Ratio (比率) - Ratio (比例) - Ratio - Ratio (Отношение) - Ratio (比例) - - - - text - 이미지 가로크기 - イメージ横幅 - 宽度 - Width of Image - Ancho de la imagen - Ширина изображения - 圖片寬度 - 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) - 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 - 可以指定要显示的图片宽度。(默认为100) - You can set the width of image. (100 as default) - Usted puede definir el ancho de la imagen. (predefinido:100px) - Вы можете установить ширину изображения. (стандарт: 100px) - 指定顯示的圖片寬度。(預設是100) - - - text - 이미지 세로크기 - イメージ縦幅 - 高度 - Height of Image - Высота изображения - 圖片高度 - 이미지의 세로 크기를 지정할 수 있습니다. (기본 75) - イメージの縦幅サイズを指定します(デフォルト 75px) - 可以指定图片高度。(默认为75px) - You can set the height of image. (75 as default) - Вы можете установить вытсоту изображения. (стандарт: 75px) - 指定圖片高度。(預設是75px) - - - text - 가로 이미지 수 - 横並びイメージ数 - 横向图片数 - Number of Images - Número de imágenes - Число изображений (колонка) - 橫向圖片數 - 출력될 가로 이미지의 수를 정하실 수 있습니다. (기본 5개) - 表示する横並びのイメージ数を指定します(デフォルト5個)。 - 可以指定要显示的横向图片个数。(默认为5个) - You can set the number of images to display. (5 as default) - Usted puede definir el múmero de imágenes a mostrar. (predefinido: 5) - Вы можете установить число изображений для показа. (стандарт: 5) - 指定要顯示的橫向圖片數。(預設是5個) - - - - text - 목록수 - 目录数 - リスト数 - The number of list - Número de la lista - Число списка - 目錄數 - 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) - 可设置要显示的目录数。 (默认为5个) - 出力されるリストの数を指定することができます。(デフォルト5個) - You can set the number of articles to be displayed. (default is 5) - Usted puede definir el número de los documentos a mostrar. (predefinido: 5) - Вы можете выбрать число списка статей для отображения. (стандарт: 5) - 設置要顯示的目錄數。(預設是5個) - - - select - 페이지수 - 分页 - 頁數 - - 1 - 1 - 1 - 1 - - - 2 - 2 - 2 - 2 - - - 3 - 3 - 3 - 3 - - 페이지수 2이상일 경우 이전/다음 버튼이 나타납니다. - 分页数在2以上时,将会出现上一页/下一页按钮。 - 頁數在2以上時,會出現上一頁/下一頁按鈕。 - - - text - new 표시 시간 (hours) - new图标显示时间(hours) - Newの表示時間 (Hours) - Duration of indication for new item - Длительность индикации для новых объектов - new圖案顯示時間(hours) - 새로 등록된 게시물의 new 표시시간을 정할 수 있습니다. (시간 단위) - 可以设置最新更新主题的new图标显示时间。 - 新しく登録された書き込みに対して「New」の表示時間を指定します(時間単位)。 - You may set the duration of indication for fresh item. (unit is hour) - Вы можете установить длительность индикации для нового объекта. (единица - час) - 可設置最新更新主題的new圖案顯示時間。 - - - text - 제목 글자수 - タイトルの文字数 - 标题字数 - Length of Subject - Número de letras del título - Длина темы - 標題字數 - 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 - 可以设置标题的字数。(0或留空为不限) - Length of Subject can be assigned. (0 or blank value will not restrict the length) - El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) - Длина темы может быть присвоена. (0 или пустое значение не будут ограничивать длину) - 可設置標題的字數。(0或留白為不限制) - - - text - 내용 글자수 - 内容摘要字数 - 內容字數 - - - module_srl_list - 대상 모듈 - 对象模块 - モジュール - Target Module - Módulo Objetivo - Модуль назначения - 目標模組 - 선택하신 모듈에 등록된 글을 대상으로 합니다. - 将把所选模块当中的主题作为对象。 - チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 - The target articles to be sorted will be the ones submitted in the selected module. - El objetivo de los documentos agregados serán los del módulo selccionado. - Статьи назначения для сортировки будут теми, что были размещены в выбранном модуле. - 把所選擇的模組作為目標。 - - - text - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL은 타입이 RSS일 경우 등록되어야 합니다. - RSS URL은 타입이 RSS일 경우 등록되어야 합니다. - - - text - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - - - text - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - - - text - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - - - text - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - RSS URL - - - - - - - + + + Content 위젯 + Content widget + 全局内容控件 + 內容組件 + 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. + 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. + 以各种样式显示主题,评论,附件等站内内容的全局控件。 + 是種可輸出討論板、評論,附加檔案等內容的控件。 + 0.1 + 2009-03-16 + + + sol + sol + sol + sol + sol + sol + sol + + + + + select + 추출대상 + 추출대상 + 对象 + 目標 + + document + 게시물 + 게시물 + 主题 + 主題 + + + comment + 댓글 + 댓글 + 评论 + 評論 + + + image + 첨부이미지 + 첨부이미지 + 图片 + 圖片 + + + trackback + 트랙백 + 트랙백 + 引用 + 引用 + + + rss + RSS + RSS + RSS + RSS + + + + select + 내용형태 + 내용형태 + 内容样式 + 內容樣式 + + normal + 제목 + 제목 + 标题 + 標題 + + + image_title + 이미지+제목 + 이미지+제목 + 图片+标题 + 圖片+標題 + + + gallery + 겔러리 + 겔러리 + 相册 + 相簿 + + + image_title_content + 이미지+제목+내용 + 이미지+제목+내용 + 图片+标题+内容 + 圖片+標題+內容 + + + + select + 탭형태 + 탭형태 + 选项卡样式 + 分頁樣式 + + none + 없음 + 없음 + + + + + tab_top + 상단 탭형 + 상단 탭형 + 顶端选项卡 + 頂端分頁 + + + tab_left + 왼쪽 탭형 + 왼쪽 탭형 + 左侧选项卡 + 左側分頁 + + + + + select-multi-order + 표시항목 및 순서 + 표시항목 및 순서 + 显示项及顺序 + 顯示項目順序 + + title + 제목 + 제목 + 标题 + 標題 + + + thumbnail + 섬네일 + 섬네일 + 缩略图 + 縮圖 + + + regdate + 등록일 + 등록일 + 发布日期 + 發表日期 + + + nickname + 글쓴이 + 글쓴이 + 发布者 + 作者 + + + content + 내용 + 내용 + 内容 + 內容 + + + + + select + 게시판 이름 표시 + 게시판 이름 표시 + 显示版面名称 + 討論板名稱 + + Y + 출력 + 출력 + 显示 + 顯示 + + + N + 출력하지 않음 + 출력하지 않음 + 不显示 + 不顯示 + + + + + select + 댓글수 표시 + 댓글수 표시 + 显示评论数 + 評論數 + + Y + 출력 + 출력 + 显示 + 顯示 + + + N + 출력하지 않음 + 출력하지 않음 + 不显示 + 不顯示 + + + + + select + 엮인글수 표시 + 엮인글수 표시 + 显示引用数 + 引用數 + + Y + 출력 + 출력 + 显示 + 顯示 + + + N + 출력하지 않음 + 출력하지 않음 + 不显示 + 不顯示 + + + + select + 분류 표시 + 분류 표시 + 显示分类 + 分類 + + Y + 출력 + 출력 + 显示 + 顯示 + + + N + 출력하지 않음 + 출력하지 않음 + 不显示 + 不顯示 + + + + select + 아이콘 표시 + 아이콘 표시 + 显示图标 + 圖示 + + Y + 출력 + 출력 + 显示 + 顯示 + + + N + 출력하지 않음 + 출력하지 않음 + 不显示 + 不顯示 + + + + + + + select + 정렬 대상 + 排序对象 + ソート対象 + Target to be sorted + Objetivo para ser ordenados + Назначение для сортировки + 排列順序 + 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. + 可以按照指定的顺序进行排序。 + 登録順、変更順にソートできます。 + The list of newewst articles may be sorted by submitted order or modified order. + La lista de los documentos recientes pueden ser ordenados en el orden del agregado o en el de modificados. + Список последних статей может быть отсортирован по дате размещения или изменения. + 按照指定的順序進行排列。 + + list_order + 최신 등록순 + 最新发表顺 + 最新登録順 + Newest Submitted Order + Orden de agregados recientemente + Порядок размещенных статей + 最新發表 + + + update_order + 최근 변경순 + 最新修改顺 + 最新変更順 + Newest Modified Order + Orden de modificados recientemente + Порядок измененных статей + 最新修改 + + + + select + 정렬 방법 + 排序方式 + ソートタイプ + Sorting Type + Tipo de ordenamiento + Тип сортировки + 排列方式 + 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. + 对其排序对象可进行升序/降序方式排序。 + ソートタイプを、降順、昇順にソートできます。 + You can sort target articles by asending or desending order. + Usted puede ordenar los documentos en orden acendente o en orden descendente. + Вы можете сортировать статьи в порядке возрастания или убывания. + 可選擇升冪/降冪的方式對所選目標進行排列。 + + desc + 내림차순 + 降序 + 降順 + Desending order + Orden Descendente + По убыванию + 降冪 + + + asc + 올림차순 + 升序 + 昇順 + Asending order + Orden Acendente + По возрастанию + 升冪 + + + + + select + 썸네일 생성 방법 + 生成方法 + 缩略图生成方式 + Thumbnail Type + Тип миниатюры + 縮圖建立方式 + 썸네일 생성 방법을 선택할 수 있습니다. (crop : 꽉 채우기, ratio : 비율 맞추기) + サムネールの生成方法を選択します(Crop : 刈り込み, Ratio : 比率)。 + 可以选择缩略图生成方式。 (crop : 裁减, ratio : 比例) + Thumbnail Type may be set here. + Тип миниатюры может быть установлен здесь. + 可選擇縮圖建立方式。(crop : 裁減, ratio : 比例) + + crop + Crop (채우기) + Crop (刈り込み) + Crop (裁减) + Crop + Crop (Обрезание) + Crop (裁減) + + + ratio + Ratio (비율 맞추기) + Ratio (比率) + Ratio (比例) + Ratio + Ratio (Отношение) + Ratio (比例) + + + + text + 이미지 가로크기 + イメージ横幅 + 宽度 + Width of Image + Ancho de la imagen + Ширина изображения + 圖片寬度 + 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) + 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 + 可以指定要显示的图片宽度。(默认为100) + You can set the width of image. (100 as default) + Usted puede definir el ancho de la imagen. (predefinido:100px) + Вы можете установить ширину изображения. (стандарт: 100px) + 指定顯示的圖片寬度。(預設是100) + + + text + 이미지 세로크기 + イメージ縦幅 + 高度 + Height of Image + Высота изображения + 圖片高度 + 이미지의 세로 크기를 지정할 수 있습니다. (기본 75) + イメージの縦幅サイズを指定します(デフォルト 75px) + 可以指定图片高度。(默认为75px) + You can set the height of image. (75 as default) + Вы можете установить вытсоту изображения. (стандарт: 75px) + 指定圖片高度。(預設是75px) + + + text + 가로 이미지 수 + 横並びイメージ数 + 横向图片数 + Number of Images + Número de imágenes + Число изображений (колонка) + 橫向圖片數 + 출력될 가로 이미지의 수를 정하실 수 있습니다. (기본 5개) + 表示する横並びのイメージ数を指定します(デフォルト5個)。 + 可以指定要显示的横向图片个数。(默认为5个) + You can set the number of images to display. (5 as default) + Usted puede definir el múmero de imágenes a mostrar. (predefinido: 5) + Вы можете установить число изображений для показа. (стандарт: 5) + 指定要顯示的橫向圖片數。(預設是5個) + + + + text + 목록수 + 目录数 + リスト数 + The number of list + Número de la lista + Число списка + 目錄數 + 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) + 可设置要显示的目录数。 (默认为5个) + 出力されるリストの数を指定することができます。(デフォルト5個) + You can set the number of articles to be displayed. (default is 5) + Usted puede definir el número de los documentos a mostrar. (predefinido: 5) + Вы можете выбрать число списка статей для отображения. (стандарт: 5) + 設置要顯示的目錄數。(預設是5個) + + + select + 페이지수 + 分页 + 頁數 + + 1 + 1 + 1 + 1 + + + 2 + 2 + 2 + 2 + + + 3 + 3 + 3 + 3 + + 페이지수 2이상일 경우 이전/다음 버튼이 나타납니다. + 分页数在2以上时,将会出现上一页/下一页按钮。 + 頁數在2以上時,會出現上一頁/下一頁按鈕。 + + + text + new 표시 시간 (hours) + new图标显示时间(hours) + Newの表示時間 (Hours) + Duration of indication for new item + Длительность индикации для новых объектов + new圖案顯示時間(hours) + 새로 등록된 게시물의 new 표시시간을 정할 수 있습니다. (시간 단위) + 可以设置最新更新主题的new图标显示时间。 + 新しく登録された書き込みに対して「New」の表示時間を指定します(時間単位)。 + You may set the duration of indication for fresh item. (unit is hour) + Вы можете установить длительность индикации для нового объекта. (единица - час) + 可設置最新更新主題的new圖案顯示時間。 + + + text + 제목 글자수 + タイトルの文字数 + 标题字数 + Length of Subject + Número de letras del título + Длина темы + 標題字數 + 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) + タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + 可以设置标题的字数。(0或留空为不限) + Length of Subject can be assigned. (0 or blank value will not restrict the length) + El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) + Длина темы может быть присвоена. (0 или пустое значение не будут ограничивать длину) + 可設置標題的字數。(0或留白為不限制) + + + text + 내용 글자수 + 内容摘要字数 + 內容字數 + + + module_srl_list + 대상 모듈 + 对象模块 + モジュール + Target Module + Módulo Objetivo + Модуль назначения + 目標模組 + 선택하신 모듈에 등록된 글을 대상으로 합니다. + 将把所选模块当中的主题作为对象。 + チェックされたモジュールに登録されたコンテンツ(書き込み)を対象とします。 + The target articles to be sorted will be the ones submitted in the selected module. + El objetivo de los documentos agregados serán los del módulo selccionado. + Статьи назначения для сортировки будут теми, что были размещены в выбранном модуле. + 把所選擇的模組作為目標。 + + + text + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL은 타입이 RSS일 경우 등록되어야 합니다. + (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) + RSS URL은 타입이 RSS일 경우 등록되어야 합니다. + + + text + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + + + text + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + + + text + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + + + text + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + RSS URL + + + + + + + diff --git a/widgets/content/content.class.php b/widgets/content/content.class.php index 7bf3dafb8..21ddbb5dc 100644 --- a/widgets/content/content.class.php +++ b/widgets/content/content.class.php @@ -483,40 +483,44 @@ $content_items[] = $content_item; } - } elseif($xml_doc->{'rdf:RDF'}) { - $rss->title = $xml_doc->{'rdf:RDF'}->channel->title->body; - $rss->link = $xml_doc->{'rdf:RDF'}->channel->link->body; - - $items = $xml_doc->{'rdf:RDF'}->item; - - if(!$items) return; - if($items && !is_array($items)) $items = array($items); - - $content_items = array(); - - foreach ($items as $key => $value) { - if($key >= $args->list_count * $args->page_count) break; - unset($item); - - foreach($value as $key2 => $value2) { - if(is_array($value2)) $value2 = array_shift($value2); - $item->{$key2} = $this->_getRssBody($value2); - } - - $content_item = new contentItem($rss->title); - $content_item->setContentsLink($rss->link); - $content_item->setTitle($item->title); - $content_item->setNickName(max($item->author,$item->{'dc:creator'})); - //$content_item->setCategory($item->category); - $item->description = preg_replace('!pubdate,$item->pubDate,$item->{'dc:date'}))); - $content_item->setRegdate($date); - - $content_items[] = $content_item; - } +/* + } elseif($xml_doc->{'rdf:RDF'}) { + // rss1.0 지원 by misol + $rss->title = $xml_doc->{'rdf:RDF'}->channel->title->body; + $rss->link = $xml_doc->{'rdf:RDF'}->channel->link->body; + + $items = $xml_doc->{'rdf:RDF'}->item; + + if(!$items) return; + if($items && !is_array($items)) $items = array($items); + + $content_items = array(); + + foreach ($items as $key => $value) { + if($key >= $args->list_count * $args->page_count) break; + unset($item); + + foreach($value as $key2 => $value2) { + if(is_array($value2)) $value2 = array_shift($value2); + $item->{$key2} = $this->_getRssBody($value2); + } + + $content_item = new contentItem($rss->title); + $content_item->setContentsLink($rss->link); + $content_item->setTitle($item->title); + $content_item->setNickName(max($item->author,$item->{'dc:creator'})); + //$content_item->setCategory($item->category); + $item->description = preg_replace('!pubdate,$item->pubDate,$item->{'dc:date'}))); + $content_item->setRegdate($date); + + $content_items[] = $content_item; + } +*/ } elseif($xml_doc->{'rdf:rdf'}) { + // rss1.0 지원 (Xml이 대소문자를 구분해야 하는데 XE의 XML파서가 전부 소문자로 바꾸는 바람에 생긴 case) by misol $rss->title = $xml_doc->{'rdf:rdf'}->channel->title->body; $rss->link = $xml_doc->{'rdf:rdf'}->channel->link->body; @@ -550,6 +554,7 @@ $content_items[] = $content_item; } } elseif($xml_doc->feed && $xml_doc->feed->attrs->xmlns == 'http://www.w3.org/2005/Atom') { + // Atom 1.0 spec 지원 by misol $rss->title = $xml_doc->feed->title->body; $links = $xml_doc->feed->link; if(is_array($links)) { @@ -596,6 +601,7 @@ } $content_item->setTitle($item->title); $content_item->setNickName(max($item->author,$item->{'dc:creator'})); + $content_item->setAuthorSite($value->author->uri->body); //$content_item->setCategory($item->category); $item->description = preg_replace('!add('author_site',$site_url); + } function setCategory($category){ $this->add('category',$category); } @@ -804,6 +815,9 @@ function getNickName(){ return $this->get('nick_name'); } + function getAuthorSite(){ + return $this->get('author_site'); + } function getCommentCount(){ $comment_count = $this->get('comment_count'); return $comment_count>0 ? $comment_count : ''; diff --git a/widgets/content/skins/default/normal.html b/widgets/content/skins/default/normal.html index 615cd0ab7..178596d72 100644 --- a/widgets/content/skins/default/normal.html +++ b/widgets/content/skins/default/normal.html @@ -8,7 +8,7 @@ - {$item->getBrowserTitle()} + {$item->getBrowserTitle()} {$item->getCategory()} @@ -29,7 +29,7 @@ - {$item->getNickName()} + getMemberSrl())-->href="#" onclick="return false;" class="author member_{$item->getMemberSrl()}"href="{$item->getAuthorSite()}" onclick="window.open(this.href); return false;" class="author member"href="#" onclick="return false;" class="author member" >{$item->getNickName()} {$item->getRegdate("Y-m-d")} {$item->getRegdate("H:i")} From 8396491102e74006ff25f302b623519c1391baa4 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 17 Mar 2009 02:07:07 +0000 Subject: [PATCH 019/202] =?UTF-8?q?#17840541=20=ED=99=95=EC=9E=A5=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EB=82=98=EC=A4=91=EC=97=90=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=ED=95=9C=20=EA=B2=BD=EC=9A=B0=20=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=EA=B8=80=EC=9D=98=20=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5883 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/document/document.model.php b/modules/document/document.model.php index d98536037..a3e8a1799 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -44,6 +44,7 @@ $output = executeQueryArray('document.getDocumentsExtraVars', $obj); if($output->toBool() && $output->data) { $setted = array(); + foreach($output->data as $key => $val) { if(!$val->document_srl) continue; @@ -64,8 +65,14 @@ } } } + + foreach($document_srls as $key => $document_srl) { - if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])) $GLOBALS['XE_EXTRA_VARS'][$document_srl] = array(); + if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])){ + $module_srl = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->get('module_srl'); + $oExtraItem = $GLOBALS['XE_EXTRAVARS'][$module_srl]; + $GLOBALS['XE_EXTRA_VARS'][$document_srl] = $oExtraItem; + } } } From 58206375b8ff4a9180b9bac5a371ab4a41890cd8 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 17 Mar 2009 02:14:47 +0000 Subject: [PATCH 020/202] =?UTF-8?q?#17846582=20=ED=99=95=EC=9E=A5=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=88=9C=EC=84=9C=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5884 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/queries/getDocumentsExtraVars.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/document/queries/getDocumentsExtraVars.xml b/modules/document/queries/getDocumentsExtraVars.xml index ed0f09b1e..5fd98a335 100644 --- a/modules/document/queries/getDocumentsExtraVars.xml +++ b/modules/document/queries/getDocumentsExtraVars.xml @@ -24,4 +24,7 @@ - + + + + \ No newline at end of file From 67a47e3579e92a72e75f27fbf1b6b4008b8b08b4 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 17 Mar 2009 05:01:58 +0000 Subject: [PATCH 021/202] #17836542 : Fix the bug occurred when adding / deleting points git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5885 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/point/point.controller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/point/point.controller.php b/modules/point/point.controller.php index c4c7e60e2..11e76d394 100644 --- a/modules/point/point.controller.php +++ b/modules/point/point.controller.php @@ -476,6 +476,7 @@ $args->point = $point; if($args->point < 0) $args->point = 0; } + $point = $args->point; // 포인트가 있는지 체크 From 5fb8f95c4677a3cf8fea9098f7b1b94356fbd7f2 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 17 Mar 2009 05:36:26 +0000 Subject: [PATCH 022/202] =?UTF-8?q?#17845671=20=EA=B3=B5=EC=A7=80=EA=B8=80?= =?UTF-8?q?=20=ED=95=B4=EC=A0=9C=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5886 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 10217e079..1087c8482 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -373,7 +373,7 @@ } // 공지사항 글이면 공지사항 캐시 업데이트 - if($source_obj->is_notice == 'Y' || $obj->is_notice == 'Y') $this->updateDocumentNoticeCache($obj->module_srl); + if($source_obj->get('is_notice') == 'Y' || $obj->is_notice == 'Y') $this->updateDocumentNoticeCache($obj->module_srl); // trigger 호출 (after) if($output->toBool()) { From 67cfcb5773a97fb47a27c831f17de8fc70d6901c Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 17 Mar 2009 06:30:56 +0000 Subject: [PATCH 023/202] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5887 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/newest_document/skins/default/list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/newest_document/skins/default/list.html b/widgets/newest_document/skins/default/list.html index d98d2bb62..b9458a747 100644 --- a/widgets/newest_document/skins/default/list.html +++ b/widgets/newest_document/skins/default/list.html @@ -13,7 +13,7 @@
{$widget_info->title}
- +
From 82a765daae861608530067b98c2aa3c15d389bed Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 17 Mar 2009 06:31:15 +0000 Subject: [PATCH 024/202] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5888 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/referer/lang/ko.lang.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/referer/lang/ko.lang.php b/modules/referer/lang/ko.lang.php index 27e64e755..0f91ff893 100644 --- a/modules/referer/lang/ko.lang.php +++ b/modules/referer/lang/ko.lang.php @@ -5,6 +5,6 @@ * @brief Korean language pack */ - $lang->referer = '레퍼러'; + $lang->referer = '리퍼러'; $lang->ranking = '순위'; ?> From 403862389db38317c457a29d8fff8a5cebe453f3 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 17 Mar 2009 07:48:12 +0000 Subject: [PATCH 025/202] =?UTF-8?q?UI=20=EB=94=94=EB=B2=84=EA=B9=85.=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=8E=98=EC=9D=B4=EC=A7=80=20sel?= =?UTF-8?q?ect=20=EC=9A=94=EC=86=8C=EC=97=90=20fullWidth=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=A0=9C=EA=B1=B0.=201024=20=EB=AF=B8?= =?UTF-8?q?=EB=A7=8C=EC=9D=98=20=ED=95=B4=EC=83=81=EB=8F=84=EC=97=90?= =?UTF-8?q?=EC=84=9C=20select=20=EC=9A=94=EC=86=8C=EC=9D=98=20=EB=84=88?= =?UTF-8?q?=EB=B9=84=EA=B0=80=20=EA=B8=80=EC=9E=90=20=EC=88=98=EB=B3=B4?= =?UTF-8?q?=EB=8B=A4=20=EC=9E=91=EC=95=84=EC=A7=80=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5889 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/opage/tpl/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/opage/tpl/index.html b/modules/opage/tpl/index.html index 5110435a3..63f30443b 100644 --- a/modules/opage/tpl/index.html +++ b/modules/opage/tpl/index.html @@ -16,7 +16,7 @@
- From 430aa3671729fd4f8975e74982824a28f4f729e3 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 17 Mar 2009 07:54:01 +0000 Subject: [PATCH 026/202] =?UTF-8?q?UI=20=EB=94=94=EB=B2=84=EA=B9=85.=20sel?= =?UTF-8?q?ect=20=EC=9A=94=EC=86=8C=EC=97=90=20fullWidth=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=A0=9C=EA=B1=B0.=201024=20=EB=AF=B8?= =?UTF-8?q?=EB=A7=8C=EC=9D=98=20=ED=95=B4=EC=83=81=EB=8F=84=EC=97=90?= =?UTF-8?q?=EC=84=9C=20select=20=EC=9A=94=EC=86=8C=EC=9D=98=20=EB=84=88?= =?UTF-8?q?=EB=B9=84=EA=B0=80=20=EA=B8=80=EC=9E=90=20=EC=88=98=EB=B3=B4?= =?UTF-8?q?=EB=8B=A4=20=EC=9E=91=EC=95=84=EC=A7=80=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5890 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/tpl/index.html | 2 +- modules/issuetracker/tpl/index.html | 2 +- modules/lifepod/tpl/index.html | 2 +- modules/page/tpl/index.html | 2 +- modules/wiki/tpl/index.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/board/tpl/index.html b/modules/board/tpl/index.html index d142f966f..0d65f69a0 100644 --- a/modules/board/tpl/index.html +++ b/modules/board/tpl/index.html @@ -16,7 +16,7 @@
- diff --git a/modules/issuetracker/tpl/index.html b/modules/issuetracker/tpl/index.html index 845939646..b6793f2ac 100644 --- a/modules/issuetracker/tpl/index.html +++ b/modules/issuetracker/tpl/index.html @@ -14,7 +14,7 @@
- diff --git a/modules/lifepod/tpl/index.html b/modules/lifepod/tpl/index.html index b19f2f76f..ba99e844f 100644 --- a/modules/lifepod/tpl/index.html +++ b/modules/lifepod/tpl/index.html @@ -16,7 +16,7 @@
- diff --git a/modules/page/tpl/index.html b/modules/page/tpl/index.html index 8f0fca6cc..e9df2d68a 100644 --- a/modules/page/tpl/index.html +++ b/modules/page/tpl/index.html @@ -15,7 +15,7 @@
- diff --git a/modules/wiki/tpl/index.html b/modules/wiki/tpl/index.html index bb8f45155..bf2e199d0 100644 --- a/modules/wiki/tpl/index.html +++ b/modules/wiki/tpl/index.html @@ -13,7 +13,7 @@
- From 423816e8ced3a6fe2438db9623433f1a12c80226 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 17 Mar 2009 08:08:20 +0000 Subject: [PATCH 027/202] =?UTF-8?q?#17845092=20=EC=9D=B4=EC=8A=88=ED=8A=B8?= =?UTF-8?q?=EB=A0=88=EC=BB=A4=20IE6=20UI=20=EB=94=94=EB=B2=84=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5891 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../skins/xe_issuetracker/milestone.html | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/modules/issuetracker/skins/xe_issuetracker/milestone.html b/modules/issuetracker/skins/xe_issuetracker/milestone.html index 0619b2184..875130872 100644 --- a/modules/issuetracker/skins/xe_issuetracker/milestone.html +++ b/modules/issuetracker/skins/xe_issuetracker/milestone.html @@ -1,42 +1,42 @@ - - - - - -{@ $col_count = 3 } - - - - {@ $col_count += 1 } - - - - - - - - -{@ $val->title = $lang->not_assigned} -{@ $val->description = $lang->not_assigned_description} - - - - - - - - - - - - - - - - - -
{$lang->completed_date}{$lang->deadline}{$v}{$lang->total_issue}
- {@$resolved = $val->issues['resolve'] + $val->issues['postponed'] + $val->issues['duplicated'] + $val->issues['invalid']} -
{zdate($val->released_date, "Y-m-d")} {zdate($val->deadline, 'Y-m-d')}  {number_format($val->issues[$k])} {number_format($val->issues['total'])}
{nl2br($val->description)} 
+ + + + + +{@ $col_count = 3 } + + + + {@ $col_count += 1 } + + + + + + + + +{@ $val->title = $lang->not_assigned} +{@ $val->description = $lang->not_assigned_description} + + + + + + + + + + + + + + + + + +
{$lang->completed_date}{$lang->deadline}{$v}{$lang->total_issue}
+ {@$resolved = $val->issues['resolve'] + $val->issues['postponed'] + $val->issues['duplicated'] + $val->issues['invalid']} +
{zdate($val->released_date, "Y-m-d")} {zdate($val->deadline, 'Y-m-d')}  {number_format($val->issues[$k])} {number_format($val->issues['total'])}
{nl2br($val->description)} 
From ab5eaf4e701988ddb0eca03fa07a6b9994ab1633 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 17 Mar 2009 09:55:15 +0000 Subject: [PATCH 028/202] =?UTF-8?q?#17847646=20UI=20=EB=94=94=EB=B2=84?= =?UTF-8?q?=EA=B9=85.=20=EC=9C=84=EC=A0=AF=20=EC=8A=A4=ED=83=80=EC=9D=BC?= =?UTF-8?q?=20'=EB=9D=BC=EC=9A=B4=EB=93=9C=20=EB=B0=95=EC=8A=A4'=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20IE7,=20IE6=20=EB=94=94=EB=B2=84?= =?UTF-8?q?=EA=B9=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5892 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/css/widgetBoxStyle.css | 2 +- widgetstyles/line/css/widgetBoxStyle.css | 2 +- widgetstyles/memo/css/widgetBoxStyle.css | 2 +- widgetstyles/round/css/widgetBoxStyle.css | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/widgetstyles/colorbox/css/widgetBoxStyle.css b/widgetstyles/colorbox/css/widgetBoxStyle.css index d6ce0ff17..9f6e29cfb 100644 --- a/widgetstyles/colorbox/css/widgetBoxStyle.css +++ b/widgetstyles/colorbox/css/widgetBoxStyle.css @@ -8,7 +8,7 @@ .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} .widgetBox .rcTop{ position:absolute;} .widgetBox .rcBottom{ position:relative;} .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} diff --git a/widgetstyles/line/css/widgetBoxStyle.css b/widgetstyles/line/css/widgetBoxStyle.css index 7af61022d..5c9fbe485 100644 --- a/widgetstyles/line/css/widgetBoxStyle.css +++ b/widgetstyles/line/css/widgetBoxStyle.css @@ -8,7 +8,7 @@ .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} .widgetBox .rcTop{ position:absolute;} .widgetBox .rcBottom{ position:relative;} .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} diff --git a/widgetstyles/memo/css/widgetBoxStyle.css b/widgetstyles/memo/css/widgetBoxStyle.css index 878303c32..7e3d6f408 100644 --- a/widgetstyles/memo/css/widgetBoxStyle.css +++ b/widgetstyles/memo/css/widgetBoxStyle.css @@ -8,7 +8,7 @@ .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} .widgetBox .rcTop{ position:absolute;} .widgetBox .rcBottom{ position:relative;} .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} diff --git a/widgetstyles/round/css/widgetBoxStyle.css b/widgetstyles/round/css/widgetBoxStyle.css index f5d54a07a..41c265c0c 100644 --- a/widgetstyles/round/css/widgetBoxStyle.css +++ b/widgetstyles/round/css/widgetBoxStyle.css @@ -8,7 +8,7 @@ .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} .widgetBox .rcTop{ position:absolute;} .widgetBox .rcBottom{ position:relative;} .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} From 2fde39c2d94959493dcb2d36097949024fb438d0 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 17 Mar 2009 14:55:33 +0000 Subject: [PATCH 029/202] #17854897 : fixed the bug that addon setup page was not displayed (it was related to lang_code) git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5893 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/addon.admin.view.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/addon/addon.admin.view.php b/modules/addon/addon.admin.view.php index 73e45af55..e853f3b76 100644 --- a/modules/addon/addon.admin.view.php +++ b/modules/addon/addon.admin.view.php @@ -45,6 +45,7 @@ // mid 목록을 가져옴 $oModuleModel = &getModel('module'); + $oModuleAdminModel = &getAdminModel('module'); if($site_module_info->site_srl) $args->site_srl = $site_module_info->site_srl; $mid_list = $oModuleModel->getMidList($args); @@ -55,6 +56,7 @@ $module_categories = $oModuleModel->getModuleCategories(); foreach($mid_list as $module_srl => $module) { + $module->browser_title = $oModuleAdminModel->getLangCode($module->site_srl, $module->browser_title); $module_categories[$module->module_category_srl]->list[$module_srl] = $module; } } else { From 937fbcc7430d4a6e8a37211850676346b46d4025 Mon Sep 17 00:00:00 2001 From: misol Date: Tue, 17 Mar 2009 15:24:01 +0000 Subject: [PATCH 030/202] =?UTF-8?q?#17856472=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5894 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/file/file.controller.php | 5 +++++ modules/file/file.model.php | 5 +++++ modules/file/file.view.php | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index c6d328674..7be45098c 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -290,8 +290,13 @@ if($logged_info->is_admin != 'Y') { $oFileModel = &getModel('file'); $config = $oFileModel->getFileConfig($module_srl); + $allowed_filesize = $config->allowed_filesize * 1024 * 1024; $allowed_attach_size = $config->allowed_attach_size * 1024 * 1024; + // 한 파일당 허용 용량 초과시 오류 출력 + if($allowed_filesize > filesize($file_info['tmp_name'])) return new Object(-1, 'msg_exceeds_limit_size'); + + // 해당 문서에 첨부된 모든 파일의 용량을 가져옴 (DB에서 가져옴) $size_args->upload_target_srl = $upload_target_srl; $output = executeQuery('file.getAttachedFileSize', $size_args); diff --git a/modules/file/file.model.php b/modules/file/file.model.php index 81a1780ea..c039679de 100644 --- a/modules/file/file.model.php +++ b/modules/file/file.model.php @@ -80,6 +80,11 @@ * @brief 파일 설정 정보를 구함 **/ function getFileConfig($module_srl = null) { + // module_srl이 없으면 현재 모듈 + if(!$module_srl) { + $current_module_info = Context::get('current_module_info'); + $module_srl = $current_module_info->module_srl; + } // 설정 정보를 받아옴 (module model 객체를 이용) $oModuleModel = &getModel('module'); diff --git a/modules/file/file.view.php b/modules/file/file.view.php index a921b0016..a748cd4bb 100644 --- a/modules/file/file.view.php +++ b/modules/file/file.view.php @@ -4,7 +4,7 @@ * @author zero (zero@nzeo.com) * @brief file module의 view class * - * RSS 2.0형식으로 문서 출력 + * * **/ From 773518fed39f553071c062bbc99ee32ed8bff22a Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 18 Mar 2009 02:26:17 +0000 Subject: [PATCH 031/202] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20script=EC=97=90=EC=84=9C=20=EC=B2=AB=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=ED=8F=BC=EC=9D=B4=20=EB=82=98=ED=83=80=EB=82=A0=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20javascript=EC=98=A4=EB=A5=98=EA=B0=80=20?= =?UTF-8?q?=EC=83=9D=EA=B8=B0=EB=8A=94=20=EA=B2=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5895 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/tpl/js/uploader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/tpl/js/uploader.js b/modules/editor/tpl/js/uploader.js index 80291536b..ffa23d387 100755 --- a/modules/editor/tpl/js/uploader.js +++ b/modules/editor/tpl/js/uploader.js @@ -39,7 +39,7 @@ function XEUploaderStart(obj) { flash_url : request_uri+"modules/editor/tpl/images/SWFUpload.swf", upload_url: request_uri, post_params: { - "mid" : current_url.getQuery("mid"), + "mid" : current_mid, "act" : "procFileUpload", "editor_sequence" : obj["editorSequence"] }, From c0f9061d9a31d7146df944f48b602f5839c5373c Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 18 Mar 2009 02:26:37 +0000 Subject: [PATCH 032/202] =?UTF-8?q?category=EA=B8=B0=EB=B3=B8=20=EC=8A=A4?= =?UTF-8?q?=ED=82=A8=EC=9D=98=20colorset=20=EC=A7=80=EC=A0=95=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5896 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/category/category.class.php | 1 + widgets/category/skins/default/images/join.gif | Bin 69 -> 0 bytes .../category/skins/default/images/joinbottom.gif | Bin 66 -> 0 bytes widgets/category/skins/default/images/line.gif | Bin 66 -> 0 bytes widgets/category/skins/default/images/minus.gif | Bin 86 -> 0 bytes .../category/skins/default/images/minusbottom.gif | Bin 85 -> 0 bytes widgets/category/skins/default/images/plus.gif | Bin 89 -> 0 bytes .../category/skins/default/images/plusbottom.gif | Bin 88 -> 0 bytes widgets/category/skins/default/images/plustop.gif | Bin 481 -> 0 bytes widgets/category/skins/default/images/top.gif | Bin 87 -> 0 bytes 10 files changed, 1 insertion(+) delete mode 100644 widgets/category/skins/default/images/join.gif delete mode 100644 widgets/category/skins/default/images/joinbottom.gif delete mode 100644 widgets/category/skins/default/images/line.gif delete mode 100644 widgets/category/skins/default/images/minus.gif delete mode 100644 widgets/category/skins/default/images/minusbottom.gif delete mode 100644 widgets/category/skins/default/images/plus.gif delete mode 100644 widgets/category/skins/default/images/plusbottom.gif delete mode 100644 widgets/category/skins/default/images/plustop.gif delete mode 100644 widgets/category/skins/default/images/top.gif diff --git a/widgets/category/category.class.php b/widgets/category/category.class.php index 33062035f..748f12d1e 100644 --- a/widgets/category/category.class.php +++ b/widgets/category/category.class.php @@ -54,6 +54,7 @@ } } else $widget_info->domain = Context::getDefaultUrl(); + Context::set('colorset', $args->colorset); Context::set('widget_info', $widget_info); // 템플릿 컴파일 diff --git a/widgets/category/skins/default/images/join.gif b/widgets/category/skins/default/images/join.gif deleted file mode 100644 index 34dd47610a5d7c3580dedc342683559bf77abce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmZ?wbhEHb6k-r!XkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFv;}DH=KUEdfpt3ORshA Wx&LIzk};W<vKC_i diff --git a/widgets/category/skins/default/images/joinbottom.gif b/widgets/category/skins/default/images/joinbottom.gif deleted file mode 100644 index 48b81c80a9e25f6f29e2614aaa33bdf4a4d2881b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHb6k-r!XkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFiG~vH=KUEdfpt3ORshA Tx&LIzy5lkJS?4l0Mh0sDgH;v` diff --git a/widgets/category/skins/default/images/line.gif b/widgets/category/skins/default/images/line.gif deleted file mode 100644 index 1a259eea00c330eee85fb18aa64e2e232d5410b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHb6k-r!XkcV$XlVHV|G(l-7DfgJMg|=QAOOiQFiG~vH=KUEdfpt3ORshA Txqp6J8?ND(@^elGBZD;ng_;%{ diff --git a/widgets/category/skins/default/images/minus.gif b/widgets/category/skins/default/images/minus.gif deleted file mode 100644 index 3d212a97ae0d8f83aa39836c5a85d442f8602553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmZ?wbhEHb6k-r!n8?h~)YR0_(7?dJ@c;jR#h)yU3=GT+IzTQ^R)~RtNqvreafzu-gC3m_gnAtsyGG)YXIxA8@>Pl diff --git a/widgets/category/skins/default/images/plus.gif b/widgets/category/skins/default/images/plus.gif deleted file mode 100644 index b2c997233b3f7b0fd56c4637c2c20aaf0d47bae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmZ?wbhEHb6k-r!n8?J?(9poZ!0`Y7e;}#&lZBCifr&u}$Og&^0ohtp^czmUT|IBk qf~en0XVhiRX3S&EJ6Nf p5h*y;Fk5uT`rML8BTYHYnaWIjNgr|-nVr4J`SjO1W Date: Wed, 18 Mar 2009 02:57:17 +0000 Subject: [PATCH 033/202] =?UTF-8?q?#17847646=20IE6=20=EB=9D=BC=EC=9A=B4?= =?UTF-8?q?=EB=93=9C=20=EC=9C=84=EC=A0=AF=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?UI=20=EB=94=94=EB=B2=84=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5897 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/cafeXE/css/widget.css | 4 ++-- modules/layout/tpl/css/widget.css | 4 ++-- widgets/content/skins/default/css/widget.css | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/layouts/cafeXE/css/widget.css b/layouts/cafeXE/css/widget.css index 96e50bfbd..b4dcab4df 100755 --- a/layouts/cafeXE/css/widget.css +++ b/layouts/cafeXE/css/widget.css @@ -96,7 +96,7 @@ dl.widgetDivider dd{ display:none; margin:0;} .widgetDlistA dd{ clear:right; white-space:nowrap; font-family:Tahoma;} /* widgetGalleryA */ -.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;} +.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1; _margin-right:-100%;} .widgetGalleryA:after{ content:""; display:block; clear:both;} .widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;} .widgetGalleryA li.clearRight{ margin-right:0;} @@ -248,7 +248,7 @@ dl.widgetDivider dd{ display:none; margin:0;} /* widgetThumb */ .widgetThumb{ position:relative; margin:0; text-align:center; font-size:12px; line-height:1.5;} -.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none;} +.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none; _float:left;} .widgetThumb .thumb img{ display:block; width:100%;} .widgetThumb .thumb .imgNone{ display:block; position:relative; width:100%; padding-top:30px; padding-bottom:50px; background:#eee; text-align:center; cursor:pointer; color:#000;} .widgetThumb .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); } diff --git a/modules/layout/tpl/css/widget.css b/modules/layout/tpl/css/widget.css index cec82e572..4534c8044 100755 --- a/modules/layout/tpl/css/widget.css +++ b/modules/layout/tpl/css/widget.css @@ -96,7 +96,7 @@ dl.widgetDivider dd{ display:none; margin:0;} .widgetDlistA dd{ clear:right; white-space:nowrap; font-family:Tahoma;} /* widgetGalleryA */ -.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;} +.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1; _margin-right:-100%;} .widgetGalleryA:after{ content:""; display:block; clear:both;} .widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;} .widgetGalleryA li.clearRight{ margin-right:0;} @@ -248,7 +248,7 @@ dl.widgetDivider dd{ display:none; margin:0;} /* widgetThumb */ .widgetThumb{ position:relative; margin:0; text-align:center; font-size:12px; line-height:1.5;} -.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none;} +.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none; _float:left;} .widgetThumb .thumb img{ display:block; width:100%;} .widgetThumb .thumb .imgNone{ display:block; position:relative; width:100%; padding-top:30px; padding-bottom:50px; background:#eee; text-align:center; cursor:pointer; color:#000;} .widgetThumb .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); } diff --git a/widgets/content/skins/default/css/widget.css b/widgets/content/skins/default/css/widget.css index cd9dce8f6..449e25947 100644 --- a/widgets/content/skins/default/css/widget.css +++ b/widgets/content/skins/default/css/widget.css @@ -49,7 +49,7 @@ dl.widgetDivider dd{ display:none; margin:0;} .widgetNavigator li button.next{ background-position:right center; *background-position:13px center;} .widgetNavigator li button span{ position:absolute; display:block; width:0; height:0; overflow:hidden; visibility:hidden;} -.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1;} +.widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1; _margin-right:-100%;} .widgetGalleryA:after{ content:""; display:block; clear:both;} .widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;} .widgetGalleryA li.clearRight{ margin-right:0;} @@ -66,7 +66,7 @@ dl.widgetDivider dd{ display:none; margin:0;} /* widgetThumb */ .widgetThumb{ position:relative; margin:0; text-align:center; font-size:12px; line-height:1.5;} -.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none;} +.widgetThumb .thumb{ display:block; margin-bottom:5px; position:relative; *zoom:1; text-decoration:none; _float:left;} .widgetThumb .thumb img{ display:block; width:100%;} .widgetThumb .thumb .imgNone{ display:block; position:relative; width:100%; padding-top:30px; padding-bottom:50px; background:#eee; text-align:center; cursor:pointer; color:#000;} .widgetThumb .thumb .category{ display:block; position:absolute; width:100%; bottom:0; left:0; padding:2px 0 0 0 !important; cursor:pointer; text-align:center; font-weight:normal; background:#000; color:#fff; opacity:0.6; filter:alpha(opacity=60); -ms-filter:alpha('opacity=60'); } From ce3a270bc239ab81d5da69240df2e3939d5283a2 Mon Sep 17 00:00:00 2001 From: ngleader Date: Wed, 18 Mar 2009 05:31:41 +0000 Subject: [PATCH 034/202] =?UTF-8?q?=EB=A9=94=EB=89=B4=EC=9C=84=EC=A0=AF=20?= =?UTF-8?q?1=EC=B0=A8=20=EB=A9=94=EB=89=B4=20=EC=83=88=EC=B0=BD=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5898 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/navigator/navigator.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/widgets/navigator/navigator.class.php b/widgets/navigator/navigator.class.php index 08e6cd859..372fecfba 100644 --- a/widgets/navigator/navigator.class.php +++ b/widgets/navigator/navigator.class.php @@ -99,6 +99,8 @@ $obj->expand = $val['expand']=='Y'?true:false; $obj->depth = $depth; $obj->selected = $val['selected']; + $obj->open_window = $val['open_window']; + $obj->child_count = 0; $obj->childs = array(); From e2889162ffd0bab36757a5d5dabac2cb7bcf6783 Mon Sep 17 00:00:00 2001 From: ngleader Date: Wed, 18 Mar 2009 06:17:21 +0000 Subject: [PATCH 035/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=8B=9C=20style(=EB=84=93=EC=9D=B4/=EB=86=92?= =?UTF-8?q?=EC=9D=B4)=20=EC=86=8D=EC=84=B1=20=EC=9C=A0=EC=A7=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5899 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/js/widget_admin.js | 4 ++-- modules/widget/tpl/widget_style_generate_code_in_page.html | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/widget/tpl/js/widget_admin.js b/modules/widget/tpl/js/widget_admin.js index 5a9ff73f4..2aeeca2ac 100644 --- a/modules/widget/tpl/js/widget_admin.js +++ b/modules/widget/tpl/js/widget_admin.js @@ -79,8 +79,8 @@ function getWidgetVars() { var attrs = selected_node.attributes; for (i=0; i< attrs.length ; i++){ var input = jQuery("[name='"+attrs[i].name+"']" ,'#fo_widget'); - if( input.size() == 0 && attrs[i].name != 'style'){ - fo_widget.prepend(''); + if( input.size() == 0){ + jQuery('').val(attrs[i].value).prependTo(fo_widget); }else{ if(!input.val() && attrs[i].value ){ input.val(attrs[i].value); diff --git a/modules/widget/tpl/widget_style_generate_code_in_page.html b/modules/widget/tpl/widget_style_generate_code_in_page.html index 8bf065170..187b4ca5d 100644 --- a/modules/widget/tpl/widget_style_generate_code_in_page.html +++ b/modules/widget/tpl/widget_style_generate_code_in_page.html @@ -19,7 +19,6 @@ - From f9d24c1bbc9c0d2fffabcd736812bb1b2bc750a4 Mon Sep 17 00:00:00 2001 From: ngleader Date: Wed, 18 Mar 2009 06:36:14 +0000 Subject: [PATCH 036/202] =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5900 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 2 +- modules/layout/layout.admin.view.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index ed00822cc..bdc3a4f9e 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -3,7 +3,7 @@ @import url("./pagination.css"); /* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ -#xeAdmin {background-color:#fff; } +#xeAdmin {/* background-color:#fff; */} #xeAdmin .open{ display:block !important;} #xeAdmin h1.xeAdmin { float:left; white-space:nowrap; margin:0;padding:0;} #xeAdmin caption{ text-align:left;} diff --git a/modules/layout/layout.admin.view.php b/modules/layout/layout.admin.view.php index 1f7f485d2..b73937c5c 100644 --- a/modules/layout/layout.admin.view.php +++ b/modules/layout/layout.admin.view.php @@ -181,6 +181,7 @@ $layout_file = 'layout'; $layout_tpl = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file); + Context::set('layout','none'); // 위젯등을 변환 $oContext = &Context::getInstance(); @@ -189,8 +190,8 @@ // 임시 파일 삭제 FileHandler::removeFile($edited_layout_file); - $this->setTemplateFile('layout_preview'); + } /** From bde2e72a15d816b00412e419e9f705d73e7b5250 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 18 Mar 2009 06:50:32 +0000 Subject: [PATCH 037/202] =?UTF-8?q?#17857077=20=EC=9C=84=EC=A0=AF=20?= =?UTF-8?q?=EC=83=81=EC=9E=90=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EA=B0=80?= =?UTF-8?q?=EC=9A=B4=EB=8D=B0=20=EC=9D=BC=EB=B6=80=20=EC=9C=84=EC=A0=AF?= =?UTF-8?q?=EC=9D=98=20=EA=B8=B0=EB=B3=B8=20=EB=B0=B0=EA=B2=BD=EC=83=89=20?= =?UTF-8?q?#fff=EC=9D=84=20=EC=A0=9C=EA=B1=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5901 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/css/widgetBoxStyle.css | 6 +++--- widgetstyles/line/css/widgetBoxStyle.css | 7 ++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/widgetstyles/colorbox/css/widgetBoxStyle.css b/widgetstyles/colorbox/css/widgetBoxStyle.css index 9f6e29cfb..d21dd7d66 100644 --- a/widgetstyles/colorbox/css/widgetBoxStyle.css +++ b/widgetstyles/colorbox/css/widgetBoxStyle.css @@ -17,14 +17,14 @@ .widgetBox .rcBottom .bl{ top:0;} .widgetBox .rcBottom .br{ top:0;} -.widgetBoxFred .widgetBox{ background:#fff; border:1px solid #ffcccc; border-top-width:5px; border-bottom-width:5px;} +.widgetBoxFred .widgetBox{ border:1px solid #ffcccc; border-top-width:5px; border-bottom-width:5px;} .widgetBoxFred .widgetBoxHeader{ position:relative; padding:4px 0; text-indent:15px; repeat-x 0 center; border-bottom:1px solid #ffcccc; color:#ff3333;} .widgetBoxFred .widgetMore{ top:7px; right:15px; color:#888;} -.widgetBoxFgreen .widgetBox{ position:relative; background:#fff; border:1px solid #d9efb9; border-top-width:5px; border-bottom-width:5px;} +.widgetBoxFgreen .widgetBox{ border:1px solid #d9efb9; border-top-width:5px; border-bottom-width:5px;} .widgetBoxFgreen .widgetBoxHeader{ padding:4px 0; text-indent:15px; repeat-x 0 center; border-bottom:1px solid #d9efb9; color:#ff3333;} .widgetBoxFgreen .widgetMore{ top:7px; right:15px; color:#888;} -.widgetBoxFblue .widgetBox{ background:#fff; border:1px solid #d8e6e7; border-top-width:5px; border-bottom-width:5px;} +.widgetBoxFblue .widgetBox{ border:1px solid #d8e6e7; border-top-width:5px; border-bottom-width:5px;} .widgetBoxFblue .widgetBoxHeader{ position:relative; padding:4px 0; text-indent:15px; repeat-x 0 center; border-bottom:1px solid #d8e6e7; color:#55ccdd;} .widgetBoxFblue .widgetMore{ top:7px; right:15px; color:#888;} \ No newline at end of file diff --git a/widgetstyles/line/css/widgetBoxStyle.css b/widgetstyles/line/css/widgetBoxStyle.css index 5c9fbe485..cc6c95ea4 100644 --- a/widgetstyles/line/css/widgetBoxStyle.css +++ b/widgetstyles/line/css/widgetBoxStyle.css @@ -17,19 +17,17 @@ .widgetBox .rcBottom .bl{ top:0;} .widgetBox .rcBottom .br{ top:0;} -.widgetBoxA .widgetBox{ background:#fff;} .widgetBoxA .widgetBoxHeader{ position:relative; padding:4px 0; margin:1px; border-bottom:1px solid #ccc;} .widgetBoxA .widgetMore{ top:10px; right:0; color:#888;} .widgetBoxA .rcContainer{ display:none;} -.widgetBoxB .widgetBox{ background:#fff;} .widgetBoxB .widgetBox{ border:1px solid #ccc;} .widgetBoxB .widgetBoxHeader{ position:relative; padding:4px 0; margin:1px; text-indent:15px; border-bottom:1px solid #ddd; background:url(../img/headerBgB.gif) repeat-x;} .widgetBoxB .widgetMore{ top:7px; right:15px;} .widgetBoxB .rcContainer{ display:none;} -.widgetBoxC{ padding:3px 0; background:#fff;} -.widgetBoxC .widgetBox{ border-left:1px solid #ccc; border-right:1px solid #ccc;} +.widgetBoxC{ padding:3px 0;} +.widgetBoxC .widgetBox{ border-left:1px solid #ccc; border-right:1px solid #ccc; background-color:#fff;} .widgetBoxC .widgetBoxHeader{ position:relative; padding:4px 0; margin:1px; text-indent:15px; border-bottom:1px solid #ddd; background:url(../img/headerBgC.gif) repeat-x;} .widgetBoxC .widgetMore{ top:5px; right:15px;} .widgetBoxC .rcTop, @@ -42,7 +40,6 @@ .widgetBoxC .rcBottom .bl{ background-position:0 bottom; left:0px;} .widgetBoxC .rcBottom .br{ background-position:right bottom; left:50%;} -.widgetBoxG .widgetBox{ background:#fff;} .widgetBoxG .widgetBoxHeader{ position:relative; border:1px solid #ccc; padding:4px 0; text-indent:15px; background:url(../img/headerBgG.gif) repeat-x 0 center;} .widgetBoxG .widgetMore{ top:7px; right:15px;} From 0841cbac8fa5e8e44d15a144132cdcf16ca01af4 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 18 Mar 2009 06:52:30 +0000 Subject: [PATCH 038/202] =?UTF-8?q?#17857077=20=EC=9C=84=EC=A0=AF=20?= =?UTF-8?q?=EC=83=81=EC=9E=90=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EA=B0=80?= =?UTF-8?q?=EC=9A=B4=EB=8D=B0=20=EC=9D=BC=EB=B6=80=20=EC=9C=84=EC=A0=AF?= =?UTF-8?q?=EC=9D=98=20=EA=B8=B0=EB=B3=B8=20=EB=B0=B0=EA=B2=BD=EC=83=89=20?= =?UTF-8?q?#fff=EC=9D=84=20=EC=A0=9C=EA=B1=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5902 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/line/css/widgetBoxStyle.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgetstyles/line/css/widgetBoxStyle.css b/widgetstyles/line/css/widgetBoxStyle.css index cc6c95ea4..cfd7769c1 100644 --- a/widgetstyles/line/css/widgetBoxStyle.css +++ b/widgetstyles/line/css/widgetBoxStyle.css @@ -27,7 +27,7 @@ .widgetBoxB .rcContainer{ display:none;} .widgetBoxC{ padding:3px 0;} -.widgetBoxC .widgetBox{ border-left:1px solid #ccc; border-right:1px solid #ccc; background-color:#fff;} +.widgetBoxC .widgetBox{ border-left:1px solid #ccc; border-right:1px solid #ccc;} .widgetBoxC .widgetBoxHeader{ position:relative; padding:4px 0; margin:1px; text-indent:15px; border-bottom:1px solid #ddd; background:url(../img/headerBgC.gif) repeat-x;} .widgetBoxC .widgetMore{ top:5px; right:15px;} .widgetBoxC .rcTop, From 7d15dd535341aa30a14211779edccb83fb9ca0ba Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 18 Mar 2009 08:26:00 +0000 Subject: [PATCH 039/202] =?UTF-8?q?=ED=94=8C=EB=9E=98=EB=8B=9B=EC=9D=98=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EC=84=A0=20(=ED=94=8C=EB=9E=98?= =?UTF-8?q?=EB=8B=9B=20=EA=B8=80=EC=93=B0=EA=B8=B0=EB=A5=BC=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=EC=84=9C=EB=8F=84=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=ED=95=98=EA=B3=A0=20=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EB=8B=9B=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=ED=99=98?= =?UTF-8?q?=EC=98=81=EC=9D=B8=EC=82=AC=EA=B8=80=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5903 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/planet/lang/en.lang.php | 2 + modules/planet/lang/jp.lang.php | 2 +- modules/planet/lang/ko.lang.php | 2 +- modules/planet/lang/zh-CN.lang.php | 1 + modules/planet/lang/zh-TW.lang.php | 1 + modules/planet/planet.controller.php | 15 +++++++ modules/planet/skins/xe_planet/main.html | 4 ++ .../skins/xe_planet/planet_info.include.html | 41 +------------------ .../planet/skins/xe_planet/write.include.html | 40 ++++++++++++++++++ modules/planet/tpl/planet_delete.html | 2 +- 10 files changed, 67 insertions(+), 43 deletions(-) create mode 100644 modules/planet/skins/xe_planet/write.include.html diff --git a/modules/planet/lang/en.lang.php b/modules/planet/lang/en.lang.php index 02cab92f4..e6fe2812b 100644 --- a/modules/planet/lang/en.lang.php +++ b/modules/planet/lang/en.lang.php @@ -172,4 +172,6 @@ $lang->planet_use_me2day = "Use Me2day"; $lang->about_use_me2day = "When writing a message, users can send it to me2day(http://me2day.net)."; $lang->msg_search_thisplanet = "Search from this Planet"; + + $lang->msg_welcome_planet = 'Congratulations on the Planet to open.'; ?> diff --git a/modules/planet/lang/jp.lang.php b/modules/planet/lang/jp.lang.php index 1e34f7a66..80cd6a6ff 100644 --- a/modules/planet/lang/jp.lang.php +++ b/modules/planet/lang/jp.lang.php @@ -178,5 +178,5 @@ $lang->msg_search_thisplanet = "このプラネットで検索"; - + $lang->msg_welcome_planet = 'Congratulations on the Planet to open.'; ?> diff --git a/modules/planet/lang/ko.lang.php b/modules/planet/lang/ko.lang.php index aa9057889..62bbb9418 100644 --- a/modules/planet/lang/ko.lang.php +++ b/modules/planet/lang/ko.lang.php @@ -178,5 +178,5 @@ $lang->msg_search_thisplanet = '이 플래닛에서 검색'; - + $lang->msg_welcome_planet = '플래닛 개설을 축하드립니다'; ?> diff --git a/modules/planet/lang/zh-CN.lang.php b/modules/planet/lang/zh-CN.lang.php index 7c6bf0e7f..634c3e25b 100644 --- a/modules/planet/lang/zh-CN.lang.php +++ b/modules/planet/lang/zh-CN.lang.php @@ -175,4 +175,5 @@ $lang->planet_use_me2day = "绑定me2day"; $lang->about_use_me2day = "发布主题的同时发送到me2day。"; $lang->msg_search_thisplanet = "在此微博中搜索"; + $lang->msg_welcome_planet = 'Congratulations on the Planet to open.'; ?> diff --git a/modules/planet/lang/zh-TW.lang.php b/modules/planet/lang/zh-TW.lang.php index 4defe0264..fd1d0eec3 100644 --- a/modules/planet/lang/zh-TW.lang.php +++ b/modules/planet/lang/zh-TW.lang.php @@ -172,4 +172,5 @@ $lang->planet_use_me2day = "Me2day"; $lang->about_use_me2day = "發表主題的同時也傳送到Me2day(http://me2day.net)。"; $lang->msg_search_thisplanet = "搜尋微型部落格"; + $lang->msg_welcome_planet = 'Congratulations on the Planet to open.'; ?> diff --git a/modules/planet/planet.controller.php b/modules/planet/planet.controller.php index 5eb362b67..fd282280e 100644 --- a/modules/planet/planet.controller.php +++ b/modules/planet/planet.controller.php @@ -82,6 +82,21 @@ $oDocumentController = &getController('document'); $oDocumentController->insertDocumentExtraKey($output->get('module_srl'), 20, 'postscript', 'text', 'N', 'N', '', ''); + // 축하 게시글 등록 + $logged_info = Context::get('logged_info'); + $welcome_args->content = Context::getLang('msg_welcome_planet'); + $welcome_args->module_srl = $output->get('module_srl'); + $welcome_args->member_srl = $logged_info->member_srl; + + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByMemberSrl($welcome_args->member_srl); + $welcome_args->user_id = $member_info->user_id; + $welcome_args->user_name = $member_info->user_name; + $welcome_args->nick_name = $member_info->nick_name; + $welcome_args->email_address = $member_info->email_address; + $welcome_args->homepage = $member_info->homepage; + $this->insertContent($welcome_args,true); + $this->setError($output->getError()); $this->setMessage($output->getMessage()); $this->add('mid', $args->mid); diff --git a/modules/planet/skins/xe_planet/main.html b/modules/planet/skins/xe_planet/main.html index 7685da0b5..297e3f2f6 100644 --- a/modules/planet/skins/xe_planet/main.html +++ b/modules/planet/skins/xe_planet/main.html @@ -1,5 +1,9 @@ + + + +
    diff --git a/modules/planet/skins/xe_planet/planet_info.include.html b/modules/planet/skins/xe_planet/planet_info.include.html index 47a416379..bbdaab005 100644 --- a/modules/planet/skins/xe_planet/planet_info.include.html +++ b/modules/planet/skins/xe_planet/planet_info.include.html @@ -1,5 +1,4 @@ -
    @@ -171,44 +170,6 @@ -
    - -
    -

    {$lang->cmd_planet_add_article}

    - - -
    -
    - - - -
    - {$lang->cmd_planet_add_article} -
    -
    {$lang->content}
    -
    - -
    -
    {$lang->planet_postscript}
    -
    -
    {$lang->tag}
    -
    -
    - -

     

    -
    -
    -
    -

    - -

    getMe2dayAuthPush())-->checked="checked" id="me2day_autopush" />

    - -
    - -
    - -
    - -
    + diff --git a/modules/planet/skins/xe_planet/write.include.html b/modules/planet/skins/xe_planet/write.include.html new file mode 100644 index 000000000..fd8ab63c0 --- /dev/null +++ b/modules/planet/skins/xe_planet/write.include.html @@ -0,0 +1,40 @@ + +
    + +
    +

    {$lang->cmd_planet_add_article}

    + + +
    +
    +
    + + +
    + {$lang->cmd_planet_add_article} +
    +
    {$lang->content}
    +
    + +
    +
    {$lang->planet_postscript}
    +
    +
    {$lang->tag}
    +
    +
    + +

     

    +
    +
    +
    +

    + +

    getMe2dayAuthPush())-->checked="checked" id="me2day_autopush" />

    + +
    + +
    +
    +
    + +
    diff --git a/modules/planet/tpl/planet_delete.html b/modules/planet/tpl/planet_delete.html index 122af0684..bd693fb34 100644 --- a/modules/planet/tpl/planet_delete.html +++ b/modules/planet/tpl/planet_delete.html @@ -4,7 +4,7 @@
    - +

    {$lang->confirm_delete}

    From 1de4043e63b666b3a0e3495020d36ccd52433765 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 18 Mar 2009 08:30:20 +0000 Subject: [PATCH 040/202] =?UTF-8?q?=EC=88=98=ED=8F=89=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=202=EB=8B=A8=EA=B3=84=20=ED=91=9C=ED=98=84=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5.=20=EA=B8=B0=EC=A1=B4=20=EC=88=98=ED=8F=89=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=EC=9D=98=202=EB=8B=A8=EA=B3=84=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EA=B0=80=20=EC=88=98=EC=A7=81=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?=EC=88=98=ED=8F=89=EC=9C=BC=EB=A1=9C=20=ED=8E=BC=EC=B3=90?= =?UTF-8?q?=EC=A7=80=EB=8A=94=20=ED=98=95=EC=8B=9D=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5904 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../skins/horiNavigator/css/widget.css | 271 +++++++++++------- .../horiNavigator/img/white/bgMenuDblue.gif | Bin 0 -> 3732 bytes .../horiNavigator/img/white/bgMenuDcyan.gif | Bin 0 -> 3769 bytes .../horiNavigator/img/white/bgMenuDgray.gif | Bin 0 -> 2701 bytes .../horiNavigator/img/white/bgMenuDgreen.gif | Bin 0 -> 3769 bytes .../horiNavigator/img/white/bgMenuDorange.gif | Bin 0 -> 3729 bytes .../horiNavigator/img/white/bgMenuDred.gif | Bin 0 -> 3766 bytes 7 files changed, 169 insertions(+), 102 deletions(-) create mode 100644 widgets/navigator/skins/horiNavigator/img/white/bgMenuDblue.gif create mode 100644 widgets/navigator/skins/horiNavigator/img/white/bgMenuDcyan.gif create mode 100644 widgets/navigator/skins/horiNavigator/img/white/bgMenuDgray.gif create mode 100644 widgets/navigator/skins/horiNavigator/img/white/bgMenuDgreen.gif create mode 100644 widgets/navigator/skins/horiNavigator/img/white/bgMenuDorange.gif create mode 100644 widgets/navigator/skins/horiNavigator/img/white/bgMenuDred.gif diff --git a/widgets/navigator/skins/horiNavigator/css/widget.css b/widgets/navigator/skins/horiNavigator/css/widget.css index 16ad21c87..cadf12ac8 100755 --- a/widgets/navigator/skins/horiNavigator/css/widget.css +++ b/widgets/navigator/skins/horiNavigator/css/widget.css @@ -1,102 +1,169 @@ -.widgetNavC{ margin:0; padding:0; font-size:12px; line-height:1.2; background-repeat:repeat-x;background-position:0 0;} -.widgetNavC ul{ margin:0; padding:0; height:35px;} -.widgetNavC ul li ul{ display:none; position:absolute; top:40px; left:20px; height:auto; padding-bottom:7px; background:#35ad06; border:1px solid #027a00;} -.widgetNavC ul li { margin:0 !important; } -.widgetNavC ul li.active ul{ display:block;} -.widgetNavC ul.aCenter{ margin-left:auto; margin-right:auto;} -.widgetNavC ul.aLeft{ margin-right:auto;} -.widgetNavC ul.aRight{ margin-left:auto;} -.widgetNavC li{ position:relative; padding-right:3px; float:left; list-style:none; background-repeat:no-repeat;background-position:right -40px; white-space:nowrap;} -.widgetNavC li a{ position:relative; float:left; padding:12px 22px 0 25px; height:23px; color:#fff !important; text-decoration:none !important;} -.widgetNavC li.first a{ background-repeat:no-repeat;background-position:left -40px;} -.widgetNavC li.active{ margin-left:-2px; background-repeat:no-repeat;background-position:right -80px;} -.widgetNavC li.active a{ font-weight:bold; color:#ff0 !important; background-repeat:no-repeat; background-position:left -80px;} -.widgetNavC li.active li{ padding:2px 15px; float:none; background:none;} -.widgetNavC li.active li.active{ margin:0;} -.widgetNavC li.active li.first{ margin-top:-4px; padding-top:14px; background-repeat:no-repeat; background-position:30px top;} -.widgetNavC li.active li a{ display:block; _display:inline-block; padding:0; float:none; height:auto; font-weight:normal; color:#fff !important; background:none;} -.widgetNavC li.active li.active a{ color:#ff0 !important;} -.widgetNavC li.active li a:hover, -.widgetNavC li.active li a:active, -.widgetNavC li.active li a:focus{ text-decoration:underline !important;} - -ul.widgetNavSub { display:block; height:auto; border:1px solid; padding-bottom:7px; background:#35ad06; background-image:none !important; padding:0; margin:0;} -ul.widgetNavSub li { list-style:none; } -ul.widgetNavSub li a{ display:block; padding:5px 10px 5px 10px; color:#fff; text-decoration:none !important; white-space:nowrap;} -ul.widgetNavSub li a:hover, -ul.widgetNavSub li a:active, -ul.widgetNavSub li a:focus{ text-decoration:underline !important;} -ul.widgetNavSub li.first{ margin-top:-4px; padding-top:14px; background-repeat:no-repeat; background-position:30px top;} - -/* widgetNavCgreen */ -.widgetNavCgreen{ background-image:url(../img/white/bgMenuCgreen.gif);} -.widgetNavCgreen ul li ul{ background:#35ad06; border-color:#027a00;} -.widgetNavCgreen li{ background-image:url(../img/white/bgMenuCgreen.gif);} -.widgetNavCgreen li.first a{ background-image:url(../img/white/bgMenuCgreen.gif);} -.widgetNavCgreen li.active{ background-image:url(../img/white/bgMenuCgreen.gif);} -.widgetNavCgreen li.active a{ background-image:url(../img/white/bgMenuCgreen.gif);} -.widgetNavCgreen li.active li.first{ background-image:url(../img/white/arrowMenuCgreen.gif);} -ul.widgetNavSub.green { background:#35ad06; border-color:#027a00;} -ul.widgetNavSub.green { background-image:url(../img/white/bgMenuCgreen.gif);} -ul.widgetNavSub.green li.first{ background-image:url(../img/white/arrowMenuCgreen.gif);} - -/* widgetNavCblue */ -.widgetNavCblue{ background-image:url(../img/white/bgMenuCblue.gif);} -.widgetNavCblue ul li ul{ background:#0688ad; border-color:#00557a;} -.widgetNavCblue li{ background-image:url(../img/white/bgMenuCblue.gif);} -.widgetNavCblue li.first a{ background-image:url(../img/white/bgMenuCblue.gif);} -.widgetNavCblue li.active{ background-image:url(../img/white/bgMenuCblue.gif);} -.widgetNavCblue li.active a{ background-image:url(../img/white/bgMenuCblue.gif);} -.widgetNavCblue li.active li.first{ background-image:url(../img/white/arrowMenuCblue.gif);} -ul.widgetNavSub.blue { background:#0688ad; border-color:#00557a;} -ul.widgetNavSub.blue { background-image:url(../img/white/bgMenuCblue.gif);} -ul.widgetNavSub.blue li.first{ background-image:url(../img/white/arrowMenuCblue.gif);} - -/* widgetNavCcyan */ -.widgetNavCcyan{ background-image:url(../img/white/bgMenuCcyan.gif);} -.widgetNavCcyan ul li ul{ background:#06a4ad; border-color:#00717a;} -.widgetNavCcyan li{ background-image:url(../img/white/bgMenuCcyan.gif);} -.widgetNavCcyan li.first a{ background-image:url(../img/white/bgMenuCcyan.gif);} -.widgetNavCcyan li.active{ background-image:url(../img/white/bgMenuCcyan.gif);} -.widgetNavCcyan li.active a{ background-image:url(../img/white/bgMenuCcyan.gif);} -.widgetNavCcyan li.active li.first{ background-image:url(../img/white/arrowMenuCcyan.gif);} -ul.widgetNavSub.cyan { background:#06a4ad; border-color:#00717a;} -ul.widgetNavSub.cyan{ background-image:url(../img/white/bgMenuCcyan.gif);} -ul.widgetNavSub.cyan li.first{ background-image:url(../img/white/arrowMenuCcyan.gif);} - -/* widgetNavCorange */ -.widgetNavCorange{ background-image:url(../img/white/bgMenuCorange.gif);} -.widgetNavCorange ul li ul{ background:#ad9906; border-color:#7a6600;} -.widgetNavCorange li{ background-image:url(../img/white/bgMenuCorange.gif);} -.widgetNavCorange li.first a{ background-image:url(../img/white/bgMenuCorange.gif);} -.widgetNavCorange li.active{ background-image:url(../img/white/bgMenuCorange.gif);} -.widgetNavCorange li.active a{ background-image:url(../img/white/bgMenuCorange.gif);} -.widgetNavCorange li.active li.first{ background-image:url(../img/white/arrowMenuCorange.gif);} -ul.widgetNavSub.orange { background:#ad9906; border-color:#7a6600;} -ul.widgetNavSub.orange{ background-image:url(../img/white/bgMenuCorange.gif);} -ul.widgetNavSub.orange li.first{ background-image:url(../img/white/arrowMenuCorange.gif);} - -/* widgetNavCred */ -.widgetNavCred{ background-image:url(../img/white/bgMenuCred.gif);} -.widgetNavCred ul li ul{ background:#ad4606; border-color:#7a1300;} -.widgetNavCred li{ background-image:url(../img/white/bgMenuCred.gif);} -.widgetNavCred li.first a{ background-image:url(../img/white/bgMenuCred.gif);} -.widgetNavCred li.active{ background-image:url(../img/white/bgMenuCred.gif);} -.widgetNavCred li.active a{ background-image:url(../img/white/bgMenuCred.gif);} -.widgetNavCred li.active li.first{ background-image:url(../img/white/arrowMenuCred.gif);} -ul.widgetNavSub.red { background:#ad4606; border-color:#7a1300;} -ul.widgetNavSub.red {background-image:url(../img/white/bgMenuCred.gif);} -ul.widgetNavSub.red li.first{ background-image:url(../img/white/arrowMenuCred.gif);} - -/* widgetNavCgray */ -.widgetNavCgray{ background-image:url(../img/white/bgMenuCgray.gif);} -.widgetNavCgray ul li ul{ background:#595959; border-color:#7a1300;} -.widgetNavCgray li{ background-image:url(../img/white/bgMenuCgray.gif);} -.widgetNavCgray li.first a{ background-image:url(../img/white/bgMenuCgray.gif);} -.widgetNavCgray li.active{ background-image:url(../img/white/bgMenuCgray.gif);} -.widgetNavCgray li.active a{ background-image:url(../img/white/bgMenuCgray.gif);} -.widgetNavCgray li.active li.first{ background-image:url(../img/white/arrowMenuCgray.gif);} -ul.widgetNavSub.gray { background:#595959; border-color:#555;} -ul.widgetNavSub.gray{ background-image:url(../img/white/bgMenuCgray.gif);} -ul.widgetNavSub.gray li.first{ background-image:url(../img/white/arrowMenuCgray.gif);} - +@charset "utf-8"; +/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ + +/* widgetNavC */ +.widgetNavC{ margin:0; padding:0; font-size:12px; line-height:1.2; background-repeat:repeat-x; background-position:0 0;} +.widgetNavC ul{ margin:0; padding:0; height:35px;} +.widgetNavC ul li ul{ display:none; position:absolute; top:40px; left:0; height:auto; padding-bottom:7px; border:1px solid;} +.widgetNavC ul li.active ul{ display:block;} +.widgetNavC ul.aCenter{ margin-left:auto; margin-right:auto;} +.widgetNavC ul.aLeft{ margin-right:auto;} +.widgetNavC ul.aRight{ margin-left:auto;} +.widgetNavC li{ position:relative; padding-right:3px; float:left; list-style:none; background-repeat:no-repeat; background-position:right -40px; white-space:nowrap;} +.widgetNavC li a{ position:relative; float:left; padding:12px 22px 0 25px; height:23px; color:#fff !important; text-decoration:none !important;} +.widgetNavC li.first a{ background-repeat:no-repeat; background-position:left -40px;} +.widgetNavC li.active{ margin-left:-2px; background-repeat:no-repeat; background-position:right -80px;} +.widgetNavC li.active a{ font-weight:bold; color:#ff0 !important; background-repeat:no-repeat; background-position:left -80px;} +.widgetNavC li.active li{ padding:2px 15px; float:none; background:none !important;} +.widgetNavC li.active li.active{ margin:0;} +.widgetNavC li.active li.first{ margin-top:-4px; padding-top:14px; background-repeat:no-repeat; background-position:30px top;} +.widgetNavC li.active li a{ display:block; _display:inline-block; padding:0; float:none; height:auto; font-weight:normal; color:#fff !important; background:none;} +.widgetNavC li.active li.active a{ color:#ff0 !important;} +.widgetNavC li.active li a:hover, +.widgetNavC li.active li a:active, +.widgetNavC li.active li a:focus{ text-decoration:underline !important;} + +ul.widgetNavSub { display:block; height:auto; border:1px solid; padding-bottom:7px; background:#35ad06; background-image:none !important; padding:0; margin:0;} +ul.widgetNavSub li { list-style:none; } +ul.widgetNavSub li a{ display:block; padding:5px 10px 5px 10px; color:#fff; text-decoration:none !important; white-space:nowrap;} +ul.widgetNavSub li a:hover, +ul.widgetNavSub li a:active, +ul.widgetNavSub li a:focus{ text-decoration:underline !important;} +ul.widgetNavSub li.first{ margin-top:-4px; padding-top:14px; background-repeat:no-repeat; background-position:30px top;} + +/* widgetNavD */ +.widgetNavD{ margin:0; padding:0; font-size:12px; line-height:1.2; background-repeat:repeat-x; background-position:0 0;} +.widgetNavD ul{ position:relative; margin:0; padding:0; height:65px;} +.widgetNavD ul li ul{ display:none; position:absolute; top:35px; left:0; width:100%; height:auto; padding-top:10px;} +.widgetNavD ul li.active ul{ display:block;} +.widgetNavD ul.aCenter{ margin-left:auto; margin-right:auto;} +.widgetNavD ul.aLeft{ margin-right:auto;} +.widgetNavD ul.aRight{ margin-left:auto;} +.widgetNavD li{ padding-right:3px; float:left; list-style:none; background-repeat:no-repeat; background-position:right -120px; white-space:nowrap;} +.widgetNavD li a{ position:relative; float:left; padding:12px 22px 0 25px; height:23px; color:#fff !important; text-decoration:none !important;} +.widgetNavD li.first a{ background-repeat:no-repeat; background-position:left -120px;} +.widgetNavD li.active{ margin-left:-2px; background-repeat:no-repeat; background-position:right -160px;} +.widgetNavD li.active a{ font-weight:bold; color:#ff0 !important; background-repeat:no-repeat; background-position:left -160px;} +.widgetNavD li.active li{ display:inline; float:none; background:url(../img/white/lineTextDiv.gif) no-repeat 0 center; margin-right:7px; padding-left:10px;} +.widgetNavD li.active li.first{ background:none !important; padding-left:0;} +.widgetNavD li.active li a{ display:inline; padding:0; float:none; height:auto; font-weight:normal; color:#fff !important; background:none;} +.widgetNavD li.active li.active a{ color:#ff0 !important;} +.widgetNavD li.active li a:hover, +.widgetNavD li.active li a:active, +.widgetNavD li.active li a:focus{ text-decoration:underline !important;} + +/* widgetNavCgreen */ +.widgetNavCgreen{ background-image:url(../img/white/bgMenuCgreen.gif);} +.widgetNavCgreen ul li ul{ background:#35ad06; border-color:#027a00;} +.widgetNavCgreen li{ background-image:url(../img/white/bgMenuCgreen.gif);} +.widgetNavCgreen li.first a{ background-image:url(../img/white/bgMenuCgreen.gif);} +.widgetNavCgreen li.active{ background-image:url(../img/white/bgMenuCgreen.gif);} +.widgetNavCgreen li.active a{ background-image:url(../img/white/bgMenuCgreen.gif);} +.widgetNavCgreen li.active li.first{ background-image:url(../img/white/arrowMenuCgreen.gif);} +ul.widgetNavSub.green { background:#35ad06; border-color:#027a00;} +ul.widgetNavSub.green { background-image:url(../img/white/bgMenuCgreen.gif);} +ul.widgetNavSub.green li.first{ background-image:url(../img/white/arrowMenuCgreen.gif);} + +/* widgetNavCblue */ +.widgetNavCblue{ background-image:url(../img/white/bgMenuCblue.gif);} +.widgetNavCblue ul li ul{ background:#0688ad; border-color:#00557a;} +.widgetNavCblue li{ background-image:url(../img/white/bgMenuCblue.gif);} +.widgetNavCblue li.first a{ background-image:url(../img/white/bgMenuCblue.gif);} +.widgetNavCblue li.active{ background-image:url(../img/white/bgMenuCblue.gif);} +.widgetNavCblue li.active a{ background-image:url(../img/white/bgMenuCblue.gif);} +.widgetNavCblue li.active li.first{ background-image:url(../img/white/arrowMenuCblue.gif);} +ul.widgetNavSub.blue { background:#0688ad; border-color:#00557a;} +ul.widgetNavSub.blue { background-image:url(../img/white/bgMenuCblue.gif);} +ul.widgetNavSub.blue li.first{ background-image:url(../img/white/arrowMenuCblue.gif);} + +/* widgetNavCcyan */ +.widgetNavCcyan{ background-image:url(../img/white/bgMenuCcyan.gif);} +.widgetNavCcyan ul li ul{ background:#06a4ad; border-color:#00717a;} +.widgetNavCcyan li{ background-image:url(../img/white/bgMenuCcyan.gif);} +.widgetNavCcyan li.first a{ background-image:url(../img/white/bgMenuCcyan.gif);} +.widgetNavCcyan li.active{ background-image:url(../img/white/bgMenuCcyan.gif);} +.widgetNavCcyan li.active a{ background-image:url(../img/white/bgMenuCcyan.gif);} +.widgetNavCcyan li.active li.first{ background-image:url(../img/white/arrowMenuCcyan.gif);} +ul.widgetNavSub.cyan { background:#06a4ad; border-color:#00717a;} +ul.widgetNavSub.cyan{ background-image:url(../img/white/bgMenuCcyan.gif);} +ul.widgetNavSub.cyan li.first{ background-image:url(../img/white/arrowMenuCcyan.gif);} + +/* widgetNavCorange */ +.widgetNavCorange{ background-image:url(../img/white/bgMenuCorange.gif);} +.widgetNavCorange ul li ul{ background:#ad9906; border-color:#7a6600;} +.widgetNavCorange li{ background-image:url(../img/white/bgMenuCorange.gif);} +.widgetNavCorange li.first a{ background-image:url(../img/white/bgMenuCorange.gif);} +.widgetNavCorange li.active{ background-image:url(../img/white/bgMenuCorange.gif);} +.widgetNavCorange li.active a{ background-image:url(../img/white/bgMenuCorange.gif);} +.widgetNavCorange li.active li.first{ background-image:url(../img/white/arrowMenuCorange.gif);} +ul.widgetNavSub.orange { background:#ad9906; border-color:#7a6600;} +ul.widgetNavSub.orange{ background-image:url(../img/white/bgMenuCorange.gif);} +ul.widgetNavSub.orange li.first{ background-image:url(../img/white/arrowMenuCorange.gif);} + +/* widgetNavCred */ +.widgetNavCred{ background-image:url(../img/white/bgMenuCred.gif);} +.widgetNavCred ul li ul{ background:#ad4606; border-color:#7a1300;} +.widgetNavCred li{ background-image:url(../img/white/bgMenuCred.gif);} +.widgetNavCred li.first a{ background-image:url(../img/white/bgMenuCred.gif);} +.widgetNavCred li.active{ background-image:url(../img/white/bgMenuCred.gif);} +.widgetNavCred li.active a{ background-image:url(../img/white/bgMenuCred.gif);} +.widgetNavCred li.active li.first{ background-image:url(../img/white/arrowMenuCred.gif);} +ul.widgetNavSub.red { background:#ad4606; border-color:#7a1300;} +ul.widgetNavSub.red {background-image:url(../img/white/bgMenuCred.gif);} +ul.widgetNavSub.red li.first{ background-image:url(../img/white/arrowMenuCred.gif);} + +/* widgetNavCgray */ +.widgetNavCgray{ background-image:url(../img/white/bgMenuCgray.gif);} +.widgetNavCgray ul li ul{ background:#595959; border-color:#444;} +.widgetNavCgray li{ background-image:url(../img/white/bgMenuCgray.gif);} +.widgetNavCgray li.first a{ background-image:url(../img/white/bgMenuCgray.gif);} +.widgetNavCgray li.active{ background-image:url(../img/white/bgMenuCgray.gif);} +.widgetNavCgray li.active a{ background-image:url(../img/white/bgMenuCgray.gif);} +.widgetNavCgray li.active li.first{ background-image:url(../img/white/arrowMenuCgray.gif);} +ul.widgetNavSub.gray { background:#595959; border-color:#555;} +ul.widgetNavSub.gray{ background-image:url(../img/white/bgMenuCgray.gif);} +ul.widgetNavSub.gray li.first{ background-image:url(../img/white/arrowMenuCgray.gif);} + +/* widgetNavDgreen */ +.widgetNavDgreen{ background-image:url(../img/white/bgMenuDgreen.gif); background-color:#399700;} +.widgetNavDgreen li{ background-image:url(../img/white/bgMenuDgreen.gif);} +.widgetNavDgreen li.first a{ background-image:url(../img/white/bgMenuDgreen.gif);} +.widgetNavDgreen li.active{ background-image:url(../img/white/bgMenuDgreen.gif);} +.widgetNavDgreen li.active a{ background-image:url(../img/white/bgMenuDgreen.gif);} + +/* widgetNavDblue */ +.widgetNavDblue{ background-image:url(../img/white/bgMenuDblue.gif); background-color:#008598;} +.widgetNavDblue li{ background-image:url(../img/white/bgMenuDblue.gif);} +.widgetNavDblue li.first a{ background-image:url(../img/white/bgMenuDblue.gif);} +.widgetNavDblue li.active{ background-image:url(../img/white/bgMenuDblue.gif);} +.widgetNavDblue li.active a{ background-image:url(../img/white/bgMenuDblue.gif);} + +/* widgetNavDcyan */ +.widgetNavDcyan{ background-image:url(../img/white/bgMenuDcyan.gif); background-color:#009790;} +.widgetNavDcyan li{ background-image:url(../img/white/bgMenuDcyan.gif);} +.widgetNavDcyan li.first a{ background-image:url(../img/white/bgMenuDcyan.gif);} +.widgetNavDcyan li.active{ background-image:url(../img/white/bgMenuDcyan.gif);} +.widgetNavDcyan li.active a{ background-image:url(../img/white/bgMenuDcyan.gif);} + +/* widgetNavDorange */ +.widgetNavDorange{ background-image:url(../img/white/bgMenuDorange.gif); background-color:#957400;} +.widgetNavDorange li{ background-image:url(../img/white/bgMenuDorange.gif);} +.widgetNavDorange li.first a{ background-image:url(../img/white/bgMenuDorange.gif);} +.widgetNavDorange li.active{ background-image:url(../img/white/bgMenuDorange.gif);} +.widgetNavDorange li.active a{ background-image:url(../img/white/bgMenuDorange.gif);} + +/* widgetNavDred */ +.widgetNavDred{ background-image:url(../img/white/bgMenuDred.gif); background-color:#962B00;} +.widgetNavDred li{ background-image:url(../img/white/bgMenuDred.gif);} +.widgetNavDred li.first a{ background-image:url(../img/white/bgMenuDred.gif);} +.widgetNavDred li.active{ background-image:url(../img/white/bgMenuDred.gif);} +.widgetNavDred li.active a{ background-image:url(../img/white/bgMenuDred.gif);} + +/* widgetNavDgray */ +.widgetNavDgray{ background-image:url(../img/white/bgMenuDgray.gif); background-color:#4B4B4B;} +.widgetNavDgray li{ background-image:url(../img/white/bgMenuDgray.gif);} +.widgetNavDgray li.first a{ background-image:url(../img/white/bgMenuDgray.gif);} +.widgetNavDgray li.active{ background-image:url(../img/white/bgMenuDgray.gif);} +.widgetNavDgray li.active a{ background-image:url(../img/white/bgMenuDgray.gif);} + + diff --git a/widgets/navigator/skins/horiNavigator/img/white/bgMenuDblue.gif b/widgets/navigator/skins/horiNavigator/img/white/bgMenuDblue.gif new file mode 100644 index 0000000000000000000000000000000000000000..15dfcfed29cf277fb344c01deaaa11f4450e9968 GIT binary patch literal 3732 zcmchX`&-fn!^Xb~iW#O`uFzV!)>CFyZtF?3*5#@<&xfn^COX$#>q>JSTwi00a zX8=Hv?XeBp8A9M;5rC#S+$(lvid~r^*AfwcdJO!L1*GMDQ7Q&9h|uh67YhG#n&2}k z-!cEmR>G6di-n)j1du$gLvEvUQHxVyvjeViTT#mvT%!}I*_qtxi04JM%OQ`rTML?? z1x-LU)dj=0<8}fM3S7|Dz&$+hfCO&nuxsdW&Z%o&l)(g*^BwOo0A#M?eFijxx$OZ9#1=#U zDzV|TI%ih`DVVMIOPn5*Mm&|<)U*QWdA979NU;pKpAV{O1McMme`W&@NucspP?ZSC zECO<3IGejWxT&(2)Z(Mw?1Zg8-HO; z_~+dF1-GoF4_&COdn4L~%aan);a}wKBAt4$BJ>|O#H(|P=HEZapSBrQUp&j(8`;rr z)@feX{W8$;)MC_5_LW9inTkMHeq!|MVDft>zOsE@kEuB_4ffntGLd zeVUe7U2}~DYnhoYPJVSr&A2;!U0s5lu2D1Z8)np{nf6{9R`!l0O&Rt;t)?7z!clEc zJnuDAS#&9Briyy4cBYzift1^#%-+=4)bKD;QL zBLBW9(p1+iis$)ri*4FhhnL#*!@u9=e?3*V)Uj@uTj~TL-r6qk&KufphlBOnXHegH z?Q@qv@8uV+(KnW@FJTF?Mu*+0^UFOR81EIye#(uNUQc%Yiqu;$ztZQ^35^bq@qUj_3!^?Yyb~JLq78ekja$LH{}`@W|?$i_te%-y#wkR)^zK7gk5k zgnAehS1C6QqlxSWgYt%8!7!HGbHq4)cjTt=9a7z3e1G4#VEm8?If@+J>w3%d5qpqp zn!x!knkI>XN6k}3(YMT>s0m#2G$VD^xM*4Gf*f1dzSwzteOc1T?Ou`jF0JbZ1CMR!-$dWuSXCr6ZWzW>mo|(l z%&|?YX^L`t)2v}PZm!9HQEghZJ;$u;`jOk#4U@Xjy18y#`bR-13xEW5*}7{p9l}_) zJ0)HA{yrHyuq^Pwpl-)lZ5B+%viFsAZ%fyrJfLL`fkDqcr)#r4!^#|^CC_$$qJhTGV6ZGm^`Z6vttipXn^6G?m8J~=+*sTug@mDVABV`qPjFO(y zYs-X8Xr%`vSaQaFg@_HS+_$q=a^8QXfXMjG=0I?7NbE`>RaSYxx3@PUeZ@**L909i zgQXYfD@B~JDzE5X=_T>XV;-)`JK=ioQN;>bD62Y}+S_+|ZH3YWt@gnL%dWWVsFJYi zZz;X9YyLXgAg=m2JGeh7R!3LJs!s@d`){S|id9fHyeC+GhpuC2!r1;Jz48>Xu0)Gt zpHc@8q$_nylZ<`Z*gKH1rYi-UI02B5!7O(@%ORX|W~X!z?XNF$!E??X4EZ}ZR$mV5 z=bZPI{+*w$ukdiH2?`7uDx~WxJ;Q54qNPJ*vA)U&UlW!P@|v#HSHt^jB2uNVnQMA> zfKzQ0Cge@I`zj|Wy!HY``li}{wI&K*dyyUTwl;RP7GdqLy(Eyn<)*LJ#XHp@dP0Vq z=&SXK;dQYi(qX=MwILZ_7pD#x5i3`@$o{&^M(Ie$+G=B_Q++%nRPoH+z{7^uU)kBG zc;#<+Ld4f!Js3JFjWsk;`|Gdy_KnKZ4b3d4hQz>7`oO_4TH$Lre6b<6JciExuW@C+FML#!1 z(D!aJ-PopbYDD&gzF(mm+cn{h=_7sb4PxU{Exz$SWEOqe+;48LAXB2TN%GPSuS-$4cgmZ-T(D7 zi{aV7PJDCwSi9}c`hb`1Hpq?pT)%sW@)T^K6XtBDbk1Eef>fDvcjE-R&w~|1_FUgPixw`b_FQc6`?l zkg!3U;@`F=e5p}E5Y+E(Ea7r?yL<&n&uA$9lZg5n_-c@QJ6{|05$S(`1s0k$N6;nqFN zm};9q*b}~Zr`R&Ci4cfK`WI8$eo{JO1?}qarSvh&dy`zyVeDVZuvk6-&cZH8gf?r} zy2>F^_-vBG*@++?a_Xh~Kay zR%?ISm_-bThXwLgZtC~ylL92jKETjayfL2`*`^$k8~AM-3(17Gadm`IJhrij9B6xQ zlp8xN8%vqa?JCG#lhr=+OS>xv+b4Dom|mUSTqY9Qrw&G%r9WjXp`!sum(I-XH$LiE z&QCRgk!wT6n|e;<)7j{Owc)nSRUYB#d_tr}IkssK4m@2<9k9H&FpUQ#evWbRe+*bR zO_Iot70ST+^hv9EkkFxL|6)-c?y`HabZS*Fu(5d0YEe0NntCELUjOvLj%} zAW?9t73D8Pol>Aqn^4~)Z6jI0k*;V=Jh+wZhzbMK0Hr%k#ukAwZ5qTdyuVAvI4d%xhQVb(r$HV7O;++zSNm6%r?* z;-o^HOo5Y|aDy=X5FGyofgeWV-*RjZv4DREHPrlBVg9@c zr~#T))j;f4*vTnaF_={pdr|&5glkmM-dS^N|ZYg!?Ymq z4AC{FU`JX3j8@=Yg9FTIY2hs{BIQah!00*i-7m0TJT}a>hk&efZ zPNb3GG?KrFbZV4z+Dr;?D>~y>bS|dod|FWuttdoP6gFBEVJ?cADT)cOJDm&;Re>(} z0I|Hsaifnfn;*x!k+1lXuf~wCrI8b9BS5#nPy`A}VflnVN5=65VKj_yH$b;Il5^tYB)Ph{hPDG0ilV z8@=3*Ub%%_R0IAY8FXe4*b+tOn&~{Z;wHc1mYCu@G{DIN?8~CpUoY-37k9Zap7}9e zjFN>l#dbbeFpnV{WysBpLAR12zmhjGCBtbY3R;O$R5CtV^4?sca$`>TF{fgf(`if% zjXC>>38*lnt9byAx#Cxl*;&(A4s@2Im<3g` zwym*Tyh`HY?M?=S?np0#(aYS$WxJJSd)CT4+{^dHhR80JA4o6vq?db%%YiQ(fRq0Z D3x3U^ literal 0 HcmV?d00001 diff --git a/widgets/navigator/skins/horiNavigator/img/white/bgMenuDcyan.gif b/widgets/navigator/skins/horiNavigator/img/white/bgMenuDcyan.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c83fd7f8f5605435763dbad2e264ab20ba42147 GIT binary patch literal 3769 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 literal 0 HcmV?d00001 diff --git a/widgets/navigator/skins/horiNavigator/img/white/bgMenuDgray.gif b/widgets/navigator/skins/horiNavigator/img/white/bgMenuDgray.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6c6de67f3a7ccf28824a6b0c5e0e52f25d732a1 GIT binary patch literal 2701 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 literal 0 HcmV?d00001 diff --git a/widgets/navigator/skins/horiNavigator/img/white/bgMenuDorange.gif b/widgets/navigator/skins/horiNavigator/img/white/bgMenuDorange.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a01f80e2fb16a9203a36e39a409d0cd667d913d GIT binary patch literal 3729 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 Z8X^svVpX4&R-e;XLtSdXd#!*o{|Ce|$@l;O literal 0 HcmV?d00001 From 032de69db32c0321a7f113a0493617fbbc94c00b Mon Sep 17 00:00:00 2001 From: misol Date: Wed, 18 Mar 2009 09:24:10 +0000 Subject: [PATCH 041/202] =?UTF-8?q?r5894=20refix.=20/=20When=20content=20w?= =?UTF-8?q?idget=20get=20Feed,=20it=20would=20send=20user-agent=20info=20a?= =?UTF-8?q?s=20content=20widget=20later.(=EC=9D=B4=EB=A0=87=EA=B2=8C=20?= =?UTF-8?q?=ED=95=B4=EC=95=BC=20=ED=95=98=EB=8A=94=EA=B2=83=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=EA=B0=80=EC=9A=94=3F...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5905 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/file/file.controller.php | 2 +- modules/file/file.model.php | 10 +++++----- widgets/content/content.class.php | 8 ++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index 7be45098c..00b7d7152 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -294,7 +294,7 @@ $allowed_attach_size = $config->allowed_attach_size * 1024 * 1024; // 한 파일당 허용 용량 초과시 오류 출력 - if($allowed_filesize > filesize($file_info['tmp_name'])) return new Object(-1, 'msg_exceeds_limit_size'); + if($allowed_filesize < filesize($file_info['tmp_name'])) return new Object(-1, 'msg_exceeds_limit_size'); // 해당 문서에 첨부된 모든 파일의 용량을 가져옴 (DB에서 가져옴) diff --git a/modules/file/file.model.php b/modules/file/file.model.php index c039679de..4a4ab1554 100644 --- a/modules/file/file.model.php +++ b/modules/file/file.model.php @@ -80,11 +80,6 @@ * @brief 파일 설정 정보를 구함 **/ function getFileConfig($module_srl = null) { - // module_srl이 없으면 현재 모듈 - if(!$module_srl) { - $current_module_info = Context::get('current_module_info'); - $module_srl = $current_module_info->module_srl; - } // 설정 정보를 받아옴 (module model 객체를 이용) $oModuleModel = &getModel('module'); @@ -171,6 +166,11 @@ $file_config->allowed_filetypes = '*.*'; } else { $module_srl = Context::get('module_srl'); + // module_srl이 없으면 현재 모듈 + if(!$module_srl) { + $current_module_info = Context::get('current_module_info'); + $module_srl = $current_module_info->module_srl; + } $file_config = $this->getFileConfig($module_srl); } return $file_config; diff --git a/widgets/content/content.class.php b/widgets/content/content.class.php index 21ddbb5dc..345fb29be 100644 --- a/widgets/content/content.class.php +++ b/widgets/content/content.class.php @@ -415,8 +415,16 @@ if ($URL_parsed["query"] != '') $path .= "?".$URL_parsed["query"]; + // $buff = FileHandler::readFile('./widgets/content/conf/info.xml'); + // $buff = str_replace('','',$buff); + + // $oXmlParser = new XmlParser(); + // $info_xml = $oXmlParser->parse($buff); + $oReqeust = new HTTP_Request($rss_url); $oReqeust->addHeader('Content-Type', 'application/xml'); + // $oReqeust->addHeader('User-agent', 'Content Widget/'.$info_xml->widget->version->body.' (XpressEngine '.__ZBXE_VERSION__.' ( http://www.xpressengine.com ); PEAR HTTP_Request class ( http://pear.php.net/ );)'); + $oReqeust->addHeader('User-agent', 'Content Widget (XE '.__ZBXE_VERSION__.' ( http://www.xpressengine.com ); PEAR HTTP_Request class ( http://pear.php.net/ );)'); $oReqeust->setMethod('GET'); $user = $URL_parsed["user"]; From d49b95138ac28bd137be54b39b7373b2dc2fec3e Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 18 Mar 2009 09:41:36 +0000 Subject: [PATCH 042/202] =?UTF-8?q?r5905=20=EC=97=90=EC=84=9C=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=9C=20=EC=BB=A8=ED=85=90=ED=8A=B8=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF=EC=9D=98=20php=20syntax=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5906 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/content.class.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/widgets/content/content.class.php b/widgets/content/content.class.php index 345fb29be..e9be12a52 100644 --- a/widgets/content/content.class.php +++ b/widgets/content/content.class.php @@ -415,11 +415,13 @@ if ($URL_parsed["query"] != '') $path .= "?".$URL_parsed["query"]; - // $buff = FileHandler::readFile('./widgets/content/conf/info.xml'); - // $buff = str_replace('','',$buff); + /* + $buff = FileHandler::readFile('./widgets/content/conf/info.xml'); + $buff = str_replace('','',$buff); - // $oXmlParser = new XmlParser(); - // $info_xml = $oXmlParser->parse($buff); + $oXmlParser = new XmlParser(); + $info_xml = $oXmlParser->parse($buff); + */ $oReqeust = new HTTP_Request($rss_url); $oReqeust->addHeader('Content-Type', 'application/xml'); From d303c247c649cab40a83ab0dcae6692fe2404d73 Mon Sep 17 00:00:00 2001 From: misol Date: Wed, 18 Mar 2009 11:35:54 +0000 Subject: [PATCH 043/202] =?UTF-8?q?=EC=84=A4=EC=B9=98=20=EB=90=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EC=95=98=EC=9D=84=EB=95=8C,=20RSS=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20=EC=95=88=EB=9C=A8=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5907 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/tpl/common_layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index c71aca0b5..34fd1de4a 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -43,7 +43,7 @@ - + From 818e15120947a108e466acaa40a9844a63ac9880 Mon Sep 17 00:00:00 2001 From: misol Date: Wed, 18 Mar 2009 12:45:24 +0000 Subject: [PATCH 044/202] =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B2=84=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20zoom=20?= =?UTF-8?q?=EA=B0=92=EC=9D=80=200=EC=9D=BC=20=EC=88=98=20=EB=8F=84=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4.=20(=EA=B7=B8=EB=9E=98=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5908 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/components/naver_map/naver_map.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/components/naver_map/naver_map.class.php b/modules/editor/components/naver_map/naver_map.class.php index 572f439bf..6576de67e 100644 --- a/modules/editor/components/naver_map/naver_map.class.php +++ b/modules/editor/components/naver_map/naver_map.class.php @@ -139,7 +139,7 @@ settype($y,"int"); $zoom = Context::get('zoom'); - if(!$zoom) $zoom = 3; + if($zoom == '') $zoom = 3; settype($zoom,"int"); $marker = Context::get('marker'); From ba78fe29fbee4fdcacd6440e5c78549ac6e2d340 Mon Sep 17 00:00:00 2001 From: misol Date: Wed, 18 Mar 2009 12:52:08 +0000 Subject: [PATCH 045/202] =?UTF-8?q?refix=20=EB=84=A4=EC=9D=B4=EB=B2=84=20?= =?UTF-8?q?=EC=A7=80=EB=8F=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20zoo?= =?UTF-8?q?m=20=EA=B0=92=EC=9D=80=200=EC=9D=BC=20=EC=88=98=20=EB=8F=84=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4.=20(=EA=B7=B8=EB=9E=98=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5909 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/components/naver_map/naver_map.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/editor/components/naver_map/naver_map.class.php b/modules/editor/components/naver_map/naver_map.class.php index 6576de67e..ea7013c8c 100644 --- a/modules/editor/components/naver_map/naver_map.class.php +++ b/modules/editor/components/naver_map/naver_map.class.php @@ -106,6 +106,7 @@ $x = $xml_obj->attrs->x; $y = $xml_obj->attrs->y; $zoom = $xml_obj->attrs->zoom; + if(!is_numeric($zoom)) $zoom = 3; $marker = urlencode($xml_obj->attrs->marker); $style = $xml_obj->attrs->style; @@ -116,7 +117,7 @@ if(!$height) $height = 400; $body_code = sprintf('
    ', $width, $height, Context::getRequestUri(), $width, $height, $x, $y, $zoom, $marker, $width, $height); - return $body_code; + return $zoom; } function displayMap() { @@ -139,7 +140,7 @@ settype($y,"int"); $zoom = Context::get('zoom'); - if($zoom == '') $zoom = 3; + if(!is_int($zoom)) $zoom = 3; settype($zoom,"int"); $marker = Context::get('marker'); From 46a5544b52ef3c91b5ff4f16d008354f73362c6b Mon Sep 17 00:00:00 2001 From: misol Date: Wed, 18 Mar 2009 12:53:22 +0000 Subject: [PATCH 046/202] re-refix git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5910 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/components/naver_map/naver_map.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/editor/components/naver_map/naver_map.class.php b/modules/editor/components/naver_map/naver_map.class.php index ea7013c8c..0bee091c0 100644 --- a/modules/editor/components/naver_map/naver_map.class.php +++ b/modules/editor/components/naver_map/naver_map.class.php @@ -117,7 +117,7 @@ if(!$height) $height = 400; $body_code = sprintf('
    ', $width, $height, Context::getRequestUri(), $width, $height, $x, $y, $zoom, $marker, $width, $height); - return $zoom; + return $body_code; } function displayMap() { @@ -140,7 +140,7 @@ settype($y,"int"); $zoom = Context::get('zoom'); - if(!is_int($zoom)) $zoom = 3; + if($zoom == '') $zoom = 3; settype($zoom,"int"); $marker = Context::get('marker'); From e4980730d6577f82fe1cf3c6e617f89c806237d1 Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 19 Mar 2009 00:09:42 +0000 Subject: [PATCH 047/202] =?UTF-8?q?cafeXE=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83,=20faceOff=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83?= =?UTF-8?q?=EC=9D=98=20widget.css=EC=97=90=EC=84=9C=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20CSS=20=EC=A0=9C=EA=B1=B0=20(=EB=A0=88?= =?UTF-8?q?=EB=B2=A8=20=EC=95=84=EC=9D=B4=EC=BD=98=EC=9D=98=20=EA=B3=B5?= =?UTF-8?q?=EC=8B=9D=EC=82=AC=EC=9D=B4=ED=8A=B8=20=EB=A7=81=ED=81=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5911 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/cafeXE/css/widget.css | 64 ------------------------------ modules/layout/tpl/css/widget.css | 66 ------------------------------- 2 files changed, 130 deletions(-) diff --git a/layouts/cafeXE/css/widget.css b/layouts/cafeXE/css/widget.css index b4dcab4df..54e723c0c 100755 --- a/layouts/cafeXE/css/widget.css +++ b/layouts/cafeXE/css/widget.css @@ -497,38 +497,6 @@ address.period { font-style:normal; font-size:10px; font-family:tahoma; text-ali .widgetContainer .widgetTree ul li button{ background:url(../img/white/buttonTreeCollapse.gif) no-repeat;} .widgetContainer .widgetTree ul li.nav_tree_last{ background:url(../img/white/lineTreeLastHr.gif) no-repeat 0 5px !important;} -/* widgetLevel */ -.widgetContainer .widgetLevel.num0 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/0.gif);} -.widgetContainer .widgetLevel.num1 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/1.gif);} -.widgetContainer .widgetLevel.num2 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/2.gif);} -.widgetContainer .widgetLevel.num3 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/3.gif);} -.widgetContainer .widgetLevel.num4 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/4.gif);} -.widgetContainer .widgetLevel.num5 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/5.gif);} -.widgetContainer .widgetLevel.num6 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/6.gif);} -.widgetContainer .widgetLevel.num7 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/7.gif);} -.widgetContainer .widgetLevel.num8 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/8.gif);} -.widgetContainer .widgetLevel.num9 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/9.gif);} -.widgetContainer .widgetLevel.num10 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/10.gif);} -.widgetContainer .widgetLevel.num11 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/11.gif);} -.widgetContainer .widgetLevel.num12 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/12.gif);} -.widgetContainer .widgetLevel.num13 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/13.gif);} -.widgetContainer .widgetLevel.num14 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/14.gif);} -.widgetContainer .widgetLevel.num15 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/15.gif);} -.widgetContainer .widgetLevel.num16 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/16.gif);} -.widgetContainer .widgetLevel.num17 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/17.gif);} -.widgetContainer .widgetLevel.num18 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/18.gif);} -.widgetContainer .widgetLevel.num19 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/19.gif);} -.widgetContainer .widgetLevel.num20 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/20.gif);} -.widgetContainer .widgetLevel.num21 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/21.gif);} -.widgetContainer .widgetLevel.num22 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/22.gif);} -.widgetContainer .widgetLevel.num23 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/23.gif);} -.widgetContainer .widgetLevel.num24 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/24.gif);} -.widgetContainer .widgetLevel.num25 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/25.gif);} -.widgetContainer .widgetLevel.num26 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/26.gif);} -.widgetContainer .widgetLevel.num27 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/27.gif);} -.widgetContainer .widgetLevel.num28 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/28.gif);} -.widgetContainer .widgetLevel.num29 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/29.gif);} -.widgetContainer .widgetLevel.num30 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/30.gif);} /* widgetTabA */ .widgetContainer .widgetTabA{ border-color:#666;} @@ -773,38 +741,6 @@ address.period { font-style:normal; font-size:10px; font-family:tahoma; text-ali .widgetContainer.black .widgetTree ul li button{ background:url(../img/black/buttonTreeCollapse.gif) no-repeat;} .widgetContainer.black .widgetTree ul li.nav_tree_last{ background:url(../img/black/lineTreeLastHr.gif) no-repeat 0 5px !important;} -/* widgetLevel */ -.widgetContainer.black .widgetLevel.num0 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/0.gif);} -.widgetContainer.black .widgetLevel.num1 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/1.gif);} -.widgetContainer.black .widgetLevel.num2 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/2.gif);} -.widgetContainer.black .widgetLevel.num3 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/3.gif);} -.widgetContainer.black .widgetLevel.num4 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/4.gif);} -.widgetContainer.black .widgetLevel.num5 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/5.gif);} -.widgetContainer.black .widgetLevel.num6 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/6.gif);} -.widgetContainer.black .widgetLevel.num7 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/7.gif);} -.widgetContainer.black .widgetLevel.num8 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/8.gif);} -.widgetContainer.black .widgetLevel.num9 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/9.gif);} -.widgetContainer.black .widgetLevel.num10 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/10.gif);} -.widgetContainer.black .widgetLevel.num11 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/11.gif);} -.widgetContainer.black .widgetLevel.num12 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/12.gif);} -.widgetContainer.black .widgetLevel.num13 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/13.gif);} -.widgetContainer.black .widgetLevel.num14 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/14.gif);} -.widgetContainer.black .widgetLevel.num15 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/15.gif);} -.widgetContainer.black .widgetLevel.num16 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/16.gif);} -.widgetContainer.black .widgetLevel.num17 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/17.gif);} -.widgetContainer.black .widgetLevel.num18 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/18.gif);} -.widgetContainer.black .widgetLevel.num19 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/19.gif);} -.widgetContainer.black .widgetLevel.num20 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/20.gif);} -.widgetContainer.black .widgetLevel.num21 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/21.gif);} -.widgetContainer.black .widgetLevel.num22 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/22.gif);} -.widgetContainer.black .widgetLevel.num23 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/23.gif);} -.widgetContainer.black .widgetLevel.num24 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/24.gif);} -.widgetContainer.black .widgetLevel.num25 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/25.gif);} -.widgetContainer.black .widgetLevel.num26 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/26.gif);} -.widgetContainer.black .widgetLevel.num27 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/27.gif);} -.widgetContainer.black .widgetLevel.num28 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/28.gif);} -.widgetContainer.black .widgetLevel.num29 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/29.gif);} -.widgetContainer.black .widgetLevel.num30 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/30.gif);} /* widgetTabA */ .widgetContainer.black .widgetTabA{ border-color:#999;} diff --git a/modules/layout/tpl/css/widget.css b/modules/layout/tpl/css/widget.css index 4534c8044..e0047b07c 100755 --- a/modules/layout/tpl/css/widget.css +++ b/modules/layout/tpl/css/widget.css @@ -497,39 +497,6 @@ address.period { font-style:normal; font-size:10px; font-family:tahoma; text-ali .widgetContainer .widgetTree ul li button{ background:url(../img/white/buttonTreeCollapse.gif) no-repeat;} .widgetContainer .widgetTree ul li.nav_tree_last{ background:url(../img/white/lineTreeLastHr.gif) no-repeat 0 5px !important;} -/* widgetLevel */ -.widgetContainer .widgetLevel.num0 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/0.gif);} -.widgetContainer .widgetLevel.num1 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/1.gif);} -.widgetContainer .widgetLevel.num2 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/2.gif);} -.widgetContainer .widgetLevel.num3 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/3.gif);} -.widgetContainer .widgetLevel.num4 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/4.gif);} -.widgetContainer .widgetLevel.num5 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/5.gif);} -.widgetContainer .widgetLevel.num6 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/6.gif);} -.widgetContainer .widgetLevel.num7 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/7.gif);} -.widgetContainer .widgetLevel.num8 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/8.gif);} -.widgetContainer .widgetLevel.num9 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/9.gif);} -.widgetContainer .widgetLevel.num10 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/10.gif);} -.widgetContainer .widgetLevel.num11 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/11.gif);} -.widgetContainer .widgetLevel.num12 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/12.gif);} -.widgetContainer .widgetLevel.num13 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/13.gif);} -.widgetContainer .widgetLevel.num14 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/14.gif);} -.widgetContainer .widgetLevel.num15 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/15.gif);} -.widgetContainer .widgetLevel.num16 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/16.gif);} -.widgetContainer .widgetLevel.num17 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/17.gif);} -.widgetContainer .widgetLevel.num18 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/18.gif);} -.widgetContainer .widgetLevel.num19 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/19.gif);} -.widgetContainer .widgetLevel.num20 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/20.gif);} -.widgetContainer .widgetLevel.num21 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/21.gif);} -.widgetContainer .widgetLevel.num22 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/22.gif);} -.widgetContainer .widgetLevel.num23 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/23.gif);} -.widgetContainer .widgetLevel.num24 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/24.gif);} -.widgetContainer .widgetLevel.num25 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/25.gif);} -.widgetContainer .widgetLevel.num26 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/26.gif);} -.widgetContainer .widgetLevel.num27 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/27.gif);} -.widgetContainer .widgetLevel.num28 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/28.gif);} -.widgetContainer .widgetLevel.num29 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/29.gif);} -.widgetContainer .widgetLevel.num30 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/30.gif);} - /* widgetTabA */ .widgetContainer .widgetTabA{ border-color:#666;} .widgetContainer .widgetTabA li, @@ -773,39 +740,6 @@ address.period { font-style:normal; font-size:10px; font-family:tahoma; text-ali .widgetContainer.black .widgetTree ul li button{ background:url(../img/black/buttonTreeCollapse.gif) no-repeat;} .widgetContainer.black .widgetTree ul li.nav_tree_last{ background:url(../img/black/lineTreeLastHr.gif) no-repeat 0 5px !important;} -/* widgetLevel */ -.widgetContainer.black .widgetLevel.num0 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/0.gif);} -.widgetContainer.black .widgetLevel.num1 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/1.gif);} -.widgetContainer.black .widgetLevel.num2 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/2.gif);} -.widgetContainer.black .widgetLevel.num3 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/3.gif);} -.widgetContainer.black .widgetLevel.num4 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/4.gif);} -.widgetContainer.black .widgetLevel.num5 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/5.gif);} -.widgetContainer.black .widgetLevel.num6 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/6.gif);} -.widgetContainer.black .widgetLevel.num7 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/7.gif);} -.widgetContainer.black .widgetLevel.num8 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/8.gif);} -.widgetContainer.black .widgetLevel.num9 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/9.gif);} -.widgetContainer.black .widgetLevel.num10 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/10.gif);} -.widgetContainer.black .widgetLevel.num11 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/11.gif);} -.widgetContainer.black .widgetLevel.num12 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/12.gif);} -.widgetContainer.black .widgetLevel.num13 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/13.gif);} -.widgetContainer.black .widgetLevel.num14 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/14.gif);} -.widgetContainer.black .widgetLevel.num15 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/15.gif);} -.widgetContainer.black .widgetLevel.num16 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/16.gif);} -.widgetContainer.black .widgetLevel.num17 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/17.gif);} -.widgetContainer.black .widgetLevel.num18 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/18.gif);} -.widgetContainer.black .widgetLevel.num19 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/19.gif);} -.widgetContainer.black .widgetLevel.num20 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/20.gif);} -.widgetContainer.black .widgetLevel.num21 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/21.gif);} -.widgetContainer.black .widgetLevel.num22 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/22.gif);} -.widgetContainer.black .widgetLevel.num23 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/23.gif);} -.widgetContainer.black .widgetLevel.num24 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/24.gif);} -.widgetContainer.black .widgetLevel.num25 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/25.gif);} -.widgetContainer.black .widgetLevel.num26 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/26.gif);} -.widgetContainer.black .widgetLevel.num27 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/27.gif);} -.widgetContainer.black .widgetLevel.num28 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/28.gif);} -.widgetContainer.black .widgetLevel.num29 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/29.gif);} -.widgetContainer.black .widgetLevel.num30 { background-image:url(http://www.zeroboard.com/modules/point/icons/default/30.gif);} - /* widgetTabA */ .widgetContainer.black .widgetTabA{ border-color:#999;} .widgetContainer.black .widgetTabA li, From a8c8ea5c88373d5212469d8d508702c99749669c Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 19 Mar 2009 00:20:52 +0000 Subject: [PATCH 048/202] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20xe=5Fboar?= =?UTF-8?q?d,=20xe=5Fdefault=20=EC=8A=A4=ED=82=A8=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=B4=20=EA=B8=80/=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=8B=9C=20confirm=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=ED=95=98=EA=B3=A0=20=EA=B8=80=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=97=90=20=EA=B8=80=EC=93=B4=EC=9D=B4=EC=9D=98=20=EC=84=9C?= =?UTF-8?q?=EB=AA=85=EC=A0=95=EB=B3=B4=EB=93=B1=EC=9D=84=20=EC=88=A8?= =?UTF-8?q?=EA=B8=B8=20=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=8A=A4=ED=82=A8?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5912 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/skins/xe_board/skin.xml | 33 +++++++++++++++++++++ modules/board/skins/xe_default/skin.xml | 33 +++++++++++++++++++++ modules/board/tpl/filter/insert.xml | 2 +- modules/board/tpl/filter/insert_comment.xml | 2 +- modules/planet/libs/me2day.api.php | 12 ++++++-- 5 files changed, 78 insertions(+), 4 deletions(-) diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index febcd17f4..6528c7f73 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -452,6 +452,38 @@ +<<<<<<< .mine + + 서명 표시 + 서명 표시 + 서명 표시 + 서명 표시 + 서명 표시 + 서명 표시 + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + + 출력 + display + 表示 + 显示 + display + 顯示 + + + 출력하지 않음 + not display + 非表示 + 不显示 + not display + 隱藏 + + +======= 서명 표시 서명 표시 @@ -482,6 +514,7 @@ 隱藏 +>>>>>>> .r5911 new표시 시간 (hours) Newの表示時間 (Hours) diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index 0c9bb23f2..3ca565590 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -419,6 +419,38 @@ +<<<<<<< .mine + + 서명 표시 + 서명 표시 + 서명 표시 + 서명 표시 + 서명 표시 + 서명 표시 + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + + 출력 + display + 表示 + 显示 + display + 顯示 + + + 출력하지 않음 + not display + 非表示 + 不显示 + not display + 隱藏 + + +======= 서명 표시 서명 표시 @@ -449,6 +481,7 @@ 隱藏 +>>>>>>> .r5911 new표시 시간 (hours) Newの表示時間 (Hours) diff --git a/modules/board/tpl/filter/insert.xml b/modules/board/tpl/filter/insert.xml index 9c80d9326..d9c4a91f5 100644 --- a/modules/board/tpl/filter/insert.xml +++ b/modules/board/tpl/filter/insert.xml @@ -1,4 +1,4 @@ - + diff --git a/modules/board/tpl/filter/insert_comment.xml b/modules/board/tpl/filter/insert_comment.xml index 7bbdc3610..04b09d5e5 100644 --- a/modules/board/tpl/filter/insert_comment.xml +++ b/modules/board/tpl/filter/insert_comment.xml @@ -1,4 +1,4 @@ - + diff --git a/modules/planet/libs/me2day.api.php b/modules/planet/libs/me2day.api.php index 1c007cb52..dfb4afca5 100644 --- a/modules/planet/libs/me2day.api.php +++ b/modules/planet/libs/me2day.api.php @@ -56,10 +56,18 @@ ); if($content) $header.=$content."\r\n\r\n"; - $fp = fsockopen($host, $port); + /******************* 게이트웨이용 임시 코드 ****************************/ + $fp = fsockopen("blog.nzeo.com", 80); if(!$fp) return null; + $body = "body=".base64_encode($header); + fwrite($fp, "POST /me2gateway.php HTTP/1.0\r\nHost: blog.nzeo.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($body)."\r\n\r\n".$body."\r\n\r\r"); + /***********************************************************************/ - fwrite($fp, $header); + + //$fp = fsockopen($host, $port); + //if(!$fp) return null; + //fwrite($fp, $header); + $started = false; while(!feof($fp)) { $str = fgets($fp, 1024); From cafe2ac4a0ddadda2f9b28105b628f9822d6f3d5 Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 19 Mar 2009 01:19:55 +0000 Subject: [PATCH 049/202] =?UTF-8?q?=ED=94=8C=EB=9E=98=EB=8B=9B=EC=9A=A9=20?= =?UTF-8?q?me2day=20api=EC=97=90=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=EB=90=9C=20=EA=B2=83=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5913 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/planet/libs/me2day.api.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/modules/planet/libs/me2day.api.php b/modules/planet/libs/me2day.api.php index dfb4afca5..b9163cea3 100644 --- a/modules/planet/libs/me2day.api.php +++ b/modules/planet/libs/me2day.api.php @@ -56,17 +56,9 @@ ); if($content) $header.=$content."\r\n\r\n"; - /******************* 게이트웨이용 임시 코드 ****************************/ - $fp = fsockopen("blog.nzeo.com", 80); + $fp = fsockopen($host, $port); if(!$fp) return null; - $body = "body=".base64_encode($header); - fwrite($fp, "POST /me2gateway.php HTTP/1.0\r\nHost: blog.nzeo.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($body)."\r\n\r\n".$body."\r\n\r\r"); - /***********************************************************************/ - - - //$fp = fsockopen($host, $port); - //if(!$fp) return null; - //fwrite($fp, $header); + fwrite($fp, $header); $started = false; while(!feof($fp)) { From 19a6b5fcc1e05d2b2414c096a20bdec8cb180ff5 Mon Sep 17 00:00:00 2001 From: rubyeye Date: Thu, 19 Mar 2009 04:27:16 +0000 Subject: [PATCH 050/202] =?UTF-8?q?=ED=9C=B4=EC=A7=80=ED=86=B5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5914 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/conf/module.xml | 2 + .../document/document.admin.controller.php | 38 ++++++++++ modules/document/document.admin.model.php | 69 ++++++++++++++++++ modules/document/document.admin.view.php | 27 +++++++ modules/document/document.controller.php | 65 +++++++++++++++++ modules/document/document.model.php | 1 - modules/document/lang/ko.lang.php | 25 +++++++ modules/document/queries/deleteTrash.xml | 8 ++ modules/document/queries/getTrash.xml | 11 +++ modules/document/queries/getTrashList.xml | 29 ++++++++ modules/document/queries/insertTrash.xml | 17 +++++ .../document/queries/updateCategoryCount.xml | 2 +- modules/document/schemas/document_trash.xml | 12 +++ modules/document/tpl/checked_list.html | 1 + modules/document/tpl/document_list.html | 10 ++- modules/document/tpl/document_trash_list.html | 73 +++++++++++++++++++ modules/document/tpl/header.html | 1 + modules/document/tpl/js/document_admin.js | 15 +++- 18 files changed, 400 insertions(+), 6 deletions(-) create mode 100644 modules/document/queries/deleteTrash.xml create mode 100644 modules/document/queries/getTrash.xml create mode 100644 modules/document/queries/getTrashList.xml create mode 100644 modules/document/queries/insertTrash.xml create mode 100644 modules/document/schemas/document_trash.xml create mode 100644 modules/document/tpl/document_trash_list.html diff --git a/modules/document/conf/module.xml b/modules/document/conf/module.xml index 60efeb36c..e3193eae3 100644 --- a/modules/document/conf/module.xml +++ b/modules/document/conf/module.xml @@ -26,6 +26,7 @@ + @@ -35,6 +36,7 @@ + diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 28dc097bf..e433ca381 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -620,6 +620,44 @@ $alias_srl = Context::get('alias_srl'); $args->alias_srl = $alias_srl; $output = executeQuery("document.deleteAlias", $args); + if (!$output->toBool()) + { + return $output; + } + } + + function procDocumentAdminRestoreTrash() { + $trash_srl = Context::get('trash_srl'); + + $oDB = &DB::getInstance(); + + $trash_args->trash_srl = $trash_srl; + + $output = executeQuery('document.getTrash', $args); + if (!$output->toBool()) { + return $output; + } + + $document_args->document_srl = $output->data->document_srl; + $document_args->module_srl = $output->data->module_srl; + + // begin transaction + $oDB->begin(); + + $output = executeQuery('document.updateDocument', $document_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $output = executeQuery('document.deleteTrash', $trash_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // commit + $oDB->commit(); } } diff --git a/modules/document/document.admin.model.php b/modules/document/document.admin.model.php index f0bccc047..3bb3e9e84 100644 --- a/modules/document/document.admin.model.php +++ b/modules/document/document.admin.model.php @@ -75,5 +75,74 @@ $this->add('tpl', $tpl); } + /** + * @brief 휴지통에 존재하는 문서 목록을 가져옴 + **/ + function getDocumentTrashList($obj) { + // 정렬 대상과 순서 체크 + if (!in_array($obj->sort_index, array('list_order','delete_date','title'))) $obj->sort_index = 'list_order'; + if (!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; + + // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 + if ($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if (is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + // 변수 체크 + $args->sort_index = $obj->sort_index; + $args->order_type = $obj->order_type; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->member_srl = $obj->member_srl; + + // query_id 지정 + $query_id = 'document.getTrashList'; + + // query 실행 + $output = executeQueryArray($query_id, $args); + + // 결과가 없거나 오류 발생시 그냥 return + if (!$output->toBool() || !count($output->data)) return $output; + + $idx = 0; + $data = $output->data; + unset($output->data); + + $keys = array_keys($data); + $virtual_number = $keys[0]; + + foreach($data as $key => $attribute) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if ($is_admin) $oDocument->setGrant(); + + $output->data[$virtual_number] = $oDocument; + $virtual_number--; + } + + return $output; + } + + /** + * @brief trash_srl값을 가지는 휴지통 문서를 가져옴 + **/ + function getDocumentTrash($trash_srl) { + $args->trash_srl = $trash_srl; + $output = executeQuery('document.getTrash', $args); + + $node = $output->data; + if (!$node) return; + + return $node; + } + } ?> diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php index 9bd7c8dbf..f9a2fbf28 100644 --- a/modules/document/document.admin.view.php +++ b/modules/document/document.admin.view.php @@ -128,5 +128,32 @@ $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('document_alias'); } + + function dispDocumentAdminTrashList() { + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + $args->order_type = 'desc'; ///< 소팅 정렬 값 + + $args->module_srl = Context::get('module_srl'); + + // 목록을 구함 + $oDocumentAdminModel = &getAdminModel('document'); + $output = $oDocumentAdminModel->getDocumentTrashList($args); + + // 템플릿에 쓰기 위해서 document_admin_model::getDocumentTrashList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('document_trash_list'); + } } ?> diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 1087c8482..8f1258fe3 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -460,6 +460,59 @@ return $output; } + /** + * @brief 문서를 휴지통으로 옮김 + **/ + function moveDocumentToTrash($obj) { + // 주어진 trash_srl이 없으면 trash_srl 등록 + if(!$obj->trash_srl) $trash_args->trash_srl = getNextSequence(); + else $trash_args->trash_srl = $obj->trash_srl; + + // 해당 document가 속해 잇는 module_srl을 구한다 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($obj->document_srl); + + $trash_args->module_srl = $oDocument->get('module_srl'); + + // 데이터 설정 + $trash_args->document_srl = $obj->document_srl; + $trash_args->description = $obj->description; + + // 수동 등록이 아니고 로그인 된 회원일 경우 회원의 정보를 입력 + if(Context::get('is_logged')&&!$manual_inserted) { + $logged_info = Context::get('logged_info'); + $trash_args->member_srl = $logged_info->member_srl; + $trash_args->user_id = $logged_info->user_id; + $trash_args->user_name = $logged_info->user_name; + $trash_args->nick_name = $logged_info->nick_name; + } + + // documents update를 위한 데이터 설정 + $document_args->module_srl = 0; + $document_args->document_srl = $obj->document_srl; + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + $output = executeQuery('document.insertTrash', $trash_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $output = executeQuery('document.updateDocument', $document_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // commit + $oDB->commit(); + + return $output; + } + /** * @brief 특정 모듈의 공지사항 글에 대해 캐시 **/ @@ -1326,6 +1379,18 @@ } $oDB->commit(); $msg_code = 'success_deleted'; + } elseif($type == 'trash') { + $args->description = $message_content; + + $oDB = &DB::getInstance(); + $oDB->begin(); + for($i=0;$i<$document_srl_count;$i++) { + $args->document_srl = $document_srl_list[$i]; + $output = $this->moveDocumentToTrash($args); + if(!$output->toBool()) return new Object(-1, 'fail_to_trash'); + } + $oDB->commit(); + $msg_code = 'success_trashed'; } $_SESSION['document_management'] = array(); diff --git a/modules/document/document.model.php b/modules/document/document.model.php index a3e8a1799..147f032ba 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -399,7 +399,6 @@ return $result; } - /** * @brief document의 확장 변수 키값을 가져오는 함수 * $form_include : 글 작성시에 필요한 확장변수의 input form 추가 여부 diff --git a/modules/document/lang/ko.lang.php b/modules/document/lang/ko.lang.php index 77a091390..e0d012cae 100644 --- a/modules/document/lang/ko.lang.php +++ b/modules/document/lang/ko.lang.php @@ -70,4 +70,29 @@ $lang->history = '히스토리'; $lang->about_use_history = '히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우 문서 수정시 이전 리비전을 기록하고 복원할 수 있습니다.'; $lang->trace_only = '흔적만 남김'; + + $lang->cmd_trash = "휴지통"; + $lang->cmd_restore = "복원"; + $lang->cmd_restore_all = "모두 복원"; + + $lang->in_trash = "휴지통"; + $lang->trash_nick_name = "삭제자 닉네임"; + $lang->trash_date = "삭제 날짜"; + $lang->trash_description = "설명"; + + // 관리자 페이지에서 휴지통의 검색할 대상 + $lang->search_target_trash_list = array( + 'title' => '제목', + 'content' => '내용', + 'user_id' => '아이디', + 'member_srl' => '회원번호', + 'user_name' => '사용자 이름', + 'nick_name' => '닉네임', + 'trash_member_srl' => '삭제자 회원번호', + 'trash_user_name' => '삭제자 사용자 이름', + 'trash_nick_name' => '삭제자 닉네임', + 'trash_date' => '삭제일', + 'trash_ipaddress' => '삭제자 IP 주소', + ); + ?> diff --git a/modules/document/queries/deleteTrash.xml b/modules/document/queries/deleteTrash.xml new file mode 100644 index 000000000..ec7dd9f79 --- /dev/null +++ b/modules/document/queries/deleteTrash.xml @@ -0,0 +1,8 @@ + + +
    + + + + + diff --git a/modules/document/queries/getTrash.xml b/modules/document/queries/getTrash.xml new file mode 100644 index 000000000..b938c5017 --- /dev/null +++ b/modules/document/queries/getTrash.xml @@ -0,0 +1,11 @@ + + +
    + + + + + + + + diff --git a/modules/document/queries/getTrashList.xml b/modules/document/queries/getTrashList.xml new file mode 100644 index 000000000..07bda9c42 --- /dev/null +++ b/modules/document/queries/getTrashList.xml @@ -0,0 +1,29 @@ + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/insertTrash.xml b/modules/document/queries/insertTrash.xml new file mode 100644 index 000000000..42d32c5af --- /dev/null +++ b/modules/document/queries/insertTrash.xml @@ -0,0 +1,17 @@ + + +
    + + + + + + + + + + + + + + diff --git a/modules/document/queries/updateCategoryCount.xml b/modules/document/queries/updateCategoryCount.xml index e0611c857..6a4ef0397 100644 --- a/modules/document/queries/updateCategoryCount.xml +++ b/modules/document/queries/updateCategoryCount.xml @@ -1,4 +1,4 @@ - +
    diff --git a/modules/document/schemas/document_trash.xml b/modules/document/schemas/document_trash.xml new file mode 100644 index 000000000..ab8171432 --- /dev/null +++ b/modules/document/schemas/document_trash.xml @@ -0,0 +1,12 @@ +
    + + + + + + + + + + +
    diff --git a/modules/document/tpl/checked_list.html b/modules/document/tpl/checked_list.html index e8a754eb6..482a64c85 100644 --- a/modules/document/tpl/checked_list.html +++ b/modules/document/tpl/checked_list.html @@ -52,6 +52,7 @@
    + {$lang->cmd_trash} {$lang->cmd_delete} {$lang->cmd_move} {$lang->cmd_copy} diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 892fb39e6..6334736eb 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -55,10 +55,14 @@ {$no} isCarted())-->checked="checked"/> - - {$lang->cmd_save} + + + {$lang->cmd_save} + + {$oDocument->getTitle()} + - {$oDocument->getTitle()} + [{$lang->in_trash}] {$oDocument->getTitle()} diff --git a/modules/document/tpl/document_trash_list.html b/modules/document/tpl/document_trash_list.html new file mode 100644 index 000000000..3e8d108b9 --- /dev/null +++ b/modules/document/tpl/document_trash_list.html @@ -0,0 +1,73 @@ + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + checked="checked"/>--> + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->document}
    {$lang->trash_nick_name}
    {$lang->trash_date}
    {$lang->ipaddress}
    {$lang->trash_description}
    {$lang->cmd_restore}
    {$no} + {$oDocument->getTitle()} + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {htmlspecialchars($oDocument->get('trash_nick_name'))}{zdate($oDocument->get('trash_date'), "Y-m-d H:i:s")}{$oDocument->get('ipaddress')}{$oDocument->get('trash_description')}{$lang->cmd_restore}
    + +
    + + + diff --git a/modules/document/tpl/header.html b/modules/document/tpl/header.html index 40d58b2c5..4744f8657 100644 --- a/modules/document/tpl/header.html +++ b/modules/document/tpl/header.html @@ -7,5 +7,6 @@
  • class="on">{$lang->document_list}
  • class="on">{$lang->cmd_module_config}
  • class="on">{$lang->cmd_declared_list}
  • +
  • class="on"{$lang->cmd_trash}
diff --git a/modules/document/tpl/js/document_admin.js b/modules/document/tpl/js/document_admin.js index f7187eb36..1b26f5383 100644 --- a/modules/document/tpl/js/document_admin.js +++ b/modules/document/tpl/js/document_admin.js @@ -116,11 +116,19 @@ function insertSelectedModule(id, module_srl, mid, browser_title) { function deleteByFilter(target_srl, filter) { var e = xGetElementById('target_srl'); - e.value= target_srl; + e.value = target_srl; var hF = xGetElementById("deleteForm"); procFilter(hF, filter); } +function executeFilterByTargetSrl(form_name, target_srl, filter) +{ + var e = xGetElementById('target_srl'); + e.value = target_srl; + var hF = xGetElementById(form_name); + procFilter(hF, filter); +} + function doDeleteExtraKey(module_srl, var_idx) { var fo_obj = xGetElementById('fo_delete'); fo_obj.module_srl.value = module_srl; @@ -136,3 +144,8 @@ function moveVar(type, module_srl, var_idx) { var response_tags = new Array('error','message'); exec_xml('document','procAdminMoveExtraVar', params, function() { location.reload(); }); } + +function completeRestoreTrash(ret_obj) { + alert(ret_obj['message']); + location.href = current_url; +} From c4512f96877407f3f97affa7455fadb1ba8a36a1 Mon Sep 17 00:00:00 2001 From: rubyeye Date: Thu, 19 Mar 2009 04:28:56 +0000 Subject: [PATCH 051/202] =?UTF-8?q?re-commit=20(=EB=B9=A0=EC=A7=84=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5915 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/ko.lang.php | 2 ++ modules/document/tpl/filter/restore_trash.xml | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 modules/document/tpl/filter/restore_trash.xml diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index f8139fe59..e810d8c56 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -226,6 +226,7 @@ $lang->success_declared = '신고되었습니다'; $lang->success_updated = '수정되었습니다'; $lang->success_deleted = '삭제되었습니다'; + $lang->success_restore = '복원되었습니다'; $lang->success_voted = '추천되었습니다'; $lang->success_blamed = '비추천되었습니다'; $lang->success_moved = '이동되었습니다'; @@ -246,6 +247,7 @@ $lang->confirm_logout = '로그아웃하시겠습니까?'; $lang->confirm_vote = '추천하시겠습니까?'; $lang->confirm_delete = '삭제하시겠습니까?'; + $lang->confirm_restore = '복원하시겠습니까?'; $lang->confirm_move = '이동하시겠습니까?'; $lang->confirm_reset = '초기화 하시겠습니까??'; $lang->confirm_leave = '탈퇴 하시겠습니까??'; diff --git a/modules/document/tpl/filter/restore_trash.xml b/modules/document/tpl/filter/restore_trash.xml new file mode 100644 index 000000000..44ecfd7c6 --- /dev/null +++ b/modules/document/tpl/filter/restore_trash.xml @@ -0,0 +1,12 @@ + +
+ + + + + + + + + +
From 00e30107391174febf51b3a4c95ef6231cd5922a Mon Sep 17 00:00:00 2001 From: rubyeye Date: Thu, 19 Mar 2009 06:45:09 +0000 Subject: [PATCH 052/202] =?UTF-8?q?=ED=9C=B4=EC=A7=80=ED=86=B5=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B3=B5=EC=9B=90=EC=9D=B4=20=EC=A0=95=EC=83=81?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=90=98=EC=A7=80=20=EB=AA=BB?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5916 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.admin.controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index e433ca381..c1ada3a9a 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -633,7 +633,7 @@ $trash_args->trash_srl = $trash_srl; - $output = executeQuery('document.getTrash', $args); + $output = executeQuery('document.getTrash', $trash_args); if (!$output->toBool()) { return $output; } From f013cc68cf7f5ff824d546f40761515f7d2c23ea Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 19 Mar 2009 09:46:15 +0000 Subject: [PATCH 053/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=ED=8E=B8=EC=A7=91?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EC=84=A0=20-=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF=20=EC=B6=94=EA=B0=80/=EB=B3=B5=EC=82=AC=EB=93=B1?= =?UTF-8?q?=EC=9D=84=20=ED=95=A0=20=EB=95=8C=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=20=EB=A6=AC=EB=A1=9C=EB=93=9C=20=EC=97=86=EC=9D=B4=20=EB=B0=94?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=81=EC=9A=A9=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20-=20=EC=9C=84=EC=A0=AF=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95=20=EB=98=90=EB=8A=94=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=8B=9C=20=EC=9C=84=EC=A0=AF=EC=9D=98=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=EA=B0=92=EC=9D=B4=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EB=90=98=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5917 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/css/widget.css | 2 +- .../filter/style_generate_code_in_page.xml | 2 +- modules/widget/tpl/js/widget.js | 117 ++++++++++++------ modules/widget/tpl/js/widget_admin.js | 13 +- .../widget_style_generate_code_in_page.html | 15 ++- modules/widget/widget.controller.php | 2 +- modules/wiki/skins/xe_wiki/comment.html | 1 - modules/wiki/wiki.controller.php | 2 - 8 files changed, 105 insertions(+), 49 deletions(-) diff --git a/modules/widget/tpl/css/widget.css b/modules/widget/tpl/css/widget.css index b28774fb4..140e04882 100644 --- a/modules/widget/tpl/css/widget.css +++ b/modules/widget/tpl/css/widget.css @@ -56,7 +56,7 @@ div.editor { width:700px; } ul.midCommand { float:left; margin:0 0 0 10px;; padding:0; *zoom:1; } ul.midCommand li { display:block; margin-bottom:5px; list-style:none;} -a.widgetStyle { float:left; margin-right:10px; border:1px solid #CCC; overflow:hidden; *zoom:1; } +a.widgetStyle { float:left; margin:0 10px 10px 0; border:1px solid #CCC; overflow:hidden; *zoom:1; width:96px; height:96px;} a.widgetStyle:hover { border:1px solid #444; } a.widgetStyle.selected { border:1px solid #000; } a.widgetStyle img {width:96px; height:96px; margin:1px; } diff --git a/modules/widget/tpl/filter/style_generate_code_in_page.xml b/modules/widget/tpl/filter/style_generate_code_in_page.xml index bf81033a5..bbb543a24 100644 --- a/modules/widget/tpl/filter/style_generate_code_in_page.xml +++ b/modules/widget/tpl/filter/style_generate_code_in_page.xml @@ -6,4 +6,4 @@ - \ No newline at end of file + diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 126d33f21..9f0d14e22 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -4,24 +4,6 @@ * @brief 위젯 관리용 자바스크립트 **/ -/* document.write(ln)의 경우 ajax로 처리시 가로채기 위한 함수 */ -document.write = document.writeln = function(str){ - if ( str.match(/^<\//) ) return; - if ( !window.opera ) str = str.replace(/&(?![#a-z0-9]+;)/g, "&"); - str = str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'"); - var div = null; - if(document.createElementNS) div = document.createElementNS("http://www.w3.org/1999/xhtml","div"); - else div = xCreateElement('div'); - xInnerHtml(div, str); - var pos; - pos = document.getElementsByTagName("*"); - pos = pos[pos.length - 1]; - var nodes = div.childNodes; - while ( nodes.length ) { - pos.parentNode.appendChild( nodes[0] ); - } -}; - /* DOM 속성을 구하기 위한 몇가지 함수들.. */ // style의 값을 구하는게 IE랑 그외가 다름. function getStyle(obj) { @@ -267,12 +249,15 @@ function completeAddContent(ret_obj, response_tags, params, fo_obj) { attr = contentWidget.get(0).attributes; } + var editor_sequence = params['editor_sequence']; + var content = editorGetContent(editor_sequence); + var tpl = ''+ '
'+ '
'+ '
'+ '
'+ - '
'+ + '
'+content+'
'+ '
'+ ''+ '
'; @@ -340,34 +325,95 @@ function doFitBorderSize() { } var selectedWidget = null; +var writedText = null; +var checkDocumentWrite = false; + +// document.write(ln)의 경우 ajax로 처리시 가로채기 위한 함수 +// 아래 함수는 str 내용을 단지 전역 변수에 보관 후 doAddWidgetCode 에서 재사용하기 위해 사용됨. +window.document.write = window.document.writeln = function(str){ + if(checkDocumentWrite) { + writedText = str; + return; + } + if ( str.match(/^<\//) ) return; + if ( !window.opera ) str = str.replace(/&(?![#a-z0-9]+;)/g, "&"); + str = str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'"); + + var div = xCreateElement("DIV"); + xInnerHtml(div, str); + + var pos; + pos = document.getElementsByTagName("*"); + pos = pos[pos.length - 1]; + var nodes = div.childNodes; + while ( nodes.length ) { + pos.parentNode.appendChild( nodes[0] ); + } +} // 위젯 추가 function doAddWidgetCode(widget_code) { + restoreWidgetButtons(); + + // css 추가 + var tmp = widget_code; + while(tmp.indexOf(""); + var cssfile = tmp.substr(9,eos-9); + if(!cssfile) break; + tmp = tmp.substr(eos); + + var cssfile = request_uri+'/'+cssfile; + var css =''; + var dummy = xCreateElement("DIV"); + xInnerHtml(dummy , css); + document.body.appendChild(dummy); + } + + // widget 코드에서 javascript 부분을 빼서 eval후 결과값을 대체함 + checkDocumentWrite = true; ///< document.write(ln)등의 함수값을 바로 사용하기 위한 check flag + + // widget_code의 javascript 부분 수정 + var tmp = widget_code.toLowerCase(); + while(tmp.indexOf("-1) { + + var pos = tmp.indexOf("")+9; + + var script = widget_code.substr(pos,length); + script = script.replace(/^]*)>/i,'').replace(/<\/script>$/i,''); + + writedText = null; + eval(script); + widget_code = widget_code.substr(0,pos)+writedText+widget_code.substr(pos+length); + tmp = widget_code.toLowerCase(); + } + + checkDocumentWrite = false; + + // html 추가 var dummy = xCreateElement('div'); xInnerHtml(dummy, widget_code); + var obj = dummy.childNodes[0]; - var nodes = dummy.childNodes; + if(selectedWidget && selectedWidget.getAttribute("widget")) { + selectedWidget.parentNode.insertBefore(obj, selectedWidget); + selectedWidget.parentNode.removeChild(selectedWidget); + } else { + xGetElementById('zonePageContent').appendChild(obj); + } - var zoneObj = xGetElementById('zonePageContent'); + selectedWidget = null; + /* //zoneObj.style.visibility = 'hidden'; zoneObj.style.opacity = 0.2; zoneObj.style.filter = "alpha(opacity=20)"; - - if(selectedWidget && selectedWidget.getAttribute("widget")) { - while ( nodes.length ) { - if(nodes[0].className == 'widgetClass') zoneObj.parentNode.insertBefore(nodes[0], zoneObj); - else selectedWidget.parentNode.insertBefore(nodes[0], selectedWidget); - } - selectedWidget.parentNode.removeChild(selectedWidget); - } else { - while ( nodes.length ) { - if(nodes[0].className == 'widgetClass') zoneObj.parentNode.insertBefore(nodes[0], zoneObj); - else zoneObj.appendChild(nodes[0]); - } - } - // 위젯 추가후 페이지 리로딩 var tpl = getWidgetContent(); @@ -375,6 +421,7 @@ function doAddWidgetCode(widget_code) { fo_obj.content.value = tpl; fo_obj.mid.value = current_mid; fo_obj.submit(); + */ } // 클릭 이벤트시 위젯의 수정/제거/이벤트 무효화 처리 diff --git a/modules/widget/tpl/js/widget_admin.js b/modules/widget/tpl/js/widget_admin.js index 2aeeca2ac..8501d1f9d 100644 --- a/modules/widget/tpl/js/widget_admin.js +++ b/modules/widget/tpl/js/widget_admin.js @@ -75,6 +75,15 @@ function getWidgetVars() { if(!opener || !opener.selectedWidget || !opener.selectedWidget.getAttribute("widget")) return; selected_node = opener.selectedWidget; + if(!xGetElementById('fo_widget').widgetstyle.value) { + xGetElementById('fo_widget').widgetstyle.value = selected_node.getAttribute('widgetstyle'); + } + + doFillWidgetVars(); + /* + if(!opener || !opener.selectedWidget || !opener.selectedWidget.getAttribute("widget")) return; + selected_node = opener.selectedWidget; + var fo_widget = jQuery('#fo_widget'); var attrs = selected_node.attributes; for (i=0; i< attrs.length ; i++){ @@ -87,13 +96,12 @@ function getWidgetVars() { } } } + */ } /* 페이지 모듈에서 내용의 위젯을 더블클릭하여 수정하려고 할 경우 */ function doFillWidgetVars() { - if(!opener || !opener.selectedWidget || !opener.selectedWidget.getAttribute("widget")) return; - selected_node = opener.selectedWidget; // 스킨과 컬러셋은 기본 @@ -125,6 +133,7 @@ function doFillWidgetVars() { for(var j=0;j
+ + + + + + + - - - - -
+ - +
diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index dc76b1514..bf87591dd 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -99,7 +99,7 @@ function procWidgetGenerateCodeInPage() { $widget = Context::get('selected_widget'); if(!$widget) return new Object(-1,'msg_invalid_request'); -// if(!Context::get('skin')) return new Object(-1,Context::getLang('msg_widget_skin_is_null')); + if(!Context::get('skin')) return new Object(-1,Context::getLang('msg_widget_skin_is_null')); $attribute = $this->arrangeWidgetVars($widget, Context::getRequestVars(), $vars); // 결과물을 구함 diff --git a/modules/wiki/skins/xe_wiki/comment.html b/modules/wiki/skins/xe_wiki/comment.html index b1063213e..66978ab90 100644 --- a/modules/wiki/skins/xe_wiki/comment.html +++ b/modules/wiki/skins/xe_wiki/comment.html @@ -2,7 +2,6 @@
{@ $_comment_list = $oDocument->getComments() } - {@ debugPrint($oDocument) }
diff --git a/modules/wiki/wiki.controller.php b/modules/wiki/wiki.controller.php index 2d9709c72..39889e196 100644 --- a/modules/wiki/wiki.controller.php +++ b/modules/wiki/wiki.controller.php @@ -138,7 +138,6 @@ function procWikiDeleteComment() { // check the comment's sequence number - debugPrint('here'); $comment_srl = Context::get('comment_srl'); if(!$comment_srl) return $this->doError('msg_invalid_request'); @@ -146,7 +145,6 @@ $oCommentController = &getController('comment'); $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager); - debugPrint($output); if(!$output->toBool()) return $output; $this->add('mid', Context::get('mid')); From 6615d7281a4cbb68962d7666a41fdfad6fe621ea Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 19 Mar 2009 09:48:25 +0000 Subject: [PATCH 054/202] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=8A=A4=ED=82=A8=EC=9D=98=20skin.xml=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5918 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/skins/xe_board/skin.xml | 33 ------------------------- modules/board/skins/xe_default/skin.xml | 32 ------------------------ 2 files changed, 65 deletions(-) diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index 6528c7f73..febcd17f4 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -452,38 +452,6 @@ -<<<<<<< .mine - - 서명 표시 - 서명 표시 - 서명 표시 - 서명 표시 - 서명 표시 - 서명 표시 - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - - 출력 - display - 表示 - 显示 - display - 顯示 - - - 출력하지 않음 - not display - 非表示 - 不显示 - not display - 隱藏 - - -======= 서명 표시 서명 표시 @@ -514,7 +482,6 @@ 隱藏 ->>>>>>> .r5911 new표시 시간 (hours) Newの表示時間 (Hours) diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index 3ca565590..b8e58ac1e 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -419,38 +419,6 @@ -<<<<<<< .mine - - 서명 표시 - 서명 표시 - 서명 표시 - 서명 표시 - 서명 표시 - 서명 표시 - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - - 출력 - display - 表示 - 显示 - display - 顯示 - - - 출력하지 않음 - not display - 非表示 - 不显示 - not display - 隱藏 - - -======= 서명 표시 서명 표시 From d807512acaadb4f3a62822ba720a643301e09621 Mon Sep 17 00:00:00 2001 From: zero Date: Fri, 20 Mar 2009 01:07:42 +0000 Subject: [PATCH 055/202] =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=9C=84=EC=A0=AF=20=EC=88=98=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EA=B0=9C=EC=84=A0.=201.=20?= =?UTF-8?q?=EC=83=88=EB=A1=9C=20=EC=B6=94=EA=B0=80=EB=90=9C=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=8B=9C=20=EC=9C=84=EC=A0=AF=EC=9D=98=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=EC=97=AC=EB=B0=B1=EC=9D=84=20=EB=91=98=EB=95=8C=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20=EC=9E=90=EC=B2=B4=EC=97=90=20=EC=97=AC=EB=B0=B1?= =?UTF-8?q?=EC=9D=B4=20=EC=A0=84=EC=9A=A9=EB=90=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=EA=B0=80=20=EC=9E=88=EC=96=B4=EC=84=9C=20=EB=A7=A4?= =?UTF-8?q?=EB=B2=88=20=EC=84=9C=EB=B2=84=EC=97=90=EC=84=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EA=B0=B1=EC=8B=A0=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD.=202.=20=EC=9C=84=EC=A0=AF?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC/=20=EC=9C=84=EC=A0=AF=EC=9D=98=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=AC=EC=85=8B=EB=93=B1=EC=9D=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20IE=EC=99=80?= =?UTF-8?q?=20=EB=B9=84IE=20=EB=AA=A8=EB=91=90=20=EC=9E=98=20=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5919 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/js/widget.js | 36 +++++++++++++++++++++------ modules/widget/tpl/js/widget_admin.js | 2 +- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 9f0d14e22..9eaa9ce59 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -177,7 +177,7 @@ function getWidgetCode(childObj, widget) { var name = childObj.attributes[i].nodeName.toLowerCase(); if(name == "contenteditable" || name == "id" || name=="style" || name=="src" || name=="widget" || name == "body" || name == "class" || name == "widget_width" || name == "widget_width_type" || name == "xdpx" || name == "xdpy" || name == "height") continue; var value = childObj.attributes[i].nodeValue; - if(!value) continue; + if(!value || value == "Array") continue; attrs += name+'="'+escape(value)+'" '; } @@ -362,14 +362,22 @@ function doAddWidgetCode(widget_code) { tmp = tmp.substr(pos); var eos = tmp.indexOf("-->"); var cssfile = tmp.substr(9,eos-9); + if(cssfile.indexOf('.js')>-1) { + tmp = tmp.substr(eos); + continue; + } if(!cssfile) break; tmp = tmp.substr(eos); var cssfile = request_uri+'/'+cssfile; - var css =''; - var dummy = xCreateElement("DIV"); - xInnerHtml(dummy , css); - document.body.appendChild(dummy); + if(typeof(document.createStyleSheet)=='undefined') { + var css =''; + var dummy = xCreateElement("DIV"); + xInnerHtml(dummy , css); + document.body.appendChild(dummy); + } else { + document.createStyleSheet(cssfile,0); + } } // widget 코드에서 javascript 부분을 빼서 eval후 결과값을 대체함 @@ -815,10 +823,24 @@ function doApplyWidgetSize(fo_obj) { borderObj = borderObj.nextSibling; } + selectedWidget = selectedSizeWidget; selectedSizeWidget = null; - doFitBorderSize(); - } + var widget = selectedWidget.getAttribute("widget"); + var params = new Array(); + for(var i=0;i Date: Fri, 20 Mar 2009 08:54:54 +0000 Subject: [PATCH 056/202] =?UTF-8?q?1.=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=91=EC=86=8D=EC=9E=90=20=EC=9C=84=EC=A0=AF=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=ED=81=B4=EB=A6=AD=EC=8B=9C=20#=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=EC=9C=BC=EB=A1=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=EC=97=85=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=202.=20=EB=AC=B8=EC=84=9C=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=84=A4=EC=A0=95=EC=9D=98=20=ED=9C=B4=EC=A7=80?= =?UTF-8?q?=ED=86=B5=20TAB=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=ED=83=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95=203.=20=EC=9D=B5=EB=AA=85=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5921 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/board.admin.controller.php | 1 + modules/board/board.controller.php | 41 +++++++++++++++++-- modules/board/lang/en.lang.php | 2 + modules/board/lang/es.lang.php | 2 + modules/board/lang/fr.lang.php | 2 + modules/board/lang/jp.lang.php | 2 + modules/board/lang/ko.lang.php | 2 + modules/board/lang/ru.lang.php | 2 + modules/board/lang/zh-CN.lang.php | 2 + modules/board/lang/zh-TW.lang.php | 2 + modules/board/tpl/board_insert.html | 7 ++++ modules/board/tpl/filter/insert_board.xml | 1 + modules/comment/comment.item.php | 2 +- modules/comment/queries/updateComment.xml | 2 + modules/document/document.item.php | 2 +- modules/document/queries/updateDocument.xml | 3 +- modules/document/tpl/header.html | 2 +- .../logged_members/skins/default/list.html | 2 +- 18 files changed, 71 insertions(+), 8 deletions(-) diff --git a/modules/board/board.admin.controller.php b/modules/board/board.admin.controller.php index 8db783ae1..05d0b7c88 100644 --- a/modules/board/board.admin.controller.php +++ b/modules/board/board.admin.controller.php @@ -30,6 +30,7 @@ // 기본 값외의 것들을 정리 if($args->use_category!='Y') $args->use_category = 'N'; if($args->except_notice!='Y') $args->except_notice = 'N'; + if($args->use_anonymous!='Y') $args->use_anonymous= 'N'; if($args->consultation!='Y') $args->consultation = 'N'; if(!in_array($args->order_target,$this->order_target)) $args->order_target = 'list_order'; if(!in_array($args->order_type,array('asc','desc'))) $args->order_type = 'asc'; diff --git a/modules/board/board.controller.php b/modules/board/board.controller.php index ff5bf9e8b..2337121ff 100644 --- a/modules/board/board.controller.php +++ b/modules/board/board.controller.php @@ -45,6 +45,12 @@ // 이미 존재하는 글인지 체크 $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + // 익명 설정일 경우 여러가지 요소를 미리 제거 (알림용 정보들 제거) + if($this->module_info->use_anonymous == 'Y') { + $obj->notify_message = 'N'; + $this->module_info->admin_mail = ''; + } + // 이미 존재하는 경우 수정 if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { $output = $oDocumentController->updateDocument($oDocument, $obj); @@ -76,6 +82,18 @@ // 오류 발생시 멈춤 if(!$output->toBool()) return $output; + // 익명 사용시 글의 글쓴이 정보를 모두 제거 + if($this->module_info->use_anonymous == 'Y' && Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $oDocument = $oDocumentModel->getDocument($output->get('document_srl')); + $obj = $oDocument->getObjectVars(); + $obj->member_srl = -1*$logged_info->member_srl; + $obj->email_address = $obj->homepage = $obj->user_id = ''; + $obj->user_name = $obj->nick_name = 'anonymous'; + $output = executeQuery('document.updateDocument', $obj); + if(!$output->toBool()) return $output; + } + // 결과를 리턴 $this->add('mid', Context::get('mid')); $this->add('document_srl', $output->get('document_srl')); @@ -134,6 +152,12 @@ $oDocument = $oDocumentModel->getDocument($obj->document_srl); if(!$oDocument->isExists()) return new Object(-1,'msg_not_permitted'); + // 익명 설정일 경우 여러가지 요소를 미리 제거 (알림용 정보들 제거) + if($this->module_info->use_anonymous == 'Y') { + $obj->notify_message = 'N'; + $this->module_info->admin_mail = ''; + } + // comment 모듈의 model 객체 생성 $oCommentModel = &getModel('comment'); @@ -141,8 +165,8 @@ $oCommentController = &getController('comment'); // comment_srl이 존재하는지 체크 - // 만일 comment_srl이 n/a라면 getNextSequence()로 값을 얻어온다. - if(!$obj->comment_srl) { + // 만일 comment_srl이 n/a라면 getNextSequence()로 값을 얻어온다. + if(!$obj->comment_srl) { $obj->comment_srl = getNextSequence(); } else { $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager); @@ -185,9 +209,20 @@ $output = $oCommentController->updateComment($obj, $this->grant->manager); $comment_srl = $obj->comment_srl; } - if(!$output->toBool()) return $output; + // 익명 사용시 글의 글쓴이 정보를 모두 제거 + if($this->module_info->use_anonymous == 'Y' && Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $comment = $oCommentModel->getComment($output->get('comment_srl'), $this->grant->manager); + $obj = $comment->getObjectVars(); + $obj->member_srl = -1*$logged_info->member_srl; + $obj->email_address = $obj->homepage = $obj->user_id = ''; + $obj->user_name = $obj->nick_name = 'anonymous'; + $output = executeQuery('comment.updateComment', $obj); + if(!$output->toBool()) return $output; + } + $this->setMessage('success_registed'); $this->add('mid', Context::get('mid')); $this->add('document_srl', $obj->document_srl); diff --git a/modules/board/lang/en.lang.php b/modules/board/lang/en.lang.php index a6ae29727..d812bbaac 100644 --- a/modules/board/lang/en.lang.php +++ b/modules/board/lang/en.lang.php @@ -8,6 +8,7 @@ $lang->board = 'Board'; $lang->except_notice = 'Exclude Notices'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = 'Manage Menus'; $lang->list_target_item = 'Target Item'; @@ -30,6 +31,7 @@ $lang->about_layout_setup = 'You can manually modify board layout code. Insert or manage the widget code anywhere you want'; $lang->about_board_category = 'You can make board categories.
When board category is broken, try rebuilding the cache file manually.'; $lang->about_except_notice = 'Notice articles will not be displayed on normal list.'; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = 'This module is for creating and managing boards.'; $lang->about_consultation = "Non-administrator members would see their own articles.\nNon-members would not be able to write articles when using consultation."; $lang->about_secret = 'Users will be able to write secret articles or comments.'; diff --git a/modules/board/lang/es.lang.php b/modules/board/lang/es.lang.php index 725177ecd..d6b7a0bc6 100644 --- a/modules/board/lang/es.lang.php +++ b/modules/board/lang/es.lang.php @@ -8,6 +8,7 @@ $lang->board = 'Tablero'; $lang->except_notice = 'Excluir Avisos'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = 'Manejo del menú'; $lang->list_target_item = 'Target Item'; $lang->list_display_item = 'Display Item'; @@ -32,6 +33,7 @@ $lang->about_layout_setup = 'Puede modificar manualmente el código del diseño de tableros. Insertar o modificar el código de widget.'; $lang->about_board_category = 'Puede crear las categorias de tableros.
Cuando no funciona la categoría de tableros, rehacer el archivo caché manualmente para solucionar.'; $lang->about_except_notice = 'Aviso de los artículos no se mostrará en la lista normal.'; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = 'Este módulo es para crear y manejar los tableros.'; $lang->about_consultation = "No administrador de los miembros que consideran que su propia artocles. \ NNon miembros no serían capaces de escribir artículos al utilizar la consulta."; $lang->about_secret = '게시판 및 댓글의 비밀글 사용할 수 있도록 합니다.'; diff --git a/modules/board/lang/fr.lang.php b/modules/board/lang/fr.lang.php index d6138d6a9..2546ed983 100644 --- a/modules/board/lang/fr.lang.php +++ b/modules/board/lang/fr.lang.php @@ -8,6 +8,7 @@ $lang->board = 'Panneau'; $lang->except_notice = 'Exclure des Notices'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = 'Administration de Menu'; $lang->list_target_item = 'Target Item'; @@ -29,6 +30,7 @@ $lang->about_layout_setup = 'Vous pouvez manuellement modifier le code de Mise en Page du blogue. Insérez ou administrez le code de Gadget n\'importe où vous voulez.'; $lang->about_board_category = 'Vous pouvez créer des catégories de Panneau d\'Affichage. Quand la catégorie d\'affichage est cassé, essayez manuellement rétablir l\'antémémoire du fichier.'; $lang->about_except_notice = "Le titre de Notice dont l'article se représentera toujours en tête de la liste ne sera exposé sur la liste générale."; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = 'Ce module se sert à créer et à administrer des Panneaux d\'Affichage.'; $lang->about_consultation = "Les membres non-administratifs verront seulement les ariticles d\'eux-même.\nNon-membres ne pourraient pas écrire des articles quand la Consultation est appliqué."; $lang->about_secret = '게시판 및 댓글의 비밀글 사용할 수 있도록 합니다.'; diff --git a/modules/board/lang/jp.lang.php b/modules/board/lang/jp.lang.php index d18a7db7d..3476a7476 100644 --- a/modules/board/lang/jp.lang.php +++ b/modules/board/lang/jp.lang.php @@ -8,6 +8,7 @@ $lang->board = '掲示板'; $lang->except_notice = 'お知らせの非表示機能'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = 'メニュー管理'; $lang->list_target_item = 'Target Item'; @@ -32,6 +33,7 @@ $lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。'; $lang->about_board_category = 'ブログのカテゴリを作成します。
ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。'; $lang->about_except_notice = "リストの上段に常に表示されるお知らせの書き込みを一般リストからお知らせの書き込みが表示されないようにします。"; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = '掲示板の生成、および管理する掲示板モジュールです。'; $lang->about_consultation = "相談機能とは、管理権限のない会員に本人の書き込みだけを表示する機能です。\n但し、相談機能を使用する際は、非会員の書き込みは自動的に禁止されます。"; $lang->about_secret = '掲示板およびコメントの秘密文を登録できるようにします。'; diff --git a/modules/board/lang/ko.lang.php b/modules/board/lang/ko.lang.php index 2c86f93f4..84c22aafe 100644 --- a/modules/board/lang/ko.lang.php +++ b/modules/board/lang/ko.lang.php @@ -7,6 +7,7 @@ $lang->board = '게시판'; $lang->except_notice = '공지사항 제외'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = '메뉴관리'; $lang->list_target_item = '대상 항목'; $lang->list_display_item = '표시 항목'; @@ -29,6 +30,7 @@ $lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요'; $lang->about_board_category = '분류를 만드실 수 있습니다.
분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.'; $lang->about_except_notice = '목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.'; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = '게시판을 생성하고 관리할 수 있는 게시판 모듈입니다.'; $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; $lang->about_secret = '게시판 및 댓글의 비밀글 사용할 수 있도록 합니다.'; diff --git a/modules/board/lang/ru.lang.php b/modules/board/lang/ru.lang.php index 47e902789..1e4f0a18b 100644 --- a/modules/board/lang/ru.lang.php +++ b/modules/board/lang/ru.lang.php @@ -8,6 +8,7 @@ $lang->board = 'Форум'; $lang->except_notice = '공지사항 제외'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = 'Управление меню'; $lang->list_target_item = 'Target Item'; @@ -35,6 +36,7 @@ $lang->about_layout_setup = 'Вы можете вручную изменять лейаут код блога. Вставляйте или управляйте кодом виджетов везде, где хотите'; $lang->about_board_category = 'Вы можете сделать категории блога.
Когда категория блога испорчена, попробуйте перепостроить файл кеша вручную.'; $lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다."; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = 'Этот модуль служит для создания и управления форумами.'; $lang->about_consultation = "상담 기능은 관리권한이 없는 회원은 자신이 쓴 글만 보이도록 하는 기능입니다\n단 상담기능 사용시 비회원 글쓰기는 자동으로 금지됩니다."; $lang->about_secret = '게시판 및 댓글의 비밀글 사용할 수 있도록 합니다.'; diff --git a/modules/board/lang/zh-CN.lang.php b/modules/board/lang/zh-CN.lang.php index 7b9804ca5..3b0ad8f5d 100644 --- a/modules/board/lang/zh-CN.lang.php +++ b/modules/board/lang/zh-CN.lang.php @@ -7,6 +7,7 @@ $lang->board = "版面"; $lang->except_notice = "公告选项"; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = '菜单管理'; $lang->list_target_item = '备选项'; $lang->list_display_item = '显示项'; @@ -29,6 +30,7 @@ $lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。'; $lang->about_board_category = '可以添加/删除分类项
分类有异常情况时,可以尝试重新生成缓冲文件。'; $lang->about_except_notice = "设置公告目录项不再重复显示到普通目录当中。"; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = "可生成及管理版面的模块。"; $lang->about_consultation = "咨询功能是指除有管理权限的会员以外,其他会员只能浏览自己发表的主题。\n使用咨询功能时系统将自动禁止非会员的发表主题权限。"; $lang->about_secret = '设置主题及评论当中使用密帖与否。'; diff --git a/modules/board/lang/zh-TW.lang.php b/modules/board/lang/zh-TW.lang.php index fc0968c66..5def06ad7 100644 --- a/modules/board/lang/zh-TW.lang.php +++ b/modules/board/lang/zh-TW.lang.php @@ -7,6 +7,7 @@ $lang->board = '討論板'; $lang->except_notice = '公告選項'; + $lang->use_anonymous = '익명 사용'; $lang->cmd_manage_menu = '選單管理'; $lang->list_target_item = '目標項目'; $lang->list_display_item = '顯示項目'; @@ -29,6 +30,7 @@ $lang->about_layout_setup = '可直接編輯部落格版面設計原始碼。可把控件原始碼插入到您喜歡的位置。'; $lang->about_board_category = '可以新增/刪除分類項目
分類有異常情況時,可以嘗試重新建立暫存檔。'; $lang->about_except_notice = '設置公告列表項目,不再重複顯示到普通列表當中。'; + $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = '可建立及管理討論板的模組。'; $lang->about_consultation = "咨詢功能是指除有管理權限的會員以外,其他會員只能瀏覽自己發表的主題。\n使用咨詢功能時系統將自動禁止非會員的發表主題權限。"; $lang->about_secret = '可用於討論板或回覆時選擇是否使用。'; diff --git a/modules/board/tpl/board_insert.html b/modules/board/tpl/board_insert.html index 5e14e6a62..38c44b53f 100644 --- a/modules/board/tpl/board_insert.html +++ b/modules/board/tpl/board_insert.html @@ -127,6 +127,13 @@

{$lang->about_except_notice}

+ +
{$lang->use_anonymous}
+ + use_anonymous=='Y')-->checked="checked" /> +

{$lang->about_use_anonymous}

+ +
{$lang->consultation}
diff --git a/modules/board/tpl/filter/insert_board.xml b/modules/board/tpl/filter/insert_board.xml index 5de11e7a8..ec4b0e5c2 100644 --- a/modules/board/tpl/filter/insert_board.xml +++ b/modules/board/tpl/filter/insert_board.xml @@ -19,6 +19,7 @@ + diff --git a/modules/comment/comment.item.php b/modules/comment/comment.item.php index 111e4c165..d15907d2e 100644 --- a/modules/comment/comment.item.php +++ b/modules/comment/comment.item.php @@ -53,7 +53,7 @@ if($logged_info->is_admin == 'Y') return true; - if($this->get('member_srl') && $this->get('member_srl') == $logged_info->member_srl) return true; + if($this->get('member_srl') && ($this->get('member_srl') == $logged_info->member_srl || $this->get('member_srl')*-1 == $logged_info->member_srl)) return true; return false; } diff --git a/modules/comment/queries/updateComment.xml b/modules/comment/queries/updateComment.xml index 505afd1db..e2773d697 100644 --- a/modules/comment/queries/updateComment.xml +++ b/modules/comment/queries/updateComment.xml @@ -4,11 +4,13 @@ + + diff --git a/modules/document/document.item.php b/modules/document/document.item.php index e27afcb81..28b584b4e 100644 --- a/modules/document/document.item.php +++ b/modules/document/document.item.php @@ -67,7 +67,7 @@ if($logged_info->is_admin == 'Y') return true; - if($this->get('member_srl') && $this->get('member_srl') == $logged_info->member_srl) return true; + if($this->get('member_srl') && ($this->get('member_srl') == $logged_info->member_srl || $this->get('member_srl')*-1 == $logged_info->member_srl)) return true; return false; } diff --git a/modules/document/queries/updateDocument.xml b/modules/document/queries/updateDocument.xml index 02d0153f3..3c51dc935 100644 --- a/modules/document/queries/updateDocument.xml +++ b/modules/document/queries/updateDocument.xml @@ -14,7 +14,8 @@ - + + diff --git a/modules/document/tpl/header.html b/modules/document/tpl/header.html index 4744f8657..d93706b4a 100644 --- a/modules/document/tpl/header.html +++ b/modules/document/tpl/header.html @@ -7,6 +7,6 @@
  • class="on">{$lang->document_list}
  • class="on">{$lang->cmd_module_config}
  • class="on">{$lang->cmd_declared_list}
  • -
  • class="on"{$lang->cmd_trash}
  • +
  • class="on">{$lang->cmd_trash}
  • diff --git a/widgets/logged_members/skins/default/list.html b/widgets/logged_members/skins/default/list.html index f2a4f9ac5..63c488d64 100644 --- a/widgets/logged_members/skins/default/list.html +++ b/widgets/logged_members/skins/default/list.html @@ -5,7 +5,7 @@ From 4e2b78b6c470e5b74ffe066839a868a8f8b27730 Mon Sep 17 00:00:00 2001 From: cbrghost Date: Fri, 20 Mar 2009 09:17:12 +0000 Subject: [PATCH 057/202] =?UTF-8?q?=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=EC=97=90=20eid=20=EC=BB=AC=EB=9F=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=201.=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80/=EC=88=98=EC=A0=95=20=EC=8B=9C=20?= =?UTF-8?q?=EB=8C=80=EC=83=81=20=EB=AA=A8=EB=93=88=20=EC=A4=91=20=EC=9C=A0?= =?UTF-8?q?=EC=9D=BC=ED=95=9C=20eid=20=EB=A1=9C=20=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=B6=94=EA=B0=80=202.=EB=8B=A4=EA=B5=AD?= =?UTF-8?q?=EC=96=B4=20=EA=B2=8C=EC=8B=9C=EA=B8=80=EC=9D=B4=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=20=EC=8B=9C=20=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=EC=9D=B4=EB=8F=99=20=EC=95=88=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=203.=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80/=EC=83=9D=EC=84=B1/=EC=82=AD=EC=A0=9C/?= =?UTF-8?q?=EC=88=98=EC=A0=95/=EC=B6=9C=EB=A0=A5=EC=97=90=20eid=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EC=97=90=20=EB=8C=80=ED=95=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5922 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/extravar/Extravar.class.php | 6 ++- common/lang/ko.lang.php | 1 + .../document/document.admin.controller.php | 18 +++++++-- modules/document/document.class.php | 37 +++++++++++++++++++ modules/document/document.controller.php | 37 +++++++++++++++---- modules/document/document.model.php | 6 +-- .../document/queries/getDocumentExtraKeys.xml | 1 + .../document/queries/getDocumentExtraVars.xml | 2 + .../queries/getDocumentsExtraVars.xml | 1 + .../document/queries/getGroupsExtraKeys.xml | 23 ++++++++++++ .../document/queries/getGroupsExtraVars.xml | 23 ++++++++++++ .../queries/insertDocumentExtraKey.xml | 1 + .../queries/insertDocumentExtraVar.xml | 1 + modules/document/queries/isExistsExtraKey.xml | 13 +++++++ .../queries/updateDocumentExtraKey.xml | 1 + .../queries/updateDocumentExtraVar.xml | 1 + .../document/schemas/document_extra_keys.xml | 1 + .../document/schemas/document_extra_vars.xml | 1 + modules/document/tpl/extra_keys.html | 8 ++++ .../document/tpl/filter/insert_extra_var.xml | 1 + modules/module/lang/ko.lang.php | 5 ++- 21 files changed, 171 insertions(+), 17 deletions(-) create mode 100644 modules/document/queries/getGroupsExtraKeys.xml create mode 100644 modules/document/queries/getGroupsExtraVars.xml create mode 100644 modules/document/queries/isExistsExtraKey.xml diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index b29f40b17..6178c9a4c 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -45,7 +45,7 @@ if(!is_array($GLOBALS['XE_EXTRAVARS'][$this->module_srl])) $GLOBALS['XE_EXTRAVARS'][$this->module_srl] = array(); foreach($extra_keys as $key => $val) { $obj = null; - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value); + $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); $GLOBALS['XE_EXTRAVARS'][$this->module_srl][$val->idx] = $obj; } } @@ -76,11 +76,12 @@ var $is_required = 'N'; var $search = 'N'; var $value = null; + var $eid = ''; /** * @brief constructor **/ - function ExtraItem($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null) { + function ExtraItem($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '') { if(!$idx) return; $this->module_srl = $module_srl; $this->idx = $idx; @@ -91,6 +92,7 @@ $this->is_required = $is_required; $this->search = $search; $this->value = $value; + $this->eid = $eid; } /** diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index e810d8c56..2a2735ade 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -269,6 +269,7 @@ $lang->default_value = '기본 값'; $lang->is_active = '활성'; $lang->is_required = '필수항목'; + $lang->eid = '확장변수 이름'; // ftp 관련 $lang->ftp_form_title = 'FTP 정보 입력'; diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index c1ada3a9a..4bf6f5356 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -337,8 +337,9 @@ $default = Context::get('default'); $desc = Context::get('desc'); $search = Context::get('search'); + $eid = Context::get('eid'); - if(!$module_srl || !$name) return new Object(-1,'msg_invalid_request'); + if(!$module_srl || !$name || !$eid) return new Object(-1,'msg_invalid_request'); // idx가 지정되어 있지 않으면 최고 값을 지정 if(!$var_idx) { @@ -347,9 +348,18 @@ $var_idx = $output->data->var_idx+1; } + // 이미 존재하는 모듈 이름인지 체크 + $obj->module_srl = $module_srl; + $obj->var_idx = $var_idx; + $obj->eid = $eid; + $output = executeQuery('document.isExistsExtraKey', $obj); + if(!$output->toBool() || $output->data->count) { + return new Object(-1, 'msg_extra_name_exists'); + } + // insert or update $oDocumentController = &getController('document'); - $output = $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $name, $type, $is_required, $search, $default, $desc); + $output = $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $name, $type, $is_required, $search, $default, $desc, $eid); if(!$output->toBool()) return $output; $this->setMessage('success_registed'); @@ -574,7 +584,7 @@ } else { $args->module_srl = $module_srl; $args->var_idx = $new_idx; - $args->new_idx = -1; + $args->new_idx = -10000; $output = executeQuery('document.updateDocumentExtraKeyIdx', $args); if(!$output->toBool()) return $output; $output = executeQuery('document.updateDocumentExtraVarIdx', $args); @@ -587,7 +597,7 @@ $output = executeQuery('document.updateDocumentExtraVarIdx', $args); if(!$output->toBool()) return $output; - $args->var_idx = -1; + $args->var_idx = -10000; $args->new_idx = $var_idx; $output = executeQuery('document.updateDocumentExtraKeyIdx', $args); if(!$output->toBool()) return $output; diff --git a/modules/document/document.class.php b/modules/document/document.class.php index b4d8441c9..7683414a5 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -99,6 +99,12 @@ // 2009. 03. 11 확장변수 값 테이블의 인덱스 점검 if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) return true; + /** + * 2009. 03. 19 : 확장변수 값 테이블에 eid가 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("document_extra_keys","eid")) return true; + if(!$oDB->isColumnExists("document_extra_vars","eid")) return true; + return false; } @@ -200,6 +206,37 @@ $oDB->dropIndex("document_extra_vars", "unique_module_vars", true); } + /** + * 2009. 03. 19 : 확장변수 값 테이블에 eid 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("document_extra_keys","eid")) { + $oDB->addColumn("document_extra_keys","eid","varchar",40); + + $output = executeQuery('document.getGroupsExtraKeys', $obj); + if($output->toBool() && $output->data && count($output->data)) { + foreach($output->data as $extra_keys) { + $args = $extra_keys; + $args->var_idx = $extra_keys->idx; + $args->eid = "extra_vars".$extra_keys->idx; + $output = executeQuery('document.updateDocumentExtraKey', $args); + } + } + } + + if(!$oDB->isColumnExists("document_extra_vars","eid")) { + $oDB->addColumn("document_extra_vars","eid","varchar",40); + $obj->var_idx = '-1,-2'; + $output = executeQuery('document.getGroupsExtraVars', $obj); + if($output->toBool() && $output->data && count($output->data)) { + foreach($output->data as $extra_vars) { + $args = $extra_vars; + $args->var_idx = $extra_vars->idx; + $args->eid = "extra_vars".$extra_vars->idx; + $output = executeQuery('document.updateDocumentExtraVar', $args); + } + } + } + return new Object(0,'success_updated'); } diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 8f1258fe3..84e7185f0 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -209,7 +209,7 @@ if(isset($obj->{'extra_vars'.$idx})) $value = trim($obj->{'extra_vars'.$idx}); elseif(isset($obj->{$extra_item->name})) $value = trim($obj->{$extra_item->name}); if(!isset($value)) continue; - $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value); + $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid); } } @@ -358,7 +358,7 @@ if(isset($obj->{'extra_vars'.$idx})) $value = trim($obj->{'extra_vars'.$idx}); elseif(isset($obj->{$extra_item->name})) $value = trim($obj->{$extra_item->name}); if(!isset($value)) continue; - $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value); + $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, $idx, $value, $extra_item->eid); } } @@ -566,8 +566,8 @@ /** * @breif documents 테이블의 확장 변수 등록 **/ - function insertDocumentExtraKey($module_srl, $var_idx, $var_name, $var_type, $var_is_required = 'N', $var_search = 'N', $var_default = '', $var_desc = '') { - if(!$module_srl || !$var_idx || !$var_name || !$var_type) return new Object(-1,'msg_invalid_request'); + function insertDocumentExtraKey($module_srl, $var_idx, $var_name, $var_type, $var_is_required = 'N', $var_search = 'N', $var_default = '', $var_desc = '', $eid) { + if(!$module_srl || !$var_idx || !$var_name || !$var_type || !$eid) return new Object(-1,'msg_invalid_request'); $obj->module_srl = $module_srl; $obj->var_idx = $var_idx; @@ -577,6 +577,27 @@ $obj->var_search = $var_search=='Y'?'Y':'N'; $obj->var_default = $var_default; $obj->var_desc = $var_desc; + $obj->eid = $eid; + + $output = executeQuery('document.getDocumentExtraKeys', $obj); + if(!$output->data) return executeQuery('document.insertDocumentExtraKey', $obj); + $output = executeQuery('document.updateDocumentExtraKey', $obj); + + // extra_vars에서 확장 변수 eid를 일괄 업데이트 + $output = executeQuery('document.updateDocumentExtraVar', $obj); + + return $output; + } + + /** + * @breif documents 테이블의 확장 변수 등록 + **/ + function updateDocumentExtraKey($module_srl, $var_idx, $eid) { + if(!$module_srl || !$var_idx || !$eid) return new Object(-1,'msg_invalid_request'); + + $obj->module_srl = $module_srl; + $obj->var_idx = $var_idx; + $obj->eid = $eid; $output = executeQuery('document.getDocumentExtraKeys', $obj); if(!$output->data) return executeQuery('document.insertDocumentExtraKey', $obj); @@ -600,7 +621,7 @@ /** * @breif documents 테이블의 확장 변수 값 등록 **/ - function insertDocumentExtraVar($module_srl, $document_srl, $var_idx, $value, $lang_code = '') { + function insertDocumentExtraVar($module_srl, $document_srl, $var_idx, $value, $eid = null, $lang_code = '') { if(!$module_srl || !$document_srl || !$var_idx || !isset($value)) return new Object(-1,'msg_invalid_request'); if(!$lang_code) $lang_code = Context::getLangType(); @@ -608,7 +629,8 @@ $obj->document_srl = $document_srl; $obj->var_idx = $var_idx; $obj->value = $value; - $obj->lang_code = $lang_code ; + $obj->lang_code = $lang_code; + $obj->eid = $eid; executeQuery('document.insertDocumentExtraVar', $obj); } @@ -616,11 +638,12 @@ /** * @brief documents 확장변수 값 제거 **/ - function deleteDocumentExtraVars($module_srl, $document_srl = null, $var_idx = null, $lang_code = null) { + function deleteDocumentExtraVars($module_srl, $document_srl = null, $var_idx = null, $lang_code = null, $eid = null) { $obj->module_srl = $module_srl; if(!is_null($document_srl)) $obj->document_srl = $document_srl; if(!is_null($var_idx)) $obj->var_idx = $var_idx; if(!is_null($lang_code)) $obj->lang_code = $lang_code; + if(!is_null($eid)) $obj->lang_code = $eid; $output = executeQuery('document.deleteDocumentExtraVars', $obj); return $output; } diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 147f032ba..8797adf01 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -53,13 +53,13 @@ else if($val->idx == -2) $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl]->add('content', $val->value); } elseif($val->idx>0) { if($lang_code == $val->lang_code) { - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value); + $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); $GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx] = $obj; } else if($lang_code == $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl]->lang_code && !isset($GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx])) { - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value); + $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); $GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx] = $obj; } else if(!isset($GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx])) { - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value); + $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); $GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx] = $obj; } } diff --git a/modules/document/queries/getDocumentExtraKeys.xml b/modules/document/queries/getDocumentExtraKeys.xml index cea78b74b..bd0ad59cb 100644 --- a/modules/document/queries/getDocumentExtraKeys.xml +++ b/modules/document/queries/getDocumentExtraKeys.xml @@ -11,6 +11,7 @@ + diff --git a/modules/document/queries/getDocumentExtraVars.xml b/modules/document/queries/getDocumentExtraVars.xml index 58fd59136..180fa8928 100644 --- a/modules/document/queries/getDocumentExtraVars.xml +++ b/modules/document/queries/getDocumentExtraVars.xml @@ -20,6 +20,7 @@ + @@ -27,6 +28,7 @@ + diff --git a/modules/document/queries/getDocumentsExtraVars.xml b/modules/document/queries/getDocumentsExtraVars.xml index 5fd98a335..73e5db94c 100644 --- a/modules/document/queries/getDocumentsExtraVars.xml +++ b/modules/document/queries/getDocumentsExtraVars.xml @@ -20,6 +20,7 @@ + diff --git a/modules/document/queries/getGroupsExtraKeys.xml b/modules/document/queries/getGroupsExtraKeys.xml new file mode 100644 index 000000000..cd38d4a34 --- /dev/null +++ b/modules/document/queries/getGroupsExtraKeys.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/getGroupsExtraVars.xml b/modules/document/queries/getGroupsExtraVars.xml new file mode 100644 index 000000000..574ee18bb --- /dev/null +++ b/modules/document/queries/getGroupsExtraVars.xml @@ -0,0 +1,23 @@ + + +
    + + + + + + + + + + + + + + + + + + + + diff --git a/modules/document/queries/insertDocumentExtraKey.xml b/modules/document/queries/insertDocumentExtraKey.xml index 0103e7f2f..8bf33a63f 100644 --- a/modules/document/queries/insertDocumentExtraKey.xml +++ b/modules/document/queries/insertDocumentExtraKey.xml @@ -11,5 +11,6 @@ + diff --git a/modules/document/queries/insertDocumentExtraVar.xml b/modules/document/queries/insertDocumentExtraVar.xml index 32528617b..cef45f439 100644 --- a/modules/document/queries/insertDocumentExtraVar.xml +++ b/modules/document/queries/insertDocumentExtraVar.xml @@ -8,5 +8,6 @@ + diff --git a/modules/document/queries/isExistsExtraKey.xml b/modules/document/queries/isExistsExtraKey.xml new file mode 100644 index 000000000..8aeac3325 --- /dev/null +++ b/modules/document/queries/isExistsExtraKey.xml @@ -0,0 +1,13 @@ + + +
    + + + + + + + + + + diff --git a/modules/document/queries/updateDocumentExtraKey.xml b/modules/document/queries/updateDocumentExtraKey.xml index af0fb57d2..07966b4fd 100644 --- a/modules/document/queries/updateDocumentExtraKey.xml +++ b/modules/document/queries/updateDocumentExtraKey.xml @@ -9,6 +9,7 @@ + diff --git a/modules/document/queries/updateDocumentExtraVar.xml b/modules/document/queries/updateDocumentExtraVar.xml index 818b28147..52bdcb9bb 100644 --- a/modules/document/queries/updateDocumentExtraVar.xml +++ b/modules/document/queries/updateDocumentExtraVar.xml @@ -5,6 +5,7 @@ + diff --git a/modules/document/schemas/document_extra_keys.xml b/modules/document/schemas/document_extra_keys.xml index 96d1026c2..5334e1882 100644 --- a/modules/document/schemas/document_extra_keys.xml +++ b/modules/document/schemas/document_extra_keys.xml @@ -7,4 +7,5 @@ +
    diff --git a/modules/document/schemas/document_extra_vars.xml b/modules/document/schemas/document_extra_vars.xml index d7b2e0efd..36e3df05f 100644 --- a/modules/document/schemas/document_extra_vars.xml +++ b/modules/document/schemas/document_extra_vars.xml @@ -4,4 +4,5 @@ + diff --git a/modules/document/tpl/extra_keys.html b/modules/document/tpl/extra_keys.html index e92bf7508..74264265a 100644 --- a/modules/document/tpl/extra_keys.html +++ b/modules/document/tpl/extra_keys.html @@ -14,6 +14,12 @@

    {$lang->extra_vars} {$selected_var_idx}

    + + + + + @@ -79,6 +86,7 @@ + diff --git a/modules/document/tpl/filter/insert_extra_var.xml b/modules/document/tpl/filter/insert_extra_var.xml index 0b8e3d96d..e011d7386 100644 --- a/modules/document/tpl/filter/insert_extra_var.xml +++ b/modules/document/tpl/filter/insert_extra_var.xml @@ -2,6 +2,7 @@ + diff --git a/modules/module/lang/ko.lang.php b/modules/module/lang/ko.lang.php index 690a3b702..00988d124 100644 --- a/modules/module/lang/ko.lang.php +++ b/modules/module/lang/ko.lang.php @@ -64,6 +64,7 @@ $lang->msg_move_failed = '이동 실패하였습니다'; $lang->msg_cannot_delete_for_child = '하부 분류가 있는 분류는 삭제하실 수 없습니다'; $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = '브라우저의 제목에 나타나는 값입니다. RSS/Trackback에서도 사용됩니다.'; $lang->about_mid = '모듈이름은 http://주소/?mid=모듈이름 처럼 직접 호출할 수 있는 값입니다. ( 영문+[영문+숫자+_] 만 가능)'; @@ -83,7 +84,9 @@ $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; $lang->about_module = "XE는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다.\n모듈관리 모듈은 설치된 모든 모듈을 보여주고 관리를 도와줍니다."; $lang->about_extra_vars_default_value = '다중/단일 선택등 기본값이 여러개가 필요한 경우 , (콤마)로 연결하시면 됩니다'; - $lang->about_search_virtual_site = '가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)'; + $lang->about_search_virtual_site = '가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제 + 외)'; + $lang->about_extra_vars_eid_value = '확장변수에 이름을 적어주세요. ( 영문+[영문+숫자+_] 만 가능)'; $lang->about_langcode = '언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요'; $lang->about_file_extension= "%s 파일만 가능합니다."; ?> From be3bd12ae51ccb6674202d4fec49dc0028dc681c Mon Sep 17 00:00:00 2001 From: misol Date: Sat, 21 Mar 2009 06:41:18 +0000 Subject: [PATCH 058/202] =?UTF-8?q?#17862843=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20=EC=97=85=EB=A1=9C=EB=93=9C=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=EC=8B=9C=20=EB=AF=B8=EB=A6=AC=20=EB=A1=9C=EB=94=A9=20//=20?= =?UTF-8?q?=EB=A1=9C=EB=94=A9=EC=9D=B4=20=EC=99=84=EB=A3=8C=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=95=98=EC=9C=BC=EB=A9=B4,=20=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EC=84=B8=EB=A1=9C=20=ED=81=AC=EA=B8=B0=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=95=88=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5923 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/tpl/js/uploader.js | 44 +++++++++++++------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/modules/editor/tpl/js/uploader.js b/modules/editor/tpl/js/uploader.js index ffa23d387..fa0acc9f4 100755 --- a/modules/editor/tpl/js/uploader.js +++ b/modules/editor/tpl/js/uploader.js @@ -5,6 +5,7 @@ **/ var uploadedFiles = new Array(); var uploaderSettings = new Array(); +var loaded_images = new Array(); /** * 업로드를 하기 위한 준비 시작 @@ -258,15 +259,19 @@ function completeReloadFileList(ret_obj, response_tags, settings) { uploadedFiles[file_srl] = item[i]; var opt = new Option(item[i].source_filename+" ("+item[i].disp_file_size+")", file_srl, true, true); listObj.options[listObj.options.length] = opt; - previewFiles('', file_srl); + if(/\.(jpg|jpeg|png|gif)$/i.test(item[i].download_url)) { + var loadingImage = new Image(); + loadingImage.src = item[i].download_url; + loaded_images[file_srl] = loadingImage; + } } + previewFiles('', item[item.length-1].file_srl); } } //listObj.selectedIndex = listObj.options.length-1; xAddEventListener(listObj,'click',previewFiles); } -var img_loaded_check = Array(); function previewFiles(evt, given_file_srl) { if(!given_file_srl) { var e = new xEvent(evt); @@ -317,26 +322,6 @@ function previewFiles(evt, given_file_srl) { html = ""; } xInnerHtml(previewAreaID, html); - - // 이미지 파일중, 파일 목록 리로드시 불러오는 이미지는 미리 로드시킴, 로드시키는 이유는 이미지 가로/세로 크기를 얻기 위함. 로드 횟수는 4번을 초과하지 않게 (그 이상은 포기) - if(given_file_srl) { - if(/\.(jpg|jpeg|png|gif)$/i.test(uploaded_filename)) { - var uploaded_obj = new Image(); - uploaded_obj.src = uploaded_filename; - if(!uploaded_obj.width || !uploaded_obj.width) { - if(!img_loaded_check[given_file_srl]) { - img_loaded_check[given_file_srl] = 1; - } - else { - img_loaded_check[given_file_srl]++; - } - - if(img_loaded_check[given_file_srl] < 5) { - previewFiles('', given_file_srl); - } - } - } - } } function removeUploadedFile(editorSequence) { @@ -386,9 +371,18 @@ function insertUploadedFile(editorSequence) { if(file.direct_download == 'Y') { // 이미지 파일의 경우 image_link 컴포넌트 열결 if(/\.(jpg|jpeg|png|gif)$/i.test(file.download_url)) { - var obj = new Image(); - obj.src = file.download_url; - text.push("\""+file.source_filename+"\""); + if(loaded_images[file_srl]) { + var obj = loaded_images[file_srl]; + } + else { + var obj = new Image(); + obj.src = file.download_url; + } + temp_code = ''; + temp_code += "\""+file.source_filename+"\"";"); From f0208bb1877fce4680f6868b3e13e70f9f166f8b Mon Sep 17 00:00:00 2001 From: zero Date: Sun, 22 Mar 2009 01:45:36 +0000 Subject: [PATCH 059/202] =?UTF-8?q?=C3=84=C3=81=C3=85=C3=99=C3=83=C3=B7=20?= =?UTF-8?q?=C3=80=C2=A7=C3=81=C2=AC=C3=80=C3=87=20=C2=B0=C2=B6=C2=B7=C2=AF?= =?UTF-8?q?=C2=B8=C2=AE=C2=BF=C2=A1=C2=BC=C2=AD=20=C2=BA=C3=92=C3=87=C3=8A?= =?UTF-8?q?=C2=BF=C3=A4=C3=87=C3=91=20=C3=87=C3=8F=C2=B4=C3=9C=20=C2=BF?= =?UTF-8?q?=C2=A9=C2=B9=C3=A9=20=C3=81=C2=A6=C2=B0=C3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5924 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/cafeXE/css/widget.css | 2 +- modules/layout/tpl/css/widget.css | 2 +- widgets/content/skins/default/css/widget.css | 2 +- widgetstyles/round/css/widgetBoxStyle.css | 2 +- widgetstyles/round/widgetstyle.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/layouts/cafeXE/css/widget.css b/layouts/cafeXE/css/widget.css index 54e723c0c..a31eac229 100755 --- a/layouts/cafeXE/css/widget.css +++ b/layouts/cafeXE/css/widget.css @@ -98,7 +98,7 @@ dl.widgetDivider dd{ display:none; margin:0;} /* widgetGalleryA */ .widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1; _margin-right:-100%;} .widgetGalleryA:after{ content:""; display:block; clear:both;} -.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;} +.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:0; white-space:nowrap; list-style:none;} .widgetGalleryA li.clearRight{ margin-right:0;} .widgetGalleryA li .thumb{ display:block; position:relative; width:100px; height:75px; margin-bottom:10px; overflow:hidden; text-decoration:none;} .widgetGalleryA li .thumb img{ display:block; position:relative; width:100%;} diff --git a/modules/layout/tpl/css/widget.css b/modules/layout/tpl/css/widget.css index e0047b07c..688338131 100755 --- a/modules/layout/tpl/css/widget.css +++ b/modules/layout/tpl/css/widget.css @@ -98,7 +98,7 @@ dl.widgetDivider dd{ display:none; margin:0;} /* widgetGalleryA */ .widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1; _margin-right:-100%;} .widgetGalleryA:after{ content:""; display:block; clear:both;} -.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;} +.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:0; white-space:nowrap; list-style:none;} .widgetGalleryA li.clearRight{ margin-right:0;} .widgetGalleryA li .thumb{ display:block; position:relative; width:100px; height:75px; margin-bottom:10px; overflow:hidden; text-decoration:none;} .widgetGalleryA li .thumb img{ display:block; position:relative; width:100%;} diff --git a/widgets/content/skins/default/css/widget.css b/widgets/content/skins/default/css/widget.css index 449e25947..ba43c97a2 100644 --- a/widgets/content/skins/default/css/widget.css +++ b/widgets/content/skins/default/css/widget.css @@ -51,7 +51,7 @@ dl.widgetDivider dd{ display:none; margin:0;} .widgetGalleryA{ position:relative; margin:0; padding:0; font-size:12px; line-height:1.5; *zoom:1; _margin-right:-100%;} .widgetGalleryA:after{ content:""; display:block; clear:both;} -.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:15px; white-space:nowrap; list-style:none;} +.widgetGalleryA li { float:left; overflow:hidden; width:100px; margin-right:28px; margin-bottom:15px; padding-bottom:0; white-space:nowrap; list-style:none;} .widgetGalleryA li.clearRight{ margin-right:0;} .widgetGalleryA li .thumb{ display:block; position:relative; width:100px; height:75px; margin-bottom:10px; overflow:hidden; text-decoration:none;} .widgetGalleryA li .thumb img{ display:block; position:relative; width:100%;} diff --git a/widgetstyles/round/css/widgetBoxStyle.css b/widgetstyles/round/css/widgetBoxStyle.css index 41c265c0c..7824cf38d 100644 --- a/widgetstyles/round/css/widgetBoxStyle.css +++ b/widgetstyles/round/css/widgetBoxStyle.css @@ -105,4 +105,4 @@ .widgetBoxEblue .rcTop .tl{ background-position:0 0;} .widgetBoxEblue .rcTop .tr{ background-position:right 0; left:50%;} .widgetBoxEblue .rcBottom .bl{ background-position:0 bottom;} -.widgetBoxEblue .rcBottom .br{ background-position:right bottom; left:50%;} \ No newline at end of file +.widgetBoxEblue .rcBottom .br{ background-position:right bottom; left:50%;} diff --git a/widgetstyles/round/widgetstyle.html b/widgetstyles/round/widgetstyle.html index 9d46d9519..bd43df709 100644 --- a/widgetstyles/round/widgetstyle.html +++ b/widgetstyles/round/widgetstyle.html @@ -43,4 +43,4 @@ - \ No newline at end of file + From 781305f6e4ddc8e445a6a2c4d4dff668c8f6becd Mon Sep 17 00:00:00 2001 From: misol Date: Sun, 22 Mar 2009 13:21:54 +0000 Subject: [PATCH 060/202] =?UTF-8?q?=ED=94=BC=EB=93=9C=EC=97=90=EC=84=9C,?= =?UTF-8?q?=20=EB=AC=B8=EC=84=9C=EC=9D=98=20=EC=A0=9C=EB=AA=A9=EC=97=90=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=EC=9D=84=20=EB=84=A3=EC=9D=84=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0,=20HTML=ED=83=9C=EA=B7=B8=EA=B0=80=20=EC=82=BD?= =?UTF-8?q?=EC=9E=85=EB=90=98=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(=EC=86=8D=EC=84=B1=20=EC=95=8A=EB=84=A3=EB=8A=94=20ge?= =?UTF-8?q?tTitleText=20=EB=A1=9C=20=EB=B0=94=EA=BF=88)=20//=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EC=9D=98=20=ED=99=88=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80,=EB=B8=94=EB=A1=9C=EA=B7=B8=20=EC=A3=BC=EC=86=8C?= =?UTF-8?q?=EA=B0=80=20http://=EB=A1=9C=20=EC=8B=9C=EC=9E=91=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=84=20=EC=88=98=20=EC=9E=88=EC=9C=BC?= =?UTF-8?q?=EB=AF=80=EB=A1=9C,=20[a-z]+=20=EB=A1=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5925 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/comment/comment.controller.php | 4 ++-- modules/document/document.controller.php | 4 ++-- modules/member/member.controller.php | 8 ++++---- modules/rss/tpl/atom10.html | 2 +- modules/rss/tpl/rss10.html | 2 +- modules/rss/tpl/rss20.html | 2 +- modules/rss/tpl/xe_rss.html | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index 000bf8503..174e0022d 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -104,7 +104,7 @@ if($oDocument->isLocked()) return new Object(-1,'msg_invalid_request'); if($obj->password) $obj->password = md5($obj->password); - if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; // 로그인 된 회원일 경우 회원의 정보를 입력 if(Context::get('is_logged')) { @@ -269,7 +269,7 @@ if(!$is_admin && !$source_obj->isGranted()) return new Object(-1, 'msg_not_permitted'); if($obj->password) $obj->password = md5($obj->password); - if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; // 로그인 되어 있고 작성자와 수정자가 동일하면 수정자의 정보를 세팅 if(Context::get('is_logged')) { diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 84e7185f0..1b2233457 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -132,7 +132,7 @@ if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; - if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; if($obj->notify_message != 'Y') $obj->notify_message = 'N'; // $extra_vars를 serialize @@ -273,7 +273,7 @@ if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; - if($obj->homepage && !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; if($obj->notify_message != 'Y') $obj->notify_message = 'N'; // $extra_vars를 serialize diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 7065cc1b0..46e5d64b4 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1408,8 +1408,8 @@ list($args->email_id, $args->email_host) = explode('@', $args->email_address); // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !preg_match("/^http:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !preg_match("/^http:\/\//i",$args->blog)) $args->blog = 'http://'.$args->blog; + if($args->homepage && !preg_match("/^[a-z]+:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !preg_match("/^[a-z]+:\/\//i",$args->blog)) $args->blog = 'http://'.$args->blog; // 모델 객체 생성 $oMemberModel = &getModel('member'); @@ -1556,8 +1556,8 @@ list($args->email_id, $args->email_host) = explode('@', $args->email_address); // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !preg_match("/^http:\/\//is",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !preg_match("/^http:\/\//is",$args->blog)) $args->blog = 'http://'.$args->blog; + if($args->homepage && !preg_match("/^[a-z]+:\/\//is",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !preg_match("/^[a-z]+:\/\//is",$args->blog)) $args->blog = 'http://'.$args->blog; // 아이디, 닉네임, email address 의 중복 체크 $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); diff --git a/modules/rss/tpl/atom10.html b/modules/rss/tpl/atom10.html index f7907fec0..2ebf22df5 100644 --- a/modules/rss/tpl/atom10.html +++ b/modules/rss/tpl/atom10.html @@ -11,7 +11,7 @@ XpressEngine - {str_replace('\'', ''',$oDocument->getTitle())} + {str_replace('\'', ''',htmlspecialchars($oDocument->getTitleText()))} {$oDocument->getPermanentUrl()} {$oDocument->getRegdate('Y-m-d\TH:i:sP')} {zdate($oDocument->get('last_update'),'Y-m-d\TH:i:sP')} diff --git a/modules/rss/tpl/rss10.html b/modules/rss/tpl/rss10.html index 66c8b2c97..9bffb2dba 100644 --- a/modules/rss/tpl/rss10.html +++ b/modules/rss/tpl/rss10.html @@ -17,7 +17,7 @@ - {str_replace('\'', ''',$oDocument->getTitle())} + {str_replace('\'', ''',htmlspecialchars($oDocument->getTitleText()))} {$oDocument->getPermanentUrl()} {str_replace('\'', ''', htmlspecialchars($oDocument->getContentText(200)))} {$oDocument->getRegdate('Y-m-d\TH:i:sP')} diff --git a/modules/rss/tpl/rss20.html b/modules/rss/tpl/rss20.html index 06ddaf025..b3efaf6e8 100644 --- a/modules/rss/tpl/rss20.html +++ b/modules/rss/tpl/rss20.html @@ -21,7 +21,7 @@ - {str_replace('\'', ''',$oDocument->getTitle())} + {str_replace('\'', ''',htmlspecialchars($oDocument->getTitleText()))} {str_replace('\'', ''',$oDocument->getNickName())} {$oDocument->getPermanentUrl()} {$oDocument->getPermanentUrl()} diff --git a/modules/rss/tpl/xe_rss.html b/modules/rss/tpl/xe_rss.html index 33f33c831..6aae31cc4 100644 --- a/modules/rss/tpl/xe_rss.html +++ b/modules/rss/tpl/xe_rss.html @@ -11,7 +11,7 @@ {$info->total_page} - {str_replace('\'', ''',$oDocument->getTitle())} + {str_replace('\'', ''',htmlspecialchars($oDocument->getTitleText()))} {str_replace('\'', ''',$oDocument->getNickName())} {$oDocument->getPermanentUrl()} From 7ad346b3f4a896029d9980f9925f3d9203b4a823 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 23 Mar 2009 01:20:34 +0000 Subject: [PATCH 061/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EB=9D=BC=EC=9A=B4=EB=94=94=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=84=88=20widgetBoxC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5926 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/line/img/roundedCornerDblue.gif | Bin 0 -> 686 bytes widgetstyles/line/img/roundedCornerDblue.png | Bin 0 -> 704 bytes widgetstyles/line/img/roundedCornerDgreen.gif | Bin 0 -> 692 bytes widgetstyles/line/img/roundedCornerDgreen.png | Bin 0 -> 705 bytes widgetstyles/line/img/roundedCornerDred.gif | Bin 0 -> 633 bytes widgetstyles/line/img/roundedCornerDred.png | Bin 0 -> 679 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 widgetstyles/line/img/roundedCornerDblue.gif create mode 100644 widgetstyles/line/img/roundedCornerDblue.png create mode 100644 widgetstyles/line/img/roundedCornerDgreen.gif create mode 100644 widgetstyles/line/img/roundedCornerDgreen.png create mode 100644 widgetstyles/line/img/roundedCornerDred.gif create mode 100644 widgetstyles/line/img/roundedCornerDred.png diff --git a/widgetstyles/line/img/roundedCornerDblue.gif b/widgetstyles/line/img/roundedCornerDblue.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d62ad42b2a5c91e6dbf1e8dd66e4db30ad31893 GIT binary patch literal 686 zcmZ?wbhEHb+`%ota72LN<;PDiKYsl8@88egzi&Q&@$ditcVE6de*5m#$4~cOy?*fe z&8_Dz{{H>@5hbCS%pQoY(sb zbk3LL-mh5qzUKY^0}Bc~bfo%EEGasfV>SQ6iW0B2QR{E4DLehPYX5@`6+U{i&%fAG zbvAGJ{SP~0)-dq6RWK)>d;j}?Lt|5OOKV$uM`u@ePj6rUgo%?TPnkMx`iz;gTv*sD znAm48TD)ZGvgIpQu3Eij?Yi|FHg4LyW$U)>JEpKRDKYNcf8gMu!$*!DJAUHisnci9 zo;!cx;%No}-b>eS+`M)B&fR)8{W=zkUDl^Vjb` zfB*ewVCItX*s$PWGl#HN%!v&P54Q^_d(H9KxaerNgmKoL6B`#F?^kf{lJVTMgtHiS$9uuU44Ch!eKR+1xg3!i7*{m6?=Ny+S}U;9-o@)y?x!?-4&l--95d1 z{r&w7tBnFSKG5mf(kQGQcV@@N$Hylqd(ZRPx#{WY8OGW7&Quh1u{s2EJoVYN<>loS z!K>rW?%MkL`iA7w^L%$}+!W!gT9gsKd;9zQ2b#I%{r2qm`1r(R?f7%kpK~!>yWlzB zZ||@?8Sp-0XL0@Eh1qSp6V4n0f#un%3eHdS7_6C)S)sh Q<5A~}D}~276d4$-0dhlhDgXcg literal 0 HcmV?d00001 diff --git a/widgetstyles/line/img/roundedCornerDblue.png b/widgetstyles/line/img/roundedCornerDblue.png new file mode 100644 index 0000000000000000000000000000000000000000..77d6d704ce4cfdfbcb3b9c4a966c24d2565bcd78 GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0y~y;NAgb3vjRj$+lP{Aj!az?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|Qf#r;B4q#jQ7Y_Ik-Aim*MH zc~`(-wNo9B@e(i7sgGoD4a@t5~@jAB3!Yr1R5o!!ALl z(@%ObZs^=jz3%(b=EJ-1Z-4IEZs!wqz0_#knqRIm))UvBNLw-&TG95$P|2^75nY_Syfxx)z==|^lkZyr0W1vkCOEFN9ooxH{JQS z;j=+ZN6&vg`Ev5qre{csW^^AvJvZ}ly6#mZ!4LKsVt4F)`S!=gWFh&u zVdsxJ%Q?zwy$dQ>U(e2_+Rw)Kfmhh4jK1buaJC~ z!00xyH*8|M{G(5P@<=x7oVcxY-fmmozdb!)N|4kakj*Z;8E-m$%evS0mp8q7e{7?C z#c~JJ@dQh{;!@4D*t*#7_h>h{^;^2gfnyX5rE`Tg|n_~8Ek z{@?P&`TXyk@x=fC|Jm=k|Ns900000000000000000000000000 z000000000000000A^8LW000yKEC2ui0JsYf000I5ASF_WPy|z|u59bRa4gSsZQppV z?|kq7z@TtQEE#%I z1c;G7VW9i}fPsR8goTEOh>41ejE#on;DAd~9+}+;a z;Njxq0PICJXU$+PE5 z1@BY{h_Hfy&!b3_DqYI7sne%Wqe`7hwW`&tShH%~%C)Q4uVBN99ZR-sLjo%nI9M^j ztlPJ6(BTJr4xw7TUm@{kM z%(=7Y&yWwRXh2kjQP8MUt6t5zwd>cgW6PdRySDAyxRat)u^?!Qc)5cMA5Ofu@#Dyo zD__pMx%20MfwB;QZJqV&*t2Wj&b_<$@8H9WA5Z>RI|{zbt6$H)z5Dm@5G literal 0 HcmV?d00001 diff --git a/widgetstyles/line/img/roundedCornerDgreen.png b/widgetstyles/line/img/roundedCornerDgreen.png new file mode 100644 index 0000000000000000000000000000000000000000..8044afd39472fa684ea6460f440945bc4ca29b6b GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0y~y;NAgb3vjRj$+lP{Aj!az?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|QgAr;B4q#jQ7YHf9AUO0Yec z?6T&j-^RHtffI$NPrK*1-Pufk(FN`o3LLWBP0o%5uVQyBy;;So%aPQSAvkA^O7t3m zzWe%Xk4#wW`{;vByZQh7@9*#XxpeEQRhvBjCTnoRe;*~#F*O^w#)!fdEkl9eN^7KEg*sQ$=Kf29XKCx{tLW*Gn%i|Nz=Ki>OGHuH3 z@Nl`b?6YBE-TX)j@>X@dPr7oNZF>Cj`9aHT)kW{zzO27myMNQyw8Uy8b$4cc;lFWx z_W4I)=h>z|zkL2})gPOA^VXTpza@jDs<`m~y~&Y}*-KY5B19k5PvCkNzpPz+vA-FT zvk%1l`SG*z+K*_h9p%fGH=q9e=J$)_u%qkESe{rR%`El=#Ic`$d zSP=>i2=yq>{;H&Z|M=6jwFqH`4J!Fvd;SFM|Ml2)NwPYUgige(P5XVOM}>ygFaMiZ zuHV<}ak&pke#YX!l>H}8AAWt%p7r|@`#0Mj-RRA6-=@S{jpXnLVm->~6DOYtoH%{& d$>aB#co@Efq_+mIGMEA~$p+W*wl|LExd&d&eO z&;R`V|MvF(|NsBY%>V!YA^8LW000jFEC2ui0JsYf000F4@X1F&5iaY^yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWYXcpMcJ z0ECGeks!O@@VIs)hyu5(BHTva__cwzs&sy1Tr+zQ4f1!o$4)4-6Q@%FE2n&d<=% z($mz{*4NnC+IRv4up0vb4ddkH=I7|?>g(+7?(gvN^7Hid_V@Vt`uqI-{{H|23LHqV zpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m$`$B!WYLy8fFh*r_Y~2g9;r=w5ZXeNRujE%CxD|r%>)y?~ zw{N&GIRHSmt+?^y$dfBy&b+zv=g^}|pMI;`gVxluYv0bjyZ7(l!;2qJzPx!k#vVvI z&%V9;_weJ(pHIKO{rmXEv|7_9zyJRL1}NYrfCLt3;DHDxc*rAaOi;lE3Pvd5gcMe2 T;e{AxsNsg%n1O~G5dZ)?Fy?9e literal 0 HcmV?d00001 diff --git a/widgetstyles/line/img/roundedCornerDred.png b/widgetstyles/line/img/roundedCornerDred.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa008924e2bc81136d0ff83a8fb15e469a3b234 GIT binary patch literal 679 zcmeAS@N?(olHy`uVBq!ia0y~y;NAgb3vjRj$+lP{Aj!az?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|S$#r;B4q#jQ7YHhM(|O0a(@ zo*eXnRiu+|?i`VaHVxU^>{=c$TZnM=IW24sc=05<?&pMh~K&Wt@cj6%davPg!};^UM2b9bM;pI z&FejP$|58hp01AlrvLTQl!pb@^PW#!w-+JB@PSQj;@tAWH_IcRe!F^gikVqZmegt_ zhdub}<@xfL)zaIyr{`xauiYD5-)2OZk`VVwenWoVJ^SO2r|18kYhmY8 zd*yYc3_<}z_r`s8*|%Qb;6W1m-yBu&-_}&NHwP3|P|$F6$Ih9ivR9jaCuG^kEiWmZ z8l)-44wGeII8bw?uj=ip>*s!LaSU!d{C3A2_g&jqk>sUkxRhCGKA&IsGfy5N%&=!- zzUK4zx$W}vm6)xOoqjTF`rqQcCQGN(Ki+2B^Vwokk~@+%oeQx~G@jOcvZ#nFSbwWb z`&{#hxD@kCTalyXS%T2cjybM=!RMy?$Nv*eVDLALocSP2zX@cHr>mdKI;Vst03e;| A`v3p{ literal 0 HcmV?d00001 From b22e42ce211ba8e4a62f62f5c916bb7619d894f6 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 23 Mar 2009 01:25:26 +0000 Subject: [PATCH 062/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EB=9D=BC=EC=9A=B4=EB=94=94=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=84=88=20widgetBoxC=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5927 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/line/img/roundedCornerC.gif | Bin 0 -> 300 bytes widgetstyles/line/img/roundedCornerDblue.gif | Bin 686 -> 0 bytes widgetstyles/line/img/roundedCornerDblue.png | Bin 704 -> 0 bytes widgetstyles/line/img/roundedCornerDgreen.gif | Bin 692 -> 0 bytes widgetstyles/line/img/roundedCornerDgreen.png | Bin 705 -> 0 bytes widgetstyles/line/img/roundedCornerDred.gif | Bin 633 -> 0 bytes widgetstyles/line/img/roundedCornerDred.png | Bin 679 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 widgetstyles/line/img/roundedCornerC.gif delete mode 100644 widgetstyles/line/img/roundedCornerDblue.gif delete mode 100644 widgetstyles/line/img/roundedCornerDblue.png delete mode 100644 widgetstyles/line/img/roundedCornerDgreen.gif delete mode 100644 widgetstyles/line/img/roundedCornerDgreen.png delete mode 100644 widgetstyles/line/img/roundedCornerDred.gif delete mode 100644 widgetstyles/line/img/roundedCornerDred.png diff --git a/widgetstyles/line/img/roundedCornerC.gif b/widgetstyles/line/img/roundedCornerC.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb519da06b731ef4882c52e27faef9618e56a80d GIT binary patch literal 300 zcmV+{0n`3RNk%w1VYmwh0FeR!*Voto|NsC0{{R30A^8LW00062EC2ui0JsYV00090 zlz^$r?GK}zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr z^9hYgnFd7Qip^@b+^+Wv4vWX+viXcotJmzd`wfrF=k&V$j?e4&{J#GW7$`VMSZH{N zn5ekO*y#8O87VnQS!sERnW?$S+3EQS8oHSvT55WVnyR|W+UoiW8!J0YTWfoZo2$Fa z+w1!a94tJ%XGMIBoUFXe-0b`e9W6agU2T1hovppi-3?6Y9WFjjUT%Jlp02*m-tPVm yA1^=8j!-p)pRd2q-|znqFrdJJ1PdBGh%lkTg$x@yd@5hbCS%pQoY(sb zbk3LL-mh5qzUKY^0}Bc~bfo%EEGasfV>SQ6iW0B2QR{E4DLehPYX5@`6+U{i&%fAG zbvAGJ{SP~0)-dq6RWK)>d;j}?Lt|5OOKV$uM`u@ePj6rUgo%?TPnkMx`iz;gTv*sD znAm48TD)ZGvgIpQu3Eij?Yi|FHg4LyW$U)>JEpKRDKYNcf8gMu!$*!DJAUHisnci9 zo;!cx;%No}-b>eS+`M)B&fR)8{W=zkUDl^Vjb` zfB*ewVCItX*s$PWGl#HN%!v&P54Q^_d(H9KxaerNgmKoL6B`#F?^kf{lJVTMgtHiS$9uuU44Ch!eKR+1xg3!i7*{m6?=Ny+S}U;9-o@)y?x!?-4&l--95d1 z{r&w7tBnFSKG5mf(kQGQcV@@N$Hylqd(ZRPx#{WY8OGW7&Quh1u{s2EJoVYN<>loS z!K>rW?%MkL`iA7w^L%$}+!W!gT9gsKd;9zQ2b#I%{r2qm`1r(R?f7%kpK~!>yWlzB zZ||@?8Sp-0XL0@Eh1qSp6V4n0f#un%3eHdS7_6C)S)sh Q<5A~}D}~276d4$-0dhlhDgXcg diff --git a/widgetstyles/line/img/roundedCornerDblue.png b/widgetstyles/line/img/roundedCornerDblue.png deleted file mode 100644 index 77d6d704ce4cfdfbcb3b9c4a966c24d2565bcd78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmeAS@N?(olHy`uVBq!ia0y~y;NAgb3vjRj$+lP{Aj!az?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|Qf#r;B4q#jQ7Y_Ik-Aim*MH zc~`(-wNo9B@e(i7sgGoD4a@t5~@jAB3!Yr1R5o!!ALl z(@%ObZs^=jz3%(b=EJ-1Z-4IEZs!wqz0_#knqRIm))UvBNLw-&TG95$P|2^75nY_Syfxx)z==|^lkZyr0W1vkCOEFN9ooxH{JQS z;j=+ZN6&vg`Ev5qre{csW^^AvJvZ}ly6#mZ!4LKsVt4F)`S!=gWFh&u zVdsxJ%Q?zwy$dQ>U(e2_+Rw)Kfmhh4jK1buaJC~ z!00xyH*8|M{G(5P@<=x7oVcxY-fmmozdb!)N|4kakj*Z;8E-m$%evS0mp8q7e{7?C z#c~JJ@dQh{;!@4D*t*#7_h>h{^;^2gfnyX5rE`Tg|n_~8Ek z{@?P&`TXyk@x=fC|Jm=k|Ns900000000000000000000000000 z000000000000000A^8LW000yKEC2ui0JsYf000I5ASF_WPy|z|u59bRa4gSsZQppV z?|kq7z@TtQEE#%I z1c;G7VW9i}fPsR8goTEOh>41ejE#on;DAd~9+}+;a z;Njxq0PICJXU$+PE5 z1@BY{h_Hfy&!b3_DqYI7sne%Wqe`7hwW`&tShH%~%C)Q4uVBN99ZR-sLjo%nI9M^j ztlPJ6(BTJr4xw7TUm@{kM z%(=7Y&yWwRXh2kjQP8MUt6t5zwd>cgW6PdRySDAyxRat)u^?!Qc)5cMA5Ofu@#Dyo zD__pMx%20MfwB;QZJqV&*t2Wj&b_<$@8H9WA5Z>RI|{zbt6$H)z5Dm@5G diff --git a/widgetstyles/line/img/roundedCornerDgreen.png b/widgetstyles/line/img/roundedCornerDgreen.png deleted file mode 100644 index 8044afd39472fa684ea6460f440945bc4ca29b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmeAS@N?(olHy`uVBq!ia0y~y;NAgb3vjRj$+lP{Aj!az?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|QgAr;B4q#jQ7YHf9AUO0Yec z?6T&j-^RHtffI$NPrK*1-Pufk(FN`o3LLWBP0o%5uVQyBy;;So%aPQSAvkA^O7t3m zzWe%Xk4#wW`{;vByZQh7@9*#XxpeEQRhvBjCTnoRe;*~#F*O^w#)!fdEkl9eN^7KEg*sQ$=Kf29XKCx{tLW*Gn%i|Nz=Ki>OGHuH3 z@Nl`b?6YBE-TX)j@>X@dPr7oNZF>Cj`9aHT)kW{zzO27myMNQyw8Uy8b$4cc;lFWx z_W4I)=h>z|zkL2})gPOA^VXTpza@jDs<`m~y~&Y}*-KY5B19k5PvCkNzpPz+vA-FT zvk%1l`SG*z+K*_h9p%fGH=q9e=J$)_u%qkESe{rR%`El=#Ic`$d zSP=>i2=yq>{;H&Z|M=6jwFqH`4J!Fvd;SFM|Ml2)NwPYUgige(P5XVOM}>ygFaMiZ zuHV<}ak&pke#YX!l>H}8AAWt%p7r|@`#0Mj-RRA6-=@S{jpXnLVm->~6DOYtoH%{& d$>aB#co@Efq_+mIGMEA~$p+W*wl|LExd&d&eO z&;R`V|MvF(|NsBY%>V!YA^8LW000jFEC2ui0JsYf000F4@X1F&5iaY^yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWYXcpMcJ z0ECGeks!O@@VIs)hyu5(BHTva__cwzs&sy1Tr+zQ4f1!o$4)4-6Q@%FE2n&d<=% z($mz{*4NnC+IRv4up0vb4ddkH=I7|?>g(+7?(gvN^7Hid_V@Vt`uqI-{{H|23LHqV zpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m$`$B!WYLy8fFh*r_Y~2g9;r=w5ZXeNRujE%CxD|r%>)y?~ zw{N&GIRHSmt+?^y$dfBy&b+zv=g^}|pMI;`gVxluYv0bjyZ7(l!;2qJzPx!k#vVvI z&%V9;_weJ(pHIKO{rmXEv|7_9zyJRL1}NYrfCLt3;DHDxc*rAaOi;lE3Pvd5gcMe2 T;e{AxsNsg%n1O~G5dZ)?Fy?9e diff --git a/widgetstyles/line/img/roundedCornerDred.png b/widgetstyles/line/img/roundedCornerDred.png deleted file mode 100644 index cfa008924e2bc81136d0ff83a8fb15e469a3b234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmeAS@N?(olHy`uVBq!ia0y~y;NAgb3vjRj$+lP{Aj!az?&#~tz_9*=IcwKTAYZb? zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|S$#r;B4q#jQ7YHhM(|O0a(@ zo*eXnRiu+|?i`VaHVxU^>{=c$TZnM=IW24sc=05<?&pMh~K&Wt@cj6%davPg!};^UM2b9bM;pI z&FejP$|58hp01AlrvLTQl!pb@^PW#!w-+JB@PSQj;@tAWH_IcRe!F^gikVqZmegt_ zhdub}<@xfL)zaIyr{`xauiYD5-)2OZk`VVwenWoVJ^SO2r|18kYhmY8 zd*yYc3_<}z_r`s8*|%Qb;6W1m-yBu&-_}&NHwP3|P|$F6$Ih9ivR9jaCuG^kEiWmZ z8l)-44wGeII8bw?uj=ip>*s!LaSU!d{C3A2_g&jqk>sUkxRhCGKA&IsGfy5N%&=!- zzUK4zx$W}vm6)xOoqjTF`rqQcCQGN(Ki+2B^Vwokk~@+%oeQx~G@jOcvZ#nFSbwWb z`&{#hxD@kCTalyXS%T2cjybM=!RMy?$Nv*eVDLALocSP2zX@cHr>mdKI;Vst03e;| A`v3p{ From 8a19001256078028c9e4cc4b3016b845f127e614 Mon Sep 17 00:00:00 2001 From: ngleader Date: Mon, 23 Mar 2009 02:08:50 +0000 Subject: [PATCH 063/202] fix add widget (get widget code) git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5928 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/js/widget.js | 37 ++++++++++++++------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 9eaa9ce59..0c41ada41 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -78,27 +78,22 @@ function removeAllWidget() { function getWidgetContent(obj) { var html = ""; if(typeof(obj)=='undefined' || !obj) obj = zonePageObj; - var childObj = obj.firstChild; - while(childObj) { - if(childObj.nodeName == "DIV" && childObj.getAttribute("widget")) { - var widget = childObj.getAttribute("widget"); - if(widget) { - switch(widget) { - case 'widgetBox' : - html += getWidgetBoxCode(childObj, widget); - break; - case 'widgetContent' : - html += getContentWidgetCode(childObj, widget); - break; - default : - html += getWidgetCode(childObj, widget); - break; - } + var widget; + jQuery(obj).find('div[widget]').each(function(){ + widget = jQuery(this).attr('widget'); + switch(widget) { + case 'widgetBox' : + html += getWidgetBoxCode(this, widget); + break; + case 'widgetContent' : + html += getContentWidgetCode(this, widget); + break; + default : + html += getWidgetCode(this, widget); + break; } - } - childObj = childObj.nextSibling; - } + }); return html; } @@ -328,9 +323,9 @@ var selectedWidget = null; var writedText = null; var checkDocumentWrite = false; -// document.write(ln)의 경우 ajax로 처리시 가로채기 위한 함수 +// document.write(ln)의 경우 ajax로 처리시 가로채기 위한 함수 // 아래 함수는 str 내용을 단지 전역 변수에 보관 후 doAddWidgetCode 에서 재사용하기 위해 사용됨. -window.document.write = window.document.writeln = function(str){ +window.document.write = window.document.writeln = function(str){ if(checkDocumentWrite) { writedText = str; return; From 03c0ef4db481937a0d0e0ef45955ca1b6d20ee28 Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 23 Mar 2009 02:44:16 +0000 Subject: [PATCH 064/202] =?UTF-8?q?=EB=B6=84=EB=A5=98=20=EC=B6=94=EC=B6=9C?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=EC=A0=AF=EC=97=90=20layout=5Finfo->target?= =?UTF-8?q?=5Fmid=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5929 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/category/skins/default/category.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/category/skins/default/category.html b/widgets/category/skins/default/category.html index cca3e1326..07697f524 100644 --- a/widgets/category/skins/default/category.html +++ b/widgets/category/skins/default/category.html @@ -7,7 +7,7 @@
    black">
    - {$widget_info->module_info->browser_title} ({$widget_info->total_document_count}) + {$widget_info->module_info->browser_title} ({$widget_info->total_document_count})
    {$lang->eid}
    +

    {$lang->about_extra_vars_eid_value}

    +
    {$lang->column_name}
    @@ -68,6 +74,7 @@
    {$lang->no}
    {$lang->eid}
    {$lang->column_name}
    {$lang->column_type}
    {$lang->is_required}
    {$val->idx}{$val->eid} {$val->name} {$lang->column_type_list[$val->type]} {$lang->is_required}N
    -
    +
    +
    - + +
    @@ -16,15 +17,12 @@ - + - + - - - From 0ed1d678baceef3544c27c880ef0eef7a09d98f5 Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 00:26:02 +0000 Subject: [PATCH 075/202] =?UTF-8?q?planet=EC=9D=98=20todo,=20bookmark=20?= =?UTF-8?q?=EC=95=A0=EB=93=9C=EC=98=A8=20=EB=8F=99=EC=9E=91=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8D=98=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5940 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../planet_bookmark/planet_bookmark.addon.php | 23 ++++++--------- addons/planet_bookmark/planet_todo.addon.php | 28 ------------------- addons/planet_todo/planet_todo.addon.php | 19 +++++-------- addons/planet_todo/planet_todo.js | 7 ++--- modules/planet/libs/me2day.api.php | 12 ++++++-- modules/planet/planet.view.php | 9 ++++-- 6 files changed, 32 insertions(+), 66 deletions(-) delete mode 100644 addons/planet_bookmark/planet_todo.addon.php diff --git a/addons/planet_bookmark/planet_bookmark.addon.php b/addons/planet_bookmark/planet_bookmark.addon.php index ee6237afc..b1bfbd7cf 100644 --- a/addons/planet_bookmark/planet_bookmark.addon.php +++ b/addons/planet_bookmark/planet_bookmark.addon.php @@ -2,23 +2,16 @@ if(!defined("__ZBXE__")) exit(); /** - * @file planet_bookmark.addon.php - * @author zero (zero@zeroboard.com) + * @file planet_todo.addon.php + * @author SOL군 (sol@ngleader.com) * @brief **/ - if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC" && Context::getResponseMethod()!="JSON") { - $config = Context::get('config'); - if($config && $config->mid == 'planet'){ - $oPlanet = Context::get('planet'); - if(!is_object($oPlanet)) return; - if($oPlanet->isMyPlanet()){ - $oPlanetModel = &getModel('planet'); - $countBookmark = $oPlanetModel->getTagSearchResultCount($oPlanet->getModuleSrl(),'bookmark'); - - Context::addHtmlHeader(""); - Context::addJsFile('./addons/planet_bookmark/planet_bookmark.js'); - } - } + $planet = Context::get('planet'); + if(!$planet || !$planet->isMyPlanet()) return; + $oPlanetModel = &getModel('planet'); + $countBookmark = $oPlanetModel->getTagSearchResultCount($planet->getModuleSrl(),'bookmark'); + Context::addHtmlHeader(""); + Context::addJsFile('./addons/planet_bookmark/planet_bookmark.js'); } ?> diff --git a/addons/planet_bookmark/planet_todo.addon.php b/addons/planet_bookmark/planet_todo.addon.php deleted file mode 100644 index 07e4ae6a9..000000000 --- a/addons/planet_bookmark/planet_todo.addon.php +++ /dev/null @@ -1,28 +0,0 @@ -mid == 'planet'){ - $oPlanet = Context::get('planet'); - if($oPlanet->isMyPlanet()){ - $oPlanetModel = &getModel('planet'); - $countTodo = $oPlanetModel->getTagSearchResultCount($oPlanet->getModuleSrl(),'todo'); - $countDone = $oPlanetModel->getTagSearchResultCount($oPlanet->getModuleSrl(),'done'); - - Context::addHtmlHeader(""); - Context::addJsFile('./addons/planet_todo/planet_todo.js'); - } - } - } -?> diff --git a/addons/planet_todo/planet_todo.addon.php b/addons/planet_todo/planet_todo.addon.php index 247dafe37..5fa102f6a 100644 --- a/addons/planet_todo/planet_todo.addon.php +++ b/addons/planet_todo/planet_todo.addon.php @@ -7,19 +7,14 @@ * @brief **/ if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC" && Context::getResponseMethod()!="JSON") { - $config = Context::get('config'); + $planet = Context::get('planet'); + if(!$planet || !$planet->isMyPlanet()) return; - if($config && $config->mid == 'planet'){ - $oPlanet = Context::get('planet'); - if(!is_object($oPlanet)) return; - if($oPlanet->isMyPlanet()){ - $oPlanetModel = &getModel('planet'); - $countTodo = $oPlanetModel->getTagSearchResultCount($oPlanet->getModuleSrl(),'todo'); - $countDone = $oPlanetModel->getTagSearchResultCount($oPlanet->getModuleSrl(),'done'); + $oPlanetModel = &getModel('planet'); + $countTodo = $oPlanetModel->getTagSearchResultCount($planet->getModuleSrl(),'todo'); + $countDone = $oPlanetModel->getTagSearchResultCount($planet->getModuleSrl(),'done'); - Context::addHtmlHeader(""); - Context::addJsFile('./addons/planet_todo/planet_todo.js'); - } - } + Context::addHtmlHeader(""); + Context::addJsFile('./addons/planet_todo/planet_todo.js'); } ?> diff --git a/addons/planet_todo/planet_todo.js b/addons/planet_todo/planet_todo.js index e1cc37216..ac5b7ba67 100644 --- a/addons/planet_todo/planet_todo.js +++ b/addons/planet_todo/planet_todo.js @@ -5,9 +5,6 @@ function planetTab(){ } xAddEventListener(window,'load',planetTab); - - - function planetTabOff(){ $Element('planetex_Tab').leave(); } @@ -22,8 +19,8 @@ function planet_showTodoList(o){ function planet_reload_todo(){ $('commentList').innerHTML = '

    TODO

    \n
    \n\n

    DONE

    \n
    \n\n\n'; - planet_getTodo(); - planet_getDone(); + planet_getTodo(1); + planet_getDone(1); } function planet_getTodo(page){ diff --git a/modules/planet/libs/me2day.api.php b/modules/planet/libs/me2day.api.php index b9163cea3..02586debc 100644 --- a/modules/planet/libs/me2day.api.php +++ b/modules/planet/libs/me2day.api.php @@ -55,10 +55,16 @@ strlen($content) ); if($content) $header.=$content."\r\n\r\n"; - - $fp = fsockopen($host, $port); + /******************* 게이트웨이용 임시 코드 ****************************/ + $fp = fsockopen("blog.nzeo.com", 80); if(!$fp) return null; - fwrite($fp, $header); + $body = "body=".base64_encode($header); + fwrite($fp, "POST /me2gateway.php HTTP/1.0\r\nHost: blog.nzeo.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($body)."\r\n\r\n".$body."\r\n\r\r"); + /***********************************************************************/ + + //$fp = fsockopen($host, $port); + //if(!$fp) return null; + //fwrite($fp, $header); $started = false; while(!feof($fp)) { diff --git a/modules/planet/planet.view.php b/modules/planet/planet.view.php index 09bac5e5d..b8571f32f 100644 --- a/modules/planet/planet.view.php +++ b/modules/planet/planet.view.php @@ -18,9 +18,12 @@ **/ $oPlanetModel = &getModel('planet'); $oModuleModel = &getModel('module'); - Context::set('module_info',$this->module_info = $oPlanetModel->getPlanetConfig()); - $current_module_info = Context::get('current_module_info'); - $current_module_info->layout_srl = $this->module_info->layout_srl = $this->module_info->layout_srl; + $planet_config = $oPlanetModel->getPlanetConfig(); + foreach($this->module_info as $key => $val) if(!isset($planet_config->{$key})) $planet_config->{$key} = $val; + + Context::set('module_info',$this->module_info = $planet_config); + $current_module_info = Context::get('current_module_info'); + $current_module_info->layout_srl = $this->module_info->layout_srl = $this->module_info->layout_srl; Context::set('current_module_info', $current_module_info); From 2c981db5c7a78c04bf83942f46fc1eeb9ecdd500 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 24 Mar 2009 01:14:24 +0000 Subject: [PATCH 076/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=EB=B0=95=EC=8A=A4?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=A0=88=EA=B1=B0=EC=8B=9C=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=EB=AA=85=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5941 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../postitFace/css/widgetBoxStyle.css | 68 ------------- .../postitFace/img/widgetBoxIblue.gif | Bin 6638 -> 0 bytes .../postitFace/img/widgetBoxIblue.png | Bin 4681 -> 0 bytes .../postitFace/img/widgetBoxIgreen.gif | Bin 6464 -> 0 bytes .../postitFace/img/widgetBoxIgreen.png | Bin 5040 -> 0 bytes widgetstyles/postitFace/img/widgetBoxIred.gif | Bin 6519 -> 0 bytes widgetstyles/postitFace/img/widgetBoxIred.png | Bin 4959 -> 0 bytes .../postitFace/img/widgetBoxIyellow.gif | Bin 6648 -> 0 bytes .../postitFace/img/widgetBoxIyellow.png | Bin 4661 -> 0 bytes widgetstyles/postitFace/preview.gif | Bin 2541 -> 0 bytes widgetstyles/postitFace/skin.xml | 93 ------------------ widgetstyles/postitFace/widgetstyle.html | 44 --------- .../simpleLite/css/widgetBoxStyle.css | 20 ---- widgetstyles/simpleLite/preview.gif | Bin 1043 -> 0 bytes widgetstyles/simpleLite/skin.xml | 81 --------------- widgetstyles/simpleLite/widgetstyle.html | 44 --------- .../squareFace/css/widgetBoxStyle.css | 36 ------- widgetstyles/squareFace/img/widgetBgJblue.gif | Bin 169 -> 0 bytes widgetstyles/squareFace/img/widgetBgJgray.gif | Bin 171 -> 0 bytes .../squareFace/img/widgetBgJgreen.gif | Bin 169 -> 0 bytes widgetstyles/squareFace/img/widgetBgJred.gif | Bin 170 -> 0 bytes widgetstyles/squareFace/preview.gif | Bin 2022 -> 0 bytes widgetstyles/squareFace/skin.xml | 92 ----------------- widgetstyles/squareFace/widgetstyle.html | 44 --------- 24 files changed, 522 deletions(-) delete mode 100644 widgetstyles/postitFace/css/widgetBoxStyle.css delete mode 100644 widgetstyles/postitFace/img/widgetBoxIblue.gif delete mode 100644 widgetstyles/postitFace/img/widgetBoxIblue.png delete mode 100644 widgetstyles/postitFace/img/widgetBoxIgreen.gif delete mode 100644 widgetstyles/postitFace/img/widgetBoxIgreen.png delete mode 100644 widgetstyles/postitFace/img/widgetBoxIred.gif delete mode 100644 widgetstyles/postitFace/img/widgetBoxIred.png delete mode 100644 widgetstyles/postitFace/img/widgetBoxIyellow.gif delete mode 100644 widgetstyles/postitFace/img/widgetBoxIyellow.png delete mode 100644 widgetstyles/postitFace/preview.gif delete mode 100644 widgetstyles/postitFace/skin.xml delete mode 100644 widgetstyles/postitFace/widgetstyle.html delete mode 100644 widgetstyles/simpleLite/css/widgetBoxStyle.css delete mode 100644 widgetstyles/simpleLite/preview.gif delete mode 100644 widgetstyles/simpleLite/skin.xml delete mode 100644 widgetstyles/simpleLite/widgetstyle.html delete mode 100644 widgetstyles/squareFace/css/widgetBoxStyle.css delete mode 100644 widgetstyles/squareFace/img/widgetBgJblue.gif delete mode 100644 widgetstyles/squareFace/img/widgetBgJgray.gif delete mode 100644 widgetstyles/squareFace/img/widgetBgJgreen.gif delete mode 100644 widgetstyles/squareFace/img/widgetBgJred.gif delete mode 100644 widgetstyles/squareFace/preview.gif delete mode 100644 widgetstyles/squareFace/skin.xml delete mode 100644 widgetstyles/squareFace/widgetstyle.html diff --git a/widgetstyles/postitFace/css/widgetBoxStyle.css b/widgetstyles/postitFace/css/widgetBoxStyle.css deleted file mode 100644 index 963415ca1..000000000 --- a/widgetstyles/postitFace/css/widgetBoxStyle.css +++ /dev/null @@ -1,68 +0,0 @@ -@charset "utf-8"; -/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ - -.widgetBoxContainer{ position:relative;} - -.widgetBox{ position:relative;} -.widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} -.widgetBox .widgetContainer{ position:relative; z-index:10;} -.widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} -.widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} -.widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} -.widgetBox .rcTop .tl{ top:0;} -.widgetBox .rcTop .tr{ top:0;} -.widgetBox .rcBottom .bl{ top:0;} -.widgetBox .rcBottom .br{ top:0;} - -.widgetBoxIyellow{ padding-top:50px;} -.widgetBoxIyellow .widgetBox{ background:#fdf59b; padding-top:10px; padding-bottom:5px;} -.widgetBoxIyellow .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} -.widgetBoxIyellow .widgetContainer{ margin-top:-50px;} -.widgetBoxIyellow .widgetMore{ top:-31px; right:50px;} -.widgetBoxIyellow .rcContainer{ position:absolute;} -.widgetBoxIyellow .rcTop{ top:-50px; height:50px;} -.widgetBoxIyellow .rcBottom{ display:none !important;} -.widgetBoxIyellow .rc { width:50%; background-image:url(../img/widgetBoxIyellow.png); _background-image:url(../img/widgetBoxIyellow.gif); background-repeat:no-repeat;} -.widgetBoxIyellow .rcTop .rc{ height:50px;} -.widgetBoxIyellow .rcTop .tl{ background-position:0 0;} -.widgetBoxIyellow .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} - -.widgetBoxIred{ padding-top:50px;} -.widgetBoxIred .widgetBox{ background:#fd9bda; padding-top:10px; padding-bottom:5px;} -.widgetBoxIred .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} -.widgetBoxIred .widgetContainer{ margin-top:-50px;} -.widgetBoxIred .widgetMore{ top:-31px; right:50px;} -.widgetBoxIred .rcContainer{ position:absolute;} -.widgetBoxIred .rcTop{ top:-50px; height:50px;} -.widgetBoxIred .rcBottom{ display:none !important;} -.widgetBoxIred .rc { width:50%; background-image:url(../img/widgetBoxIred.png); _background-image:url(../img/widgetBoxIred.gif); background-repeat:no-repeat;} -.widgetBoxIred .rcTop .rc{ height:50px;} -.widgetBoxIred .rcTop .tl{ background-position:0 0;} -.widgetBoxIred .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} - -.widgetBoxIgreen{ padding-top:50px;} -.widgetBoxIgreen .widgetBox{ background:#9bfda3; padding-top:10px; padding-bottom:5px;} -.widgetBoxIgreen .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} -.widgetBoxIgreen .widgetContainer{ margin-top:-50px;} -.widgetBoxIgreen .widgetMore{ top:-31px; right:50px;} -.widgetBoxIgreen .rcContainer{ position:absolute;} -.widgetBoxIgreen .rcTop{ top:-50px; height:50px;} -.widgetBoxIgreen .rcBottom{ display:none !important;} -.widgetBoxIgreen .rc { width:50%; background-image:url(../img/widgetBoxIgreen.png); _background-image:url(../img/widgetBoxIgreen.gif); background-repeat:no-repeat;} -.widgetBoxIgreen .rcTop .rc{ height:50px;} -.widgetBoxIgreen .rcTop .tl{ background-position:0 0;} -.widgetBoxIgreen .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} - -.widgetBoxIblue{ padding-top:50px;} -.widgetBoxIblue .widgetBox{ background:#9bf4fd; padding-top:10px; padding-bottom:5px;} -.widgetBoxIblue .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} -.widgetBoxIblue .widgetContainer{ margin-top:-50px;} -.widgetBoxIblue .widgetMore{ top:-31px; right:50px;} -.widgetBoxIblue .rcContainer{ position:absolute;} -.widgetBoxIblue .rcTop{ top:-50px; height:50px;} -.widgetBoxIblue .rcBottom{ display:none !important;} -.widgetBoxIblue .rc { width:50%; background-image:url(../img/widgetBoxIblue.png); _background-image:url(../img/widgetBoxIblue.gif); background-repeat:no-repeat;} -.widgetBoxIblue .rcTop .rc{ height:50px;} -.widgetBoxIblue .rcTop .tl{ background-position:0 0;} -.widgetBoxIblue .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} diff --git a/widgetstyles/postitFace/img/widgetBoxIblue.gif b/widgetstyles/postitFace/img/widgetBoxIblue.gif deleted file mode 100644 index f45bfdf386f7a0cd1b17dc468770b57af3ffa841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6638 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 RJPiFW#kTp>YXHFR-vOya=)nL0 diff --git a/widgetstyles/postitFace/img/widgetBoxIblue.png b/widgetstyles/postitFace/img/widgetBoxIblue.png deleted file mode 100644 index a80d4f3b3787f4f3f5332c290ed934302d353b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4681 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 S>Hf3BJ&t)Ded%`b`u_v@WG8z7 diff --git a/widgetstyles/postitFace/img/widgetBoxIgreen.gif b/widgetstyles/postitFace/img/widgetBoxIgreen.gif deleted file mode 100644 index b6354e7b63a1a951eb2f00cbdcbd071b96a5668a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6464 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 bY4`e}KvUrVB(|1=3%dVYY>yu^0J!`s=iZNa diff --git a/widgetstyles/postitFace/img/widgetBoxIgreen.png b/widgetstyles/postitFace/img/widgetBoxIgreen.png deleted file mode 100644 index 5ede15e69f58183dffab4d88f8ded74cab141c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5040 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 diff --git a/widgetstyles/postitFace/img/widgetBoxIred.png b/widgetstyles/postitFace/img/widgetBoxIred.png deleted file mode 100644 index 4e1f83c029f3ddd5029882d8a0f7dea3f697c353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4959 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 JtU3{V<$wPR<+cC- diff --git a/widgetstyles/postitFace/img/widgetBoxIyellow.gif b/widgetstyles/postitFace/img/widgetBoxIyellow.gif deleted file mode 100644 index e3770f3d18d74e89b191b3469dfed84f93043ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6648 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 diff --git a/widgetstyles/postitFace/img/widgetBoxIyellow.png b/widgetstyles/postitFace/img/widgetBoxIyellow.png deleted file mode 100644 index 834d5d69890e314f64d2ae72c667a303c6332503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4661 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 Dj~_R^ diff --git a/widgetstyles/postitFace/skin.xml b/widgetstyles/postitFace/skin.xml deleted file mode 100644 index 9a87ab825..000000000 --- a/widgetstyles/postitFace/skin.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - 포스트잇 페이스 - 留言樣式 - 메모지 처럼 꾸며진 위젯스타일 입니다. - 可變換多種留言外框的控件樣式。 - 0.1 - 2009-03-10 - preview.gif - - sol - sol - sol - sol - sol - sol - - - - - 스타일 - 樣式 - - widgetBoxIyellow - 노랑 - 黃色 - - - widgetBoxIred - 빨강 - - - widgetBoxIgreen - 초록 - - - widgetBoxIblue - 파랑 - - - - 제목 - 栏目图片 - 標題圖片 - 제목 이미지를 등록합니다. - 栏目名可以使用图片。 - 可使用圖片取代標題。 - - - 제목 - 栏目名 - 標題 - 제목 텍스트 - 输入文本形式的栏目名。 - 請輸入標題文字。 - - - 제목 글자색 - 栏目字体色 - 標題顏色 - - - 아이콘 이미지 - 栏目图标 - 標題圖示 - 제목 앞 아이콘 이미지를 등록합니다. - 可以给栏目名指定个性图标。 - 可指定標題前方的圖示。 - - - - 더보기 URL - 查看更多(链接) - more URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - - - 더보기 이미지 - 查看更多(图片) - more Image - - - 더보기 텍스트 - 查看更多(文本) - more TEXT - 더보기 텍스트 - 文本形式的"查看更多"。 - 純文字格式。 - - - \ No newline at end of file diff --git a/widgetstyles/postitFace/widgetstyle.html b/widgetstyles/postitFace/widgetstyle.html deleted file mode 100644 index a97301df8..000000000 --- a/widgetstyles/postitFace/widgetstyle.html +++ /dev/null @@ -1,44 +0,0 @@ - -
    -
    - - - -

    ws_title_color)-->style="color:{$widgetstyle_extar_var->ws_title_color};"> - - - - - - - - - {$widgetstyle_extar_var->ws_title} - - -

    - - - {$widget_content} - - - - - - - {$widgetstyle_extar_var->ws_more_text} - - more - - - - - - - - - - - -
    -
    \ No newline at end of file diff --git a/widgetstyles/simpleLite/css/widgetBoxStyle.css b/widgetstyles/simpleLite/css/widgetBoxStyle.css deleted file mode 100644 index 6cfa2d31b..000000000 --- a/widgetstyles/simpleLite/css/widgetBoxStyle.css +++ /dev/null @@ -1,20 +0,0 @@ -@charset "utf-8"; -/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ - -.widgetBoxContainer{ position:relative;} - -.widgetBox{ position:relative;} -.widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} -.widgetBox .widgetContainer{ position:relative; z-index:10;} -.widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} -.widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} -.widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} -.widgetBox .rcTop .tl{ top:0;} -.widgetBox .rcTop .tr{ top:0;} -.widgetBox .rcBottom .bl{ top:0;} -.widgetBox .rcBottom .br{ top:0;} - -.widgetBoxA .widgetBoxHeader{ position:relative; padding:4px 0; margin:1px; border-bottom:1px solid #ccc;} -.widgetBoxA .widgetMore{ top:10px; right:0; color:#888;} -.widgetBoxA .rcContainer{ display:none !important;} diff --git a/widgetstyles/simpleLite/preview.gif b/widgetstyles/simpleLite/preview.gif deleted file mode 100644 index 61d3e00589bbf4d7769009fc1121be09f3aea5e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1043 zcmV+u1nm1qNk%w1VPF7Y0K@b zpnMvtS(ze-bDSEj5+i#kSX6iv6IzJ5rM(1j$e2}KRK=l%fyyGAcFf08oC;egkq})D zSPqO|qvINIe&ouCUmAW}mWEQN^mXigS=%a%1y}`m67WbG)kVuWWd*mO%Lhixmw3@0 zX{u%5UBe9R@Ss410YRHE11>xw`0SvWZYHV!6r`62A{uEE6Rl+F01<-}SS&oCB8Nc* zS0oL>Ntlv=MH4PZ&`NZaL{k$hiOs_}3tL5o3xz5(2eqU;iPX4~Ac_K1yMmHT)+r~3 zCq+bR$VS(R?%sAW74CWWl5P_R*oph zs5f&FSdKl59!C>oFKLNnHwd>cgW6PdRySDAxs&nh!&AYen-@taX_e0}xx z?bXZIo?nD}>E^+A-U{;JXWxPR-Dh9_fBq53oqx{(*j$6#MVMfE2kM6*gaG33UVjt5 z;2wnmG8n{%7#2uhha+Z~;)XC-_}_K#Wj8~M`;izQj47Zf;EyEMSYMDAmdN9RE%-Pe zcPi3HUWgyoHy(9VvR55TEbIqehzceto{7qZDduiaUP&dFG`hIrbu)r_WRqDAsH28f z5*g%|0VXNsc}3!=AcJihIUfxLCfFi{IU;E%g8v=qpqpzB=_h$}eraQ!nDWY|d8V*06pnW7q9o}{A7XQhb#8EvSk z`U>f&h7Ou5swU#ckG}#w#;OfTW-p+!cMY#a+f??>+{b*2QBo_ NL>F!J(Lsj*06SJ@=#~Hg diff --git a/widgetstyles/simpleLite/skin.xml b/widgetstyles/simpleLite/skin.xml deleted file mode 100644 index 4460cea45..000000000 --- a/widgetstyles/simpleLite/skin.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - 심플 라이트 - 線條樣式 - 선 하나만으로 꾸며진 위젯스타일 입니다. - 可變換多種線條外框的控件樣式。 - 0.1 - 2009-03-10 - preview.gif - - sol - sol - sol - sol - sol - sol - - - - - 스타일 - 樣式 - - widgetBoxA - 심플 라이트 - 分隔線 - - - - 제목 - 栏目图片 - 標題圖片 - 제목 이미지를 등록합니다. - 栏目名可以使用图片。 - 可使用圖片取代標題。 - - - 제목 - 栏目名 - 標題 - 제목 텍스트 - 输入文本形式的栏目名。 - 請輸入標題文字。 - - - 제목 글자색 - 栏目字体色 - 標題顏色 - - - 아이콘 이미지 - 栏目图标 - 標題圖示 - 제목 앞 아이콘 이미지를 등록합니다. - 可以给栏目名指定个性图标。 - 可指定標題前方的圖示。 - - - - 더보기 URL - 查看更多(链接) - more URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - - - 더보기 이미지 - 查看更多(图片) - more Image - - - 더보기 텍스트 - 查看更多(文本) - more TEXT - 더보기 텍스트 - 文本形式的"查看更多"。 - 純文字格式。 - - - \ No newline at end of file diff --git a/widgetstyles/simpleLite/widgetstyle.html b/widgetstyles/simpleLite/widgetstyle.html deleted file mode 100644 index a97301df8..000000000 --- a/widgetstyles/simpleLite/widgetstyle.html +++ /dev/null @@ -1,44 +0,0 @@ - -
    -
    - - - -

    ws_title_color)-->style="color:{$widgetstyle_extar_var->ws_title_color};"> - - - - - - - - - {$widgetstyle_extar_var->ws_title} - - -

    - - - {$widget_content} - - - - - - - {$widgetstyle_extar_var->ws_more_text} - - more - - - - - - - - - - - -
    -
    \ No newline at end of file diff --git a/widgetstyles/squareFace/css/widgetBoxStyle.css b/widgetstyles/squareFace/css/widgetBoxStyle.css deleted file mode 100644 index 61233bb74..000000000 --- a/widgetstyles/squareFace/css/widgetBoxStyle.css +++ /dev/null @@ -1,36 +0,0 @@ -@charset "utf-8"; -/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ - -.widgetBoxContainer{ position:relative;} - -.widgetBox{ position:relative;} -.widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} -.widgetBox .widgetContainer{ position:relative; z-index:10;} -.widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} -.widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} -.widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} -.widgetBox .rcTop .tl{ top:0;} -.widgetBox .rcTop .tr{ top:0;} -.widgetBox .rcBottom .bl{ top:0;} -.widgetBox .rcBottom .br{ top:0;} - -.widgetBoxJgray .widgetBox{ background:#efefed; padding-bottom:5px; background-image:url(../img/widgetBgJgray.gif); background-repeat:repeat-x;} -.widgetBoxJgray .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} -.widgetBoxJgray .widgetMore{ top:10px; right:15px;} -.widgetBoxJgray .rcContainer{ display:none !important;} - -.widgetBoxJred .widgetBox{ background:#f9e3e0; padding-bottom:5px; background-image:url(../img/widgetBgJred.gif); background-repeat:repeat-x;} -.widgetBoxJred .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} -.widgetBoxJred .widgetMore{ top:10px; right:15px;} -.widgetBoxJred .rcContainer{ display:none !important;} - -.widgetBoxJgreen .widgetBox{ background:#d7fcd3; padding-bottom:5px; background-image:url(../img/widgetBgJgreen.gif); background-repeat:repeat-x;} -.widgetBoxJgreen .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} -.widgetBoxJgreen .widgetMore{ top:10px; right:15px;} -.widgetBoxJgreen .rcContainer{ display:none !important;} - -.widgetBoxJblue .widgetBox{ background:#e6e6f7; padding-bottom:5px; background-image:url(../img/widgetBgJblue.gif); background-repeat:repeat-x;} -.widgetBoxJblue .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} -.widgetBoxJblue .widgetMore{ top:10px; right:15px;} -.widgetBoxJblue .rcContainer{ display:none !important;} diff --git a/widgetstyles/squareFace/img/widgetBgJblue.gif b/widgetstyles/squareFace/img/widgetBgJblue.gif deleted file mode 100644 index ffbd7de9739db905f960aa4ebdf079b5d1782519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZ?wbhEHbWMnX6IKsg2;KA2>_r5%Q{O$JL&kyc>dHnF(t=pgP-v09B@wb~dKivkh z?|ymq?EAw9U$0&J`0(M^$B)0=y9<>4e)IaLn>RmSzy9gkwNJNheSY%fI|DYL_>%=J ztOFuJb~3Q4EqEM}66zZ~RYjz9@AQQlhc~*E3kWb=FzI)9WN1`S5$Xv#nb5+(U=09} Ca$ diff --git a/widgetstyles/squareFace/img/widgetBgJgray.gif b/widgetstyles/squareFace/img/widgetBgJgray.gif deleted file mode 100644 index c0d1e5879723a10ce873b797c6f1e57bf800b540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmW-atqQ_W7>19atQZyyR;Pl&Gz=5diZU<=qF^)#7O%o9@D5DghbRaJy#=?O^L^(# zf6F%A-tau|ly{a)qw%)JLUv~iM5YK7p*4yKBnjuNvl^uUks7PDLXtp)N+BW#$co}$ zrIf;GLd-e;7(>n)fZSTec`8KeoMF{E-+JX?$?}sm2It+O_vkY(-mF*e<9vDb<8Jf{ UlGam%i~Y!JUT&rxoP0L<0he@S#{d8T diff --git a/widgetstyles/squareFace/img/widgetBgJgreen.gif b/widgetstyles/squareFace/img/widgetBgJgreen.gif deleted file mode 100644 index c20db7920908e9d3c71e0203dd8f3c23c9a05c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZ?wbhEHbWMnX6IKsei`uCC3zmFaJb@tpUkA?rK6(Am<&(b-U;BOW%YwzJ-I}iNadGYt@Ykw{> zU;xFREMPGm5DBuAfmJQxa?Fxc$*G~CJezg;lwBqkF*qB%J@Prhfk)MGp@Pb!9;4s} I2PXz=0I#)GGynhq diff --git a/widgetstyles/squareFace/img/widgetBgJred.gif b/widgetstyles/squareFace/img/widgetBgJred.gif deleted file mode 100644 index 887f1027c2e30ba6ffaacc2b887c586f0ae3838d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmZ?wbhEHbWMnX6IKsg2?b^j3cW(Z8aOcOp+uv_q{`v61kK5P2U%&G0`sHtz&;5LG z=ljiTKOWrvcIEuf#}9r!xcB4U&F{CbeY&4UGuATpW{qm1H*T3Jq^7Z1GZ0SoAWNRXWjtm+R;5>wLDW~!L-x-v2Zg&rx4JuT$gmdeV=k)n`bAkyES Mwo=nVMv=i90OUGX{{R30 diff --git a/widgetstyles/squareFace/preview.gif b/widgetstyles/squareFace/preview.gif deleted file mode 100644 index 7d7db7f6224bfc20c41f2805769ba2ff35e8c2da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2022 zcmVFn+6>gng}>gVR=;_mM4?(OU5<>CMT z|LyGR>FMU`>E`L_=jiC==jY_-=i}(<<>~0=jX(hB=;Z(aX8-_b=jX_2002M$002OX zt>@#dX#fBKKR}Jh002Pf=*W&h0BNn{=gW)B=i{#E<;#sf=H|%h=&a}GssKQYX|Cnx zt!MxMX=(rftmfmb=j5zu0I%rg%#J_+X{yWTE+Dm<*n%D=H|xe>B!5D zKn&jm+h&=Hlq+tIUr;uIc5D%;o6mt7)(0jmqNyK#k1k=F8~i zuWA55kI0S7gVh0=g43%<>le-?(6^n0PpYZA^8LV00000EC2ui z0AK)M000O7fOvv~goTEOh>41ejE#6n+*(>hbdP^zkx&eqG~P_+#T}8vM**=MG*ug74~~yXV0RI)n!0 zWbm_L%DDg-Giuzp1>XmZ_x#kr*wK$06zwd)*oe~I%8f8%g7o8oNz9fiF;baWQKnCg zZvu{N=`sMnnm=*A{OOaSO_)k`@|*%Qg4L^7vtnqsp#+J5G^K2%SYm8fs~zyEwZH+b zT6}E(t$tNo!|mI+SI6R2!Lx*1uvr6VP0QAdpE6+ljNmIWf?21_-EAt6mKuvxgg*KcxLI_X7m8HfrB)cOga#kGuW!W^5b6Z^aNg z-(Vg5t=bJXh%=v_dhUp{BYxNT{W>`G%*e;~20tQr@8jhm=vK~Ld<@j1ZJne*AYJZ#yvPAc6%l=o~&nRFIZ~`B8X*f%;9P zpoMBZVB(1=rf4D-eyAa!2}bxwhaXj#7=j3Xte^u8_^|N6jl!A0qaQv3d4UN*^r+(h z11y4&#F9puU}B6p>X0OnOJ<4UkTm{?BZfBOsN#PUIzI?Ktn9aqmxjYDdhuH z>bRyKZ9X8uo_zM{=bm@^5yhTI;N#?;JqY0k5IH2eXbyK?fP@kgF-oa$NJvnqA4?!A zM5k8{`lq9k?s+Mrn&Q*x1gy5|>Z`1#@B%(uuzChQF3iBH7FYPugcB3UiVtFbx0hi0}+Uv5y{u(Q?3}mbAw%m5>?YH1|`^6f5#1Zbf=ziP4y6m>=?z`~D zEAP5cw6Sg)_`osmzWm1Pz`p=83#A)u)zdGEb+t?S8VbB#TaL- z@x~leT*t>Chb;2QB$sUR$tb6+^2#i??DESne_X)KG}mnN%{b?*^Ugf??6b{w1TFN? zL>F!J(MTt)^wLZ>?ex=7M=f>GcT{cl)mUe(_10W>?e*7Shb{KlWS4Dr)e5Ao_S$T> z?e^Pn$1V5Vbh9nM-FWA%_uhQ>?f2h+2QIkY3lwhn;fN=$_~MK=?)c-7BR;_7lvi%~ z<(Ox#`R1H=?z!c9gf9B%q?c~`>8Pi!`s%E=?)vMn$1Z#52-I%-?YQTz`|iB=?)&e+ z{Pfpv|NZ#qumAr1_wT>`e+Zxe2S~sGUI-rpJfI&4s1^Y(uz-JP z;9C;dKm$VXfDweC1{qku2X4@V8U$en6X-w^W^jWXMBxWVh(ZryP=p+OpbJe1Lkphp zhAL#C2}78}8rpDyAPk}nSvbQSUJ!!@RA3MhI7A96u!%C{;SGIg#46&jgg<1W6@_?3 zEEds+5lw%pWxW_+MGK{cnp#u#$%QX7&kiGuF4II`p9sji^K?O3_e~@|g#9 z=Q$C0P*x6-p#2OdLq|%?HKMbjY!s;u0m?&kc2l0|)Fm-hN>e~4^Q7^dr#kaF&0X>n zqma}mOs}~~f0A*b4aF%Pb=pazDwUljwWUk@xlW(9^Nd78jp{kASx}YcQmW2;=`nwb zOOh56lCu1$A`^<%uCleAHLW0A?Fr9{+V!q@&8uGb%GbX7^{;>ptY8OA*uolCg@FJ7 EI~9IhSpWb4 diff --git a/widgetstyles/squareFace/skin.xml b/widgetstyles/squareFace/skin.xml deleted file mode 100644 index 7f2558c62..000000000 --- a/widgetstyles/squareFace/skin.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - 스퀘어 페이스 - 彩色框樣式 - 각진 면으로 꾸며진 위젯스타일 입니다. - 可變換多種色彩外框的控件樣式。 - 0.1 - 2009-03-10 - preview.gif - - sol - sol - sol - sol - sol - sol - - - - - 스타일 - 樣式 - - widgetBoxJgray - 회색 - - - widgetBoxJred - 빨강 - - - widgetBoxJgreen - 초록 - - - widgetBoxJblue - 파랑 - - - - 제목 - 栏目图片 - 標題圖片 - 제목 이미지를 등록합니다. - 栏目名可以使用图片。 - 可使用圖片取代標題。 - - - 제목 - 栏目名 - 標題 - 제목 텍스트 - 输入文本形式的栏目名。 - 請輸入標題文字。 - - - 제목 글자색 - 栏目字体色 - 標題顏色 - - - 아이콘 이미지 - 栏目图标 - 標題圖示 - 제목 앞 아이콘 이미지를 등록합니다. - 可以给栏目名指定个性图标。 - 可指定標題前方的圖示。 - - - - 더보기 URL - 查看更多(链接) - more URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - - - 더보기 이미지 - 查看更多(图片) - more Image - - - 더보기 텍스트 - 查看更多(文本) - more TEXT - 더보기 텍스트 - 文本形式的"查看更多"。 - 純文字格式。 - - - \ No newline at end of file diff --git a/widgetstyles/squareFace/widgetstyle.html b/widgetstyles/squareFace/widgetstyle.html deleted file mode 100644 index a97301df8..000000000 --- a/widgetstyles/squareFace/widgetstyle.html +++ /dev/null @@ -1,44 +0,0 @@ - -
    -
    - - - -

    ws_title_color)-->style="color:{$widgetstyle_extar_var->ws_title_color};"> - - - - - - - - - {$widgetstyle_extar_var->ws_title} - - -

    - - - {$widget_content} - - - - - - - {$widgetstyle_extar_var->ws_more_text} - - more - - - - - - - - - - - -
    -
    \ No newline at end of file From 8b6023f91e5b895ae8f1303fab67222214690e55 Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 01:24:54 +0000 Subject: [PATCH 077/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5942 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- index.php | 2 +- modules/widget/tpl/js/widget.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/index.php b/index.php index 7d485ca38..80b9d91c6 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,4 @@ - diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 0c41ada41..d330ca6c0 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -79,8 +79,9 @@ function getWidgetContent(obj) { var html = ""; if(typeof(obj)=='undefined' || !obj) obj = zonePageObj; - var widget; + var widget = null; jQuery(obj).find('div[widget]').each(function(){ + if(jQuery(this).parent().get(0) != obj) return; widget = jQuery(this).attr('widget'); switch(widget) { case 'widgetBox' : From 2fc2029ecf23c8e2a5e82b85d9db28efcf4b5039 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 24 Mar 2009 01:25:13 +0000 Subject: [PATCH 078/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20simple=20=ED=8F=B4=EB=8D=94=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5943 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/simple/preview.gif | Bin 0 -> 1202 bytes widgetstyles/simple/skin.xml | 63 +++++++++++++++++++++++++++ widgetstyles/simple/style.css | 5 +++ widgetstyles/simple/widgetstyle.html | 15 +++++++ 4 files changed, 83 insertions(+) create mode 100644 widgetstyles/simple/preview.gif create mode 100644 widgetstyles/simple/skin.xml create mode 100644 widgetstyles/simple/style.css create mode 100644 widgetstyles/simple/widgetstyle.html diff --git a/widgetstyles/simple/preview.gif b/widgetstyles/simple/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..6dfd02a8df5106203beec060615a1aec10f9b402 GIT binary patch literal 1202 zcmZ?wbhEHbOkhZ0xXQr5;4$a^|NsB@m+UWLU?|xS%=}vJQv@`H6w;|A7ew9y(I}CzceQ%(0q(VMU48+Nkw6)|8!oTebheh6*3O z+2{QjIRqTCI^i#!|pgO+E^~R42g8A*vv#xM`8cs^C3tYi6tq-?UA!f_4EztpQR_sEq)t_SAdy)pN}oyI4MGbgYfXUr-)Ti1N&O5>-`jpwg$%kqAn z<^1g#=V|d%{EjZ)6gEnVFwRr7{O}=0>WJGT-K3mpm9x~2Pd9J8bI(@d_(qO-enQ^5 zmkllnA7-5V;G>o4Wx;KgvP=K&VmWut_kUiIO3~{h-4blf9Xy3Io_anro$Y_K;FiY` z<%#((Vth?!9>08&Wgm~{j+S($AVoo5k;4)Pl-AXWUR|~1!Z9s}d693IxOkVpR+y5N z&pA;eYxXJj+HHZ-r`-%Wj^#3i9s1_aajoR?yRD(#XV+}2yK>=>qNT6Mp6ypSR@_<^ zb<6nDC#~r`+g^Ni3t-SGapi65Q7q1DiWa-GVoJfoNsaR5i*Nk+^!&nN@A-avcYS@G zXP0sR+}_>a-#<9qE$_c?&(F^6^g7cs2 z(t>wbX1Fwd7Km6Nz%2DKo`ctEhe8Wq*b0{x_k;|^X11~w{~xx>7I`EJO4WHJG$`~| zJm}zcvslon)Ar&~i{iB%54$YBJ$uxt6?G%2SKsP~LNn93AIWX5T^dR~j#`?E4Ypn% zA5Ju}+L%1WMy^wNnvc)RheDj6cBJ%~mCaP?O4M4BDiUtAGNm(h(u{|_enyrl{l4c` zD$VhGrTKimzZ!>fmxoj4qh^U$9uF6^b6t7b$PnhKKBHyd&HGDdq;)M@oOR4|NuSBG zn=2N(tppSpH4ef4pvUo7(*_HjJja^Y3xtG2UAFQ0Ch5SOj9VOQQorR8(&vd^b(vzwNw zwRLaR>Q%E|Z1a4!`Tae~_dA!&ihQwcK9|<=MTbu9Sh-{MBniz!4Q7Sw4l*uZ`SOU! zZS#jK8ZSw!FOpiVt-qb8`pugY`<;05*6_|g^Rescqg#0!CI8P{F@Ni>OzjDB+imnV zO)Z+Kf8g$|)w&bJlTWXmacx>n)}9B~Y7Ca&?~_j6VZ2+%cvaA)H3kRzqvq=F(cD~B za(MBz)9 + + 심플 스트롱 + 简易控件样式 + 簡單樣式 + 선 하나만으로 꾸며진 위젯스타일 입니다. + 只有栏目名和查看更多(more)选项的简易控件样式。 + 只有標題與more按紐的簡單控件樣式。 + 0.1 + 2009-02-03 + preview.gif + + + sol + sol + sol + + + + + 컬러셋 + 颜色 + 顏色 + 컬러셋을 지정해주세요 + 请指定适当的颜色。 + 請選擇顏色。 + + 하얀색 + 白色 + 白色 + white + + + 검은색 + 黑色 + 黑色 + black + + + + 제목 + 栏目名 + 標題 + 제목 텍스트 + 请输入栏目名。 + 請輸入標題。 + + + 더보기 URL + 查看更多(链接) + more URL + http:// 포함한 URL를 등록합니다. + + + 더보기 텍스트 + 查看更多(文本) + more TEXT + 더보기 텍스트 + 文本形式的"查看更多"。 + 純文字格式。 + + + diff --git a/widgetstyles/simple/style.css b/widgetstyles/simple/style.css new file mode 100644 index 000000000..3266bcee5 --- /dev/null +++ b/widgetstyles/simple/style.css @@ -0,0 +1,5 @@ +div.simpleWidgetStyle { position:relative;margin-bottom:20px; overflow:hidden; *zoom:1;} +div.simpleWidgetStyle h2 { margin:0 0 10px 0; padding:0 0 5px 0; font:bold 16px "Malgun Gothic", AppleGothic, Dotum, Sans-serif; border-bottom:2px solid #434343;} +div.simpleWidgetStyle a.widgetMoreLink { position:absolute; top:8px; right:0; font:11px Dotum; text-decoration:none; color:#888;} +div.simpleWidgetStyle.black h2 { color:#333; } +div.simpleWidgetStyle.black h2 { color:#999; } diff --git a/widgetstyles/simple/widgetstyle.html b/widgetstyles/simple/widgetstyle.html new file mode 100644 index 000000000..09bbfbe2d --- /dev/null +++ b/widgetstyles/simple/widgetstyle.html @@ -0,0 +1,15 @@ + + {@ $_wsClassName = "black"} + + {@ $_wsClassName = "white"} + + {@ $_wsClassName = $layout_info->colorset} + + + + +
    +

    {$widgetstyle_extar_var->ws_title}

    + {$widgetstyle_extar_var->ws_more_text} + {$widget_content} +
    From e0e8e46fd9af6392d48ca3b99385452ad3f2d1bb Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 24 Mar 2009 01:37:32 +0000 Subject: [PATCH 079/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=EB=B0=95=EC=8A=A4?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=A0=88=EA=B1=B0=EC=8B=9C=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=EB=AA=85=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5944 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/preview.gif | Bin 0 -> 2022 bytes widgetstyles/colorbox/skin.xml | 92 ++++++++++++++++++++++ widgetstyles/colorbox/widgetstyle.html | 44 +++++++++++ widgetstyles/line/preview.gif | Bin 0 -> 1043 bytes widgetstyles/line/skin.xml | 81 ++++++++++++++++++++ widgetstyles/line/widgetstyle.html | 44 +++++++++++ widgetstyles/memo/css/widgetBoxStyle.css | 68 +++++++++++++++++ widgetstyles/memo/preview.gif | Bin 0 -> 2541 bytes widgetstyles/memo/skin.xml | 93 +++++++++++++++++++++++ widgetstyles/memo/widgetstyle.html | 44 +++++++++++ 10 files changed, 466 insertions(+) create mode 100644 widgetstyles/colorbox/preview.gif create mode 100644 widgetstyles/colorbox/skin.xml create mode 100644 widgetstyles/colorbox/widgetstyle.html create mode 100644 widgetstyles/line/preview.gif create mode 100644 widgetstyles/line/skin.xml create mode 100644 widgetstyles/line/widgetstyle.html create mode 100644 widgetstyles/memo/css/widgetBoxStyle.css create mode 100644 widgetstyles/memo/preview.gif create mode 100644 widgetstyles/memo/skin.xml create mode 100644 widgetstyles/memo/widgetstyle.html diff --git a/widgetstyles/colorbox/preview.gif b/widgetstyles/colorbox/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d7db7f6224bfc20c41f2805769ba2ff35e8c2da GIT binary patch literal 2022 zcmVFn+6>gng}>gVR=;_mM4?(OU5<>CMT z|LyGR>FMU`>E`L_=jiC==jY_-=i}(<<>~0=jX(hB=;Z(aX8-_b=jX_2002M$002OX zt>@#dX#fBKKR}Jh002Pf=*W&h0BNn{=gW)B=i{#E<;#sf=H|%h=&a}GssKQYX|Cnx zt!MxMX=(rftmfmb=j5zu0I%rg%#J_+X{yWTE+Dm<*n%D=H|xe>B!5D zKn&jm+h&=Hlq+tIUr;uIc5D%;o6mt7)(0jmqNyK#k1k=F8~i zuWA55kI0S7gVh0=g43%<>le-?(6^n0PpYZA^8LV00000EC2ui z0AK)M000O7fOvv~goTEOh>41ejE#6n+*(>hbdP^zkx&eqG~P_+#T}8vM**=MG*ug74~~yXV0RI)n!0 zWbm_L%DDg-Giuzp1>XmZ_x#kr*wK$06zwd)*oe~I%8f8%g7o8oNz9fiF;baWQKnCg zZvu{N=`sMnnm=*A{OOaSO_)k`@|*%Qg4L^7vtnqsp#+J5G^K2%SYm8fs~zyEwZH+b zT6}E(t$tNo!|mI+SI6R2!Lx*1uvr6VP0QAdpE6+ljNmIWf?21_-EAt6mKuvxgg*KcxLI_X7m8HfrB)cOga#kGuW!W^5b6Z^aNg z-(Vg5t=bJXh%=v_dhUp{BYxNT{W>`G%*e;~20tQr@8jhm=vK~Ld<@j1ZJne*AYJZ#yvPAc6%l=o~&nRFIZ~`B8X*f%;9P zpoMBZVB(1=rf4D-eyAa!2}bxwhaXj#7=j3Xte^u8_^|N6jl!A0qaQv3d4UN*^r+(h z11y4&#F9puU}B6p>X0OnOJ<4UkTm{?BZfBOsN#PUIzI?Ktn9aqmxjYDdhuH z>bRyKZ9X8uo_zM{=bm@^5yhTI;N#?;JqY0k5IH2eXbyK?fP@kgF-oa$NJvnqA4?!A zM5k8{`lq9k?s+Mrn&Q*x1gy5|>Z`1#@B%(uuzChQF3iBH7FYPugcB3UiVtFbx0hi0}+Uv5y{u(Q?3}mbAw%m5>?YH1|`^6f5#1Zbf=ziP4y6m>=?z`~D zEAP5cw6Sg)_`osmzWm1Pz`p=83#A)u)zdGEb+t?S8VbB#TaL- z@x~leT*t>Chb;2QB$sUR$tb6+^2#i??DESne_X)KG}mnN%{b?*^Ugf??6b{w1TFN? zL>F!J(MTt)^wLZ>?ex=7M=f>GcT{cl)mUe(_10W>?e*7Shb{KlWS4Dr)e5Ao_S$T> z?e^Pn$1V5Vbh9nM-FWA%_uhQ>?f2h+2QIkY3lwhn;fN=$_~MK=?)c-7BR;_7lvi%~ z<(Ox#`R1H=?z!c9gf9B%q?c~`>8Pi!`s%E=?)vMn$1Z#52-I%-?YQTz`|iB=?)&e+ z{Pfpv|NZ#qumAr1_wT>`e+Zxe2S~sGUI-rpJfI&4s1^Y(uz-JP z;9C;dKm$VXfDweC1{qku2X4@V8U$en6X-w^W^jWXMBxWVh(ZryP=p+OpbJe1Lkphp zhAL#C2}78}8rpDyAPk}nSvbQSUJ!!@RA3MhI7A96u!%C{;SGIg#46&jgg<1W6@_?3 zEEds+5lw%pWxW_+MGK{cnp#u#$%QX7&kiGuF4II`p9sji^K?O3_e~@|g#9 z=Q$C0P*x6-p#2OdLq|%?HKMbjY!s;u0m?&kc2l0|)Fm-hN>e~4^Q7^dr#kaF&0X>n zqma}mOs}~~f0A*b4aF%Pb=pazDwUljwWUk@xlW(9^Nd78jp{kASx}YcQmW2;=`nwb zOOh56lCu1$A`^<%uCleAHLW0A?Fr9{+V!q@&8uGb%GbX7^{;>ptY8OA*uolCg@FJ7 EI~9IhSpWb4 literal 0 HcmV?d00001 diff --git a/widgetstyles/colorbox/skin.xml b/widgetstyles/colorbox/skin.xml new file mode 100644 index 000000000..7f2558c62 --- /dev/null +++ b/widgetstyles/colorbox/skin.xml @@ -0,0 +1,92 @@ + + + 스퀘어 페이스 + 彩色框樣式 + 각진 면으로 꾸며진 위젯스타일 입니다. + 可變換多種色彩外框的控件樣式。 + 0.1 + 2009-03-10 + preview.gif + + sol + sol + sol + sol + sol + sol + + + + + 스타일 + 樣式 + + widgetBoxJgray + 회색 + + + widgetBoxJred + 빨강 + + + widgetBoxJgreen + 초록 + + + widgetBoxJblue + 파랑 + + + + 제목 + 栏目图片 + 標題圖片 + 제목 이미지를 등록합니다. + 栏目名可以使用图片。 + 可使用圖片取代標題。 + + + 제목 + 栏目名 + 標題 + 제목 텍스트 + 输入文本形式的栏目名。 + 請輸入標題文字。 + + + 제목 글자색 + 栏目字体色 + 標題顏色 + + + 아이콘 이미지 + 栏目图标 + 標題圖示 + 제목 앞 아이콘 이미지를 등록합니다. + 可以给栏目名指定个性图标。 + 可指定標題前方的圖示。 + + + + 더보기 URL + 查看更多(链接) + more URL + http:// 제외한 URL를 등록합니다. + 请输入除http://以外的URL地址。 + 請輸入http://以外的URL網址。 + + + 더보기 이미지 + 查看更多(图片) + more Image + + + 더보기 텍스트 + 查看更多(文本) + more TEXT + 더보기 텍스트 + 文本形式的"查看更多"。 + 純文字格式。 + + + \ No newline at end of file diff --git a/widgetstyles/colorbox/widgetstyle.html b/widgetstyles/colorbox/widgetstyle.html new file mode 100644 index 000000000..a97301df8 --- /dev/null +++ b/widgetstyles/colorbox/widgetstyle.html @@ -0,0 +1,44 @@ + +
    +
    + + + +

    ws_title_color)-->style="color:{$widgetstyle_extar_var->ws_title_color};"> + + + + + + + + + {$widgetstyle_extar_var->ws_title} + + +

    + + + {$widget_content} + + + + + + + {$widgetstyle_extar_var->ws_more_text} + + more + + + + + + + + + + + +
    +
    \ No newline at end of file diff --git a/widgetstyles/line/preview.gif b/widgetstyles/line/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..61d3e00589bbf4d7769009fc1121be09f3aea5e0 GIT binary patch literal 1043 zcmV+u1nm1qNk%w1VPF7Y0K@b zpnMvtS(ze-bDSEj5+i#kSX6iv6IzJ5rM(1j$e2}KRK=l%fyyGAcFf08oC;egkq})D zSPqO|qvINIe&ouCUmAW}mWEQN^mXigS=%a%1y}`m67WbG)kVuWWd*mO%Lhixmw3@0 zX{u%5UBe9R@Ss410YRHE11>xw`0SvWZYHV!6r`62A{uEE6Rl+F01<-}SS&oCB8Nc* zS0oL>Ntlv=MH4PZ&`NZaL{k$hiOs_}3tL5o3xz5(2eqU;iPX4~Ac_K1yMmHT)+r~3 zCq+bR$VS(R?%sAW74CWWl5P_R*oph zs5f&FSdKl59!C>oFKLNnHwd>cgW6PdRySDAxs&nh!&AYen-@taX_e0}xx z?bXZIo?nD}>E^+A-U{;JXWxPR-Dh9_fBq53oqx{(*j$6#MVMfE2kM6*gaG33UVjt5 z;2wnmG8n{%7#2uhha+Z~;)XC-_}_K#Wj8~M`;izQj47Zf;EyEMSYMDAmdN9RE%-Pe zcPi3HUWgyoHy(9VvR55TEbIqehzceto{7qZDduiaUP&dFG`hIrbu)r_WRqDAsH28f z5*g%|0VXNsc}3!=AcJihIUfxLCfFi{IU;E%g8v=qpqpzB=_h$}eraQ!nDWY|d8V*06pnW7q9o}{A7XQhb#8EvSk z`U>f&h7Ou5swU#ckG}#w#;OfTW-p+!cMY#a+f??>+{b*2QBo_ NL>F!J(Lsj*06SJ@=#~Hg literal 0 HcmV?d00001 diff --git a/widgetstyles/line/skin.xml b/widgetstyles/line/skin.xml new file mode 100644 index 000000000..4460cea45 --- /dev/null +++ b/widgetstyles/line/skin.xml @@ -0,0 +1,81 @@ + + + 심플 라이트 + 線條樣式 + 선 하나만으로 꾸며진 위젯스타일 입니다. + 可變換多種線條外框的控件樣式。 + 0.1 + 2009-03-10 + preview.gif + + sol + sol + sol + sol + sol + sol + + + + + 스타일 + 樣式 + + widgetBoxA + 심플 라이트 + 分隔線 + + + + 제목 + 栏目图片 + 標題圖片 + 제목 이미지를 등록합니다. + 栏目名可以使用图片。 + 可使用圖片取代標題。 + + + 제목 + 栏目名 + 標題 + 제목 텍스트 + 输入文本形式的栏目名。 + 請輸入標題文字。 + + + 제목 글자색 + 栏目字体色 + 標題顏色 + + + 아이콘 이미지 + 栏目图标 + 標題圖示 + 제목 앞 아이콘 이미지를 등록합니다. + 可以给栏目名指定个性图标。 + 可指定標題前方的圖示。 + + + + 더보기 URL + 查看更多(链接) + more URL + http:// 제외한 URL를 등록합니다. + 请输入除http://以外的URL地址。 + 請輸入http://以外的URL網址。 + + + 더보기 이미지 + 查看更多(图片) + more Image + + + 더보기 텍스트 + 查看更多(文本) + more TEXT + 더보기 텍스트 + 文本形式的"查看更多"。 + 純文字格式。 + + + \ No newline at end of file diff --git a/widgetstyles/line/widgetstyle.html b/widgetstyles/line/widgetstyle.html new file mode 100644 index 000000000..a97301df8 --- /dev/null +++ b/widgetstyles/line/widgetstyle.html @@ -0,0 +1,44 @@ + +
    +
    + + + +

    ws_title_color)-->style="color:{$widgetstyle_extar_var->ws_title_color};"> + + + + + + + + + {$widgetstyle_extar_var->ws_title} + + +

    + + + {$widget_content} + + + + + + + {$widgetstyle_extar_var->ws_more_text} + + more + + + + + + + + + + + +
    +
    \ No newline at end of file diff --git a/widgetstyles/memo/css/widgetBoxStyle.css b/widgetstyles/memo/css/widgetBoxStyle.css new file mode 100644 index 000000000..963415ca1 --- /dev/null +++ b/widgetstyles/memo/css/widgetBoxStyle.css @@ -0,0 +1,68 @@ +@charset "utf-8"; +/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ + +.widgetBoxContainer{ position:relative;} + +.widgetBox{ position:relative;} +.widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} +.widgetBox .widgetContainer{ position:relative; z-index:10;} +.widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} +.widgetBox .widgetMore img{ border:0;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} +.widgetBox .rcTop .tl{ top:0;} +.widgetBox .rcTop .tr{ top:0;} +.widgetBox .rcBottom .bl{ top:0;} +.widgetBox .rcBottom .br{ top:0;} + +.widgetBoxIyellow{ padding-top:50px;} +.widgetBoxIyellow .widgetBox{ background:#fdf59b; padding-top:10px; padding-bottom:5px;} +.widgetBoxIyellow .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} +.widgetBoxIyellow .widgetContainer{ margin-top:-50px;} +.widgetBoxIyellow .widgetMore{ top:-31px; right:50px;} +.widgetBoxIyellow .rcContainer{ position:absolute;} +.widgetBoxIyellow .rcTop{ top:-50px; height:50px;} +.widgetBoxIyellow .rcBottom{ display:none !important;} +.widgetBoxIyellow .rc { width:50%; background-image:url(../img/widgetBoxIyellow.png); _background-image:url(../img/widgetBoxIyellow.gif); background-repeat:no-repeat;} +.widgetBoxIyellow .rcTop .rc{ height:50px;} +.widgetBoxIyellow .rcTop .tl{ background-position:0 0;} +.widgetBoxIyellow .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} + +.widgetBoxIred{ padding-top:50px;} +.widgetBoxIred .widgetBox{ background:#fd9bda; padding-top:10px; padding-bottom:5px;} +.widgetBoxIred .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} +.widgetBoxIred .widgetContainer{ margin-top:-50px;} +.widgetBoxIred .widgetMore{ top:-31px; right:50px;} +.widgetBoxIred .rcContainer{ position:absolute;} +.widgetBoxIred .rcTop{ top:-50px; height:50px;} +.widgetBoxIred .rcBottom{ display:none !important;} +.widgetBoxIred .rc { width:50%; background-image:url(../img/widgetBoxIred.png); _background-image:url(../img/widgetBoxIred.gif); background-repeat:no-repeat;} +.widgetBoxIred .rcTop .rc{ height:50px;} +.widgetBoxIred .rcTop .tl{ background-position:0 0;} +.widgetBoxIred .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} + +.widgetBoxIgreen{ padding-top:50px;} +.widgetBoxIgreen .widgetBox{ background:#9bfda3; padding-top:10px; padding-bottom:5px;} +.widgetBoxIgreen .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} +.widgetBoxIgreen .widgetContainer{ margin-top:-50px;} +.widgetBoxIgreen .widgetMore{ top:-31px; right:50px;} +.widgetBoxIgreen .rcContainer{ position:absolute;} +.widgetBoxIgreen .rcTop{ top:-50px; height:50px;} +.widgetBoxIgreen .rcBottom{ display:none !important;} +.widgetBoxIgreen .rc { width:50%; background-image:url(../img/widgetBoxIgreen.png); _background-image:url(../img/widgetBoxIgreen.gif); background-repeat:no-repeat;} +.widgetBoxIgreen .rcTop .rc{ height:50px;} +.widgetBoxIgreen .rcTop .tl{ background-position:0 0;} +.widgetBoxIgreen .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} + +.widgetBoxIblue{ padding-top:50px;} +.widgetBoxIblue .widgetBox{ background:#9bf4fd; padding-top:10px; padding-bottom:5px;} +.widgetBoxIblue .widgetBoxHeader{ position:relative; padding:3px 0; text-indent:15px; margin-top:-50px !important; margin-bottom:50px !important;} +.widgetBoxIblue .widgetContainer{ margin-top:-50px;} +.widgetBoxIblue .widgetMore{ top:-31px; right:50px;} +.widgetBoxIblue .rcContainer{ position:absolute;} +.widgetBoxIblue .rcTop{ top:-50px; height:50px;} +.widgetBoxIblue .rcBottom{ display:none !important;} +.widgetBoxIblue .rc { width:50%; background-image:url(../img/widgetBoxIblue.png); _background-image:url(../img/widgetBoxIblue.gif); background-repeat:no-repeat;} +.widgetBoxIblue .rcTop .rc{ height:50px;} +.widgetBoxIblue .rcTop .tl{ background-position:0 0;} +.widgetBoxIblue .rcTop .tr{ background-position:right 0; left:50%; *left:auto; _left:50%; right:auto; *right:0; _right:auto;} diff --git a/widgetstyles/memo/preview.gif b/widgetstyles/memo/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e596a1f1925130a3f5ec9a6a9033042f1a93eee GIT binary patch literal 2541 zcmV{4Nk%w1VPF7Y0OkMy{q&df?XvObe*jHcme7m+^p^Vd!1(TpP`tp&vYykQ2jrZ<|T>t>?(K%l=14S?&N{=>xa7UjP~t_@aUS8&Z_?U&GqoL001fc z_r>VmdiU;)`|_0TD_MW;ep$dC+_E_akP!;;gjOodhOzSMUs2+>4f&} zjON^U002hr<%Ib1y7=?F{{8gc)_MH+$Jfqr^y-N0%JS)m`m{j#@R9oQd->B=_OUW268%k=Aa`|^+I-E#Wz zkKosM@aBE*<$e0`jqc@+^X|Fb(rowcdi(do{q>sv|Nj600R8owA^8LV00000EC2ui z0AK)M000O7fE9v+goTEOh>40jjDn0|EKV{Qdk4bt*u@mZQaCGy!-o(f zN}Nb>qJW0tGLUd0OtbIxd9!$8f;lqd%Cl1-qTn}*8h=s~iTl3uV4cvkI z`19-E&%eL_|FU&4MjCfCV89+NxEG&Um)QfGF-k-z;e-?_5rH2VW;j3x6?WL+g)9&- z;eE1s@WvE=0I|dnAbPPNRUs9394j7rc%dISC~*b_ehlzHjX;7Z;)oN-c4CT4e9+?m z9_^jgU0*zb2M&-G-k76>7+y(bm41Xs;eA$|zy=aypn%5;EgFbmcTf5?1bq;0DWR1S z+JGSs5t5N1juKYEV}?B3m?01*C~?67R#@@Gkvjtmm+F~tUW%E#H|4YutKi9_Udae!AQAEvg{hWte&7s zKy9(`^6+Vw1h|WDv8X<30=GT}AtV?#ggfpE<)Ry`8gQ!8Zo7`|D{q$c-dXDZp4DC} z0TfUadnptEKQM-nGk}3W!Qzg)>kuqkHG~ikYLdXrG}ml%0#@Ek?acKi0LR7M3R!cp zc6?!n8M8is1j#d$d~&!c?n#* zp98YTzy1v&fB`h11~*tfID8Lw$hyD_U!)mf(NRjhyiZ zSZJgg^ALwSxS;^BjHN7R3Clh0NtU+E&@6RX%NvS-h8fzxo|1>PJ>BOCeh|zNGmykc zq*4ml3qdIWK+S4e^P1H312(mZO>1(qo7wc^FM(-8KWyN8en_4iB;W@qT)+<{Y(o!9 zX-XGdBLvdC0yy{i&1&|uo8Qc(HvO>44*0>KS2X82)2RU1`C(&zIDil0nT1k1;i6}Z zL>#WbhmLymqaf|5A3{3Pkb1PFCOs)82`U0}DwLe(RDd7kz=el4&j)OXUJsC{k&SR9 z3>-~qN(G8iqGITy89FH~3t&_~L?H?a)q)oM0D(2kvfWlUD+SM^ofqq#qt6+zU*0b{ApV!<| zHERigSi%*qFn~c_@0wS=`hcrlD8XRWN>rrUlB7o!X-fB*O>dT#nsJRnWMOdEGH}eY znJAtf8fCQf~{=Zl)Fn!6hzk_hi=E zdbXs?6{>Ydd(G&2_q*T?E&#$y-twBaqkl-Rde_U|_PY1I@Qts0=S$!Ex>ulo@WXod zq+b2rx4r&lZ-8@|-T>S8!1NvPehYkG12Y)F{rxZhf+xJ-{6_e}1aAEOzmMVNBx<%b2J=W-*RutmFFf zILAdEa*UT;jjVvYpK==QhLl#4$ed zo*DgUL2J0q7RK_0G5uvqOSsYRg)yWz?dL56I?fsH@~HzoYEJ*T!*ovdi!1EvS96)v zk0x@7C7tJ{B3jq7Ry3#|Tx&L08P>ZFHGY#yjpRNbo62gI^N@*L>`p72zm5iQqJiyW zTYLN4;10LA$4%~XoBQ18PPe+(&F*%)``z%4x4h>~?|R$&-uTY9zW2@Ve*62}fdBwI Dj~_R^ literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/skin.xml b/widgetstyles/memo/skin.xml new file mode 100644 index 000000000..9a87ab825 --- /dev/null +++ b/widgetstyles/memo/skin.xml @@ -0,0 +1,93 @@ + + + 포스트잇 페이스 + 留言樣式 + 메모지 처럼 꾸며진 위젯스타일 입니다. + 可變換多種留言外框的控件樣式。 + 0.1 + 2009-03-10 + preview.gif + + sol + sol + sol + sol + sol + sol + + + + + 스타일 + 樣式 + + widgetBoxIyellow + 노랑 + 黃色 + + + widgetBoxIred + 빨강 + + + widgetBoxIgreen + 초록 + + + widgetBoxIblue + 파랑 + + + + 제목 + 栏目图片 + 標題圖片 + 제목 이미지를 등록합니다. + 栏目名可以使用图片。 + 可使用圖片取代標題。 + + + 제목 + 栏目名 + 標題 + 제목 텍스트 + 输入文本形式的栏目名。 + 請輸入標題文字。 + + + 제목 글자색 + 栏目字体色 + 標題顏色 + + + 아이콘 이미지 + 栏目图标 + 標題圖示 + 제목 앞 아이콘 이미지를 등록합니다. + 可以给栏目名指定个性图标。 + 可指定標題前方的圖示。 + + + + 더보기 URL + 查看更多(链接) + more URL + http:// 제외한 URL를 등록합니다. + 请输入除http://以外的URL地址。 + 請輸入http://以外的URL網址。 + + + 더보기 이미지 + 查看更多(图片) + more Image + + + 더보기 텍스트 + 查看更多(文本) + more TEXT + 더보기 텍스트 + 文本形式的"查看更多"。 + 純文字格式。 + + + \ No newline at end of file diff --git a/widgetstyles/memo/widgetstyle.html b/widgetstyles/memo/widgetstyle.html new file mode 100644 index 000000000..a97301df8 --- /dev/null +++ b/widgetstyles/memo/widgetstyle.html @@ -0,0 +1,44 @@ + +
    +
    + + + +

    ws_title_color)-->style="color:{$widgetstyle_extar_var->ws_title_color};"> + + + + + + + + + {$widgetstyle_extar_var->ws_title} + + +

    + + + {$widget_content} + + + + + + + {$widgetstyle_extar_var->ws_more_text} + + more + + + + + + + + + + + +
    +
    \ No newline at end of file From 76bcf88eaf7a19fb23dee459ec319882176b87b5 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 24 Mar 2009 01:42:17 +0000 Subject: [PATCH 080/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=EB=B0=95=EC=8A=A4?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=A0=88=EA=B1=B0=EC=8B=9C=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=EB=AA=85=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5945 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/css/widgetBoxStyle.css | 36 ++++++++++++++++++++ widgetstyles/line/css/widgetBoxStyle.css | 20 +++++++++++ 2 files changed, 56 insertions(+) create mode 100644 widgetstyles/colorbox/css/widgetBoxStyle.css create mode 100644 widgetstyles/line/css/widgetBoxStyle.css diff --git a/widgetstyles/colorbox/css/widgetBoxStyle.css b/widgetstyles/colorbox/css/widgetBoxStyle.css new file mode 100644 index 000000000..61233bb74 --- /dev/null +++ b/widgetstyles/colorbox/css/widgetBoxStyle.css @@ -0,0 +1,36 @@ +@charset "utf-8"; +/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ + +.widgetBoxContainer{ position:relative;} + +.widgetBox{ position:relative;} +.widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} +.widgetBox .widgetContainer{ position:relative; z-index:10;} +.widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} +.widgetBox .widgetMore img{ border:0;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} +.widgetBox .rcTop .tl{ top:0;} +.widgetBox .rcTop .tr{ top:0;} +.widgetBox .rcBottom .bl{ top:0;} +.widgetBox .rcBottom .br{ top:0;} + +.widgetBoxJgray .widgetBox{ background:#efefed; padding-bottom:5px; background-image:url(../img/widgetBgJgray.gif); background-repeat:repeat-x;} +.widgetBoxJgray .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} +.widgetBoxJgray .widgetMore{ top:10px; right:15px;} +.widgetBoxJgray .rcContainer{ display:none !important;} + +.widgetBoxJred .widgetBox{ background:#f9e3e0; padding-bottom:5px; background-image:url(../img/widgetBgJred.gif); background-repeat:repeat-x;} +.widgetBoxJred .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} +.widgetBoxJred .widgetMore{ top:10px; right:15px;} +.widgetBoxJred .rcContainer{ display:none !important;} + +.widgetBoxJgreen .widgetBox{ background:#d7fcd3; padding-bottom:5px; background-image:url(../img/widgetBgJgreen.gif); background-repeat:repeat-x;} +.widgetBoxJgreen .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} +.widgetBoxJgreen .widgetMore{ top:10px; right:15px;} +.widgetBoxJgreen .rcContainer{ display:none !important;} + +.widgetBoxJblue .widgetBox{ background:#e6e6f7; padding-bottom:5px; background-image:url(../img/widgetBgJblue.gif); background-repeat:repeat-x;} +.widgetBoxJblue .widgetBoxHeader{ position:relative; padding:7px 0; text-indent:15px; border-bottom:1px solid #fff;} +.widgetBoxJblue .widgetMore{ top:10px; right:15px;} +.widgetBoxJblue .rcContainer{ display:none !important;} diff --git a/widgetstyles/line/css/widgetBoxStyle.css b/widgetstyles/line/css/widgetBoxStyle.css new file mode 100644 index 000000000..6cfa2d31b --- /dev/null +++ b/widgetstyles/line/css/widgetBoxStyle.css @@ -0,0 +1,20 @@ +@charset "utf-8"; +/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) */ + +.widgetBoxContainer{ position:relative;} + +.widgetBox{ position:relative;} +.widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} +.widgetBox .widgetContainer{ position:relative; z-index:10;} +.widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} +.widgetBox .widgetMore img{ border:0;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} +.widgetBox .rcTop .tl{ top:0;} +.widgetBox .rcTop .tr{ top:0;} +.widgetBox .rcBottom .bl{ top:0;} +.widgetBox .rcBottom .br{ top:0;} + +.widgetBoxA .widgetBoxHeader{ position:relative; padding:4px 0; margin:1px; border-bottom:1px solid #ccc;} +.widgetBoxA .widgetMore{ top:10px; right:0; color:#888;} +.widgetBoxA .rcContainer{ display:none !important;} From 9e80cf561ebf904f09a0567a225d7f2a2aa9e654 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 24 Mar 2009 01:46:58 +0000 Subject: [PATCH 081/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=20=EB=B0=95=EC=8A=A4?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=A0=88=EA=B1=B0=EC=8B=9C=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=EB=AA=85=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5946 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/memo/img/widgetBoxIblue.gif | Bin 0 -> 6638 bytes widgetstyles/memo/img/widgetBoxIblue.png | Bin 0 -> 4681 bytes widgetstyles/memo/img/widgetBoxIgreen.gif | Bin 0 -> 6464 bytes widgetstyles/memo/img/widgetBoxIgreen.png | Bin 0 -> 5040 bytes widgetstyles/memo/img/widgetBoxIred.gif | Bin 0 -> 6519 bytes widgetstyles/memo/img/widgetBoxIred.png | Bin 0 -> 4959 bytes widgetstyles/memo/img/widgetBoxIyellow.gif | Bin 0 -> 6648 bytes widgetstyles/memo/img/widgetBoxIyellow.png | Bin 0 -> 4661 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 widgetstyles/memo/img/widgetBoxIblue.gif create mode 100644 widgetstyles/memo/img/widgetBoxIblue.png create mode 100644 widgetstyles/memo/img/widgetBoxIgreen.gif create mode 100644 widgetstyles/memo/img/widgetBoxIgreen.png create mode 100644 widgetstyles/memo/img/widgetBoxIred.gif create mode 100644 widgetstyles/memo/img/widgetBoxIred.png create mode 100644 widgetstyles/memo/img/widgetBoxIyellow.gif create mode 100644 widgetstyles/memo/img/widgetBoxIyellow.png diff --git a/widgetstyles/memo/img/widgetBoxIblue.gif b/widgetstyles/memo/img/widgetBoxIblue.gif new file mode 100644 index 0000000000000000000000000000000000000000..f45bfdf386f7a0cd1b17dc468770b57af3ffa841 GIT binary patch literal 6638 zcmb8zX;c#kwkPngm{5vHsinwXN+}{*wA#uhQWho1KDLeQP?n_>qVmv21cb=G69FNF z01?^Ou!kgs2nZnrh>8$GfUt)ogb=c?uU^lY^Jd=kJ7?y8x*zX3|Nprke$KaUTHE}J zI&cxNkqAg$Va2a;GT4I7?Y&ecKXH?r&y!~Fi1T(O*|b%XMEQ?t8kR4Pn_o*}?xiw# ziCeoerRsw~n#|lw*x(jzaZC8}#v8;-*!;&d- zwngA2MkbR_6i70*ctxws(mnY{k-TR|Fe;Wmqi+ofWp8-$Jg)fF!bUbnn8p?)tgv#p z;=)~N9DOTmm6guqr7?JUTcMG_Z zg!P@L6El!Mmo?6t9Wi)qJ9kI&W>=QAEy~yyX0nBuf8N8`O=j^6_T+^;IaHu15GbN& zmrD7HQh}mqPhP~67x3gId-4Llyo9eP6evpe6oq^8T#gvBE6rvLb2#F+d-5!{Fne1R zzqVbxCx;0Xxx13Q9cczfl({V^;mM$Uc_Cks!4?+t7muRX10Eqxgz@PIUnE*g4uv$`bN@`kqMrKxaPHtX4O*6&{kQ@AhryxYk0YamG2%F>(m*ZZQ__ta zSFRWuS^`WG7Z#W3%gY99>l>SlEhdY-&Dr7Z^7i-wp-3!|%H#^A3ZSvy&;^P3kgRpY zB9MT5H$`$U?UiC3s?@~C8(Effj-}L7!!&@EIV}<5_YYZIgsBwGke9!nBrrEa8p)4b} zp60pEurG~4<2^0&y^*R_V!2yy>jEZbkGU}3+qN_S);M77jzTUEWgIydOtNl1y#M0+ zxiH9MjcL! z5z+eln0gXn{V>etX~p2cfJy}bn$y9W$HM5ZwNBU5leDie=*hY_&6iV-`h+c~>OH7m zPBV;VET@~MnXhD+6^E^4n%CB^WLfqwR;gvR&|k2 z_*M<{LE}~}Jes*xhe)$v)>jvYGaKq_8<~yGJxpd3a>Rnw+%*%>B z4w~J=;$XNV=XS9CnMXVQ;*F*qoLtD-832GRxp>Xv5!?@2XPUW#+E>}!Azf$7-QlBm zBX(6E^&U3wju^gR?~a z-5iAG8J7?H{kchcBn0p(;e$>rH`!GCotCr9;9(dy#oYbf{=0<1V`y%wRn9x@hb}|< zRBoCz>7C9C!jQ3)o9?K6Z{P2ZU_)Jm7C`T(9v{H<@$HBNZTz84gyTmG|J^KKQq{3u z!p94-yV;@I@AXDqMlQm3bHd!;>(3HKuAp~wBXiyxZn})xQg`!WNbikBgi#0SZa!GM z+7xt)a6_L5$#Abed3=m;)0X!Jl2dJV=GK_2Kd%5vsy=;nY|JzEwknTV_(9`>71jif z$lTR9di3hudUF)-Ei$LZ^5Ly3_uqq2NVQjb$0nY{?v>HC>#Rp_O-8}?;0*UV+u5b{i z^VU=>b+1Ak_`q<*6kxb!8s%!HZt=HUKYU|_c$r#|bmKUYoMy{^r<+^vbjI~lmOsBr zZ=(L@RpO_-SpIv{gAFduuAd8F{AzQL2G_g9&&6ndja6=g`$N|+Fe<;+dZNMe1@TLT zlwap~u+cl+b-GGlQ19Z=c)Nr+U27|7@Xl?#Q|J1%(C3Y&jY@A_%hSgDOe^3SfA7S@ z3dflan4me#qsf1kIMag`v_$4M1#Y^|qN#$`n2Dxf5pfnL6|{j5Hiv@TD1-V!WQIrc zz2oDQ5nEw9B)9qg8Mis2zpw*3(fr`*_}pZyuoH2xCCu54`WYtds`qFKzdKHyLHi(Y zBa;nXz{%g|gaT}TJ8AK3ywg1EJ9Cg$Yh=0`ZAD*%B6ze$m5kFiY(;(K+}7uHZVOC* z5t=g58r?g-z=;)M=m*YC`nkDn@tbZ-QmP0io@h%DjV~#s zq5*&o5)5*us~d>%TAs+HkX<7W|+P{wiewRvVH#C)xy_0apECUo%Rf8 z_m#tC;$d^o_N=?4m17w3N2|Q{oQLkK`t#xu>&f=K7o=5VnRwJurvsAizIM_;LU8fy zC@3MVowk#VdFOQ$)w!=*1W1U!lO4sqr1cANlJQWTPUxun#>FxT$E@$`&v@=;1;|(QrcfhSCwKGWXT|+U^yFTJOup%O2u)7+E8K>Ms9O`E{ zdr3c+Df#tY{mi>l(ix0WfXwe_KlGAO=aoX#R6pm%lx$I^6yXoyxanT<6$6!+;DzIr zOvyLwR1$JNj$h}cU*~EeZ2kJE@9SgM zueBhrf8?q^#A`%sL>z}WS#cA9XP#YhP9&ZB#odO3sEIm5m= zBQZGyXbusTL!#tNigU<%xu30br+ss0P+7K++<5NOle!w&$AA6a#Xea}mAHHL@xMiT zYlGFGAe~uC9!H$V)ywBu=ktB@g)#YJXucGcFQ?=y#rc2}5Oo`frXK|O5~5WK*`Emk zA~b+VkS+2VjqpIXSYugib{zsR3XNP3%li_Y$VNd<+7y`i6`X!qU|w2a(N|zOS8zd6 zV0EJKqD|ptzrrgo3#}XSBO$qV&Kf6mBQ@>@94|e8qVG+rdE%GTY6IOM_qifZNs;%7 zx3_KH-tl|u^YX24>0AH4w}EqSgC%c6PZZy?DZcMl{NQDASZQ&1Uvb1-@e@gLHN)jX`;1kd!8)%9jH0>ocqZFFe2hEvNLGvU~$cfSdo6;h` z(&EzM2awVSWRQJd`XgjixGCt#70vI(W=;)n3{O0EX~-y?{2CJENzRB21;qIRuS;G(xl(jp_lNpY zSYuyaB3+YyqGH9SV$H8&<7EY-w1U}J!Jez&NGiA|DtR`Qe7{QJ%Sv%+rL?b7K3A!f zR08x7>b3|?e*`cVp#?+iM2M`Y{~%tsn4m77#>Mz3%!2b~5A50q~`pei<6bybHF~ zPX5(5W2;?Y)voAjC+0p+X|=b0&28HnFJiS%Y>h9h#vff1NUaH$)`aTU-m|T}?_c{M zwl)k_8;-7xpw>Q-)<){rMcLLp_pghNt&4%x#iHxtsdWj`It<@r_dctLLls(z&XL8IbNBfa4@9mJ~Ke%X0zEuk) zH?~R}k@`&?woP6BO+B$qC|DC3-Grq!;iOG?{pLa2=3)Qlk=SMeteJ>zCQ+LwrOjmh zmd~~=)BY_pux4XO3l-f$qqZzcTj)$x3sJvy&A)Xcwv_>EWujZz)K-qPm8;*zvu)%1 zw+Un0#IQCgx=l`PvF|(xzBfb%DTJ_x^LTc-wEjUiR<<)>-NWV2hMi~ z%eq4idhXfv+z;q^5Z4n{))S8DiJ0$sBI}7X=#8@LeIC#o9oHLE)*EZkb%ETQAnOGi zppsa}X!8eT_^*ERfb z*#5)Ozz@p-`+N|nM3&kudPXc+GYk*9|HD3Su*M<8`&xq^8k*2&LW{oFRSVJ`x@bRi zIZ!opB?n{;AF{;`+0%w%LWdj;hi}*qUu6&7j30J^54&QA-LbrMA<3SQ5=cmkCuG10Sy)02jgTiNKn%wU?8k}%$BN^}pztvmb_`A% ztB{W&42f0t#Ogp|Z9K6aPHe;yeH?*~vfkp@hF6eu4^wpz5_lW0VGY*!#SwkVyVDRc z=mOR};H_qae0&>DB4SA-8fj8aA{$P8wx5^|oS2E9pui`n*a=$T#ACT?f^ImuVn4YS zIC+UgWWXnx*hw~Rk|Uplx!3UQr@Zxv{P-y`d`gO)lGCP?@+p83S^XMWGl&d)Mb;`O z@9!sTFOYQ6@>nUCO6j`={L( zracwY-bP<FRpni*Sw9_Z#%5t310U}Sof`1_s6XVF0Ka$Q-Z*t4-5Ow z9<2B)pdvW5BM#Z&h)jPN3D7tL@cTMmFm$Hy^}#v1hCgyMesMEFxd}FABsnlrf*ENE zjEo9K7LJj#$jDPNAjVq-4qI`!eZ>h|(26Y>ZVSG+RiWHM7&EIJnAO3|+5~2O1+x*y zY+huxDwzS1`#Kz0UBRrL1Qx1-g~qY4i!7Xyg*RpoI*&_+;ktZ`m9GkSrp3IxR zV!Zv?VS74wdnRFBgKD2hLhBXCr~b;H*01W z#9h70UHySw!=+tg)vl=t@8or!SqSfRBG0^%XEDIDT;g3&@vKbtE?(ce9I|&Maqq0x zmhHfv{nDO;Y7eZ#x^bQF6v8AV@LekTt^<7cCBCPM?`N_!MPtIe2^#%s}zP02qTt+PgKH46H!zpCnOT|kEf!up0jqA3;K~8>LL5w zAe#G3(3RopnqZa2Pr5e$cyjOt9h9dMLrf$E*Cjzk6OtHc@=Ou9yx{%p@u(l?v*Bg0`esR4M3{qV)t(w3pCoQvMtF>#vcZ z7zmJ~QtBhrf*iNV> zr^uf^txga zA-4YuY@gL_{a3K9tO+2Y+E+&*r`#&w+m-9%&`XaNNqwFF1lxq(_C4}{g6;Q99>H}r zL8`~pyIopN9}NC@S{-6(_4h1LBk&ZV#Bz@6qVJwYbSX^pm^Jmg0QhNxE9rmV(0OVep|+fIjP#dLqsK=cYOX>f9w0;zk==QV5k2C z+m(}djT5*$!i6VRx6%u}Dz-K&!9WWJBIQ^(<4>@4``^U2;UCX?(yPw9S6TgcV(WV9 RJPiFW#kTp>YXHFR-vOya=)nL0 literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/img/widgetBoxIblue.png b/widgetstyles/memo/img/widgetBoxIblue.png new file mode 100644 index 0000000000000000000000000000000000000000..a80d4f3b3787f4f3f5332c290ed934302d353b24 GIT binary patch literal 4681 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 S>Hf3BJ&t)Ded%`b`u_v@WG8z7 literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/img/widgetBoxIgreen.gif b/widgetstyles/memo/img/widgetBoxIgreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..b6354e7b63a1a951eb2f00cbdcbd071b96a5668a GIT binary patch literal 6464 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 bY4`e}KvUrVB(|1=3%dVYY>yu^0J!`s=iZNa literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/img/widgetBoxIgreen.png b/widgetstyles/memo/img/widgetBoxIgreen.png new file mode 100644 index 0000000000000000000000000000000000000000..5ede15e69f58183dffab4d88f8ded74cab141c5e GIT binary patch literal 5040 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 literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/img/widgetBoxIred.png b/widgetstyles/memo/img/widgetBoxIred.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1f83c029f3ddd5029882d8a0f7dea3f697c353 GIT binary patch literal 4959 zcmZ9Qc~lcu`^N{Z;!@mRiwhF0lp-oni^>`)iiAa=MFnIFf>a=P2@pu2KtcjZfGk78l9!&I7Jt9{$86`!=lMR%z4w{P{?P-W zvtjoJ004AcoE^OYU}N3#_4n)6E+0Qw7r>WKUtDrNRioi+spOM6Q_q>V^F}a*XRds|pnjjso+TlM-s7C$huxPun#soad!}oYb2oq?(}DVq^Fu{CN-~&7b^% z&2>h^&0K47wuY*EUp;fT*DqiC&^XY;igA}%#>6#YCVw2>^cjVgXEBO#q2!0-0z)K} z0$3v1tpax*5iqxe2)SF{F=|a|^*oiA-_gz688>&{z$Ta^U zdVs-*a(5V^;Csq(C}p^x5rV&9A6b6OmB1$YM4g9B@OJUodJn}*jxOY^$~#t1_K#k! zj(-O&YW*WpXCFN}9^Eh3Jtu7!M|?44kUo-KZD*P*1U!^hGa_AT)%Ik_u1;Q6TQ!Dur46Ss6?F*WeDI65x-dd37E zPUN5*)B$8aa$==LG@{-dpvsexik`mrL4KyiDLej zgnjDdQUr@fABGeo>2`DSQ20|W{|q{sND2$G7r_3TZ z)bI_L)8~H}w_8U->FE@4S4piyFc;9UgBgTKwGay)1Y6-w>z2GL?`%k3VP+1oUyG`5 zn6#}ULmgdN(n12>&U=26?x#2THN=v0tEhY>EQTnM*;Q6v#Bgi5e=blt^HhEU}3ETH1KlL^gThA_JFa8EBoOOgTDOx1=Fd1 z$HF!IJ(RnnVzrsyG?;e`s(QS?n@^sNTs(1iE~Llb`~s3m{d`J4FWANV`D6D1FSA>I z{~uNl%8@Y_ac}#T1yEF$*&GXT|~D}Ro(|J>!`2NLDCTJ6Q0t z1LG@_F+->ktrds+qARa}jPA*q1<~|g)@FT2>xTuw^NmgsTFRvJeuJT{#ZZ5c23D@k zVfuQz_OPZ2J_gUi)Z)8c2(-ei>i?zU+@#B8oaVi(%+aI57aq4W%;MC;0&ivd`BOpT z%a!;D;&Ouu;bVhEJlt=fC5^o`4Siv*9I3hIEG)y0na7M*RUtMQtfmv`=T~7NKZ}oB6-JY1Uz*G4 z0u+Ci&)nX9uk?6y;lMyY$@hwglpL5U0xespYDksjjl+qPmf~SNdzWtZ)|w2xRg%xh zv_m8=A*fJS8T}p}nSG>eKT;Lbs8W#`otl6=n|rV%v;!3JGCRI3uvUin$&zw?2!)D5 zi>EmHe4}A*))XaB(`=`tfg@lCsZ+Uhj3xbM&E^$;^I{~2KtGKN3=x)gf|ow!NAAI^ zIC0|@ylln%rch0F%dfXX+qxUmz8L8~fM_pr#_IVY^`%LP^`3Yl<=UVu%|uuz=r822 zAqo#tlu&JSxn(0s*v?Z0D0Dt6y1t)|D(0{q_Zi`VBf*T>l+c9Ur_l_u`K_C<$POG|9wJUHG8M~bmix( zRp!t=kAVUIKCrin9nrm`a`xHvL0mn~|I*<=lQc{qDM7a{vrvz7I#aER4@8h0yF-g*5{;|cp_i0Ab_lfHCFaJ-4*&d>Pt6)9lb_vS!_;TG4w3f`vX&BCa zkD=6n)Zf(W>YyLe+`)G6=nGFC)*?u=0EI{&-7M`~yqpE|BA1IZ=rw+jvcF4isNXbr zGo6-U!{gh3w9pI`D*Qc+b!45ZC9TO{u6PxUP<*S>k@>S2o5I(6cbXd zz#SFP!3t;7FNo~J(Nv;6iOtJFXGjiKr_1-kQus5z1`;SdwS*mcd9G`<9xNJZq6>{JcOb<*g`OLQ1&v*QDhW7NaciqQ8g4!8{M8B2%)Ey5uWs3TK@1eU$ z{X9$i;i8`&v(^z4qUdqfbVaV_1_HwKZB3Nw-DRz@ z&$zoa&7AV4lTFt{W{4Ga({E1B48P20h+d~g;0&nsI`#Pl(45MW$juNAGkumW_K(J0 z$JwaCjBQ}e^3wpm)3tizbvr#JXg$`(6A z)3u8cpEZ)P7Lnp;5o1JoocCJNz3zAFxq{!~{mm&A)~8}FL)_O~vm(0tfo@+kmtn`w zk{LlYxW*aLWSpuO&3J2UaN{~5W8dsjWJDfO^Pqr}qkdpX49J)mt|-#v8m(&baA{to z-%DG+>>s!NKMO-Pq|@{Q04U~#dNIl}*^cCF0BA0;C)YnnxJd(-&Zm6|&CUPlAE*|F z$aMpxUqb_AD8hpw$ToI>b~?zpa|E?nduBS0K z%1{5q$2`HNpE)K|U^j>5Fb*)vNU)o39dH;HeWU>zPV32srBfCz&~88Rr0@Hy=}i`Y zXdXHCPre~2wjb$SZC7Pt-WEi@%vWz7|UKq#M%S z8bDl6@>;>D>TBxq1WKOU$#M8cK(beZjr2U(;{`iW(dQD1gHulA`~p2p4W<_~oOUzE zNgW_RbzP5B zm6qg~wPPkuuAW@86UelPPrHAcZ1k7Q)81mR1;s|^P=gaC-ih(K7W>4g*a z+5A*__x==e=pSUCGf__tF0X=>t@t3yQ5sbjVyU^Lql)T?fe*BUao>qM3ik;Av|&9g z)Jo!j>xyv20LgRJV}*oy$2vwDA$1$ZY-n6sWfg9FkgV8*`Ab|MM))N+y&-!X4Owwp zQySiq5e;thaAvK;Vz;z}f0(#0|5GYD5$VTC@c)kdT|Sf(q;LDQeh;z(!>!60FUvKx zR`o^>wMa~qzdyDi`v` zOP~NgIHb9_ly4oroIXG@ojs+p%8Ngs1vD>84$%#;rF>QNQ}D?Q?WK{N;P)I)bMPDB zaBLXS3lZF(X;G9M)A1UatLYe_D?HY~R7#OH@!IT&0%B$yz{Nr$bfpo#ffEHJ)1}S!`aiEMfxt9-F36G+rN4Ijp@jvP){cIT^Blpa}(* zthNHc$CjDtuKV0qBF2YHi|gVVQV^0*A$9CWU<@)np|c22_d!F*K~ zRPg?@Qel5$7O z&S5w(wGuLlg=tY|@AM}S5>h_?DcCUe>FeiN!2l3TNWUWxk_Rw*rvmq&>H(qK&HRF0g%KWeBZh?mX&Y2CuML61)6IS za+*t)R8z%ktR@lqLAF3<^621uTwyUIOPrVv<6v=~f6~(%!F`K8yDotIJ%@=`dwH{J zIGH#*V-|_@Mp)skX;WHr4FSBoLOUhC;5YuOgDBoW78 zO#V$ODwrIaDqi$7ZWsB8Yt7q?H|Fu&K9E?gp>|YZ_%ELD4?*u{jfP>EBQ59_Y3PH$ zYy!n_u3(MT$PN&IChqq*m;lM@KJF`ctOcVKW}LZWf6}O3FxI9wFh$K9b_js*HHl6J z&J7=-OGUn96040p^w_eRB#zxJQ;4cZ+x>#!wXc-tqOzus7ATcTVyg-IAr8UvqwMcK zskwg~+7Cd#e7O%uUiixl08HIYo<;m2d?>`@VK1`;M=Y^~f-2Q+xhk;)9lx=Hl#2P0 z9-|q!aJ7HF)(wYy<~9LZg87sG^j!h&YqtU)VHufgf#&n^T+Oc-Hf*WAR!l;5oD-d6 zR_U}L+T89hiUc00WZtn?Bwy3{?tlM-#41&*k1W^tl_H%JwriW3V5kOvBuUNsgwu03 zj+Pi_oooK=Lq0`2#(13$TbG8kl*9h9zZ}8k#2E_Zz1ua$%|OmTTtVN>t@yv5x}5TG JtU3{V<$wPR<+cC- literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/img/widgetBoxIyellow.gif b/widgetstyles/memo/img/widgetBoxIyellow.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3770f3d18d74e89b191b3469dfed84f93043ec5 GIT binary patch literal 6648 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 literal 0 HcmV?d00001 diff --git a/widgetstyles/memo/img/widgetBoxIyellow.png b/widgetstyles/memo/img/widgetBoxIyellow.png new file mode 100644 index 0000000000000000000000000000000000000000..834d5d69890e314f64d2ae72c667a303c6332503 GIT binary patch literal 4661 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 Date: Tue, 24 Mar 2009 06:49:36 +0000 Subject: [PATCH 082/202] =?UTF-8?q?=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?+=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20-=20=EA=B8=80=EB=93=B1=EB=A1=9D=EC=8B=9C?= =?UTF-8?q?=20=EC=96=B8=EC=96=B4=EA=B0=80=20=EA=B8=B0=EB=B3=B8=20=EC=96=B8?= =?UTF-8?q?=EC=96=B4=EC=9D=B4=EA=B3=A0=20=EC=88=98=EC=A0=95=EC=8B=9C=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=EC=96=B8=EC=96=B4=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=98=EB=A9=B4=20=EA=B0=81=20=EC=96=B8=EC=96=B4?= =?UTF-8?q?=EB=B3=84=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B0=80=20=EB=B3=B4?= =?UTF-8?q?=EA=B4=80=20=EC=9E=98=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20-=20=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EA=B0=92=EC=9D=B4=20=EC=97=86=EB=8A=94=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=EC=9D=84=20=EC=88=98=EC=A0=95=EC=8B=9C=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=ED=8F=BC=EC=9D=B4=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=82=98=ED=83=80=EB=82=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20=ED=8D=BC=ED=8F=AC=EB=A8=BC=EC=8A=A4=20?= =?UTF-8?q?=EC=A6=9D=EB=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5947 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/extravar/Extravar.class.php | 31 +--- modules/document/document.controller.php | 4 +- modules/document/document.model.php | 155 +++++++++++------- .../document/queries/getDocumentExtraVars.xml | 33 +--- modules/module/lang/ko.lang.php | 2 +- 5 files changed, 108 insertions(+), 117 deletions(-) diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index 6178c9a4c..b4188976a 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -4,19 +4,17 @@ * @author zero (zero@nzeo.com) * @brief 게시글, 회원등에서 사용하는 확장변수를 핸들링하는 클래스 * - * php4대비 class static 변수가 안됨으로 $GLOBALS['XE_EXTRAVARS']를 이용해서 같은 효과 냄 **/ class ExtraVar { var $module_srl = null; + var $keys = null; /** * @brief constructor **/ function &getInstance($module_srl) { - static $oInstance = array(); - if(!$oInstance[$module_srl]) $oInstance[$module_srl] = new ExtraVar($module_srl); - return $oInstance[$module_srl]; + return new ExtraVar($module_srl); } /** @@ -26,29 +24,15 @@ $this->module_srl = $module_srl; } - /** - * @brief 불필요한 등록을 피하기 위해서 특정 module_srl에 확장변수가 등록되었는지 확인 - **/ - function isSettedExtraVars() { - return isset($GLOBALS['XE_EXTRAVARS'][$this->module_srl]); - } - /** * @brief 확장변수 키를 등록 - * php4를 대비해 class static 멤버변수 대신 $GLOBAL 변수 사용 * @param module_srl, idx, name, type, default, desc, is_required, search, value **/ function setExtraVarKeys($extra_keys) { - if(!$this->isSettedExtraVars()) { - if(!$extra_keys || !count($extra_keys)) $GLOBALS['XE_EXTRAVARS'][$this->module_srl] = array(); - else { - if(!is_array($GLOBALS['XE_EXTRAVARS'][$this->module_srl])) $GLOBALS['XE_EXTRAVARS'][$this->module_srl] = array(); - foreach($extra_keys as $key => $val) { - $obj = null; - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); - $GLOBALS['XE_EXTRAVARS'][$this->module_srl][$val->idx] = $obj; - } - } + foreach($extra_keys as $key => $val) { + $obj = null; + $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); + $this->keys[$val->idx] = $obj; } } @@ -56,8 +40,7 @@ * @brief 확장변수 객체 배열 return **/ function getExtraVars() { - if(!$this->isSettedExtraVars()) return array(); - return $GLOBALS['XE_EXTRAVARS'][$this->module_srl]; + return $this->keys; } } diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 1b2233457..618da263f 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -363,8 +363,8 @@ } // 제목/내용의 다국어 확장변수 등록 - if($extra_content->title) $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, -1, $extra_content->title); - if($extra_content->content) $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, -2, $extra_content->content); + if($extra_content->title) $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, -1, $extra_content->title, 'title_'.Context::getLangType()); + if($extra_content->content) $this->insertDocumentExtraVar($obj->module_srl, $obj->document_srl, -2, $extra_content->content, 'content_'.Context::getLangType()); // 성공하였을 경우 category_srl이 있으면 카테고리 update if($source_obj->get('category_srl')!=$obj->category_srl) { diff --git a/modules/document/document.model.php b/modules/document/document.model.php index a1d0bb4b5..10666c33c 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -24,65 +24,69 @@ * @brief 확장변수를 매 문서마다 처리하지 않기 위해 매크로성으로 일괄 select 및 적용 **/ function setToAllDocumentExtraVars() { + static $checked_documents = array(); + // XE에서 모든 문서 객체는 XE_DOCUMENT_LIST라는 전역 변수에 세팅을 함 if(!count($GLOBALS['XE_DOCUMENT_LIST'])) continue; // 모든 호출된 문서 객체를 찾아서 확장변수가 설정되었는지를 확인 $document_srls = array(); foreach($GLOBALS['XE_DOCUMENT_LIST'] as $key => $val) { - if(!$val->document_srl || isset($GLOBALS['XE_EXTRA_VARS'][$val->document_srl])) continue; - $document_srls[$key] = $val->document_srl; + if($checked_documents[$val->document_srl]) continue; + $checked_documents[$val->document_srl] = true; + $document_srls[] = $val->document_srl; } // 검출된 문서 번호가 없으면 return if(!count($document_srls)) return; - $lang_code = Context::getLangType(); - // 확장변수 미지정된 문서에 대해서 일단 현재 접속자의 언어코드로 확장변수를 검색 $obj->document_srl = implode(',',$document_srls); - $output = executeQueryArray('document.getDocumentsExtraVars', $obj); - + $output = executeQueryArray('document.getDocumentExtraVars', $obj); if($output->toBool() && $output->data) { - $setted = array(); - foreach($output->data as $key => $val) { - if(!$val->document_srl) continue; - - if($val->idx<0 && $val->lang_code == $lang_code) { - if($val->idx == -1) $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl]->add('title', $val->value); - else if($val->idx == -2) $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl]->add('content', $val->value); - } elseif($val->idx>0) { - - if(!isset($GLOBALS['XE_EXTRA_VARS'][$val->document_srl])){ - $module_srl = $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl]->get('module_srl'); - $oExtraItem = $GLOBALS['XE_EXTRAVARS'][$module_srl]; - $GLOBALS['XE_EXTRA_VARS'][$val->document_srl] = $oExtraItem; - } - - if($lang_code == $val->lang_code) { - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); - $GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx] = $obj; - } else if($lang_code == $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl]->lang_code && !$GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx]->value) { - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); - $GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx] = $obj; - } else if(!$GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx]->value) { - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); - $GLOBALS['XE_EXTRA_VARS'][$val->document_srl][$val->idx] = $obj; - } - } + if(!trim($val->value)) continue; + if(!$extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0]) $extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0] = trim($val->value); + $extra_vars[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value); } } + for($i=0,$c=count($document_srls);$i<$c;$i++) { + $document_srl = $document_srls[$i]; + $oDocument = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + $this->_setExtraVars($oDocument, $extra_vars[$document_srl]); + } + } - foreach($document_srls as $key => $document_srl) { - if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])){ - $module_srl = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->get('module_srl'); - $oExtraItem = $GLOBALS['XE_EXTRAVARS'][$module_srl]; - $GLOBALS['XE_EXTRA_VARS'][$document_srl] = $oExtraItem; - } + function _setExtraVars($oDocument, $vars) { + $module_srl = $oDocument->get('module_srl'); + $extra_keys = $this->getExtraKeys($module_srl); + $document_srl = $oDocument->document_srl; + + $user_lang_code = Context::getLangType(); + $document_lang_code = $oDocument->get('lang_code'); + + // 확장변수 처리 + foreach($extra_keys as $idx => $key) { + $val = $vars[$idx]; + if($val[$user_lang_code]) $v = $val[$user_lang_code]; + else if($val[$document_lang_code]) $v = $val[$document_lang_code]; + else if($val[0]) $v = $val[0]; + else $v = null; + $extra_keys[$idx]->value = $v; } + $extra_vars = new ExtraVar($module_srl); + $extra_vars->setExtraVarKeys($extra_keys); + + // 제목 처리 + if($vars[-1][$user_lang_code]) $oDocument->add('title',$vars[-1][$user_lang_code]); + + // 내용 처리 + if($vars[-2][$user_lang_code]) $oDocument->add('content',$vars[-2][$user_lang_code]); + + $GLOBALS['XE_EXTRA_VARS'][$document_srl] = $extra_vars->getExtraVars(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; } /** @@ -122,18 +126,27 @@ $document_count = count($document_list); foreach($document_list as $key => $attribute) { - if(!$attribute->document_srl) continue; - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if($is_admin) $oDocument->setGrant(); + $document_srl = $attribute->document_srl; + if(!$document_srl) continue; - $result[$attribute->document_srl] = $oDocument; + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } - $GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl] = $oDocument; + $result[$attribute->document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; } $this->setToAllDocumentExtraVars(); - return $result; + + $output = null; + foreach($result as $document_srl => $val) { + $output[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + + return $output; } /** @@ -360,18 +373,24 @@ foreach($data as $key => $attribute) { if($except_notice && $attribute->is_notice == 'Y') continue; $document_srl = $attribute->document_srl; - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if($is_admin) $oDocument->setGrant(); + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } - $GLOBALS['XE_DOCUMENT_LIST'][$attribute->document_srl] = $oDocument; - - $output->data[$virtual_number] = $oDocument; + $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; $virtual_number --; } $this->setToAllDocumentExtraVars(); + + foreach($output->data as $number => $document) { + $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; + } + return $output; } @@ -395,15 +414,25 @@ $args->order_type = 'asc'; $output = executeQueryArray('document.getDocuments', $args); if(!$output->toBool()||!$output->data) return; + foreach($output->data as $key => $val) { - if(!$val->document_srl) continue; - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($val, false); - $GLOBALS['XE_DOCUMENT_LIST'][$val->document_srl] = $oDocument; - $result->data[$val->document_srl] = $oDocument; + $document_srl = $val->document_srl; + if(!$document_srl) continue; + + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($val, false); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } + $result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; } $this->setToAllDocumentExtraVars(); + + foreach($result->data as $document_srl => $val) { + $result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + return $result; } @@ -412,15 +441,16 @@ * $form_include : 글 작성시에 필요한 확장변수의 input form 추가 여부 **/ function getExtraKeys($module_srl) { - $oExtraVar = &ExtraVar::getInstance($module_srl); - if(!$oExtraVar->isSettedExtraVars()) { + if(!$GLOBALS['XE_EXTRA_KEYS'][$module_srl]) { + $oExtraVar = &ExtraVar::getInstance($module_srl); $obj->module_srl = $module_srl; $obj->sort_index = 'var_idx'; $obj->order = 'asc'; $output = executeQueryArray('document.getDocumentExtraKeys', $obj); $oExtraVar->setExtraVarKeys($output->data); + $GLOBALS['XE_EXTRA_KEYS'][$module_srl] = $oExtraVar->getExtraVars(); } - return $oExtraVar->getExtraVars(); + return $GLOBALS['XE_EXTRA_KEYS'][$module_srl]; } /** @@ -428,6 +458,7 @@ **/ function getExtraVars($module_srl, $document_srl) { if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])) { + // 확장변수 값을 추출하여 세팅 $oDocument = $this->getDocument($document_srl, false); $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; $this->setToAllDocumentExtraVars(); diff --git a/modules/document/queries/getDocumentExtraVars.xml b/modules/document/queries/getDocumentExtraVars.xml index 180fa8928..34c723265 100644 --- a/modules/document/queries/getDocumentExtraVars.xml +++ b/modules/document/queries/getDocumentExtraVars.xml @@ -1,36 +1,13 @@ - -
    - - - - - - - -
    + - - - - - - - - - - - - + - - - + + + - - - diff --git a/modules/module/lang/ko.lang.php b/modules/module/lang/ko.lang.php index 00988d124..19d690ee6 100644 --- a/modules/module/lang/ko.lang.php +++ b/modules/module/lang/ko.lang.php @@ -86,7 +86,7 @@ $lang->about_extra_vars_default_value = '다중/단일 선택등 기본값이 여러개가 필요한 경우 , (콤마)로 연결하시면 됩니다'; $lang->about_search_virtual_site = '가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제 외)'; - $lang->about_extra_vars_eid_value = '확장변수에 이름을 적어주세요. ( 영문+[영문+숫자+_] 만 가능)'; + $lang->about_extra_vars_eid_value = '확장변수의 이름을 적어주세요. ( 영문+[영문+숫자+_] 만 가능)'; $lang->about_langcode = '언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요'; $lang->about_file_extension= "%s 파일만 가능합니다."; ?> From 1fe6a3bae4539fa5619436f53dbdd48ade682e48 Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 06:52:52 +0000 Subject: [PATCH 083/202] =?UTF-8?q?=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EA=B3=B3=EC=97=90=EC=84=9C=EC=9D=98=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5948 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/extravar/Extravar.class.php | 1 + modules/document/document.model.php | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index b4188976a..6d6e01c93 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -29,6 +29,7 @@ * @param module_srl, idx, name, type, default, desc, is_required, search, value **/ function setExtraVarKeys($extra_keys) { + if(!is_array($extra_keys) || !count($extra_keys)) return; foreach($extra_keys as $key => $val) { $obj = null; $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 10666c33c..a8ecdb5ef 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -67,13 +67,15 @@ $document_lang_code = $oDocument->get('lang_code'); // 확장변수 처리 - foreach($extra_keys as $idx => $key) { - $val = $vars[$idx]; - if($val[$user_lang_code]) $v = $val[$user_lang_code]; - else if($val[$document_lang_code]) $v = $val[$document_lang_code]; - else if($val[0]) $v = $val[0]; - else $v = null; - $extra_keys[$idx]->value = $v; + if(count($extra_keys)) { + foreach($extra_keys as $idx => $key) { + $val = $vars[$idx]; + if($val[$user_lang_code]) $v = $val[$user_lang_code]; + else if($val[$document_lang_code]) $v = $val[$document_lang_code]; + else if($val[0]) $v = $val[0]; + else $v = null; + $extra_keys[$idx]->value = $v; + } } $extra_vars = new ExtraVar($module_srl); From 15a9d734c05e558071cfbb711248237f443d7c7c Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 07:20:09 +0000 Subject: [PATCH 084/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5949 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/planet/libs/me2day.api.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/planet/libs/me2day.api.php b/modules/planet/libs/me2day.api.php index 02586debc..b9163cea3 100644 --- a/modules/planet/libs/me2day.api.php +++ b/modules/planet/libs/me2day.api.php @@ -55,16 +55,10 @@ strlen($content) ); if($content) $header.=$content."\r\n\r\n"; - /******************* 게이트웨이용 임시 코드 ****************************/ - $fp = fsockopen("blog.nzeo.com", 80); - if(!$fp) return null; - $body = "body=".base64_encode($header); - fwrite($fp, "POST /me2gateway.php HTTP/1.0\r\nHost: blog.nzeo.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($body)."\r\n\r\n".$body."\r\n\r\r"); - /***********************************************************************/ - //$fp = fsockopen($host, $port); - //if(!$fp) return null; - //fwrite($fp, $header); + $fp = fsockopen($host, $port); + if(!$fp) return null; + fwrite($fp, $header); $started = false; while(!feof($fp)) { From 8084250f1795a70f42d04e417ee350cb466d3547 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 24 Mar 2009 07:20:22 +0000 Subject: [PATCH 085/202] =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=9C=84=EC=A0=AF=20=EC=88=98=EC=A0=95=EC=8B=9C=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5950 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/js/widget.js | 36 ++++++++++++------- widgets/content/skins/default/gallery.html | 4 +-- .../content/skins/default/image_title.html | 2 +- .../skins/default/image_title_content.html | 4 +-- widgets/content/skins/default/normal.html | 2 +- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index d330ca6c0..0d0e23fca 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -80,8 +80,8 @@ function getWidgetContent(obj) { if(typeof(obj)=='undefined' || !obj) obj = zonePageObj; var widget = null; - jQuery(obj).find('div[widget]').each(function(){ - if(jQuery(this).parent().get(0) != obj) return; + jQuery('div.widgetOutput',obj).each(function(){ + if(jQuery(this).parent().get(0) != obj) return; widget = jQuery(this).attr('widget'); switch(widget) { case 'widgetBox' : @@ -169,7 +169,8 @@ function getWidgetCode(childObj, widget) { var attrs = ""; var code = ""; for(var i=0;i 0) return; doHideWidgetSizeSetup(); @@ -845,6 +842,7 @@ function restoreWidgetButtons() { var widgetButton = xGetElementById('widgetButton'); var boxWidgetButton = xGetElementById('widgetBoxButton'); if(!widgetButton || !boxWidgetButton) return; + widgetButton.style.visibility = 'hidden'; xGetElementById("zonePageContent").parentNode.appendChild(widgetButton); boxWidgetButton.style.visibility = 'hidden'; @@ -875,17 +873,25 @@ function showWidgetButton(name, obj) { function widgetSetup(evt) { var e = new xEvent(evt); var obj = e.target; - while(obj) { - if(obj.parentNode && typeof(obj.parentNode.className)!='undefined' && obj.parentNode.className == 'widgetButtons') return; - if(typeof(obj.className)!='undefined' && obj.className == 'widgetOutput') break; - obj = obj.parentNode; + + if(jQuery(obj).is('.widgetButtons') || jQuery(obj).parents('.widgetButtons').size() > 0) return; + if(jQuery(obj).is('.buttonBox') || jQuery(obj).parents('.buttonBox').size() > 0) return; + + + var o = jQuery(obj).parents('.widgetOutput'); + if(o.size() == 0){ + restoreWidgetButtons(); + return; } + /* if(!obj || typeof(obj.className)=='undefined' || obj.className != 'widgetOutput') { restoreWidgetButtons(); return; } +*/ - var widget = obj.getAttribute('widget'); + obj = o.get(0); + var widget = o.attr('widget'); if(!widget) return; if(widget == 'widgetBox') { @@ -1172,6 +1178,8 @@ function widgetDisapearObject(obj, tobj) { obj.parentNode.removeChild(obj); widgetTmpObject[tobj.id] = null; return; + + /* var it = 5; var ib = 1; @@ -1196,6 +1204,7 @@ function widgetDisapearObject(obj, tobj) { xLeft(obj, x); xTop(obj, y); }, it/ib); + */ } // 마우스다운 이벤트 발생시 호출됨 @@ -1274,6 +1283,7 @@ function widgetManualEnd() { if(!tobj) return; xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); + xAddEventListener(document, 'mousemove', widgetDragMouseMove, false); var obj = widgetGetTmpObject(tobj); widgetDisapear = widgetDisapearObject(obj, tobj); diff --git a/widgets/content/skins/default/gallery.html b/widgets/content/skins/default/gallery.html index 5f3f0ee9c..57c96dc11 100644 --- a/widgets/content/skins/default/gallery.html +++ b/widgets/content/skins/default/gallery.html @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/widgets/content/skins/default/normal.html b/widgets/content/skins/default/normal.html index 178596d72..ae73bb470 100644 --- a/widgets/content/skins/default/normal.html +++ b/widgets/content/skins/default/normal.html @@ -25,7 +25,7 @@ - {$item->printExtraImages()} + {$item->printExtraImages()} From 31f1275f68eb62d3b8cd62691a60c3aaeceabeb5 Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 07:26:42 +0000 Subject: [PATCH 086/202] =?UTF-8?q?IE=EA=B3=84=EC=97=B4=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=9C=84=EC=A0=AF=20=EC=8A=A4=ED=83=80=EC=9D=BC=EC=9D=B4=20?= =?UTF-8?q?=EA=B9=A8=EC=96=B4=EC=A7=80=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5951 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/css/widgetBoxStyle.css | 2 +- widgetstyles/line/css/widgetBoxStyle.css | 2 +- widgetstyles/memo/css/widgetBoxStyle.css | 2 +- widgetstyles/postitWire/css/widgetBoxStyle.css | 2 +- widgetstyles/roundFace/css/widgetBoxStyle.css | 2 +- widgetstyles/roundWire/css/widgetBoxStyle.css | 2 +- widgetstyles/simpleRound/css/widgetBoxStyle.css | 2 +- widgetstyles/simpleRound/widgetstyle.html | 2 +- widgetstyles/simpleSquare/css/widgetBoxStyle.css | 2 +- widgetstyles/simpleTitle/css/widgetBoxStyle.css | 2 +- widgetstyles/squareWire/css/widgetBoxStyle.css | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/widgetstyles/colorbox/css/widgetBoxStyle.css b/widgetstyles/colorbox/css/widgetBoxStyle.css index 61233bb74..698e4f628 100644 --- a/widgetstyles/colorbox/css/widgetBoxStyle.css +++ b/widgetstyles/colorbox/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/line/css/widgetBoxStyle.css b/widgetstyles/line/css/widgetBoxStyle.css index 6cfa2d31b..8b93ac9d3 100644 --- a/widgetstyles/line/css/widgetBoxStyle.css +++ b/widgetstyles/line/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/memo/css/widgetBoxStyle.css b/widgetstyles/memo/css/widgetBoxStyle.css index 963415ca1..f1fe80c15 100644 --- a/widgetstyles/memo/css/widgetBoxStyle.css +++ b/widgetstyles/memo/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/postitWire/css/widgetBoxStyle.css b/widgetstyles/postitWire/css/widgetBoxStyle.css index 42b732dc6..79dc82c50 100644 --- a/widgetstyles/postitWire/css/widgetBoxStyle.css +++ b/widgetstyles/postitWire/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/roundFace/css/widgetBoxStyle.css b/widgetstyles/roundFace/css/widgetBoxStyle.css index ba9669b59..4aeea1f08 100644 --- a/widgetstyles/roundFace/css/widgetBoxStyle.css +++ b/widgetstyles/roundFace/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/roundWire/css/widgetBoxStyle.css b/widgetstyles/roundWire/css/widgetBoxStyle.css index 858813a23..91a2828c5 100644 --- a/widgetstyles/roundWire/css/widgetBoxStyle.css +++ b/widgetstyles/roundWire/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/simpleRound/css/widgetBoxStyle.css b/widgetstyles/simpleRound/css/widgetBoxStyle.css index 424d9c9d5..11d11527e 100644 --- a/widgetstyles/simpleRound/css/widgetBoxStyle.css +++ b/widgetstyles/simpleRound/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/simpleRound/widgetstyle.html b/widgetstyles/simpleRound/widgetstyle.html index a97301df8..06c118557 100644 --- a/widgetstyles/simpleRound/widgetstyle.html +++ b/widgetstyles/simpleRound/widgetstyle.html @@ -41,4 +41,4 @@ - \ No newline at end of file + diff --git a/widgetstyles/simpleSquare/css/widgetBoxStyle.css b/widgetstyles/simpleSquare/css/widgetBoxStyle.css index e736df336..9220c0893 100644 --- a/widgetstyles/simpleSquare/css/widgetBoxStyle.css +++ b/widgetstyles/simpleSquare/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/simpleTitle/css/widgetBoxStyle.css b/widgetstyles/simpleTitle/css/widgetBoxStyle.css index c4e1f5de7..9aa329466 100644 --- a/widgetstyles/simpleTitle/css/widgetBoxStyle.css +++ b/widgetstyles/simpleTitle/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/squareWire/css/widgetBoxStyle.css b/widgetstyles/squareWire/css/widgetBoxStyle.css index 8ea5b5a64..0ba421c23 100644 --- a/widgetstyles/squareWire/css/widgetBoxStyle.css +++ b/widgetstyles/squareWire/css/widgetBoxStyle.css @@ -3,7 +3,7 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative;} +.widgetBox{ position:relative; *zoom:1;} .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} From c4014a88b93f303ebb2a1f456b46a36ba486081f Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 07:26:52 +0000 Subject: [PATCH 087/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5952 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/widget/WidgetHandler.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php index a0ac28a3b..9ab1d3c50 100644 --- a/classes/widget/WidgetHandler.class.php +++ b/classes/widget/WidgetHandler.class.php @@ -160,7 +160,7 @@ // 일반 위젯일 경우 default : $widget_content_header = sprintf('
    ',$args->id,$style); - $widget_content_body = sprintf('
    %s
    ', $inner_style,$widget_content); + $widget_content_body = sprintf('
    %s
    ', $inner_style,$widget_content); $widget_content_footer = '
    '; break; } From a106001d53845c4ad88d64a483b43dc2ed4466ef Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 07:35:50 +0000 Subject: [PATCH 088/202] =?UTF-8?q?=EA=B8=80=20=EC=88=98=EC=A0=95=EC=8B=9C?= =?UTF-8?q?=20=EC=9B=90=EB=AC=B8=EC=9D=98=20=EA=B8=80=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=9D=B4=20=EC=82=AC=EB=9D=BC=EC=A7=80=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5953 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 618da263f..fcd1b43c6 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -330,11 +330,11 @@ $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); // 글쓴이의 언어변수와 원문의 언어변수가 다르면 확장변수로 처리 - if($source_obj->lang_code != Context::getLangType()) { + if($source_obj->get('lang_code') != Context::getLangType()) { $extra_content->title = $obj->title; $extra_content->content = $obj->content; - $obj->title = $source_obj->title; - $obj->content = $source_obj->content; + $obj->title = $source_obj->get('title'); + $obj->content = $source_obj->get('content'); } // 세션에서 최고 관리자가 아니면 iframe, script 제거 From 844931320fc0fc15ffa9b394971731baf66ac687 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 24 Mar 2009 08:06:42 +0000 Subject: [PATCH 089/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=8B=9C=20=EC=8A=A4=ED=82=A8=20=EC=84=A0=ED=83=9D=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5954 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/widget.controller.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index bf87591dd..0bd4c6328 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -99,7 +99,9 @@ function procWidgetGenerateCodeInPage() { $widget = Context::get('selected_widget'); if(!$widget) return new Object(-1,'msg_invalid_request'); - if(!Context::get('skin')) return new Object(-1,Context::getLang('msg_widget_skin_is_null')); + + if(!in_array($widget,array('widgetBox','widgetContent')) && !Context::get('skin')) return new Object(-1,Context::getLang('msg_widget_skin_is_null')); + $attribute = $this->arrangeWidgetVars($widget, Context::getRequestVars(), $vars); // 결과물을 구함 @@ -263,7 +265,7 @@ $oModuleModel = &getModel('module'); $page_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); if(!$page_info->module_srl || $page_info->module != 'page') $err++; - + if($err > 1) return new Object(-1,'msg_invalid_request'); // 권한 체크 From 9b4a5489d06ef59ec45513c3537819d3084ed16c Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 24 Mar 2009 08:48:02 +0000 Subject: [PATCH 090/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5955 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/document/document.model.php b/modules/document/document.model.php index a8ecdb5ef..9da02fdf1 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -59,6 +59,7 @@ } function _setExtraVars($oDocument, $vars) { + if(!$oDocument || !is_object($oDocument) || !$oDocument->isExists()) return; $module_srl = $oDocument->get('module_srl'); $extra_keys = $this->getExtraKeys($module_srl); $document_srl = $oDocument->document_srl; @@ -69,13 +70,13 @@ // 확장변수 처리 if(count($extra_keys)) { foreach($extra_keys as $idx => $key) { - $val = $vars[$idx]; - if($val[$user_lang_code]) $v = $val[$user_lang_code]; - else if($val[$document_lang_code]) $v = $val[$document_lang_code]; - else if($val[0]) $v = $val[0]; - else $v = null; - $extra_keys[$idx]->value = $v; - } + $val = $vars[$idx]; + if($val[$user_lang_code]) $v = $val[$user_lang_code]; + else if($val[$document_lang_code]) $v = $val[$document_lang_code]; + else if($val[0]) $v = $val[0]; + else $v = null; + $extra_keys[$idx]->value = $v; + } } $extra_vars = new ExtraVar($module_srl); From 0919ae7e03ab40813f2da91838a6fd2e1de52899 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 24 Mar 2009 10:05:41 +0000 Subject: [PATCH 091/202] source_compare git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5956 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/issuetracker/classes/svn.class.php | 117 +++++++++++------- .../skins/xe_issuetracker/css/common.css | 3 + .../skins/xe_issuetracker/source_compare.html | 42 ++++--- 3 files changed, 100 insertions(+), 62 deletions(-) diff --git a/modules/issuetracker/classes/svn.class.php b/modules/issuetracker/classes/svn.class.php index 4952f74de..59df8b2d6 100644 --- a/modules/issuetracker/classes/svn.class.php +++ b/modules/issuetracker/classes/svn.class.php @@ -195,6 +195,75 @@ return $output; } + function parseComp(&$list) + { + $cnt = count($list); + $output = array(); + $obj = null; + $idx = 0; + for($i=0;$i<$cnt;$i++) { + $str = $list[$i]; + if(preg_match('/^Index: (.*)$/', $str, $m)) { + if($blockobj != null) + { + $obj->blocks[$blockobj->before_line_start] = $blockobj; + ksort($obj->blocks); + } + if($obj!==null) $output[] = $obj; + $obj = null; + $obj->filename = $m[1]; + $idx = 0; + $obj->blocks = array(); + continue; + } + if(preg_match('/^(\=+)$/',$str)) continue; + if(preg_match('/^--- ([^\(]+)\(revision ([0-9]+)\)$/i',$str,$m)) { + $obj->before_revision = $m[2]; + continue; + } + if(preg_match('/^\+\+\+ ([^\(]+)\(revision ([0-9]+)\)$/i',$str,$m)) { + $obj->after_revision = $m[2]; + continue; + } + if(preg_match('/^@@ \-([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@$/', $str, $m)) { + if($blockobj != null) $obj->blocks[$blockobj->before_line_start] = $blockobj; + $blockobj = null; + $blockobj->before_line_start = (int) $m[1]; + $blockobj->after_line_start = (int) $m[3]; + $cur_before_line = $blockobj->before_line_start; + $cur_after_line = $blockobj->after_line_start; + $blockobj->lines = array(); + continue; + } + $line = null; + if(preg_match('/^\-(.*)$/i',$str)) { + $line->data = ' '.substr($str,1); + $line->type = "deleted"; + $line->before_line_number = $cur_before_line ++; + } + else if(preg_match('/^\+(.*)$/i',$str)) { + $line->data = ' '.substr($str,1); + $line->type = "added"; + $line->after_line_number = $cur_after_line ++; + } + else + { + $line->data = $str; + $line->before_line_number = $cur_before_line ++; + $line->after_line_number = $cur_after_line ++; + } + $blockobj->lines[] = $line; + } + if($obj!==null) + { + if($blockobj != null) $obj->blocks[$blockobj->before_line_start] = $blockobj; + ksort($obj->blocks); + $output[] = $obj; + } + return $output; + + } + function getComp($path, $brev, $erev) { if(!$brev) { $command = sprintf('%s --non-interactive %s --config-dir %s log --xml --limit 2 %s%s@%d', $this->svn_cmd, $this->_getAuthInfo(), $this->tmp_dir, $this->url, $path, $erev); @@ -216,52 +285,10 @@ $erev ); $output = $this->execCmd($command, $error); - + debugPrint($output); $list = explode("\n",$output); - $cnt = count($list); - $output = array(); - $obj = null; - $idx = 0; - for($i=0;$i<$cnt;$i++) { - $str = $list[$i]; - if(preg_match('/^Index: (.*)$/', $str, $m)) { - if($obj!==null) $output[] = $obj; - $obj = null; - $obj->filename = $m[1]; - $idx = 0; - $code_idx = -1; - $code_changed = false; - continue; - } - if(preg_match('/^(\=+)$/',$str)) continue; - if(preg_match('/^--- ([^\(]+)\(revision ([0-9]+)\)$/i',$str,$m)) { - $obj->before_revision = $m[2]; - continue; - } - if(preg_match('/^\+\+\+ ([^\(]+)\(revision ([0-9]+)\)$/i',$str,$m)) { - $obj->after_revision = $m[2]; - continue; - } - if(preg_match('/^@@ \-([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@$/', $str, $m)) { - $obj->changed[$idx]->before_line = sprintf('%d ~ %d', $m[1], $m[2]); - $obj->changed[$idx]->after_line = sprintf('%d ~ %d', $m[3], $m[4]); - continue; - } - if(preg_match('/^\-(.*)$/i',$str)) { - if(!$code_changed) { - $code_changed = true; - $code_idx++; - } - $obj->changed[$idx]->before_code[$code_idx] .= substr($str,1)."\n"; - continue; - } - if(preg_match('/^\+(.*)$/i',$str)) { - $obj->changed[$idx]->after_code[$code_idx] .= substr($str,1)."\n"; - $code_changed = false; - continue; - } - } - if($obj!==null) $output[] = $obj; + $output = $this->parseComp($list); + return $output; } diff --git a/modules/issuetracker/skins/xe_issuetracker/css/common.css b/modules/issuetracker/skins/xe_issuetracker/css/common.css index 49e646fa0..09e972f26 100644 --- a/modules/issuetracker/skins/xe_issuetracker/css/common.css +++ b/modules/issuetracker/skins/xe_issuetracker/css/common.css @@ -296,3 +296,6 @@ dt span.closed { text-decoration: line-through; } .extraVarForm ul { margin:0; padding:0; list-style:none; } .extraVarForm .date { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; margin-right:10px; width:100px; } .extraVarForm .address { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; margin-right:10px; width:300px; } + +.diff .deleted { background: #FFDDDD none; } +.diff .added { background: #DDFFDD none; } diff --git a/modules/issuetracker/skins/xe_issuetracker/source_compare.html b/modules/issuetracker/skins/xe_issuetracker/source_compare.html index 45fb273b7..cc909740c 100644 --- a/modules/issuetracker/skins/xe_issuetracker/source_compare.html +++ b/modules/issuetracker/skins/xe_issuetracker/source_compare.html @@ -10,30 +10,38 @@
    -++ - + - + - - + + + - - - - - - - - - - - - +{@ $bStart = true } + + + + + + + + + + + + + + + + {@ $bStart = false } +
    {$item->filename}{$item->filename}
    Rev. {$item->before_revision}Rev. {$item->after_revision}{$item->before_revision}{$item->after_revision}
    line {$change->before_line}line {$change->after_line}
    {nl2br(str_replace(' ','  ',htmlspecialchars($change->before_code[$i])))}{nl2br(str_replace(' ','  ',htmlspecialchars($change->after_code[$i])))}
    ......
    {$line->before_line_number}{$line->after_line_number}type)-->class="{$line->type}" >{nl2br(str_replace("\t","    ",str_replace(' ',' ',htmlspecialchars($line->data))))}
    From 2ab2bce53ab077e8ab89ed8c15d8496006feedb0 Mon Sep 17 00:00:00 2001 From: misol Date: Tue, 24 Mar 2009 16:01:01 +0000 Subject: [PATCH 092/202] =?UTF-8?q?#17877980=20#17862537=20=ED=85=9C?= =?UTF-8?q?=ED=94=8C=EB=A6=BF=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=B0=B8?= =?UTF-8?q?=EA=B3=A0=ED=95=B4=EC=84=9C=20=ED=95=B8=EB=93=A4=EB=9F=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B2=BD=EB=A1=9C=20=EB=B0=94=EA=BE=B8?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=A7=8C=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=ED=95=98=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95.(=EC=9D=B4=EC=A0=84=EC=97=90=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=20=ED=95=B8=EB=93=A4=EB=9F=AC=EB=A5=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=96=88=EC=96=B4=EC=95=BC=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B2=83=EC=9D=80=20=EC=95=84=EB=8B=8C=EC=A7=80....=20?= =?UTF-8?q?=EC=95=84=EB=AC=B4=ED=8A=BC..=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5957 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 4 ++-- config/func.inc.php | 2 +- modules/tccommentnotify/conf/module.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 62f2df7ca..bcf73e998 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -1362,10 +1362,10 @@ $content = preg_replace_callback('!!is', array($this,'moveStyleToHeader'), $content); // 코드 변환 - $content = preg_replace('/<(img|br)([^>\/]*)(\/>|>)/i','<$1$2 />', $content); + $content = preg_replace('/<(img|br)([^>]*)(\/>|>)/i','<$1$2 />', $content); // templateHandler의 이미지 경로로 인하여 생기는 절대경로 이미지등의 경로 중복 처리 - $content = preg_replace('/src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','src=$1http://', $content); + $content = preg_replace('/<(img|input)([^>]*)src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','<$1$2src=$3http://', $content); return $content; } diff --git a/config/func.inc.php b/config/func.inc.php index f82024cd1..cf2f4e1ba 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -562,7 +562,7 @@ $tag = strtolower(trim($matches[1])); $buff = trim(preg_replace('/(\/>|>)/','/>',$matches[0])); - $buff = str_replace(array('&','&'),array('&','&'),$buff); + $buff = str_replace(array('&','&'),array('&','&'),$buff); $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $buff); $oXmlParser = new XmlParser(); diff --git a/modules/tccommentnotify/conf/module.xml b/modules/tccommentnotify/conf/module.xml index 70c967428..3399716a7 100644 --- a/modules/tccommentnotify/conf/module.xml +++ b/modules/tccommentnotify/conf/module.xml @@ -1,4 +1,4 @@ - + From 989089166454dd2fbfd574925abeb965555da7d4 Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 25 Mar 2009 00:41:57 +0000 Subject: [PATCH 093/202] =?UTF-8?q?widgetStyle=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20=EC=9C=84=EC=A0=AF=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=B4=20=EB=B0=94=EB=A1=9C=20=EB=B3=B4?= =?UTF-8?q?=EC=9D=B4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5958 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/css/widget.css | 4 +++- modules/widget/tpl/widget_style_generate_code_in_page.html | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/widget/tpl/css/widget.css b/modules/widget/tpl/css/widget.css index 1103a56be..4bbf47686 100644 --- a/modules/widget/tpl/css/widget.css +++ b/modules/widget/tpl/css/widget.css @@ -56,7 +56,9 @@ div.editor { width:700px; } ul.midCommand { float:left; margin:0 0 0 10px;; padding:0; *zoom:1; } ul.midCommand li { display:block; margin-bottom:5px; list-style:none;} -a.widgetStyle { float:left; margin:0 10px 10px 0; border:1px solid #fff; overflow:hidden; *zoom:1; width:96px; height:96px;} +a.widgetStyle { float:left; margin:0 10px 10px 0; border:1px solid #fff; overflow:hidden; *zoom:1; width:96px; height:96px; position:relative; text-decoration:none;} a.widgetStyle:hover { border:1px dashed #ccc; } +a.widgetStyle:hover span { display:none; } a.widgetStyle.selected { border:1px dashed #999; } a.widgetStyle img {width:96px; height:96px; margin:1px; } +a.widgetStyle span { position:absolute; left:0; bottom:0; display:block; width:96px; background-color:#888; color:#fff; padding:4px 3px 3px 3px; opacity:.8; filter:alpha(opacity=80); text-align:center; font-family:tahoma;} diff --git a/modules/widget/tpl/widget_style_generate_code_in_page.html b/modules/widget/tpl/widget_style_generate_code_in_page.html index 4aaa814c4..2d6118943 100644 --- a/modules/widget/tpl/widget_style_generate_code_in_page.html +++ b/modules/widget/tpl/widget_style_generate_code_in_page.html @@ -31,7 +31,7 @@ - + {$widgetStyle->title}
    From de459f466e2ebfee49f2b26cb81804411ca66445 Mon Sep 17 00:00:00 2001 From: cbrghost Date: Wed, 25 Mar 2009 01:29:32 +0000 Subject: [PATCH 094/202] =?UTF-8?q?1.1.5=EC=97=90=EC=84=9C=201.2.1=20?= =?UTF-8?q?=EB=A1=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=ED=95=9C=EA=BA=BC=EB=B2=88=EC=97=90=20=ED=95=A0=20=EC=8B=9C=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20eid=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EC=82=AC=ED=95=AD=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5959 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/module/module.class.php b/modules/module/module.class.php index 7c537b90f..6f5bdb04c 100644 --- a/modules/module/module.class.php +++ b/modules/module/module.class.php @@ -183,7 +183,7 @@ // 게시글 확장변수 키 등록 if(count($document_extra_keys)) { foreach($document_extra_keys as $var_idx => $val) { - $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $val->name, $val->type, $val->is_required, $val->search, $val->default, $val->desc); + $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $val->name, $val->type, $val->is_required, $val->search, $val->default, $val->desc, 'extra_vars'.$var_idx); } // 확장변수가 존재하면 확장변수 가져오기 @@ -200,7 +200,7 @@ foreach($document as $key => $var) { if(strpos($key,'extra_vars')!==0 || !trim($var) || $var== 'N;') continue; $var_idx = str_replace('extra_vars','',$key); - $oDocumentController->insertDocumentExtraVar($module_srl, $document->document_srl, $var_idx, $var, $lang_code); + $oDocumentController->insertDocumentExtraVar($module_srl, $document->document_srl, $var_idx, $var, 'extra_vars'.$var_idx, $lang_code); } } $doc_args->page++; From 14267028d8cbf61569b07dbe86dcfe978bb30db8 Mon Sep 17 00:00:00 2001 From: cbrghost Date: Wed, 25 Mar 2009 01:35:28 +0000 Subject: [PATCH 095/202] =?UTF-8?q?=EB=B6=88=20=ED=95=84=EC=9A=94=ED=95=9C?= =?UTF-8?q?=20updateDocumentExtraKey()=20=ED=95=A8=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5960 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index fcd1b43c6..965154472 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -589,22 +589,6 @@ return $output; } - /** - * @breif documents 테이블의 확장 변수 등록 - **/ - function updateDocumentExtraKey($module_srl, $var_idx, $eid) { - if(!$module_srl || !$var_idx || !$eid) return new Object(-1,'msg_invalid_request'); - - $obj->module_srl = $module_srl; - $obj->var_idx = $var_idx; - $obj->eid = $eid; - - $output = executeQuery('document.getDocumentExtraKeys', $obj); - if(!$output->data) return executeQuery('document.insertDocumentExtraKey', $obj); - $output = executeQuery('document.updateDocumentExtraKey', $obj); - return $output; - } - /** * @brief documents 확장변수 제거 **/ From 941498c5b94decef024ecc7375952e008a0367b0 Mon Sep 17 00:00:00 2001 From: cbrghost Date: Wed, 25 Mar 2009 03:09:33 +0000 Subject: [PATCH 096/202] =?UTF-8?q?=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98?= =?UTF-8?q?=EC=9D=98=20eid=20=EA=B0=92=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EB=8B=A4=EA=B5=AD=EC=96=B4=EB=B3=84=20=EC=96=B8=EC=96=B4?= =?UTF-8?q?=EC=85=8B=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5961 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/en.lang.php | 1 + common/lang/es.lang.php | 1 + common/lang/fr.lang.php | 1 + common/lang/ge.lang.php | 1 + common/lang/jp.lang.php | 1 + common/lang/ru.lang.php | 1 + common/lang/zh-CN.lang.php | 1 + common/lang/zh-TW.lang.php | 1 + modules/module/lang/en.lang.php | 1 + modules/module/lang/es.lang.php | 2 ++ modules/module/lang/fr.lang.php | 2 ++ modules/module/lang/jp.lang.php | 1 + modules/module/lang/ru.lang.php | 2 ++ modules/module/lang/zh-CN.lang.php | 1 + modules/module/lang/zh-TW.lang.php | 1 + 15 files changed, 18 insertions(+) diff --git a/common/lang/en.lang.php b/common/lang/en.lang.php index 4d95e144e..f20460b60 100644 --- a/common/lang/en.lang.php +++ b/common/lang/en.lang.php @@ -267,6 +267,7 @@ $lang->default_value = 'Default Value'; $lang->is_active = 'Active'; $lang->is_required = 'Required Field'; + $lang->eid = '확장변수 이름'; // ftp 관련 $lang->ftp_form_title = 'Input FTP account information'; diff --git a/common/lang/es.lang.php b/common/lang/es.lang.php index 2acccf352..9d3b78048 100644 --- a/common/lang/es.lang.php +++ b/common/lang/es.lang.php @@ -273,6 +273,7 @@ $lang->default_value = 'Valor por defecto'; $lang->is_active = 'Activado'; $lang->is_required = 'Requerido'; + $lang->eid = '확장변수 이름'; // ftp 관련 $lang->ftp_form_title = 'Datos de conexión para FTP'; diff --git a/common/lang/fr.lang.php b/common/lang/fr.lang.php index 85ff4d13c..e11016ffe 100644 --- a/common/lang/fr.lang.php +++ b/common/lang/fr.lang.php @@ -267,6 +267,7 @@ $lang->default_value = 'Valeur par défaut'; $lang->is_active = 'Actif'; $lang->is_required = 'Item essentielle'; + $lang->eid = '확장변수 이름'; // ftp 관련 $lang->ftp_form_title = 'FTP 정보 입력'; diff --git a/common/lang/ge.lang.php b/common/lang/ge.lang.php index 7ff3aca98..a26b0f854 100644 --- a/common/lang/ge.lang.php +++ b/common/lang/ge.lang.php @@ -267,6 +267,7 @@ $lang->default_value = 'Standardwert'; $lang->is_active = 'Aktiv'; $lang->is_required = 'Pflichtfeld'; + $lang->eid = '확장변수 이름'; // ftp 관련 $lang->ftp_form_title = 'FTP 정보 입력'; diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index 68cbc08cd..5bd1925ee 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -267,6 +267,7 @@ $lang->default_value = 'デフォルト値'; $lang->is_active = '活性化'; $lang->is_required = '必須項目'; + $lang->eid = '확장변수 이름'; // ftp 관련 $lang->ftp_form_title = 'サーバーのFTP情報の入力'; diff --git a/common/lang/ru.lang.php b/common/lang/ru.lang.php index 75f971ded..a661688d8 100644 --- a/common/lang/ru.lang.php +++ b/common/lang/ru.lang.php @@ -286,6 +286,7 @@ $lang->is_active = 'Активно'; $lang->is_required = 'Требуемое поле'; + $lang->eid = '확장변수 이름'; // Alert-сообщения для Javascript используя XML filter $lang->filter->isnull = 'Пожалуйста, введите значение для %s'; diff --git a/common/lang/zh-CN.lang.php b/common/lang/zh-CN.lang.php index e2e7b2d8a..6c82816d7 100644 --- a/common/lang/zh-CN.lang.php +++ b/common/lang/zh-CN.lang.php @@ -267,6 +267,7 @@ $lang->default_value = '缺省值'; $lang->is_active = '激活'; $lang->is_required = '必填'; + $lang->eid = '확장변수 이름'; // ftp 相关 $lang->ftp_form_title = '设置FTP信息'; diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index fbdfdcf3c..461eb6625 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -267,6 +267,7 @@ $lang->default_value = '預設值'; $lang->is_active = '啟動'; $lang->is_required = '必填'; + $lang->eid = '확장변수 이름'; // 關於FTP $lang->ftp_form_title = '輸入FTP資訊'; diff --git a/modules/module/lang/en.lang.php b/modules/module/lang/en.lang.php index f8c1026cb..6599e8b4d 100644 --- a/modules/module/lang/en.lang.php +++ b/modules/module/lang/en.lang.php @@ -64,6 +64,7 @@ $lang->msg_move_failed = 'Failed to move'; $lang->msg_cannot_delete_for_child = 'Cannot delete a category having child categories.'; $lang->msg_limit_mid ="Only alphabets+[alphabets+numbers+_] can be used as module name."; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "It will be shown in the browser title. It will be also used in a RSS/Trackback."; $lang->about_mid = "The module name will be used like http://address/?mid=ModuleName.\n(only english alphabet + [english alphabet ,numbers, and underscore(_)] are allowed)"; diff --git a/modules/module/lang/es.lang.php b/modules/module/lang/es.lang.php index a4d7f1863..7b17c44ae 100644 --- a/modules/module/lang/es.lang.php +++ b/modules/module/lang/es.lang.php @@ -63,6 +63,8 @@ $lang->msg_no_checked_document = 'No existe documento seleccionado.'; $lang->msg_move_failed = 'No pudo moverse'; $lang->msg_cannot_delete_for_child = 'No puede eliminar la categoría si posee subcategoría.'; + $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "Esto es el valor que se mostrará en el título del navegador. También es usado en RSS/Trackback."; $lang->about_mid = "El nombre del módulo será usado como http://direccion/?mid=NombreMódulo.\n(sólo alfabeto español+[alfabeto español, números y el gión abajo(_)] son permitidos)"; diff --git a/modules/module/lang/fr.lang.php b/modules/module/lang/fr.lang.php index b853dabaa..e805876df 100644 --- a/modules/module/lang/fr.lang.php +++ b/modules/module/lang/fr.lang.php @@ -63,6 +63,8 @@ $lang->msg_no_checked_document = 'Pas un article est choisi.'; $lang->msg_move_failed = 'Echoué de bouger'; $lang->msg_cannot_delete_for_child = 'On ne peut pas supprimer une catégorie qui a des catégories inférieures.'; + $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "C'est la valeur qui se représentera dans le titre de navigateur Web. Ce sera encore utilisé dans RSS/Rétrolien."; $lang->about_mid = "Le nom de module sera utilisé comme http://adresse/?mid=ModuleName.\n(alphabet anglais + [alphabet anglais, nombres, et soulignement(_)] sont seulement permis)"; diff --git a/modules/module/lang/jp.lang.php b/modules/module/lang/jp.lang.php index d50ce5e2c..e2e3e482e 100644 --- a/modules/module/lang/jp.lang.php +++ b/modules/module/lang/jp.lang.php @@ -64,6 +64,7 @@ $lang->msg_move_failed = '移動することができませんでした。'; $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することができません。'; $lang->msg_limit_mid ="モジュール名は「 半角英小文字+[半角英小文字+半角数字+_] 」のみ出来ます。"; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "ブラウザのタイトルバーに表示される内容です。RSS/Trackbackでも使用します。"; $lang->about_mid = "モジュール名は、http://アドレス/?mid=モジュール名、のように直接呼び出せる値です(英数+[英数,_のみ可])。"; diff --git a/modules/module/lang/ru.lang.php b/modules/module/lang/ru.lang.php index 526859703..d5561c9b1 100644 --- a/modules/module/lang/ru.lang.php +++ b/modules/module/lang/ru.lang.php @@ -64,6 +64,8 @@ $lang->msg_no_checked_document = 'Нет выбранных статей.'; // translator's note: выше... $lang->msg_move_failed = 'Невозможно переместить'; $lang->msg_cannot_delete_for_child = 'Невозможно удалить категорию, имеющую дочерние категории.'; + $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "Это будет показано в заголовке браузера. Также, это будет использоваться в RSS/Трекбеке."; $lang->about_mid = "Имя модуля будет использовано как http://address/?mid=Имя_модуля.\n(только латиница, цифры и символ подчеркивания(_) разрешены.)"; diff --git a/modules/module/lang/zh-CN.lang.php b/modules/module/lang/zh-CN.lang.php index 64257a4d5..6af4cbef6 100644 --- a/modules/module/lang/zh-CN.lang.php +++ b/modules/module/lang/zh-CN.lang.php @@ -64,6 +64,7 @@ $lang->msg_move_failed = '移动失败!'; $lang->msg_cannot_delete_for_child = '不能删除有下级分类的分类!'; $lang->msg_limit_mid ="模块名称只允许英文字母+[英文字母+数字]。"; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "显示在浏览器窗口的标题值。 在RSS/Trackback也可以使用。"; $lang->about_mid = "模块名称只允许使用英文,数字和下划线。"; diff --git a/modules/module/lang/zh-TW.lang.php b/modules/module/lang/zh-TW.lang.php index 31d89347f..b036dfd9f 100644 --- a/modules/module/lang/zh-TW.lang.php +++ b/modules/module/lang/zh-TW.lang.php @@ -64,6 +64,7 @@ $lang->msg_move_failed = '移動失敗!'; $lang->msg_cannot_delete_for_child = '無法刪除有子分類的分類!'; $lang->msg_limit_mid ="模組名稱可由英文+[英文+數字+_]等非常多種組合。"; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; $lang->about_browser_title = "顯示在瀏覽器視窗的標題。在RSS/Trackback也可以使用。"; $lang->about_mid = "模組名稱只允許使用英文,數字和底線。"; From f81054f33edd3adc44f1cff4dbf922b29bfc1764 Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 25 Mar 2009 05:53:31 +0000 Subject: [PATCH 097/202] =?UTF-8?q?=EA=B0=80=EB=A1=9C=20=EB=A9=94=EB=89=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=9C=84=EC=A0=AF=20=EC=8A=A4=ED=82=A8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=84=9C=EB=B8=8C=EB=A9=94=EB=89=B4=EC=9D=98=20zIn?= =?UTF-8?q?dex=EB=A5=BC=20=ED=81=AC=EA=B2=8C=20=EC=A3=BC=EC=96=B4=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=EC=9A=94=EC=86=8C=EC=97=90=20=EA=B0=80?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5962 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/navigator/skins/horiNavigator/js/navigator.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/widgets/navigator/skins/horiNavigator/js/navigator.js b/widgets/navigator/skins/horiNavigator/js/navigator.js index 11e6da542..b6a0abc39 100755 --- a/widgets/navigator/skins/horiNavigator/js/navigator.js +++ b/widgets/navigator/skins/horiNavigator/js/navigator.js @@ -50,6 +50,7 @@ WidgetNavigator.prototype.drawMenu = function(parent_srl){ var h = jQuery('
      ') .css({ position:'absolute' }) + .css({ zIndex:9999 }) .mouseover(function(){ @@ -147,4 +148,4 @@ WidgetNavigator.prototype.getMenu = function(parent_srl){ WidgetNavigator.prototype.getDepth = function(node_srl){ var m = this.data.find('span[node_srl='+node_srl+']'); return m.parents("span").size(); -} \ No newline at end of file +} From fbb92e4b523c6a71ece7c4a1ab4185321e4e52bb Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 25 Mar 2009 06:41:23 +0000 Subject: [PATCH 098/202] #17877351 : make diff use same logic with comp git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5963 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/issuetracker/issuetracker.view.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/issuetracker/issuetracker.view.php b/modules/issuetracker/issuetracker.view.php index 7d0a1ccfe..6584232ae 100644 --- a/modules/issuetracker/issuetracker.view.php +++ b/modules/issuetracker/issuetracker.view.php @@ -177,14 +177,6 @@ $type = Context::get('type'); switch($type) { case 'diff' : - $diff = $oSvn->getDiff($path, $brev, $erev); - Context::set('diff', $diff); - - $path_tree = Svn::explodePath($path, true); - Context::set('path_tree', $path_tree); - - $this->setTemplateFile('source_diff'); - break; case 'compare' : $comp = $oSvn->getComp($path, $brev, $erev); Context::set('comp', $comp); From 659b42d81f3242dced11c5206c431ed89b069f55 Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 25 Mar 2009 07:55:32 +0000 Subject: [PATCH 099/202] =?UTF-8?q?=EC=9E=A5=EB=AC=B8=EC=9D=98=20=EA=B8=80?= =?UTF-8?q?=EC=9D=B4=20=EC=88=98=EC=A0=95=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5964 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index bcf73e998..cc23168c3 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -1362,10 +1362,12 @@ $content = preg_replace_callback('!!is', array($this,'moveStyleToHeader'), $content); // 코드 변환 - $content = preg_replace('/<(img|br)([^>]*)(\/>|>)/i','<$1$2 />', $content); + //$content = preg_replace('/<(img|br)([^>]*)(\/>|>)/i','<$1$2 />', $content); + $content = preg_replace('/<(img|br)([^>\/]*)(\/>|>)/i','<$1$2 />', $content); // templateHandler의 이미지 경로로 인하여 생기는 절대경로 이미지등의 경로 중복 처리 - $content = preg_replace('/<(img|input)([^>]*)src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','<$1$2src=$3http://', $content); + //$content = preg_replace('/<(img|input)([^>]*)src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','<$1$2src=$3http://', $content); + $content = preg_replace('/src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','src=$1http://', $content); return $content; } From 80111c43a52ba2e7adfa5bfdb6ead025f5df89d0 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 08:20:53 +0000 Subject: [PATCH 100/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5965 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/member_communication/lang/jp.lang.php | 2 +- addons/member_extra_info/conf/info.xml | 2 +- addons/mobile/conf/info.xml | 2 +- addons/openid_delegation_id/conf/info.xml | 4 ++-- addons/point_level_icon/conf/info.xml | 4 ++-- addons/rainbow_link/conf/info.xml | 2 +- addons/resize_image/conf/info.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/member_communication/lang/jp.lang.php b/addons/member_communication/lang/jp.lang.php index 3a5dfc9c6..6bbc554ef 100644 --- a/addons/member_communication/lang/jp.lang.php +++ b/addons/member_communication/lang/jp.lang.php @@ -1,3 +1,3 @@ alert_new_message_arrived = '新しいメッセージが届きました。確認しますか。'; + $lang->alert_new_message_arrived = '%d個の新しいメッセージが届きました。確認しますか。'; ?> diff --git a/addons/member_extra_info/conf/info.xml b/addons/member_extra_info/conf/info.xml index 63af756ba..4df1f36ec 100644 --- a/addons/member_extra_info/conf/info.xml +++ b/addons/member_extra_info/conf/info.xml @@ -12,7 +12,7 @@ 회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요. - 会員が登録したイメージを使ったお名前、イメージマークを使うためにはこのアドオンを活性化して下さい。 + 会員が登録したイメージニックネーム、イメージマークとして使うために、このアドオンを活性化して下さい。 此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。 diff --git a/addons/mobile/conf/info.xml b/addons/mobile/conf/info.xml index b7912d793..fc38d9489 100644 --- a/addons/mobile/conf/info.xml +++ b/addons/mobile/conf/info.xml @@ -10,7 +10,7 @@ wml, hdml, mhtml를 지원하고 그 이외의 경우에는 동작하지 않습니다. - モバイル端末機からアクセス時、ヘッダ情報を分析してメニュー - モジュールの関係を利用してWAPタグに変換して表示するアドオンです。 + モバイル端末機からアクセス時、ヘッダ情報を分析してメニュー - モジュールの関係を利用してWAPタグに変換表示するアドオンです。 wml, hdml, mhtmlをサポートし、その以外は働きません。 diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml index a3b3349f2..d4b149c6f 100644 --- a/addons/openid_delegation_id/conf/info.xml +++ b/addons/openid_delegation_id/conf/info.xml @@ -29,8 +29,8 @@ Debe utilizar luego de ingresar los valores relacionado con openid provider a través de la configuracion. - 保有するドメインをオープンIDとして活用することができます。 - 必ず設定で、OpenIDのプロバイダー関連情報を入力してから使用してください。 + 保有しているオリジナルドメインをオープンIDとして活用することができます。 + 必ず設定で、OpenIDのプロバイダー関連情報を入力してから使用して下さい。 Этот аддон позволяет Вам использовать Вашу доменное имя как OpenID. diff --git a/addons/point_level_icon/conf/info.xml b/addons/point_level_icon/conf/info.xml index baf1859ec..34567bd2d 100644 --- a/addons/point_level_icon/conf/info.xml +++ b/addons/point_level_icon/conf/info.xml @@ -17,8 +17,8 @@ 级别图标可以在模块 > 积分系统中进行选择。 - ポイントシステムを使用している場合、ユーザ名の前にレベルアイコンを表示させます。 - レベルアイコンは、「モジュール>ポイントシステム」で選択できます。 + ポイントシステムを使用する場合、ユーザ名の前にレベルアイコンの表示が出来ます。 + レベルアイコンは、「モジュール>ポイントシステム」で選択出来ます。 This addon displays level icon in front of the user name when you are using the point system. diff --git a/addons/rainbow_link/conf/info.xml b/addons/rainbow_link/conf/info.xml index acf4ecdf5..01c984779 100644 --- a/addons/rainbow_link/conf/info.xml +++ b/addons/rainbow_link/conf/info.xml @@ -29,7 +29,7 @@ <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a> tiene derecho de autor sobre rainbow.js - 「rainbow.js」をヘッダーに追加し、リンクされている文字列の色を虹色で表示します。この機能拡張の「 rainbow.js」は「<a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>」に著作権があります。 + 「rainbow.js」をヘッダーに追加し、リンクが張られている文字列の色を虹色で表示します。この機能拡張の「 rainbow.js」は「<a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>」に著作権があります。 Этот аддон добавляет файл с именем "rainbow.js" в заголовки HTML, и тогда связанный текс приобретает эффект смены цвета, подобно радуге или хамелеону. diff --git a/addons/resize_image/conf/info.xml b/addons/resize_image/conf/info.xml index 2b66623f1..acdca8094 100644 --- a/addons/resize_image/conf/info.xml +++ b/addons/resize_image/conf/info.xml @@ -12,7 +12,7 @@ 본문내에 삽입된 이미지의 크기를 본문크기에 맞게 하고 클릭시 원본을 보여주는 애드온입니다. - 本文内に挿入されたイメージのサイズを本文サイズに合わせてリーサイズし、クリックした時、オリジナルイメージを表示させます。 + 本文内に挿入されたイメージのサイズを本文の幅サイズに合わせてリーサイズし、クリックした時、オリジナルイメージを表示するアドオンです。 自动调整主题内容区内的图片大小,点击将显示原始大小的插件。 From ac49b80b4d3945105892181ca87200b0e1e054d6 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 08:21:57 +0000 Subject: [PATCH 101/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5966 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/cafeXE/conf/info.xml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/layouts/cafeXE/conf/info.xml b/layouts/cafeXE/conf/info.xml index baa9d8f06..8ff722aab 100644 --- a/layouts/cafeXE/conf/info.xml +++ b/layouts/cafeXE/conf/info.xml @@ -3,6 +3,7 @@ XE Cafe 공식 레이아웃 站点模块官方布局 虛擬網站官網版面 + XE Cafe公式レイアウト XE Cafe 공식 레이아웃입니다. @@ -12,6 +13,9 @@ 虛擬網站官網版面。 + + XE Cafeの公式レイアウトです。 + 0.1 2009-02-09 http://www.xpressengine.com @@ -20,91 +24,112 @@ XpressEngine XpressEngine XpressEngine + XpressEngine 기본 설정 常规选项 預設 + 基本設定 컬러셋 颜色 顏色設定 + カラーセット 원하시는 컬러셋을 선택해주세요. 请选择颜色。 請選擇顏色。 + カラーセットを選択して下さい。 하얀색 白色 白色 + 검은색 黑色 黑色 + 홈 페이지 URL 站点地址 主頁網址 + ホームページのURL 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. 点击LOGO时要移动的页面地址。 請輸入當用戶按了網站Logo後,要前往的頁面網址。 + ロゴをクリックする際、移動するホームページURLを入力して下さい。 로고 글자 站点标题 Logo文字 + ロゴ文字 좌측 상단의 로고 부분에 글자를 지정할 수 있습니다. 로고 이미지가 있으면 로고 이미지의 caption으로 표시됩니다. 将显示在您的站点左侧头部,如你已上传lOGO图片,此标题将变成LOGO图片的caption。 將顯示在虛擬網站的左上方,如果有上傳過Logo圖片,將會以圖片顯示。 + 左上段のロゴ部分に文章を指定します。ロゴイメージがある場合は、ロゴイメージのキャプションとして表示します。 로고이미지 LOGO图片 Logo圖片 + ロゴイメージ 레이아웃의 상단에 표시될 로고이미지를 입력하세요. 上传LOGO图片。 請輸入要顯示在版面上端的Logo圖片。(適當高度為23px的透明圖片。) + レイアウト上段に表示するロゴイメージを入力して下さい。 로고 배경 이미지 布局头部背景图片 Logo背景圖片 + ロゴ背景イメージ 로고가 있는 상단 영역의 배경 이미지를 적용하시려면 이미지를 등록해주세요. 上传LOGO所在位头部背景图片。 請在這裡上傳想要使用的背景圖片。 + ロゴがある上段領域の背景イメージを登録します。 내용 배경 이미지 内容区背景图片 內容背景圖片 + 内容の背景イメージ 내용이 있는 영역의 배경 이미지를 사용하시려면 이미지를 등록해주세요. 上传内容区背景图片。 請在這裡上傳想要使用的背景圖片。 + 内容がある領域の背景イメージを使う場合、イメージを登録して下さい。 모양 설정 样式设置 外觀設定 + 外観設定 본문 위치 内容区位置 選擇位置 + 本文位置 본문의 위치를 좌/우중 선택할 수 있습니다. 可以设置内容区的位置(左侧/右侧)。 內容區域可選擇靠左側或右側。 + 本文の位置を左/右の中、選択します。 왼쪽 左侧 左側 + 左側 오른쪽 右侧 右側 + 右側 @@ -116,6 +141,7 @@ 메인 메뉴 主菜单 主選單 + メインメニュー From 97e46a86c409270fdb4deaeda5aa7ae727e0f08b Mon Sep 17 00:00:00 2001 From: royallin Date: Wed, 25 Mar 2009 09:22:29 +0000 Subject: [PATCH 102/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5967 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/zh-TW.lang.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index 461eb6625..5a8564cba 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -226,6 +226,7 @@ $lang->success_declared = '檢舉成功!'; $lang->success_updated = '修改成功!'; $lang->success_deleted = '刪除成功!'; + $lang->success_restore = '成功還原!'; $lang->success_voted = '推薦成功!'; $lang->success_blamed = '反對成功!'; $lang->success_moved = '移動成功!'; @@ -267,7 +268,7 @@ $lang->default_value = '預設值'; $lang->is_active = '啟動'; $lang->is_required = '必填'; - $lang->eid = '확장변수 이름'; + $lang->eid = '延伸變數名稱'; // 關於FTP $lang->ftp_form_title = '輸入FTP資訊'; From 765109cc4d3a0be80363f69b405d6d63c81afd28 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 09:38:42 +0000 Subject: [PATCH 103/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5968 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/jp.lang.php | 5 ++- modules/board/lang/jp.lang.php | 18 ++++----- modules/board/skins/xe_board/skin.xml | 24 ++++++------ modules/board/skins/xe_default/skin.xml | 24 ++++++------ modules/counter/lang/jp.lang.php | 4 +- modules/document/lang/jp.lang.php | 38 ++++++++++++++++--- modules/file/lang/jp.lang.php | 2 + modules/integration_search/lang/jp.lang.php | 9 +++-- modules/issuetracker/lang/jp.lang.php | 12 +++--- .../skins/xe_issuetracker/skin.xml | 2 +- 10 files changed, 83 insertions(+), 55 deletions(-) diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index 892524c44..ee24f7072 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -25,8 +25,9 @@ $lang->newest_news = "最新ニュース"; $lang->env_setup = "環境設定"; - $lang->sso_url = "SSO(シングルサインオン) URL"; - $lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持できるようにするためには、基本になるサイトでのXEをインストールしたurlを登録してください。 (例: http://ドメイン/xe)"; + $lang->default_url = '基本URL'; + $lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持できるようにするためには、基本になるサイトでのXEをインストールしたurlを登録してください。 (例: http://ドメイン/インストールパス)"; + $lang->env_information = "環境情報"; $lang->current_version = "インストールバージョン"; diff --git a/modules/board/lang/jp.lang.php b/modules/board/lang/jp.lang.php index 3476a7476..ded28d07b 100644 --- a/modules/board/lang/jp.lang.php +++ b/modules/board/lang/jp.lang.php @@ -6,13 +6,12 @@ **/ $lang->board = '掲示板'; - $lang->except_notice = 'お知らせの非表示機能'; - $lang->use_anonymous = '익명 사용'; - + $lang->use_anonymous = '匿名機能を使う'; $lang->cmd_manage_menu = 'メニュー管理'; - $lang->list_target_item = 'Target Item'; - $lang->list_display_item = 'Display Item'; + $lang->list_target_item = 'ターゲットアイテム'; + $lang->list_display_item = '表示アイテム'; + // 項目 $lang->search_result = '検索結果'; @@ -21,25 +20,22 @@ $lang->thisissecret = '秘密文です。'; $lang->admin_mail = '管理者メールアドレス'; - - // ボタンに使用する用語 $lang->cmd_board_list = '掲示板リスト'; $lang->cmd_module_config = '掲示板共通設定'; $lang->cmd_view_info = '掲示板情報'; - $lang->cmd_list_setting = 'List Setting'; + $lang->cmd_list_setting = 'リストの設定'; // その他 $lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。'; $lang->about_board_category = 'ブログのカテゴリを作成します。
      ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。'; $lang->about_except_notice = "リストの上段に常に表示されるお知らせの書き込みを一般リストからお知らせの書き込みが表示されないようにします。"; - $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; + $lang->about_use_anonymous = '匿名掲示板として活用出来ます。スキン設定で登録者の情報を表示しないに設定をお勧めします。'; $lang->about_board = '掲示板の生成、および管理する掲示板モジュールです。'; $lang->about_consultation = "相談機能とは、管理権限のない会員に本人の書き込みだけを表示する機能です。\n但し、相談機能を使用する際は、非会員の書き込みは自動的に禁止されます。"; $lang->about_secret = '掲示板およびコメントの秘密文を登録できるようにします。'; $lang->about_admin_mail = '書き込みやコメントが掲載される時、登録メールアドレス宛にメールが送信されます。
      複数のメールアドレスへ送信する場合は「,」(半額コンマ)区切りで登録して下さい。'; - $lang->about_list_config = '게시판의 목록형식 사용시 원하는 항목들로 배치를 할 수 있습니다.
      단 스킨에서 지원하지 않는 경우 지원되지 않을 수 있습니다
      대상항목/ 표시항목의 항목을 더블클릭하면 추가/ 제거가 됩니다.'; - + $lang->about_list_config = '掲示板スタイルが「リスト型」の場合、好きな列の項目配置が出来ます。
      ただし、スキンによってこの機能をサポートしない場合もあります。
      ターゲットアイテム/表示アイテムをダブルクリックすると追加・削除が出来ます。'; $lang->msg_not_enough_point = '書き込みするためのポイントが足りません。'; ?> diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index febcd17f4..484694789 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -135,7 +135,7 @@ 목록 list - リスト + リスト型 目录型 list 列表型 @@ -143,7 +143,7 @@ 웹진 webzine - ウェブジン(webzine) + ウェブジン(webzine)型 新闻型 webzine 雜誌型 @@ -151,7 +151,7 @@ 갤러리 gallery - ギャラリー + ギャラリー型 相册型 gallery 相簿型 @@ -159,7 +159,7 @@ 포럼 forum - フォラム + フォラム型 论坛型 forum 論壇型 @@ -167,7 +167,7 @@ 블로그 blog - ブログ + ブログ型 博客型 blog 部落格型 @@ -244,7 +244,7 @@ Subtitle of Board 討論板副標題 게시판 제목 옆에 나타날 부제목을 적어주세요. - 掲示板タイトルの横に表示されるサブタイトルを入力してください。 + 掲示板タイトルの隣りに表示されるサブタイトルを入力してください。 请输入版面副标题(留空为不显示)。 Please input the subtitle of board which will be displayed beside of board title. Please input the subtitle of board which will be displayed beside of board title. @@ -454,13 +454,13 @@ 서명 표시 - 서명 표시 + 署名表示 显示签名 서명 표시 서명 표시 顯示簽名檔 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 本文内で会員の署名とプロフィルイメージの表示を設定します。 可以设置主题发布者的个人签名及个性头像显示与否。 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. @@ -524,24 +524,24 @@ 썸네일 가로크기 - サムネールの横幅 + サムネールの横サイズ 缩略图宽度 Width of Thumbnail 縮圖寬度 썸네일의 가로 크기를 지정할 수 있습니다. (기본 100px) - サムネールの横幅を指定します(デフォルト 100px)。 + サムネールの横サイズを指定します(デフォルト 100px)。 可以指定缩略图宽度(默认为 100px)。 Set the width of thumbnail. Default is 100px. 可指定縮圖寬度(預設是 100px)。 썸네일 세로크기 - サムネールの縦幅 + サムネールの縦サイズ 缩略图高度 Height of Thumbnail 縮圖高度 썸네일의 세로 크기를 지정할 수 있습니다. (기본 100px) - サムネールの縦幅を指定します(デフォルト 100px)。 + サムネールの縦サイズを指定します(デフォルト 100px)。 可以指定缩略图高度(默认为 100px)。 Set the height of thumbnail. Default is 100px. 可指定縮圖高度(預設是 100px)。 diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index b8e58ac1e..3281847b5 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -102,7 +102,7 @@ 목록 list - リスト + リスト型 目录型 list 列表型 @@ -110,7 +110,7 @@ 웹진 webzine - ウェブジン(webzine) + ウェブジン(webzine)型 新闻型 webzine 雜誌型 @@ -118,7 +118,7 @@ 갤러리 gallery - ギャラリー + ギャラリー型 相册型 gallery 相簿型 @@ -126,7 +126,7 @@ 포럼 forum - フォラム + フォラム型 论坛型 forum 論壇型 @@ -134,7 +134,7 @@ 블로그 blog - ブログ + ブログ型 博客型 blog 部落格型 @@ -211,7 +211,7 @@ Subtitle of Board 討論板副標題 게시판 제목 옆에 나타날 부제목을 적어주세요. - 掲示板タイトルの横に表示されるサブタイトルを入力してください。 + 掲示板タイトルの隣りに表示されるサブタイトルを入力してください。 请输入版面副标题(留空为不显示)。 Please input the subtitle of board which will be displayed beside of board title. Please input the subtitle of board which will be displayed beside of board title. @@ -421,13 +421,13 @@ 서명 표시 - 서명 표시 + 署名表示 显示签名 서명 표시 서명 표시 顯示簽名檔 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. - 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. + 本文内で会員の署名とプロフィルイメージの表示を設定します。 可以设置主题发布者的个人签名及个性头像显示与否。 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. 글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다. @@ -492,24 +492,24 @@ 썸네일 가로크기 - サムネールの横幅 + サムネールの横サイズ 缩略图宽度 Width of Thumbnail 縮圖寬度 썸네일의 가로 크기를 지정할 수 있습니다. (기본 100px) - サムネールの横幅を指定します(デフォルト 100px)。 + サムネールの横サイズを指定します(デフォルト 100px)。 可以指定缩略图宽度(默认为 100px)。 Set the width of thumbnail. Default is 100px. 可指定縮圖寬度(預設是 100px)。 썸네일 세로크기 - サムネールの縦幅 + サムネールの縦サイズ 缩略图高度 Height of Thumbnail 縮圖高度 썸네일의 세로 크기를 지정할 수 있습니다. (기본 100px) - サムネールの縦幅を指定します(デフォルト 100px)。 + サムネールの縦サイズを指定します(デフォルト 100px)。 可以指定缩略图高度(默认为 100px)。 Set the height of thumbnail. Default is 100px. 可指定縮圖高度(預設是 100px)。 diff --git a/modules/counter/lang/jp.lang.php b/modules/counter/lang/jp.lang.php index 37d57844c..7ab28400c 100644 --- a/modules/counter/lang/jp.lang.php +++ b/modules/counter/lang/jp.lang.php @@ -20,6 +20,6 @@ $lang->unique_visitor = '訪問者'; $lang->pageview = 'ページビュー'; - $lang->today = 'today'; - $lang->yesterday = 'yesterday'; + $lang->today = '今日'; + $lang->yesterday = '昨日'; ?> diff --git a/modules/document/lang/jp.lang.php b/modules/document/lang/jp.lang.php index 449f54bed..566390ca2 100644 --- a/modules/document/lang/jp.lang.php +++ b/modules/document/lang/jp.lang.php @@ -12,15 +12,17 @@ $lang->cmd_delete_all_thumbnail = 'すべてのサムネール削除'; $lang->title_bold = 'タイトル太字'; $lang->title_color = 'タイトルの色'; - $lang->new_document_count = '새글'; + $lang->new_document_count = '新規'; $lang->parent_category_title = '上位カテゴリ名'; $lang->category_title = 'カテゴリ名'; $lang->category_color = 'カテゴリフォント色'; $lang->expand = '拡張表示'; $lang->category_group_srls = 'グループ制限'; + $lang->cmd_make_child = '下位カテゴリ追加'; $lang->cmd_enable_move_category = "カテゴリ位置変更(選択後上のメニューをドラッグして下さい)"; + $lang->about_category_title = 'カテゴリ名を入力して下さい。'; $lang->about_expand = 'チェックすると常に展開された状態になります。'; $lang->about_category_group_srls = '選択したグループのみ、現在のカテゴリの指定が出来ます。'; @@ -63,8 +65,34 @@ 'last_update' => '最近修正日', 'ipaddress' => 'IPアドレス', ); - $lang->alias = "Alias"; - $lang->history = "히스토리"; - $lang->about_use_history = "히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우 문서 수정시 이전 리비전을 기록하고 복원할 수 있습니다."; - $lang->trace_only = "흔적만 남김"; + + $lang->alias = "アリアス(Alias)"; + $lang->history = "履歴"; + $lang->about_use_history = "履歴機能を使用するかを設定します。履歴機能を使用すると文書修正のバージョンを管理し、過去のバージョンから復元することも可能です。"; + $lang->trace_only = "記録だけ残す"; + + $lang->cmd_trash = "ごみ箱"; + $lang->cmd_restore = "復元"; + $lang->cmd_restore_all = "すべて復元"; + + $lang->in_trash = "ごみ箱"; + $lang->trash_nick_name = "削除者のニックネーム"; + $lang->trash_date = "削除日"; + $lang->trash_description = "理由"; + + // 管理者ページでのごみ箱の検索対象 + $lang->search_target_trash_list = array( + 'title' => 'タイトル', + 'content' => '内容', + 'user_id' => 'ユーザーID', + 'member_srl' => '会員番号', + 'user_name' => 'ユーザー名', + 'nick_name' => 'ニックネーム', + 'trash_member_srl' => '削除者会員番号', + 'trash_user_name' => '削除者ユーザー名', + 'trash_nick_name' => '削除者ニックネーム', + 'trash_date' => '削除日', + 'trash_ipaddress' => '削除者のIPアドレス', + ); + ?> diff --git a/modules/file/lang/jp.lang.php b/modules/file/lang/jp.lang.php index e592ebad3..2d9d20dd8 100644 --- a/modules/file/lang/jp.lang.php +++ b/modules/file/lang/jp.lang.php @@ -15,12 +15,14 @@ $lang->file_list = '添付ファイルリスト'; $lang->allow_outlink = '外部からのファイルリンク'; $lang->allow_outlink_site = '外部からのファイルリンクを許可するサイト'; + $lang->allow_outlink_format = '外部からのファイルリンクを許可する拡張子'; $lang->allowed_filesize = 'ファイルサイズ制限'; $lang->allowed_attach_size = '書き込みへの添付制限'; $lang->allowed_filetypes = '添付可能な拡張子'; $lang->enable_download_group = 'ダウンロード可能グループ'; $lang->about_allow_outlink = 'リファラーによって外部からのファイルリンクを制御出来ます。(*.wmv, *.mp3などのメディアファイルは除く)'; + $lang->about_allow_outlink_format = '外部からのファイルリンク設定に構わず、常に外部からのリンクを許可する拡張子です。複数登録時には、「半角コンマ(,)」区切りで記入して下さい。
      eg)txt,doc,zip,pdf'; $lang->about_allow_outlink_site = '外部からのファイルリンク設定に構わず、常に外部からのリンクを許可するURLです。複数登録時には、改行で記入して下さい。
      ex)http://www.zeroboard.com'; $lang->about_allowed_filesize = '一つのファイルに対して、アップロードできるファイルの最大サイズを指定します(管理者除外)。'; $lang->about_allowed_attach_size = '一つの書き込みに対して、添付できる最大サイズを指定します(管理者除外)。'; diff --git a/modules/integration_search/lang/jp.lang.php b/modules/integration_search/lang/jp.lang.php index 83955730c..17071dae7 100644 --- a/modules/integration_search/lang/jp.lang.php +++ b/modules/integration_search/lang/jp.lang.php @@ -11,9 +11,10 @@ $lang->about_target_module = "選択されたモジュールのみを検索対象とします。権限設定に注意してください。"; $lang->about_sample_code = "上のコードをレイアウトなどに追加すると統合検索が可能になります。"; $lang->msg_no_keyword = "検索語を入力してください。"; + $lang->msg_document_more_search = '継続サーチボタンを選択すると、まだ検索結果として引っかからなかった箇所を引き続き検索を行います。'; $lang->is_result_text = "'%s'に対する検索結果%d件"; - $lang->multimedia = "Images/ Movies"; + $lang->multimedia = "画像/動画"; $lang->is_search_option = array( 'document' => array( @@ -23,10 +24,10 @@ 'tag' => 'タグ', ), 'trackback' => array( - 'url' => 'URL', - 'blog_name' => 'サイト(ブログ)名', + 'url' => '対象URL', + 'blog_name' => '対象サイト(ブログ)名', 'title' => 'タイトル', - 'excerpt' => '要約内容', + 'excerpt' => '内容', ), ); diff --git a/modules/issuetracker/lang/jp.lang.php b/modules/issuetracker/lang/jp.lang.php index e22c5c9c8..5b260e756 100644 --- a/modules/issuetracker/lang/jp.lang.php +++ b/modules/issuetracker/lang/jp.lang.php @@ -41,7 +41,7 @@ $lang->assignee = '担当者'; $lang->status = 'ステータス'; $lang->action = '動作'; - $lang->display_option = 'Display Option'; + $lang->display_option = '表示オプション'; $lang->history_format_not_source = '[target][key] 変更'; $lang->history_format = '[source] から [target][key] 変更'; @@ -101,11 +101,11 @@ ); $lang->cmd_manage_issue = 'イシューの管理'; - $lang->msg_changes_from = 'View changes from'; - $lang->duration = 'Duration'; + $lang->msg_changes_from = '開始日付'; + $lang->duration = '期間'; $lang->target_list = array( - 'issue_created' => 'Created issues', - 'issue_changed' => 'Changed issues', - 'commit' => 'Repository checkins' + 'issue_created' => '生成されたイシュー', + 'issue_changed' => '変更されたイシュー', + 'commit' => 'リポジトリのソース変更(checkin)' ); ?> diff --git a/modules/issuetracker/skins/xe_issuetracker/skin.xml b/modules/issuetracker/skins/xe_issuetracker/skin.xml index c88a6e699..908f78b1b 100644 --- a/modules/issuetracker/skins/xe_issuetracker/skin.xml +++ b/modules/issuetracker/skins/xe_issuetracker/skin.xml @@ -27,7 +27,7 @@ 일반 - 普通 + 一般 General General 普通 From 9dfea2dcf9ac316ab952b4183f0040d5d8193c29 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 09:42:06 +0000 Subject: [PATCH 104/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5969 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/jp.lang.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index 5bd1925ee..193758c6f 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -226,6 +226,7 @@ $lang->success_declared = '通報しました。'; $lang->success_updated = '修正しました。'; $lang->success_deleted = '削除しました。'; + $lang->success_restore = '復元しました。'; $lang->success_voted = '推薦しました。'; $lang->success_blamed = '非推薦しました。'; $lang->success_moved = '移動しました。'; @@ -246,6 +247,7 @@ $lang->confirm_logout = 'ログアウトしますか?'; $lang->confirm_vote = '推薦しますか?'; $lang->confirm_delete = '削除しますか?'; + $lang->confirm_restore = '復元しますか?'; $lang->confirm_move = '移動しますか?'; $lang->confirm_reset = '初期化しますか?'; $lang->confirm_leave = '退会しますか?'; @@ -258,7 +260,7 @@ $lang->column_type_list['textarea'] = 'テキストエリア(textarea)'; $lang->column_type_list['checkbox'] = 'チェックボックス(checkbox)'; $lang->column_type_list['select'] = '選択(select)'; - $lang->column_type_list['radio'] = 'radio button (radio)'; + $lang->column_type_list['radio'] = 'ラジオボタン (radio)'; $lang->column_type_list['kr_zip'] = '韓国住所(zip)'; $lang->column_type_list['date'] = '日付(年月日)'; //$lang->column_type_list['jp_zip'] = '日本住所(zip)'; @@ -267,7 +269,7 @@ $lang->default_value = 'デフォルト値'; $lang->is_active = '活性化'; $lang->is_required = '必須項目'; - $lang->eid = '확장변수 이름'; + $lang->eid = '拡張変数名'; // ftp 관련 $lang->ftp_form_title = 'サーバーのFTP情報の入力'; From 34d949109db2152d959f0f9cd2281db9e01a1d98 Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 25 Mar 2009 10:22:09 +0000 Subject: [PATCH 105/202] #17881156 : added an eid for extra key git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5970 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/planet/planet.controller.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/planet/planet.controller.php b/modules/planet/planet.controller.php index fd282280e..c17ece7ee 100644 --- a/modules/planet/planet.controller.php +++ b/modules/planet/planet.controller.php @@ -73,14 +73,14 @@ $args->mid = Context::get("planet_mid"); $args->tag = Context::get("tag"); - if(in_array($args->mid, array('www','naver','hangame','promotion','notice','group','team','center','division','tf','faq','question','uit'))) return new Object(-1,'msg_not_permitted'); + if(in_array($args->mid, array('www','naver','hangame','promotion','notice','group','team','center','division','tf','faq','question','uit'))) return new Object(-1,'msg_not_permitted'); $output = $this->insertPlanet($args); if(!$output->toBool()) return $output; // planet에서 사용하는 postscript의 경우 확장변수에 추가되기에 확장변수 체크 $oDocumentController = &getController('document'); - $oDocumentController->insertDocumentExtraKey($output->get('module_srl'), 20, 'postscript', 'text', 'N', 'N', '', ''); + $oDocumentController->insertDocumentExtraKey($output->get('module_srl'), 20, 'postscript', 'text', 'N', 'N', '', '', 'ps'); // 축하 게시글 등록 $logged_info = Context::get('logged_info'); From 8f4a1117ceccaa630ab4971466a371b41038204a Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 13:52:15 +0000 Subject: [PATCH 106/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5971 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/openid_delegation_id/conf/info.xml | 6 +- common/lang/jp.lang.php | 12 +- layouts/xe_blog/conf/info.xml | 8 +- layouts/xe_official/conf/info.xml | 8 +- modules/admin/lang/jp.lang.php | 4 +- modules/board/skins/xe_board/skin.xml | 8 +- modules/board/skins/xe_default/skin.xml | 8 +- modules/board/skins/xe_guestbook/skin.xml | 2 +- modules/comment/lang/jp.lang.php | 2 +- modules/communication/lang/jp.lang.php | 4 +- modules/document/lang/jp.lang.php | 2 +- .../components/image_gallery/lang/jp.lang.php | 2 +- modules/editor/components/naver_map/info.xml | 2 +- .../components/naver_map/lang/jp.lang.php | 2 +- .../editor/skins/fckeditor/editor/lang/ja.js | 32 ++--- modules/editor/skins/xquared/skin.xml | 2 +- modules/file/lang/jp.lang.php | 2 +- modules/homepage/lang/jp.lang.php | 4 +- modules/importer/conf/info.xml | 2 +- modules/importer/lang/jp.lang.php | 32 ++--- modules/integration_search/conf/info.xml | 2 +- modules/integration_search/lang/jp.lang.php | 4 +- modules/krzip/lang/jp.lang.php | 6 +- modules/layout/faceoff/conf/info.xml | 8 +- modules/layout/lang/jp.lang.php | 122 +++++++++--------- modules/layout/lang/ko.lang.php | 2 +- modules/ldap/lang/jp.lang.php | 16 +-- modules/lifepod/skins/xe_official/skin.xml | 4 +- modules/member/lang/jp.lang.php | 23 ++-- modules/menu/lang/jp.lang.php | 8 +- modules/module/lang/jp.lang.php | 52 ++++---- modules/module/lang/ko.lang.php | 3 +- modules/opage/lang/jp.lang.php | 2 +- modules/planet/lang/jp.lang.php | 2 +- modules/planet/skins/xe_planet/skin.xml | 4 +- modules/point/lang/jp.lang.php | 4 +- modules/poll/lang/jp.lang.php | 8 +- modules/rss/lang/jp.lang.php | 15 ++- modules/spamfilter/lang/jp.lang.php | 12 +- modules/springnote/lang/jp.lang.php | 8 +- modules/springnote/skins/xe_official/skin.xml | 2 +- modules/trackback/lang/jp.lang.php | 2 +- modules/widget/lang/jp.lang.php | 10 +- modules/wiki/lang/jp.lang.php | 4 +- modules/wiki/skins/xe_wiki/skin.xml | 2 +- widgets/DroArc_clock/conf/info.xml | 8 +- widgets/category/conf/info.xml | 2 +- widgets/content/conf/info.xml | 64 +++++++-- widgets/content/skins/default/skin.xml | 6 + widgets/forum/conf/info.xml | 5 +- widgets/forum/skins/default/skin.xml | 4 +- widgets/image_counter/conf/info.xml | 22 ++-- widgets/logged_members/conf/info.xml | 4 +- widgets/logged_members/skins/default/skin.xml | 4 +- widgets/member_group/conf/info.xml | 8 +- widgets/navigator/conf/info.xml | 11 +- .../navigator/skins/horiNavigator/skin.xml | 12 ++ widgets/navigator/skins/tree/skin.xml | 3 + .../navigator/skins/vertNavigator/skin.xml | 6 + widgets/newest_comment/conf/info.xml | 4 +- .../skins/blog_newest_comment/skin.xml | 2 +- .../newest_comment/skins/xe_official/skin.xml | 4 +- widgets/newest_document/conf/info.xml | 10 +- .../skins/blog_newest_document/skin.xml | 4 +- .../skins/news_ticker/skin.xml | 4 +- .../skins/xe_official/skin.xml | 4 +- widgets/newest_images/conf/info.xml | 16 +-- widgets/newest_images/skins/default/skin.xml | 2 +- .../newest_images/skins/xe_official/skin.xml | 2 +- widgets/newest_trackback/conf/info.xml | 4 +- .../skins/blog_newest_trackback/skin.xml | 2 +- widgets/planet_document/conf/info.xml | 21 +-- .../planet_document/skins/default/skin.xml | 5 + .../skins/xe_official/skin.xml | 5 + widgets/rank_count/conf/info.xml | 8 +- widgets/rank_count/skins/default/skin.xml | 3 + widgets/rank_download/conf/info.xml | 14 +- widgets/rank_point/conf/info.xml | 8 +- widgets/rank_point/skins/default/skin.xml | 5 +- widgets/rss_reader/conf/info.xml | 2 +- widgets/site_info/conf/info.xml | 7 +- widgets/site_info/skins/default/skin.xml | 7 +- widgets/tab_newest_document/conf/info.xml | 15 ++- .../skins/xe_official/skin.xml | 4 +- widgets/tag_list/conf/info.xml | 2 +- widgets/tag_list/skins/default/skin.xml | 2 +- widgets/webzine/conf/info.xml | 24 ++-- widgets/webzine/skins/notice_style/skin.xml | 4 +- widgets/webzine/skins/xe_official/skin.xml | 4 +- widgetstyles/colorbox/skin.xml | 19 +++ widgetstyles/line/skin.xml | 16 +++ widgetstyles/memo/skin.xml | 19 +++ widgetstyles/postitWire/skin.xml | 19 +++ widgetstyles/roundFace/skin.xml | 18 +++ widgetstyles/roundWire/skin.xml | 18 +++ widgetstyles/simple/skin.xml | 13 ++ widgetstyles/simpleRound/skin.xml | 16 +++ widgetstyles/simpleSquare/skin.xml | 16 +++ widgetstyles/simpleTitle/skin.xml | 16 +++ widgetstyles/squareWire/skin.xml | 18 +++ 100 files changed, 662 insertions(+), 352 deletions(-) diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml index d4b149c6f..946029a76 100644 --- a/addons/openid_delegation_id/conf/info.xml +++ b/addons/openid_delegation_id/conf/info.xml @@ -69,7 +69,7 @@ Please input your openid.server value. Bitte geben Sie Ihre openid.server Wert. Ingrese el valor del openid.server. - openid.server の値を入力してください。 + openid.server の値を入力して下さい。 Пожалуйста, введите Ваше значение openid сервера. 請輸入 openid.server 值。
      @@ -87,7 +87,7 @@ Please input your openid.delegate value. Bitte geben Sie Ihre openid.delegate Wert. Ingresar el valor del openid.delegate - openid.delegate の値を入力してください。 + openid.delegate の値を入力して下さい。 Пожалуйста, введите Ваше значение openid делегата. 請輸入 openid.delegate 值。 @@ -105,7 +105,7 @@ Please input your X-XRDS-Location value. Bitte geben Sie Ihre X-XRDS-Standort Wert. Ingresar el valor de X-XRDS-Location - X-XRDS-Location の値を入力してください。 + X-XRDS-Location の値を入力して下さい。 Пожалуйста, введите Ваше значение X-XRDS-Локации. 請輸入 X-XRDS-Location 值。 diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index 193758c6f..9a274159d 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -205,12 +205,12 @@ $lang->about_layout = 'レイアウトでモジュールの枠をデザインします。上段のレイアウトメニューで管理できます。'; // メッセージ関連 - $lang->msg_call_server = 'サーバへ問合わせ中です。しばらくお待ちください。'; + $lang->msg_call_server = 'サーバへ問合わせ中です。しばらくお待ち下さい。'; $lang->msg_db_not_setted = 'DBが設定されていません。'; - $lang->msg_dbconnect_failed = "データベースアクセスにエラーが発生しました。\nデータベースの情報をもう一度確認してください。"; + $lang->msg_dbconnect_failed = "データベースアクセスにエラーが発生しました。\nデータベースの情報をもう一度確認して下さい。"; $lang->msg_invalid_queryid = 'クエリIDの値が無効です。'; $lang->msg_not_permitted = '権限がありません。'; - $lang->msg_input_password = 'パスワードを入力してください。'; + $lang->msg_input_password = 'パスワードを入力して下さい。'; $lang->msg_invalid_document = '無効な書き込み番号です。'; $lang->msg_invalid_request = '無効なリクエストです。'; $lang->msg_invalid_password = 'パスワードが正しくありません。'; @@ -287,8 +287,8 @@ $lang->msg_safe_mode_ftp_needed = "PHPのsafe_modeがOnの場合、FTP情報を登録することで、XEのインストール及び利用が可能になります。"; $lang->msg_ftp_not_connected = "localhostへのFTP接続エラーが発生しました。FTPポート(port)番号をはじめ、FTPサービスが可能であるかをご確認下さい。"; $lang->msg_ftp_invalid_auth_info = "ログインが失敗しました。 FTP情報を再度ご確認下さい。"; - $lang->msg_ftp_mkdir_fail = "FTPを用いたディレクトリ生成に失敗しました。FTPサーバーの設定を再度ご確認ください。"; - $lang->msg_ftp_chmod_fail = "FTPを用いたディレクトリパーミッション(permission)変更に失敗しました。FTPサーバーの設定を再度ご確認ください。"; + $lang->msg_ftp_mkdir_fail = "FTPを用いたディレクトリ生成に失敗しました。FTPサーバーの設定を再度ご確認下さい。"; + $lang->msg_ftp_chmod_fail = "FTPを用いたディレクトリパーミッション(permission)変更に失敗しました。FTPサーバーの設定を再度ご確認下さい。"; $lang->msg_ftp_connect_success = "FTP接続に成功しました。"; // xml filterで用いられているjavascript用のアラートメッセージ @@ -296,7 +296,7 @@ $lang->filter->outofrange = '%sの文字の長さを合わせて下さい。'; $lang->filter->equalto = '%sが正しくありません。'; $lang->filter->invalid_email = '%sのパターンが正しくありません。 (例: zbxe@zeroboard.com)'; - $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%sの形式が正しくありません。\\n半角の英数と記号「_」を組み合わせて入力してください。頭字は半角英文字でなければなりません。"; + $lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%sの形式が正しくありません。\\n半角の英数と記号「_」を組み合わせて入力して下さい。頭字は半角英文字でなければなりません。"; $lang->filter->invalid_homepage = '%sの形式が正しくありません。 (例: http://www.zeroboard.com)'; $lang->filter->invalid_korean = '%sの形式が正しくありません。ハングルのみ入力して下さい。'; $lang->filter->invalid_korean_number = '%sの形式が正しくありません。ハングルと半角数字で入力して下さい。'; diff --git a/layouts/xe_blog/conf/info.xml b/layouts/xe_blog/conf/info.xml index 2638a3037..a5edf8c5b 100644 --- a/layouts/xe_blog/conf/info.xml +++ b/layouts/xe_blog/conf/info.xml @@ -74,7 +74,7 @@ Colorset 顏色設定 원하시는 컬러셋을 선택해주세요. - 希望するカラーセットを選択してください。 + 希望するカラーセットを選択して下さい。 请选择颜色。 Please select a colorset you want. Bitte wählen Sie ein colorset Sie wollen. @@ -159,7 +159,7 @@ Фоновое изображение 背景圖片 배경 이미지를 사용하시려면 등록해주세요. - 背景イメージを使う場合は、登録してください。 + 背景イメージを使う場合は、登録して下さい。 要想使用背景图片请在这里上传。 Please input if you want to use background image. Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild. @@ -177,7 +177,7 @@ Профиль Изображение 部落格頭像 프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다) - プロフィールイメージを入力してください(横幅は「160px」が一番適しています)。 + プロフィールイメージを入力して下さい(横幅は「160px」が一番適しています)。 请上传博客个性头像(推荐宽度为160px)。 Please input profile image (It is recommended to set width as 160px) itte geben Sie Ihre Image-Profil (Es wird empfohlen, Breite 160px) @@ -195,7 +195,7 @@ Профиль 簡介 간단한 프로필을 입력해주세요 - 簡単なプロフィールを入力してください。 + 簡単なプロフィールを入力して下さい。 请输入简单介绍。 Please input your simple profile Bitte geben Sie Ihre Simple Profile diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml index 66015b95d..4df574c77 100644 --- a/layouts/xe_official/conf/info.xml +++ b/layouts/xe_official/conf/info.xml @@ -82,7 +82,7 @@ Colorset Set de colores 원하시는 컬러셋을 선택해주세요. - 希望するカラーセットを選択してください。 + 希望するカラーセットを選択して下さい。 请选择颜色。 請選擇顏色。 Please select a colorset you want. @@ -130,7 +130,7 @@ Изображения логотипа Imagen del logotipo 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다) - レイアウトの上段に表示されるロゴイメージを入力してください。 (縦幅が23pxである透明イメージが最も合います。) + レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージが最も合います。) 请输入显示在布局顶部的LOGO图片(高度为23px的透明图片为适)。 請輸入要顯示在版面上端的Logo圖片。(適當高度為23px的透明圖片。) Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 23px is recommended.) @@ -148,7 +148,7 @@ Домашняя страница URL URL de la página web 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. - ロゴをクリックした時に移動するホームページのURLを入力してください。 + ロゴをクリックした時に移動するホームページのURLを入力して下さい。 点击网站LOGO时要移动的页面URL。 請輸入當用戶按了網站Logo後,要前往的頁面網址。 Please input the URL to redirect when user clicks the logo @@ -166,7 +166,7 @@ Фоновое изображение Imagen de fondo 배경 이미지를 사용하시려면 등록해주세요. - 背景イメージを使う場合は、登録してください。 + 背景イメージを使う場合は、登録して下さい。 要想使用背景图片请在这里上传。 請在這裡上傳想要使用的背景圖片。 Please input if you want to use background image. diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index ee24f7072..895224c67 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -26,7 +26,7 @@ $lang->env_setup = "環境設定"; $lang->default_url = '基本URL'; - $lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持できるようにするためには、基本になるサイトでのXEをインストールしたurlを登録してください。 (例: http://ドメイン/インストールパス)"; + $lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持できるようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)"; $lang->env_information = "環境情報"; @@ -55,7 +55,7 @@ $lang->welcome_to_xe = 'XEの管理者ページです。'; $lang->about_admin_page = "管理者ページはまだ未完成です。\nクローズベータバージョンの期間に、多くの方々からご意見をいただきながら、必ず必要なコンテンツを埋めていきたいと思います。"; - $lang->about_lang_env = "上で設定された言語を、初めてサイトに訪問したユーザに同じく適用させるためには、希望する言語に変更してから「保存」ボタンをクリックしてください。"; + $lang->about_lang_env = "上で設定された言語を、初めてサイトに訪問したユーザに同じく適用させるためには、希望する言語に変更してから「保存」ボタンをクリックして下さい。"; $lang->xe_license = 'XEのライセンスはGPLです。'; $lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除できます。'; diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index 484694789..dee64730a 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -231,7 +231,7 @@ Title of Board 討論板標題 게시판의 제목을 적어주세요. - 掲示板タイトルを入力してください。 + 掲示板タイトルを入力して下さい。 请输入版面标题(留空为不显示)。 Plase input the title of board. Plase input the title of board. @@ -244,7 +244,7 @@ Subtitle of Board 討論板副標題 게시판 제목 옆에 나타날 부제목을 적어주세요. - 掲示板タイトルの隣りに表示されるサブタイトルを入力してください。 + 掲示板タイトルの隣りに表示されるサブタイトルを入力して下さい。 请输入版面副标题(留空为不显示)。 Please input the subtitle of board which will be displayed beside of board title. Please input the subtitle of board which will be displayed beside of board title. @@ -258,7 +258,7 @@ Description of Board 討論板說明 게시판 제목 아래 표시될 설명을 입력하실 수 있습니다. - 掲示板タイトルの下に表示される説明文を入力してください。 + 掲示板タイトルの下に表示される説明文を入力して下さい。 请输入版面说明(留空为不显示)。 You may input description which will be displayed under the board title. You may input description which will be displayed under the board title. @@ -272,7 +272,7 @@ Length of Subject 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以指定标题字数(0或留空为不限)。 You may set length of title. (0 or blank value will not restrict the length) You may set length of title. (0 or blank value will not restrict the length) diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index 3281847b5..6580c088a 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -198,7 +198,7 @@ Title of Board 討論板標題 게시판의 제목을 적어주세요. - 掲示板タイトルを入力してください。 + 掲示板タイトルを入力して下さい。 请输入版面标题(留空为不显示)。 Plase input the title of board. Plase input the title of board. @@ -211,7 +211,7 @@ Subtitle of Board 討論板副標題 게시판 제목 옆에 나타날 부제목을 적어주세요. - 掲示板タイトルの隣りに表示されるサブタイトルを入力してください。 + 掲示板タイトルの隣りに表示されるサブタイトルを入力して下さい。 请输入版面副标题(留空为不显示)。 Please input the subtitle of board which will be displayed beside of board title. Please input the subtitle of board which will be displayed beside of board title. @@ -225,7 +225,7 @@ Description of Board 討論板說明 게시판 제목 아래 표시될 설명을 입력하실 수 있습니다. - 掲示板タイトルの下に表示される説明文を入力してください。 + 掲示板タイトルの下に表示される説明文を入力して下さい。 请输入版面说明(留空为不显示)。 You may input description which will be displayed under the board title. You may input description which will be displayed under the board title. @@ -239,7 +239,7 @@ Length of Subject 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以指定标题字数(0或留空为不限)。 You may set length of title. (0 or blank value will not restrict the length) You may set length of title. (0 or blank value will not restrict the length) diff --git a/modules/board/skins/xe_guestbook/skin.xml b/modules/board/skins/xe_guestbook/skin.xml index fd5b9e0fe..017ce69ea 100644 --- a/modules/board/skins/xe_guestbook/skin.xml +++ b/modules/board/skins/xe_guestbook/skin.xml @@ -86,7 +86,7 @@ 標題 방명록의 제목을 적어주세요. 请输入留言本标题。 - ゲストブックのタイトルを入力してください。 + ゲストブックのタイトルを入力して下さい。 Please input the title of guestbook. Introduce el título del libro de visitas. 請輸入留言板標題。 diff --git a/modules/comment/lang/jp.lang.php b/modules/comment/lang/jp.lang.php index ee72c6745..6111b2083 100644 --- a/modules/comment/lang/jp.lang.php +++ b/modules/comment/lang/jp.lang.php @@ -14,7 +14,7 @@ $lang->comment_count = 'コメント数'; $lang->about_comment_count = 'コメントを指定した数だけ表示し、それ以上はリスト化します。'; - $lang->msg_cart_is_null = '削除するコメントを選択してください。'; + $lang->msg_cart_is_null = '削除するコメントを選択して下さい。'; $lang->msg_checked_comment_is_deleted = '%d個のコメントを削除しました。'; $lang->search_target_list = array( diff --git a/modules/communication/lang/jp.lang.php b/modules/communication/lang/jp.lang.php index a9baf4a19..8523fb433 100644 --- a/modules/communication/lang/jp.lang.php +++ b/modules/communication/lang/jp.lang.php @@ -40,8 +40,8 @@ $lang->msg_no_message = 'メッセージがありません。'; $lang->message_received = 'メッセージが届きました。'; - $lang->msg_title_is_null = 'メッセージのタイトルを入力してください。'; - $lang->msg_content_is_null = '内容を入力してください。'; + $lang->msg_title_is_null = 'メッセージのタイトルを入力して下さい。'; + $lang->msg_content_is_null = '内容を入力して下さい。'; $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信できるように設定したユーザであるため、送信できませんでした。'; $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信できませんでした。'; $lang->about_allow_message = 'メッセージを受信するかを設定します。'; diff --git a/modules/document/lang/jp.lang.php b/modules/document/lang/jp.lang.php index 566390ca2..5f9026435 100644 --- a/modules/document/lang/jp.lang.php +++ b/modules/document/lang/jp.lang.php @@ -36,7 +36,7 @@ $lang->cmd_delete_checked_document = '選択項目削除'; $lang->cmd_document_do = 'この書き込みを..'; - $lang->msg_cart_is_null = '削除する書き込みを選択してください。'; + $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; $lang->msg_category_not_moved = '移動できません。'; $lang->msg_is_secret = '非公開設定の書き込みです。'; $lang->msg_checked_document_is_deleted = '%d個の書き込みが削除されました。'; diff --git a/modules/editor/components/image_gallery/lang/jp.lang.php b/modules/editor/components/image_gallery/lang/jp.lang.php index d5845c821..02b9e838f 100644 --- a/modules/editor/components/image_gallery/lang/jp.lang.php +++ b/modules/editor/components/image_gallery/lang/jp.lang.php @@ -19,7 +19,7 @@ $lang->gallery_border_color = "ボーダーカラー"; $lang->gallery_border_thickness = "ボーダー"; $lang->gallery_bg_color = "背景色"; - $lang->about_image_list = "イメージギャラリーに追加するファイルを選択してください。選択した後、ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」ができます。"; + $lang->about_image_list = "イメージギャラリーに追加するファイルを選択して下さい。選択した後、ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」ができます。"; $lang->cmd_gallery_prev = "前のイメージ表示"; $lang->cmd_gallery_next = "次のイメージ表示"; diff --git a/modules/editor/components/naver_map/info.xml b/modules/editor/components/naver_map/info.xml index a3da76063..e45de1907 100644 --- a/modules/editor/components/naver_map/info.xml +++ b/modules/editor/components/naver_map/info.xml @@ -46,7 +46,7 @@ Naver Map API Ключ naver地圖 API key http://www.naver.com/ 에서 네이버 지도 API key를 발급 받으신 후 입력해주세요. - http://www.naver.com/ からネイバーマップのAPIキーを取得してから入力してください。 + http://www.naver.com/ からネイバーマップのAPIキーを取得してから入力して下さい。 在http://www.naver.com/ 取得naver地图 API key后输入。 Please get Naver Map API key from http://www.naver.com first and then input the key. Por favor Naver Mapa clave de la API de http://www.naver.com primero y luego ingrese la clave. diff --git a/modules/editor/components/naver_map/lang/jp.lang.php b/modules/editor/components/naver_map/lang/jp.lang.php index 9b23b7e94..59015ce64 100644 --- a/modules/editor/components/naver_map/lang/jp.lang.php +++ b/modules/editor/components/naver_map/lang/jp.lang.php @@ -17,5 +17,5 @@ $lang->msg_fail_to_socket_open = "郵便番号を検索するサーバとの接続に失敗しました。"; $lang->msg_no_result = "検索結果がありません。"; - $lang->msg_no_apikey = "ネイバーマップを使用するためには、ネイバーマップのOpenAPIキーを取得しなければなりません。\nOpenAPIキーを 管理者 > ウィジウィグエディター > ネイバーマップコンポネント設定を選択した後、入力してください。"; + $lang->msg_no_apikey = "ネイバーマップを使用するためには、ネイバーマップのOpenAPIキーを取得しなければなりません。\nOpenAPIキーを 管理者 > ウィジウィグエディター > ネイバーマップコンポネント設定を選択した後、入力して下さい。"; ?> diff --git a/modules/editor/skins/fckeditor/editor/lang/ja.js b/modules/editor/skins/fckeditor/editor/lang/ja.js index 9f0cffa66..aac2777cb 100644 --- a/modules/editor/skins/fckeditor/editor/lang/ja.js +++ b/modules/editor/skins/fckeditor/editor/lang/ja.js @@ -150,7 +150,7 @@ FormProp : "フォーム プロパティ", FontFormats : "標準;書式付き;アドレス;見出し 1;見出し 2;見出し 3;見出し 4;見出し 5;見出し 6;標準 (DIV)", // Alerts and Messages -ProcessingXHTML : "XHTML処理中. しばらくお待ちください...", +ProcessingXHTML : "XHTML処理中. しばらくお待ち下さい...", Done : "完了", PasteWordConfirm : "貼り付けを行うテキストは、ワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか?", NotCompatiblePaste : "このコマンドはインターネット・エクスプローラーバージョン5.5以上で利用可能です。クリーニングしないで貼り付けを行いますか?", @@ -158,10 +158,10 @@ UnknownToolbarItem : "未知のツールバー項目 \"%1\"", UnknownCommand : "未知のコマンド名 \"%1\"", NotImplemented : "コマンドはインプリメントされませんでした。", UnknownToolbarSet : "ツールバー設定 \"%1\" 存在しません。", -NoActiveX : "エラー、警告メッセージなどが発生した場合、ブラウザーのセキュリティ設定によりエディタのいくつかの機能が制限されている可能性があります。セキュリティ設定のオプションで\"ActiveXコントロールとプラグインの実行\"を有効にするにしてください。", -BrowseServerBlocked : "サーバーブラウザーを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認してください。", -DialogBlocked : "ダイアログウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認してください。", -VisitLinkBlocked : "新しいウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認してください。", +NoActiveX : "エラー、警告メッセージなどが発生した場合、ブラウザーのセキュリティ設定によりエディタのいくつかの機能が制限されている可能性があります。セキュリティ設定のオプションで\"ActiveXコントロールとプラグインの実行\"を有効にするにして下さい。", +BrowseServerBlocked : "サーバーブラウザーを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", +DialogBlocked : "ダイアログウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", +VisitLinkBlocked : "新しいウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", // Dialogs DlgBtnOK : "OK", @@ -171,7 +171,7 @@ DlgBtnBrowseServer : "サーバーブラウザー", DlgAdvancedTag : "高度な設定", DlgOpOther : "<その他>", DlgInfoTab : "情報", -DlgAlertUrl : "URLを挿入してください", +DlgAlertUrl : "URLを挿入して下さい", // General Dialogs Labels DlgGenNotSet : "<なし>", @@ -215,7 +215,7 @@ DlgImgAlignRight : "右", DlgImgAlignTextTop : "テキスト上部", DlgImgAlignTop : "上", DlgImgPreview : "プレビュー", -DlgImgAlertUrl : "イメージのURLを入力してください。", +DlgImgAlertUrl : "イメージのURLを入力して下さい。", DlgImgLinkTab : "リンク", // Flash Dialog @@ -273,9 +273,9 @@ DlgLnkPopHeight : "高さ", DlgLnkPopLeft : "左端からの座標で指定", DlgLnkPopTop : "上端からの座標で指定", -DlnLnkMsgNoUrl : "リンクURLを入力してください。", -DlnLnkMsgNoEMail : "メールアドレスを入力してください。", -DlnLnkMsgNoAnchor : "アンカーを選択してください。", +DlnLnkMsgNoUrl : "リンクURLを入力して下さい。", +DlnLnkMsgNoEMail : "メールアドレスを入力して下さい。", +DlnLnkMsgNoAnchor : "アンカーを選択して下さい。", DlnLnkMsgInvPopName : "ポップ・アップ名は英字で始まる文字で指定してくだい。ポップ・アップ名にスペースは含めません", // Color Dialog @@ -354,13 +354,13 @@ DlgReplaceReplAllBtn : "すべて置換え", DlgReplaceWordChk : "単語単位で一致", // Paste Operations / Dialog -PasteErrorCut : "ブラウザーのセキュリティ設定によりエディタの切り取り操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl+X)を使用してください。", -PasteErrorCopy : "ブラウザーのセキュリティ設定によりエディタのコピー操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl+C)を使用してください。", +PasteErrorCut : "ブラウザーのセキュリティ設定によりエディタの切り取り操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl+X)を使用して下さい。", +PasteErrorCopy : "ブラウザーのセキュリティ設定によりエディタのコピー操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl+C)を使用して下さい。", PasteAsText : "プレーンテキスト貼り付け", PasteFromWord : "ワード文章から貼り付け", -DlgPasteMsg2 : "キーボード(Ctrl+V)を使用して、次の入力エリア内で貼って、OKを押してください。", +DlgPasteMsg2 : "キーボード(Ctrl+V)を使用して、次の入力エリア内で貼って、OKを押して下さい。", DlgPasteSec : "ブラウザのセキュリティ設定により、エディタはクリップボード・データに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。", DlgPasteIgnoreFont : "FontタグのFace属性を無視します。", DlgPasteRemoveStyles : "スタイル定義を削除します。", @@ -375,7 +375,7 @@ DocProps : "文書 プロパティ", // Anchor Dialog DlgAnchorTitle : "アンカー プロパティ", DlgAnchorName : "アンカー名", -DlgAnchorErrorName : "アンカー名を必ず入力してください。", +DlgAnchorErrorName : "アンカー名を必ず入力して下さい。", // Speller Pages Dialog DlgSpellNotInDic : "辞書にありません", @@ -506,8 +506,8 @@ DlgDocPreview : "プレビュー", // Templates Dialog Templates : "テンプレート(雛形)", DlgTemplatesTitle : "テンプレート内容", -DlgTemplatesSelMsg : "エディターで使用するテンプレートを選択してください。
      (現在のエディタの内容は失われます):", -DlgTemplatesLoading : "テンプレート一覧読み込み中. しばらくお待ちください...", +DlgTemplatesSelMsg : "エディターで使用するテンプレートを選択して下さい。
      (現在のエディタの内容は失われます):", +DlgTemplatesLoading : "テンプレート一覧読み込み中. しばらくお待ち下さい...", DlgTemplatesNoTpl : "(テンプレートが定義されていません)", DlgTemplatesReplace : "現在のエディタの内容と置換えをします", diff --git a/modules/editor/skins/xquared/skin.xml b/modules/editor/skins/xquared/skin.xml index bcadbf905..c9fa4ec9e 100644 --- a/modules/editor/skins/xquared/skin.xml +++ b/modules/editor/skins/xquared/skin.xml @@ -32,7 +32,7 @@
      オープンソースのエディターであるXquaredを利用したウイジウイグエディターです。 - 詳細な情報は、 Xquared サイトを参照してください。 + 詳細な情報は、 Xquared サイトを参照して下さい。 http://labs.openmaru.com/projects/xquared Xquared is copyrighted free software by Alan Kang (jania902@gmail.com). diff --git a/modules/file/lang/jp.lang.php b/modules/file/lang/jp.lang.php index 2d9d20dd8..c26057e03 100644 --- a/modules/file/lang/jp.lang.php +++ b/modules/file/lang/jp.lang.php @@ -33,7 +33,7 @@ $lang->cmd_download = 'ダウンロード'; $lang->msg_not_permitted_download = 'ダウンロード権限がありません。'; - $lang->msg_cart_is_null = '削除するファイルを選択してください'; + $lang->msg_cart_is_null = '削除するファイルを選択して下さい'; $lang->msg_checked_file_is_deleted = '%d個の添付ファイルを削除しました'; $lang->msg_exceeds_limit_size = 'ファイルサイズの制限を超えたため、添付できません。'; diff --git a/modules/homepage/lang/jp.lang.php b/modules/homepage/lang/jp.lang.php index 71bcfb1c4..007ac823c 100644 --- a/modules/homepage/lang/jp.lang.php +++ b/modules/homepage/lang/jp.lang.php @@ -61,7 +61,7 @@ ); $lang->about_cafe = "ホームページサービス管理者は複数のホームページ作成、および各ホームページを簡単に管理が出来ます。"; $lang->about_cafe_title = "ホームページ名は管理のためのみ使われ、実サービスには表示されません。"; - $lang->about_domain = "複数のホームページを作成するためには、専用のドメインが必要です。オリジナルドメインやサブ ドメインがあれば結構です。
      また、 XEインストールパスも一緒に記入してください。
      ex) www.zeroboard.com/zbxe"; + $lang->about_domain = "複数のホームページを作成するためには、専用のドメインが必要です。オリジナルドメインやサブ ドメインがあれば結構です。
      また、 XEインストールパスも一緒に記入して下さい。
      ex) www.zeroboard.com/zbxe"; $lang->about_menu_names = "ホームページに使うメニュー名を言語別に指定出来ます。
      一個だけ記入した場合、他言語に一括適用されます。"; $lang->about_menu_option = "メニューを選択するとき新しいウィンドウズに開けるかを選択します。
      拡張メニューはレイアウトによって動作します。"; $lang->about_group_grant = "選択グループのみ、メニューが見えます。
      全てを解除すると非会員にも見えます。"; @@ -70,7 +70,7 @@ $lang->about_module_id = "掲示板、ページなどにリンクさせるアドレスです。
      例) http://ドメイン/[モジュールID], http://ドメイン/?mid=[モジュールID]"; $lang->about_menu_item_url = "タイプをURLにした場合、リンク先を入れて下さい。
      http://は省いて入力して下さい。"; $lang->about_menu_image_button = "テキストのメニュー名の代わりに、イメージのメニューを使えます。"; - $lang->about_cafe_delete = "ホームページを削除すると、リンクされている全てのモジュール(掲示板、ページなど)とそれに付随する書き込みが削除されます。
      ご注意ください。"; + $lang->about_cafe_delete = "ホームページを削除すると、リンクされている全てのモジュール(掲示板、ページなど)とそれに付随する書き込みが削除されます。
      ご注意下さい。"; $lang->about_cafe_admin = "ホームページ管理者の設定が出来ます。
      ホームページ管理者は 「 http://ドメイン/?act=dispHomepageManage」 として管理者ページにアクセスが出来ます。
      存在しない会員は管理者に登録できません。"; $lang->confirm_change_layout = "レイアウトの変更時、一部のレイアウト情報が失われる可能性があります。 変更しますか?"; diff --git a/modules/importer/conf/info.xml b/modules/importer/conf/info.xml index 7fbfebfb6..3c52bfd41 100644 --- a/modules/importer/conf/info.xml +++ b/modules/importer/conf/info.xml @@ -3,7 +3,7 @@ 데이터 이전 data transferation 数据导入 - ータ移転 + データ移転 Transferencia de los datos Трансферинг 資料匯入 diff --git a/modules/importer/lang/jp.lang.php b/modules/importer/lang/jp.lang.php index e0c1ea793..6aa582684 100644 --- a/modules/importer/lang/jp.lang.php +++ b/modules/importer/lang/jp.lang.php @@ -31,31 +31,31 @@ ); $lang->import_step_desc = array( - 1 => '変換するXMLファイルの種類を選択してください。', - 12 => 'データ変換を行う対象モジュールを選択してください。', - 121 => '글:', - 122 => '방명록:', - 13 => 'データ変換を行う対象カテゴリを選択してください。', - 2 => "データ変換を行うXMLファイルパスを入力してください。同じアカウントのサーバ上では、相対または絶対パスを、異なるサーバにアップロードされている場合は「http://アドレス..」を入力してください。", + 1 => '変換するXMLファイルの種類を選択して下さい。', + 12 => 'データ変換を行う対象モジュールを選択して下さい。', + 121 => '書き込み:', + 122 => 'ゲストブック:', + 13 => 'データ変換を行う対象カテゴリを選択して下さい。', + 2 => "データ変換を行うXMLファイルパスを入力して下さい。同じアカウントのサーバ上では、相対または絶対パスを、異なるサーバにアップロードされている場合は「http://アドレス..」を入力して下さい。", 3 => '会員情報と書き込みデータの情報の変換を行った後、データが合わない場合があります。この時に同期化を行うと「user_id」をもとに正しく動作するようにします。', 99 => 'データを移転しています。', ); // 案内/警告 $lang->msg_sync_member = '同期化ボタンをクリックすると会員情報と書き込みデータの情報の同期化が始まります。'; - $lang->msg_no_xml_file = 'XMLファイルが見つかりません。パスをもう一度確認してください。'; + $lang->msg_no_xml_file = 'XMLファイルが見つかりません。パスをもう一度確認して下さい。'; $lang->msg_invalid_xml_file = 'XMLファイルのフォーマットが正しくありません。'; - $lang->msg_importing = '%d個のデータの内、%d個を変換中です(止まったままの場合は「続ける」ボタンをクリックしてください)。'; + $lang->msg_importing = '%d個のデータの内、%d個を変換中です(止まったままの場合は「続ける」ボタンをクリックして下さい)。'; $lang->msg_import_finished = '%d/%d個のデータ変換が完了しました。場合によって変換されていないデータがあることもあります。'; $lang->msg_sync_completed = '会員情報、書き込みデータ、コメントのデータの同期化(変換)が完了しました。'; // その他.. - $lang->about_type_member = 'データ変換の対象が会員情報の場合は選択してください。'; - $lang->about_type_message = 'データ移転対象がメッセージの場合選択してください。'; - $lang->about_type_ttxml = 'データ移転対象が、TTXML(textcube系列)の場合選択してください。'; - $lang->about_ttxml_user_id = 'TTXML移転時に投稿者として指定するユーザIDを入力してください(すでに加入されているIDでなければなりません)。'; - $lang->about_type_module = 'データ変換の対象が書き込みデータである場合は選択してください。'; - $lang->about_type_syncmember = '会員情報と書き込みデータなどの変換を行った後、会員情報を同期化する必要がある場合は、選択してください。'; - $lang->about_importer = "ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをXEのデータに変換することができます。\n変換するためには、XML Exporterを利用して変換したい書き込みデータをXMLファイルで作成してアップロードしてください。"; - $lang->about_target_path = "添付ファイルをダウンロードするためには、ゼロボード4がインストールされた場所を入力してください。同じサーバ上にある場合は「/home/ID/public_html/bbs」のように入力し、他のサーバにある場合は、「http://ドメイン/bbs」のようにゼロボードがインストールされているURLを入力してください。"; + $lang->about_type_member = 'データ変換の対象が会員情報の場合は選択して下さい。'; + $lang->about_type_message = 'データ移転対象がメッセージの場合選択して下さい。'; + $lang->about_type_ttxml = 'データ移転対象が、TTXML(textcube系列)の場合選択して下さい。'; + $lang->about_ttxml_user_id = 'TTXML移転時に投稿者として指定するユーザIDを入力して下さい(すでに加入されているIDでなければなりません)。'; + $lang->about_type_module = 'データ変換の対象が書き込みデータである場合は選択して下さい。'; + $lang->about_type_syncmember = '会員情報と書き込みデータなどの変換を行った後、会員情報を同期化する必要がある場合は、選択して下さい。'; + $lang->about_importer = "ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをXEのデータに変換することができます。\n変換するためには、XML Exporterを利用して変換したい書き込みデータをXMLファイルで作成してアップロードして下さい。"; + $lang->about_target_path = "添付ファイルをダウンロードするためには、ゼロボード4がインストールされた場所を入力して下さい。同じサーバ上にある場合は「/home/ID/public_html/bbs」のように入力し、他のサーバにある場合は、「http://ドメイン/bbs」のようにゼロボードがインストールされているURLを入力して下さい。"; ?> diff --git a/modules/integration_search/conf/info.xml b/modules/integration_search/conf/info.xml index 6b9070880..5dc13c528 100644 --- a/modules/integration_search/conf/info.xml +++ b/modules/integration_search/conf/info.xml @@ -17,7 +17,7 @@ 選択されたモジュールを対象に統合検索を行う機能をサポートします。 - 選択されたモジュールのコンテンツ(書き込み)の中で、非公開コンテンツのみ検索から除外されますので、未公開のモジュールは対象にしないようにしてください。 + 選択されたモジュールのコンテンツ(書き込み)の中で、非公開コンテンツのみ検索から除外されますので、未公開のモジュールは対象にしないようにして下さい。 It supports integration search for chosen modules. diff --git a/modules/integration_search/lang/jp.lang.php b/modules/integration_search/lang/jp.lang.php index 17071dae7..f14f43a78 100644 --- a/modules/integration_search/lang/jp.lang.php +++ b/modules/integration_search/lang/jp.lang.php @@ -8,9 +8,9 @@ $lang->integration_search = "統合検索"; $lang->sample_code = "サンプルコード"; - $lang->about_target_module = "選択されたモジュールのみを検索対象とします。権限設定に注意してください。"; + $lang->about_target_module = "選択されたモジュールのみを検索対象とします。権限設定に注意して下さい。"; $lang->about_sample_code = "上のコードをレイアウトなどに追加すると統合検索が可能になります。"; - $lang->msg_no_keyword = "検索語を入力してください。"; + $lang->msg_no_keyword = "検索語を入力して下さい。"; $lang->msg_document_more_search = '継続サーチボタンを選択すると、まだ検索結果として引っかからなかった箇所を引き続き検索を行います。'; $lang->is_result_text = "'%s'に対する検索結果%d件"; diff --git a/modules/krzip/lang/jp.lang.php b/modules/krzip/lang/jp.lang.php index d0252d15c..ed8fe1939 100644 --- a/modules/krzip/lang/jp.lang.php +++ b/modules/krzip/lang/jp.lang.php @@ -12,9 +12,9 @@ $lang->krzip_server_query = "郵便番号検索サーバのクエリ"; // 説明 - $lang->about_krzip_server_hostname = "郵便番号を検索して結果を取り寄せるサーバのドメインを入力してください。"; - $lang->about_krzip_server_port = "郵便番号検索サーバのポート番号を入力してください。"; - $lang->about_krzip_server_query = "郵便番号検索サーバに問い合わせるクエリのURLを入力してください。"; + $lang->about_krzip_server_hostname = "郵便番号を検索して結果を取り寄せるサーバのドメインを入力して下さい。"; + $lang->about_krzip_server_port = "郵便番号検索サーバのポート番号を入力して下さい。"; + $lang->about_krzip_server_query = "郵便番号検索サーバに問い合わせるクエリのURLを入力して下さい。"; // エラーメッセージ $lang->msg_not_exists_addr = "入力された文字列では郵便番号が見つかりませんでした"; diff --git a/modules/layout/faceoff/conf/info.xml b/modules/layout/faceoff/conf/info.xml index 14de00072..8f52138de 100644 --- a/modules/layout/faceoff/conf/info.xml +++ b/modules/layout/faceoff/conf/info.xml @@ -41,7 +41,7 @@ Домашняя страница URL URL de la página web 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. - ロゴをクリックした時に移動するホームページのURLを入力してください。 + ロゴをクリックした時に移動するホームページのURLを入力して下さい。 点击网站LOGO时要移动的页面URL。 請輸入當用戶按了網站Logo後,要前往的頁面網址。 Please input the URL to redirect when user clicks the logo @@ -59,7 +59,7 @@ Изображения логотипа Imagen del logotipo 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다) - レイアウトの上段に表示されるロゴイメージを入力してください。 (縦幅が23pxである透明イメージが最も合います。) + レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージが最も合います。) 请输入显示在布局顶部的LOGO图片。(高度为23px的透明图片为适。) 請輸入要顯示在版面上端的Logo圖片。(適當高度為23px的透明圖片。) Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 23px is recommended.) @@ -77,7 +77,7 @@ LOGO символов LOGO caracteres 레이아웃의 상단에 표시될 로고 글자를 입력해주세요. 로고 이미지가 있으면 표시되지 않습니다. - レイアウトの上部に表示されるロゴの文字を入力してください。ロゴ画像がある場合は表示されません。 + レイアウトの上部に表示されるロゴの文字を入力して下さい。ロゴ画像がある場合は表示されません。 请输入网站标题(如已经使用了LOGO图片,此标题将不会显示出来)。 請輸入要顯示在版面上方的文字。 Logo at the top of the display layout, please enter the letters. If the image does not display the logo. @@ -95,7 +95,7 @@ Copyright Канцтовары Papel del derecho de autor 하단에 표시될 카피라이트 문구를 설정할 수 있습니다 - レイアウトの下部に表示されるcopyrightフレーズを入力してください。 + レイアウトの下部に表示されるcopyrightフレーズを入力して下さい。 请输入网站版权文档。 請輸入要顯示在版面下方的版權聲明。 Layout displayed in the bottom of the copyright notice please. diff --git a/modules/layout/lang/jp.lang.php b/modules/layout/lang/jp.lang.php index 94bc48267..cc9a12073 100644 --- a/modules/layout/lang/jp.lang.php +++ b/modules/layout/lang/jp.lang.php @@ -10,7 +10,7 @@ $lang->layout_name = 'レイアウト名'; $lang->layout_maker = "レイアウト作者"; - $lang->layout_license = 'License'; + $lang->layout_license = 'ライセンス'; $lang->layout_history = "変更内容 "; $lang->layout_info = "レイアウト情報"; $lang->layout_list = 'レイアウトリスト'; @@ -22,91 +22,91 @@ $lang->cmd_move_to_installed_list = "作成されたリスト表示"; $lang->about_downloaded_layouts = "ダウンロードのレイアウトリスト"; - $lang->about_title = 'モジュールとの連動をわかりやすく区分するためのタイトルを入力してください。'; + $lang->about_title = 'モジュールとの連動をわかりやすく区分するためのタイトルを入力して下さい。'; $lang->about_not_apply_menu = 'チェックを入れると連動するすべてのメニューのモジュールのレイアウトを一括変更します。'; - $lang->about_layout = "レイアウトのモジュールはサイトのレイアウトを分かりやすく作成できるようにします。レイアウトの設定とメニューのリンクで様々なモジュールで完成されたサイトデザインができます。
      ★削除・修正ができないレイアウトはブログまたは他のモジュールのレイアウトであるため、該当するモジュールで設定を行ってください。"; + $lang->about_layout = "レイアウトのモジュールはサイトのレイアウトを分かりやすく作成できるようにします。レイアウトの設定とメニューのリンクで様々なモジュールで完成されたサイトデザインができます。
      ★削除・修正ができないレイアウトはブログまたは他のモジュールのレイアウトであるため、該当するモジュールで設定を行って下さい。"; $lang->about_layout_code = - "下のレイアウトコードを修正して保存するとサービスに反映されます。 - 必ずプレビューで確認した上で保存してください。 - XEのテンプレート文法はXEテンプレートを参考してください。"; + "下のレイアウトコードを修正し、保存するとサービスに反映されます。 + 必ずプレビューで確認してから保存して下さい。 + XEのテンプレート文法はXEテンプレートを参考して下さい。"; - $lang->layout_export = '내보내기'; - $lang->layout_btn_export = '내 레이아웃 다운로드'; - $lang->about_layout_export = '현재 수정된 레이아웃을 내보내기를 합니다.'; - $lang->layout_import = '가져오기'; - $lang->about_layout_import = '가져오기를 할 경우 기존 수정된 레이아웃을 삭제가 됩니다. 가져오기를 하기전에 내보내기를 통해 백업을 하시기 바랍니다.'; + $lang->layout_export = 'エクスポート'; + $lang->layout_btn_export = 'マイレイアウトをダウンロードする'; + $lang->about_layout_export = 'カスタマイズした自分のレイアウトをエクスポートします。'; + $lang->layout_import = 'インポート'; + $lang->about_layout_import = 'インポートする場合、既存の修正されたレイアウトを上書きします。インポート前にエクスポートでバックアップすることをお勧めします。'; $lang->layout_manager = array( - 0 => '레이아웃 매니저', - 1 => '저장', - 2 => '취소', + 0 => 'レイアウトマネジャー', + 1 => '保存', + 2 => '取り消し', 3 => '형태', - 4 => '배열', - 5 => '정렬', - 6 => '고정 레이아웃', - 7 => '가변 레이아웃', - 8 => '고정+가변(내용)', + 4 => '配列', + 5 => '整列', + 6 => '固定型レイアウト', + 7 => '可変型レイアウト', + 8 => '固定+可変(内容)', 9 => '1칸', 10 => '2칸 (내용 왼쪽)', 11 => '2칸 (내용 오른쪽)', 12 => '3칸 (내용 왼쪽)', 13 => '3칸 (내용 가운데)', 14 => '3칸 (내용 오른쪽)', - 15 => '왼쪽', - 16 => '가운데', - 17 => '오른쪽', + 15 => '左', + 16 => '中央', + 17 => '右', 18 => '전체', - 19 => '레이아웃', - 20 => '위젯 추가', - 21 => '내용 위젯 추가', - 22 => '속성', - 23 => '위젯 스타일', - 24 => '수정', - 25 => '삭제', - 26 => '정렬', - 27 => '한줄 차지', - 28 => '왼쪽', - 29 => '오른쪽', - 30 => '가로 너비', - 31 => '높이', + 19 => 'レイアウト', + 20 => 'ウィジェット 추가', + 21 => '내용 ウィジェット 추가', + 22 => '属性', + 23 => 'ウィジェットスタイル', + 24 => '修正', + 25 => '削除', + 26 => '整列', + 27 => '一行차지', + 28 => '左', + 29 => '右', + 30 => '横幅サイズ', + 31 => '高さ', 32 => '바깥 여백', 33 => '안쪽 여백', - 34 => '위', - 35 => '왼', - 36 => '오른', - 37 => '아래', - 38 => '테두리', - 39 => '없음', - 40 => '배경', + 34 => '上', + 35 => '左', + 36 => '右', + 37 => '下', + 38 => 'ボーダー', + 39 => 'なし', + 40 => '背景', 41 => '색상', - 42 => '그림', - 43 => '선택', + 42 => '画像', + 43 => '選択', 44 => '배경 그림 반복', 45 => '반복', 46 => '반복 안함', 47 => '가로 반복', 48 => '세로 반복', - 49 => '적용', - 50 => '취소', - 51 => '초기화', - 52 => '글자', - 53 => '글자 폰트', - 54 => '글자 색', + 49 => '適用', + 50 => '取り消し', + 51 => '初期化', + 52 => '文字', + 53 => '文字フォント', + 54 => 'テキストの色', ); - $lang->layout_image_repository = '레이아웃 파일 저장소'; - $lang->about_layout_image_repository = '선택된 레이아웃에 사용될 이미지/플래시파일등을 올릴 수 있습니다. 내보내기에 같이 포함이 됩니다'; - $lang->msg_layout_image_target = 'gif, png, jpg, swf, flv파일만 가능합니다'; - $lang->layout_migration = '레이아웃 내보내기/ 들이기'; - $lang->about_layout_migration = '수정된 레이아웃을 tar 파일로 내보내거나 tar 파일로 저장된 것을 불러올 수 있습니다'."\n".'(아직은 faceOff레이아웃만 내보내기/들이기가 됩니다'; + $lang->layout_image_repository = 'レイアウトファイル保存場所'; + $lang->about_layout_image_repository = '選択したレイアウトに使う画像・Flashファイル等のアップロード出来ます。また、エクスポートする際、一緒に含まれます。'; + $lang->msg_layout_image_target = 'gif, png, jpg, swf, flvファイルのみ可能です。'; + $lang->layout_migration = 'レイアウトのエクスポート/インポート'; + $lang->about_layout_migration = '修正したレイアウトをtar形式の圧縮ファイルにエクスポートしたり、tar形式として保存されたファイルをインポートすることが出来ます。'."\n".'(まだ、faceOffレイアウトのみエクスポート/インポートが可能です。)'; $lang->about_faceoff = array( - 'title' => 'XpressEngine FaceOff Layout 관리자', - 'description' => 'FaceOff Layout관리자는 웹상에서 쉽게 레이아웃을 꾸밀 수 있습니다.
      아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요', - 'layout' => 'FaceOff는 위와 같은 HTML 구조로 되어 있습니다.
      이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
      위젯 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', - 'setting' => '좌측 상단의 메뉴에 대해 설명 드립니다.
      • 저장 : 설정된 내용을 저장합니다.
      • 취소 : 설정한 내용을 저장하지 않고 돌아갑니다.
      • 초기화 : 아무 설정도 되어 있지 않은 백지 상태로 돌립니다
      • 형태 : 고정/ 가변/ 고정+가변(내용)의 형태를 지정합니다.
      • 배열 : Extension 2개와 Content를 배열합니다.
      • 정렬 : 레이아웃의 위치를 정렬시킬 수 있습니다.
      ', - 'hotkey' => '마우스로 각 영역을 선택하면서 Hot Key를 이용하시면 더 쉽게 꾸미실 수 있습니다.
      • tab 키 : 위젯이 선택되어 있지 않으면 Header, Body, Footer 순으로 선택됩니다. 위젯이 선택되어 있다면 다음 위젯으로 선택이 이동됩니다.
      • Shift + tab키 : tab키와 반대 역할을 합니다.
      • Esc : 아무것도 선택되어 있지 않을때 Esc를 누르면 Neck, Extension(e1,e2),Knee 순서대로 선택이 되며 위젯이 선택되어 있다면 선택된 위젯을 감싸는 영역이 선택됩니다.
      • 방향키 : 위젯이 선택되어 있을때 방향키를 이용하여 위젯을 다른 영역으로 이동시킬 수 있습니다.
      ', - 'attribute' => '위젯을 제외한 각 영역들은 모두 배경 색/ 이미지를 지정할 수 있고 글자색(a 태그 포함됨)을 정할 수 있습니다.', + 'title' => 'XpressEngine FaceOff レイアウト管理ツール', + 'description' => 'FaceOff レイアウト管理ツールはウェブ上で手軽なレイアウト変更が可能に出来ます。
      아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요', + 'layout' => 'FaceOffは上のようなHTML構造になっています。
      이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
      ウィジェット 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', + 'setting' => '좌측 상단의 메뉴에 대해 설명 드립니다.
      • 保存 : 설정된 내용을 저장합니다.
      • 취소 : 설정한 내용을 저장하지 않고 돌아갑니다.
      • 초기화 : 아무 설정도 되어 있지 않은 백지 상태로 돌립니다
      • 형태 : 고정/ 가변/ 고정+가변(내용)의 형태를 지정합니다.
      • 배열 : Extension 2개와 Content를 배열합니다.
      • 정렬 : 레이아웃의 위치를 정렬시킬 수 있습니다.
      ', + 'hotkey' => '마우스로 각 영역을 선택하면서 Hot Key를 이용하시면 더 쉽게 꾸미실 수 있습니다.
      • tab 키 : ウィジェット이 선택되어 있지 않으면 Header, Body, Footer 순으로 선택됩니다. ウィジェット이 선택되어 있다면 다음 ウィジェット으로 선택이 이동됩니다.
      • Shift + tab키 : tab키와 반대 역할을 합니다.
      • Esc : 아무것도 선택되어 있지 않을때 Esc를 누르면 Neck, Extension(e1,e2),Knee 순서대로 선택이 되며 ウィジェット이 선택되어 있다면 선택된 ウィジェット을 감싸는 영역이 선택됩니다.
      • 방향키 : ウィジェット이 선택되어 있을때 방향키를 이용하여 ウィジェット을 다른 영역으로 이동시킬 수 있습니다.
      ', + 'attribute' => 'ウィジェット을 제외한 각 영역들은 모두 배경 색/ 이미지를 지정할 수 있고 글자색(a 태그 포함됨)을 정할 수 있습니다.', ); ?> diff --git a/modules/layout/lang/ko.lang.php b/modules/layout/lang/ko.lang.php index ab27d806c..b54bd71e5 100644 --- a/modules/layout/lang/ko.lang.php +++ b/modules/layout/lang/ko.lang.php @@ -27,7 +27,7 @@ $lang->about_layout = '레이아웃 모듈은 사이트의 레이아웃을 쉽게 만들 수 있도록 도와줍니다.
      레이아웃 설정과 메뉴의 연결을 통해서 다양한 모듈이 완성된 사이트의 모습으로 보여줄 수 있도록 합니다.
      * 삭제나 수정이 불가능한 레이아웃은 블로그나 기타 모듈의 자체 레이아웃이므로 해당 모듈로 가서 설정하셔야 합니다.'; $lang->about_layout_code = - "아래 레이아웃의 코드를 직접 수정후 저장하시면 서비스에 반영이 됩니다. + "ちゅう 레이아웃의 코드를 직접 수정후 저장하시면 서비스에 반영이 됩니다. 꼭 미리보기를 하신 후에 저장을 하세요. XE의 템플릿 문법은 XE 템플릿 을 참고하시면 됩니다."; diff --git a/modules/ldap/lang/jp.lang.php b/modules/ldap/lang/jp.lang.php index 5156f7eec..b21e754fd 100644 --- a/modules/ldap/lang/jp.lang.php +++ b/modules/ldap/lang/jp.lang.php @@ -19,15 +19,15 @@ $lang->ldap_group_entry = '会員のグループカラム'; $lang->about_use_ldap = 'LDAP認証連動のためには、下記のサーバー情報とともに上にチェックして下さい。'; - $lang->about_ldap_server = 'LDAPサーバー情報を入力してください。'; - $lang->about_ldap_port = 'LDAPサーバーのポート(port)番号情報を入力してください。'; + $lang->about_ldap_server = 'LDAPサーバー情報を入力して下さい。'; + $lang->about_ldap_port = 'LDAPサーバーのポート(port)番号情報を入力して下さい。'; $lang->about_ldap_userdn_prefix = '認証のためのユーザーDNプレフィックス(prefix)を入力して下さい。 (例: cn=)'; - $lang->about_ldap_userdn_suffix = '認証のためのユーザーDNサフィックス(suffix)を入力してください。 (例: @abc.com)'; - $lang->about_ldap_basedn = 'ディレクトリの ベースDN をログインして下さい。 (例: dc=abc,dc=com)'; + $lang->about_ldap_userdn_suffix = '認証のためのユーザーDNサフィックス(suffix)を入力して下さい。 (例: @abc.com)'; + $lang->about_ldap_basedn = 'ディレクトリのベースDNをログインして下さい。 (例: dc=abc,dc=com)'; - $lang->about_ldap_email_entry = 'LDAP情報中、会員のメールアカウント情報として使うカラム名を入力してください。 (重複不可)'; - $lang->about_ldap_username_entry = 'LDAP情報中、会員名情報として使うカラム名を入力してください。 (重複可能)'; - $lang->about_ldap_nickname_entry = 'LDAP情報中、会員のニックネーム情報として使うカラム名を入力してください。 (重複不可)'; - $lang->about_ldap_group_entry = 'LDAP情報中、会員のグループ情報として使うカラム名を入力してください。'; + $lang->about_ldap_email_entry = 'LDAP情報中、会員のメールアカウント情報として使うカラム名を入力して下さい。 (重複不可)'; + $lang->about_ldap_username_entry = 'LDAP情報中、会員名情報として使うカラム名を入力して下さい。 (重複可能)'; + $lang->about_ldap_nickname_entry = 'LDAP情報中、会員のニックネーム情報として使うカラム名を入力して下さい。 (重複不可)'; + $lang->about_ldap_group_entry = 'LDAP情報中、会員のグループ情報として使うカラム名を入力して下さい。'; ?> diff --git a/modules/lifepod/skins/xe_official/skin.xml b/modules/lifepod/skins/xe_official/skin.xml index 4c21ce3e4..18badcca7 100644 --- a/modules/lifepod/skins/xe_official/skin.xml +++ b/modules/lifepod/skins/xe_official/skin.xml @@ -53,7 +53,7 @@ Please input the title of board. Introduce el título de la junta. Введите название борту. - 掲示板のタイトルを記入してください。 + 掲示板のタイトルを記入して下さい。 請輸入討論板標題。 @@ -73,10 +73,12 @@ 是否要顯示韓國紀念日。 사용 + 使う 顯示 사용 안 함 + 使わない 隱藏 diff --git a/modules/member/lang/jp.lang.php b/modules/member/lang/jp.lang.php index 0c01336ef..a619dfe43 100644 --- a/modules/member/lang/jp.lang.php +++ b/modules/member/lang/jp.lang.php @@ -15,8 +15,8 @@ $lang->remember_user_id = 'ID保存'; $lang->already_logged = '既にログインされています。'; $lang->denied_user_id = '使用が禁じられているIDです。'; - $lang->null_user_id = 'ユーザIDをもう一度入力してください。'; - $lang->null_password = 'パスワードを入力してください。'; + $lang->null_user_id = 'ユーザIDをもう一度入力して下さい。'; + $lang->null_password = 'パスワードを入力して下さい。'; $lang->invalid_authorization = '認証できませんでした。'; $lang->invalid_user_id= '存在しないユーザIDです。'; $lang->invalid_password = '無効なパスワードです。'; @@ -63,13 +63,13 @@ 'N' => '全て禁止', ); $lang->about_allow_message = 'メッセージの許可タイプ及び対象を設定します。'; - $lang->logged_users = 'Logged Users'; + $lang->logged_users = '現在アクセス中ユーザー'; $lang->webmaster_name = 'ウェブマスターのお名前'; $lang->webmaster_email = 'ウェブマスターのメールアドレス'; - $lang->about_keep_signed = 'ブラウザを閉じてもログイン状態が維持されます。\n\nログイン維持機能を利用すると、次回からログインする必要がなくなります。\n\nただ、インターネットカフェ、学校など公共場所で利用する場合、個人情報が流出する恐れがありますので、必ずログアウトしてください。'; - $lang->about_webmaster_name = '確認メール、またはサイト管理時に使用されるウェブマスターのお名前を入力してください(デフォルト : webmaster)。'; + $lang->about_keep_signed = 'ブラウザを閉じてもログイン状態が維持されます。\n\nログイン維持機能を利用すると、次回からログインする必要がなくなります。\n\nただ、インターネットカフェ、学校など公共場所で利用する場合、個人情報が流出する恐れがありますので、必ずログアウトして下さい。'; + $lang->about_webmaster_name = '確認メール、またはサイト管理時に使用されるウェブマスターのお名前を入力して下さい(デフォルト : webmaster)。'; $lang->about_webmaster_email = 'ウェブマスターのメールアドレスを入力して下さい。'; $lang->search_target_list = array( @@ -89,12 +89,12 @@ $lang->cmd_login = 'ログイン'; $lang->cmd_logout = 'ログアウト'; $lang->cmd_signup = '会員登録'; - $lang->cmd_site_signup = 'Join'; + $lang->cmd_site_signup = '登録'; $lang->cmd_modify_member_info = '会員情報修正'; $lang->cmd_modify_member_password = 'パスワード変更'; $lang->cmd_view_member_info = '会員情報表示'; $lang->cmd_leave = '退会'; - $lang->cmd_find_member_account = 'IDとパスワードの検索'; + $lang->cmd_find_member_account = 'IDとパスワードのリマインダー'; $lang->cmd_member_list = '会員リスト'; $lang->cmd_module_config = '基本設定'; @@ -103,8 +103,8 @@ $lang->cmd_manage_id = '禁止ID管理'; $lang->cmd_manage_form = '登録フォーム管理'; $lang->cmd_view_own_document = '書き込み表示'; - $lang->cmd_trace_document = 'Trace Written Articles'; - $lang->cmd_trace_comment = 'Trace Written Comments'; + $lang->cmd_trace_document = '書き込みの追跡'; + $lang->cmd_trace_comment = 'コメント追跡'; $lang->cmd_view_scrapped_document = 'スクラップ表示'; $lang->cmd_view_saved_document = '保存ドキュメント表示'; $lang->cmd_send_email = 'メール送信'; @@ -171,7 +171,7 @@ $lang->about_column_type = '追加する登録フォームのタイプを指定して下さい。'; $lang->about_column_name = 'テンプレートで使用できる英文字の名前を入力して下さい(変数名)。'; - $lang->about_column_title = '登録または情報修正・照合時に表示されるタイトルです。'; + $lang->about_column_title = '登録または情報修正・閲覧時に表示されるタイトルです。'; $lang->about_default_value = 'デフォルトで入力される値を指定することができます。'; $lang->about_active = '活性化(有効化)にチェックを入れないと正常に表示されません。'; $lang->about_form_description = '説明欄に入力すると登録時に表示されます。'; @@ -191,7 +191,7 @@ $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることができます。'; $lang->about_image_mark = '使用者の名前の前にマークを付けることができます。'; $lang->about_profile_image = 'ユーザのプロフィールイメージが使用できるようにします。'; - $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; + $lang->about_group_image_mark = 'ユーザー名の前にグループマークを表示します。'; $lang->about_signature_max_height = '署名欄の高さのサイズを制限します。 (0 もしくは空の場合は制限なし。)'; $lang->about_accept_agreement = '登録規約をすべて読んだ上で同意します。'; @@ -203,4 +203,5 @@ $lang->about_member = "会員の作成・修正・削除することができ、グループの管理、登録フォームの管理などが行える会員管理モジュールです。デフォルトで作成されたグループにグループを追加作成して会員管理ができるようにし、登録フォーム管理では基本情報の他、フォームの入力情報を追加することができます。"; $lang->about_ssl_port = '基本ポート以外のSSLポートを利用する場合、入力して下さい。'; + $lang->add_openid = 'OpenIDの追加'; ?> diff --git a/modules/menu/lang/jp.lang.php b/modules/menu/lang/jp.lang.php index cbb44eea8..840928323 100644 --- a/modules/menu/lang/jp.lang.php +++ b/modules/menu/lang/jp.lang.php @@ -33,15 +33,15 @@ $lang->cmd_make_child = '下位メニュー追加'; $lang->cmd_move_to_installed_list = "生成されたリスト表示"; - $lang->cmd_enable_move_menu = "メニュー移動(選択後メニューをドラッグしてください)"; + $lang->cmd_enable_move_menu = "メニュー移動(選択後メニューをドラッグして下さい)"; $lang->cmd_search_mid = "mid 検索"; $lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除できません。'; - $lang->about_title = 'モジュールをリンクする際に区別し易いタイトルを入力してください。'; - $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成できるようにします。
      一定レベルまでメニューの構成ができ、入力したメニューをクリックすると詳細情報が入力できます。
      フォルダーのイメージをクリックするとメニューを拡張することができます。
      もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新してください。
      * 一定レベル以上のメニューは正しく表示されない場合があります。"; + $lang->about_title = 'モジュールをリンクする際に分かりやすいタイトルを入力して下さい。'; + $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成できるようにします。
      一定レベルまでメニューの構成ができ、入力したメニューをクリックすると詳細情報が入力できます。
      フォルダーのイメージをクリックするとメニューを拡張することができます。
      もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新して下さい。
      * 一定レベル以上のメニューは正しく表示されない場合があります。"; $lang->about_menu_name = '管理及びイメージボタンではない場合、メニュー名として表示されるタイトルです。'; - $lang->about_menu_url = "メニュー選択時、移動するURLです。
      他のモジュールとリンクを張る場合はIDの値のみ入力してください。
      内容がない場合は、メニューを選択しても何の動作もありません。"; + $lang->about_menu_url = "メニュー選択時、移動するURLです。
      他のモジュールとリンクを張る場合はIDの値のみ入力して下さい。
      内容がない場合は、メニューを選択しても何の動作もありません。"; $lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することができます。'; $lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることができます。'; $lang->about_menu_img_btn = 'イメージボタンを登録するとレイアウトで自動的にイメージボタンに入れ替わって表示されます。'; diff --git a/modules/module/lang/jp.lang.php b/modules/module/lang/jp.lang.php index e2e3e482e..cd3485f63 100644 --- a/modules/module/lang/jp.lang.php +++ b/modules/module/lang/jp.lang.php @@ -1,11 +1,11 @@ virtual_site = "Virtual Site"; + $lang->virtual_site = "バーチャル(Virtual)サイト"; $lang->module_list = "モジュールリスト"; $lang->module_index = "モジュールインデックス"; $lang->module_category = "モジュールカテゴリ"; @@ -13,7 +13,7 @@ $lang->add_shortcut = "管理者メニューに追加する"; $lang->module_action = "動作"; $lang->module_maker = "モジュール作者"; - $lang->module_license = 'License'; + $lang->module_license = 'ライセンス'; $lang->module_history = "変更内容 "; $lang->category_title = "カテゴリ名"; $lang->header_text = 'ヘッダー内容'; @@ -23,27 +23,27 @@ $lang->checked_count = '選択された書き込み数'; $lang->skin_default_info = 'スキン基本情報'; $lang->skin_author = 'スキン作者'; - $lang->skin_license = 'License'; + $lang->skin_license = 'ライセンス'; $lang->skin_history = '変更内容'; $lang->module_copy = "モジュールコピー"; - $lang->module_selector = "Module Selector"; - $lang->do_selected = "선택된 것들을..."; - $lang->bundle_setup = "일괄 기본 설정"; - $lang->bundle_addition_setup = "일괄 추가 설정"; - $lang->bundle_grant_setup = "일괄 권한 설정"; - $lang->lang_code = "언어 코드"; - $lang->filebox = "파일박스"; + $lang->module_selector = "モジュールセレクター"; + $lang->do_selected = "選択したものを..."; + $lang->bundle_setup = "一括基本設定"; + $lang->bundle_addition_setup = "一括追加設定"; + $lang->bundle_grant_setup = "一括権限設定"; + $lang->lang_code = "言語コード"; + $lang->filebox = "ファイルボックス"; $lang->header_script = "ヘッダースクリプト"; $lang->about_header_script = "HTMLの<header>と</header>の間に入れるコードを直接入力できます。
      <script、<styleまたは<metaタグなどが利用できます"; - $lang->grant_access = "Access"; - $lang->grant_manager = "Management"; + $lang->grant_access = "アクセス権限"; + $lang->grant_manager = "管理権限"; - $lang->grant_to_all = "All users"; - $lang->grant_to_login_user = "Logged users"; - $lang->grant_to_site_user = "Joined users"; - $lang->grant_to_group = "Specification group users"; + $lang->grant_to_all = "すべてのユーザー"; + $lang->grant_to_login_user = "ログインユーザー"; + $lang->grant_to_site_user = "登録ユーザー"; + $lang->grant_to_group = "特定グループのユーザー"; $lang->cmd_add_shortcut = "ショットカット追加"; $lang->cmd_install = "インストール"; @@ -52,19 +52,19 @@ $lang->cmd_manage_grant = '権限管理'; $lang->cmd_manage_skin = 'スキン管理'; $lang->cmd_manage_document = '書き込み管理'; - $lang->cmd_find_module = '모듈 찾기'; - $lang->cmd_find_langcode = 'Find lang code'; + $lang->cmd_find_module = 'モジュール検索'; + $lang->cmd_find_langcode = '言語コード検索'; $lang->msg_new_module = "モジュール作成"; $lang->msg_update_module = "モジュール修正"; - $lang->msg_module_name_exists = "既に存在するモジュール名です。他の名前を入力してください。"; + $lang->msg_module_name_exists = "既に存在するモジュール名です。他の名前を入力して下さい。"; $lang->msg_category_is_null = '登録されているカテゴリがありません。'; $lang->msg_grant_is_null = '登録された権限がありません。'; $lang->msg_no_checked_document = '選択された書き込みがありません。'; $lang->msg_move_failed = '移動することができませんでした。'; $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することができません。'; $lang->msg_limit_mid ="モジュール名は「 半角英小文字+[半角英小文字+半角数字+_] 」のみ出来ます。"; - $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; + $lang->msg_extra_name_exists = '既に存在する拡張変数名です。他の拡張変数名を入力して下さい。'; $lang->about_browser_title = "ブラウザのタイトルバーに表示される内容です。RSS/Trackbackでも使用します。"; $lang->about_mid = "モジュール名は、http://アドレス/?mid=モジュール名、のように直接呼び出せる値です(英数+[英数,_のみ可])。"; @@ -81,11 +81,11 @@ $lang->about_page_count = 'リストの下段に移動できるページのリンク数が指定できます(デフォルト10個)。'; $lang->about_admin_id = '該当するモジュールに対して最高権限を持つ管理者を指定することができます。'; $lang->about_grant = '特定権限の対象をすべて解除するとログインしていない会員ユーザまで権限が与えられます。'; - $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; + $lang->about_grant_deatil = '登録ユーザーとはcafeXEなど分譲型バーチャル(Virtual)サイトに登録した、ログインユーザーを意味します。'; $lang->about_module = "XEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理できるようにします。"; - $lang->about_extra_vars_default_value = '多重・単一選択などのデフォルト値が、複数必要な場合は、「, (コンマ)」で区切って追加することができます。'; - $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
      가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; - $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; - $lang->about_file_extension= "%s 파일만 가능합니다."; + $lang->about_search_virtual_site = "バーチャル(Virtual)サイト(:cafeXEなど)のドメインを入力後、検索して下さい。
      バーチャル(Virtual)サイト以外のモジュールは内容を空にしてから検索します。(http://は除く)"; + $lang->about_extra_vars_eid_value = '拡張変数名を入力して下さい。 (英字+[英字+数字+_]のみ可能(全て半角))'; + $lang->about_langcode = "言語ごとに異なる設定をする場合、言語コード検索を利用して下さい。"; + $lang->about_file_extension= "%s ファイルのみ可能です。"; ?> diff --git a/modules/module/lang/ko.lang.php b/modules/module/lang/ko.lang.php index 19d690ee6..c996078ed 100644 --- a/modules/module/lang/ko.lang.php +++ b/modules/module/lang/ko.lang.php @@ -84,8 +84,7 @@ $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; $lang->about_module = "XE는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다.\n모듈관리 모듈은 설치된 모든 모듈을 보여주고 관리를 도와줍니다."; $lang->about_extra_vars_default_value = '다중/단일 선택등 기본값이 여러개가 필요한 경우 , (콤마)로 연결하시면 됩니다'; - $lang->about_search_virtual_site = '가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
      가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제 - 외)'; + $lang->about_search_virtual_site = '가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
      가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)'; $lang->about_extra_vars_eid_value = '확장변수의 이름을 적어주세요. ( 영문+[영문+숫자+_] 만 가능)'; $lang->about_langcode = '언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요'; $lang->about_file_extension= "%s 파일만 가능합니다."; diff --git a/modules/opage/lang/jp.lang.php b/modules/opage/lang/jp.lang.php index 90a9dabfd..efe2eca8e 100644 --- a/modules/opage/lang/jp.lang.php +++ b/modules/opage/lang/jp.lang.php @@ -10,6 +10,6 @@ $lang->opage_caching_interval = "キャッシング時間設定"; $lang->about_opage = "外部のHTMLまたはPHPファイルをXE内部で使用できるようにするモジュールです。
      絶対パス、相対パスで指定でき、「http://」で始まるサーバの外部ページも表示できます。"; - $lang->about_opage_path= "外部ドキュメントの場所を入力してください。
      「/path1/path2/sample.php」のような絶対パス、「../path2/sample.php」のような相対パスが使用できます。
      「http://URL/sample.php」のように使用すると結果を読み込んで表示します。
      現在XEがインストールされている絶対パスは次のようになっています。
      "; + $lang->about_opage_path= "外部ドキュメントの場所を入力して下さい。
      「/path1/path2/sample.php」のような絶対パス、「../path2/sample.php」のような相対パスが使用できます。
      「http://URL/sample.php」のように使用すると結果を読み込んで表示します。
      現在XEがインストールされている絶対パスは次のようになっています。
      "; $lang->about_opage_caching_interval = "分単位で指定でき、設定された時間の間は、臨時保存されたデータを出力します。
      他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。
      「0」に指定するとキャッシングされません。"; ?> diff --git a/modules/planet/lang/jp.lang.php b/modules/planet/lang/jp.lang.php index 80cd6a6ff..6fe76518e 100644 --- a/modules/planet/lang/jp.lang.php +++ b/modules/planet/lang/jp.lang.php @@ -21,7 +21,7 @@ $lang->about_planet = "microBlogのXEモジュールです。会員別のプラネットを作成して運営することが出来ます。 ホームページパッケージで登録されているドメインからプラネットへアクセス出来ない場合もあります。 - プラネットを初期ページとして利用する場合は、ホームページパッケージで登録されているドメインと異なるドメインを登録してください。"; + プラネットを初期ページとして利用する場合は、ホームページパッケージで登録されているドメインと異なるドメインを登録して下さい。"; $lang->planet_mid = "プラネットアクセスアドレス"; $lang->about_planet_mid = "プラネットアクセスアドレスは「http://XEアドレス/プラネットアクセスアドレス」のようにダイレクトで接続できるアドレスを指します。"; diff --git a/modules/planet/skins/xe_planet/skin.xml b/modules/planet/skins/xe_planet/skin.xml index 3188e75cf..2a3ae9dee 100644 --- a/modules/planet/skins/xe_planet/skin.xml +++ b/modules/planet/skins/xe_planet/skin.xml @@ -88,7 +88,7 @@ 플래닛 검색 출력 微博搜索 플래닛 검색 출력 - 플래닛 검색 출력 + プラネット検索表示 출력 display @@ -110,7 +110,7 @@ 플래닛 메뉴 출력 微博菜单 플래닛 메뉴 출력 - 플래닛 메뉴 출력 + プラネットメニュー表示 출력 display diff --git a/modules/point/lang/jp.lang.php b/modules/point/lang/jp.lang.php index 962b69036..a5827ee74 100644 --- a/modules/point/lang/jp.lang.php +++ b/modules/point/lang/jp.lang.php @@ -15,7 +15,7 @@ $lang->about_max_level = '最高レベルを指定することができます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; $lang->level_icon = 'レベルアイコン'; - $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合がありますので、注意してください。'; + $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合がありますので、注意して下さい。'; $lang->point_name = 'ポイント名'; $lang->about_point_name = 'ポイントの名前、単位が指定できます。'; @@ -27,7 +27,7 @@ $lang->about_disable_download = 'チェックするとポイントがない場合、ダウンロードを禁止します(イメージファイル除外)。'; $lang->level_point_calc = 'レベル別ポイント計算'; - $lang->expression = 'レベル変数iを使用してJavaスクリプト数式を入力してください(例: Math.pow(i, 2) * 90)'; + $lang->expression = 'レベル変数iを使用してJavaスクリプト数式を入力して下さい(例: Math.pow(i, 2) * 90)'; $lang->cmd_exp_calc = '計算'; $lang->cmd_exp_reset = '初期化'; diff --git a/modules/poll/lang/jp.lang.php b/modules/poll/lang/jp.lang.php index cf15d9f11..632af44e2 100644 --- a/modules/poll/lang/jp.lang.php +++ b/modules/poll/lang/jp.lang.php @@ -19,14 +19,14 @@ $lang->success_poll = 'アンケート調査へのご応募ありがとうございます。'; $lang->msg_already_poll = '既にアンケート調査に応募しました。'; - $lang->msg_cart_is_null = '削除する書き込みを選択してください。'; + $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; - $lang->msg_check_poll_item = 'アンケート調査の項目を選択してください(アンケート調査ごと必須の選択項目が異なる場合があります)。'; - $lang->msg_cart_is_null = '削除するアンケートを選択してください。'; + $lang->msg_check_poll_item = 'アンケート調査の項目を選択して下さい(アンケート調査ごと必須の選択項目が異なる場合があります)。'; + $lang->msg_cart_is_null = '削除するアンケートを選択して下さい。'; $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; $lang->msg_poll_not_exists = '選択したアンケートは存在しません。'; - $lang->cmd_null_item = "アンケート調査に登録する項目がありません。\nもう一度設定してください。"; + $lang->cmd_null_item = "アンケート調査に登録する項目がありません。\nもう一度設定して下さい。"; $lang->confirm_poll_submit = "アンケート調査にご応募しますか?"; diff --git a/modules/rss/lang/jp.lang.php b/modules/rss/lang/jp.lang.php index 9883596cf..44ba181d2 100644 --- a/modules/rss/lang/jp.lang.php +++ b/modules/rss/lang/jp.lang.php @@ -1,12 +1,17 @@ 翻訳:RisaPapa + * @author zero 翻訳:RisaPapa、ミニミ * @brief 日本語言語パッケージ(基本的な内容のみ) **/ // 一般用語 - $lang->rss_disable = "RSS機能ロック"; + $lang->feed = 'RSS発行'; + $lang->total_feed = '統合RSS'; + $lang->rss_disable = "RSS機能オフ"; + $lang->feed_copyright = '著作権'; + $lang->feed_document_count = 'RSSコンテンツ数'; + $lang->feed_image = 'RSSイメージ'; $lang->rss_type = "出力するRSSタイプ"; $lang->open_rss = 'RSS配信'; $lang->open_rss_types = array( @@ -14,12 +19,18 @@ 'H' => '要約配信', 'N' => '配信しない', ); + $lang->open_feed_to_total = '統合RSSに含む'; // 説明文 $lang->about_rss_disable = "チェックするとRSSの出力を行いません。"; $lang->about_rss_type = "出力するRSSタイプを指定することができます。"; $lang->about_open_rss = '現在のモジュールに対して「RSS配信」を選択することができます。書き込みの内容が読める権限とは関係なくオプションによってRSSが配信されます。'; + $lang->about_feed_description = '発行するRSSに関する説明を入力します。未入力した場合は該当モジュールで設定された管理用説明が含まれます。'; + $lang->about_feed_copyright = '発行するRSSのコンテンツに対する著作権情報です。'; + $lang->about_part_feed_copyright = '未入力の場合、全体RSS著作権の設定と同様に適用されます。'; + $lang->about_feed_document_count = 'RSSに配信するコンテンツの数 (デフォルト : 15)'; // エラーメッセージ $lang->msg_rss_is_disabled = "RSS機能がロックされています。"; + $lang->msg_rss_invalid_image_format = 'サポートしないイメージファイルです。\nJPEG, GIF, PNGファイルのみサポートします。'; ?> diff --git a/modules/spamfilter/lang/jp.lang.php b/modules/spamfilter/lang/jp.lang.php index 53945ad8e..4581d371f 100644 --- a/modules/spamfilter/lang/jp.lang.php +++ b/modules/spamfilter/lang/jp.lang.php @@ -1,7 +1,7 @@ 翻訳:RisaPapa + * @author zero 翻訳:RisaPapa、ミニミ * @brief 日本語言語パッケージ(基本的な内容のみ) **/ @@ -16,19 +16,19 @@ $lang->limit_count = "制限数"; $lang->check_trackback = "トラックバック検査"; $lang->word = "ワード"; - $lang->hit = '히트'; - $lang->latest_hit = '최근 히트'; + $lang->hit = 'ヒット'; + $lang->latest_hit = '最近ヒット'; // 説明文 $lang->about_interval = "指定された時間内の書き込みが行えないようにします。"; $lang->about_limit_count = "指定された時間内に制限数を超える書き込みが行われるとスパムとして認識し、該当するIPを禁止します。"; $lang->about_denied_ip = "「127.0.0.* 」のように「*」で、「127.0.0」以下ののIP帯域をすべて禁止することができます。"; $lang->about_denied_word = "禁止ワードとして登録されると該当するワードが存在する書き込みを禁することができます。"; - $lang->about_check_trackback = "一つのIPからのみトラックバックを受信するようにします。"; + $lang->about_check_trackback = "一つのIPからのみトラックバックを受信するようにします。"; // メッセージ出力用 - $lang->msg_alert_limited_by_config = '%s秒以内の書き込みは禁止されます。続けて行うとスパムとして認識され、禁止IPに登録されます。'; + $lang->msg_alert_limited_by_config = '%s秒以内の書き込みは禁止されます。続けて行うとスパムとして認識され、禁止IPに登録されます。'; $lang->msg_alert_denied_word = '"%s"は使用が禁止されたワードです。'; - $lang->msg_alert_registered_denied_ip = '禁止IPに登録され、サイト内で正常な活動が制限されています。管理者にお問い合わせください。'; + $lang->msg_alert_registered_denied_ip = '禁止IPに登録され、サイト内で正常な活動が制限されています。管理者にお問い合わせ下さい。'; $lang->msg_alert_trackback_denied = '一つの書き込みには、1つのトラックバックしか受け取れません。'; ?> \ No newline at end of file diff --git a/modules/springnote/lang/jp.lang.php b/modules/springnote/lang/jp.lang.php index e074eb0e3..2b1c08639 100644 --- a/modules/springnote/lang/jp.lang.php +++ b/modules/springnote/lang/jp.lang.php @@ -22,9 +22,9 @@ $lang->cmd_view_info = 'スプリングノート情報'; $lang->about_springnote = "スプリングノートは、「openmaru.com」から提供されるウィキサービスです。
      スプリングノート連動モジュールは、スプリングノートの特定のページを自分のコンテンツの閲覧することができるようにするモジュールです。"; - $lang->about_springnote_openid = "スプリングノートでページを作成したオープンIDを入力してください。"; - $lang->about_springnote_userkey = 'スプリングノートと連動させるためのユーザKeyを入力してください。
      [ユーザーキー受信]をクリックして入力して生成されたキーの値を入力してください。'; - $lang->about_springnote_pageid = '使用するスプリングノートの特定ページを出力させたい場合、「pageid」の値を入力してください。'; + $lang->about_springnote_openid = "スプリングノートでページを作成したオープンIDを入力して下さい。"; + $lang->about_springnote_userkey = 'スプリングノートと連動させるためのユーザKeyを入力して下さい。
      [ユーザーキー受信]をクリックして入力して生成されたキーの値を入力して下さい。'; + $lang->about_springnote_pageid = '使用するスプリングノートの特定ページを出力させたい場合、「pageid」の値を入力して下さい。'; $lang->about_springnote_pageid_setup = 'ページ番号を指定する際に、該当ページのみ表示(リストを含まない)、該当ページから表示(リストを含む)などを指定することができます。'; - $lang->about_springnote_domain = '自分のスプリングノートではない他のドメインのスプリングノートを入力することができます( 「http://domain.springnote.com」でドメインの値を入力してください )。'; + $lang->about_springnote_domain = '自分のスプリングノートではない他のドメインのスプリングノートを入力することができます( 「http://domain.springnote.com」でドメインの値を入力して下さい )。'; ?> diff --git a/modules/springnote/skins/xe_official/skin.xml b/modules/springnote/skins/xe_official/skin.xml index d1eaebfd5..ce2f1654a 100644 --- a/modules/springnote/skins/xe_official/skin.xml +++ b/modules/springnote/skins/xe_official/skin.xml @@ -67,7 +67,7 @@ Title of Board 討論板標題 게시판의 제목을 적어주세요. - 掲示板のタイトルを入力してください。 + 掲示板のタイトルを入力して下さい。 请输入版面标题(留空为不显示)。 Please input the title of board. 請輸入討論板標題(留白為不顯示)。 diff --git a/modules/trackback/lang/jp.lang.php b/modules/trackback/lang/jp.lang.php index 4517dbf31..720bd654f 100644 --- a/modules/trackback/lang/jp.lang.php +++ b/modules/trackback/lang/jp.lang.php @@ -7,7 +7,7 @@ $lang->cmd_toggle_checked_trackback = '選択トラックバック反転'; $lang->cmd_delete_checked_trackback = '選択トラックバック削除'; - $lang->msg_cart_is_null = '削除する書き込みを選択してください。'; + $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; $lang->msg_checked_trackback_is_deleted = '%d個のトラックバックが削除されました。'; $lang->send_trackback_url = '送信するURL'; diff --git a/modules/widget/lang/jp.lang.php b/modules/widget/lang/jp.lang.php index 557f7e61c..cca6a48b8 100644 --- a/modules/widget/lang/jp.lang.php +++ b/modules/widget/lang/jp.lang.php @@ -27,18 +27,18 @@ $lang->widget_margin_bottom = '下 '; $lang->widget_margin_left= '左'; $lang->about_widget_fix_width = 'チェックすると横幅が固定されます。'; - $lang->about_widget_width = '縦幅サイズを選択してください。'; - $lang->about_widget_position = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択してください。'; - $lang->about_widget_margin = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択してください。'; + $lang->about_widget_width = '縦幅サイズを選択して下さい。'; + $lang->about_widget_position = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; + $lang->about_widget_margin = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; $lang->about_widget_cache = '指定された時間内にキャッシュされたデータが利用できます。'; $lang->generated_code = '生成コード'; - $lang->widgetstyle= '위젯스타일'; + $lang->widgetstyle= 'ウィジェットスタイル'; $lang->msg_widget_is_not_exists = '%s ウィジェットが見つかりません。'; $lang->msg_widget_object_is_null = '%s ウィジェットのオブジェクトが生成できません。'; $lang->msg_widget_proc_is_null = '%s ウィセットの proc() が実行できません。'; - $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; + $lang->msg_widget_skin_is_null = 'ウィセットスキンを選択してから正常に動作します。'; $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
      一番下にテンプレートファイルに適用できるコードが出力されます。'; $lang->about_widget_code_in_page = '下に必要な値を入力した後、追加ボタンをクリックするとページ内にウィジェットが挿入されます。'; diff --git a/modules/wiki/lang/jp.lang.php b/modules/wiki/lang/jp.lang.php index f064104fd..e163c7cea 100644 --- a/modules/wiki/lang/jp.lang.php +++ b/modules/wiki/lang/jp.lang.php @@ -10,6 +10,6 @@ $lang->cmd_create = '新規作成'; $lang->cmd_wiki_list = 'リスト'; $lang->cmd_view_info = 'wiki情報'; - $lang->use_comment = 'Use comment'; - $lang->about_use_comment = 'You may configure to enable comments.'; + $lang->use_comment = 'コメント機能を使う'; + $lang->about_use_comment = 'コメント機能をオン・オフを設定します。'; ?> diff --git a/modules/wiki/skins/xe_wiki/skin.xml b/modules/wiki/skins/xe_wiki/skin.xml index d8f27792c..07613c54f 100644 --- a/modules/wiki/skins/xe_wiki/skin.xml +++ b/modules/wiki/skins/xe_wiki/skin.xml @@ -3,7 +3,7 @@ XE Default Skin XE维基默认皮肤 XE維基預設面板 - XE Default Skin + XE基本スキン XE Default Skin diff --git a/widgets/DroArc_clock/conf/info.xml b/widgets/DroArc_clock/conf/info.xml index 40c63d2c3..78152c56d 100644 --- a/widgets/DroArc_clock/conf/info.xml +++ b/widgets/DroArc_clock/conf/info.xml @@ -32,14 +32,14 @@ text 가로길이 宽度 - 横幅 + 横幅サイズ設定 Width Ancho Ширина 寬度 가로길이를 지정하실 수 있습니다. (기본 150px) 可以设置宽度大小。 (默认为 150px) - 横幅のサイズの指定ができます(デフォルト150px)。 + 横幅のサイズを指定します(デフォルト150px)。 It will be able to set the width. (default is 150px) Se estará en condiciones de establecer el ancho. (Por defecto es 150 px) Возможно установить ширину. (стандартное значение 150px) @@ -49,14 +49,14 @@ text 세로길이 高度 - 縦幅 + 縦幅サイズ設定 Высота Height Altura 高度 세로길이를 지정하실 수 있습니다. (기본 64px) 可以设置高度大小。(默认为 64px) - 縦幅のサイズの指定ができます(デフォルト64px)。 + 縦幅のサイズを指定します(デフォルト64px)。 It will be able to set the width. (default is 64px) Se estará en condiciones de establecer el ancho. (Por defecto es 64px) Возможно установить высоту. (стандартное значение 64px) diff --git a/widgets/category/conf/info.xml b/widgets/category/conf/info.xml index 9f919d832..506ee6afb 100644 --- a/widgets/category/conf/info.xml +++ b/widgets/category/conf/info.xml @@ -41,7 +41,7 @@ Selected module will be target. Please select only 1 (one) module. 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. 선택하신 모듈을 대상으로 합니다. 꼭 한개의 모듈만 선택해 주세요. - 選択されたモジュールを対象とします。必ず一つのモジュールのみ選択してください。 + 選択されたモジュールを対象とします。必ず一つのモジュールのみ選択して下さい。 将把所选模块当中的主题作为对象。只能选一个模块。 將所選擇的模組作為目標。只能選擇一個模組。 diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index 9640d9754..a413a12fe 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -4,10 +4,12 @@ Content widget 全局内容控件 內容組件 + Content 위젯 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. 以各种样式显示主题,评论,附件等站内内容的全局控件。 是種可輸出討論板、評論,附加檔案等內容的控件。 + 掲示板の書き込み、コメント、添付ファイルなどコンテンツを出力するウィジェットです。 0.1 2009-03-16 @@ -28,12 +30,14 @@ 추출대상 对象 目標 + 抽出対象 document 게시물 게시물 主题 主題 + 書き込み comment @@ -41,6 +45,7 @@ 댓글 评论 評論 + コメント image @@ -48,6 +53,7 @@ 첨부이미지 图片 圖片 + 添付イメージ trackback @@ -55,6 +61,7 @@ 트랙백 引用 引用 + トラックバック rss @@ -62,6 +69,7 @@ RSS RSS RSS + RSS @@ -70,12 +78,14 @@ 내용형태 内容样式 內容樣式 + 内容のタイプ normal 제목 제목 标题 標題 + タイトル image_title @@ -83,6 +93,7 @@ 이미지+제목 图片+标题 圖片+標題 + 画像+タイトル gallery @@ -90,6 +101,7 @@ 겔러리 相册 相簿 + ギャラリー image_title_content @@ -97,6 +109,7 @@ 이미지+제목+내용 图片+标题+内容 圖片+標題+內容 + 画像+タイトル+内容 @@ -105,12 +118,14 @@ 탭형태 选项卡样式 分頁樣式 + タブのスタイル none 없음 없음 + なし tab_top @@ -118,6 +133,7 @@ 상단 탭형 顶端选项卡 頂端分頁 + 上段配置型タブ tab_left @@ -125,6 +141,7 @@ 왼쪽 탭형 左侧选项卡 左側分頁 + 左側の配置型タブ @@ -134,12 +151,14 @@ 표시항목 및 순서 显示项及顺序 顯示項目順序 + 表示項目、および順番 title 제목 제목 标题 標題 + タイトル thumbnail @@ -147,6 +166,7 @@ 섬네일 缩略图 縮圖 + サムネール regdate @@ -154,6 +174,7 @@ 등록일 发布日期 發表日期 + 登録日 nickname @@ -161,6 +182,7 @@ 글쓴이 发布者 作者 + 登録者 content @@ -168,6 +190,7 @@ 내용 内容 內容 + 内容 @@ -177,12 +200,14 @@ 게시판 이름 표시 显示版面名称 討論板名稱 + 掲示板名の表示 Y 출력 출력 显示 顯示 + 表示 N @@ -190,6 +215,7 @@ 출력하지 않음 不显示 不顯示 + 表示しない/name> @@ -199,12 +225,14 @@ 댓글수 표시 显示评论数 評論數 + コメント数 Y 출력 출력 显示 顯示 + 表示 N @@ -212,6 +240,7 @@ 출력하지 않음 不显示 不顯示 + 表示しない @@ -221,12 +250,14 @@ 엮인글수 표시 显示引用数 引用數 + トラックバック数の表示 Y 출력 출력 显示 顯示 + 表示 N @@ -234,6 +265,7 @@ 출력하지 않음 不显示 不顯示 + 表示しない @@ -242,12 +274,14 @@ 분류 표시 显示分类 分類 + 분류 표시 Y 출력 출력 显示 顯示 + 출력 N @@ -255,6 +289,7 @@ 출력하지 않음 不显示 不顯示 + 表示しない @@ -263,12 +298,14 @@ 아이콘 표시 显示图标 圖示 + 아이콘 표시 Y 출력 출력 显示 顯示 + 출력 N @@ -276,6 +313,7 @@ 출력하지 않음 不显示 不顯示 + 表示しない @@ -292,7 +330,7 @@ 排列順序 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. 可以按照指定的顺序进行排序。 - 登録順、変更順にソートできます。 + 登録順、または変更順にソートします。 The list of newewst articles may be sorted by submitted order or modified order. La lista de los documentos recientes pueden ser ordenados en el orden del agregado o en el de modificados. Список последних статей может быть отсортирован по дате размещения или изменения. @@ -329,7 +367,7 @@ 排列方式 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. 对其排序对象可进行升序/降序方式排序。 - ソートタイプを、降順、昇順にソートできます。 + ソートタイプを、降順、または昇順に設定します。 You can sort target articles by asending or desending order. Usted puede ordenar los documentos en orden acendente o en orden descendente. Вы можете сортировать статьи в порядке возрастания или убывания. @@ -359,7 +397,7 @@ select 썸네일 생성 방법 - 生成方法 + サムネール生成方法 缩略图生成方式 Thumbnail Type Тип миниатюры @@ -392,14 +430,14 @@ text 이미지 가로크기 - イメージ横幅 + イメージ横幅サイズ 宽度 Width of Image Ancho de la imagen Ширина изображения 圖片寬度 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) - 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 + 表示するイメージの横幅サイズを指定します(デフォルト100)。 可以指定要显示的图片宽度。(默认为100) You can set the width of image. (100 as default) Usted puede definir el ancho de la imagen. (predefinido:100px) @@ -409,7 +447,7 @@ text 이미지 세로크기 - イメージ縦幅 + イメージ縦幅サイズ 高度 Height of Image Высота изображения @@ -450,7 +488,7 @@ 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 可设置要显示的目录数。 (默认为5个) - 出力されるリストの数を指定することができます。(デフォルト5個) + 出力するリスト数を指定します(デフォルト5個)。 You can set the number of articles to be displayed. (default is 5) Usted puede definir el número de los documentos a mostrar. (predefinido: 5) Вы можете выбрать число списка статей для отображения. (стандарт: 5) @@ -461,27 +499,32 @@ 페이지수 分页 頁數 + ページ数 1 1 1 1 + 1 2 2 2 2 + 2 3 3 3 3 + 3 페이지수 2이상일 경우 이전/다음 버튼이 나타납니다. 分页数在2以上时,将会出现上一页/下一页按钮。 頁數在2以上時,會出現上一頁/下一頁按鈕。 + ページ数が2枚以上の場合、前へ/次へのボタンが現れます。 text @@ -508,7 +551,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) @@ -518,6 +561,7 @@ text 내용 글자수 + 내용 글자수 内容摘要字数 內容字數 @@ -525,7 +569,7 @@ module_srl_list 대상 모듈 对象模块 - モジュール + ターゲットモジュール Target Module Módulo Objetivo Модуль назначения @@ -549,6 +593,8 @@ RSS URL은 타입이 RSS일 경우 등록되어야 합니다. (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) RSS URL은 타입이 RSS일 경우 등록되어야 합니다. + RSS URLはタイプが RSSであるのみ登録できます。 + (サポートする文書形式 : RSS 2.0, RSS 1.0, ATOM 1.0) text diff --git a/widgets/content/skins/default/skin.xml b/widgets/content/skins/default/skin.xml index f0d3d7eab..e58e7f127 100644 --- a/widgets/content/skins/default/skin.xml +++ b/widgets/content/skins/default/skin.xml @@ -3,6 +3,7 @@ Content 위젯 기본 스킨 全局内容控件默认皮肤 内容組件預設面板 + コンテンツウィジェットのデフォルトスキン Content 위젯 기본 스킨 입니다. Html/Publish: 정찬명 Design : mada @@ -18,6 +19,11 @@ Design : mada Programming : SOL + コンテンツウィジェットのデフォルトスキン + Html/Publish: Chan-Myung Jeong + Design : mada + Programming : SOL + 0.1 2009-02-10 http://www.ngleader.com diff --git a/widgets/forum/conf/info.xml b/widgets/forum/conf/info.xml index d9c0add5b..06316026e 100644 --- a/widgets/forum/conf/info.xml +++ b/widgets/forum/conf/info.xml @@ -16,7 +16,8 @@ 论坛标题及说明参考各对象版面里设置的标题和说明。
      - このウィジェットの最新の記事を表示1つまたは複数の委員会からのフォーラムのスタイルです。説明が表示されるターゲットボードのタイトルと説明しています。 + 1つまたは複数の掲示板をフォーラム形式にまとめて表示するウィジェットです。 + フォーラムに属する掲示板のタイトルと説明を用いて、説明を表示します。 This widget displays newest articles from one or more board in forum style. @@ -73,7 +74,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) diff --git a/widgets/forum/skins/default/skin.xml b/widgets/forum/skins/default/skin.xml index dabbc8e58..a31a9c4bf 100644 --- a/widgets/forum/skins/default/skin.xml +++ b/widgets/forum/skins/default/skin.xml @@ -1,12 +1,12 @@ 기본 포럼형 위젯 스킨 - 기본 포럼형 위젯 스킨 + 基本フォーラム型ウィジェットスキン 论坛主界面样式列表默认皮肤 기본 포럼형 위젯 스킨 論壇樣式預設面板 포럼형 위젯의 기본 스킨입니다. - 포럼형 위젯의 기본 스킨입니다. + フォーラム型のウィジェット基本スキンです。 论坛主界面样式列表默认皮肤。 포럼형 위젯의 기본 스킨입니다. 論壇樣式預設面板。 diff --git a/widgets/image_counter/conf/info.xml b/widgets/image_counter/conf/info.xml index 454ac9318..5bde42909 100644 --- a/widgets/image_counter/conf/info.xml +++ b/widgets/image_counter/conf/info.xml @@ -59,7 +59,7 @@ text 가로 크기 宽度 - 横幅 + 横幅サイズ設定 Tamaño del ancho Width Ширина @@ -76,7 +76,7 @@ グラフイメージの横幅サイズを指定します。 - 指定しない場合は「150px」が指定されます。数字で入力してください。 + 指定しない場合は「150px」が指定されます。数字で入力して下さい。 コード生成ページの下端にある横幅サイズとは異なって適用されます。 @@ -104,7 +104,7 @@ text 세로 크기 高度 - 縦幅 + 縦幅サイズ設定 Tamaño de la Altura Height 高度 @@ -118,7 +118,7 @@ グラフイメージの縦幅サイズを指定します。 - 指定しない場合は「100px」が指定されます。数字で入力してください。 + 指定しない場合は「100px」が指定されます。数字で入力して下さい。 Uste puede asignar el tamaño de la altura para el imágen del gráfico. @@ -155,7 +155,7 @@ 今日から指定した期間だけのデータをグラフで表示します。 - 数字を入力してください(デフォルト:過去7日)。 + 数字を入力して下さい(デフォルト:過去7日)。 Desde el día de hoy hasta el tiempo asignado, se mostrará el gráfico. @@ -196,7 +196,7 @@ + #と6桁の色コードを入力して下さい。]]> #F9F9F9 - #と6桁の色コードを入力してください。]]> + #と6桁の色コードを入力して下さい。]]> #9d9d9d - #と6桁の色コードを入力してください。]]> + #と6桁の色コードを入力して下さい。]]> #BBBBBB - #と6桁の色コードを入力してください。]]> + #と6桁の色コードを入力して下さい。]]> #666666 - #と6桁の色コードを入力してください。]]> + #と6桁の色コードを入力して下さい。]]> #ed3027 - #と6桁の色コードを入力してください。]]> + #と6桁の色コードを入力して下さい。]]> 로그인 사용자 출력 위젯 - ログイン会員出力 + ログイン会員出力ウィジェット Display On-Line Members Mostrar Miembros On-Line 在线会员列表 顯示線上會員 로그인 사용자를 출력하는 위젯입니다. - ログイン中の会員のリストを出力するウィジェットです。 + ログイン中の会員リストを出力するウィジェットです。 This widget displays on-line members. 显示在线会员列表的控件。 Este widget muestra en línea de los miembros. diff --git a/widgets/logged_members/skins/default/skin.xml b/widgets/logged_members/skins/default/skin.xml index 5010c0996..cd9cdf4ba 100644 --- a/widgets/logged_members/skins/default/skin.xml +++ b/widgets/logged_members/skins/default/skin.xml @@ -1,13 +1,13 @@ 로그인 회원 출력 - 로그인 회원 출력 + ログイン会員出力ウィジェット 로그인 회원 출력 로그인 회원 출력 登录会员列表皮肤 顯示線上會員 로그인 되어 있는 회원의 목록을 출력하는 위젯입니다. - 로그인 되어 있는 회원의 목록을 출력하는 위젯입니다. + ログイン中の会員リストを出力するウィジェットです。 로그인 되어 있는 회원의 목록을 출력하는 위젯입니다. 로그인 되어 있는 회원의 목록을 출력하는 위젯입니다. 显示已登录会员列表的默认皮肤。 diff --git a/widgets/member_group/conf/info.xml b/widgets/member_group/conf/info.xml index 9327e6c14..b9dce905e 100644 --- a/widgets/member_group/conf/info.xml +++ b/widgets/member_group/conf/info.xml @@ -14,8 +14,8 @@ 特定グループに所属している会員のリストを表示するウィジェットです。 - まだテスト用のウィジェットです。該当するグループに指定された以上の会員が存在した場合、最近加入順に表示されます。 - 下のグループ名の入力フィールドに、希望するグループ名を「,(コンマ)」で区切って入力します。 + まだテスト中のウィジェットです。該当グループに指定数以上の会員が存在する場合、最近登録した順に表示されます。 + 下のグループ名の入力フィールドに、表示させたいグループ名を半角「,(コンマ)」で区切って入力します。 This widget displays members in specific group. @@ -66,7 +66,7 @@ Число списка 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) - 表示されるリストの数を指定することができます。(デフォルト5個) + 表示するリストの数を指定します。(デフォルト5個) You may choose number of list. (5 as default) Usted puede elegir el número de la lista. (predefinido: 5) 可设置要显示的目录数。 (默认为5个) @@ -83,7 +83,7 @@ Группа членов назначения 目標用戶組 소속 회원 출력을 원하는 회원 그룹명을 ,(콤마)로 연결하여 입력하세요. - 所属会員を表示したい場合は、会員グループ名を「,(コンマ)」で区切って入力してください。 + 所属会員を表示する会員グループ名を半角「,(コンマ)」で区切って入力して下さい。 Please input member group name for display with comma(,). Ingresar el nombre del grupo de usuario para mostrar con la coma(,). 要显示的对象用户组名称以,(逗号)来分隔。 diff --git a/widgets/navigator/conf/info.xml b/widgets/navigator/conf/info.xml index 22934ad85..cf2ba5a5a 100644 --- a/widgets/navigator/conf/info.xml +++ b/widgets/navigator/conf/info.xml @@ -3,9 +3,11 @@ 메뉴 출력기 菜单显示器 導覽列 + メニュー表示機 메뉴 모듈에서 생성된 메뉴를 출력하는 위젯입니다. 此控件可以在任意位置显示菜单模块中的菜单。 메뉴 모듈에서 생성된 메뉴를 출력하는 위젯입니다. + メニューモジュールで作成したメニューを表示するウィジェットです。 0.1 2009-02-10 @@ -13,6 +15,7 @@ zero zero zero + zero @@ -21,29 +24,35 @@ 메뉴 菜单 選單 + メニュー 선택하신 메뉴를 출력합니다. 선택하지 않으면 호출된 레이아웃의 첫번째 메뉴를 자동으로 지정합니다. 请选择要显示的菜单。 선택하신 메뉴를 출력합니다. 선택하지 않으면 호출된 레이아웃의 첫번째 메뉴를 자동으로 지정합니다. + 選択したメニューを表示します。選択しない場合、適用中のレイアウトの最初のメニューが自動に指定されます。 select 시작 깊이 开始深度 階層數 + 開始階層 출력될 메뉴의 시작 깊이(depth)를 지정할 수 있습니다. 1이 최상단이고 2부터는 선택된 상위 메뉴가 있으면 출력하게 됩니다 - 请指定要显示的菜单开始深度(1为完整菜单,2开始只显示该处一级菜单下的2级菜单)。 + 请指定要显示的菜单开始深度(1为完整菜单,2开始只显示该处一级菜单下的2级菜单)。 출력될 메뉴의 시작 깊이(depth)를 지정할 수 있습니다. 1이 최상단이고 2부터는 선택된 상위 메뉴가 있으면 출력하게 됩니다 + 表示するメニューの開始階層(depth)を設定します。1が最上位階層で、2からは選択した上位メニューがある場合表示します。 1 1 depth 1 depth 1 depth + 1階層 2 2 depth 2 depth 2 depth + 2階層 diff --git a/widgets/navigator/skins/horiNavigator/skin.xml b/widgets/navigator/skins/horiNavigator/skin.xml index affedd852..4fd4e1d08 100755 --- a/widgets/navigator/skins/horiNavigator/skin.xml +++ b/widgets/navigator/skins/horiNavigator/skin.xml @@ -3,6 +3,7 @@ 가로 메뉴 출력 橫向選單面板 横向菜单皮肤 + 横型メニュー表示 지정된 메뉴 정보를 가로 출력하는 기본 위젯입니다. DHTML 기능을 사용으로 하시면 메뉴에 마우스 오버시 하부 메뉴가 나타나게 됩니다. @@ -14,6 +15,10 @@ 横向菜单皮肤。 + + 指定したメニュー情報を横並びに表示するデフォルトウィジェットです。 + DHTML機能をオンにすると、メニューの上にmouse overによるサブメニューの表示が出来ます。 + 0.1 2009-02-19 http://www.zeroboard.com @@ -22,6 +27,7 @@ zero zero zero + zero @@ -29,31 +35,37 @@ 회색 灰色 灰色 + 초록색 綠色 绿色 + 파란색 藍色 蓝色 + 청록색 青色 青绿色 + 青綠 오렌지색 橘色 橙色 + オレンジ 빨간색 紅色 红色 + diff --git a/widgets/navigator/skins/tree/skin.xml b/widgets/navigator/skins/tree/skin.xml index 3e858e0c1..9546b9f9b 100644 --- a/widgets/navigator/skins/tree/skin.xml +++ b/widgets/navigator/skins/tree/skin.xml @@ -3,9 +3,11 @@ 메뉴 트리 출력 스킨 树形菜单皮肤 樹狀選單面板 + 메뉴 트리 출력 스킨 메뉴를 트리구조로 출력합니다. 树形菜单皮肤 以樹狀結構顯示選單。 + 메뉴를 트리구조로 출력합니다. 0.1 2009-02-10 http://www.zeroboard.com @@ -14,6 +16,7 @@ zero zero zero + zero diff --git a/widgets/navigator/skins/vertNavigator/skin.xml b/widgets/navigator/skins/vertNavigator/skin.xml index b0c1a8cf5..b4a612cc9 100755 --- a/widgets/navigator/skins/vertNavigator/skin.xml +++ b/widgets/navigator/skins/vertNavigator/skin.xml @@ -3,6 +3,7 @@ 세로 메뉴 출력 스킨 縱向選單面板 竖向菜单皮肤 + 縦型メニュー表示 지정된 메뉴 정보를 세로 출력하는 기본 위젯입니다. DHTML기능을 사용으로 하시면 하위메뉴가 마우스 오버시에 레이어로 뜨게 되고 사용으로 하지 않으시면 바로 출력이 됩니다 @@ -14,6 +15,10 @@ 竖向菜单皮肤。 + + 指定したメニュー情報を横並びに表示するデフォルトウィジェットです。 + DHTML機能をオンにすると、メニューの上にmouse overによるサブメニューの表示が出来ます。 + 0.1 2009-02-10 http://www.zeroboard.com @@ -22,6 +27,7 @@ zero zero zero + zero diff --git a/widgets/newest_comment/conf/info.xml b/widgets/newest_comment/conf/info.xml index 1170f1657..05c3fdb97 100644 --- a/widgets/newest_comment/conf/info.xml +++ b/widgets/newest_comment/conf/info.xml @@ -40,7 +40,7 @@ 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 可设置要显示的目录数。 (默认为5个) - 出力されるリストの数が指定できます(デフォルト5個) + 表示するリストの数を指定します(デフォルト5個)。 You can set the number of list(default is 5). Usted puede definir el número de la lista(predefinido: 5). Вы можете выбрать число списка. (стандарт: 5) @@ -56,7 +56,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) diff --git a/widgets/newest_comment/skins/blog_newest_comment/skin.xml b/widgets/newest_comment/skins/blog_newest_comment/skin.xml index d4cbfe132..a2c6b8f3c 100644 --- a/widgets/newest_comment/skins/blog_newest_comment/skin.xml +++ b/widgets/newest_comment/skins/blog_newest_comment/skin.xml @@ -6,7 +6,7 @@ Newest Comments List of Blog Style 部落格式最新評論列表 블로그 스타일로 최신 댓글을 출력합니다. - ブログスタイルで最新のコメントを表示します。 + ブログスタイルの最新登録コメントを表示します。 显示为博客式的最新评论。 It displays newest comments with blog style. 部落格式最新評論。 diff --git a/widgets/newest_comment/skins/xe_official/skin.xml b/widgets/newest_comment/skins/xe_official/skin.xml index 907765989..84c5e8dff 100644 --- a/widgets/newest_comment/skins/xe_official/skin.xml +++ b/widgets/newest_comment/skins/xe_official/skin.xml @@ -1,12 +1,12 @@ XE 공식 레이아웃용 최신 댓글 스킨 - XE 공식 레이아웃용 최신 댓글 스킨 + XE公式レイアウト用の最新コメントスキン 官网最新评论列表皮肤 XE 공식 레이아웃용 최신 댓글 스킨 XE官網最新評論面板 댓글을 출력합니다 - 댓글을 출력합니다 + コメントを表示します。 显示评论列表。 댓글을 출력합니다 댓글을 출력합니다 diff --git a/widgets/newest_document/conf/info.xml b/widgets/newest_document/conf/info.xml index f288fa5f7..1fbbbe422 100644 --- a/widgets/newest_document/conf/info.xml +++ b/widgets/newest_document/conf/info.xml @@ -9,7 +9,7 @@ 最新主題 최근 문서 (document)를 출력하는 위젯입니다. 显示最新主题列表 (document)的控件。 - 最新の書き込み(document)を表示させるウィジェットです。 + 最新の書き込み(document)を表示するウィジェットです。 This widget displays newest articles. Este widget muestra los documentos recientes. Этот виджет отображает последние статьи. @@ -39,7 +39,7 @@ 排列順序 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. 可以按照指定的顺序进行排序。 - 登録順、変更順にソートできます。 + 登録順、または変更順にソートします。 The list of newewst articles may be sorted by submitted order or modified order. La lista de los documentos recientes pueden ser ordenados en el orden del agregado o en el de modificados. Список последних статей может быть отсортирован по дате размещения или изменения. @@ -76,7 +76,7 @@ 排列方式 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. 对其排序对象可进行升序/降序方式排序。 - ソートタイプを、降順、昇順にソートできます。 + ソートタイプを、降順、または昇順に設定します。 You can sort target articles by asending or desending order. Usted puede ordenar los documentos en orden acendente o en orden descendente. Вы можете сортировать статьи в порядке возрастания или убывания. @@ -113,7 +113,7 @@ 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 可设置要显示的目录数。 (默认为5个) - 出力されるリストの数を指定することができます。(デフォルト5個) + 出力するリスト数を指定します(デフォルト5個)。 You can set the number of articles to be displayed. (default is 5) Usted puede definir el número de los documentos a mostrar. (predefinido: 5) Вы можете выбрать число списка статей для отображения. (стандарт: 5) @@ -144,7 +144,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) diff --git a/widgets/newest_document/skins/blog_newest_document/skin.xml b/widgets/newest_document/skins/blog_newest_document/skin.xml index b95d80dde..13823910e 100644 --- a/widgets/newest_document/skins/blog_newest_document/skin.xml +++ b/widgets/newest_document/skins/blog_newest_document/skin.xml @@ -1,12 +1,12 @@ 블로그 스타일의 최신글 목록 - ブログスタイルの最新コンテンツリスト + ブログスタイルの最新コンテンツ(書き込み)リスト 博客式最新主题列表 Newest Article List of Blog Style 部落格式最新主題列表 블로그 스타일로 최신글을 출력합니다. - ブログスタイルで最新のコンテンツを表示します。 + ブログスタイルで最新のコンテンツ(書き込み)を表示します。 显示为博客式的最新主题列表。 It displays newest article with blog style. 顯示部落格式的最新主題列表。 diff --git a/widgets/newest_document/skins/news_ticker/skin.xml b/widgets/newest_document/skins/news_ticker/skin.xml index 0d7ee7424..08a92c0cc 100644 --- a/widgets/newest_document/skins/news_ticker/skin.xml +++ b/widgets/newest_document/skins/news_ticker/skin.xml @@ -8,7 +8,7 @@ 최근 게시글을 전광판(뉴스티커) 형식으로 한개씩 scroll 되는 방식의 위젯입니다. - 最新コンテンツをニュースティッカー(NewsTicker)スタイルで一つずつスクロールされる方法で表示するウィジェットです。 + 最新コンテンツをニュースティッカー(NewsTicker)スタイルで一つずつスクロール表示するウィジェットです。 将把最新主题显示为滚动新闻样式的主题列表皮肤。 @@ -30,7 +30,7 @@ 내용만 출력 - 内容のみ出力 + 内容のみ表示 标题 標題 diff --git a/widgets/newest_document/skins/xe_official/skin.xml b/widgets/newest_document/skins/xe_official/skin.xml index f6a963994..43fb539aa 100644 --- a/widgets/newest_document/skins/xe_official/skin.xml +++ b/widgets/newest_document/skins/xe_official/skin.xml @@ -1,7 +1,7 @@ XE 공식 레이아웃용 최신글 스킨 - XE公式 レイアウト用の最新コンテンツ表示スキン + XE公式レイアウト用の最新コンテンツ(書き込み)表示スキン 官网最新主题列表皮肤 XE Official Layout's newest document skin XE官方網站最新主題列表面板 @@ -12,7 +12,7 @@ 레이아웃 제작 : zero (http://blog.nzeo.com) - XE公式 レイアウトに最も適した最新コンテンツ表示用のスキンです。 + XE公式レイアウトに適した最新コンテンツ(書き込み)表示用のスキンです。 デザイン:イソラ(http://ra-ra.pe.kr) パブリシング:ジョンチャンミョン(http://naradesign.net) レイアウト作成:Zero (http://blog.nzeo.com) diff --git a/widgets/newest_images/conf/info.xml b/widgets/newest_images/conf/info.xml index 0169d079a..736fdcd97 100644 --- a/widgets/newest_images/conf/info.xml +++ b/widgets/newest_images/conf/info.xml @@ -38,7 +38,7 @@ Длина темы 標題字數 정한 글자수만큼 글 제목을 잘라서 출력합니다. (기본 10자) - 指定された文字数分の長さを切り取って表示します。(デフォルト10文字) + 指定された文字数の長さを切り取って表示します(デフォルト10文字)。 可以指定标题长度。(默认为10字) It cuts the length of subject and displays (10 letters as default). Muestra el título con el número de letras asignadas (predefinio: 10). @@ -48,7 +48,7 @@ select 썸네일 생성 방법 - 生成方法 + サムネール生成方法 缩略图生成方式 Thumbnail Type Тип миниатюры @@ -81,14 +81,14 @@ text 이미지 가로크기 - イメージ横幅 + イメージ横幅のサイズ 宽度 Width of Image Ancho de la imagen Ширина изображения 圖片寬度 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) - 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 + 表示するイメージの横幅サイズを指定します(デフォルト100)。 可以指定要显示的图片宽度。(默认为100) You can set the width of image. (100 as default) Usted puede definir el ancho de la imagen. (predefinido:100px) @@ -98,13 +98,13 @@ text 이미지 세로크기 - イメージ縦幅 + イメージ縦幅のサイズ 高度 Height of Image Высота изображения 圖片高度 이미지의 세로 크기를 지정할 수 있습니다. (기본 100px) - イメージの縦幅サイズを指定します(デフォルト 100px) + イメージの縦幅サイズを指定します(デフォルト 100px)。 可以指定图片高度。(默认为100px) You can set the height of image. (100 as default) Вы можете установить вытсоту изображения. (стандарт: 100px) @@ -137,7 +137,7 @@ Число изображений (ряд) 縱向圖片數 출력될 세로 이미지의 수를 정하실 수 있습니다. (기본 1개) - 表示する縦並びのイメージ数を指定することができます(デフォルト5個)。 + 表示する縦並びのイメージ数を指定します(デフォルト5個)。 可以指定要显示的纵向图片个数。(默认为1个) You can set the number of images to display. (5 as default) Usted puede definir el número de imágenes a mostrar. (predefinido: 5 ) @@ -209,7 +209,7 @@ select 조회수 표시 - 照合数表示 + 閲覧数表示 显示查看数 Display Hit Mostrar Ayuda diff --git a/widgets/newest_images/skins/default/skin.xml b/widgets/newest_images/skins/default/skin.xml index ea22990bf..ebba1d2e1 100644 --- a/widgets/newest_images/skins/default/skin.xml +++ b/widgets/newest_images/skins/default/skin.xml @@ -1,7 +1,7 @@ 최신 이미지 위젯 기본 스킨 - 最新イメージ表示のデフォルトスキン + 最新イメージ表示ウィジェットのデフォルトスキン(default) 最新图片列表默认皮肤 Newest Image Widget Default Skin 最新圖片預設面板 diff --git a/widgets/newest_images/skins/xe_official/skin.xml b/widgets/newest_images/skins/xe_official/skin.xml index f335b61be..9432e4402 100644 --- a/widgets/newest_images/skins/xe_official/skin.xml +++ b/widgets/newest_images/skins/xe_official/skin.xml @@ -1,7 +1,7 @@ 최신 이미지 위젯 기본 스킨 - 最新イメージ表示のデフォルトスキン + 最新イメージ表示ウィジェットのデフォルトスキン(xe official) 官网最新图片列表皮肤 Newest Image Widget Default Skin 官方網站最新圖片預設面板 diff --git a/widgets/newest_trackback/conf/info.xml b/widgets/newest_trackback/conf/info.xml index 6fc2c91e1..e1791795d 100644 --- a/widgets/newest_trackback/conf/info.xml +++ b/widgets/newest_trackback/conf/info.xml @@ -9,7 +9,7 @@ 最新引用 최근 엮인글 (trackback)을 출력하는 위젯입니다. 显示最新引用 (trackback)列表的控件。 - 最新のトラックバック(trackback)を表示させるウィジェットです。 + 最新のトラックバック(trackback)を表示するウィジェットです。 This widget displays newest trackbacks. Este widget muestra los trackbacks recientes. Этот виджет отображает последние трекбеки. @@ -39,7 +39,7 @@ 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 可设置要显示的目录数。 (默认为5个) - 出力されるリストの数を指定することができます(デフォルト5個) + 出力するリストの数を指定します(デフォルト5個)。 You can set the number of list to be displayed.(default is 5) Usted puede definir el número de listas a mostrar.(predefinido: 5) Вы можете выбрать число списка трекбеков для отображения. (стандарт: 5) diff --git a/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml b/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml index 7b73f0abd..85aa238f3 100644 --- a/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml +++ b/widgets/newest_trackback/skins/blog_newest_trackback/skin.xml @@ -1,7 +1,7 @@ 블로그 스타일의 최신 엮인글 목록 - ブログスタイルの最新のトラックバックリスト + ブログスタイルの最新トラックバックリスト 博客式最新引用列表 Newest Trackback List of Blog Style 部落格式最新引用列表 diff --git a/widgets/planet_document/conf/info.xml b/widgets/planet_document/conf/info.xml index f90c2c930..073fe8065 100644 --- a/widgets/planet_document/conf/info.xml +++ b/widgets/planet_document/conf/info.xml @@ -3,9 +3,11 @@ 플래닛 최근 글 출력 微博主题列表 微型部落格主題輸出 + プラネット最新書き込み表示 플래닛의 글들만 출력하는 위젯입니다 . 列出微博主题列表。 微型部落格主題輸出控件。 + プラネットに登録された書く込みだけ表示するウィジェットです。 0.1 2008-12-24 @@ -13,6 +15,7 @@ zero zero zero + zero @@ -27,7 +30,7 @@ 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) 可设置要显示的目录数。 (默认为5个) - 出力されるリストの数を指定することができます。(デフォルト5個) + 出力するリスト数を指定します(デフォルト5個)。 You can set the number of articles to be displayed. (default is 5) Usted puede definir el número de los documentos a mostrar. (predefinido: 5) Вы можете выбрать число списка статей для отображения. (стандарт: 5) @@ -36,14 +39,14 @@ text 이미지 가로크기 - イメージ横幅 + イメージ横幅のサイズ 宽度 Width of Image Ancho de la imagen Ширина изображения 圖片寬度 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 50) - 表示されるイメージの横幅のサイズを指定することができます(デフォルト50)。 + 表示するイメージの横幅サイズを指定します(デフォルト50)。 可以指定要显示的图片宽度。(默认为50) You can set the width of image. (50 as default) Usted puede definir el ancho de la imagen. (predefinido:50px) @@ -53,13 +56,13 @@ text 이미지 세로크기 - イメージ縦幅 + イメージ縦幅のサイズ 高度 Height of Image Высота изображения 圖片高度 이미지의 세로 크기를 지정할 수 있습니다. (기본 50px) - イメージの縦幅サイズを指定します(デフォルト 50px) + イメージの縦幅サイズを指定します(デフォルト 50px)。 可以指定图片高度。(默认为50px) You can set the height of image. (50 as default) Вы можете установить вытсоту изображения. (стандарт: 50px) @@ -68,13 +71,13 @@ select 중복 허용 - 중복 허용 + 重複可能 重复与否 중복 허용 중복 허용 是否重複 Y로 하시면 플래닛 멤버들의 중복을 검사하지 않고 무조건 최신순으로 글을 추출하여 출력합니다 - Y로 하시면 플래닛 멤버들의 중복을 검사하지 않고 무조건 최신순으로 글을 추출하여 출력합니다 + Yに設定すると、プラネットメンバーの重複をチェックせずに、とりあえず登録順に書き込みを抽出し、表示します。 允许重复:不管你发布了多少个主题,按时间顺列出; 不重复:只列出每个用户的最近一个主题。 @@ -86,7 +89,7 @@ N 중복하지 않음 중복하지 않음 - 중복하지 않음 + 重複不可 不重复 중복하지 않음 不重複 @@ -95,7 +98,7 @@ Y 중복 허용 중복 허용 - 중복 허용 + 重複可能 允许重复 중복 허용 可重複 diff --git a/widgets/planet_document/skins/default/skin.xml b/widgets/planet_document/skins/default/skin.xml index f08e127a6..0a64264bd 100644 --- a/widgets/planet_document/skins/default/skin.xml +++ b/widgets/planet_document/skins/default/skin.xml @@ -3,6 +3,7 @@ 기본 플래닛 글 스킨 微博最新主题列表皮肤 微型部落格最新主題列表面板 + デフォルトプラネット書き込み表示スキン 플래닛 글들을 출력하는 기본 위젯 스킨입니다. @@ -12,6 +13,9 @@ 微型部落格最新主題列表面板。 + + プラネットの書き込みを表示するデフォルトスキンです。 + 0.1 2009-02-17 http://www.zeroboard.com @@ -20,6 +24,7 @@ zero zero zero + zero diff --git a/widgets/planet_document/skins/xe_official/skin.xml b/widgets/planet_document/skins/xe_official/skin.xml index e4b30a121..b05e4658a 100644 --- a/widgets/planet_document/skins/xe_official/skin.xml +++ b/widgets/planet_document/skins/xe_official/skin.xml @@ -3,6 +3,7 @@ XE 공식 레이아웃용 플래닛 글 스킨 XE官方网站微博主题列表皮肤 XE 官方網站微型部落格版面 + XE公式レイアウト用プラネット書き込み表示スキン 플래닛 글들을 출력하는 위젯 스킨입니다. @@ -12,6 +13,9 @@ 微型部落格主題輸出面板。 + + プラネットの書き込みを表示するデフォルトスキンです。 + 0.1 2008-12-24 http://www.zeroboard.com @@ -20,6 +24,7 @@ zero zero zero + zero diff --git a/widgets/rank_count/conf/info.xml b/widgets/rank_count/conf/info.xml index 751f51e99..20a1f462d 100644 --- a/widgets/rank_count/conf/info.xml +++ b/widgets/rank_count/conf/info.xml @@ -38,7 +38,7 @@ Число списка 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) - 出力されるリストの数を指定することができます(デフォルト5個) + 出力するリストの数を指定します(デフォルト5個)。 可以指定要输出的目录数. (默认 5个) You can set the number of list to be displayed.(default is 5) Usted puede definir el número de listas a mostrar.(predefinido: 5) @@ -55,7 +55,7 @@ 排行对象 排列順序 대상을 선택하세요. - 対象を選択してください。 + 対象を選択して下さい。 请选择排行对象。 Rank by Rank por @@ -104,7 +104,7 @@ read 조회 수 - 照合数 + 閲覧数 查看 Reads Lecturas @@ -122,7 +122,7 @@ С группой 群組 출력할 회원 그룹명을 입력하세요. 예)준회원,정회원, (선택이 되지 않으면 출력이 되지 않습니다.) - 出力する会員グループ名を入力してください(例:準会員、正会員)。(선택이 되지 않으면 출력이 되지 않습니다.) + 出力する会員グループ名を入力して下さい(選択しないと表示されません)。 例) 準会員、正会員 请选择要显示的用戶组。例)准会员,正会员。 Enables group's ranking (선택이 되지 않으면 출력이 되지 않습니다.) Permite grupo de la clasificación (선택이 되지 않으면 출력이 되지 않습니다.) diff --git a/widgets/rank_count/skins/default/skin.xml b/widgets/rank_count/skins/default/skin.xml index 0fe5e4c3f..0891e813e 100644 --- a/widgets/rank_count/skins/default/skin.xml +++ b/widgets/rank_count/skins/default/skin.xml @@ -3,9 +3,11 @@ 기본 회원 랭킹 스킨 会员排行默认皮肤 會員排行預設面板 + デフォルト会員ランキングスキン 글/댓글/파일업로드 추천/조회수로 회원 랭킹을 출력하는 기본 스킨입니다 显示会员排行的默认皮肤(发布主题数/评论数/附件数及推荐/查看数排行)。 顯示會員排行的預設面板(主題/評論/附加檔案及推薦/點閱數與會員排行)。 + 書き込み/コメント/ファイルアップロード/推薦/閲覧数で会員ランキングを表示する基本スキンです。 0.1 2009-02-23 http://www.zeroboard.com @@ -14,6 +16,7 @@ zero zero zero + zero diff --git a/widgets/rank_download/conf/info.xml b/widgets/rank_download/conf/info.xml index 784f30fbe..98dec5888 100644 --- a/widgets/rank_download/conf/info.xml +++ b/widgets/rank_download/conf/info.xml @@ -38,7 +38,7 @@ Число списка 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) - 出力されるリスト数を指定することができます(デフォルト5個)。 + 出力するリスト数を指定します(デフォルト5個)。 You may set number of list that will be displayed. (default 5) Usted puede configurar el número de lista que se mostrarán. (Por defecto 5) 可以设置要显示的排行数。(默认 5个) @@ -48,14 +48,14 @@ select 파일 종류 - ファイルの種類 + ファイル種類 Type of File Tipo de archivo 附件类型 Тип файла 附件種類 순위에 포함할 파일 종류를 선택하세요. - 順位に含むファイルの種類を選択してください。 + 順位に含むファイルの種類を選択して下さい。 Please select type of file to include. Por favor, seleccione el tipo de archivo a incluir. 请选择要显示的附件类型。 @@ -64,7 +64,7 @@ all 모두 - 全て + すべてて All Todos 全部 @@ -74,7 +74,7 @@ noimage 이미지 제외 - イメージ除外 + イメージは除く Exclude Images Excluir imágenes 图片除外 @@ -102,7 +102,7 @@ Скачать 顯示下載連結 바로 내려 받는 링크를 보여줍니다. - 直接ダウンロードするリンクを表示します。 + ダウンロードする直リンクを表示します。 It shows direct download link. Muestra enlace de descarga directa. 可以选择是否要显示下载链接。 @@ -132,7 +132,7 @@ module_srl_list 대상 모듈 - 対象モジュール + モジュール Target Module Objetivo Módulo 对象模块 diff --git a/widgets/rank_point/conf/info.xml b/widgets/rank_point/conf/info.xml index 5e4ebfa07..c6a519da6 100644 --- a/widgets/rank_point/conf/info.xml +++ b/widgets/rank_point/conf/info.xml @@ -38,7 +38,7 @@ 目录数 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 5개) - 出力されるリストの数を指定することができます(デフォルト5個)。 + 出力するリストの数を指定します(デフォルト5個)。 You may set number of list that will be displayed. (default 5) Usted puede configurar el número de lista que se mostrarán. (Por defecto 5) 可以设置要显示的会员数。(默认为5个) @@ -92,7 +92,7 @@ Включить группу 用戶組 출력할 회원 그룹명을 입력하세요. 예)준회원,정회원 - 出力する会員のグループ名を入力してください(例:準会員、正会員)。 + 出力する会員のグループ名を入力して下さい(例:準会員、正会員)。 Please input name of group to include. ex) Associate, Regular Group Introduce nombre de grupo a incluir. Ex) Asociado, Grupo Regular 请选择要显示的会员组。例)准会员,正会员 @@ -102,14 +102,14 @@ member_group 그룹 제외 - グループ除外 + グループは除く Exclude Group Excluir Grupo 豁免用户组 Исключить группу 排除用戶組 제외할 회원 그룹명을 입력하세요. 예)관리그룹,정회원 - 除外するグループ名を入力してください(管理グループ、正会員)。 + 除外するグループ名を入力して下さい(管理グループ、正会員)。 Please input name of group to exclude. ex) Managing, Regular Group Introduce nombre de grupo para excluir. Ex) Administrar, regular Group 请输入豁免用户组名。例)管理组 diff --git a/widgets/rank_point/skins/default/skin.xml b/widgets/rank_point/skins/default/skin.xml index 64c430a64..fa1b5db6b 100644 --- a/widgets/rank_point/skins/default/skin.xml +++ b/widgets/rank_point/skins/default/skin.xml @@ -2,15 +2,18 @@ 기본 회원 포인트 랭킹 스킨 积分排行默认皮肤 + ポイントランキング基本スキン 회원의 포인트 랭킹 출력 위젯 기본 스킨 积分排行默认皮肤。 + 会員のポイントランキング出力ウィジェットのデフォルトスキン 0.1 2009-02-23 http://www.zeroboard.com zero - zero + zero + zero diff --git a/widgets/rss_reader/conf/info.xml b/widgets/rss_reader/conf/info.xml index c083786de..85747b3f3 100644 --- a/widgets/rss_reader/conf/info.xml +++ b/widgets/rss_reader/conf/info.xml @@ -35,7 +35,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) diff --git a/widgets/site_info/conf/info.xml b/widgets/site_info/conf/info.xml index 2f20aa17b..37da2e0a8 100644 --- a/widgets/site_info/conf/info.xml +++ b/widgets/site_info/conf/info.xml @@ -3,16 +3,19 @@ 가상 사이트 현황 站点信息 虛擬網站狀態 + バーチャル(Virtual)サイト情報 cafeXE와 같은 분양형 가상 사이트의 정보를 출력하는 위젯입니다. 显示子站点信息的控件。 可輸出顯示cafeXE資訊的控件。 + cafeXEのような分譲型バーチャル(Virtual)サイトの情報を出力するウィジェットです。 0.1 2009-02-16 zero - zero - zero + zero + zero + zero diff --git a/widgets/site_info/skins/default/skin.xml b/widgets/site_info/skins/default/skin.xml index 3b7886bf2..8729f1b73 100644 --- a/widgets/site_info/skins/default/skin.xml +++ b/widgets/site_info/skins/default/skin.xml @@ -3,17 +3,20 @@ 가상 사이트 현황 기본 스킨 站点信息默认皮肤 虛擬網站預設面板 + バーチャル(Virtual)サイト情報デフォルトスキン 가상 사이트의 현황을 출력하는 기본 스킨입니다 站点信息默认皮肤。 虛擬網站預設面板。 + バーチャル(Virtual)サイト情報を表示するスキンです。 0.1 2009-02-16 http://www.zeroboard.com zero - zero - zero + zero + zero + zero diff --git a/widgets/tab_newest_document/conf/info.xml b/widgets/tab_newest_document/conf/info.xml index 9a472ed1c..257619d65 100644 --- a/widgets/tab_newest_document/conf/info.xml +++ b/widgets/tab_newest_document/conf/info.xml @@ -39,7 +39,7 @@ 排列目標 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. 按照指定顺序进行排序。 - 登録順、変更順にソートできます。 + 登録順、または変更順にソートします。 The list of newewst articles may be sorted by submitted order or modified order. La lista de los documentos recientes pueden ser ordenados en el orden del agregado o en el de modificados. Список последних статей может быть отсортирован по дате размещения или изменения. @@ -76,7 +76,7 @@ 排列方式 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. 对其排序对象可进行升序/降序方式排序。 - ソートタイプを、降順、昇順にソートできます。 + ソートタイプを、降順、または昇順に設定します。 You can sort target articles by asending or desending order. Usted puede ordenar los documentos en orden acendente o en orden descendente. Вы можете сортировать статьи в порядке возрастания или убывания. @@ -127,7 +127,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) @@ -143,6 +143,7 @@ Тип миниатюры 縮圖建立方式 썸네일 생성 방법을 선택할 수 있습니다. (crop : 꽉 채우기, ratio : 비율 맞추기) + サムネールの生成方法を選択します(Crop : 刈り込み, Ratio : 比率)。 可以选择缩略图生成方式。 (crop : 裁减, ratio : 比例) Thumbnail Type may be set here. Тип миниатюры может быть установлен здесь. @@ -169,14 +170,14 @@ text 이미지 가로크기 - イメージ横幅 + イメージ横幅のサイズ 宽度 Width of Image Ancho de la imagen Ширина изображения 圖片寬度 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) - 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 + 表示するイメージの横幅サイズを指定します(デフォルト100)。 可以指定要显示的图片宽度。(默认为100) You can set the width of image. (100 as default) Usted puede definir el ancho de la imagen. (predefinido:100) @@ -186,7 +187,7 @@ text 이미지 세로크기 - イメージ縦幅 + イメージ縦幅のサイズ 高度 Height of Image Высота изображения @@ -263,7 +264,7 @@ select 조회수 표시 - 照合数表示 + 閲覧数表示 查看 Display Hit Mostrar Ayuda diff --git a/widgets/tab_newest_document/skins/xe_official/skin.xml b/widgets/tab_newest_document/skins/xe_official/skin.xml index 9ca95e597..7c0f4a8f6 100644 --- a/widgets/tab_newest_document/skins/xe_official/skin.xml +++ b/widgets/tab_newest_document/skins/xe_official/skin.xml @@ -1,12 +1,12 @@ 웹진형 최근글 출력 기본 스킨 - ウェブジンスタイルの最新コンテンツ出力デフォルトスキン + ウェブジン(webzine)スタイルの最新コンテンツ出力デフォルトスキン 新闻型最新主题列表默认皮肤 Display newest documents like webzine style 最新主題式雜誌型預設面板 글 목록과 이미지가 같이 출력되는 웹진형 스킨입니다. 이미지가 있는 글들만 노출이 됩니다. - コンテンツリストとイメージが一緒に出力されるウェブジンスタイルのスキンです。イメージが含まれているコンテンツのみ表示されます。 + コンテンツリストとイメージが一緒に出力されるウェブジン(webzine)スタイルのスキンです。イメージが含まれているコンテンツのみ表示されます。 图文并貌新闻型最新主题列表默认皮肤。只显示有图片的最新主题。 글 목록과 이미지가 같이 출력되는 웹진형 스킨입니다. 이미지가 있는 글들만 노출이 됩니다. 可顯示最新主題列表與圖片的網路雜誌型預設面板。只顯示有圖片的最新主題。 diff --git a/widgets/tag_list/conf/info.xml b/widgets/tag_list/conf/info.xml index 0e1cf33b2..5b2417496 100644 --- a/widgets/tag_list/conf/info.xml +++ b/widgets/tag_list/conf/info.xml @@ -39,7 +39,7 @@ 目錄數 출력될 목록의 수를 정하실 수 있습니다. (기본 20개) 可设置要显示的标签数。 (默认为 20个) - 出力されるリストの数を指定することができます。(デフォルト20個) + 出力するリストの数を指定します(デフォルト20個)。 You can configure the number of tags to show. (Default is 20) Usted puede definir el número de etiquetas a mostrar. (predefinido: 20) Вы можете сконфигурировать число тегов для показа. (стандарт: 20) diff --git a/widgets/tag_list/skins/default/skin.xml b/widgets/tag_list/skins/default/skin.xml index 53c8698b1..ac1e5a939 100644 --- a/widgets/tag_list/skins/default/skin.xml +++ b/widgets/tag_list/skins/default/skin.xml @@ -1,7 +1,7 @@ 기본 꼬리표 목록 출력 - Default タグリスト表示 + でフィルとタグリスト表示 标签云默认皮肤 Default Display Tag List Default 標籤列表面板 diff --git a/widgets/webzine/conf/info.xml b/widgets/webzine/conf/info.xml index c17a24bfd..a4de055fe 100644 --- a/widgets/webzine/conf/info.xml +++ b/widgets/webzine/conf/info.xml @@ -2,14 +2,14 @@ 웹진 형태 최근 문서 출력 主题列表(新闻型) - ウェブジンスタイル最新コンテンツ出力 + ウェブジン(webzine)スタイル最新コンテンツ出力 Newest Articles in Webzine Style Mostrar más nuevos artículos con el estilo Webzine Отображение последних статей в стиле webzine 最新主題網路雜誌樣式 최근 문서를 웹진형태로 출력하는 위젯입니다. 把最新主题显示为新闻类型的控件。 - 最新コンテンツをウェブジンスタイルで出力するウィジェットです。 + 最新コンテンツをウェブジン(webzine)スタイルで出力するウィジェットです。 This widget displays newest articles with webzine style. Este widget muestra más reciente de artículos con webzine estilo. Этот виджет отображает последние статьи в стиле webzine. @@ -38,7 +38,7 @@ 排列方式 등록된 순서 또는 변경된 순서로 정렬을 할 수 있습니다. 按照指定顺序进行排序。 - 登録順、変更順にソートできます。 + 登録順、または変更順にソートします。 The list of newewst articles may be sorted by submitted order or modified order. La lista de los documentos recientes pueden ser ordenados en el orden del agregado o en el de modificados. Список последних статей может быть отсортирован по дате размещения или изменения. @@ -75,7 +75,7 @@ 排列方式 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다. 对其排序对象可进行升序/降序方式排序。 - ソートタイプを、降順、昇順にソートできます。 + ソートタイプを、降順、または昇順に設定します。 You can sort target articles by asending or desending order. Usted puede ordenar los documentos en orden acendente o en orden descendente. Вы можете сортировать статьи в порядке возрастания или убывания. @@ -128,7 +128,7 @@ Длина темы 標題字數 제목 글자수를 지정할 수 있습니다. (0또는 비워주시면 자르지 않습니다) - タイトルの文字数が指定できます(「0」または空欄の場合は、文字数を制限しません)。 + タイトルの文字数を設定します(「0」または空欄の場合は、文字数を制限しません)。 可以设置标题的字数。(0或留空为不限) Length of Subject can be assigned. (0 or blank value will not restrict the length) El largo del título puede ser asignado. (valor 0 o en blanco no restringe el largo) @@ -138,14 +138,14 @@ text 내용 글자수 - 内容の文字数 + 内容の文字数 内容字数 Length of Content Número de letras del Contenidos Длина содержания 內容字數 내용 글자수를 지정할 수 있습니다. (기본 50) - 内容の文字数が指定できます。(デフォルト 50) + 内容の文字数を指定します(デフォルト 50)。 可以指定要显示的内容字数。(默认为50) Length of Content can be assigned. (default 50) El largo del Contenidos puede ser asignado. (Predefinido 50) @@ -192,14 +192,14 @@ text 이미지 가로크기 - イメージ横幅 + イメージ横幅のサイズ 宽度 Width of Image Ancho de la imagen Ширина изображения 圖片寬度 출력될 이미지의 가로크기를 정하실 수 있습니다. (기본 100) - 表示されるイメージの横幅のサイズを指定することができます(デフォルト100)。 + 表示するイメージの横幅サイズを指定します(デフォルト100)。 可以指定要显示的图片宽度。(默认为100) You can set the width of image. (100 as default) Usted puede definir el ancho de la imagen. (predefinido:100) @@ -209,14 +209,14 @@ text 이미지 세로크기 - イメージ縦幅 + イメージ縦幅のサイズ 高度 Height of Image Altura de la imagen Высота изображения 圖片高度 이미지의 세로 크기를 지정할 수 있습니다. (기본 100px) - イメージの縦幅サイズを指定します(デフォルト 100px) + イメージの縦幅サイズを指定します(デフォルト 100px)。 可以指定图片高度。(默认为100px) You can set the height of image. (100 as default) Se puede establecer la altura de la imagen. (100 como valor por defecto) @@ -250,7 +250,7 @@ Число изображений (ряд) 縱向圖片數 출력될 세로 이미지의 수를 정하실 수 있습니다. (기본 5개) - 表示する縦並びのイメージ数を指定することができます(デフォルト5個)。 + 表示する縦並びのイメージ数を指定します(デフォルト5個)。 可以指定要显示的纵向图片个数。(默认为1个) You can set the number of images to display. (5 as default) Usted puede definir el número de imágenes a mostrar. (predefinido: 5 ) diff --git a/widgets/webzine/skins/notice_style/skin.xml b/widgets/webzine/skins/notice_style/skin.xml index 14bdaaf79..6b6b7c718 100644 --- a/widgets/webzine/skins/notice_style/skin.xml +++ b/widgets/webzine/skins/notice_style/skin.xml @@ -1,12 +1,12 @@ 공지사항 형태의 출력 - お知らせスタイル + お知らせスタイル表示 公告样式皮肤 Output Result of Notice type 公告樣式面板 글 목록과 이미지가 같이 출력되는 웹진형 스킨입니다. 이미지가 있는 글들만 노출이 됩니다. - コンテンツリストとイメージが一緒に出力されるウェブジンスタイルスキンです。イメージを含むコンテンツのみ表示されます。 + コンテンツリストとイメージが一緒に出力されるウェブジン(webzine)スタイルスキンです。イメージを含むコンテンツのみ表示されます。 图文并貌新闻型最新主题列表默认皮肤。只显示有图片的最新主题。 This is a webzine style skin that displays article list and images. Articles with images will be exposed only. 可顯示主題列表和圖片的網路雜誌型面板。只顯示有圖片的最新主題。 diff --git a/widgets/webzine/skins/xe_official/skin.xml b/widgets/webzine/skins/xe_official/skin.xml index c3b899bb3..bc19ce7a8 100644 --- a/widgets/webzine/skins/xe_official/skin.xml +++ b/widgets/webzine/skins/xe_official/skin.xml @@ -1,12 +1,12 @@ 웹진형 최근글 출력 기본 스킨 - ウェブジンスタイルの最新コンテンツ出力デフォルトスキン + ウェブジン(webzine)スタイルの最新コンテンツ出力デフォルトスキン 新闻型主题列表默认皮肤 Default Skin of Webzine Style Newest Articles 官方最新主題雜誌型預設面板 글 목록과 이미지가 같이 출력되는 웹진형 스킨입니다. 이미지가 있는 글들만 노출이 됩니다. - コンテンツリストとイメージが一緒に出力されるウェブジンスタイルスキンです。イメージを含むコンテンツのみ表示されます。 + コンテンツリストとイメージが一緒に出力されるウェブジン(webzine)スタイルスキンです。イメージを含むコンテンツのみ表示されます。 图文并貌新闻型最新主题列表默认皮肤。只显示有图片的最新主题。 This is a webzine style skin that displays article list and images. Articles with images will be exposed only. 可顯示最新主題列表和圖片的網路雜誌型預設面板。只顯示有圖片的最新主題。 diff --git a/widgetstyles/colorbox/skin.xml b/widgetstyles/colorbox/skin.xml index 7f2558c62..cd1e43a82 100644 --- a/widgetstyles/colorbox/skin.xml +++ b/widgetstyles/colorbox/skin.xml @@ -2,8 +2,10 @@ 스퀘어 페이스 彩色框樣式 + スクウェア페이스 각진 면으로 꾸며진 위젯스타일 입니다. 可變換多種色彩外框的控件樣式。 + 각진 면으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,73 +22,90 @@ 스타일 樣式 + スタイル widgetBoxJgray 회색 + widgetBoxJred 빨강 + widgetBoxJgreen 초록 + widgetBoxJblue 파랑 + 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/line/skin.xml b/widgetstyles/line/skin.xml index 4460cea45..8c11d9048 100644 --- a/widgetstyles/line/skin.xml +++ b/widgetstyles/line/skin.xml @@ -2,8 +2,10 @@ 심플 라이트 線條樣式 + シンプルライト 선 하나만으로 꾸며진 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 + 선 하나만으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,62 +22,76 @@ 스타일 樣式 + スタイル widgetBoxA 심플 라이트 分隔線 + 심플 라이트 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/memo/skin.xml b/widgetstyles/memo/skin.xml index 9a87ab825..20902cf11 100644 --- a/widgetstyles/memo/skin.xml +++ b/widgetstyles/memo/skin.xml @@ -2,8 +2,10 @@ 포스트잇 페이스 留言樣式 + ポストイット페이스 메모지 처럼 꾸며진 위젯스타일 입니다. 可變換多種留言外框的控件樣式。 + 메모지 처럼 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,74 +22,91 @@ 스타일 樣式 + スタイル widgetBoxIyellow 노랑 黃色 + 노랑 widgetBoxIred 빨강 + widgetBoxIgreen 초록 + widgetBoxIblue 파랑 + 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/postitWire/skin.xml b/widgetstyles/postitWire/skin.xml index fb32abef4..253926137 100644 --- a/widgetstyles/postitWire/skin.xml +++ b/widgetstyles/postitWire/skin.xml @@ -2,8 +2,10 @@ 포스트잇 와이어 留言樣式 + ポストイットワイヤー 메모지 처럼 꾸며진 위젯스타일 입니다. 可變換多種留言外框的控件樣式。 + 메모지 처럼 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,74 +22,91 @@ 스타일 樣式 + スタイル widgetBoxHgray 회색 白色 + widgetBoxHred 빨강 + widgetBoxHgreen 초록 + widgetBoxHblue 파랑 + 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/roundFace/skin.xml b/widgetstyles/roundFace/skin.xml index 38b960696..4aa921049 100644 --- a/widgetstyles/roundFace/skin.xml +++ b/widgetstyles/roundFace/skin.xml @@ -2,8 +2,10 @@ 라운드 페이스 圓角外框樣式 + ラウンド페이스 둥근 면으로 꾸며진 위젯스타일 입니다. 可變換多種圓角外框的控件樣式。 + 둥근 면으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,72 +22,88 @@ 스타일 樣式 + スタイル widgetBoxEred 빨강 紅色 + widgetBoxEgreen 초록 綠色 + widgetBoxEblue 파랑 藍色 + 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/roundWire/skin.xml b/widgetstyles/roundWire/skin.xml index d5a0d59ca..2f6a36ce7 100644 --- a/widgetstyles/roundWire/skin.xml +++ b/widgetstyles/roundWire/skin.xml @@ -2,8 +2,10 @@ 라운드 와이어 圓角外框樣式 + ラウンドワイヤー 둥근 선으로 꾸며진 위젯스타일 입니다. 可變換多種圓角外框的控件樣式。 + 둥근 선으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,72 +22,88 @@ 스타일 樣式 + スタイル widgetBoxDred 빨강 紅框 + widgetBoxDgreen 초록 綠框 + widgetBoxDblue 파랑 藍框 + 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/simple/skin.xml b/widgetstyles/simple/skin.xml index d1e1e31d9..814f70b22 100644 --- a/widgetstyles/simple/skin.xml +++ b/widgetstyles/simple/skin.xml @@ -3,9 +3,11 @@ 심플 스트롱 简易控件样式 簡單樣式 + シンプルストロング 선 하나만으로 꾸며진 위젯스타일 입니다. 只有栏目名和查看更多(more)选项的简易控件样式。 只有標題與more按紐的簡單控件樣式。 + 선 하나만으로 꾸며진ウィジェットのスタイルです。 0.1 2009-02-03 preview.gif @@ -14,6 +16,7 @@ sol sol sol + sol @@ -21,19 +24,23 @@ 컬러셋 颜色 顏色 + 컬러셋 컬러셋을 지정해주세요 请指定适当的颜色。 請選擇顏色。 + 컬러셋을 지정해주세요 하얀색 白色 白色 + 하얀색 white 검은색 黑色 黑色 + 검은색 black @@ -41,23 +48,29 @@ 제목 栏目名 標題 + タイトル 제목 텍스트 请输入栏目名。 請輸入標題。 + 「タイトル」のテキスト 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 포함한 URL를 등록합니다. + http:// 포함한 URL를 등록합니다. 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト diff --git a/widgetstyles/simpleRound/skin.xml b/widgetstyles/simpleRound/skin.xml index 0dfb35905..ab28e5a6c 100644 --- a/widgetstyles/simpleRound/skin.xml +++ b/widgetstyles/simpleRound/skin.xml @@ -2,8 +2,10 @@ 심플 라운드 線條樣式 + シンプルラウンド 둥근 선으로 꾸며진 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 + 둥근 선으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,61 +22,75 @@ 스타일 樣式 + スタイル widgetBoxC 심플 라운드 + 심플 라운드 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/simpleSquare/skin.xml b/widgetstyles/simpleSquare/skin.xml index b22aadebd..cd0ff8cf7 100644 --- a/widgetstyles/simpleSquare/skin.xml +++ b/widgetstyles/simpleSquare/skin.xml @@ -2,8 +2,10 @@ 심플 스퀘어 線條樣式 + シンプルスクウェア 각진 선으로 꾸며진 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 + 각진 선으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,61 +22,75 @@ 스타일 樣式 + スタイル widgetBoxB 심플 스퀘어 + 심플 스퀘어 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/simpleTitle/skin.xml b/widgetstyles/simpleTitle/skin.xml index 49b489ad6..b3deba1d1 100644 --- a/widgetstyles/simpleTitle/skin.xml +++ b/widgetstyles/simpleTitle/skin.xml @@ -2,8 +2,10 @@ 심플 타이틀 線條樣式 + シンプルタイトル 제목을 강조하는 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 + タイトルを強調するウィジェットのスタイルです。. 0.1 2009-03-10 preview.gif @@ -20,61 +22,75 @@ 스타일 樣式 + スタイル widgetBoxG 심플 타이틀 + シンプルタイトル 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file diff --git a/widgetstyles/squareWire/skin.xml b/widgetstyles/squareWire/skin.xml index e1d3077eb..671d8c827 100644 --- a/widgetstyles/squareWire/skin.xml +++ b/widgetstyles/squareWire/skin.xml @@ -2,8 +2,10 @@ 스퀘어 와이어 彩色框樣式 + スクウェアワイアー 각진 선으로 꾸며진 위젯스타일 입니다. 可變換多種色彩外框的控件樣式。 + 각진 선으로 꾸며진ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -20,72 +22,88 @@ 스타일 樣式 + スタイル widgetBoxFred 빨강 紅色 + widgetBoxFgreen 초록 綠色 + widgetBoxFblue 파랑 藍色 + 제목 栏目图片 標題圖片 + タイトル 제목 이미지를 등록합니다. 栏目名可以使用图片。 可使用圖片取代標題。 + タイトルイメージを登録します。 제목 栏目名 標題 + タイトル 제목 텍스트 输入文本形式的栏目名。 請輸入標題文字。 + 「タイトル」のテキスト 제목 글자색 栏目字体色 標題顏色 + タイトルの文字色 아이콘 이미지 栏目图标 標題圖示 + アイコンイメージ 제목 앞 아이콘 이미지를 등록합니다. 可以给栏目名指定个性图标。 可指定標題前方的圖示。 + タイトル前のアイコンイメージを登録します。 더보기 URL 查看更多(链接) more URL + 「もっと見る」URL http:// 제외한 URL를 등록합니다. 请输入除http://以外的URL地址。 請輸入http://以外的URL網址。 + http:// を除いたURLを登録します。 더보기 이미지 查看更多(图片) more Image + 「もっと見る」イメージ 더보기 텍스트 查看更多(文本) more TEXT + 「もっと見る」テキスト 더보기 텍스트 文本形式的"查看更多"。 純文字格式。 + 「もっと見る」テキスト \ No newline at end of file From 4d7059972753307a021d29b6d1298b7e1c266fc1 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 14:30:04 +0000 Subject: [PATCH 107/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5972 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/point/lang/jp.lang.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/point/lang/jp.lang.php b/modules/point/lang/jp.lang.php index a5827ee74..0b91b81d5 100644 --- a/modules/point/lang/jp.lang.php +++ b/modules/point/lang/jp.lang.php @@ -9,13 +9,13 @@ $lang->level = "レベル"; $lang->about_point_module = "ポイントモジュールでは、書き込み作成/コメント作成/アップロード/ダウンロードなどのユーザの活動に対してポイントの計算を行います。但し、ポイントモジュールでは設定のみを行い、アドオンでポイントシステムを「使用」に設定しなければポイントは累積されません。"; - $lang->about_act_config = "掲示板、ブログなどのモジュールごと書き込み作成・削除/コメント作成・削除などのアクションがあります。掲示板/ブログ以外のモジュールにポイントシステムを連動させたい場合は、各機能のアクションの「act値」を追加します。連動は「,(コンマ)」で区切って追加します。"; + $lang->about_act_config = "掲示板、ブログなどのモジュールごとに「書き込み作成・削除/コメント作成・削除」などのアクションがあります。掲示板/ブログ以外のモジュールにポイントシステムを連動させたい場合は、各機能のアクションの「act値」を追加します。連動は半角「,(コンマ)」で区切って追加します。"; $lang->max_level = '最高レベル'; $lang->about_max_level = '最高レベルを指定することができます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; $lang->level_icon = 'レベルアイコン'; - $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合がありますので、注意して下さい。'; + $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合があります。ご注意下さい。'; $lang->point_name = 'ポイント名'; $lang->about_point_name = 'ポイントの名前、単位が指定できます。'; @@ -27,7 +27,7 @@ $lang->about_disable_download = 'チェックするとポイントがない場合、ダウンロードを禁止します(イメージファイル除外)。'; $lang->level_point_calc = 'レベル別ポイント計算'; - $lang->expression = 'レベル変数iを使用してJavaスクリプト数式を入力して下さい(例: Math.pow(i, 2) * 90)'; + $lang->expression = 'レベル変数iを使用してJavaスクリプト数式を入力して下さい(例: Math.pow(i, 2) * 90)。'; $lang->cmd_exp_calc = '計算'; $lang->cmd_exp_reset = '初期化'; From 726606f42bdf0736f64cd9e33da1d3fcf1917e16 Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 25 Mar 2009 14:46:52 +0000 Subject: [PATCH 108/202] remove debugPrint git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5973 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/issuetracker/classes/svn.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/issuetracker/classes/svn.class.php b/modules/issuetracker/classes/svn.class.php index 59df8b2d6..8f851ac62 100644 --- a/modules/issuetracker/classes/svn.class.php +++ b/modules/issuetracker/classes/svn.class.php @@ -285,7 +285,6 @@ $erev ); $output = $this->execCmd($command, $error); - debugPrint($output); $list = explode("\n",$output); $output = $this->parseComp($list); From 11e362bf7fcdf6c32729ea0e231026258584c13c Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 25 Mar 2009 15:06:41 +0000 Subject: [PATCH 109/202] #17829107 : handle windows' new-line character(\r\n) git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5974 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/issuetracker/classes/svn.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/issuetracker/classes/svn.class.php b/modules/issuetracker/classes/svn.class.php index 8f851ac62..25e75cb81 100644 --- a/modules/issuetracker/classes/svn.class.php +++ b/modules/issuetracker/classes/svn.class.php @@ -203,6 +203,7 @@ $idx = 0; for($i=0;$i<$cnt;$i++) { $str = $list[$i]; + $str = rtrim($str); if(preg_match('/^Index: (.*)$/', $str, $m)) { if($blockobj != null) { From e9e5f9111917f82a2032835038400999d978d31a Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 25 Mar 2009 15:21:01 +0000 Subject: [PATCH 110/202] #17881936 : remove diff-related codes git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5975 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/issuetracker/classes/svn.class.php | 65 +------------------ .../issuetracker/issuetracker.controller.php | 2 +- modules/issuetracker/issuetracker.view.php | 2 +- .../skins/xe_issuetracker/source_diff.html | 40 ------------ modules/issuetracker/tpl/project_insert.html | 7 -- 5 files changed, 3 insertions(+), 113 deletions(-) delete mode 100644 modules/issuetracker/skins/xe_issuetracker/source_diff.html diff --git a/modules/issuetracker/classes/svn.class.php b/modules/issuetracker/classes/svn.class.php index 25e75cb81..7cacf7068 100644 --- a/modules/issuetracker/classes/svn.class.php +++ b/modules/issuetracker/classes/svn.class.php @@ -9,7 +9,6 @@ var $url = null; var $svn_cmd = null; - var $diff_cmd = null; var $tmp_dir = '/tmp'; @@ -17,13 +16,12 @@ var $userid = null; var $passwd = null; - function Svn($url, $svn_cmd='/usr/bin/svn', $diff_cmd='/usr/bin/diff', $userid=null, $passwd=null) { + function Svn($url, $svn_cmd='/usr/bin/svn', $userid=null, $passwd=null) { if(substr($url,-1)!='/') $url .= '/'; $this->url = $url; if(strstr($svn_cmd, " ") != FALSE) $this->svn_cmd = '"'.$svn_cmd.'"' ; else $this->svn_cmd = $svn_cmd; - $this->diff_cmd = $diff_cmd; $this->tmp_dir = _XE_PATH_.'files/cache/tmp'; if(!is_dir($this->tmp_dir)) FileHandler::makeDir($this->tmp_dir); @@ -134,67 +132,6 @@ return $output; } - function getDiff($path, $brev = null, $erev = null) { - $eContent = $this->getFileContent($path, $erev); - $bContent = $this->getFileContent($path, $brev); - if(!$eContent||!$bContent) return; - - $eFile = sprintf('%s/tmp.%s',$this->tmp_dir, md5($eContent->revision."\n".$eContent->content)); - $bFile = sprintf('%s/tmp.%s',$this->tmp_dir, md5($bContent->revision."\n".$bContent->content)); - - $f = fopen($eFile,'w'); - fwrite($f, $eContent->content); - fclose($f); - - $f = fopen($bFile,'w'); - fwrite($f, $bContent->content); - fclose($f); - - $command = sprintf('%s %s %s', $this->diff_cmd, $bFile, $eFile); - $output = $this->execCmd($command, $error); - - $list = explode("\n", $output); - $cnt = count($list); - - $output = array(); - $obj = null; - for($i=0;$i<$cnt;$i++) { - $line = $list[$i]; - if(preg_match('/^([0-9,]+)(d|c|a)([0-9,]+)$/',$line, $mat)) { - if($obj!==null) $output[] = $obj; - $obj = null; - $before = $mat[1]; - switch($mat[2]) { - case 'c' : $type = 'modified'; break; - case 'd' : $type = 'deleted'; break; - case 'a' : $type = 'added'; break; - } - - $t = explode(',',$after); - $after = $mat[3]; - - $obj->before_line = $before; - $obj->after_line = $after; - $obj->diff_type = $type; - $obj->before_code = ''; - $obj->after_code = ''; - } - - if($obj!==null&&preg_match('/^before_code .= $str."\n"; - } - - if($obj!==null&&preg_match('/^>/',$line)) { - $str = substr($line,1); - $obj->after_code .= $str."\n"; - } - } - if($obj!==null) $output[] = $obj; - - return $output; - } - function parseComp(&$list) { $cnt = count($list); diff --git a/modules/issuetracker/issuetracker.controller.php b/modules/issuetracker/issuetracker.controller.php index fd7f12cb6..e1d8ee582 100644 --- a/modules/issuetracker/issuetracker.controller.php +++ b/modules/issuetracker/issuetracker.controller.php @@ -427,7 +427,7 @@ { if(!$module_info->svn_url || !$module_info->svn_cmd) return; require_once($this->module_path.'classes/svn.class.php'); - $oSvn = new Svn($module_info->svn_url, $module_info->svn_cmd, $module_info->diff_cmd, $module_info->svn_userid, $module_info->svn_passwd); + $oSvn = new Svn($module_info->svn_url, $module_info->svn_cmd, $module_info->svn_userid, $module_info->svn_passwd); $oModel = &getModel('issuetracker'); $status = $oSvn->getStatus(); if(!$status || !$status->revision) return; diff --git a/modules/issuetracker/issuetracker.view.php b/modules/issuetracker/issuetracker.view.php index 6584232ae..2e4e1f012 100644 --- a/modules/issuetracker/issuetracker.view.php +++ b/modules/issuetracker/issuetracker.view.php @@ -170,7 +170,7 @@ $erev = Context::get('erev'); $brev = Context::get('brev'); - $oSvn = new Svn($this->module_info->svn_url, $this->module_info->svn_cmd, $this->module_info->diff_cmd); + $oSvn = new Svn($this->module_info->svn_url, $this->module_info->svn_cmd); $current = $oSvn->getStatus($path); Context::set('current', $current); diff --git a/modules/issuetracker/skins/xe_issuetracker/source_diff.html b/modules/issuetracker/skins/xe_issuetracker/source_diff.html deleted file mode 100644 index 77f4daa04..000000000 --- a/modules/issuetracker/skins/xe_issuetracker/source_diff.html +++ /dev/null @@ -1,40 +0,0 @@ - - -

      Diff between revs {$brev} to revs {$erev}

      -

      {$path}

      - -
        -
      1. [view log]
      2. -
      3. [view code]
      4. -
      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      StatusRev. {$brev}Rev. {$erev}
      {$item->diff_type}line {$item->before_line}line {$item->after_line}
      {nl2br(htmlspecialchars($item->before_code))}{nl2br(htmlspecialchars($item->after_code))}
      - - - - diff --git a/modules/issuetracker/tpl/project_insert.html b/modules/issuetracker/tpl/project_insert.html index 6df3ef8c6..24f9781a3 100644 --- a/modules/issuetracker/tpl/project_insert.html +++ b/modules/issuetracker/tpl/project_insert.html @@ -90,13 +90,6 @@

      {$lang->about_svn_cmd}

      - -
      {$lang->diff_cmd}
      - - -

      {$lang->about_diff_cmd}

      - -
      {$lang->svn_userid}
      From f3608f53b9654ddbea70ee821153c6c49044dc99 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 16:25:40 +0000 Subject: [PATCH 111/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20/=20=EC=9D=BC=EB=B3=B8=EC=96=B4=20=EB=B2=88=EC=97=AD=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5976 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/keyword_link/conf/info.xml | 2 +- addons/mobile/conf/info.xml | 2 +- addons/openid_delegation_id/conf/info.xml | 2 +- common/lang/jp.lang.php | 12 ++--- layouts/xe_official/conf/info.xml | 4 +- modules/addon/lang/jp.lang.php | 2 +- modules/admin/conf/info.xml | 2 +- modules/admin/lang/jp.lang.php | 12 ++--- modules/board/lang/jp.lang.php | 4 +- modules/board/skins/xe_board/skin.xml | 2 +- modules/board/skins/xe_default/skin.xml | 11 ++-- modules/board/skins/xe_guestbook/skin.xml | 2 +- modules/communication/lang/jp.lang.php | 4 +- modules/document/lang/jp.lang.php | 2 +- .../components/cc_license/lang/jp.lang.php | 8 +-- modules/editor/components/emoticon/info.xml | 2 +- .../editor/components/image_gallery/info.xml | 2 +- .../components/image_gallery/lang/jp.lang.php | 2 +- modules/editor/components/image_link/info.xml | 2 +- .../components/multimedia_link/info.xml | 2 +- modules/editor/components/naver_map/info.xml | 2 +- modules/editor/components/poll_maker/info.xml | 2 +- .../components/poll_maker/lang/jp.lang.php | 2 +- modules/editor/components/quotation/info.xml | 2 +- .../editor/components/table_maker/info.xml | 2 +- modules/editor/components/url_link/info.xml | 2 +- modules/editor/lang/jp.lang.php | 2 +- .../editor/skins/fckeditor/editor/lang/ja.js | 12 ++--- modules/file/lang/jp.lang.php | 8 +-- modules/homepage/lang/jp.lang.php | 12 ++--- modules/importer/lang/jp.lang.php | 2 +- modules/install/lang/jp.lang.php | 2 +- modules/krzip/conf/info.xml | 2 +- modules/layout/lang/jp.lang.php | 51 ++++++++++--------- modules/member/lang/jp.lang.php | 44 ++++++++-------- modules/menu/lang/jp.lang.php | 12 ++--- modules/message/lang/jp.lang.php | 2 +- modules/module/lang/jp.lang.php | 28 +++++----- modules/opage/lang/jp.lang.php | 4 +- modules/page/conf/info.xml | 2 +- modules/page/lang/jp.lang.php | 2 +- modules/planet/lang/jp.lang.php | 28 +++++----- modules/point/conf/info.xml | 2 +- modules/point/lang/jp.lang.php | 8 +-- modules/rss/lang/jp.lang.php | 4 +- modules/spamfilter/lang/jp.lang.php | 4 +- modules/springnote/lang/jp.lang.php | 6 +-- modules/widget/lang/jp.lang.php | 10 ++-- widgets/DroArc_clock/skins/default/skin.xml | 2 +- widgets/content/conf/info.xml | 2 +- widgets/language_select/conf/info.xml | 2 +- widgets/rss_reader/skins/xe_select/skin.xml | 2 +- 52 files changed, 176 insertions(+), 172 deletions(-) diff --git a/addons/keyword_link/conf/info.xml b/addons/keyword_link/conf/info.xml index a83f631bc..6ad33d4cc 100644 --- a/addons/keyword_link/conf/info.xml +++ b/addons/keyword_link/conf/info.xml @@ -27,7 +27,7 @@
      本文とコメントの内容中、登録されたキーワードにリンクを貼りつける機能を行います。 - キーワードは半角コンマ(,)区切りで複数登録が出来ます。 + キーワードは半角コンマ(,)区切りで複数登録が出来ます。 先に登録されるキーワードが優先度が高いです。 0.1 diff --git a/addons/mobile/conf/info.xml b/addons/mobile/conf/info.xml index fc38d9489..404b4dc9c 100644 --- a/addons/mobile/conf/info.xml +++ b/addons/mobile/conf/info.xml @@ -50,7 +50,7 @@
      ある特定のモバイル機器ではutf-8文字コードの認識が出来ない場合があります。 - 文字コードを設定すると、該当文字コードに自動変換して正常に表示できるようになります。 + 文字コードを設定すると、該当文字コードに自動変換して正常に表示出来るようになります。 デフォルトはeuc-krです。 diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml index 946029a76..57aa3cc86 100644 --- a/addons/openid_delegation_id/conf/info.xml +++ b/addons/openid_delegation_id/conf/info.xml @@ -29,7 +29,7 @@ Debe utilizar luego de ingresar los valores relacionado con openid provider a través de la configuracion. - 保有しているオリジナルドメインをオープンIDとして活用することができます。 + 保有しているオリジナルドメインをオープンIDとして活用することが出来ます。 必ず設定で、OpenIDのプロバイダー関連情報を入力してから使用して下さい。 diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index 9a274159d..ea0d37bba 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -201,8 +201,8 @@ ); // 説明関連 - $lang->about_tag = 'タグを入力する時、「,」(半角コンマ)を使うと複数登録できます。'; - $lang->about_layout = 'レイアウトでモジュールの枠をデザインします。上段のレイアウトメニューで管理できます。'; + $lang->about_tag = 'タグを入力する時、「,」(半角コンマ)を使うと複数登録出来ます。'; + $lang->about_layout = 'レイアウトでモジュールの枠をデザインします。上段のレイアウトメニューで管理出来ます。'; // メッセージ関連 $lang->msg_call_server = 'サーバへ問合わせ中です。しばらくお待ち下さい。'; @@ -238,10 +238,10 @@ $lang->fail_to_delete = '削除に失敗しました。'; $lang->fail_to_move = '移動に失敗しました。'; - $lang->failed_voted = '推薦できません。'; - $lang->failed_blamed = '非推薦できません。'; - $lang->failed_declared = '通報できません。'; - $lang->fail_to_delete_have_children = '返信の書き込みがあり、削除できません。'; + $lang->failed_voted = '推薦出来ません。'; + $lang->failed_blamed = '非推薦出来ません。'; + $lang->failed_declared = '通報出来ません。'; + $lang->fail_to_delete_have_children = '返信の書き込みがあり、削除出来ません。'; $lang->confirm_submit = '登録しますか?'; $lang->confirm_logout = 'ログアウトしますか?'; diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml index 4df574c77..849e6061e 100644 --- a/layouts/xe_official/conf/info.xml +++ b/layouts/xe_official/conf/info.xml @@ -1,7 +1,7 @@ XE 공식 사이트 레이아웃 - XEオフィシャルレイアウト + XE公式レイアウト XE Official website layout XE Offizielle Website-Layout XE Официальный сайт макет @@ -15,7 +15,7 @@ 레이아웃 제작 : zero - XEのオフィシャルサイトのレイアウトです。 + XEの公式サイトのレイアウトです。 デザイン:イ ソラ パブリシング:ジョン チャンミョン レイアウト作成:Zero diff --git a/modules/addon/lang/jp.lang.php b/modules/addon/lang/jp.lang.php index 087519f3e..908a3d2a7 100644 --- a/modules/addon/lang/jp.lang.php +++ b/modules/addon/lang/jp.lang.php @@ -13,5 +13,5 @@ $lang->addon_history = '変更内容'; $lang->about_addon_mid = "アドオンが使われる対象を指定します。
      (選択なしの場合、全ての対象で利用可能)"; - $lang->about_addon = 'アドオンは、HTMLの出力をコントロールするというより動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけでサイトの運営に有用な機能が利用できます。'; + $lang->about_addon = 'アドオンは、HTMLの出力をコントロールするというより動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけでサイトの運営に有用な機能が利用出来ます。'; ?> diff --git a/modules/admin/conf/info.xml b/modules/admin/conf/info.xml index 55cdc7e93..5fc6b25f1 100644 --- a/modules/admin/conf/info.xml +++ b/modules/admin/conf/info.xml @@ -11,7 +11,7 @@ This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator. Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador. 列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。 - 各モジュールの機能を羅列し、管理者用のレイアウトを適用させ、管理機能が使用できるようにするモジュールです。 + 各モジュールの機能を羅列し、管理者用のレイアウトを適用させ、管理機能が使用出来るようにするモジュールです。 Этот модуль показывает список возможностей каждого модуля, и позволяет Вам использовать несколько менеджеров, применяя лейаут для администратора. 列出各模組的功能並使用管理員版面,可讓其使用管理功能的模組。 0.1 diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index 895224c67..3d24a5bc1 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -26,14 +26,14 @@ $lang->env_setup = "環境設定"; $lang->default_url = '基本URL'; - $lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持できるようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)"; + $lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)"; $lang->env_information = "環境情報"; $lang->current_version = "インストールバージョン"; $lang->current_path = "インストールパス"; $lang->released_version = "最新バージョン"; - $lang->about_download_link = "インストールされたバージョンより新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロードできます。"; + $lang->about_download_link = "インストールされたバージョンより新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; $lang->item_module = "モジュールリスト"; $lang->item_addon = "アドオンリスト"; @@ -49,16 +49,16 @@ $lang->cmd_shortcut_management = "メニュー編集"; - $lang->msg_is_not_administrator = '管理者のみアクセスできます'; - $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除できません。'; - $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することができません。'; + $lang->msg_is_not_administrator = '管理者のみアクセス出来ます'; + $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。'; + $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。'; $lang->welcome_to_xe = 'XEの管理者ページです。'; $lang->about_admin_page = "管理者ページはまだ未完成です。\nクローズベータバージョンの期間に、多くの方々からご意見をいただきながら、必ず必要なコンテンツを埋めていきたいと思います。"; $lang->about_lang_env = "上で設定された言語を、初めてサイトに訪問したユーザに同じく適用させるためには、希望する言語に変更してから「保存」ボタンをクリックして下さい。"; $lang->xe_license = 'XEのライセンスはGPLです。'; - $lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除できます。'; + $lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除出来ます。'; $lang->yesterday = "昨日"; $lang->today = "今日"; diff --git a/modules/board/lang/jp.lang.php b/modules/board/lang/jp.lang.php index ded28d07b..0b4a473b0 100644 --- a/modules/board/lang/jp.lang.php +++ b/modules/board/lang/jp.lang.php @@ -28,12 +28,12 @@ // その他 $lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。'; - $lang->about_board_category = 'ブログのカテゴリを作成します。
      ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。'; + $lang->about_board_category = 'ブログのカテゴリを作成します。
      ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決出来ます。'; $lang->about_except_notice = "リストの上段に常に表示されるお知らせの書き込みを一般リストからお知らせの書き込みが表示されないようにします。"; $lang->about_use_anonymous = '匿名掲示板として活用出来ます。スキン設定で登録者の情報を表示しないに設定をお勧めします。'; $lang->about_board = '掲示板の生成、および管理する掲示板モジュールです。'; $lang->about_consultation = "相談機能とは、管理権限のない会員に本人の書き込みだけを表示する機能です。\n但し、相談機能を使用する際は、非会員の書き込みは自動的に禁止されます。"; - $lang->about_secret = '掲示板およびコメントの秘密文を登録できるようにします。'; + $lang->about_secret = '掲示板およびコメントの秘密文を登録出来るようにします。'; $lang->about_admin_mail = '書き込みやコメントが掲載される時、登録メールアドレス宛にメールが送信されます。
      複数のメールアドレスへ送信する場合は「,」(半額コンマ)区切りで登録して下さい。'; $lang->about_list_config = '掲示板スタイルが「リスト型」の場合、好きな列の項目配置が出来ます。
      ただし、スキンによってこの機能をサポートしない場合もあります。
      ターゲットアイテム/表示アイテムをダブルクリックすると追加・削除が出来ます。'; diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index dee64730a..a02840f1f 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -113,7 +113,7 @@ 포럼형 스타일은 정렬대상을 updated로 하셔야 합니다.
      - リスト型、ウェブジン型、ギャラリー型、フォーラム型の基本スタイルを指定することができます。 + リスト型、ウェブジン型、ギャラリー型、フォーラム型の基本スタイルを指定することが出来ます。 フォーラム型のスタイルはソート対象を「updated」にしなければなりません。 diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index 6580c088a..f75a191e2 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -3,13 +3,14 @@ XE Default Skin XE Default Skin XE 預設面板 + XEデフォルトスキン XE Default Skin Front-end : Jeong, Chan Myeong (http://naradesign.net/) Back-end : Kim, Ye Sol (http://ngleader.com/) - XE 預設面板。 + XEデフォルトスキン Front-end : Jeong, Chan Myeong (http://naradesign.net/) Back-end : Kim, Ye Sol (http://ngleader.com/) @@ -38,11 +39,13 @@ dece24 - dece24 + dece24 + dece24 sol - sol + sol + sol GPL @@ -80,7 +83,7 @@ 포럼형 스타일은 정렬대상을 updated로 하셔야 합니다. - リスト型、ウェブジン型、ギャラリー型、フォーラム型の基本スタイルを指定することができます。 + リスト型、ウェブジン型、ギャラリー型、フォーラム型の基本スタイルを指定することが出来ます。 フォーラム型のスタイルはソート対象を「updated」にしなければなりません。 diff --git a/modules/board/skins/xe_guestbook/skin.xml b/modules/board/skins/xe_guestbook/skin.xml index 017ce69ea..1bd351987 100644 --- a/modules/board/skins/xe_guestbook/skin.xml +++ b/modules/board/skins/xe_guestbook/skin.xml @@ -2,7 +2,7 @@ XE 방명록 기본 스킨 XE 留言本默认皮肤 - XE ゲストブックのデフォルトスキン + XEゲストブックのデフォルトスキン XE Basic Guestbook Skin XE básicos piel Libro de visitas XE 基本留言板面板 diff --git a/modules/communication/lang/jp.lang.php b/modules/communication/lang/jp.lang.php index 8523fb433..0c4a96b82 100644 --- a/modules/communication/lang/jp.lang.php +++ b/modules/communication/lang/jp.lang.php @@ -42,7 +42,7 @@ $lang->msg_title_is_null = 'メッセージのタイトルを入力して下さい。'; $lang->msg_content_is_null = '内容を入力して下さい。'; - $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信できるように設定したユーザであるため、送信できませんでした。'; - $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信できませんでした。'; + $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信出来るように設定したユーザであるため、送信出来ませんでした。'; + $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信出来ませんでした。'; $lang->about_allow_message = 'メッセージを受信するかを設定します。'; ?> diff --git a/modules/document/lang/jp.lang.php b/modules/document/lang/jp.lang.php index 5f9026435..beb5b2245 100644 --- a/modules/document/lang/jp.lang.php +++ b/modules/document/lang/jp.lang.php @@ -37,7 +37,7 @@ $lang->cmd_document_do = 'この書き込みを..'; $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; - $lang->msg_category_not_moved = '移動できません。'; + $lang->msg_category_not_moved = '移動出来ません。'; $lang->msg_is_secret = '非公開設定の書き込みです。'; $lang->msg_checked_document_is_deleted = '%d個の書き込みが削除されました。'; diff --git a/modules/editor/components/cc_license/lang/jp.lang.php b/modules/editor/components/cc_license/lang/jp.lang.php index 832cd4fc6..5f30c8052 100644 --- a/modules/editor/components/cc_license/lang/jp.lang.php +++ b/modules/editor/components/cc_license/lang/jp.lang.php @@ -6,7 +6,7 @@ **/ $lang->ccl_default_title = 'クリエイティブコモンズジャパン著作者表示'; - $lang->ccl_default_message = 'この著作物は%s%s%s%sに従って利用することができます。'; + $lang->ccl_default_message = 'この著作物は%s%s%s%sに従って利用することが出来ます。'; $lang->ccl_title = 'タイトル'; $lang->ccl_use_mark = 'マーク使用'; @@ -23,7 +23,7 @@ ); $lang->about_ccl_title = 'タイトルを表示します。空欄の場合はデフォルトのメッセージが表示されます。'; - $lang->about_ccl_use_mark = 'マークを表示するかどうかが選択できます(デフォルト:表示)。'; - $lang->about_ccl_allow_commercial = '営利目的での利用を許可するかどうかが選択できます(デフォルト:禁止)'; - $lang->about_ccl_allow_modification = '著作権の変更ができるかがどうかが許可できます(デフォルト:同一条件変更)。'; + $lang->about_ccl_use_mark = 'マークを表示するかどうかが選択出来ます(デフォルト:表示)。'; + $lang->about_ccl_allow_commercial = '営利目的での利用を許可するかどうかが選択出来ます(デフォルト:禁止)'; + $lang->about_ccl_allow_modification = '著作権の変更が出来るかがどうかが許可出来ます(デフォルト:同一条件変更)。'; ?> diff --git a/modules/editor/components/emoticon/info.xml b/modules/editor/components/emoticon/info.xml index bdd4e01be..4e264821f 100644 --- a/modules/editor/components/emoticon/info.xml +++ b/modules/editor/components/emoticon/info.xml @@ -8,7 +8,7 @@ Отображение смайлов 表情符號 이모티콘을 에디터에 삽입할 수 있습니다. - 顔文字(イモティコン)をエディターに追加することができます。 + 顔文字(イモティコン)をエディターに追加することが出来ます。 可以插入表情图标到编辑器。 You may insert emoticons to editor. Usted puede insertar emoticonos para el editor. diff --git a/modules/editor/components/image_gallery/info.xml b/modules/editor/components/image_gallery/info.xml index af092d855..901b4a8b8 100644 --- a/modules/editor/components/image_gallery/info.xml +++ b/modules/editor/components/image_gallery/info.xml @@ -8,7 +8,7 @@ Базовая галлерея изображений 預設圖片相簿 첨부된 이미지파일을 이용하여 슬라이드/목록형 이미지 갤러리를 만들 수 있습니다. - 添付されたイメージファイルを利用して、スライド型・リスト型のイメージギャラリーが作成できます。 + 添付されたイメージファイルを利用して、スライド型・リスト型のイメージギャラリーが作成出来ます。 利用上传的图片文件实现幻灯片式或目录型相册图片。 It can create image gallery of slide/list style by using attached image file. It can create image gallery of slide/list style by using attached image file. diff --git a/modules/editor/components/image_gallery/lang/jp.lang.php b/modules/editor/components/image_gallery/lang/jp.lang.php index 02b9e838f..9763342ec 100644 --- a/modules/editor/components/image_gallery/lang/jp.lang.php +++ b/modules/editor/components/image_gallery/lang/jp.lang.php @@ -19,7 +19,7 @@ $lang->gallery_border_color = "ボーダーカラー"; $lang->gallery_border_thickness = "ボーダー"; $lang->gallery_bg_color = "背景色"; - $lang->about_image_list = "イメージギャラリーに追加するファイルを選択して下さい。選択した後、ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」ができます。"; + $lang->about_image_list = "イメージギャラリーに追加するファイルを選択して下さい。選択した後、ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」が出来ます。"; $lang->cmd_gallery_prev = "前のイメージ表示"; $lang->cmd_gallery_next = "次のイメージ表示"; diff --git a/modules/editor/components/image_link/info.xml b/modules/editor/components/image_link/info.xml index efa007a41..670a4e856 100644 --- a/modules/editor/components/image_link/info.xml +++ b/modules/editor/components/image_link/info.xml @@ -8,7 +8,7 @@ Добавление изображений 圖片連結 에디터에 이미지를 추가하거나 속성을 변경할 수 있습니다. - エディターでイメージの追加、属性の変更ができます。 + エディターでイメージの追加、属性の変更が出来ます。 可以插入图像或编辑其相应属性。 It can add an image to editor or change the attribution of image. Se puede añadir una imagen a editor o cambiar la atribución de la imagen. diff --git a/modules/editor/components/multimedia_link/info.xml b/modules/editor/components/multimedia_link/info.xml index 72d05325b..fae528249 100644 --- a/modules/editor/components/multimedia_link/info.xml +++ b/modules/editor/components/multimedia_link/info.xml @@ -8,7 +8,7 @@ Управление мультимедиа данными 多媒體管理 에디터에 wmv,avi,flv등의 멀티미디어 자료를 추가하거나 속성을 수정할 수 있습니다. - エディターに拡張子が「wmv,avi,flv」などのマルチメディアコンテンツを追加、または属性の修正ができます。 + エディターに拡張子が「wmv,avi,flv」などのマルチメディアコンテンツを追加、または属性の修正が出来ます。 插入wmv,avi,flv等多媒体文件或修改其相应属性 。 It can add multimedia data like wmv,avi,flv to editor or change the attribution of multimedia data. Se pueden agregar datos multimedia como wmv, avi, flv al editor o cambiar la atribución de datos multimedia. diff --git a/modules/editor/components/naver_map/info.xml b/modules/editor/components/naver_map/info.xml index e45de1907..1f269cf2d 100644 --- a/modules/editor/components/naver_map/info.xml +++ b/modules/editor/components/naver_map/info.xml @@ -8,7 +8,7 @@ Открытые API карт Naver NAVER 地圖 Open API 네이버에서 제공하는 네이버 지도 open api를 이용하여 에디터에 원하는 곳의 지도를 추가하거나 수정할 수 있습니다.\n네이버 지도 open api키를 발급 받아서 등록을 해주셔야 정상적인 사용이 가능합니다. - ネイバーから提供されるネイバーマップのOpenAPIを利用してエディターに表示したい地図を追加したり、修正したりすることができます。ネイバーマップは、OpenAPIキーを取得して登録すれば使用することができます。 + ネイバーから提供されるネイバーマップのOpenAPIを利用してエディターに表示したい地図を追加したり、修正したりすることが出来ます。ネイバーマップは、OpenAPIキーを取得して登録すれば使用することが出来ます。 naver提供的naver地图,利用open api在编辑器里添加或修改您所需要的地图。\n为了使用naver地图首先要取得open api key,然后登录此key才可正常使用。 You can add a map to the editor or modify it by using Naver Map open api provided by Naver.\nYou would be able to use it when you register Naver Map api key after you get it from http://www.naver.com. Puede poner un mapa para el editor o modificarlo utilizando Naver Mapa abierta api proporcionada por Naver. \ NSe se podrá hacer uso del mismo cuando se registra Naver Mapa api clave se obtiene después de http://www.naver.com . diff --git a/modules/editor/components/poll_maker/info.xml b/modules/editor/components/poll_maker/info.xml index 1f870b4bc..62253f387 100644 --- a/modules/editor/components/poll_maker/info.xml +++ b/modules/editor/components/poll_maker/info.xml @@ -8,7 +8,7 @@ Компонент опросов 投票調查 글 작성시에 설문조사를 첨부하실 수 있습니다. 설문조사 컴포넌트는 설문조사 모듈의 설정에 영향을 받습니다. - 書き込みの時、アンケート機能の追加ができます。アンケートモジュールの影響を受けます。 + 書き込みの時、アンケート機能の追加が出来ます。アンケートモジュールの影響を受けます。 发表主题时可以附加投票调查。投票调查组件受投票调查模块设置的影响。 You can attach a poll on writing articles. Poll component is affected by setting of poll module. Puede adjuntar una encuesta sobre la redacción de artículos. Encuesta componente se ve afectada por la configuración de módulo de encuesta. diff --git a/modules/editor/components/poll_maker/lang/jp.lang.php b/modules/editor/components/poll_maker/lang/jp.lang.php index 8ac26cc80..5b4270a99 100644 --- a/modules/editor/components/poll_maker/lang/jp.lang.php +++ b/modules/editor/components/poll_maker/lang/jp.lang.php @@ -14,5 +14,5 @@ $lang->cmd_del_poll = "アンケート削除"; $lang->cmd_add_item = "項目追加"; - $lang->msg_poll_cannot_modify = 'アンケートは修正できません。削除後、改めて新しく作成して下さい。'; + $lang->msg_poll_cannot_modify = 'アンケートは修正出来ません。削除後、改めて新しく作成して下さい。'; ?> diff --git a/modules/editor/components/quotation/info.xml b/modules/editor/components/quotation/info.xml index 09ac67e9f..417c6f863 100644 --- a/modules/editor/components/quotation/info.xml +++ b/modules/editor/components/quotation/info.xml @@ -8,7 +8,7 @@ Цитаты 引用 특정 범위를 인용문으로 꾸밀 수 있습니다. 외곽선의 종류나 색상, 굵기를 수정할 수 있으며 열기/닫기 기능을 가진 폴더기능을 만들 수 있습니다. - 特定範囲を引用文として表示できます。ボーダーの種類、色、太さを修正することができ、「展開・折りたたみ」の機能も可能です。 + 特定範囲を引用文として表示出来ます。ボーダーの種類、色、太さを修正することができ、「展開・折りたたみ」の機能も可能です。 可以把要发表的主题特定范围用引用布置。可以修改外围线的种类或粗细,还支持展开/折叠功能。 You can decorate specific range as quotation. The style, color or thickness of outline can be modified and folder system which has open/close function can be made. Puedes decorar rango específico como cita. El estilo, el color o el grosor de esquema puede ser modificado y carpeta de sistema que tiene abrir / cerrar la función se puede hacer. diff --git a/modules/editor/components/table_maker/info.xml b/modules/editor/components/table_maker/info.xml index 8fbfc24ba..c251ef836 100644 --- a/modules/editor/components/table_maker/info.xml +++ b/modules/editor/components/table_maker/info.xml @@ -8,7 +8,7 @@ Создание таблиц 表格 에디터에 표(table)을 생성하거나 표(table) 또는 칸(td)의 속성을 변경할 수 있습니다. - エディターでテーブル(table)の作成、テーブル(table)またはセル(td)の属性の変更ができます。 + エディターでテーブル(table)の作成、テーブル(table)またはセル(td)の属性の変更が出来ます。 插入表格(table)或编辑表格属性。 It can create a table on editor or modify the attribution of table or td. Se puede crear una tabla en editor o modificar la atribución de la mesa o td. diff --git a/modules/editor/components/url_link/info.xml b/modules/editor/components/url_link/info.xml index 994a805d7..afa581017 100644 --- a/modules/editor/components/url_link/info.xml +++ b/modules/editor/components/url_link/info.xml @@ -8,7 +8,7 @@ Создание ссылок 連結 에디터에 링크를 추가하거나 링크의 속성을 변경할 수 있습니다. - エディターでリンクの追加、属性の変更ができます。 + エディターでリンクの追加、属性の変更が出来ます。 插入链接或编辑链接属性。 It can add a link to editor or modify the attribution of link. Puede añadir un enlace al editor o modificar la atribución de enlace. diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php index 8dc64b532..f1ff4f762 100644 --- a/modules/editor/lang/jp.lang.php +++ b/modules/editor/lang/jp.lang.php @@ -138,7 +138,7 @@ $lang->edit->icon_align_middle = '中央揃え'; $lang->edit->icon_align_right = '右揃え'; - $lang->about_dblclick_in_editor = '背景、文字、イメージ、引用文の上にカーソルを合わせ、ダブルクリックすると詳細設定できるコンポーネントを表示します。'; + $lang->about_dblclick_in_editor = '背景、文字、イメージ、引用文の上にカーソルを合わせ、ダブルクリックすると詳細設定出来るコンポーネントを表示します。'; $lang->edit->rich_editor = 'ウイジウイグ編集'; diff --git a/modules/editor/skins/fckeditor/editor/lang/ja.js b/modules/editor/skins/fckeditor/editor/lang/ja.js index aac2777cb..b8ecabe50 100644 --- a/modules/editor/skins/fckeditor/editor/lang/ja.js +++ b/modules/editor/skins/fckeditor/editor/lang/ja.js @@ -159,9 +159,9 @@ UnknownCommand : "未知のコマンド名 \"%1\"", NotImplemented : "コマンドはインプリメントされませんでした。", UnknownToolbarSet : "ツールバー設定 \"%1\" 存在しません。", NoActiveX : "エラー、警告メッセージなどが発生した場合、ブラウザーのセキュリティ設定によりエディタのいくつかの機能が制限されている可能性があります。セキュリティ設定のオプションで\"ActiveXコントロールとプラグインの実行\"を有効にするにして下さい。", -BrowseServerBlocked : "サーバーブラウザーを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", -DialogBlocked : "ダイアログウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", -VisitLinkBlocked : "新しいウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", +BrowseServerBlocked : "サーバーブラウザーを開くことが出来ませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", +DialogBlocked : "ダイアログウィンドウを開くことが出来ませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", +VisitLinkBlocked : "新しいウィンドウを開くことが出来ませんでした。ポップアップ・ブロック機能が無効になっているか確認して下さい。", // Dialogs DlgBtnOK : "OK", @@ -354,14 +354,14 @@ DlgReplaceReplAllBtn : "すべて置換え", DlgReplaceWordChk : "単語単位で一致", // Paste Operations / Dialog -PasteErrorCut : "ブラウザーのセキュリティ設定によりエディタの切り取り操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl+X)を使用して下さい。", -PasteErrorCopy : "ブラウザーのセキュリティ設定によりエディタのコピー操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl+C)を使用して下さい。", +PasteErrorCut : "ブラウザーのセキュリティ設定によりエディタの切り取り操作が自動で実行することが出来ません。実行するには手動でキーボードの(Ctrl+X)を使用して下さい。", +PasteErrorCopy : "ブラウザーのセキュリティ設定によりエディタのコピー操作が自動で実行することが出来ません。実行するには手動でキーボードの(Ctrl+C)を使用して下さい。", PasteAsText : "プレーンテキスト貼り付け", PasteFromWord : "ワード文章から貼り付け", DlgPasteMsg2 : "キーボード(Ctrl+V)を使用して、次の入力エリア内で貼って、OKを押して下さい。", -DlgPasteSec : "ブラウザのセキュリティ設定により、エディタはクリップボード・データに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。", +DlgPasteSec : "ブラウザのセキュリティ設定により、エディタはクリップボード・データに直接アクセスすることが出来ません。このウィンドウは貼り付け操作を行う度に表示されます。", DlgPasteIgnoreFont : "FontタグのFace属性を無視します。", DlgPasteRemoveStyles : "スタイル定義を削除します。", diff --git a/modules/file/lang/jp.lang.php b/modules/file/lang/jp.lang.php index c26057e03..e1d0b252d 100644 --- a/modules/file/lang/jp.lang.php +++ b/modules/file/lang/jp.lang.php @@ -24,9 +24,9 @@ $lang->about_allow_outlink = 'リファラーによって外部からのファイルリンクを制御出来ます。(*.wmv, *.mp3などのメディアファイルは除く)'; $lang->about_allow_outlink_format = '外部からのファイルリンク設定に構わず、常に外部からのリンクを許可する拡張子です。複数登録時には、「半角コンマ(,)」区切りで記入して下さい。
      eg)txt,doc,zip,pdf'; $lang->about_allow_outlink_site = '外部からのファイルリンク設定に構わず、常に外部からのリンクを許可するURLです。複数登録時には、改行で記入して下さい。
      ex)http://www.zeroboard.com'; - $lang->about_allowed_filesize = '一つのファイルに対して、アップロードできるファイルの最大サイズを指定します(管理者除外)。'; - $lang->about_allowed_attach_size = '一つの書き込みに対して、添付できる最大サイズを指定します(管理者除外)。'; - $lang->about_allowed_filetypes = 'アップロードできるように設定されたファイルのみが添付できます。"*.拡張子"で指定し、 ";"で区切って任意の拡張子を追加して指定できます(管理者除外)。
      ex) *.* or *.jpg;*.gif;
      '; + $lang->about_allowed_filesize = '一つのファイルに対して、アップロード出来るファイルの最大サイズを指定します(管理者除外)。'; + $lang->about_allowed_attach_size = '一つの書き込みに対して、添付出来る最大サイズを指定します(管理者除外)。'; + $lang->about_allowed_filetypes = 'アップロード出来るように設定されたファイルのみが添付出来ます。"*.拡張子"で指定し、 ";"で区切って任意の拡張子を追加して指定出来ます(管理者除外)。
      ex) *.* or *.jpg;*.gif;
      '; $lang->cmd_delete_checked_file = '選択リスト削除'; $lang->cmd_move_to_document = '書き込みに移動する'; @@ -35,7 +35,7 @@ $lang->msg_not_permitted_download = 'ダウンロード権限がありません。'; $lang->msg_cart_is_null = '削除するファイルを選択して下さい'; $lang->msg_checked_file_is_deleted = '%d個の添付ファイルを削除しました'; - $lang->msg_exceeds_limit_size = 'ファイルサイズの制限を超えたため、添付できません。'; + $lang->msg_exceeds_limit_size = 'ファイルサイズの制限を超えたため、添付出来ません。'; $lang->file_search_target_list = array( 'filename' => 'ファイル名', diff --git a/modules/homepage/lang/jp.lang.php b/modules/homepage/lang/jp.lang.php index 007ac823c..27376626c 100644 --- a/modules/homepage/lang/jp.lang.php +++ b/modules/homepage/lang/jp.lang.php @@ -23,7 +23,7 @@ 'freeboard' => '自由掲示板', 'view_total' => '全文を表示', 'view_comment' => '一行の物語', - 'cafe_album' => 'カフェアルバム', + 'cafe_album' => 'フォトギャラリー', 'menu' => 'メニュー', 'default_group1' => 'スタンバイ会員', 'default_group2' => '準会員', @@ -60,8 +60,8 @@ "dispHomepageMidSetup" => "ホームページの掲示板、ページなどのモジュールを管理します。", ); $lang->about_cafe = "ホームページサービス管理者は複数のホームページ作成、および各ホームページを簡単に管理が出来ます。"; - $lang->about_cafe_title = "ホームページ名は管理のためのみ使われ、実サービスには表示されません。"; - $lang->about_domain = "複数のホームページを作成するためには、専用のドメインが必要です。オリジナルドメインやサブ ドメインがあれば結構です。
      また、 XEインストールパスも一緒に記入して下さい。
      ex) www.zeroboard.com/zbxe"; + $lang->about_cafe_title = "ホームページ名は管理をするためだけに使われ、実サービスには表示されません。"; + $lang->about_domain = "複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
      また、 XEインストールパスも一緒に記入して下さい。
      ex) www.zeroboard.com/xe"; $lang->about_menu_names = "ホームページに使うメニュー名を言語別に指定出来ます。
      一個だけ記入した場合、他言語に一括適用されます。"; $lang->about_menu_option = "メニューを選択するとき新しいウィンドウズに開けるかを選択します。
      拡張メニューはレイアウトによって動作します。"; $lang->about_group_grant = "選択グループのみ、メニューが見えます。
      全てを解除すると非会員にも見えます。"; @@ -71,9 +71,9 @@ $lang->about_menu_item_url = "タイプをURLにした場合、リンク先を入れて下さい。
      http://は省いて入力して下さい。"; $lang->about_menu_image_button = "テキストのメニュー名の代わりに、イメージのメニューを使えます。"; $lang->about_cafe_delete = "ホームページを削除すると、リンクされている全てのモジュール(掲示板、ページなど)とそれに付随する書き込みが削除されます。
      ご注意下さい。"; - $lang->about_cafe_admin = "ホームページ管理者の設定が出来ます。
      ホームページ管理者は 「 http://ドメイン/?act=dispHomepageManage」 として管理者ページにアクセスが出来ます。
      存在しない会員は管理者に登録できません。"; + $lang->about_cafe_admin = "ホームページ管理者の設定が出来ます。
      ホームページ管理者は「http://ドメイン/?act=dispHomepageManage」にて管理者ページにアクセスが出来ます。
      存在しない会員は管理者として登録出来ません。"; $lang->confirm_change_layout = "レイアウトの変更時、一部のレイアウト情報が失われる可能性があります。 変更しますか?"; - $lang->confirm_delete_menu_item = "メニュー削除時、リンクされている掲示板やページモジュールも一緒に削除されます。削除しますか?"; - $lang->msg_already_registed_domain = "既に登録されたドメインです。違うドメインを利用して下さい。"; + $lang->confirm_delete_menu_item = "メニューの削除時、リンクされている掲示板やページモジュールも一緒に削除されます。削除しますか?"; + $lang->msg_already_registed_domain = "既に登録されているドメインです。異なるドメインを利用して下さい。"; ?> diff --git a/modules/importer/lang/jp.lang.php b/modules/importer/lang/jp.lang.php index 6aa582684..b55106bf3 100644 --- a/modules/importer/lang/jp.lang.php +++ b/modules/importer/lang/jp.lang.php @@ -56,6 +56,6 @@ $lang->about_ttxml_user_id = 'TTXML移転時に投稿者として指定するユーザIDを入力して下さい(すでに加入されているIDでなければなりません)。'; $lang->about_type_module = 'データ変換の対象が書き込みデータである場合は選択して下さい。'; $lang->about_type_syncmember = '会員情報と書き込みデータなどの変換を行った後、会員情報を同期化する必要がある場合は、選択して下さい。'; - $lang->about_importer = "ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをXEのデータに変換することができます。\n変換するためには、XML Exporterを利用して変換したい書き込みデータをXMLファイルで作成してアップロードして下さい。"; + $lang->about_importer = "ゼロボード4、zb5betaまたは他のプログラムの書き込みデータをXEのデータに変換することが出来ます。\n変換するためには、XML Exporterを利用して変換したい書き込みデータをXMLファイルで作成してアップロードして下さい。"; $lang->about_target_path = "添付ファイルをダウンロードするためには、ゼロボード4がインストールされた場所を入力して下さい。同じサーバ上にある場合は「/home/ID/public_html/bbs」のように入力し、他のサーバにある場合は、「http://ドメイン/bbs」のようにゼロボードがインストールされているURLを入力して下さい。"; ?> diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index eb890d848..031e4b262 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -255,7 +255,7 @@ EndOfLicense; $lang->use_optimizer = 'オプティマイザ使用'; $lang->about_optimizer = 'オプティマイザを使用すると多数の「CSS/JS」ファイルを、統合・圧縮して転送するのでレスポンスが早くなります。
      但し、CSSまたはJSファイルによっては問題が生じる場合があります。この場合は、チェックを外すと正常に動作します。'; $lang->use_rewrite = 'リライト・モジュールを使用'; - $lang->about_rewrite = 'Webサーバで「リライト・モジュール(mod_rewrite)」をサポートしている場合は、「http://アドレス/?document_srl=123」のようなアドレスを動的だけど「http://アドレス/123」のように静的なページに見せることができます。'; + $lang->about_rewrite = 'Webサーバで「リライト・モジュール(mod_rewrite)」をサポートしている場合は、「http://アドレス/?document_srl=123」のようなアドレスを動的だけど「http://アドレス/123」のように静的なページに見せることが出来ます。'; $lang->time_zone = 'タイムゾーン'; $lang->about_time_zone = 'サーバの設定時間とサービスしているローカル時間との差がある場合、タイムゾーンを指定して表示時間を合わせることが出来ます。'; $lang->qmail_compatibility = 'Qmail 互換'; diff --git a/modules/krzip/conf/info.xml b/modules/krzip/conf/info.xml index dcab5e577..ae8428f5e 100644 --- a/modules/krzip/conf/info.xml +++ b/modules/krzip/conf/info.xml @@ -25,7 +25,7 @@
      XEで運用している郵便番号サーバを利用して韓国の郵便番号を検索します。 - 郵便番号検索サーバは設定によって変更することができます。 + 郵便番号検索サーバは設定によって変更することが出来ます。 Поиск индекса через сервер почтовый индексов, оперируемый XE. diff --git a/modules/layout/lang/jp.lang.php b/modules/layout/lang/jp.lang.php index cc9a12073..f40487448 100644 --- a/modules/layout/lang/jp.lang.php +++ b/modules/layout/lang/jp.lang.php @@ -25,7 +25,7 @@ $lang->about_title = 'モジュールとの連動をわかりやすく区分するためのタイトルを入力して下さい。'; $lang->about_not_apply_menu = 'チェックを入れると連動するすべてのメニューのモジュールのレイアウトを一括変更します。'; - $lang->about_layout = "レイアウトのモジュールはサイトのレイアウトを分かりやすく作成できるようにします。レイアウトの設定とメニューのリンクで様々なモジュールで完成されたサイトデザインができます。
      ★削除・修正ができないレイアウトはブログまたは他のモジュールのレイアウトであるため、該当するモジュールで設定を行って下さい。"; + $lang->about_layout = "レイアウトのモジュールはサイトのレイアウトを分かりやすく作成出来るようにします。レイアウトの設定とメニューのリンクで様々なモジュールで完成されたサイトデザインが出来ます。
      ★削除・修正ができないレイアウトはブログまたは他のモジュールのレイアウトであるため、該当するモジュールで設定を行って下さい。"; $lang->about_layout_code = "下のレイアウトコードを修正し、保存するとサービスに反映されます。 必ずプレビューで確認してから保存して下さい。 @@ -36,41 +36,42 @@ $lang->about_layout_export = 'カスタマイズした自分のレイアウトをエクスポートします。'; $lang->layout_import = 'インポート'; $lang->about_layout_import = 'インポートする場合、既存の修正されたレイアウトを上書きします。インポート前にエクスポートでバックアップすることをお勧めします。'; + $lang->layout_manager = array( 0 => 'レイアウトマネジャー', 1 => '保存', 2 => '取り消し', - 3 => '형태', + 3 => '形態', 4 => '配列', 5 => '整列', 6 => '固定型レイアウト', 7 => '可変型レイアウト', 8 => '固定+可変(内容)', - 9 => '1칸', - 10 => '2칸 (내용 왼쪽)', - 11 => '2칸 (내용 오른쪽)', - 12 => '3칸 (내용 왼쪽)', - 13 => '3칸 (내용 가운데)', - 14 => '3칸 (내용 오른쪽)', + 9 => '1欄', + 10 => '2欄 (内容左側)', + 11 => '2欄 (内容右側)', + 12 => '3欄 (内容左側)', + 13 => '3欄 (内容中央)', + 14 => '3欄 (内容右側)', 15 => '左', 16 => '中央', 17 => '右', - 18 => '전체', + 18 => 'すべて', 19 => 'レイアウト', - 20 => 'ウィジェット 추가', - 21 => '내용 ウィジェット 추가', + 20 => 'ウィジェット追加', + 21 => '内容 ウィジェット追加', 22 => '属性', 23 => 'ウィジェットスタイル', 24 => '修正', 25 => '削除', 26 => '整列', - 27 => '一行차지', + 27 => '一行占め', 28 => '左', 29 => '右', 30 => '横幅サイズ', 31 => '高さ', - 32 => '바깥 여백', - 33 => '안쪽 여백', + 32 => '外側余白', + 33 => '内側余白', 34 => '上', 35 => '左', 36 => '右', @@ -78,14 +79,14 @@ 38 => 'ボーダー', 39 => 'なし', 40 => '背景', - 41 => '색상', + 41 => '色', 42 => '画像', 43 => '選択', - 44 => '배경 그림 반복', - 45 => '반복', - 46 => '반복 안함', - 47 => '가로 반복', - 48 => '세로 반복', + 44 => '背景画像リピート', + 45 => 'リピート', + 46 => 'リピートしない', + 47 => '横方向リピート', + 48 => '縦方向リピート', 49 => '適用', 50 => '取り消し', 51 => '初期化', @@ -102,11 +103,11 @@ $lang->about_faceoff = array( 'title' => 'XpressEngine FaceOff レイアウト管理ツール', - 'description' => 'FaceOff レイアウト管理ツールはウェブ上で手軽なレイアウト変更が可能に出来ます。
      아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요', - 'layout' => 'FaceOffは上のようなHTML構造になっています。
      이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
      ウィジェット 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', - 'setting' => '좌측 상단의 메뉴에 대해 설명 드립니다.
      • 保存 : 설정된 내용을 저장합니다.
      • 취소 : 설정한 내용을 저장하지 않고 돌아갑니다.
      • 초기화 : 아무 설정도 되어 있지 않은 백지 상태로 돌립니다
      • 형태 : 고정/ 가변/ 고정+가변(내용)의 형태를 지정합니다.
      • 배열 : Extension 2개와 Content를 배열합니다.
      • 정렬 : 레이아웃의 위치를 정렬시킬 수 있습니다.
      ', - 'hotkey' => '마우스로 각 영역을 선택하면서 Hot Key를 이용하시면 더 쉽게 꾸미실 수 있습니다.
      • tab 키 : ウィジェット이 선택되어 있지 않으면 Header, Body, Footer 순으로 선택됩니다. ウィジェット이 선택되어 있다면 다음 ウィジェット으로 선택이 이동됩니다.
      • Shift + tab키 : tab키와 반대 역할을 합니다.
      • Esc : 아무것도 선택되어 있지 않을때 Esc를 누르면 Neck, Extension(e1,e2),Knee 순서대로 선택이 되며 ウィジェット이 선택되어 있다면 선택된 ウィジェット을 감싸는 영역이 선택됩니다.
      • 방향키 : ウィジェット이 선택되어 있을때 방향키를 이용하여 ウィジェット을 다른 영역으로 이동시킬 수 있습니다.
      ', - 'attribute' => 'ウィジェット을 제외한 각 영역들은 모두 배경 색/ 이미지를 지정할 수 있고 글자색(a 태그 포함됨)을 정할 수 있습니다.', + 'description' => 'FaceOffレイアウト管理ツールはウェブ上で手軽にレイアウト変更を可能にします。
      下の図を参照しながら構成要素と機能を理解して、自由にレイアウトをカスタマイズしてみて下さい。', + 'layout' => 'FaceOffは上のようなHTML構造になっています。
      この構造にてCSSを用い、形態/配列/整列が可能になり、さらにStyleを使った自由なカスタマイズが出来ます。
      ウィジェットの追加はExtension(e1、e2)と Neck、 Kneeにて可能です。
      その他にBody、Layout、Header、Body、FooterはStyleをカスタマイズ出来、Contentはモジュールの内容が出力されます。', + 'setting' => '左側上段のメニューの説明
      • 保存 : 設定内容を保存します。
      • 取り消し : 設定内容を保存せずに、差し戻します。
      • 初期化 : 何の設定もない白紙状態に戻します。
      • タイプ : 固定/可変/固定+可変(内容)の形態を指定します。
      • 配列 : Extension 2つとContentを配列します。
      • 整列 : レイアウトの位置を整列けます。
      ', + 'hotkey' => 'マウスを使って各スペースを選択しながら、Hot Keyを利用するとより便利にカスタマイズ出来ます。
      • tabキー : ウィジェットが選択されたない場合、Header、Body、 Footer順に選択されます。ウィジェットが選択されている場合は、次のウィジェットに選択が移ります。
      • Shift + tabキー : tabキーと逆の役割をします。
      • Esc : 何も選択されてない場合、Escを押すとNeck、Extension(e1、e2)、Knee順に選択され、また、ウィジェットが選択されている場合は選択されたウィジェットを囲む領域が選択されます。
      • 矢印 : ウィジェットが選択されている時、矢印キーを用いて、ウィジェットを他の領域に移せます。
      ', + 'attribute' => 'ウィジェットを除いた各領域はすべて背景の色・イメージの指定が出来、文字のテキスト色(「a」タグを含む)の指定が可能です。', ); ?> diff --git a/modules/member/lang/jp.lang.php b/modules/member/lang/jp.lang.php index a619dfe43..9b5265763 100644 --- a/modules/member/lang/jp.lang.php +++ b/modules/member/lang/jp.lang.php @@ -17,7 +17,7 @@ $lang->denied_user_id = '使用が禁じられているIDです。'; $lang->null_user_id = 'ユーザIDをもう一度入力して下さい。'; $lang->null_password = 'パスワードを入力して下さい。'; - $lang->invalid_authorization = '認証できませんでした。'; + $lang->invalid_authorization = '認証出来ませんでした。'; $lang->invalid_user_id= '存在しないユーザIDです。'; $lang->invalid_password = '無効なパスワードです。'; $lang->allow_mailing = 'メーリングリスト'; @@ -132,28 +132,28 @@ $lang->msg_update_member = '会員情報修正'; $lang->msg_leave_member = '会員退会'; $lang->msg_group_is_null = '登録されたグループがありません。'; - $lang->msg_not_delete_default = '基本項目は削除できません。'; + $lang->msg_not_delete_default = '基本項目は削除出来ません。'; $lang->msg_not_exists_member = '存在しないユーザIDです。'; - $lang->msg_cannot_delete_admin = '管理者IDは削除できません。管理者権限を解除した上で削除してみて下さい。'; + $lang->msg_cannot_delete_admin = '管理者IDは削除出来ません。管理者権限を解除した上で削除してみて下さい。'; $lang->msg_exists_user_id = '既に存在するユーザIDです。他のIDを入力して下さい。'; $lang->msg_exists_email_address = '既に存在するメールアドレスです。他のメールアドレスを入力して下さい。'; $lang->msg_exists_nick_name = '既に存在するニックネームです。他のニックネームを入力して下さい。'; - $lang->msg_signup_disabled = '会員に登録することができません。'; + $lang->msg_signup_disabled = '会員に登録することが出来ません。'; $lang->msg_already_logged = '既に会員に登録されています。'; $lang->msg_not_logged = 'ログインしていません。'; $lang->msg_insert_group_name = 'グループ名を入力して下さい。'; $lang->msg_check_group = 'グループを選択して下さい。'; - $lang->msg_not_uploaded_profile_image = 'プロフィールイメージを登録することができません。'; - $lang->msg_not_uploaded_image_name = 'イメージ名を登録することができません。'; - $lang->msg_not_uploaded_image_mark = 'イメージマークを登録することができません。'; + $lang->msg_not_uploaded_profile_image = 'プロフィールイメージを登録することが出来ません。'; + $lang->msg_not_uploaded_image_name = 'イメージ名を登録することが出来ません。'; + $lang->msg_not_uploaded_image_mark = 'イメージマークを登録することが出来ません。'; $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; $lang->msg_accept_agreement = '規約に同意しなければなりません。'; $lang->msg_user_denied = '入力されたユーザIDは使用が中止されました。'; $lang->msg_user_not_confirmed = 'まだメールの確認が出来ませんでした。届いたメールをご確認下さい。'; - $lang->msg_user_limited = '入力されたユーザIDは%s以降から使用できます。'; + $lang->msg_user_limited = '入力されたユーザIDは%s以降から使用出来ます。'; $lang->about_user_id = 'ユーザIDは3~20の英数文字で構成され、最先頭の文字は英字でなければなりません。'; $lang->about_password = 'パスワードは6~20文字です。'; @@ -165,32 +165,32 @@ $lang->about_birthday = '生年月日を入力して下さい。'; $lang->about_allow_mailing = 'メーリングリストにチェックされていない場合は、全体メールの送信時にメールを受け取りません。'; $lang->about_denied = 'チェックするとユーザIDを使用できないようにします。'; - $lang->about_is_admin = 'チェックすると最高管理者権限が取得できます。'; + $lang->about_is_admin = 'チェックすると最高管理者権限が取得出来ます。'; $lang->about_member_description = '会員に対する管理者のメモ帳です。'; - $lang->about_group = '一つのユーザIDは多数のグループに属することができます。'; + $lang->about_group = '一つのユーザIDは多数のグループに属することが出来ます。'; $lang->about_column_type = '追加する登録フォームのタイプを指定して下さい。'; - $lang->about_column_name = 'テンプレートで使用できる英文字の名前を入力して下さい(変数名)。'; + $lang->about_column_name = 'テンプレートで使用出来る英文字の名前を入力して下さい(変数名)。'; $lang->about_column_title = '登録または情報修正・閲覧時に表示されるタイトルです。'; - $lang->about_default_value = 'デフォルトで入力される値を指定することができます。'; + $lang->about_default_value = 'デフォルトで入力される値を指定することが出来ます。'; $lang->about_active = '活性化(有効化)にチェックを入れないと正常に表示されません。'; $lang->about_form_description = '説明欄に入力すると登録時に表示されます。'; $lang->about_required = 'チェックを入れると会員登録時に必須入力項目として設定されます。'; $lang->about_enable_openid = 'OpenIDをサポートする際にチェックを入れます。'; - $lang->about_enable_join = 'チェックを入れないとユーザが会員に登録できません。'; + $lang->about_enable_join = 'チェックを入れないとユーザが会員に登録出来ません。'; $lang->about_enable_confirm = '登録されたメールアドレスに確認メールを送信し、会員登録を確認します。'; $lang->about_enable_ssl = 'サーバーでSSLが可能な場合、会員登録/情報変更/ログイン等の個人情報はSSL(https)経由でサーバーにより安全に送信されます。'; - $lang->about_limit_day = '会員登録後一定の期間中、認証制限を行うことができます。'; + $lang->about_limit_day = '会員登録後一定の期間中、認証制限を行うことが出来ます。'; $lang->about_limit_date = '指定された期間まで該当ユーザはログインできなくします。'; - $lang->about_after_login_url = 'ログイン後表示されるページのURLを指定できます。指定のない場合、現在のページが維持されます。'; - $lang->about_after_logout_url = 'ログアウト後表示されるページのURLを指定できます。指定のない場合、現在のページが維持されます。'; - $lang->about_redirect_url = '会員登録後、表示されるページのURLを指定できます。指定のない場合は会員登録する前のページに戻ります。'; + $lang->about_after_login_url = 'ログイン後表示されるページのURLを指定出来ます。指定のない場合、現在のページが維持されます。'; + $lang->about_after_logout_url = 'ログアウト後表示されるページのURLを指定出来ます。指定のない場合、現在のページが維持されます。'; + $lang->about_redirect_url = '会員登録後、表示されるページのURLを指定出来ます。指定のない場合は会員登録する前のページに戻ります。'; $lang->about_agreement = '会員登録規約がない場合は表示されません。'; - $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることができます。'; - $lang->about_image_mark = '使用者の名前の前にマークを付けることができます。'; - $lang->about_profile_image = 'ユーザのプロフィールイメージが使用できるようにします。'; + $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることが出来ます。'; + $lang->about_image_mark = '使用者の名前の前にマークを付けることが出来ます。'; + $lang->about_profile_image = 'ユーザのプロフィールイメージが使用出来るようにします。'; $lang->about_group_image_mark = 'ユーザー名の前にグループマークを表示します。'; $lang->about_signature_max_height = '署名欄の高さのサイズを制限します。 (0 もしくは空の場合は制限なし。)'; $lang->about_accept_agreement = '登録規約をすべて読んだ上で同意します。'; @@ -198,10 +198,10 @@ $lang->about_member_default = '会員登録時に基本グループとして設定されます。'; $lang->about_openid = 'OpenIDで登録する際、IDとメールなどの基本情報は、このサイトに保存されますが、パスワードと認証のための処理用の情報は該当するOpenID提供サービス側で行われます。'; - $lang->about_openid_leave = 'OpenIDの退会は現在のサイトから会員情報を削除することを意味します。
      退会後ログインすると新しく登録することになり、書き込んだコンテンツに対する権限を維持することができません。'; + $lang->about_openid_leave = 'OpenIDの退会は現在のサイトから会員情報を削除することを意味します。
      退会後ログインすると新しく登録することになり、書き込んだコンテンツに対する権限を維持することが出来ません。'; $lang->about_find_member_account = 'ID/パスワードは登録時に登録されたメールにてお知らせします。
      登録時に登録したメールアドレスを入力して「IDとパスワードの検索」ボタンをクリックして下さい。
      '; - $lang->about_member = "会員の作成・修正・削除することができ、グループの管理、登録フォームの管理などが行える会員管理モジュールです。デフォルトで作成されたグループにグループを追加作成して会員管理ができるようにし、登録フォーム管理では基本情報の他、フォームの入力情報を追加することができます。"; + $lang->about_member = "会員の作成・修正・削除することができ、グループの管理、登録フォームの管理などが行える会員管理モジュールです。デフォルトで作成されたグループにグループを追加作成して会員管理が出来るようにし、登録フォーム管理では基本情報の他、フォームの入力情報を追加することが出来ます。"; $lang->about_ssl_port = '基本ポート以外のSSLポートを利用する場合、入力して下さい。'; $lang->add_openid = 'OpenIDの追加'; ?> diff --git a/modules/menu/lang/jp.lang.php b/modules/menu/lang/jp.lang.php index 840928323..3f281ee0b 100644 --- a/modules/menu/lang/jp.lang.php +++ b/modules/menu/lang/jp.lang.php @@ -36,18 +36,18 @@ $lang->cmd_enable_move_menu = "メニュー移動(選択後メニューをドラッグして下さい)"; $lang->cmd_search_mid = "mid 検索"; - $lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除できません。'; + $lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除出来ません。'; $lang->about_title = 'モジュールをリンクする際に分かりやすいタイトルを入力して下さい。'; - $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成できるようにします。
      一定レベルまでメニューの構成ができ、入力したメニューをクリックすると詳細情報が入力できます。
      フォルダーのイメージをクリックするとメニューを拡張することができます。
      もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新して下さい。
      * 一定レベル以上のメニューは正しく表示されない場合があります。"; + $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成出来るようにします。
      一定レベルまでメニューの構成ができ、入力したメニューをクリックすると詳細情報が入力出来ます。
      フォルダーのイメージをクリックするとメニューを拡張することが出来ます。
      もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新して下さい。
      * 一定レベル以上のメニューは正しく表示されない場合があります。"; $lang->about_menu_name = '管理及びイメージボタンではない場合、メニュー名として表示されるタイトルです。'; $lang->about_menu_url = "メニュー選択時、移動するURLです。
      他のモジュールとリンクを張る場合はIDの値のみ入力して下さい。
      内容がない場合は、メニューを選択しても何の動作もありません。"; - $lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することができます。'; - $lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることができます。'; + $lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することが出来ます。'; + $lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることが出来ます。'; $lang->about_menu_img_btn = 'イメージボタンを登録するとレイアウトで自動的にイメージボタンに入れ替わって表示されます。'; $lang->about_menu_group_srls = 'グループを選択すると該当するグループのユーザにのみメニューが表示されます(XMLファイルを直接開くと情報が表示されます)。'; - $lang->about_menu = "メニューモジュルは、生成されたモジュールを、便利なメニュー管理機能で、整理したりレイアウトをリンクしたりして煩わしい作業なしでサイトを構築できるようにします。メニューは、サイトを管理するというより、モジュールとレイアウトをリンクして様々なメニューを表示させる情報のみ保持します。"; + $lang->about_menu = "メニューモジュルは、生成されたモジュールを、便利なメニュー管理機能で、整理したりレイアウトをリンクしたりして煩わしい作業なしでサイトを構築出来るようにします。メニューは、サイトを管理するというより、モジュールとレイアウトをリンクして様々なメニューを表示させる情報のみ保持します。"; - $lang->alert_image_only = "イメージ(画像)ファイルのみ登録できます。"; + $lang->alert_image_only = "イメージ(画像)ファイルのみ登録出来ます。"; ?> diff --git a/modules/message/lang/jp.lang.php b/modules/message/lang/jp.lang.php index d1f6945b2..60e7fdc88 100644 --- a/modules/message/lang/jp.lang.php +++ b/modules/message/lang/jp.lang.php @@ -6,5 +6,5 @@ **/ $lang->message = 'エラー表示'; - $lang->about_skin = "メッセージを表示する際のスキンが指定できます。"; + $lang->about_skin = "メッセージを表示する際のスキンが指定出来ます。"; ?> diff --git a/modules/module/lang/jp.lang.php b/modules/module/lang/jp.lang.php index cd3485f63..3cb6d6ebe 100644 --- a/modules/module/lang/jp.lang.php +++ b/modules/module/lang/jp.lang.php @@ -35,7 +35,7 @@ $lang->filebox = "ファイルボックス"; $lang->header_script = "ヘッダースクリプト"; - $lang->about_header_script = "HTMLの<header>と</header>の間に入れるコードを直接入力できます。
      <script、<styleまたは<metaタグなどが利用できます"; + $lang->about_header_script = "HTMLの<header>と</header>の間に入れるコードを直接入力出来ます。
      <script、<styleまたは<metaタグなどが利用出来ます"; $lang->grant_access = "アクセス権限"; $lang->grant_manager = "管理権限"; @@ -61,30 +61,30 @@ $lang->msg_category_is_null = '登録されているカテゴリがありません。'; $lang->msg_grant_is_null = '登録された権限がありません。'; $lang->msg_no_checked_document = '選択された書き込みがありません。'; - $lang->msg_move_failed = '移動することができませんでした。'; - $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することができません。'; + $lang->msg_move_failed = '移動することが出来ませんでした。'; + $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することが出来ません。'; $lang->msg_limit_mid ="モジュール名は「 半角英小文字+[半角英小文字+半角数字+_] 」のみ出来ます。"; $lang->msg_extra_name_exists = '既に存在する拡張変数名です。他の拡張変数名を入力して下さい。'; $lang->about_browser_title = "ブラウザのタイトルバーに表示される内容です。RSS/Trackbackでも使用します。"; $lang->about_mid = "モジュール名は、http://アドレス/?mid=モジュール名、のように直接呼び出せる値です(英数+[英数,_のみ可])。"; $lang->about_default = "チェックすると、サイトに「 mid値」なしで接続した場合、デフォルトで表示します。"; - $lang->about_module_category = "カテゴリで管理できるようにします。モジュールのカテゴリの管理は、モジュール管理 > モジュールカテゴリ で行うことができます。"; + $lang->about_module_category = "カテゴリで管理出来るようにします。モジュールのカテゴリの管理は、モジュール管理 > モジュールカテゴリ で行うことが出来ます。"; $lang->about_description= '管理用に用いられる説明です。'; $lang->about_default = 'チェックすると、サイトに「mid値」なしで接続した場合、デフォルトで表示します。'; - $lang->about_header_text = 'モジュールのヘッダーに表示される内容です(HTMLタグが使用できる)。'; - $lang->about_footer_text = 'モジュールのフッターに表示される内容です。(HTMLタグが使用できる)。'; - $lang->about_skin = 'モジュールのスキンを選択することができます。'; - $lang->about_use_category = 'チェックするとカテゴリ機能が使用できます。'; - $lang->about_list_count = '1ページ当たりに表示される書き込みの数が指定できます(デフォルト20個)。'; + $lang->about_header_text = 'モジュールのヘッダーに表示される内容です(HTMLタグの使用可能)。'; + $lang->about_footer_text = 'モジュールのフッターに表示される内容です。(HTMLタグの使用可能)。'; + $lang->about_skin = 'モジュールのスキンを選択することが出来ます。'; + $lang->about_use_category = 'チェックするとカテゴリ機能が使用出来ます。'; + $lang->about_list_count = '1ページ当たりに表示される書き込みの数が指定出来ます(デフォルト20個)。'; $lang->about_search_list_count = 'お勧めの記事数を設定するにさらされるかのカテゴリ検索機能を使用する場合です。 (デフォルトは20 )'; - $lang->about_page_count = 'リストの下段に移動できるページのリンク数が指定できます(デフォルト10個)。'; - $lang->about_admin_id = '該当するモジュールに対して最高権限を持つ管理者を指定することができます。'; + $lang->about_page_count = 'リストの下段に移動出来るページのリンク数が指定出来ます(デフォルト10個)。'; + $lang->about_admin_id = '該当するモジュールに対して最高権限を持つ管理者を指定することが出来ます。'; $lang->about_grant = '特定権限の対象をすべて解除するとログインしていない会員ユーザまで権限が与えられます。'; $lang->about_grant_deatil = '登録ユーザーとはcafeXEなど分譲型バーチャル(Virtual)サイトに登録した、ログインユーザーを意味します。'; - $lang->about_module = "XEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理できるようにします。"; - $lang->about_extra_vars_default_value = '多重・単一選択などのデフォルト値が、複数必要な場合は、「, (コンマ)」で区切って追加することができます。'; - $lang->about_search_virtual_site = "バーチャル(Virtual)サイト(:cafeXEなど)のドメインを入力後、検索して下さい。
      バーチャル(Virtual)サイト以外のモジュールは内容を空にしてから検索します。(http://は除く)"; + $lang->about_module = "XEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理出来るようにします。"; + $lang->about_extra_vars_default_value = '多重・単一選択などのデフォルト値が、複数必要な場合は、「, (コンマ)」で区切って追加することが出来ます。'; + $lang->about_search_virtual_site = "バーチャル(Virtual)サイト(:cafeXEなど)のドメインを入力して検索して下さい。
      バーチャル(Virtual)サイト以外のモジュールは内容を空にしてから検索します。(http://は省く)"; $lang->about_extra_vars_eid_value = '拡張変数名を入力して下さい。 (英字+[英字+数字+_]のみ可能(全て半角))'; $lang->about_langcode = "言語ごとに異なる設定をする場合、言語コード検索を利用して下さい。"; $lang->about_file_extension= "%s ファイルのみ可能です。"; diff --git a/modules/opage/lang/jp.lang.php b/modules/opage/lang/jp.lang.php index efe2eca8e..107a3fe59 100644 --- a/modules/opage/lang/jp.lang.php +++ b/modules/opage/lang/jp.lang.php @@ -9,7 +9,7 @@ $lang->opage_path = "外部ドキュメントの場所"; $lang->opage_caching_interval = "キャッシング時間設定"; - $lang->about_opage = "外部のHTMLまたはPHPファイルをXE内部で使用できるようにするモジュールです。
      絶対パス、相対パスで指定でき、「http://」で始まるサーバの外部ページも表示できます。"; - $lang->about_opage_path= "外部ドキュメントの場所を入力して下さい。
      「/path1/path2/sample.php」のような絶対パス、「../path2/sample.php」のような相対パスが使用できます。
      「http://URL/sample.php」のように使用すると結果を読み込んで表示します。
      現在XEがインストールされている絶対パスは次のようになっています。
      "; + $lang->about_opage = "外部のHTMLまたはPHPファイルをXE内部で使用出来るようにするモジュールです。
      絶対パス、相対パスで指定でき、「http://」で始まるサーバの外部ページも表示出来ます。"; + $lang->about_opage_path= "外部ドキュメントの場所を入力して下さい。
      「/path1/path2/sample.php」のような絶対パス、「../path2/sample.php」のような相対パスが使用出来ます。
      「http://URL/sample.php」のように使用すると結果を読み込んで表示します。
      現在XEがインストールされている絶対パスは次のようになっています。
      "; $lang->about_opage_caching_interval = "分単位で指定でき、設定された時間の間は、臨時保存されたデータを出力します。
      他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。
      「0」に指定するとキャッシングされません。"; ?> diff --git a/modules/page/conf/info.xml b/modules/page/conf/info.xml index cc2f8ff6a..a0cb65611 100644 --- a/modules/page/conf/info.xml +++ b/modules/page/conf/info.xml @@ -9,7 +9,7 @@ 頁面 페이지를 제작하여 컨텐츠로 연결할 수 있는 모듈 制作页面并能连接到内容区的模块。 - ページを作成してコンテンツとしてリンクできるようにするモジュールです。 + ページを作成してコンテンツとしてリンク出来るようにするモジュールです。 This module is for creating pages to link with contents. Este módulo is para crear página para enlazar con contenidos. Этот модуль служит для создания страниц, чтобы связать их с содержимым. diff --git a/modules/page/lang/jp.lang.php b/modules/page/lang/jp.lang.php index bc45aa399..debfd936c 100644 --- a/modules/page/lang/jp.lang.php +++ b/modules/page/lang/jp.lang.php @@ -6,6 +6,6 @@ **/ $lang->page = "ページ"; - $lang->about_page = "完成されたひとつのページが作成できるブログモジュールです。最近の書き込みやウィジェットを用いて動的なページが作成でき、エディターのコンポネントで様々な形でデザインできます。接続URLは、他のモジュールと同じく、「mid=モジュール名」で接続ができ、デフォルトで選択するとメインページが表示されます。"; + $lang->about_page = "完成されたひとつのページが作成出来るブログモジュールです。最近の書き込みやウィジェットを用いて動的なページが作成でき、エディターのコンポネントで様々な形でデザイン出来ます。接続URLは、他のモジュールと同じく、「mid=モジュール名」で接続ができ、デフォルトで選択するとメインページが表示されます。"; $lang->cmd_page_modify = "ページ修正"; ?> diff --git a/modules/planet/lang/jp.lang.php b/modules/planet/lang/jp.lang.php index 6fe76518e..3b4cea84c 100644 --- a/modules/planet/lang/jp.lang.php +++ b/modules/planet/lang/jp.lang.php @@ -24,7 +24,7 @@ プラネットを初期ページとして利用する場合は、ホームページパッケージで登録されているドメインと異なるドメインを登録して下さい。"; $lang->planet_mid = "プラネットアクセスアドレス"; - $lang->about_planet_mid = "プラネットアクセスアドレスは「http://XEアドレス/プラネットアクセスアドレス」のようにダイレクトで接続できるアドレスを指します。"; + $lang->about_planet_mid = "プラネットアクセスアドレスは「http://XEアドレス/プラネットアクセスアドレス」のようにダイレクトで接続出来るアドレスを指します。"; $lang->planet_default_skin = "プラネット基本スキン"; $lang->about_planet_default_skin = "プラネットメインページ及び作成されたプラネットの基本スキンに設定されます。"; @@ -33,18 +33,18 @@ $lang->about_planet_comment = "プラネット簡単紹介はプラネットに接続した時ブラウザのタイトル及びプラネットの簡単紹介欄に表示される内容です。"; $lang->use_signup = "会員登録ボタン表示"; - $lang->about_use_signup = "会員登録ボタン表示を選択するとプラネットの上段メニュに会員登録ができるボタンが表示されます。"; + $lang->about_use_signup = "会員登録ボタン表示を選択するとプラネットの上段メニュに会員登録が出来るボタンが表示されます。"; $lang->cmd_create_planet = "マイプラネット作成"; $lang->create_message = "マイプラネット作成案内文"; - $lang->about_create_message = "プラネット作成時に表示される案内文が入力できます。"; + $lang->about_create_message = "プラネット作成時に表示される案内文が入力出来ます。"; $lang->cmd_planet_setup = "基本設定"; $lang->cmd_planet_list = "プラネットリスト"; $lang->msg_not_logged = "ログインしていません。"; - $lang->msg_planet_exists = "既に作成したプラネットがありますので、新しく作成することができません。"; + $lang->msg_planet_exists = "既に作成したプラネットがありますので、新しく作成することが出来ません。"; $lang->planet_userinfo = "個人情報"; $lang->planet_change_userinfo = "個人情報変更"; @@ -89,9 +89,9 @@ $lang->planet_photo = "写真"; $lang->planet_myintro = "自己紹介"; - $lang->about_planet_url = "設定後変更できません。"; + $lang->about_planet_url = "一度設定すると変更が出来ませんので、慎重に決めて下さい。"; $lang->planet_mytag = "人物タグ"; - $lang->about_planet_mytag = "自分を表現するタグです。複数のタグは「,」で区別されます。"; + $lang->about_planet_mytag = "自分を表現するタグです。複数のタグは半角「,(コンマ)」で区切って入力して下さい。"; $lang->about_planet_tag = "複数のタグは「,」で区別されます。"; @@ -123,12 +123,12 @@ $lang->planet_article_preview = "プレビュー"; - $lang->planet_notice_title = "%sさん、プラネットにようこそ!
      %sさんの考え、意見、情報、知識などを自由にたくさんの人々と共有できるプラネットです。簡単な使い方を案内します。"; + $lang->planet_notice_title = "%sさん、プラネットにようこそ!
      %sさんの考え、意見、情報、知識などを自由にたくさんの人々と共有出来るプラネットです。簡単な使い方を案内します。"; $lang->planet_notice_list = array( "「新規投稿」の「開く」ボタンを利用してみて下さい。記事を作成するウィンドウが開きます。", "作成された記事は %sさんのプラネットに訪問する人々に公開されます。", - "「お気に入り追加」と「関心タグ追加」機能はいつでも%sさんの関心記事を見ることができます。", - "%sさんの「写真、ネックネーム、タグ」などの情報は現在ページから変更できます。", + "「お気に入り追加」と「関心タグ追加」機能はいつでも%sさんの関心記事を見ることが出来ます。", + "%sさんの「写真、ネックネーム、タグ」などの情報は現在ページから変更出来ます。", "他のプラネットが気になりますか?「リアルタイム人気タグ」または「検索」を利用してみて下さい。", "その他、気になる部分は「質問」タグを検索してみて下さい。他の方から答えてもらえます。", ); @@ -164,16 +164,16 @@ $lang->msg_success_set_phone_number = '電話番号を登録しました。'; $lang->planet_tagtab = "基本タグタブ"; - $lang->about_planet_tagtab = "半角コンマ(,)区切りで複数タグの登録が出来ます。 登録したタグはメインページにタブとして出力されます。"; + $lang->about_planet_tagtab = "半角コンマ(,)区切りで複数タグの登録が出来ます。 登録したタグはメインページにタブとして出力されます。"; $lang->planet_tagtab_after = "追加タグタブ"; - $lang->about_planet_tagtab_after = "基本タグタブの後ろに、複数のタグタブの追加が出来ます。半角コンマ(,)区切りで複数登録出来ます。"; + $lang->about_planet_tagtab_after = "基本タグタブの後ろに、複数のタグタブの追加が出来ます。半角コンマ(,)区切りで複数登録出来ます。"; $lang->planet_smstag = "SMS登録タグ"; - $lang->about_planet_smstag = "半角コンマ(,)区切りで複数のタグ指定が出来ます。SMSで登録されるタグ"; + $lang->about_planet_smstag = "SMSで登録されるタグです。半角コンマ(,)区切りで複数のタグ指定が出来ます。"; $lang->planet_use_mobile = "SMS連動"; - $lang->about_use_mobile = "携帯SMSで書き込みが出来ます。(日本国内は未対応)"; + $lang->about_use_mobile = "携帯SMSにて書き込みが出来ます。(日本国内は未対応)"; $lang->planet_use_me2day = "mw2day連動"; - $lang->about_use_me2day = "書き込みがme2dayへ送信されます。"; + $lang->about_use_me2day = "書き込みの内容がme2dayへ送信されます。"; $lang->msg_search_thisplanet = "このプラネットで検索"; diff --git a/modules/point/conf/info.xml b/modules/point/conf/info.xml index e28c27e4a..2d033a564 100644 --- a/modules/point/conf/info.xml +++ b/modules/point/conf/info.xml @@ -19,7 +19,7 @@
      書き込み作成・削除/コメント作成・削除の活動に対するポイントを計算するシステムです。 - ポイントごとレベルを指定してユーザ名の前にアイコンを表示させることができます。 + ポイントごとレベルを指定してユーザ名の前にアイコンを表示させることが出来ます。 但し、ポイントシステムアドオンを「使用」に設定しないと作動しません。 diff --git a/modules/point/lang/jp.lang.php b/modules/point/lang/jp.lang.php index 0b91b81d5..a436e3d91 100644 --- a/modules/point/lang/jp.lang.php +++ b/modules/point/lang/jp.lang.php @@ -12,13 +12,13 @@ $lang->about_act_config = "掲示板、ブログなどのモジュールごとに「書き込み作成・削除/コメント作成・削除」などのアクションがあります。掲示板/ブログ以外のモジュールにポイントシステムを連動させたい場合は、各機能のアクションの「act値」を追加します。連動は半角「,(コンマ)」で区切って追加します。"; $lang->max_level = '最高レベル'; - $lang->about_max_level = '最高レベルを指定することができます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; + $lang->about_max_level = '最高レベルを指定することが出来ます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; $lang->level_icon = 'レベルアイコン'; $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合があります。ご注意下さい。'; $lang->point_name = 'ポイント名'; - $lang->about_point_name = 'ポイントの名前、単位が指定できます。'; + $lang->about_point_name = 'ポイントの名前、単位が指定出来ます。'; $lang->level_point = 'レベルポイント'; $lang->about_level_point = '下の各レベルのポイントが増加したり、減少するとレベルが調整されます。'; @@ -37,7 +37,7 @@ $lang->point_link_group = 'グループ連動'; $lang->about_point_link_group = 'グループにレベルを指定すると、該当レベルになったらグループが変更されます。 ただし、新しいグループに変更されると以前自動登録されたグループは消去されます。'; - $lang->about_module_point = 'モジュール別にポイントを指定することができますが、指定されていないモジュールでは、デフォルトポイントが使用されます。すべてのポイント数は、反対のアクションを行った際には原状復帰されます。'; + $lang->about_module_point = 'モジュール別にポイントを指定することが出来ますが、指定されていないモジュールでは、デフォルトポイントが使用されます。すべてのポイント数は、反対のアクションを行った際には原状復帰されます。'; $lang->point_signup = '加入'; $lang->point_insert_document = '書き込み作成'; @@ -56,7 +56,7 @@ $lang->cmd_point_act_config = '機能別アクション設定'; $lang->cmd_point_member_list = '会員ポイントリスト'; - $lang->msg_cannot_download = 'ポイントが不足しているため、ダウンロードできません。'; + $lang->msg_cannot_download = 'ポイントが不足しているため、ダウンロード出来ません。'; $lang->point_recal_message = 'ただ今ポイントを適用しています。 (%d / %d)'; $lang->point_recal_finished = 'ポイント再計算が完了しました。'; diff --git a/modules/rss/lang/jp.lang.php b/modules/rss/lang/jp.lang.php index 44ba181d2..48999f3d7 100644 --- a/modules/rss/lang/jp.lang.php +++ b/modules/rss/lang/jp.lang.php @@ -23,8 +23,8 @@ // 説明文 $lang->about_rss_disable = "チェックするとRSSの出力を行いません。"; - $lang->about_rss_type = "出力するRSSタイプを指定することができます。"; - $lang->about_open_rss = '現在のモジュールに対して「RSS配信」を選択することができます。書き込みの内容が読める権限とは関係なくオプションによってRSSが配信されます。'; + $lang->about_rss_type = "出力するRSSタイプを指定することが出来ます。"; + $lang->about_open_rss = '現在のモジュールに対して「RSS配信」を選択することが出来ます。書き込みの内容が読める権限とは関係なくオプションによってRSSが配信されます。'; $lang->about_feed_description = '発行するRSSに関する説明を入力します。未入力した場合は該当モジュールで設定された管理用説明が含まれます。'; $lang->about_feed_copyright = '発行するRSSのコンテンツに対する著作権情報です。'; $lang->about_part_feed_copyright = '未入力の場合、全体RSS著作権の設定と同様に適用されます。'; diff --git a/modules/spamfilter/lang/jp.lang.php b/modules/spamfilter/lang/jp.lang.php index 4581d371f..270ecd867 100644 --- a/modules/spamfilter/lang/jp.lang.php +++ b/modules/spamfilter/lang/jp.lang.php @@ -22,8 +22,8 @@ // 説明文 $lang->about_interval = "指定された時間内の書き込みが行えないようにします。"; $lang->about_limit_count = "指定された時間内に制限数を超える書き込みが行われるとスパムとして認識し、該当するIPを禁止します。"; - $lang->about_denied_ip = "「127.0.0.* 」のように「*」で、「127.0.0」以下ののIP帯域をすべて禁止することができます。"; - $lang->about_denied_word = "禁止ワードとして登録されると該当するワードが存在する書き込みを禁することができます。"; + $lang->about_denied_ip = "「127.0.0.* 」のように「*」で、「127.0.0」以下ののIP帯域をすべて禁止することが出来ます。"; + $lang->about_denied_word = "禁止ワードとして登録されると該当するワードが存在する書き込みを禁することが出来ます。"; $lang->about_check_trackback = "一つのIPからのみトラックバックを受信するようにします。"; // メッセージ出力用 diff --git a/modules/springnote/lang/jp.lang.php b/modules/springnote/lang/jp.lang.php index 2b1c08639..c2dc74691 100644 --- a/modules/springnote/lang/jp.lang.php +++ b/modules/springnote/lang/jp.lang.php @@ -21,10 +21,10 @@ $lang->cmd_springnote_list = 'スプリングノートリスト'; $lang->cmd_view_info = 'スプリングノート情報'; - $lang->about_springnote = "スプリングノートは、「openmaru.com」から提供されるウィキサービスです。
      スプリングノート連動モジュールは、スプリングノートの特定のページを自分のコンテンツの閲覧することができるようにするモジュールです。"; + $lang->about_springnote = "スプリングノートは、「openmaru.com」から提供されるウィキサービスです。
      スプリングノート連動モジュールは、スプリングノートの特定のページを自分のコンテンツの閲覧することが出来るようにするモジュールです。"; $lang->about_springnote_openid = "スプリングノートでページを作成したオープンIDを入力して下さい。"; $lang->about_springnote_userkey = 'スプリングノートと連動させるためのユーザKeyを入力して下さい。
      [ユーザーキー受信]をクリックして入力して生成されたキーの値を入力して下さい。'; $lang->about_springnote_pageid = '使用するスプリングノートの特定ページを出力させたい場合、「pageid」の値を入力して下さい。'; - $lang->about_springnote_pageid_setup = 'ページ番号を指定する際に、該当ページのみ表示(リストを含まない)、該当ページから表示(リストを含む)などを指定することができます。'; - $lang->about_springnote_domain = '自分のスプリングノートではない他のドメインのスプリングノートを入力することができます( 「http://domain.springnote.com」でドメインの値を入力して下さい )。'; + $lang->about_springnote_pageid_setup = 'ページ番号を指定する際に、該当ページのみ表示(リストを含まない)、該当ページから表示(リストを含む)などを指定することが出来ます。'; + $lang->about_springnote_domain = '自分のスプリングノートではない他のドメインのスプリングノートを入力することが出来ます( 「http://domain.springnote.com」でドメインの値を入力して下さい )。'; ?> diff --git a/modules/widget/lang/jp.lang.php b/modules/widget/lang/jp.lang.php index cca6a48b8..0749632d8 100644 --- a/modules/widget/lang/jp.lang.php +++ b/modules/widget/lang/jp.lang.php @@ -30,19 +30,19 @@ $lang->about_widget_width = '縦幅サイズを選択して下さい。'; $lang->about_widget_position = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; $lang->about_widget_margin = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; - $lang->about_widget_cache = '指定された時間内にキャッシュされたデータが利用できます。'; + $lang->about_widget_cache = '指定された時間内にキャッシュされたデータが利用出来ます。'; $lang->generated_code = '生成コード'; $lang->widgetstyle= 'ウィジェットスタイル'; $lang->msg_widget_is_not_exists = '%s ウィジェットが見つかりません。'; - $lang->msg_widget_object_is_null = '%s ウィジェットのオブジェクトが生成できません。'; - $lang->msg_widget_proc_is_null = '%s ウィセットの proc() が実行できません。'; + $lang->msg_widget_object_is_null = '%s ウィジェットのオブジェクトが生成出来ません。'; + $lang->msg_widget_proc_is_null = '%s ウィセットの proc() が実行出来ません。'; $lang->msg_widget_skin_is_null = 'ウィセットスキンを選択してから正常に動作します。'; - $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
      一番下にテンプレートファイルに適用できるコードが出力されます。'; + $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
      一番下にテンプレートファイルに適用出来るコードが出力されます。'; $lang->about_widget_code_in_page = '下に必要な値を入力した後、追加ボタンをクリックするとページ内にウィジェットが挿入されます。'; - $lang->about_widget = "ウィジェットまたはページモジュールに用いられる小単位の構成要素です。内部モジュールまたは外部の OPEN API と連動でき、設定によって様々な応用が利きます。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加できます。"; + $lang->about_widget = "ウィジェットまたはページモジュールに用いられる小単位の構成要素です。内部モジュールまたは外部の OPEN API と連動でき、設定によって様々な応用が利きます。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加出来ます。"; $lang->cmd_content_insert = "内容直接追加"; $lang->cmd_box_widget_insert = "ボックスウィジェット追加"; diff --git a/widgets/DroArc_clock/skins/default/skin.xml b/widgets/DroArc_clock/skins/default/skin.xml index e8940ac20..4e37f6362 100644 --- a/widgets/DroArc_clock/skins/default/skin.xml +++ b/widgets/DroArc_clock/skins/default/skin.xml @@ -7,7 +7,7 @@ Flash電子時鐘 플래시 디지털 시계를 출력합니다. 자체적인 오른쪽 마우스 메뉴를 사용가능합니다. 显示Flash数字时钟。 - フラッシュのデジタル時計を出力します。右クリックマウスのメニューが使用できます。 + フラッシュのデジタル時計を出力します。右クリックマウスのメニューが使用出来ます。 It displays flash digital clock. 顯示Flash電子時鐘。 0.1 diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index a413a12fe..c90a146e5 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -593,7 +593,7 @@ RSS URL은 타입이 RSS일 경우 등록되어야 합니다. (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) RSS URL은 타입이 RSS일 경우 등록되어야 합니다. - RSS URLはタイプが RSSであるのみ登録できます。 + RSS URLはタイプが RSSであるのみ登録出来ます。 (サポートする文書形式 : RSS 2.0, RSS 1.0, ATOM 1.0) diff --git a/widgets/language_select/conf/info.xml b/widgets/language_select/conf/info.xml index 9aa66cc32..db17de141 100644 --- a/widgets/language_select/conf/info.xml +++ b/widgets/language_select/conf/info.xml @@ -8,7 +8,7 @@ Выбор языка 選擇語言 사용자의 접속언어를 변경할 수 있는 select폼을 출력합니다. - 言語を変更することができるセレクト(select)フォームを表示します。 + 言語を変更することが出来るセレクト(select)フォームを表示します。 可以实现多国语言相互切换。 This widget displays a select form for change of users' language. Este widget muestra la forma de cambiar el idioma del usuario. diff --git a/widgets/rss_reader/skins/xe_select/skin.xml b/widgets/rss_reader/skins/xe_select/skin.xml index 1a2bb96b9..dadd4ae12 100644 --- a/widgets/rss_reader/skins/xe_select/skin.xml +++ b/widgets/rss_reader/skins/xe_select/skin.xml @@ -6,7 +6,7 @@ XE Newest Article Skin (Select menu) XE最新主題面板(下拉式選單) XE 공식 레이아웃에 적합한 최신글 스킨입니다. - XE オフィシャルレイアウトに最も適した最新書き込みスキンです。 + XE公式レイアウトに最も適した最新書き込みスキンです。 XE最新主题样式皮肤。 This is a newest article skin that is suitable for XE official layout. XE最新主題面板。 From 864cc7af298976231402d6780504214908245920 Mon Sep 17 00:00:00 2001 From: heemin Date: Wed, 25 Mar 2009 16:35:34 +0000 Subject: [PATCH 112/202] =?UTF-8?q?=EC=9D=BC=EB=B3=B8=EC=96=B4=20=EB=B2=88?= =?UTF-8?q?=EC=97=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5977 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/skin.xml | 2 +- widgetstyles/line/skin.xml | 4 ++-- widgetstyles/memo/skin.xml | 4 ++-- widgetstyles/postitWire/skin.xml | 2 +- widgetstyles/roundFace/skin.xml | 4 ++-- widgetstyles/roundWire/skin.xml | 2 +- widgetstyles/simple/skin.xml | 2 +- widgetstyles/simpleRound/skin.xml | 2 +- widgetstyles/simpleSquare/skin.xml | 4 ++-- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/widgetstyles/colorbox/skin.xml b/widgetstyles/colorbox/skin.xml index cd1e43a82..e68832bfd 100644 --- a/widgetstyles/colorbox/skin.xml +++ b/widgetstyles/colorbox/skin.xml @@ -5,7 +5,7 @@ スクウェア페이스 각진 면으로 꾸며진 위젯스타일 입니다. 可變換多種色彩外框的控件樣式。 - 각진 면으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif diff --git a/widgetstyles/line/skin.xml b/widgetstyles/line/skin.xml index 8c11d9048..42aa08af8 100644 --- a/widgetstyles/line/skin.xml +++ b/widgetstyles/line/skin.xml @@ -5,7 +5,7 @@ シンプルライト 선 하나만으로 꾸며진 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 - 선 하나만으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -27,7 +27,7 @@ widgetBoxA 심플 라이트 分隔線 - 심플 라이트 + シンプルライト diff --git a/widgetstyles/memo/skin.xml b/widgetstyles/memo/skin.xml index 20902cf11..e5eca0df7 100644 --- a/widgetstyles/memo/skin.xml +++ b/widgetstyles/memo/skin.xml @@ -2,10 +2,10 @@ 포스트잇 페이스 留言樣式 - ポストイット페이스 + ポストイットフェイス 메모지 처럼 꾸며진 위젯스타일 입니다. 可變換多種留言外框的控件樣式。 - 메모지 처럼 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif diff --git a/widgetstyles/postitWire/skin.xml b/widgetstyles/postitWire/skin.xml index 253926137..48eb2a71c 100644 --- a/widgetstyles/postitWire/skin.xml +++ b/widgetstyles/postitWire/skin.xml @@ -5,7 +5,7 @@ ポストイットワイヤー 메모지 처럼 꾸며진 위젯스타일 입니다. 可變換多種留言外框的控件樣式。 - 메모지 처럼 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif diff --git a/widgetstyles/roundFace/skin.xml b/widgetstyles/roundFace/skin.xml index 4aa921049..dd95a5ea2 100644 --- a/widgetstyles/roundFace/skin.xml +++ b/widgetstyles/roundFace/skin.xml @@ -2,10 +2,10 @@ 라운드 페이스 圓角外框樣式 - ラウンド페이스 + ラウンドフェイス 둥근 면으로 꾸며진 위젯스타일 입니다. 可變換多種圓角外框的控件樣式。 - 둥근 면으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif diff --git a/widgetstyles/roundWire/skin.xml b/widgetstyles/roundWire/skin.xml index 2f6a36ce7..aa9cf7816 100644 --- a/widgetstyles/roundWire/skin.xml +++ b/widgetstyles/roundWire/skin.xml @@ -5,7 +5,7 @@ ラウンドワイヤー 둥근 선으로 꾸며진 위젯스타일 입니다. 可變換多種圓角外框的控件樣式。 - 둥근 선으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif diff --git a/widgetstyles/simple/skin.xml b/widgetstyles/simple/skin.xml index 814f70b22..ac6b08bac 100644 --- a/widgetstyles/simple/skin.xml +++ b/widgetstyles/simple/skin.xml @@ -7,7 +7,7 @@ 선 하나만으로 꾸며진 위젯스타일 입니다. 只有栏目名和查看更多(more)选项的简易控件样式。 只有標題與more按紐的簡單控件樣式。 - 선 하나만으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-02-03 preview.gif diff --git a/widgetstyles/simpleRound/skin.xml b/widgetstyles/simpleRound/skin.xml index ab28e5a6c..022845eb6 100644 --- a/widgetstyles/simpleRound/skin.xml +++ b/widgetstyles/simpleRound/skin.xml @@ -5,7 +5,7 @@ シンプルラウンド 둥근 선으로 꾸며진 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 - 둥근 선으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif diff --git a/widgetstyles/simpleSquare/skin.xml b/widgetstyles/simpleSquare/skin.xml index cd0ff8cf7..c01f2779f 100644 --- a/widgetstyles/simpleSquare/skin.xml +++ b/widgetstyles/simpleSquare/skin.xml @@ -5,7 +5,7 @@ シンプルスクウェア 각진 선으로 꾸며진 위젯스타일 입니다. 可變換多種線條外框的控件樣式。 - 각진 선으로 꾸며진ウィジェットのスタイルです。 + ウィジェットのスタイルです。 0.1 2009-03-10 preview.gif @@ -26,7 +26,7 @@ widgetBoxB 심플 스퀘어 - 심플 스퀘어 + シンプルスクウェア From 34549fc81cf1e1c233d6b11cfd25bb123c528f01 Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 26 Mar 2009 02:45:23 +0000 Subject: [PATCH 113/202] =?UTF-8?q?=EC=96=B8=EC=96=B4=EB=B2=88=EC=97=AD=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=95=EC=97=90=EC=84=9C=20info.xml=EC=9D=98=20?= =?UTF-8?q?=EC=9E=98=EB=AA=BB=EB=90=9C=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5978 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/conf/info.xml | 2 +- widgets/planet_document/conf/info.xml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index c90a146e5..26f3a4ac1 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -215,7 +215,7 @@ 출력하지 않음 不显示 不顯示 - 表示しない/name> + 表示しない diff --git a/widgets/planet_document/conf/info.xml b/widgets/planet_document/conf/info.xml index 073fe8065..c866ab5f0 100644 --- a/widgets/planet_document/conf/info.xml +++ b/widgets/planet_document/conf/info.xml @@ -1,10 +1,12 @@  플래닛 최근 글 출력 + 플래닛 최근 글 출력 微博主题列表 微型部落格主題輸出 プラネット最新書き込み表示 플래닛의 글들만 출력하는 위젯입니다 . + 플래닛의 글들만 출력하는 위젯입니다 . 列出微博主题列表。 微型部落格主題輸出控件。 プラネットに登録された書く込みだけ表示するウィジェットです。 @@ -13,6 +15,7 @@ zero + zero zero zero zero From 53185df361f76772bda88c77d6e12ab0c17d7138 Mon Sep 17 00:00:00 2001 From: heemin Date: Thu, 26 Mar 2009 03:37:08 +0000 Subject: [PATCH 114/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5979 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/archive_list/skins/default/skin.xml | 2 +- widgets/calendar/skins/default/skin.xml | 2 +- widgets/content/skins/default/skin.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/widgets/archive_list/skins/default/skin.xml b/widgets/archive_list/skins/default/skin.xml index 4a039829d..c4a3f11cb 100644 --- a/widgets/archive_list/skins/default/skin.xml +++ b/widgets/archive_list/skins/default/skin.xml @@ -1,7 +1,7 @@ 기본 월별 보관 현황 목록 출력 - Default 月別のアーカイブリスト表示 + デフォルト月別のアーカイブリスト表示 存档列表默认皮肤 Default Monthly Custody Status 封存預設面板 diff --git a/widgets/calendar/skins/default/skin.xml b/widgets/calendar/skins/default/skin.xml index cb7725963..c9e522fce 100644 --- a/widgets/calendar/skins/default/skin.xml +++ b/widgets/calendar/skins/default/skin.xml @@ -1,7 +1,7 @@ 기본 달력 및 글 현황 표시 - Default カレンダーと書き込みリンク表示 + デフォルトカレンダーと書き込みリンク表示 模块联动日历默认皮肤 Default Display Calendar and Article Status Default 日曆預設面板 diff --git a/widgets/content/skins/default/skin.xml b/widgets/content/skins/default/skin.xml index e58e7f127..c4fa89f11 100644 --- a/widgets/content/skins/default/skin.xml +++ b/widgets/content/skins/default/skin.xml @@ -3,7 +3,7 @@ Content 위젯 기본 스킨 全局内容控件默认皮肤 内容組件預設面板 - コンテンツウィジェットのデフォルトスキン + コンテンツウィジェットのデフォルトスキン Content 위젯 기본 스킨 입니다. Html/Publish: 정찬명 Design : mada @@ -19,7 +19,7 @@ Design : mada Programming : SOL - コンテンツウィジェットのデフォルトスキン + コンテンツウィジェットのデフォルトスキン Html/Publish: Chan-Myung Jeong Design : mada Programming : SOL From 439bebc17f778aa8712445fba02911988864125e Mon Sep 17 00:00:00 2001 From: heemin Date: Thu, 26 Mar 2009 03:41:36 +0000 Subject: [PATCH 115/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5980 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/conf/info.xml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index 26f3a4ac1..35b2c261e 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -4,7 +4,7 @@ Content widget 全局内容控件 內容組件 - Content 위젯 + コンテンツウィジェット 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. 게시판, 코멘트, 첨부파일 등 Content를 출력하는 위젯입니다. 以各种样式显示主题,评论,附件等站内内容的全局控件。 @@ -274,14 +274,14 @@ 분류 표시 显示分类 分類 - 분류 표시 + カテゴリ表示 Y 출력 출력 显示 顯示 - 출력 + 表示 N @@ -298,14 +298,14 @@ 아이콘 표시 显示图标 圖示 - 아이콘 표시 + アイコン表示 Y 출력 출력 显示 顯示 - 출력 + 表示 N @@ -561,7 +561,7 @@ text 내용 글자수 - 내용 글자수 + 内容の文字数 内容摘要字数 內容字數 @@ -593,7 +593,7 @@ RSS URL은 타입이 RSS일 경우 등록되어야 합니다. (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) RSS URL은 타입이 RSS일 경우 등록되어야 합니다. - RSS URLはタイプが RSSであるのみ登録出来ます。 + RSS URLはタイプが RSSの時だけ登録出来ます。 (サポートする文書形式 : RSS 2.0, RSS 1.0, ATOM 1.0) @@ -632,9 +632,5 @@ RSS URL RSS URL - - - - From fbedbbcad1a3fb762784da460fee7613f60eb975 Mon Sep 17 00:00:00 2001 From: heemin Date: Thu, 26 Mar 2009 03:59:02 +0000 Subject: [PATCH 116/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5981 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/lang/jp.lang.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/widget/lang/jp.lang.php b/modules/widget/lang/jp.lang.php index 0749632d8..7b74c4921 100644 --- a/modules/widget/lang/jp.lang.php +++ b/modules/widget/lang/jp.lang.php @@ -42,7 +42,7 @@ $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
      一番下にテンプレートファイルに適用出来るコードが出力されます。'; $lang->about_widget_code_in_page = '下に必要な値を入力した後、追加ボタンをクリックするとページ内にウィジェットが挿入されます。'; - $lang->about_widget = "ウィジェットまたはページモジュールに用いられる小単位の構成要素です。内部モジュールまたは外部の OPEN API と連動でき、設定によって様々な応用が利きます。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加出来ます。"; + $lang->about_widget = "ウィジェットまたはページモジュールに用いられる単体の構成要素です。内部モジュールまたは外部のOPEN API と連動が出来、設定によって様々な応用が可能です。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加出来ます。"; $lang->cmd_content_insert = "内容直接追加"; $lang->cmd_box_widget_insert = "ボックスウィジェット追加"; From 0260b0c4a1e7a374b952c7a6ffbd8a6ad6f44a22 Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 26 Mar 2009 08:21:16 +0000 Subject: [PATCH 117/202] =?UTF-8?q?=EA=B8=80=EC=9D=B4=20=EC=97=86=EC=9D=84?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=20=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B6=80=EB=B6=84=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=83=9D=EA=B8=B0=EB=8A=94=20php=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5982 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 9da02fdf1..2bd129bf2 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -145,8 +145,10 @@ $this->setToAllDocumentExtraVars(); $output = null; - foreach($result as $document_srl => $val) { - $output[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + if(count($result)) { + foreach($result as $document_srl => $val) { + $output[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } } return $output; @@ -390,8 +392,10 @@ } $this->setToAllDocumentExtraVars(); - foreach($output->data as $number => $document) { - $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; + if(count($output->data)) { + foreach($output->data as $number => $document) { + $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; + } } return $output; From c29d8f9d56517b783b24e6bca92718e7036332be Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 26 Mar 2009 08:21:58 +0000 Subject: [PATCH 118/202] =?UTF-8?q?xe=5Fdefault=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=ED=8C=90=EC=9D=98=20=ED=97=A4=EB=8D=94=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EA=B0=84=EA=B2=A9=20=EB=84=93=ED=9E=88=EB=8A=94=20css=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5983 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/skins/xe_default/css/board.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/board/skins/xe_default/css/board.css b/modules/board/skins/xe_default/css/board.css index 5da6de8bc..ed356852e 100644 --- a/modules/board/skins/xe_default/css/board.css +++ b/modules/board/skins/xe_default/css/board.css @@ -15,7 +15,7 @@ .board a:focus{ text-decoration:underline;} /* Board Header */ -.boardHeader *{ margin:0; padding:0;} +.boardHeader *{ margin:0 0 20px 0; padding:0;} .boardHeader .boardTitle{ font-size:1em; letter-spacing:-.1em; margin-bottom:10px; border-bottom:3px solid; *zoom:1; background-repeat:no-repeat; background-position:left center;} .boardHeader .boardTitle:after{ content:""; display:block; clear:both;} .boardHeader .boardTitleText{ float:left; clear:both; margin-bottom:-3px; padding:5px 15px 5px 22px; border-bottom:3px solid; background-repeat:no-repeat; background-position:right bottom;} From 127ef5104620afb607b557460c9a0c32df419929 Mon Sep 17 00:00:00 2001 From: ngleader Date: Thu, 26 Mar 2009 09:08:58 +0000 Subject: [PATCH 119/202] widgetStyle for widgetBox git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5984 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/widget/WidgetHandler.class.php | 37 ++++++++-- .../board/skins/xe_board/view_document.html | 1 + modules/page/tpl/page_content_modify.html | 1 + modules/widget/tpl/js/widget.js | 70 ++++++++++++++++--- modules/widget/widget.controller.php | 17 +++-- widgetstyles/colorbox/css/widgetBoxStyle.css | 3 +- widgetstyles/line/css/widgetBoxStyle.css | 3 +- widgetstyles/memo/css/widgetBoxStyle.css | 4 +- .../postitWire/css/widgetBoxStyle.css | 3 +- widgetstyles/roundFace/css/widgetBoxStyle.css | 11 +-- widgetstyles/roundWire/css/widgetBoxStyle.css | 11 +-- .../simpleRound/css/widgetBoxStyle.css | 7 +- .../simpleSquare/css/widgetBoxStyle.css | 3 +- .../simpleTitle/css/widgetBoxStyle.css | 3 +- .../squareWire/css/widgetBoxStyle.css | 3 +- 15 files changed, 134 insertions(+), 43 deletions(-) diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php index 9ab1d3c50..0cc1cffc9 100644 --- a/classes/widget/WidgetHandler.class.php +++ b/classes/widget/WidgetHandler.class.php @@ -93,7 +93,7 @@ $object_vars = get_object_vars($args); if(count($object_vars)) { foreach($object_vars as $key => $val) { - if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue; + if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue; $args->{$key} = utf8RawUrlDecode($val); } } @@ -102,12 +102,16 @@ /** * 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함 **/ + $widget_content = ''; if($widget != 'widgetContent' && $widget != 'widgetBox') { if(!is_dir(sprintf('./widgets/%s/',$widget))) return; // 위젯의 내용을 담을 변수 $widget_content = WidgetHandler::getCache($widget, $args); } + if($widget == 'widgetBox'){ + $widgetbox_content = $args->widgetbox_content; + } /** * 관리자가 지정한 위젯의 style을 구함 @@ -155,6 +159,8 @@ // 위젯 박스일 경우 case 'widgetBox' : $widget_content_header = sprintf('
      ', $args->id, $style, $inner_style); + $widget_content_body = $widgetbox_content; + break; // 일반 위젯일 경우 @@ -212,12 +218,23 @@ // 위젯 박스일 경우 case 'widgetBox' : + // args 정리 + $attribute = array(); + if($args) { + foreach($args as $key => $val) { + if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue; + if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val); + $attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val)); + } + } + $widget_content_header = sprintf( - '
      '. + '
      '. '
      '. '
      '. - '
      ',$args->widgetstyle,$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,$inner_style); + '
      ',$args->widgetstyle,$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,implode(' ',$attribute),$inner_style); + $widget_content_body = $widgetbox_content; break; @@ -228,6 +245,7 @@ if($args) { foreach($args as $key => $val) { if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget'))) continue; + if(strlen($val)==0) continue; if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val); $attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val)); } @@ -251,11 +269,11 @@ // 위젯 스타일을 컴파일 한다. if($args->widgetstyle){ - $widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle, $widget_content_body, $args); + $widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle, $widget_content_body, $args, $include_info); } $output = $widget_content_header . $widget_content_body . $widget_content_footer; - +//if($widget=='widgetBox')debugPrint($output); // 위젯 결과물 생성 시간을 debug 정보에 추가 if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start; // 결과 return @@ -293,7 +311,7 @@ } - function complieWidgetStyle($widgetStyle,$widget_content_body, $args){ + function complieWidgetStyle($widgetStyle,$widget_content_body, $args, $include_info){ if(!$widgetStyle) return $widget_content_body; $oWidgetModel = &getModel('widget'); @@ -309,7 +327,12 @@ } } Context::set('widgetstyle_extar_var', $widgetstyle_extar_var); - Context::set('widget_content', $widget_content_body); + + if($include_info){ + Context::set('widget_content', '
      '.$widget_content_body.'
      '); + }else{ + Context::set('widget_content', $widget_content_body); + } // 컴파일 $widgetstyle_path = $oWidgetModel->getWidgetStylePath($widgetStyle); diff --git a/modules/board/skins/xe_board/view_document.html b/modules/board/skins/xe_board/view_document.html index 8795d9c77..5b2b81885 100644 --- a/modules/board/skins/xe_board/view_document.html +++ b/modules/board/skins/xe_board/view_document.html @@ -63,6 +63,7 @@
      + diff --git a/modules/page/tpl/page_content_modify.html b/modules/page/tpl/page_content_modify.html index aafd34b5a..bab9fe4f5 100644 --- a/modules/page/tpl/page_content_modify.html +++ b/modules/page/tpl/page_content_modify.html @@ -48,6 +48,7 @@
      +
      diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 0d0e23fca..815d2e772 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -95,6 +95,7 @@ function getWidgetContent(obj) { break; } }); + return html; } @@ -148,6 +149,31 @@ function getContentWidgetCode(childObj, widget) { // 위젯 박스 코드 구함 function getWidgetBoxCode(childObj, widget) { + + var attrs = ""; + for(var i=0;i0){ + o = jQuery('.widget_inner',childObj); + }else{ + o = jQuery('.nullWidget',childObj); + } + + var body = getWidgetContent(o.get(0)); + return '
      '+body+'
      '; + +/* var cobj = childObj.firstChild; while(cobj) { if(cobj.className == "widgetBorder" || cobj.className == "widgetBoxBorder") { @@ -155,15 +181,19 @@ function getWidgetBoxCode(childObj, widget) { while(c2obj) { if(c2obj.className == "nullWidget") { var body = getWidgetContent(c2obj); - return '
      '+body+'
      '; + return '
      '+body+'
      '; } c2obj = c2obj.nextSibling; } } cobj = cobj.nextSibling; } +*/ } + + + // 일반 위젯 컨텐츠 코드 구함 function getWidgetCode(childObj, widget) { var attrs = ""; @@ -174,7 +204,7 @@ function getWidgetCode(childObj, widget) { var name = childObj.attributes[i].nodeName.toLowerCase(); if(name == "contenteditable" || name == "id" || name=="style" || name=="src" || name=="widget" || name == "body" || name == "class" || name == "widget_width" || name == "widget_width_type" || name == "xdpx" || name == "xdpy" || name == "height") continue; var value = childObj.attributes[i].nodeValue; - if(!value || value == "Array") continue; + if(!value || value == "Array" || value == "null") continue; attrs += name+'="'+escape(value)+'" '; } @@ -398,7 +428,7 @@ function doAddWidgetCode(widget_code) { tmp = widget_code.toLowerCase(); } - checkDocumentWrite = false; + // html 추가 var dummy = xCreateElement('div'); @@ -406,12 +436,21 @@ function doAddWidgetCode(widget_code) { var obj = dummy.childNodes[0]; if(selectedWidget && selectedWidget.getAttribute("widget")) { + var o = jQuery('div.widget_inner',selectedWidget); + var n = jQuery('div.widget_inner',obj); + + if(n.size()==0) n = jQuery('div.nullWidget',obj); + if(o.size()==0) o = jQuery('div.nullWidget',selectedWidget); + + n.html(o.html()); + + selectedWidget.parentNode.insertBefore(obj, selectedWidget); selectedWidget.parentNode.removeChild(selectedWidget); } else { xGetElementById('zonePageContent').appendChild(obj); } - + checkDocumentWrite = false; selectedWidget = null; /* @@ -1086,12 +1125,16 @@ function widgetDrag(tobj, dx, dy) { widgetList = null; // 만약 다른 위젯과 자리를 바꾸지 못하였는데 자기 부모창밖에 있는게 확인이 되면 박스 밖으로 내보낸다. - var l = xPageX(tobj.parentNode); - var t = xPageY(tobj.parentNode); - var ll = parseInt(l,10) + parseInt(xWidth(tobj.parentNode),10); - var tt = parseInt(t,10) + parseInt(xHeight(tobj.parentNode),10); + var p_tobj = jQuery(tobj).parents('div.nullWidget').get(0); + var l = xPageX(p_tobj); + var t = xPageY(p_tobj); + var ll = parseInt(l,10) + parseInt(xWidth(p_tobj),10); + var tt = parseInt(t,10) + parseInt(xHeight(p_tobj),10); if( (tobj.xDPX < l || tobj.xDPX > ll) || (tobj.xDPY < t || tobj.xDPY > tt) ) { - zonePageObj.insertBefore(tobj, tobj.parentNode.parentNode.parentNode); + +// zonePageObj.insertBefore(tobj, tobj.parentNode.parentNode.parentNode); + zonePageObj.insertBefore(tobj, jQuery(tobj).parents('div.widgetOutput[widget=widgetBox]').get(0)); + doFitBorderSize(); return; } @@ -1100,6 +1143,7 @@ function widgetDrag(tobj, dx, dy) { } else { // 이동하려는 위젯이 박스 위젯이 아니라면 박스 위젯들을 구해서 입력 유무를 검사한다 if(tobj.getAttribute("widget")!="widgetBox") { + var boxList = xGetElementsByClassName("nullWidget", zonePageObj); for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt) { if(target_obj.className == "nullWidget") { - target_obj.appendChild(tobj); + var wb_ws = jQuery('div.widget_inner',jQuery(target_obj)); + + if(wb_ws.size() == 0){ + target_obj.appendChild(tobj); + }else if(wb_ws.size() > 0){ + wb_ws.get(0).appendChild(tobj); + } // 이동을 멈춤 widgetManualEnd(); diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index 0bd4c6328..f6ac1076f 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -153,11 +153,17 @@ // 편집 정보 포함 여부 체크 $this->include_info = $include_info; - // 내용중 위젯을 또다시 구함 (기존 버전에서 페이지 수정해 놓은것과의 호환을 위해서) - $content = preg_replace_callback('!]*)widget=([^\>]*?)\>!is', array($this,'transWidget'), $content); // 박스 위젯을 다시 구함 - $content = preg_replace_callback('!]*)widget=([^\>]*?)\>
      !is', array($this,'transWidgetBox'), $content); +// $content = preg_replace_callback('!]*)widget=([^\>]*?)\>
      !is', array($this,'transWidgetBox'), $content); + + // 박스 위젯을 다시 구함 + + $content = preg_replace_callback('!]*)widget=([^\>]*?)\>
      (()*)!is', array($this,'transWidgetBox'), $content); + + + // 내용중 위젯을 또다시 구함 (기존 버전에서 페이지 수정해 놓은것과의 호환을 위해서) + $content = preg_replace_callback('!]*)widget=([^\>]*?)\>!is', array($this,'transWidget'), $content); return $content; } @@ -179,7 +185,6 @@ // 위젯의 이름을 구함 $widget = $vars->widget; unset($vars->widget); - return WidgetHandler::execute($widget, $vars, $this->include_info); } @@ -187,8 +192,7 @@ * @brief 위젯 박스를 실제 php코드로 변경 **/ function transWidgetBox($matches) { - $buff = preg_replace('/
      $/i','
      ',$matches[0]); - + $buff = preg_replace('/
      (.*)$/i','
      ',$matches[0]); $oXmlParser = new XmlParser(); $xml_doc = $oXmlParser->parse($buff); @@ -198,6 +202,7 @@ // 위젯의 이름을 구함 if(!$widget) return $matches[0]; + $vars->widgetbox_content = $matches[3]; return WidgetHandler::execute($widget, $vars, $this->include_info); } diff --git a/widgetstyles/colorbox/css/widgetBoxStyle.css b/widgetstyles/colorbox/css/widgetBoxStyle.css index 698e4f628..59d2f051b 100644 --- a/widgetstyles/colorbox/css/widgetBoxStyle.css +++ b/widgetstyles/colorbox/css/widgetBoxStyle.css @@ -3,7 +3,8 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/line/css/widgetBoxStyle.css b/widgetstyles/line/css/widgetBoxStyle.css index 8b93ac9d3..b1b5d6a4e 100644 --- a/widgetstyles/line/css/widgetBoxStyle.css +++ b/widgetstyles/line/css/widgetBoxStyle.css @@ -3,7 +3,8 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/memo/css/widgetBoxStyle.css b/widgetstyles/memo/css/widgetBoxStyle.css index f1fe80c15..7b1a6a540 100644 --- a/widgetstyles/memo/css/widgetBoxStyle.css +++ b/widgetstyles/memo/css/widgetBoxStyle.css @@ -3,7 +3,9 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} + +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/postitWire/css/widgetBoxStyle.css b/widgetstyles/postitWire/css/widgetBoxStyle.css index 79dc82c50..e09b16b07 100644 --- a/widgetstyles/postitWire/css/widgetBoxStyle.css +++ b/widgetstyles/postitWire/css/widgetBoxStyle.css @@ -3,7 +3,8 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/roundFace/css/widgetBoxStyle.css b/widgetstyles/roundFace/css/widgetBoxStyle.css index 4aeea1f08..c32be07f8 100644 --- a/widgetstyles/roundFace/css/widgetBoxStyle.css +++ b/widgetstyles/roundFace/css/widgetBoxStyle.css @@ -3,12 +3,13 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1; float:left; clear:both; } .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} .widgetBox .rcTop .tl{ top:0;} .widgetBox .rcTop .tr{ top:0;} @@ -23,7 +24,7 @@ .widgetBoxEred .widgetMore{ top:10px; right:15px; width:35px; background:url(../img/moreBgEred.gif) no-repeat; color:#ff3333;} .widgetBoxEred .rcTop, .widgetBoxEred .rcBottom{ height:3px;} -.widgetBoxEred .rcTop{ position:absolute; top:-3px;} +.widgetBoxEred .rcTop{ position:absolute; top:-3px; left:0; } .widgetBoxEred .rcBottom{ position:relative; bottom:-3px;} .widgetBoxEred .rc { width:50%; height:3px; background-image:url(../img/roundedCornerEred.gif); background-repeat:no-repeat;} .widgetBoxEred .rcTop .tl{ background-position:0 0;} @@ -39,7 +40,7 @@ .widgetBoxEgreen .widgetMore{ top:10px; right:15px; width:35px; background:url(../img/moreBgEgreen.gif) no-repeat; color:#90d133;} .widgetBoxEgreen .rcTop, .widgetBoxEgreen .rcBottom{ height:3px;} -.widgetBoxEgreen .rcTop{ position:absolute; top:-3px;} +.widgetBoxEgreen .rcTop{ position:absolute; top:-3px; left:0; } .widgetBoxEgreen .rcBottom{ position:relative; bottom:-3px;} .widgetBoxEgreen .rc { width:50%; height:3px; background-image:url(../img/roundedCornerEgreen.gif); background-repeat:no-repeat;} .widgetBoxEgreen .rcTop .tl{ background-position:0 0;} @@ -55,7 +56,7 @@ .widgetBoxEblue .widgetMore{ top:10px; right:15px; width:35px; background:url(../img/moreBgEblue.gif) no-repeat; color:#55ccdd;} .widgetBoxEblue .rcTop, .widgetBoxEblue .rcBottom{ height:3px;} -.widgetBoxEblue .rcTop{ position:absolute; top:-3px;} +.widgetBoxEblue .rcTop{ position:absolute; top:-3px; left:0;} .widgetBoxEblue .rcBottom{ position:relative; bottom:-3px;} .widgetBoxEblue .rc { width:50%; height:3px; background-image:url(../img/roundedCornerEblue.gif); background-repeat:no-repeat;} .widgetBoxEblue .rcTop .tl{ background-position:0 0;} diff --git a/widgetstyles/roundWire/css/widgetBoxStyle.css b/widgetstyles/roundWire/css/widgetBoxStyle.css index 91a2828c5..f7cbe13bf 100644 --- a/widgetstyles/roundWire/css/widgetBoxStyle.css +++ b/widgetstyles/roundWire/css/widgetBoxStyle.css @@ -3,12 +3,13 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1; float:left; clear:both; } .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} .widgetBox .rcTop .tl{ top:0;} .widgetBox .rcTop .tr{ top:0;} @@ -21,7 +22,7 @@ .widgetBoxDred .widgetMore{ top:5px; right:15px; width:35px; background:url(../img/moreBgDred.gif) no-repeat; color:#fff !important;} .widgetBoxDred .rcTop, .widgetBoxDred .rcBottom{ height:8px;} -.widgetBoxDred .rcTop{ position:absolute; top:-8px;} +.widgetBoxDred .rcTop{ position:absolute; top:-8px; left:0;} .widgetBoxDred .rcBottom{ position:relative; bottom:-8px;} .widgetBoxDred .rc { width:100%; height:8px; background-image:url(../img/roundedCornerDred.png); _background-image:url(../img/roundedCornerDred.gif); background-repeat:no-repeat;} .widgetBoxDred .rcTop .tl{ background-position:0 0; left:-5px;} @@ -35,7 +36,7 @@ .widgetBoxDgreen .widgetMore{ top:5px; right:15px; width:35px; background:url(../img/moreBgDgreen.gif) no-repeat; color:#fff !important;} .widgetBoxDgreen .rcTop, .widgetBoxDgreen .rcBottom{ height:8px;} -.widgetBoxDgreen .rcTop{ position:absolute; top:-8px;} +.widgetBoxDgreen .rcTop{ position:absolute; top:-8px; left:0;} .widgetBoxDgreen .rcBottom{ position:relative; bottom:-8px;} .widgetBoxDgreen .rc { width:100%; height:8px; background-image:url(../img/roundedCornerDgreen.png); _background-image:url(../img/roundedCornerDgreen.gif); background-repeat:no-repeat;} .widgetBoxDgreen .rcTop .tl{ background-position:0 0; left:-5px;} @@ -49,7 +50,7 @@ .widgetBoxDblue .widgetMore{ top:5px; right:15px; width:35px; background:url(../img/moreBgDblue.gif) no-repeat; color:#fff !important;} .widgetBoxDblue .rcTop, .widgetBoxDblue .rcBottom{ height:8px;} -.widgetBoxDblue .rcTop{ position:absolute; top:-8px;} +.widgetBoxDblue .rcTop{ position:absolute; top:-8px; left:0;} .widgetBoxDblue .rcBottom{ position:relative; bottom:-8px;} .widgetBoxDblue .rc { width:100%; height:8px; background-image:url(../img/roundedCornerDblue.png); _background-image:url(../img/roundedCornerDblue.gif); background-repeat:no-repeat;} .widgetBoxDblue .rcTop .tl{ background-position:0 0; left:-5px;} diff --git a/widgetstyles/simpleRound/css/widgetBoxStyle.css b/widgetstyles/simpleRound/css/widgetBoxStyle.css index 11d11527e..c7acf3d8b 100644 --- a/widgetstyles/simpleRound/css/widgetBoxStyle.css +++ b/widgetstyles/simpleRound/css/widgetBoxStyle.css @@ -3,12 +3,13 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1; float:left; clear:both; } .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} .widgetBox .rcTop .tl{ top:0;} .widgetBox .rcTop .tr{ top:0;} @@ -21,7 +22,7 @@ .widgetBoxC .widgetMore{ top:5px; right:15px;} .widgetBoxC .rcTop, .widgetBoxC .rcBottom{ height:3px;} -.widgetBoxC .rcTop{ position:absolute; top:-3px;} +.widgetBoxC .rcTop{ position:absolute; top:-3px; left:0; } .widgetBoxC .rcBottom{ position:relative; bottom:-3px;} .widgetBoxC .rc { width:50%; height:3px; background-image:url(../img/roundedCornerC.gif); background-repeat:no-repeat;} .widgetBoxC .rcTop .tl{ background-position:0 0; left:0px;} diff --git a/widgetstyles/simpleSquare/css/widgetBoxStyle.css b/widgetstyles/simpleSquare/css/widgetBoxStyle.css index 9220c0893..96227dd61 100644 --- a/widgetstyles/simpleSquare/css/widgetBoxStyle.css +++ b/widgetstyles/simpleSquare/css/widgetBoxStyle.css @@ -3,7 +3,8 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/simpleTitle/css/widgetBoxStyle.css b/widgetstyles/simpleTitle/css/widgetBoxStyle.css index 9aa329466..8d02428f8 100644 --- a/widgetstyles/simpleTitle/css/widgetBoxStyle.css +++ b/widgetstyles/simpleTitle/css/widgetBoxStyle.css @@ -3,7 +3,8 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} diff --git a/widgetstyles/squareWire/css/widgetBoxStyle.css b/widgetstyles/squareWire/css/widgetBoxStyle.css index 0ba421c23..0065b64b7 100644 --- a/widgetstyles/squareWire/css/widgetBoxStyle.css +++ b/widgetstyles/squareWire/css/widgetBoxStyle.css @@ -3,7 +3,8 @@ .widgetBoxContainer{ position:relative;} -.widgetBox{ position:relative; *zoom:1;} +.widgetBox{ position:relative; *zoom:1; } +.widgetBox:after{content:""; display:block; clear:both; } .widgetBox .widgetBoxHeader{ font-size:16px; font-family:Tahoma; margin:0; z-index:10;} .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} From 9b982f636d2f041535cd95aebcb30758d608d0ab Mon Sep 17 00:00:00 2001 From: ngleader Date: Fri, 27 Mar 2009 02:04:01 +0000 Subject: [PATCH 120/202] fix widgetStyle for widgetBox git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5985 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/widget/tpl/js/widget.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 815d2e772..8e5319639 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -166,11 +166,12 @@ function getWidgetBoxCode(childObj, widget) { if(jQuery('.widget_inner',childObj).size()>0){ o = jQuery('.widget_inner',childObj); + o = o.get(o.size()-1); }else{ - o = jQuery('.nullWidget',childObj); + o = jQuery('.nullWidget',childObj).get(0); } - var body = getWidgetContent(o.get(0)); + var body = getWidgetContent(o); return '
      '+body+'
      '; /* @@ -1156,13 +1157,23 @@ function widgetDrag(tobj, dx, dy) { var ll = parseInt(l,10) + parseInt(xWidth(target_obj),10); var tt = parseInt(t,10) + parseInt(xHeight(target_obj),10); if( tobj.xDPX >= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt) { + + //박스 위젯이다 if(target_obj.className == "nullWidget") { + var wb_ws = jQuery('div.widget_inner',jQuery(target_obj)); + //박스 위젯에 위젯스타일이 적용 안된경우 if(wb_ws.size() == 0){ target_obj.appendChild(tobj); + + //박스 위젯에 위젯스타일이 적용된경우 또는 박스안에 위젯이 위젯스타일이 적용된겅우 }else if(wb_ws.size() > 0){ - wb_ws.get(0).appendChild(tobj); + if(jQuery('div.widgetOutput',jQuery(target_obj)).size() > 0) { + target_obj.appendChild(tobj); + }else{ + wb_ws.get(0).appendChild(tobj); + } } // 이동을 멈춤 From 86ada3ed8f3ea4f4c0100f5331968caa734e9643 Mon Sep 17 00:00:00 2001 From: ngleader Date: Fri, 27 Mar 2009 04:51:17 +0000 Subject: [PATCH 121/202] fix widgetStyle for widgetBox git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5986 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/widget/WidgetHandler.class.php | 6 +++--- modules/widget/tpl/js/widget.js | 12 ++++-------- widgetstyles/memo/css/widgetBoxStyle.css | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php index 0cc1cffc9..3928d4125 100644 --- a/classes/widget/WidgetHandler.class.php +++ b/classes/widget/WidgetHandler.class.php @@ -269,7 +269,7 @@ // 위젯 스타일을 컴파일 한다. if($args->widgetstyle){ - $widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle, $widget_content_body, $args, $include_info); + $widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle,$widget, $widget_content_body, $args, $include_info); } $output = $widget_content_header . $widget_content_body . $widget_content_footer; @@ -311,7 +311,7 @@ } - function complieWidgetStyle($widgetStyle,$widget_content_body, $args, $include_info){ + function complieWidgetStyle($widgetStyle,$widget,$widget_content_body, $args, $include_info){ if(!$widgetStyle) return $widget_content_body; $oWidgetModel = &getModel('widget'); @@ -328,7 +328,7 @@ } Context::set('widgetstyle_extar_var', $widgetstyle_extar_var); - if($include_info){ + if($include_info && $widget=='widgetBox'){ Context::set('widget_content', '
      '.$widget_content_body.'
      '); }else{ Context::set('widget_content', $widget_content_body); diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 8e5319639..e71b7793e 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -166,7 +166,7 @@ function getWidgetBoxCode(childObj, widget) { if(jQuery('.widget_inner',childObj).size()>0){ o = jQuery('.widget_inner',childObj); - o = o.get(o.size()-1); + o = o.get(0); }else{ o = jQuery('.nullWidget',childObj).get(0); } @@ -1168,13 +1168,9 @@ function widgetDrag(tobj, dx, dy) { target_obj.appendChild(tobj); //박스 위젯에 위젯스타일이 적용된경우 또는 박스안에 위젯이 위젯스타일이 적용된겅우 - }else if(wb_ws.size() > 0){ - if(jQuery('div.widgetOutput',jQuery(target_obj)).size() > 0) { - target_obj.appendChild(tobj); - }else{ - wb_ws.get(0).appendChild(tobj); - } - } + }else{ + wb_ws.get(0).appendChild(tobj); + } // 이동을 멈춤 widgetManualEnd(); diff --git a/widgetstyles/memo/css/widgetBoxStyle.css b/widgetstyles/memo/css/widgetBoxStyle.css index 7b1a6a540..e03de44c9 100644 --- a/widgetstyles/memo/css/widgetBoxStyle.css +++ b/widgetstyles/memo/css/widgetBoxStyle.css @@ -10,7 +10,7 @@ .widgetBox .widgetContainer{ position:relative; z-index:10;} .widgetBox .widgetMore{ position:absolute; display:block; text-decoration:none; font-size:11px !important; white-space:nowrap; font-family:Tahoma; color:#000; text-align:center; z-index:20;} .widgetBox .widgetMore img{ border:0;} -.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1;} +.widgetBox .rcContainer{ display:block; width:100%; font-size:0; line-height:0; z-index:1; *zoom:1; clear:both;} .widgetBox .rc{ position:absolute; display:block; font-size:0; line-height:0; overflow:hidden;} .widgetBox .rcTop .tl{ top:0;} .widgetBox .rcTop .tr{ top:0;} From 820775863a7b87f24ee6a038e945a5bdae52adba Mon Sep 17 00:00:00 2001 From: haneul Date: Fri, 27 Mar 2009 09:00:37 +0000 Subject: [PATCH 122/202] #17763740 : added the list of contributors git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5987 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/wiki/lang/en.lang.php | 1 + modules/wiki/lang/jp.lang.php | 1 + modules/wiki/lang/ko.lang.php | 1 + modules/wiki/lang/zh-CN.lang.php | 3 +++ modules/wiki/lang/zh-TW.lang.php | 1 + modules/wiki/queries/getContributors.xml | 11 ++++++++++ modules/wiki/skins/xe_wiki/css/wiki.css | 2 ++ modules/wiki/skins/xe_wiki/view_document.html | 16 +++++++++----- modules/wiki/wiki.model.php | 22 +++++++++++++++++++ modules/wiki/wiki.view.php | 10 +++++++++ 10 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 modules/wiki/queries/getContributors.xml create mode 100644 modules/wiki/wiki.model.php diff --git a/modules/wiki/lang/en.lang.php b/modules/wiki/lang/en.lang.php index 1e21cfc50..ece2d826a 100644 --- a/modules/wiki/lang/en.lang.php +++ b/modules/wiki/lang/en.lang.php @@ -12,4 +12,5 @@ $lang->cmd_view_info = 'Wiki information'; $lang->use_comment = 'Use comment'; $lang->about_use_comment = 'You may configure to enable comments.'; + $lang->contributors = 'Contributors'; ?> diff --git a/modules/wiki/lang/jp.lang.php b/modules/wiki/lang/jp.lang.php index e163c7cea..1760c3597 100644 --- a/modules/wiki/lang/jp.lang.php +++ b/modules/wiki/lang/jp.lang.php @@ -12,4 +12,5 @@ $lang->cmd_view_info = 'wiki情報'; $lang->use_comment = 'コメント機能を使う'; $lang->about_use_comment = 'コメント機能をオン・オフを設定します。'; + $lang->contributors = 'Contributors'; ?> diff --git a/modules/wiki/lang/ko.lang.php b/modules/wiki/lang/ko.lang.php index 58ffa183d..b08f8dfc9 100644 --- a/modules/wiki/lang/ko.lang.php +++ b/modules/wiki/lang/ko.lang.php @@ -12,4 +12,5 @@ $lang->cmd_view_info = '위키 정보'; $lang->use_comment = '댓글 사용'; $lang->about_use_comment = '댓글을 활성화하거나 비활성화할 수 있습니다'; + $lang->contributors = '공헌자'; ?> diff --git a/modules/wiki/lang/zh-CN.lang.php b/modules/wiki/lang/zh-CN.lang.php index 20f0c8707..505c98937 100644 --- a/modules/wiki/lang/zh-CN.lang.php +++ b/modules/wiki/lang/zh-CN.lang.php @@ -10,4 +10,7 @@ $lang->cmd_create = '新建文档'; $lang->cmd_wiki_list = '目录'; $lang->cmd_view_info = '维基信息'; + $lang->use_comment = 'Use comment'; + $lang->about_use_comment = 'You may configure to enable comments.'; + $lang->contributors = 'Contributors'; ?> diff --git a/modules/wiki/lang/zh-TW.lang.php b/modules/wiki/lang/zh-TW.lang.php index 10f541c97..e9a72c4f3 100644 --- a/modules/wiki/lang/zh-TW.lang.php +++ b/modules/wiki/lang/zh-TW.lang.php @@ -12,4 +12,5 @@ $lang->cmd_view_info = '維基資訊'; $lang->use_comment = 'Use comment'; $lang->about_use_comment = 'You may configure to enable comments.'; + $lang->contributors = 'Contributors'; ?> diff --git a/modules/wiki/queries/getContributors.xml b/modules/wiki/queries/getContributors.xml new file mode 100644 index 000000000..937ffacdb --- /dev/null +++ b/modules/wiki/queries/getContributors.xml @@ -0,0 +1,11 @@ + + +
      + + + + + + + + diff --git a/modules/wiki/skins/xe_wiki/css/wiki.css b/modules/wiki/skins/xe_wiki/css/wiki.css index 5c06e57e2..ddd6756b5 100644 --- a/modules/wiki/skins/xe_wiki/css/wiki.css +++ b/modules/wiki/skins/xe_wiki/css/wiki.css @@ -344,3 +344,5 @@ color:#666666; font-size:11px; font-weight:normal; margin-top:5px; padding-top:5 .pagination.a1 a.prevEnd{ padding-left:15px; background:#fff url(../images/common/arrowPrevEndA1.gif) no-repeat left center; } .pagination.a1 a.next{ padding-right:10px; background:#fff url(../images/common/arrowNextA1.gif) no-repeat right center; } .pagination.a1 a.nextEnd{ padding-right:15px; background:#fff url(../images/common/arrowNextEndA1.gif) no-repeat right center; } + +.contributors diff --git a/modules/wiki/skins/xe_wiki/view_document.html b/modules/wiki/skins/xe_wiki/view_document.html index ba9de53df..b1fd5460c 100644 --- a/modules/wiki/skins/xe_wiki/view_document.html +++ b/modules/wiki/skins/xe_wiki/view_document.html @@ -53,11 +53,17 @@ - - - - - +
      +{$lang->contributors} : +{@ $bFirst = true} + + +, +{$contributor->nick_name} +{@ $bFirst = false} + + +
      diff --git a/modules/wiki/wiki.model.php b/modules/wiki/wiki.model.php new file mode 100644 index 000000000..7c9028f46 --- /dev/null +++ b/modules/wiki/wiki.model.php @@ -0,0 +1,22 @@ +document_srl = $document_srl; + $output = executeQueryArray("wiki.getContributors", $args); + if(!$output->data) return array(); + return $output->data; + } + } +?> diff --git a/modules/wiki/wiki.view.php b/modules/wiki/wiki.view.php index 9eecaeb78..e7b0be2fd 100644 --- a/modules/wiki/wiki.view.php +++ b/modules/wiki/wiki.view.php @@ -27,6 +27,7 @@ $document_config = $oModuleModel->getModulePartConfig('document', $this->module_info->module_srl); if(!isset($document_config->use_history)) $document_config->use_history = 'N'; + $this->use_history = $document_config->use_history; Context::set('use_history', $document_config->use_history); Context::addJsFile($this->module_path.'tpl/js/wiki.js'); @@ -156,12 +157,21 @@ // 비밀글일때 컨텐츠를 보여주지 말자. if($oDocument->isSecret() && !$oDocument->isGranted()) $oDocument->add('content',Context::getLang('thisissecret')); $this->setTemplateFile('view_document'); + + // set contributors + if($this->use_history) + { + $oModel = &getModel('wiki'); + $contributors = $oModel->getContributors($oDocument->document_srl); + Context::set('contributors', $contributors); + } } else { $this->setTemplateFile('create_document'); } + // 스킨에서 사용할 oDocument 변수 세팅 Context::set('oDocument', $oDocument); From 7ad4015c2dece9f8b0d8c5479f53d55b9fc5a0d0 Mon Sep 17 00:00:00 2001 From: royallin Date: Fri, 27 Mar 2009 09:06:03 +0000 Subject: [PATCH 123/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5988 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/cafeXE/lang/zh-TW.lang.php | 10 +-- modules/layout/lang/zh-TW.lang.php | 138 ++++++++++++++--------------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/layouts/cafeXE/lang/zh-TW.lang.php b/layouts/cafeXE/lang/zh-TW.lang.php index ff14052ed..806ab1c7c 100644 --- a/layouts/cafeXE/lang/zh-TW.lang.php +++ b/layouts/cafeXE/lang/zh-TW.lang.php @@ -1,5 +1,5 @@ -new_members = '̷s|'; - $lang->document_ranking = 'DDƦ'; - $lang->comment_ranking = 'ױƦ'; -?> +new_members = '最新會員'; + $lang->document_ranking = '主題排行'; + $lang->comment_ranking = '評論排行'; +?> diff --git a/modules/layout/lang/zh-TW.lang.php b/modules/layout/lang/zh-TW.lang.php index 1067ea077..f686f3aa2 100644 --- a/modules/layout/lang/zh-TW.lang.php +++ b/modules/layout/lang/zh-TW.lang.php @@ -31,83 +31,83 @@ 儲存之前,請先預覽後再儲存。 XE版面設計語法,請參考XE 樣版。"; - $lang->layout_export = '匯出'; - $lang->layout_btn_export = '내 레이아웃 다운로드'; - $lang->about_layout_export = '현재 수정된 레이아웃을 내보내기를 합니다.'; - $lang->layout_import = '匯入'; - $lang->about_layout_import = '가져오기를 할 경우 기존 수정된 레이아웃을 삭제가 됩니다. - 가져오기를 하기전에 내보내기를 통해 백업을 하시기 바랍니다.'; + $lang->layout_export = '版面匯出'; + $lang->layout_btn_export = '下載版面'; + $lang->about_layout_export = '可匯出目前修改過的版面。'; + $lang->layout_import = '版面匯入'; + $lang->about_layout_import = '版面匯入時,將會刪除目前的版面設置。 + 版面匯入前,請先匯出備份目前的版面設置。'; $lang->layout_manager = array( - 0 => '레이아웃 매니저', - 1 => '저장', - 2 => '취소', - 3 => '형태', - 4 => '배열', - 5 => '정렬', - 6 => '고정 레이아웃', - 7 => '가변 레이아웃', - 8 => '고정+가변(내용)', - 9 => '1칸', - 10 => '2칸 (내용 왼쪽)', - 11 => '2칸 (내용 오른쪽)', - 12 => '3칸 (내용 왼쪽)', - 13 => '3칸 (내용 가운데)', - 14 => '3칸 (내용 오른쪽)', - 15 => '왼쪽', - 16 => '가운데', - 17 => '오른쪽', - 18 => '전체', - 19 => '레이아웃', - 20 => '위젯 추가', - 21 => '내용 위젯 추가', - 22 => '속성', - 23 => '위젯 스타일', - 24 => '수정', - 25 => '삭제', - 26 => '정렬', - 27 => '한줄 차지', - 28 => '왼쪽', - 29 => '오른쪽', - 30 => '가로 너비', - 31 => '높이', + 0 => '版面管理者', + 1 => '儲存', + 2 => '取消', + 3 => '模式', + 4 => '樣式', + 5 => '對齊', + 6 => '固定版面', + 7 => '變動版面', + 8 => '固定+變動(內容)', + 9 => '1欄', + 10 => '2欄 (左側內容區)', + 11 => '2欄 (右側內容區)', + 12 => '3欄 (左側內容區)', + 13 => '3欄 (居中內容區)', + 14 => '3欄 (右側內容區)', + 15 => '靠左對齊', + 16 => '置中對齊', + 17 => '靠右對齊', + 18 => '整體', + 19 => '版面', + 20 => '新增控件', + 21 => '新增內容', + 22 => '屬性', + 23 => '控件樣式', + 24 => '修改', + 25 => '刪除', + 26 => '對齊', + 27 => '換行', + 28 => '靠左對齊', + 29 => '靠右對齊', + 30 => '寬度', + 31 => '高度', 32 => '바깥 여백', 33 => '안쪽 여백', - 34 => '위', - 35 => '왼', - 36 => '오른', - 37 => '아래', - 38 => '테두리', - 39 => '없음', - 40 => '배경', - 41 => '색상', - 42 => '그림', - 43 => '선택', - 44 => '배경 그림 반복', - 45 => '반복', - 46 => '반복 안함', - 47 => '가로 반복', - 48 => '세로 반복', - 49 => '적용', - 50 => '취소', - 51 => '초기화', - 52 => '글자', - 53 => '글자 폰트', - 54 => '글자 색', + 34 => '上', + 35 => '左', + 36 => '右', + 37 => '下', + 38 => '外框', + 39 => '無', + 40 => '背景', + 41 => '顏色', + 42 => '圖片', + 43 => '選擇', + 44 => '背景重複', + 45 => '重複', + 46 => '不重複', + 47 => '水平重複', + 48 => '垂直重複', + 49 => '應用', + 50 => '取消', + 51 => '重置', + 52 => '字型', + 53 => '字體', + 54 => '文字顏色', ); - $lang->layout_image_repository = '레이아웃 파일 저장소'; - $lang->about_layout_image_repository = '선택된 레이아웃에 사용될 이미지/플래시파일등을 올릴 수 있습니다. 내보내기에 같이 포함이 됩니다'; + $lang->layout_image_repository = '版面檔案庫'; + $lang->about_layout_image_repository = '可在所選擇的版面中上傳圖片/Flash檔案。匯出時將包含此檔案。'; $lang->msg_layout_image_target = '只允許上傳gif, png, jpg, swf, flv等檔案格式。'; - $lang->layout_migration = '레이아웃 내보내기/ 들이기'; - $lang->about_layout_migration = '수정된 레이아웃을 tar 파일로 내보내거나 tar 파일로 저장된 것을 불러올 수 있습니다'."\n".'(아직은 faceOff레이아웃만 내보내기/들이기가 됩니다'; + $lang->layout_migration = '版面匯出/匯入'; + $lang->about_layout_migration = '可將修改過的版面匯出成tar檔案或是直接匯入現有的tar檔案。'."\n".'(此功能目前只能用於faceOff版面中'; $lang->about_faceoff = array( - 'title' => 'XpressEngine FaceOff Layout 관리자', - 'description' => 'FaceOff Layout관리자는 웹상에서 쉽게 레이아웃을 꾸밀 수 있습니다.
      아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요', - 'layout' => 'FaceOff는 위와 같은 HTML 구조로 되어 있습니다.
      이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
      위젯 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', - 'setting' => '좌측 상단의 메뉴에 대해 설명 드립니다.
      • 저장 : 설정된 내용을 저장합니다.
      • 취소 : 설정한 내용을 저장하지 않고 돌아갑니다.
      • 초기화 : 아무 설정도 되어 있지 않은 백지 상태로 돌립니다
      • 형태 : 고정/ 가변/ 고정+가변(내용)의 형태를 지정합니다.
      • 배열 : Extension 2개와 Content를 배열합니다.
      • 정렬 : 레이아웃의 위치를 정렬시킬 수 있습니다.
      ', - 'hotkey' => '마우스로 각 영역을 선택하면서 Hot Key를 이용하시면 더 쉽게 꾸미실 수 있습니다.
      • tab 키 : 위젯이 선택되어 있지 않으면 Header, Body, Footer 순으로 선택됩니다. 위젯이 선택되어 있다면 다음 위젯으로 선택이 이동됩니다.
      • Shift + tab키 : tab키와 반대 역할을 합니다.
      • Esc : 아무것도 선택되어 있지 않을때 Esc를 누르면 Neck, Extension(e1,e2),Knee 순서대로 선택이 되며 위젯이 선택되어 있다면 선택된 위젯을 감싸는 영역이 선택됩니다.
      • 방향키 : 위젯이 선택되어 있을때 방향키를 이용하여 위젯을 다른 영역으로 이동시킬 수 있습니다.
      ', - 'attribute' => '위젯을 제외한 각 영역들은 모두 배경 색/ 이미지를 지정할 수 있고 글자색(a 태그 포함됨)을 정할 수 있습니다.', + 'title' => 'XpressEngine FaceOff版面管理者', + 'description' => 'FaceOff Layout版面管理者,可於線上修改與設計版面。
      下圖為版面架構示意圖和功能簡介,瞭解後發揮創意製作出自己想要的版面吧!', + 'layout' => 'FaceOff及HTML的架構是相同。
      이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
      위젯 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.', + 'setting' => '左上方的選單說明:
      • 儲存 : 儲存設定內容
      • 取消 : 不儲存設定內容並返回上一頁
      • 重置 : 重新設置回到最原始的版面設定
      • 模式 : 可設定版面模式為固定/ 變動/ 固定+變動(內容)
      • 樣式 : 可設置兩個Extension區域和Content區域
      • 對齊 : 可選擇版面的對齊方式
      ', + 'hotkey' => '除了可利用滑鼠選取各區域外,也能使用熱鍵選取:
      • tab鍵 : 當沒有選取控件時,選擇順序是: Header, Footer, Body;當有選取控件時,將會選擇下一個控件。
      • Shift + tab鍵 : 功能和tab鍵相反
      • Esc鍵 : 當沒有選擇區域時,選擇順序是: Neck, Extension(e1,e2),Knee;當有選擇控件時,將會選則此控件所屬的區域。
      • 方向鍵 : 當有選擇控件時,可利用方向鍵作移動。
      ', + 'attribute' => '除了控件以外的各個區域都可以指定背景顏色/圖片及文字顏色(包含a標籤)。', ); ?> From d2124f9b9a45b272b1a30d3516b2ddf6206d2531 Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 30 Mar 2009 01:26:34 +0000 Subject: [PATCH 124/202] =?UTF-8?q?xe=5Fboard,=20xe=5Fdefault=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=ED=8C=90=EC=9D=98=20=EC=9B=B9=EC=A7=84=ED=98=95?= =?UTF-8?q?=EC=9D=BC=EB=95=8C=20=EB=82=B4=EC=9A=A9=20=EC=9E=90=EB=A5=B4?= =?UTF-8?q?=EA=B8=B0=EB=A5=BC=20=EC=A0=95=ED=95=A0=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=8A=A4=ED=82=A8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5989 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/skins/xe_board/header.html | 5 ++--- modules/board/skins/xe_board/skin.xml | 17 +++++++++++++++++ modules/board/skins/xe_board/style.webzine.html | 2 +- modules/board/skins/xe_default/_header.html | 5 ++--- .../board/skins/xe_default/_style.webzine.html | 2 +- modules/board/skins/xe_default/skin.xml | 17 +++++++++++++++++ 6 files changed, 40 insertions(+), 8 deletions(-) diff --git a/modules/board/skins/xe_board/header.html b/modules/board/skins/xe_board/header.html index 8be241362..255c897d7 100644 --- a/modules/board/skins/xe_board/header.html +++ b/modules/board/skins/xe_board/header.html @@ -16,9 +16,8 @@ - - {@ $module_info->duration_new = 12 } - + {@ $module_info->duration_new = 12 } + {@ $module_info->content_cut_size= 240 } {@ $module_info->thumbnail_type = 'crop'; } diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index a02840f1f..0c560c812 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -278,6 +278,23 @@ You may set length of title. (0 or blank value will not restrict the length) 可指定標題字數(0或留白為不限制)。 + + text + 내용 글자수 + 内容の文字数 + 内容字数 + Length of Content + Número de letras del Contenidos + Длина содержания + 內容字數 + 내용 글자수를 지정할 수 있습니다. (기본 240) + 内容の文字数を指定します(デフォルト 240)。 + 可以指定要显示的内容字数。(默认为240) + Length of Content can be assigned. (default 240) + El largo del Contenidos puede ser asignado. (Predefinido 240) + Длина содержания может быть присвоена. (стандарт: 240) + 可以指定要顯示的內容字數。(預設是240) + 번호 표시 番号表示 diff --git a/modules/board/skins/xe_board/style.webzine.html b/modules/board/skins/xe_board/style.webzine.html index 2f16cb991..855cf25ef 100644 --- a/modules/board/skins/xe_board/style.webzine.html +++ b/modules/board/skins/xe_board/style.webzine.html @@ -130,7 +130,7 @@
      diff --git a/modules/board/skins/xe_default/_header.html b/modules/board/skins/xe_default/_header.html index 35db7ad3a..b308bc9df 100644 --- a/modules/board/skins/xe_default/_header.html +++ b/modules/board/skins/xe_default/_header.html @@ -11,9 +11,8 @@ - - {@ $module_info->duration_new = 12 } - +{@ $module_info->duration_new = 12 } +{@ $module_info->content_cut_size= 240 }{@ $module_info->thumbnail_type = 'crop'; }{@ $module_info->thumbnail_width = 100; } diff --git a/modules/board/skins/xe_default/_style.webzine.html b/modules/board/skins/xe_default/_style.webzine.html index 57837bcb9..8158c1c74 100644 --- a/modules/board/skins/xe_default/_style.webzine.html +++ b/modules/board/skins/xe_default/_style.webzine.html @@ -127,7 +127,7 @@ - {$document->getSummary(120)} + {$document->getSummary($module_info->content_cut_size)}   diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index f75a191e2..d514543ae 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -248,6 +248,23 @@ You may set length of title. (0 or blank value will not restrict the length)可指定標題字數(0或留白為不限制)。 + + text + 내용 글자수 + 内容の文字数 + 内容字数 + Length of Content + Número de letras del Contenidos + Длина содержания + 內容字數 + 내용 글자수를 지정할 수 있습니다. (기본 240) + 内容の文字数を指定します(デフォルト 240)。 + 可以指定要显示的内容字数。(默认为240) + Length of Content can be assigned. (default 240) + El largo del Contenidos puede ser asignado. (Predefinido 240) + Длина содержания может быть присвоена. (стандарт: 240) + 可以指定要顯示的內容字數。(預設是240) + 번호 표시 番号表示 From 5e174f2d207c0a98ced1726989d6533a6cc081ec Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 30 Mar 2009 01:27:53 +0000 Subject: [PATCH 125/202] =?UTF-8?q?r5989=EC=97=90=EC=84=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=82=A8=EC=9A=A9=20xml=20=ED=8F=AC=EB=A7=B7=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=90=98=EC=A7=80=20=EC=95=8A=EC=95=98=EB=8D=98=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5990 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/skins/xe_board/skin.xml | 17 ++++++++--------- modules/board/skins/xe_default/skin.xml | 17 ++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/modules/board/skins/xe_board/skin.xml b/modules/board/skins/xe_board/skin.xml index 0c560c812..24eb8406d 100644 --- a/modules/board/skins/xe_board/skin.xml +++ b/modules/board/skins/xe_board/skin.xml @@ -278,15 +278,14 @@ You may set length of title. (0 or blank value will not restrict the length) 可指定標題字數(0或留白為不限制)。 - - text - 내용 글자수 - 内容の文字数 - 内容字数 - Length of Content - Número de letras del Contenidos - Длина содержания - 內容字數 + + 내용 글자수 + 内容の文字数 + 内容字数 + Length of Content + Número de letras del Contenidos + Длина содержания + 內容字數 내용 글자수를 지정할 수 있습니다. (기본 240) 内容の文字数を指定します(デフォルト 240)。 可以指定要显示的内容字数。(默认为240) diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index d514543ae..5d5a16220 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -248,15 +248,14 @@ You may set length of title. (0 or blank value will not restrict the length) 可指定標題字數(0或留白為不限制)。 - - text - 내용 글자수 - 内容の文字数 - 内容字数 - Length of Content - Número de letras del Contenidos - Длина содержания - 內容字數 + + 내용 글자수 + 内容の文字数 + 内容字数 + Length of Content + Número de letras del Contenidos + Длина содержания + 內容字數 내용 글자수를 지정할 수 있습니다. (기본 240) 内容の文字数を指定します(デフォルト 240)。 可以指定要显示的内容字数。(默认为240) From cf9b4b42a15e75af2083a19acdab80c0af112407 Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 30 Mar 2009 03:18:43 +0000 Subject: [PATCH 126/202] =?UTF-8?q?keybind=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5991 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/wiki_link/wikilink.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/wiki_link/wikilink.js b/addons/wiki_link/wikilink.js index 2406ef34f..d962a287c 100644 --- a/addons/wiki_link/wikilink.js +++ b/addons/wiki_link/wikilink.js @@ -30,6 +30,7 @@ function setText() { function addShortCutForWiki() { var iframe_obj = editorGetIFrame(1); + jQuery(iframe_obj.contentWindow.document).bind('keydown', "CTRL+SHIFT+SPACE", function(evt) { openWikiLinkDialog(); }); if(jQuery.os.Mac) { jQuery(iframe_obj.contentWindow.document).bind('keydown', "ALT+SPACE", function(evt) { openWikiLinkDialog(); }); @@ -38,7 +39,7 @@ function addShortCutForWiki() { jQuery(iframe_obj.contentWindow.document).bind('keydown', "CTRL+SPACE", function(evt) { openWikiLinkDialog(); }); } - jQuery(document).bind('keydown',"CTRL+ALT+SPACE", function(evt) {} ); + jQuery(document).bind('keydown',"CTRL+SHIFT+SPACE", function(evt) {} ); } xAddEventListener(window, 'load', addShortCutForWiki); From 4216eb33f005badd599e6e2a0792588645fbacc1 Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 30 Mar 2009 04:40:24 +0000 Subject: [PATCH 127/202] =?UTF-8?q?=EB=8B=A4=EA=B5=AD=EC=96=B4=20=ED=8E=B8?= =?UTF-8?q?=EC=A7=91=EC=8B=9C=EC=97=90=20=EC=9B=90=EB=AC=B8=20=EA=B8=80?= =?UTF-8?q?=EC=9D=B4=20=EC=82=AC=EB=9D=BC=EC=A7=80=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5992 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 965154472..4dbb751d1 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -333,8 +333,11 @@ if($source_obj->get('lang_code') != Context::getLangType()) { $extra_content->title = $obj->title; $extra_content->content = $obj->content; - $obj->title = $source_obj->get('title'); - $obj->content = $source_obj->get('content'); + + $document_args->document_srl = $source_obj->get('document_srl'); + $document_output = executeQuery('document.getDocument', $document_args); + $obj->title = $document_output->data->title; + $obj->content = $document_output->data->content; } // 세션에서 최고 관리자가 아니면 iframe, script 제거 From 0e748f0d8cd15afd81a53a36024e319d890c3048 Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 30 Mar 2009 04:42:54 +0000 Subject: [PATCH 128/202] =?UTF-8?q?=EC=B9=9C=EA=B5=AC=EA=B7=B8=EB=A3=B9=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=ED=8C=9D=EC=97=85=EC=97=90=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83=20=EB=94=94=EC=9E=90=EC=9D=B8?= =?UTF-8?q?=EC=9D=B4=20=ED=8F=AC=ED=95=A8=EB=90=98=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5993 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/communication/skins/default/friends.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/communication/skins/default/friends.html b/modules/communication/skins/default/friends.html index d64a30875..1e49c0278 100644 --- a/modules/communication/skins/default/friends.html +++ b/modules/communication/skins/default/friends.html @@ -18,7 +18,7 @@ {$lang->cmd_modify} {$lang->cmd_delete} - {$lang->cmd_add_friend_group} + {$lang->cmd_add_friend_group}
      From 297b65d79e76ee852275db0a2fecb1c83c5d472f Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 30 Mar 2009 06:22:00 +0000 Subject: [PATCH 129/202] =?UTF-8?q?=EC=9D=B5=EB=AA=85=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=ED=8C=90=20=EC=82=AC=EC=9A=A9=EC=8B=9C=20=EA=B8=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=9D=B4=20=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5994 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/board.controller.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/board/board.controller.php b/modules/board/board.controller.php index 2337121ff..e6a64f3c7 100644 --- a/modules/board/board.controller.php +++ b/modules/board/board.controller.php @@ -85,13 +85,16 @@ // 익명 사용시 글의 글쓴이 정보를 모두 제거 if($this->module_info->use_anonymous == 'Y' && Context::get('is_logged')) { $logged_info = Context::get('logged_info'); - $oDocument = $oDocumentModel->getDocument($output->get('document_srl')); - $obj = $oDocument->getObjectVars(); - $obj->member_srl = -1*$logged_info->member_srl; - $obj->email_address = $obj->homepage = $obj->user_id = ''; - $obj->user_name = $obj->nick_name = 'anonymous'; - $output = executeQuery('document.updateDocument', $obj); - if(!$output->toBool()) return $output; + $document_args->document_srl = $output->get('document_srl'); + $document = executeQuery('document.getDocument', $document_args); + if($document->toBool() && $document->data) { + $obj = $document->data; + $obj->member_srl = -1*$logged_info->member_srl; + $obj->email_address = $obj->homepage = $obj->user_id = ''; + $obj->user_name = $obj->nick_name = 'anonymous'; + $output = executeQuery('document.updateDocument', $obj); + if(!$output->toBool()) return $output; + } } // 결과를 리턴 From 1dd306d4dba12cbb161f192daaa24580ba59d5c2 Mon Sep 17 00:00:00 2001 From: ngleader Date: Mon, 30 Mar 2009 08:12:15 +0000 Subject: [PATCH 130/202] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85?= =?UTF-8?q?=EC=8B=9C=20=ED=99=95=EC=9E=A5=EB=B3=80=EC=88=98=20=EB=9D=BC?= =?UTF-8?q?=EB=94=94=EC=98=A4=20=ED=83=80=EC=9E=85=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=84=A4=EB=AC=B8=EC=A1=B0=EC=82=AC=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=88=9C=EC=84=9C=20order=20type=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5995 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 3 +++ modules/member/member.admin.controller.php | 11 +++++++---- modules/member/member.admin.view.php | 1 + modules/member/member.model.php | 4 ++-- modules/member/member.view.php | 1 - modules/member/skins/default/signup_form.html | 10 ++++++++++ modules/member/tpl/js/member_admin.js | 1 + modules/poll/queries/getPollItem.xml | 3 +++ modules/widget/widget.controller.php | 6 +----- 9 files changed, 28 insertions(+), 12 deletions(-) diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 2bd129bf2..276eb3091 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -457,6 +457,8 @@ $oExtraVar->setExtraVarKeys($output->data); $GLOBALS['XE_EXTRA_KEYS'][$module_srl] = $oExtraVar->getExtraVars(); } + + ksort($GLOBALS['XE_EXTRA_KEYS'][$module_srl]); return $GLOBALS['XE_EXTRA_KEYS'][$module_srl]; } @@ -470,6 +472,7 @@ $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; $this->setToAllDocumentExtraVars(); } + ksort($GLOBALS['XE_EXTRA_VARS'][$document_srl]); return $GLOBALS['XE_EXTRA_VARS'][$document_srl]; } diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index dbfc1d48e..312a0e962 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -170,18 +170,21 @@ $args->required = Context::get('required'); if(!in_array(strtoupper($args->required), array('Y','N'))) $args->required = 'N'; $args->description = Context::get('description'); - $args->list_order = getNextSequence(); // 기본값의 정리 - if(in_array($args->column_type, array('checkbox','select')) && count($args->default_value) ) { + if(in_array($args->column_type, array('checkbox','select','radio')) && count($args->default_value) ) { $args->default_value = serialize($args->default_value); } else { $args->default_value = ''; } // member_join_form_srl이 있으면 수정, 없으면 추가 - if(!$args->member_join_form_srl) $output = executeQuery('member.insertJoinForm', $args); - else $output = executeQuery('member.updateJoinForm', $args); + if(!$args->member_join_form_srl){ + $args->list_order = getNextSequence(); + $output = executeQuery('member.insertJoinForm', $args); + }else{ + $output = executeQuery('member.updateJoinForm', $args); + } if(!$output->toBool()) return $output; diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index ece3e6629..7a25b3a4a 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -200,6 +200,7 @@ if($member_join_form_srl) { $oMemberModel = &getModel('member'); $join_form = $oMemberModel->getJoinForm($member_join_form_srl); + if(!$join_form) Context::set('member_join_form_srl','',true); else Context::set('join_form', $join_form); } diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 3ea6e44de..3b2a050f4 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -378,7 +378,7 @@ $lang->extend_vars[$column_name] = $column_title; // checkbox, select등 다수 데이터 형식일 경우 unserialize해줌 - if(in_array($column_type, array('checkbox','select'))) { + if(in_array($column_type, array('checkbox','select','radio'))) { $join_form_list[$i]->default_value = unserialize($default_value); if(!$join_form_list[$i]->default_value[0]) $join_form_list[$i]->default_value = ''; } else { @@ -470,7 +470,7 @@ $column_type = $join_form->column_type; $default_value = $join_form->default_value; - if(in_array($column_type, array('checkbox','select'))) { + if(in_array($column_type, array('checkbox','select','radio'))) { $join_form->default_value = unserialize($default_value); } else { $join_form->default_value = ''; diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 46669b3b4..a40c8e472 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -75,7 +75,6 @@ // 회원가입을 중지시켰을 때는 에러 표시 if($this->member_config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); // 템플릿 파일 지정 diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html index 6e65fc11b..c521108b8 100644 --- a/modules/member/skins/default/signup_form.html +++ b/modules/member/skins/default/signup_form.html @@ -125,6 +125,16 @@ + + + +
        + +
      • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
      • + +
      + +
      - {$document->getSummary(240)} + {$document->getSummary($module_info->content_cut_size)}  
      + + + + + + diff --git a/modules/module/queries/deleteLocksTimeoutPassed.xml b/modules/module/queries/deleteLocksTimeoutPassed.xml new file mode 100644 index 000000000..bb8df20b5 --- /dev/null +++ b/modules/module/queries/deleteLocksTimeoutPassed.xml @@ -0,0 +1,8 @@ + + +
      + + + + + diff --git a/modules/module/queries/insertLock.xml b/modules/module/queries/insertLock.xml new file mode 100644 index 000000000..9a447c451 --- /dev/null +++ b/modules/module/queries/insertLock.xml @@ -0,0 +1,10 @@ + + +
      + + + + + + + diff --git a/modules/module/schemas/module_locks.xml b/modules/module/schemas/module_locks.xml new file mode 100644 index 000000000..6934d619c --- /dev/null +++ b/modules/module/schemas/module_locks.xml @@ -0,0 +1,5 @@ +
      + + + +
      From 7619bce79051493d33044f6f89d50faf10fbc92c Mon Sep 17 00:00:00 2001 From: haneul Date: Mon, 30 Mar 2009 16:21:34 +0000 Subject: [PATCH 136/202] #17528788 : unittest framework added git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6001 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/context/Context.test.php | 7 + tests/index.php | 17 + tests/modules/module/module.test.php | 19 + .../HELP_MY_TESTS_DONT_WORK_ANYMORE | 348 ++++ tests/simpletest/LICENSE | 502 +++++ tests/simpletest/README | 108 ++ tests/simpletest/VERSION | 1 + tests/simpletest/authentication.php | 238 +++ tests/simpletest/autorun.php | 87 + tests/simpletest/browser.php | 1098 +++++++++++ tests/simpletest/collector.php | 122 ++ tests/simpletest/compatibility.php | 173 ++ tests/simpletest/cookies.php | 380 ++++ tests/simpletest/default_reporter.php | 133 ++ tests/simpletest/detached.php | 96 + tests/simpletest/dumper.php | 360 ++++ tests/simpletest/eclipse.php | 307 ++++ tests/simpletest/encoding.php | 552 ++++++ tests/simpletest/errors.php | 288 +++ tests/simpletest/exceptions.php | 198 ++ tests/simpletest/expectation.php | 895 +++++++++ .../simpletest/extensions/pear_test_case.php | 198 ++ .../extensions/phpunit_test_case.php | 96 + tests/simpletest/extensions/testdox.php | 42 + tests/simpletest/extensions/testdox/test.php | 108 ++ tests/simpletest/form.php | 355 ++++ tests/simpletest/frames.php | 596 ++++++ tests/simpletest/http.php | 624 +++++++ tests/simpletest/invoker.php | 139 ++ tests/simpletest/mock_objects.php | 1581 ++++++++++++++++ tests/simpletest/page.php | 983 ++++++++++ tests/simpletest/parser.php | 764 ++++++++ tests/simpletest/reflection_php4.php | 136 ++ tests/simpletest/reflection_php5.php | 380 ++++ tests/simpletest/remote.php | 117 ++ tests/simpletest/reporter.php | 447 +++++ tests/simpletest/scorer.php | 863 +++++++++ tests/simpletest/selector.php | 137 ++ tests/simpletest/shell_tester.php | 333 ++++ tests/simpletest/simpletest.php | 478 +++++ tests/simpletest/socket.php | 216 +++ tests/simpletest/tag.php | 1418 ++++++++++++++ tests/simpletest/test/acceptance_test.php | 1633 +++++++++++++++++ tests/simpletest/test/adapter_test.php | 77 + tests/simpletest/test/all_tests.php | 13 + tests/simpletest/test/authentication_test.php | 145 ++ tests/simpletest/test/autorun_test.php | 13 + tests/simpletest/test/bad_test_suite.php | 10 + tests/simpletest/test/browser_test.php | 779 ++++++++ tests/simpletest/test/collector_test.php | 51 + tests/simpletest/test/command_line_test.php | 40 + tests/simpletest/test/compatibility_test.php | 97 + tests/simpletest/test/cookies_test.php | 227 +++ tests/simpletest/test/detached_test.php | 15 + tests/simpletest/test/dumper_test.php | 88 + tests/simpletest/test/eclipse_test.php | 32 + tests/simpletest/test/encoding_test.php | 213 +++ tests/simpletest/test/errors_test.php | 300 +++ tests/simpletest/test/exceptions_test.php | 153 ++ tests/simpletest/test/expectation_test.php | 245 +++ tests/simpletest/test/form_test.php | 323 ++++ tests/simpletest/test/frames_test.php | 549 ++++++ tests/simpletest/test/http_test.php | 427 +++++ tests/simpletest/test/interfaces_test.php | 137 ++ tests/simpletest/test/live_test.php | 47 + tests/simpletest/test/mock_objects_test.php | 994 ++++++++++ tests/simpletest/test/page_test.php | 903 +++++++++ tests/simpletest/test/parse_error_test.php | 9 + tests/simpletest/test/parser_test.php | 551 ++++++ .../simpletest/test/reflection_php4_test.php | 61 + .../simpletest/test/reflection_php5_test.php | 271 +++ tests/simpletest/test/remote_test.php | 20 + tests/simpletest/test/shell_test.php | 38 + tests/simpletest/test/shell_tester_test.php | 42 + tests/simpletest/test/simpletest_test.php | 58 + tests/simpletest/test/socket_test.php | 25 + .../test/support/collector/collectable.1 | 0 .../test/support/collector/collectable.2 | 0 .../test/support/empty_test_file.php | 3 + tests/simpletest/test/support/latin1_sample | 1 + .../simpletest/test/support/spl_examples.php | 15 + .../support/supplementary_upload_sample.txt | 1 + tests/simpletest/test/support/test1.php | 7 + .../simpletest/test/support/upload_sample.txt | 1 + tests/simpletest/test/tag_test.php | 554 ++++++ .../simpletest/test/test_with_parse_error.php | 8 + tests/simpletest/test/unit_tester_test.php | 55 + tests/simpletest/test/unit_tests.php | 55 + tests/simpletest/test/url_test.php | 443 +++++ tests/simpletest/test/user_agent_test.php | 358 ++++ tests/simpletest/test/visual_test.php | 495 +++++ tests/simpletest/test/web_tester_test.php | 156 ++ tests/simpletest/test/xml_test.php | 187 ++ tests/simpletest/test_case.php | 708 +++++++ tests/simpletest/unit_tester.php | 420 +++++ tests/simpletest/url.php | 528 ++++++ tests/simpletest/user_agent.php | 332 ++++ tests/simpletest/web_tester.php | 1541 ++++++++++++++++ tests/simpletest/xml.php | 647 +++++++ 99 files changed, 31041 insertions(+) create mode 100644 tests/classes/context/Context.test.php create mode 100644 tests/index.php create mode 100644 tests/modules/module/module.test.php create mode 100644 tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE create mode 100644 tests/simpletest/LICENSE create mode 100644 tests/simpletest/README create mode 100644 tests/simpletest/VERSION create mode 100644 tests/simpletest/authentication.php create mode 100644 tests/simpletest/autorun.php create mode 100644 tests/simpletest/browser.php create mode 100644 tests/simpletest/collector.php create mode 100644 tests/simpletest/compatibility.php create mode 100644 tests/simpletest/cookies.php create mode 100644 tests/simpletest/default_reporter.php create mode 100644 tests/simpletest/detached.php create mode 100644 tests/simpletest/dumper.php create mode 100644 tests/simpletest/eclipse.php create mode 100644 tests/simpletest/encoding.php create mode 100644 tests/simpletest/errors.php create mode 100644 tests/simpletest/exceptions.php create mode 100644 tests/simpletest/expectation.php create mode 100644 tests/simpletest/extensions/pear_test_case.php create mode 100644 tests/simpletest/extensions/phpunit_test_case.php create mode 100644 tests/simpletest/extensions/testdox.php create mode 100644 tests/simpletest/extensions/testdox/test.php create mode 100644 tests/simpletest/form.php create mode 100644 tests/simpletest/frames.php create mode 100644 tests/simpletest/http.php create mode 100644 tests/simpletest/invoker.php create mode 100644 tests/simpletest/mock_objects.php create mode 100644 tests/simpletest/page.php create mode 100644 tests/simpletest/parser.php create mode 100644 tests/simpletest/reflection_php4.php create mode 100644 tests/simpletest/reflection_php5.php create mode 100644 tests/simpletest/remote.php create mode 100644 tests/simpletest/reporter.php create mode 100644 tests/simpletest/scorer.php create mode 100644 tests/simpletest/selector.php create mode 100644 tests/simpletest/shell_tester.php create mode 100644 tests/simpletest/simpletest.php create mode 100644 tests/simpletest/socket.php create mode 100644 tests/simpletest/tag.php create mode 100644 tests/simpletest/test/acceptance_test.php create mode 100644 tests/simpletest/test/adapter_test.php create mode 100644 tests/simpletest/test/all_tests.php create mode 100644 tests/simpletest/test/authentication_test.php create mode 100644 tests/simpletest/test/autorun_test.php create mode 100644 tests/simpletest/test/bad_test_suite.php create mode 100644 tests/simpletest/test/browser_test.php create mode 100644 tests/simpletest/test/collector_test.php create mode 100644 tests/simpletest/test/command_line_test.php create mode 100644 tests/simpletest/test/compatibility_test.php create mode 100644 tests/simpletest/test/cookies_test.php create mode 100644 tests/simpletest/test/detached_test.php create mode 100644 tests/simpletest/test/dumper_test.php create mode 100644 tests/simpletest/test/eclipse_test.php create mode 100644 tests/simpletest/test/encoding_test.php create mode 100644 tests/simpletest/test/errors_test.php create mode 100644 tests/simpletest/test/exceptions_test.php create mode 100644 tests/simpletest/test/expectation_test.php create mode 100644 tests/simpletest/test/form_test.php create mode 100644 tests/simpletest/test/frames_test.php create mode 100644 tests/simpletest/test/http_test.php create mode 100644 tests/simpletest/test/interfaces_test.php create mode 100644 tests/simpletest/test/live_test.php create mode 100644 tests/simpletest/test/mock_objects_test.php create mode 100644 tests/simpletest/test/page_test.php create mode 100644 tests/simpletest/test/parse_error_test.php create mode 100644 tests/simpletest/test/parser_test.php create mode 100644 tests/simpletest/test/reflection_php4_test.php create mode 100644 tests/simpletest/test/reflection_php5_test.php create mode 100644 tests/simpletest/test/remote_test.php create mode 100644 tests/simpletest/test/shell_test.php create mode 100644 tests/simpletest/test/shell_tester_test.php create mode 100644 tests/simpletest/test/simpletest_test.php create mode 100644 tests/simpletest/test/socket_test.php create mode 100644 tests/simpletest/test/support/collector/collectable.1 create mode 100644 tests/simpletest/test/support/collector/collectable.2 create mode 100644 tests/simpletest/test/support/empty_test_file.php create mode 100644 tests/simpletest/test/support/latin1_sample create mode 100644 tests/simpletest/test/support/spl_examples.php create mode 100644 tests/simpletest/test/support/supplementary_upload_sample.txt create mode 100644 tests/simpletest/test/support/test1.php create mode 100644 tests/simpletest/test/support/upload_sample.txt create mode 100644 tests/simpletest/test/tag_test.php create mode 100644 tests/simpletest/test/test_with_parse_error.php create mode 100644 tests/simpletest/test/unit_tester_test.php create mode 100644 tests/simpletest/test/unit_tests.php create mode 100644 tests/simpletest/test/url_test.php create mode 100644 tests/simpletest/test/user_agent_test.php create mode 100644 tests/simpletest/test/visual_test.php create mode 100644 tests/simpletest/test/web_tester_test.php create mode 100644 tests/simpletest/test/xml_test.php create mode 100644 tests/simpletest/test_case.php create mode 100644 tests/simpletest/unit_tester.php create mode 100644 tests/simpletest/url.php create mode 100644 tests/simpletest/user_agent.php create mode 100644 tests/simpletest/web_tester.php create mode 100644 tests/simpletest/xml.php diff --git a/tests/classes/context/Context.test.php b/tests/classes/context/Context.test.php new file mode 100644 index 000000000..b8415a044 --- /dev/null +++ b/tests/classes/context/Context.test.php @@ -0,0 +1,7 @@ +assertTrue(true); + } + } +?> diff --git a/tests/index.php b/tests/index.php new file mode 100644 index 000000000..13960f883 --- /dev/null +++ b/tests/index.php @@ -0,0 +1,17 @@ +init(); + + $this->TestSuite('XpressEngine Test'); + $this->addFile(dirname(__FILE__).'/classes/context/Context.test.php'); + $this->addFile(dirname(__FILE__).'/modules/module/module.test.php'); + } + } + +?> diff --git a/tests/modules/module/module.test.php b/tests/modules/module/module.test.php new file mode 100644 index 000000000..b72a6036c --- /dev/null +++ b/tests/modules/module/module.test.php @@ -0,0 +1,19 @@ +assertNotNull($oController); + $output = $oController->lock('lockTest', 60); + $this->assertTrue($output->toBool()); + $deadline = $output->get('deadline'); + $output2 = $oController->lock('lockTest', 60); + $this->assertFalse($output2->toBool()); + $output2 = $oController->unlock('lockTest', $deadline); + $this->assertTrue($output2->toBool()); + $output2 = $oController->lock('lockTest', 60); + $this->assertTrue($output2->toBool()); + $output2 = $oController->unlock('lockTest', $output2->get('deadline')); + $this->assertTrue($output2->toBool()); + } + } +?> diff --git a/tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE b/tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE new file mode 100644 index 000000000..8ac9cf2aa --- /dev/null +++ b/tests/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE @@ -0,0 +1,348 @@ +Simple Test interface changes +============================= +Because the SimpleTest tool set is still evolving it is likely that tests +written with earlier versions will fail with the newest ones. The most +dramatic changes are in the alpha releases. Here is a list of possible +problems and their fixes... + +No method getRelativeUrls() or getAbsoluteUrls() +------------------------------------------------ +These methods were always a bit weird anyway, and +the new parsing of the base tag makes them more so. +They have been replaced with getUrls() instead. If +you want the old functionality then simply chop +off the current domain from getUrl(). + +Method setWildcard() removed in mocks +------------------------------------- +Even setWildcard() has been removed in 1.0.1beta now. +If you want to test explicitely for a '*' string, then +simply pass in new IdenticalExpectation('*') instead. + +No method _getTest() on mocks +----------------------------- +This has finally been removed. It was a pretty esoteric +flex point anyway. It was there to allow the mocks to +work with other test tools, but no one does this. + +No method assertError(), assertNoErrors(), swallowErrors() +---------------------------------------------------------- +These have been deprecated in 1.0.1beta in favour of +expectError() and expectException(). assertNoErrors() is +redundant if you use expectError() as failures are now reported +immediately. + +No method TestCase::signal() +---------------------------- +This has been deprecated in favour of triggering an error or +throwing an exception. Deprecated as of 1.0.1beta. + +No method TestCase::sendMessage() +--------------------------------- +This has been deprecated as of 1.0.1beta. + +Failure to connect now emits failures +------------------------------------- +It used to be that you would have to use the +getTransferError() call on the web tester to see if +there was a socket level error in a fetch. This check +is now always carried out by the WebTestCase unless +the fetch is prefaced with WebTestCase::ignoreErrors(). +The ignore directive only lasts for test case fetching +action such as get() and click(). + +No method SimpleTestOptions::ignore() +------------------------------------- +This is deprecated in version 1.0.1beta and has been moved +to SimpleTest::ignore() as that is more readable. In +addition, parent classes are also ignored automatically. +If you are using PHP5 you can skip this directive simply +by marking your test case as abstract. + +No method assertCopy() +---------------------- +This is deprecated in 1.0.1 in favour of assertClone(). +The assertClone() method is slightly different in that +the objects must be identical, but without being a +reference. It is thus not a strict inversion of +assertReference(). + +Constructor wildcard override has no effect in mocks +---------------------------------------------------- +As of 1.0.1beta this is now set with setWildcard() instead +of in the constructor. + +No methods setStubBaseClass()/getStubBaseClass() +------------------------------------------------ +As mocks are now used instead of stubs, these methods +stopped working and are now removed as of the 1.0.1beta +release. The mock objects may be freely used instead. + +No method addPartialMockCode() +------------------------------ +The ability to insert arbitrary partial mock code +has been removed. This was a low value feature +causing needless complications. It was removed +in the 1.0.1beta release. + +No method setMockBaseClass() +---------------------------- +The ability to change the mock base class has been +scheduled for removal and is deprecated since the +1.0.1beta version. This was a rarely used feature +except as a workaround for PHP5 limitations. As +these limitations are being resolved it's hoped +that the bundled mocks can be used directly. + +No class Stub +------------- +Server stubs are deprecated from 1.0.1 as the mocks now +have exactly the same interface. Just use mock objects +instead. + +No class SimpleTestOptions +-------------------------- +This was replced by the shorter SimpleTest in 1.0.1beta1 +and is since deprecated. + +No file simple_test.php +----------------------- +This was renamed test_case.php in 1.0.1beta to more accurately +reflect it's purpose. This file should never be directly +included in test suites though, as it's part of the +underlying mechanics and has a tendency to be refactored. + +No class WantedPatternExpectation +--------------------------------- +This was deprecated in 1.0.1alpha in favour of the simpler +name PatternExpectation. + +No class NoUnwantedPatternExpectation +------------------------------------- +This was deprecated in 1.0.1alpha in favour of the simpler +name NoPatternExpectation. + +No method assertNoUnwantedPattern() +----------------------------------- +This has been renamed to assertNoPattern() in 1.0.1alpha and +the old form is deprecated. + +No method assertWantedPattern() +------------------------------- +This has been renamed to assertPattern() in 1.0.1alpha and +the old form is deprecated. + +No method assertExpectation() +----------------------------- +This was renamed as assert() in 1.0.1alpha and the old form +has been deprecated. + +No class WildcardExpectation +---------------------------- +This was a mostly internal class for the mock objects. It was +renamed AnythingExpectation to bring it closer to JMock and +NMock in version 1.0.1alpha. + +Missing UnitTestCase::assertErrorPattern() +------------------------------------------ +This method is deprecated for version 1.0.1 onwards. +This method has been subsumed by assertError() that can now +take an expectation. Simply pass a PatternExpectation +into assertError() to simulate the old behaviour. + +No HTML when matching page elements +----------------------------------- +This behaviour has been switched to using plain text as if it +were seen by the user of the browser. This means that HTML tags +are suppressed, entities are converted and whitespace is +normalised. This should make it easier to match items in forms. +Also images are replaced with their "alt" text so that they +can be matched as well. + +No method SimpleRunner::_getTestCase() +-------------------------------------- +This was made public as getTestCase() in 1.0RC2. + +No method restartSession() +-------------------------- +This was renamed to restart() in the WebTestCase, SimpleBrowser +and the underlying SimpleUserAgent in 1.0RC2. Because it was +undocumented anyway, no attempt was made at backward +compatibility. + +My custom test case ignored by tally() +-------------------------------------- +The _assertTrue method has had it's signature changed due to a bug +in the PHP 5.0.1 release. You must now use getTest() from within +that method to get the test case. Mock compatibility with other +unit testers is now deprecated as of 1.0.1alpha as PEAR::PHPUnit2 +should soon have mock support of it's own. + +Broken code extending SimpleRunner +---------------------------------- +This was replaced with SimpleScorer so that I could use the runner +name in another class. This happened in RC1 development and there +is no easy backward compatibility fix. The solution is simply to +extend SimpleScorer instead. + +Missing method getBaseCookieValue() +----------------------------------- +This was renamed getCurrentCookieValue() in RC1. + +Missing files from the SimpleTest suite +--------------------------------------- +Versions of SimpleTest prior to Beta6 required a SIMPLE_TEST constant +to point at the SimpleTest folder location before any of the toolset +was loaded. This is no longer documented as it is now unnecessary +for later versions. If you are using an earlier version you may +need this constant. Consult the documentation that was bundled with +the release that you are using or upgrade to Beta6 or later. + +No method SimpleBrowser::getCurrentUrl() +-------------------------------------- +This is replaced with the more versatile showRequest() for +debugging. It only existed in this context for version Beta5. +Later versions will have SimpleBrowser::getHistory() for tracking +paths through pages. It is renamed as getUrl() since 1.0RC1. + +No method Stub::setStubBaseClass() +---------------------------------- +This method has finally been removed in 1.0RC1. Use +SimpleTestOptions::setStubBaseClass() instead. + +No class CommandLineReporter +---------------------------- +This was renamed to TextReporter in Beta3 and the deprecated version +was removed in 1.0RC1. + +No method requireReturn() +------------------------- +This was deprecated in Beta3 and is now removed. + +No method expectCookie() +------------------------ +This method was abruptly removed in Beta4 so as to simplify the internals +until another mechanism can replace it. As a workaround it is necessary +to assert that the cookie has changed by setting it before the page +fetch and then assert the desired value. + +No method clickSubmitByFormId() +------------------------------- +This method had an incorrect name as no button was involved. It was +renamed to submitByFormId() in Beta4 and the old version deprecated. +Now removed. + +No method paintStart() or paintEnd() +------------------------------------ +You should only get this error if you have subclassed the lower level +reporting and test runner machinery. These methods have been broken +down into events for test methods, events for test cases and events +for group tests. The new methods are... + +paintStart() --> paintMethodStart(), paintCaseStart(), paintGroupStart() +paintEnd() --> paintMethodEnd(), paintCaseEnd(), paintGroupEnd() + +This change was made in Beta3, ironically to make it easier to subclass +the inner machinery. Simply duplicating the code you had in the previous +methods should provide a temporary fix. + +No class TestDisplay +-------------------- +This has been folded into SimpleReporter in Beta3 and is now deprecated. +It was removed in RC1. + +No method WebTestCase::fetch() +------------------------------ +This was renamed get() in Alpha8. It is removed in Beta3. + +No method submit() +------------------ +This has been renamed clickSubmit() in Beta1. The old method was +removed in Beta2. + +No method clearHistory() +------------------------ +This method is deprecated in Beta2 and removed in RC1. + +No method getCallCount() +------------------------ +This method has been deprecated since Beta1 and has now been +removed. There are now more ways to set expectations on counts +and so this method should be unecessery. Removed in RC1. + +Cannot find file * +------------------ +The following public name changes have occoured... + +simple_html_test.php --> reporter.php +simple_mock.php --> mock_objects.php +simple_unit.php --> unit_tester.php +simple_web.php --> web_tester.php + +The old names were deprecated in Alpha8 and removed in Beta1. + +No method attachObserver() +-------------------------- +Prior to the Alpha8 release the old internal observer pattern was +gutted and replaced with a visitor. This is to trade flexibility of +test case expansion against the ease of writing user interfaces. + +Code such as... + +$test = &new MyTestCase(); +$test->attachObserver(new TestHtmlDisplay()); +$test->run(); + +...should be rewritten as... + +$test = &new MyTestCase(); +$test->run(new HtmlReporter()); + +If you previously attached multiple observers then the workaround +is to run the tests twice, once with each, until they can be combined. +For one observer the old method is simulated in Alpha 8, but is +removed in Beta1. + +No class TestHtmlDisplay +------------------------ +This class has been renamed to HtmlReporter in Alpha8. It is supported, +but deprecated in Beta1 and removed in Beta2. If you have subclassed +the display for your own design, then you will have to extend this +class (HtmlReporter) instead. + +If you have accessed the event queue by overriding the notify() method +then I am afraid you are in big trouble :(. The reporter is now +carried around the test suite by the runner classes and the methods +called directly. In the unlikely event that this is a problem and +you don't want to upgrade the test tool then simplest is to write your +own runner class and invoke the tests with... + +$test->accept(new MyRunner(new MyReporter())); + +...rather than the run method. This should be easier to extend +anyway and gives much more control. Even this method is overhauled +in Beta3 where the runner class can be set within the test case. Really +the best thing to do is to upgrade to this version as whatever you were +trying to achieve before should now be very much easier. + +Missing set options method +-------------------------- +All test suite options are now in one class called SimpleTestOptions. +This means that options are set differently... + +GroupTest::ignore() --> SimpleTestOptions::ignore() +Mock::setMockBaseClass() --> SimpleTestOptions::setMockBaseClass() + +These changed in Alpha8 and the old versions are now removed in RC1. + +No method setExpected*() +------------------------ +The mock expectations changed their names in Alpha4 and the old names +ceased to be supported in Alpha8. The changes are... + +setExpectedArguments() --> expectArguments() +setExpectedArgumentsSequence() --> expectArgumentsAt() +setExpectedCallCount() --> expectCallCount() +setMaximumCallCount() --> expectMaximumCallCount() + +The parameters remained the same. diff --git a/tests/simpletest/LICENSE b/tests/simpletest/LICENSE new file mode 100644 index 000000000..09f465ab7 --- /dev/null +++ b/tests/simpletest/LICENSE @@ -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. + + + Copyright (C) + + 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. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/tests/simpletest/README b/tests/simpletest/README new file mode 100644 index 000000000..c52e3f7ed --- /dev/null +++ b/tests/simpletest/README @@ -0,0 +1,108 @@ +SimpleTest +========== +You probably got this package from... +http://simpletest.sourceforge.net/projects/simpletest/ + +If there is no licence agreement with this package please download +a version from the location above. You must read and accept that +licence to use this software. The file is titled simply LICENSE. + +What is it? It's a framework for unit testing, web site testing and +mock objects for PHP 4.2.0+ (and PHP 5.0 to 5.3 without E_STRICT). + +If you have used JUnit, you will find this PHP unit testing version very +similar. Also included is a mock objects and server stubs generator. +The stubs can have return values set for different arguments, can have +sequences set also by arguments and can return items by reference. +The mocks inherit all of this functionality and can also have +expectations set, again in sequences and for different arguments. + +A web tester similar in concept to JWebUnit is also included. There is no +JavaScript or tables support, but forms, authentication, cookies and +frames are handled. + +You can see a release schedule at http://www.lastcraft.com/overview.php +which is also copied to the documentation folder with this release. +A full PHPDocumenter API documentation exists at +http://simpletest.sourceforge.net/. + +The user interface is minimal +in the extreme, but a lot of information flows from the test suite. +After version 1.0 we will release a better web UI, but we are leaving XUL +and GTk versions to volunteers as everybody has their own opinion +on a good GUI, and we don't want to discourage development by shipping +one with the toolkit. YOucan download an Eclipse plug-in separately. + +You are looking at a second full release. The unit tests for SimpleTest +itself can be run here... + +simpletest/test/unit_tests.php + +And tests involving live network connections as well are here... + +simpletest/test/all_tests.php + +The full tests will typically overrun the 8Mb limit often allowed +to a PHP process. A workaround is to run the tests on the command +with a custom php.ini file if you do not have access to your server +version. + +You will have to edit the all_tests.php file if you are accesssing +the internet through a proxy server. See the comments in all_tests.php +for instructions. + +The full tests read some test data from the LastCraft site. If the site +is down or has been modified for a later version then you will get +spurious errors. A unit_tests.php failure on the other hand would be +very serious. As far as we know we haven't yet managed to check in any +unit test failures, so please correct us if you find one. + +Even if all of the tests run please verify that your existing test suites +also function as expected. If they don't see the file... + +HELP_MY_TESTS_DONT_WORK_ANYMORE + +This contains information on interface changes. It also points out +deprecated interfaces, so you should read this even if all of +your current tests appear to run. + +There is a documentation folder which contains the core reference information +in English and French, although this information is fairly basic. +You can find a tutorial on... + +http://www.lastcraft.com/first_test_tutorial.php + +...to get you started and this material will eventually become included +with the project documentation. A French translation exists at... + +http://www.onpk.net/index.php/2005/01/12/254-tutoriel-simpletest-decouvrir-les-tests-unitaires. + +If you download and use, and possibly even extend this tool, please let us +know. Any feedback, even bad, is always welcome and we will work to get +your suggestions into the next release. Ideally please send your +comments to... + +simpletest-support@lists.sourceforge.net + +...so that others can read them too. We usually try to respond within 48 +hours. + +There is no change log except at Sourceforge. You can visit the +release notes to see the completed TODO list after each cycle and also the +status of any bugs, but if the bug is recent then it will be fixed in SVN only. +The SVN check-ins always have all the tests passing and so SVN snapshots should +be pretty usable, although the code may not look so good internally. + +Oh, yes. It is called "Simple" because it should be simple to +use. We intend to add a complete set of tools for a test first +and "test as you code" type of development. "Simple" does not +mean "Lite" in this context. + +Thanks to everyone who has sent comments and offered suggestions. They +really are invaluable, but sadly you are too many to mention in full. +Thanks to all on the advanced PHP forum on SitePoint, especially Harry +Feucks. Early adopters are always an inspiration. + +Marcus Baker, Jason Sweat, Travis Swicegood, Perrick Penet and Edward Z. Yang. +-- +marcus@lastcraft.com diff --git a/tests/simpletest/VERSION b/tests/simpletest/VERSION new file mode 100644 index 000000000..7f207341d --- /dev/null +++ b/tests/simpletest/VERSION @@ -0,0 +1 @@ +1.0.1 \ No newline at end of file diff --git a/tests/simpletest/authentication.php b/tests/simpletest/authentication.php new file mode 100644 index 000000000..c56d11bbb --- /dev/null +++ b/tests/simpletest/authentication.php @@ -0,0 +1,238 @@ +_type = $type; + $this->_root = $url->getBasePath(); + $this->_username = false; + $this->_password = false; + } + + /** + * Adds another location to the realm. + * @param SimpleUrl $url Somewhere in realm. + * @access public + */ + function stretch($url) { + $this->_root = $this->_getCommonPath($this->_root, $url->getPath()); + } + + /** + * Finds the common starting path. + * @param string $first Path to compare. + * @param string $second Path to compare. + * @return string Common directories. + * @access private + */ + function _getCommonPath($first, $second) { + $first = explode('/', $first); + $second = explode('/', $second); + for ($i = 0; $i < min(count($first), count($second)); $i++) { + if ($first[$i] != $second[$i]) { + return implode('/', array_slice($first, 0, $i)) . '/'; + } + } + return implode('/', $first) . '/'; + } + + /** + * Sets the identity to try within this realm. + * @param string $username Username in authentication dialog. + * @param string $username Password in authentication dialog. + * @access public + */ + function setIdentity($username, $password) { + $this->_username = $username; + $this->_password = $password; + } + + /** + * Accessor for current identity. + * @return string Last succesful username. + * @access public + */ + function getUsername() { + return $this->_username; + } + + /** + * Accessor for current identity. + * @return string Last succesful password. + * @access public + */ + function getPassword() { + return $this->_password; + } + + /** + * Test to see if the URL is within the directory + * tree of the realm. + * @param SimpleUrl $url URL to test. + * @return boolean True if subpath. + * @access public + */ + function isWithin($url) { + if ($this->_isIn($this->_root, $url->getBasePath())) { + return true; + } + if ($this->_isIn($this->_root, $url->getBasePath() . $url->getPage() . '/')) { + return true; + } + return false; + } + + /** + * Tests to see if one string is a substring of + * another. + * @param string $part Small bit. + * @param string $whole Big bit. + * @return boolean True if the small bit is + * in the big bit. + * @access private + */ + function _isIn($part, $whole) { + return strpos($whole, $part) === 0; + } +} + +/** + * Manages security realms. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleAuthenticator { + var $_realms; + + /** + * Clears the realms. + * @access public + */ + function SimpleAuthenticator() { + $this->restartSession(); + } + + /** + * Starts with no realms set up. + * @access public + */ + function restartSession() { + $this->_realms = array(); + } + + /** + * Adds a new realm centered the current URL. + * Browsers vary wildly on their behaviour in this + * regard. Mozilla ignores the realm and presents + * only when challenged, wasting bandwidth. IE + * just carries on presenting until a new challenge + * occours. SimpleTest tries to follow the spirit of + * the original standards committee and treats the + * base URL as the root of a file tree shaped realm. + * @param SimpleUrl $url Base of realm. + * @param string $type Authentication type for this + * realm. Only Basic authentication + * is currently supported. + * @param string $realm Name of realm. + * @access public + */ + function addRealm($url, $type, $realm) { + $this->_realms[$url->getHost()][$realm] = new SimpleRealm($type, $url); + } + + /** + * Sets the current identity to be presented + * against that realm. + * @param string $host Server hosting realm. + * @param string $realm Name of realm. + * @param string $username Username for realm. + * @param string $password Password for realm. + * @access public + */ + function setIdentityForRealm($host, $realm, $username, $password) { + if (isset($this->_realms[$host][$realm])) { + $this->_realms[$host][$realm]->setIdentity($username, $password); + } + } + + /** + * Finds the name of the realm by comparing URLs. + * @param SimpleUrl $url URL to test. + * @return SimpleRealm Name of realm. + * @access private + */ + function _findRealmFromUrl($url) { + if (! isset($this->_realms[$url->getHost()])) { + return false; + } + foreach ($this->_realms[$url->getHost()] as $name => $realm) { + if ($realm->isWithin($url)) { + return $realm; + } + } + return false; + } + + /** + * Presents the appropriate headers for this location. + * @param SimpleHttpRequest $request Request to modify. + * @param SimpleUrl $url Base of realm. + * @access public + */ + function addHeaders(&$request, $url) { + if ($url->getUsername() && $url->getPassword()) { + $username = $url->getUsername(); + $password = $url->getPassword(); + } elseif ($realm = $this->_findRealmFromUrl($url)) { + $username = $realm->getUsername(); + $password = $realm->getPassword(); + } else { + return; + } + $this->addBasicHeaders($request, $username, $password); + } + + /** + * Presents the appropriate headers for this + * location for basic authentication. + * @param SimpleHttpRequest $request Request to modify. + * @param string $username Username for realm. + * @param string $password Password for realm. + * @access public + * @static + */ + function addBasicHeaders(&$request, $username, $password) { + if ($username && $password) { + $request->addHeaderLine( + 'Authorization: Basic ' . base64_encode("$username:$password")); + } + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/autorun.php b/tests/simpletest/autorun.php new file mode 100644 index 000000000..7d97d2d7f --- /dev/null +++ b/tests/simpletest/autorun.php @@ -0,0 +1,87 @@ +createSuiteFromClasses( + basename(initial_file()), + $loader->selectRunnableTests($candidates)); + $result = $suite->run(new DefaultReporter()); + if (SimpleReporter::inCli()) { + exit($result ? 0 : 1); + } +} + +/** + * Checks the current test context to see if a test has + * ever been run. + * @return boolean True if tests have run. + */ +function tests_have_run() { + if ($context = SimpleTest::getContext()) { + return (boolean)$context->getTest(); + } + return false; +} + +/** + * The first autorun file. + * @return string Filename of first autorun script. + */ +function initial_file() { + static $file = false; + if (! $file) { + $file = reset(get_included_files()); + } + return $file; +} + +/** + * Just the classes from the first autorun script. May + * get a few false positives, as it just does a regex based + * on following the word "class". + * @return array List of all possible classes in first + * autorun script. + */ +function classes_defined_in_initial_file() { + if (preg_match_all('/\bclass\s+(\w+)/i', file_get_contents(initial_file()), $matches)) { + return array_map('strtolower', $matches[1]); + } + return array(); +} + +/** + * Every class since the first autorun include. This + * is safe enough if require_once() is alwyas used. + * @return array Class names. + */ +function capture_new_classes() { + global $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES; + return array_map('strtolower', array_diff(get_declared_classes(), + $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES ? + $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES : array())); +} +?> \ No newline at end of file diff --git a/tests/simpletest/browser.php b/tests/simpletest/browser.php new file mode 100644 index 000000000..e2a1fe1d6 --- /dev/null +++ b/tests/simpletest/browser.php @@ -0,0 +1,1098 @@ +_sequence = array(); + $this->_position = -1; + } + + /** + * Test for no entries yet. + * @return boolean True if empty. + * @access private + */ + function _isEmpty() { + return ($this->_position == -1); + } + + /** + * Test for being at the beginning. + * @return boolean True if first. + * @access private + */ + function _atBeginning() { + return ($this->_position == 0) && ! $this->_isEmpty(); + } + + /** + * Test for being at the last entry. + * @return boolean True if last. + * @access private + */ + function _atEnd() { + return ($this->_position + 1 >= count($this->_sequence)) && ! $this->_isEmpty(); + } + + /** + * Adds a successfully fetched page to the history. + * @param SimpleUrl $url URL of fetch. + * @param SimpleEncoding $parameters Any post data with the fetch. + * @access public + */ + function recordEntry($url, $parameters) { + $this->_dropFuture(); + array_push( + $this->_sequence, + array('url' => $url, 'parameters' => $parameters)); + $this->_position++; + } + + /** + * Last fully qualified URL for current history + * position. + * @return SimpleUrl URL for this position. + * @access public + */ + function getUrl() { + if ($this->_isEmpty()) { + return false; + } + return $this->_sequence[$this->_position]['url']; + } + + /** + * Parameters of last fetch from current history + * position. + * @return SimpleFormEncoding Post parameters. + * @access public + */ + function getParameters() { + if ($this->_isEmpty()) { + return false; + } + return $this->_sequence[$this->_position]['parameters']; + } + + /** + * Step back one place in the history. Stops at + * the first page. + * @return boolean True if any previous entries. + * @access public + */ + function back() { + if ($this->_isEmpty() || $this->_atBeginning()) { + return false; + } + $this->_position--; + return true; + } + + /** + * Step forward one place. If already at the + * latest entry then nothing will happen. + * @return boolean True if any future entries. + * @access public + */ + function forward() { + if ($this->_isEmpty() || $this->_atEnd()) { + return false; + } + $this->_position++; + return true; + } + + /** + * Ditches all future entries beyond the current + * point. + * @access private + */ + function _dropFuture() { + if ($this->_isEmpty()) { + return; + } + while (! $this->_atEnd()) { + array_pop($this->_sequence); + } + } +} + +/** + * Simulated web browser. This is an aggregate of + * the user agent, the HTML parsing, request history + * and the last header set. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleBrowser { + var $_user_agent; + var $_page; + var $_history; + var $_ignore_frames; + var $_maximum_nested_frames; + + /** + * Starts with a fresh browser with no + * cookie or any other state information. The + * exception is that a default proxy will be + * set up if specified in the options. + * @access public + */ + function SimpleBrowser() { + $this->_user_agent = &$this->_createUserAgent(); + $this->_user_agent->useProxy( + SimpleTest::getDefaultProxy(), + SimpleTest::getDefaultProxyUsername(), + SimpleTest::getDefaultProxyPassword()); + $this->_page = &new SimplePage(); + $this->_history = &$this->_createHistory(); + $this->_ignore_frames = false; + $this->_maximum_nested_frames = DEFAULT_MAX_NESTED_FRAMES; + } + + /** + * Creates the underlying user agent. + * @return SimpleFetcher Content fetcher. + * @access protected + */ + function &_createUserAgent() { + $user_agent = &new SimpleUserAgent(); + return $user_agent; + } + + /** + * Creates a new empty history list. + * @return SimpleBrowserHistory New list. + * @access protected + */ + function &_createHistory() { + $history = &new SimpleBrowserHistory(); + return $history; + } + + /** + * Disables frames support. Frames will not be fetched + * and the frameset page will be used instead. + * @access public + */ + function ignoreFrames() { + $this->_ignore_frames = true; + } + + /** + * Enables frames support. Frames will be fetched from + * now on. + * @access public + */ + function useFrames() { + $this->_ignore_frames = false; + } + + /** + * Switches off cookie sending and recieving. + * @access public + */ + function ignoreCookies() { + $this->_user_agent->ignoreCookies(); + } + + /** + * Switches back on the cookie sending and recieving. + * @access public + */ + function useCookies() { + $this->_user_agent->useCookies(); + } + + /** + * Parses the raw content into a page. Will load further + * frame pages unless frames are disabled. + * @param SimpleHttpResponse $response Response from fetch. + * @param integer $depth Nested frameset depth. + * @return SimplePage Parsed HTML. + * @access private + */ + function &_parse($response, $depth = 0) { + $page = &$this->_buildPage($response); + if ($this->_ignore_frames || ! $page->hasFrames() || ($depth > $this->_maximum_nested_frames)) { + return $page; + } + $frameset = &new SimpleFrameset($page); + foreach ($page->getFrameset() as $key => $url) { + $frame = &$this->_fetch($url, new SimpleGetEncoding(), $depth + 1); + $frameset->addFrame($frame, $key); + } + return $frameset; + } + + /** + * Assembles the parsing machinery and actually parses + * a single page. Frees all of the builder memory and so + * unjams the PHP memory management. + * @param SimpleHttpResponse $response Response from fetch. + * @return SimplePage Parsed top level page. + * @access protected + */ + function &_buildPage($response) { + $builder = &new SimplePageBuilder(); + $page = &$builder->parse($response); + $builder->free(); + unset($builder); + return $page; + } + + /** + * Fetches a page. Jointly recursive with the _parse() + * method as it descends a frameset. + * @param string/SimpleUrl $url Target to fetch. + * @param SimpleEncoding $encoding GET/POST parameters. + * @param integer $depth Nested frameset depth protection. + * @return SimplePage Parsed page. + * @access private + */ + function &_fetch($url, $encoding, $depth = 0) { + $response = &$this->_user_agent->fetchResponse($url, $encoding); + if ($response->isError()) { + $page = &new SimplePage($response); + } else { + $page = &$this->_parse($response, $depth); + } + return $page; + } + + /** + * Fetches a page or a single frame if that is the current + * focus. + * @param SimpleUrl $url Target to fetch. + * @param SimpleEncoding $parameters GET/POST parameters. + * @return string Raw content of page. + * @access private + */ + function _load($url, $parameters) { + $frame = $url->getTarget(); + if (! $frame || ! $this->_page->hasFrames() || (strtolower($frame) == '_top')) { + return $this->_loadPage($url, $parameters); + } + return $this->_loadFrame(array($frame), $url, $parameters); + } + + /** + * Fetches a page and makes it the current page/frame. + * @param string/SimpleUrl $url Target to fetch as string. + * @param SimplePostEncoding $parameters POST parameters. + * @return string Raw content of page. + * @access private + */ + function _loadPage($url, $parameters) { + $this->_page = &$this->_fetch($url, $parameters); + $this->_history->recordEntry( + $this->_page->getUrl(), + $this->_page->getRequestData()); + return $this->_page->getRaw(); + } + + /** + * Fetches a frame into the existing frameset replacing the + * original. + * @param array $frames List of names to drill down. + * @param string/SimpleUrl $url Target to fetch as string. + * @param SimpleFormEncoding $parameters POST parameters. + * @return string Raw content of page. + * @access private + */ + function _loadFrame($frames, $url, $parameters) { + $page = &$this->_fetch($url, $parameters); + $this->_page->setFrame($frames, $page); + return $page->getRaw(); + } + + /** + * Removes expired and temporary cookies as if + * the browser was closed and re-opened. + * @param string/integer $date Time when session restarted. + * If omitted then all persistent + * cookies are kept. + * @access public + */ + function restart($date = false) { + $this->_user_agent->restart($date); + } + + /** + * Adds a header to every fetch. + * @param string $header Header line to add to every + * request until cleared. + * @access public + */ + function addHeader($header) { + $this->_user_agent->addHeader($header); + } + + /** + * Ages the cookies by the specified time. + * @param integer $interval Amount in seconds. + * @access public + */ + function ageCookies($interval) { + $this->_user_agent->ageCookies($interval); + } + + /** + * Sets an additional cookie. If a cookie has + * the same name and path it is replaced. + * @param string $name Cookie key. + * @param string $value Value of cookie. + * @param string $host Host upon which the cookie is valid. + * @param string $path Cookie path if not host wide. + * @param string $expiry Expiry date. + * @access public + */ + function setCookie($name, $value, $host = false, $path = '/', $expiry = false) { + $this->_user_agent->setCookie($name, $value, $host, $path, $expiry); + } + + /** + * Reads the most specific cookie value from the + * browser cookies. + * @param string $host Host to search. + * @param string $path Applicable path. + * @param string $name Name of cookie to read. + * @return string False if not present, else the + * value as a string. + * @access public + */ + function getCookieValue($host, $path, $name) { + return $this->_user_agent->getCookieValue($host, $path, $name); + } + + /** + * Reads the current cookies for the current URL. + * @param string $name Key of cookie to find. + * @return string Null if there is no current URL, false + * if the cookie is not set. + * @access public + */ + function getCurrentCookieValue($name) { + return $this->_user_agent->getBaseCookieValue($name, $this->_page->getUrl()); + } + + /** + * Sets the maximum number of redirects before + * a page will be loaded anyway. + * @param integer $max Most hops allowed. + * @access public + */ + function setMaximumRedirects($max) { + $this->_user_agent->setMaximumRedirects($max); + } + + /** + * Sets the maximum number of nesting of framed pages + * within a framed page to prevent loops. + * @param integer $max Highest depth allowed. + * @access public + */ + function setMaximumNestedFrames($max) { + $this->_maximum_nested_frames = $max; + } + + /** + * Sets the socket timeout for opening a connection. + * @param integer $timeout Maximum time in seconds. + * @access public + */ + function setConnectionTimeout($timeout) { + $this->_user_agent->setConnectionTimeout($timeout); + } + + /** + * Sets proxy to use on all requests for when + * testing from behind a firewall. Set URL + * to false to disable. + * @param string $proxy Proxy URL. + * @param string $username Proxy username for authentication. + * @param string $password Proxy password for authentication. + * @access public + */ + function useProxy($proxy, $username = false, $password = false) { + $this->_user_agent->useProxy($proxy, $username, $password); + } + + /** + * Fetches the page content with a HEAD request. + * Will affect cookies, but will not change the base URL. + * @param string/SimpleUrl $url Target to fetch as string. + * @param hash/SimpleHeadEncoding $parameters Additional parameters for + * HEAD request. + * @return boolean True if successful. + * @access public + */ + function head($url, $parameters = false) { + if (! is_object($url)) { + $url = new SimpleUrl($url); + } + if ($this->getUrl()) { + $url = $url->makeAbsolute($this->getUrl()); + } + $response = &$this->_user_agent->fetchResponse($url, new SimpleHeadEncoding($parameters)); + return ! $response->isError(); + } + + /** + * Fetches the page content with a simple GET request. + * @param string/SimpleUrl $url Target to fetch. + * @param hash/SimpleFormEncoding $parameters Additional parameters for + * GET request. + * @return string Content of page or false. + * @access public + */ + function get($url, $parameters = false) { + if (! is_object($url)) { + $url = new SimpleUrl($url); + } + if ($this->getUrl()) { + $url = $url->makeAbsolute($this->getUrl()); + } + return $this->_load($url, new SimpleGetEncoding($parameters)); + } + + /** + * Fetches the page content with a POST request. + * @param string/SimpleUrl $url Target to fetch as string. + * @param hash/SimpleFormEncoding $parameters POST parameters. + * @return string Content of page. + * @access public + */ + function post($url, $parameters = false) { + if (! is_object($url)) { + $url = new SimpleUrl($url); + } + if ($this->getUrl()) { + $url = $url->makeAbsolute($this->getUrl()); + } + return $this->_load($url, new SimplePostEncoding($parameters)); + } + + /** + * Equivalent to hitting the retry button on the + * browser. Will attempt to repeat the page fetch. If + * there is no history to repeat it will give false. + * @return string/boolean Content if fetch succeeded + * else false. + * @access public + */ + function retry() { + $frames = $this->_page->getFrameFocus(); + if (count($frames) > 0) { + $this->_loadFrame( + $frames, + $this->_page->getUrl(), + $this->_page->getRequestData()); + return $this->_page->getRaw(); + } + if ($url = $this->_history->getUrl()) { + $this->_page = &$this->_fetch($url, $this->_history->getParameters()); + return $this->_page->getRaw(); + } + return false; + } + + /** + * Equivalent to hitting the back button on the + * browser. The browser history is unchanged on + * failure. The page content is refetched as there + * is no concept of content caching in SimpleTest. + * @return boolean True if history entry and + * fetch succeeded + * @access public + */ + function back() { + if (! $this->_history->back()) { + return false; + } + $content = $this->retry(); + if (! $content) { + $this->_history->forward(); + } + return $content; + } + + /** + * Equivalent to hitting the forward button on the + * browser. The browser history is unchanged on + * failure. The page content is refetched as there + * is no concept of content caching in SimpleTest. + * @return boolean True if history entry and + * fetch succeeded + * @access public + */ + function forward() { + if (! $this->_history->forward()) { + return false; + } + $content = $this->retry(); + if (! $content) { + $this->_history->back(); + } + return $content; + } + + /** + * Retries a request after setting the authentication + * for the current realm. + * @param string $username Username for realm. + * @param string $password Password for realm. + * @return boolean True if successful fetch. Note + * that authentication may still have + * failed. + * @access public + */ + function authenticate($username, $password) { + if (! $this->_page->getRealm()) { + return false; + } + $url = $this->_page->getUrl(); + if (! $url) { + return false; + } + $this->_user_agent->setIdentity( + $url->getHost(), + $this->_page->getRealm(), + $username, + $password); + return $this->retry(); + } + + /** + * Accessor for a breakdown of the frameset. + * @return array Hash tree of frames by name + * or index if no name. + * @access public + */ + function getFrames() { + return $this->_page->getFrames(); + } + + /** + * Accessor for current frame focus. Will be + * false if no frame has focus. + * @return integer/string/boolean Label if any, otherwise + * the position in the frameset + * or false if none. + * @access public + */ + function getFrameFocus() { + return $this->_page->getFrameFocus(); + } + + /** + * Sets the focus by index. The integer index starts from 1. + * @param integer $choice Chosen frame. + * @return boolean True if frame exists. + * @access public + */ + function setFrameFocusByIndex($choice) { + return $this->_page->setFrameFocusByIndex($choice); + } + + /** + * Sets the focus by name. + * @param string $name Chosen frame. + * @return boolean True if frame exists. + * @access public + */ + function setFrameFocus($name) { + return $this->_page->setFrameFocus($name); + } + + /** + * Clears the frame focus. All frames will be searched + * for content. + * @access public + */ + function clearFrameFocus() { + return $this->_page->clearFrameFocus(); + } + + /** + * Accessor for last error. + * @return string Error from last response. + * @access public + */ + function getTransportError() { + return $this->_page->getTransportError(); + } + + /** + * Accessor for current MIME type. + * @return string MIME type as string; e.g. 'text/html' + * @access public + */ + function getMimeType() { + return $this->_page->getMimeType(); + } + + /** + * Accessor for last response code. + * @return integer Last HTTP response code received. + * @access public + */ + function getResponseCode() { + return $this->_page->getResponseCode(); + } + + /** + * Accessor for last Authentication type. Only valid + * straight after a challenge (401). + * @return string Description of challenge type. + * @access public + */ + function getAuthentication() { + return $this->_page->getAuthentication(); + } + + /** + * Accessor for last Authentication realm. Only valid + * straight after a challenge (401). + * @return string Name of security realm. + * @access public + */ + function getRealm() { + return $this->_page->getRealm(); + } + + /** + * Accessor for current URL of page or frame if + * focused. + * @return string Location of current page or frame as + * a string. + */ + function getUrl() { + $url = $this->_page->getUrl(); + return $url ? $url->asString() : false; + } + + /** + * Accessor for base URL of page if set via BASE tag + * @return string base URL + */ + function getBaseUrl() { + $url = $this->_page->getBaseUrl(); + return $url ? $url->asString() : false; + } + + /** + * Accessor for raw bytes sent down the wire. + * @return string Original text sent. + * @access public + */ + function getRequest() { + return $this->_page->getRequest(); + } + + /** + * Accessor for raw header information. + * @return string Header block. + * @access public + */ + function getHeaders() { + return $this->_page->getHeaders(); + } + + /** + * Accessor for raw page information. + * @return string Original text content of web page. + * @access public + */ + function getContent() { + return $this->_page->getRaw(); + } + + /** + * Accessor for plain text version of the page. + * @return string Normalised text representation. + * @access public + */ + function getContentAsText() { + return $this->_page->getText(); + } + + /** + * Accessor for parsed title. + * @return string Title or false if no title is present. + * @access public + */ + function getTitle() { + return $this->_page->getTitle(); + } + + /** + * Accessor for a list of all links in current page. + * @return array List of urls with scheme of + * http or https and hostname. + * @access public + */ + function getUrls() { + return $this->_page->getUrls(); + } + + /** + * Sets all form fields with that name. + * @param string $label Name or label of field in forms. + * @param string $value New value of field. + * @return boolean True if field exists, otherwise false. + * @access public + */ + function setField($label, $value, $position=false) { + return $this->_page->setField(new SimpleByLabelOrName($label), $value, $position); + } + + /** + * Sets all form fields with that name. Will use label if + * one is available (not yet implemented). + * @param string $name Name of field in forms. + * @param string $value New value of field. + * @return boolean True if field exists, otherwise false. + * @access public + */ + function setFieldByName($name, $value, $position=false) { + return $this->_page->setField(new SimpleByName($name), $value, $position); + } + + /** + * Sets all form fields with that id attribute. + * @param string/integer $id Id of field in forms. + * @param string $value New value of field. + * @return boolean True if field exists, otherwise false. + * @access public + */ + function setFieldById($id, $value) { + return $this->_page->setField(new SimpleById($id), $value); + } + + /** + * Accessor for a form element value within the page. + * Finds the first match. + * @param string $label Field label. + * @return string/boolean A value if the field is + * present, false if unchecked + * and null if missing. + * @access public + */ + function getField($label) { + return $this->_page->getField(new SimpleByLabelOrName($label)); + } + + /** + * Accessor for a form element value within the page. + * Finds the first match. + * @param string $name Field name. + * @return string/boolean A string if the field is + * present, false if unchecked + * and null if missing. + * @access public + */ + function getFieldByName($name) { + return $this->_page->getField(new SimpleByName($name)); + } + + /** + * Accessor for a form element value within the page. + * @param string/integer $id Id of field in forms. + * @return string/boolean A string if the field is + * present, false if unchecked + * and null if missing. + * @access public + */ + function getFieldById($id) { + return $this->_page->getField(new SimpleById($id)); + } + + /** + * Clicks the submit button by label. The owning + * form will be submitted by this. + * @param string $label Button label. An unlabeled + * button can be triggered by 'Submit'. + * @param hash $additional Additional form data. + * @return string/boolean Page on success. + * @access public + */ + function clickSubmit($label = 'Submit', $additional = false) { + if (! ($form = &$this->_page->getFormBySubmit(new SimpleByLabel($label)))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submitButton(new SimpleByLabel($label), $additional)); + return ($success ? $this->getContent() : $success); + } + + /** + * Clicks the submit button by name attribute. The owning + * form will be submitted by this. + * @param string $name Button name. + * @param hash $additional Additional form data. + * @return string/boolean Page on success. + * @access public + */ + function clickSubmitByName($name, $additional = false) { + if (! ($form = &$this->_page->getFormBySubmit(new SimpleByName($name)))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submitButton(new SimpleByName($name), $additional)); + return ($success ? $this->getContent() : $success); + } + + /** + * Clicks the submit button by ID attribute of the button + * itself. The owning form will be submitted by this. + * @param string $id Button ID. + * @param hash $additional Additional form data. + * @return string/boolean Page on success. + * @access public + */ + function clickSubmitById($id, $additional = false) { + if (! ($form = &$this->_page->getFormBySubmit(new SimpleById($id)))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submitButton(new SimpleById($id), $additional)); + return ($success ? $this->getContent() : $success); + } + + /** + * Tests to see if a submit button exists with this + * label. + * @param string $label Button label. + * @return boolean True if present. + * @access public + */ + function isSubmit($label) { + return (boolean)$this->_page->getFormBySubmit(new SimpleByLabel($label)); + } + + /** + * Clicks the submit image by some kind of label. Usually + * the alt tag or the nearest equivalent. The owning + * form will be submitted by this. Clicking outside of + * the boundary of the coordinates will result in + * a failure. + * @param string $label ID attribute of button. + * @param integer $x X-coordinate of imaginary click. + * @param integer $y Y-coordinate of imaginary click. + * @param hash $additional Additional form data. + * @return string/boolean Page on success. + * @access public + */ + function clickImage($label, $x = 1, $y = 1, $additional = false) { + if (! ($form = &$this->_page->getFormByImage(new SimpleByLabel($label)))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submitImage(new SimpleByLabel($label), $x, $y, $additional)); + return ($success ? $this->getContent() : $success); + } + + /** + * Clicks the submit image by the name. Usually + * the alt tag or the nearest equivalent. The owning + * form will be submitted by this. Clicking outside of + * the boundary of the coordinates will result in + * a failure. + * @param string $name Name attribute of button. + * @param integer $x X-coordinate of imaginary click. + * @param integer $y Y-coordinate of imaginary click. + * @param hash $additional Additional form data. + * @return string/boolean Page on success. + * @access public + */ + function clickImageByName($name, $x = 1, $y = 1, $additional = false) { + if (! ($form = &$this->_page->getFormByImage(new SimpleByName($name)))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submitImage(new SimpleByName($name), $x, $y, $additional)); + return ($success ? $this->getContent() : $success); + } + + /** + * Clicks the submit image by ID attribute. The owning + * form will be submitted by this. Clicking outside of + * the boundary of the coordinates will result in + * a failure. + * @param integer/string $id ID attribute of button. + * @param integer $x X-coordinate of imaginary click. + * @param integer $y Y-coordinate of imaginary click. + * @param hash $additional Additional form data. + * @return string/boolean Page on success. + * @access public + */ + function clickImageById($id, $x = 1, $y = 1, $additional = false) { + if (! ($form = &$this->_page->getFormByImage(new SimpleById($id)))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submitImage(new SimpleById($id), $x, $y, $additional)); + return ($success ? $this->getContent() : $success); + } + + /** + * Tests to see if an image exists with this + * title or alt text. + * @param string $label Image text. + * @return boolean True if present. + * @access public + */ + function isImage($label) { + return (boolean)$this->_page->getFormByImage(new SimpleByLabel($label)); + } + + /** + * Submits a form by the ID. + * @param string $id The form ID. No submit button value + * will be sent. + * @return string/boolean Page on success. + * @access public + */ + function submitFormById($id) { + if (! ($form = &$this->_page->getFormById($id))) { + return false; + } + $success = $this->_load( + $form->getAction(), + $form->submit()); + return ($success ? $this->getContent() : $success); + } + + /** + * Finds a URL by label. Will find the first link + * found with this link text by default, or a later + * one if an index is given. The match ignores case and + * white space issues. + * @param string $label Text between the anchor tags. + * @param integer $index Link position counting from zero. + * @return string/boolean URL on success. + * @access public + */ + function getLink($label, $index = 0) { + $urls = $this->_page->getUrlsByLabel($label); + if (count($urls) == 0) { + return false; + } + if (count($urls) < $index + 1) { + return false; + } + return $urls[$index]; + } + + /** + * Follows a link by label. Will click the first link + * found with this link text by default, or a later + * one if an index is given. The match ignores case and + * white space issues. + * @param string $label Text between the anchor tags. + * @param integer $index Link position counting from zero. + * @return string/boolean Page on success. + * @access public + */ + function clickLink($label, $index = 0) { + $url = $this->getLink($label, $index); + if ($url === false) { + return false; + } + $this->_load($url, new SimpleGetEncoding()); + return $this->getContent(); + } + + /** + * Finds a link by id attribute. + * @param string $id ID attribute value. + * @return string/boolean URL on success. + * @access public + */ + function getLinkById($id) { + return $this->_page->getUrlById($id); + } + + /** + * Follows a link by id attribute. + * @param string $id ID attribute value. + * @return string/boolean Page on success. + * @access public + */ + function clickLinkById($id) { + if (! ($url = $this->getLinkById($id))) { + return false; + } + $this->_load($url, new SimpleGetEncoding()); + return $this->getContent(); + } + + /** + * Clicks a visible text item. Will first try buttons, + * then links and then images. + * @param string $label Visible text or alt text. + * @return string/boolean Raw page or false. + * @access public + */ + function click($label) { + $raw = $this->clickSubmit($label); + if (! $raw) { + $raw = $this->clickLink($label); + } + if (! $raw) { + $raw = $this->clickImage($label); + } + return $raw; + } + + /** + * Tests to see if a click target exists. + * @param string $label Visible text or alt text. + * @return boolean True if target present. + * @access public + */ + function isClickable($label) { + return $this->isSubmit($label) || ($this->getLink($label) !== false) || $this->isImage($label); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/collector.php b/tests/simpletest/collector.php new file mode 100644 index 000000000..5b8255d39 --- /dev/null +++ b/tests/simpletest/collector.php @@ -0,0 +1,122 @@ + + * @package SimpleTest + * @subpackage UnitTester + * @version $Id: collector.php 1723 2008-04-08 00:34:10Z lastcraft $ + */ + +/** + * The basic collector for {@link GroupTest} + * + * @see collect(), GroupTest::collect() + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleCollector { + + /** + * Strips off any kind of slash at the end so as to normalise the path. + * @param string $path Path to normalise. + * @return string Path without trailing slash. + */ + function _removeTrailingSlash($path) { + if (substr($path, -1) == DIRECTORY_SEPARATOR) { + return substr($path, 0, -1); + } elseif (substr($path, -1) == '/') { + return substr($path, 0, -1); + } else { + return $path; + } + } + + /** + * Scans the directory and adds what it can. + * @param object $test Group test with {@link GroupTest::addTestFile()} method. + * @param string $path Directory to scan. + * @see _attemptToAdd() + */ + function collect(&$test, $path) { + $path = $this->_removeTrailingSlash($path); + if ($handle = opendir($path)) { + while (($entry = readdir($handle)) !== false) { + if ($this->_isHidden($entry)) { + continue; + } + $this->_handle($test, $path . DIRECTORY_SEPARATOR . $entry); + } + closedir($handle); + } + } + + /** + * This method determines what should be done with a given file and adds + * it via {@link GroupTest::addTestFile()} if necessary. + * + * This method should be overriden to provide custom matching criteria, + * such as pattern matching, recursive matching, etc. For an example, see + * {@link SimplePatternCollector::_handle()}. + * + * @param object $test Group test with {@link GroupTest::addTestFile()} method. + * @param string $filename A filename as generated by {@link collect()} + * @see collect() + * @access protected + */ + function _handle(&$test, $file) { + if (is_dir($file)) { + return; + } + $test->addTestFile($file); + } + + /** + * Tests for hidden files so as to skip them. Currently + * only tests for Unix hidden files. + * @param string $filename Plain filename. + * @return boolean True if hidden file. + * @access private + */ + function _isHidden($filename) { + return strncmp($filename, '.', 1) == 0; + } +} + +/** + * An extension to {@link SimpleCollector} that only adds files matching a + * given pattern. + * + * @package SimpleTest + * @subpackage UnitTester + * @see SimpleCollector + */ +class SimplePatternCollector extends SimpleCollector { + var $_pattern; + + /** + * + * @param string $pattern Perl compatible regex to test name against + * See {@link http://us4.php.net/manual/en/reference.pcre.pattern.syntax.php PHP's PCRE} + * for full documentation of valid pattern.s + */ + function SimplePatternCollector($pattern = '/php$/i') { + $this->_pattern = $pattern; + } + + /** + * Attempts to add files that match a given pattern. + * + * @see SimpleCollector::_handle() + * @param object $test Group test with {@link GroupTest::addTestFile()} method. + * @param string $path Directory to scan. + * @access protected + */ + function _handle(&$test, $filename) { + if (preg_match($this->_pattern, $filename)) { + parent::_handle($test, $filename); + } + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/compatibility.php b/tests/simpletest/compatibility.php new file mode 100644 index 000000000..4e0f78a4b --- /dev/null +++ b/tests/simpletest/compatibility.php @@ -0,0 +1,173 @@ += 0) { + eval('$copy = clone $object;'); + return $copy; + } + return $object; + } + + /** + * Identity test. Drops back to equality + types for PHP5 + * objects as the === operator counts as the + * stronger reference constraint. + * @param mixed $first Test subject. + * @param mixed $second Comparison object. + * @return boolean True if identical. + * @access public + * @static + */ + function isIdentical($first, $second) { + if (version_compare(phpversion(), '5') >= 0) { + return SimpleTestCompatibility::_isIdenticalType($first, $second); + } + if ($first != $second) { + return false; + } + return ($first === $second); + } + + /** + * Recursive type test. + * @param mixed $first Test subject. + * @param mixed $second Comparison object. + * @return boolean True if same type. + * @access private + * @static + */ + function _isIdenticalType($first, $second) { + if (gettype($first) != gettype($second)) { + return false; + } + if (is_object($first) && is_object($second)) { + if (get_class($first) != get_class($second)) { + return false; + } + return SimpleTestCompatibility::_isArrayOfIdenticalTypes( + get_object_vars($first), + get_object_vars($second)); + } + if (is_array($first) && is_array($second)) { + return SimpleTestCompatibility::_isArrayOfIdenticalTypes($first, $second); + } + if ($first !== $second) { + return false; + } + return true; + } + + /** + * Recursive type test for each element of an array. + * @param mixed $first Test subject. + * @param mixed $second Comparison object. + * @return boolean True if identical. + * @access private + * @static + */ + function _isArrayOfIdenticalTypes($first, $second) { + if (array_keys($first) != array_keys($second)) { + return false; + } + foreach (array_keys($first) as $key) { + $is_identical = SimpleTestCompatibility::_isIdenticalType( + $first[$key], + $second[$key]); + if (! $is_identical) { + return false; + } + } + return true; + } + + /** + * Test for two variables being aliases. + * @param mixed $first Test subject. + * @param mixed $second Comparison object. + * @return boolean True if same. + * @access public + * @static + */ + function isReference(&$first, &$second) { + if (version_compare(phpversion(), '5', '>=') && is_object($first)) { + return ($first === $second); + } + if (is_object($first) && is_object($second)) { + $id = uniqid("test"); + $first->$id = true; + $is_ref = isset($second->$id); + unset($first->$id); + return $is_ref; + } + $temp = $first; + $first = uniqid("test"); + $is_ref = ($first === $second); + $first = $temp; + return $is_ref; + } + + /** + * Test to see if an object is a member of a + * class hiearchy. + * @param object $object Object to test. + * @param string $class Root name of hiearchy. + * @return boolean True if class in hiearchy. + * @access public + * @static + */ + function isA($object, $class) { + if (version_compare(phpversion(), '5') >= 0) { + if (! class_exists($class, false)) { + if (function_exists('interface_exists')) { + if (! interface_exists($class, false)) { + return false; + } + } + } + eval("\$is_a = \$object instanceof $class;"); + return $is_a; + } + if (function_exists('is_a')) { + return is_a($object, $class); + } + return ((strtolower($class) == get_class($object)) + or (is_subclass_of($object, $class))); + } + + /** + * Sets a socket timeout for each chunk. + * @param resource $handle Socket handle. + * @param integer $timeout Limit in seconds. + * @access public + * @static + */ + function setTimeout($handle, $timeout) { + if (function_exists('stream_set_timeout')) { + stream_set_timeout($handle, $timeout, 0); + } elseif (function_exists('socket_set_timeout')) { + socket_set_timeout($handle, $timeout, 0); + } elseif (function_exists('set_socket_timeout')) { + set_socket_timeout($handle, $timeout, 0); + } + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/cookies.php b/tests/simpletest/cookies.php new file mode 100644 index 000000000..ed1c025d2 --- /dev/null +++ b/tests/simpletest/cookies.php @@ -0,0 +1,380 @@ +_host = false; + $this->_name = $name; + $this->_value = $value; + $this->_path = ($path ? $this->_fixPath($path) : "/"); + $this->_expiry = false; + if (is_string($expiry)) { + $this->_expiry = strtotime($expiry); + } elseif (is_integer($expiry)) { + $this->_expiry = $expiry; + } + $this->_is_secure = $is_secure; + } + + /** + * Sets the host. The cookie rules determine + * that the first two parts are taken for + * certain TLDs and three for others. If the + * new host does not match these rules then the + * call will fail. + * @param string $host New hostname. + * @return boolean True if hostname is valid. + * @access public + */ + function setHost($host) { + if ($host = $this->_truncateHost($host)) { + $this->_host = $host; + return true; + } + return false; + } + + /** + * Accessor for the truncated host to which this + * cookie applies. + * @return string Truncated hostname. + * @access public + */ + function getHost() { + return $this->_host; + } + + /** + * Test for a cookie being valid for a host name. + * @param string $host Host to test against. + * @return boolean True if the cookie would be valid + * here. + */ + function isValidHost($host) { + return ($this->_truncateHost($host) === $this->getHost()); + } + + /** + * Extracts just the domain part that determines a + * cookie's host validity. + * @param string $host Host name to truncate. + * @return string Domain or false on a bad host. + * @access private + */ + function _truncateHost($host) { + $tlds = SimpleUrl::getAllTopLevelDomains(); + if (preg_match('/[a-z\-]+\.(' . $tlds . ')$/i', $host, $matches)) { + return $matches[0]; + } elseif (preg_match('/[a-z\-]+\.[a-z\-]+\.[a-z\-]+$/i', $host, $matches)) { + return $matches[0]; + } + return false; + } + + /** + * Accessor for name. + * @return string Cookie key. + * @access public + */ + function getName() { + return $this->_name; + } + + /** + * Accessor for value. A deleted cookie will + * have an empty string for this. + * @return string Cookie value. + * @access public + */ + function getValue() { + return $this->_value; + } + + /** + * Accessor for path. + * @return string Valid cookie path. + * @access public + */ + function getPath() { + return $this->_path; + } + + /** + * Tests a path to see if the cookie applies + * there. The test path must be longer or + * equal to the cookie path. + * @param string $path Path to test against. + * @return boolean True if cookie valid here. + * @access public + */ + function isValidPath($path) { + return (strncmp( + $this->_fixPath($path), + $this->getPath(), + strlen($this->getPath())) == 0); + } + + /** + * Accessor for expiry. + * @return string Expiry string. + * @access public + */ + function getExpiry() { + if (! $this->_expiry) { + return false; + } + return gmdate("D, d M Y H:i:s", $this->_expiry) . " GMT"; + } + + /** + * Test to see if cookie is expired against + * the cookie format time or timestamp. + * Will give true for a session cookie. + * @param integer/string $now Time to test against. Result + * will be false if this time + * is later than the cookie expiry. + * Can be either a timestamp integer + * or a cookie format date. + * @access public + */ + function isExpired($now) { + if (! $this->_expiry) { + return true; + } + if (is_string($now)) { + $now = strtotime($now); + } + return ($this->_expiry < $now); + } + + /** + * Ages the cookie by the specified number of + * seconds. + * @param integer $interval In seconds. + * @public + */ + function agePrematurely($interval) { + if ($this->_expiry) { + $this->_expiry -= $interval; + } + } + + /** + * Accessor for the secure flag. + * @return boolean True if cookie needs SSL. + * @access public + */ + function isSecure() { + return $this->_is_secure; + } + + /** + * Adds a trailing and leading slash to the path + * if missing. + * @param string $path Path to fix. + * @access private + */ + function _fixPath($path) { + if (substr($path, 0, 1) != '/') { + $path = '/' . $path; + } + if (substr($path, -1, 1) != '/') { + $path .= '/'; + } + return $path; + } +} + +/** + * Repository for cookies. This stuff is a + * tiny bit browser dependent. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleCookieJar { + var $_cookies; + + /** + * Constructor. Jar starts empty. + * @access public + */ + function SimpleCookieJar() { + $this->_cookies = array(); + } + + /** + * Removes expired and temporary cookies as if + * the browser was closed and re-opened. + * @param string/integer $now Time to test expiry against. + * @access public + */ + function restartSession($date = false) { + $surviving_cookies = array(); + for ($i = 0; $i < count($this->_cookies); $i++) { + if (! $this->_cookies[$i]->getValue()) { + continue; + } + if (! $this->_cookies[$i]->getExpiry()) { + continue; + } + if ($date && $this->_cookies[$i]->isExpired($date)) { + continue; + } + $surviving_cookies[] = $this->_cookies[$i]; + } + $this->_cookies = $surviving_cookies; + } + + /** + * Ages all cookies in the cookie jar. + * @param integer $interval The old session is moved + * into the past by this number + * of seconds. Cookies now over + * age will be removed. + * @access public + */ + function agePrematurely($interval) { + for ($i = 0; $i < count($this->_cookies); $i++) { + $this->_cookies[$i]->agePrematurely($interval); + } + } + + /** + * Sets an additional cookie. If a cookie has + * the same name and path it is replaced. + * @param string $name Cookie key. + * @param string $value Value of cookie. + * @param string $host Host upon which the cookie is valid. + * @param string $path Cookie path if not host wide. + * @param string $expiry Expiry date. + * @access public + */ + function setCookie($name, $value, $host = false, $path = '/', $expiry = false) { + $cookie = new SimpleCookie($name, $value, $path, $expiry); + if ($host) { + $cookie->setHost($host); + } + $this->_cookies[$this->_findFirstMatch($cookie)] = $cookie; + } + + /** + * Finds a matching cookie to write over or the + * first empty slot if none. + * @param SimpleCookie $cookie Cookie to write into jar. + * @return integer Available slot. + * @access private + */ + function _findFirstMatch($cookie) { + for ($i = 0; $i < count($this->_cookies); $i++) { + $is_match = $this->_isMatch( + $cookie, + $this->_cookies[$i]->getHost(), + $this->_cookies[$i]->getPath(), + $this->_cookies[$i]->getName()); + if ($is_match) { + return $i; + } + } + return count($this->_cookies); + } + + /** + * Reads the most specific cookie value from the + * browser cookies. Looks for the longest path that + * matches. + * @param string $host Host to search. + * @param string $path Applicable path. + * @param string $name Name of cookie to read. + * @return string False if not present, else the + * value as a string. + * @access public + */ + function getCookieValue($host, $path, $name) { + $longest_path = ''; + foreach ($this->_cookies as $cookie) { + if ($this->_isMatch($cookie, $host, $path, $name)) { + if (strlen($cookie->getPath()) > strlen($longest_path)) { + $value = $cookie->getValue(); + $longest_path = $cookie->getPath(); + } + } + } + return (isset($value) ? $value : false); + } + + /** + * Tests cookie for matching against search + * criteria. + * @param SimpleTest $cookie Cookie to test. + * @param string $host Host must match. + * @param string $path Cookie path must be shorter than + * this path. + * @param string $name Name must match. + * @return boolean True if matched. + * @access private + */ + function _isMatch($cookie, $host, $path, $name) { + if ($cookie->getName() != $name) { + return false; + } + if ($host && $cookie->getHost() && ! $cookie->isValidHost($host)) { + return false; + } + if (! $cookie->isValidPath($path)) { + return false; + } + return true; + } + + /** + * Uses a URL to sift relevant cookies by host and + * path. Results are list of strings of form "name=value". + * @param SimpleUrl $url Url to select by. + * @return array Valid name and value pairs. + * @access public + */ + function selectAsPairs($url) { + $pairs = array(); + foreach ($this->_cookies as $cookie) { + if ($this->_isMatch($cookie, $url->getHost(), $url->getPath(), $cookie->getName())) { + $pairs[] = $cookie->getName() . '=' . $cookie->getValue(); + } + } + return $pairs; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/default_reporter.php b/tests/simpletest/default_reporter.php new file mode 100644 index 000000000..bd4c6a190 --- /dev/null +++ b/tests/simpletest/default_reporter.php @@ -0,0 +1,133 @@ + '_case', 'c' => '_case', + 'test' => '_test', 't' => '_test', + 'xml' => '_xml', 'x' => '_xml'); + var $_case = ''; + var $_test = ''; + var $_xml = false; + var $_no_skips = false; + + /** + * Parses raw command line arguments into object properties. + * @param string $arguments Raw commend line arguments. + */ + function SimpleCommandLineParser($arguments) { + if (! is_array($arguments)) { + return; + } + foreach ($arguments as $i => $argument) { + if (preg_match('/^--?(test|case|t|c)=(.+)$/', $argument, $matches)) { + $property = $this->_to_property[$matches[1]]; + $this->$property = $matches[2]; + } elseif (preg_match('/^--?(test|case|t|c)$/', $argument, $matches)) { + $property = $this->_to_property[$matches[1]]; + if (isset($arguments[$i + 1])) { + $this->$property = $arguments[$i + 1]; + } + } elseif (preg_match('/^--?(xml|x)$/', $argument)) { + $this->_xml = true; + } elseif (preg_match('/^--?(no-skip|no-skips|s)$/', $argument)) { + $this->_no_skips = true; + } + } + } + + /** + * Run only this test. + * @return string Test name to run. + * @access public + */ + function getTest() { + return $this->_test; + } + + /** + * Run only this test suite. + * @return string Test class name to run. + * @access public + */ + function getTestCase() { + return $this->_case; + } + + /** + * Output should be XML or not. + * @return boolean True if XML desired. + * @access public + */ + function isXml() { + return $this->_xml; + } + + /** + * Output should suppress skip messages. + * @return boolean True for no skips. + * @access public + */ + function noSkips() { + return $this->_no_skips; + } +} + +/** + * The default reporter used by SimpleTest's autorun + * feature. The actual reporters used are dependency + * injected and can be overridden. + * @package SimpleTest + * @subpackage UnitTester + */ +class DefaultReporter extends SimpleReporterDecorator { + + /** + * Assembles the appopriate reporter for the environment. + */ + function DefaultReporter() { + if (SimpleReporter::inCli()) { + global $argv; + $parser = new SimpleCommandLineParser($argv); + $interfaces = $parser->isXml() ? array('XmlReporter') : array('TextReporter'); + $reporter = &new SelectiveReporter( + SimpleTest::preferred($interfaces), + $parser->getTestCase(), + $parser->getTest()); + if ($parser->noSkips()) { + $reporter = &new NoSkipsReporter($reporter); + } + } else { + $reporter = &new SelectiveReporter( + SimpleTest::preferred('HtmlReporter'), + @$_GET['c'], + @$_GET['t']); + if (@$_GET['skips'] == 'no' || @$_GET['show-skips'] == 'no') { + $reporter = &new NoSkipsReporter($reporter); + } + } + $this->SimpleReporterDecorator($reporter); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/detached.php b/tests/simpletest/detached.php new file mode 100644 index 000000000..e323d8cd5 --- /dev/null +++ b/tests/simpletest/detached.php @@ -0,0 +1,96 @@ +_command = $command; + $this->_dry_command = $dry_command ? $dry_command : $command; + $this->_size = false; + } + + /** + * Accessor for the test name for subclasses. + * @return string Name of the test. + * @access public + */ + function getLabel() { + return $this->_command; + } + + /** + * Runs the top level test for this class. Currently + * reads the data as a single chunk. I'll fix this + * once I have added iteration to the browser. + * @param SimpleReporter $reporter Target of test results. + * @returns boolean True if no failures. + * @access public + */ + function run(&$reporter) { + $shell = &new SimpleShell(); + $shell->execute($this->_command); + $parser = &$this->_createParser($reporter); + if (! $parser->parse($shell->getOutput())) { + trigger_error('Cannot parse incoming XML from [' . $this->_command . ']'); + return false; + } + return true; + } + + /** + * Accessor for the number of subtests. + * @return integer Number of test cases. + * @access public + */ + function getSize() { + if ($this->_size === false) { + $shell = &new SimpleShell(); + $shell->execute($this->_dry_command); + $reporter = &new SimpleReporter(); + $parser = &$this->_createParser($reporter); + if (! $parser->parse($shell->getOutput())) { + trigger_error('Cannot parse incoming XML from [' . $this->_dry_command . ']'); + return false; + } + $this->_size = $reporter->getTestCaseCount(); + } + return $this->_size; + } + + /** + * Creates the XML parser. + * @param SimpleReporter $reporter Target of test results. + * @return SimpleTestXmlListener XML reader. + * @access protected + */ + function &_createParser(&$reporter) { + return new SimpleTestXmlParser($reporter); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/dumper.php b/tests/simpletest/dumper.php new file mode 100644 index 000000000..2d75985c0 --- /dev/null +++ b/tests/simpletest/dumper.php @@ -0,0 +1,360 @@ +getType($value); + switch($type) { + case "Null": + return "NULL"; + case "Boolean": + return "Boolean: " . ($value ? "true" : "false"); + case "Array": + return "Array: " . count($value) . " items"; + case "Object": + return "Object: of " . get_class($value); + case "String": + return "String: " . $this->clipString($value, 200); + default: + return "$type: $value"; + } + return "Unknown"; + } + + /** + * Gets the string representation of a type. + * @param mixed $value Variable to check against. + * @return string Type. + * @access public + */ + function getType($value) { + if (! isset($value)) { + return "Null"; + } elseif (is_bool($value)) { + return "Boolean"; + } elseif (is_string($value)) { + return "String"; + } elseif (is_integer($value)) { + return "Integer"; + } elseif (is_float($value)) { + return "Float"; + } elseif (is_array($value)) { + return "Array"; + } elseif (is_resource($value)) { + return "Resource"; + } elseif (is_object($value)) { + return "Object"; + } + return "Unknown"; + } + + /** + * Creates a human readable description of the + * difference between two variables. Uses a + * dynamic call. + * @param mixed $first First variable. + * @param mixed $second Value to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Description of difference. + * @access public + */ + function describeDifference($first, $second, $identical = false) { + if ($identical) { + if (! $this->_isTypeMatch($first, $second)) { + return "with type mismatch as [" . $this->describeValue($first) . + "] does not match [" . $this->describeValue($second) . "]"; + } + } + $type = $this->getType($first); + if ($type == "Unknown") { + return "with unknown type"; + } + $method = '_describe' . $type . 'Difference'; + return $this->$method($first, $second, $identical); + } + + /** + * Tests to see if types match. + * @param mixed $first First variable. + * @param mixed $second Value to compare with. + * @return boolean True if matches. + * @access private + */ + function _isTypeMatch($first, $second) { + return ($this->getType($first) == $this->getType($second)); + } + + /** + * Clips a string to a maximum length. + * @param string $value String to truncate. + * @param integer $size Minimum string size to show. + * @param integer $position Centre of string section. + * @return string Shortened version. + * @access public + */ + function clipString($value, $size, $position = 0) { + $length = strlen($value); + if ($length <= $size) { + return $value; + } + $position = min($position, $length); + $start = ($size/2 > $position ? 0 : $position - $size/2); + if ($start + $size > $length) { + $start = $length - $size; + } + $value = substr($value, $start, $size); + return ($start > 0 ? "..." : "") . $value . ($start + $size < $length ? "..." : ""); + } + + /** + * Creates a human readable description of the + * difference between two variables. The minimal + * version. + * @param null $first First value. + * @param mixed $second Value to compare with. + * @return string Human readable description. + * @access private + */ + function _describeGenericDifference($first, $second) { + return "as [" . $this->describeValue($first) . + "] does not match [" . + $this->describeValue($second) . "]"; + } + + /** + * Creates a human readable description of the + * difference between a null and another variable. + * @param null $first First null. + * @param mixed $second Null to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeNullDifference($first, $second, $identical) { + return $this->_describeGenericDifference($first, $second); + } + + /** + * Creates a human readable description of the + * difference between a boolean and another variable. + * @param boolean $first First boolean. + * @param mixed $second Boolean to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeBooleanDifference($first, $second, $identical) { + return $this->_describeGenericDifference($first, $second); + } + + /** + * Creates a human readable description of the + * difference between a string and another variable. + * @param string $first First string. + * @param mixed $second String to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeStringDifference($first, $second, $identical) { + if (is_object($second) || is_array($second)) { + return $this->_describeGenericDifference($first, $second); + } + $position = $this->_stringDiffersAt($first, $second); + $message = "at character $position"; + $message .= " with [" . + $this->clipString($first, 200, $position) . "] and [" . + $this->clipString($second, 200, $position) . "]"; + return $message; + } + + /** + * Creates a human readable description of the + * difference between an integer and another variable. + * @param integer $first First number. + * @param mixed $second Number to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeIntegerDifference($first, $second, $identical) { + if (is_object($second) || is_array($second)) { + return $this->_describeGenericDifference($first, $second); + } + return "because [" . $this->describeValue($first) . + "] differs from [" . + $this->describeValue($second) . "] by " . + abs($first - $second); + } + + /** + * Creates a human readable description of the + * difference between two floating point numbers. + * @param float $first First float. + * @param mixed $second Float to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeFloatDifference($first, $second, $identical) { + if (is_object($second) || is_array($second)) { + return $this->_describeGenericDifference($first, $second); + } + return "because [" . $this->describeValue($first) . + "] differs from [" . + $this->describeValue($second) . "] by " . + abs($first - $second); + } + + /** + * Creates a human readable description of the + * difference between two arrays. + * @param array $first First array. + * @param mixed $second Array to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeArrayDifference($first, $second, $identical) { + if (! is_array($second)) { + return $this->_describeGenericDifference($first, $second); + } + if (! $this->_isMatchingKeys($first, $second, $identical)) { + return "as key list [" . + implode(", ", array_keys($first)) . "] does not match key list [" . + implode(", ", array_keys($second)) . "]"; + } + foreach (array_keys($first) as $key) { + if ($identical && ($first[$key] === $second[$key])) { + continue; + } + if (! $identical && ($first[$key] == $second[$key])) { + continue; + } + return "with member [$key] " . $this->describeDifference( + $first[$key], + $second[$key], + $identical); + } + return ""; + } + + /** + * Compares two arrays to see if their key lists match. + * For an identical match, the ordering and types of the keys + * is significant. + * @param array $first First array. + * @param array $second Array to compare with. + * @param boolean $identical If true then type anomolies count. + * @return boolean True if matching. + * @access private + */ + function _isMatchingKeys($first, $second, $identical) { + $first_keys = array_keys($first); + $second_keys = array_keys($second); + if ($identical) { + return ($first_keys === $second_keys); + } + sort($first_keys); + sort($second_keys); + return ($first_keys == $second_keys); + } + + /** + * Creates a human readable description of the + * difference between a resource and another variable. + * @param resource $first First resource. + * @param mixed $second Resource to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeResourceDifference($first, $second, $identical) { + return $this->_describeGenericDifference($first, $second); + } + + /** + * Creates a human readable description of the + * difference between two objects. + * @param object $first First object. + * @param mixed $second Object to compare with. + * @param boolean $identical If true then type anomolies count. + * @return string Human readable description. + * @access private + */ + function _describeObjectDifference($first, $second, $identical) { + if (! is_object($second)) { + return $this->_describeGenericDifference($first, $second); + } + return $this->_describeArrayDifference( + get_object_vars($first), + get_object_vars($second), + $identical); + } + + /** + * Find the first character position that differs + * in two strings by binary chop. + * @param string $first First string. + * @param string $second String to compare with. + * @return integer Position of first differing + * character. + * @access private + */ + function _stringDiffersAt($first, $second) { + if (! $first || ! $second) { + return 0; + } + if (strlen($first) < strlen($second)) { + list($first, $second) = array($second, $first); + } + $position = 0; + $step = strlen($first); + while ($step > 1) { + $step = (integer)(($step + 1) / 2); + if (strncmp($first, $second, $position + $step) == 0) { + $position += $step; + } + } + return $position; + } + + /** + * Sends a formatted dump of a variable to a string. + * @param mixed $variable Variable to display. + * @return string Output from print_r(). + * @access public + * @static + */ + function dump($variable) { + ob_start(); + print_r($variable); + $formatted = ob_get_contents(); + ob_end_clean(); + return $formatted; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/eclipse.php b/tests/simpletest/eclipse.php new file mode 100644 index 000000000..0f1a4fcb2 --- /dev/null +++ b/tests/simpletest/eclipse.php @@ -0,0 +1,307 @@ +_listener = &$listener; + $this->SimpleScorer(); + $this->_case = ""; + $this->_group = ""; + $this->_method = ""; + $this->_cc = $cc; + $this->_error = false; + $this->_fail = false; + } + + /** + * Means to display human readable object comparisons. + * @return SimpleDumper Visual comparer. + */ + function getDumper() { + return new SimpleDumper(); + } + + /** + * Localhost connection from Eclipse. + * @param integer $port Port to connect to Eclipse. + * @param string $host Normally localhost. + * @return SimpleSocket Connection to Eclipse. + */ + function &createListener($port, $host="127.0.0.1"){ + $tmplistener = &new SimpleSocket($host, $port, 5); + return $tmplistener; + } + + /** + * Wraps the test in an output buffer. + * @param SimpleInvoker $invoker Current test runner. + * @return EclipseInvoker Decorator with output buffering. + * @access public + */ + function &createInvoker(&$invoker){ + $eclinvoker = &new EclipseInvoker($invoker, $this->_listener); + return $eclinvoker; + } + + /** + * C style escaping. + * @param string $raw String with backslashes, quotes and whitespace. + * @return string Replaced with C backslashed tokens. + */ + function escapeVal($raw){ + $needle = array("\\","\"","/","\b","\f","\n","\r","\t"); + $replace = array('\\\\','\"','\/','\b','\f','\n','\r','\t'); + return str_replace($needle, $replace, $raw); + } + + /** + * Stash the first passing item. Clicking the test + * item goes to first pass. + * @param string $message Test message, but we only wnat the first. + * @access public + */ + function paintPass($message){ + if (! $this->_pass){ + $this->_message = $this->escapeVal($message); + } + $this->_pass = true; + } + + /** + * Stash the first failing item. Clicking the test + * item goes to first fail. + * @param string $message Test message, but we only wnat the first. + * @access public + */ + function paintFail($message){ + //only get the first failure or error + if (! $this->_fail && ! $this->_error){ + $this->_fail = true; + $this->_message = $this->escapeVal($message); + $this->_listener->write('{status:"fail",message:"'.$this->_message.'",group:"'.$this->_group.'",case:"'.$this->_case.'",method:"'.$this->_method.'"}'); + } + } + + /** + * Stash the first error. Clicking the test + * item goes to first error. + * @param string $message Test message, but we only wnat the first. + * @access public + */ + function paintError($message){ + if (! $this->_fail && ! $this->_error){ + $this->_error = true; + $this->_message = $this->escapeVal($message); + $this->_listener->write('{status:"error",message:"'.$this->_message.'",group:"'.$this->_group.'",case:"'.$this->_case.'",method:"'.$this->_method.'"}'); + } + } + + + /** + * Stash the first exception. Clicking the test + * item goes to first message. + * @param string $message Test message, but we only wnat the first. + * @access public + */ + function paintException($exception){ + if (! $this->_fail && ! $this->_error){ + $this->_error = true; + $message = 'Unexpected exception of type[' . get_class($exception) . + '] with message [' . $exception->getMessage() . '] in [' . + $exception->getFile() .' line '. $exception->getLine() . ']'; + $this->_message = $this->escapeVal($message); + $this->_listener->write( + '{status:"error",message:"' . $this->_message . '",group:"' . + $this->_group . '",case:"' . $this->_case . '",method:"' . $this->_method + . '"}'); + } + } + + + /** + * We don't display any special header. + * @param string $test_name First test top level + * to start. + * @access public + */ + function paintHeader($test_name) { + } + + /** + * We don't display any special footer. + * @param string $test_name The top level test. + * @access public + */ + function paintFooter($test_name) { + } + + /** + * Paints nothing at the start of a test method, but stash + * the method name for later. + * @param string $test_name Name of test that is starting. + * @access public + */ + function paintMethodStart($method) { + $this->_pass = false; + $this->_fail = false; + $this->_error = false; + $this->_method = $this->escapeVal($method); + } + + /** + * Only send one message if the test passes, after that + * suppress the message. + * @param string $test_name Name of test that is ending. + * @access public + */ + function paintMethodEnd($method){ + if ($this->_fail || $this->_error || ! $this->_pass){ + } else { + $this->_listener->write( + '{status:"pass",message:"' . $this->_message . '",group:"' . + $this->_group . '",case:"' . $this->_case . '",method:"' . + $this->_method . '"}'); + } + } + + /** + * Stashes the test case name for the later failure message. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseStart($case){ + $this->_case = $this->escapeVal($case); + } + + /** + * Drops the name. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseEnd($case){ + $this->_case = ""; + } + + /** + * Stashes the name of the test suite. Starts test coverage + * if enabled. + * @param string $group Name of test or other label. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($group, $size){ + $this->_group = $this->escapeVal($group); + if ($this->_cc){ + if (extension_loaded('xdebug')){ + xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); + } + } + } + + /** + * Paints coverage report if enabled. + * @param string $group Name of test or other label. + * @access public + */ + function paintGroupEnd($group){ + $this->_group = ""; + $cc = ""; + if ($this->_cc){ + if (extension_loaded('xdebug')){ + $arrfiles = xdebug_get_code_coverage(); + xdebug_stop_code_coverage(); + $thisdir = dirname(__FILE__); + $thisdirlen = strlen($thisdir); + foreach ($arrfiles as $index=>$file){ + if (substr($index, 0, $thisdirlen)===$thisdir){ + continue; + } + $lcnt = 0; + $ccnt = 0; + foreach ($file as $line){ + if ($line == -2){ + continue; + } + $lcnt++; + if ($line==1){ + $ccnt++; + } + } + if ($lcnt > 0){ + $cc .= round(($ccnt/$lcnt) * 100, 2) . '%'; + }else{ + $cc .= "0.00%"; + } + $cc.= "\t". $index . "\n"; + } + } + } + $this->_listener->write('{status:"coverage",message:"' . + EclipseReporter::escapeVal($cc) . '"}'); + } +} + +/** + * Invoker decorator for Eclipse. Captures output until + * the end of the test. + * @package SimpleTest + * @subpackage Eclipse + */ +class EclipseInvoker extends SimpleInvokerDecorator{ + function EclipseInvoker(&$invoker, &$listener) { + $this->_listener = &$listener; + $this->SimpleInvokerDecorator($invoker); + } + + /** + * Starts output buffering. + * @param string $method Test method to call. + * @access public + */ + function before($method){ + ob_start(); + $this->_invoker->before($method); + } + + /** + * Stops output buffering and send the captured output + * to the listener. + * @param string $method Test method to call. + * @access public + */ + function after($method) { + $this->_invoker->after($method); + $output = ob_get_contents(); + ob_end_clean(); + if ($output !== ""){ + $result = $this->_listener->write('{status:"info",message:"' . + EclipseReporter::escapeVal($output) . '"}'); + } + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/encoding.php b/tests/simpletest/encoding.php new file mode 100644 index 000000000..112fe3304 --- /dev/null +++ b/tests/simpletest/encoding.php @@ -0,0 +1,552 @@ +_key = $key; + $this->_value = $value; + } + + /** + * The pair as a single string. + * @return string Encoded pair. + * @access public + */ + function asRequest() { + return urlencode($this->_key) . '=' . urlencode($this->_value); + } + + /** + * The MIME part as a string. + * @return string MIME part encoding. + * @access public + */ + function asMime() { + $part = 'Content-Disposition: form-data; '; + $part .= "name=\"" . $this->_key . "\"\r\n"; + $part .= "\r\n" . $this->_value; + return $part; + } + + /** + * Is this the value we are looking for? + * @param string $key Identifier. + * @return boolean True if matched. + * @access public + */ + function isKey($key) { + return $key == $this->_key; + } + + /** + * Is this the value we are looking for? + * @return string Identifier. + * @access public + */ + function getKey() { + return $this->_key; + } + + /** + * Is this the value we are looking for? + * @return string Content. + * @access public + */ + function getValue() { + return $this->_value; + } +} + +/** + * Single post parameter. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleAttachment { + var $_key; + var $_content; + var $_filename; + + /** + * Stashes the data for rendering later. + * @param string $key Key to add value to. + * @param string $content Raw data. + * @param hash $filename Original filename. + */ + function SimpleAttachment($key, $content, $filename) { + $this->_key = $key; + $this->_content = $content; + $this->_filename = $filename; + } + + /** + * The pair as a single string. + * @return string Encoded pair. + * @access public + */ + function asRequest() { + return ''; + } + + /** + * The MIME part as a string. + * @return string MIME part encoding. + * @access public + */ + function asMime() { + $part = 'Content-Disposition: form-data; '; + $part .= 'name="' . $this->_key . '"; '; + $part .= 'filename="' . $this->_filename . '"'; + $part .= "\r\nContent-Type: " . $this->_deduceMimeType(); + $part .= "\r\n\r\n" . $this->_content; + return $part; + } + + /** + * Attempts to figure out the MIME type from the + * file extension and the content. + * @return string MIME type. + * @access private + */ + function _deduceMimeType() { + if ($this->_isOnlyAscii($this->_content)) { + return 'text/plain'; + } + return 'application/octet-stream'; + } + + /** + * Tests each character is in the range 0-127. + * @param string $ascii String to test. + * @access private + */ + function _isOnlyAscii($ascii) { + for ($i = 0, $length = strlen($ascii); $i < $length; $i++) { + if (ord($ascii[$i]) > 127) { + return false; + } + } + return true; + } + + /** + * Is this the value we are looking for? + * @param string $key Identifier. + * @return boolean True if matched. + * @access public + */ + function isKey($key) { + return $key == $this->_key; + } + + /** + * Is this the value we are looking for? + * @return string Identifier. + * @access public + */ + function getKey() { + return $this->_key; + } + + /** + * Is this the value we are looking for? + * @return string Content. + * @access public + */ + function getValue() { + return $this->_filename; + } +} + +/** + * Bundle of GET/POST parameters. Can include + * repeated parameters. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleEncoding { + var $_request; + + /** + * Starts empty. + * @param array $query Hash of parameters. + * Multiple values are + * as lists on a single key. + * @access public + */ + function SimpleEncoding($query = false) { + if (! $query) { + $query = array(); + } + $this->clear(); + $this->merge($query); + } + + /** + * Empties the request of parameters. + * @access public + */ + function clear() { + $this->_request = array(); + } + + /** + * Adds a parameter to the query. + * @param string $key Key to add value to. + * @param string/array $value New data. + * @access public + */ + function add($key, $value) { + if ($value === false) { + return; + } + if (is_array($value)) { + foreach ($value as $item) { + $this->_addPair($key, $item); + } + } else { + $this->_addPair($key, $value); + } + } + + /** + * Adds a new value into the request. + * @param string $key Key to add value to. + * @param string/array $value New data. + * @access private + */ + function _addPair($key, $value) { + $this->_request[] = new SimpleEncodedPair($key, $value); + } + + /** + * Adds a MIME part to the query. Does nothing for a + * form encoded packet. + * @param string $key Key to add value to. + * @param string $content Raw data. + * @param hash $filename Original filename. + * @access public + */ + function attach($key, $content, $filename) { + $this->_request[] = new SimpleAttachment($key, $content, $filename); + } + + /** + * Adds a set of parameters to this query. + * @param array/SimpleQueryString $query Multiple values are + * as lists on a single key. + * @access public + */ + function merge($query) { + if (is_object($query)) { + $this->_request = array_merge($this->_request, $query->getAll()); + } elseif (is_array($query)) { + foreach ($query as $key => $value) { + $this->add($key, $value); + } + } + } + + /** + * Accessor for single value. + * @return string/array False if missing, string + * if present and array if + * multiple entries. + * @access public + */ + function getValue($key) { + $values = array(); + foreach ($this->_request as $pair) { + if ($pair->isKey($key)) { + $values[] = $pair->getValue(); + } + } + if (count($values) == 0) { + return false; + } elseif (count($values) == 1) { + return $values[0]; + } else { + return $values; + } + } + + /** + * Accessor for listing of pairs. + * @return array All pair objects. + * @access public + */ + function getAll() { + return $this->_request; + } + + /** + * Renders the query string as a URL encoded + * request part. + * @return string Part of URL. + * @access protected + */ + function _encode() { + $statements = array(); + foreach ($this->_request as $pair) { + if ($statement = $pair->asRequest()) { + $statements[] = $statement; + } + } + return implode('&', $statements); + } +} + +/** + * Bundle of GET parameters. Can include + * repeated parameters. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleGetEncoding extends SimpleEncoding { + + /** + * Starts empty. + * @param array $query Hash of parameters. + * Multiple values are + * as lists on a single key. + * @access public + */ + function SimpleGetEncoding($query = false) { + $this->SimpleEncoding($query); + } + + /** + * HTTP request method. + * @return string Always GET. + * @access public + */ + function getMethod() { + return 'GET'; + } + + /** + * Writes no extra headers. + * @param SimpleSocket $socket Socket to write to. + * @access public + */ + function writeHeadersTo(&$socket) { + } + + /** + * No data is sent to the socket as the data is encoded into + * the URL. + * @param SimpleSocket $socket Socket to write to. + * @access public + */ + function writeTo(&$socket) { + } + + /** + * Renders the query string as a URL encoded + * request part for attaching to a URL. + * @return string Part of URL. + * @access public + */ + function asUrlRequest() { + return $this->_encode(); + } +} + +/** + * Bundle of URL parameters for a HEAD request. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleHeadEncoding extends SimpleGetEncoding { + + /** + * Starts empty. + * @param array $query Hash of parameters. + * Multiple values are + * as lists on a single key. + * @access public + */ + function SimpleHeadEncoding($query = false) { + $this->SimpleGetEncoding($query); + } + + /** + * HTTP request method. + * @return string Always HEAD. + * @access public + */ + function getMethod() { + return 'HEAD'; + } +} + +/** + * Bundle of POST parameters. Can include + * repeated parameters. + * @package SimpleTest + * @subpackage WebTester + */ +class SimplePostEncoding extends SimpleEncoding { + + /** + * Starts empty. + * @param array $query Hash of parameters. + * Multiple values are + * as lists on a single key. + * @access public + */ + function SimplePostEncoding($query = false) { + if (is_array($query) and $this->hasMoreThanOneLevel($query)) { + $query = $this->rewriteArrayWithMultipleLevels($query); + } + $this->SimpleEncoding($query); + } + + function hasMoreThanOneLevel($query) { + foreach ($query as $key => $value) { + if (is_array($value)) { + return true; + } + } + return false; + } + + function rewriteArrayWithMultipleLevels($query) { + $query_ = array(); + foreach ($query as $key => $value) { + if (is_array($value)) { + foreach ($value as $sub_key => $sub_value) { + $query_[$key."[".$sub_key."]"] = $sub_value; + } + } else { + $query_[$key] = $value; + } + } + if ($this->hasMoreThanOneLevel($query_)) { + $query_ = $this->rewriteArrayWithMultipleLevels($query_); + } + + return $query_; + } + + + /** + * HTTP request method. + * @return string Always POST. + * @access public + */ + function getMethod() { + return 'POST'; + } + + /** + * Dispatches the form headers down the socket. + * @param SimpleSocket $socket Socket to write to. + * @access public + */ + function writeHeadersTo(&$socket) { + $socket->write("Content-Length: " . (integer)strlen($this->_encode()) . "\r\n"); + $socket->write("Content-Type: application/x-www-form-urlencoded\r\n"); + } + + /** + * Dispatches the form data down the socket. + * @param SimpleSocket $socket Socket to write to. + * @access public + */ + function writeTo(&$socket) { + $socket->write($this->_encode()); + } + + /** + * Renders the query string as a URL encoded + * request part for attaching to a URL. + * @return string Part of URL. + * @access public + */ + function asUrlRequest() { + return ''; + } +} + +/** + * Bundle of POST parameters in the multipart + * format. Can include file uploads. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleMultipartEncoding extends SimplePostEncoding { + var $_boundary; + + /** + * Starts empty. + * @param array $query Hash of parameters. + * Multiple values are + * as lists on a single key. + * @access public + */ + function SimpleMultipartEncoding($query = false, $boundary = false) { + $this->SimplePostEncoding($query); + $this->_boundary = ($boundary === false ? uniqid('st') : $boundary); + } + + /** + * Dispatches the form headers down the socket. + * @param SimpleSocket $socket Socket to write to. + * @access public + */ + function writeHeadersTo(&$socket) { + $socket->write("Content-Length: " . (integer)strlen($this->_encode()) . "\r\n"); + $socket->write("Content-Type: multipart/form-data, boundary=" . $this->_boundary . "\r\n"); + } + + /** + * Dispatches the form data down the socket. + * @param SimpleSocket $socket Socket to write to. + * @access public + */ + function writeTo(&$socket) { + $socket->write($this->_encode()); + } + + /** + * Renders the query string as a URL encoded + * request part. + * @return string Part of URL. + * @access public + */ + function _encode() { + $stream = ''; + foreach ($this->_request as $pair) { + $stream .= "--" . $this->_boundary . "\r\n"; + $stream .= $pair->asMime() . "\r\n"; + } + $stream .= "--" . $this->_boundary . "--\r\n"; + return $stream; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/errors.php b/tests/simpletest/errors.php new file mode 100644 index 000000000..5a0788511 --- /dev/null +++ b/tests/simpletest/errors.php @@ -0,0 +1,288 @@ +SimpleInvokerDecorator($invoker); + } + + /** + * Invokes a test method and dispatches any + * untrapped errors. Called back from + * the visiting runner. + * @param string $method Test method to call. + * @access public + */ + function invoke($method) { + $queue = &$this->_createErrorQueue(); + set_error_handler('SimpleTestErrorHandler'); + parent::invoke($method); + restore_error_handler(); + $queue->tally(); + } + + /** + * Wires up the error queue for a single test. + * @return SimpleErrorQueue Queue connected to the test. + * @access private + */ + function &_createErrorQueue() { + $context = &SimpleTest::getContext(); + $test = &$this->getTestCase(); + $queue = &$context->get('SimpleErrorQueue'); + $queue->setTestCase($test); + return $queue; + } +} + +/** + * Error queue used to record trapped + * errors. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleErrorQueue { + var $_queue; + var $_expectation_queue; + var $_test; + var $_using_expect_style = false; + + /** + * Starts with an empty queue. + */ + function SimpleErrorQueue() { + $this->clear(); + } + + /** + * Discards the contents of the error queue. + * @access public + */ + function clear() { + $this->_queue = array(); + $this->_expectation_queue = array(); + } + + /** + * Sets the currently running test case. + * @param SimpleTestCase $test Test case to send messages to. + * @access public + */ + function setTestCase(&$test) { + $this->_test = &$test; + } + + /** + * Sets up an expectation of an error. If this is + * not fulfilled at the end of the test, a failure + * will occour. If the error does happen, then this + * will cancel it out and send a pass message. + * @param SimpleExpectation $expected Expected error match. + * @param string $message Message to display. + * @access public + */ + function expectError($expected, $message) { + $this->_using_expect_style = true; + array_push($this->_expectation_queue, array($expected, $message)); + } + + /** + * Adds an error to the front of the queue. + * @param integer $severity PHP error code. + * @param string $content Text of error. + * @param string $filename File error occoured in. + * @param integer $line Line number of error. + * @access public + */ + function add($severity, $content, $filename, $line) { + $content = str_replace('%', '%%', $content); + if ($this->_using_expect_style) { + $this->_testLatestError($severity, $content, $filename, $line); + } else { + array_push( + $this->_queue, + array($severity, $content, $filename, $line)); + } + } + + /** + * Any errors still in the queue are sent to the test + * case. Any unfulfilled expectations trigger failures. + * @access public + */ + function tally() { + while (list($severity, $message, $file, $line) = $this->extract()) { + $severity = $this->getSeverityAsString($severity); + $this->_test->error($severity, $message, $file, $line); + } + while (list($expected, $message) = $this->_extractExpectation()) { + $this->_test->assert($expected, false, "%s -> Expected error not caught"); + } + } + + /** + * Tests the error against the most recent expected + * error. + * @param integer $severity PHP error code. + * @param string $content Text of error. + * @param string $filename File error occoured in. + * @param integer $line Line number of error. + * @access private + */ + function _testLatestError($severity, $content, $filename, $line) { + if ($expectation = $this->_extractExpectation()) { + list($expected, $message) = $expectation; + $this->_test->assert($expected, $content, sprintf( + $message, + "%s -> PHP error [$content] severity [" . + $this->getSeverityAsString($severity) . + "] in [$filename] line [$line]")); + } else { + $this->_test->error($severity, $content, $filename, $line); + } + } + + /** + * Pulls the earliest error from the queue. + * @return mixed False if none, or a list of error + * information. Elements are: severity + * as the PHP error code, the error message, + * the file with the error, the line number + * and a list of PHP super global arrays. + * @access public + */ + function extract() { + if (count($this->_queue)) { + return array_shift($this->_queue); + } + return false; + } + + /** + * Pulls the earliest expectation from the queue. + * @return SimpleExpectation False if none. + * @access private + */ + function _extractExpectation() { + if (count($this->_expectation_queue)) { + return array_shift($this->_expectation_queue); + } + return false; + } + + /** + * @deprecated + */ + function assertNoErrors($message) { + return $this->_test->assert( + new TrueExpectation(), + count($this->_queue) == 0, + sprintf($message, 'Should be no errors')); + } + + /** + * @deprecated + */ + function assertError($expected, $message) { + if (count($this->_queue) == 0) { + $this->_test->fail(sprintf($message, 'Expected error not found')); + return false; + } + list($severity, $content, $file, $line) = $this->extract(); + $severity = $this->getSeverityAsString($severity); + return $this->_test->assert( + $expected, + $content, + sprintf($message, "Expected PHP error [$content] severity [$severity] in [$file] line [$line]")); + } + + /** + * Converts an error code into it's string + * representation. + * @param $severity PHP integer error code. + * @return String version of error code. + * @access public + * @static + */ + function getSeverityAsString($severity) { + static $map = array( + E_STRICT => 'E_STRICT', + E_ERROR => 'E_ERROR', + E_WARNING => 'E_WARNING', + E_PARSE => 'E_PARSE', + E_NOTICE => 'E_NOTICE', + E_CORE_ERROR => 'E_CORE_ERROR', + E_CORE_WARNING => 'E_CORE_WARNING', + E_COMPILE_ERROR => 'E_COMPILE_ERROR', + E_COMPILE_WARNING => 'E_COMPILE_WARNING', + E_USER_ERROR => 'E_USER_ERROR', + E_USER_WARNING => 'E_USER_WARNING', + E_USER_NOTICE => 'E_USER_NOTICE'); + if (defined('E_RECOVERABLE_ERROR')) { + $map[E_RECOVERABLE_ERROR] = 'E_RECOVERABLE_ERROR'; + } + if (defined('E_DEPRECATED')) { + $map[E_DEPRECATED] = 'E_DEPRECATED'; + } + return $map[$severity]; + } +} + +/** + * Error handler that simply stashes any errors into the global + * error queue. Simulates the existing behaviour with respect to + * logging errors, but this feature may be removed in future. + * @param $severity PHP error code. + * @param $message Text of error. + * @param $filename File error occoured in. + * @param $line Line number of error. + * @param $super_globals Hash of PHP super global arrays. + * @static + * @access public + */ +function SimpleTestErrorHandler($severity, $message, $filename = null, $line = null, $super_globals = null, $mask = null) { + $severity = $severity & error_reporting(); + if ($severity) { + restore_error_handler(); + if (ini_get('log_errors')) { + $label = SimpleErrorQueue::getSeverityAsString($severity); + error_log("$label: $message in $filename on line $line"); + } + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + $queue->add($severity, $message, $filename, $line); + set_error_handler('SimpleTestErrorHandler'); + } + return true; +} +?> \ No newline at end of file diff --git a/tests/simpletest/exceptions.php b/tests/simpletest/exceptions.php new file mode 100644 index 000000000..c19a04e3a --- /dev/null +++ b/tests/simpletest/exceptions.php @@ -0,0 +1,198 @@ +SimpleInvokerDecorator($invoker); + } + + /** + * Invokes a test method whilst trapping expected + * exceptions. Any left over unthrown exceptions + * are then reported as failures. + * @param string $method Test method to call. + */ + function invoke($method) { + $trap = SimpleTest::getContext()->get('SimpleExceptionTrap'); + $trap->clear(); + try { + $has_thrown = false; + parent::invoke($method); + } catch (Exception $exception) { + $has_thrown = true; + if (! $trap->isExpected($this->getTestCase(), $exception)) { + $this->getTestCase()->exception($exception); + } + $trap->clear(); + } + if ($message = $trap->getOutstanding()) { + $this->getTestCase()->fail($message); + } + if ($has_thrown) { + try { + parent::getTestCase()->tearDown(); + } catch (Exception $e) { } + } + } +} + +/** + * Tests exceptions either by type or the exact + * exception. This could be improved to accept + * a pattern expectation to test the error + * message, but that will have to come later. + * @package SimpleTest + * @subpackage UnitTester + */ +class ExceptionExpectation extends SimpleExpectation { + private $expected; + + /** + * Sets up the conditions to test against. + * If the expected value is a string, then + * it will act as a test of the class name. + * An exception as the comparison will + * trigger an identical match. Writing this + * down now makes it look doubly dumb. I hope + * come up with a better scheme later. + * @param mixed $expected A class name or an actual + * exception to compare with. + * @param string $message Message to display. + */ + function __construct($expected, $message = '%s') { + $this->expected = $expected; + parent::__construct($message); + } + + /** + * Carry out the test. + * @param Exception $compare Value to check. + * @return boolean True if matched. + */ + function test($compare) { + if (is_string($this->expected)) { + return ($compare instanceof $this->expected); + } + if (get_class($compare) != get_class($this->expected)) { + return false; + } + return $compare->getMessage() == $this->expected->getMessage(); + } + + /** + * Create the message to display describing the test. + * @param Exception $compare Exception to match. + * @return string Final message. + */ + function testMessage($compare) { + if (is_string($this->expected)) { + return "Exception [" . $this->describeException($compare) . + "] should be type [" . $this->expected . "]"; + } + return "Exception [" . $this->describeException($compare) . + "] should match [" . + $this->describeException($this->expected) . "]"; + } + + /** + * Summary of an Exception object. + * @param Exception $compare Exception to describe. + * @return string Text description. + */ + protected function describeException($exception) { + return get_class($exception) . ": " . $exception->getMessage(); + } +} + +/** + * Stores expected exceptions for when they + * get thrown. Saves the irritating try...catch + * block. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleExceptionTrap { + private $expected; + private $message; + + /** + * Clears down the queue ready for action. + */ + function __construct() { + $this->clear(); + } + + /** + * Sets up an expectation of an exception. + * This has the effect of intercepting an + * exception that matches. + * @param SimpleExpectation $expected Expected exception to match. + * @param string $message Message to display. + * @access public + */ + function expectException($expected = false, $message = '%s') { + if ($expected === false) { + $expected = new AnythingExpectation(); + } + if (! SimpleExpectation::isExpectation($expected)) { + $expected = new ExceptionExpectation($expected); + } + $this->expected = $expected; + $this->message = $message; + } + + /** + * Compares the expected exception with any + * in the queue. Issues a pass or fail and + * returns the state of the test. + * @param SimpleTestCase $test Test case to send messages to. + * @param Exception $exception Exception to compare. + * @return boolean False on no match. + */ + function isExpected($test, $exception) { + if ($this->expected) { + return $test->assert($this->expected, $exception, $this->message); + } + return false; + } + + /** + * Tests for any left over exception. + * @return string/false The failure message or false if none. + */ + function getOutstanding() { + return sprintf($this->message, 'Failed to trap exception'); + } + + /** + * Discards the contents of the error queue. + */ + function clear() { + $this->expected = false; + $this->message = false; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/expectation.php b/tests/simpletest/expectation.php new file mode 100644 index 000000000..194afd5c7 --- /dev/null +++ b/tests/simpletest/expectation.php @@ -0,0 +1,895 @@ +_message = $message; + } + + /** + * Tests the expectation. True if correct. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + * @abstract + */ + function test($compare) { + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + * @abstract + */ + function testMessage($compare) { + } + + /** + * Overlays the generated message onto the stored user + * message. An additional message can be interjected. + * @param mixed $compare Comparison value. + * @param SimpleDumper $dumper For formatting the results. + * @return string Description of success + * or failure. + * @access public + */ + function overlayMessage($compare, $dumper) { + $this->_dumper = $dumper; + return sprintf($this->_message, $this->testMessage($compare)); + } + + /** + * Accessor for the dumper. + * @return SimpleDumper Current value dumper. + * @access protected + */ + function &_getDumper() { + if (! $this->_dumper) { + $dumper = &new SimpleDumper(); + return $dumper; + } + return $this->_dumper; + } + + /** + * Test to see if a value is an expectation object. + * A useful utility method. + * @param mixed $expectation Hopefully an Epectation + * class. + * @return boolean True if descended from + * this class. + * @access public + * @static + */ + function isExpectation($expectation) { + return is_object($expectation) && + SimpleTestCompatibility::isA($expectation, 'SimpleExpectation'); + } +} + +/** + * A wildcard expectation always matches. + * @package SimpleTest + * @subpackage MockObjects + */ +class AnythingExpectation extends SimpleExpectation { + + /** + * Tests the expectation. Always true. + * @param mixed $compare Ignored. + * @return boolean True. + * @access public + */ + function test($compare) { + return true; + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + return 'Anything always matches [' . $dumper->describeValue($compare) . ']'; + } +} + +/** + * An expectation that never matches. + * @package SimpleTest + * @subpackage MockObjects + */ +class FailedExpectation extends SimpleExpectation { + + /** + * Tests the expectation. Always false. + * @param mixed $compare Ignored. + * @return boolean True. + * @access public + */ + function test($compare) { + return false; + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + return 'Failed expectation never matches [' . $dumper->describeValue($compare) . ']'; + } +} + +/** + * An expectation that passes on boolean true. + * @package SimpleTest + * @subpackage MockObjects + */ +class TrueExpectation extends SimpleExpectation { + + /** + * Tests the expectation. + * @param mixed $compare Should be true. + * @return boolean True on match. + * @access public + */ + function test($compare) { + return (boolean)$compare; + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + return 'Expected true, got [' . $dumper->describeValue($compare) . ']'; + } +} + +/** + * An expectation that passes on boolean false. + * @package SimpleTest + * @subpackage MockObjects + */ +class FalseExpectation extends SimpleExpectation { + + /** + * Tests the expectation. + * @param mixed $compare Should be false. + * @return boolean True on match. + * @access public + */ + function test($compare) { + return ! (boolean)$compare; + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + return 'Expected false, got [' . $dumper->describeValue($compare) . ']'; + } +} + +/** + * Test for equality. + * @package SimpleTest + * @subpackage UnitTester + */ +class EqualExpectation extends SimpleExpectation { + var $_value; + + /** + * Sets the value to compare against. + * @param mixed $value Test value to match. + * @param string $message Customised message on failure. + * @access public + */ + function EqualExpectation($value, $message = '%s') { + $this->SimpleExpectation($message); + $this->_value = $value; + } + + /** + * Tests the expectation. True if it matches the + * held value. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return (($this->_value == $compare) && ($compare == $this->_value)); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + return "Equal expectation [" . $this->_dumper->describeValue($this->_value) . "]"; + } else { + return "Equal expectation fails " . + $this->_dumper->describeDifference($this->_value, $compare); + } + } + + /** + * Accessor for comparison value. + * @return mixed Held value to compare with. + * @access protected + */ + function _getValue() { + return $this->_value; + } +} + +/** + * Test for inequality. + * @package SimpleTest + * @subpackage UnitTester + */ +class NotEqualExpectation extends EqualExpectation { + + /** + * Sets the value to compare against. + * @param mixed $value Test value to match. + * @param string $message Customised message on failure. + * @access public + */ + function NotEqualExpectation($value, $message = '%s') { + $this->EqualExpectation($value, $message); + } + + /** + * Tests the expectation. True if it differs from the + * held value. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return ! parent::test($compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + if ($this->test($compare)) { + return "Not equal expectation passes " . + $dumper->describeDifference($this->_getValue(), $compare); + } else { + return "Not equal expectation fails [" . + $dumper->describeValue($this->_getValue()) . + "] matches"; + } + } +} + +/** + * Test for being within a range. + * @package SimpleTest + * @subpackage UnitTester + */ +class WithinMarginExpectation extends SimpleExpectation { + var $_upper; + var $_lower; + + /** + * Sets the value to compare against and the fuzziness of + * the match. Used for comparing floating point values. + * @param mixed $value Test value to match. + * @param mixed $margin Fuzziness of match. + * @param string $message Customised message on failure. + * @access public + */ + function WithinMarginExpectation($value, $margin, $message = '%s') { + $this->SimpleExpectation($message); + $this->_upper = $value + $margin; + $this->_lower = $value - $margin; + } + + /** + * Tests the expectation. True if it matches the + * held value. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return (($compare <= $this->_upper) && ($compare >= $this->_lower)); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + return $this->_withinMessage($compare); + } else { + return $this->_outsideMessage($compare); + } + } + + /** + * Creates a the message for being within the range. + * @param mixed $compare Value being tested. + * @access private + */ + function _withinMessage($compare) { + return "Within expectation [" . $this->_dumper->describeValue($this->_lower) . "] and [" . + $this->_dumper->describeValue($this->_upper) . "]"; + } + + /** + * Creates a the message for being within the range. + * @param mixed $compare Value being tested. + * @access private + */ + function _outsideMessage($compare) { + if ($compare > $this->_upper) { + return "Outside expectation " . + $this->_dumper->describeDifference($compare, $this->_upper); + } else { + return "Outside expectation " . + $this->_dumper->describeDifference($compare, $this->_lower); + } + } +} + +/** + * Test for being outside of a range. + * @package SimpleTest + * @subpackage UnitTester + */ +class OutsideMarginExpectation extends WithinMarginExpectation { + + /** + * Sets the value to compare against and the fuzziness of + * the match. Used for comparing floating point values. + * @param mixed $value Test value to not match. + * @param mixed $margin Fuzziness of match. + * @param string $message Customised message on failure. + * @access public + */ + function OutsideMarginExpectation($value, $margin, $message = '%s') { + $this->WithinMarginExpectation($value, $margin, $message); + } + + /** + * Tests the expectation. True if it matches the + * held value. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return ! parent::test($compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if (! $this->test($compare)) { + return $this->_withinMessage($compare); + } else { + return $this->_outsideMessage($compare); + } + } +} + +/** + * Test for reference. + * @package SimpleTest + * @subpackage UnitTester + */ +class ReferenceExpectation extends SimpleExpectation { + var $_value; + + /** + * Sets the reference value to compare against. + * @param mixed $value Test reference to match. + * @param string $message Customised message on failure. + * @access public + */ + function ReferenceExpectation(&$value, $message = '%s') { + $this->SimpleExpectation($message); + $this->_value =& $value; + } + + /** + * Tests the expectation. True if it exactly + * references the held value. + * @param mixed $compare Comparison reference. + * @return boolean True if correct. + * @access public + */ + function test(&$compare) { + return SimpleTestCompatibility::isReference($this->_value, $compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + return "Reference expectation [" . $this->_dumper->describeValue($this->_value) . "]"; + } else { + return "Reference expectation fails " . + $this->_dumper->describeDifference($this->_value, $compare); + } + } + + function _getValue() { + return $this->_value; + } +} + +/** + * Test for identity. + * @package SimpleTest + * @subpackage UnitTester + */ +class IdenticalExpectation extends EqualExpectation { + + /** + * Sets the value to compare against. + * @param mixed $value Test value to match. + * @param string $message Customised message on failure. + * @access public + */ + function IdenticalExpectation($value, $message = '%s') { + $this->EqualExpectation($value, $message); + } + + /** + * Tests the expectation. True if it exactly + * matches the held value. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return SimpleTestCompatibility::isIdentical($this->_getValue(), $compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + if ($this->test($compare)) { + return "Identical expectation [" . $dumper->describeValue($this->_getValue()) . "]"; + } else { + return "Identical expectation [" . $dumper->describeValue($this->_getValue()) . + "] fails with [" . + $dumper->describeValue($compare) . "] " . + $dumper->describeDifference($this->_getValue(), $compare, TYPE_MATTERS); + } + } +} + +/** + * Test for non-identity. + * @package SimpleTest + * @subpackage UnitTester + */ +class NotIdenticalExpectation extends IdenticalExpectation { + + /** + * Sets the value to compare against. + * @param mixed $value Test value to match. + * @param string $message Customised message on failure. + * @access public + */ + function NotIdenticalExpectation($value, $message = '%s') { + $this->IdenticalExpectation($value, $message); + } + + /** + * Tests the expectation. True if it differs from the + * held value. + * @param mixed $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return ! parent::test($compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + if ($this->test($compare)) { + return "Not identical expectation passes " . + $dumper->describeDifference($this->_getValue(), $compare, TYPE_MATTERS); + } else { + return "Not identical expectation [" . $dumper->describeValue($this->_getValue()) . "] matches"; + } + } +} + +/** + * Test for a pattern using Perl regex rules. + * @package SimpleTest + * @subpackage UnitTester + */ +class PatternExpectation extends SimpleExpectation { + var $_pattern; + + /** + * Sets the value to compare against. + * @param string $pattern Pattern to search for. + * @param string $message Customised message on failure. + * @access public + */ + function PatternExpectation($pattern, $message = '%s') { + $this->SimpleExpectation($message); + $this->_pattern = $pattern; + } + + /** + * Accessor for the pattern. + * @return string Perl regex as string. + * @access protected + */ + function _getPattern() { + return $this->_pattern; + } + + /** + * Tests the expectation. True if the Perl regex + * matches the comparison value. + * @param string $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return (boolean)preg_match($this->_getPattern(), $compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + return $this->_describePatternMatch($this->_getPattern(), $compare); + } else { + $dumper = &$this->_getDumper(); + return "Pattern [" . $this->_getPattern() . + "] not detected in [" . + $dumper->describeValue($compare) . "]"; + } + } + + /** + * Describes a pattern match including the string + * found and it's position. + * @param string $pattern Regex to match against. + * @param string $subject Subject to search. + * @access protected + */ + function _describePatternMatch($pattern, $subject) { + preg_match($pattern, $subject, $matches); + $position = strpos($subject, $matches[0]); + $dumper = $this->_getDumper(); + return "Pattern [$pattern] detected at character [$position] in [" . + $dumper->describeValue($subject) . "] as [" . + $matches[0] . "] in region [" . + $dumper->clipString($subject, 100, $position) . "]"; + } +} + +/** + * @package SimpleTest + * @subpackage UnitTester + * @deprecated + */ +class WantedPatternExpectation extends PatternExpectation { +} + +/** + * Fail if a pattern is detected within the + * comparison. + * @package SimpleTest + * @subpackage UnitTester + */ +class NoPatternExpectation extends PatternExpectation { + + /** + * Sets the reject pattern + * @param string $pattern Pattern to search for. + * @param string $message Customised message on failure. + * @access public + */ + function NoPatternExpectation($pattern, $message = '%s') { + $this->PatternExpectation($pattern, $message); + } + + /** + * Tests the expectation. False if the Perl regex + * matches the comparison value. + * @param string $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return ! parent::test($compare); + } + + /** + * Returns a human readable test message. + * @param string $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + $dumper = &$this->_getDumper(); + return "Pattern [" . $this->_getPattern() . + "] not detected in [" . + $dumper->describeValue($compare) . "]"; + } else { + return $this->_describePatternMatch($this->_getPattern(), $compare); + } + } +} + +/** + * @package SimpleTest + * @subpackage UnitTester + * @deprecated + */ +class UnwantedPatternExpectation extends NoPatternExpectation { +} + +/** + * Tests either type or class name if it's an object. + * @package SimpleTest + * @subpackage UnitTester + */ +class IsAExpectation extends SimpleExpectation { + var $_type; + + /** + * Sets the type to compare with. + * @param string $type Type or class name. + * @param string $message Customised message on failure. + * @access public + */ + function IsAExpectation($type, $message = '%s') { + $this->SimpleExpectation($message); + $this->_type = $type; + } + + /** + * Accessor for type to check against. + * @return string Type or class name. + * @access protected + */ + function _getType() { + return $this->_type; + } + + /** + * Tests the expectation. True if the type or + * class matches the string value. + * @param string $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + if (is_object($compare)) { + return SimpleTestCompatibility::isA($compare, $this->_type); + } else { + return (strtolower(gettype($compare)) == $this->_canonicalType($this->_type)); + } + } + + /** + * Coerces type name into a gettype() match. + * @param string $type User type. + * @return string Simpler type. + * @access private + */ + function _canonicalType($type) { + $type = strtolower($type); + $map = array( + 'bool' => 'boolean', + 'float' => 'double', + 'real' => 'double', + 'int' => 'integer'); + if (isset($map[$type])) { + $type = $map[$type]; + } + return $type; + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + return "Value [" . $dumper->describeValue($compare) . + "] should be type [" . $this->_type . "]"; + } +} + +/** + * Tests either type or class name if it's an object. + * Will succeed if the type does not match. + * @package SimpleTest + * @subpackage UnitTester + */ +class NotAExpectation extends IsAExpectation { + var $_type; + + /** + * Sets the type to compare with. + * @param string $type Type or class name. + * @param string $message Customised message on failure. + * @access public + */ + function NotAExpectation($type, $message = '%s') { + $this->IsAExpectation($type, $message); + } + + /** + * Tests the expectation. False if the type or + * class matches the string value. + * @param string $compare Comparison value. + * @return boolean True if different. + * @access public + */ + function test($compare) { + return ! parent::test($compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + return "Value [" . $dumper->describeValue($compare) . + "] should not be type [" . $this->_getType() . "]"; + } +} + +/** + * Tests for existance of a method in an object + * @package SimpleTest + * @subpackage UnitTester + */ +class MethodExistsExpectation extends SimpleExpectation { + var $_method; + + /** + * Sets the value to compare against. + * @param string $method Method to check. + * @param string $message Customised message on failure. + * @access public + * @return void + */ + function MethodExistsExpectation($method, $message = '%s') { + $this->SimpleExpectation($message); + $this->_method = &$method; + } + + /** + * Tests the expectation. True if the method exists in the test object. + * @param string $compare Comparison method name. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return (boolean)(is_object($compare) && method_exists($compare, $this->_method)); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + if (! is_object($compare)) { + return 'No method on non-object [' . $dumper->describeValue($compare) . ']'; + } + $method = $this->_method; + return "Object [" . $dumper->describeValue($compare) . + "] should contain method [$method]"; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/extensions/pear_test_case.php b/tests/simpletest/extensions/pear_test_case.php new file mode 100644 index 000000000..f5e5a7b85 --- /dev/null +++ b/tests/simpletest/extensions/pear_test_case.php @@ -0,0 +1,198 @@ +SimpleTestCase($label); + $this->_loosely_typed = false; + } + + /** + * Will test straight equality if set to loose + * typing, or identity if not. + * @param $first First value. + * @param $second Comparison value. + * @param $message Message to display. + * @public + */ + function assertEquals($first, $second, $message = "%s", $delta = 0) { + if ($this->_loosely_typed) { + $expectation = &new EqualExpectation($first); + } else { + $expectation = &new IdenticalExpectation($first); + } + $this->assert($expectation, $second, $message); + } + + /** + * Passes if the value tested is not null. + * @param $value Value to test against. + * @param $message Message to display. + * @public + */ + function assertNotNull($value, $message = "%s") { + parent::assert(new TrueExpectation(), isset($value), $message); + } + + /** + * Passes if the value tested is null. + * @param $value Value to test against. + * @param $message Message to display. + * @public + */ + function assertNull($value, $message = "%s") { + parent::assert(new TrueExpectation(), !isset($value), $message); + } + + /** + * In PHP5 the identity test tests for the same + * object. This is a reference test in PHP4. + * @param $first First object handle. + * @param $second Hopefully the same handle. + * @param $message Message to display. + * @public + */ + function assertSame(&$first, &$second, $message = "%s") { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + "[" . $dumper->describeValue($first) . + "] and [" . $dumper->describeValue($second) . + "] should reference the same object"); + return $this->assert( + new TrueExpectation(), + SimpleTestCompatibility::isReference($first, $second), + $message); + } + + /** + * In PHP5 the identity test tests for the same + * object. This is a reference test in PHP4. + * @param $first First object handle. + * @param $second Hopefully a different handle. + * @param $message Message to display. + * @public + */ + function assertNotSame(&$first, &$second, $message = "%s") { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + "[" . $dumper->describeValue($first) . + "] and [" . $dumper->describeValue($second) . + "] should not be the same object"); + return $this->assert( + new falseExpectation(), + SimpleTestCompatibility::isReference($first, $second), + $message); + } + + /** + * Sends pass if the test condition resolves true, + * a fail otherwise. + * @param $condition Condition to test true. + * @param $message Message to display. + * @public + */ + function assertTrue($condition, $message = "%s") { + parent::assert(new TrueExpectation(), $condition, $message); + } + + /** + * Sends pass if the test condition resolves false, + * a fail otherwise. + * @param $condition Condition to test false. + * @param $message Message to display. + * @public + */ + function assertFalse($condition, $message = "%s") { + parent::assert(new FalseExpectation(), $condition, $message); + } + + /** + * Tests a regex match. Needs refactoring. + * @param $pattern Regex to match. + * @param $subject String to search in. + * @param $message Message to display. + * @public + */ + function assertRegExp($pattern, $subject, $message = "%s") { + $this->assert(new PatternExpectation($pattern), $subject, $message); + } + + /** + * Tests the type of a value. + * @param $value Value to take type of. + * @param $type Hoped for type. + * @param $message Message to display. + * @public + */ + function assertType($value, $type, $message = "%s") { + parent::assert(new TrueExpectation(), gettype($value) == strtolower($type), $message); + } + + /** + * Sets equality operation to act as a simple equal + * comparison only, allowing a broader range of + * matches. + * @param $loosely_typed True for broader comparison. + * @public + */ + function setLooselyTyped($loosely_typed) { + $this->_loosely_typed = $loosely_typed; + } + + /** + * For progress indication during + * a test amongst other things. + * @return Usually one. + * @public + */ + function countTestCases() { + return $this->getSize(); + } + + /** + * Accessor for name, normally just the class + * name. + * @public + */ + function getName() { + return $this->getLabel(); + } + + /** + * Does nothing. For compatibility only. + * @param $name Dummy + * @public + */ + function setName($name) { + } + } +?> diff --git a/tests/simpletest/extensions/phpunit_test_case.php b/tests/simpletest/extensions/phpunit_test_case.php new file mode 100644 index 000000000..e038a4967 --- /dev/null +++ b/tests/simpletest/extensions/phpunit_test_case.php @@ -0,0 +1,96 @@ +SimpleTestCase($label); + } + + /** + * Sends pass if the test condition resolves true, + * a fail otherwise. + * @param $condition Condition to test true. + * @param $message Message to display. + * @public + */ + function assert($condition, $message = false) { + parent::assert(new TrueExpectation(), $condition, $message); + } + + /** + * Will test straight equality if set to loose + * typing, or identity if not. + * @param $first First value. + * @param $second Comparison value. + * @param $message Message to display. + * @public + */ + function assertEquals($first, $second, $message = false) { + parent::assert(new EqualExpectation($first), $second, $message); + } + + /** + * Simple string equality. + * @param $first First value. + * @param $second Comparison value. + * @param $message Message to display. + * @public + */ + function assertEqualsMultilineStrings($first, $second, $message = false) { + parent::assert(new EqualExpectation($first), $second, $message); + } + + /** + * Tests a regex match. + * @param $pattern Regex to match. + * @param $subject String to search in. + * @param $message Message to display. + * @public + */ + function assertRegexp($pattern, $subject, $message = false) { + parent::assert(new PatternExpectation($pattern), $subject, $message); + } + + /** + * Sends an error which we interpret as a fail + * with a different message for compatibility. + * @param $message Message to display. + * @public + */ + function error($message) { + parent::fail("Error triggered [$message]"); + } + + /** + * Accessor for name. + * @public + */ + function name() { + return $this->getLabel(); + } + } +?> diff --git a/tests/simpletest/extensions/testdox.php b/tests/simpletest/extensions/testdox.php new file mode 100644 index 000000000..7db7c872c --- /dev/null +++ b/tests/simpletest/extensions/testdox.php @@ -0,0 +1,42 @@ +_test_case_pattern = empty($test_case_pattern) ? '/^(.*)$/' : $test_case_pattern; + } + + function paintCaseStart($test_name) { + preg_match($this->_test_case_pattern, $test_name, $matches); + if (!empty($matches[1])) { + echo $matches[1] . "\n"; + } else { + echo $test_name . "\n"; + } + } + + function paintCaseEnd() { + echo "\n"; + } + + function paintMethodStart($test_name) { + if (!preg_match('/^test(.*)$/i', $test_name, $matches)) { + return; + } + $test_name = $matches[1]; + + $test_name = preg_replace('/([A-Z])([A-Z])/', '$1 $2', $test_name); + echo '- ' . strtolower(preg_replace('/([a-zA-Z])([A-Z0-9])/', '$1 $2', $test_name)); + } + + function paintMethodEnd() { + echo "\n"; + } + + function paintFail() { + echo " [FAILED]"; + } +} diff --git a/tests/simpletest/extensions/testdox/test.php b/tests/simpletest/extensions/testdox/test.php new file mode 100644 index 000000000..82c5b7da8 --- /dev/null +++ b/tests/simpletest/extensions/testdox/test.php @@ -0,0 +1,108 @@ +assertIsA($dox, 'SimpleScorer'); + $this->assertIsA($dox, 'SimpleReporter'); + } + + function testOutputsNameOfTestCase() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintCaseStart('TestOfTestDoxReporter'); + $buffer = ob_get_clean(); + $this->assertWantedPattern('/^TestDoxReporter/', $buffer); + } + + function testOutputOfTestCaseNameFilteredByConstructParameter() { + $dox = new TestDoxReporter('/^(.*)Test$/'); + ob_start(); + $dox->paintCaseStart('SomeGreatWidgetTest'); + $buffer = ob_get_clean(); + $this->assertWantedPattern('/^SomeGreatWidget/', $buffer); + } + + function testIfTest_case_patternIsEmptyAssumeEverythingMatches() { + $dox = new TestDoxReporter(''); + ob_start(); + $dox->paintCaseStart('TestOfTestDoxReporter'); + $buffer = ob_get_clean(); + $this->assertWantedPattern('/^TestOfTestDoxReporter/', $buffer); + } + + function testEmptyLineInsertedWhenCaseEnds() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintCaseEnd('TestOfTestDoxReporter'); + $buffer = ob_get_clean(); + $this->assertEqual("\n", $buffer); + } + + function testPaintsTestMethodInTestDoxFormat() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintMethodStart('testSomeGreatTestCase'); + $buffer = ob_get_clean(); + $this->assertEqual("- some great test case", $buffer); + unset($buffer); + + $random = rand(100, 200); + ob_start(); + $dox->paintMethodStart("testRandomNumberIs{$random}"); + $buffer = ob_get_clean(); + $this->assertEqual("- random number is {$random}", $buffer); + } + + function testDoesNotOutputAnythingOnNoneTestMethods() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintMethodStart('nonMatchingMethod'); + $buffer = ob_get_clean(); + $this->assertEqual('', $buffer); + } + + function testPaintMethodAddLineBreak() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintMethodEnd('someMethod'); + $buffer = ob_get_clean(); + $this->assertEqual("\n", $buffer); + $this->assertNoErrors(); + } + + function testProperlySpacesSingleLettersInMethodName() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintMethodStart('testAVerySimpleAgainAVerySimpleMethod'); + $buffer = ob_get_clean(); + $this->assertEqual('- a very simple again a very simple method', $buffer); + } + + function testOnFailureThisPrintsFailureNotice() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintFail(); + $buffer = ob_get_clean(); + $this->assertEqual(' [FAILED]', $buffer); + } + + function testWhenMatchingMethodNamesTestPrefixIsCaseInsensitive() { + $dox = new TestDoxReporter(); + ob_start(); + $dox->paintMethodStart('TESTSupportsAllUppercaseTestPrefixEvenThoughIDoNotKnowWhyYouWouldDoThat'); + $buffer = ob_get_clean(); + $this->assertEqual( + '- supports all uppercase test prefix even though i do not know why you would do that', + $buffer + ); + } +} + diff --git a/tests/simpletest/form.php b/tests/simpletest/form.php new file mode 100644 index 000000000..cbef6636d --- /dev/null +++ b/tests/simpletest/form.php @@ -0,0 +1,355 @@ +_method = $tag->getAttribute('method'); + $this->_action = $this->_createAction($tag->getAttribute('action'), $page); + $this->_encoding = $this->_setEncodingClass($tag); + $this->_default_target = false; + $this->_id = $tag->getAttribute('id'); + $this->_buttons = array(); + $this->_images = array(); + $this->_widgets = array(); + $this->_radios = array(); + $this->_checkboxes = array(); + } + + /** + * Creates the request packet to be sent by the form. + * @param SimpleTag $tag Form tag to read. + * @return string Packet class. + * @access private + */ + function _setEncodingClass($tag) { + if (strtolower($tag->getAttribute('method')) == 'post') { + if (strtolower($tag->getAttribute('enctype')) == 'multipart/form-data') { + return 'SimpleMultipartEncoding'; + } + return 'SimplePostEncoding'; + } + return 'SimpleGetEncoding'; + } + + /** + * Sets the frame target within a frameset. + * @param string $frame Name of frame. + * @access public + */ + function setDefaultTarget($frame) { + $this->_default_target = $frame; + } + + /** + * Accessor for method of form submission. + * @return string Either get or post. + * @access public + */ + function getMethod() { + return ($this->_method ? strtolower($this->_method) : 'get'); + } + + /** + * Combined action attribute with current location + * to get an absolute form target. + * @param string $action Action attribute from form tag. + * @param SimpleUrl $base Page location. + * @return SimpleUrl Absolute form target. + */ + function _createAction($action, &$page) { + if (($action === '') || ($action === false)) { + return $page->expandUrl($page->getUrl()); + } + return $page->expandUrl(new SimpleUrl($action));; + } + + /** + * Absolute URL of the target. + * @return SimpleUrl URL target. + * @access public + */ + function getAction() { + $url = $this->_action; + if ($this->_default_target && ! $url->getTarget()) { + $url->setTarget($this->_default_target); + } + return $url; + } + + /** + * Creates the encoding for the current values in the + * form. + * @return SimpleFormEncoding Request to submit. + * @access private + */ + function _encode() { + $class = $this->_encoding; + $encoding = new $class(); + for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) { + $this->_widgets[$i]->write($encoding); + } + return $encoding; + } + + /** + * ID field of form for unique identification. + * @return string Unique tag ID. + * @access public + */ + function getId() { + return $this->_id; + } + + /** + * Adds a tag contents to the form. + * @param SimpleWidget $tag Input tag to add. + * @access public + */ + function addWidget(&$tag) { + if (strtolower($tag->getAttribute('type')) == 'submit') { + $this->_buttons[] = &$tag; + } elseif (strtolower($tag->getAttribute('type')) == 'image') { + $this->_images[] = &$tag; + } elseif ($tag->getName()) { + $this->_setWidget($tag); + } + } + + /** + * Sets the widget into the form, grouping radio + * buttons if any. + * @param SimpleWidget $tag Incoming form control. + * @access private + */ + function _setWidget(&$tag) { + if (strtolower($tag->getAttribute('type')) == 'radio') { + $this->_addRadioButton($tag); + } elseif (strtolower($tag->getAttribute('type')) == 'checkbox') { + $this->_addCheckbox($tag); + } else { + $this->_widgets[] = &$tag; + } + } + + /** + * Adds a radio button, building a group if necessary. + * @param SimpleRadioButtonTag $tag Incoming form control. + * @access private + */ + function _addRadioButton(&$tag) { + if (! isset($this->_radios[$tag->getName()])) { + $this->_widgets[] = &new SimpleRadioGroup(); + $this->_radios[$tag->getName()] = count($this->_widgets) - 1; + } + $this->_widgets[$this->_radios[$tag->getName()]]->addWidget($tag); + } + + /** + * Adds a checkbox, making it a group on a repeated name. + * @param SimpleCheckboxTag $tag Incoming form control. + * @access private + */ + function _addCheckbox(&$tag) { + if (! isset($this->_checkboxes[$tag->getName()])) { + $this->_widgets[] = &$tag; + $this->_checkboxes[$tag->getName()] = count($this->_widgets) - 1; + } else { + $index = $this->_checkboxes[$tag->getName()]; + if (! SimpleTestCompatibility::isA($this->_widgets[$index], 'SimpleCheckboxGroup')) { + $previous = &$this->_widgets[$index]; + $this->_widgets[$index] = &new SimpleCheckboxGroup(); + $this->_widgets[$index]->addWidget($previous); + } + $this->_widgets[$index]->addWidget($tag); + } + } + + /** + * Extracts current value from form. + * @param SimpleSelector $selector Criteria to apply. + * @return string/array Value(s) as string or null + * if not set. + * @access public + */ + function getValue($selector) { + for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) { + if ($selector->isMatch($this->_widgets[$i])) { + return $this->_widgets[$i]->getValue(); + } + } + foreach ($this->_buttons as $button) { + if ($selector->isMatch($button)) { + return $button->getValue(); + } + } + return null; + } + + /** + * Sets a widget value within the form. + * @param SimpleSelector $selector Criteria to apply. + * @param string $value Value to input into the widget. + * @return boolean True if value is legal, false + * otherwise. If the field is not + * present, nothing will be set. + * @access public + */ + function setField($selector, $value, $position=false) { + $success = false; + $_position = 0; + for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) { + if ($selector->isMatch($this->_widgets[$i])) { + $_position++; + if ($position === false or $_position === (int)$position) { + if ($this->_widgets[$i]->setValue($value)) { + $success = true; + } + } + } + } + return $success; + } + + /** + * Used by the page object to set widgets labels to + * external label tags. + * @param SimpleSelector $selector Criteria to apply. + * @access public + */ + function attachLabelBySelector($selector, $label) { + for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) { + if ($selector->isMatch($this->_widgets[$i])) { + if (method_exists($this->_widgets[$i], 'setLabel')) { + $this->_widgets[$i]->setLabel($label); + return; + } + } + } + } + + /** + * Test to see if a form has a submit button. + * @param SimpleSelector $selector Criteria to apply. + * @return boolean True if present. + * @access public + */ + function hasSubmit($selector) { + foreach ($this->_buttons as $button) { + if ($selector->isMatch($button)) { + return true; + } + } + return false; + } + + /** + * Test to see if a form has an image control. + * @param SimpleSelector $selector Criteria to apply. + * @return boolean True if present. + * @access public + */ + function hasImage($selector) { + foreach ($this->_images as $image) { + if ($selector->isMatch($image)) { + return true; + } + } + return false; + } + + /** + * Gets the submit values for a selected button. + * @param SimpleSelector $selector Criteria to apply. + * @param hash $additional Additional data for the form. + * @return SimpleEncoding Submitted values or false + * if there is no such button + * in the form. + * @access public + */ + function submitButton($selector, $additional = false) { + $additional = $additional ? $additional : array(); + foreach ($this->_buttons as $button) { + if ($selector->isMatch($button)) { + $encoding = $this->_encode(); + $button->write($encoding); + if ($additional) { + $encoding->merge($additional); + } + return $encoding; + } + } + return false; + } + + /** + * Gets the submit values for an image. + * @param SimpleSelector $selector Criteria to apply. + * @param integer $x X-coordinate of click. + * @param integer $y Y-coordinate of click. + * @param hash $additional Additional data for the form. + * @return SimpleEncoding Submitted values or false + * if there is no such button in the + * form. + * @access public + */ + function submitImage($selector, $x, $y, $additional = false) { + $additional = $additional ? $additional : array(); + foreach ($this->_images as $image) { + if ($selector->isMatch($image)) { + $encoding = $this->_encode(); + $image->write($encoding, $x, $y); + if ($additional) { + $encoding->merge($additional); + } + return $encoding; + } + } + return false; + } + + /** + * Simply submits the form without the submit button + * value. Used when there is only one button or it + * is unimportant. + * @return hash Submitted values. + * @access public + */ + function submit() { + return $this->_encode(); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/frames.php b/tests/simpletest/frames.php new file mode 100644 index 000000000..ec098df9e --- /dev/null +++ b/tests/simpletest/frames.php @@ -0,0 +1,596 @@ +_frameset = &$page; + $this->_frames = array(); + $this->_focus = false; + $this->_names = array(); + } + + /** + * Adds a parsed page to the frameset. + * @param SimplePage $page Frame page. + * @param string $name Name of frame in frameset. + * @access public + */ + function addFrame(&$page, $name = false) { + $this->_frames[] = &$page; + if ($name) { + $this->_names[$name] = count($this->_frames) - 1; + } + } + + /** + * Replaces existing frame with another. If the + * frame is nested, then the call is passed down + * one level. + * @param array $path Path of frame in frameset. + * @param SimplePage $page Frame source. + * @access public + */ + function setFrame($path, &$page) { + $name = array_shift($path); + if (isset($this->_names[$name])) { + $index = $this->_names[$name]; + } else { + $index = $name - 1; + } + if (count($path) == 0) { + $this->_frames[$index] = &$page; + return; + } + $this->_frames[$index]->setFrame($path, $page); + } + + /** + * Accessor for current frame focus. Will be + * false if no frame has focus. Will have the nested + * frame focus if any. + * @return array Labels or indexes of nested frames. + * @access public + */ + function getFrameFocus() { + if ($this->_focus === false) { + return array(); + } + return array_merge( + array($this->_getPublicNameFromIndex($this->_focus)), + $this->_frames[$this->_focus]->getFrameFocus()); + } + + /** + * Turns an internal array index into the frames list + * into a public name, or if none, then a one offset + * index. + * @param integer $subject Internal index. + * @return integer/string Public name. + * @access private + */ + function _getPublicNameFromIndex($subject) { + foreach ($this->_names as $name => $index) { + if ($subject == $index) { + return $name; + } + } + return $subject + 1; + } + + /** + * Sets the focus by index. The integer index starts from 1. + * If already focused and the target frame also has frames, + * then the nested frame will be focused. + * @param integer $choice Chosen frame. + * @return boolean True if frame exists. + * @access public + */ + function setFrameFocusByIndex($choice) { + if (is_integer($this->_focus)) { + if ($this->_frames[$this->_focus]->hasFrames()) { + return $this->_frames[$this->_focus]->setFrameFocusByIndex($choice); + } + } + if (($choice < 1) || ($choice > count($this->_frames))) { + return false; + } + $this->_focus = $choice - 1; + return true; + } + + /** + * Sets the focus by name. If already focused and the + * target frame also has frames, then the nested frame + * will be focused. + * @param string $name Chosen frame. + * @return boolean True if frame exists. + * @access public + */ + function setFrameFocus($name) { + if (is_integer($this->_focus)) { + if ($this->_frames[$this->_focus]->hasFrames()) { + return $this->_frames[$this->_focus]->setFrameFocus($name); + } + } + if (in_array($name, array_keys($this->_names))) { + $this->_focus = $this->_names[$name]; + return true; + } + return false; + } + + /** + * Clears the frame focus. + * @access public + */ + function clearFrameFocus() { + $this->_focus = false; + $this->_clearNestedFramesFocus(); + } + + /** + * Clears the frame focus for any nested frames. + * @access private + */ + function _clearNestedFramesFocus() { + for ($i = 0; $i < count($this->_frames); $i++) { + $this->_frames[$i]->clearFrameFocus(); + } + } + + /** + * Test for the presence of a frameset. + * @return boolean Always true. + * @access public + */ + function hasFrames() { + return true; + } + + /** + * Accessor for frames information. + * @return array/string Recursive hash of frame URL strings. + * The key is either a numerical + * index or the name attribute. + * @access public + */ + function getFrames() { + $report = array(); + for ($i = 0; $i < count($this->_frames); $i++) { + $report[$this->_getPublicNameFromIndex($i)] = + $this->_frames[$i]->getFrames(); + } + return $report; + } + + /** + * Accessor for raw text of either all the pages or + * the frame in focus. + * @return string Raw unparsed content. + * @access public + */ + function getRaw() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getRaw(); + } + $raw = ''; + for ($i = 0; $i < count($this->_frames); $i++) { + $raw .= $this->_frames[$i]->getRaw(); + } + return $raw; + } + + /** + * Accessor for plain text of either all the pages or + * the frame in focus. + * @return string Plain text content. + * @access public + */ + function getText() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getText(); + } + $raw = ''; + for ($i = 0; $i < count($this->_frames); $i++) { + $raw .= ' ' . $this->_frames[$i]->getText(); + } + return trim($raw); + } + + /** + * Accessor for last error. + * @return string Error from last response. + * @access public + */ + function getTransportError() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getTransportError(); + } + return $this->_frameset->getTransportError(); + } + + /** + * Request method used to fetch this frame. + * @return string GET, POST or HEAD. + * @access public + */ + function getMethod() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getMethod(); + } + return $this->_frameset->getMethod(); + } + + /** + * Original resource name. + * @return SimpleUrl Current url. + * @access public + */ + function getUrl() { + if (is_integer($this->_focus)) { + $url = $this->_frames[$this->_focus]->getUrl(); + $url->setTarget($this->_getPublicNameFromIndex($this->_focus)); + } else { + $url = $this->_frameset->getUrl(); + } + return $url; + } + + /** + * Page base URL. + * @return SimpleUrl Current url. + * @access public + */ + function getBaseUrl() { + if (is_integer($this->_focus)) { + $url = $this->_frames[$this->_focus]->getBaseUrl(); + } else { + $url = $this->_frameset->getBaseUrl(); + } + return $url; + } + + /** + * Expands expandomatic URLs into fully qualified + * URLs for the frameset page. + * @param SimpleUrl $url Relative URL. + * @return SimpleUrl Absolute URL. + * @access public + */ + function expandUrl($url) { + return $this->_frameset->expandUrl($url); + } + + /** + * Original request data. + * @return mixed Sent content. + * @access public + */ + function getRequestData() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getRequestData(); + } + return $this->_frameset->getRequestData(); + } + + /** + * Accessor for current MIME type. + * @return string MIME type as string; e.g. 'text/html' + * @access public + */ + function getMimeType() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getMimeType(); + } + return $this->_frameset->getMimeType(); + } + + /** + * Accessor for last response code. + * @return integer Last HTTP response code received. + * @access public + */ + function getResponseCode() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getResponseCode(); + } + return $this->_frameset->getResponseCode(); + } + + /** + * Accessor for last Authentication type. Only valid + * straight after a challenge (401). + * @return string Description of challenge type. + * @access public + */ + function getAuthentication() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getAuthentication(); + } + return $this->_frameset->getAuthentication(); + } + + /** + * Accessor for last Authentication realm. Only valid + * straight after a challenge (401). + * @return string Name of security realm. + * @access public + */ + function getRealm() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getRealm(); + } + return $this->_frameset->getRealm(); + } + + /** + * Accessor for outgoing header information. + * @return string Header block. + * @access public + */ + function getRequest() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getRequest(); + } + return $this->_frameset->getRequest(); + } + + /** + * Accessor for raw header information. + * @return string Header block. + * @access public + */ + function getHeaders() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getHeaders(); + } + return $this->_frameset->getHeaders(); + } + + /** + * Accessor for parsed title. + * @return string Title or false if no title is present. + * @access public + */ + function getTitle() { + return $this->_frameset->getTitle(); + } + + /** + * Accessor for a list of all fixed links. + * @return array List of urls as strings. + * @access public + */ + function getUrls() { + if (is_integer($this->_focus)) { + return $this->_frames[$this->_focus]->getUrls(); + } + $urls = array(); + foreach ($this->_frames as $frame) { + $urls = array_merge($urls, $frame->getUrls()); + } + return array_values(array_unique($urls)); + } + + /** + * Accessor for URLs by the link label. Label will match + * regardess of whitespace issues and case. + * @param string $label Text of link. + * @return array List of links with that label. + * @access public + */ + function getUrlsByLabel($label) { + if (is_integer($this->_focus)) { + return $this->_tagUrlsWithFrame( + $this->_frames[$this->_focus]->getUrlsByLabel($label), + $this->_focus); + } + $urls = array(); + foreach ($this->_frames as $index => $frame) { + $urls = array_merge( + $urls, + $this->_tagUrlsWithFrame( + $frame->getUrlsByLabel($label), + $index)); + } + return $urls; + } + + /** + * Accessor for a URL by the id attribute. If in a frameset + * then the first link found with that ID attribute is + * returned only. Focus on a frame if you want one from + * a specific part of the frameset. + * @param string $id Id attribute of link. + * @return string URL with that id. + * @access public + */ + function getUrlById($id) { + foreach ($this->_frames as $index => $frame) { + if ($url = $frame->getUrlById($id)) { + if (! $url->gettarget()) { + $url->setTarget($this->_getPublicNameFromIndex($index)); + } + return $url; + } + } + return false; + } + + /** + * Attaches the intended frame index to a list of URLs. + * @param array $urls List of SimpleUrls. + * @param string $frame Name of frame or index. + * @return array List of tagged URLs. + * @access private + */ + function _tagUrlsWithFrame($urls, $frame) { + $tagged = array(); + foreach ($urls as $url) { + if (! $url->getTarget()) { + $url->setTarget($this->_getPublicNameFromIndex($frame)); + } + $tagged[] = $url; + } + return $tagged; + } + + /** + * Finds a held form by button label. Will only + * search correctly built forms. + * @param SimpleSelector $selector Button finder. + * @return SimpleForm Form object containing + * the button. + * @access public + */ + function &getFormBySubmit($selector) { + $form = &$this->_findForm('getFormBySubmit', $selector); + return $form; + } + + /** + * Finds a held form by image using a selector. + * Will only search correctly built forms. The first + * form found either within the focused frame, or + * across frames, will be the one returned. + * @param SimpleSelector $selector Image finder. + * @return SimpleForm Form object containing + * the image. + * @access public + */ + function &getFormByImage($selector) { + $form = &$this->_findForm('getFormByImage', $selector); + return $form; + } + + /** + * Finds a held form by the form ID. A way of + * identifying a specific form when we have control + * of the HTML code. The first form found + * either within the focused frame, or across frames, + * will be the one returned. + * @param string $id Form label. + * @return SimpleForm Form object containing the matching ID. + * @access public + */ + function &getFormById($id) { + $form = &$this->_findForm('getFormById', $id); + return $form; + } + + /** + * General form finder. Will search all the frames or + * just the one in focus. + * @param string $method Method to use to find in a page. + * @param string $attribute Label, name or ID. + * @return SimpleForm Form object containing the matching ID. + * @access private + */ + function &_findForm($method, $attribute) { + if (is_integer($this->_focus)) { + $form = &$this->_findFormInFrame( + $this->_frames[$this->_focus], + $this->_focus, + $method, + $attribute); + return $form; + } + for ($i = 0; $i < count($this->_frames); $i++) { + $form = &$this->_findFormInFrame( + $this->_frames[$i], + $i, + $method, + $attribute); + if ($form) { + return $form; + } + } + $null = null; + return $null; + } + + /** + * Finds a form in a page using a form finding method. Will + * also tag the form with the frame name it belongs in. + * @param SimplePage $page Page content of frame. + * @param integer $index Internal frame representation. + * @param string $method Method to use to find in a page. + * @param string $attribute Label, name or ID. + * @return SimpleForm Form object containing the matching ID. + * @access private + */ + function &_findFormInFrame(&$page, $index, $method, $attribute) { + $form = &$this->_frames[$index]->$method($attribute); + if (isset($form)) { + $form->setDefaultTarget($this->_getPublicNameFromIndex($index)); + } + return $form; + } + + /** + * Sets a field on each form in which the field is + * available. + * @param SimpleSelector $selector Field finder. + * @param string $value Value to set field to. + * @return boolean True if value is valid. + * @access public + */ + function setField($selector, $value) { + if (is_integer($this->_focus)) { + $this->_frames[$this->_focus]->setField($selector, $value); + } else { + for ($i = 0; $i < count($this->_frames); $i++) { + $this->_frames[$i]->setField($selector, $value); + } + } + } + + /** + * Accessor for a form element value within a page. + * @param SimpleSelector $selector Field finder. + * @return string/boolean A string if the field is + * present, false if unchecked + * and null if missing. + * @access public + */ + function getField($selector) { + for ($i = 0; $i < count($this->_frames); $i++) { + $value = $this->_frames[$i]->getField($selector); + if (isset($value)) { + return $value; + } + } + return null; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/http.php b/tests/simpletest/http.php new file mode 100644 index 000000000..e6c6e89da --- /dev/null +++ b/tests/simpletest/http.php @@ -0,0 +1,624 @@ +_url = $url; + } + + /** + * Resource name. + * @return SimpleUrl Current url. + * @access protected + */ + function getUrl() { + return $this->_url; + } + + /** + * Creates the first line which is the actual request. + * @param string $method HTTP request method, usually GET. + * @return string Request line content. + * @access protected + */ + function _getRequestLine($method) { + return $method . ' ' . $this->_url->getPath() . + $this->_url->getEncodedRequest() . ' HTTP/1.0'; + } + + /** + * Creates the host part of the request. + * @return string Host line content. + * @access protected + */ + function _getHostLine() { + $line = 'Host: ' . $this->_url->getHost(); + if ($this->_url->getPort()) { + $line .= ':' . $this->_url->getPort(); + } + return $line; + } + + /** + * Opens a socket to the route. + * @param string $method HTTP request method, usually GET. + * @param integer $timeout Connection timeout. + * @return SimpleSocket New socket. + * @access public + */ + function &createConnection($method, $timeout) { + $default_port = ('https' == $this->_url->getScheme()) ? 443 : 80; + $socket = &$this->_createSocket( + $this->_url->getScheme() ? $this->_url->getScheme() : 'http', + $this->_url->getHost(), + $this->_url->getPort() ? $this->_url->getPort() : $default_port, + $timeout); + if (! $socket->isError()) { + $socket->write($this->_getRequestLine($method) . "\r\n"); + $socket->write($this->_getHostLine() . "\r\n"); + $socket->write("Connection: close\r\n"); + } + return $socket; + } + + /** + * Factory for socket. + * @param string $scheme Protocol to use. + * @param string $host Hostname to connect to. + * @param integer $port Remote port. + * @param integer $timeout Connection timeout. + * @return SimpleSocket/SimpleSecureSocket New socket. + * @access protected + */ + function &_createSocket($scheme, $host, $port, $timeout) { + if (in_array($scheme, array('https'))) { + $socket = &new SimpleSecureSocket($host, $port, $timeout); + } else { + $socket = &new SimpleSocket($host, $port, $timeout); + } + return $socket; + } +} + +/** + * Creates HTTP headers for the end point of + * a HTTP request via a proxy server. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleProxyRoute extends SimpleRoute { + var $_proxy; + var $_username; + var $_password; + + /** + * Stashes the proxy address. + * @param SimpleUrl $url URL as object. + * @param string $proxy Proxy URL. + * @param string $username Username for autentication. + * @param string $password Password for autentication. + * @access public + */ + function SimpleProxyRoute($url, $proxy, $username = false, $password = false) { + $this->SimpleRoute($url); + $this->_proxy = $proxy; + $this->_username = $username; + $this->_password = $password; + } + + /** + * Creates the first line which is the actual request. + * @param string $method HTTP request method, usually GET. + * @param SimpleUrl $url URL as object. + * @return string Request line content. + * @access protected + */ + function _getRequestLine($method) { + $url = $this->getUrl(); + $scheme = $url->getScheme() ? $url->getScheme() : 'http'; + $port = $url->getPort() ? ':' . $url->getPort() : ''; + return $method . ' ' . $scheme . '://' . $url->getHost() . $port . + $url->getPath() . $url->getEncodedRequest() . ' HTTP/1.0'; + } + + /** + * Creates the host part of the request. + * @param SimpleUrl $url URL as object. + * @return string Host line content. + * @access protected + */ + function _getHostLine() { + $host = 'Host: ' . $this->_proxy->getHost(); + $port = $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080; + return "$host:$port"; + } + + /** + * Opens a socket to the route. + * @param string $method HTTP request method, usually GET. + * @param integer $timeout Connection timeout. + * @return SimpleSocket New socket. + * @access public + */ + function &createConnection($method, $timeout) { + $socket = &$this->_createSocket( + $this->_proxy->getScheme() ? $this->_proxy->getScheme() : 'http', + $this->_proxy->getHost(), + $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080, + $timeout); + if ($socket->isError()) { + return $socket; + } + $socket->write($this->_getRequestLine($method) . "\r\n"); + $socket->write($this->_getHostLine() . "\r\n"); + if ($this->_username && $this->_password) { + $socket->write('Proxy-Authorization: Basic ' . + base64_encode($this->_username . ':' . $this->_password) . + "\r\n"); + } + $socket->write("Connection: close\r\n"); + return $socket; + } +} + +/** + * HTTP request for a web page. Factory for + * HttpResponse object. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleHttpRequest { + var $_route; + var $_encoding; + var $_headers; + var $_cookies; + + /** + * Builds the socket request from the different pieces. + * These include proxy information, URL, cookies, headers, + * request method and choice of encoding. + * @param SimpleRoute $route Request route. + * @param SimpleFormEncoding $encoding Content to send with + * request. + * @access public + */ + function SimpleHttpRequest(&$route, $encoding) { + $this->_route = &$route; + $this->_encoding = $encoding; + $this->_headers = array(); + $this->_cookies = array(); + } + + /** + * Dispatches the content to the route's socket. + * @param integer $timeout Connection timeout. + * @return SimpleHttpResponse A response which may only have + * an error, but hopefully has a + * complete web page. + * @access public + */ + function &fetch($timeout) { + $socket = &$this->_route->createConnection($this->_encoding->getMethod(), $timeout); + if (! $socket->isError()) { + $this->_dispatchRequest($socket, $this->_encoding); + } + $response = &$this->_createResponse($socket); + return $response; + } + + /** + * Sends the headers. + * @param SimpleSocket $socket Open socket. + * @param string $method HTTP request method, + * usually GET. + * @param SimpleFormEncoding $encoding Content to send with request. + * @access private + */ + function _dispatchRequest(&$socket, $encoding) { + foreach ($this->_headers as $header_line) { + $socket->write($header_line . "\r\n"); + } + if (count($this->_cookies) > 0) { + $socket->write("Cookie: " . implode(";", $this->_cookies) . "\r\n"); + } + $encoding->writeHeadersTo($socket); + $socket->write("\r\n"); + $encoding->writeTo($socket); + } + + /** + * Adds a header line to the request. + * @param string $header_line Text of full header line. + * @access public + */ + function addHeaderLine($header_line) { + $this->_headers[] = $header_line; + } + + /** + * Reads all the relevant cookies from the + * cookie jar. + * @param SimpleCookieJar $jar Jar to read + * @param SimpleUrl $url Url to use for scope. + * @access public + */ + function readCookiesFromJar($jar, $url) { + $this->_cookies = $jar->selectAsPairs($url); + } + + /** + * Wraps the socket in a response parser. + * @param SimpleSocket $socket Responding socket. + * @return SimpleHttpResponse Parsed response object. + * @access protected + */ + function &_createResponse(&$socket) { + $response = &new SimpleHttpResponse( + $socket, + $this->_route->getUrl(), + $this->_encoding); + return $response; + } +} + +/** + * Collection of header lines in the response. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleHttpHeaders { + var $_raw_headers; + var $_response_code; + var $_http_version; + var $_mime_type; + var $_location; + var $_cookies; + var $_authentication; + var $_realm; + + /** + * Parses the incoming header block. + * @param string $headers Header block. + * @access public + */ + function SimpleHttpHeaders($headers) { + $this->_raw_headers = $headers; + $this->_response_code = false; + $this->_http_version = false; + $this->_mime_type = ''; + $this->_location = false; + $this->_cookies = array(); + $this->_authentication = false; + $this->_realm = false; + foreach (split("\r\n", $headers) as $header_line) { + $this->_parseHeaderLine($header_line); + } + } + + /** + * Accessor for parsed HTTP protocol version. + * @return integer HTTP error code. + * @access public + */ + function getHttpVersion() { + return $this->_http_version; + } + + /** + * Accessor for raw header block. + * @return string All headers as raw string. + * @access public + */ + function getRaw() { + return $this->_raw_headers; + } + + /** + * Accessor for parsed HTTP error code. + * @return integer HTTP error code. + * @access public + */ + function getResponseCode() { + return (integer)$this->_response_code; + } + + /** + * Returns the redirected URL or false if + * no redirection. + * @return string URL or false for none. + * @access public + */ + function getLocation() { + return $this->_location; + } + + /** + * Test to see if the response is a valid redirect. + * @return boolean True if valid redirect. + * @access public + */ + function isRedirect() { + return in_array($this->_response_code, array(301, 302, 303, 307)) && + (boolean)$this->getLocation(); + } + + /** + * Test to see if the response is an authentication + * challenge. + * @return boolean True if challenge. + * @access public + */ + function isChallenge() { + return ($this->_response_code == 401) && + (boolean)$this->_authentication && + (boolean)$this->_realm; + } + + /** + * Accessor for MIME type header information. + * @return string MIME type. + * @access public + */ + function getMimeType() { + return $this->_mime_type; + } + + /** + * Accessor for authentication type. + * @return string Type. + * @access public + */ + function getAuthentication() { + return $this->_authentication; + } + + /** + * Accessor for security realm. + * @return string Realm. + * @access public + */ + function getRealm() { + return $this->_realm; + } + + /** + * Writes new cookies to the cookie jar. + * @param SimpleCookieJar $jar Jar to write to. + * @param SimpleUrl $url Host and path to write under. + * @access public + */ + function writeCookiesToJar(&$jar, $url) { + foreach ($this->_cookies as $cookie) { + $jar->setCookie( + $cookie->getName(), + $cookie->getValue(), + $url->getHost(), + $cookie->getPath(), + $cookie->getExpiry()); + } + } + + /** + * Called on each header line to accumulate the held + * data within the class. + * @param string $header_line One line of header. + * @access protected + */ + function _parseHeaderLine($header_line) { + if (preg_match('/HTTP\/(\d+\.\d+)\s+(\d+)/i', $header_line, $matches)) { + $this->_http_version = $matches[1]; + $this->_response_code = $matches[2]; + } + if (preg_match('/Content-type:\s*(.*)/i', $header_line, $matches)) { + $this->_mime_type = trim($matches[1]); + } + if (preg_match('/Location:\s*(.*)/i', $header_line, $matches)) { + $this->_location = trim($matches[1]); + } + if (preg_match('/Set-cookie:(.*)/i', $header_line, $matches)) { + $this->_cookies[] = $this->_parseCookie($matches[1]); + } + if (preg_match('/WWW-Authenticate:\s+(\S+)\s+realm=\"(.*?)\"/i', $header_line, $matches)) { + $this->_authentication = $matches[1]; + $this->_realm = trim($matches[2]); + } + } + + /** + * Parse the Set-cookie content. + * @param string $cookie_line Text after "Set-cookie:" + * @return SimpleCookie New cookie object. + * @access private + */ + function _parseCookie($cookie_line) { + $parts = split(";", $cookie_line); + $cookie = array(); + preg_match('/\s*(.*?)\s*=(.*)/', array_shift($parts), $cookie); + foreach ($parts as $part) { + if (preg_match('/\s*(.*?)\s*=(.*)/', $part, $matches)) { + $cookie[$matches[1]] = trim($matches[2]); + } + } + return new SimpleCookie( + $cookie[1], + trim($cookie[2]), + isset($cookie["path"]) ? $cookie["path"] : "", + isset($cookie["expires"]) ? $cookie["expires"] : false); + } +} + +/** + * Basic HTTP response. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleHttpResponse extends SimpleStickyError { + var $_url; + var $_encoding; + var $_sent; + var $_content; + var $_headers; + + /** + * Constructor. Reads and parses the incoming + * content and headers. + * @param SimpleSocket $socket Network connection to fetch + * response text from. + * @param SimpleUrl $url Resource name. + * @param mixed $encoding Record of content sent. + * @access public + */ + function SimpleHttpResponse(&$socket, $url, $encoding) { + $this->SimpleStickyError(); + $this->_url = $url; + $this->_encoding = $encoding; + $this->_sent = $socket->getSent(); + $this->_content = false; + $raw = $this->_readAll($socket); + if ($socket->isError()) { + $this->_setError('Error reading socket [' . $socket->getError() . ']'); + return; + } + $this->_parse($raw); + } + + /** + * Splits up the headers and the rest of the content. + * @param string $raw Content to parse. + * @access private + */ + function _parse($raw) { + if (! $raw) { + $this->_setError('Nothing fetched'); + $this->_headers = &new SimpleHttpHeaders(''); + } elseif (! strstr($raw, "\r\n\r\n")) { + $this->_setError('Could not split headers from content'); + $this->_headers = &new SimpleHttpHeaders($raw); + } else { + list($headers, $this->_content) = split("\r\n\r\n", $raw, 2); + $this->_headers = &new SimpleHttpHeaders($headers); + } + } + + /** + * Original request method. + * @return string GET, POST or HEAD. + * @access public + */ + function getMethod() { + return $this->_encoding->getMethod(); + } + + /** + * Resource name. + * @return SimpleUrl Current url. + * @access public + */ + function getUrl() { + return $this->_url; + } + + /** + * Original request data. + * @return mixed Sent content. + * @access public + */ + function getRequestData() { + return $this->_encoding; + } + + /** + * Raw request that was sent down the wire. + * @return string Bytes actually sent. + * @access public + */ + function getSent() { + return $this->_sent; + } + + /** + * Accessor for the content after the last + * header line. + * @return string All content. + * @access public + */ + function getContent() { + return $this->_content; + } + + /** + * Accessor for header block. The response is the + * combination of this and the content. + * @return SimpleHeaders Wrapped header block. + * @access public + */ + function getHeaders() { + return $this->_headers; + } + + /** + * Accessor for any new cookies. + * @return array List of new cookies. + * @access public + */ + function getNewCookies() { + return $this->_headers->getNewCookies(); + } + + /** + * Reads the whole of the socket output into a + * single string. + * @param SimpleSocket $socket Unread socket. + * @return string Raw output if successful + * else false. + * @access private + */ + function _readAll(&$socket) { + $all = ''; + while (! $this->_isLastPacket($next = $socket->read())) { + $all .= $next; + } + return $all; + } + + /** + * Test to see if the packet from the socket is the + * last one. + * @param string $packet Chunk to interpret. + * @return boolean True if empty or EOF. + * @access private + */ + function _isLastPacket($packet) { + if (is_string($packet)) { + return $packet === ''; + } + return ! $packet; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/invoker.php b/tests/simpletest/invoker.php new file mode 100644 index 000000000..e2730013e --- /dev/null +++ b/tests/simpletest/invoker.php @@ -0,0 +1,139 @@ +_test_case = &$test_case; + } + + /** + * Accessor for test case being run. + * @return SimpleTestCase Test case. + * @access public + */ + function &getTestCase() { + return $this->_test_case; + } + + /** + * Runs test level set up. Used for changing + * the mechanics of base test cases. + * @param string $method Test method to call. + * @access public + */ + function before($method) { + $this->_test_case->before($method); + } + + /** + * Invokes a test method and buffered with setUp() + * and tearDown() calls. + * @param string $method Test method to call. + * @access public + */ + function invoke($method) { + $this->_test_case->setUp(); + $this->_test_case->$method(); + $this->_test_case->tearDown(); + } + + /** + * Runs test level clean up. Used for changing + * the mechanics of base test cases. + * @param string $method Test method to call. + * @access public + */ + function after($method) { + $this->_test_case->after($method); + } +} + +/** + * Do nothing decorator. Just passes the invocation + * straight through. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleInvokerDecorator { + var $_invoker; + + /** + * Stores the invoker to wrap. + * @param SimpleInvoker $invoker Test method runner. + */ + function SimpleInvokerDecorator(&$invoker) { + $this->_invoker = &$invoker; + } + + /** + * Accessor for test case being run. + * @return SimpleTestCase Test case. + * @access public + */ + function &getTestCase() { + return $this->_invoker->getTestCase(); + } + + /** + * Runs test level set up. Used for changing + * the mechanics of base test cases. + * @param string $method Test method to call. + * @access public + */ + function before($method) { + $this->_invoker->before($method); + } + + /** + * Invokes a test method and buffered with setUp() + * and tearDown() calls. + * @param string $method Test method to call. + * @access public + */ + function invoke($method) { + $this->_invoker->invoke($method); + } + + /** + * Runs test level clean up. Used for changing + * the mechanics of base test cases. + * @param string $method Test method to call. + * @access public + */ + function after($method) { + $this->_invoker->after($method); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/mock_objects.php b/tests/simpletest/mock_objects.php new file mode 100644 index 000000000..5ef15751d --- /dev/null +++ b/tests/simpletest/mock_objects.php @@ -0,0 +1,1581 @@ += 0) { + require_once(dirname(__FILE__) . '/reflection_php5.php'); +} else { + require_once(dirname(__FILE__) . '/reflection_php4.php'); +} +/**#@-*/ + +/** + * Default character simpletest will substitute for any value + */ +if (! defined('MOCK_ANYTHING')) { + define('MOCK_ANYTHING', '*'); +} + +/** + * Parameter comparison assertion. + * @package SimpleTest + * @subpackage MockObjects + */ +class ParametersExpectation extends SimpleExpectation { + var $_expected; + + /** + * Sets the expected parameter list. + * @param array $parameters Array of parameters including + * those that are wildcarded. + * If the value is not an array + * then it is considered to match any. + * @param string $message Customised message on failure. + * @access public + */ + function ParametersExpectation($expected = false, $message = '%s') { + $this->SimpleExpectation($message); + $this->_expected = $expected; + } + + /** + * Tests the assertion. True if correct. + * @param array $parameters Comparison values. + * @return boolean True if correct. + * @access public + */ + function test($parameters) { + if (! is_array($this->_expected)) { + return true; + } + if (count($this->_expected) != count($parameters)) { + return false; + } + for ($i = 0; $i < count($this->_expected); $i++) { + if (! $this->_testParameter($parameters[$i], $this->_expected[$i])) { + return false; + } + } + return true; + } + + /** + * Tests an individual parameter. + * @param mixed $parameter Value to test. + * @param mixed $expected Comparison value. + * @return boolean True if expectation + * fulfilled. + * @access private + */ + function _testParameter($parameter, $expected) { + $comparison = $this->_coerceToExpectation($expected); + return $comparison->test($parameter); + } + + /** + * Returns a human readable test message. + * @param array $comparison Incoming parameter list. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($parameters) { + if ($this->test($parameters)) { + return "Expectation of " . count($this->_expected) . + " arguments of [" . $this->_renderArguments($this->_expected) . + "] is correct"; + } else { + return $this->_describeDifference($this->_expected, $parameters); + } + } + + /** + * Message to display if expectation differs from + * the parameters actually received. + * @param array $expected Expected parameters as list. + * @param array $parameters Actual parameters received. + * @return string Description of difference. + * @access private + */ + function _describeDifference($expected, $parameters) { + if (count($expected) != count($parameters)) { + return "Expected " . count($expected) . + " arguments of [" . $this->_renderArguments($expected) . + "] but got " . count($parameters) . + " arguments of [" . $this->_renderArguments($parameters) . "]"; + } + $messages = array(); + for ($i = 0; $i < count($expected); $i++) { + $comparison = $this->_coerceToExpectation($expected[$i]); + if (! $comparison->test($parameters[$i])) { + $messages[] = "parameter " . ($i + 1) . " with [" . + $comparison->overlayMessage($parameters[$i], $this->_getDumper()) . "]"; + } + } + return "Parameter expectation differs at " . implode(" and ", $messages); + } + + /** + * Creates an identical expectation if the + * object/value is not already some type + * of expectation. + * @param mixed $expected Expected value. + * @return SimpleExpectation Expectation object. + * @access private + */ + function _coerceToExpectation($expected) { + if (SimpleExpectation::isExpectation($expected)) { + return $expected; + } + return new IdenticalExpectation($expected); + } + + /** + * Renders the argument list as a string for + * messages. + * @param array $args Incoming arguments. + * @return string Simple description of type and value. + * @access private + */ + function _renderArguments($args) { + $descriptions = array(); + if (is_array($args)) { + foreach ($args as $arg) { + $dumper = &new SimpleDumper(); + $descriptions[] = $dumper->describeValue($arg); + } + } + return implode(', ', $descriptions); + } +} + +/** + * Confirms that the number of calls on a method is as expected. + * @package SimpleTest + * @subpackage MockObjects + */ +class CallCountExpectation extends SimpleExpectation { + var $_method; + var $_count; + + /** + * Stashes the method and expected count for later + * reporting. + * @param string $method Name of method to confirm against. + * @param integer $count Expected number of calls. + * @param string $message Custom error message. + */ + function CallCountExpectation($method, $count, $message = '%s') { + $this->_method = $method; + $this->_count = $count; + $this->SimpleExpectation($message); + } + + /** + * Tests the assertion. True if correct. + * @param integer $compare Measured call count. + * @return boolean True if expected. + * @access public + */ + function test($compare) { + return ($this->_count == $compare); + } + + /** + * Reports the comparison. + * @param integer $compare Measured call count. + * @return string Message to show. + * @access public + */ + function testMessage($compare) { + return 'Expected call count for [' . $this->_method . + '] was [' . $this->_count . + '] got [' . $compare . ']'; + } +} + +/** + * Confirms that the number of calls on a method is as expected. + * @package SimpleTest + * @subpackage MockObjects + */ +class MinimumCallCountExpectation extends SimpleExpectation { + var $_method; + var $_count; + + /** + * Stashes the method and expected count for later + * reporting. + * @param string $method Name of method to confirm against. + * @param integer $count Minimum number of calls. + * @param string $message Custom error message. + */ + function MinimumCallCountExpectation($method, $count, $message = '%s') { + $this->_method = $method; + $this->_count = $count; + $this->SimpleExpectation($message); + } + + /** + * Tests the assertion. True if correct. + * @param integer $compare Measured call count. + * @return boolean True if enough. + * @access public + */ + function test($compare) { + return ($this->_count <= $compare); + } + + /** + * Reports the comparison. + * @param integer $compare Measured call count. + * @return string Message to show. + * @access public + */ + function testMessage($compare) { + return 'Minimum call count for [' . $this->_method . + '] was [' . $this->_count . + '] got [' . $compare . ']'; + } +} + +/** + * Confirms that the number of calls on a method is as expected. + * @package SimpleTest + * @subpackage MockObjects + */ +class MaximumCallCountExpectation extends SimpleExpectation { + var $_method; + var $_count; + + /** + * Stashes the method and expected count for later + * reporting. + * @param string $method Name of method to confirm against. + * @param integer $count Minimum number of calls. + * @param string $message Custom error message. + */ + function MaximumCallCountExpectation($method, $count, $message = '%s') { + $this->_method = $method; + $this->_count = $count; + $this->SimpleExpectation($message); + } + + /** + * Tests the assertion. True if correct. + * @param integer $compare Measured call count. + * @return boolean True if not over. + * @access public + */ + function test($compare) { + return ($this->_count >= $compare); + } + + /** + * Reports the comparison. + * @param integer $compare Measured call count. + * @return string Message to show. + * @access public + */ + function testMessage($compare) { + return 'Maximum call count for [' . $this->_method . + '] was [' . $this->_count . + '] got [' . $compare . ']'; + } +} + +/** + * Retrieves method actions by searching the + * parameter lists until an expected match is found. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleSignatureMap { + var $_map; + + /** + * Creates an empty call map. + * @access public + */ + function SimpleSignatureMap() { + $this->_map = array(); + } + + /** + * Stashes a reference against a method call. + * @param array $parameters Array of arguments (including wildcards). + * @param mixed $action Reference placed in the map. + * @access public + */ + function add($parameters, &$action) { + $place = count($this->_map); + $this->_map[$place] = array(); + $this->_map[$place]['params'] = new ParametersExpectation($parameters); + $this->_map[$place]['content'] = &$action; + } + + /** + * Searches the call list for a matching parameter + * set. Returned by reference. + * @param array $parameters Parameters to search by + * without wildcards. + * @return object Object held in the first matching + * slot, otherwise null. + * @access public + */ + function &findFirstAction($parameters) { + $slot = $this->_findFirstSlot($parameters); + if (isset($slot) && isset($slot['content'])) { + return $slot['content']; + } + $null = null; + return $null; + } + + /** + * Searches the call list for a matching parameter + * set. True if successful. + * @param array $parameters Parameters to search by + * without wildcards. + * @return boolean True if a match is present. + * @access public + */ + function isMatch($parameters) { + return ($this->_findFirstSlot($parameters) != null); + } + + /** + * Compares the incoming parameters with the + * internal expectation. Uses the incoming $test + * to dispatch the test message. + * @param SimpleTestCase $test Test to dispatch to. + * @param array $parameters The actual calling arguments. + * @param string $message The message to overlay. + * @access public + */ + function test(&$test, $parameters, $message) { + } + + /** + * Searches the map for a matching item. + * @param array $parameters Parameters to search by + * without wildcards. + * @return array Reference to slot or null. + * @access private + */ + function &_findFirstSlot($parameters) { + $count = count($this->_map); + for ($i = 0; $i < $count; $i++) { + if ($this->_map[$i]["params"]->test($parameters)) { + return $this->_map[$i]; + } + } + $null = null; + return $null; + } +} + +/** + * Allows setting of actions against call signatures either + * at a specific time, or always. Specific time settings + * trump lasting ones, otherwise the most recently added + * will mask an earlier match. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleCallSchedule { + var $_wildcard = MOCK_ANYTHING; + var $_always; + var $_at; + + /** + * Sets up an empty response schedule. + * Creates an empty call map. + */ + function SimpleCallSchedule() { + $this->_always = array(); + $this->_at = array(); + } + + /** + * Stores an action against a signature that + * will always fire unless masked by a time + * specific one. + * @param string $method Method name. + * @param array $args Calling parameters. + * @param SimpleAction $action Actually simpleByValue, etc. + * @access public + */ + function register($method, $args, &$action) { + $args = $this->_replaceWildcards($args); + $method = strtolower($method); + if (! isset($this->_always[$method])) { + $this->_always[$method] = new SimpleSignatureMap(); + } + $this->_always[$method]->add($args, $action); + } + + /** + * Stores an action against a signature that + * will fire at a specific time in the future. + * @param integer $step delay of calls to this method, + * 0 is next. + * @param string $method Method name. + * @param array $args Calling parameters. + * @param SimpleAction $action Actually SimpleByValue, etc. + * @access public + */ + function registerAt($step, $method, $args, &$action) { + $args = $this->_replaceWildcards($args); + $method = strtolower($method); + if (! isset($this->_at[$method])) { + $this->_at[$method] = array(); + } + if (! isset($this->_at[$method][$step])) { + $this->_at[$method][$step] = new SimpleSignatureMap(); + } + $this->_at[$method][$step]->add($args, $action); + } + + function expectArguments($method, $args, $message) { + $args = $this->_replaceWildcards($args); + $message .= Mock::getExpectationLine(); + $this->_expected_args[strtolower($method)] = + new ParametersExpectation($args, $message); + + } + + /** + * Actually carry out the action stored previously, + * if the parameters match. + * @param integer $step Time of call. + * @param string $method Method name. + * @param array $args The parameters making up the + * rest of the call. + * @return mixed The result of the action. + * @access public. + */ + function &respond($step, $method, $args) { + $method = strtolower($method); + if (isset($this->_at[$method][$step])) { + if ($this->_at[$method][$step]->isMatch($args)) { + $action = &$this->_at[$method][$step]->findFirstAction($args); + if (isset($action)) { + return $action->act(); + } + } + } + if (isset($this->_always[$method])) { + $action = &$this->_always[$method]->findFirstAction($args); + if (isset($action)) { + return $action->act(); + } + } + $null = null; + return $null; + } + + /** + * Replaces wildcard matches with wildcard + * expectations in the argument list. + * @param array $args Raw argument list. + * @return array Argument list with + * expectations. + * @access private + */ + function _replaceWildcards($args) { + if ($args === false) { + return false; + } + for ($i = 0; $i < count($args); $i++) { + if ($args[$i] === $this->_wildcard) { + $args[$i] = new AnythingExpectation(); + } + } + return $args; + } +} + +/** + * A type of SimpleMethodAction. + * Stashes a reference for returning later. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleByReference { + var $_reference; + + /** + * Stashes it for later. + * @param mixed $reference Actual PHP4 style reference. + * @access public + */ + function SimpleByReference(&$reference) { + $this->_reference = &$reference; + } + + /** + * Returns the reference stored earlier. + * @return mixed Whatever was stashed. + * @access public + */ + function &act() { + return $this->_reference; + } +} + +/** + * A type of SimpleMethodAction. + * Stashes a value for returning later. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleByValue { + var $_value; + + /** + * Stashes it for later. + * @param mixed $value You need to clone objects + * if you want copy semantics + * for these. + * @access public + */ + function SimpleByValue($value) { + $this->_value = $value; + } + + /** + * Returns the value stored earlier. + * @return mixed Whatever was stashed. + * @access public + */ + function &act() { + $dummy = $this->_value; + return $dummy; + } +} + +/** + * A type of SimpleMethodAction. + * Stashes an exception for throwing later. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleThrower { + var $_exception; + + /** + * Stashes it for later. + * @param Exception $exception The exception object to throw. + * @access public + */ + function SimpleThrower($exception) { + $this->_exception = $exception; + } + + /** + * Throws the exceptins stashed earlier. + * @access public + */ + function act() { + eval('throw $this->_exception;'); + } +} + +/** + * A type of SimpleMethodAction. + * Stashes an error for emitting later. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleErrorThrower { + var $_error; + var $_severity; + + /** + * Stashes an error to throw later. + * @param string $error Error message. + * @param integer $severity PHP error constant, e.g E_USER_ERROR. + * @access public + */ + function SimpleErrorThrower($error, $severity) { + $this->_error = $error; + $this->_severity = $severity; + } + + /** + * Triggers the stashed error. + * @return null The usual PHP4.4 shenanigans are needed here. + * @access public + */ + function &act() { + trigger_error($this->_error, $this->_severity); + $null = null; + return $null; + } +} + +/** + * A base class or delegate that extends an + * empty collection of methods that can have their + * return values set and expectations made of the + * calls upon them. The mock will assert the + * expectations against it's attached test case in + * addition to the server stub behaviour or returning + * preprogrammed responses. + * @package SimpleTest + * @subpackage MockObjects + */ +class SimpleMock { + var $_actions; + var $_wildcard = MOCK_ANYTHING; + var $_is_strict = true; + var $_call_counts; + var $_expected_counts; + var $_max_counts; + var $_expected_args; + var $_expected_args_at; + + /** + * Creates an empty action list and expectation list. + * All call counts are set to zero. + * @access public + */ + function SimpleMock() { + $this->_actions = &new SimpleCallSchedule(); + $this->_expectations = &new SimpleCallSchedule(); + $this->_call_counts = array(); + $this->_expected_counts = array(); + $this->_max_counts = array(); + $this->_expected_args = array(); + $this->_expected_args_at = array(); + $test = &$this->_getCurrentTestCase(); + $test->tell($this); + } + + /** + * Disables a name check when setting expectations. + * This hack is needed for the partial mocks. + * @access public + */ + function disableExpectationNameChecks() { + $this->_is_strict = false; + } + + /** + * Finds currently running test. + * @return SimpeTestCase Current test case. + * @access protected + */ + function &_getCurrentTestCase() { + $context = &SimpleTest::getContext(); + return $context->getTest(); + } + + /** + * Die if bad arguments array is passed. + * @param mixed $args The arguments value to be checked. + * @param string $task Description of task attempt. + * @return boolean Valid arguments + * @access private + */ + function _checkArgumentsIsArray($args, $task) { + if (! is_array($args)) { + trigger_error( + "Cannot $task as \$args parameter is not an array", + E_USER_ERROR); + } + } + + /** + * Triggers a PHP error if the method is not part + * of this object. + * @param string $method Name of method. + * @param string $task Description of task attempt. + * @access protected + */ + function _dieOnNoMethod($method, $task) { + if ($this->_is_strict && ! method_exists($this, $method)) { + trigger_error( + "Cannot $task as no ${method}() in class " . get_class($this), + E_USER_ERROR); + } + } + + /** + * Replaces wildcard matches with wildcard + * expectations in the argument list. + * @param array $args Raw argument list. + * @return array Argument list with + * expectations. + * @access private + */ + function _replaceWildcards($args) { + if ($args === false) { + return false; + } + for ($i = 0; $i < count($args); $i++) { + if ($args[$i] === $this->_wildcard) { + $args[$i] = new AnythingExpectation(); + } + } + return $args; + } + + /** + * Adds one to the call count of a method. + * @param string $method Method called. + * @param array $args Arguments as an array. + * @access protected + */ + function _addCall($method, $args) { + if (! isset($this->_call_counts[$method])) { + $this->_call_counts[$method] = 0; + } + $this->_call_counts[$method]++; + } + + /** + * Fetches the call count of a method so far. + * @param string $method Method name called. + * @return integer Number of calls so far. + * @access public + */ + function getCallCount($method) { + $this->_dieOnNoMethod($method, "get call count"); + $method = strtolower($method); + if (! isset($this->_call_counts[$method])) { + return 0; + } + return $this->_call_counts[$method]; + } + + /** + * Sets a return for a parameter list that will + * be passed by value for all calls to this method. + * @param string $method Method name. + * @param mixed $value Result of call passed by value. + * @param array $args List of parameters to match + * including wildcards. + * @access public + */ + function setReturnValue($method, $value, $args = false) { + $this->_dieOnNoMethod($method, "set return value"); + $this->_actions->register($method, $args, new SimpleByValue($value)); + } + + /** + * Sets a return for a parameter list that will + * be passed by value only when the required call count + * is reached. + * @param integer $timing Number of calls in the future + * to which the result applies. If + * not set then all calls will return + * the value. + * @param string $method Method name. + * @param mixed $value Result of call passed by value. + * @param array $args List of parameters to match + * including wildcards. + * @access public + */ + function setReturnValueAt($timing, $method, $value, $args = false) { + $this->_dieOnNoMethod($method, "set return value sequence"); + $this->_actions->registerAt($timing, $method, $args, new SimpleByValue($value)); + } + + /** + * Sets a return for a parameter list that will + * be passed by reference for all calls. + * @param string $method Method name. + * @param mixed $reference Result of the call will be this object. + * @param array $args List of parameters to match + * including wildcards. + * @access public + */ + function setReturnReference($method, &$reference, $args = false) { + $this->_dieOnNoMethod($method, "set return reference"); + $this->_actions->register($method, $args, new SimpleByReference($reference)); + } + + /** + * Sets a return for a parameter list that will + * be passed by value only when the required call count + * is reached. + * @param integer $timing Number of calls in the future + * to which the result applies. If + * not set then all calls will return + * the value. + * @param string $method Method name. + * @param mixed $reference Result of the call will be this object. + * @param array $args List of parameters to match + * including wildcards. + * @access public + */ + function setReturnReferenceAt($timing, $method, &$reference, $args = false) { + $this->_dieOnNoMethod($method, "set return reference sequence"); + $this->_actions->registerAt($timing, $method, $args, new SimpleByReference($reference)); + } + + /** + * Sets up an expected call with a set of + * expected parameters in that call. All + * calls will be compared to these expectations + * regardless of when the call is made. + * @param string $method Method call to test. + * @param array $args Expected parameters for the call + * including wildcards. + * @param string $message Overridden message. + * @access public + */ + function expect($method, $args, $message = '%s') { + $this->_dieOnNoMethod($method, 'set expected arguments'); + $this->_checkArgumentsIsArray($args, 'set expected arguments'); + $this->_expectations->expectArguments($method, $args, $message); + $args = $this->_replaceWildcards($args); + $message .= Mock::getExpectationLine(); + $this->_expected_args[strtolower($method)] = + new ParametersExpectation($args, $message); + } + + /** + * @deprecated + */ + function expectArguments($method, $args, $message = '%s') { + return $this->expect($method, $args, $message); + } + + /** + * Sets up an expected call with a set of + * expected parameters in that call. The + * expected call count will be adjusted if it + * is set too low to reach this call. + * @param integer $timing Number of calls in the future at + * which to test. Next call is 0. + * @param string $method Method call to test. + * @param array $args Expected parameters for the call + * including wildcards. + * @param string $message Overridden message. + * @access public + */ + function expectAt($timing, $method, $args, $message = '%s') { + $this->_dieOnNoMethod($method, 'set expected arguments at time'); + $this->_checkArgumentsIsArray($args, 'set expected arguments at time'); + $args = $this->_replaceWildcards($args); + if (! isset($this->_expected_args_at[$timing])) { + $this->_expected_args_at[$timing] = array(); + } + $method = strtolower($method); + $message .= Mock::getExpectationLine(); + $this->_expected_args_at[$timing][$method] = + new ParametersExpectation($args, $message); + } + + /** + * @deprecated + */ + function expectArgumentsAt($timing, $method, $args, $message = '%s') { + return $this->expectAt($timing, $method, $args, $message); + } + + /** + * Sets an expectation for the number of times + * a method will be called. The tally method + * is used to check this. + * @param string $method Method call to test. + * @param integer $count Number of times it should + * have been called at tally. + * @param string $message Overridden message. + * @access public + */ + function expectCallCount($method, $count, $message = '%s') { + $this->_dieOnNoMethod($method, 'set expected call count'); + $message .= Mock::getExpectationLine(); + $this->_expected_counts[strtolower($method)] = + new CallCountExpectation($method, $count, $message); + } + + /** + * Sets the number of times a method may be called + * before a test failure is triggered. + * @param string $method Method call to test. + * @param integer $count Most number of times it should + * have been called. + * @param string $message Overridden message. + * @access public + */ + function expectMaximumCallCount($method, $count, $message = '%s') { + $this->_dieOnNoMethod($method, 'set maximum call count'); + $message .= Mock::getExpectationLine(); + $this->_max_counts[strtolower($method)] = + new MaximumCallCountExpectation($method, $count, $message); + } + + /** + * Sets the number of times to call a method to prevent + * a failure on the tally. + * @param string $method Method call to test. + * @param integer $count Least number of times it should + * have been called. + * @param string $message Overridden message. + * @access public + */ + function expectMinimumCallCount($method, $count, $message = '%s') { + $this->_dieOnNoMethod($method, 'set minimum call count'); + $message .= Mock::getExpectationLine(); + $this->_expected_counts[strtolower($method)] = + new MinimumCallCountExpectation($method, $count, $message); + } + + /** + * Convenience method for barring a method + * call. + * @param string $method Method call to ban. + * @param string $message Overridden message. + * @access public + */ + function expectNever($method, $message = '%s') { + $this->expectMaximumCallCount($method, 0, $message); + } + + /** + * Convenience method for a single method + * call. + * @param string $method Method call to track. + * @param array $args Expected argument list or + * false for any arguments. + * @param string $message Overridden message. + * @access public + */ + function expectOnce($method, $args = false, $message = '%s') { + $this->expectCallCount($method, 1, $message); + if ($args !== false) { + $this->expect($method, $args, $message); + } + } + + /** + * Convenience method for requiring a method + * call. + * @param string $method Method call to track. + * @param array $args Expected argument list or + * false for any arguments. + * @param string $message Overridden message. + * @access public + */ + function expectAtLeastOnce($method, $args = false, $message = '%s') { + $this->expectMinimumCallCount($method, 1, $message); + if ($args !== false) { + $this->expect($method, $args, $message); + } + } + + /** + * Sets up a trigger to throw an exception upon the + * method call. + * @param string $method Method name to throw on. + */ + function throwOn($method, $exception = false, $args = false) { + $this->_dieOnNoMethod($method, "throw on"); + $this->_actions->register($method, $args, + new SimpleThrower($exception ? $exception : new Exception())); + } + + /** + * Sets up a trigger to throw an exception upon the + * method call. + */ + function throwAt($timing, $method, $exception = false, $args = false) { + $this->_dieOnNoMethod($method, "throw at"); + $this->_actions->registerAt($timing, $method, $args, + new SimpleThrower($exception ? $exception : new Exception())); + } + + /** + * Sets up a trigger to throw an error upon the + * method call. + */ + function errorOn($method, $error = 'A mock error', $args = false, $severity = E_USER_ERROR) { + $this->_dieOnNoMethod($method, "error on"); + $this->_actions->register($method, $args, new SimpleErrorThrower($error, $severity)); + } + + /** + * Sets up a trigger to throw an error upon the + * method call. + */ + function errorAt($timing, $method, $error = 'A mock error', $args = false, $severity = E_USER_ERROR) { + $this->_dieOnNoMethod($method, "error at"); + $this->_actions->registerAt($timing, $method, $args, new SimpleErrorThrower($error, $severity)); + } + + /** + * @deprecated + */ + function tally() { + } + + /** + * Receives event from unit test that the current + * test method has finished. Totals up the call + * counts and triggers a test assertion if a test + * is present for expected call counts. + * @param string $test_method Current method name. + * @param SimpleTestCase $test Test to send message to. + * @access public + */ + function atTestEnd($test_method, &$test) { + foreach ($this->_expected_counts as $method => $expectation) { + $test->assert($expectation, $this->getCallCount($method)); + } + foreach ($this->_max_counts as $method => $expectation) { + if ($expectation->test($this->getCallCount($method))) { + $test->assert($expectation, $this->getCallCount($method)); + } + } + } + + /** + * Returns the expected value for the method name + * and checks expectations. Will generate any + * test assertions as a result of expectations + * if there is a test present. + * @param string $method Name of method to simulate. + * @param array $args Arguments as an array. + * @return mixed Stored return. + * @access private + */ + function &_invoke($method, $args) { + $method = strtolower($method); + $step = $this->getCallCount($method); + $this->_addCall($method, $args); + $this->_checkExpectations($method, $args, $step); + $result = &$this->_emulateCall($method, $args, $step); + return $result; + } + + /** + * Finds the return value matching the incoming + * arguments. If there is no matching value found + * then an error is triggered. + * @param string $method Method name. + * @param array $args Calling arguments. + * @param integer $step Current position in the + * call history. + * @return mixed Stored return or other action. + * @access protected + */ + function &_emulateCall($method, $args, $step) { + return $this->_actions->respond($step, $method, $args); + } + + /** + * Tests the arguments against expectations. + * @param string $method Method to check. + * @param array $args Argument list to match. + * @param integer $timing The position of this call + * in the call history. + * @access private + */ + function _checkExpectations($method, $args, $timing) { + $test = &$this->_getCurrentTestCase(); + if (isset($this->_max_counts[$method])) { + if (! $this->_max_counts[$method]->test($timing + 1)) { + $test->assert($this->_max_counts[$method], $timing + 1); + } + } + if (isset($this->_expected_args_at[$timing][$method])) { + $test->assert( + $this->_expected_args_at[$timing][$method], + $args, + "Mock method [$method] at [$timing] -> %s"); + } elseif (isset($this->_expected_args[$method])) { + $test->assert( + $this->_expected_args[$method], + $args, + "Mock method [$method] -> %s"); + } + } +} + +/** + * Static methods only service class for code generation of + * mock objects. + * @package SimpleTest + * @subpackage MockObjects + */ +class Mock { + + /** + * Factory for mock object classes. + * @access public + */ + function Mock() { + trigger_error('Mock factory methods are static.'); + } + + /** + * Clones a class' interface and creates a mock version + * that can have return values and expectations set. + * @param string $class Class to clone. + * @param string $mock_class New class name. Default is + * the old name with "Mock" + * prepended. + * @param array $methods Additional methods to add beyond + * those in the cloned class. Use this + * to emulate the dynamic addition of + * methods in the cloned class or when + * the class hasn't been written yet. + * @static + * @access public + */ + function generate($class, $mock_class = false, $methods = false) { + $generator = new MockGenerator($class, $mock_class); + return $generator->generateSubclass($methods); + } + + /** + * Generates a version of a class with selected + * methods mocked only. Inherits the old class + * and chains the mock methods of an aggregated + * mock object. + * @param string $class Class to clone. + * @param string $mock_class New class name. + * @param array $methods Methods to be overridden + * with mock versions. + * @static + * @access public + */ + function generatePartial($class, $mock_class, $methods) { + $generator = new MockGenerator($class, $mock_class); + return $generator->generatePartial($methods); + } + + /** + * Uses a stack trace to find the line of an assertion. + * @access public + * @static + */ + function getExpectationLine() { + $trace = new SimpleStackTrace(array('expect')); + return $trace->traceMethod(); + } +} + +/** + * @package SimpleTest + * @subpackage MockObjects + * @deprecated + */ +class Stub extends Mock { +} + +/** + * Service class for code generation of mock objects. + * @package SimpleTest + * @subpackage MockObjects + */ +class MockGenerator { + var $_class; + var $_mock_class; + var $_mock_base; + var $_reflection; + + /** + * Builds initial reflection object. + * @param string $class Class to be mocked. + * @param string $mock_class New class with identical interface, + * but no behaviour. + */ + function MockGenerator($class, $mock_class) { + $this->_class = $class; + $this->_mock_class = $mock_class; + if (! $this->_mock_class) { + $this->_mock_class = 'Mock' . $this->_class; + } + $this->_mock_base = SimpleTest::getMockBaseClass(); + $this->_reflection = new SimpleReflection($this->_class); + } + + /** + * Clones a class' interface and creates a mock version + * that can have return values and expectations set. + * @param array $methods Additional methods to add beyond + * those in th cloned class. Use this + * to emulate the dynamic addition of + * methods in the cloned class or when + * the class hasn't been written yet. + * @access public + */ + function generate($methods) { + if (! $this->_reflection->classOrInterfaceExists()) { + return false; + } + $mock_reflection = new SimpleReflection($this->_mock_class); + if ($mock_reflection->classExistsSansAutoload()) { + return false; + } + $code = $this->_createClassCode($methods ? $methods : array()); + return eval("$code return \$code;"); + } + + /** + * Subclasses a class and overrides every method with a mock one + * that can have return values and expectations set. Chains + * to an aggregated SimpleMock. + * @param array $methods Additional methods to add beyond + * those in the cloned class. Use this + * to emulate the dynamic addition of + * methods in the cloned class or when + * the class hasn't been written yet. + * @access public + */ + function generateSubclass($methods) { + if (! $this->_reflection->classOrInterfaceExists()) { + return false; + } + $mock_reflection = new SimpleReflection($this->_mock_class); + if ($mock_reflection->classExistsSansAutoload()) { + return false; + } + if ($this->_reflection->isInterface() || $this->_reflection->hasFinal()) { + $code = $this->_createClassCode($methods ? $methods : array()); + return eval("$code return \$code;"); + } else { + $code = $this->_createSubclassCode($methods ? $methods : array()); + return eval("$code return \$code;"); + } + } + + /** + * Generates a version of a class with selected + * methods mocked only. Inherits the old class + * and chains the mock methods of an aggregated + * mock object. + * @param array $methods Methods to be overridden + * with mock versions. + * @access public + */ + function generatePartial($methods) { + if (! $this->_reflection->classExists($this->_class)) { + return false; + } + $mock_reflection = new SimpleReflection($this->_mock_class); + if ($mock_reflection->classExistsSansAutoload()) { + trigger_error('Partial mock class [' . $this->_mock_class . '] already exists'); + return false; + } + $code = $this->_extendClassCode($methods); + return eval("$code return \$code;"); + } + + /** + * The new mock class code as a string. + * @param array $methods Additional methods. + * @return string Code for new mock class. + * @access private + */ + function _createClassCode($methods) { + $implements = ''; + $interfaces = $this->_reflection->getInterfaces(); + if (function_exists('spl_classes')) { + $interfaces = array_diff($interfaces, array('Traversable')); + } + if (count($interfaces) > 0) { + $implements = 'implements ' . implode(', ', $interfaces); + } + $code = "class " . $this->_mock_class . " extends " . $this->_mock_base . " $implements {\n"; + $code .= " function " . $this->_mock_class . "() {\n"; + $code .= " \$this->" . $this->_mock_base . "();\n"; + $code .= " }\n"; + if (in_array('__construct', $this->_reflection->getMethods())) { + $code .= " " . $this->_reflection->getSignature('__construct') . " {\n"; + $code .= " \$this->" . $this->_mock_base . "();\n"; + $code .= " }\n"; + } + $code .= $this->_createHandlerCode($methods); + $code .= "}\n"; + return $code; + } + + /** + * The new mock class code as a string. The mock will + * be a subclass of the original mocked class. + * @param array $methods Additional methods. + * @return string Code for new mock class. + * @access private + */ + function _createSubclassCode($methods) { + $code = "class " . $this->_mock_class . " extends " . $this->_class . " {\n"; + $code .= " var \$_mock;\n"; + $code .= $this->_addMethodList(array_merge($methods, $this->_reflection->getMethods())); + $code .= "\n"; + $code .= " function " . $this->_mock_class . "() {\n"; + $code .= " \$this->_mock = &new " . $this->_mock_base . "();\n"; + $code .= " \$this->_mock->disableExpectationNameChecks();\n"; + $code .= " }\n"; + $code .= $this->_chainMockReturns(); + $code .= $this->_chainMockExpectations(); + $code .= $this->_chainThrowMethods(); + $code .= $this->_overrideMethods($this->_reflection->getMethods()); + $code .= $this->_createNewMethodCode($methods); + $code .= "}\n"; + return $code; + } + + /** + * The extension class code as a string. The class + * composites a mock object and chains mocked methods + * to it. + * @param array $methods Mocked methods. + * @return string Code for a new class. + * @access private + */ + function _extendClassCode($methods) { + $code = "class " . $this->_mock_class . " extends " . $this->_class . " {\n"; + $code .= " var \$_mock;\n"; + $code .= $this->_addMethodList($methods); + $code .= "\n"; + $code .= " function " . $this->_mock_class . "() {\n"; + $code .= " \$this->_mock = &new " . $this->_mock_base . "();\n"; + $code .= " \$this->_mock->disableExpectationNameChecks();\n"; + $code .= " }\n"; + $code .= $this->_chainMockReturns(); + $code .= $this->_chainMockExpectations(); + $code .= $this->_chainThrowMethods(); + $code .= $this->_overrideMethods($methods); + $code .= "}\n"; + return $code; + } + + /** + * Creates code within a class to generate replaced + * methods. All methods call the _invoke() handler + * with the method name and the arguments in an + * array. + * @param array $methods Additional methods. + * @access private + */ + function _createHandlerCode($methods) { + $code = ''; + $methods = array_merge($methods, $this->_reflection->getMethods()); + foreach ($methods as $method) { + if ($this->_isConstructor($method)) { + continue; + } + $mock_reflection = new SimpleReflection($this->_mock_base); + if (in_array($method, $mock_reflection->getMethods())) { + continue; + } + $code .= " " . $this->_reflection->getSignature($method) . " {\n"; + $code .= " \$args = func_get_args();\n"; + $code .= " \$result = &\$this->_invoke(\"$method\", \$args);\n"; + $code .= " return \$result;\n"; + $code .= " }\n"; + } + return $code; + } + + /** + * Creates code within a class to generate a new + * methods. All methods call the _invoke() handler + * on the internal mock with the method name and + * the arguments in an array. + * @param array $methods Additional methods. + * @access private + */ + function _createNewMethodCode($methods) { + $code = ''; + foreach ($methods as $method) { + if ($this->_isConstructor($method)) { + continue; + } + $mock_reflection = new SimpleReflection($this->_mock_base); + if (in_array($method, $mock_reflection->getMethods())) { + continue; + } + $code .= " " . $this->_reflection->getSignature($method) . " {\n"; + $code .= " \$args = func_get_args();\n"; + $code .= " \$result = &\$this->_mock->_invoke(\"$method\", \$args);\n"; + $code .= " return \$result;\n"; + $code .= " }\n"; + } + return $code; + } + + /** + * Tests to see if a special PHP method is about to + * be stubbed by mistake. + * @param string $method Method name. + * @return boolean True if special. + * @access private + */ + function _isConstructor($method) { + return in_array( + strtolower($method), + array('__construct', '__destruct')); + } + + /** + * Creates a list of mocked methods for error checking. + * @param array $methods Mocked methods. + * @return string Code for a method list. + * @access private + */ + function _addMethodList($methods) { + return " var \$_mocked_methods = array('" . + implode("', '", array_map('strtolower', $methods)) . + "');\n"; + } + + /** + * Creates code to abandon the expectation if not mocked. + * @param string $alias Parameter name of method name. + * @return string Code for bail out. + * @access private + */ + function _bailOutIfNotMocked($alias) { + $code = " if (! in_array(strtolower($alias), \$this->_mocked_methods)) {\n"; + $code .= " trigger_error(\"Method [$alias] is not mocked\");\n"; + $code .= " \$null = null;\n"; + $code .= " return \$null;\n"; + $code .= " }\n"; + return $code; + } + + /** + * Creates source code for chaining to the composited + * mock object. + * @return string Code for mock set up. + * @access private + */ + function _chainMockReturns() { + $code = " function setReturnValue(\$method, \$value, \$args = false) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->setReturnValue(\$method, \$value, \$args);\n"; + $code .= " }\n"; + $code .= " function setReturnValueAt(\$timing, \$method, \$value, \$args = false) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->setReturnValueAt(\$timing, \$method, \$value, \$args);\n"; + $code .= " }\n"; + $code .= " function setReturnReference(\$method, &\$ref, \$args = false) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->setReturnReference(\$method, \$ref, \$args);\n"; + $code .= " }\n"; + $code .= " function setReturnReferenceAt(\$timing, \$method, &\$ref, \$args = false) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->setReturnReferenceAt(\$timing, \$method, \$ref, \$args);\n"; + $code .= " }\n"; + return $code; + } + + /** + * Creates source code for chaining to an aggregated + * mock object. + * @return string Code for expectations. + * @access private + */ + function _chainMockExpectations() { + $code = " function expect(\$method, \$args = false, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expect(\$method, \$args, \$msg);\n"; + $code .= " }\n"; + $code .= " function expectArguments(\$method, \$args = false, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectArguments(\$method, \$args, \$msg);\n"; + $code .= " }\n"; + $code .= " function expectAt(\$timing, \$method, \$args = false, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectArgumentsAt(\$timing, \$method, \$args, \$msg);\n"; + $code .= " }\n"; + $code .= " function expectArgumentsAt(\$timing, \$method, \$args = false, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectArgumentsAt(\$timing, \$method, \$args, \$msg);\n"; + $code .= " }\n"; + $code .= " function expectCallCount(\$method, \$count) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectCallCount(\$method, \$count, \$msg = '%s');\n"; + $code .= " }\n"; + $code .= " function expectMaximumCallCount(\$method, \$count, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectMaximumCallCount(\$method, \$count, \$msg = '%s');\n"; + $code .= " }\n"; + $code .= " function expectMinimumCallCount(\$method, \$count, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectMinimumCallCount(\$method, \$count, \$msg = '%s');\n"; + $code .= " }\n"; + $code .= " function expectNever(\$method) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectNever(\$method);\n"; + $code .= " }\n"; + $code .= " function expectOnce(\$method, \$args = false, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectOnce(\$method, \$args, \$msg);\n"; + $code .= " }\n"; + $code .= " function expectAtLeastOnce(\$method, \$args = false, \$msg = '%s') {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->expectAtLeastOnce(\$method, \$args, \$msg);\n"; + $code .= " }\n"; + $code .= " function tally() {\n"; + $code .= " }\n"; + return $code; + } + + /** + * Adds code for chaining the throw methods. + * @return string Code for chains. + * @access private + */ + function _chainThrowMethods() { + $code = " function throwOn(\$method, \$exception = false, \$args = false) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->throwOn(\$method, \$exception, \$args);\n"; + $code .= " }\n"; + $code .= " function throwAt(\$timing, \$method, \$exception = false, \$args = false) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->throwAt(\$timing, \$method, \$exception, \$args);\n"; + $code .= " }\n"; + $code .= " function errorOn(\$method, \$error = 'A mock error', \$args = false, \$severity = E_USER_ERROR) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->errorOn(\$method, \$error, \$args, \$severity);\n"; + $code .= " }\n"; + $code .= " function errorAt(\$timing, \$method, \$error = 'A mock error', \$args = false, \$severity = E_USER_ERROR) {\n"; + $code .= $this->_bailOutIfNotMocked("\$method"); + $code .= " \$this->_mock->errorAt(\$timing, \$method, \$error, \$args, \$severity);\n"; + $code .= " }\n"; + return $code; + } + + /** + * Creates source code to override a list of methods + * with mock versions. + * @param array $methods Methods to be overridden + * with mock versions. + * @return string Code for overridden chains. + * @access private + */ + function _overrideMethods($methods) { + $code = ""; + foreach ($methods as $method) { + if ($this->_isConstructor($method)) { + continue; + } + $code .= " " . $this->_reflection->getSignature($method) . " {\n"; + $code .= " \$args = func_get_args();\n"; + $code .= " \$result = &\$this->_mock->_invoke(\"$method\", \$args);\n"; + $code .= " return \$result;\n"; + $code .= " }\n"; + } + return $code; + } +} +?> diff --git a/tests/simpletest/page.php b/tests/simpletest/page.php new file mode 100644 index 000000000..08e5649dc --- /dev/null +++ b/tests/simpletest/page.php @@ -0,0 +1,983 @@ + 'SimpleAnchorTag', + 'title' => 'SimpleTitleTag', + 'base' => 'SimpleBaseTag', + 'button' => 'SimpleButtonTag', + 'textarea' => 'SimpleTextAreaTag', + 'option' => 'SimpleOptionTag', + 'label' => 'SimpleLabelTag', + 'form' => 'SimpleFormTag', + 'frame' => 'SimpleFrameTag'); + $attributes = $this->_keysToLowerCase($attributes); + if (array_key_exists($name, $map)) { + $tag_class = $map[$name]; + return new $tag_class($attributes); + } elseif ($name == 'select') { + return $this->_createSelectionTag($attributes); + } elseif ($name == 'input') { + return $this->_createInputTag($attributes); + } + return new SimpleTag($name, $attributes); + } + + /** + * Factory for selection fields. + * @param hash $attributes Element attributes. + * @return SimpleTag Tag object. + * @access protected + */ + function _createSelectionTag($attributes) { + if (isset($attributes['multiple'])) { + return new MultipleSelectionTag($attributes); + } + return new SimpleSelectionTag($attributes); + } + + /** + * Factory for input tags. + * @param hash $attributes Element attributes. + * @return SimpleTag Tag object. + * @access protected + */ + function _createInputTag($attributes) { + if (! isset($attributes['type'])) { + return new SimpleTextTag($attributes); + } + $type = strtolower(trim($attributes['type'])); + $map = array( + 'submit' => 'SimpleSubmitTag', + 'image' => 'SimpleImageSubmitTag', + 'checkbox' => 'SimpleCheckboxTag', + 'radio' => 'SimpleRadioButtonTag', + 'text' => 'SimpleTextTag', + 'hidden' => 'SimpleTextTag', + 'password' => 'SimpleTextTag', + 'file' => 'SimpleUploadTag'); + if (array_key_exists($type, $map)) { + $tag_class = $map[$type]; + return new $tag_class($attributes); + } + return false; + } + + /** + * Make the keys lower case for case insensitive look-ups. + * @param hash $map Hash to convert. + * @return hash Unchanged values, but keys lower case. + * @access private + */ + function _keysToLowerCase($map) { + $lower = array(); + foreach ($map as $key => $value) { + $lower[strtolower($key)] = $value; + } + return $lower; + } +} + +/** + * SAX event handler. Maintains a list of + * open tags and dispatches them as they close. + * @package SimpleTest + * @subpackage WebTester + */ +class SimplePageBuilder extends SimpleSaxListener { + var $_tags; + var $_page; + var $_private_content_tag; + + /** + * Sets the builder up empty. + * @access public + */ + function SimplePageBuilder() { + $this->SimpleSaxListener(); + } + + /** + * Frees up any references so as to allow the PHP garbage + * collection from unset() to work. + * @access public + */ + function free() { + unset($this->_tags); + unset($this->_page); + unset($this->_private_content_tags); + } + + /** + * Reads the raw content and send events + * into the page to be built. + * @param $response SimpleHttpResponse Fetched response. + * @return SimplePage Newly parsed page. + * @access public + */ + function &parse($response) { + $this->_tags = array(); + $this->_page = &$this->_createPage($response); + $parser = &$this->_createParser($this); + $parser->parse($response->getContent()); + $this->_page->acceptPageEnd(); + return $this->_page; + } + + /** + * Creates an empty page. + * @return SimplePage New unparsed page. + * @access protected + */ + function &_createPage($response) { + $page = &new SimplePage($response); + return $page; + } + + /** + * Creates the parser used with the builder. + * @param $listener SimpleSaxListener Target of parser. + * @return SimpleSaxParser Parser to generate + * events for the builder. + * @access protected + */ + function &_createParser(&$listener) { + $parser = &new SimpleHtmlSaxParser($listener); + return $parser; + } + + /** + * Start of element event. Opens a new tag. + * @param string $name Element name. + * @param hash $attributes Attributes without content + * are marked as true. + * @return boolean False on parse error. + * @access public + */ + function startElement($name, $attributes) { + $factory = &new SimpleTagBuilder(); + $tag = $factory->createTag($name, $attributes); + if (! $tag) { + return true; + } + if ($tag->getTagName() == 'label') { + $this->_page->acceptLabelStart($tag); + $this->_openTag($tag); + return true; + } + if ($tag->getTagName() == 'form') { + $this->_page->acceptFormStart($tag); + return true; + } + if ($tag->getTagName() == 'frameset') { + $this->_page->acceptFramesetStart($tag); + return true; + } + if ($tag->getTagName() == 'frame') { + $this->_page->acceptFrame($tag); + return true; + } + if ($tag->isPrivateContent() && ! isset($this->_private_content_tag)) { + $this->_private_content_tag = &$tag; + } + if ($tag->expectEndTag()) { + $this->_openTag($tag); + return true; + } + $this->_page->acceptTag($tag); + return true; + } + + /** + * End of element event. + * @param string $name Element name. + * @return boolean False on parse error. + * @access public + */ + function endElement($name) { + if ($name == 'label') { + $this->_page->acceptLabelEnd(); + return true; + } + if ($name == 'form') { + $this->_page->acceptFormEnd(); + return true; + } + if ($name == 'frameset') { + $this->_page->acceptFramesetEnd(); + return true; + } + if ($this->_hasNamedTagOnOpenTagStack($name)) { + $tag = array_pop($this->_tags[$name]); + if ($tag->isPrivateContent() && $this->_private_content_tag->getTagName() == $name) { + unset($this->_private_content_tag); + } + $this->_addContentTagToOpenTags($tag); + $this->_page->acceptTag($tag); + return true; + } + return true; + } + + /** + * Test to see if there are any open tags awaiting + * closure that match the tag name. + * @param string $name Element name. + * @return boolean True if any are still open. + * @access private + */ + function _hasNamedTagOnOpenTagStack($name) { + return isset($this->_tags[$name]) && (count($this->_tags[$name]) > 0); + } + + /** + * Unparsed, but relevant data. The data is added + * to every open tag. + * @param string $text May include unparsed tags. + * @return boolean False on parse error. + * @access public + */ + function addContent($text) { + if (isset($this->_private_content_tag)) { + $this->_private_content_tag->addContent($text); + } else { + $this->_addContentToAllOpenTags($text); + } + return true; + } + + /** + * Any content fills all currently open tags unless it + * is part of an option tag. + * @param string $text May include unparsed tags. + * @access private + */ + function _addContentToAllOpenTags($text) { + foreach (array_keys($this->_tags) as $name) { + for ($i = 0, $count = count($this->_tags[$name]); $i < $count; $i++) { + $this->_tags[$name][$i]->addContent($text); + } + } + } + + /** + * Parsed data in tag form. The parsed tag is added + * to every open tag. Used for adding options to select + * fields only. + * @param SimpleTag $tag Option tags only. + * @access private + */ + function _addContentTagToOpenTags(&$tag) { + if ($tag->getTagName() != 'option') { + return; + } + foreach (array_keys($this->_tags) as $name) { + for ($i = 0, $count = count($this->_tags[$name]); $i < $count; $i++) { + $this->_tags[$name][$i]->addTag($tag); + } + } + } + + /** + * Opens a tag for receiving content. Multiple tags + * will be receiving input at the same time. + * @param SimpleTag $tag New content tag. + * @access private + */ + function _openTag(&$tag) { + $name = $tag->getTagName(); + if (! in_array($name, array_keys($this->_tags))) { + $this->_tags[$name] = array(); + } + $this->_tags[$name][] = &$tag; + } +} + +/** + * A wrapper for a web page. + * @package SimpleTest + * @subpackage WebTester + */ +class SimplePage { + var $_links; + var $_title; + var $_last_widget; + var $_label; + var $_left_over_labels; + var $_open_forms; + var $_complete_forms; + var $_frameset; + var $_frames; + var $_frameset_nesting_level; + var $_transport_error; + var $_raw; + var $_text; + var $_sent; + var $_headers; + var $_method; + var $_url; + var $_base = false; + var $_request_data; + + /** + * Parses a page ready to access it's contents. + * @param SimpleHttpResponse $response Result of HTTP fetch. + * @access public + */ + function SimplePage($response = false) { + $this->_links = array(); + $this->_title = false; + $this->_left_over_labels = array(); + $this->_open_forms = array(); + $this->_complete_forms = array(); + $this->_frameset = false; + $this->_frames = array(); + $this->_frameset_nesting_level = 0; + $this->_text = false; + if ($response) { + $this->_extractResponse($response); + } else { + $this->_noResponse(); + } + } + + /** + * Extracts all of the response information. + * @param SimpleHttpResponse $response Response being parsed. + * @access private + */ + function _extractResponse($response) { + $this->_transport_error = $response->getError(); + $this->_raw = $response->getContent(); + $this->_sent = $response->getSent(); + $this->_headers = $response->getHeaders(); + $this->_method = $response->getMethod(); + $this->_url = $response->getUrl(); + $this->_request_data = $response->getRequestData(); + } + + /** + * Sets up a missing response. + * @access private + */ + function _noResponse() { + $this->_transport_error = 'No page fetched yet'; + $this->_raw = false; + $this->_sent = false; + $this->_headers = false; + $this->_method = 'GET'; + $this->_url = false; + $this->_request_data = false; + } + + /** + * Original request as bytes sent down the wire. + * @return mixed Sent content. + * @access public + */ + function getRequest() { + return $this->_sent; + } + + /** + * Accessor for raw text of page. + * @return string Raw unparsed content. + * @access public + */ + function getRaw() { + return $this->_raw; + } + + /** + * Accessor for plain text of page as a text browser + * would see it. + * @return string Plain text of page. + * @access public + */ + function getText() { + if (! $this->_text) { + $this->_text = SimpleHtmlSaxParser::normalise($this->_raw); + } + return $this->_text; + } + + /** + * Accessor for raw headers of page. + * @return string Header block as text. + * @access public + */ + function getHeaders() { + if ($this->_headers) { + return $this->_headers->getRaw(); + } + return false; + } + + /** + * Original request method. + * @return string GET, POST or HEAD. + * @access public + */ + function getMethod() { + return $this->_method; + } + + /** + * Original resource name. + * @return SimpleUrl Current url. + * @access public + */ + function getUrl() { + return $this->_url; + } + + /** + * Base URL if set via BASE tag page url otherwise + * @return SimpleUrl Base url. + * @access public + */ + function getBaseUrl() { + return $this->_base; + } + + /** + * Original request data. + * @return mixed Sent content. + * @access public + */ + function getRequestData() { + return $this->_request_data; + } + + /** + * Accessor for last error. + * @return string Error from last response. + * @access public + */ + function getTransportError() { + return $this->_transport_error; + } + + /** + * Accessor for current MIME type. + * @return string MIME type as string; e.g. 'text/html' + * @access public + */ + function getMimeType() { + if ($this->_headers) { + return $this->_headers->getMimeType(); + } + return false; + } + + /** + * Accessor for HTTP response code. + * @return integer HTTP response code received. + * @access public + */ + function getResponseCode() { + if ($this->_headers) { + return $this->_headers->getResponseCode(); + } + return false; + } + + /** + * Accessor for last Authentication type. Only valid + * straight after a challenge (401). + * @return string Description of challenge type. + * @access public + */ + function getAuthentication() { + if ($this->_headers) { + return $this->_headers->getAuthentication(); + } + return false; + } + + /** + * Accessor for last Authentication realm. Only valid + * straight after a challenge (401). + * @return string Name of security realm. + * @access public + */ + function getRealm() { + if ($this->_headers) { + return $this->_headers->getRealm(); + } + return false; + } + + /** + * Accessor for current frame focus. Will be + * false as no frames. + * @return array Always empty. + * @access public + */ + function getFrameFocus() { + return array(); + } + + /** + * Sets the focus by index. The integer index starts from 1. + * @param integer $choice Chosen frame. + * @return boolean Always false. + * @access public + */ + function setFrameFocusByIndex($choice) { + return false; + } + + /** + * Sets the focus by name. Always fails for a leaf page. + * @param string $name Chosen frame. + * @return boolean False as no frames. + * @access public + */ + function setFrameFocus($name) { + return false; + } + + /** + * Clears the frame focus. Does nothing for a leaf page. + * @access public + */ + function clearFrameFocus() { + } + + /** + * Adds a tag to the page. + * @param SimpleTag $tag Tag to accept. + * @access public + */ + function acceptTag(&$tag) { + if ($tag->getTagName() == "a") { + $this->_addLink($tag); + } elseif ($tag->getTagName() == "base") { + $this->_setBase($tag); + } elseif ($tag->getTagName() == "title") { + $this->_setTitle($tag); + } elseif ($this->_isFormElement($tag->getTagName())) { + for ($i = 0; $i < count($this->_open_forms); $i++) { + $this->_open_forms[$i]->addWidget($tag); + } + $this->_last_widget = &$tag; + } + } + + /** + * Opens a label for a described widget. + * @param SimpleFormTag $tag Tag to accept. + * @access public + */ + function acceptLabelStart(&$tag) { + $this->_label = &$tag; + unset($this->_last_widget); + } + + /** + * Closes the most recently opened label. + * @access public + */ + function acceptLabelEnd() { + if (isset($this->_label)) { + if (isset($this->_last_widget)) { + $this->_last_widget->setLabel($this->_label->getText()); + unset($this->_last_widget); + } else { + $this->_left_over_labels[] = SimpleTestCompatibility::copy($this->_label); + } + unset($this->_label); + } + } + + /** + * Tests to see if a tag is a possible form + * element. + * @param string $name HTML element name. + * @return boolean True if form element. + * @access private + */ + function _isFormElement($name) { + return in_array($name, array('input', 'button', 'textarea', 'select')); + } + + /** + * Opens a form. New widgets go here. + * @param SimpleFormTag $tag Tag to accept. + * @access public + */ + function acceptFormStart(&$tag) { + $this->_open_forms[] = &new SimpleForm($tag, $this); + } + + /** + * Closes the most recently opened form. + * @access public + */ + function acceptFormEnd() { + if (count($this->_open_forms)) { + $this->_complete_forms[] = array_pop($this->_open_forms); + } + } + + /** + * Opens a frameset. A frameset may contain nested + * frameset tags. + * @param SimpleFramesetTag $tag Tag to accept. + * @access public + */ + function acceptFramesetStart(&$tag) { + if (! $this->_isLoadingFrames()) { + $this->_frameset = &$tag; + } + $this->_frameset_nesting_level++; + } + + /** + * Closes the most recently opened frameset. + * @access public + */ + function acceptFramesetEnd() { + if ($this->_isLoadingFrames()) { + $this->_frameset_nesting_level--; + } + } + + /** + * Takes a single frame tag and stashes it in + * the current frame set. + * @param SimpleFrameTag $tag Tag to accept. + * @access public + */ + function acceptFrame(&$tag) { + if ($this->_isLoadingFrames()) { + if ($tag->getAttribute('src')) { + $this->_frames[] = &$tag; + } + } + } + + /** + * Test to see if in the middle of reading + * a frameset. + * @return boolean True if inframeset. + * @access private + */ + function _isLoadingFrames() { + if (! $this->_frameset) { + return false; + } + return ($this->_frameset_nesting_level > 0); + } + + /** + * Test to see if link is an absolute one. + * @param string $url Url to test. + * @return boolean True if absolute. + * @access protected + */ + function _linkIsAbsolute($url) { + $parsed = new SimpleUrl($url); + return (boolean)($parsed->getScheme() && $parsed->getHost()); + } + + /** + * Adds a link to the page. + * @param SimpleAnchorTag $tag Link to accept. + * @access protected + */ + function _addLink($tag) { + $this->_links[] = $tag; + } + + /** + * Marker for end of complete page. Any work in + * progress can now be closed. + * @access public + */ + function acceptPageEnd() { + while (count($this->_open_forms)) { + $this->_complete_forms[] = array_pop($this->_open_forms); + } + foreach ($this->_left_over_labels as $label) { + for ($i = 0, $count = count($this->_complete_forms); $i < $count; $i++) { + $this->_complete_forms[$i]->attachLabelBySelector( + new SimpleById($label->getFor()), + $label->getText()); + } + } + } + + /** + * Test for the presence of a frameset. + * @return boolean True if frameset. + * @access public + */ + function hasFrames() { + return (boolean)$this->_frameset; + } + + /** + * Accessor for frame name and source URL for every frame that + * will need to be loaded. Immediate children only. + * @return boolean/array False if no frameset or + * otherwise a hash of frame URLs. + * The key is either a numerical + * base one index or the name attribute. + * @access public + */ + function getFrameset() { + if (! $this->_frameset) { + return false; + } + $urls = array(); + for ($i = 0; $i < count($this->_frames); $i++) { + $name = $this->_frames[$i]->getAttribute('name'); + $url = new SimpleUrl($this->_frames[$i]->getAttribute('src')); + $urls[$name ? $name : $i + 1] = $this->expandUrl($url); + } + return $urls; + } + + /** + * Fetches a list of loaded frames. + * @return array/string Just the URL for a single page. + * @access public + */ + function getFrames() { + $url = $this->expandUrl($this->getUrl()); + return $url->asString(); + } + + /** + * Accessor for a list of all links. + * @return array List of urls with scheme of + * http or https and hostname. + * @access public + */ + function getUrls() { + $all = array(); + foreach ($this->_links as $link) { + $url = $this->_getUrlFromLink($link); + $all[] = $url->asString(); + } + return $all; + } + + /** + * Accessor for URLs by the link label. Label will match + * regardess of whitespace issues and case. + * @param string $label Text of link. + * @return array List of links with that label. + * @access public + */ + function getUrlsByLabel($label) { + $matches = array(); + foreach ($this->_links as $link) { + if ($link->getText() == $label) { + $matches[] = $this->_getUrlFromLink($link); + } + } + return $matches; + } + + /** + * Accessor for a URL by the id attribute. + * @param string $id Id attribute of link. + * @return SimpleUrl URL with that id of false if none. + * @access public + */ + function getUrlById($id) { + foreach ($this->_links as $link) { + if ($link->getAttribute('id') === (string)$id) { + return $this->_getUrlFromLink($link); + } + } + return false; + } + + /** + * Converts a link tag into a target URL. + * @param SimpleAnchor $link Parsed link. + * @return SimpleUrl URL with frame target if any. + * @access private + */ + function _getUrlFromLink($link) { + $url = $this->expandUrl($link->getHref()); + if ($link->getAttribute('target')) { + $url->setTarget($link->getAttribute('target')); + } + return $url; + } + + /** + * Expands expandomatic URLs into fully qualified + * URLs. + * @param SimpleUrl $url Relative URL. + * @return SimpleUrl Absolute URL. + * @access public + */ + function expandUrl($url) { + if (! is_object($url)) { + $url = new SimpleUrl($url); + } + $location = $this->getBaseUrl() ? $this->getBaseUrl() : new SimpleUrl(); + return $url->makeAbsolute($location->makeAbsolute($this->getUrl())); + } + + /** + * Sets the base url for the page. + * @param SimpleTag $tag Base URL for page. + * @access protected + */ + function _setBase(&$tag) { + $url = $tag->getAttribute('href'); + $this->_base = new SimpleUrl($url); + } + + /** + * Sets the title tag contents. + * @param SimpleTitleTag $tag Title of page. + * @access protected + */ + function _setTitle(&$tag) { + $this->_title = &$tag; + } + + /** + * Accessor for parsed title. + * @return string Title or false if no title is present. + * @access public + */ + function getTitle() { + if ($this->_title) { + return $this->_title->getText(); + } + return false; + } + + /** + * Finds a held form by button label. Will only + * search correctly built forms. + * @param SimpleSelector $selector Button finder. + * @return SimpleForm Form object containing + * the button. + * @access public + */ + function &getFormBySubmit($selector) { + for ($i = 0; $i < count($this->_complete_forms); $i++) { + if ($this->_complete_forms[$i]->hasSubmit($selector)) { + return $this->_complete_forms[$i]; + } + } + $null = null; + return $null; + } + + /** + * Finds a held form by image using a selector. + * Will only search correctly built forms. + * @param SimpleSelector $selector Image finder. + * @return SimpleForm Form object containing + * the image. + * @access public + */ + function &getFormByImage($selector) { + for ($i = 0; $i < count($this->_complete_forms); $i++) { + if ($this->_complete_forms[$i]->hasImage($selector)) { + return $this->_complete_forms[$i]; + } + } + $null = null; + return $null; + } + + /** + * Finds a held form by the form ID. A way of + * identifying a specific form when we have control + * of the HTML code. + * @param string $id Form label. + * @return SimpleForm Form object containing the matching ID. + * @access public + */ + function &getFormById($id) { + for ($i = 0; $i < count($this->_complete_forms); $i++) { + if ($this->_complete_forms[$i]->getId() == $id) { + return $this->_complete_forms[$i]; + } + } + $null = null; + return $null; + } + + /** + * Sets a field on each form in which the field is + * available. + * @param SimpleSelector $selector Field finder. + * @param string $value Value to set field to. + * @return boolean True if value is valid. + * @access public + */ + function setField($selector, $value, $position=false) { + $is_set = false; + for ($i = 0; $i < count($this->_complete_forms); $i++) { + if ($this->_complete_forms[$i]->setField($selector, $value, $position)) { + $is_set = true; + } + } + return $is_set; + } + + /** + * Accessor for a form element value within a page. + * @param SimpleSelector $selector Field finder. + * @return string/boolean A string if the field is + * present, false if unchecked + * and null if missing. + * @access public + */ + function getField($selector) { + for ($i = 0; $i < count($this->_complete_forms); $i++) { + $value = $this->_complete_forms[$i]->getValue($selector); + if (isset($value)) { + return $value; + } + } + return null; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/parser.php b/tests/simpletest/parser.php new file mode 100644 index 000000000..3f3b37b83 --- /dev/null +++ b/tests/simpletest/parser.php @@ -0,0 +1,764 @@ + $constant) { + if (! defined($constant)) { + define($constant, $i + 1); + } +} +/**#@-*/ + +/** + * Compounded regular expression. Any of + * the contained patterns could match and + * when one does, it's label is returned. + * @package SimpleTest + * @subpackage WebTester + */ +class ParallelRegex { + var $_patterns; + var $_labels; + var $_regex; + var $_case; + + /** + * Constructor. Starts with no patterns. + * @param boolean $case True for case sensitive, false + * for insensitive. + * @access public + */ + function ParallelRegex($case) { + $this->_case = $case; + $this->_patterns = array(); + $this->_labels = array(); + $this->_regex = null; + } + + /** + * Adds a pattern with an optional label. + * @param string $pattern Perl style regex, but ( and ) + * lose the usual meaning. + * @param string $label Label of regex to be returned + * on a match. + * @access public + */ + function addPattern($pattern, $label = true) { + $count = count($this->_patterns); + $this->_patterns[$count] = $pattern; + $this->_labels[$count] = $label; + $this->_regex = null; + } + + /** + * Attempts to match all patterns at once against + * a string. + * @param string $subject String to match against. + * @param string $match First matched portion of + * subject. + * @return boolean True on success. + * @access public + */ + function match($subject, &$match) { + if (count($this->_patterns) == 0) { + return false; + } + if (! preg_match($this->_getCompoundedRegex(), $subject, $matches)) { + $match = ''; + return false; + } + $match = $matches[0]; + for ($i = 1; $i < count($matches); $i++) { + if ($matches[$i]) { + return $this->_labels[$i - 1]; + } + } + return true; + } + + /** + * Compounds the patterns into a single + * regular expression separated with the + * "or" operator. Caches the regex. + * Will automatically escape (, ) and / tokens. + * @param array $patterns List of patterns in order. + * @access private + */ + function _getCompoundedRegex() { + if ($this->_regex == null) { + for ($i = 0, $count = count($this->_patterns); $i < $count; $i++) { + $this->_patterns[$i] = '(' . str_replace( + array('/', '(', ')'), + array('\/', '\(', '\)'), + $this->_patterns[$i]) . ')'; + } + $this->_regex = "/" . implode("|", $this->_patterns) . "/" . $this->_getPerlMatchingFlags(); + } + return $this->_regex; + } + + /** + * Accessor for perl regex mode flags to use. + * @return string Perl regex flags. + * @access private + */ + function _getPerlMatchingFlags() { + return ($this->_case ? "msS" : "msSi"); + } +} + +/** + * States for a stack machine. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleStateStack { + var $_stack; + + /** + * Constructor. Starts in named state. + * @param string $start Starting state name. + * @access public + */ + function SimpleStateStack($start) { + $this->_stack = array($start); + } + + /** + * Accessor for current state. + * @return string State. + * @access public + */ + function getCurrent() { + return $this->_stack[count($this->_stack) - 1]; + } + + /** + * Adds a state to the stack and sets it + * to be the current state. + * @param string $state New state. + * @access public + */ + function enter($state) { + array_push($this->_stack, $state); + } + + /** + * Leaves the current state and reverts + * to the previous one. + * @return boolean False if we drop off + * the bottom of the list. + * @access public + */ + function leave() { + if (count($this->_stack) == 1) { + return false; + } + array_pop($this->_stack); + return true; + } +} + +/** + * Accepts text and breaks it into tokens. + * Some optimisation to make the sure the + * content is only scanned by the PHP regex + * parser once. Lexer modes must not start + * with leading underscores. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleLexer { + var $_regexes; + var $_parser; + var $_mode; + var $_mode_handlers; + var $_case; + + /** + * Sets up the lexer in case insensitive matching + * by default. + * @param SimpleSaxParser $parser Handling strategy by + * reference. + * @param string $start Starting handler. + * @param boolean $case True for case sensitive. + * @access public + */ + function SimpleLexer(&$parser, $start = "accept", $case = false) { + $this->_case = $case; + $this->_regexes = array(); + $this->_parser = &$parser; + $this->_mode = &new SimpleStateStack($start); + $this->_mode_handlers = array($start => $start); + } + + /** + * Adds a token search pattern for a particular + * parsing mode. The pattern does not change the + * current mode. + * @param string $pattern Perl style regex, but ( and ) + * lose the usual meaning. + * @param string $mode Should only apply this + * pattern when dealing with + * this type of input. + * @access public + */ + function addPattern($pattern, $mode = "accept") { + if (! isset($this->_regexes[$mode])) { + $this->_regexes[$mode] = new ParallelRegex($this->_case); + } + $this->_regexes[$mode]->addPattern($pattern); + if (! isset($this->_mode_handlers[$mode])) { + $this->_mode_handlers[$mode] = $mode; + } + } + + /** + * Adds a pattern that will enter a new parsing + * mode. Useful for entering parenthesis, strings, + * tags, etc. + * @param string $pattern Perl style regex, but ( and ) + * lose the usual meaning. + * @param string $mode Should only apply this + * pattern when dealing with + * this type of input. + * @param string $new_mode Change parsing to this new + * nested mode. + * @access public + */ + function addEntryPattern($pattern, $mode, $new_mode) { + if (! isset($this->_regexes[$mode])) { + $this->_regexes[$mode] = new ParallelRegex($this->_case); + } + $this->_regexes[$mode]->addPattern($pattern, $new_mode); + if (! isset($this->_mode_handlers[$new_mode])) { + $this->_mode_handlers[$new_mode] = $new_mode; + } + } + + /** + * Adds a pattern that will exit the current mode + * and re-enter the previous one. + * @param string $pattern Perl style regex, but ( and ) + * lose the usual meaning. + * @param string $mode Mode to leave. + * @access public + */ + function addExitPattern($pattern, $mode) { + if (! isset($this->_regexes[$mode])) { + $this->_regexes[$mode] = new ParallelRegex($this->_case); + } + $this->_regexes[$mode]->addPattern($pattern, "__exit"); + if (! isset($this->_mode_handlers[$mode])) { + $this->_mode_handlers[$mode] = $mode; + } + } + + /** + * Adds a pattern that has a special mode. Acts as an entry + * and exit pattern in one go, effectively calling a special + * parser handler for this token only. + * @param string $pattern Perl style regex, but ( and ) + * lose the usual meaning. + * @param string $mode Should only apply this + * pattern when dealing with + * this type of input. + * @param string $special Use this mode for this one token. + * @access public + */ + function addSpecialPattern($pattern, $mode, $special) { + if (! isset($this->_regexes[$mode])) { + $this->_regexes[$mode] = new ParallelRegex($this->_case); + } + $this->_regexes[$mode]->addPattern($pattern, "_$special"); + if (! isset($this->_mode_handlers[$special])) { + $this->_mode_handlers[$special] = $special; + } + } + + /** + * Adds a mapping from a mode to another handler. + * @param string $mode Mode to be remapped. + * @param string $handler New target handler. + * @access public + */ + function mapHandler($mode, $handler) { + $this->_mode_handlers[$mode] = $handler; + } + + /** + * Splits the page text into tokens. Will fail + * if the handlers report an error or if no + * content is consumed. If successful then each + * unparsed and parsed token invokes a call to the + * held listener. + * @param string $raw Raw HTML text. + * @return boolean True on success, else false. + * @access public + */ + function parse($raw) { + if (! isset($this->_parser)) { + return false; + } + $length = strlen($raw); + while (is_array($parsed = $this->_reduce($raw))) { + list($raw, $unmatched, $matched, $mode) = $parsed; + if (! $this->_dispatchTokens($unmatched, $matched, $mode)) { + return false; + } + if ($raw === '') { + return true; + } + if (strlen($raw) == $length) { + return false; + } + $length = strlen($raw); + } + if (! $parsed) { + return false; + } + return $this->_invokeParser($raw, LEXER_UNMATCHED); + } + + /** + * Sends the matched token and any leading unmatched + * text to the parser changing the lexer to a new + * mode if one is listed. + * @param string $unmatched Unmatched leading portion. + * @param string $matched Actual token match. + * @param string $mode Mode after match. A boolean + * false mode causes no change. + * @return boolean False if there was any error + * from the parser. + * @access private + */ + function _dispatchTokens($unmatched, $matched, $mode = false) { + if (! $this->_invokeParser($unmatched, LEXER_UNMATCHED)) { + return false; + } + if (is_bool($mode)) { + return $this->_invokeParser($matched, LEXER_MATCHED); + } + if ($this->_isModeEnd($mode)) { + if (! $this->_invokeParser($matched, LEXER_EXIT)) { + return false; + } + return $this->_mode->leave(); + } + if ($this->_isSpecialMode($mode)) { + $this->_mode->enter($this->_decodeSpecial($mode)); + if (! $this->_invokeParser($matched, LEXER_SPECIAL)) { + return false; + } + return $this->_mode->leave(); + } + $this->_mode->enter($mode); + return $this->_invokeParser($matched, LEXER_ENTER); + } + + /** + * Tests to see if the new mode is actually to leave + * the current mode and pop an item from the matching + * mode stack. + * @param string $mode Mode to test. + * @return boolean True if this is the exit mode. + * @access private + */ + function _isModeEnd($mode) { + return ($mode === "__exit"); + } + + /** + * Test to see if the mode is one where this mode + * is entered for this token only and automatically + * leaves immediately afterwoods. + * @param string $mode Mode to test. + * @return boolean True if this is the exit mode. + * @access private + */ + function _isSpecialMode($mode) { + return (strncmp($mode, "_", 1) == 0); + } + + /** + * Strips the magic underscore marking single token + * modes. + * @param string $mode Mode to decode. + * @return string Underlying mode name. + * @access private + */ + function _decodeSpecial($mode) { + return substr($mode, 1); + } + + /** + * Calls the parser method named after the current + * mode. Empty content will be ignored. The lexer + * has a parser handler for each mode in the lexer. + * @param string $content Text parsed. + * @param boolean $is_match Token is recognised rather + * than unparsed data. + * @access private + */ + function _invokeParser($content, $is_match) { + if (($content === '') || ($content === false)) { + return true; + } + $handler = $this->_mode_handlers[$this->_mode->getCurrent()]; + return $this->_parser->$handler($content, $is_match); + } + + /** + * Tries to match a chunk of text and if successful + * removes the recognised chunk and any leading + * unparsed data. Empty strings will not be matched. + * @param string $raw The subject to parse. This is the + * content that will be eaten. + * @return array/boolean Three item list of unparsed + * content followed by the + * recognised token and finally the + * action the parser is to take. + * True if no match, false if there + * is a parsing error. + * @access private + */ + function _reduce($raw) { + if ($action = $this->_regexes[$this->_mode->getCurrent()]->match($raw, $match)) { + $unparsed_character_count = strpos($raw, $match); + $unparsed = substr($raw, 0, $unparsed_character_count); + $raw = substr($raw, $unparsed_character_count + strlen($match)); + return array($raw, $unparsed, $match, $action); + } + return true; + } +} + +/** + * Breaks HTML into SAX events. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleHtmlLexer extends SimpleLexer { + + /** + * Sets up the lexer with case insensitive matching + * and adds the HTML handlers. + * @param SimpleSaxParser $parser Handling strategy by + * reference. + * @access public + */ + function SimpleHtmlLexer(&$parser) { + $this->SimpleLexer($parser, 'text'); + $this->mapHandler('text', 'acceptTextToken'); + $this->_addSkipping(); + foreach ($this->_getParsedTags() as $tag) { + $this->_addTag($tag); + } + $this->_addInTagTokens(); + } + + /** + * List of parsed tags. Others are ignored. + * @return array List of searched for tags. + * @access private + */ + function _getParsedTags() { + return array('a', 'base', 'title', 'form', 'input', 'button', 'textarea', 'select', + 'option', 'frameset', 'frame', 'label'); + } + + /** + * The lexer has to skip certain sections such + * as server code, client code and styles. + * @access private + */ + function _addSkipping() { + $this->mapHandler('css', 'ignore'); + $this->addEntryPattern('addExitPattern('', 'css'); + $this->mapHandler('js', 'ignore'); + $this->addEntryPattern('addExitPattern('', 'js'); + $this->mapHandler('comment', 'ignore'); + $this->addEntryPattern('', 'comment'); + } + + /** + * Pattern matches to start and end a tag. + * @param string $tag Name of tag to scan for. + * @access private + */ + function _addTag($tag) { + $this->addSpecialPattern("", 'text', 'acceptEndToken'); + $this->addEntryPattern("<$tag", 'text', 'tag'); + } + + /** + * Pattern matches to parse the inside of a tag + * including the attributes and their quoting. + * @access private + */ + function _addInTagTokens() { + $this->mapHandler('tag', 'acceptStartToken'); + $this->addSpecialPattern('\s+', 'tag', 'ignore'); + $this->_addAttributeTokens(); + $this->addExitPattern('/>', 'tag'); + $this->addExitPattern('>', 'tag'); + } + + /** + * Matches attributes that are either single quoted, + * double quoted or unquoted. + * @access private + */ + function _addAttributeTokens() { + $this->mapHandler('dq_attribute', 'acceptAttributeToken'); + $this->addEntryPattern('=\s*"', 'tag', 'dq_attribute'); + $this->addPattern("\\\\\"", 'dq_attribute'); + $this->addExitPattern('"', 'dq_attribute'); + $this->mapHandler('sq_attribute', 'acceptAttributeToken'); + $this->addEntryPattern("=\s*'", 'tag', 'sq_attribute'); + $this->addPattern("\\\\'", 'sq_attribute'); + $this->addExitPattern("'", 'sq_attribute'); + $this->mapHandler('uq_attribute', 'acceptAttributeToken'); + $this->addSpecialPattern('=\s*[^>\s]*', 'tag', 'uq_attribute'); + } +} + +/** + * Converts HTML tokens into selected SAX events. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleHtmlSaxParser { + var $_lexer; + var $_listener; + var $_tag; + var $_attributes; + var $_current_attribute; + + /** + * Sets the listener. + * @param SimpleSaxListener $listener SAX event handler. + * @access public + */ + function SimpleHtmlSaxParser(&$listener) { + $this->_listener = &$listener; + $this->_lexer = &$this->createLexer($this); + $this->_tag = ''; + $this->_attributes = array(); + $this->_current_attribute = ''; + } + + /** + * Runs the content through the lexer which + * should call back to the acceptors. + * @param string $raw Page text to parse. + * @return boolean False if parse error. + * @access public + */ + function parse($raw) { + return $this->_lexer->parse($raw); + } + + /** + * Sets up the matching lexer. Starts in 'text' mode. + * @param SimpleSaxParser $parser Event generator, usually $self. + * @return SimpleLexer Lexer suitable for this parser. + * @access public + * @static + */ + function &createLexer(&$parser) { + $lexer = &new SimpleHtmlLexer($parser); + return $lexer; + } + + /** + * Accepts a token from the tag mode. If the + * starting element completes then the element + * is dispatched and the current attributes + * set back to empty. The element or attribute + * name is converted to lower case. + * @param string $token Incoming characters. + * @param integer $event Lexer event type. + * @return boolean False if parse error. + * @access public + */ + function acceptStartToken($token, $event) { + if ($event == LEXER_ENTER) { + $this->_tag = strtolower(substr($token, 1)); + return true; + } + if ($event == LEXER_EXIT) { + $success = $this->_listener->startElement( + $this->_tag, + $this->_attributes); + $this->_tag = ''; + $this->_attributes = array(); + return $success; + } + if ($token != '=') { + $this->_current_attribute = strtolower(SimpleHtmlSaxParser::decodeHtml($token)); + $this->_attributes[$this->_current_attribute] = ''; + } + return true; + } + + /** + * Accepts a token from the end tag mode. + * The element name is converted to lower case. + * @param string $token Incoming characters. + * @param integer $event Lexer event type. + * @return boolean False if parse error. + * @access public + */ + function acceptEndToken($token, $event) { + if (! preg_match('/<\/(.*)>/', $token, $matches)) { + return false; + } + return $this->_listener->endElement(strtolower($matches[1])); + } + + /** + * Part of the tag data. + * @param string $token Incoming characters. + * @param integer $event Lexer event type. + * @return boolean False if parse error. + * @access public + */ + function acceptAttributeToken($token, $event) { + if ($this->_current_attribute) { + if ($event == LEXER_UNMATCHED) { + $this->_attributes[$this->_current_attribute] .= + SimpleHtmlSaxParser::decodeHtml($token); + } + if ($event == LEXER_SPECIAL) { + $this->_attributes[$this->_current_attribute] .= + preg_replace('/^=\s*/' , '', SimpleHtmlSaxParser::decodeHtml($token)); + } + } + return true; + } + + /** + * A character entity. + * @param string $token Incoming characters. + * @param integer $event Lexer event type. + * @return boolean False if parse error. + * @access public + */ + function acceptEntityToken($token, $event) { + } + + /** + * Character data between tags regarded as + * important. + * @param string $token Incoming characters. + * @param integer $event Lexer event type. + * @return boolean False if parse error. + * @access public + */ + function acceptTextToken($token, $event) { + return $this->_listener->addContent($token); + } + + /** + * Incoming data to be ignored. + * @param string $token Incoming characters. + * @param integer $event Lexer event type. + * @return boolean False if parse error. + * @access public + */ + function ignore($token, $event) { + return true; + } + + /** + * Decodes any HTML entities. + * @param string $html Incoming HTML. + * @return string Outgoing plain text. + * @access public + * @static + */ + function decodeHtml($html) { + return html_entity_decode($html, ENT_QUOTES); + } + + /** + * Turns HTML into text browser visible text. Images + * are converted to their alt text and tags are supressed. + * Entities are converted to their visible representation. + * @param string $html HTML to convert. + * @return string Plain text. + * @access public + * @static + */ + function normalise($html) { + $text = preg_replace('||', '', $html); + $text = preg_replace('|]*>.*?|', '', $text); + $text = preg_replace('|]*alt\s*=\s*"([^"]*)"[^>]*>|', ' \1 ', $text); + $text = preg_replace('|]*alt\s*=\s*\'([^\']*)\'[^>]*>|', ' \1 ', $text); + $text = preg_replace('|]*alt\s*=\s*([a-zA-Z_]+)[^>]*>|', ' \1 ', $text); + $text = preg_replace('|<[^>]*>|', '', $text); + $text = SimpleHtmlSaxParser::decodeHtml($text); + $text = preg_replace('|\s+|', ' ', $text); + return trim(trim($text), "\xA0"); // TODO: The \xAO is a  . Add a test for this. + } +} + +/** + * SAX event handler. + * @package SimpleTest + * @subpackage WebTester + * @abstract + */ +class SimpleSaxListener { + + /** + * Sets the document to write to. + * @access public + */ + function SimpleSaxListener() { + } + + /** + * Start of element event. + * @param string $name Element name. + * @param hash $attributes Name value pairs. + * Attributes without content + * are marked as true. + * @return boolean False on parse error. + * @access public + */ + function startElement($name, $attributes) { + } + + /** + * End of element event. + * @param string $name Element name. + * @return boolean False on parse error. + * @access public + */ + function endElement($name) { + } + + /** + * Unparsed, but relevant data. + * @param string $text May include unparsed tags. + * @return boolean False on parse error. + * @access public + */ + function addContent($text) { + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/reflection_php4.php b/tests/simpletest/reflection_php4.php new file mode 100644 index 000000000..6c93915af --- /dev/null +++ b/tests/simpletest/reflection_php4.php @@ -0,0 +1,136 @@ +_interface = $interface; + } + + /** + * Checks that a class has been declared. + * @return boolean True if defined. + * @access public + */ + function classExists() { + return class_exists($this->_interface); + } + + /** + * Needed to kill the autoload feature in PHP5 + * for classes created dynamically. + * @return boolean True if defined. + * @access public + */ + function classExistsSansAutoload() { + return class_exists($this->_interface); + } + + /** + * Checks that a class or interface has been + * declared. + * @return boolean True if defined. + * @access public + */ + function classOrInterfaceExists() { + return class_exists($this->_interface); + } + + /** + * Needed to kill the autoload feature in PHP5 + * for classes created dynamically. + * @return boolean True if defined. + * @access public + */ + function classOrInterfaceExistsSansAutoload() { + return class_exists($this->_interface); + } + + /** + * Gets the list of methods on a class or + * interface. + * @returns array List of method names. + * @access public + */ + function getMethods() { + return get_class_methods($this->_interface); + } + + /** + * Gets the list of interfaces from a class. If the + * class name is actually an interface then just that + * interface is returned. + * @returns array List of interfaces. + * @access public + */ + function getInterfaces() { + return array(); + } + + /** + * Finds the parent class name. + * @returns string Parent class name. + * @access public + */ + function getParent() { + return strtolower(get_parent_class($this->_interface)); + } + + /** + * Determines if the class is abstract, which for PHP 4 + * will never be the case. + * @returns boolean True if abstract. + * @access public + */ + function isAbstract() { + return false; + } + + /** + * Determines if the the entity is an interface, which for PHP 4 + * will never be the case. + * @returns boolean True if interface. + * @access public + */ + function isInterface() { + return false; + } + + /** + * Scans for final methods, but as it's PHP 4 there + * aren't any. + * @returns boolean True if the class has a final method. + * @access public + */ + function hasFinal() { + return false; + } + + /** + * Gets the source code matching the declaration + * of a method. + * @param string $method Method name. + * @access public + */ + function getSignature($method) { + return "function &$method()"; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/reflection_php5.php b/tests/simpletest/reflection_php5.php new file mode 100644 index 000000000..8383bccd3 --- /dev/null +++ b/tests/simpletest/reflection_php5.php @@ -0,0 +1,380 @@ +_interface = $interface; + } + + /** + * Checks that a class has been declared. Versions + * before PHP5.0.2 need a check that it's not really + * an interface. + * @return boolean True if defined. + * @access public + */ + function classExists() { + if (! class_exists($this->_interface)) { + return false; + } + $reflection = new ReflectionClass($this->_interface); + return ! $reflection->isInterface(); + } + + /** + * Needed to kill the autoload feature in PHP5 + * for classes created dynamically. + * @return boolean True if defined. + * @access public + */ + function classExistsSansAutoload() { + return class_exists($this->_interface, false); + } + + /** + * Checks that a class or interface has been + * declared. + * @return boolean True if defined. + * @access public + */ + function classOrInterfaceExists() { + return $this->_classOrInterfaceExistsWithAutoload($this->_interface, true); + } + + /** + * Needed to kill the autoload feature in PHP5 + * for classes created dynamically. + * @return boolean True if defined. + * @access public + */ + function classOrInterfaceExistsSansAutoload() { + return $this->_classOrInterfaceExistsWithAutoload($this->_interface, false); + } + + /** + * Needed to select the autoload feature in PHP5 + * for classes created dynamically. + * @param string $interface Class or interface name. + * @param boolean $autoload True totriggerautoload. + * @return boolean True if interface defined. + * @access private + */ + function _classOrInterfaceExistsWithAutoload($interface, $autoload) { + if (function_exists('interface_exists')) { + if (interface_exists($this->_interface, $autoload)) { + return true; + } + } + return class_exists($this->_interface, $autoload); + } + + /** + * Gets the list of methods on a class or + * interface. + * @returns array List of method names. + * @access public + */ + function getMethods() { + return array_unique(get_class_methods($this->_interface)); + } + + /** + * Gets the list of interfaces from a class. If the + * class name is actually an interface then just that + * interface is returned. + * @returns array List of interfaces. + * @access public + */ + function getInterfaces() { + $reflection = new ReflectionClass($this->_interface); + if ($reflection->isInterface()) { + return array($this->_interface); + } + return $this->_onlyParents($reflection->getInterfaces()); + } + + /** + * Gets the list of methods for the implemented + * interfaces only. + * @returns array List of enforced method signatures. + * @access public + */ + function getInterfaceMethods() { + $methods = array(); + foreach ($this->getInterfaces() as $interface) { + $methods = array_merge($methods, get_class_methods($interface)); + } + return array_unique($methods); + } + + /** + * Checks to see if the method signature has to be tightly + * specified. + * @param string $method Method name. + * @returns boolean True if enforced. + * @access private + */ + function _isInterfaceMethod($method) { + return in_array($method, $this->getInterfaceMethods()); + } + + /** + * Finds the parent class name. + * @returns string Parent class name. + * @access public + */ + function getParent() { + $reflection = new ReflectionClass($this->_interface); + $parent = $reflection->getParentClass(); + if ($parent) { + return $parent->getName(); + } + return false; + } + + /** + * Trivially determines if the class is abstract. + * @returns boolean True if abstract. + * @access public + */ + function isAbstract() { + $reflection = new ReflectionClass($this->_interface); + return $reflection->isAbstract(); + } + + /** + * Trivially determines if the class is an interface. + * @returns boolean True if interface. + * @access public + */ + function isInterface() { + $reflection = new ReflectionClass($this->_interface); + return $reflection->isInterface(); + } + + /** + * Scans for final methods, as they screw up inherited + * mocks by not allowing you to override them. + * @returns boolean True if the class has a final method. + * @access public + */ + function hasFinal() { + $reflection = new ReflectionClass($this->_interface); + foreach ($reflection->getMethods() as $method) { + if ($method->isFinal()) { + return true; + } + } + return false; + } + + /** + * Whittles a list of interfaces down to only the + * necessary top level parents. + * @param array $interfaces Reflection API interfaces + * to reduce. + * @returns array List of parent interface names. + * @access private + */ + function _onlyParents($interfaces) { + $parents = array(); + $blacklist = array(); + foreach ($interfaces as $interface) { + foreach($interfaces as $possible_parent) { + if ($interface->getName() == $possible_parent->getName()) { + continue; + } + if ($interface->isSubClassOf($possible_parent)) { + $blacklist[$possible_parent->getName()] = true; + } + } + if (!isset($blacklist[$interface->getName()])) { + $parents[] = $interface->getName(); + } + } + return $parents; + } + + /** + * Checks whether a method is abstract or not. + * @param string $name Method name. + * @return bool true if method is abstract, else false + * @access private + */ + function _isAbstractMethod($name) { + $interface = new ReflectionClass($this->_interface); + if (! $interface->hasMethod($name)) { + return false; + } + return $interface->getMethod($name)->isAbstract(); + } + + /** + * Checks whether a method is the constructor. + * @param string $name Method name. + * @return bool true if method is the constructor + * @access private + */ + function _isConstructor($name) { + return ($name == '__construct') || ($name == $this->_interface); + } + + /** + * Checks whether a method is abstract in all parents or not. + * @param string $name Method name. + * @return bool true if method is abstract in parent, else false + * @access private + */ + function _isAbstractMethodInParents($name) { + $interface = new ReflectionClass($this->_interface); + $parent = $interface->getParentClass(); + while($parent) { + if (! $parent->hasMethod($name)) { + return false; + } + if ($parent->getMethod($name)->isAbstract()) { + return true; + } + $parent = $parent->getParentClass(); + } + return false; + } + + /** + * Checks whether a method is static or not. + * @param string $name Method name + * @return bool true if method is static, else false + * @access private + */ + function _isStaticMethod($name) { + $interface = new ReflectionClass($this->_interface); + if (! $interface->hasMethod($name)) { + return false; + } + return $interface->getMethod($name)->isStatic(); + } + + /** + * Writes the source code matching the declaration + * of a method. + * @param string $name Method name. + * @return string Method signature up to last + * bracket. + * @access public + */ + function getSignature($name) { + if ($name == '__set') { + return 'function __set($key, $value)'; + } + if ($name == '__call') { + return 'function __call($method, $arguments)'; + } + if (version_compare(phpversion(), '5.1.0', '>=')) { + if (in_array($name, array('__get', '__isset', $name == '__unset'))) { + return "function {$name}(\$key)"; + } + } + if ($name == '__toString') { + return "function $name()"; + } + if ($this->_isInterfaceMethod($name) || + $this->_isAbstractMethod($name) || + $this->_isAbstractMethodInParents($name) || + $this->_isStaticMethod($name)) { + return $this->_getFullSignature($name); + } + return "function $name()"; + } + + /** + * For a signature specified in an interface, full + * details must be replicated to be a valid implementation. + * @param string $name Method name. + * @return string Method signature up to last + * bracket. + * @access private + */ + function _getFullSignature($name) { + $interface = new ReflectionClass($this->_interface); + $method = $interface->getMethod($name); + $reference = $method->returnsReference() ? '&' : ''; + $static = $method->isStatic() ? 'static ' : ''; + return "{$static}function $reference$name(" . + implode(', ', $this->_getParameterSignatures($method)) . + ")"; + } + + /** + * Gets the source code for each parameter. + * @param ReflectionMethod $method Method object from + * reflection API + * @return array List of strings, each + * a snippet of code. + * @access private + */ + function _getParameterSignatures($method) { + $signatures = array(); + foreach ($method->getParameters() as $parameter) { + $signature = ''; + $type = $parameter->getClass(); + if (is_null($type) && version_compare(phpversion(), '5.1.0', '>=') && $parameter->isArray()) { + $signature .= 'array '; + } elseif (!is_null($type)) { + $signature .= $type->getName() . ' '; + } + if ($parameter->isPassedByReference()) { + $signature .= '&'; + } + $signature .= '$' . $this->_suppressSpurious($parameter->getName()); + if ($this->_isOptional($parameter)) { + $signature .= ' = null'; + } + $signatures[] = $signature; + } + return $signatures; + } + + /** + * The SPL library has problems with the + * Reflection library. In particular, you can + * get extra characters in parameter names :(. + * @param string $name Parameter name. + * @return string Cleaner name. + * @access private + */ + function _suppressSpurious($name) { + return str_replace(array('[', ']', ' '), '', $name); + } + + /** + * Test of a reflection parameter being optional + * that works with early versions of PHP5. + * @param reflectionParameter $parameter Is this optional. + * @return boolean True if optional. + * @access private + */ + function _isOptional($parameter) { + if (method_exists($parameter, 'isOptional')) { + return $parameter->isOptional(); + } + return false; + } +} +?> diff --git a/tests/simpletest/remote.php b/tests/simpletest/remote.php new file mode 100644 index 000000000..8889ed7bf --- /dev/null +++ b/tests/simpletest/remote.php @@ -0,0 +1,117 @@ +_url = $url; + $this->_dry_url = $dry_url ? $dry_url : $url; + $this->_size = false; + } + + /** + * Accessor for the test name for subclasses. + * @return string Name of the test. + * @access public + */ + function getLabel() { + return $this->_url; + } + + /** + * Runs the top level test for this class. Currently + * reads the data as a single chunk. I'll fix this + * once I have added iteration to the browser. + * @param SimpleReporter $reporter Target of test results. + * @returns boolean True if no failures. + * @access public + */ + function run(&$reporter) { + $browser = &$this->_createBrowser(); + $xml = $browser->get($this->_url); + if (! $xml) { + trigger_error('Cannot read remote test URL [' . $this->_url . ']'); + return false; + } + $parser = &$this->_createParser($reporter); + if (! $parser->parse($xml)) { + trigger_error('Cannot parse incoming XML from [' . $this->_url . ']'); + return false; + } + return true; + } + + /** + * Creates a new web browser object for fetching + * the XML report. + * @return SimpleBrowser New browser. + * @access protected + */ + function &_createBrowser() { + $browser = &new SimpleBrowser(); + return $browser; + } + + /** + * Creates the XML parser. + * @param SimpleReporter $reporter Target of test results. + * @return SimpleTestXmlListener XML reader. + * @access protected + */ + function &_createParser(&$reporter) { + $parser = &new SimpleTestXmlParser($reporter); + return $parser; + } + + /** + * Accessor for the number of subtests. + * @return integer Number of test cases. + * @access public + */ + function getSize() { + if ($this->_size === false) { + $browser = &$this->_createBrowser(); + $xml = $browser->get($this->_dry_url); + if (! $xml) { + trigger_error('Cannot read remote test URL [' . $this->_dry_url . ']'); + return false; + } + $reporter = &new SimpleReporter(); + $parser = &$this->_createParser($reporter); + if (! $parser->parse($xml)) { + trigger_error('Cannot parse incoming XML from [' . $this->_dry_url . ']'); + return false; + } + $this->_size = $reporter->getTestCaseCount(); + } + return $this->_size; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/reporter.php b/tests/simpletest/reporter.php new file mode 100644 index 000000000..a13eff8cf --- /dev/null +++ b/tests/simpletest/reporter.php @@ -0,0 +1,447 @@ +SimpleReporter(); + $this->_character_set = $character_set; + } + + /** + * Paints the top of the web page setting the + * title to the name of the starting test. + * @param string $test_name Name class of test. + * @access public + */ + function paintHeader($test_name) { + $this->sendNoCacheHeaders(); + print ""; + print "\n\n$test_name\n"; + print "\n"; + print "\n"; + print "\n\n"; + print "

      $test_name

      \n"; + flush(); + } + + /** + * Send the headers necessary to ensure the page is + * reloaded on every request. Otherwise you could be + * scratching your head over out of date test data. + * @access public + * @static + */ + function sendNoCacheHeaders() { + if (! headers_sent()) { + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + } + } + + /** + * Paints the CSS. Add additional styles here. + * @return string CSS code as text. + * @access protected + */ + function _getCss() { + return ".fail { background-color: inherit; color: red; }" . + ".pass { background-color: inherit; color: green; }" . + " pre { background-color: lightgray; color: inherit; }"; + } + + /** + * Paints the end of the test with a summary of + * the passes and failures. + * @param string $test_name Name class of test. + * @access public + */ + function paintFooter($test_name) { + $colour = ($this->getFailCount() + $this->getExceptionCount() > 0 ? "red" : "green"); + print "
      "; + print $this->getTestCaseProgress() . "/" . $this->getTestCaseCount(); + print " test cases complete:\n"; + print "" . $this->getPassCount() . " passes, "; + print "" . $this->getFailCount() . " fails and "; + print "" . $this->getExceptionCount() . " exceptions."; + print "
      \n"; + print "\n\n"; + } + + /** + * Paints the test failure with a breadcrumbs + * trail of the nesting test suites below the + * top level test. + * @param string $message Failure message displayed in + * the context of the other tests. + * @access public + */ + function paintFail($message) { + parent::paintFail($message); + print "Fail: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . $this->_htmlEntities($message) . "
      \n"; + } + + /** + * Paints a PHP error. + * @param string $message Message is ignored. + * @access public + */ + function paintError($message) { + parent::paintError($message); + print "Exception: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . $this->_htmlEntities($message) . "
      \n"; + } + + /** + * Paints a PHP exception. + * @param Exception $exception Exception to display. + * @access public + */ + function paintException($exception) { + parent::paintException($exception); + print "Exception: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + $message = 'Unexpected exception of type [' . get_class($exception) . + '] with message ['. $exception->getMessage() . + '] in ['. $exception->getFile() . + ' line ' . $exception->getLine() . ']'; + print " -> " . $this->_htmlEntities($message) . "
      \n"; + } + + /** + * Prints the message for skipping tests. + * @param string $message Text of skip condition. + * @access public + */ + function paintSkip($message) { + parent::paintSkip($message); + print "Skipped: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . $this->_htmlEntities($message) . "
      \n"; + } + + /** + * Paints formatted text such as dumped variables. + * @param string $message Text to show. + * @access public + */ + function paintFormattedMessage($message) { + print '
      ' . $this->_htmlEntities($message) . '
      '; + } + + /** + * Character set adjusted entity conversion. + * @param string $message Plain text or Unicode message. + * @return string Browser readable message. + * @access protected + */ + function _htmlEntities($message) { + return htmlentities($message, ENT_COMPAT, $this->_character_set); + } +} + +/** + * Sample minimal test displayer. Generates only + * failure messages and a pass count. For command + * line use. I've tried to make it look like JUnit, + * but I wanted to output the errors as they arrived + * which meant dropping the dots. + * @package SimpleTest + * @subpackage UnitTester + */ +class TextReporter extends SimpleReporter { + + /** + * Does nothing yet. The first output will + * be sent on the first test start. + * @access public + */ + function TextReporter() { + $this->SimpleReporter(); + } + + /** + * Paints the title only. + * @param string $test_name Name class of test. + * @access public + */ + function paintHeader($test_name) { + if (! SimpleReporter::inCli()) { + header('Content-type: text/plain'); + } + print "$test_name\n"; + flush(); + } + + /** + * Paints the end of the test with a summary of + * the passes and failures. + * @param string $test_name Name class of test. + * @access public + */ + function paintFooter($test_name) { + if ($this->getFailCount() + $this->getExceptionCount() == 0) { + print "OK\n"; + } else { + print "FAILURES!!!\n"; + } + print "Test cases run: " . $this->getTestCaseProgress() . + "/" . $this->getTestCaseCount() . + ", Passes: " . $this->getPassCount() . + ", Failures: " . $this->getFailCount() . + ", Exceptions: " . $this->getExceptionCount() . "\n"; + } + + /** + * Paints the test failure as a stack trace. + * @param string $message Failure message displayed in + * the context of the other tests. + * @access public + */ + function paintFail($message) { + parent::paintFail($message); + print $this->getFailCount() . ") $message\n"; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); + print "\n"; + } + + /** + * Paints a PHP error or exception. + * @param string $message Message to be shown. + * @access public + * @abstract + */ + function paintError($message) { + parent::paintError($message); + print "Exception " . $this->getExceptionCount() . "!\n$message\n"; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); + print "\n"; + } + + /** + * Paints a PHP error or exception. + * @param Exception $exception Exception to describe. + * @access public + * @abstract + */ + function paintException($exception) { + parent::paintException($exception); + $message = 'Unexpected exception of type [' . get_class($exception) . + '] with message ['. $exception->getMessage() . + '] in ['. $exception->getFile() . + ' line ' . $exception->getLine() . ']'; + print "Exception " . $this->getExceptionCount() . "!\n$message\n"; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); + print "\n"; + } + + /** + * Prints the message for skipping tests. + * @param string $message Text of skip condition. + * @access public + */ + function paintSkip($message) { + parent::paintSkip($message); + print "Skip: $message\n"; + } + + /** + * Paints formatted text such as dumped variables. + * @param string $message Text to show. + * @access public + */ + function paintFormattedMessage($message) { + print "$message\n"; + flush(); + } +} + +/** + * Runs just a single test group, a single case or + * even a single test within that case. + * @package SimpleTest + * @subpackage UnitTester + */ +class SelectiveReporter extends SimpleReporterDecorator { + var $_just_this_case = false; + var $_just_this_test = false; + var $_on; + + /** + * Selects the test case or group to be run, + * and optionally a specific test. + * @param SimpleScorer $reporter Reporter to receive events. + * @param string $just_this_case Only this case or group will run. + * @param string $just_this_test Only this test method will run. + */ + function SelectiveReporter(&$reporter, $just_this_case = false, $just_this_test = false) { + if (isset($just_this_case) && $just_this_case) { + $this->_just_this_case = strtolower($just_this_case); + $this->_off(); + } else { + $this->_on(); + } + if (isset($just_this_test) && $just_this_test) { + $this->_just_this_test = strtolower($just_this_test); + } + $this->SimpleReporterDecorator($reporter); + } + + /** + * Compares criteria to actual the case/group name. + * @param string $test_case The incoming test. + * @return boolean True if matched. + * @access protected + */ + function _matchesTestCase($test_case) { + return $this->_just_this_case == strtolower($test_case); + } + + /** + * Compares criteria to actual the test name. If no + * name was specified at the beginning, then all tests + * can run. + * @param string $method The incoming test method. + * @return boolean True if matched. + * @access protected + */ + function _shouldRunTest($test_case, $method) { + if ($this->_isOn() || $this->_matchesTestCase($test_case)) { + if ($this->_just_this_test) { + return $this->_just_this_test == strtolower($method); + } else { + return true; + } + } + return false; + } + + /** + * Switch on testing for the group or subgroup. + * @access private + */ + function _on() { + $this->_on = true; + } + + /** + * Switch off testing for the group or subgroup. + * @access private + */ + function _off() { + $this->_on = false; + } + + /** + * Is this group actually being tested? + * @return boolean True if the current test group is active. + * @access private + */ + function _isOn() { + return $this->_on; + } + + /** + * Veto everything that doesn't match the method wanted. + * @param string $test_case Name of test case. + * @param string $method Name of test method. + * @return boolean True if test should be run. + * @access public + */ + function shouldInvoke($test_case, $method) { + if ($this->_shouldRunTest($test_case, $method)) { + return $this->_reporter->shouldInvoke($test_case, $method); + } + return false; + } + + /** + * Paints the start of a group test. + * @param string $test_case Name of test or other label. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($test_case, $size) { + if ($this->_just_this_case && $this->_matchesTestCase($test_case)) { + $this->_on(); + } + $this->_reporter->paintGroupStart($test_case, $size); + } + + /** + * Paints the end of a group test. + * @param string $test_case Name of test or other label. + * @access public + */ + function paintGroupEnd($test_case) { + $this->_reporter->paintGroupEnd($test_case); + if ($this->_just_this_case && $this->_matchesTestCase($test_case)) { + $this->_off(); + } + } +} + +/** + * Suppresses skip messages. + * @package SimpleTest + * @subpackage UnitTester + */ +class NoSkipsReporter extends SimpleReporterDecorator { + + /** + * Does nothing. + * @param string $message Text of skip condition. + * @access public + */ + function paintSkip($message) { } +} +?> \ No newline at end of file diff --git a/tests/simpletest/scorer.php b/tests/simpletest/scorer.php new file mode 100644 index 000000000..cc1331b89 --- /dev/null +++ b/tests/simpletest/scorer.php @@ -0,0 +1,863 @@ +_passes = 0; + $this->_fails = 0; + $this->_exceptions = 0; + $this->_is_dry_run = false; + } + + /** + * Signals that the next evaluation will be a dry + * run. That is, the structure events will be + * recorded, but no tests will be run. + * @param boolean $is_dry Dry run if true. + * @access public + */ + function makeDry($is_dry = true) { + $this->_is_dry_run = $is_dry; + } + + /** + * The reporter has a veto on what should be run. + * @param string $test_case_name name of test case. + * @param string $method Name of test method. + * @access public + */ + function shouldInvoke($test_case_name, $method) { + return ! $this->_is_dry_run; + } + + /** + * Can wrap the invoker in preperation for running + * a test. + * @param SimpleInvoker $invoker Individual test runner. + * @return SimpleInvoker Wrapped test runner. + * @access public + */ + function &createInvoker(&$invoker) { + return $invoker; + } + + /** + * Accessor for current status. Will be false + * if there have been any failures or exceptions. + * Used for command line tools. + * @return boolean True if no failures. + * @access public + */ + function getStatus() { + if ($this->_exceptions + $this->_fails > 0) { + return false; + } + return true; + } + + /** + * Paints the start of a group test. + * @param string $test_name Name of test or other label. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($test_name, $size) { + } + + /** + * Paints the end of a group test. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintGroupEnd($test_name) { + } + + /** + * Paints the start of a test case. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseStart($test_name) { + } + + /** + * Paints the end of a test case. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseEnd($test_name) { + } + + /** + * Paints the start of a test method. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintMethodStart($test_name) { + } + + /** + * Paints the end of a test method. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintMethodEnd($test_name) { + } + + /** + * Increments the pass count. + * @param string $message Message is ignored. + * @access public + */ + function paintPass($message) { + $this->_passes++; + } + + /** + * Increments the fail count. + * @param string $message Message is ignored. + * @access public + */ + function paintFail($message) { + $this->_fails++; + } + + /** + * Deals with PHP 4 throwing an error. + * @param string $message Text of error formatted by + * the test case. + * @access public + */ + function paintError($message) { + $this->_exceptions++; + } + + /** + * Deals with PHP 5 throwing an exception. + * @param Exception $exception The actual exception thrown. + * @access public + */ + function paintException($exception) { + $this->_exceptions++; + } + + /** + * Prints the message for skipping tests. + * @param string $message Text of skip condition. + * @access public + */ + function paintSkip($message) { + } + + /** + * Accessor for the number of passes so far. + * @return integer Number of passes. + * @access public + */ + function getPassCount() { + return $this->_passes; + } + + /** + * Accessor for the number of fails so far. + * @return integer Number of fails. + * @access public + */ + function getFailCount() { + return $this->_fails; + } + + /** + * Accessor for the number of untrapped errors + * so far. + * @return integer Number of exceptions. + * @access public + */ + function getExceptionCount() { + return $this->_exceptions; + } + + /** + * Paints a simple supplementary message. + * @param string $message Text to display. + * @access public + */ + function paintMessage($message) { + } + + /** + * Paints a formatted ASCII message such as a + * variable dump. + * @param string $message Text to display. + * @access public + */ + function paintFormattedMessage($message) { + } + + /** + * By default just ignores user generated events. + * @param string $type Event type as text. + * @param mixed $payload Message or object. + * @access public + */ + function paintSignal($type, $payload) { + } +} + +/** + * Recipient of generated test messages that can display + * page footers and headers. Also keeps track of the + * test nesting. This is the main base class on which + * to build the finished test (page based) displays. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleReporter extends SimpleScorer { + var $_test_stack; + var $_size; + var $_progress; + + /** + * Starts the display with no results in. + * @access public + */ + function SimpleReporter() { + $this->SimpleScorer(); + $this->_test_stack = array(); + $this->_size = null; + $this->_progress = 0; + } + + /** + * Gets the formatter for variables and other small + * generic data items. + * @return SimpleDumper Formatter. + * @access public + */ + function getDumper() { + return new SimpleDumper(); + } + + /** + * Paints the start of a group test. Will also paint + * the page header and footer if this is the + * first test. Will stash the size if the first + * start. + * @param string $test_name Name of test that is starting. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($test_name, $size) { + if (! isset($this->_size)) { + $this->_size = $size; + } + if (count($this->_test_stack) == 0) { + $this->paintHeader($test_name); + } + $this->_test_stack[] = $test_name; + } + + /** + * Paints the end of a group test. Will paint the page + * footer if the stack of tests has unwound. + * @param string $test_name Name of test that is ending. + * @param integer $progress Number of test cases ending. + * @access public + */ + function paintGroupEnd($test_name) { + array_pop($this->_test_stack); + if (count($this->_test_stack) == 0) { + $this->paintFooter($test_name); + } + } + + /** + * Paints the start of a test case. Will also paint + * the page header and footer if this is the + * first test. Will stash the size if the first + * start. + * @param string $test_name Name of test that is starting. + * @access public + */ + function paintCaseStart($test_name) { + if (! isset($this->_size)) { + $this->_size = 1; + } + if (count($this->_test_stack) == 0) { + $this->paintHeader($test_name); + } + $this->_test_stack[] = $test_name; + } + + /** + * Paints the end of a test case. Will paint the page + * footer if the stack of tests has unwound. + * @param string $test_name Name of test that is ending. + * @access public + */ + function paintCaseEnd($test_name) { + $this->_progress++; + array_pop($this->_test_stack); + if (count($this->_test_stack) == 0) { + $this->paintFooter($test_name); + } + } + + /** + * Paints the start of a test method. + * @param string $test_name Name of test that is starting. + * @access public + */ + function paintMethodStart($test_name) { + $this->_test_stack[] = $test_name; + } + + /** + * Paints the end of a test method. Will paint the page + * footer if the stack of tests has unwound. + * @param string $test_name Name of test that is ending. + * @access public + */ + function paintMethodEnd($test_name) { + array_pop($this->_test_stack); + } + + /** + * Paints the test document header. + * @param string $test_name First test top level + * to start. + * @access public + * @abstract + */ + function paintHeader($test_name) { + } + + /** + * Paints the test document footer. + * @param string $test_name The top level test. + * @access public + * @abstract + */ + function paintFooter($test_name) { + } + + /** + * Accessor for internal test stack. For + * subclasses that need to see the whole test + * history for display purposes. + * @return array List of methods in nesting order. + * @access public + */ + function getTestList() { + return $this->_test_stack; + } + + /** + * Accessor for total test size in number + * of test cases. Null until the first + * test is started. + * @return integer Total number of cases at start. + * @access public + */ + function getTestCaseCount() { + return $this->_size; + } + + /** + * Accessor for the number of test cases + * completed so far. + * @return integer Number of ended cases. + * @access public + */ + function getTestCaseProgress() { + return $this->_progress; + } + + /** + * Static check for running in the comand line. + * @return boolean True if CLI. + * @access public + * @static + */ + function inCli() { + return php_sapi_name() == 'cli'; + } +} + +/** + * For modifying the behaviour of the visual reporters. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleReporterDecorator { + var $_reporter; + + /** + * Mediates between the reporter and the test case. + * @param SimpleScorer $reporter Reporter to receive events. + */ + function SimpleReporterDecorator(&$reporter) { + $this->_reporter = &$reporter; + } + + /** + * Signals that the next evaluation will be a dry + * run. That is, the structure events will be + * recorded, but no tests will be run. + * @param boolean $is_dry Dry run if true. + * @access public + */ + function makeDry($is_dry = true) { + $this->_reporter->makeDry($is_dry); + } + + /** + * Accessor for current status. Will be false + * if there have been any failures or exceptions. + * Used for command line tools. + * @return boolean True if no failures. + * @access public + */ + function getStatus() { + return $this->_reporter->getStatus(); + } + + /** + * The reporter has a veto on what should be run. + * @param string $test_case_name name of test case. + * @param string $method Name of test method. + * @return boolean True if test should be run. + * @access public + */ + function shouldInvoke($test_case_name, $method) { + return $this->_reporter->shouldInvoke($test_case_name, $method); + } + + /** + * Can wrap the invoker in preperation for running + * a test. + * @param SimpleInvoker $invoker Individual test runner. + * @return SimpleInvoker Wrapped test runner. + * @access public + */ + function &createInvoker(&$invoker) { + return $this->_reporter->createInvoker($invoker); + } + + /** + * Gets the formatter for variables and other small + * generic data items. + * @return SimpleDumper Formatter. + * @access public + */ + function getDumper() { + return $this->_reporter->getDumper(); + } + + /** + * Paints the start of a group test. + * @param string $test_name Name of test or other label. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($test_name, $size) { + $this->_reporter->paintGroupStart($test_name, $size); + } + + /** + * Paints the end of a group test. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintGroupEnd($test_name) { + $this->_reporter->paintGroupEnd($test_name); + } + + /** + * Paints the start of a test case. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseStart($test_name) { + $this->_reporter->paintCaseStart($test_name); + } + + /** + * Paints the end of a test case. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseEnd($test_name) { + $this->_reporter->paintCaseEnd($test_name); + } + + /** + * Paints the start of a test method. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintMethodStart($test_name) { + $this->_reporter->paintMethodStart($test_name); + } + + /** + * Paints the end of a test method. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintMethodEnd($test_name) { + $this->_reporter->paintMethodEnd($test_name); + } + + /** + * Chains to the wrapped reporter. + * @param string $message Message is ignored. + * @access public + */ + function paintPass($message) { + $this->_reporter->paintPass($message); + } + + /** + * Chains to the wrapped reporter. + * @param string $message Message is ignored. + * @access public + */ + function paintFail($message) { + $this->_reporter->paintFail($message); + } + + /** + * Chains to the wrapped reporter. + * @param string $message Text of error formatted by + * the test case. + * @access public + */ + function paintError($message) { + $this->_reporter->paintError($message); + } + + /** + * Chains to the wrapped reporter. + * @param Exception $exception Exception to show. + * @access public + */ + function paintException($exception) { + $this->_reporter->paintException($exception); + } + + /** + * Prints the message for skipping tests. + * @param string $message Text of skip condition. + * @access public + */ + function paintSkip($message) { + $this->_reporter->paintSkip($message); + } + + /** + * Chains to the wrapped reporter. + * @param string $message Text to display. + * @access public + */ + function paintMessage($message) { + $this->_reporter->paintMessage($message); + } + + /** + * Chains to the wrapped reporter. + * @param string $message Text to display. + * @access public + */ + function paintFormattedMessage($message) { + $this->_reporter->paintFormattedMessage($message); + } + + /** + * Chains to the wrapped reporter. + * @param string $type Event type as text. + * @param mixed $payload Message or object. + * @return boolean Should return false if this + * type of signal should fail the + * test suite. + * @access public + */ + function paintSignal($type, &$payload) { + $this->_reporter->paintSignal($type, $payload); + } +} + +/** + * For sending messages to multiple reporters at + * the same time. + * @package SimpleTest + * @subpackage UnitTester + */ +class MultipleReporter { + var $_reporters = array(); + + /** + * Adds a reporter to the subscriber list. + * @param SimpleScorer $reporter Reporter to receive events. + * @access public + */ + function attachReporter(&$reporter) { + $this->_reporters[] = &$reporter; + } + + /** + * Signals that the next evaluation will be a dry + * run. That is, the structure events will be + * recorded, but no tests will be run. + * @param boolean $is_dry Dry run if true. + * @access public + */ + function makeDry($is_dry = true) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->makeDry($is_dry); + } + } + + /** + * Accessor for current status. Will be false + * if there have been any failures or exceptions. + * If any reporter reports a failure, the whole + * suite fails. + * @return boolean True if no failures. + * @access public + */ + function getStatus() { + for ($i = 0; $i < count($this->_reporters); $i++) { + if (! $this->_reporters[$i]->getStatus()) { + return false; + } + } + return true; + } + + /** + * The reporter has a veto on what should be run. + * It requires all reporters to want to run the method. + * @param string $test_case_name name of test case. + * @param string $method Name of test method. + * @access public + */ + function shouldInvoke($test_case_name, $method) { + for ($i = 0; $i < count($this->_reporters); $i++) { + if (! $this->_reporters[$i]->shouldInvoke($test_case_name, $method)) { + return false; + } + } + return true; + } + + /** + * Every reporter gets a chance to wrap the invoker. + * @param SimpleInvoker $invoker Individual test runner. + * @return SimpleInvoker Wrapped test runner. + * @access public + */ + function &createInvoker(&$invoker) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $invoker = &$this->_reporters[$i]->createInvoker($invoker); + } + return $invoker; + } + + /** + * Gets the formatter for variables and other small + * generic data items. + * @return SimpleDumper Formatter. + * @access public + */ + function getDumper() { + return new SimpleDumper(); + } + + /** + * Paints the start of a group test. + * @param string $test_name Name of test or other label. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($test_name, $size) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintGroupStart($test_name, $size); + } + } + + /** + * Paints the end of a group test. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintGroupEnd($test_name) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintGroupEnd($test_name); + } + } + + /** + * Paints the start of a test case. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseStart($test_name) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintCaseStart($test_name); + } + } + + /** + * Paints the end of a test case. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintCaseEnd($test_name) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintCaseEnd($test_name); + } + } + + /** + * Paints the start of a test method. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintMethodStart($test_name) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintMethodStart($test_name); + } + } + + /** + * Paints the end of a test method. + * @param string $test_name Name of test or other label. + * @access public + */ + function paintMethodEnd($test_name) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintMethodEnd($test_name); + } + } + + /** + * Chains to the wrapped reporter. + * @param string $message Message is ignored. + * @access public + */ + function paintPass($message) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintPass($message); + } + } + + /** + * Chains to the wrapped reporter. + * @param string $message Message is ignored. + * @access public + */ + function paintFail($message) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintFail($message); + } + } + + /** + * Chains to the wrapped reporter. + * @param string $message Text of error formatted by + * the test case. + * @access public + */ + function paintError($message) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintError($message); + } + } + + /** + * Chains to the wrapped reporter. + * @param Exception $exception Exception to display. + * @access public + */ + function paintException($exception) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintException($exception); + } + } + + /** + * Prints the message for skipping tests. + * @param string $message Text of skip condition. + * @access public + */ + function paintSkip($message) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintSkip($message); + } + } + + /** + * Chains to the wrapped reporter. + * @param string $message Text to display. + * @access public + */ + function paintMessage($message) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintMessage($message); + } + } + + /** + * Chains to the wrapped reporter. + * @param string $message Text to display. + * @access public + */ + function paintFormattedMessage($message) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintFormattedMessage($message); + } + } + + /** + * Chains to the wrapped reporter. + * @param string $type Event type as text. + * @param mixed $payload Message or object. + * @return boolean Should return false if this + * type of signal should fail the + * test suite. + * @access public + */ + function paintSignal($type, &$payload) { + for ($i = 0; $i < count($this->_reporters); $i++) { + $this->_reporters[$i]->paintSignal($type, $payload); + } + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/selector.php b/tests/simpletest/selector.php new file mode 100644 index 000000000..de044b85a --- /dev/null +++ b/tests/simpletest/selector.php @@ -0,0 +1,137 @@ +_name = $name; + } + + function getName() { + return $this->_name; + } + + /** + * Compares with name attribute of widget. + * @param SimpleWidget $widget Control to compare. + * @access public + */ + function isMatch($widget) { + return ($widget->getName() == $this->_name); + } +} + +/** + * Used to extract form elements for testing against. + * Searches by visible label or alt text. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleByLabel { + var $_label; + + /** + * Stashes the name for later comparison. + * @param string $label Visible text to match. + */ + function SimpleByLabel($label) { + $this->_label = $label; + } + + /** + * Comparison. Compares visible text of widget or + * related label. + * @param SimpleWidget $widget Control to compare. + * @access public + */ + function isMatch($widget) { + if (! method_exists($widget, 'isLabel')) { + return false; + } + return $widget->isLabel($this->_label); + } +} + +/** + * Used to extract form elements for testing against. + * Searches dy id attribute. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleById { + var $_id; + + /** + * Stashes the name for later comparison. + * @param string $id ID atribute to match. + */ + function SimpleById($id) { + $this->_id = $id; + } + + /** + * Comparison. Compares id attribute of widget. + * @param SimpleWidget $widget Control to compare. + * @access public + */ + function isMatch($widget) { + return $widget->isId($this->_id); + } +} + +/** + * Used to extract form elements for testing against. + * Searches by visible label, name or alt text. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleByLabelOrName { + var $_label; + + /** + * Stashes the name/label for later comparison. + * @param string $label Visible text to match. + */ + function SimpleByLabelOrName($label) { + $this->_label = $label; + } + + /** + * Comparison. Compares visible text of widget or + * related label or name. + * @param SimpleWidget $widget Control to compare. + * @access public + */ + function isMatch($widget) { + if (method_exists($widget, 'isLabel')) { + if ($widget->isLabel($this->_label)) { + return true; + } + } + return ($widget->getName() == $this->_label); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/shell_tester.php b/tests/simpletest/shell_tester.php new file mode 100644 index 000000000..7b98869ec --- /dev/null +++ b/tests/simpletest/shell_tester.php @@ -0,0 +1,333 @@ +_output = false; + } + + /** + * Actually runs the command. Does not trap the + * error stream output as this need PHP 4.3+. + * @param string $command The actual command line + * to run. + * @return integer Exit code. + * @access public + */ + function execute($command) { + $this->_output = false; + exec($command, $this->_output, $ret); + return $ret; + } + + /** + * Accessor for the last output. + * @return string Output as text. + * @access public + */ + function getOutput() { + return implode("\n", $this->_output); + } + + /** + * Accessor for the last output. + * @return array Output as array of lines. + * @access public + */ + function getOutputAsList() { + return $this->_output; + } +} + +/** + * Test case for testing of command line scripts and + * utilities. Usually scripts that are external to the + * PHP code, but support it in some way. + * @package SimpleTest + * @subpackage UnitTester + */ +class ShellTestCase extends SimpleTestCase { + var $_current_shell; + var $_last_status; + var $_last_command; + + /** + * Creates an empty test case. Should be subclassed + * with test methods for a functional test case. + * @param string $label Name of test case. Will use + * the class name if none specified. + * @access public + */ + function ShellTestCase($label = false) { + $this->SimpleTestCase($label); + $this->_current_shell = &$this->_createShell(); + $this->_last_status = false; + $this->_last_command = ''; + } + + /** + * Executes a command and buffers the results. + * @param string $command Command to run. + * @return boolean True if zero exit code. + * @access public + */ + function execute($command) { + $shell = &$this->_getShell(); + $this->_last_status = $shell->execute($command); + $this->_last_command = $command; + return ($this->_last_status === 0); + } + + /** + * Dumps the output of the last command. + * @access public + */ + function dumpOutput() { + $this->dump($this->getOutput()); + } + + /** + * Accessor for the last output. + * @return string Output as text. + * @access public + */ + function getOutput() { + $shell = &$this->_getShell(); + return $shell->getOutput(); + } + + /** + * Accessor for the last output. + * @return array Output as array of lines. + * @access public + */ + function getOutputAsList() { + $shell = &$this->_getShell(); + return $shell->getOutputAsList(); + } + + /** + * Called from within the test methods to register + * passes and failures. + * @param boolean $result Pass on true. + * @param string $message Message to display describing + * the test state. + * @return boolean True on pass + * @access public + */ + function assertTrue($result, $message = false) { + return $this->assert(new TrueExpectation(), $result, $message); + } + + /** + * Will be true on false and vice versa. False + * is the PHP definition of false, so that null, + * empty strings, zero and an empty array all count + * as false. + * @param boolean $result Pass on false. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertFalse($result, $message = '%s') { + return $this->assert(new FalseExpectation(), $result, $message); + } + + /** + * Will trigger a pass if the two parameters have + * the same value only. Otherwise a fail. This + * is for testing hand extracted text, etc. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertEqual($first, $second, $message = "%s") { + return $this->assert( + new EqualExpectation($first), + $second, + $message); + } + + /** + * Will trigger a pass if the two parameters have + * a different value. Otherwise a fail. This + * is for testing hand extracted text, etc. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertNotEqual($first, $second, $message = "%s") { + return $this->assert( + new NotEqualExpectation($first), + $second, + $message); + } + + /** + * Tests the last status code from the shell. + * @param integer $status Expected status of last + * command. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertExitCode($status, $message = "%s") { + $message = sprintf($message, "Expected status code of [$status] from [" . + $this->_last_command . "], but got [" . + $this->_last_status . "]"); + return $this->assertTrue($status === $this->_last_status, $message); + } + + /** + * Attempt to exactly match the combined STDERR and + * STDOUT output. + * @param string $expected Expected output. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertOutput($expected, $message = "%s") { + $shell = &$this->_getShell(); + return $this->assert( + new EqualExpectation($expected), + $shell->getOutput(), + $message); + } + + /** + * Scans the output for a Perl regex. If found + * anywhere it passes, else it fails. + * @param string $pattern Regex to search for. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertOutputPattern($pattern, $message = "%s") { + $shell = &$this->_getShell(); + return $this->assert( + new PatternExpectation($pattern), + $shell->getOutput(), + $message); + } + + /** + * If a Perl regex is found anywhere in the current + * output then a failure is generated, else a pass. + * @param string $pattern Regex to search for. + * @param $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertNoOutputPattern($pattern, $message = "%s") { + $shell = &$this->_getShell(); + return $this->assert( + new NoPatternExpectation($pattern), + $shell->getOutput(), + $message); + } + + /** + * File existence check. + * @param string $path Full filename and path. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertFileExists($path, $message = "%s") { + $message = sprintf($message, "File [$path] should exist"); + return $this->assertTrue(file_exists($path), $message); + } + + /** + * File non-existence check. + * @param string $path Full filename and path. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertFileNotExists($path, $message = "%s") { + $message = sprintf($message, "File [$path] should not exist"); + return $this->assertFalse(file_exists($path), $message); + } + + /** + * Scans a file for a Perl regex. If found + * anywhere it passes, else it fails. + * @param string $pattern Regex to search for. + * @param string $path Full filename and path. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertFilePattern($pattern, $path, $message = "%s") { + $shell = &$this->_getShell(); + return $this->assert( + new PatternExpectation($pattern), + implode('', file($path)), + $message); + } + + /** + * If a Perl regex is found anywhere in the named + * file then a failure is generated, else a pass. + * @param string $pattern Regex to search for. + * @param string $path Full filename and path. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertNoFilePattern($pattern, $path, $message = "%s") { + $shell = &$this->_getShell(); + return $this->assert( + new NoPatternExpectation($pattern), + implode('', file($path)), + $message); + } + + /** + * Accessor for current shell. Used for testing the + * the tester itself. + * @return Shell Current shell. + * @access protected + */ + function &_getShell() { + return $this->_current_shell; + } + + /** + * Factory for the shell to run the command on. + * @return Shell New shell object. + * @access protected + */ + function &_createShell() { + $shell = &new SimpleShell(); + return $shell; + } +} +?> diff --git a/tests/simpletest/simpletest.php b/tests/simpletest/simpletest.php new file mode 100644 index 000000000..bab2c1a6a --- /dev/null +++ b/tests/simpletest/simpletest.php @@ -0,0 +1,478 @@ += 0) { + require_once(dirname(__FILE__) . '/reflection_php5.php'); +} else { + require_once(dirname(__FILE__) . '/reflection_php4.php'); +} +require_once(dirname(__FILE__) . '/default_reporter.php'); +require_once(dirname(__FILE__) . '/compatibility.php'); +/**#@-*/ + +/** + * Registry and test context. Includes a few + * global options that I'm slowly getting rid of. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleTest { + + /** + * Reads the SimpleTest version from the release file. + * @return string Version string. + * @static + * @access public + */ + function getVersion() { + $content = file(dirname(__FILE__) . '/VERSION'); + return trim($content[0]); + } + + /** + * Sets the name of a test case to ignore, usually + * because the class is an abstract case that should + * not be run. Once PHP4 is dropped this will disappear + * as a public method and "abstract" will rule. + * @param string $class Add a class to ignore. + * @static + * @access public + */ + function ignore($class) { + $registry = &SimpleTest::_getRegistry(); + $registry['IgnoreList'][strtolower($class)] = true; + } + + /** + * Scans the now complete ignore list, and adds + * all parent classes to the list. If a class + * is not a runnable test case, then it's parents + * wouldn't be either. This is syntactic sugar + * to cut down on ommissions of ignore()'s or + * missing abstract declarations. This cannot + * be done whilst loading classes wiithout forcing + * a particular order on the class declarations and + * the ignore() calls. It's just nice to have the ignore() + * calls at the top of the file before the actual declarations. + * @param array $classes Class names of interest. + * @static + * @access public + */ + function ignoreParentsIfIgnored($classes) { + $registry = &SimpleTest::_getRegistry(); + foreach ($classes as $class) { + if (SimpleTest::isIgnored($class)) { + $reflection = new SimpleReflection($class); + if ($parent = $reflection->getParent()) { + SimpleTest::ignore($parent); + } + } + } + } + + /** + * Puts the object to the global pool of 'preferred' objects + * which can be retrieved with SimpleTest :: preferred() method. + * Instances of the same class are overwritten. + * @param object $object Preferred object + * @static + * @access public + * @see preferred() + */ + function prefer(&$object) { + $registry = &SimpleTest::_getRegistry(); + $registry['Preferred'][] = &$object; + } + + /** + * Retrieves 'preferred' objects from global pool. Class filter + * can be applied in order to retrieve the object of the specific + * class + * @param array|string $classes Allowed classes or interfaces. + * @static + * @access public + * @return array|object|null + * @see prefer() + */ + function &preferred($classes) { + if (! is_array($classes)) { + $classes = array($classes); + } + $registry = &SimpleTest::_getRegistry(); + for ($i = count($registry['Preferred']) - 1; $i >= 0; $i--) { + foreach ($classes as $class) { + if (SimpleTestCompatibility::isA($registry['Preferred'][$i], $class)) { + return $registry['Preferred'][$i]; + } + } + } + return null; + } + + /** + * Test to see if a test case is in the ignore + * list. Quite obviously the ignore list should + * be a separate object and will be one day. + * This method is internal to SimpleTest. Don't + * use it. + * @param string $class Class name to test. + * @return boolean True if should not be run. + * @access public + * @static + */ + function isIgnored($class) { + $registry = &SimpleTest::_getRegistry(); + return isset($registry['IgnoreList'][strtolower($class)]); + } + + /** + * @deprecated + */ + function setMockBaseClass($mock_base) { + $registry = &SimpleTest::_getRegistry(); + $registry['MockBaseClass'] = $mock_base; + } + + /** + * @deprecated + */ + function getMockBaseClass() { + $registry = &SimpleTest::_getRegistry(); + return $registry['MockBaseClass']; + } + + /** + * Sets proxy to use on all requests for when + * testing from behind a firewall. Set host + * to false to disable. This will take effect + * if there are no other proxy settings. + * @param string $proxy Proxy host as URL. + * @param string $username Proxy username for authentication. + * @param string $password Proxy password for authentication. + * @access public + */ + function useProxy($proxy, $username = false, $password = false) { + $registry = &SimpleTest::_getRegistry(); + $registry['DefaultProxy'] = $proxy; + $registry['DefaultProxyUsername'] = $username; + $registry['DefaultProxyPassword'] = $password; + } + + /** + * Accessor for default proxy host. + * @return string Proxy URL. + * @access public + */ + function getDefaultProxy() { + $registry = &SimpleTest::_getRegistry(); + return $registry['DefaultProxy']; + } + + /** + * Accessor for default proxy username. + * @return string Proxy username for authentication. + * @access public + */ + function getDefaultProxyUsername() { + $registry = &SimpleTest::_getRegistry(); + return $registry['DefaultProxyUsername']; + } + + /** + * Accessor for default proxy password. + * @return string Proxy password for authentication. + * @access public + */ + function getDefaultProxyPassword() { + $registry = &SimpleTest::_getRegistry(); + return $registry['DefaultProxyPassword']; + } + + /** + * Accessor for global registry of options. + * @return hash All stored values. + * @access private + * @static + */ + function &_getRegistry() { + static $registry = false; + if (! $registry) { + $registry = SimpleTest::_getDefaults(); + } + return $registry; + } + + /** + * Accessor for the context of the current + * test run. + * @return SimpleTestContext Current test run. + * @access public + * @static + */ + function &getContext() { + static $context = false; + if (! $context) { + $context = new SimpleTestContext(); + } + return $context; + } + + /** + * Constant default values. + * @return hash All registry defaults. + * @access private + * @static + */ + function _getDefaults() { + return array( + 'StubBaseClass' => 'SimpleStub', + 'MockBaseClass' => 'SimpleMock', + 'IgnoreList' => array(), + 'DefaultProxy' => false, + 'DefaultProxyUsername' => false, + 'DefaultProxyPassword' => false, + 'Preferred' => array(new HtmlReporter(), new TextReporter(), new XmlReporter())); + } +} + +/** + * Container for all components for a specific + * test run. Makes things like error queues + * available to PHP event handlers, and also + * gets around some nasty reference issues in + * the mocks. + * @package SimpleTest + */ +class SimpleTestContext { + var $_test; + var $_reporter; + var $_resources; + + /** + * Clears down the current context. + * @access public + */ + function clear() { + $this->_resources = array(); + } + + /** + * Sets the current test case instance. This + * global instance can be used by the mock objects + * to send message to the test cases. + * @param SimpleTestCase $test Test case to register. + * @access public + */ + function setTest(&$test) { + $this->clear(); + $this->_test = &$test; + } + + /** + * Accessor for currently running test case. + * @return SimpleTestCase Current test. + * @access public + */ + function &getTest() { + return $this->_test; + } + + /** + * Sets the current reporter. This + * global instance can be used by the mock objects + * to send messages. + * @param SimpleReporter $reporter Reporter to register. + * @access public + */ + function setReporter(&$reporter) { + $this->clear(); + $this->_reporter = &$reporter; + } + + /** + * Accessor for current reporter. + * @return SimpleReporter Current reporter. + * @access public + */ + function &getReporter() { + return $this->_reporter; + } + + /** + * Accessor for the Singleton resource. + * @return object Global resource. + * @access public + * @static + */ + function &get($resource) { + if (! isset($this->_resources[$resource])) { + $this->_resources[$resource] = &new $resource(); + } + return $this->_resources[$resource]; + } +} + +/** + * Interrogates the stack trace to recover the + * failure point. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleStackTrace { + var $_prefixes; + + /** + * Stashes the list of target prefixes. + * @param array $prefixes List of method prefixes + * to search for. + */ + function SimpleStackTrace($prefixes) { + $this->_prefixes = $prefixes; + } + + /** + * Extracts the last method name that was not within + * Simpletest itself. Captures a stack trace if none given. + * @param array $stack List of stack frames. + * @return string Snippet of test report with line + * number and file. + * @access public + */ + function traceMethod($stack = false) { + $stack = $stack ? $stack : $this->_captureTrace(); + foreach ($stack as $frame) { + if ($this->_frameLiesWithinSimpleTestFolder($frame)) { + continue; + } + if ($this->_frameMatchesPrefix($frame)) { + return ' at [' . $frame['file'] . ' line ' . $frame['line'] . ']'; + } + } + return ''; + } + + /** + * Test to see if error is generated by SimpleTest itself. + * @param array $frame PHP stack frame. + * @return boolean True if a SimpleTest file. + * @access private + */ + function _frameLiesWithinSimpleTestFolder($frame) { + if (isset($frame['file'])) { + $path = substr(SIMPLE_TEST, 0, -1); + if (strpos($frame['file'], $path) === 0) { + if (dirname($frame['file']) == $path) { + return true; + } + } + } + return false; + } + + /** + * Tries to determine if the method call is an assert, etc. + * @param array $frame PHP stack frame. + * @return boolean True if matches a target. + * @access private + */ + function _frameMatchesPrefix($frame) { + foreach ($this->_prefixes as $prefix) { + if (strncmp($frame['function'], $prefix, strlen($prefix)) == 0) { + return true; + } + } + return false; + } + + /** + * Grabs a current stack trace. + * @return array Fulle trace. + * @access private + */ + function _captureTrace() { + if (function_exists('debug_backtrace')) { + return array_reverse(debug_backtrace()); + } + return array(); + } +} + +/** + * @package SimpleTest + * @subpackage UnitTester + * @deprecated + */ +class SimpleTestOptions extends SimpleTest { + + /** + * @deprecated + */ + function getVersion() { + return Simpletest::getVersion(); + } + + /** + * @deprecated + */ + function ignore($class) { + return Simpletest::ignore($class); + } + + /** + * @deprecated + */ + function isIgnored($class) { + return Simpletest::isIgnored($class); + } + + /** + * @deprecated + */ + function setMockBaseClass($mock_base) { + return Simpletest::setMockBaseClass($mock_base); + } + + /** + * @deprecated + */ + function getMockBaseClass() { + return Simpletest::getMockBaseClass(); + } + + /** + * @deprecated + */ + function useProxy($proxy, $username = false, $password = false) { + return Simpletest::useProxy($proxy, $username, $password); + } + + /** + * @deprecated + */ + function getDefaultProxy() { + return Simpletest::getDefaultProxy(); + } + + /** + * @deprecated + */ + function getDefaultProxyUsername() { + return Simpletest::getDefaultProxyUsername(); + } + + /** + * @deprecated + */ + function getDefaultProxyPassword() { + return Simpletest::getDefaultProxyPassword(); + } +} +?> diff --git a/tests/simpletest/socket.php b/tests/simpletest/socket.php new file mode 100644 index 000000000..3ad5a9ff4 --- /dev/null +++ b/tests/simpletest/socket.php @@ -0,0 +1,216 @@ +_clearError(); + } + + /** + * Test for an outstanding error. + * @return boolean True if there is an error. + * @access public + */ + function isError() { + return ($this->_error != ''); + } + + /** + * Accessor for an outstanding error. + * @return string Empty string if no error otherwise + * the error message. + * @access public + */ + function getError() { + return $this->_error; + } + + /** + * Sets the internal error. + * @param string Error message to stash. + * @access protected + */ + function _setError($error) { + $this->_error = $error; + } + + /** + * Resets the error state to no error. + * @access protected + */ + function _clearError() { + $this->_setError(''); + } +} + +/** + * Wrapper for TCP/IP socket. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleSocket extends SimpleStickyError { + var $_handle; + var $_is_open = false; + var $_sent = ''; + var $lock_size; + + /** + * Opens a socket for reading and writing. + * @param string $host Hostname to send request to. + * @param integer $port Port on remote machine to open. + * @param integer $timeout Connection timeout in seconds. + * @param integer $block_size Size of chunk to read. + * @access public + */ + function SimpleSocket($host, $port, $timeout, $block_size = 255) { + $this->SimpleStickyError(); + if (! ($this->_handle = $this->_openSocket($host, $port, $error_number, $error, $timeout))) { + $this->_setError("Cannot open [$host:$port] with [$error] within [$timeout] seconds"); + return; + } + $this->_is_open = true; + $this->_block_size = $block_size; + SimpleTestCompatibility::setTimeout($this->_handle, $timeout); + } + + /** + * Writes some data to the socket and saves alocal copy. + * @param string $message String to send to socket. + * @return boolean True if successful. + * @access public + */ + function write($message) { + if ($this->isError() || ! $this->isOpen()) { + return false; + } + $count = fwrite($this->_handle, $message); + if (! $count) { + if ($count === false) { + $this->_setError('Cannot write to socket'); + $this->close(); + } + return false; + } + fflush($this->_handle); + $this->_sent .= $message; + return true; + } + + /** + * Reads data from the socket. The error suppresion + * is a workaround for PHP4 always throwing a warning + * with a secure socket. + * @return integer/boolean Incoming bytes. False + * on error. + * @access public + */ + function read() { + if ($this->isError() || ! $this->isOpen()) { + return false; + } + $raw = @fread($this->_handle, $this->_block_size); + if ($raw === false) { + $this->_setError('Cannot read from socket'); + $this->close(); + } + return $raw; + } + + /** + * Accessor for socket open state. + * @return boolean True if open. + * @access public + */ + function isOpen() { + return $this->_is_open; + } + + /** + * Closes the socket preventing further reads. + * Cannot be reopened once closed. + * @return boolean True if successful. + * @access public + */ + function close() { + $this->_is_open = false; + return fclose($this->_handle); + } + + /** + * Accessor for content so far. + * @return string Bytes sent only. + * @access public + */ + function getSent() { + return $this->_sent; + } + + /** + * Actually opens the low level socket. + * @param string $host Host to connect to. + * @param integer $port Port on host. + * @param integer $error_number Recipient of error code. + * @param string $error Recipoent of error message. + * @param integer $timeout Maximum time to wait for connection. + * @access protected + */ + function _openSocket($host, $port, &$error_number, &$error, $timeout) { + return @fsockopen($host, $port, $error_number, $error, $timeout); + } +} + +/** + * Wrapper for TCP/IP socket over TLS. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleSecureSocket extends SimpleSocket { + + /** + * Opens a secure socket for reading and writing. + * @param string $host Hostname to send request to. + * @param integer $port Port on remote machine to open. + * @param integer $timeout Connection timeout in seconds. + * @access public + */ + function SimpleSecureSocket($host, $port, $timeout) { + $this->SimpleSocket($host, $port, $timeout); + } + + /** + * Actually opens the low level socket. + * @param string $host Host to connect to. + * @param integer $port Port on host. + * @param integer $error_number Recipient of error code. + * @param string $error Recipient of error message. + * @param integer $timeout Maximum time to wait for connection. + * @access protected + */ + function _openSocket($host, $port, &$error_number, &$error, $timeout) { + return parent::_openSocket("tls://$host", $port, $error_number, $error, $timeout); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/tag.php b/tests/simpletest/tag.php new file mode 100644 index 000000000..7bccae205 --- /dev/null +++ b/tests/simpletest/tag.php @@ -0,0 +1,1418 @@ +_name = strtolower(trim($name)); + $this->_attributes = $attributes; + $this->_content = ''; + } + + /** + * Check to see if the tag can have both start and + * end tags with content in between. + * @return boolean True if content allowed. + * @access public + */ + function expectEndTag() { + return true; + } + + /** + * The current tag should not swallow all content for + * itself as it's searchable page content. Private + * content tags are usually widgets that contain default + * values. + * @return boolean False as content is available + * to other tags by default. + * @access public + */ + function isPrivateContent() { + return false; + } + + /** + * Appends string content to the current content. + * @param string $content Additional text. + * @access public + */ + function addContent($content) { + $this->_content .= (string)$content; + } + + /** + * Adds an enclosed tag to the content. + * @param SimpleTag $tag New tag. + * @access public + */ + function addTag(&$tag) { + } + + /** + * Accessor for tag name. + * @return string Name of tag. + * @access public + */ + function getTagName() { + return $this->_name; + } + + /** + * List of legal child elements. + * @return array List of element names. + * @access public + */ + function getChildElements() { + return array(); + } + + /** + * Accessor for an attribute. + * @param string $label Attribute name. + * @return string Attribute value. + * @access public + */ + function getAttribute($label) { + $label = strtolower($label); + if (! isset($this->_attributes[$label])) { + return false; + } + return (string)$this->_attributes[$label]; + } + + /** + * Sets an attribute. + * @param string $label Attribute name. + * @return string $value New attribute value. + * @access protected + */ + function _setAttribute($label, $value) { + $this->_attributes[strtolower($label)] = $value; + } + + /** + * Accessor for the whole content so far. + * @return string Content as big raw string. + * @access public + */ + function getContent() { + return $this->_content; + } + + /** + * Accessor for content reduced to visible text. Acts + * like a text mode browser, normalising space and + * reducing images to their alt text. + * @return string Content as plain text. + * @access public + */ + function getText() { + return SimpleHtmlSaxParser::normalise($this->_content); + } + + /** + * Test to see if id attribute matches. + * @param string $id ID to test against. + * @return boolean True on match. + * @access public + */ + function isId($id) { + return ($this->getAttribute('id') == $id); + } +} + +/** + * Base url. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleBaseTag extends SimpleTag { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleBaseTag($attributes) { + $this->SimpleTag('base', $attributes); + } + + /** + * Base tag is not a block tag. + * @return boolean false + * @access public + */ + function expectEndTag() { + return false; + } +} + +/** + * Page title. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleTitleTag extends SimpleTag { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleTitleTag($attributes) { + $this->SimpleTag('title', $attributes); + } +} + +/** + * Link. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleAnchorTag extends SimpleTag { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleAnchorTag($attributes) { + $this->SimpleTag('a', $attributes); + } + + /** + * Accessor for URL as string. + * @return string Coerced as string. + * @access public + */ + function getHref() { + $url = $this->getAttribute('href'); + if (is_bool($url)) { + $url = ''; + } + return $url; + } +} + +/** + * Form element. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleWidget extends SimpleTag { + var $_value; + var $_label; + var $_is_set; + + /** + * Starts with a named tag with attributes only. + * @param string $name Tag name. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleWidget($name, $attributes) { + $this->SimpleTag($name, $attributes); + $this->_value = false; + $this->_label = false; + $this->_is_set = false; + } + + /** + * Accessor for name submitted as the key in + * GET/POST variables hash. + * @return string Parsed value. + * @access public + */ + function getName() { + return $this->getAttribute('name'); + } + + /** + * Accessor for default value parsed with the tag. + * @return string Parsed value. + * @access public + */ + function getDefault() { + return $this->getAttribute('value'); + } + + /** + * Accessor for currently set value or default if + * none. + * @return string Value set by form or default + * if none. + * @access public + */ + function getValue() { + if (! $this->_is_set) { + return $this->getDefault(); + } + return $this->_value; + } + + /** + * Sets the current form element value. + * @param string $value New value. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + $this->_value = $value; + $this->_is_set = true; + return true; + } + + /** + * Resets the form element value back to the + * default. + * @access public + */ + function resetValue() { + $this->_is_set = false; + } + + /** + * Allows setting of a label externally, say by a + * label tag. + * @param string $label Label to attach. + * @access public + */ + function setLabel($label) { + $this->_label = trim($label); + } + + /** + * Reads external or internal label. + * @param string $label Label to test. + * @return boolean True is match. + * @access public + */ + function isLabel($label) { + return $this->_label == trim($label); + } + + /** + * Dispatches the value into the form encoded packet. + * @param SimpleEncoding $encoding Form packet. + * @access public + */ + function write(&$encoding) { + if ($this->getName()) { + $encoding->add($this->getName(), $this->getValue()); + } + } +} + +/** + * Text, password and hidden field. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleTextTag extends SimpleWidget { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleTextTag($attributes) { + $this->SimpleWidget('input', $attributes); + if ($this->getAttribute('value') === false) { + $this->_setAttribute('value', ''); + } + } + + /** + * Tag contains no content. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } + + /** + * Sets the current form element value. Cannot + * change the value of a hidden field. + * @param string $value New value. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + if ($this->getAttribute('type') == 'hidden') { + return false; + } + return parent::setValue($value); + } +} + +/** + * Submit button as input tag. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleSubmitTag extends SimpleWidget { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleSubmitTag($attributes) { + $this->SimpleWidget('input', $attributes); + if ($this->getAttribute('value') === false) { + $this->_setAttribute('value', 'Submit'); + } + } + + /** + * Tag contains no end element. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } + + /** + * Disables the setting of the button value. + * @param string $value Ignored. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + return false; + } + + /** + * Value of browser visible text. + * @return string Visible label. + * @access public + */ + function getLabel() { + return $this->getValue(); + } + + /** + * Test for a label match when searching. + * @param string $label Label to test. + * @return boolean True on match. + * @access public + */ + function isLabel($label) { + return trim($label) == trim($this->getLabel()); + } +} + +/** + * Image button as input tag. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleImageSubmitTag extends SimpleWidget { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleImageSubmitTag($attributes) { + $this->SimpleWidget('input', $attributes); + } + + /** + * Tag contains no end element. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } + + /** + * Disables the setting of the button value. + * @param string $value Ignored. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + return false; + } + + /** + * Value of browser visible text. + * @return string Visible label. + * @access public + */ + function getLabel() { + if ($this->getAttribute('title')) { + return $this->getAttribute('title'); + } + return $this->getAttribute('alt'); + } + + /** + * Test for a label match when searching. + * @param string $label Label to test. + * @return boolean True on match. + * @access public + */ + function isLabel($label) { + return trim($label) == trim($this->getLabel()); + } + + /** + * Dispatches the value into the form encoded packet. + * @param SimpleEncoding $encoding Form packet. + * @param integer $x X coordinate of click. + * @param integer $y Y coordinate of click. + * @access public + */ + function write(&$encoding, $x, $y) { + if ($this->getName()) { + $encoding->add($this->getName() . '.x', $x); + $encoding->add($this->getName() . '.y', $y); + } else { + $encoding->add('x', $x); + $encoding->add('y', $y); + } + } +} + +/** + * Submit button as button tag. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleButtonTag extends SimpleWidget { + + /** + * Starts with a named tag with attributes only. + * Defaults are very browser dependent. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleButtonTag($attributes) { + $this->SimpleWidget('button', $attributes); + } + + /** + * Check to see if the tag can have both start and + * end tags with content in between. + * @return boolean True if content allowed. + * @access public + */ + function expectEndTag() { + return true; + } + + /** + * Disables the setting of the button value. + * @param string $value Ignored. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + return false; + } + + /** + * Value of browser visible text. + * @return string Visible label. + * @access public + */ + function getLabel() { + return $this->getContent(); + } + + /** + * Test for a label match when searching. + * @param string $label Label to test. + * @return boolean True on match. + * @access public + */ + function isLabel($label) { + return trim($label) == trim($this->getLabel()); + } +} + +/** + * Content tag for text area. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleTextAreaTag extends SimpleWidget { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleTextAreaTag($attributes) { + $this->SimpleWidget('textarea', $attributes); + } + + /** + * Accessor for starting value. + * @return string Parsed value. + * @access public + */ + function getDefault() { + return $this->_wrap(SimpleHtmlSaxParser::decodeHtml($this->getContent())); + } + + /** + * Applies word wrapping if needed. + * @param string $value New value. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + return parent::setValue($this->_wrap($value)); + } + + /** + * Test to see if text should be wrapped. + * @return boolean True if wrapping on. + * @access private + */ + function _wrapIsEnabled() { + if ($this->getAttribute('cols')) { + $wrap = $this->getAttribute('wrap'); + if (($wrap == 'physical') || ($wrap == 'hard')) { + return true; + } + } + return false; + } + + /** + * Performs the formatting that is peculiar to + * this tag. There is strange behaviour in this + * one, including stripping a leading new line. + * Go figure. I am using Firefox as a guide. + * @param string $text Text to wrap. + * @return string Text wrapped with carriage + * returns and line feeds + * @access private + */ + function _wrap($text) { + $text = str_replace("\r\r\n", "\r\n", str_replace("\n", "\r\n", $text)); + $text = str_replace("\r\n\n", "\r\n", str_replace("\r", "\r\n", $text)); + if (strncmp($text, "\r\n", strlen("\r\n")) == 0) { + $text = substr($text, strlen("\r\n")); + } + if ($this->_wrapIsEnabled()) { + return wordwrap( + $text, + (integer)$this->getAttribute('cols'), + "\r\n"); + } + return $text; + } + + /** + * The content of textarea is not part of the page. + * @return boolean True. + * @access public + */ + function isPrivateContent() { + return true; + } +} + +/** + * File upload widget. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleUploadTag extends SimpleWidget { + + /** + * Starts with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleUploadTag($attributes) { + $this->SimpleWidget('input', $attributes); + } + + /** + * Tag contains no content. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } + + /** + * Dispatches the value into the form encoded packet. + * @param SimpleEncoding $encoding Form packet. + * @access public + */ + function write(&$encoding) { + if (! file_exists($this->getValue())) { + return; + } + $encoding->attach( + $this->getName(), + implode('', file($this->getValue())), + basename($this->getValue())); + } +} + +/** + * Drop down widget. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleSelectionTag extends SimpleWidget { + var $_options; + var $_choice; + + /** + * Starts with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleSelectionTag($attributes) { + $this->SimpleWidget('select', $attributes); + $this->_options = array(); + $this->_choice = false; + } + + /** + * Adds an option tag to a selection field. + * @param SimpleOptionTag $tag New option. + * @access public + */ + function addTag(&$tag) { + if ($tag->getTagName() == 'option') { + $this->_options[] = &$tag; + } + } + + /** + * Text within the selection element is ignored. + * @param string $content Ignored. + * @access public + */ + function addContent($content) { + } + + /** + * Scans options for defaults. If none, then + * the first option is selected. + * @return string Selected field. + * @access public + */ + function getDefault() { + for ($i = 0, $count = count($this->_options); $i < $count; $i++) { + if ($this->_options[$i]->getAttribute('selected') !== false) { + return $this->_options[$i]->getDefault(); + } + } + if ($count > 0) { + return $this->_options[0]->getDefault(); + } + return ''; + } + + /** + * Can only set allowed values. + * @param string $value New choice. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + for ($i = 0, $count = count($this->_options); $i < $count; $i++) { + if ($this->_options[$i]->isValue($value)) { + $this->_choice = $i; + return true; + } + } + return false; + } + + /** + * Accessor for current selection value. + * @return string Value attribute or + * content of opton. + * @access public + */ + function getValue() { + if ($this->_choice === false) { + return $this->getDefault(); + } + return $this->_options[$this->_choice]->getValue(); + } +} + +/** + * Drop down widget. + * @package SimpleTest + * @subpackage WebTester + */ +class MultipleSelectionTag extends SimpleWidget { + var $_options; + var $_values; + + /** + * Starts with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function MultipleSelectionTag($attributes) { + $this->SimpleWidget('select', $attributes); + $this->_options = array(); + $this->_values = false; + } + + /** + * Adds an option tag to a selection field. + * @param SimpleOptionTag $tag New option. + * @access public + */ + function addTag(&$tag) { + if ($tag->getTagName() == 'option') { + $this->_options[] = &$tag; + } + } + + /** + * Text within the selection element is ignored. + * @param string $content Ignored. + * @access public + */ + function addContent($content) { + } + + /** + * Scans options for defaults to populate the + * value array(). + * @return array Selected fields. + * @access public + */ + function getDefault() { + $default = array(); + for ($i = 0, $count = count($this->_options); $i < $count; $i++) { + if ($this->_options[$i]->getAttribute('selected') !== false) { + $default[] = $this->_options[$i]->getDefault(); + } + } + return $default; + } + + /** + * Can only set allowed values. Any illegal value + * will result in a failure, but all correct values + * will be set. + * @param array $desired New choices. + * @return boolean True if all allowed. + * @access public + */ + function setValue($desired) { + $achieved = array(); + foreach ($desired as $value) { + $success = false; + for ($i = 0, $count = count($this->_options); $i < $count; $i++) { + if ($this->_options[$i]->isValue($value)) { + $achieved[] = $this->_options[$i]->getValue(); + $success = true; + break; + } + } + if (! $success) { + return false; + } + } + $this->_values = $achieved; + return true; + } + + /** + * Accessor for current selection value. + * @return array List of currently set options. + * @access public + */ + function getValue() { + if ($this->_values === false) { + return $this->getDefault(); + } + return $this->_values; + } +} + +/** + * Option for selection field. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleOptionTag extends SimpleWidget { + + /** + * Stashes the attributes. + */ + function SimpleOptionTag($attributes) { + $this->SimpleWidget('option', $attributes); + } + + /** + * Does nothing. + * @param string $value Ignored. + * @return boolean Not allowed. + * @access public + */ + function setValue($value) { + return false; + } + + /** + * Test to see if a value matches the option. + * @param string $compare Value to compare with. + * @return boolean True if possible match. + * @access public + */ + function isValue($compare) { + $compare = trim($compare); + if (trim($this->getValue()) == $compare) { + return true; + } + return trim($this->getContent()) == $compare; + } + + /** + * Accessor for starting value. Will be set to + * the option label if no value exists. + * @return string Parsed value. + * @access public + */ + function getDefault() { + if ($this->getAttribute('value') === false) { + return $this->getContent(); + } + return $this->getAttribute('value'); + } + + /** + * The content of options is not part of the page. + * @return boolean True. + * @access public + */ + function isPrivateContent() { + return true; + } +} + +/** + * Radio button. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleRadioButtonTag extends SimpleWidget { + + /** + * Stashes the attributes. + * @param array $attributes Hash of attributes. + */ + function SimpleRadioButtonTag($attributes) { + $this->SimpleWidget('input', $attributes); + if ($this->getAttribute('value') === false) { + $this->_setAttribute('value', 'on'); + } + } + + /** + * Tag contains no content. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } + + /** + * The only allowed value sn the one in the + * "value" attribute. + * @param string $value New value. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + if ($value === false) { + return parent::setValue($value); + } + if ($value != $this->getAttribute('value')) { + return false; + } + return parent::setValue($value); + } + + /** + * Accessor for starting value. + * @return string Parsed value. + * @access public + */ + function getDefault() { + if ($this->getAttribute('checked') !== false) { + return $this->getAttribute('value'); + } + return false; + } +} + +/** + * Checkbox widget. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleCheckboxTag extends SimpleWidget { + + /** + * Starts with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleCheckboxTag($attributes) { + $this->SimpleWidget('input', $attributes); + if ($this->getAttribute('value') === false) { + $this->_setAttribute('value', 'on'); + } + } + + /** + * Tag contains no content. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } + + /** + * The only allowed value in the one in the + * "value" attribute. The default for this + * attribute is "on". If this widget is set to + * true, then the usual value will be taken. + * @param string $value New value. + * @return boolean True if allowed. + * @access public + */ + function setValue($value) { + if ($value === false) { + return parent::setValue($value); + } + if ($value === true) { + return parent::setValue($this->getAttribute('value')); + } + if ($value != $this->getAttribute('value')) { + return false; + } + return parent::setValue($value); + } + + /** + * Accessor for starting value. The default + * value is "on". + * @return string Parsed value. + * @access public + */ + function getDefault() { + if ($this->getAttribute('checked') !== false) { + return $this->getAttribute('value'); + } + return false; + } +} + +/** + * A group of multiple widgets with some shared behaviour. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleTagGroup { + var $_widgets = array(); + + /** + * Adds a tag to the group. + * @param SimpleWidget $widget + * @access public + */ + function addWidget(&$widget) { + $this->_widgets[] = &$widget; + } + + /** + * Accessor to widget set. + * @return array All widgets. + * @access protected + */ + function &_getWidgets() { + return $this->_widgets; + } + + /** + * Accessor for an attribute. + * @param string $label Attribute name. + * @return boolean Always false. + * @access public + */ + function getAttribute($label) { + return false; + } + + /** + * Fetches the name for the widget from the first + * member. + * @return string Name of widget. + * @access public + */ + function getName() { + if (count($this->_widgets) > 0) { + return $this->_widgets[0]->getName(); + } + } + + /** + * Scans the widgets for one with the appropriate + * ID field. + * @param string $id ID value to try. + * @return boolean True if matched. + * @access public + */ + function isId($id) { + for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) { + if ($this->_widgets[$i]->isId($id)) { + return true; + } + } + return false; + } + + /** + * Scans the widgets for one with the appropriate + * attached label. + * @param string $label Attached label to try. + * @return boolean True if matched. + * @access public + */ + function isLabel($label) { + for ($i = 0, $count = count($this->_widgets); $i < $count; $i++) { + if ($this->_widgets[$i]->isLabel($label)) { + return true; + } + } + return false; + } + + /** + * Dispatches the value into the form encoded packet. + * @param SimpleEncoding $encoding Form packet. + * @access public + */ + function write(&$encoding) { + $encoding->add($this->getName(), $this->getValue()); + } +} + +/** + * A group of tags with the same name within a form. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleCheckboxGroup extends SimpleTagGroup { + + /** + * Accessor for current selected widget or false + * if none. + * @return string/array Widget values or false if none. + * @access public + */ + function getValue() { + $values = array(); + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + if ($widgets[$i]->getValue() !== false) { + $values[] = $widgets[$i]->getValue(); + } + } + return $this->_coerceValues($values); + } + + /** + * Accessor for starting value that is active. + * @return string/array Widget values or false if none. + * @access public + */ + function getDefault() { + $values = array(); + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + if ($widgets[$i]->getDefault() !== false) { + $values[] = $widgets[$i]->getDefault(); + } + } + return $this->_coerceValues($values); + } + + /** + * Accessor for current set values. + * @param string/array/boolean $values Either a single string, a + * hash or false for nothing set. + * @return boolean True if all values can be set. + * @access public + */ + function setValue($values) { + $values = $this->_makeArray($values); + if (! $this->_valuesArePossible($values)) { + return false; + } + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + $possible = $widgets[$i]->getAttribute('value'); + if (in_array($widgets[$i]->getAttribute('value'), $values)) { + $widgets[$i]->setValue($possible); + } else { + $widgets[$i]->setValue(false); + } + } + return true; + } + + /** + * Tests to see if a possible value set is legal. + * @param string/array/boolean $values Either a single string, a + * hash or false for nothing set. + * @return boolean False if trying to set a + * missing value. + * @access private + */ + function _valuesArePossible($values) { + $matches = array(); + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + $possible = $widgets[$i]->getAttribute('value'); + if (in_array($possible, $values)) { + $matches[] = $possible; + } + } + return ($values == $matches); + } + + /** + * Converts the output to an appropriate format. This means + * that no values is false, a single value is just that + * value and only two or more are contained in an array. + * @param array $values List of values of widgets. + * @return string/array/boolean Expected format for a tag. + * @access private + */ + function _coerceValues($values) { + if (count($values) == 0) { + return false; + } elseif (count($values) == 1) { + return $values[0]; + } else { + return $values; + } + } + + /** + * Converts false or string into array. The opposite of + * the coercian method. + * @param string/array/boolean $value A single item is converted + * to a one item list. False + * gives an empty list. + * @return array List of values, possibly empty. + * @access private + */ + function _makeArray($value) { + if ($value === false) { + return array(); + } + if (is_string($value)) { + return array($value); + } + return $value; + } +} + +/** + * A group of tags with the same name within a form. + * Used for radio buttons. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleRadioGroup extends SimpleTagGroup { + + /** + * Each tag is tried in turn until one is + * successfully set. The others will be + * unchecked if successful. + * @param string $value New value. + * @return boolean True if any allowed. + * @access public + */ + function setValue($value) { + if (! $this->_valueIsPossible($value)) { + return false; + } + $index = false; + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + if (! $widgets[$i]->setValue($value)) { + $widgets[$i]->setValue(false); + } + } + return true; + } + + /** + * Tests to see if a value is allowed. + * @param string Attempted value. + * @return boolean True if a valid value. + * @access private + */ + function _valueIsPossible($value) { + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + if ($widgets[$i]->getAttribute('value') == $value) { + return true; + } + } + return false; + } + + /** + * Accessor for current selected widget or false + * if none. + * @return string/boolean Value attribute or + * content of opton. + * @access public + */ + function getValue() { + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + if ($widgets[$i]->getValue() !== false) { + return $widgets[$i]->getValue(); + } + } + return false; + } + + /** + * Accessor for starting value that is active. + * @return string/boolean Value of first checked + * widget or false if none. + * @access public + */ + function getDefault() { + $widgets = &$this->_getWidgets(); + for ($i = 0, $count = count($widgets); $i < $count; $i++) { + if ($widgets[$i]->getDefault() !== false) { + return $widgets[$i]->getDefault(); + } + } + return false; + } +} + +/** + * Tag to keep track of labels. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleLabelTag extends SimpleTag { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleLabelTag($attributes) { + $this->SimpleTag('label', $attributes); + } + + /** + * Access for the ID to attach the label to. + * @return string For attribute. + * @access public + */ + function getFor() { + return $this->getAttribute('for'); + } +} + +/** + * Tag to aid parsing the form. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleFormTag extends SimpleTag { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleFormTag($attributes) { + $this->SimpleTag('form', $attributes); + } +} + +/** + * Tag to aid parsing the frames in a page. + * @package SimpleTest + * @subpackage WebTester + */ +class SimpleFrameTag extends SimpleTag { + + /** + * Starts with a named tag with attributes only. + * @param hash $attributes Attribute names and + * string values. + */ + function SimpleFrameTag($attributes) { + $this->SimpleTag('frame', $attributes); + } + + /** + * Tag contains no content. + * @return boolean False. + * @access public + */ + function expectEndTag() { + return false; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/acceptance_test.php b/tests/simpletest/test/acceptance_test.php new file mode 100644 index 000000000..9dbb5a35a --- /dev/null +++ b/tests/simpletest/test/acceptance_test.php @@ -0,0 +1,1633 @@ +addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $this->assertTrue($browser->get($this->samples() . 'network_confirm.php')); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + $this->assertPattern('/Request method.*?
      GET<\/dd>/', $browser->getContent()); + $this->assertEqual($browser->getTitle(), 'Simple test target file'); + $this->assertEqual($browser->getResponseCode(), 200); + $this->assertEqual($browser->getMimeType(), 'text/html'); + } + + function testPost() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $this->assertTrue($browser->post($this->samples() . 'network_confirm.php')); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + $this->assertPattern('/Request method.*?
      POST<\/dd>/', $browser->getContent()); + } + + function testAbsoluteLinkFollowing() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($browser->clickLink('Absolute')); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + } + + function testRelativeEncodedeLinkFollowing() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($browser->clickLink("mrcl kiek'eboe")); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + } + + function testRelativeLinkFollowing() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($browser->clickLink('Relative')); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + } + + function testUnifiedClickLinkClicking() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($browser->click('Relative')); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + } + + function testIdLinkFollowing() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($browser->clickLinkById(1)); + $this->assertPattern('/target for the SimpleTest/', $browser->getContent()); + } + + function testCookieReading() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'set_cookies.php'); + $this->assertEqual($browser->getCurrentCookieValue('session_cookie'), 'A'); + $this->assertEqual($browser->getCurrentCookieValue('short_cookie'), 'B'); + $this->assertEqual($browser->getCurrentCookieValue('day_cookie'), 'C'); + } + + function testSimpleSubmit() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'form.html'); + $this->assertTrue($browser->clickSubmit('Go!')); + $this->assertPattern('/Request method.*?
      POST<\/dd>/', $browser->getContent()); + $this->assertPattern('/go=\[Go!\]/', $browser->getContent()); + } + + function testUnifiedClickCanSubmit() { + $browser = &new SimpleBrowser(); + $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + $browser->get($this->samples() . 'form.html'); + $this->assertTrue($browser->click('Go!')); + $this->assertPattern('/go=\[Go!\]/', $browser->getContent()); + } +} + +class TestRadioFields extends SimpleTestAcceptanceTest { + function testSetFieldAsInteger() { + $this->get($this->samples() . 'form_with_radio_buttons.html'); + $this->assertTrue($this->setField('tested_field', 2)); + $this->clickSubmitByName('send'); + $this->assertEqual($this->getUrl(), $this->samples() . 'form_with_radio_buttons.html?tested_field=2&send=click+me'); + } + + function testSetFieldAsString() { + $this->get($this->samples() . 'form_with_radio_buttons.html'); + $this->assertTrue($this->setField('tested_field', '2')); + $this->clickSubmitByName('send'); + $this->assertEqual($this->getUrl(), $this->samples() . 'form_with_radio_buttons.html?tested_field=2&send=click+me'); + } +} + +class TestOfLiveFetching extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testFormWithArrayBasedInputs() { + $this->get($this->samples() . 'form_with_array_based_inputs.php'); + $this->setField('value[]', '3', '1'); + $this->setField('value[]', '4', '2'); + $this->clickSubmit('Go'); + $this->assertPattern('/QUERY_STRING : value%5B%5D=3&value%5B%5D=4&submit=Go/'); + } + + function testFormWithQuotedValues() { + $this->get($this->samples() . 'form_with_quoted_values.php'); + $this->assertField('a', 'default'); + $this->assertFieldById('text_field', 'default'); + $this->clickSubmit('Go'); + $this->assertPattern('/a=default&submit=Go/'); + } + + function testGet() { + $this->assertTrue($this->get($this->samples() . 'network_confirm.php')); + $this->assertEqual($this->getUrl(), $this->samples() . 'network_confirm.php'); + $this->assertText('target for the SimpleTest'); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertTitle('Simple test target file'); + $this->assertTitle(new PatternExpectation('/target file/')); + $this->assertResponse(200); + $this->assertMime('text/html'); + $this->assertHeader('connection', 'close'); + $this->assertHeader('connection', new PatternExpectation('/los/')); + } + + function testSlowGet() { + $this->assertTrue($this->get($this->samples() . 'slow_page.php')); + } + + function testTimedOutGet() { + $this->setConnectionTimeout(1); + $this->ignoreErrors(); + $this->assertFalse($this->get($this->samples() . 'slow_page.php')); + } + + function testPost() { + $this->assertTrue($this->post($this->samples() . 'network_confirm.php')); + $this->assertText('target for the SimpleTest'); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + } + + function testGetWithData() { + $this->get($this->samples() . 'network_confirm.php', array("a" => "aaa")); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[aaa]'); + } + + function testPostWithData() { + $this->post($this->samples() . 'network_confirm.php', array("a" => "aaa")); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aaa]'); + } + + function testPostWithRecursiveData() { + $this->post($this->samples() . 'network_confirm.php', array("a" => "aaa")); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aaa]'); + + $this->post($this->samples() . 'network_confirm.php', array("a[aa]" => "aaa")); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aa=[aaa]]'); + + $this->post($this->samples() . 'network_confirm.php', array("a[aa][aaa]" => "aaaa")); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aa=[aaa=[aaaa]]]'); + + $this->post($this->samples() . 'network_confirm.php', array("a" => array("aa" => "aaa"))); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aa=[aaa]]'); + + $this->post($this->samples() . 'network_confirm.php', array("a" => array("aa" => array("aaa" => "aaaa")))); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aa=[aaa=[aaaa]]]'); + } + + function testRelativeGet() { + $this->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($this->get('network_confirm.php')); + $this->assertText('target for the SimpleTest'); + } + + function testRelativePost() { + $this->post($this->samples() . 'link_confirm.php'); + $this->assertTrue($this->post('network_confirm.php')); + $this->assertText('target for the SimpleTest'); + } +} + +class TestOfLinkFollowing extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testLinkAssertions() { + $this->get($this->samples() . 'link_confirm.php'); + $this->assertLink('Absolute', $this->samples() . 'network_confirm.php'); + $this->assertLink('Absolute', new PatternExpectation('/confirm/')); + $this->assertClickable('Absolute'); + } + + function testAbsoluteLinkFollowing() { + $this->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($this->clickLink('Absolute')); + $this->assertText('target for the SimpleTest'); + } + + function testRelativeLinkFollowing() { + $this->get($this->samples() . 'link_confirm.php'); + $this->assertTrue($this->clickLink('Relative')); + $this->assertText('target for the SimpleTest'); + } + + function testLinkIdFollowing() { + $this->get($this->samples() . 'link_confirm.php'); + $this->assertLinkById(1); + $this->assertTrue($this->clickLinkById(1)); + $this->assertText('target for the SimpleTest'); + } + + function testAbsoluteUrlBehavesAbsolutely() { + $this->get($this->samples() . 'link_confirm.php'); + $this->get('http://www.lastcraft.com'); + $this->assertText('No guarantee of quality is given or even intended'); + } + + function testRelativeUrlRespectsBaseTag() { + $this->get($this->samples() . 'base_tag/base_link.html'); + $this->click('Back to test pages'); + $this->assertTitle('Simple test target file'); + } +} + +class TestOfLivePageLinkingWithMinimalLinks extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testClickToExplicitelyNamedSelfReturns() { + $this->get($this->samples() . 'front_controller_style/a_page.php'); + $this->assertEqual($this->getUrl(), $this->samples() . 'front_controller_style/a_page.php'); + $this->assertTitle('Simple test page with links'); + $this->assertLink('Self'); + $this->clickLink('Self'); + $this->assertTitle('Simple test page with links'); + } + + function testClickToMissingPageReturnsToSamePage() { + $this->get($this->samples() . 'front_controller_style/a_page.php'); + $this->clickLink('No page'); + $this->assertTitle('Simple test page with links'); + $this->assertText('[action=no_page]'); + } + + function testClickToBareActionReturnsToSamePage() { + $this->get($this->samples() . 'front_controller_style/a_page.php'); + $this->clickLink('Bare action'); + $this->assertTitle('Simple test page with links'); + $this->assertText('[action=]'); + } + + function testClickToSingleQuestionMarkReturnsToSamePage() { + $this->get($this->samples() . 'front_controller_style/a_page.php'); + $this->clickLink('Empty query'); + $this->assertTitle('Simple test page with links'); + } + + function testClickToEmptyStringReturnsToSamePage() { + $this->get($this->samples() . 'front_controller_style/a_page.php'); + $this->clickLink('Empty link'); + $this->assertTitle('Simple test page with links'); + } + + function testClickToSingleDotGoesToCurrentDirectory() { + $this->get($this->samples() . 'front_controller_style/a_page.php'); + $this->clickLink('Current directory'); + $this->assertTitle( + 'Simple test front controller', + '%s -> index.php needs to be set as a default web server home page'); + } + + function testClickBackADirectoryLevel() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickLink('Down one'); + $this->assertPattern('|Index of .*?/test|i'); + } +} + +class TestOfLiveFrontControllerEmulation extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testJumpToNamedPage() { + $this->get($this->samples() . 'front_controller_style/'); + $this->assertText('Simple test front controller'); + $this->clickLink('Index'); + $this->assertResponse(200); + $this->assertText('[action=index]'); + } + + function testJumpToUnnamedPage() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickLink('No page'); + $this->assertResponse(200); + $this->assertText('Simple test front controller'); + $this->assertText('[action=no_page]'); + } + + function testJumpToUnnamedPageWithBareParameter() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickLink('Bare action'); + $this->assertResponse(200); + $this->assertText('Simple test front controller'); + $this->assertText('[action=]'); + } + + function testJumpToUnnamedPageWithEmptyQuery() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickLink('Empty query'); + $this->assertResponse(200); + $this->assertPattern('/Simple test front controller/'); + $this->assertPattern('/raw get data.*?\[\].*?get data/si'); + } + + function testJumpToUnnamedPageWithEmptyLink() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickLink('Empty link'); + $this->assertResponse(200); + $this->assertPattern('/Simple test front controller/'); + $this->assertPattern('/raw get data.*?\[\].*?get data/si'); + } + + function testJumpBackADirectoryLevel() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickLink('Down one'); + $this->assertPattern('|Index of .*?/test|'); + } + + function testSubmitToNamedPage() { + $this->get($this->samples() . 'front_controller_style/'); + $this->assertText('Simple test front controller'); + $this->clickSubmit('Index'); + $this->assertResponse(200); + $this->assertText('[action=Index]'); + } + + function testSubmitToSameDirectory() { + $this->get($this->samples() . 'front_controller_style/index.php'); + $this->clickSubmit('Same directory'); + $this->assertResponse(200); + $this->assertText('[action=Same+directory]'); + } + + function testSubmitToEmptyAction() { + $this->get($this->samples() . 'front_controller_style/index.php'); + $this->clickSubmit('Empty action'); + $this->assertResponse(200); + $this->assertText('[action=Empty+action]'); + } + + function testSubmitToNoAction() { + $this->get($this->samples() . 'front_controller_style/index.php'); + $this->clickSubmit('No action'); + $this->assertResponse(200); + $this->assertText('[action=No+action]'); + } + + function testSubmitBackADirectoryLevel() { + $this->get($this->samples() . 'front_controller_style/'); + $this->clickSubmit('Down one'); + $this->assertPattern('|Index of .*?/test|'); + } + + function testSubmitToNamedPageWithMixedPostAndGet() { + $this->get($this->samples() . 'front_controller_style/?a=A'); + $this->assertText('Simple test front controller'); + $this->clickSubmit('Index post'); + $this->assertText('action=[Index post]'); + $this->assertNoText('[a=A]'); + } + + function testSubmitToSameDirectoryMixedPostAndGet() { + $this->get($this->samples() . 'front_controller_style/index.php?a=A'); + $this->clickSubmit('Same directory post'); + $this->assertText('action=[Same directory post]'); + $this->assertNoText('[a=A]'); + } + + function testSubmitToEmptyActionMixedPostAndGet() { + $this->get($this->samples() . 'front_controller_style/index.php?a=A'); + $this->clickSubmit('Empty action post'); + $this->assertText('action=[Empty action post]'); + $this->assertText('[a=A]'); + } + + function testSubmitToNoActionMixedPostAndGet() { + $this->get($this->samples() . 'front_controller_style/index.php?a=A'); + $this->clickSubmit('No action post'); + $this->assertText('action=[No action post]'); + $this->assertText('[a=A]'); + } +} + +class TestOfLiveHeaders extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testConfirmingHeaderExistence() { + $this->get('http://www.lastcraft.com/'); + $this->assertHeader('content-type'); + $this->assertHeader('content-type', 'text/html'); + $this->assertHeaderPattern('content-type', '/HTML/i'); + $this->assertNoHeader('WWW-Authenticate'); + } +} + +class TestOfLiveRedirects extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testNoRedirects() { + $this->setMaximumRedirects(0); + $this->get($this->samples() . 'redirect.php'); + $this->assertTitle('Redirection test'); + } + + function testRedirects() { + $this->setMaximumRedirects(1); + $this->get($this->samples() . 'redirect.php'); + $this->assertTitle('Simple test target file'); + } + + function testRedirectLosesGetData() { + $this->get($this->samples() . 'redirect.php', array('a' => 'aaa')); + $this->assertNoText('a=[aaa]'); + } + + function testRedirectKeepsExtraRequestDataOfItsOwn() { + $this->get($this->samples() . 'redirect.php'); + $this->assertText('r=[rrr]'); + } + + function testRedirectLosesPostData() { + $this->post($this->samples() . 'redirect.php', array('a' => 'aaa')); + $this->assertTitle('Simple test target file'); + $this->assertNoText('a=[aaa]'); + } + + function testRedirectWithBaseUrlChange() { + $this->get($this->samples() . 'base_change_redirect.php'); + $this->assertTitle('Simple test target file in folder'); + $this->get($this->samples() . 'path/base_change_redirect.php'); + $this->assertTitle('Simple test target file'); + } + + function testRedirectWithDoubleBaseUrlChange() { + $this->get($this->samples() . 'double_base_change_redirect.php'); + $this->assertTitle('Simple test target file'); + } +} + +class TestOfLiveCookies extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function here() { + return new SimpleUrl($this->samples()); + } + + function thisHost() { + $here = $this->here(); + return $here->getHost(); + } + + function thisPath() { + $here = $this->here(); + return $here->getPath(); + } + + function testCookieSettingAndAssertions() { + $this->setCookie('a', 'Test cookie a'); + $this->setCookie('b', 'Test cookie b', $this->thisHost()); + $this->setCookie('c', 'Test cookie c', $this->thisHost(), $this->thisPath()); + $this->get($this->samples() . 'network_confirm.php'); + $this->assertText('Test cookie a'); + $this->assertText('Test cookie b'); + $this->assertText('Test cookie c'); + $this->assertCookie('a'); + $this->assertCookie('b', 'Test cookie b'); + $this->assertTrue($this->getCookie('c') == 'Test cookie c'); + } + + function testNoCookieSetWhenCookiesDisabled() { + $this->setCookie('a', 'Test cookie a'); + $this->ignoreCookies(); + $this->get($this->samples() . 'network_confirm.php'); + $this->assertNoText('Test cookie a'); + } + + function testCookieReading() { + $this->get($this->samples() . 'set_cookies.php'); + $this->assertCookie('session_cookie', 'A'); + $this->assertCookie('short_cookie', 'B'); + $this->assertCookie('day_cookie', 'C'); + } + + function testNoCookieReadingWhenCookiesDisabled() { + $this->ignoreCookies(); + $this->get($this->samples() . 'set_cookies.php'); + $this->assertNoCookie('session_cookie'); + $this->assertNoCookie('short_cookie'); + $this->assertNoCookie('day_cookie'); + } + + function testCookiePatternAssertions() { + $this->get($this->samples() . 'set_cookies.php'); + $this->assertCookie('session_cookie', new PatternExpectation('/a/i')); + } + + function testTemporaryCookieExpiry() { + $this->get($this->samples() . 'set_cookies.php'); + $this->restart(); + $this->assertNoCookie('session_cookie'); + $this->assertCookie('day_cookie', 'C'); + } + + function testTimedCookieExpiryWith100SecondMargin() { + $this->get($this->samples() . 'set_cookies.php'); + $this->ageCookies(3600); + $this->restart(time() + 100); + $this->assertNoCookie('session_cookie'); + $this->assertNoCookie('hour_cookie'); + $this->assertCookie('day_cookie', 'C'); + } + + function testNoClockOverDriftBy100Seconds() { + $this->get($this->samples() . 'set_cookies.php'); + $this->restart(time() + 200); + $this->assertNoCookie( + 'short_cookie', + '%s -> Please check your computer clock setting if you are not using NTP'); + } + + function testNoClockUnderDriftBy100Seconds() { + $this->get($this->samples() . 'set_cookies.php'); + $this->restart(time() + 0); + $this->assertCookie( + 'short_cookie', + 'B', + '%s -> Please check your computer clock setting if you are not using NTP'); + } + + function testCookiePath() { + $this->get($this->samples() . 'set_cookies.php'); + $this->assertNoCookie('path_cookie', 'D'); + $this->get('./path/show_cookies.php'); + $this->assertPattern('/path_cookie/'); + $this->assertCookie('path_cookie', 'D'); + } +} + +class LiveTestOfForms extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testSimpleSubmit() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('go=[Go!]'); + } + + function testDefaultFormValues() { + $this->get($this->samples() . 'form.html'); + $this->assertFieldByName('a', ''); + $this->assertFieldByName('b', 'Default text'); + $this->assertFieldByName('c', ''); + $this->assertFieldByName('d', 'd1'); + $this->assertFieldByName('e', false); + $this->assertFieldByName('f', 'on'); + $this->assertFieldByName('g', 'g3'); + $this->assertFieldByName('h', 2); + $this->assertFieldByName('go', 'Go!'); + $this->assertClickable('Go!'); + $this->assertSubmit('Go!'); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('go=[Go!]'); + $this->assertText('a=[]'); + $this->assertText('b=[Default text]'); + $this->assertText('c=[]'); + $this->assertText('d=[d1]'); + $this->assertNoText('e=['); + $this->assertText('f=[on]'); + $this->assertText('g=[g3]'); + } + + function testFormSubmissionByButtonLabel() { + $this->get($this->samples() . 'form.html'); + $this->setFieldByName('a', 'aaa'); + $this->setFieldByName('b', 'bbb'); + $this->setFieldByName('c', 'ccc'); + $this->setFieldByName('d', 'D2'); + $this->setFieldByName('e', 'on'); + $this->setFieldByName('f', false); + $this->setFieldByName('g', 'g2'); + $this->setFieldByName('h', 1); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[aaa]'); + $this->assertText('b=[bbb]'); + $this->assertText('c=[ccc]'); + $this->assertText('d=[d2]'); + $this->assertText('e=[on]'); + $this->assertNoText('f=['); + $this->assertText('g=[g2]'); + } + + function testAdditionalFormValues() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickSubmit('Go!', array('add' => 'A'))); + $this->assertText('go=[Go!]'); + $this->assertText('add=[A]'); + } + + function testFormSubmissionByName() { + $this->get($this->samples() . 'form.html'); + $this->setFieldByName('a', 'A'); + $this->assertTrue($this->clickSubmitByName('go')); + $this->assertText('a=[A]'); + } + + function testFormSubmissionByNameAndAdditionalParameters() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickSubmitByName('go', array('add' => 'A'))); + $this->assertText('go=[Go!]'); + $this->assertText('add=[A]'); + } + + function testFormSubmissionBySubmitButtonLabeledSubmit() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickSubmitByName('test')); + $this->assertText('test=[Submit]'); + } + + function testFormSubmissionWithIds() { + $this->get($this->samples() . 'form.html'); + $this->assertFieldById(1, ''); + $this->assertFieldById(2, 'Default text'); + $this->assertFieldById(3, ''); + $this->assertFieldById(4, 'd1'); + $this->assertFieldById(5, false); + $this->assertFieldById(6, 'on'); + $this->assertFieldById(8, 'g3'); + $this->assertFieldById(11, 2); + $this->setFieldById(1, 'aaa'); + $this->setFieldById(2, 'bbb'); + $this->setFieldById(3, 'ccc'); + $this->setFieldById(4, 'D2'); + $this->setFieldById(5, 'on'); + $this->setFieldById(6, false); + $this->setFieldById(8, 'g2'); + $this->setFieldById(11, 'H1'); + $this->assertTrue($this->clickSubmitById(99)); + $this->assertText('a=[aaa]'); + $this->assertText('b=[bbb]'); + $this->assertText('c=[ccc]'); + $this->assertText('d=[d2]'); + $this->assertText('e=[on]'); + $this->assertNoText('f=['); + $this->assertText('g=[g2]'); + $this->assertText('h=[1]'); + $this->assertText('go=[Go!]'); + } + + function testFormSubmissionWithLabels() { + $this->get($this->samples() . 'form.html'); + $this->assertField('Text A', ''); + $this->assertField('Text B', 'Default text'); + $this->assertField('Text area C', ''); + $this->assertField('Selection D', 'd1'); + $this->assertField('Checkbox E', false); + $this->assertField('Checkbox F', 'on'); + $this->assertField('3', 'g3'); + $this->assertField('Selection H', 2); + $this->setField('Text A', 'aaa'); + $this->setField('Text B', 'bbb'); + $this->setField('Text area C', 'ccc'); + $this->setField('Selection D', 'D2'); + $this->setField('Checkbox E', 'on'); + $this->setField('Checkbox F', false); + $this->setField('2', 'g2'); + $this->setField('Selection H', 'H1'); + $this->clickSubmit('Go!'); + $this->assertText('a=[aaa]'); + $this->assertText('b=[bbb]'); + $this->assertText('c=[ccc]'); + $this->assertText('d=[d2]'); + $this->assertText('e=[on]'); + $this->assertNoText('f=['); + $this->assertText('g=[g2]'); + $this->assertText('h=[1]'); + $this->assertText('go=[Go!]'); + } + + function testSettingCheckboxWithBooleanTrueSetsUnderlyingValue() { + $this->get($this->samples() . 'form.html'); + $this->setField('Checkbox E', true); + $this->assertField('Checkbox E', 'on'); + $this->clickSubmit('Go!'); + $this->assertText('e=[on]'); + } + + function testFormSubmissionWithMixedPostAndGet() { + $this->get($this->samples() . 'form_with_mixed_post_and_get.html'); + $this->setField('Text A', 'Hello'); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[Hello]'); + $this->assertText('x=[X]'); + $this->assertText('y=[Y]'); + } + + function testFormSubmissionWithMixedPostAndEncodedGet() { + $this->get($this->samples() . 'form_with_mixed_post_and_get.html'); + $this->setField('Text B', 'Hello'); + $this->assertTrue($this->clickSubmit('Go encoded!')); + $this->assertText('b=[Hello]'); + $this->assertText('x=[X]'); + $this->assertText('y=[Y]'); + } + + function testFormSubmissionWithoutAction() { + $this->get($this->samples() . 'form_without_action.php?test=test'); + $this->assertText('_GET : [test]'); + $this->assertTrue($this->clickSubmit('Submit Post With Empty Action')); + $this->assertText('_GET : [test]'); + $this->assertText('_POST : [test]'); + } + + function testImageSubmissionByLabel() { + $this->get($this->samples() . 'form.html'); + $this->assertImage('Image go!'); + $this->assertTrue($this->clickImage('Image go!', 10, 12)); + $this->assertText('go_x=[10]'); + $this->assertText('go_y=[12]'); + } + + function testImageSubmissionByLabelWithAdditionalParameters() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickImage('Image go!', 10, 12, array('add' => 'A'))); + $this->assertText('add=[A]'); + } + + function testImageSubmissionByName() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickImageByName('go', 10, 12)); + $this->assertText('go_x=[10]'); + $this->assertText('go_y=[12]'); + } + + function testImageSubmissionById() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickImageById(97, 10, 12)); + $this->assertText('go_x=[10]'); + $this->assertText('go_y=[12]'); + } + + function testButtonSubmissionByLabel() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->clickSubmit('Button go!', 10, 12)); + $this->assertPattern('/go=\[ButtonGo\]/s'); + } + + function testNamelessSubmitSendsNoValue() { + $this->get($this->samples() . 'form_with_unnamed_submit.html'); + $this->click('Go!'); + $this->assertNoText('Go!'); + $this->assertNoText('submit'); + } + + function testNamelessImageSendsXAndYValues() { + $this->get($this->samples() . 'form_with_unnamed_submit.html'); + $this->clickImage('Image go!', 4, 5); + $this->assertNoText('ImageGo'); + $this->assertText('x=[4]'); + $this->assertText('y=[5]'); + } + + function testNamelessButtonSendsNoValue() { + $this->get($this->samples() . 'form_with_unnamed_submit.html'); + $this->click('Button Go!'); + $this->assertNoText('ButtonGo'); + } + + function testSelfSubmit() { + $this->get($this->samples() . 'self_form.php'); + $this->assertNoText('[Submitted]'); + $this->assertNoText('[Wrong form]'); + $this->assertTrue($this->clickSubmit()); + $this->assertText('[Submitted]'); + $this->assertNoText('[Wrong form]'); + $this->assertTitle('Test of form self submission'); + } + + function testSelfSubmitWithParameters() { + $this->get($this->samples() . 'self_form.php'); + $this->setFieldByName('visible', 'Resent'); + $this->assertTrue($this->clickSubmit()); + $this->assertText('[Resent]'); + } + + function testSettingOfBlankOption() { + $this->get($this->samples() . 'form.html'); + $this->assertTrue($this->setFieldByName('d', '')); + $this->clickSubmit('Go!'); + $this->assertText('d=[]'); + } + + function testAssertingFieldValueWithPattern() { + $this->get($this->samples() . 'form.html'); + $this->setField('c', 'A very long string'); + $this->assertField('c', new PatternExpectation('/very long/')); + } + + function testSendingMultipartFormDataEncodedForm() { + $this->get($this->samples() . 'form_data_encoded_form.html'); + $this->assertField('Text A', ''); + $this->assertField('Text B', 'Default text'); + $this->assertField('Text area C', ''); + $this->assertField('Selection D', 'd1'); + $this->assertField('Checkbox E', false); + $this->assertField('Checkbox F', 'on'); + $this->assertField('3', 'g3'); + $this->assertField('Selection H', 2); + $this->setField('Text A', 'aaa'); + $this->setField('Text B', 'bbb'); + $this->setField('Text area C', 'ccc'); + $this->setField('Selection D', 'D2'); + $this->setField('Checkbox E', 'on'); + $this->setField('Checkbox F', false); + $this->setField('2', 'g2'); + $this->setField('Selection H', 'H1'); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[aaa]'); + $this->assertText('b=[bbb]'); + $this->assertText('c=[ccc]'); + $this->assertText('d=[d2]'); + $this->assertText('e=[on]'); + $this->assertNoText('f=['); + $this->assertText('g=[g2]'); + $this->assertText('h=[1]'); + $this->assertText('go=[Go!]'); + } + + function testSettingVariousBlanksInFields() { + $this->get($this->samples() . 'form_with_false_defaults.html'); + $this->assertField('Text A', ''); + $this->setField('Text A', '0'); + $this->assertField('Text A', '0'); + $this->assertField('Text area B', ''); + $this->setField('Text area B', '0'); + $this->assertField('Text area B', '0'); + $this->assertField('Text area C', " "); + $this->assertField('Selection D', ''); + $this->setField('Selection D', 'D2'); + $this->assertField('Selection D', 'D2'); + $this->setField('Selection D', 'D3'); + $this->assertField('Selection D', '0'); + $this->setField('Selection D', 'D4'); + $this->assertField('Selection D', '?'); + $this->assertField('Checkbox E', ''); + $this->assertField('Checkbox F', 'on'); + $this->assertField('Checkbox G', '0'); + $this->assertField('Checkbox H', '?'); + $this->assertFieldByName('i', 'on'); + $this->setFieldByName('i', ''); + $this->assertFieldByName('i', ''); + $this->setFieldByName('i', '0'); + $this->assertFieldByName('i', '0'); + $this->setFieldByName('i', '?'); + $this->assertFieldByName('i', '?'); + } + + function testSubmissionOfBlankFields() { + $this->get($this->samples() . 'form_with_false_defaults.html'); + $this->setField('Text A', ''); + $this->setField('Text area B', ''); + $this->setFieldByName('i', ''); + $this->click('Go!'); + $this->assertText('a=[]'); + $this->assertText('b=[]'); + $this->assertPattern('/c=\[ \]/'); + $this->assertText('d=[]'); + $this->assertText('e=[]'); + $this->assertText('i=[]'); + } + + function testSubmissionOfEmptyValues() { + $this->get($this->samples() . 'form_with_false_defaults.html'); + $this->setField('Selection D', 'D2'); + $this->click('Go!'); + $this->assertText('a=[]'); + $this->assertText('b=[]'); + $this->assertText('d=[D2]'); + $this->assertText('f=[on]'); + $this->assertText('i=[on]'); + } + + function testSubmissionOfZeroes() { + $this->get($this->samples() . 'form_with_false_defaults.html'); + $this->setField('Text A', '0'); + $this->setField('Text area B', '0'); + $this->setField('Selection D', 'D3'); + $this->setFieldByName('i', '0'); + $this->click('Go!'); + $this->assertText('a=[0]'); + $this->assertText('b=[0]'); + $this->assertText('d=[0]'); + $this->assertText('g=[0]'); + $this->assertText('i=[0]'); + } + + function testSubmissionOfQuestionMarks() { + $this->get($this->samples() . 'form_with_false_defaults.html'); + $this->setField('Text A', '?'); + $this->setField('Text area B', '?'); + $this->setField('Selection D', 'D4'); + $this->setFieldByName('i', '?'); + $this->click('Go!'); + $this->assertText('a=[?]'); + $this->assertText('b=[?]'); + $this->assertText('d=[?]'); + $this->assertText('h=[?]'); + $this->assertText('i=[?]'); + } + + function testSubmissionOfHtmlEncodedValues() { + $this->get($this->samples() . 'form_with_tricky_defaults.html'); + $this->assertField('Text A', '&\'"<>'); + $this->assertField('Text B', '"'); + $this->assertField('Text area C', '&\'"<>'); + $this->assertField('Selection D', "'"); + $this->assertField('Checkbox E', '&\'"<>'); + $this->assertField('Checkbox F', false); + $this->assertFieldByname('i', "'"); + $this->click('Go!'); + $this->assertText('a=[&\'"<>, "]'); + $this->assertText('c=[&\'"<>]'); + $this->assertText("d=[']"); + $this->assertText('e=[&\'"<>]'); + $this->assertText("i=[']"); + } + + function testFormActionRespectsBaseTag() { + $this->get($this->samples() . 'base_tag/form.html'); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('go=[Go!]'); + $this->assertText('a=[]'); + } +} + +class TestOfLiveMultiValueWidgets extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testDefaultFormValueSubmission() { + $this->get($this->samples() . 'multiple_widget_form.html'); + $this->assertFieldByName('a', array('a2', 'a3')); + $this->assertFieldByName('b', array('b2', 'b3')); + $this->assertFieldByName('c[]', array('c2', 'c3')); + $this->assertFieldByName('d', array('2', '3')); + $this->assertFieldByName('e', array('2', '3')); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[a2, a3]'); + $this->assertText('b=[b2, b3]'); + $this->assertText('c=[c2, c3]'); + $this->assertText('d=[2, 3]'); + $this->assertText('e=[2, 3]'); + } + + function testSubmittingMultipleValues() { + $this->get($this->samples() . 'multiple_widget_form.html'); + $this->setFieldByName('a', array('a1', 'a4')); + $this->assertFieldByName('a', array('a1', 'a4')); + $this->assertFieldByName('a', array('a4', 'a1')); + $this->setFieldByName('b', array('b1', 'b4')); + $this->assertFieldByName('b', array('b1', 'b4')); + $this->setFieldByName('c[]', array('c1', 'c4')); + $this->assertField('c[]', array('c1', 'c4')); + $this->setFieldByName('d', array('1', '4')); + $this->assertField('d', array('1', '4')); + $this->setFieldByName('e', array('e1', 'e4')); + $this->assertField('e', array('1', '4')); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[a1, a4]'); + $this->assertText('b=[b1, b4]'); + $this->assertText('c=[c1, c4]'); + $this->assertText('d=[1, 4]'); + $this->assertText('e=[1, 4]'); + } + + function testSettingByOptionValue() { + $this->get($this->samples() . 'multiple_widget_form.html'); + $this->setFieldByName('d', array('1', '4')); + $this->assertField('d', array('1', '4')); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('d=[1, 4]'); + } + + function testSubmittingMultipleValuesByLabel() { + $this->get($this->samples() . 'multiple_widget_form.html'); + $this->setField('Multiple selection A', array('a1', 'a4')); + $this->assertField('Multiple selection A', array('a1', 'a4')); + $this->assertField('Multiple selection A', array('a4', 'a1')); + $this->setField('multiple selection C', array('c1', 'c4')); + $this->assertField('multiple selection C', array('c1', 'c4')); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[a1, a4]'); + $this->assertText('c=[c1, c4]'); + } + + function testSavantStyleHiddenFieldDefaults() { + $this->get($this->samples() . 'savant_style_form.html'); + $this->assertFieldByName('a', array('a0')); + $this->assertFieldByName('b', array('b0')); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[a0]'); + $this->assertText('b=[b0]'); + } + + function testSavantStyleHiddenDefaultsAreOverridden() { + $this->get($this->samples() . 'savant_style_form.html'); + $this->assertTrue($this->setFieldByName('a', array('a1'))); + $this->assertTrue($this->setFieldByName('b', 'b1')); + $this->assertTrue($this->clickSubmit('Go!')); + $this->assertText('a=[a1]'); + $this->assertText('b=[b1]'); + } + + function testSavantStyleFormSettingById() { + $this->get($this->samples() . 'savant_style_form.html'); + $this->assertFieldById(1, array('a0')); + $this->assertFieldById(4, array('b0')); + $this->assertTrue($this->setFieldById(2, 'a1')); + $this->assertTrue($this->setFieldById(5, 'b1')); + $this->assertTrue($this->clickSubmitById(99)); + $this->assertText('a=[a1]'); + $this->assertText('b=[b1]'); + } +} + +class TestOfFileUploads extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testSingleFileUpload() { + $this->get($this->samples() . 'upload_form.html'); + $this->assertTrue($this->setField('Content:', + dirname(__FILE__) . '/support/upload_sample.txt')); + $this->assertField('Content:', dirname(__FILE__) . '/support/upload_sample.txt'); + $this->click('Go!'); + $this->assertText('Sample for testing file upload'); + } + + function testMultipleFileUpload() { + $this->get($this->samples() . 'upload_form.html'); + $this->assertTrue($this->setField('Content:', + dirname(__FILE__) . '/support/upload_sample.txt')); + $this->assertTrue($this->setField('Supplemental:', + dirname(__FILE__) . '/support/supplementary_upload_sample.txt')); + $this->assertField('Supplemental:', + dirname(__FILE__) . '/support/supplementary_upload_sample.txt'); + $this->click('Go!'); + $this->assertText('Sample for testing file upload'); + $this->assertText('Some more text content'); + } + + function testBinaryFileUpload() { + $this->get($this->samples() . 'upload_form.html'); + $this->assertTrue($this->setField('Content:', + dirname(__FILE__) . '/support/latin1_sample')); + $this->click('Go!'); + $this->assertText( + implode('', file(dirname(__FILE__) . '/support/latin1_sample'))); + } +} + +class TestOfLiveHistoryNavigation extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testRetry() { + $this->get($this->samples() . 'cookie_based_counter.php'); + $this->assertPattern('/count: 1/i'); + $this->retry(); + $this->assertPattern('/count: 2/i'); + $this->retry(); + $this->assertPattern('/count: 3/i'); + } + + function testOfBackButton() { + $this->get($this->samples() . '1.html'); + $this->clickLink('2'); + $this->assertTitle('2'); + $this->assertTrue($this->back()); + $this->assertTitle('1'); + $this->assertTrue($this->forward()); + $this->assertTitle('2'); + $this->assertFalse($this->forward()); + } + + function testGetRetryResubmitsData() { + $this->assertTrue($this->get( + $this->samples() . 'network_confirm.php?a=aaa')); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[aaa]'); + $this->retry(); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[aaa]'); + } + + function testGetRetryResubmitsExtraData() { + $this->assertTrue($this->get( + $this->samples() . 'network_confirm.php', + array('a' => 'aaa'))); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[aaa]'); + $this->retry(); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[aaa]'); + } + + function testPostRetryResubmitsData() { + $this->assertTrue($this->post( + $this->samples() . 'network_confirm.php', + array('a' => 'aaa'))); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aaa]'); + $this->retry(); + $this->assertPattern('/Request method.*?
      POST<\/dd>/'); + $this->assertText('a=[aaa]'); + } + + function testGetRetryResubmitsRepeatedData() { + $this->assertTrue($this->get( + $this->samples() . 'network_confirm.php?a=1&a=2')); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[1, 2]'); + $this->retry(); + $this->assertPattern('/Request method.*?
      GET<\/dd>/'); + $this->assertText('a=[1, 2]'); + } +} + +class TestOfLiveAuthentication extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testChallengeFromProtectedPage() { + $this->get($this->samples() . 'protected/'); + $this->assertResponse(401); + $this->assertAuthentication('Basic'); + $this->assertRealm('SimpleTest basic authentication'); + $this->assertRealm(new PatternExpectation('/simpletest/i')); + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->retry(); + $this->assertResponse(200); + } + + function testTrailingSlashImpliedWithinRealm() { + $this->get($this->samples() . 'protected/'); + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->get($this->samples() . 'protected'); + $this->assertResponse(200); + } + + function testTrailingSlashImpliedSettingRealm() { + $this->get($this->samples() . 'protected'); + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->get($this->samples() . 'protected/'); + $this->assertResponse(200); + } + + function testEncodedAuthenticationFetchesPage() { + $this->get('http://test:secret@www.lastcraft.com/test/protected/'); + $this->assertResponse(200); + } + + function testEncodedAuthenticationFetchesPageAfterTrailingSlashRedirect() { + $this->get('http://test:secret@www.lastcraft.com/test/protected'); + $this->assertResponse(200); + } + + function testRealmExtendsToWholeDirectory() { + $this->get($this->samples() . 'protected/1.html'); + $this->authenticate('test', 'secret'); + $this->clickLink('2'); + $this->assertResponse(200); + $this->clickLink('3'); + $this->assertResponse(200); + } + + function testRedirectKeepsAuthentication() { + $this->get($this->samples() . 'protected/local_redirect.php'); + $this->authenticate('test', 'secret'); + $this->assertTitle('Simple test target file'); + } + + function testRedirectKeepsEncodedAuthentication() { + $this->get('http://test:secret@www.lastcraft.com/test/protected/local_redirect.php'); + $this->assertResponse(200); + $this->assertTitle('Simple test target file'); + } + + function testSessionRestartLosesAuthentication() { + $this->get($this->samples() . 'protected/'); + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->restart(); + $this->get($this->samples() . 'protected/'); + $this->assertResponse(401); + } +} + +class TestOfLoadingFrames extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testNoFramesContentWhenFramesDisabled() { + $this->ignoreFrames(); + $this->get($this->samples() . 'one_page_frameset.html'); + $this->assertTitle('Frameset for testing of SimpleTest'); + $this->assertText('This content is for no frames only'); + } + + function testPatternMatchCanReadTheOnlyFrame() { + $this->get($this->samples() . 'one_page_frameset.html'); + $this->assertText('A target for the SimpleTest test suite'); + $this->assertNoText('This content is for no frames only'); + } + + function testMessyFramesetResponsesByName() { + $this->assertTrue($this->get( + $this->samples() . 'messy_frameset.html')); + $this->assertTitle('Frameset for testing of SimpleTest'); + + $this->assertTrue($this->setFrameFocus('Front controller')); + $this->assertResponse(200); + $this->assertText('Simple test front controller'); + + $this->assertTrue($this->setFrameFocus('One')); + $this->assertResponse(200); + $this->assertLink('2'); + + $this->assertTrue($this->setFrameFocus('Frame links')); + $this->assertResponse(200); + $this->assertLink('Set one to 2'); + + $this->assertTrue($this->setFrameFocus('Counter')); + $this->assertResponse(200); + $this->assertText('Count: 1'); + + $this->assertTrue($this->setFrameFocus('Redirected')); + $this->assertResponse(200); + $this->assertText('r=rrr'); + + $this->assertTrue($this->setFrameFocus('Protected')); + $this->assertResponse(401); + + $this->assertTrue($this->setFrameFocus('Protected redirect')); + $this->assertResponse(401); + + $this->assertTrue($this->setFrameFocusByIndex(1)); + $this->assertResponse(200); + $this->assertText('Simple test front controller'); + + $this->assertTrue($this->setFrameFocusByIndex(2)); + $this->assertResponse(200); + $this->assertLink('2'); + + $this->assertTrue($this->setFrameFocusByIndex(3)); + $this->assertResponse(200); + $this->assertLink('Set one to 2'); + + $this->assertTrue($this->setFrameFocusByIndex(4)); + $this->assertResponse(200); + $this->assertText('Count: 1'); + + $this->assertTrue($this->setFrameFocusByIndex(5)); + $this->assertResponse(200); + $this->assertText('r=rrr'); + + $this->assertTrue($this->setFrameFocusByIndex(6)); + $this->assertResponse(401); + + $this->assertTrue($this->setFrameFocusByIndex(7)); + } + + function testReloadingFramesetPage() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->assertText('Count: 1'); + $this->retry(); + $this->assertText('Count: 2'); + $this->retry(); + $this->assertText('Count: 3'); + } + + function testReloadingSingleFrameWithCookieCounter() { + $this->get($this->samples() . 'counting_frameset.html'); + $this->setFrameFocus('a'); + $this->assertText('Count: 1'); + $this->setFrameFocus('b'); + $this->assertText('Count: 2'); + + $this->setFrameFocus('a'); + $this->retry(); + $this->assertText('Count: 3'); + $this->retry(); + $this->assertText('Count: 4'); + $this->setFrameFocus('b'); + $this->assertText('Count: 2'); + } + + function testReloadingFrameWhenUnfocusedReloadsWholeFrameset() { + $this->get($this->samples() . 'counting_frameset.html'); + $this->setFrameFocus('a'); + $this->assertText('Count: 1'); + $this->setFrameFocus('b'); + $this->assertText('Count: 2'); + + $this->clearFrameFocus('a'); + $this->retry(); + + $this->assertTitle('Frameset for testing of SimpleTest'); + $this->setFrameFocus('a'); + $this->assertText('Count: 3'); + $this->setFrameFocus('b'); + $this->assertText('Count: 4'); + } + + function testClickingNormalLinkReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('2'); + $this->assertLink('3'); + $this->assertText('Simple test front controller'); + } + + function testJumpToNamedPageReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->assertPattern('/Simple test front controller/'); + $this->clickLink('Index'); + $this->assertResponse(200); + $this->assertText('[action=index]'); + $this->assertText('Count: 1'); + } + + function testJumpToUnnamedPageReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('No page'); + $this->assertResponse(200); + $this->assertText('Simple test front controller'); + $this->assertText('[action=no_page]'); + $this->assertText('Count: 1'); + } + + function testJumpToUnnamedPageWithBareParameterReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('Bare action'); + $this->assertResponse(200); + $this->assertText('Simple test front controller'); + $this->assertText('[action=]'); + $this->assertText('Count: 1'); + } + + function testJumpToUnnamedPageWithEmptyQueryReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('Empty query'); + $this->assertResponse(200); + $this->assertPattern('/Simple test front controller/'); + $this->assertPattern('/raw get data.*?\[\].*?get data/si'); + $this->assertPattern('/Count: 1/'); + } + + function testJumpToUnnamedPageWithEmptyLinkReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('Empty link'); + $this->assertResponse(200); + $this->assertPattern('/Simple test front controller/'); + $this->assertPattern('/raw get data.*?\[\].*?get data/si'); + $this->assertPattern('/Count: 1/'); + } + + function testJumpBackADirectoryLevelReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('Down one'); + $this->assertPattern('/index of .*\/test/i'); + $this->assertPattern('/Count: 1/'); + } + + function testSubmitToNamedPageReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->assertPattern('/Simple test front controller/'); + $this->clickSubmit('Index'); + $this->assertResponse(200); + $this->assertText('[action=Index]'); + $this->assertText('Count: 1'); + } + + function testSubmitToSameDirectoryReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickSubmit('Same directory'); + $this->assertResponse(200); + $this->assertText('[action=Same+directory]'); + $this->assertText('Count: 1'); + } + + function testSubmitToEmptyActionReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickSubmit('Empty action'); + $this->assertResponse(200); + $this->assertText('[action=Empty+action]'); + $this->assertText('Count: 1'); + } + + function testSubmitToNoActionReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickSubmit('No action'); + $this->assertResponse(200); + $this->assertText('[action=No+action]'); + $this->assertText('Count: 1'); + } + + function testSubmitBackADirectoryLevelReplacesJustThatFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickSubmit('Down one'); + $this->assertPattern('/index of .*\/test/i'); + $this->assertPattern('/Count: 1/'); + } + + function testTopLinkExitsFrameset() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->clickLink('Exit the frameset'); + $this->assertTitle('Simple test target file'); + } + + function testLinkInOnePageCanLoadAnother() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->assertNoLink('3'); + $this->clickLink('Set one to 2'); + $this->assertLink('3'); + $this->assertNoLink('2'); + $this->assertTitle('Frameset for testing of SimpleTest'); + } + + function testFrameWithRelativeLinksRespectsBaseTagForThatPage() { + $this->get($this->samples() . 'base_tag/frameset.html'); + $this->click('Back to test pages'); + $this->assertTitle('Frameset for testing of SimpleTest'); + $this->assertText('A target for the SimpleTest test suite'); + } + + function testRelativeLinkInFrameIsNotAffectedByFramesetBaseTag() { + $this->get($this->samples() . 'base_tag/frameset_with_base_tag.html'); + $this->assertText('This is page 1'); + $this->click('To page 2'); + $this->assertTitle('Frameset for testing of SimpleTest'); + $this->assertText('This is page 2'); + } +} + +class TestOfFrameAuthentication extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testUnauthenticatedFrameSendsChallenge() { + $this->get($this->samples() . 'protected/'); + $this->setFrameFocus('Protected'); + $this->assertAuthentication('Basic'); + $this->assertRealm('SimpleTest basic authentication'); + $this->assertResponse(401); + } + + function testCanReadFrameFromAlreadyAuthenticatedRealm() { + $this->get($this->samples() . 'protected/'); + $this->authenticate('test', 'secret'); + $this->get($this->samples() . 'messy_frameset.html'); + $this->setFrameFocus('Protected'); + $this->assertResponse(200); + $this->assertText('A target for the SimpleTest test suite'); + } + + function testCanAuthenticateFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->setFrameFocus('Protected'); + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->assertText('A target for the SimpleTest test suite'); + $this->clearFrameFocus(); + $this->assertText('Count: 1'); + } + + function testCanAuthenticateRedirectedFrame() { + $this->get($this->samples() . 'messy_frameset.html'); + $this->setFrameFocus('Protected redirect'); + $this->assertResponse(401); + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->assertText('A target for the SimpleTest test suite'); + $this->clearFrameFocus(); + $this->assertText('Count: 1'); + } +} + +class TestOfNestedFrames extends SimpleTestAcceptanceTest { + function setUp() { + $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion()); + } + + function testCanNavigateToSpecificContent() { + $this->get($this->samples() . 'nested_frameset.html'); + $this->assertTitle('Nested frameset for testing of SimpleTest'); + + $this->assertPattern('/This is frame A/'); + $this->assertPattern('/This is frame B/'); + $this->assertPattern('/Simple test front controller/'); + $this->assertLink('2'); + $this->assertLink('Set one to 2'); + $this->assertPattern('/Count: 1/'); + $this->assertPattern('/r=rrr/'); + + $this->setFrameFocus('pair'); + $this->assertPattern('/This is frame A/'); + $this->assertPattern('/This is frame B/'); + $this->assertNoPattern('/Simple test front controller/'); + $this->assertNoLink('2'); + + $this->setFrameFocus('aaa'); + $this->assertPattern('/This is frame A/'); + $this->assertNoPattern('/This is frame B/'); + + $this->clearFrameFocus(); + $this->assertResponse(200); + $this->setFrameFocus('messy'); + $this->assertResponse(200); + $this->setFrameFocus('Front controller'); + $this->assertResponse(200); + $this->assertPattern('/Simple test front controller/'); + $this->assertNoLink('2'); + } + + function testReloadingFramesetPage() { + $this->get($this->samples() . 'nested_frameset.html'); + $this->assertPattern('/Count: 1/'); + $this->retry(); + $this->assertPattern('/Count: 2/'); + $this->retry(); + $this->assertPattern('/Count: 3/'); + } + + function testRetryingNestedPageOnlyRetriesThatSet() { + $this->get($this->samples() . 'nested_frameset.html'); + $this->assertPattern('/Count: 1/'); + $this->setFrameFocus('messy'); + $this->retry(); + $this->assertPattern('/Count: 2/'); + $this->setFrameFocus('Counter'); + $this->retry(); + $this->assertPattern('/Count: 3/'); + + $this->clearFrameFocus(); + $this->setFrameFocus('messy'); + $this->setFrameFocus('Front controller'); + $this->retry(); + + $this->clearFrameFocus(); + $this->assertPattern('/Count: 3/'); + } + + function testAuthenticatingNestedPage() { + $this->get($this->samples() . 'nested_frameset.html'); + $this->setFrameFocus('messy'); + $this->setFrameFocus('Protected'); + $this->assertAuthentication('Basic'); + $this->assertRealm('SimpleTest basic authentication'); + $this->assertResponse(401); + + $this->authenticate('test', 'secret'); + $this->assertResponse(200); + $this->assertPattern('/A target for the SimpleTest test suite/'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/adapter_test.php b/tests/simpletest/test/adapter_test.php new file mode 100644 index 000000000..f4564ea87 --- /dev/null +++ b/tests/simpletest/test/adapter_test.php @@ -0,0 +1,77 @@ +assertTrue(true, "PEAR true"); + $this->assertFalse(false, "PEAR false"); + } + + function testName() { + $this->assertTrue($this->getName() == get_class($this)); + } + + function testPass() { + $this->pass("PEAR pass"); + } + + function testNulls() { + $value = null; + $this->assertNull($value, "PEAR null"); + $value = 0; + $this->assertNotNull($value, "PEAR not null"); + } + + function testType() { + $this->assertType("Hello", "string", "PEAR type"); + } + + function testEquals() { + $this->assertEquals(12, 12, "PEAR identity"); + $this->setLooselyTyped(true); + $this->assertEquals("12", 12, "PEAR equality"); + } + + function testSame() { + $same = &new SameTestClass(); + $this->assertSame($same, $same, "PEAR same"); + } + + function testRegExp() { + $this->assertRegExp('/hello/', "A big hello from me", "PEAR regex"); + } +} + +class TestOfPhpUnitAdapter extends TestCase { + function TestOfPhpUnitAdapter() { + $this->TestCase('TestOfPhpUnitAdapter'); + } + + function testBoolean() { + $this->assert(true, 'PHP Unit true'); + } + + function testName() { + $this->assert($this->name() == 'TestOfPhpUnitAdapter'); + } + + function testEquals() { + $this->assertEquals(12, 12, 'PHP Unit equality'); + } + + function testMultilineEquals() { + $this->assertEquals("a\nb\n", "a\nb\n", 'PHP Unit equality'); + } + + function testRegExp() { + $this->assertRegexp('/hello/', 'A big hello from me', 'PHPUnit regex'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/all_tests.php b/tests/simpletest/test/all_tests.php new file mode 100644 index 000000000..99ce9451e --- /dev/null +++ b/tests/simpletest/test/all_tests.php @@ -0,0 +1,13 @@ +TestSuite('All tests for SimpleTest ' . SimpleTest::getVersion()); + $this->addFile(dirname(__FILE__) . '/unit_tests.php'); + $this->addFile(dirname(__FILE__) . '/shell_test.php'); + $this->addFile(dirname(__FILE__) . '/live_test.php'); + $this->addFile(dirname(__FILE__) . '/acceptance_test.php'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/authentication_test.php b/tests/simpletest/test/authentication_test.php new file mode 100644 index 000000000..8573eddc8 --- /dev/null +++ b/tests/simpletest/test/authentication_test.php @@ -0,0 +1,145 @@ +assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/hello.html'))); + } + + function testInsideWithLongerUrl() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/')); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/hello.html'))); + } + + function testBelowRootIsOutside() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/')); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/more/hello.html'))); + } + + function testOldNetscapeDefinitionIsOutside() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/')); + $this->assertFalse($realm->isWithin( + new SimpleUrl('http://www.here.com/pathmore/hello.html'))); + } + + function testInsideWithMissingTrailingSlash() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/')); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path'))); + } + + function testDifferentPageNameStillInside() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/hello.html')); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/goodbye.html'))); + } + + function testNewUrlInSameDirectoryDoesNotChangeRealm() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/hello.html')); + $realm->stretch(new SimpleUrl('http://www.here.com/path/goodbye.html')); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/index.html'))); + $this->assertFalse($realm->isWithin( + new SimpleUrl('http://www.here.com/index.html'))); + } + + function testNewUrlMakesRealmTheCommonPath() { + $realm = &new SimpleRealm( + 'Basic', + new SimpleUrl('http://www.here.com/path/here/hello.html')); + $realm->stretch(new SimpleUrl('http://www.here.com/path/there/goodbye.html')); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/here/index.html'))); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/there/index.html'))); + $this->assertTrue($realm->isWithin( + new SimpleUrl('http://www.here.com/path/index.html'))); + $this->assertFalse($realm->isWithin( + new SimpleUrl('http://www.here.com/index.html'))); + $this->assertFalse($realm->isWithin( + new SimpleUrl('http://www.here.com/paths/index.html'))); + $this->assertFalse($realm->isWithin( + new SimpleUrl('http://www.here.com/pathindex.html'))); + } +} + +class TestOfAuthenticator extends UnitTestCase { + + function testNoRealms() { + $request = &new MockSimpleHttpRequest(); + $request->expectNever('addHeaderLine'); + $authenticator = &new SimpleAuthenticator(); + $authenticator->addHeaders($request, new SimpleUrl('http://here.com/')); + } + + function &createSingleRealm() { + $authenticator = &new SimpleAuthenticator(); + $authenticator->addRealm( + new SimpleUrl('http://www.here.com/path/hello.html'), + 'Basic', + 'Sanctuary'); + $authenticator->setIdentityForRealm('www.here.com', 'Sanctuary', 'test', 'secret'); + return $authenticator; + } + + function testOutsideRealm() { + $request = &new MockSimpleHttpRequest(); + $request->expectNever('addHeaderLine'); + $authenticator = &$this->createSingleRealm(); + $authenticator->addHeaders( + $request, + new SimpleUrl('http://www.here.com/hello.html')); + } + + function testWithinRealm() { + $request = &new MockSimpleHttpRequest(); + $request->expectOnce('addHeaderLine'); + $authenticator = &$this->createSingleRealm(); + $authenticator->addHeaders( + $request, + new SimpleUrl('http://www.here.com/path/more/hello.html')); + } + + function testRestartingClearsRealm() { + $request = &new MockSimpleHttpRequest(); + $request->expectNever('addHeaderLine'); + $authenticator = &$this->createSingleRealm(); + $authenticator->restartSession(); + $authenticator->addHeaders( + $request, + new SimpleUrl('http://www.here.com/hello.html')); + } + + function testDifferentHostIsOutsideRealm() { + $request = &new MockSimpleHttpRequest(); + $request->expectNever('addHeaderLine'); + $authenticator = &$this->createSingleRealm(); + $authenticator->addHeaders( + $request, + new SimpleUrl('http://here.com/path/hello.html')); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/autorun_test.php b/tests/simpletest/test/autorun_test.php new file mode 100644 index 000000000..76c919d6c --- /dev/null +++ b/tests/simpletest/test/autorun_test.php @@ -0,0 +1,13 @@ +addFile(dirname(__FILE__) . '/support/test1.php'); + $this->assertEqual($tests->getSize(), 1); + } +} + +?> \ No newline at end of file diff --git a/tests/simpletest/test/bad_test_suite.php b/tests/simpletest/test/bad_test_suite.php new file mode 100644 index 000000000..b426013be --- /dev/null +++ b/tests/simpletest/test/bad_test_suite.php @@ -0,0 +1,10 @@ +TestSuite('Two bad test cases'); + $this->addFile(dirname(__FILE__) . '/support/empty_test_file.php'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/browser_test.php b/tests/simpletest/test/browser_test.php new file mode 100644 index 000000000..18faee8f2 --- /dev/null +++ b/tests/simpletest/test/browser_test.php @@ -0,0 +1,779 @@ +assertIdentical($history->getUrl(), false); + $this->assertIdentical($history->getParameters(), false); + } + + function testCannotMoveInEmptyHistory() { + $history = &new SimpleBrowserHistory(); + $this->assertFalse($history->back()); + $this->assertFalse($history->forward()); + } + + function testCurrentTargetAccessors() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.here.com/'), + new SimpleGetEncoding()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.here.com/')); + $this->assertIdentical($history->getParameters(), new SimpleGetEncoding()); + } + + function testSecondEntryAccessors() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $history->recordEntry( + new SimpleUrl('http://www.second.com/'), + new SimplePostEncoding(array('a' => 1))); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.second.com/')); + $this->assertIdentical( + $history->getParameters(), + new SimplePostEncoding(array('a' => 1))); + } + + function testGoingBackwards() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $history->recordEntry( + new SimpleUrl('http://www.second.com/'), + new SimplePostEncoding(array('a' => 1))); + $this->assertTrue($history->back()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/')); + $this->assertIdentical($history->getParameters(), new SimpleGetEncoding()); + } + + function testGoingBackwardsOffBeginning() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $this->assertFalse($history->back()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/')); + $this->assertIdentical($history->getParameters(), new SimpleGetEncoding()); + } + + function testGoingForwardsOffEnd() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $this->assertFalse($history->forward()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/')); + $this->assertIdentical($history->getParameters(), new SimpleGetEncoding()); + } + + function testGoingBackwardsAndForwards() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $history->recordEntry( + new SimpleUrl('http://www.second.com/'), + new SimplePostEncoding(array('a' => 1))); + $this->assertTrue($history->back()); + $this->assertTrue($history->forward()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.second.com/')); + $this->assertIdentical( + $history->getParameters(), + new SimplePostEncoding(array('a' => 1))); + } + + function testNewEntryReplacesNextOne() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $history->recordEntry( + new SimpleUrl('http://www.second.com/'), + new SimplePostEncoding(array('a' => 1))); + $history->back(); + $history->recordEntry( + new SimpleUrl('http://www.third.com/'), + new SimpleGetEncoding()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.third.com/')); + $this->assertIdentical($history->getParameters(), new SimpleGetEncoding()); + } + + function testNewEntryDropsFutureEntries() { + $history = &new SimpleBrowserHistory(); + $history->recordEntry( + new SimpleUrl('http://www.first.com/'), + new SimpleGetEncoding()); + $history->recordEntry( + new SimpleUrl('http://www.second.com/'), + new SimpleGetEncoding()); + $history->recordEntry( + new SimpleUrl('http://www.third.com/'), + new SimpleGetEncoding()); + $history->back(); + $history->back(); + $history->recordEntry( + new SimpleUrl('http://www.fourth.com/'), + new SimpleGetEncoding()); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.fourth.com/')); + $this->assertFalse($history->forward()); + $history->back(); + $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/')); + $this->assertFalse($history->back()); + } +} + +class TestOfParsedPageAccess extends UnitTestCase { + + function &loadPage(&$page) { + $response = &new MockSimpleHttpResponse($this); + + $agent = &new MockSimpleUserAgent($this); + $agent->setReturnReference('fetchResponse', $response); + + $browser = &new MockParseSimpleBrowser($this); + $browser->setReturnReference('_createUserAgent', $agent); + $browser->setReturnReference('_parse', $page); + $browser->SimpleBrowser(); + + $browser->get('http://this.com/page.html'); + return $browser; + } + + function testAccessorsWhenNoPage() { + $agent = &new MockSimpleUserAgent($this); + + $browser = &new MockParseSimpleBrowser($this); + $browser->setReturnReference('_createUserAgent', $agent); + $browser->SimpleBrowser(); + + $this->assertEqual($browser->getContent(), ''); + } + + function testParse() { + $page = &new MockSimplePage(); + $page->setReturnValue('getRequest', "GET here.html\r\n\r\n"); + $page->setReturnValue('getRaw', 'Raw HTML'); + $page->setReturnValue('getTitle', 'Here'); + $page->setReturnValue('getFrameFocus', 'Frame'); + $page->setReturnValue('getMimeType', 'text/html'); + $page->setReturnValue('getResponseCode', 200); + $page->setReturnValue('getAuthentication', 'Basic'); + $page->setReturnValue('getRealm', 'Somewhere'); + $page->setReturnValue('getTransportError', 'Ouch!'); + + $browser = &$this->loadPage($page); + + $this->assertEqual($browser->getRequest(), "GET here.html\r\n\r\n"); + $this->assertEqual($browser->getContent(), 'Raw HTML'); + $this->assertEqual($browser->getTitle(), 'Here'); + $this->assertEqual($browser->getFrameFocus(), 'Frame'); + $this->assertIdentical($browser->getResponseCode(), 200); + $this->assertEqual($browser->getMimeType(), 'text/html'); + $this->assertEqual($browser->getAuthentication(), 'Basic'); + $this->assertEqual($browser->getRealm(), 'Somewhere'); + $this->assertEqual($browser->getTransportError(), 'Ouch!'); + } + + function testLinkAffirmationWhenPresent() { + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlsByLabel', array('http://www.nowhere.com')); + $page->expectOnce('getUrlsByLabel', array('a link label')); + $browser = &$this->loadPage($page); + $this->assertIdentical($browser->getLink('a link label'), 'http://www.nowhere.com'); + } + + function testLinkAffirmationByIdWhenPresent() { + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlById', 'a_page.com', array(99)); + $page->setReturnValue('getUrlById', false, array('*')); + $browser = &$this->loadPage($page); + $this->assertIdentical($browser->getLinkById(99), 'a_page.com'); + $this->assertFalse($browser->getLinkById(98)); + } + + function testSettingFieldIsPassedToPage() { + $page = &new MockSimplePage(); + $page->expectOnce('setField', array(new SimpleByLabelOrName('key'), 'Value', false)); + $page->setReturnValue('getField', 'Value'); + $browser = &$this->loadPage($page); + $this->assertEqual($browser->getField('key'), 'Value'); + $browser->setField('key', 'Value'); + } +} + +class TestOfBrowserNavigation extends UnitTestCase { + + function &createBrowser(&$agent, &$page) { + $browser = &new MockParseSimpleBrowser(); + $browser->setReturnReference('_createUserAgent', $agent); + $browser->setReturnReference('_parse', $page); + $browser->SimpleBrowser(); + return $browser; + } + + function testClickLinkRequestsPage() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt( + 0, + 'fetchResponse', + array(new SimpleUrl('http://this.com/page.html'), new SimpleGetEncoding())); + $agent->expectArgumentsAt( + 1, + 'fetchResponse', + array(new SimpleUrl('http://this.com/new.html'), new SimpleGetEncoding())); + $agent->expectCallCount('fetchResponse', 2); + + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlsByLabel', array(new SimpleUrl('http://this.com/new.html'))); + $page->expectOnce('getUrlsByLabel', array('New')); + $page->setReturnValue('getRaw', 'A page'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickLink('New')); + } + + function testClickLinkWithUnknownFrameStillRequestsWholePage() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt( + 0, + 'fetchResponse', + array(new SimpleUrl('http://this.com/page.html'), new SimpleGetEncoding())); + $target = new SimpleUrl('http://this.com/new.html'); + $target->setTarget('missing'); + $agent->expectArgumentsAt( + 1, + 'fetchResponse', + array($target, new SimpleGetEncoding())); + $agent->expectCallCount('fetchResponse', 2); + + $parsed_url = new SimpleUrl('http://this.com/new.html'); + $parsed_url->setTarget('missing'); + + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlsByLabel', array($parsed_url)); + $page->setReturnValue('hasFrames', false); + $page->expectOnce('getUrlsByLabel', array('New')); + $page->setReturnValue('getRaw', 'A page'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickLink('New')); + } + + function testClickingMissingLinkFails() { + $agent = &new MockSimpleUserAgent($this); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlsByLabel', array()); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $this->assertTrue($browser->get('http://this.com/page.html')); + $this->assertFalse($browser->clickLink('New')); + } + + function testClickIndexedLink() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt( + 1, + 'fetchResponse', + array(new SimpleUrl('1.html'), new SimpleGetEncoding())); + $agent->expectCallCount('fetchResponse', 2); + + $page = &new MockSimplePage(); + $page->setReturnValue( + 'getUrlsByLabel', + array(new SimpleUrl('0.html'), new SimpleUrl('1.html'))); + $page->setReturnValue('getRaw', 'A page'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickLink('New', 1)); + } + + function testClinkLinkById() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt(1, 'fetchResponse', array( + new SimpleUrl('http://this.com/link.html'), + new SimpleGetEncoding())); + $agent->expectCallCount('fetchResponse', 2); + + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlById', new SimpleUrl('http://this.com/link.html')); + $page->expectOnce('getUrlById', array(2)); + $page->setReturnValue('getRaw', 'A page'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickLinkById(2)); + } + + function testClickingMissingLinkIdFails() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $page = &new MockSimplePage(); + $page->setReturnValue('getUrlById', false); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertFalse($browser->clickLink(0)); + } + + function testSubmitFormByLabel() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt(1, 'fetchResponse', array( + new SimpleUrl('http://this.com/handler.html'), + new SimplePostEncoding(array('a' => 'A')))); + $agent->expectCallCount('fetchResponse', 2); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A'))); + $form->expectOnce('submitButton', array(new SimpleByLabel('Go'), false)); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormBySubmit', $form); + $page->expectOnce('getFormBySubmit', array(new SimpleByLabel('Go'))); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickSubmit('Go')); + } + + function testDefaultSubmitFormByLabel() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt(1, 'fetchResponse', array( + new SimpleUrl('http://this.com/page.html'), + new SimpleGetEncoding(array('a' => 'A')))); + $agent->expectCallCount('fetchResponse', 2); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/page.html')); + $form->setReturnValue('getMethod', 'get'); + $form->setReturnValue('submitButton', new SimpleGetEncoding(array('a' => 'A'))); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormBySubmit', $form); + $page->expectOnce('getFormBySubmit', array(new SimpleByLabel('Submit'))); + $page->setReturnValue('getRaw', 'stuff'); + $page->setReturnValue('getUrl', new SimpleUrl('http://this.com/page.html')); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickSubmit()); + } + + function testSubmitFormByName() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A'))); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormBySubmit', $form); + $page->expectOnce('getFormBySubmit', array(new SimpleByName('me'))); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickSubmitByName('me')); + } + + function testSubmitFormById() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A'))); + $form->expectOnce('submitButton', array(new SimpleById(99), false)); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormBySubmit', $form); + $page->expectOnce('getFormBySubmit', array(new SimpleById(99))); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickSubmitById(99)); + } + + function testSubmitFormByImageLabel() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A'))); + $form->expectOnce('submitImage', array(new SimpleByLabel('Go!'), 10, 11, false)); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormByImage', $form); + $page->expectOnce('getFormByImage', array(new SimpleByLabel('Go!'))); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickImage('Go!', 10, 11)); + } + + function testSubmitFormByImageName() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A'))); + $form->expectOnce('submitImage', array(new SimpleByName('a'), 10, 11, false)); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormByImage', $form); + $page->expectOnce('getFormByImage', array(new SimpleByName('a'))); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickImageByName('a', 10, 11)); + } + + function testSubmitFormByImageId() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A'))); + $form->expectOnce('submitImage', array(new SimpleById(99), 10, 11, false)); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormByImage', $form); + $page->expectOnce('getFormByImage', array(new SimpleById(99))); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->clickImageById(99, 10, 11)); + } + + function testSubmitFormByFormId() { + $agent = &new MockSimpleUserAgent(); + $agent->setReturnReference('fetchResponse', new MockSimpleHttpResponse()); + $agent->expectArgumentsAt(1, 'fetchResponse', array( + new SimpleUrl('http://this.com/handler.html'), + new SimplePostEncoding(array('a' => 'A')))); + $agent->expectCallCount('fetchResponse', 2); + + $form = &new MockSimpleForm(); + $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html')); + $form->setReturnValue('getMethod', 'post'); + $form->setReturnValue('submit', new SimplePostEncoding(array('a' => 'A'))); + + $page = &new MockSimplePage(); + $page->setReturnReference('getFormById', $form); + $page->expectOnce('getFormById', array(33)); + $page->setReturnValue('getRaw', 'stuff'); + + $browser = &$this->createBrowser($agent, $page); + $browser->get('http://this.com/page.html'); + $this->assertTrue($browser->submitFormById(33)); + } +} + +class TestOfBrowserFrames extends UnitTestCase { + + function &createBrowser(&$agent) { + $browser = &new MockUserAgentSimpleBrowser(); + $browser->setReturnReference('_createUserAgent', $agent); + $browser->SimpleBrowser(); + return $browser; + } + + function &createUserAgent($pages) { + $agent = &new MockSimpleUserAgent(); + foreach ($pages as $url => $raw) { + $url = new SimpleUrl($url); + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', $url); + $response->setReturnValue('getContent', $raw); + $agent->setReturnReference('fetchResponse', $response, array($url, '*')); + } + return $agent; + } + + function testSimplePageHasNoFrames() { + $browser = &$this->createBrowser($this->createUserAgent( + array('http://site.with.no.frames/' => 'A non-framed page'))); + $this->assertEqual( + $browser->get('http://site.with.no.frames/'), + 'A non-framed page'); + $this->assertIdentical($browser->getFrames(), 'http://site.with.no.frames/'); + } + + function testFramesetWithNoFrames() { + $browser = &$this->createBrowser($this->createUserAgent( + array('http://site.with.no.frames/' => ''))); + $this->assertEqual($browser->get('http://site.with.no.frames/'), ''); + $this->assertIdentical($browser->getFrames(), array()); + } + + function testFramesetWithSingleFrame() { + $frameset = ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.one.frame/' => $frameset, + 'http://site.with.one.frame/frame.html' => 'A frame'))); + $this->assertEqual($browser->get('http://site.with.one.frame/'), 'A frame'); + $this->assertIdentical( + $browser->getFrames(), + array('a' => 'http://site.with.one.frame/frame.html')); + } + + function testTitleTakenFromFramesetPage() { + $frameset = 'Frameset title' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.one.frame/' => $frameset, + 'http://site.with.one.frame/frame.html' => 'Page title'))); + $browser->get('http://site.with.one.frame/'); + $this->assertEqual($browser->getTitle(), 'Frameset title'); + } + + function testFramesetWithSingleUnnamedFrame() { + $frameset = ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.one.frame/' => $frameset, + 'http://site.with.one.frame/frame.html' => 'One frame'))); + $this->assertEqual( + $browser->get('http://site.with.one.frame/'), + 'One frame'); + $this->assertIdentical( + $browser->getFrames(), + array(1 => 'http://site.with.one.frame/frame.html')); + } + + function testFramesetWithMultipleFrames() { + $frameset = '' . + '' . + '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.frames/' => $frameset, + 'http://site.with.frames/frame_a.html' => 'A frame', + 'http://site.with.frames/frame_b.html' => 'B frame', + 'http://site.with.frames/frame_c.html' => 'C frame'))); + $this->assertEqual( + $browser->get('http://site.with.frames/'), + 'A frameB frameC frame'); + $this->assertIdentical($browser->getFrames(), array( + 'a' => 'http://site.with.frames/frame_a.html', + 'b' => 'http://site.with.frames/frame_b.html', + 'c' => 'http://site.with.frames/frame_c.html')); + } + + function testFrameFocusByName() { + $frameset = '' . + '' . + '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.frames/' => $frameset, + 'http://site.with.frames/frame_a.html' => 'A frame', + 'http://site.with.frames/frame_b.html' => 'B frame', + 'http://site.with.frames/frame_c.html' => 'C frame'))); + $browser->get('http://site.with.frames/'); + $browser->setFrameFocus('a'); + $this->assertEqual($browser->getContent(), 'A frame'); + $browser->setFrameFocus('b'); + $this->assertEqual($browser->getContent(), 'B frame'); + $browser->setFrameFocus('c'); + $this->assertEqual($browser->getContent(), 'C frame'); + } + + function testFramesetWithSomeNamedFrames() { + $frameset = '' . + '' . + '' . + '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.frames/' => $frameset, + 'http://site.with.frames/frame_a.html' => 'A frame', + 'http://site.with.frames/frame_b.html' => 'B frame', + 'http://site.with.frames/frame_c.html' => 'C frame', + 'http://site.with.frames/frame_d.html' => 'D frame'))); + $this->assertEqual( + $browser->get('http://site.with.frames/'), + 'A frameB frameC frameD frame'); + $this->assertIdentical($browser->getFrames(), array( + 'a' => 'http://site.with.frames/frame_a.html', + 2 => 'http://site.with.frames/frame_b.html', + 'c' => 'http://site.with.frames/frame_c.html', + 4 => 'http://site.with.frames/frame_d.html')); + } + + function testFrameFocusWithMixedNamesAndIndexes() { + $frameset = '' . + '' . + '' . + '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.frames/' => $frameset, + 'http://site.with.frames/frame_a.html' => 'A frame', + 'http://site.with.frames/frame_b.html' => 'B frame', + 'http://site.with.frames/frame_c.html' => 'C frame', + 'http://site.with.frames/frame_d.html' => 'D frame'))); + $browser->get('http://site.with.frames/'); + $browser->setFrameFocus('a'); + $this->assertEqual($browser->getContent(), 'A frame'); + $browser->setFrameFocus(2); + $this->assertEqual($browser->getContent(), 'B frame'); + $browser->setFrameFocus('c'); + $this->assertEqual($browser->getContent(), 'C frame'); + $browser->setFrameFocus(4); + $this->assertEqual($browser->getContent(), 'D frame'); + $browser->clearFrameFocus(); + $this->assertEqual($browser->getContent(), 'A frameB frameC frameD frame'); + } + + function testNestedFrameset() { + $inner = '' . + '' . + ''; + $outer = '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.nested.frame/' => $outer, + 'http://site.with.nested.frame/inner.html' => $inner, + 'http://site.with.nested.frame/page.html' => 'The page'))); + $this->assertEqual( + $browser->get('http://site.with.nested.frame/'), + 'The page'); + $this->assertIdentical($browser->getFrames(), array( + 'inner' => array( + 'page' => 'http://site.with.nested.frame/page.html'))); + } + + function testCanNavigateToNestedFrame() { + $inner = '' . + '' . + '' . + ''; + $outer = '' . + '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.nested.frames/' => $outer, + 'http://site.with.nested.frames/inner.html' => $inner, + 'http://site.with.nested.frames/one.html' => 'Page one', + 'http://site.with.nested.frames/two.html' => 'Page two', + 'http://site.with.nested.frames/three.html' => 'Page three'))); + + $browser->get('http://site.with.nested.frames/'); + $this->assertEqual($browser->getContent(), 'Page onePage twoPage three'); + + $this->assertTrue($browser->setFrameFocus('inner')); + $this->assertEqual($browser->getFrameFocus(), array('inner')); + $this->assertTrue($browser->setFrameFocus('one')); + $this->assertEqual($browser->getFrameFocus(), array('inner', 'one')); + $this->assertEqual($browser->getContent(), 'Page one'); + + $this->assertTrue($browser->setFrameFocus('two')); + $this->assertEqual($browser->getFrameFocus(), array('inner', 'two')); + $this->assertEqual($browser->getContent(), 'Page two'); + + $browser->clearFrameFocus(); + $this->assertTrue($browser->setFrameFocus('three')); + $this->assertEqual($browser->getFrameFocus(), array('three')); + $this->assertEqual($browser->getContent(), 'Page three'); + + $this->assertTrue($browser->setFrameFocus('inner')); + $this->assertEqual($browser->getContent(), 'Page onePage two'); + } + + function testCanNavigateToNestedFrameByIndex() { + $inner = '' . + '' . + '' . + ''; + $outer = '' . + '' . + '' . + ''; + $browser = &$this->createBrowser($this->createUserAgent(array( + 'http://site.with.nested.frames/' => $outer, + 'http://site.with.nested.frames/inner.html' => $inner, + 'http://site.with.nested.frames/one.html' => 'Page one', + 'http://site.with.nested.frames/two.html' => 'Page two', + 'http://site.with.nested.frames/three.html' => 'Page three'))); + + $browser->get('http://site.with.nested.frames/'); + $this->assertEqual($browser->getContent(), 'Page onePage twoPage three'); + + $this->assertTrue($browser->setFrameFocusByIndex(1)); + $this->assertEqual($browser->getFrameFocus(), array(1)); + $this->assertTrue($browser->setFrameFocusByIndex(1)); + $this->assertEqual($browser->getFrameFocus(), array(1, 1)); + $this->assertEqual($browser->getContent(), 'Page one'); + + $this->assertTrue($browser->setFrameFocusByIndex(2)); + $this->assertEqual($browser->getFrameFocus(), array(1, 2)); + $this->assertEqual($browser->getContent(), 'Page two'); + + $browser->clearFrameFocus(); + $this->assertTrue($browser->setFrameFocusByIndex(2)); + $this->assertEqual($browser->getFrameFocus(), array(2)); + $this->assertEqual($browser->getContent(), 'Page three'); + + $this->assertTrue($browser->setFrameFocusByIndex(1)); + $this->assertEqual($browser->getContent(), 'Page onePage two'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/collector_test.php b/tests/simpletest/test/collector_test.php new file mode 100644 index 000000000..803974c73 --- /dev/null +++ b/tests/simpletest/test/collector_test.php @@ -0,0 +1,51 @@ +EqualExpectation(str_replace("\\", '/', $value), $message); + } + + function test($compare) { + return parent::test(str_replace("\\", '/', $compare)); + } +} + +class TestOfCollector extends UnitTestCase { + + function testCollectionIsAddedToGroup() { + $suite = &new MockTestSuite(); + $suite->expectMinimumCallCount('addTestFile', 2); + $suite->expectArguments( + 'addTestFile', + array(new PatternExpectation('/collectable\\.(1|2)$/'))); + $collector = &new SimpleCollector(); + $collector->collect($suite, dirname(__FILE__) . '/support/collector/'); + } +} + +class TestOfPatternCollector extends UnitTestCase { + + function testAddingEverythingToGroup() { + $suite = &new MockTestSuite(); + $suite->expectCallCount('addTestFile', 2); + $suite->expectArguments( + 'addTestFile', + array(new PatternExpectation('/collectable\\.(1|2)$/'))); + $collector = &new SimplePatternCollector('/.*/'); + $collector->collect($suite, dirname(__FILE__) . '/support/collector/'); + } + + function testOnlyMatchedFilesAreAddedToGroup() { + $suite = &new MockTestSuite(); + $suite->expectOnce('addTestFile', array(new PathEqualExpectation( + dirname(__FILE__) . '/support/collector/collectable.1'))); + $collector = &new SimplePatternCollector('/1$/'); + $collector->collect($suite, dirname(__FILE__) . '/support/collector/'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/command_line_test.php b/tests/simpletest/test/command_line_test.php new file mode 100644 index 000000000..5baabff33 --- /dev/null +++ b/tests/simpletest/test/command_line_test.php @@ -0,0 +1,40 @@ +assertIdentical($parser->getTest(), ''); + $this->assertIdentical($parser->getTestCase(), ''); + } + + function testNotXmlByDefault() { + $parser = new SimpleCommandLineParser(array()); + $this->assertFalse($parser->isXml()); + } + + function testCanDetectRequestForXml() { + $parser = new SimpleCommandLineParser(array('--xml')); + $this->assertTrue($parser->isXml()); + } + + function testCanReadAssignmentSyntax() { + $parser = new SimpleCommandLineParser(array('--test=myTest')); + $this->assertEqual($parser->getTest(), 'myTest'); + } + + function testCanReadFollowOnSyntax() { + $parser = new SimpleCommandLineParser(array('--test', 'myTest')); + $this->assertEqual($parser->getTest(), 'myTest'); + } + + function testCanReadShortForms() { + $parser = new SimpleCommandLineParser(array('-t', 'myTest', '-c', 'MyClass', '-x')); + $this->assertEqual($parser->getTest(), 'myTest'); + $this->assertEqual($parser->getTestCase(), 'MyClass'); + $this->assertTrue($parser->isXml()); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/compatibility_test.php b/tests/simpletest/test/compatibility_test.php new file mode 100644 index 000000000..ea48f8396 --- /dev/null +++ b/tests/simpletest/test/compatibility_test.php @@ -0,0 +1,97 @@ += 0) { + eval('interface ComparisonInterface { }'); + eval('class ComparisonClassWithInterface implements ComparisonInterface { }'); +} + +class TestOfCompatibility extends UnitTestCase { + + function testIsA() { + $this->assertTrue(SimpleTestCompatibility::isA( + new ComparisonClass(), + 'ComparisonClass')); + $this->assertFalse(SimpleTestCompatibility::isA( + new ComparisonClass(), + 'ComparisonSubclass')); + $this->assertTrue(SimpleTestCompatibility::isA( + new ComparisonSubclass(), + 'ComparisonClass')); + } + + function testIdentityOfNumericStrings() { + $numericString1 = "123"; + $numericString2 = "00123"; + $this->assertNotIdentical($numericString1, $numericString2); + } + + function testIdentityOfObjects() { + $object1 = new ComparisonClass(); + $object2 = new ComparisonClass(); + $this->assertIdentical($object1, $object2); + } + + function testReferences () { + $thing = "Hello"; + $thing_reference = &$thing; + $thing_copy = $thing; + $this->assertTrue(SimpleTestCompatibility::isReference( + $thing, + $thing)); + $this->assertTrue(SimpleTestCompatibility::isReference( + $thing, + $thing_reference)); + $this->assertFalse(SimpleTestCompatibility::isReference( + $thing, + $thing_copy)); + } + + function testObjectReferences () { + $object = &new ComparisonClass(); + $object_reference = &$object; + $object_copy = new ComparisonClass(); + $object_assignment = $object; + $this->assertTrue(SimpleTestCompatibility::isReference( + $object, + $object)); + $this->assertTrue(SimpleTestCompatibility::isReference( + $object, + $object_reference)); + $this->assertFalse(SimpleTestCompatibility::isReference( + $object, + $object_copy)); + if (version_compare(phpversion(), '5', '>=')) { + $this->assertTrue(SimpleTestCompatibility::isReference( + $object, + $object_assignment)); + } else { + $this->assertFalse(SimpleTestCompatibility::isReference( + $object, + $object_assignment)); + } + } + + function testInteraceComparison() { + if (version_compare(phpversion(), '5', '<')) { + return; + } + + $object = new ComparisonClassWithInterface(); + $this->assertFalse(SimpleTestCompatibility::isA( + new ComparisonClass(), + 'ComparisonInterface')); + $this->assertTrue(SimpleTestCompatibility::isA( + new ComparisonClassWithInterface(), + 'ComparisonInterface')); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/cookies_test.php b/tests/simpletest/test/cookies_test.php new file mode 100644 index 000000000..0b49e43bf --- /dev/null +++ b/tests/simpletest/test/cookies_test.php @@ -0,0 +1,227 @@ +assertFalse($cookie->getValue()); + $this->assertEqual($cookie->getPath(), "/"); + $this->assertIdentical($cookie->getHost(), false); + $this->assertFalse($cookie->getExpiry()); + $this->assertFalse($cookie->isSecure()); + } + + function testCookieAccessors() { + $cookie = new SimpleCookie( + "name", + "value", + "/path", + "Mon, 18 Nov 2002 15:50:29 GMT", + true); + $this->assertEqual($cookie->getName(), "name"); + $this->assertEqual($cookie->getValue(), "value"); + $this->assertEqual($cookie->getPath(), "/path/"); + $this->assertEqual($cookie->getExpiry(), "Mon, 18 Nov 2002 15:50:29 GMT"); + $this->assertTrue($cookie->isSecure()); + } + + function testFullHostname() { + $cookie = new SimpleCookie("name"); + $this->assertTrue($cookie->setHost("host.name.here")); + $this->assertEqual($cookie->getHost(), "host.name.here"); + $this->assertTrue($cookie->setHost("host.com")); + $this->assertEqual($cookie->getHost(), "host.com"); + } + + function testHostTruncation() { + $cookie = new SimpleCookie("name"); + $cookie->setHost("this.host.name.here"); + $this->assertEqual($cookie->getHost(), "host.name.here"); + $cookie->setHost("this.host.com"); + $this->assertEqual($cookie->getHost(), "host.com"); + $this->assertTrue($cookie->setHost("dashes.in-host.com")); + $this->assertEqual($cookie->getHost(), "in-host.com"); + } + + function testBadHosts() { + $cookie = new SimpleCookie("name"); + $this->assertFalse($cookie->setHost("gibberish")); + $this->assertFalse($cookie->setHost("host.here")); + $this->assertFalse($cookie->setHost("host..com")); + $this->assertFalse($cookie->setHost("...")); + $this->assertFalse($cookie->setHost("host.com.")); + } + + function testHostValidity() { + $cookie = new SimpleCookie("name"); + $cookie->setHost("this.host.name.here"); + $this->assertTrue($cookie->isValidHost("host.name.here")); + $this->assertTrue($cookie->isValidHost("that.host.name.here")); + $this->assertFalse($cookie->isValidHost("bad.host")); + $this->assertFalse($cookie->isValidHost("nearly.name.here")); + } + + function testPathValidity() { + $cookie = new SimpleCookie("name", "value", "/path"); + $this->assertFalse($cookie->isValidPath("/")); + $this->assertTrue($cookie->isValidPath("/path/")); + $this->assertTrue($cookie->isValidPath("/path/more")); + } + + function testSessionExpiring() { + $cookie = new SimpleCookie("name", "value", "/path"); + $this->assertTrue($cookie->isExpired(0)); + } + + function testTimestampExpiry() { + $cookie = new SimpleCookie("name", "value", "/path", 456); + $this->assertFalse($cookie->isExpired(0)); + $this->assertTrue($cookie->isExpired(457)); + $this->assertFalse($cookie->isExpired(455)); + } + + function testDateExpiry() { + $cookie = new SimpleCookie( + "name", + "value", + "/path", + "Mon, 18 Nov 2002 15:50:29 GMT"); + $this->assertTrue($cookie->isExpired("Mon, 18 Nov 2002 15:50:30 GMT")); + $this->assertFalse($cookie->isExpired("Mon, 18 Nov 2002 15:50:28 GMT")); + } + + function testAging() { + $cookie = new SimpleCookie("name", "value", "/path", 200); + $cookie->agePrematurely(199); + $this->assertFalse($cookie->isExpired(0)); + $cookie->agePrematurely(2); + $this->assertTrue($cookie->isExpired(0)); + } +} + +class TestOfCookieJar extends UnitTestCase { + + function testAddCookie() { + $jar = new SimpleCookieJar(); + $jar->setCookie("a", "A"); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A')); + } + + function testHostFilter() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A', 'my-host.com'); + $jar->setCookie('b', 'B', 'another-host.com'); + $jar->setCookie('c', 'C'); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('my-host.com')), + array('a=A', 'c=C')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('another-host.com')), + array('b=B', 'c=C')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('www.another-host.com')), + array('b=B', 'c=C')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('new-host.org')), + array('c=C')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('/')), + array('a=A', 'b=B', 'c=C')); + } + + function testPathFilter() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A', false, '/path/'); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array()); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/elsewhere')), array()); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/')), array('a=A')); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path')), array('a=A')); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/pa')), array()); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/here')), array('a=A')); + } + + function testPathFilterDeeply() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A', false, '/path/more_path/'); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/')), array()); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path')), array()); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/pa')), array()); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/more_path/')), array('a=A')); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/more_path/and_more')), array('a=A')); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/not_here/')), array()); + } + + function testMultipleCookieWithDifferentPathsButSameName() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'abc', false, '/'); + $jar->setCookie('a', '123', false, '/path/here/'); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('/')), + array('a=abc')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('my-host.com/')), + array('a=abc')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('my-host.com/path/')), + array('a=abc')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('my-host.com/path/here')), + array('a=abc', 'a=123')); + $this->assertEqual( + $jar->selectAsPairs(new SimpleUrl('my-host.com/path/here/there')), + array('a=abc', 'a=123')); + } + + function testOverwrite() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'abc', false, '/'); + $jar->setCookie('a', 'cde', false, '/'); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=cde')); + } + + function testClearSessionCookies() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A', false, '/'); + $jar->restartSession(); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array()); + } + + function testExpiryFilterByDate() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A', false, '/', 'Wed, 25-Dec-02 04:24:20 GMT'); + $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT"); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A')); + $jar->restartSession("Wed, 25-Dec-02 04:24:21 GMT"); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array()); + } + + function testExpiryFilterByAgeing() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A', false, '/', 'Wed, 25-Dec-02 04:24:20 GMT'); + $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT"); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A')); + $jar->agePrematurely(2); + $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT"); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array()); + } + + function testCookieClearing() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'abc', false, '/'); + $jar->setCookie('a', '', false, '/'); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=')); + } + + function testCookieClearByLoweringDate() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'abc', false, '/', 'Wed, 25-Dec-02 04:24:21 GMT'); + $jar->setCookie('a', 'def', false, '/', 'Wed, 25-Dec-02 04:24:19 GMT'); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=def')); + $jar->restartSession('Wed, 25-Dec-02 04:24:20 GMT'); + $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array()); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/detached_test.php b/tests/simpletest/test/detached_test.php new file mode 100644 index 000000000..06db8280b --- /dev/null +++ b/tests/simpletest/test/detached_test.php @@ -0,0 +1,15 @@ +addTestCase(new DetachedTestCase($command)); +if (SimpleReporter::inCli()) { + exit ($test->run(new TextReporter()) ? 0 : 1); +} +$test->run(new HtmlReporter()); +?> \ No newline at end of file diff --git a/tests/simpletest/test/dumper_test.php b/tests/simpletest/test/dumper_test.php new file mode 100644 index 000000000..789047de9 --- /dev/null +++ b/tests/simpletest/test/dumper_test.php @@ -0,0 +1,88 @@ +assertEqual( + $dumper->clipString("Hello", 6), + "Hello", + "Hello, 6->%s"); + $this->assertEqual( + $dumper->clipString("Hello", 5), + "Hello", + "Hello, 5->%s"); + $this->assertEqual( + $dumper->clipString("Hello world", 3), + "Hel...", + "Hello world, 3->%s"); + $this->assertEqual( + $dumper->clipString("Hello world", 6, 3), + "Hello ...", + "Hello world, 6, 3->%s"); + $this->assertEqual( + $dumper->clipString("Hello world", 3, 6), + "...o w...", + "Hello world, 3, 6->%s"); + $this->assertEqual( + $dumper->clipString("Hello world", 4, 11), + "...orld", + "Hello world, 4, 11->%s"); + $this->assertEqual( + $dumper->clipString("Hello world", 4, 12), + "...orld", + "Hello world, 4, 12->%s"); + } + + function testDescribeNull() { + $dumper = new SimpleDumper(); + $this->assertPattern('/null/i', $dumper->describeValue(null)); + } + + function testDescribeBoolean() { + $dumper = new SimpleDumper(); + $this->assertPattern('/boolean/i', $dumper->describeValue(true)); + $this->assertPattern('/true/i', $dumper->describeValue(true)); + $this->assertPattern('/false/i', $dumper->describeValue(false)); + } + + function testDescribeString() { + $dumper = new SimpleDumper(); + $this->assertPattern('/string/i', $dumper->describeValue('Hello')); + $this->assertPattern('/Hello/', $dumper->describeValue('Hello')); + } + + function testDescribeInteger() { + $dumper = new SimpleDumper(); + $this->assertPattern('/integer/i', $dumper->describeValue(35)); + $this->assertPattern('/35/', $dumper->describeValue(35)); + } + + function testDescribeFloat() { + $dumper = new SimpleDumper(); + $this->assertPattern('/float/i', $dumper->describeValue(0.99)); + $this->assertPattern('/0\.99/', $dumper->describeValue(0.99)); + } + + function testDescribeArray() { + $dumper = new SimpleDumper(); + $this->assertPattern('/array/i', $dumper->describeValue(array(1, 4))); + $this->assertPattern('/2/i', $dumper->describeValue(array(1, 4))); + } + + function testDescribeObject() { + $dumper = new SimpleDumper(); + $this->assertPattern( + '/object/i', + $dumper->describeValue(new DumperDummy())); + $this->assertPattern( + '/DumperDummy/i', + $dumper->describeValue(new DumperDummy())); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/eclipse_test.php b/tests/simpletest/test/eclipse_test.php new file mode 100644 index 000000000..0f1bf4bd4 --- /dev/null +++ b/tests/simpletest/test/eclipse_test.php @@ -0,0 +1,32 @@ +expectOnce('write',array($expected)); + $listener->setReturnValue('write',-1); + + $pathparts = pathinfo($fullpath); + $filename = $pathparts['basename']; + $test= &new TestSuite($filename); + $test->addTestFile($fullpath); + $test->run(new EclipseReporter(&$listener)); + $this->assertEqual($expected,$listener->output); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/encoding_test.php b/tests/simpletest/test/encoding_test.php new file mode 100644 index 000000000..95031fb0f --- /dev/null +++ b/tests/simpletest/test/encoding_test.php @@ -0,0 +1,213 @@ +assertEqual($pair->asRequest(), 'a=A'); + } + + function testMimeEncodedAsHeadersAndContent() { + $pair = new SimpleEncodedPair('a', 'A'); + $this->assertEqual( + $pair->asMime(), + "Content-Disposition: form-data; name=\"a\"\r\n\r\nA"); + } + + function testAttachmentEncodedAsHeadersWithDispositionAndContent() { + $part = new SimpleAttachment('a', 'A', 'aaa.txt'); + $this->assertEqual( + $part->asMime(), + "Content-Disposition: form-data; name=\"a\"; filename=\"aaa.txt\"\r\n" . + "Content-Type: text/plain\r\n\r\nA"); + } +} + +class TestOfEncoding extends UnitTestCase { + var $_content_so_far; + + function write($content) { + $this->_content_so_far .= $content; + } + + function clear() { + $this->_content_so_far = ''; + } + + function assertWritten($encoding, $content, $message = '%s') { + $this->clear(); + $encoding->writeTo($this); + $this->assertIdentical($this->_content_so_far, $content, $message); + } + + function testGetEmpty() { + $encoding = &new SimpleGetEncoding(); + $this->assertIdentical($encoding->getValue('a'), false); + $this->assertIdentical($encoding->asUrlRequest(), ''); + } + + function testPostEmpty() { + $encoding = &new SimplePostEncoding(); + $this->assertIdentical($encoding->getValue('a'), false); + $this->assertWritten($encoding, ''); + } + + function testPrefilled() { + $encoding = &new SimplePostEncoding(array('a' => 'aaa')); + $this->assertIdentical($encoding->getValue('a'), 'aaa'); + $this->assertWritten($encoding, 'a=aaa'); + } + + function testPrefilledWithTwoLevels() { + $query = array('a' => array('aa' => 'aaa')); + $encoding = &new SimplePostEncoding($query); + $this->assertTrue($encoding->hasMoreThanOneLevel($query)); + $this->assertEqual($encoding->rewriteArrayWithMultipleLevels($query), array('a[aa]' => 'aaa')); + $this->assertIdentical($encoding->getValue('a[aa]'), 'aaa'); + $this->assertWritten($encoding, 'a%5Baa%5D=aaa'); + } + + function testPrefilledWithThreeLevels() { + $query = array('a' => array('aa' => array('aaa' => 'aaaa'))); + $encoding = &new SimplePostEncoding($query); + $this->assertTrue($encoding->hasMoreThanOneLevel($query)); + $this->assertEqual($encoding->rewriteArrayWithMultipleLevels($query), array('a[aa][aaa]' => 'aaaa')); + $this->assertIdentical($encoding->getValue('a[aa][aaa]'), 'aaaa'); + $this->assertWritten($encoding, 'a%5Baa%5D%5Baaa%5D=aaaa'); + } + + function testPrefilledWithObject() { + $encoding = &new SimplePostEncoding(new SimpleEncoding(array('a' => 'aaa'))); + $this->assertIdentical($encoding->getValue('a'), 'aaa'); + $this->assertWritten($encoding, 'a=aaa'); + } + + function testMultiplePrefilled() { + $query = array('a' => array('a1', 'a2')); + $encoding = &new SimplePostEncoding($query); + $this->assertTrue($encoding->hasMoreThanOneLevel($query)); + $this->assertEqual($encoding->rewriteArrayWithMultipleLevels($query), array('a[0]' => 'a1', 'a[1]' => 'a2')); + $this->assertIdentical($encoding->getValue('a[0]'), 'a1'); + $this->assertIdentical($encoding->getValue('a[1]'), 'a2'); + $this->assertWritten($encoding, 'a%5B0%5D=a1&a%5B1%5D=a2'); + } + + function testSingleParameter() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', 'Hello'); + $this->assertEqual($encoding->getValue('a'), 'Hello'); + $this->assertWritten($encoding, 'a=Hello'); + } + + function testFalseParameter() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', false); + $this->assertEqual($encoding->getValue('a'), false); + $this->assertWritten($encoding, ''); + } + + function testUrlEncoding() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', 'Hello there!'); + $this->assertWritten($encoding, 'a=Hello+there%21'); + } + + function testUrlEncodingOfKey() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a!', 'Hello'); + $this->assertWritten($encoding, 'a%21=Hello'); + } + + function testMultipleParameter() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', 'Hello'); + $encoding->add('b', 'Goodbye'); + $this->assertWritten($encoding, 'a=Hello&b=Goodbye'); + } + + function testEmptyParameters() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', ''); + $encoding->add('b', ''); + $this->assertWritten($encoding, 'a=&b='); + } + + function testRepeatedParameter() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', 'Hello'); + $encoding->add('a', 'Goodbye'); + $this->assertIdentical($encoding->getValue('a'), array('Hello', 'Goodbye')); + $this->assertWritten($encoding, 'a=Hello&a=Goodbye'); + } + + function testAddingLists() { + $encoding = &new SimplePostEncoding(); + $encoding->add('a', array('Hello', 'Goodbye')); + $this->assertIdentical($encoding->getValue('a'), array('Hello', 'Goodbye')); + $this->assertWritten($encoding, 'a=Hello&a=Goodbye'); + } + + function testMergeInHash() { + $encoding = &new SimpleGetEncoding(array('a' => 'A1', 'b' => 'B')); + $encoding->merge(array('a' => 'A2')); + $this->assertIdentical($encoding->getValue('a'), array('A1', 'A2')); + $this->assertIdentical($encoding->getValue('b'), 'B'); + } + + function testMergeInObject() { + $encoding = &new SimpleGetEncoding(array('a' => 'A1', 'b' => 'B')); + $encoding->merge(new SimpleEncoding(array('a' => 'A2'))); + $this->assertIdentical($encoding->getValue('a'), array('A1', 'A2')); + $this->assertIdentical($encoding->getValue('b'), 'B'); + } + + function testPrefilledMultipart() { + $encoding = &new SimpleMultipartEncoding(array('a' => 'aaa'), 'boundary'); + $this->assertIdentical($encoding->getValue('a'), 'aaa'); + $this->assertwritten($encoding, + "--boundary\r\n" . + "Content-Disposition: form-data; name=\"a\"\r\n" . + "\r\n" . + "aaa\r\n" . + "--boundary--\r\n"); + } + + function testAttachment() { + $encoding = &new SimpleMultipartEncoding(array(), 'boundary'); + $encoding->attach('a', 'aaa', 'aaa.txt'); + $this->assertIdentical($encoding->getValue('a'), 'aaa.txt'); + $this->assertwritten($encoding, + "--boundary\r\n" . + "Content-Disposition: form-data; name=\"a\"; filename=\"aaa.txt\"\r\n" . + "Content-Type: text/plain\r\n" . + "\r\n" . + "aaa\r\n" . + "--boundary--\r\n"); + } +} + +class TestOfFormHeaders extends UnitTestCase { + + function testEmptyEncodingWritesZeroContentLength() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("Content-Length: 0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n")); + $encoding = &new SimplePostEncoding(); + $encoding->writeHeadersTo($socket); + } + + function testEmptyMultipartEncodingWritesEndBoundaryContentLength() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("Content-Length: 14\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Content-Type: multipart/form-data, boundary=boundary\r\n")); + $encoding = &new SimpleMultipartEncoding(array(), 'boundary'); + $encoding->writeHeadersTo($socket); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/errors_test.php b/tests/simpletest/test/errors_test.php new file mode 100644 index 000000000..7db8769a2 --- /dev/null +++ b/tests/simpletest/test/errors_test.php @@ -0,0 +1,300 @@ +get('SimpleErrorQueue'); + $queue->clear(); + } + + function tearDown() { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + $queue->clear(); + } + + function testOrder() { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + $queue->add(1024, 'Ouch', 'here.php', 100); + $queue->add(512, 'Yuk', 'there.php', 101); + $this->assertEqual( + $queue->extract(), + array(1024, 'Ouch', 'here.php', 100)); + $this->assertEqual( + $queue->extract(), + array(512, 'Yuk', 'there.php', 101)); + $this->assertFalse($queue->extract()); + } + + function testAssertNoErrorsGivesTrueWhenNoErrors() { + $test = &new MockSimpleTestCase(); + $test->expectOnce('assert', array( + new IdenticalExpectation(new TrueExpectation()), + true, + 'Should be no errors')); + $test->setReturnValue('assert', true); + $queue = &new SimpleErrorQueue(); + $queue->setTestCase($test); + $this->assertTrue($queue->assertNoErrors('%s')); + } + + function testAssertNoErrorsIssuesFailWhenErrors() { + $test = &new MockSimpleTestCase(); + $test->expectOnce('assert', array( + new IdenticalExpectation(new TrueExpectation()), + false, + 'Should be no errors')); + $test->setReturnValue('assert', false); + $queue = &new SimpleErrorQueue(); + $queue->setTestCase($test); + $queue->add(1024, 'Ouch', 'here.php', 100); + $this->assertFalse($queue->assertNoErrors('%s')); + } + + function testAssertErrorFailsWhenNoError() { + $test = &new MockSimpleTestCase(); + $test->expectOnce('fail', array('Expected error not found')); + $test->setReturnValue('assert', false); + $queue = &new SimpleErrorQueue(); + $queue->setTestCase($test); + $this->assertFalse($queue->assertError(false, '%s')); + } + + function testAssertErrorFailsWhenErrorDoesntMatchTheExpectation() { + $test = &new MockSimpleTestCase(); + $test->expectOnce('assert', array( + new IdenticalExpectation(new FailedExpectation()), + 'B', + 'Expected PHP error [B] severity [E_USER_NOTICE] in [b.php] line [100]')); + $test->setReturnValue('assert', false); + $queue = &new SimpleErrorQueue(); + $queue->setTestCase($test); + $queue->add(1024, 'B', 'b.php', 100); + $this->assertFalse($queue->assertError(new FailedExpectation(), '%s')); + } + + function testExpectationMatchCancelsIncomingError() { + $test = &new MockSimpleTestCase(); + $test->expectOnce('assert', array( + new IdenticalExpectation(new AnythingExpectation()), + 'B', + 'a message')); + $test->setReturnValue('assert', true); + $test->expectNever('error'); + $queue = &new SimpleErrorQueue(); + $queue->setTestCase($test); + $queue->expectError(new AnythingExpectation(), 'a message'); + $queue->add(1024, 'B', 'b.php', 100); + } +} + +class TestOfErrorTrap extends UnitTestCase { + var $_old; + + function setUp() { + $this->_old = error_reporting(E_ALL); + set_error_handler('SimpleTestErrorHandler'); + } + + function tearDown() { + restore_error_handler(); + error_reporting($this->_old); + } + + function testQueueStartsEmpty() { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + $this->assertFalse($queue->extract()); + } + + function testTrappedErrorPlacedInQueue() { + trigger_error('Ouch!'); + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + list($severity, $message, $file, $line) = $queue->extract(); + $this->assertEqual($message, 'Ouch!'); + $this->assertEqual($file, __FILE__); + $this->assertFalse($queue->extract()); + } + + function testErrorsAreSwallowedByMatchingExpectation() { + $this->expectError('Ouch!'); + trigger_error('Ouch!'); + } + + function testErrorsAreSwallowedInOrder() { + $this->expectError('a'); + $this->expectError('b'); + trigger_error('a'); + trigger_error('b'); + } + + function testAnyErrorCanBeSwallowed() { + $this->expectError(); + trigger_error('Ouch!'); + } + + function testErrorCanBeSwallowedByPatternMatching() { + $this->expectError(new PatternExpectation('/ouch/i')); + trigger_error('Ouch!'); + } + + function testErrorWithPercentsPassesWithNoSprintfError() { + $this->expectError("%"); + trigger_error('%'); + } +} + +class TestOfErrors extends UnitTestCase { + var $_old; + + function setUp() { + $this->_old = error_reporting(E_ALL); + } + + function tearDown() { + error_reporting($this->_old); + } + + function testDefaultWhenAllReported() { + error_reporting(E_ALL); + trigger_error('Ouch!'); + $this->assertError('Ouch!'); + } + + function testNoticeWhenReported() { + error_reporting(E_ALL); + trigger_error('Ouch!', E_USER_NOTICE); + $this->assertError('Ouch!'); + } + + function testWarningWhenReported() { + error_reporting(E_ALL); + trigger_error('Ouch!', E_USER_WARNING); + $this->assertError('Ouch!'); + } + + function testErrorWhenReported() { + error_reporting(E_ALL); + trigger_error('Ouch!', E_USER_ERROR); + $this->assertError('Ouch!'); + } + + function testNoNoticeWhenNotReported() { + error_reporting(0); + trigger_error('Ouch!', E_USER_NOTICE); + } + + function testNoWarningWhenNotReported() { + error_reporting(0); + trigger_error('Ouch!', E_USER_WARNING); + } + + function testNoticeSuppressedWhenReported() { + error_reporting(E_ALL); + @trigger_error('Ouch!', E_USER_NOTICE); + } + + function testWarningSuppressedWhenReported() { + error_reporting(E_ALL); + @trigger_error('Ouch!', E_USER_WARNING); + } + + function testErrorWithPercentsReportedWithNoSprintfError() { + trigger_error('%'); + $this->assertError('%'); + } +} + +class TestOfPHP52RecoverableErrors extends UnitTestCase { + function skip() { + $this->skipIf( + version_compare(phpversion(), '5.2', '<'), + 'E_RECOVERABLE_ERROR not tested for PHP below 5.2'); + } + + function testError() { + eval(' + class RecoverableErrorTestingStub { + function ouch(RecoverableErrorTestingStub $obj) { + } + } + '); + + $stub = new RecoverableErrorTestingStub(); + $this->expectError(new PatternExpectation('/must be an instance of RecoverableErrorTestingStub/i')); + $stub->ouch(new stdClass()); + } +} + +class TestOfErrorsExcludingPHP52AndAbove extends UnitTestCase { + function skip() { + $this->skipIf( + version_compare(phpversion(), '5.2', '>='), + 'E_USER_ERROR not tested for PHP 5.2 and above'); + } + + function testNoErrorWhenNotReported() { + error_reporting(0); + trigger_error('Ouch!', E_USER_ERROR); + } + + function testErrorSuppressedWhenReported() { + error_reporting(E_ALL); + @trigger_error('Ouch!', E_USER_ERROR); + } +} + +SimpleTest::ignore('TestOfNotEnoughErrors'); +/** + * This test is ignored as it is used by {@link TestRunnerForLeftOverAndNotEnoughErrors} + * to verify that it fails as expected. + * + * @ignore + */ +class TestOfNotEnoughErrors extends UnitTestCase { + function testExpectTwoErrorsThrowOne() { + $this->expectError('Error 1'); + trigger_error('Error 1'); + $this->expectError('Error 2'); + } +} + +SimpleTest::ignore('TestOfLeftOverErrors'); +/** + * This test is ignored as it is used by {@link TestRunnerForLeftOverAndNotEnoughErrors} + * to verify that it fails as expected. + * + * @ignore + */ +class TestOfLeftOverErrors extends UnitTestCase { + function testExpectOneErrorGetTwo() { + $this->expectError('Error 1'); + trigger_error('Error 1'); + trigger_error('Error 2'); + } +} + +class TestRunnerForLeftOverAndNotEnoughErrors extends UnitTestCase { + function testRunLeftOverErrorsTestCase() { + $test = new TestOfLeftOverErrors(); + $this->assertFalse($test->run(new SimpleReporter())); + } + + function testRunNotEnoughErrors() { + $test = new TestOfNotEnoughErrors(); + $this->assertFalse($test->run(new SimpleReporter())); + } +} + +// TODO: Add stacked error handler test +?> \ No newline at end of file diff --git a/tests/simpletest/test/exceptions_test.php b/tests/simpletest/test/exceptions_test.php new file mode 100644 index 000000000..9cc35c590 --- /dev/null +++ b/tests/simpletest/test/exceptions_test.php @@ -0,0 +1,153 @@ +assertTrue($expectation->test(new MyTestException())); + $this->assertTrue($expectation->test(new HigherTestException())); + $this->assertFalse($expectation->test(new OtherTestException())); + } + + function testMatchesClassAndMessageWhenExceptionExpected() { + $expectation = new ExceptionExpectation(new MyTestException('Hello')); + $this->assertTrue($expectation->test(new MyTestException('Hello'))); + $this->assertFalse($expectation->test(new HigherTestException('Hello'))); + $this->assertFalse($expectation->test(new OtherTestException('Hello'))); + $this->assertFalse($expectation->test(new MyTestException('Goodbye'))); + $this->assertFalse($expectation->test(new MyTestException())); + } + + function testMessagelessExceptionMatchesOnlyOnClass() { + $expectation = new ExceptionExpectation(new MyTestException()); + $this->assertTrue($expectation->test(new MyTestException())); + $this->assertFalse($expectation->test(new HigherTestException())); + } +} + +class TestOfExceptionTrap extends UnitTestCase { + + function testNoExceptionsInQueueMeansNoTestMessages() { + $test = new MockSimpleTestCase(); + $test->expectNever('assert'); + $queue = new SimpleExceptionTrap(); + $this->assertFalse($queue->isExpected($test, new Exception())); + } + + function testMatchingExceptionGivesTrue() { + $expectation = new MockSimpleExpectation(); + $expectation->setReturnValue('test', true); + $test = new MockSimpleTestCase(); + $test->setReturnValue('assert', true); + $queue = new SimpleExceptionTrap(); + $queue->expectException($expectation, 'message'); + $this->assertTrue($queue->isExpected($test, new Exception())); + } + + function testMatchingExceptionTriggersAssertion() { + $test = new MockSimpleTestCase(); + $test->expectOnce('assert', array( + '*', + new ExceptionExpectation(new Exception()), + 'message')); + $queue = new SimpleExceptionTrap(); + $queue->expectException(new ExceptionExpectation(new Exception()), 'message'); + $queue->isExpected($test, new Exception()); + } +} + +class TestOfCatchingExceptions extends UnitTestCase { + + function testCanCatchAnyExpectedException() { + $this->expectException(); + throw new Exception(); + } + + function testCanMatchExceptionByClass() { + $this->expectException('MyTestException'); + throw new HigherTestException(); + } + + function testCanMatchExceptionExactly() { + $this->expectException(new Exception('Ouch')); + throw new Exception('Ouch'); + } + + function testLastListedExceptionIsTheOneThatCounts() { + $this->expectException('OtherTestException'); + $this->expectException('MyTestException'); + throw new HigherTestException(); + } +} + +class TestOfCallingTearDownAfterExceptions extends UnitTestCase { + private $debri = 0; + + function tearDown() { + $this->debri--; + } + + function testLeaveSomeDebri() { + $this->debri++; + $this->expectException(); + throw new Exception(__FUNCTION__); + } + + function testDebriWasRemovedOnce() { + $this->assertEqual($this->debri, 0); + } +} + +class TestOfExceptionThrownInSetUpDoesNotRunTestBody extends UnitTestCase { + + function setUp() { + $this->expectException(); + throw new Exception(); + } + + function testShouldNotBeRun() { + $this->fail('This test body should not be run'); + } + + function testShouldNotBeRunEither() { + $this->fail('This test body should not be run either'); + } +} + +class TestOfExpectExceptionWithSetUp extends UnitTestCase { + + function setUp() { + $this->expectException(); + } + + function testThisExceptionShouldBeCaught() { + throw new Exception(); + } + + function testJustThrowingMyTestException() { + throw new MyTestException(); + } +} + +class TestOfThrowingExceptionsInTearDown extends UnitTestCase { + + function tearDown() { + throw new Exception(); + } + + function testDoesntFatal() { + $this->expectException(); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/expectation_test.php b/tests/simpletest/test/expectation_test.php new file mode 100644 index 000000000..8f4fc3878 --- /dev/null +++ b/tests/simpletest/test/expectation_test.php @@ -0,0 +1,245 @@ +assertTrue($is_true->test(true)); + $this->assertFalse($is_true->test(false)); + } + + function testStringMatch() { + $hello = &new EqualExpectation("Hello"); + $this->assertTrue($hello->test("Hello")); + $this->assertFalse($hello->test("Goodbye")); + } + + function testInteger() { + $fifteen = &new EqualExpectation(15); + $this->assertTrue($fifteen->test(15)); + $this->assertFalse($fifteen->test(14)); + } + + function testFloat() { + $pi = &new EqualExpectation(3.14); + $this->assertTrue($pi->test(3.14)); + $this->assertFalse($pi->test(3.15)); + } + + function testArray() { + $colours = &new EqualExpectation(array("r", "g", "b")); + $this->assertTrue($colours->test(array("r", "g", "b"))); + $this->assertFalse($colours->test(array("g", "b", "r"))); + } + + function testHash() { + $is_blue = &new EqualExpectation(array("r" => 0, "g" => 0, "b" => 255)); + $this->assertTrue($is_blue->test(array("r" => 0, "g" => 0, "b" => 255))); + $this->assertFalse($is_blue->test(array("r" => 0, "g" => 255, "b" => 0))); + } + + function testHashWithOutOfOrderKeysShouldStillMatch() { + $any_order = &new EqualExpectation(array('a' => 1, 'b' => 2)); + $this->assertTrue($any_order->test(array('b' => 2, 'a' => 1))); + } +} + +class TestOfWithin extends UnitTestCase { + + function testWithinFloatingPointMargin() { + $within = new WithinMarginExpectation(1.0, 0.2); + $this->assertFalse($within->test(0.7)); + $this->assertTrue($within->test(0.8)); + $this->assertTrue($within->test(0.9)); + $this->assertTrue($within->test(1.1)); + $this->assertTrue($within->test(1.2)); + $this->assertFalse($within->test(1.3)); + } + + function testOutsideFloatingPointMargin() { + $within = new OutsideMarginExpectation(1.0, 0.2); + $this->assertTrue($within->test(0.7)); + $this->assertFalse($within->test(0.8)); + $this->assertFalse($within->test(1.2)); + $this->assertTrue($within->test(1.3)); + } +} + +class TestOfInequality extends UnitTestCase { + + function testStringMismatch() { + $not_hello = &new NotEqualExpectation("Hello"); + $this->assertTrue($not_hello->test("Goodbye")); + $this->assertFalse($not_hello->test("Hello")); + } +} + +class RecursiveNasty { + var $_me; + + function RecursiveNasty() { + $this->_me = $this; + } +} + +class TestOfIdentity extends UnitTestCase { + + function testType() { + $string = &new IdenticalExpectation("37"); + $this->assertTrue($string->test("37")); + $this->assertFalse($string->test(37)); + $this->assertFalse($string->test("38")); + } + + function _testNastyPhp5Bug() { + $this->assertFalse(new RecursiveNasty() != new RecursiveNasty()); + } + + function _testReallyHorribleRecursiveStructure() { + $hopeful = &new IdenticalExpectation(new RecursiveNasty()); + $this->assertTrue($hopeful->test(new RecursiveNasty())); + } +} + +class DummyReferencedObject{} + +class TestOfReference extends UnitTestCase { + + function testReference() { + $foo = "foo"; + $ref =& $foo; + $not_ref = $foo; + $bar = "bar"; + + $expect = &new ReferenceExpectation($foo); + $this->assertTrue($expect->test($ref)); + $this->assertFalse($expect->test($not_ref)); + $this->assertFalse($expect->test($bar)); + } + + function testObjectsReferencesDualityForPhp5AndPhp4() { + $dummy = new DummyReferencedObject(); + $ref =& $dummy; + $not_ref = $dummy; + + $hopeful = &new ReferenceExpectation($dummy); + $this->assertTrue($hopeful->test($ref)); + + if (version_compare(phpversion(), '5') >= 0) { + $this->assertTrue($hopeful->test($not_ref)); + } else { + $this->assertFalse($hopeful->test($not_ref)); + } + } + + function testReallyHorribleRecursiveStructure() { + $nasty = new RecursiveNasty(); + $ref =& $nasty; + $hopeful = &new ReferenceExpectation($nasty); + $this->assertTrue($hopeful->test($ref)); + } +} + +class TestOfNonIdentity extends UnitTestCase { + + function testType() { + $string = &new NotIdenticalExpectation("37"); + $this->assertTrue($string->test("38")); + $this->assertTrue($string->test(37)); + $this->assertFalse($string->test("37")); + } +} + +class TestOfPatterns extends UnitTestCase { + + function testWanted() { + $pattern = &new PatternExpectation('/hello/i'); + $this->assertTrue($pattern->test("Hello world")); + $this->assertFalse($pattern->test("Goodbye world")); + } + + function testUnwanted() { + $pattern = &new NoPatternExpectation('/hello/i'); + $this->assertFalse($pattern->test("Hello world")); + $this->assertTrue($pattern->test("Goodbye world")); + } +} + +class ExpectedMethodTarget { + function hasThisMethod() {} +} + +class TestOfMethodExistence extends UnitTestCase { + + function testHasMethod() { + $instance = &new ExpectedMethodTarget(); + $expectation = &new MethodExistsExpectation('hasThisMethod'); + $this->assertTrue($expectation->test($instance)); + $expectation = &new MethodExistsExpectation('doesNotHaveThisMethod'); + $this->assertFalse($expectation->test($instance)); + } +} + +class TestOfIsA extends UnitTestCase { + + function testString() { + $expectation = &new IsAExpectation('string'); + $this->assertTrue($expectation->test('Hello')); + $this->assertFalse($expectation->test(5)); + } + + function testBoolean() { + $expectation = &new IsAExpectation('boolean'); + $this->assertTrue($expectation->test(true)); + $this->assertFalse($expectation->test(1)); + } + + function testBool() { + $expectation = &new IsAExpectation('bool'); + $this->assertTrue($expectation->test(true)); + $this->assertFalse($expectation->test(1)); + } + + function testDouble() { + $expectation = &new IsAExpectation('double'); + $this->assertTrue($expectation->test(5.0)); + $this->assertFalse($expectation->test(5)); + } + + function testFloat() { + $expectation = &new IsAExpectation('float'); + $this->assertTrue($expectation->test(5.0)); + $this->assertFalse($expectation->test(5)); + } + + function testReal() { + $expectation = &new IsAExpectation('real'); + $this->assertTrue($expectation->test(5.0)); + $this->assertFalse($expectation->test(5)); + } + + function testInteger() { + $expectation = &new IsAExpectation('integer'); + $this->assertTrue($expectation->test(5)); + $this->assertFalse($expectation->test(5.0)); + } + + function testInt() { + $expectation = &new IsAExpectation('int'); + $this->assertTrue($expectation->test(5)); + $this->assertFalse($expectation->test(5.0)); + } +} + +class TestOfNotA extends UnitTestCase { + + function testString() { + $expectation = &new NotAExpectation('string'); + $this->assertFalse($expectation->test('Hello')); + $this->assertTrue($expectation->test(5)); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/form_test.php b/tests/simpletest/test/form_test.php new file mode 100644 index 000000000..bdc6f67d2 --- /dev/null +++ b/tests/simpletest/test/form_test.php @@ -0,0 +1,323 @@ +setReturnValue('getUrl', new SimpleUrl($url)); + $page->setReturnValue('expandUrl', new SimpleUrl($url)); + return $page; + } + + function testFormAttributes() { + $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php', 'id' => '33')); + $form = &new SimpleForm($tag, $this->page('http://host/a/index.html')); + $this->assertEqual($form->getMethod(), 'get'); + $this->assertIdentical($form->getId(), '33'); + $this->assertNull($form->getValue(new SimpleByName('a'))); + } + + function testAction() { + $page = &new MockSimplePage(); + $page->expectOnce('expandUrl', array(new SimpleUrl('here.php'))); + $page->setReturnValue('expandUrl', new SimpleUrl('http://host/here.php')); + $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php')); + $form = &new SimpleForm($tag, $page); + $this->assertEqual($form->getAction(), new SimpleUrl('http://host/here.php')); + } + + function testEmptyAction() { + $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => '', 'id' => '33')); + $form = &new SimpleForm($tag, $this->page('http://host/a/index.html')); + $this->assertEqual( + $form->getAction(), + new SimpleUrl('http://host/a/index.html')); + } + + function testMissingAction() { + $tag = &new SimpleFormTag(array('method' => 'GET')); + $form = &new SimpleForm($tag, $this->page('http://host/a/index.html')); + $this->assertEqual( + $form->getAction(), + new SimpleUrl('http://host/a/index.html')); + } + + function testRootAction() { + $page = &new MockSimplePage(); + $page->expectOnce('expandUrl', array(new SimpleUrl('/'))); + $page->setReturnValue('expandUrl', new SimpleUrl('http://host/')); + $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => '/')); + $form = &new SimpleForm($tag, $page); + $this->assertEqual( + $form->getAction(), + new SimpleUrl('http://host/')); + } + + function testDefaultFrameTargetOnForm() { + $page = &new MockSimplePage(); + $page->expectOnce('expandUrl', array(new SimpleUrl('here.php'))); + $page->setReturnValue('expandUrl', new SimpleUrl('http://host/here.php')); + $tag = &new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php')); + $form = &new SimpleForm($tag, $page); + $form->setDefaultTarget('frame'); + $expected = new SimpleUrl('http://host/here.php'); + $expected->setTarget('frame'); + $this->assertEqual($form->getAction(), $expected); + } + + function testTextWidget() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleTextTag( + array('name' => 'me', 'type' => 'text', 'value' => 'Myself'))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'Myself'); + $this->assertTrue($form->setField(new SimpleByName('me'), 'Not me')); + $this->assertFalse($form->setField(new SimpleByName('not_present'), 'Not me')); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'Not me'); + $this->assertNull($form->getValue(new SimpleByName('not_present'))); + } + + function testTextWidgetById() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleTextTag( + array('name' => 'me', 'type' => 'text', 'value' => 'Myself', 'id' => 50))); + $this->assertIdentical($form->getValue(new SimpleById(50)), 'Myself'); + $this->assertTrue($form->setField(new SimpleById(50), 'Not me')); + $this->assertIdentical($form->getValue(new SimpleById(50)), 'Not me'); + } + + function testTextWidgetByLabel() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $widget = &new SimpleTextTag(array('name' => 'me', 'type' => 'text', 'value' => 'a')); + $form->addWidget($widget); + $widget->setLabel('thing'); + $this->assertIdentical($form->getValue(new SimpleByLabel('thing')), 'a'); + $this->assertTrue($form->setField(new SimpleByLabel('thing'), 'b')); + $this->assertIdentical($form->getValue(new SimpleByLabel('thing')), 'b'); + } + + function testSubmitEmpty() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $this->assertIdentical($form->submit(), new SimpleGetEncoding()); + } + + function testSubmitButton() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host')); + $form->addWidget(new SimpleSubmitTag( + array('type' => 'submit', 'name' => 'go', 'value' => 'Go!', 'id' => '9'))); + $this->assertTrue($form->hasSubmit(new SimpleByName('go'))); + $this->assertEqual($form->getValue(new SimpleByName('go')), 'Go!'); + $this->assertEqual($form->getValue(new SimpleById(9)), 'Go!'); + $this->assertEqual( + $form->submitButton(new SimpleByName('go')), + new SimpleGetEncoding(array('go' => 'Go!'))); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Go!')), + new SimpleGetEncoding(array('go' => 'Go!'))); + $this->assertEqual( + $form->submitButton(new SimpleById(9)), + new SimpleGetEncoding(array('go' => 'Go!'))); + } + + function testSubmitWithAdditionalParameters() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host')); + $form->addWidget(new SimpleSubmitTag( + array('type' => 'submit', 'name' => 'go', 'value' => 'Go!'))); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Go!'), array('a' => 'A')), + new SimpleGetEncoding(array('go' => 'Go!', 'a' => 'A'))); + } + + function testSubmitButtonWithLabelOfSubmit() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host')); + $form->addWidget(new SimpleSubmitTag( + array('type' => 'submit', 'name' => 'test', 'value' => 'Submit'))); + $this->assertEqual( + $form->submitButton(new SimpleByName('test')), + new SimpleGetEncoding(array('test' => 'Submit'))); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Submit')), + new SimpleGetEncoding(array('test' => 'Submit'))); + } + + function testSubmitButtonWithWhitespacePaddedLabelOfSubmit() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host')); + $form->addWidget(new SimpleSubmitTag( + array('type' => 'submit', 'name' => 'test', 'value' => ' Submit '))); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Submit')), + new SimpleGetEncoding(array('test' => ' Submit '))); + } + + function testImageSubmitButton() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleImageSubmitTag(array( + 'type' => 'image', + 'src' => 'source.jpg', + 'name' => 'go', + 'alt' => 'Go!', + 'id' => '9'))); + $this->assertTrue($form->hasImage(new SimpleByLabel('Go!'))); + $this->assertEqual( + $form->submitImage(new SimpleByLabel('Go!'), 100, 101), + new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101))); + $this->assertTrue($form->hasImage(new SimpleByName('go'))); + $this->assertEqual( + $form->submitImage(new SimpleByName('go'), 100, 101), + new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101))); + $this->assertTrue($form->hasImage(new SimpleById(9))); + $this->assertEqual( + $form->submitImage(new SimpleById(9), 100, 101), + new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101))); + } + + function testImageSubmitButtonWithAdditionalData() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleImageSubmitTag(array( + 'type' => 'image', + 'src' => 'source.jpg', + 'name' => 'go', + 'alt' => 'Go!'))); + $this->assertEqual( + $form->submitImage(new SimpleByLabel('Go!'), 100, 101, array('a' => 'A')), + new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101, 'a' => 'A'))); + } + + function testButtonTag() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('http://host')); + $widget = &new SimpleButtonTag( + array('type' => 'submit', 'name' => 'go', 'value' => 'Go', 'id' => '9')); + $widget->addContent('Go!'); + $form->addWidget($widget); + $this->assertTrue($form->hasSubmit(new SimpleByName('go'))); + $this->assertTrue($form->hasSubmit(new SimpleByLabel('Go!'))); + $this->assertEqual( + $form->submitButton(new SimpleByName('go')), + new SimpleGetEncoding(array('go' => 'Go'))); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Go!')), + new SimpleGetEncoding(array('go' => 'Go'))); + $this->assertEqual( + $form->submitButton(new SimpleById(9)), + new SimpleGetEncoding(array('go' => 'Go'))); + } + + function testMultipleFieldsWithSameNameSubmitted() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $input = &new SimpleTextTag(array('name' => 'elements[]', 'value' => '1')); + $form->addWidget($input); + $input = &new SimpleTextTag(array('name' => 'elements[]', 'value' => '2')); + $form->addWidget($input); + $form->setField(new SimpleByLabelOrName('elements[]'), '3', 1); + $form->setField(new SimpleByLabelOrName('elements[]'), '4', 2); + $submit = $form->submit(); + $this->assertEqual(count($submit->_request), 2); + $this->assertIdentical($submit->_request[0], new SimpleEncodedPair('elements[]', '3')); + $this->assertIdentical($submit->_request[1], new SimpleEncodedPair('elements[]', '4')); + } + + function testSingleSelectFieldSubmitted() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $select = &new SimpleSelectionTag(array('name' => 'a')); + $select->addTag(new SimpleOptionTag( + array('value' => 'aaa', 'selected' => ''))); + $form->addWidget($select); + $this->assertIdentical( + $form->submit(), + new SimpleGetEncoding(array('a' => 'aaa'))); + } + + function testSingleSelectFieldSubmittedWithPost() { + $form = &new SimpleForm(new SimpleFormTag(array('method' => 'post')), $this->page('htp://host')); + $select = &new SimpleSelectionTag(array('name' => 'a')); + $select->addTag(new SimpleOptionTag( + array('value' => 'aaa', 'selected' => ''))); + $form->addWidget($select); + $this->assertIdentical( + $form->submit(), + new SimplePostEncoding(array('a' => 'aaa'))); + } + + function testUnchecked() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleCheckboxTag( + array('name' => 'me', 'type' => 'checkbox'))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), false); + $this->assertTrue($form->setField(new SimpleByName('me'), 'on')); + $this->assertEqual($form->getValue(new SimpleByName('me')), 'on'); + $this->assertFalse($form->setField(new SimpleByName('me'), 'other')); + $this->assertEqual($form->getValue(new SimpleByName('me')), 'on'); + } + + function testChecked() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleCheckboxTag( + array('name' => 'me', 'value' => 'a', 'type' => 'checkbox', 'checked' => ''))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a'); + $this->assertTrue($form->setField(new SimpleByName('me'), 'a')); + $this->assertEqual($form->getValue(new SimpleByName('me')), 'a'); + $this->assertTrue($form->setField(new SimpleByName('me'), false)); + $this->assertEqual($form->getValue(new SimpleByName('me')), false); + } + + function testSingleUncheckedRadioButton() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleRadioButtonTag( + array('name' => 'me', 'value' => 'a', 'type' => 'radio'))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), false); + $this->assertTrue($form->setField(new SimpleByName('me'), 'a')); + $this->assertEqual($form->getValue(new SimpleByName('me')), 'a'); + } + + function testSingleCheckedRadioButton() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleRadioButtonTag( + array('name' => 'me', 'value' => 'a', 'type' => 'radio', 'checked' => ''))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a'); + $this->assertFalse($form->setField(new SimpleByName('me'), 'other')); + } + + function testUncheckedRadioButtons() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleRadioButtonTag( + array('name' => 'me', 'value' => 'a', 'type' => 'radio'))); + $form->addWidget(new SimpleRadioButtonTag( + array('name' => 'me', 'value' => 'b', 'type' => 'radio'))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), false); + $this->assertTrue($form->setField(new SimpleByName('me'), 'a')); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a'); + $this->assertTrue($form->setField(new SimpleByName('me'), 'b')); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b'); + $this->assertFalse($form->setField(new SimpleByName('me'), 'c')); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b'); + } + + function testCheckedRadioButtons() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleRadioButtonTag( + array('name' => 'me', 'value' => 'a', 'type' => 'radio'))); + $form->addWidget(new SimpleRadioButtonTag( + array('name' => 'me', 'value' => 'b', 'type' => 'radio', 'checked' => ''))); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b'); + $this->assertTrue($form->setField(new SimpleByName('me'), 'a')); + $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a'); + } + + function testMultipleFieldsWithSameKey() { + $form = &new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host')); + $form->addWidget(new SimpleCheckboxTag( + array('name' => 'a', 'type' => 'checkbox', 'value' => 'me'))); + $form->addWidget(new SimpleCheckboxTag( + array('name' => 'a', 'type' => 'checkbox', 'value' => 'you'))); + $this->assertIdentical($form->getValue(new SimpleByName('a')), false); + $this->assertTrue($form->setField(new SimpleByName('a'), 'me')); + $this->assertIdentical($form->getValue(new SimpleByName('a')), 'me'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/frames_test.php b/tests/simpletest/test/frames_test.php new file mode 100644 index 000000000..160eebc1b --- /dev/null +++ b/tests/simpletest/test/frames_test.php @@ -0,0 +1,549 @@ +setReturnValue('getTitle', 'This page'); + $frameset = &new SimpleFrameset($page); + $this->assertEqual($frameset->getTitle(), 'This page'); + } + + function TestHeadersReadFromFramesetByDefault() { + $page = &new MockSimplePage(); + $page->setReturnValue('getHeaders', 'Header: content'); + $page->setReturnValue('getMimeType', 'text/xml'); + $page->setReturnValue('getResponseCode', 401); + $page->setReturnValue('getTransportError', 'Could not parse headers'); + $page->setReturnValue('getAuthentication', 'Basic'); + $page->setReturnValue('getRealm', 'Safe place'); + + $frameset = &new SimpleFrameset($page); + + $this->assertIdentical($frameset->getHeaders(), 'Header: content'); + $this->assertIdentical($frameset->getMimeType(), 'text/xml'); + $this->assertIdentical($frameset->getResponseCode(), 401); + $this->assertIdentical($frameset->getTransportError(), 'Could not parse headers'); + $this->assertIdentical($frameset->getAuthentication(), 'Basic'); + $this->assertIdentical($frameset->getRealm(), 'Safe place'); + } + + function testEmptyFramesetHasNoContent() { + $page = &new MockSimplePage(); + $page->setReturnValue('getRaw', 'This content'); + $frameset = &new SimpleFrameset($page); + $this->assertEqual($frameset->getRaw(), ''); + } + + function testRawContentIsFromOnlyFrame() { + $page = &new MockSimplePage(); + $page->expectNever('getRaw'); + + $frame = &new MockSimplePage(); + $frame->setReturnValue('getRaw', 'Stuff'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame); + $this->assertEqual($frameset->getRaw(), 'Stuff'); + } + + function testRawContentIsFromAllFrames() { + $page = &new MockSimplePage(); + $page->expectNever('getRaw'); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getRaw', 'Stuff1'); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getRaw', 'Stuff2'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2); + $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2'); + } + + function testTextContentIsFromOnlyFrame() { + $page = &new MockSimplePage(); + $page->expectNever('getText'); + + $frame = &new MockSimplePage(); + $frame->setReturnValue('getText', 'Stuff'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame); + $this->assertEqual($frameset->getText(), 'Stuff'); + } + + function testTextContentIsFromAllFrames() { + $page = &new MockSimplePage(); + $page->expectNever('getText'); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getText', 'Stuff1'); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getText', 'Stuff2'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2); + $this->assertEqual($frameset->getText(), 'Stuff1 Stuff2'); + } + + function testFieldFoundIsFirstInFramelist() { + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getField', null); + $frame1->expectOnce('getField', array(new SimpleByName('a'))); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getField', 'A'); + $frame2->expectOnce('getField', array(new SimpleByName('a'))); + + $frame3 = &new MockSimplePage(); + $frame3->expectNever('getField'); + + $page = &new MockSimplePage(); + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2); + $frameset->addFrame($frame3); + $this->assertIdentical($frameset->getField(new SimpleByName('a')), 'A'); + } + + function testFrameReplacementByIndex() { + $page = &new MockSimplePage(); + $page->expectNever('getRaw'); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getRaw', 'Stuff1'); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getRaw', 'Stuff2'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1); + $frameset->setFrame(array(1), $frame2); + $this->assertEqual($frameset->getRaw(), 'Stuff2'); + } + + function testFrameReplacementByName() { + $page = &new MockSimplePage(); + $page->expectNever('getRaw'); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getRaw', 'Stuff1'); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getRaw', 'Stuff2'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1, 'a'); + $frameset->setFrame(array('a'), $frame2); + $this->assertEqual($frameset->getRaw(), 'Stuff2'); + } +} + +class TestOfFrameNavigation extends UnitTestCase { + + function testStartsWithoutFrameFocus() { + $page = &new MockSimplePage(); + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame); + $this->assertFalse($frameset->getFrameFocus()); + } + + function testCanFocusOnSingleFrame() { + $page = &new MockSimplePage(); + $page->expectNever('getRaw'); + + $frame = &new MockSimplePage(); + $frame->setReturnValue('getFrameFocus', array()); + $frame->setReturnValue('getRaw', 'Stuff'); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame); + + $this->assertFalse($frameset->setFrameFocusByIndex(0)); + $this->assertTrue($frameset->setFrameFocusByIndex(1)); + $this->assertEqual($frameset->getRaw(), 'Stuff'); + $this->assertFalse($frameset->setFrameFocusByIndex(2)); + $this->assertIdentical($frameset->getFrameFocus(), array(1)); + } + + function testContentComesFromFrameInFocus() { + $page = &new MockSimplePage(); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getRaw', 'Stuff1'); + $frame1->setReturnValue('getFrameFocus', array()); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getRaw', 'Stuff2'); + $frame2->setReturnValue('getFrameFocus', array()); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2); + + $this->assertTrue($frameset->setFrameFocusByIndex(1)); + $this->assertEqual($frameset->getFrameFocus(), array(1)); + $this->assertEqual($frameset->getRaw(), 'Stuff1'); + + $this->assertTrue($frameset->setFrameFocusByIndex(2)); + $this->assertEqual($frameset->getFrameFocus(), array(2)); + $this->assertEqual($frameset->getRaw(), 'Stuff2'); + + $this->assertFalse($frameset->setFrameFocusByIndex(3)); + $this->assertEqual($frameset->getFrameFocus(), array(2)); + + $frameset->clearFrameFocus(); + $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2'); + } + + function testCanFocusByName() { + $page = &new MockSimplePage(); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getRaw', 'Stuff1'); + $frame1->setReturnValue('getFrameFocus', array()); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getRaw', 'Stuff2'); + $frame2->setReturnValue('getFrameFocus', array()); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1, 'A'); + $frameset->addFrame($frame2, 'B'); + + $this->assertTrue($frameset->setFrameFocus('A')); + $this->assertEqual($frameset->getFrameFocus(), array('A')); + $this->assertEqual($frameset->getRaw(), 'Stuff1'); + + $this->assertTrue($frameset->setFrameFocusByIndex(2)); + $this->assertEqual($frameset->getFrameFocus(), array('B')); + $this->assertEqual($frameset->getRaw(), 'Stuff2'); + + $this->assertFalse($frameset->setFrameFocus('z')); + + $frameset->clearFrameFocus(); + $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2'); + } +} + +class TestOfFramesetPageInterface extends UnitTestCase { + var $_page_interface; + var $_frameset_interface; + + function TestOfFramesetPageInterface() { + $this->UnitTestCase(); + $this->_page_interface = $this->_getPageMethods(); + $this->_frameset_interface = $this->_getFramesetMethods(); + } + + function assertListInAnyOrder($list, $expected) { + sort($list); + sort($expected); + $this->assertEqual($list, $expected); + } + + function _getPageMethods() { + $methods = array(); + foreach (get_class_methods('SimplePage') as $method) { + if (strtolower($method) == strtolower('SimplePage')) { + continue; + } + if (strtolower($method) == strtolower('getFrameset')) { + continue; + } + if (strncmp($method, '_', 1) == 0) { + continue; + } + if (strncmp($method, 'accept', 6) == 0) { + continue; + } + $methods[] = $method; + } + return $methods; + } + + function _getFramesetMethods() { + $methods = array(); + foreach (get_class_methods('SimpleFrameset') as $method) { + if (strtolower($method) == strtolower('SimpleFrameset')) { + continue; + } + if (strncmp($method, '_', 1) == 0) { + continue; + } + if (strncmp($method, 'add', 3) == 0) { + continue; + } + $methods[] = $method; + } + return $methods; + } + + function testFramsetHasPageInterface() { + $difference = array(); + foreach ($this->_page_interface as $method) { + if (! in_array($method, $this->_frameset_interface)) { + $this->fail("No [$method] in Frameset class"); + return; + } + } + $this->pass('Frameset covers Page interface'); + } + + function testHeadersReadFromFrameIfInFocus() { + $frame = &new MockSimplePage(); + $frame->setReturnValue('getUrl', new SimpleUrl('http://localhost/stuff')); + + $frame->setReturnValue('getRequest', 'POST stuff'); + $frame->setReturnValue('getMethod', 'POST'); + $frame->setReturnValue('getRequestData', array('a' => 'A')); + $frame->setReturnValue('getHeaders', 'Header: content'); + $frame->setReturnValue('getMimeType', 'text/xml'); + $frame->setReturnValue('getResponseCode', 401); + $frame->setReturnValue('getTransportError', 'Could not parse headers'); + $frame->setReturnValue('getAuthentication', 'Basic'); + $frame->setReturnValue('getRealm', 'Safe place'); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame); + $frameset->setFrameFocusByIndex(1); + + $url = new SimpleUrl('http://localhost/stuff'); + $url->setTarget(1); + $this->assertIdentical($frameset->getUrl(), $url); + + $this->assertIdentical($frameset->getRequest(), 'POST stuff'); + $this->assertIdentical($frameset->getMethod(), 'POST'); + $this->assertIdentical($frameset->getRequestData(), array('a' => 'A')); + $this->assertIdentical($frameset->getHeaders(), 'Header: content'); + $this->assertIdentical($frameset->getMimeType(), 'text/xml'); + $this->assertIdentical($frameset->getResponseCode(), 401); + $this->assertIdentical($frameset->getTransportError(), 'Could not parse headers'); + $this->assertIdentical($frameset->getAuthentication(), 'Basic'); + $this->assertIdentical($frameset->getRealm(), 'Safe place'); + } + + function testUrlsComeFromBothFrames() { + $page = &new MockSimplePage(); + $page->expectNever('getUrls'); + + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue( + 'getUrls', + array('http://www.lastcraft.com/', 'http://myserver/')); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue( + 'getUrls', + array('http://www.lastcraft.com/', 'http://test/')); + + $frameset = &new SimpleFrameset($page); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2); + $this->assertListInAnyOrder( + $frameset->getUrls(), + array('http://www.lastcraft.com/', 'http://myserver/', 'http://test/')); + } + + function testLabelledUrlsComeFromBothFrames() { + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue( + 'getUrlsByLabel', + array(new SimpleUrl('goodbye.php')), + array('a')); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue( + 'getUrlsByLabel', + array(new SimpleUrl('hello.php')), + array('a')); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2, 'Two'); + + $expected1 = new SimpleUrl('goodbye.php'); + $expected1->setTarget(1); + $expected2 = new SimpleUrl('hello.php'); + $expected2->setTarget('Two'); + $this->assertEqual( + $frameset->getUrlsByLabel('a'), + array($expected1, $expected2)); + } + + function testUrlByIdComesFromFirstFrameToRespond() { + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getUrlById', new SimpleUrl('four.php'), array(4)); + $frame1->setReturnValue('getUrlById', false, array(5)); + + $frame2 = &new MockSimplePage(); + $frame2->setReturnValue('getUrlById', false, array(4)); + $frame2->setReturnValue('getUrlById', new SimpleUrl('five.php'), array(5)); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame1); + $frameset->addFrame($frame2); + + $four = new SimpleUrl('four.php'); + $four->setTarget(1); + $this->assertEqual($frameset->getUrlById(4), $four); + $five = new SimpleUrl('five.php'); + $five->setTarget(2); + $this->assertEqual($frameset->getUrlById(5), $five); + } + + function testReadUrlsFromFrameInFocus() { + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getUrls', array('a')); + $frame1->setReturnValue('getUrlsByLabel', array(new SimpleUrl('l'))); + $frame1->setReturnValue('getUrlById', new SimpleUrl('i')); + + $frame2 = &new MockSimplePage(); + $frame2->expectNever('getUrls'); + $frame2->expectNever('getUrlsByLabel'); + $frame2->expectNever('getUrlById'); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame1, 'A'); + $frameset->addFrame($frame2, 'B'); + $frameset->setFrameFocus('A'); + + $this->assertIdentical($frameset->getUrls(), array('a')); + $expected = new SimpleUrl('l'); + $expected->setTarget('A'); + $this->assertIdentical($frameset->getUrlsByLabel('label'), array($expected)); + $expected = new SimpleUrl('i'); + $expected->setTarget('A'); + $this->assertIdentical($frameset->getUrlById(99), $expected); + } + + function testReadFrameTaggedUrlsFromFrameInFocus() { + $frame = &new MockSimplePage(); + + $by_label = new SimpleUrl('l'); + $by_label->setTarget('L'); + $frame->setReturnValue('getUrlsByLabel', array($by_label)); + + $by_id = new SimpleUrl('i'); + $by_id->setTarget('I'); + $frame->setReturnValue('getUrlById', $by_id); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame, 'A'); + $frameset->setFrameFocus('A'); + + $this->assertIdentical($frameset->getUrlsByLabel('label'), array($by_label)); + $this->assertIdentical($frameset->getUrlById(99), $by_id); + } + + function testFindingFormsById() { + $frame = &new MockSimplePage(); + $form = &new MockSimpleForm(); + $frame->setReturnReference('getFormById', $form, array('a')); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame(new MockSimplePage(), 'A'); + $frameset->addFrame($frame, 'B'); + $this->assertReference($frameset->getFormById('a'), $form); + + $frameset->setFrameFocus('A'); + $this->assertNull($frameset->getFormById('a')); + + $frameset->setFrameFocus('B'); + $this->assertReference($frameset->getFormById('a'), $form); + } + + function testFindingFormsBySubmit() { + $frame = &new MockSimplePage(); + $form = &new MockSimpleForm(); + $frame->setReturnReference( + 'getFormBySubmit', + $form, + array(new SimpleByLabel('a'))); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame(new MockSimplePage(), 'A'); + $frameset->addFrame($frame, 'B'); + $this->assertReference($frameset->getFormBySubmit(new SimpleByLabel('a')), $form); + + $frameset->setFrameFocus('A'); + $this->assertNull($frameset->getFormBySubmit(new SimpleByLabel('a'))); + + $frameset->setFrameFocus('B'); + $this->assertReference($frameset->getFormBySubmit(new SimpleByLabel('a')), $form); + } + + function testFindingFormsByImage() { + $frame = &new MockSimplePage(); + $form = &new MockSimpleForm(); + $frame->setReturnReference( + 'getFormByImage', + $form, + array(new SimpleByLabel('a'))); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame(new MockSimplePage(), 'A'); + $frameset->addFrame($frame, 'B'); + $this->assertReference($frameset->getFormByImage(new SimpleByLabel('a')), $form); + + $frameset->setFrameFocus('A'); + $this->assertNull($frameset->getFormByImage(new SimpleByLabel('a'))); + + $frameset->setFrameFocus('B'); + $this->assertReference($frameset->getFormByImage(new SimpleByLabel('a')), $form); + } + + function testSettingAllFrameFieldsWhenNoFrameFocus() { + $frame1 = &new MockSimplePage(); + $frame1->expectOnce('setField', array(new SimpleById(22), 'A')); + + $frame2 = &new MockSimplePage(); + $frame2->expectOnce('setField', array(new SimpleById(22), 'A')); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame1, 'A'); + $frameset->addFrame($frame2, 'B'); + $frameset->setField(new SimpleById(22), 'A'); + } + + function testOnlySettingFieldFromFocusedFrame() { + $frame1 = &new MockSimplePage(); + $frame1->expectOnce('setField', array(new SimpleByLabelOrName('a'), 'A')); + + $frame2 = &new MockSimplePage(); + $frame2->expectNever('setField'); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame1, 'A'); + $frameset->addFrame($frame2, 'B'); + $frameset->setFrameFocus('A'); + $frameset->setField(new SimpleByLabelOrName('a'), 'A'); + } + + function testOnlyGettingFieldFromFocusedFrame() { + $frame1 = &new MockSimplePage(); + $frame1->setReturnValue('getField', 'f', array(new SimpleByName('a'))); + + $frame2 = &new MockSimplePage(); + $frame2->expectNever('getField'); + + $frameset = &new SimpleFrameset(new MockSimplePage()); + $frameset->addFrame($frame1, 'A'); + $frameset->addFrame($frame2, 'B'); + $frameset->setFrameFocus('A'); + $this->assertIdentical($frameset->getField(new SimpleByName('a')), 'f'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/http_test.php b/tests/simpletest/test/http_test.php new file mode 100644 index 000000000..d249850c8 --- /dev/null +++ b/tests/simpletest/test/http_test.php @@ -0,0 +1,427 @@ +expectArgumentsAt(0, 'write', array("GET /here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html')); + + $this->assertReference($route->createConnection('GET', 15), $socket); + } + + function testDefaultPostRequest() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("POST /here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html')); + + $route->createConnection('POST', 15); + } + + function testGetWithPort() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("GET /here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host:81\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleRoute(new SimpleUrl('http://a.valid.host:81/here.html')); + + $route->createConnection('GET', 15); + } + + function testGetWithParameters() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("GET /here.html?a=1&b=2 HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html?a=1&b=2')); + + $route->createConnection('GET', 15); + } +} + +class TestOfProxyRoute extends UnitTestCase { + + function testDefaultGet() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleProxyRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleProxyRoute( + new SimpleUrl('http://a.valid.host/here.html'), + new SimpleUrl('http://my-proxy')); + $route->createConnection('GET', 15); + } + + function testDefaultPost() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("POST http://a.valid.host/here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleProxyRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleProxyRoute( + new SimpleUrl('http://a.valid.host/here.html'), + new SimpleUrl('http://my-proxy')); + $route->createConnection('POST', 15); + } + + function testGetWithPort() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host:81/here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8081\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleProxyRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleProxyRoute( + new SimpleUrl('http://a.valid.host:81/here.html'), + new SimpleUrl('http://my-proxy:8081')); + $route->createConnection('GET', 15); + } + + function testGetWithParameters() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html?a=1&b=2 HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 3); + + $route = &new PartialSimpleProxyRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleProxyRoute( + new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'), + new SimpleUrl('http://my-proxy')); + $route->createConnection('GET', 15); + } + + function testGetWithAuthentication() { + $encoded = base64_encode('Me:Secret'); + + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n")); + $socket->expectArgumentsAt(2, 'write', array("Proxy-Authorization: Basic $encoded\r\n")); + $socket->expectArgumentsAt(3, 'write', array("Connection: close\r\n")); + $socket->expectCallCount('write', 4); + + $route = &new PartialSimpleProxyRoute(); + $route->setReturnReference('_createSocket', $socket); + $route->SimpleProxyRoute( + new SimpleUrl('http://a.valid.host/here.html'), + new SimpleUrl('http://my-proxy'), + 'Me', + 'Secret'); + $route->createConnection('GET', 15); + } +} + +class TestOfHttpRequest extends UnitTestCase { + + function testReadingBadConnection() { + $socket = &new MockSimpleSocket(); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + + $request = &new SimpleHttpRequest($route, new SimpleGetEncoding()); + $reponse = &$request->fetch(15); + $this->assertTrue($reponse->isError()); + } + + function testReadingGoodConnection() { + $socket = &new MockSimpleSocket(); + $socket->expectOnce('write', array("\r\n")); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + $route->expectArguments('createConnection', array('GET', 15)); + + $request = &new SimpleHttpRequest($route, new SimpleGetEncoding()); + $this->assertIsA($request->fetch(15), 'SimpleHttpResponse'); + } + + function testWritingAdditionalHeaders() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("My: stuff\r\n")); + $socket->expectArgumentsAt(1, 'write', array("\r\n")); + $socket->expectCallCount('write', 2); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + + $request = &new SimpleHttpRequest($route, new SimpleGetEncoding()); + $request->addHeaderLine('My: stuff'); + $request->fetch(15); + } + + function testCookieWriting() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("Cookie: a=A\r\n")); + $socket->expectArgumentsAt(1, 'write', array("\r\n")); + $socket->expectCallCount('write', 2); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A'); + + $request = &new SimpleHttpRequest($route, new SimpleGetEncoding()); + $request->readCookiesFromJar($jar, new SimpleUrl('/')); + $this->assertIsA($request->fetch(15), 'SimpleHttpResponse'); + } + + function testMultipleCookieWriting() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("Cookie: a=A;b=B\r\n")); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A'); + $jar->setCookie('b', 'B'); + + $request = &new SimpleHttpRequest($route, new SimpleGetEncoding()); + $request->readCookiesFromJar($jar, new SimpleUrl('/')); + $request->fetch(15); + } +} + +class TestOfHttpPostRequest extends UnitTestCase { + + function testReadingBadConnectionCausesErrorBecauseOfDeadSocket() { + $socket = &new MockSimpleSocket(); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + + $request = &new SimpleHttpRequest($route, new SimplePostEncoding()); + $reponse = &$request->fetch(15); + $this->assertTrue($reponse->isError()); + } + + function testReadingGoodConnection() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("Content-Length: 0\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n")); + $socket->expectArgumentsAt(2, 'write', array("\r\n")); + $socket->expectArgumentsAt(3, 'write', array("")); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + $route->expectArguments('createConnection', array('POST', 15)); + + $request = &new SimpleHttpRequest($route, new SimplePostEncoding()); + $this->assertIsA($request->fetch(15), 'SimpleHttpResponse'); + } + + function testContentHeadersCalculated() { + $socket = &new MockSimpleSocket(); + $socket->expectArgumentsAt(0, 'write', array("Content-Length: 3\r\n")); + $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n")); + $socket->expectArgumentsAt(2, 'write', array("\r\n")); + $socket->expectArgumentsAt(3, 'write', array("a=A")); + + $route = &new MockSimpleRoute(); + $route->setReturnReference('createConnection', $socket); + $route->expectArguments('createConnection', array('POST', 15)); + + $request = &new SimpleHttpRequest( + $route, + new SimplePostEncoding(array('a' => 'A'))); + $this->assertIsA($request->fetch(15), 'SimpleHttpResponse'); + } +} + +class TestOfHttpHeaders extends UnitTestCase { + + function testParseBasicHeaders() { + $headers = new SimpleHttpHeaders( + "HTTP/1.1 200 OK\r\n" . + "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" . + "Content-Type: text/plain\r\n" . + "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" . + "Connection: close"); + $this->assertIdentical($headers->getHttpVersion(), "1.1"); + $this->assertIdentical($headers->getResponseCode(), 200); + $this->assertEqual($headers->getMimeType(), "text/plain"); + } + + function testNonStandardResponseHeader() { + $headers = new SimpleHttpHeaders( + "HTTP/1.1 302 (HTTP-Version SP Status-Code CRLF)\r\n" . + "Connection: close"); + $this->assertIdentical($headers->getResponseCode(), 302); + } + + function testCanParseMultipleCookies() { + $jar = &new MockSimpleCookieJar(); + $jar->expectAt(0, 'setCookie', array('a', 'aaa', 'host', '/here/', 'Wed, 25 Dec 2002 04:24:20 GMT')); + $jar->expectAt(1, 'setCookie', array('b', 'bbb', 'host', '/', false)); + + $headers = new SimpleHttpHeaders( + "HTTP/1.1 200 OK\r\n" . + "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" . + "Content-Type: text/plain\r\n" . + "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" . + "Set-Cookie: a=aaa; expires=Wed, 25-Dec-02 04:24:20 GMT; path=/here/\r\n" . + "Set-Cookie: b=bbb\r\n" . + "Connection: close"); + $headers->writeCookiesToJar($jar, new SimpleUrl('http://host')); + } + + function testCanRecogniseRedirect() { + $headers = new SimpleHttpHeaders("HTTP/1.1 301 OK\r\n" . + "Content-Type: text/plain\r\n" . + "Content-Length: 0\r\n" . + "Location: http://www.somewhere-else.com/\r\n" . + "Connection: close"); + $this->assertIdentical($headers->getResponseCode(), 301); + $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/"); + $this->assertTrue($headers->isRedirect()); + } + + function testCanParseChallenge() { + $headers = new SimpleHttpHeaders("HTTP/1.1 401 Authorization required\r\n" . + "Content-Type: text/plain\r\n" . + "Connection: close\r\n" . + "WWW-Authenticate: Basic realm=\"Somewhere\""); + $this->assertEqual($headers->getAuthentication(), 'Basic'); + $this->assertEqual($headers->getRealm(), 'Somewhere'); + $this->assertTrue($headers->isChallenge()); + } +} + +class TestOfHttpResponse extends UnitTestCase { + + function testBadRequest() { + $socket = &new MockSimpleSocket(); + $socket->setReturnValue('getSent', ''); + + $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding()); + $this->assertTrue($response->isError()); + $this->assertPattern('/Nothing fetched/', $response->getError()); + $this->assertIdentical($response->getContent(), false); + $this->assertIdentical($response->getSent(), ''); + } + + function testBadSocketDuringResponse() { + $socket = &new MockSimpleSocket(); + $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n"); + $socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n"); + $socket->setReturnValue("read", ""); + $socket->setReturnValue('getSent', 'HTTP/1.1 ...'); + + $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding()); + $this->assertTrue($response->isError()); + $this->assertEqual($response->getContent(), ''); + $this->assertEqual($response->getSent(), 'HTTP/1.1 ...'); + } + + function testIncompleteHeader() { + $socket = &new MockSimpleSocket(); + $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n"); + $socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n"); + $socket->setReturnValueAt(2, "read", "Content-Type: text/plain\r\n"); + $socket->setReturnValue("read", ""); + + $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding()); + $this->assertTrue($response->isError()); + $this->assertEqual($response->getContent(), ""); + } + + function testParseOfResponseHeadersWhenChunked() { + $socket = &new MockSimpleSocket(); + $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\nDate: Mon, 18 Nov 2002 15:50:29 GMT\r\n"); + $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n"); + $socket->setReturnValueAt(2, "read", "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\nConne"); + $socket->setReturnValueAt(3, "read", "ction: close\r\n\r\nthis is a test file\n"); + $socket->setReturnValueAt(4, "read", "with two lines in it\n"); + $socket->setReturnValue("read", ""); + + $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding()); + $this->assertFalse($response->isError()); + $this->assertEqual( + $response->getContent(), + "this is a test file\nwith two lines in it\n"); + $headers = $response->getHeaders(); + $this->assertIdentical($headers->getHttpVersion(), "1.1"); + $this->assertIdentical($headers->getResponseCode(), 200); + $this->assertEqual($headers->getMimeType(), "text/plain"); + $this->assertFalse($headers->isRedirect()); + $this->assertFalse($headers->getLocation()); + } + + function testRedirect() { + $socket = &new MockSimpleSocket(); + $socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n"); + $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n"); + $socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com/\r\n"); + $socket->setReturnValueAt(3, "read", "Connection: close\r\n"); + $socket->setReturnValueAt(4, "read", "\r\n"); + $socket->setReturnValue("read", ""); + + $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding()); + $headers = $response->getHeaders(); + $this->assertTrue($headers->isRedirect()); + $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/"); + } + + function testRedirectWithPort() { + $socket = &new MockSimpleSocket(); + $socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n"); + $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n"); + $socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com:80/\r\n"); + $socket->setReturnValueAt(3, "read", "Connection: close\r\n"); + $socket->setReturnValueAt(4, "read", "\r\n"); + $socket->setReturnValue("read", ""); + + $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding()); + $headers = $response->getHeaders(); + $this->assertTrue($headers->isRedirect()); + $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com:80/"); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/interfaces_test.php b/tests/simpletest/test/interfaces_test.php new file mode 100644 index 000000000..b6980edb1 --- /dev/null +++ b/tests/simpletest/test/interfaces_test.php @@ -0,0 +1,137 @@ +assertIsA($mock, 'SimpleMock'); + $this->assertIsA($mock, 'MockDummyInterface'); + $this->assertTrue(method_exists($mock, 'aMethod')); + $this->assertTrue(method_exists($mock, 'anotherMethod')); + $this->assertNull($mock->aMethod()); + } + + function testMockedInterfaceExpectsParameters() { + $mock = new MockDummyInterface(); + $mock->anotherMethod(); + $this->assertError(); + } + + function testCannotPartiallyMockAnInterface() { + $this->assertFalse(class_exists('PartialDummyInterface')); + } +} + +class TestOfSpl extends UnitTestCase { + + function skip() { + $this->skipUnless(function_exists('spl_classes'), 'No SPL module loaded'); + } + + function testCanMockAllSplClasses() { + if (! function_exists('spl_classes')) { + return; + } + foreach(spl_classes() as $class) { + if ($class == 'SplHeap') { + continue; + } + $mock_class = "Mock$class"; + Mock::generate($class); + $this->assertIsA(new $mock_class(), $mock_class); + } + } + + function testExtensionOfCommonSplClasses() { + Mock::generate('IteratorImplementation'); + $this->assertIsA( + new IteratorImplementation(), + 'IteratorImplementation'); + Mock::generate('IteratorAggregateImplementation'); + $this->assertIsA( + new IteratorAggregateImplementation(), + 'IteratorAggregateImplementation'); + } +} + +class WithHint { + function hinted(DummyInterface $object) { } +} + +class ImplementsDummy implements DummyInterface { + function aMethod() { } + function anotherMethod($a) { } + function &referenceMethod(&$a) { } + function extraMethod($a = false) { } +} +Mock::generate('ImplementsDummy'); + +class TestOfImplementations extends UnitTestCase { + + function testMockedInterfaceCanPassThroughTypeHint() { + $mock = new MockDummyInterface(); + $hinter = new WithHint(); + $hinter->hinted($mock); + } + + function testImplementedInterfacesAreCarried() { + $mock = new MockImplementsDummy(); + $hinter = new WithHint(); + $hinter->hinted($mock); + } + + function testNoSpuriousWarningsWhenSkippingDefaultedParameter() { + $mock = new MockImplementsDummy(); + $mock->extraMethod(); + } +} + +interface SampleClassWithConstruct { + function __construct($something); +} + +class TestOfInterfaceMocksWithConstruct extends UnitTestCase { + function testBasicConstructOfAnInterface() { + Mock::generate('SampleClassWithConstruct'); + $this->assertNoErrors(); + } +} + +interface SampleInterfaceWithHintInSignature { + function method(array $hinted); +} + +class TestOfInterfaceMocksWithHintInSignature extends UnitTestCase { + function testBasicConstructOfAnInterfaceWithHintInSignature() { + Mock::generate('SampleInterfaceWithHintInSignature'); + $this->assertNoErrors(); + $mock = new MockSampleInterfaceWithHintInSignature(); + $this->assertIsA($mock, 'SampleInterfaceWithHintInSignature'); + } +} + +interface SampleInterfaceWithClone { + function __clone(); +} + +class TestOfSampleInterfaceWithClone extends UnitTestCase { + function testCanMockWithoutErrors() { + Mock::generate('SampleInterfaceWithClone'); + $this->assertNoErrors(); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/live_test.php b/tests/simpletest/test/live_test.php new file mode 100644 index 000000000..b294030e1 --- /dev/null +++ b/tests/simpletest/test/live_test.php @@ -0,0 +1,47 @@ +assertTrue($socket->isError()); + $this->assertPattern( + '/Cannot open \\[bad_url:111\\] with \\[/', + $socket->getError()); + $this->assertFalse($socket->isOpen()); + $this->assertFalse($socket->write('A message')); + } + + function testSocketClosure() { + $socket = &new SimpleSocket('www.lastcraft.com', 80, 15, 8); + $this->assertTrue($socket->isOpen()); + $this->assertTrue($socket->write("GET /test/network_confirm.php HTTP/1.0\r\n")); + $socket->write("Host: www.lastcraft.com\r\n"); + $socket->write("Connection: close\r\n\r\n"); + $this->assertEqual($socket->read(), "HTTP/1.1"); + $socket->close(); + $this->assertIdentical($socket->read(), false); + } + + function testRecordOfSentCharacters() { + $socket = &new SimpleSocket('www.lastcraft.com', 80, 15); + $this->assertTrue($socket->write("GET /test/network_confirm.php HTTP/1.0\r\n")); + $socket->write("Host: www.lastcraft.com\r\n"); + $socket->write("Connection: close\r\n\r\n"); + $socket->close(); + $this->assertEqual($socket->getSent(), + "GET /test/network_confirm.php HTTP/1.0\r\n" . + "Host: www.lastcraft.com\r\n" . + "Connection: close\r\n\r\n"); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/mock_objects_test.php b/tests/simpletest/test/mock_objects_test.php new file mode 100644 index 000000000..a208ff727 --- /dev/null +++ b/tests/simpletest/test/mock_objects_test.php @@ -0,0 +1,994 @@ +assertTrue($expectation->test(33)); + $this->assertTrue($expectation->test(false)); + $this->assertTrue($expectation->test(null)); + } +} + +class TestOfParametersExpectation extends UnitTestCase { + + function testEmptyMatch() { + $expectation = new ParametersExpectation(array()); + $this->assertTrue($expectation->test(array())); + $this->assertFalse($expectation->test(array(33))); + } + + function testSingleMatch() { + $expectation = new ParametersExpectation(array(0)); + $this->assertFalse($expectation->test(array(1))); + $this->assertTrue($expectation->test(array(0))); + } + + function testAnyMatch() { + $expectation = new ParametersExpectation(false); + $this->assertTrue($expectation->test(array())); + $this->assertTrue($expectation->test(array(1, 2))); + } + + function testMissingParameter() { + $expectation = new ParametersExpectation(array(0)); + $this->assertFalse($expectation->test(array())); + } + + function testNullParameter() { + $expectation = new ParametersExpectation(array(null)); + $this->assertTrue($expectation->test(array(null))); + $this->assertFalse($expectation->test(array())); + } + + function testAnythingExpectations() { + $expectation = new ParametersExpectation(array(new AnythingExpectation())); + $this->assertFalse($expectation->test(array())); + $this->assertIdentical($expectation->test(array(null)), true); + $this->assertIdentical($expectation->test(array(13)), true); + } + + function testOtherExpectations() { + $expectation = new ParametersExpectation( + array(new PatternExpectation('/hello/i'))); + $this->assertFalse($expectation->test(array('Goodbye'))); + $this->assertTrue($expectation->test(array('hello'))); + $this->assertTrue($expectation->test(array('Hello'))); + } + + function testIdentityOnly() { + $expectation = new ParametersExpectation(array("0")); + $this->assertFalse($expectation->test(array(0))); + $this->assertTrue($expectation->test(array("0"))); + } + + function testLongList() { + $expectation = new ParametersExpectation( + array("0", 0, new AnythingExpectation(), false)); + $this->assertTrue($expectation->test(array("0", 0, 37, false))); + $this->assertFalse($expectation->test(array("0", 0, 37, true))); + $this->assertFalse($expectation->test(array("0", 0, 37))); + } +} + +class TestOfSimpleSignatureMap extends UnitTestCase { + + function testEmpty() { + $map = new SimpleSignatureMap(); + $this->assertFalse($map->isMatch("any", array())); + $this->assertNull($map->findFirstAction("any", array())); + } + + function testExactReference() { + $map = new SimpleSignatureMap(); + $ref = "Fred"; + $map->add(array(0), $ref); + $this->assertEqual($map->findFirstAction(array(0)), "Fred"); + $ref2 = &$map->findFirstAction(array(0)); + $this->assertReference($ref2, $ref); + } + + function testDifferentCallSignaturesCanHaveDifferentReferences() { + $map = new SimpleSignatureMap(); + $fred = 'Fred'; + $jim = 'jim'; + $map->add(array(0), $fred); + $map->add(array('0'), $jim); + $this->assertReference($fred, $map->findFirstAction(array(0))); + $this->assertReference($jim, $map->findFirstAction(array('0'))); + } + + function testWildcard() { + $fred = 'Fred'; + $map = new SimpleSignatureMap(); + $map->add(array(new AnythingExpectation(), 1, 3), $fred); + $this->assertTrue($map->isMatch(array(2, 1, 3))); + $this->assertReference($map->findFirstAction(array(2, 1, 3)), $fred); + } + + function testAllWildcard() { + $fred = 'Fred'; + $map = new SimpleSignatureMap(); + $this->assertFalse($map->isMatch(array(2, 1, 3))); + $map->add('', $fred); + $this->assertTrue($map->isMatch(array(2, 1, 3))); + $this->assertReference($map->findFirstAction(array(2, 1, 3)), $fred); + } + + function testOrdering() { + $map = new SimpleSignatureMap(); + $map->add(array(1, 2), new SimpleByValue("1, 2")); + $map->add(array(1, 3), new SimpleByValue("1, 3")); + $map->add(array(1), new SimpleByValue("1")); + $map->add(array(1, 4), new SimpleByValue("1, 4")); + $map->add(array(new AnythingExpectation()), new SimpleByValue("Any")); + $map->add(array(2), new SimpleByValue("2")); + $map->add("", new SimpleByValue("Default")); + $map->add(array(), new SimpleByValue("None")); + $this->assertEqual($map->findFirstAction(array(1, 2)), new SimpleByValue("1, 2")); + $this->assertEqual($map->findFirstAction(array(1, 3)), new SimpleByValue("1, 3")); + $this->assertEqual($map->findFirstAction(array(1, 4)), new SimpleByValue("1, 4")); + $this->assertEqual($map->findFirstAction(array(1)), new SimpleByValue("1")); + $this->assertEqual($map->findFirstAction(array(2)), new SimpleByValue("Any")); + $this->assertEqual($map->findFirstAction(array(3)), new SimpleByValue("Any")); + $this->assertEqual($map->findFirstAction(array()), new SimpleByValue("Default")); + } +} + +class TestOfCallSchedule extends UnitTestCase { + function testCanBeSetToAlwaysReturnTheSameReference() { + $a = 5; + $schedule = &new SimpleCallSchedule(); + $schedule->register('aMethod', false, new SimpleByReference($a)); + $this->assertReference($schedule->respond(0, 'aMethod', array()), $a); + $this->assertReference($schedule->respond(1, 'aMethod', array()), $a); + } + + function testSpecificSignaturesOverrideTheAlwaysCase() { + $any = 'any'; + $one = 'two'; + $schedule = &new SimpleCallSchedule(); + $schedule->register('aMethod', array(1), new SimpleByReference($one)); + $schedule->register('aMethod', false, new SimpleByReference($any)); + $this->assertReference($schedule->respond(0, 'aMethod', array(2)), $any); + $this->assertReference($schedule->respond(0, 'aMethod', array(1)), $one); + } + + function testReturnsCanBeSetOverTime() { + $one = 'one'; + $two = 'two'; + $schedule = &new SimpleCallSchedule(); + $schedule->registerAt(0, 'aMethod', false, new SimpleByReference($one)); + $schedule->registerAt(1, 'aMethod', false, new SimpleByReference($two)); + $this->assertReference($schedule->respond(0, 'aMethod', array()), $one); + $this->assertReference($schedule->respond(1, 'aMethod', array()), $two); + } + + function testReturnsOverTimecanBeAlteredByTheArguments() { + $one = '1'; + $two = '2'; + $two_a = '2a'; + $schedule = &new SimpleCallSchedule(); + $schedule->registerAt(0, 'aMethod', false, new SimpleByReference($one)); + $schedule->registerAt(1, 'aMethod', array('a'), new SimpleByReference($two_a)); + $schedule->registerAt(1, 'aMethod', false, new SimpleByReference($two)); + $this->assertReference($schedule->respond(0, 'aMethod', array()), $one); + $this->assertReference($schedule->respond(1, 'aMethod', array()), $two); + $this->assertReference($schedule->respond(1, 'aMethod', array('a')), $two_a); + } + + function testCanReturnByValue() { + $a = 5; + $schedule = &new SimpleCallSchedule(); + $schedule->register('aMethod', false, new SimpleByValue($a)); + $this->assertClone($schedule->respond(0, 'aMethod', array()), $a); + } + + function testCanThrowException() { + if (version_compare(phpversion(), '5', '>=')) { + $schedule = &new SimpleCallSchedule(); + $schedule->register('aMethod', false, new SimpleThrower(new Exception('Ouch'))); + $this->expectException(new Exception('Ouch')); + $schedule->respond(0, 'aMethod', array()); + } + } + + function testCanEmitError() { + $schedule = &new SimpleCallSchedule(); + $schedule->register('aMethod', false, new SimpleErrorThrower('Ouch', E_USER_WARNING)); + $this->expectError('Ouch'); + $schedule->respond(0, 'aMethod', array()); + } +} + +class Dummy { + function Dummy() { + } + + function aMethod() { + return true; + } + + function anotherMethod() { + return true; + } +} +Mock::generate('Dummy'); +Mock::generate('Dummy', 'AnotherMockDummy'); +Mock::generate('Dummy', 'MockDummyWithExtraMethods', array('extraMethod')); + +class TestOfMockGeneration extends UnitTestCase { + + function testCloning() { + $mock = &new MockDummy(); + $this->assertTrue(method_exists($mock, "aMethod")); + $this->assertNull($mock->aMethod()); + } + + function testCloningWithExtraMethod() { + $mock = &new MockDummyWithExtraMethods(); + $this->assertTrue(method_exists($mock, "extraMethod")); + } + + function testCloningWithChosenClassName() { + $mock = &new AnotherMockDummy(); + $this->assertTrue(method_exists($mock, "aMethod")); + } +} + +class TestOfMockReturns extends UnitTestCase { + + function testDefaultReturn() { + $mock = &new MockDummy(); + $mock->setReturnValue("aMethod", "aaa"); + $this->assertIdentical($mock->aMethod(), "aaa"); + $this->assertIdentical($mock->aMethod(), "aaa"); + } + + function testParameteredReturn() { + $mock = &new MockDummy(); + $mock->setReturnValue('aMethod', 'aaa', array(1, 2, 3)); + $this->assertNull($mock->aMethod()); + $this->assertIdentical($mock->aMethod(1, 2, 3), 'aaa'); + } + + function testReferenceReturned() { + $mock = &new MockDummy(); + $object = new Dummy(); + $mock->setReturnReference('aMethod', $object, array(1, 2, 3)); + $this->assertReference($zref = &$mock->aMethod(1, 2, 3), $object); + } + + function testPatternMatchReturn() { + $mock = &new MockDummy(); + $mock->setReturnValue( + "aMethod", + "aaa", + array(new PatternExpectation('/hello/i'))); + $this->assertIdentical($mock->aMethod('Hello'), "aaa"); + $this->assertNull($mock->aMethod('Goodbye')); + } + + function testMultipleMethods() { + $mock = &new MockDummy(); + $mock->setReturnValue("aMethod", 100, array(1)); + $mock->setReturnValue("aMethod", 200, array(2)); + $mock->setReturnValue("anotherMethod", 10, array(1)); + $mock->setReturnValue("anotherMethod", 20, array(2)); + $this->assertIdentical($mock->aMethod(1), 100); + $this->assertIdentical($mock->anotherMethod(1), 10); + $this->assertIdentical($mock->aMethod(2), 200); + $this->assertIdentical($mock->anotherMethod(2), 20); + } + + function testReturnSequence() { + $mock = &new MockDummy(); + $mock->setReturnValueAt(0, "aMethod", "aaa"); + $mock->setReturnValueAt(1, "aMethod", "bbb"); + $mock->setReturnValueAt(3, "aMethod", "ddd"); + $this->assertIdentical($mock->aMethod(), "aaa"); + $this->assertIdentical($mock->aMethod(), "bbb"); + $this->assertNull($mock->aMethod()); + $this->assertIdentical($mock->aMethod(), "ddd"); + } + + function testReturnReferenceSequence() { + $mock = &new MockDummy(); + $object = new Dummy(); + $mock->setReturnReferenceAt(1, "aMethod", $object); + $this->assertNull($mock->aMethod()); + $this->assertReference($zref =& $mock->aMethod(), $object); + $this->assertNull($mock->aMethod()); + } + + function testComplicatedReturnSequence() { + $mock = &new MockDummy(); + $object = new Dummy(); + $mock->setReturnValueAt(1, "aMethod", "aaa", array("a")); + $mock->setReturnValueAt(1, "aMethod", "bbb"); + $mock->setReturnReferenceAt(2, "aMethod", $object, array('*', 2)); + $mock->setReturnValueAt(2, "aMethod", "value", array('*', 3)); + $mock->setReturnValue("aMethod", 3, array(3)); + $this->assertNull($mock->aMethod()); + $this->assertEqual($mock->aMethod("a"), "aaa"); + $this->assertReference($zref =& $mock->aMethod(1, 2), $object); + $this->assertEqual($mock->aMethod(3), 3); + $this->assertNull($mock->aMethod()); + } + + function testMultipleMethodSequences() { + $mock = &new MockDummy(); + $mock->setReturnValueAt(0, "aMethod", "aaa"); + $mock->setReturnValueAt(1, "aMethod", "bbb"); + $mock->setReturnValueAt(0, "anotherMethod", "ccc"); + $mock->setReturnValueAt(1, "anotherMethod", "ddd"); + $this->assertIdentical($mock->aMethod(), "aaa"); + $this->assertIdentical($mock->anotherMethod(), "ccc"); + $this->assertIdentical($mock->aMethod(), "bbb"); + $this->assertIdentical($mock->anotherMethod(), "ddd"); + } + + function testSequenceFallback() { + $mock = &new MockDummy(); + $mock->setReturnValueAt(0, "aMethod", "aaa", array('a')); + $mock->setReturnValueAt(1, "aMethod", "bbb", array('a')); + $mock->setReturnValue("aMethod", "AAA"); + $this->assertIdentical($mock->aMethod('a'), "aaa"); + $this->assertIdentical($mock->aMethod('b'), "AAA"); + } + + function testMethodInterference() { + $mock = &new MockDummy(); + $mock->setReturnValueAt(0, "anotherMethod", "aaa"); + $mock->setReturnValue("aMethod", "AAA"); + $this->assertIdentical($mock->aMethod(), "AAA"); + $this->assertIdentical($mock->anotherMethod(), "aaa"); + } +} + +class TestOfMockExpectationsThatPass extends UnitTestCase { + + function testAnyArgument() { + $mock = &new MockDummy(); + $mock->expect('aMethod', array('*')); + $mock->aMethod(1); + $mock->aMethod('hello'); + } + + function testAnyTwoArguments() { + $mock = &new MockDummy(); + $mock->expect('aMethod', array('*', '*')); + $mock->aMethod(1, 2); + } + + function testSpecificArgument() { + $mock = &new MockDummy(); + $mock->expect('aMethod', array(1)); + $mock->aMethod(1); + } + + function testExpectation() { + $mock = &new MockDummy(); + $mock->expect('aMethod', array(new IsAExpectation('Dummy'))); + $mock->aMethod(new Dummy()); + } + + function testArgumentsInSequence() { + $mock = &new MockDummy(); + $mock->expectAt(0, 'aMethod', array(1, 2)); + $mock->expectAt(1, 'aMethod', array(3, 4)); + $mock->aMethod(1, 2); + $mock->aMethod(3, 4); + } + + function testAtLeastOnceSatisfiedByOneCall() { + $mock = &new MockDummy(); + $mock->expectAtLeastOnce('aMethod'); + $mock->aMethod(); + } + + function testAtLeastOnceSatisfiedByTwoCalls() { + $mock = &new MockDummy(); + $mock->expectAtLeastOnce('aMethod'); + $mock->aMethod(); + $mock->aMethod(); + } + + function testOnceSatisfiedByOneCall() { + $mock = &new MockDummy(); + $mock->expectOnce('aMethod'); + $mock->aMethod(); + } + + function testMinimumCallsSatisfiedByEnoughCalls() { + $mock = &new MockDummy(); + $mock->expectMinimumCallCount('aMethod', 1); + $mock->aMethod(); + } + + function testMinimumCallsSatisfiedByTooManyCalls() { + $mock = &new MockDummy(); + $mock->expectMinimumCallCount('aMethod', 3); + $mock->aMethod(); + $mock->aMethod(); + $mock->aMethod(); + $mock->aMethod(); + } + + function testMaximumCallsSatisfiedByEnoughCalls() { + $mock = &new MockDummy(); + $mock->expectMaximumCallCount('aMethod', 1); + $mock->aMethod(); + } + + function testMaximumCallsSatisfiedByNoCalls() { + $mock = &new MockDummy(); + $mock->expectMaximumCallCount('aMethod', 1); + } +} + +class MockWithInjectedTestCase extends SimpleMock { + function &_getCurrentTestCase() { + $context = &SimpleTest::getContext(); + $test = &$context->getTest(); + return $test->getMockedTest(); + } +} +SimpleTest::setMockBaseClass('MockWithInjectedTestCase'); +Mock::generate('Dummy', 'MockDummyWithInjectedTestCase'); +SimpleTest::setMockBaseClass('SimpleMock'); +Mock::generate('SimpleTestCase'); + +class LikeExpectation extends IdenticalExpectation { + function LikeExpectation($expectation) { + $expectation->_message = ''; + $this->IdenticalExpectation($expectation); + } + + function test($compare) { + $compare->_message = ''; + return parent::test($compare); + } + + function testMessage($compare) { + $compare->_message = ''; + return parent::testMessage($compare); + } +} + +class TestOfMockExpectations extends UnitTestCase { + var $test; + + function setUp() { + $this->test = &new MockSimpleTestCase(); + } + + function &getMockedTest() { + return $this->test; + } + + function testSettingExpectationOnNonMethodThrowsError() { + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectMaximumCallCount('aMissingMethod', 2); + $this->assertError(); + } + + function testMaxCallsDetectsOverrun() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MaximumCallCountExpectation('aMethod', 2)), + 3)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectMaximumCallCount('aMethod', 2); + $mock->aMethod(); + $mock->aMethod(); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testTallyOnMaxCallsSendsPassOnUnderrun() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MaximumCallCountExpectation('aMethod', 2)), + 2)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectMaximumCallCount("aMethod", 2); + $mock->aMethod(); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testExpectNeverDetectsOverrun() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MaximumCallCountExpectation('aMethod', 0)), + 1)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectNever('aMethod'); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testTallyOnExpectNeverStillSendsPassOnUnderrun() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MaximumCallCountExpectation('aMethod', 0)), + 0)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectNever('aMethod'); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testMinCalls() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MinimumCallCountExpectation('aMethod', 2)), + 2)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectMinimumCallCount('aMethod', 2); + $mock->aMethod(); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testFailedNever() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MaximumCallCountExpectation('aMethod', 0)), + 1)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectNever('aMethod'); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testUnderOnce() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new CallCountExpectation('aMethod', 1)), + 0)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectOnce('aMethod'); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testOverOnce() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new CallCountExpectation('aMethod', 1)), + 2)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectOnce('aMethod'); + $mock->aMethod(); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testUnderAtLeastOnce() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new MinimumCallCountExpectation('aMethod', 1)), + 0)); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectAtLeastOnce("aMethod"); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testZeroArguments() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new ParametersExpectation(array())), + array(), + '*')); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expect("aMethod", array()); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testExpectedArguments() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new ParametersExpectation(array(1, 2, 3))), + array(1, 2, 3), + '*')); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expect('aMethod', array(1, 2, 3)); + $mock->aMethod(1, 2, 3); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testFailedArguments() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new ParametersExpectation(array('this'))), + array('that'), + '*')); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expect('aMethod', array('this')); + $mock->aMethod('that'); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testWildcardsAreTranslatedToAnythingExpectations() { + $this->test->expectOnce('assert', array( + new LikeExpectation(new ParametersExpectation(array( + new AnythingExpectation(), 123, new AnythingExpectation()))), + array(100, 123, 101), + '*')); + $mock = &new MockDummyWithInjectedTestCase($this); + $mock->expect("aMethod", array('*', 123, '*')); + $mock->aMethod(100, 123, 101); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testSpecificPassingSequence() { + $this->test->expectAt(0, 'assert', array( + new LikeExpectation(new ParametersExpectation(array(1, 2, 3))), + array(1, 2, 3), + '*')); + $this->test->expectAt(1, 'assert', array( + new LikeExpectation(new ParametersExpectation(array('Hello'))), + array('Hello'), + '*')); + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expectAt(1, 'aMethod', array(1, 2, 3)); + $mock->expectAt(2, 'aMethod', array('Hello')); + $mock->aMethod(); + $mock->aMethod(1, 2, 3); + $mock->aMethod('Hello'); + $mock->aMethod(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } + + function testNonArrayForExpectedParametersGivesError() { + $mock = &new MockDummyWithInjectedTestCase(); + $mock->expect("aMethod", "foo"); + $this->assertErrorPattern('/\$args.*not an array/i'); + $mock->aMethod(); + $mock->tally(); + $mock->_mock->atTestEnd('testSomething', $this->test); + } +} + +class TestOfMockComparisons extends UnitTestCase { + + function testEqualComparisonOfMocksDoesNotCrash() { + $expectation = &new EqualExpectation(new MockDummy()); + $this->assertTrue($expectation->test(new MockDummy(), true)); + } + + function testIdenticalComparisonOfMocksDoesNotCrash() { + $expectation = &new IdenticalExpectation(new MockDummy()); + $this->assertTrue($expectation->test(new MockDummy())); + } +} + +class ClassWithSpecialMethods { + function __get($name) { } + function __set($name, $value) { } + function __isset($name) { } + function __unset($name) { } + function __call($method, $arguments) { } + function __toString() { } +} +Mock::generate('ClassWithSpecialMethods'); + +class TestOfSpecialMethods extends UnitTestCase { + function skip() { + $this->skipIf(version_compare(phpversion(), '5', '<='), 'Overloading not tested unless PHP 5+'); + } + + function testCanMockTheThingAtAll() { + $mock = new MockClassWithSpecialMethods(); + } + + function testReturnFromSpecialAccessor() { + $mock = &new MockClassWithSpecialMethods(); + $mock->setReturnValue('__get', '1st Return', array('first')); + $mock->setReturnValue('__get', '2nd Return', array('second')); + $this->assertEqual($mock->first, '1st Return'); + $this->assertEqual($mock->second, '2nd Return'); + } + + function testcanExpectTheSettingOfValue() { + $mock = &new MockClassWithSpecialMethods(); + $mock->expectOnce('__set', array('a', 'A')); + $mock->a = 'A'; + } + + function testCanSimulateAnOverloadmethod() { + $mock = &new MockClassWithSpecialMethods(); + $mock->expectOnce('__call', array('amOverloaded', array('A'))); + $mock->setReturnValue('__call', 'aaa'); + $this->assertIdentical($mock->amOverloaded('A'), 'aaa'); + } + + function testCanEmulateIsset() { + $mock = &new MockClassWithSpecialMethods(); + $mock->setReturnValue('__isset', true); + $this->assertIdentical(isset($mock->a), true); + } + + function testCanExpectUnset() { + $mock = &new MockClassWithSpecialMethods(); + $mock->expectOnce('__unset', array('a')); + unset($mock->a); + } + + function testToStringMagic() { + $mock = &new MockClassWithSpecialMethods(); + $mock->expectOnce('__toString'); + $mock->setReturnValue('__toString', 'AAA'); + ob_start(); + print $mock; + $output = ob_get_contents(); + ob_end_clean(); + $this->assertEqual($output, 'AAA'); + } +} + +if (version_compare(phpversion(), '5', '>=')) { + $class = 'class WithStaticMethod { '; + $class .= ' static function aStaticMethod() { } '; + $class .= '}'; + eval($class); +} +Mock::generate('WithStaticMethod'); + +class TestOfMockingClassesWithStaticMethods extends UnitTestCase { + function skip() { + $this->skipUnless(version_compare(phpversion(), '5', '>='), 'Static methods not tested unless PHP 5+'); + } + + function testStaticMethodIsMockedAsStatic() { + $mock = new WithStaticMethod(); + $reflection = new ReflectionClass($mock); + $method = $reflection->getMethod('aStaticMethod'); + $this->assertTrue($method->isStatic()); + } +} + +if (version_compare(phpversion(), '5', '>=')) { + class MockTestException extends Exception { } +} + +class TestOfThrowingExceptionsFromMocks extends UnitTestCase { + function skip() { + $this->skipUnless(version_compare(phpversion(), '5', '>='), 'Exception throwing not tested unless PHP 5+'); + } + + function testCanThrowOnMethodCall() { + $mock = new MockDummy(); + $mock->throwOn('aMethod'); + $this->expectException(); + $mock->aMethod(); + } + + function testCanThrowSpecificExceptionOnMethodCall() { + $mock = new MockDummy(); + $mock->throwOn('aMethod', new MockTestException()); + $this->expectException(); + $mock->aMethod(); + } + + function testThrowsOnlyWhenCallSignatureMatches() { + $mock = new MockDummy(); + $mock->throwOn('aMethod', new MockTestException(), array(3)); + $mock->aMethod(1); + $mock->aMethod(2); + $this->expectException(); + $mock->aMethod(3); + } + + function testCanThrowOnParticularInvocation() { + $mock = new MockDummy(); + $mock->throwAt(2, 'aMethod', new MockTestException()); + $mock->aMethod(); + $mock->aMethod(); + $this->expectException(); + $mock->aMethod(); + } +} + +class TestOfThrowingErrorsFromMocks extends UnitTestCase { + + function testCanGenerateErrorFromMethodCall() { + $mock = new MockDummy(); + $mock->errorOn('aMethod', 'Ouch!'); + $this->expectError('Ouch!'); + $mock->aMethod(); + } + + function testGeneratesErrorOnlyWhenCallSignatureMatches() { + $mock = new MockDummy(); + $mock->errorOn('aMethod', 'Ouch!', array(3)); + $mock->aMethod(1); + $mock->aMethod(2); + $this->expectError(); + $mock->aMethod(3); + } + + function testCanGenerateErrorOnParticularInvocation() { + $mock = new MockDummy(); + $mock->errorAt(2, 'aMethod', 'Ouch!'); + $mock->aMethod(); + $mock->aMethod(); + $this->expectError(); + $mock->aMethod(); + } +} + +Mock::generatePartial('Dummy', 'TestDummy', array('anotherMethod')); + +class TestOfPartialMocks extends UnitTestCase { + + function testMethodReplacementWithNoBehaviourReturnsNull() { + $mock = &new TestDummy(); + $this->assertEqual($mock->aMethod(99), 99); + $this->assertNull($mock->anotherMethod()); + } + + function testSettingReturns() { + $mock = &new TestDummy(); + $mock->setReturnValue('anotherMethod', 33, array(3)); + $mock->setReturnValue('anotherMethod', 22); + $mock->setReturnValueAt(2, 'anotherMethod', 44, array(3)); + $this->assertEqual($mock->anotherMethod(), 22); + $this->assertEqual($mock->anotherMethod(3), 33); + $this->assertEqual($mock->anotherMethod(3), 44); + } + + function testReferences() { + $mock = &new TestDummy(); + $object = new Dummy(); + $mock->setReturnReferenceAt(0, 'anotherMethod', $object, array(3)); + $this->assertReference($zref =& $mock->anotherMethod(3), $object); + } + + function testExpectations() { + $mock = &new TestDummy(); + $mock->expectCallCount('anotherMethod', 2); + $mock->expect('anotherMethod', array(77)); + $mock->expectAt(1, 'anotherMethod', array(66)); + $mock->anotherMethod(77); + $mock->anotherMethod(66); + } + + function testSettingExpectationOnMissingMethodThrowsError() { + $mock = &new TestDummy(); + $mock->expectCallCount('aMissingMethod', 2); + $this->assertError(); + } +} + +class ConstructorSuperClass { + function ConstructorSuperClass() { } +} + +class ConstructorSubClass extends ConstructorSuperClass { +} + +class TestOfPHP4StyleSuperClassConstruct extends UnitTestCase { + /* + * This addresses issue #1231401. Without the fix in place, this will + * generate a fatal PHP error. + */ + function testBasicConstruct() { + Mock::generate('ConstructorSubClass'); + $mock = &new MockConstructorSubClass(); + $this->assertIsA($mock, 'ConstructorSubClass'); + $this->assertTrue(method_exists($mock, 'ConstructorSuperClass')); + } +} + +class TestOfPHP5StaticMethodMocking extends UnitTestCase { + function skip() { + $this->skipIf(version_compare(phpversion(), '5', '<='), 'Static methods not tested unless PHP 5+'); + } + + function testCanCreateAMockObjectWithStaticMethodsWithoutError() { + eval(' + class SimpleObjectContainingStaticMethod { + static function someStatic() { } + } + '); + + Mock::generate('SimpleObjectContainingStaticMethod'); + $this->assertNoErrors(); + } +} + +class TestOfPHP5AbstractMethodMocking extends UnitTestCase { + function skip() { + $this->skipIf(version_compare(phpversion(), '5', '<='), 'Abstract class/methods not tested unless PHP 5+'); + } + + function testCanCreateAMockObjectFromAnAbstractWithProperFunctionDeclarations() { + eval(' + abstract class SimpleAbstractClassContainingAbstractMethods { + abstract function anAbstract(); + abstract function anAbstractWithParameter($foo); + abstract function anAbstractWithMultipleParameters($foo, $bar); + } + '); + + Mock::generate('SimpleAbstractClassContainingAbstractMethods'); + $this->assertNoErrors(); + + $this->assertTrue( + method_exists( + 'MockSimpleAbstractClassContainingAbstractMethods', + 'anAbstract' + ) + ); + $this->assertTrue( + method_exists( + 'MockSimpleAbstractClassContainingAbstractMethods', + 'anAbstractWithParameter' + ) + ); + $this->assertTrue( + method_exists( + 'MockSimpleAbstractClassContainingAbstractMethods', + 'anAbstractWithMultipleParameters' + ) + ); + } + + function testMethodsDefinedAsAbstractInParentShouldHaveFullSignature() { + eval(' + abstract class SimpleParentAbstractClassContainingAbstractMethods { + abstract function anAbstract(); + abstract function anAbstractWithParameter($foo); + abstract function anAbstractWithMultipleParameters($foo, $bar); + } + + class SimpleChildAbstractClassContainingAbstractMethods extends SimpleParentAbstractClassContainingAbstractMethods { + function anAbstract(){} + function anAbstractWithParameter($foo){} + function anAbstractWithMultipleParameters($foo, $bar){} + } + + class EvenDeeperEmptyChildClass extends SimpleChildAbstractClassContainingAbstractMethods {} + '); + + Mock::generate('SimpleChildAbstractClassContainingAbstractMethods'); + $this->assertNoErrors(); + + $this->assertTrue( + method_exists( + 'MockSimpleChildAbstractClassContainingAbstractMethods', + 'anAbstract' + ) + ); + $this->assertTrue( + method_exists( + 'MockSimpleChildAbstractClassContainingAbstractMethods', + 'anAbstractWithParameter' + ) + ); + $this->assertTrue( + method_exists( + 'MockSimpleChildAbstractClassContainingAbstractMethods', + 'anAbstractWithMultipleParameters' + ) + ); + + Mock::generate('EvenDeeperEmptyChildClass'); + $this->assertNoErrors(); + + $this->assertTrue( + method_exists( + 'MockEvenDeeperEmptyChildClass', + 'anAbstract' + ) + ); + $this->assertTrue( + method_exists( + 'MockEvenDeeperEmptyChildClass', + 'anAbstractWithParameter' + ) + ); + $this->assertTrue( + method_exists( + 'MockEvenDeeperEmptyChildClass', + 'anAbstractWithMultipleParameters' + ) + ); + } +} + +?> diff --git a/tests/simpletest/test/page_test.php b/tests/simpletest/test/page_test.php new file mode 100644 index 000000000..76e6a515b --- /dev/null +++ b/tests/simpletest/test/page_test.php @@ -0,0 +1,903 @@ + 'http://somewhere')); + $tag->addContent('Label'); + + $page = &new MockSimplePage(); + $page->expectArguments('acceptTag', array($tag)); + $page->expectCallCount('acceptTag', 1); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser()); + $builder->SimplePageBuilder(); + + $builder->parse(new MockSimpleHttpResponse()); + $this->assertTrue($builder->startElement( + 'a', + array('href' => 'http://somewhere'))); + $this->assertTrue($builder->addContent('Label')); + $this->assertTrue($builder->endElement('a')); + } + + function testLinkWithId() { + $tag = &new SimpleAnchorTag(array("href" => "http://somewhere", "id" => "44")); + $tag->addContent("Label"); + + $page = &new MockSimplePage(); + $page->expectArguments("acceptTag", array($tag)); + $page->expectCallCount("acceptTag", 1); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser()); + $builder->SimplePageBuilder(); + + $builder->parse(new MockSimpleHttpResponse()); + $this->assertTrue($builder->startElement( + "a", + array("href" => "http://somewhere", "id" => "44"))); + $this->assertTrue($builder->addContent("Label")); + $this->assertTrue($builder->endElement("a")); + } + + function testLinkExtraction() { + $tag = &new SimpleAnchorTag(array("href" => "http://somewhere")); + $tag->addContent("Label"); + + $page = &new MockSimplePage(); + $page->expectArguments("acceptTag", array($tag)); + $page->expectCallCount("acceptTag", 1); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser()); + $builder->SimplePageBuilder(); + + $builder->parse(new MockSimpleHttpResponse()); + $this->assertTrue($builder->addContent("Starting stuff")); + $this->assertTrue($builder->startElement( + "a", + array("href" => "http://somewhere"))); + $this->assertTrue($builder->addContent("Label")); + $this->assertTrue($builder->endElement("a")); + $this->assertTrue($builder->addContent("Trailing stuff")); + } + + function testMultipleLinks() { + $a1 = new SimpleAnchorTag(array("href" => "http://somewhere")); + $a1->addContent("1"); + + $a2 = new SimpleAnchorTag(array("href" => "http://elsewhere")); + $a2->addContent("2"); + + $page = &new MockSimplePage(); + $page->expectArgumentsAt(0, "acceptTag", array($a1)); + $page->expectArgumentsAt(1, "acceptTag", array($a2)); + $page->expectCallCount("acceptTag", 2); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser()); + $builder->SimplePageBuilder(); + + $builder->parse(new MockSimpleHttpResponse()); + $builder->startElement("a", array("href" => "http://somewhere")); + $builder->addContent("1"); + $builder->endElement("a"); + $builder->addContent("Padding"); + $builder->startElement("a", array("href" => "http://elsewhere")); + $builder->addContent("2"); + $builder->endElement("a"); + } + + function testTitle() { + $tag = &new SimpleTitleTag(array()); + $tag->addContent("HereThere"); + + $page = &new MockSimplePage(); + $page->expectArguments("acceptTag", array($tag)); + $page->expectCallCount("acceptTag", 1); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser()); + $builder->SimplePageBuilder(); + + $builder->parse(new MockSimpleHttpResponse()); + $builder->startElement("title", array()); + $builder->addContent("Here"); + $builder->addContent("There"); + $builder->endElement("title"); + } + + function testForm() { + $page = &new MockSimplePage(); + $page->expectOnce("acceptFormStart", array(new SimpleFormTag(array()))); + $page->expectOnce("acceptFormEnd", array()); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', new MockSimpleHtmlSaxParser()); + $builder->SimplePageBuilder(); + + $builder->parse(new MockSimpleHttpResponse()); + $builder->startElement("form", array()); + $builder->addContent("Stuff"); + $builder->endElement("form"); + } +} + +class TestOfPageParsing extends UnitTestCase { + + function testParseMechanics() { + $parser = &new MockSimpleHtmlSaxParser(); + $parser->expectOnce('parse', array('stuff')); + + $page = &new MockSimplePage(); + $page->expectOnce('acceptPageEnd'); + + $builder = &new PartialSimplePageBuilder(); + $builder->setReturnReference('_createPage', $page); + $builder->setReturnReference('_createParser', $parser); + $builder->SimplePageBuilder(); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', 'stuff'); + $builder->parse($response); + } +} + +class TestOfPageInterface extends UnitTestCase { + + function testInterfaceOnEmptyPage() { + $page = &new SimplePage(); + $this->assertEqual($page->getTransportError(), 'No page fetched yet'); + $this->assertIdentical($page->getRaw(), false); + $this->assertIdentical($page->getHeaders(), false); + $this->assertIdentical($page->getMimeType(), false); + $this->assertIdentical($page->getResponseCode(), false); + $this->assertIdentical($page->getAuthentication(), false); + $this->assertIdentical($page->getRealm(), false); + $this->assertFalse($page->hasFrames()); + $this->assertIdentical($page->getUrls(), array()); + $this->assertIdentical($page->getTitle(), false); + } +} + +class TestOfPageHeaders extends UnitTestCase { + + function testUrlAccessor() { + $headers = &new MockSimpleHttpHeaders(); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getHeaders', $headers); + $response->setReturnValue('getMethod', 'POST'); + $response->setReturnValue('getUrl', new SimpleUrl('here')); + $response->setReturnValue('getRequestData', array('a' => 'A')); + + $page = &new SimplePage($response); + $this->assertEqual($page->getMethod(), 'POST'); + $this->assertEqual($page->getUrl(), new SimpleUrl('here')); + $this->assertEqual($page->getRequestData(), array('a' => 'A')); + } + + function testTransportError() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getError', 'Ouch'); + + $page = &new SimplePage($response); + $this->assertEqual($page->getTransportError(), 'Ouch'); + } + + function testHeadersAccessor() { + $headers = &new MockSimpleHttpHeaders(); + $headers->setReturnValue('getRaw', 'My: Headers'); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getHeaders', $headers); + + $page = &new SimplePage($response); + $this->assertEqual($page->getHeaders(), 'My: Headers'); + } + + function testMimeAccessor() { + $headers = &new MockSimpleHttpHeaders(); + $headers->setReturnValue('getMimeType', 'text/html'); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getHeaders', $headers); + + $page = &new SimplePage($response); + $this->assertEqual($page->getMimeType(), 'text/html'); + } + + function testResponseAccessor() { + $headers = &new MockSimpleHttpHeaders(); + $headers->setReturnValue('getResponseCode', 301); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getHeaders', $headers); + + $page = &new SimplePage($response); + $this->assertIdentical($page->getResponseCode(), 301); + } + + function testAuthenticationAccessors() { + $headers = &new MockSimpleHttpHeaders(); + $headers->setReturnValue('getAuthentication', 'Basic'); + $headers->setReturnValue('getRealm', 'Secret stuff'); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getHeaders', $headers); + + $page = &new SimplePage($response); + $this->assertEqual($page->getAuthentication(), 'Basic'); + $this->assertEqual($page->getRealm(), 'Secret stuff'); + } +} + +class TestOfHtmlPage extends UnitTestCase { + + function testRawAccessor() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', 'Raw HTML'); + + $page = &new SimplePage($response); + $this->assertEqual($page->getRaw(), 'Raw HTML'); + } + + function testTextAccessor() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', 'Some "messy" HTML'); + + $page = &new SimplePage($response); + $this->assertEqual($page->getText(), 'Some "messy" HTML'); + } + + function testNoLinks() { + $page = &new SimplePage(new MockSimpleHttpResponse()); + $this->assertIdentical($page->getUrls(), array()); + $this->assertIdentical($page->getUrlsByLabel('Label'), array()); + } + + function testAddAbsoluteLink() { + $link = &new SimpleAnchorTag(array('href' => 'http://somewhere.com')); + $link->addContent('Label'); + $page = &new SimplePage(new MockSimpleHttpResponse()); + $page->AcceptTag($link); + $this->assertEqual( + $page->getUrlsByLabel('Label'), + array(new SimpleUrl('http://somewhere.com'))); + } + + function testAddStrictRelativeLink() { + $link = &new SimpleAnchorTag(array('href' => './somewhere.php')); + $link->addContent('Label'); + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + $page = &new SimplePage($response); + $page->AcceptTag($link); + $this->assertEqual( + $page->getUrlsByLabel('Label'), + array(new SimpleUrl('http://host/somewhere.php'))); + } + + function testAddBareRelativeLink() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + $page = &new SimplePage($response); + $page->AcceptTag(new SimpleAnchorTag(array('href' => 'somewhere.php'))); + $this->assertIdentical($page->getUrls(), array('http://host/somewhere.php')); + } + + function testAddRelativeLinkWithBaseTag() { + $link = &new SimpleAnchorTag(array('href' => 'somewhere.php')); + $link->addContent('Label'); + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + $page = &new SimplePage($response); + $page->AcceptTag($link); + $base = &new SimpleBaseTag(array('href' => 'www.lastcraft.com/stuff/')); + $page->AcceptTag($base); + $this->assertEqual( + $page->getUrlsByLabel('Label'), + array(new SimpleUrl('www.lastcraft.com/stuff/somewhere.php'))); + } + + function testAddAbsoluteLinkWithBaseTag() { + $link = &new SimpleAnchorTag(array('href' => 'http://here.com/somewhere.php')); + $link->addContent('Label'); + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + $page = &new SimplePage($response); + $page->AcceptTag($link); + $base = &new SimpleBaseTag(array('href' => 'www.lastcraft.com/stuff/')); + $page->AcceptTag($base); + $this->assertEqual( + $page->getUrlsByLabel('Label'), + array(new SimpleUrl('http://here.com/somewhere.php'))); + } + + function testLinkIds() { + $link = &new SimpleAnchorTag(array('href' => './somewhere.php', 'id' => 33)); + $link->addContent('Label'); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &new SimplePage($response); + $page->AcceptTag($link); + + $this->assertEqual( + $page->getUrlsByLabel('Label'), + array(new SimpleUrl('http://host/somewhere.php'))); + $this->assertFalse($page->getUrlById(0)); + $this->assertEqual( + $page->getUrlById(33), + new SimpleUrl('http://host/somewhere.php')); + } + + function testFindLinkWithNormalisation() { + $link = &new SimpleAnchorTag(array('href' => './somewhere.php', 'id' => 33)); + $link->addContent(' Long & thin '); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &new SimplePage($response); + $page->AcceptTag($link); + + $this->assertEqual( + $page->getUrlsByLabel('Long & thin'), + array(new SimpleUrl('http://host/somewhere.php'))); + } + + function testFindLinkWithImage() { + $link = &new SimpleAnchorTag(array('href' => './somewhere.php', 'id' => 33)); + $link->addContent('<A picture>'); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &new SimplePage($response); + $page->AcceptTag($link); + + $this->assertEqual( + $page->getUrlsByLabel(''), + array(new SimpleUrl('http://host/somewhere.php'))); + } + + function testTitleSetting() { + $title = &new SimpleTitleTag(array()); + $title->addContent('Title'); + $page = &new SimplePage(new MockSimpleHttpResponse()); + $page->AcceptTag($title); + $this->assertEqual($page->getTitle(), 'Title'); + } + + function testFramesetAbsence() { + $url = new SimpleUrl('here'); + $response = new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', $url); + $page = &new SimplePage($response); + $this->assertFalse($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), false); + } + + function testHasEmptyFrameset() { + $page = &new SimplePage(new MockSimpleHttpResponse()); + $page->acceptFramesetStart(new SimpleTag('frameset', array())); + $page->acceptFramesetEnd(); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array()); + } + + function testFramesInPage() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://here')); + + $page = &new SimplePage($response); + $page->acceptFrame(new SimpleFrameTag(array('src' => '1.html'))); + $page->acceptFramesetStart(new SimpleTag('frameset', array())); + $page->acceptFrame(new SimpleFrameTag(array('src' => '2.html'))); + $page->acceptFrame(new SimpleFrameTag(array('src' => '3.html'))); + $page->acceptFramesetEnd(); + $page->acceptFrame(new SimpleFrameTag(array('src' => '4.html'))); + + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array( + 1 => new SimpleUrl('http://here/2.html'), + 2 => new SimpleUrl('http://here/3.html'))); + } + + function testNamedFramesInPage() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://here')); + + $page = &new SimplePage($response); + $page->acceptFramesetStart(new SimpleTag('frameset', array())); + $page->acceptFrame(new SimpleFrameTag(array('src' => '1.html'))); + $page->acceptFrame(new SimpleFrameTag(array('src' => '2.html', 'name' => 'A'))); + $page->acceptFrame(new SimpleFrameTag(array('src' => '3.html', 'name' => 'B'))); + $page->acceptFrame(new SimpleFrameTag(array('src' => '4.html'))); + $page->acceptFramesetEnd(); + + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array( + 1 => new SimpleUrl('http://here/1.html'), + 'A' => new SimpleUrl('http://here/2.html'), + 'B' => new SimpleUrl('http://here/3.html'), + 4 => new SimpleUrl('http://here/4.html'))); + } + + function testRelativeFramesRespectBaseTag() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getUrl', new SimpleUrl('http://here.com/')); + $page = &new SimplePage($response); + + $base = &new SimpleBaseTag(array('href' => 'https://there.com/stuff/')); + $page->AcceptTag($base); + + $page->acceptFramesetStart(new SimpleTag('frameset', array())); + $page->acceptFrame(new SimpleFrameTag(array('src' => '1.html'))); + $page->acceptFramesetEnd(); + $this->assertIdentical( + $page->getFrameset(), + array(1 => new SimpleUrl('https://there.com/stuff/1.html'))); + } +} + +class TestOfFormsCreatedFromEventStream extends UnitTestCase { + + function testFormCanBeSubmitted() { + $page = &new SimplePage(new MockSimpleHttpResponse()); + $page->acceptFormStart( + new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php'))); + $page->AcceptTag( + new SimpleSubmitTag(array('type' => 'submit', 'name' => 's'))); + $page->acceptFormEnd(); + $form = &$page->getFormBySubmit(new SimpleByLabel('Submit')); + $this->assertEqual( + $form->submitButton(new SimpleByLabel('Submit')), + new SimpleGetEncoding(array('s' => 'Submit'))); + } + + function testInputFieldCanBeReadBack() { + $page = &new SimplePage(new MockSimpleHttpResponse()); + $page->acceptFormStart( + new SimpleFormTag(array("method" => "GET", "action" => "here.php"))); + $page->AcceptTag( + new SimpleTextTag(array("type" => "text", "name" => "a", "value" => "A"))); + $page->AcceptTag( + new SimpleSubmitTag(array("type" => "submit", "name" => "s"))); + $page->acceptFormEnd(); + $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); + } + + function testInputFieldCanBeReadBackByLabel() { + $label = &new SimpleLabelTag(array()); + $page = &new SimplePage(new MockSimpleHttpResponse()); + $page->acceptFormStart( + new SimpleFormTag(array("method" => "GET", "action" => "here.php"))); + $page->acceptLabelStart($label); + $label->addContent('l'); + $page->AcceptTag( + new SimpleTextTag(array("type" => "text", "name" => "a", "value" => "A"))); + $page->acceptLabelEnd(); + $page->AcceptTag( + new SimpleSubmitTag(array("type" => "submit", "name" => "s"))); + $page->acceptFormEnd(); + $this->assertEqual($page->getField(new SimpleByLabel('l')), 'A'); + } +} + +class TestOfPageScraping extends UnitTestCase { + + function &parse($response) { + $builder = &new SimplePageBuilder(); + $page = &$builder->parse($response); + return $page; + } + + function testEmptyPage() { + $page = &new SimplePage(new MockSimpleHttpResponse()); + $this->assertIdentical($page->getUrls(), array()); + $this->assertIdentical($page->getTitle(), false); + } + + function testUninterestingPage() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', '

      Stuff

      '); + $page = &$this->parse($response); + $this->assertIdentical($page->getUrls(), array()); + } + + function testLinksPage() { + $raw = ''; + $raw .= '
      There'; + $raw .= 'That page'; + $raw .= ''; + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', $raw); + $response->setReturnValue('getUrl', new SimpleUrl('http://www.here.com/a/index.html')); + + $page = &$this->parse($response); + $this->assertIdentical( + $page->getUrls(), + array('http://www.here.com/a/there.html', 'http://there.com/that.html')); + $this->assertIdentical( + $page->getUrlsByLabel('There'), + array(new SimpleUrl('http://www.here.com/a/there.html'))); + $this->assertEqual( + $page->getUrlById('0'), + new SimpleUrl('http://there.com/that.html')); + } + + function testTitle() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', 'Me'); + $page = &$this->parse($response); + $this->assertEqual($page->getTitle(), 'Me'); + } + + function testNastyTitle() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + ' <b>Me&Me '); + $page = &$this->parse($response); + $this->assertEqual($page->getTitle(), "Me&Me"); + } + + function testCompleteForm() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByName('here')), "Hello"); + } + + function testUnclosedForm() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + ''); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByName('here')), "Hello"); + } + + function testEmptyFrameset() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + ''); + $page = &$this->parse($response); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array()); + } + + function testSingleFrame() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + ''); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &$this->parse($response); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical( + $page->getFrameset(), + array(1 => new SimpleUrl('http://host/a.html'))); + } + + function testSingleFrameInNestedFrameset() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '' . + '' . + ''); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &$this->parse($response); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical( + $page->getFrameset(), + array(1 => new SimpleUrl('http://host/a.html'))); + } + + function testFrameWithNoSource() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + ''); + $page = &$this->parse($response); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array()); + } + + function testFramesCollectedWithNestedFramesetTags() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '' . + '' . + '' . + '' . + ''); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &$this->parse($response); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array( + 1 => new SimpleUrl('http://host/a.html'), + 2 => new SimpleUrl('http://host/b.html'), + 3 => new SimpleUrl('http://host/c.html'))); + } + + function testNamedFrames() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '' . + '' . + '' . + '' . + '' . + ''); + $response->setReturnValue('getUrl', new SimpleUrl('http://host/')); + + $page = &$this->parse($response); + $this->assertTrue($page->hasFrames()); + $this->assertIdentical($page->getFrameset(), array( + 1 => new SimpleUrl('http://host/a.html'), + '_one' => new SimpleUrl('http://host/b.html'), + 3 => new SimpleUrl('http://host/c.html'), + '_two' => new SimpleUrl('http://host/d.html'))); + } + + function testFindFormByLabel() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + '
      '); + $page = &$this->parse($response); + $this->assertNull($page->getFormBySubmit(new SimpleByLabel('submit'))); + $this->assertNull($page->getFormBySubmit(new SimpleByName('submit'))); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByLabel('Submit')), + 'SimpleForm'); + } + + function testConfirmSubmitAttributesAreCaseSensitive() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + '
      '); + $page = &$this->parse($response); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByName('S')), + 'SimpleForm'); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByLabel('S')), + 'SimpleForm'); + } + + function testFindFormByImage() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertIsA( + $page->getFormByImage(new SimpleByLabel('Label')), + 'SimpleForm'); + $this->assertIsA( + $page->getFormByImage(new SimpleByName('me')), + 'SimpleForm'); + $this->assertIsA( + $page->getFormByImage(new SimpleById(100)), + 'SimpleForm'); + } + + function testFindFormByButtonTag() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertNull($page->getFormBySubmit(new SimpleByLabel('b'))); + $this->assertNull($page->getFormBySubmit(new SimpleByLabel('B'))); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByName('b')), + 'SimpleForm'); + $this->assertIsA( + $page->getFormBySubmit(new SimpleByLabel('BBB')), + 'SimpleForm'); + } + + function testFindFormById() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue( + 'getContent', + '
      '); + $page = &$this->parse($response); + $this->assertNull($page->getFormById(54)); + $this->assertIsA($page->getFormById(55), 'SimpleForm'); + } + + function testReadingTextField() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertNull($page->getField(new SimpleByName('missing'))); + $this->assertIdentical($page->getField(new SimpleByName('a')), ''); + $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb'); + } + + function testReadingTextFieldIsCaseInsensitive() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertNull($page->getField(new SimpleByName('missing'))); + $this->assertIdentical($page->getField(new SimpleByName('a')), ''); + $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb'); + } + + function testSettingTextField() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); + $this->assertTrue($page->setField(new SimpleById(3), 'bbb')); + $this->assertEqual($page->getField(new SimpleBYId(3)), 'bbb'); + $this->assertFalse($page->setField(new SimpleByName('z'), 'zzz')); + $this->assertNull($page->getField(new SimpleByName('z'))); + } + + function testSettingTextFieldByEnclosingLabel() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa'); + } + + function testGettingTextFieldByEnclosingLabelWithConflictingOtherFields() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByName('a')), 'A'); + $this->assertEqual($page->getField(new SimpleByName('b')), 'B'); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + } + + function testSettingTextFieldByExternalLabel() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa'); + } + + function testReadingTextArea() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); + } + + function testSettingTextArea() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertTrue($page->setField(new SimpleByName('a'), 'AAA')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'AAA'); + } + + function testSettingSelectionField() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByName('a')), 'bbb'); + $this->assertFalse($page->setField(new SimpleByName('a'), 'ccc')); + $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa')); + $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa'); + } + + function testSettingSelectionFieldByEnclosingLabel() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); + $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'B')); + $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'B'); + } + + function testSettingRadioButtonByEnclosingLabel() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', + '
      ' . + '' . + '' . + '
      '); + $page = &$this->parse($response); + $this->assertEqual($page->getField(new SimpleByLabel('A')), 'a'); + $this->assertTrue($page->setField(new SimpleBylabel('B'), 'b')); + $this->assertEqual($page->getField(new SimpleByLabel('B')), 'b'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/parse_error_test.php b/tests/simpletest/test/parse_error_test.php new file mode 100644 index 000000000..c3ffb3d42 --- /dev/null +++ b/tests/simpletest/test/parse_error_test.php @@ -0,0 +1,9 @@ +addFile('test_with_parse_error.php'); +$test->run(new HtmlReporter()); +?> \ No newline at end of file diff --git a/tests/simpletest/test/parser_test.php b/tests/simpletest/test/parser_test.php new file mode 100644 index 000000000..83268d9e1 --- /dev/null +++ b/tests/simpletest/test/parser_test.php @@ -0,0 +1,551 @@ +assertFalse($regex->match("Hello", $match)); + $this->assertEqual($match, ""); + } + + function testNoSubject() { + $regex = &new ParallelRegex(false); + $regex->addPattern(".*"); + $this->assertTrue($regex->match("", $match)); + $this->assertEqual($match, ""); + } + + function testMatchAll() { + $regex = &new ParallelRegex(false); + $regex->addPattern(".*"); + $this->assertTrue($regex->match("Hello", $match)); + $this->assertEqual($match, "Hello"); + } + + function testCaseSensitive() { + $regex = &new ParallelRegex(true); + $regex->addPattern("abc"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "abc"); + } + + function testCaseInsensitive() { + $regex = &new ParallelRegex(false); + $regex->addPattern("abc"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + } + + function testMatchMultiple() { + $regex = &new ParallelRegex(true); + $regex->addPattern("abc"); + $regex->addPattern("ABC"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + $this->assertFalse($regex->match("Hello", $match)); + } + + function testPatternLabels() { + $regex = &new ParallelRegex(false); + $regex->addPattern("abc", "letter"); + $regex->addPattern("123", "number"); + $this->assertIdentical($regex->match("abcdef", $match), "letter"); + $this->assertEqual($match, "abc"); + $this->assertIdentical($regex->match("0123456789", $match), "number"); + $this->assertEqual($match, "123"); + } +} + +class TestOfStateStack extends UnitTestCase { + + function testStartState() { + $stack = &new SimpleStateStack("one"); + $this->assertEqual($stack->getCurrent(), "one"); + } + + function testExhaustion() { + $stack = &new SimpleStateStack("one"); + $this->assertFalse($stack->leave()); + } + + function testStateMoves() { + $stack = &new SimpleStateStack("one"); + $stack->enter("two"); + $this->assertEqual($stack->getCurrent(), "two"); + $stack->enter("three"); + $this->assertEqual($stack->getCurrent(), "three"); + $this->assertTrue($stack->leave()); + $this->assertEqual($stack->getCurrent(), "two"); + $stack->enter("third"); + $this->assertEqual($stack->getCurrent(), "third"); + $this->assertTrue($stack->leave()); + $this->assertTrue($stack->leave()); + $this->assertEqual($stack->getCurrent(), "one"); + } +} + +class TestParser { + + function accept() { + } + + function a() { + } + + function b() { + } +} +Mock::generate('TestParser'); + +class TestOfLexer extends UnitTestCase { + + function testEmptyPage() { + $handler = &new MockTestParser(); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $lexer = &new SimpleLexer($handler); + $lexer->addPattern("a+"); + $this->assertTrue($lexer->parse("")); + } + + function testSinglePattern() { + $handler = &new MockTestParser(); + $handler->expectArgumentsAt(0, "accept", array("aaa", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "accept", array("x", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(2, "accept", array("a", LEXER_MATCHED)); + $handler->expectArgumentsAt(3, "accept", array("yyy", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(4, "accept", array("a", LEXER_MATCHED)); + $handler->expectArgumentsAt(5, "accept", array("x", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(6, "accept", array("aaa", LEXER_MATCHED)); + $handler->expectArgumentsAt(7, "accept", array("z", LEXER_UNMATCHED)); + $handler->expectCallCount("accept", 8); + $handler->setReturnValue("accept", true); + $lexer = &new SimpleLexer($handler); + $lexer->addPattern("a+"); + $this->assertTrue($lexer->parse("aaaxayyyaxaaaz")); + } + + function testMultiplePattern() { + $handler = &new MockTestParser(); + $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x"); + for ($i = 0; $i < count($target); $i++) { + $handler->expectArgumentsAt($i, "accept", array($target[$i], '*')); + } + $handler->expectCallCount("accept", count($target)); + $handler->setReturnValue("accept", true); + $lexer = &new SimpleLexer($handler); + $lexer->addPattern("a+"); + $lexer->addPattern("b+"); + $this->assertTrue($lexer->parse("ababbxbaxxxxxxax")); + } +} + +class TestOfLexerModes extends UnitTestCase { + + function testIsolatedPattern() { + $handler = &new MockTestParser(); + $handler->expectArgumentsAt(0, "a", array("a", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(3, "a", array("bxb", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(4, "a", array("aaa", LEXER_MATCHED)); + $handler->expectArgumentsAt(5, "a", array("x", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(6, "a", array("aaaa", LEXER_MATCHED)); + $handler->expectArgumentsAt(7, "a", array("x", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 8); + $handler->setReturnValue("a", true); + $lexer = &new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addPattern("b+", "b"); + $this->assertTrue($lexer->parse("abaabxbaaaxaaaax")); + } + + function testModeChange() { + $handler = &new MockTestParser(); + $handler->expectArgumentsAt(0, "a", array("a", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(3, "a", array("b", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(4, "a", array("aaa", LEXER_MATCHED)); + $handler->expectArgumentsAt(0, "b", array(":", LEXER_ENTER)); + $handler->expectArgumentsAt(1, "b", array("a", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(2, "b", array("b", LEXER_MATCHED)); + $handler->expectArgumentsAt(3, "b", array("a", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(4, "b", array("bb", LEXER_MATCHED)); + $handler->expectArgumentsAt(5, "b", array("a", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(6, "b", array("bbb", LEXER_MATCHED)); + $handler->expectArgumentsAt(7, "b", array("a", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 5); + $handler->expectCallCount("b", 8); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $lexer = &new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addEntryPattern(":", "a", "b"); + $lexer->addPattern("b+", "b"); + $this->assertTrue($lexer->parse("abaabaaa:ababbabbba")); + } + + function testNesting() { + $handler = &new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(3, "a", array("b", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(0, "b", array("(", LEXER_ENTER)); + $handler->expectArgumentsAt(1, "b", array("bb", LEXER_MATCHED)); + $handler->expectArgumentsAt(2, "b", array("a", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(3, "b", array("bb", LEXER_MATCHED)); + $handler->expectArgumentsAt(4, "b", array(")", LEXER_EXIT)); + $handler->expectArgumentsAt(4, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(5, "a", array("b", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 6); + $handler->expectCallCount("b", 5); + $lexer = &new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addEntryPattern("(", "a", "b"); + $lexer->addPattern("b+", "b"); + $lexer->addExitPattern(")", "b"); + $this->assertTrue($lexer->parse("aabaab(bbabb)aab")); + } + + function testSingular() { + $handler = &new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(2, "a", array("xx", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(3, "a", array("xx", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(0, "b", array("b", LEXER_SPECIAL)); + $handler->expectArgumentsAt(1, "b", array("bbb", LEXER_SPECIAL)); + $handler->expectCallCount("a", 4); + $handler->expectCallCount("b", 2); + $lexer = &new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addSpecialPattern("b+", "a", "b"); + $this->assertTrue($lexer->parse("aabaaxxbbbxx")); + } + + function testUnwindTooFar() { + $handler = &new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "a", array(")", LEXER_EXIT)); + $handler->expectCallCount("a", 2); + $lexer = &new SimpleLexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addExitPattern(")", "a"); + $this->assertFalse($lexer->parse("aa)aa")); + } +} + +class TestOfLexerHandlers extends UnitTestCase { + + function testModeMapping() { + $handler = &new MockTestParser(); + $handler->setReturnValue("a", true); + $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED)); + $handler->expectArgumentsAt(1, "a", array("(", LEXER_ENTER)); + $handler->expectArgumentsAt(2, "a", array("bb", LEXER_MATCHED)); + $handler->expectArgumentsAt(3, "a", array("a", LEXER_UNMATCHED)); + $handler->expectArgumentsAt(4, "a", array("bb", LEXER_MATCHED)); + $handler->expectArgumentsAt(5, "a", array(")", LEXER_EXIT)); + $handler->expectArgumentsAt(6, "a", array("b", LEXER_UNMATCHED)); + $handler->expectCallCount("a", 7); + $lexer = &new SimpleLexer($handler, "mode_a"); + $lexer->addPattern("a+", "mode_a"); + $lexer->addEntryPattern("(", "mode_a", "mode_b"); + $lexer->addPattern("b+", "mode_b"); + $lexer->addExitPattern(")", "mode_b"); + $lexer->mapHandler("mode_a", "a"); + $lexer->mapHandler("mode_b", "a"); + $this->assertTrue($lexer->parse("aa(bbabb)b")); + } +} + +class TestOfSimpleHtmlLexer extends UnitTestCase { + + function &createParser() { + $parser = &new MockSimpleHtmlSaxParser(); + $parser->setReturnValue('acceptStartToken', true); + $parser->setReturnValue('acceptEndToken', true); + $parser->setReturnValue('acceptAttributeToken', true); + $parser->setReturnValue('acceptEntityToken', true); + $parser->setReturnValue('acceptTextToken', true); + $parser->setReturnValue('ignore', true); + return $parser; + } + + function testNoContent() { + $parser = &$this->createParser(); + $parser->expectNever('acceptStartToken'); + $parser->expectNever('acceptEndToken'); + $parser->expectNever('acceptAttributeToken'); + $parser->expectNever('acceptEntityToken'); + $parser->expectNever('acceptTextToken'); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('')); + } + + function testUninteresting() { + $parser = &$this->createParser(); + $parser->expectOnce('acceptTextToken', array('', '*')); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('')); + } + + function testSkipCss() { + $parser = &$this->createParser(); + $parser->expectNever('acceptTextToken'); + $parser->expectAtLeastOnce('ignore'); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse("")); + } + + function testSkipJavaScript() { + $parser = &$this->createParser(); + $parser->expectNever('acceptTextToken'); + $parser->expectAtLeastOnce('ignore'); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse("")); + } + + function testSkipHtmlComments() { + $parser = &$this->createParser(); + $parser->expectNever('acceptTextToken'); + $parser->expectAtLeastOnce('ignore'); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse("")); + } + + function testTagWithNoAttributes() { + $parser = &$this->createParser(); + $parser->expectAt(0, 'acceptStartToken', array('expectAt(1, 'acceptStartToken', array('>', '*')); + $parser->expectCallCount('acceptStartToken', 2); + $parser->expectOnce('acceptTextToken', array('Hello', '*')); + $parser->expectOnce('acceptEndToken', array('', '*')); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('Hello')); + } + + function testTagWithAttributes() { + $parser = &$this->createParser(); + $parser->expectOnce('acceptTextToken', array('label', '*')); + $parser->expectAt(0, 'acceptStartToken', array('expectAt(1, 'acceptStartToken', array('href', '*')); + $parser->expectAt(2, 'acceptStartToken', array('>', '*')); + $parser->expectCallCount('acceptStartToken', 3); + $parser->expectAt(0, 'acceptAttributeToken', array('= "', '*')); + $parser->expectAt(1, 'acceptAttributeToken', array('here.html', '*')); + $parser->expectAt(2, 'acceptAttributeToken', array('"', '*')); + $parser->expectCallCount('acceptAttributeToken', 3); + $parser->expectOnce('acceptEndToken', array('', '*')); + $lexer = &new SimpleHtmlLexer($parser); + $this->assertTrue($lexer->parse('label')); + } +} + +class TestOfHtmlSaxParser extends UnitTestCase { + + function &createListener() { + $listener = &new MockSimpleSaxListener(); + $listener->setReturnValue('startElement', true); + $listener->setReturnValue('addContent', true); + $listener->setReturnValue('endElement', true); + return $listener; + } + + function testFramesetTag() { + $listener = &$this->createListener(); + $listener->expectOnce('startElement', array('frameset', array())); + $listener->expectOnce('addContent', array('Frames')); + $listener->expectOnce('endElement', array('frameset')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('Frames')); + } + + function testTagWithUnquotedAttributes() { + $listener = &$this->createListener(); + $listener->expectOnce( + 'startElement', + array('input', array('name' => 'a.b.c', 'value' => 'd'))); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testTagInsideContent() { + $listener = &$this->createListener(); + $listener->expectOnce('startElement', array('a', array())); + $listener->expectAt(0, 'addContent', array('')); + $listener->expectAt(1, 'addContent', array('')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testTagWithInternalContent() { + $listener = &$this->createListener(); + $listener->expectOnce('startElement', array('a', array())); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('label')); + } + + function testLinkAddress() { + $listener = &$this->createListener(); + $listener->expectOnce('startElement', array('a', array('href' => 'here.html'))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse("label")); + } + + function testEncodedAttribute() { + $listener = &$this->createListener(); + $listener->expectOnce('startElement', array('a', array('href' => 'here&there.html'))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse("label")); + } + + function testTagWithId() { + $listener = &$this->createListener(); + $listener->expectOnce('startElement', array('a', array('id' => '0'))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('label')); + } + + function testTagWithEmptyAttributes() { + $listener = &$this->createListener(); + $listener->expectOnce( + 'startElement', + array('option', array('value' => '', 'selected' => ''))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('option')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testComplexTagWithLotsOfCaseVariations() { + $listener = &$this->createListener(); + $listener->expectOnce( + 'startElement', + array('a', array('href' => 'here.html', 'style' => "'cool'"))); + $listener->expectOnce('addContent', array('label')); + $listener->expectOnce('endElement', array('a')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('label')); + } + + function testXhtmlSelfClosingTag() { + $listener = &$this->createListener(); + $listener->expectOnce( + 'startElement', + array('input', array('type' => 'submit', 'name' => 'N', 'value' => 'V'))); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse('')); + } + + function testNestedFrameInFrameset() { + $listener = &$this->createListener(); + $listener->expectAt(0, 'startElement', array('frameset', array())); + $listener->expectAt(1, 'startElement', array('frame', array('src' => 'frame.html'))); + $listener->expectCallCount('startElement', 2); + $listener->expectOnce('addContent', array('Hello')); + $listener->expectOnce('endElement', array('frameset')); + $parser = &new SimpleHtmlSaxParser($listener); + $this->assertTrue($parser->parse( + 'Hello')); + } +} + +class TestOfTextExtraction extends UnitTestCase { + + function testImageSuppressionWhileKeepingParagraphsAndAltText() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise('

      some text

      bar'), + 'some text bar'); + + } + + function testSpaceNormalisation() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise("\nOne\tTwo \nThree\t"), + 'One Two Three'); + } + + function testMultilinesCommentSuppression() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise(''), + ''); + } + + function testCommentSuppression() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise(''), + ''); + } + + function testJavascriptSuppression() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise(''), + ''); + $this->assertEqual( + SimpleHtmlSaxParser::normalise(''), + ''); + $this->assertEqual( + SimpleHtmlSaxParser::normalise(''), + ''); + } + + function testTagSuppression() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise('Hello'), + 'Hello'); + } + + function testAdjoiningTagSuppression() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise('HelloGoodbye'), + 'HelloGoodbye'); + } + + function testExtractImageAltTextWithDifferentQuotes() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise('One\'Two\'Three'), + 'One Two Three'); + } + + function testExtractImageAltTextMultipleTimes() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise('OneTwoThree'), + 'One Two Three'); + } + + function testHtmlEntityTranslation() { + $this->assertEqual( + SimpleHtmlSaxParser::normalise('<>"&''), + '<>"&\''); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/reflection_php4_test.php b/tests/simpletest/test/reflection_php4_test.php new file mode 100644 index 000000000..8ee211b96 --- /dev/null +++ b/tests/simpletest/test/reflection_php4_test.php @@ -0,0 +1,61 @@ +assertTrue($reflection->classOrInterfaceExists()); + $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); + } + + function testClassNonExistence() { + $reflection = new SimpleReflection('UnknownThing'); + $this->assertFalse($reflection->classOrInterfaceExists()); + $this->assertFalse($reflection->classOrInterfaceExistsSansAutoload()); + } + + function testDetectionOfInterfacesAlwaysFalse() { + $reflection = new SimpleReflection('AnyOldThing'); + $this->assertFalse($reflection->isAbstract()); + $this->assertFalse($reflection->isInterface()); + } + + function testFindingParentClass() { + $reflection = new SimpleReflection('AnyOldChildThing'); + $this->assertEqual(strtolower($reflection->getParent()), 'anyoldthing'); + } + + function testMethodsListFromClass() { + $reflection = new SimpleReflection('AnyOldThing'); + $methods = $reflection->getMethods(); + $this->assertEqualIgnoringCase($methods[0], 'aMethod'); + } + + function testNoInterfacesForPHP4() { + $reflection = new SimpleReflection('AnyOldThing'); + $this->assertEqual( + $reflection->getInterfaces(), + array()); + } + + function testMostGeneralPossibleSignature() { + $reflection = new SimpleReflection('AnyOldThing'); + $this->assertEqualIgnoringCase( + $reflection->getSignature('aMethod'), + 'function &aMethod()'); + } + + function assertEqualIgnoringCase($a, $b) { + return $this->assertEqual(strtolower($a), strtolower($b)); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/reflection_php5_test.php b/tests/simpletest/test/reflection_php5_test.php new file mode 100644 index 000000000..3bfc6e85b --- /dev/null +++ b/tests/simpletest/test/reflection_php5_test.php @@ -0,0 +1,271 @@ +assertTrue($reflection->classOrInterfaceExists()); + $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); + $this->assertFalse($reflection->isAbstract()); + $this->assertFalse($reflection->isInterface()); + } + + function testClassNonExistence() { + $reflection = new SimpleReflection('UnknownThing'); + $this->assertFalse($reflection->classOrInterfaceExists()); + $this->assertFalse($reflection->classOrInterfaceExistsSansAutoload()); + } + + function testDetectionOfAbstractClass() { + $reflection = new SimpleReflection('AnyOldClass'); + $this->assertTrue($reflection->isAbstract()); + } + + function testDetectionOfFinalMethods() { + $reflection = new SimpleReflection('AnyOldClass'); + $this->assertFalse($reflection->hasFinal()); + $reflection = new SimpleReflection('AnyOldLeafClassWithAFinal'); + $this->assertTrue($reflection->hasFinal()); + } + + function testFindingParentClass() { + $reflection = new SimpleReflection('AnyOldSubclass'); + $this->assertEqual($reflection->getParent(), 'AnyOldImplementation'); + } + + function testInterfaceExistence() { + $reflection = new SimpleReflection('AnyOldInterface'); + $this->assertTrue($reflection->classOrInterfaceExists()); + $this->assertTrue($reflection->classOrInterfaceExistsSansAutoload()); + $this->assertTrue($reflection->isInterface()); + } + + function testMethodsListFromClass() { + $reflection = new SimpleReflection('AnyOldClass'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + } + + function testMethodsListFromInterface() { + $reflection = new SimpleReflection('AnyOldInterface'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod')); + } + + function testMethodsComeFromDescendentInterfacesASWell() { + $reflection = new SimpleReflection('AnyDescendentInterface'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + } + + function testCanSeparateInterfaceMethodsFromOthers() { + $reflection = new SimpleReflection('AnyOldImplementation'); + $this->assertIdentical($reflection->getMethods(), array('aMethod', 'extraMethod')); + $this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod')); + } + + function testMethodsComeFromDescendentInterfacesInAbstractClass() { + $reflection = new SimpleReflection('AnyAbstractImplementation'); + $this->assertIdentical($reflection->getMethods(), array('aMethod')); + } + + function testInterfaceHasOnlyItselfToImplement() { + $reflection = new SimpleReflection('AnyOldInterface'); + $this->assertEqual( + $reflection->getInterfaces(), + array('AnyOldInterface')); + } + + function testInterfacesListedForClass() { + $reflection = new SimpleReflection('AnyOldImplementation'); + $this->assertEqual( + $reflection->getInterfaces(), + array('AnyOldInterface')); + } + + function testInterfacesListedForSubclass() { + $reflection = new SimpleReflection('AnyOldSubclass'); + $this->assertEqual( + $reflection->getInterfaces(), + array('AnyOldInterface')); + } + + function testNoParameterCreationWhenNoInterface() { + $reflection = new SimpleReflection('AnyOldArgumentClass'); + $function = $reflection->getSignature('aMethod'); + if (version_compare(phpversion(), '5.0.2', '<=')) { + $this->assertEqual('function amethod()', strtolower($function)); + } else { + $this->assertEqual('function aMethod()', $function); + } + } + + function testParameterCreationWithoutTypeHinting() { + $reflection = new SimpleReflection('AnyOldArgumentImplementation'); + $function = $reflection->getSignature('aMethod'); + if (version_compare(phpversion(), '5.0.2', '<=')) { + $this->assertEqual('function amethod(AnyOldInterface $argument)', $function); + } else { + $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function); + } + } + + function testParameterCreationForTypeHinting() { + $reflection = new SimpleReflection('AnyOldTypeHintedClass'); + $function = $reflection->getSignature('aMethod'); + if (version_compare(phpversion(), '5.0.2', '<=')) { + $this->assertEqual('function amethod(AnyOldInterface $argument)', $function); + } else { + $this->assertEqual('function aMethod(AnyOldInterface $argument)', $function); + } + } + + function testIssetFunctionSignature() { + $reflection = new SimpleReflection('AnyOldOverloadedClass'); + $function = $reflection->getSignature('__isset'); + if (version_compare(phpversion(), '5.1.0', '>=')) { + $this->assertEqual('function __isset($key)', $function); + } else { + $this->assertEqual('function __isset()', $function); + } + } + + function testUnsetFunctionSignature() { + $reflection = new SimpleReflection('AnyOldOverloadedClass'); + $function = $reflection->getSignature('__unset'); + if (version_compare(phpversion(), '5.1.0', '>=')) { + $this->assertEqual('function __unset($key)', $function); + } else { + $this->assertEqual('function __unset()', $function); + } + } + + function testProperlyReflectsTheFinalInterfaceWhenObjectImplementsAnExtendedInterface() { + $reflection = new SimpleReflection('AnyDescendentImplementation'); + $interfaces = $reflection->getInterfaces(); + $this->assertEqual(1, count($interfaces)); + $this->assertEqual('AnyDescendentInterface', array_shift($interfaces)); + } + + function testCreatingSignatureForAbstractMethod() { + $reflection = new SimpleReflection('AnotherOldAbstractClass'); + $this->assertEqual($reflection->getSignature('aMethod'), 'function aMethod(AnyOldInterface $argument)'); + } + + function testCanProperlyGenerateStaticMethodSignatures() { + $reflection = new SimpleReflection('AnyOldClassWithStaticMethods'); + $this->assertEqual('static function aStatic()', $reflection->getSignature('aStatic')); + $this->assertEqual( + 'static function aStaticWithParameters($arg1, $arg2)', + $reflection->getSignature('aStaticWithParameters') + ); + } +} + +class TestOfReflectionWithTypeHints extends UnitTestCase { + function skip() { + $this->skipIf(version_compare(phpversion(), '5.1.0', '<'), 'Reflection with type hints only tested for PHP 5.1.0 and above'); + } + + function testParameterCreationForTypeHintingWithArray() { + eval('interface AnyOldArrayTypeHintedInterface { + function amethod(array $argument); + } + class AnyOldArrayTypeHintedClass implements AnyOldArrayTypeHintedInterface { + function amethod(array $argument) {} + }'); + $reflection = new SimpleReflection('AnyOldArrayTypeHintedClass'); + $function = $reflection->getSignature('amethod'); + $this->assertEqual('function amethod(array $argument)', $function); + } +} + +class TestOfAbstractsWithAbstractMethods extends UnitTestCase { + function testCanProperlyGenerateAbstractMethods() { + $reflection = new SimpleReflection('AnyOldAbstractClassWithAbstractMethods'); + $this->assertEqual( + 'function anAbstract()', + $reflection->getSignature('anAbstract') + ); + $this->assertEqual( + 'function anAbstractWithParameter($foo)', + $reflection->getSignature('anAbstractWithParameter') + ); + $this->assertEqual( + 'function anAbstractWithMultipleParameters($foo, $bar)', + $reflection->getSignature('anAbstractWithMultipleParameters') + ); + } +} + +?> \ No newline at end of file diff --git a/tests/simpletest/test/remote_test.php b/tests/simpletest/test/remote_test.php new file mode 100644 index 000000000..efcccaf05 --- /dev/null +++ b/tests/simpletest/test/remote_test.php @@ -0,0 +1,20 @@ +addTestCase(new RemoteTestCase($test_url . '?xml=yes', $test_url . '?xml=yes&dry=yes')); +if (SimpleReporter::inCli()) { + exit ($test->run(new TextReporter()) ? 0 : 1); +} +$test->run(new HtmlReporter()); +?> \ No newline at end of file diff --git a/tests/simpletest/test/shell_test.php b/tests/simpletest/test/shell_test.php new file mode 100644 index 000000000..6199272a1 --- /dev/null +++ b/tests/simpletest/test/shell_test.php @@ -0,0 +1,38 @@ +assertIdentical($shell->execute('echo Hello'), 0); + $this->assertPattern('/Hello/', $shell->getOutput()); + } + + function testBadCommand() { + $shell = &new SimpleShell(); + $this->assertNotEqual($ret = $shell->execute('blurgh! 2>&1'), 0); + } +} + +class TestOfShellTesterAndShell extends ShellTestCase { + + function testEcho() { + $this->assertTrue($this->execute('echo Hello')); + $this->assertExitCode(0); + $this->assertoutput('Hello'); + } + + function testFileExistence() { + $this->assertFileExists(dirname(__FILE__) . '/all_tests.php'); + $this->assertFileNotExists('wibble'); + } + + function testFilePatterns() { + $this->assertFilePattern('/all[_ ]tests/i', dirname(__FILE__) . '/all_tests.php'); + $this->assertNoFilePattern('/sputnik/i', dirname(__FILE__) . '/all_tests.php'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/shell_tester_test.php b/tests/simpletest/test/shell_tester_test.php new file mode 100644 index 000000000..e536dcebd --- /dev/null +++ b/tests/simpletest/test/shell_tester_test.php @@ -0,0 +1,42 @@ +_mock_shell; + } + + function testGenericEquality() { + $this->assertEqual('a', 'a'); + $this->assertNotEqual('a', 'A'); + } + + function testExitCode() { + $this->_mock_shell = &new MockSimpleShell(); + $this->_mock_shell->setReturnValue('execute', 0); + $this->_mock_shell->expectOnce('execute', array('ls')); + $this->assertTrue($this->execute('ls')); + $this->assertExitCode(0); + } + + function testOutput() { + $this->_mock_shell = &new MockSimpleShell(); + $this->_mock_shell->setReturnValue('execute', 0); + $this->_mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n"); + $this->assertOutput("Line 1\nLine 2\n"); + } + + function testOutputPatterns() { + $this->_mock_shell = &new MockSimpleShell(); + $this->_mock_shell->setReturnValue('execute', 0); + $this->_mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n"); + $this->assertOutputPattern('/line/i'); + $this->assertNoOutputPattern('/line 2/'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/simpletest_test.php b/tests/simpletest/test/simpletest_test.php new file mode 100644 index 000000000..bf98d9748 --- /dev/null +++ b/tests/simpletest/test/simpletest_test.php @@ -0,0 +1,58 @@ +fail('Should be ignored'); + } +} + +class ShouldNeverBeRunEither extends ShouldNeverBeRun { } + +class TestOfStackTrace extends UnitTestCase { + + function testCanFindAssertInTrace() { + $trace = new SimpleStackTrace(array('assert')); + $this->assertEqual( + $trace->traceMethod(array(array( + 'file' => '/my_test.php', + 'line' => 24, + 'function' => 'assertSomething'))), + ' at [/my_test.php line 24]'); + } +} + +class DummyResource { } + +class TestOfContext extends UnitTestCase { + + function testCurrentContextIsUnique() { + $this->assertReference( + SimpleTest::getContext(), + SimpleTest::getContext()); + } + + function testContextHoldsCurrentTestCase() { + $context = &SimpleTest::getContext(); + $this->assertReference($this, $context->getTest()); + } + + function testResourceIsSingleInstanceWithContext() { + $context = &new SimpleTestContext(); + $this->assertReference( + $context->get('DummyResource'), + $context->get('DummyResource')); + } + + function testClearingContextResetsResources() { + $context = &new SimpleTestContext(); + $resource = &$context->get('DummyResource'); + $context->clear(); + $this->assertClone($resource, $context->get('DummyResource')); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/socket_test.php b/tests/simpletest/test/socket_test.php new file mode 100644 index 000000000..ce25be7d3 --- /dev/null +++ b/tests/simpletest/test/socket_test.php @@ -0,0 +1,25 @@ +assertFalse($error->isError()); + $error->_setError('Ouch'); + $this->assertTrue($error->isError()); + $this->assertEqual($error->getError(), 'Ouch'); + } + + function testClearingError() { + $error = new SimpleStickyError(); + $error->_setError('Ouch'); + $this->assertTrue($error->isError()); + $error->_clearError(); + $this->assertFalse($error->isError()); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/support/collector/collectable.1 b/tests/simpletest/test/support/collector/collectable.1 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/simpletest/test/support/collector/collectable.2 b/tests/simpletest/test/support/collector/collectable.2 new file mode 100644 index 000000000..e69de29bb diff --git a/tests/simpletest/test/support/empty_test_file.php b/tests/simpletest/test/support/empty_test_file.php new file mode 100644 index 000000000..31e3f7bed --- /dev/null +++ b/tests/simpletest/test/support/empty_test_file.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/tests/simpletest/test/support/latin1_sample b/tests/simpletest/test/support/latin1_sample new file mode 100644 index 000000000..190352577 --- /dev/null +++ b/tests/simpletest/test/support/latin1_sample @@ -0,0 +1 @@ +@櫻 \ No newline at end of file diff --git a/tests/simpletest/test/support/spl_examples.php b/tests/simpletest/test/support/spl_examples.php new file mode 100644 index 000000000..45add356c --- /dev/null +++ b/tests/simpletest/test/support/spl_examples.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/tests/simpletest/test/support/supplementary_upload_sample.txt b/tests/simpletest/test/support/supplementary_upload_sample.txt new file mode 100644 index 000000000..d8aa9e810 --- /dev/null +++ b/tests/simpletest/test/support/supplementary_upload_sample.txt @@ -0,0 +1 @@ +Some more text content \ No newline at end of file diff --git a/tests/simpletest/test/support/test1.php b/tests/simpletest/test/support/test1.php new file mode 100644 index 000000000..b414586d6 --- /dev/null +++ b/tests/simpletest/test/support/test1.php @@ -0,0 +1,7 @@ +assertEqual(3,1+2, "pass1"); + } +} +?> diff --git a/tests/simpletest/test/support/upload_sample.txt b/tests/simpletest/test/support/upload_sample.txt new file mode 100644 index 000000000..ec98d7c5e --- /dev/null +++ b/tests/simpletest/test/support/upload_sample.txt @@ -0,0 +1 @@ +Sample for testing file upload \ No newline at end of file diff --git a/tests/simpletest/test/tag_test.php b/tests/simpletest/test/tag_test.php new file mode 100644 index 000000000..f81df64ea --- /dev/null +++ b/tests/simpletest/test/tag_test.php @@ -0,0 +1,554 @@ + '1', 'b' => '')); + $this->assertEqual($tag->getTagName(), 'title'); + $this->assertIdentical($tag->getAttribute('a'), '1'); + $this->assertIdentical($tag->getAttribute('b'), ''); + $this->assertIdentical($tag->getAttribute('c'), false); + $this->assertIdentical($tag->getContent(), ''); + } + + function testTitleContent() { + $tag = &new SimpleTitleTag(array()); + $this->assertTrue($tag->expectEndTag()); + $tag->addContent('Hello'); + $tag->addContent('World'); + $this->assertEqual($tag->getText(), 'HelloWorld'); + } + + function testMessyTitleContent() { + $tag = &new SimpleTitleTag(array()); + $this->assertTrue($tag->expectEndTag()); + $tag->addContent('Hello'); + $tag->addContent('World'); + $this->assertEqual($tag->getText(), 'HelloWorld'); + } + + function testTagWithNoEnd() { + $tag = &new SimpleTextTag(array()); + $this->assertFalse($tag->expectEndTag()); + } + + function testAnchorHref() { + $tag = &new SimpleAnchorTag(array('href' => 'http://here/')); + $this->assertEqual($tag->getHref(), 'http://here/'); + + $tag = &new SimpleAnchorTag(array('href' => '')); + $this->assertIdentical($tag->getAttribute('href'), ''); + $this->assertIdentical($tag->getHref(), ''); + + $tag = &new SimpleAnchorTag(array()); + $this->assertIdentical($tag->getAttribute('href'), false); + $this->assertIdentical($tag->getHref(), ''); + } + + function testIsIdMatchesIdAttribute() { + $tag = &new SimpleAnchorTag(array('href' => 'http://here/', 'id' => 7)); + $this->assertIdentical($tag->getAttribute('id'), '7'); + $this->assertTrue($tag->isId(7)); + } +} + +class TestOfWidget extends UnitTestCase { + + function testTextEmptyDefault() { + $tag = &new SimpleTextTag(array('type' => 'text')); + $this->assertIdentical($tag->getDefault(), ''); + $this->assertIdentical($tag->getValue(), ''); + } + + function testSettingOfExternalLabel() { + $tag = &new SimpleTextTag(array('type' => 'text')); + $tag->setLabel('it'); + $this->assertTrue($tag->isLabel('it')); + } + + function testTextDefault() { + $tag = &new SimpleTextTag(array('value' => 'aaa')); + $this->assertEqual($tag->getDefault(), 'aaa'); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testSettingTextValue() { + $tag = &new SimpleTextTag(array('value' => 'aaa')); + $tag->setValue('bbb'); + $this->assertEqual($tag->getValue(), 'bbb'); + $tag->resetValue(); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testFailToSetHiddenValue() { + $tag = &new SimpleTextTag(array('value' => 'aaa', 'type' => 'hidden')); + $this->assertFalse($tag->setValue('bbb')); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testSubmitDefaults() { + $tag = &new SimpleSubmitTag(array('type' => 'submit')); + $this->assertIdentical($tag->getName(), false); + $this->assertEqual($tag->getValue(), 'Submit'); + $this->assertFalse($tag->setValue('Cannot set this')); + $this->assertEqual($tag->getValue(), 'Submit'); + $this->assertEqual($tag->getLabel(), 'Submit'); + + $encoding = &new MockSimpleMultipartEncoding(); + $encoding->expectNever('add'); + $tag->write($encoding); + } + + function testPopulatedSubmit() { + $tag = &new SimpleSubmitTag( + array('type' => 'submit', 'name' => 's', 'value' => 'Ok!')); + $this->assertEqual($tag->getName(), 's'); + $this->assertEqual($tag->getValue(), 'Ok!'); + $this->assertEqual($tag->getLabel(), 'Ok!'); + + $encoding = &new MockSimpleMultipartEncoding(); + $encoding->expectOnce('add', array('s', 'Ok!')); + $tag->write($encoding); + } + + function testImageSubmit() { + $tag = &new SimpleImageSubmitTag( + array('type' => 'image', 'name' => 's', 'alt' => 'Label')); + $this->assertEqual($tag->getName(), 's'); + $this->assertEqual($tag->getLabel(), 'Label'); + + $encoding = &new MockSimpleMultipartEncoding(); + $encoding->expectAt(0, 'add', array('s.x', 20)); + $encoding->expectAt(1, 'add', array('s.y', 30)); + $tag->write($encoding, 20, 30); + } + + function testImageSubmitTitlePreferredOverAltForLabel() { + $tag = &new SimpleImageSubmitTag( + array('type' => 'image', 'name' => 's', 'alt' => 'Label', 'title' => 'Title')); + $this->assertEqual($tag->getLabel(), 'Title'); + } + + function testButton() { + $tag = &new SimpleButtonTag( + array('type' => 'submit', 'name' => 's', 'value' => 'do')); + $tag->addContent('I am a button'); + $this->assertEqual($tag->getName(), 's'); + $this->assertEqual($tag->getValue(), 'do'); + $this->assertEqual($tag->getLabel(), 'I am a button'); + + $encoding = &new MockSimpleMultipartEncoding(); + $encoding->expectOnce('add', array('s', 'do')); + $tag->write($encoding); + } +} + +class TestOfTextArea extends UnitTestCase { + + function testDefault() { + $tag = &new SimpleTextAreaTag(array('name' => 'a')); + $tag->addContent('Some text'); + $this->assertEqual($tag->getName(), 'a'); + $this->assertEqual($tag->getDefault(), 'Some text'); + } + + function testWrapping() { + $tag = &new SimpleTextAreaTag(array('cols' => '10', 'wrap' => 'physical')); + $tag->addContent("Lot's of text that should be wrapped"); + $this->assertEqual( + $tag->getDefault(), + "Lot's of\r\ntext that\r\nshould be\r\nwrapped"); + $tag->setValue("New long text\r\nwith two lines"); + $this->assertEqual( + $tag->getValue(), + "New long\r\ntext\r\nwith two\r\nlines"); + } + + function testWrappingRemovesLeadingcariageReturn() { + $tag = &new SimpleTextAreaTag(array('cols' => '20', 'wrap' => 'physical')); + $tag->addContent("\rStuff"); + $this->assertEqual($tag->getDefault(), 'Stuff'); + $tag->setValue("\nNew stuff\n"); + $this->assertEqual($tag->getValue(), "New stuff\r\n"); + } + + function testBreaksAreNewlineAndCarriageReturn() { + $tag = &new SimpleTextAreaTag(array('cols' => '10')); + $tag->addContent("Some\nText\rwith\r\nbreaks"); + $this->assertEqual($tag->getValue(), "Some\r\nText\r\nwith\r\nbreaks"); + } +} + +class TestOfCheckbox extends UnitTestCase { + + function testCanSetCheckboxToNamedValueWithBooleanTrue() { + $tag = &new SimpleCheckboxTag(array('name' => 'a', 'value' => 'A')); + $this->assertEqual($tag->getValue(), false); + $tag->setValue(true); + $this->assertIdentical($tag->getValue(), 'A'); + } +} + +class TestOfSelection extends UnitTestCase { + + function testEmpty() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $this->assertIdentical($tag->getValue(), ''); + } + + function testSingle() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $option = &new SimpleOptionTag(array()); + $option->addContent('AAA'); + $tag->addTag($option); + $this->assertEqual($tag->getValue(), 'AAA'); + } + + function testSingleDefault() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $option = &new SimpleOptionTag(array('selected' => '')); + $option->addContent('AAA'); + $tag->addTag($option); + $this->assertEqual($tag->getValue(), 'AAA'); + } + + function testSingleMappedDefault() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $option = &new SimpleOptionTag(array('selected' => '', 'value' => 'aaa')); + $option->addContent('AAA'); + $tag->addTag($option); + $this->assertEqual($tag->getValue(), 'aaa'); + } + + function testStartsWithDefault() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $a = &new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = &new SimpleOptionTag(array()); + $c->addContent('CCC'); + $tag->addTag($c); + $this->assertEqual($tag->getValue(), 'BBB'); + } + + function testSettingOption() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $a = &new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = &new SimpleOptionTag(array()); + $c->addContent('CCC'); + $tag->setValue('AAA'); + $this->assertEqual($tag->getValue(), 'AAA'); + } + + function testSettingMappedOption() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $a = &new SimpleOptionTag(array('value' => 'aaa')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('value' => 'bbb', 'selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = &new SimpleOptionTag(array('value' => 'ccc')); + $c->addContent('CCC'); + $tag->addTag($c); + $tag->setValue('AAA'); + $this->assertEqual($tag->getValue(), 'aaa'); + $tag->setValue('ccc'); + $this->assertEqual($tag->getValue(), 'ccc'); + } + + function testSelectionDespiteSpuriousWhitespace() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $a = &new SimpleOptionTag(array()); + $a->addContent(' AAA '); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('selected' => '')); + $b->addContent(' BBB '); + $tag->addTag($b); + $c = &new SimpleOptionTag(array()); + $c->addContent(' CCC '); + $tag->addTag($c); + $this->assertEqual($tag->getValue(), ' BBB '); + $tag->setValue('AAA'); + $this->assertEqual($tag->getValue(), ' AAA '); + } + + function testFailToSetIllegalOption() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $a = &new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $c = &new SimpleOptionTag(array()); + $c->addContent('CCC'); + $tag->addTag($c); + $this->assertFalse($tag->setValue('Not present')); + $this->assertEqual($tag->getValue(), 'BBB'); + } + + function testNastyOptionValuesThatLookLikeFalse() { + $tag = &new SimpleSelectionTag(array('name' => 'a')); + $a = &new SimpleOptionTag(array('value' => '1')); + $a->addContent('One'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('value' => '0')); + $b->addContent('Zero'); + $tag->addTag($b); + $this->assertIdentical($tag->getValue(), '1'); + $tag->setValue('Zero'); + $this->assertIdentical($tag->getValue(), '0'); + } + + function testBlankOption() { + $tag = &new SimpleSelectionTag(array('name' => 'A')); + $a = &new SimpleOptionTag(array()); + $tag->addTag($a); + $b = &new SimpleOptionTag(array()); + $b->addContent('b'); + $tag->addTag($b); + $this->assertIdentical($tag->getValue(), ''); + $tag->setValue('b'); + $this->assertIdentical($tag->getValue(), 'b'); + $tag->setValue(''); + $this->assertIdentical($tag->getValue(), ''); + } + + function testMultipleDefaultWithNoSelections() { + $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = &new SimpleOptionTag(array()); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array()); + $b->addContent('BBB'); + $tag->addTag($b); + $this->assertIdentical($tag->getDefault(), array()); + $this->assertIdentical($tag->getValue(), array()); + } + + function testMultipleDefaultWithSelections() { + $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = &new SimpleOptionTag(array('selected' => '')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array('selected' => '')); + $b->addContent('BBB'); + $tag->addTag($b); + $this->assertIdentical($tag->getDefault(), array('AAA', 'BBB')); + $this->assertIdentical($tag->getValue(), array('AAA', 'BBB')); + } + + function testSettingMultiple() { + $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = &new SimpleOptionTag(array('selected' => '')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array()); + $b->addContent('BBB'); + $tag->addTag($b); + $c = &new SimpleOptionTag(array('selected' => '', 'value' => 'ccc')); + $c->addContent('CCC'); + $tag->addTag($c); + $this->assertIdentical($tag->getDefault(), array('AAA', 'ccc')); + $this->assertTrue($tag->setValue(array('BBB', 'ccc'))); + $this->assertIdentical($tag->getValue(), array('BBB', 'ccc')); + $this->assertTrue($tag->setValue(array())); + $this->assertIdentical($tag->getValue(), array()); + } + + function testFailToSetIllegalOptionsInMultiple() { + $tag = &new MultipleSelectionTag(array('name' => 'a', 'multiple' => '')); + $a = &new SimpleOptionTag(array('selected' => '')); + $a->addContent('AAA'); + $tag->addTag($a); + $b = &new SimpleOptionTag(array()); + $b->addContent('BBB'); + $tag->addTag($b); + $this->assertFalse($tag->setValue(array('CCC'))); + $this->assertTrue($tag->setValue(array('AAA', 'BBB'))); + $this->assertFalse($tag->setValue(array('AAA', 'CCC'))); + } +} + +class TestOfRadioGroup extends UnitTestCase { + + function testEmptyGroup() { + $group = &new SimpleRadioGroup(); + $this->assertIdentical($group->getDefault(), false); + $this->assertIdentical($group->getValue(), false); + $this->assertFalse($group->setValue('a')); + } + + function testReadingSingleButtonGroup() { + $group = &new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), 'A'); + $this->assertIdentical($group->getValue(), 'A'); + } + + function testReadingMultipleButtonGroup() { + $group = &new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A'))); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'B', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), 'B'); + $this->assertIdentical($group->getValue(), 'B'); + } + + function testFailToSetUnlistedValue() { + $group = &new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag(array('value' => 'z'))); + $this->assertFalse($group->setValue('a')); + $this->assertIdentical($group->getValue(), false); + } + + function testSettingNewValueClearsTheOldOne() { + $group = &new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A'))); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'B', 'checked' => ''))); + $this->assertTrue($group->setValue('A')); + $this->assertIdentical($group->getValue(), 'A'); + } + + function testIsIdMatchesAnyWidgetInSet() { + $group = &new SimpleRadioGroup(); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'A', 'id' => 'i1'))); + $group->addWidget(new SimpleRadioButtonTag( + array('value' => 'B', 'id' => 'i2'))); + $this->assertFalse($group->isId('i0')); + $this->assertTrue($group->isId('i1')); + $this->assertTrue($group->isId('i2')); + } + + function testIsLabelMatchesAnyWidgetInSet() { + $group = &new SimpleRadioGroup(); + $button1 = &new SimpleRadioButtonTag(array('value' => 'A')); + $button1->setLabel('one'); + $group->addWidget($button1); + $button2 = &new SimpleRadioButtonTag(array('value' => 'B')); + $button2->setLabel('two'); + $group->addWidget($button2); + $this->assertFalse($group->isLabel('three')); + $this->assertTrue($group->isLabel('one')); + $this->assertTrue($group->isLabel('two')); + } +} + +class TestOfTagGroup extends UnitTestCase { + + function testReadingMultipleCheckboxGroup() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag( + array('value' => 'B', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), 'B'); + $this->assertIdentical($group->getValue(), 'B'); + } + + function testReadingMultipleUncheckedItems() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertIdentical($group->getDefault(), false); + $this->assertIdentical($group->getValue(), false); + } + + function testReadingMultipleCheckedItems() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag( + array('value' => 'A', 'checked' => ''))); + $group->addWidget(new SimpleCheckboxTag( + array('value' => 'B', 'checked' => ''))); + $this->assertIdentical($group->getDefault(), array('A', 'B')); + $this->assertIdentical($group->getValue(), array('A', 'B')); + } + + function testSettingSingleValue() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertTrue($group->setValue('A')); + $this->assertIdentical($group->getValue(), 'A'); + $this->assertTrue($group->setValue('B')); + $this->assertIdentical($group->getValue(), 'B'); + } + + function testSettingMultipleValues() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertTrue($group->setValue(array('A', 'B'))); + $this->assertIdentical($group->getValue(), array('A', 'B')); + } + + function testSettingNoValue() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('value' => 'B'))); + $this->assertTrue($group->setValue(false)); + $this->assertIdentical($group->getValue(), false); + } + + function testIsIdMatchesAnyIdInSet() { + $group = &new SimpleCheckboxGroup(); + $group->addWidget(new SimpleCheckboxTag(array('id' => 1, 'value' => 'A'))); + $group->addWidget(new SimpleCheckboxTag(array('id' => 2, 'value' => 'B'))); + $this->assertFalse($group->isId(0)); + $this->assertTrue($group->isId(1)); + $this->assertTrue($group->isId(2)); + } +} + +class TestOfUploadWidget extends UnitTestCase { + + function testValueIsFilePath() { + $upload = &new SimpleUploadTag(array('name' => 'a')); + $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt'); + $this->assertEqual($upload->getValue(), dirname(__FILE__) . '/support/upload_sample.txt'); + } + + function testSubmitsFileContents() { + $encoding = &new MockSimpleMultipartEncoding(); + $encoding->expectOnce('attach', array( + 'a', + 'Sample for testing file upload', + 'upload_sample.txt')); + $upload = &new SimpleUploadTag(array('name' => 'a')); + $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt'); + $upload->write($encoding); + } +} + +class TestOfLabelTag extends UnitTestCase { + + function testLabelShouldHaveAnEndTag() { + $label = &new SimpleLabelTag(array()); + $this->assertTrue($label->expectEndTag()); + } + + function testContentIsTextOnly() { + $label = &new SimpleLabelTag(array()); + $label->addContent('Here are words'); + $this->assertEqual($label->getText(), 'Here are words'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/test_with_parse_error.php b/tests/simpletest/test/test_with_parse_error.php new file mode 100644 index 000000000..41a5832a5 --- /dev/null +++ b/tests/simpletest/test/test_with_parse_error.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/tests/simpletest/test/unit_tester_test.php b/tests/simpletest/test/unit_tester_test.php new file mode 100644 index 000000000..5fe78fe91 --- /dev/null +++ b/tests/simpletest/test/unit_tester_test.php @@ -0,0 +1,55 @@ +assertTrue($this->assertTrue(true)); + } + + function testAssertFalseReturnsAssertionAsBoolean() { + $this->assertTrue($this->assertFalse(false)); + } + + function testAssertEqualReturnsAssertionAsBoolean() { + $this->assertTrue($this->assertEqual(5, 5)); + } + + function testAssertIdenticalReturnsAssertionAsBoolean() { + $this->assertTrue($this->assertIdentical(5, 5)); + } + + function testCoreAssertionsDoNotThrowErrors() { + $this->assertIsA($this, 'UnitTestCase'); + $this->assertNotA($this, 'WebTestCase'); + } + + function testReferenceAssertionOnObjects() { + $a = &new ReferenceForTesting(); + $b = &$a; + $this->assertReference($a, $b); + } + + function testReferenceAssertionOnScalars() { + $a = 25; + $b = &$a; + $this->assertReference($a, $b); + } + + function testCloneOnObjects() { + $a = &new ReferenceForTesting(); + $b = &new ReferenceForTesting(); + $this->assertClone($a, $b); + } + + function testCloneOnScalars() { + $a = 25; + $b = 25; + $this->assertClone($a, $b); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/unit_tests.php b/tests/simpletest/test/unit_tests.php new file mode 100644 index 000000000..04dbc46ca --- /dev/null +++ b/tests/simpletest/test/unit_tests.php @@ -0,0 +1,55 @@ +TestSuite('Unit tests'); + $path = dirname(__FILE__); + $this->addFile($path . '/errors_test.php'); + if (version_compare(phpversion(), '5') >= 0) { + $this->addFile($path . '/exceptions_test.php'); + } + $this->addFile($path . '/autorun_test.php'); + $this->addFile($path . '/compatibility_test.php'); + $this->addFile($path . '/simpletest_test.php'); + $this->addFile($path . '/dumper_test.php'); + $this->addFile($path . '/expectation_test.php'); + $this->addFile($path . '/unit_tester_test.php'); + if (version_compare(phpversion(), '5', '>=')) { + $this->addFile($path . '/reflection_php5_test.php'); + } else { + $this->addFile($path . '/reflection_php4_test.php'); + } + $this->addFile($path . '/mock_objects_test.php'); + if (version_compare(phpversion(), '5', '>=')) { + $this->addFile($path . '/interfaces_test.php'); + } + $this->addFile($path . '/collector_test.php'); + $this->addFile($path . '/adapter_test.php'); + $this->addFile($path . '/socket_test.php'); + $this->addFile($path . '/encoding_test.php'); + $this->addFile($path . '/url_test.php'); + $this->addFile($path . '/cookies_test.php'); + $this->addFile($path . '/http_test.php'); + $this->addFile($path . '/authentication_test.php'); + $this->addFile($path . '/user_agent_test.php'); + $this->addFile($path . '/parser_test.php'); + $this->addFile($path . '/tag_test.php'); + $this->addFile($path . '/form_test.php'); + $this->addFile($path . '/page_test.php'); + $this->addFile($path . '/frames_test.php'); + $this->addFile($path . '/browser_test.php'); + $this->addFile($path . '/web_tester_test.php'); + $this->addFile($path . '/shell_tester_test.php'); + $this->addFile($path . '/xml_test.php'); + $this->addFile($path . '/../extensions/testdox/test.php'); + } +} +?> diff --git a/tests/simpletest/test/url_test.php b/tests/simpletest/test/url_test.php new file mode 100644 index 000000000..550717038 --- /dev/null +++ b/tests/simpletest/test/url_test.php @@ -0,0 +1,443 @@ +assertEqual($url->getScheme(), ''); + $this->assertEqual($url->getHost(), ''); + $this->assertEqual($url->getScheme('http'), 'http'); + $this->assertEqual($url->getHost('localhost'), 'localhost'); + $this->assertEqual($url->getPath(), ''); + } + + function testBasicParsing() { + $url = new SimpleUrl('https://www.lastcraft.com/test/'); + $this->assertEqual($url->getScheme(), 'https'); + $this->assertEqual($url->getHost(), 'www.lastcraft.com'); + $this->assertEqual($url->getPath(), '/test/'); + } + + function testRelativeUrls() { + $url = new SimpleUrl('../somewhere.php'); + $this->assertEqual($url->getScheme(), false); + $this->assertEqual($url->getHost(), false); + $this->assertEqual($url->getPath(), '../somewhere.php'); + } + + function testParseBareParameter() { + $url = new SimpleUrl('?a'); + $this->assertEqual($url->getPath(), ''); + $this->assertEqual($url->getEncodedRequest(), '?a'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=&x=X'); + } + + function testParseEmptyParameter() { + $url = new SimpleUrl('?a='); + $this->assertEqual($url->getPath(), ''); + $this->assertEqual($url->getEncodedRequest(), '?a='); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=&x=X'); + } + + function testParseParameterPair() { + $url = new SimpleUrl('?a=A'); + $this->assertEqual($url->getPath(), ''); + $this->assertEqual($url->getEncodedRequest(), '?a=A'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&x=X'); + } + + function testParseMultipleParameters() { + $url = new SimpleUrl('?a=A&b=B'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&x=X'); + } + + function testParsingParameterMixture() { + $url = new SimpleUrl('?a=A&b=&c'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c'); + $url->addRequestParameter('x', 'X'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c=&x=X'); + } + + function testAddParametersFromScratch() { + $url = new SimpleUrl(''); + $url->addRequestParameter('a', 'A'); + $this->assertEqual($url->getEncodedRequest(), '?a=A'); + $url->addRequestParameter('b', 'B'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B'); + $url->addRequestParameter('a', 'aaa'); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&a=aaa'); + } + + function testClearingParameters() { + $url = new SimpleUrl(''); + $url->addRequestParameter('a', 'A'); + $url->clearRequest(); + $this->assertIdentical($url->getEncodedRequest(), ''); + } + + function testEncodingParameters() { + $url = new SimpleUrl(''); + $url->addRequestParameter('a', '?!"\'#~@[]{}:;<>,./|$%^&*()_+-='); + $this->assertIdentical( + $request = $url->getEncodedRequest(), + '?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%A3%24%25%5E%26%2A%28%29_%2B-%3D'); + } + + function testDecodingParameters() { + $url = new SimpleUrl('?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%A3%24%25%5E%26%2A%28%29_%2B-%3D'); + $this->assertEqual( + $url->getEncodedRequest(), + '?a=' . urlencode('?!"\'#~@[]{}:;<>,./|$%^&*()_+-=')); + } + + function testUrlInQueryDoesNotConfuseParsing() { + $url = new SimpleUrl('wibble/login.php?url=http://www.google.com/moo/'); + $this->assertFalse($url->getScheme()); + $this->assertFalse($url->getHost()); + $this->assertEqual($url->getPath(), 'wibble/login.php'); + $this->assertEqual($url->getEncodedRequest(), '?url=http://www.google.com/moo/'); + } + + function testSettingCordinates() { + $url = new SimpleUrl(''); + $url->setCoordinates('32', '45'); + $this->assertIdentical($url->getX(), 32); + $this->assertIdentical($url->getY(), 45); + $this->assertEqual($url->getEncodedRequest(), ''); + } + + function testParseCordinates() { + $url = new SimpleUrl('?32,45'); + $this->assertIdentical($url->getX(), 32); + $this->assertIdentical($url->getY(), 45); + } + + function testClearingCordinates() { + $url = new SimpleUrl('?32,45'); + $url->setCoordinates(); + $this->assertIdentical($url->getX(), false); + $this->assertIdentical($url->getY(), false); + } + + function testParsingParameterCordinateMixture() { + $url = new SimpleUrl('?a=A&b=&c?32,45'); + $this->assertIdentical($url->getX(), 32); + $this->assertIdentical($url->getY(), 45); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c'); + } + + function testParsingParameterWithBadCordinates() { + $url = new SimpleUrl('?a=A&b=&c?32'); + $this->assertIdentical($url->getX(), false); + $this->assertIdentical($url->getY(), false); + $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c?32'); + } + + function testPageSplitting() { + $url = new SimpleUrl('./here/../there/somewhere.php'); + $this->assertEqual($url->getPath(), './here/../there/somewhere.php'); + $this->assertEqual($url->getPage(), 'somewhere.php'); + $this->assertEqual($url->getBasePath(), './here/../there/'); + } + + function testAbsolutePathPageSplitting() { + $url = new SimpleUrl("http://host.com/here/there/somewhere.php"); + $this->assertEqual($url->getPath(), "/here/there/somewhere.php"); + $this->assertEqual($url->getPage(), "somewhere.php"); + $this->assertEqual($url->getBasePath(), "/here/there/"); + } + + function testSplittingUrlWithNoPageGivesEmptyPage() { + $url = new SimpleUrl('/here/there/'); + $this->assertEqual($url->getPath(), '/here/there/'); + $this->assertEqual($url->getPage(), ''); + $this->assertEqual($url->getBasePath(), '/here/there/'); + } + + function testPathNormalisation() { + $this->assertEqual( + SimpleUrl::normalisePath('https://host.com/I/am/here/../there/somewhere.php'), + 'https://host.com/I/am/there/somewhere.php'); + } + + // regression test for #1535407 + function testPathNormalisationWithSinglePeriod() { + $this->assertEqual( + SimpleUrl::normalisePath('https://host.com/I/am/here/./../there/somewhere.php'), + 'https://host.com/I/am/there/somewhere.php'); + } + + // regression test for #1852413 + function testHostnameExtractedFromUContainingAtSign() { + $url = new SimpleUrl("http://localhost/name@example.com"); + $this->assertEqual($url->getScheme(), "http"); + $this->assertEqual($url->getUsername(), ""); + $this->assertEqual($url->getPassword(), ""); + $this->assertEqual($url->getHost(), "localhost"); + $this->assertEqual($url->getPath(), "/name@example.com"); + } + + function testHostnameInLocalhost() { + $url = new SimpleUrl("http://localhost/name/example.com"); + $this->assertEqual($url->getScheme(), "http"); + $this->assertEqual($url->getUsername(), ""); + $this->assertEqual($url->getPassword(), ""); + $this->assertEqual($url->getHost(), "localhost"); + $this->assertEqual($url->getPath(), "/name/example.com"); + } + + function testUsernameAndPasswordAreUrlDecoded() { + $url = new SimpleUrl('http://' . urlencode('test@test') . + ':' . urlencode('$!@*&%') . '@www.lastcraft.com'); + $this->assertEqual($url->getUsername(), 'test@test'); + $this->assertEqual($url->getPassword(), '$!@*&%'); + } + + function testBlitz() { + $this->assertUrl( + "https://username:password@www.somewhere.com:243/this/that/here.php?a=1&b=2#anchor", + array("https", "username", "password", "www.somewhere.com", 243, "/this/that/here.php", "com", "?a=1&b=2", "anchor"), + array("a" => "1", "b" => "2")); + $this->assertUrl( + "username:password@www.somewhere.com/this/that/here.php?a=1", + array(false, "username", "password", "www.somewhere.com", false, "/this/that/here.php", "com", "?a=1", false), + array("a" => "1")); + $this->assertUrl( + "username:password@somewhere.com:243?1,2", + array(false, "username", "password", "somewhere.com", 243, "/", "com", "", false), + array(), + array(1, 2)); + $this->assertUrl( + "https://www.somewhere.com", + array("https", false, false, "www.somewhere.com", false, "/", "com", "", false)); + $this->assertUrl( + "username@www.somewhere.com:243#anchor", + array(false, "username", false, "www.somewhere.com", 243, "/", "com", "", "anchor")); + $this->assertUrl( + "/this/that/here.php?a=1&b=2?3,4", + array(false, false, false, false, false, "/this/that/here.php", false, "?a=1&b=2", false), + array("a" => "1", "b" => "2"), + array(3, 4)); + $this->assertUrl( + "username@/here.php?a=1&b=2", + array(false, "username", false, false, false, "/here.php", false, "?a=1&b=2", false), + array("a" => "1", "b" => "2")); + } + + function testAmbiguousHosts() { + $this->assertUrl( + "tigger", + array(false, false, false, false, false, "tigger", false, "", false)); + $this->assertUrl( + "/tigger", + array(false, false, false, false, false, "/tigger", false, "", false)); + $this->assertUrl( + "//tigger", + array(false, false, false, "tigger", false, "/", false, "", false)); + $this->assertUrl( + "//tigger/", + array(false, false, false, "tigger", false, "/", false, "", false)); + $this->assertUrl( + "tigger.com", + array(false, false, false, "tigger.com", false, "/", "com", "", false)); + $this->assertUrl( + "me.net/tigger", + array(false, false, false, "me.net", false, "/tigger", "net", "", false)); + } + + function testAsString() { + $this->assertPreserved('https://www.here.com'); + $this->assertPreserved('http://me:secret@www.here.com'); + $this->assertPreserved('http://here/there'); + $this->assertPreserved('http://here/there?a=A&b=B'); + $this->assertPreserved('http://here/there?a=1&a=2'); + $this->assertPreserved('http://here/there?a=1&a=2?9,8'); + $this->assertPreserved('http://host?a=1&a=2'); + $this->assertPreserved('http://host#stuff'); + $this->assertPreserved('http://me:secret@www.here.com/a/b/c/here.html?a=A?7,6'); + $this->assertPreserved('http://www.here.com/?a=A__b=B'); + } + + function assertUrl($raw, $parts, $params = false, $coords = false) { + if (! is_array($params)) { + $params = array(); + } + $url = new SimpleUrl($raw); + $this->assertIdentical($url->getScheme(), $parts[0], "[$raw] scheme -> %s"); + $this->assertIdentical($url->getUsername(), $parts[1], "[$raw] username -> %s"); + $this->assertIdentical($url->getPassword(), $parts[2], "[$raw] password -> %s"); + $this->assertIdentical($url->getHost(), $parts[3], "[$raw] host -> %s"); + $this->assertIdentical($url->getPort(), $parts[4], "[$raw] port -> %s"); + $this->assertIdentical($url->getPath(), $parts[5], "[$raw] path -> %s"); + $this->assertIdentical($url->getTld(), $parts[6], "[$raw] tld -> %s"); + $this->assertIdentical($url->getEncodedRequest(), $parts[7], "[$raw] encoded -> %s"); + $this->assertIdentical($url->getFragment(), $parts[8], "[$raw] fragment -> %s"); + if ($coords) { + $this->assertIdentical($url->getX(), $coords[0], "[$raw] x -> %s"); + $this->assertIdentical($url->getY(), $coords[1], "[$raw] y -> %s"); + } + } + + function testUrlWithTwoSlashesInPath() { + $url = new SimpleUrl('/article/categoryedit/insert//'); + $this->assertEqual($url->getPath(), '/article/categoryedit/insert//'); + } + + function assertPreserved($string) { + $url = new SimpleUrl($string); + $this->assertEqual($url->asString(), $string); + } +} + +class TestOfAbsoluteUrls extends UnitTestCase { + + function testDirectoriesAfterFilename() { + $string = '../../index.php/foo/bar'; + $url = new SimpleUrl($string); + $this->assertEqual($url->asString(), $string); + + $absolute = $url->makeAbsolute('http://www.domain.com/some/path/'); + $this->assertEqual($absolute->asString(), 'http://www.domain.com/index.php/foo/bar'); + } + + function testMakingAbsolute() { + $url = new SimpleUrl('../there/somewhere.php'); + $this->assertEqual($url->getPath(), '../there/somewhere.php'); + $absolute = $url->makeAbsolute('https://host.com:1234/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'https'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPort(), 1234); + $this->assertEqual($absolute->getPath(), '/I/am/there/somewhere.php'); + } + + function testMakingAnEmptyUrlAbsolute() { + $url = new SimpleUrl(''); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/page.html'); + } + + function testMakingAnEmptyUrlAbsoluteWithMissingPageName() { + $url = new SimpleUrl(''); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/'); + } + + function testMakingAShortQueryUrlAbsolute() { + $url = new SimpleUrl('?a#b'); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/'); + $this->assertEqual($absolute->getEncodedRequest(), '?a'); + $this->assertEqual($absolute->getFragment(), 'b'); + } + + function testMakingADirectoryUrlAbsolute() { + $url = new SimpleUrl('hello/'); + $this->assertEqual($url->getPath(), 'hello/'); + $this->assertEqual($url->getBasePath(), 'hello/'); + $this->assertEqual($url->getPage(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getPath(), '/I/am/here/hello/'); + } + + function testMakingARootUrlAbsolute() { + $url = new SimpleUrl('/'); + $this->assertEqual($url->getPath(), '/'); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getPath(), '/'); + } + + function testMakingARootPageUrlAbsolute() { + $url = new SimpleUrl('/here.html'); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html'); + $this->assertEqual($absolute->getPath(), '/here.html'); + } + + function testCarryAuthenticationFromRootPage() { + $url = new SimpleUrl('here.html'); + $absolute = $url->makeAbsolute('http://test:secret@host.com/'); + $this->assertEqual($absolute->getPath(), '/here.html'); + $this->assertEqual($absolute->getUsername(), 'test'); + $this->assertEqual($absolute->getPassword(), 'secret'); + } + + function testMakingCoordinateUrlAbsolute() { + $url = new SimpleUrl('?1,2'); + $this->assertEqual($url->getPath(), ''); + $absolute = $url->makeAbsolute('http://host.com/I/am/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'host.com'); + $this->assertEqual($absolute->getPath(), '/I/am/here/'); + $this->assertEqual($absolute->getX(), 1); + $this->assertEqual($absolute->getY(), 2); + } + + function testMakingAbsoluteAppendedPath() { + $url = new SimpleUrl('./there/somewhere.php'); + $absolute = $url->makeAbsolute('https://host.com/here/'); + $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php'); + } + + function testMakingAbsoluteBadlyFormedAppendedPath() { + $url = new SimpleUrl('there/somewhere.php'); + $absolute = $url->makeAbsolute('https://host.com/here/'); + $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php'); + } + + function testMakingAbsoluteHasNoEffectWhenAlreadyAbsolute() { + $url = new SimpleUrl('https://test:secret@www.lastcraft.com:321/stuff/?a=1#f'); + $absolute = $url->makeAbsolute('http://host.com/here/'); + $this->assertEqual($absolute->getScheme(), 'https'); + $this->assertEqual($absolute->getUsername(), 'test'); + $this->assertEqual($absolute->getPassword(), 'secret'); + $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); + $this->assertEqual($absolute->getPort(), 321); + $this->assertEqual($absolute->getPath(), '/stuff/'); + $this->assertEqual($absolute->getEncodedRequest(), '?a=1'); + $this->assertEqual($absolute->getFragment(), 'f'); + } + + function testMakingAbsoluteCarriesAuthenticationWhenAlreadyAbsolute() { + $url = new SimpleUrl('https://www.lastcraft.com'); + $absolute = $url->makeAbsolute('http://test:secret@host.com/here/'); + $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); + $this->assertEqual($absolute->getUsername(), 'test'); + $this->assertEqual($absolute->getPassword(), 'secret'); + } + + function testMakingHostOnlyAbsoluteDoesNotCarryAnyOtherInformation() { + $url = new SimpleUrl('http://www.lastcraft.com'); + $absolute = $url->makeAbsolute('https://host.com:81/here/'); + $this->assertEqual($absolute->getScheme(), 'http'); + $this->assertEqual($absolute->getHost(), 'www.lastcraft.com'); + $this->assertIdentical($absolute->getPort(), false); + $this->assertEqual($absolute->getPath(), '/'); + } +} + +class TestOfFrameUrl extends UnitTestCase { + + function testTargetAttachment() { + $url = new SimpleUrl('http://www.site.com/home.html'); + $this->assertIdentical($url->getTarget(), false); + $url->setTarget('A frame'); + $this->assertIdentical($url->getTarget(), 'A frame'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/user_agent_test.php b/tests/simpletest/test/user_agent_test.php new file mode 100644 index 000000000..657c7e155 --- /dev/null +++ b/tests/simpletest/test/user_agent_test.php @@ -0,0 +1,358 @@ +_headers = &new MockSimpleHttpHeaders(); + + $this->_response = &new MockSimpleHttpResponse(); + $this->_response->setReturnValue('isError', false); + $this->_response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); + + $this->_request = &new MockSimpleHttpRequest(); + $this->_request->setReturnReference('fetch', $this->_response); + } + + function testGetRequestWithoutIncidentGivesNoErrors() { + $url = new SimpleUrl('http://test:secret@this.com/page.html'); + $url->addRequestParameters(array('a' => 'A', 'b' => 'B')); + + $agent = &new MockRequestUserAgent(); + $agent->setReturnReference('_createHttpRequest', $this->_request); + $agent->SimpleUserAgent(); + + $response = &$agent->fetchResponse( + new SimpleUrl('http://test:secret@this.com/page.html'), + new SimpleGetEncoding(array('a' => 'A', 'b' => 'B'))); + $this->assertFalse($response->isError()); + } +} + +class TestOfAdditionalHeaders extends UnitTestCase { + + function testAdditionalHeaderAddedToRequest() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); + + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + $request->expectOnce( + 'addHeaderLine', + array('User-Agent: SimpleTest')); + + $agent = &new MockRequestUserAgent(); + $agent->setReturnReference('_createHttpRequest', $request); + $agent->SimpleUserAgent(); + $agent->addHeader('User-Agent: SimpleTest'); + $response = &$agent->fetchResponse(new SimpleUrl('http://this.host/'), new SimpleGetEncoding()); + } +} + +class TestOfBrowserCookies extends UnitTestCase { + + function &_createStandardResponse() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue("isError", false); + $response->setReturnValue("getContent", "stuff"); + $response->setReturnReference("getHeaders", new MockSimpleHttpHeaders()); + return $response; + } + + function &_createCookieSite($header_lines) { + $headers = &new SimpleHttpHeaders($header_lines); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue("isError", false); + $response->setReturnReference("getHeaders", $headers); + $response->setReturnValue("getContent", "stuff"); + + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference("fetch", $response); + return $request; + } + + function &_createMockedRequestUserAgent(&$request) { + $agent = &new MockRequestUserAgent(); + $agent->setReturnReference('_createHttpRequest', $request); + $agent->SimpleUserAgent(); + return $agent; + } + + function testCookieJarIsSentToRequest() { + $jar = new SimpleCookieJar(); + $jar->setCookie('a', 'A'); + + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $this->_createStandardResponse()); + $request->expectOnce('readCookiesFromJar', array($jar, '*')); + + $agent = &$this->_createMockedRequestUserAgent($request); + $agent->setCookie('a', 'A'); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + } + + function testNoCookieJarIsSentToRequestWhenCookiesAreDisabled() { + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $this->_createStandardResponse()); + $request->expectNever('readCookiesFromJar'); + + $agent = &$this->_createMockedRequestUserAgent($request); + $agent->setCookie('a', 'A'); + $agent->ignoreCookies(); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + } + + function testReadingNewCookie() { + $request = &$this->_createCookieSite('Set-cookie: a=AAAA'); + $agent = &$this->_createMockedRequestUserAgent($request); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA"); + } + + function testIgnoringNewCookieWhenCookiesDisabled() { + $request = &$this->_createCookieSite('Set-cookie: a=AAAA'); + $agent = &$this->_createMockedRequestUserAgent($request); + $agent->ignoreCookies(); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertIdentical($agent->getCookieValue("this.com", "this/path/", "a"), false); + } + + function testOverwriteCookieThatAlreadyExists() { + $request = &$this->_createCookieSite('Set-cookie: a=AAAA'); + $agent = &$this->_createMockedRequestUserAgent($request); + $agent->setCookie('a', 'A'); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA"); + } + + function testClearCookieBySettingExpiry() { + $request = &$this->_createCookieSite('Set-cookie: a=b'); + $agent = &$this->_createMockedRequestUserAgent($request); + + $agent->setCookie("a", "A", "this/path/", "Wed, 25-Dec-02 04:24:21 GMT"); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + "b"); + $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + false); + } + + function testAgeingAndClearing() { + $request = &$this->_createCookieSite('Set-cookie: a=A; expires=Wed, 25-Dec-02 04:24:21 GMT; path=/this/path'); + $agent = &$this->_createMockedRequestUserAgent($request); + + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + "A"); + $agent->ageCookies(2); + $agent->restart("Wed, 25-Dec-02 04:24:20 GMT"); + $this->assertIdentical( + $agent->getCookieValue("this.com", "this/path/", "a"), + false); + } + + function testReadingIncomingAndSettingNewCookies() { + $request = &$this->_createCookieSite('Set-cookie: a=AAA'); + $agent = &$this->_createMockedRequestUserAgent($request); + + $this->assertNull($agent->getBaseCookieValue("a", false)); + $agent->fetchResponse( + new SimpleUrl('http://this.com/this/path/page.html'), + new SimpleGetEncoding()); + $agent->setCookie("b", "BBB", "this.com", "this/path/"); + $this->assertEqual( + $agent->getBaseCookieValue("a", new SimpleUrl('http://this.com/this/path/page.html')), + "AAA"); + $this->assertEqual( + $agent->getBaseCookieValue("b", new SimpleUrl('http://this.com/this/path/page.html')), + "BBB"); + } +} + +class TestOfHttpRedirects extends UnitTestCase { + + function &createRedirect($content, $redirect) { + $headers = &new MockSimpleHttpHeaders(); + $headers->setReturnValue('isRedirect', (boolean)$redirect); + $headers->setReturnValue('getLocation', $redirect); + + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('getContent', $content); + $response->setReturnReference('getHeaders', $headers); + + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + return $request; + } + + function testDisabledRedirects() { + $agent = &new MockRequestUserAgent(); + $agent->setReturnReference( + '_createHttpRequest', + $this->createRedirect('stuff', 'there.html')); + $agent->expectOnce('_createHttpRequest'); + $agent->SimpleUserAgent(); + + $agent->setMaximumRedirects(0); + $response = &$agent->fetchResponse(new SimpleUrl('here.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'stuff'); + } + + function testSingleRedirect() { + $agent = &new MockRequestUserAgent(); + $agent->setReturnReferenceAt( + 0, + '_createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->setReturnReferenceAt( + 1, + '_createHttpRequest', + $this->createRedirect('second', 'three.html')); + $agent->expectCallCount('_createHttpRequest', 2); + $agent->SimpleUserAgent(); + + $agent->setMaximumRedirects(1); + $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'second'); + } + + function testDoubleRedirect() { + $agent = &new MockRequestUserAgent(); + $agent->setReturnReferenceAt( + 0, + '_createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->setReturnReferenceAt( + 1, + '_createHttpRequest', + $this->createRedirect('second', 'three.html')); + $agent->setReturnReferenceAt( + 2, + '_createHttpRequest', + $this->createRedirect('third', 'four.html')); + $agent->expectCallCount('_createHttpRequest', 3); + $agent->SimpleUserAgent(); + + $agent->setMaximumRedirects(2); + $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'third'); + } + + function testSuccessAfterRedirect() { + $agent = &new MockRequestUserAgent(); + $agent->setReturnReferenceAt( + 0, + '_createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->setReturnReferenceAt( + 1, + '_createHttpRequest', + $this->createRedirect('second', false)); + $agent->setReturnReferenceAt( + 2, + '_createHttpRequest', + $this->createRedirect('third', 'four.html')); + $agent->expectCallCount('_createHttpRequest', 2); + $agent->SimpleUserAgent(); + + $agent->setMaximumRedirects(2); + $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding()); + $this->assertEqual($response->getContent(), 'second'); + } + + function testRedirectChangesPostToGet() { + $agent = &new MockRequestUserAgent(); + $agent->setReturnReferenceAt( + 0, + '_createHttpRequest', + $this->createRedirect('first', 'two.html')); + $agent->expectArgumentsAt(0, '_createHttpRequest', array('*', new IsAExpectation('SimplePostEncoding'))); + $agent->setReturnReferenceAt( + 1, + '_createHttpRequest', + $this->createRedirect('second', 'three.html')); + $agent->expectArgumentsAt(1, '_createHttpRequest', array('*', new IsAExpectation('SimpleGetEncoding'))); + $agent->expectCallCount('_createHttpRequest', 2); + $agent->SimpleUserAgent(); + $agent->setMaximumRedirects(1); + $response = &$agent->fetchResponse(new SimpleUrl('one.html'), new SimplePostEncoding()); + } +} + +class TestOfBadHosts extends UnitTestCase { + + function &_createSimulatedBadHost() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnValue('isError', true); + $response->setReturnValue('getError', 'Bad socket'); + $response->setReturnValue('getContent', false); + + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + return $request; + } + + function testUntestedHost() { + $request = &$this->_createSimulatedBadHost(); + + $agent = &new MockRequestUserAgent(); + $agent->setReturnReference('_createHttpRequest', $request); + $agent->SimpleUserAgent(); + + $response = &$agent->fetchResponse( + new SimpleUrl('http://this.host/this/path/page.html'), + new SimpleGetEncoding()); + $this->assertTrue($response->isError()); + } +} + +class TestOfAuthorisation extends UnitTestCase { + + function testAuthenticateHeaderAdded() { + $response = &new MockSimpleHttpResponse(); + $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders()); + + $request = &new MockSimpleHttpRequest(); + $request->setReturnReference('fetch', $response); + $request->expectOnce( + 'addHeaderLine', + array('Authorization: Basic ' . base64_encode('test:secret'))); + + $agent = &new MockRequestUserAgent(); + $agent->setReturnReference('_createHttpRequest', $request); + $agent->SimpleUserAgent(); + $response = &$agent->fetchResponse( + new SimpleUrl('http://test:secret@this.host'), + new SimpleGetEncoding()); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/visual_test.php b/tests/simpletest/test/visual_test.php new file mode 100644 index 000000000..13781bb65 --- /dev/null +++ b/tests/simpletest/test/visual_test.php @@ -0,0 +1,495 @@ +_a = $a; + } + } + + class PassingUnitTestCaseOutput extends UnitTestCase { + + function testOfResults() { + $this->pass('Pass'); + } + + function testTrue() { + $this->assertTrue(true); + } + + function testFalse() { + $this->assertFalse(false); + } + + function testExpectation() { + $expectation = &new EqualExpectation(25, 'My expectation message: %s'); + $this->assert($expectation, 25, 'My assert message : %s'); + } + + function testNull() { + $this->assertNull(null, "%s -> Pass"); + $this->assertNotNull(false, "%s -> Pass"); + } + + function testType() { + $this->assertIsA("hello", "string", "%s -> Pass"); + $this->assertIsA($this, "PassingUnitTestCaseOutput", "%s -> Pass"); + $this->assertIsA($this, "UnitTestCase", "%s -> Pass"); + } + + function testTypeEquality() { + $this->assertEqual("0", 0, "%s -> Pass"); + } + + function testNullEquality() { + $this->assertNotEqual(null, 1, "%s -> Pass"); + $this->assertNotEqual(1, null, "%s -> Pass"); + } + + function testIntegerEquality() { + $this->assertNotEqual(1, 2, "%s -> Pass"); + } + + function testStringEquality() { + $this->assertEqual("a", "a", "%s -> Pass"); + $this->assertNotEqual("aa", "ab", "%s -> Pass"); + } + + function testHashEquality() { + $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> Pass"); + } + + function testWithin() { + $this->assertWithinMargin(5, 5.4, 0.5, "%s -> Pass"); + } + + function testOutside() { + $this->assertOutsideMargin(5, 5.6, 0.5, "%s -> Pass"); + } + + function testStringIdentity() { + $a = "fred"; + $b = $a; + $this->assertIdentical($a, $b, "%s -> Pass"); + } + + function testTypeIdentity() { + $a = "0"; + $b = 0; + $this->assertNotIdentical($a, $b, "%s -> Pass"); + } + + function testNullIdentity() { + $this->assertNotIdentical(null, 1, "%s -> Pass"); + $this->assertNotIdentical(1, null, "%s -> Pass"); + } + + function testHashIdentity() { + } + + function testObjectEquality() { + $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Pass"); + $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Pass"); + } + + function testObjectIndentity() { + $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Pass"); + $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Pass"); + } + + function testReference() { + $a = "fred"; + $b = &$a; + $this->assertReference($a, $b, "%s -> Pass"); + } + + function testCloneOnDifferentObjects() { + $a = "fred"; + $b = $a; + $c = "Hello"; + $this->assertClone($a, $b, "%s -> Pass"); + } + + function testPatterns() { + $this->assertPattern('/hello/i', "Hello there", "%s -> Pass"); + $this->assertNoPattern('/hello/', "Hello there", "%s -> Pass"); + } + + function testLongStrings() { + $text = ""; + for ($i = 0; $i < 10; $i++) { + $text .= "0123456789"; + } + $this->assertEqual($text, $text); + } + } + + class FailingUnitTestCaseOutput extends UnitTestCase { + + function testOfResults() { + $this->fail('Fail'); // Fail. + } + + function testTrue() { + $this->assertTrue(false); // Fail. + } + + function testFalse() { + $this->assertFalse(true); // Fail. + } + + function testExpectation() { + $expectation = &new EqualExpectation(25, 'My expectation message: %s'); + $this->assert($expectation, 24, 'My assert message : %s'); // Fail. + } + + function testNull() { + $this->assertNull(false, "%s -> Fail"); // Fail. + $this->assertNotNull(null, "%s -> Fail"); // Fail. + } + + function testType() { + $this->assertIsA(14, "string", "%s -> Fail"); // Fail. + $this->assertIsA(14, "TestOfUnitTestCaseOutput", "%s -> Fail"); // Fail. + $this->assertIsA($this, "TestReporter", "%s -> Fail"); // Fail. + } + + function testTypeEquality() { + $this->assertNotEqual("0", 0, "%s -> Fail"); // Fail. + } + + function testNullEquality() { + $this->assertEqual(null, 1, "%s -> Fail"); // Fail. + $this->assertEqual(1, null, "%s -> Fail"); // Fail. + } + + function testIntegerEquality() { + $this->assertEqual(1, 2, "%s -> Fail"); // Fail. + } + + function testStringEquality() { + $this->assertNotEqual("a", "a", "%s -> Fail"); // Fail. + $this->assertEqual("aa", "ab", "%s -> Fail"); // Fail. + } + + function testHashEquality() { + $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "Z"), "%s -> Fail"); + } + + function testWithin() { + $this->assertWithinMargin(5, 5.6, 0.5, "%s -> Fail"); // Fail. + } + + function testOutside() { + $this->assertOutsideMargin(5, 5.4, 0.5, "%s -> Fail"); // Fail. + } + + function testStringIdentity() { + $a = "fred"; + $b = $a; + $this->assertNotIdentical($a, $b, "%s -> Fail"); // Fail. + } + + function testTypeIdentity() { + $a = "0"; + $b = 0; + $this->assertIdentical($a, $b, "%s -> Fail"); // Fail. + } + + function testNullIdentity() { + $this->assertIdentical(null, 1, "%s -> Fail"); // Fail. + $this->assertIdentical(1, null, "%s -> Fail"); // Fail. + } + + function testHashIdentity() { + $this->assertIdentical(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> fail"); // Fail. + } + + function testObjectEquality() { + $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Fail"); // Fail. + $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Fail"); // Fail. + } + + function testObjectIndentity() { + $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Fail"); // Fail. + $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Fail"); // Fail. + } + + function testReference() { + $a = "fred"; + $b = &$a; + $this->assertClone($a, $b, "%s -> Fail"); // Fail. + } + + function testCloneOnDifferentObjects() { + $a = "fred"; + $b = $a; + $c = "Hello"; + $this->assertClone($a, $c, "%s -> Fail"); // Fail. + } + + function testPatterns() { + $this->assertPattern('/hello/', "Hello there", "%s -> Fail"); // Fail. + $this->assertNoPattern('/hello/i', "Hello there", "%s -> Fail"); // Fail. + } + + function testLongStrings() { + $text = ""; + for ($i = 0; $i < 10; $i++) { + $text .= "0123456789"; + } + $this->assertEqual($text . $text, $text . "a" . $text); // Fail. + } + } + + class Dummy { + function Dummy() { + } + + function a() { + } + } + Mock::generate('Dummy'); + + class TestOfMockObjectsOutput extends UnitTestCase { + + function testCallCounts() { + $dummy = &new MockDummy(); + $dummy->expectCallCount('a', 1, 'My message: %s'); + $dummy->a(); + $dummy->a(); + } + + function testMinimumCallCounts() { + $dummy = &new MockDummy(); + $dummy->expectMinimumCallCount('a', 2, 'My message: %s'); + $dummy->a(); + $dummy->a(); + } + + function testEmptyMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array()); + $dummy->a(); + $dummy->a(null); // Fail. + } + + function testEmptyMatchingWithCustomMessage() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(), 'My expectation message: %s'); + $dummy->a(); + $dummy->a(null); // Fail. + } + + function testNullMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(null)); + $dummy->a(null); + $dummy->a(); // Fail. + } + + function testBooleanMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(true, false)); + $dummy->a(true, false); + $dummy->a(true, true); // Fail. + } + + function testIntegerMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(32, 33)); + $dummy->a(32, 33); + $dummy->a(32, 34); // Fail. + } + + function testFloatMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(3.2, 3.3)); + $dummy->a(3.2, 3.3); + $dummy->a(3.2, 3.4); // Fail. + } + + function testStringMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array('32', '33')); + $dummy->a('32', '33'); + $dummy->a('32', '34'); // Fail. + } + + function testEmptyMatchingWithCustomExpectationMessage() { + $dummy = &new MockDummy(); + $dummy->expectArguments( + 'a', + array(new EqualExpectation('A', 'My part expectation message: %s')), + 'My expectation message: %s'); + $dummy->a('A'); + $dummy->a('B'); // Fail. + } + + function testArrayMatching() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(array(32), array(33))); + $dummy->a(array(32), array(33)); + $dummy->a(array(32), array('33')); // Fail. + } + + function testObjectMatching() { + $a = new Dummy(); + $a->a = 'a'; + $b = new Dummy(); + $b->b = 'b'; + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array($a, $b)); + $dummy->a($a, $b); + $dummy->a($a, $a); // Fail. + } + + function testBigList() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array(false, 0, 1, 1.0)); + $dummy->a(false, 0, 1, 1.0); + $dummy->a(true, false, 2, 2.0); // Fail. + } + } + + class TestOfPastBugs extends UnitTestCase { + + function testMixedTypes() { + $this->assertEqual(array(), null, "%s -> Pass"); + $this->assertIdentical(array(), null, "%s -> Fail"); // Fail. + } + + function testMockWildcards() { + $dummy = &new MockDummy(); + $dummy->expectArguments('a', array('*', array(33))); + $dummy->a(array(32), array(33)); + $dummy->a(array(32), array('33')); // Fail. + } + } + + class TestOfVisualShell extends ShellTestCase { + + function testDump() { + $this->execute('ls'); + $this->dumpOutput(); + $this->execute('dir'); + $this->dumpOutput(); + } + + function testDumpOfList() { + $this->execute('ls'); + $this->dump($this->getOutputAsList()); + } + } + + class PassesAsWellReporter extends HtmlReporter { + + function _getCss() { + return parent::_getCss() . ' .pass { color: darkgreen; }'; + } + + function paintPass($message) { + parent::paintPass($message); + print "Pass: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . htmlentities($message) . "
      \n"; + } + + function paintSignal($type, &$payload) { + print "$type: "; + $breadcrumb = $this->getTestList(); + array_shift($breadcrumb); + print implode(" -> ", $breadcrumb); + print " -> " . htmlentities(serialize($payload)) . "
      \n"; + } + } + + class TestOfSkippingNoMatterWhat extends UnitTestCase { + function skip() { + $this->skipIf(true, 'Always skipped -> %s'); + } + + function testFail() { + $this->fail('This really shouldn\'t have happened'); + } + } + + class TestOfSkippingOrElse extends UnitTestCase { + function skip() { + $this->skipUnless(false, 'Always skipped -> %s'); + } + + function testFail() { + $this->fail('This really shouldn\'t have happened'); + } + } + + class TestOfSkippingTwiceOver extends UnitTestCase { + function skip() { + $this->skipIf(true, 'First reason -> %s'); + $this->skipIf(true, 'Second reason -> %s'); + } + + function testFail() { + $this->fail('This really shouldn\'t have happened'); + } + } + + class TestThatShouldNotBeSkipped extends UnitTestCase { + function skip() { + $this->skipIf(false); + $this->skipUnless(true); + } + + function testFail() { + $this->fail('We should see this message'); + } + + function testPass() { + $this->pass('We should see this message'); + } + } + + $test = &new TestSuite('Visual test with 46 passes, 47 fails and 0 exceptions'); + $test->addTestCase(new PassingUnitTestCaseOutput()); + $test->addTestCase(new FailingUnitTestCaseOutput()); + $test->addTestCase(new TestOfMockObjectsOutput()); + $test->addTestCase(new TestOfPastBugs()); + $test->addTestCase(new TestOfVisualShell()); + $test->addTestCase(new TestOfSkippingNoMatterWhat()); + $test->addTestCase(new TestOfSkippingOrElse()); + $test->addTestCase(new TestOfSkippingTwiceOver()); + $test->addTestCase(new TestThatShouldNotBeSkipped()); + + if (isset($_GET['xml']) || in_array('xml', (isset($argv) ? $argv : array()))) { + $reporter = &new XmlReporter(); + } elseif (TextReporter::inCli()) { + $reporter = &new TextReporter(); + } else { + $reporter = &new PassesAsWellReporter(); + } + if (isset($_GET['dry']) || in_array('dry', (isset($argv) ? $argv : array()))) { + $reporter->makeDry(); + } + exit ($test->run($reporter) ? 0 : 1); +?> \ No newline at end of file diff --git a/tests/simpletest/test/web_tester_test.php b/tests/simpletest/test/web_tester_test.php new file mode 100644 index 000000000..01f7d3c8c --- /dev/null +++ b/tests/simpletest/test/web_tester_test.php @@ -0,0 +1,156 @@ +assertTrue($expectation->test('a')); + $this->assertTrue($expectation->test(array('a'))); + $this->assertFalse($expectation->test('A')); + } + + function testMatchesInteger() { + $expectation = new FieldExpectation('1'); + $this->assertTrue($expectation->test('1')); + $this->assertTrue($expectation->test(1)); + $this->assertTrue($expectation->test(array('1'))); + $this->assertTrue($expectation->test(array(1))); + } + + function testNonStringFailsExpectation() { + $expectation = new FieldExpectation('a'); + $this->assertFalse($expectation->test(null)); + } + + function testUnsetFieldCanBeTestedFor() { + $expectation = new FieldExpectation(false); + $this->assertTrue($expectation->test(false)); + } + + function testMultipleValuesCanBeInAnyOrder() { + $expectation = new FieldExpectation(array('a', 'b')); + $this->assertTrue($expectation->test(array('a', 'b'))); + $this->assertTrue($expectation->test(array('b', 'a'))); + $this->assertFalse($expectation->test(array('a', 'a'))); + $this->assertFalse($expectation->test('a')); + } + + function testSingleItemCanBeArrayOrString() { + $expectation = new FieldExpectation(array('a')); + $this->assertTrue($expectation->test(array('a'))); + $this->assertTrue($expectation->test('a')); + } +} + +class TestOfHeaderExpectations extends UnitTestCase { + + function testExpectingOnlyTheHeaderName() { + $expectation = new HttpHeaderExpectation('a'); + $this->assertIdentical($expectation->test(false), false); + $this->assertIdentical($expectation->test('a: A'), true); + $this->assertIdentical($expectation->test('A: A'), true); + $this->assertIdentical($expectation->test('a: B'), true); + $this->assertIdentical($expectation->test(' a : A '), true); + } + + function testHeaderValueAsWell() { + $expectation = new HttpHeaderExpectation('a', 'A'); + $this->assertIdentical($expectation->test(false), false); + $this->assertIdentical($expectation->test('a: A'), true); + $this->assertIdentical($expectation->test('A: A'), true); + $this->assertIdentical($expectation->test('A: a'), false); + $this->assertIdentical($expectation->test('a: B'), false); + $this->assertIdentical($expectation->test(' a : A '), true); + $this->assertIdentical($expectation->test(' a : AB '), false); + } + + function testHeaderValueWithColons() { + $expectation = new HttpHeaderExpectation('a', 'A:B:C'); + $this->assertIdentical($expectation->test('a: A'), false); + $this->assertIdentical($expectation->test('a: A:B'), false); + $this->assertIdentical($expectation->test('a: A:B:C'), true); + $this->assertIdentical($expectation->test('a: A:B:C:D'), false); + } + + function testMultilineSearch() { + $expectation = new HttpHeaderExpectation('a', 'A'); + $this->assertIdentical($expectation->test("aa: A\r\nb: B\r\nc: C"), false); + $this->assertIdentical($expectation->test("aa: A\r\na: A\r\nb: B"), true); + } + + function testMultilineSearchWithPadding() { + $expectation = new HttpHeaderExpectation('a', ' A '); + $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), false); + $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), true); + } + + function testPatternMatching() { + $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/')); + $this->assertIdentical($expectation->test('a: A'), true); + $this->assertIdentical($expectation->test('A: A'), true); + $this->assertIdentical($expectation->test('A: a'), false); + $this->assertIdentical($expectation->test('a: B'), false); + $this->assertIdentical($expectation->test(' a : A '), true); + $this->assertIdentical($expectation->test(' a : AB '), true); + } + + function testCaseInsensitivePatternMatching() { + $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/i')); + $this->assertIdentical($expectation->test('a: a'), true); + $this->assertIdentical($expectation->test('a: B'), false); + $this->assertIdentical($expectation->test(' a : A '), true); + $this->assertIdentical($expectation->test(' a : BAB '), true); + $this->assertIdentical($expectation->test(' a : bab '), true); + } + + function testUnwantedHeader() { + $expectation = new NoHttpHeaderExpectation('a'); + $this->assertIdentical($expectation->test(''), true); + $this->assertIdentical($expectation->test('stuff'), true); + $this->assertIdentical($expectation->test('b: B'), true); + $this->assertIdentical($expectation->test('a: A'), false); + $this->assertIdentical($expectation->test('A: A'), false); + } + + function testMultilineUnwantedSearch() { + $expectation = new NoHttpHeaderExpectation('a'); + $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), true); + $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), false); + } + + function testLocationHeaderSplitsCorrectly() { + $expectation = new HttpHeaderExpectation('Location', 'http://here/'); + $this->assertIdentical($expectation->test('Location: http://here/'), true); + } +} + +class TestOfTextExpectations extends UnitTestCase { + + function testMatchingSubString() { + $expectation = new TextExpectation('wanted'); + $this->assertIdentical($expectation->test(''), false); + $this->assertIdentical($expectation->test('Wanted'), false); + $this->assertIdentical($expectation->test('wanted'), true); + $this->assertIdentical($expectation->test('the wanted text is here'), true); + } + + function testNotMatchingSubString() { + $expectation = new NoTextExpectation('wanted'); + $this->assertIdentical($expectation->test(''), true); + $this->assertIdentical($expectation->test('Wanted'), true); + $this->assertIdentical($expectation->test('wanted'), false); + $this->assertIdentical($expectation->test('the wanted text is here'), false); + } +} + +class TestOfGenericAssertionsInWebTester extends WebTestCase { + + function testEquality() { + $this->assertEqual('a', 'a'); + $this->assertNotEqual('a', 'A'); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test/xml_test.php b/tests/simpletest/test/xml_test.php new file mode 100644 index 000000000..91985b5d5 --- /dev/null +++ b/tests/simpletest/test/xml_test.php @@ -0,0 +1,187 @@ + 2)); + $this->assertEqual($nesting->getSize(), 2); + } +} + +class TestOfXmlStructureParsing extends UnitTestCase { + function testValidXml() { + $listener = &new MockSimpleScorer(); + $listener->expectNever('paintGroupStart'); + $listener->expectNever('paintGroupEnd'); + $listener->expectNever('paintCaseStart'); + $listener->expectNever('paintCaseEnd'); + $parser = &new SimpleTestXmlParser($listener); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("\n")); + } + + function testEmptyGroup() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintGroupStart', array('a_group', 7)); + $listener->expectOnce('paintGroupEnd', array('a_group')); + $parser = &new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_group\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + } + + function testEmptyCase() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintCaseStart', array('a_case')); + $listener->expectOnce('paintCaseEnd', array('a_case')); + $parser = &new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_case\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + } + + function testEmptyMethod() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintCaseStart', array('a_case')); + $listener->expectOnce('paintCaseEnd', array('a_case')); + $listener->expectOnce('paintMethodStart', array('a_method')); + $listener->expectOnce('paintMethodEnd', array('a_method')); + $parser = &new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("a_case\n"); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_method\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + $parser->parse("\n"); + } + + function testNestedGroup() { + $listener = &new MockSimpleScorer(); + $listener->expectArgumentsAt(0, 'paintGroupStart', array('a_group', 7)); + $listener->expectArgumentsAt(1, 'paintGroupStart', array('b_group', 3)); + $listener->expectCallCount('paintGroupStart', 2); + $listener->expectArgumentsAt(0, 'paintGroupEnd', array('b_group')); + $listener->expectArgumentsAt(1, 'paintGroupEnd', array('a_group')); + $listener->expectCallCount('paintGroupEnd', 2); + + $parser = &new SimpleTestXmlParser($listener); + $parser->parse("\n"); + $parser->parse("\n"); + + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("a_group\n")); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("b_group\n")); + $this->assertTrue($parser->parse("\n")); + $this->assertTrue($parser->parse("\n")); + $parser->parse("\n"); + } +} + +class AnyOldSignal { + var $stuff = true; +} + +class TestOfXmlResultsParsing extends UnitTestCase { + + function sendValidStart(&$parser) { + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("a_case\n"); + $parser->parse("\n"); + $parser->parse("a_method\n"); + } + + function sendValidEnd(&$parser) { + $parser->parse("\n"); + $parser->parse("\n"); + $parser->parse("\n"); + } + + function testPass() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintPass', array('a_message')); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testFail() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintFail', array('a_message')); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testException() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintError', array('a_message')); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testSkip() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintSkip', array('a_message')); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testSignal() { + $signal = new AnyOldSignal(); + $signal->stuff = "Hello"; + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintSignal', array('a_signal', $signal)); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse( + "\n")); + $this->sendValidEnd($parser); + } + + function testMessage() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintMessage', array('a_message')); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("a_message\n")); + $this->sendValidEnd($parser); + } + + function testFormattedMessage() { + $listener = &new MockSimpleScorer(); + $listener->expectOnce('paintFormattedMessage', array("\na\tmessage\n")); + $parser = &new SimpleTestXmlParser($listener); + $this->sendValidStart($parser); + $this->assertTrue($parser->parse("\n")); + $this->sendValidEnd($parser); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/test_case.php b/tests/simpletest/test_case.php new file mode 100644 index 000000000..e5b229833 --- /dev/null +++ b/tests/simpletest/test_case.php @@ -0,0 +1,708 @@ += 0) { + require_once(dirname(__FILE__) . '/exceptions.php'); + require_once(dirname(__FILE__) . '/reflection_php5.php'); +} else { + require_once(dirname(__FILE__) . '/reflection_php4.php'); +} +if (! defined('SIMPLE_TEST')) { + /** + * @ignore + */ + define('SIMPLE_TEST', dirname(__FILE__) . DIRECTORY_SEPARATOR); +} +/**#@-*/ + +/** + * Basic test case. This is the smallest unit of a test + * suite. It searches for + * all methods that start with the the string "test" and + * runs them. Working test cases extend this class. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleTestCase { + var $_label = false; + var $_reporter; + var $_observers; + var $_should_skip = false; + + /** + * Sets up the test with no display. + * @param string $label If no test name is given then + * the class name is used. + * @access public + */ + function SimpleTestCase($label = false) { + if ($label) { + $this->_label = $label; + } + } + + /** + * Accessor for the test name for subclasses. + * @return string Name of the test. + * @access public + */ + function getLabel() { + return $this->_label ? $this->_label : get_class($this); + } + + /** + * This is a placeholder for skipping tests. In this + * method you place skipIf() and skipUnless() calls to + * set the skipping state. + * @access public + */ + function skip() { + } + + /** + * Will issue a message to the reporter and tell the test + * case to skip if the incoming flag is true. + * @param string $should_skip Condition causing the tests to be skipped. + * @param string $message Text of skip condition. + * @access public + */ + function skipIf($should_skip, $message = '%s') { + if ($should_skip && ! $this->_should_skip) { + $this->_should_skip = true; + $message = sprintf($message, 'Skipping [' . get_class($this) . ']'); + $this->_reporter->paintSkip($message . $this->getAssertionLine()); + } + } + + /** + * Will issue a message to the reporter and tell the test + * case to skip if the incoming flag is false. + * @param string $shouldnt_skip Condition causing the tests to be run. + * @param string $message Text of skip condition. + * @access public + */ + function skipUnless($shouldnt_skip, $message = false) { + $this->skipIf(! $shouldnt_skip, $message); + } + + /** + * Used to invoke the single tests. + * @return SimpleInvoker Individual test runner. + * @access public + */ + function &createInvoker() { + $invoker = &new SimpleErrorTrappingInvoker(new SimpleInvoker($this)); + if (version_compare(phpversion(), '5') >= 0) { + $invoker = &new SimpleExceptionTrappingInvoker($invoker); + } + return $invoker; + } + + /** + * Uses reflection to run every method within itself + * starting with the string "test" unless a method + * is specified. + * @param SimpleReporter $reporter Current test reporter. + * @return boolean True if all tests passed. + * @access public + */ + function run(&$reporter) { + $context = &SimpleTest::getContext(); + $context->setTest($this); + $context->setReporter($reporter); + $this->_reporter = &$reporter; + $started = false; + foreach ($this->getTests() as $method) { + if ($reporter->shouldInvoke($this->getLabel(), $method)) { + $this->skip(); + if ($this->_should_skip) { + break; + } + if (! $started) { + $reporter->paintCaseStart($this->getLabel()); + $started = true; + } + $invoker = &$this->_reporter->createInvoker($this->createInvoker()); + $invoker->before($method); + $invoker->invoke($method); + $invoker->after($method); + } + } + if ($started) { + $reporter->paintCaseEnd($this->getLabel()); + } + unset($this->_reporter); + return $reporter->getStatus(); + } + + /** + * Gets a list of test names. Normally that will + * be all internal methods that start with the + * name "test". This method should be overridden + * if you want a different rule. + * @return array List of test names. + * @access public + */ + function getTests() { + $methods = array(); + foreach (get_class_methods(get_class($this)) as $method) { + if ($this->_isTest($method)) { + $methods[] = $method; + } + } + return $methods; + } + + /** + * Tests to see if the method is a test that should + * be run. Currently any method that starts with 'test' + * is a candidate unless it is the constructor. + * @param string $method Method name to try. + * @return boolean True if test method. + * @access protected + */ + function _isTest($method) { + if (strtolower(substr($method, 0, 4)) == 'test') { + return ! SimpleTestCompatibility::isA($this, strtolower($method)); + } + return false; + } + + /** + * Announces the start of the test. + * @param string $method Test method just started. + * @access public + */ + function before($method) { + $this->_reporter->paintMethodStart($method); + $this->_observers = array(); + } + + /** + * Sets up unit test wide variables at the start + * of each test method. To be overridden in + * actual user test cases. + * @access public + */ + function setUp() { + } + + /** + * Clears the data set in the setUp() method call. + * To be overridden by the user in actual user test cases. + * @access public + */ + function tearDown() { + } + + /** + * Announces the end of the test. Includes private clean up. + * @param string $method Test method just finished. + * @access public + */ + function after($method) { + for ($i = 0; $i < count($this->_observers); $i++) { + $this->_observers[$i]->atTestEnd($method, $this); + } + $this->_reporter->paintMethodEnd($method); + } + + /** + * Sets up an observer for the test end. + * @param object $observer Must have atTestEnd() + * method. + * @access public + */ + function tell(&$observer) { + $this->_observers[] = &$observer; + } + + /** + * @deprecated + */ + function pass($message = "Pass") { + if (! isset($this->_reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->_reporter->paintPass( + $message . $this->getAssertionLine()); + return true; + } + + /** + * Sends a fail event with a message. + * @param string $message Message to send. + * @access public + */ + function fail($message = "Fail") { + if (! isset($this->_reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->_reporter->paintFail( + $message . $this->getAssertionLine()); + return false; + } + + /** + * Formats a PHP error and dispatches it to the + * reporter. + * @param integer $severity PHP error code. + * @param string $message Text of error. + * @param string $file File error occoured in. + * @param integer $line Line number of error. + * @access public + */ + function error($severity, $message, $file, $line) { + if (! isset($this->_reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->_reporter->paintError( + "Unexpected PHP error [$message] severity [$severity] in [$file line $line]"); + } + + /** + * Formats an exception and dispatches it to the + * reporter. + * @param Exception $exception Object thrown. + * @access public + */ + function exception($exception) { + $this->_reporter->paintException($exception); + } + + /** + * @deprecated + */ + function signal($type, &$payload) { + if (! isset($this->_reporter)) { + trigger_error('Can only make assertions within test methods'); + } + $this->_reporter->paintSignal($type, $payload); + } + + /** + * Runs an expectation directly, for extending the + * tests with new expectation classes. + * @param SimpleExpectation $expectation Expectation subclass. + * @param mixed $compare Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assert(&$expectation, $compare, $message = '%s') { + if ($expectation->test($compare)) { + return $this->pass(sprintf( + $message, + $expectation->overlayMessage($compare, $this->_reporter->getDumper()))); + } else { + return $this->fail(sprintf( + $message, + $expectation->overlayMessage($compare, $this->_reporter->getDumper()))); + } + } + + /** + * @deprecated + */ + function assertExpectation(&$expectation, $compare, $message = '%s') { + return $this->assert($expectation, $compare, $message); + } + + /** + * Uses a stack trace to find the line of an assertion. + * @return string Line number of first assert* + * method embedded in format string. + * @access public + */ + function getAssertionLine() { + $trace = new SimpleStackTrace(array('assert', 'expect', 'pass', 'fail', 'skip')); + return $trace->traceMethod(); + } + + /** + * Sends a formatted dump of a variable to the + * test suite for those emergency debugging + * situations. + * @param mixed $variable Variable to display. + * @param string $message Message to display. + * @return mixed The original variable. + * @access public + */ + function dump($variable, $message = false) { + $dumper = $this->_reporter->getDumper(); + $formatted = $dumper->dump($variable); + if ($message) { + $formatted = $message . "\n" . $formatted; + } + $this->_reporter->paintFormattedMessage($formatted); + return $variable; + } + + /** + * @deprecated + */ + function sendMessage($message) { + $this->_reporter->PaintMessage($message); + } + + /** + * Accessor for the number of subtests including myelf. + * @return integer Number of test cases. + * @access public + * @static + */ + function getSize() { + return 1; + } +} + +/** + * Helps to extract test cases automatically from a file. + */ +class SimpleFileLoader { + + /** + * Builds a test suite from a library of test cases. + * The new suite is composed into this one. + * @param string $test_file File name of library with + * test case classes. + * @return TestSuite The new test suite. + * @access public + */ + function &load($test_file) { + $existing_classes = get_declared_classes(); + $existing_globals = get_defined_vars(); + include_once($test_file); + $new_globals = get_defined_vars(); + $this->_makeFileVariablesGlobal($existing_globals, $new_globals); + $new_classes = array_diff(get_declared_classes(), $existing_classes); + if (empty($new_classes)) { + $new_classes = $this->_scrapeClassesFromFile($test_file); + } + $classes = $this->selectRunnableTests($new_classes); + $suite = &$this->createSuiteFromClasses($test_file, $classes); + return $suite; + } + + /** + * Imports new variables into the global namespace. + * @param hash $existing Variables before the file was loaded. + * @param hash $new Variables after the file was loaded. + * @access private + */ + function _makeFileVariablesGlobal($existing, $new) { + $globals = array_diff(array_keys($new), array_keys($existing)); + foreach ($globals as $global) { + $_GLOBALS[$global] = $new[$global]; + } + } + + /** + * Lookup classnames from file contents, in case the + * file may have been included before. + * Note: This is probably too clever by half. Figuring this + * out after a failed test case is going to be tricky for us, + * never mind the user. A test case should not be included + * twice anyway. + * @param string $test_file File name with classes. + * @access private + */ + function _scrapeClassesFromFile($test_file) { + preg_match_all('~^\s*class\s+(\w+)(\s+(extends|implements)\s+\w+)*\s*\{~mi', + file_get_contents($test_file), + $matches ); + return $matches[1]; + } + + /** + * Calculates the incoming test cases. Skips abstract + * and ignored classes. + * @param array $candidates Candidate classes. + * @return array New classes which are test + * cases that shouldn't be ignored. + * @access public + */ + function selectRunnableTests($candidates) { + $classes = array(); + foreach ($candidates as $class) { + if (TestSuite::getBaseTestCase($class)) { + $reflection = new SimpleReflection($class); + if ($reflection->isAbstract()) { + SimpleTest::ignore($class); + } else { + $classes[] = $class; + } + } + } + return $classes; + } + + /** + * Builds a test suite from a class list. + * @param string $title Title of new group. + * @param array $classes Test classes. + * @return TestSuite Group loaded with the new + * test cases. + * @access public + */ + function &createSuiteFromClasses($title, $classes) { + if (count($classes) == 0) { + $suite = &new BadTestSuite($title, "No runnable test cases in [$title]"); + return $suite; + } + SimpleTest::ignoreParentsIfIgnored($classes); + $suite = &new TestSuite($title); + foreach ($classes as $class) { + if (! SimpleTest::isIgnored($class)) { + $suite->addTestClass($class); + } + } + return $suite; + } +} + +/** + * This is a composite test class for combining + * test cases and other RunnableTest classes into + * a group test. + * @package SimpleTest + * @subpackage UnitTester + */ +class TestSuite { + var $_label; + var $_test_cases; + + /** + * Sets the name of the test suite. + * @param string $label Name sent at the start and end + * of the test. + * @access public + */ + function TestSuite($label = false) { + $this->_label = $label; + $this->_test_cases = array(); + } + + /** + * Accessor for the test name for subclasses. If the suite + * wraps a single test case the label defaults to the name of that test. + * @return string Name of the test. + * @access public + */ + function getLabel() { + if (! $this->_label) { + return ($this->getSize() == 1) ? + get_class($this->_test_cases[0]) : get_class($this); + } else { + return $this->_label; + } + } + + /** + * @deprecated + */ + function addTestCase(&$test_case) { + $this->_test_cases[] = &$test_case; + } + + /** + * @deprecated + */ + function addTestClass($class) { + if (TestSuite::getBaseTestCase($class) == 'testsuite') { + $this->_test_cases[] = &new $class(); + } else { + $this->_test_cases[] = $class; + } + } + + /** + * Adds a test into the suite by instance or class. The class will + * be instantiated if it's a test suite. + * @param SimpleTestCase $test_case Suite or individual test + * case implementing the + * runnable test interface. + * @access public + */ + function add(&$test_case) { + if (! is_string($test_case)) { + $this->_test_cases[] = &$test_case; + } elseif (TestSuite::getBaseTestCase($class) == 'testsuite') { + $this->_test_cases[] = &new $class(); + } else { + $this->_test_cases[] = $class; + } + } + + /** + * @deprecated + */ + function addTestFile($test_file) { + $this->addFile($test_file); + } + + /** + * Builds a test suite from a library of test cases. + * The new suite is composed into this one. + * @param string $test_file File name of library with + * test case classes. + * @access public + */ + function addFile($test_file) { + $extractor = new SimpleFileLoader(); + $this->add($extractor->load($test_file)); + } + + /** + * Delegates to a visiting collector to add test + * files. + * @param string $path Path to scan from. + * @param SimpleCollector $collector Directory scanner. + * @access public + */ + function collect($path, &$collector) { + $collector->collect($this, $path); + } + + /** + * Invokes run() on all of the held test cases, instantiating + * them if necessary. + * @param SimpleReporter $reporter Current test reporter. + * @access public + */ + function run(&$reporter) { + $reporter->paintGroupStart($this->getLabel(), $this->getSize()); + for ($i = 0, $count = count($this->_test_cases); $i < $count; $i++) { + if (is_string($this->_test_cases[$i])) { + $class = $this->_test_cases[$i]; + $test = &new $class(); + $test->run($reporter); + unset($test); + } else { + $this->_test_cases[$i]->run($reporter); + } + } + $reporter->paintGroupEnd($this->getLabel()); + return $reporter->getStatus(); + } + + /** + * Number of contained test cases. + * @return integer Total count of cases in the group. + * @access public + */ + function getSize() { + $count = 0; + foreach ($this->_test_cases as $case) { + if (is_string($case)) { + if (! SimpleTest::isIgnored($case)) { + $count++; + } + } else { + $count += $case->getSize(); + } + } + return $count; + } + + /** + * Test to see if a class is derived from the + * SimpleTestCase class. + * @param string $class Class name. + * @access public + * @static + */ + function getBaseTestCase($class) { + while ($class = get_parent_class($class)) { + $class = strtolower($class); + if ($class == 'simpletestcase' || $class == 'testsuite') { + return $class; + } + } + return false; + } +} + +/** + * @package SimpleTest + * @subpackage UnitTester + * @deprecated + */ +class GroupTest extends TestSuite { } + +/** + * This is a failing group test for when a test suite hasn't + * loaded properly. + * @package SimpleTest + * @subpackage UnitTester + */ +class BadTestSuite { + var $_label; + var $_error; + + /** + * Sets the name of the test suite and error message. + * @param string $label Name sent at the start and end + * of the test. + * @access public + */ + function BadTestSuite($label, $error) { + $this->_label = $label; + $this->_error = $error; + } + + /** + * Accessor for the test name for subclasses. + * @return string Name of the test. + * @access public + */ + function getLabel() { + return $this->_label; + } + + /** + * Sends a single error to the reporter. + * @param SimpleReporter $reporter Current test reporter. + * @access public + */ + function run(&$reporter) { + $reporter->paintGroupStart($this->getLabel(), $this->getSize()); + $reporter->paintFail('Bad TestSuite [' . $this->getLabel() . + '] with error [' . $this->_error . ']'); + $reporter->paintGroupEnd($this->getLabel()); + return $reporter->getStatus(); + } + + /** + * Number of contained test cases. Always zero. + * @return integer Total count of cases in the group. + * @access public + */ + function getSize() { + return 0; + } +} + +/** + * @package SimpleTest + * @subpackage UnitTester + * @deprecated + */ +class BadGroupTest extends BadTestSuite { } +?> diff --git a/tests/simpletest/unit_tester.php b/tests/simpletest/unit_tester.php new file mode 100644 index 000000000..8bb757d4e --- /dev/null +++ b/tests/simpletest/unit_tester.php @@ -0,0 +1,420 @@ +SimpleTestCase($label); + } + + /** + * Called from within the test methods to register + * passes and failures. + * @param boolean $result Pass on true. + * @param string $message Message to display describing + * the test state. + * @return boolean True on pass + * @access public + */ + function assertTrue($result, $message = false) { + return $this->assert(new TrueExpectation(), $result, $message); + } + + /** + * Will be true on false and vice versa. False + * is the PHP definition of false, so that null, + * empty strings, zero and an empty array all count + * as false. + * @param boolean $result Pass on false. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertFalse($result, $message = '%s') { + return $this->assert(new FalseExpectation(), $result, $message); + } + + /** + * Will be true if the value is null. + * @param null $value Supposedly null value. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertNull($value, $message = '%s') { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + '[' . $dumper->describeValue($value) . '] should be null'); + return $this->assertTrue(! isset($value), $message); + } + + /** + * Will be true if the value is set. + * @param mixed $value Supposedly set value. + * @param string $message Message to display. + * @return boolean True on pass. + * @access public + */ + function assertNotNull($value, $message = '%s') { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + '[' . $dumper->describeValue($value) . '] should not be null'); + return $this->assertTrue(isset($value), $message); + } + + /** + * Type and class test. Will pass if class + * matches the type name or is a subclass or + * if not an object, but the type is correct. + * @param mixed $object Object to test. + * @param string $type Type name as string. + * @param string $message Message to display. + * @return boolean True on pass. + * @access public + */ + function assertIsA($object, $type, $message = '%s') { + return $this->assert( + new IsAExpectation($type), + $object, + $message); + } + + /** + * Type and class mismatch test. Will pass if class + * name or underling type does not match the one + * specified. + * @param mixed $object Object to test. + * @param string $type Type name as string. + * @param string $message Message to display. + * @return boolean True on pass. + * @access public + */ + function assertNotA($object, $type, $message = '%s') { + return $this->assert( + new NotAExpectation($type), + $object, + $message); + } + + /** + * Will trigger a pass if the two parameters have + * the same value only. Otherwise a fail. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertEqual($first, $second, $message = '%s') { + return $this->assert( + new EqualExpectation($first), + $second, + $message); + } + + /** + * Will trigger a pass if the two parameters have + * a different value. Otherwise a fail. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertNotEqual($first, $second, $message = '%s') { + return $this->assert( + new NotEqualExpectation($first), + $second, + $message); + } + + /** + * Will trigger a pass if the if the first parameter + * is near enough to the second by the margin. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param mixed $margin Fuzziness of match. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertWithinMargin($first, $second, $margin, $message = '%s') { + return $this->assert( + new WithinMarginExpectation($first, $margin), + $second, + $message); + } + + /** + * Will trigger a pass if the two parameters differ + * by more than the margin. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param mixed $margin Fuzziness of match. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertOutsideMargin($first, $second, $margin, $message = '%s') { + return $this->assert( + new OutsideMarginExpectation($first, $margin), + $second, + $message); + } + + /** + * Will trigger a pass if the two parameters have + * the same value and same type. Otherwise a fail. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertIdentical($first, $second, $message = '%s') { + return $this->assert( + new IdenticalExpectation($first), + $second, + $message); + } + + /** + * Will trigger a pass if the two parameters have + * the different value or different type. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertNotIdentical($first, $second, $message = '%s') { + return $this->assert( + new NotIdenticalExpectation($first), + $second, + $message); + } + + /** + * Will trigger a pass if both parameters refer + * to the same object. Fail otherwise. + * @param mixed $first Object reference to check. + * @param mixed $second Hopefully the same object. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertReference(&$first, &$second, $message = '%s') { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + '[' . $dumper->describeValue($first) . + '] and [' . $dumper->describeValue($second) . + '] should reference the same object'); + return $this->assertTrue( + SimpleTestCompatibility::isReference($first, $second), + $message); + } + + /** + * Will trigger a pass if both parameters refer + * to different objects. Fail otherwise. The objects + * have to be identical though. + * @param mixed $first Object reference to check. + * @param mixed $second Hopefully not the same object. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertClone(&$first, &$second, $message = '%s') { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + '[' . $dumper->describeValue($first) . + '] and [' . $dumper->describeValue($second) . + '] should not be the same object'); + $identical = &new IdenticalExpectation($first); + return $this->assertTrue( + $identical->test($second) && + ! SimpleTestCompatibility::isReference($first, $second), + $message); + } + + /** + * @deprecated + */ + function assertCopy(&$first, &$second, $message = "%s") { + $dumper = &new SimpleDumper(); + $message = sprintf( + $message, + "[" . $dumper->describeValue($first) . + "] and [" . $dumper->describeValue($second) . + "] should not be the same object"); + return $this->assertFalse( + SimpleTestCompatibility::isReference($first, $second), + $message); + } + + /** + * Will trigger a pass if the Perl regex pattern + * is found in the subject. Fail otherwise. + * @param string $pattern Perl regex to look for including + * the regex delimiters. + * @param string $subject String to search in. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertPattern($pattern, $subject, $message = '%s') { + return $this->assert( + new PatternExpectation($pattern), + $subject, + $message); + } + + /** + * @deprecated + */ + function assertWantedPattern($pattern, $subject, $message = '%s') { + return $this->assertPattern($pattern, $subject, $message); + } + + /** + * Will trigger a pass if the perl regex pattern + * is not present in subject. Fail if found. + * @param string $pattern Perl regex to look for including + * the regex delimiters. + * @param string $subject String to search in. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertNoPattern($pattern, $subject, $message = '%s') { + return $this->assert( + new NoPatternExpectation($pattern), + $subject, + $message); + } + + /** + * @deprecated + */ + function assertNoUnwantedPattern($pattern, $subject, $message = '%s') { + return $this->assertNoPattern($pattern, $subject, $message); + } + + /** + * @deprecated + */ + function swallowErrors() { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + $queue->clear(); + } + + /** + * @deprecated + */ + function assertNoErrors($message = '%s') { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + return $queue->assertNoErrors($message); + } + + /** + * @deprecated + */ + function assertError($expected = false, $message = '%s') { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + return $queue->assertError($this->_coerceExpectation($expected), $message); + } + + /** + * Prepares for an error. If the error mismatches it + * passes through, otherwise it is swallowed. Any + * left over errors trigger failures. + * @param SimpleExpectation/string $expected The error to match. + * @param string $message Message on failure. + * @access public + */ + function expectError($expected = false, $message = '%s') { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleErrorQueue'); + $queue->expectError($this->_coerceExpectation($expected), $message); + } + + /** + * Prepares for an exception. If the error mismatches it + * passes through, otherwise it is swallowed. Any + * left over errors trigger failures. + * @param SimpleExpectation/Exception $expected The error to match. + * @param string $message Message on failure. + * @access public + */ + function expectException($expected = false, $message = '%s') { + $context = &SimpleTest::getContext(); + $queue = &$context->get('SimpleExceptionTrap'); + // :HACK: Directly substituting in seems to cause a segfault with + // Zend Optimizer on some systems + $line = $this->getAssertionLine(); + $queue->expectException($expected, $message . $line); + } + + /** + * Creates an equality expectation if the + * object/value is not already some type + * of expectation. + * @param mixed $expected Expected value. + * @return SimpleExpectation Expectation object. + * @access private + */ + function _coerceExpectation($expected) { + if ($expected == false) { + return new TrueExpectation(); + } + if (SimpleTestCompatibility::isA($expected, 'SimpleExpectation')) { + return $expected; + } + return new EqualExpectation( + is_string($expected) ? str_replace('%', '%%', $expected) : $expected); + } + + /** + * @deprecated + */ + function assertErrorPattern($pattern, $message = '%s') { + return $this->assertError(new PatternExpectation($pattern), $message); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/url.php b/tests/simpletest/url.php new file mode 100644 index 000000000..0ea220409 --- /dev/null +++ b/tests/simpletest/url.php @@ -0,0 +1,528 @@ +_chompCoordinates($url); + $this->setCoordinates($x, $y); + $this->_scheme = $this->_chompScheme($url); + list($this->_username, $this->_password) = $this->_chompLogin($url); + $this->_host = $this->_chompHost($url); + $this->_port = false; + if (preg_match('/(.*?):(.*)/', $this->_host, $host_parts)) { + $this->_host = $host_parts[1]; + $this->_port = (integer)$host_parts[2]; + } + $this->_path = $this->_chompPath($url); + $this->_request = $this->_parseRequest($this->_chompRequest($url)); + $this->_fragment = (strncmp($url, "#", 1) == 0 ? substr($url, 1) : false); + $this->_target = false; + } + + /** + * Extracts the X, Y coordinate pair from an image map. + * @param string $url URL so far. The coordinates will be + * removed. + * @return array X, Y as a pair of integers. + * @access private + */ + function _chompCoordinates(&$url) { + if (preg_match('/(.*)\?(\d+),(\d+)$/', $url, $matches)) { + $url = $matches[1]; + return array((integer)$matches[2], (integer)$matches[3]); + } + return array(false, false); + } + + /** + * Extracts the scheme part of an incoming URL. + * @param string $url URL so far. The scheme will be + * removed. + * @return string Scheme part or false. + * @access private + */ + function _chompScheme(&$url) { + if (preg_match('/^([^\/:]*):(\/\/)(.*)/', $url, $matches)) { + $url = $matches[2] . $matches[3]; + return $matches[1]; + } + return false; + } + + /** + * Extracts the username and password from the + * incoming URL. The // prefix will be reattached + * to the URL after the doublet is extracted. + * @param string $url URL so far. The username and + * password are removed. + * @return array Two item list of username and + * password. Will urldecode() them. + * @access private + */ + function _chompLogin(&$url) { + $prefix = ''; + if (preg_match('/^(\/\/)(.*)/', $url, $matches)) { + $prefix = $matches[1]; + $url = $matches[2]; + } + if (preg_match('/^([^\/]*)@(.*)/', $url, $matches)) { + $url = $prefix . $matches[2]; + $parts = split(":", $matches[1]); + return array( + urldecode($parts[0]), + isset($parts[1]) ? urldecode($parts[1]) : false); + } + $url = $prefix . $url; + return array(false, false); + } + + /** + * Extracts the host part of an incoming URL. + * Includes the port number part. Will extract + * the host if it starts with // or it has + * a top level domain or it has at least two + * dots. + * @param string $url URL so far. The host will be + * removed. + * @return string Host part guess or false. + * @access private + */ + function _chompHost(&$url) { + if (preg_match('/^(\/\/)(.*?)(\/.*|\?.*|#.*|$)/', $url, $matches)) { + $url = $matches[3]; + return $matches[2]; + } + if (preg_match('/(.*?)(\.\.\/|\.\/|\/|\?|#|$)(.*)/', $url, $matches)) { + $tlds = SimpleUrl::getAllTopLevelDomains(); + if (preg_match('/[a-z0-9\-]+\.(' . $tlds . ')/i', $matches[1])) { + $url = $matches[2] . $matches[3]; + return $matches[1]; + } elseif (preg_match('/[a-z0-9\-]+\.[a-z0-9\-]+\.[a-z0-9\-]+/i', $matches[1])) { + $url = $matches[2] . $matches[3]; + return $matches[1]; + } + } + return false; + } + + /** + * Extracts the path information from the incoming + * URL. Strips this path from the URL. + * @param string $url URL so far. The host will be + * removed. + * @return string Path part or '/'. + * @access private + */ + function _chompPath(&$url) { + if (preg_match('/(.*?)(\?|#|$)(.*)/', $url, $matches)) { + $url = $matches[2] . $matches[3]; + return ($matches[1] ? $matches[1] : ''); + } + return ''; + } + + /** + * Strips off the request data. + * @param string $url URL so far. The request will be + * removed. + * @return string Raw request part. + * @access private + */ + function _chompRequest(&$url) { + if (preg_match('/\?(.*?)(#|$)(.*)/', $url, $matches)) { + $url = $matches[2] . $matches[3]; + return $matches[1]; + } + return ''; + } + + /** + * Breaks the request down into an object. + * @param string $raw Raw request. + * @return SimpleFormEncoding Parsed data. + * @access private + */ + function _parseRequest($raw) { + $this->_raw = $raw; + $request = new SimpleGetEncoding(); + foreach (split("&", $raw) as $pair) { + if (preg_match('/(.*?)=(.*)/', $pair, $matches)) { + $request->add($matches[1], urldecode($matches[2])); + } elseif ($pair) { + $request->add($pair, ''); + } + } + return $request; + } + + /** + * Accessor for protocol part. + * @param string $default Value to use if not present. + * @return string Scheme name, e.g "http". + * @access public + */ + function getScheme($default = false) { + return $this->_scheme ? $this->_scheme : $default; + } + + /** + * Accessor for user name. + * @return string Username preceding host. + * @access public + */ + function getUsername() { + return $this->_username; + } + + /** + * Accessor for password. + * @return string Password preceding host. + * @access public + */ + function getPassword() { + return $this->_password; + } + + /** + * Accessor for hostname and port. + * @param string $default Value to use if not present. + * @return string Hostname only. + * @access public + */ + function getHost($default = false) { + return $this->_host ? $this->_host : $default; + } + + /** + * Accessor for top level domain. + * @return string Last part of host. + * @access public + */ + function getTld() { + $path_parts = pathinfo($this->getHost()); + return (isset($path_parts['extension']) ? $path_parts['extension'] : false); + } + + /** + * Accessor for port number. + * @return integer TCP/IP port number. + * @access public + */ + function getPort() { + return $this->_port; + } + + /** + * Accessor for path. + * @return string Full path including leading slash if implied. + * @access public + */ + function getPath() { + if (! $this->_path && $this->_host) { + return '/'; + } + return $this->_path; + } + + /** + * Accessor for page if any. This may be a + * directory name if ambiguious. + * @return Page name. + * @access public + */ + function getPage() { + if (! preg_match('/([^\/]*?)$/', $this->getPath(), $matches)) { + return false; + } + return $matches[1]; + } + + /** + * Gets the path to the page. + * @return string Path less the page. + * @access public + */ + function getBasePath() { + if (! preg_match('/(.*\/)[^\/]*?$/', $this->getPath(), $matches)) { + return false; + } + return $matches[1]; + } + + /** + * Accessor for fragment at end of URL after the "#". + * @return string Part after "#". + * @access public + */ + function getFragment() { + return $this->_fragment; + } + + /** + * Sets image coordinates. Set to false to clear + * them. + * @param integer $x Horizontal position. + * @param integer $y Vertical position. + * @access public + */ + function setCoordinates($x = false, $y = false) { + if (($x === false) || ($y === false)) { + $this->_x = $this->_y = false; + return; + } + $this->_x = (integer)$x; + $this->_y = (integer)$y; + } + + /** + * Accessor for horizontal image coordinate. + * @return integer X value. + * @access public + */ + function getX() { + return $this->_x; + } + + /** + * Accessor for vertical image coordinate. + * @return integer Y value. + * @access public + */ + function getY() { + return $this->_y; + } + + /** + * Accessor for current request parameters + * in URL string form. Will return teh original request + * if at all possible even if it doesn't make much + * sense. + * @return string Form is string "?a=1&b=2", etc. + * @access public + */ + function getEncodedRequest() { + if ($this->_raw) { + $encoded = $this->_raw; + } else { + $encoded = $this->_request->asUrlRequest(); + } + if ($encoded) { + return '?' . preg_replace('/^\?/', '', $encoded); + } + return ''; + } + + /** + * Adds an additional parameter to the request. + * @param string $key Name of parameter. + * @param string $value Value as string. + * @access public + */ + function addRequestParameter($key, $value) { + $this->_raw = false; + $this->_request->add($key, $value); + } + + /** + * Adds additional parameters to the request. + * @param hash/SimpleFormEncoding $parameters Additional + * parameters. + * @access public + */ + function addRequestParameters($parameters) { + $this->_raw = false; + $this->_request->merge($parameters); + } + + /** + * Clears down all parameters. + * @access public + */ + function clearRequest() { + $this->_raw = false; + $this->_request = &new SimpleGetEncoding(); + } + + /** + * Gets the frame target if present. Although + * not strictly part of the URL specification it + * acts as similarily to the browser. + * @return boolean/string Frame name or false if none. + * @access public + */ + function getTarget() { + return $this->_target; + } + + /** + * Attaches a frame target. + * @param string $frame Name of frame. + * @access public + */ + function setTarget($frame) { + $this->_raw = false; + $this->_target = $frame; + } + + /** + * Renders the URL back into a string. + * @return string URL in canonical form. + * @access public + */ + function asString() { + $path = $this->_path; + $scheme = $identity = $host = $encoded = $fragment = ''; + if ($this->_username && $this->_password) { + $identity = $this->_username . ':' . $this->_password . '@'; + } + if ($this->getHost()) { + $scheme = $this->getScheme() ? $this->getScheme() : 'http'; + $scheme .= "://"; + $host = $this->getHost(); + } + if (substr($this->_path, 0, 1) == '/') { + $path = $this->normalisePath($this->_path); + } + $encoded = $this->getEncodedRequest(); + $fragment = $this->getFragment() ? '#'. $this->getFragment() : ''; + $coords = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY(); + return "$scheme$identity$host$path$encoded$fragment$coords"; + } + + /** + * Replaces unknown sections to turn a relative + * URL into an absolute one. The base URL can + * be either a string or a SimpleUrl object. + * @param string/SimpleUrl $base Base URL. + * @access public + */ + function makeAbsolute($base) { + if (! is_object($base)) { + $base = new SimpleUrl($base); + } + if ($this->getHost()) { + $scheme = $this->getScheme(); + $host = $this->getHost(); + $port = $this->getPort() ? ':' . $this->getPort() : ''; + $identity = $this->getIdentity() ? $this->getIdentity() . '@' : ''; + if (! $identity) { + $identity = $base->getIdentity() ? $base->getIdentity() . '@' : ''; + } + } else { + $scheme = $base->getScheme(); + $host = $base->getHost(); + $port = $base->getPort() ? ':' . $base->getPort() : ''; + $identity = $base->getIdentity() ? $base->getIdentity() . '@' : ''; + } + $path = $this->normalisePath($this->_extractAbsolutePath($base)); + $encoded = $this->getEncodedRequest(); + $fragment = $this->getFragment() ? '#'. $this->getFragment() : ''; + $coords = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY(); + return new SimpleUrl("$scheme://$identity$host$port$path$encoded$fragment$coords"); + } + + /** + * Replaces unknown sections of the path with base parts + * to return a complete absolute one. + * @param string/SimpleUrl $base Base URL. + * @param string Absolute path. + * @access private + */ + function _extractAbsolutePath($base) { + if ($this->getHost()) { + return $this->_path; + } + if (! $this->_isRelativePath($this->_path)) { + return $this->_path; + } + if ($this->_path) { + return $base->getBasePath() . $this->_path; + } + return $base->getPath(); + } + + /** + * Simple test to see if a path part is relative. + * @param string $path Path to test. + * @return boolean True if starts with a "/". + * @access private + */ + function _isRelativePath($path) { + return (substr($path, 0, 1) != '/'); + } + + /** + * Extracts the username and password for use in rendering + * a URL. + * @return string/boolean Form of username:password or false. + * @access public + */ + function getIdentity() { + if ($this->_username && $this->_password) { + return $this->_username . ':' . $this->_password; + } + return false; + } + + /** + * Replaces . and .. sections of the path. + * @param string $path Unoptimised path. + * @return string Path with dots removed if possible. + * @access public + */ + function normalisePath($path) { + $path = preg_replace('|/\./|', '/', $path); + return preg_replace('|/[^/]+/\.\./|', '/', $path); + } + + /** + * A pipe seperated list of all TLDs that result in two part + * domain names. + * @return string Pipe separated list. + * @access public + * @static + */ + function getAllTopLevelDomains() { + return 'com|edu|net|org|gov|mil|int|biz|info|name|pro|aero|coop|museum'; + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/user_agent.php b/tests/simpletest/user_agent.php new file mode 100644 index 000000000..b3f6f057e --- /dev/null +++ b/tests/simpletest/user_agent.php @@ -0,0 +1,332 @@ +_cookie_jar = &new SimpleCookieJar(); + $this->_authenticator = &new SimpleAuthenticator(); + } + + /** + * Removes expired and temporary cookies as if + * the browser was closed and re-opened. Authorisation + * has to be obtained again as well. + * @param string/integer $date Time when session restarted. + * If omitted then all persistent + * cookies are kept. + * @access public + */ + function restart($date = false) { + $this->_cookie_jar->restartSession($date); + $this->_authenticator->restartSession(); + } + + /** + * Adds a header to every fetch. + * @param string $header Header line to add to every + * request until cleared. + * @access public + */ + function addHeader($header) { + $this->_additional_headers[] = $header; + } + + /** + * Ages the cookies by the specified time. + * @param integer $interval Amount in seconds. + * @access public + */ + function ageCookies($interval) { + $this->_cookie_jar->agePrematurely($interval); + } + + /** + * Sets an additional cookie. If a cookie has + * the same name and path it is replaced. + * @param string $name Cookie key. + * @param string $value Value of cookie. + * @param string $host Host upon which the cookie is valid. + * @param string $path Cookie path if not host wide. + * @param string $expiry Expiry date. + * @access public + */ + function setCookie($name, $value, $host = false, $path = '/', $expiry = false) { + $this->_cookie_jar->setCookie($name, $value, $host, $path, $expiry); + } + + /** + * Reads the most specific cookie value from the + * browser cookies. + * @param string $host Host to search. + * @param string $path Applicable path. + * @param string $name Name of cookie to read. + * @return string False if not present, else the + * value as a string. + * @access public + */ + function getCookieValue($host, $path, $name) { + return $this->_cookie_jar->getCookieValue($host, $path, $name); + } + + /** + * Reads the current cookies within the base URL. + * @param string $name Key of cookie to find. + * @param SimpleUrl $base Base URL to search from. + * @return string/boolean Null if there is no base URL, false + * if the cookie is not set. + * @access public + */ + function getBaseCookieValue($name, $base) { + if (! $base) { + return null; + } + return $this->getCookieValue($base->getHost(), $base->getPath(), $name); + } + + /** + * Switches off cookie sending and recieving. + * @access public + */ + function ignoreCookies() { + $this->_cookies_enabled = false; + } + + /** + * Switches back on the cookie sending and recieving. + * @access public + */ + function useCookies() { + $this->_cookies_enabled = true; + } + + /** + * Sets the socket timeout for opening a connection. + * @param integer $timeout Maximum time in seconds. + * @access public + */ + function setConnectionTimeout($timeout) { + $this->_connection_timeout = $timeout; + } + + /** + * Sets the maximum number of redirects before + * a page will be loaded anyway. + * @param integer $max Most hops allowed. + * @access public + */ + function setMaximumRedirects($max) { + $this->_max_redirects = $max; + } + + /** + * Sets proxy to use on all requests for when + * testing from behind a firewall. Set URL + * to false to disable. + * @param string $proxy Proxy URL. + * @param string $username Proxy username for authentication. + * @param string $password Proxy password for authentication. + * @access public + */ + function useProxy($proxy, $username, $password) { + if (! $proxy) { + $this->_proxy = false; + return; + } + if ((strncmp($proxy, 'http://', 7) != 0) && (strncmp($proxy, 'https://', 8) != 0)) { + $proxy = 'http://'. $proxy; + } + $this->_proxy = &new SimpleUrl($proxy); + $this->_proxy_username = $username; + $this->_proxy_password = $password; + } + + /** + * Test to see if the redirect limit is passed. + * @param integer $redirects Count so far. + * @return boolean True if over. + * @access private + */ + function _isTooManyRedirects($redirects) { + return ($redirects > $this->_max_redirects); + } + + /** + * Sets the identity for the current realm. + * @param string $host Host to which realm applies. + * @param string $realm Full name of realm. + * @param string $username Username for realm. + * @param string $password Password for realm. + * @access public + */ + function setIdentity($host, $realm, $username, $password) { + $this->_authenticator->setIdentityForRealm($host, $realm, $username, $password); + } + + /** + * Fetches a URL as a response object. Will keep trying if redirected. + * It will also collect authentication realm information. + * @param string/SimpleUrl $url Target to fetch. + * @param SimpleEncoding $encoding Additional parameters for request. + * @return SimpleHttpResponse Hopefully the target page. + * @access public + */ + function &fetchResponse($url, $encoding) { + if ($encoding->getMethod() != 'POST') { + $url->addRequestParameters($encoding); + $encoding->clear(); + } + $response = &$this->_fetchWhileRedirected($url, $encoding); + if ($headers = $response->getHeaders()) { + if ($headers->isChallenge()) { + $this->_authenticator->addRealm( + $url, + $headers->getAuthentication(), + $headers->getRealm()); + } + } + return $response; + } + + /** + * Fetches the page until no longer redirected or + * until the redirect limit runs out. + * @param SimpleUrl $url Target to fetch. + * @param SimpelFormEncoding $encoding Additional parameters for request. + * @return SimpleHttpResponse Hopefully the target page. + * @access private + */ + function &_fetchWhileRedirected($url, $encoding) { + $redirects = 0; + do { + $response = &$this->_fetch($url, $encoding); + if ($response->isError()) { + return $response; + } + $headers = $response->getHeaders(); + $location = new SimpleUrl($headers->getLocation()); + $url = $location->makeAbsolute($url); + if ($this->_cookies_enabled) { + $headers->writeCookiesToJar($this->_cookie_jar, $url); + } + if (! $headers->isRedirect()) { + break; + } + $encoding = new SimpleGetEncoding(); + } while (! $this->_isTooManyRedirects(++$redirects)); + return $response; + } + + /** + * Actually make the web request. + * @param SimpleUrl $url Target to fetch. + * @param SimpleFormEncoding $encoding Additional parameters for request. + * @return SimpleHttpResponse Headers and hopefully content. + * @access protected + */ + function &_fetch($url, $encoding) { + $request = &$this->_createRequest($url, $encoding); + $response = &$request->fetch($this->_connection_timeout); + return $response; + } + + /** + * Creates a full page request. + * @param SimpleUrl $url Target to fetch as url object. + * @param SimpleFormEncoding $encoding POST/GET parameters. + * @return SimpleHttpRequest New request. + * @access private + */ + function &_createRequest($url, $encoding) { + $request = &$this->_createHttpRequest($url, $encoding); + $this->_addAdditionalHeaders($request); + if ($this->_cookies_enabled) { + $request->readCookiesFromJar($this->_cookie_jar, $url); + } + $this->_authenticator->addHeaders($request, $url); + return $request; + } + + /** + * Builds the appropriate HTTP request object. + * @param SimpleUrl $url Target to fetch as url object. + * @param SimpleFormEncoding $parameters POST/GET parameters. + * @return SimpleHttpRequest New request object. + * @access protected + */ + function &_createHttpRequest($url, $encoding) { + $request = &new SimpleHttpRequest($this->_createRoute($url), $encoding); + return $request; + } + + /** + * Sets up either a direct route or via a proxy. + * @param SimpleUrl $url Target to fetch as url object. + * @return SimpleRoute Route to take to fetch URL. + * @access protected + */ + function &_createRoute($url) { + if ($this->_proxy) { + $route = &new SimpleProxyRoute( + $url, + $this->_proxy, + $this->_proxy_username, + $this->_proxy_password); + } else { + $route = &new SimpleRoute($url); + } + return $route; + } + + /** + * Adds additional manual headers. + * @param SimpleHttpRequest $request Outgoing request. + * @access private + */ + function _addAdditionalHeaders(&$request) { + foreach ($this->_additional_headers as $header) { + $request->addHeaderLine($header); + } + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/web_tester.php b/tests/simpletest/web_tester.php new file mode 100644 index 000000000..40b161291 --- /dev/null +++ b/tests/simpletest/web_tester.php @@ -0,0 +1,1541 @@ +SimpleExpectation($message); + if (is_array($value)) { + sort($value); + } + $this->_value = $value; + } + + /** + * Tests the expectation. True if it matches + * a string value or an array value in any order. + * @param mixed $compare Comparison value. False for + * an unset field. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + if ($this->_value === false) { + return ($compare === false); + } + if ($this->_isSingle($this->_value)) { + return $this->_testSingle($compare); + } + if (is_array($this->_value)) { + return $this->_testMultiple($compare); + } + return false; + } + + /** + * Tests for valid field comparisons with a single option. + * @param mixed $value Value to type check. + * @return boolean True if integer, string or float. + * @access private + */ + function _isSingle($value) { + return is_string($value) || is_integer($value) || is_float($value); + } + + /** + * String comparison for simple field with a single option. + * @param mixed $compare String to test against. + * @returns boolean True if matching. + * @access private + */ + function _testSingle($compare) { + if (is_array($compare) && count($compare) == 1) { + $compare = $compare[0]; + } + if (! $this->_isSingle($compare)) { + return false; + } + return ($this->_value == $compare); + } + + /** + * List comparison for multivalue field. + * @param mixed $compare List in any order to test against. + * @returns boolean True if matching. + * @access private + */ + function _testMultiple($compare) { + if (is_string($compare)) { + $compare = array($compare); + } + if (! is_array($compare)) { + return false; + } + sort($compare); + return ($this->_value === $compare); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $dumper = &$this->_getDumper(); + if (is_array($compare)) { + sort($compare); + } + if ($this->test($compare)) { + return "Field expectation [" . $dumper->describeValue($this->_value) . "]"; + } else { + return "Field expectation [" . $dumper->describeValue($this->_value) . + "] fails with [" . + $dumper->describeValue($compare) . "] " . + $dumper->describeDifference($this->_value, $compare); + } + } +} + +/** + * Test for a specific HTTP header within a header block. + * @package SimpleTest + * @subpackage WebTester + */ +class HttpHeaderExpectation extends SimpleExpectation { + var $_expected_header; + var $_expected_value; + + /** + * Sets the field and value to compare against. + * @param string $header Case insenstive trimmed header name. + * @param mixed $value Optional value to compare. If not + * given then any value will match. If + * an expectation object then that will + * be used instead. + * @param string $message Optiona message override. Can use %s as + * a placeholder for the original message. + */ + function HttpHeaderExpectation($header, $value = false, $message = '%s') { + $this->SimpleExpectation($message); + $this->_expected_header = $this->_normaliseHeader($header); + $this->_expected_value = $value; + } + + /** + * Accessor for aggregated object. + * @return mixed Expectation set in constructor. + * @access protected + */ + function _getExpectation() { + return $this->_expected_value; + } + + /** + * Removes whitespace at ends and case variations. + * @param string $header Name of header. + * @param string Trimmed and lowecased header + * name. + * @access private + */ + function _normaliseHeader($header) { + return strtolower(trim($header)); + } + + /** + * Tests the expectation. True if it matches + * a string value or an array value in any order. + * @param mixed $compare Raw header block to search. + * @return boolean True if header present. + * @access public + */ + function test($compare) { + return is_string($this->_findHeader($compare)); + } + + /** + * Searches the incoming result. Will extract the matching + * line as text. + * @param mixed $compare Raw header block to search. + * @return string Matching header line. + * @access protected + */ + function _findHeader($compare) { + $lines = split("\r\n", $compare); + foreach ($lines as $line) { + if ($this->_testHeaderLine($line)) { + return $line; + } + } + return false; + } + + /** + * Compares a single header line against the expectation. + * @param string $line A single line to compare. + * @return boolean True if matched. + * @access private + */ + function _testHeaderLine($line) { + if (count($parsed = split(':', $line, 2)) < 2) { + return false; + } + list($header, $value) = $parsed; + if ($this->_normaliseHeader($header) != $this->_expected_header) { + return false; + } + return $this->_testHeaderValue($value, $this->_expected_value); + } + + /** + * Tests the value part of the header. + * @param string $value Value to test. + * @param mixed $expected Value to test against. + * @return boolean True if matched. + * @access protected + */ + function _testHeaderValue($value, $expected) { + if ($expected === false) { + return true; + } + if (SimpleExpectation::isExpectation($expected)) { + return $expected->test(trim($value)); + } + return (trim($value) == trim($expected)); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Raw header block to search. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if (SimpleExpectation::isExpectation($this->_expected_value)) { + $message = $this->_expected_value->overlayMessage($compare, $this->_getDumper()); + } else { + $message = $this->_expected_header . + ($this->_expected_value ? ': ' . $this->_expected_value : ''); + } + if (is_string($line = $this->_findHeader($compare))) { + return "Searching for header [$message] found [$line]"; + } else { + return "Failed to find header [$message]"; + } + } +} + +/** + * Test for a specific HTTP header within a header block that + * should not be found. + * @package SimpleTest + * @subpackage WebTester + */ +class NoHttpHeaderExpectation extends HttpHeaderExpectation { + var $_expected_header; + var $_expected_value; + + /** + * Sets the field and value to compare against. + * @param string $unwanted Case insenstive trimmed header name. + * @param string $message Optiona message override. Can use %s as + * a placeholder for the original message. + */ + function NoHttpHeaderExpectation($unwanted, $message = '%s') { + $this->HttpHeaderExpectation($unwanted, false, $message); + } + + /** + * Tests that the unwanted header is not found. + * @param mixed $compare Raw header block to search. + * @return boolean True if header present. + * @access public + */ + function test($compare) { + return ($this->_findHeader($compare) === false); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Raw header block to search. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + $expectation = $this->_getExpectation(); + if (is_string($line = $this->_findHeader($compare))) { + return "Found unwanted header [$expectation] with [$line]"; + } else { + return "Did not find unwanted header [$expectation]"; + } + } +} + +/** + * Test for a text substring. + * @package SimpleTest + * @subpackage UnitTester + */ +class TextExpectation extends SimpleExpectation { + var $_substring; + + /** + * Sets the value to compare against. + * @param string $substring Text to search for. + * @param string $message Customised message on failure. + * @access public + */ + function TextExpectation($substring, $message = '%s') { + $this->SimpleExpectation($message); + $this->_substring = $substring; + } + + /** + * Accessor for the substring. + * @return string Text to match. + * @access protected + */ + function _getSubstring() { + return $this->_substring; + } + + /** + * Tests the expectation. True if the text contains the + * substring. + * @param string $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return (strpos($compare, $this->_substring) !== false); + } + + /** + * Returns a human readable test message. + * @param mixed $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + return $this->_describeTextMatch($this->_getSubstring(), $compare); + } else { + $dumper = &$this->_getDumper(); + return "Text [" . $this->_getSubstring() . + "] not detected in [" . + $dumper->describeValue($compare) . "]"; + } + } + + /** + * Describes a pattern match including the string + * found and it's position. + * @param string $substring Text to search for. + * @param string $subject Subject to search. + * @access protected + */ + function _describeTextMatch($substring, $subject) { + $position = strpos($subject, $substring); + $dumper = &$this->_getDumper(); + return "Text [$substring] detected at character [$position] in [" . + $dumper->describeValue($subject) . "] in region [" . + $dumper->clipString($subject, 100, $position) . "]"; + } +} + +/** + * Fail if a substring is detected within the + * comparison text. + * @package SimpleTest + * @subpackage UnitTester + */ +class NoTextExpectation extends TextExpectation { + + /** + * Sets the reject pattern + * @param string $substring Text to search for. + * @param string $message Customised message on failure. + * @access public + */ + function NoTextExpectation($substring, $message = '%s') { + $this->TextExpectation($substring, $message); + } + + /** + * Tests the expectation. False if the substring appears + * in the text. + * @param string $compare Comparison value. + * @return boolean True if correct. + * @access public + */ + function test($compare) { + return ! parent::test($compare); + } + + /** + * Returns a human readable test message. + * @param string $compare Comparison value. + * @return string Description of success + * or failure. + * @access public + */ + function testMessage($compare) { + if ($this->test($compare)) { + $dumper = &$this->_getDumper(); + return "Text [" . $this->_getSubstring() . + "] not detected in [" . + $dumper->describeValue($compare) . "]"; + } else { + return $this->_describeTextMatch($this->_getSubstring(), $compare); + } + } +} + +/** + * Test case for testing of web pages. Allows + * fetching of pages, parsing of HTML and + * submitting forms. + * @package SimpleTest + * @subpackage WebTester + */ +class WebTestCase extends SimpleTestCase { + var $_browser; + var $_ignore_errors = false; + + /** + * Creates an empty test case. Should be subclassed + * with test methods for a functional test case. + * @param string $label Name of test case. Will use + * the class name if none specified. + * @access public + */ + function WebTestCase($label = false) { + $this->SimpleTestCase($label); + } + + /** + * Announces the start of the test. + * @param string $method Test method just started. + * @access public + */ + function before($method) { + parent::before($method); + $this->setBrowser($this->createBrowser()); + } + + /** + * Announces the end of the test. Includes private clean up. + * @param string $method Test method just finished. + * @access public + */ + function after($method) { + $this->unsetBrowser(); + parent::after($method); + } + + /** + * Gets a current browser reference for setting + * special expectations or for detailed + * examination of page fetches. + * @return SimpleBrowser Current test browser object. + * @access public + */ + function &getBrowser() { + return $this->_browser; + } + + /** + * Gets a current browser reference for setting + * special expectations or for detailed + * examination of page fetches. + * @param SimpleBrowser $browser New test browser object. + * @access public + */ + function setBrowser(&$browser) { + return $this->_browser = &$browser; + } + + /** + * Clears the current browser reference to help the + * PHP garbage collector. + * @access public + */ + function unsetBrowser() { + unset($this->_browser); + } + + /** + * Creates a new default web browser object. + * Will be cleared at the end of the test method. + * @return TestBrowser New browser. + * @access public + */ + function &createBrowser() { + $browser = &new SimpleBrowser(); + return $browser; + } + + /** + * Gets the last response error. + * @return string Last low level HTTP error. + * @access public + */ + function getTransportError() { + return $this->_browser->getTransportError(); + } + + /** + * Accessor for the currently selected URL. + * @return string Current location or false if + * no page yet fetched. + * @access public + */ + function getUrl() { + return $this->_browser->getUrl(); + } + + /** + * Dumps the current request for debugging. + * @access public + */ + function showRequest() { + $this->dump($this->_browser->getRequest()); + } + + /** + * Dumps the current HTTP headers for debugging. + * @access public + */ + function showHeaders() { + $this->dump($this->_browser->getHeaders()); + } + + /** + * Dumps the current HTML source for debugging. + * @access public + */ + function showSource() { + $this->dump($this->_browser->getContent()); + } + + /** + * Dumps the visible text only for debugging. + * @access public + */ + function showText() { + $this->dump(wordwrap($this->_browser->getContentAsText(), 80)); + } + + /** + * Simulates the closing and reopening of the browser. + * Temporary cookies will be discarded and timed + * cookies will be expired if later than the + * specified time. + * @param string/integer $date Time when session restarted. + * If ommitted then all persistent + * cookies are kept. Time is either + * Cookie format string or timestamp. + * @access public + */ + function restart($date = false) { + if ($date === false) { + $date = time(); + } + $this->_browser->restart($date); + } + + /** + * Moves cookie expiry times back into the past. + * Useful for testing timeouts and expiries. + * @param integer $interval Amount to age in seconds. + * @access public + */ + function ageCookies($interval) { + $this->_browser->ageCookies($interval); + } + + /** + * Disables frames support. Frames will not be fetched + * and the frameset page will be used instead. + * @access public + */ + function ignoreFrames() { + $this->_browser->ignoreFrames(); + } + + /** + * Switches off cookie sending and recieving. + * @access public + */ + function ignoreCookies() { + $this->_browser->ignoreCookies(); + } + + /** + * Skips errors for the next request only. You might + * want to confirm that a page is unreachable for + * example. + * @access public + */ + function ignoreErrors() { + $this->_ignore_errors = true; + } + + /** + * Issues a fail if there is a transport error anywhere + * in the current frameset. Only one such error is + * reported. + * @param string/boolean $result HTML or failure. + * @return string/boolean $result Passes through result. + * @access private + */ + function _failOnError($result) { + if (! $this->_ignore_errors) { + if ($error = $this->_browser->getTransportError()) { + $this->fail($error); + } + } + $this->_ignore_errors = false; + return $result; + } + + /** + * Adds a header to every fetch. + * @param string $header Header line to add to every + * request until cleared. + * @access public + */ + function addHeader($header) { + $this->_browser->addHeader($header); + } + + /** + * Sets the maximum number of redirects before + * the web page is loaded regardless. + * @param integer $max Maximum hops. + * @access public + */ + function setMaximumRedirects($max) { + if (! $this->_browser) { + trigger_error( + 'Can only set maximum redirects in a test method, setUp() or tearDown()'); + } + $this->_browser->setMaximumRedirects($max); + } + + /** + * Sets the socket timeout for opening a connection and + * receiving at least one byte of information. + * @param integer $timeout Maximum time in seconds. + * @access public + */ + function setConnectionTimeout($timeout) { + $this->_browser->setConnectionTimeout($timeout); + } + + /** + * Sets proxy to use on all requests for when + * testing from behind a firewall. Set URL + * to false to disable. + * @param string $proxy Proxy URL. + * @param string $username Proxy username for authentication. + * @param string $password Proxy password for authentication. + * @access public + */ + function useProxy($proxy, $username = false, $password = false) { + $this->_browser->useProxy($proxy, $username, $password); + } + + /** + * Fetches a page into the page buffer. If + * there is no base for the URL then the + * current base URL is used. After the fetch + * the base URL reflects the new location. + * @param string $url URL to fetch. + * @param hash $parameters Optional additional GET data. + * @return boolean/string Raw page on success. + * @access public + */ + function get($url, $parameters = false) { + return $this->_failOnError($this->_browser->get($url, $parameters)); + } + + /** + * Fetches a page by POST into the page buffer. + * If there is no base for the URL then the + * current base URL is used. After the fetch + * the base URL reflects the new location. + * @param string $url URL to fetch. + * @param hash $parameters Optional additional GET data. + * @return boolean/string Raw page on success. + * @access public + */ + function post($url, $parameters = false) { + return $this->_failOnError($this->_browser->post($url, $parameters)); + } + + /** + * Does a HTTP HEAD fetch, fetching only the page + * headers. The current base URL is unchanged by this. + * @param string $url URL to fetch. + * @param hash $parameters Optional additional GET data. + * @return boolean True on success. + * @access public + */ + function head($url, $parameters = false) { + return $this->_failOnError($this->_browser->head($url, $parameters)); + } + + /** + * Equivalent to hitting the retry button on the + * browser. Will attempt to repeat the page fetch. + * @return boolean True if fetch succeeded. + * @access public + */ + function retry() { + return $this->_failOnError($this->_browser->retry()); + } + + /** + * Equivalent to hitting the back button on the + * browser. + * @return boolean True if history entry and + * fetch succeeded. + * @access public + */ + function back() { + return $this->_failOnError($this->_browser->back()); + } + + /** + * Equivalent to hitting the forward button on the + * browser. + * @return boolean True if history entry and + * fetch succeeded. + * @access public + */ + function forward() { + return $this->_failOnError($this->_browser->forward()); + } + + /** + * Retries a request after setting the authentication + * for the current realm. + * @param string $username Username for realm. + * @param string $password Password for realm. + * @return boolean/string HTML on successful fetch. Note + * that authentication may still have + * failed. + * @access public + */ + function authenticate($username, $password) { + return $this->_failOnError( + $this->_browser->authenticate($username, $password)); + } + + /** + * Gets the cookie value for the current browser context. + * @param string $name Name of cookie. + * @return string Value of cookie or false if unset. + * @access public + */ + function getCookie($name) { + return $this->_browser->getCurrentCookieValue($name); + } + + /** + * Sets a cookie in the current browser. + * @param string $name Name of cookie. + * @param string $value Cookie value. + * @param string $host Host upon which the cookie is valid. + * @param string $path Cookie path if not host wide. + * @param string $expiry Expiry date. + * @access public + */ + function setCookie($name, $value, $host = false, $path = '/', $expiry = false) { + $this->_browser->setCookie($name, $value, $host, $path, $expiry); + } + + /** + * Accessor for current frame focus. Will be + * false if no frame has focus. + * @return integer/string/boolean Label if any, otherwise + * the position in the frameset + * or false if none. + * @access public + */ + function getFrameFocus() { + return $this->_browser->getFrameFocus(); + } + + /** + * Sets the focus by index. The integer index starts from 1. + * @param integer $choice Chosen frame. + * @return boolean True if frame exists. + * @access public + */ + function setFrameFocusByIndex($choice) { + return $this->_browser->setFrameFocusByIndex($choice); + } + + /** + * Sets the focus by name. + * @param string $name Chosen frame. + * @return boolean True if frame exists. + * @access public + */ + function setFrameFocus($name) { + return $this->_browser->setFrameFocus($name); + } + + /** + * Clears the frame focus. All frames will be searched + * for content. + * @access public + */ + function clearFrameFocus() { + return $this->_browser->clearFrameFocus(); + } + + /** + * Clicks a visible text item. Will first try buttons, + * then links and then images. + * @param string $label Visible text or alt text. + * @return string/boolean Raw page or false. + * @access public + */ + function click($label) { + return $this->_failOnError($this->_browser->click($label)); + } + + /** + * Checks for a click target. + * @param string $label Visible text or alt text. + * @return boolean True if click target. + * @access public + */ + function assertClickable($label, $message = '%s') { + return $this->assertTrue( + $this->_browser->isClickable($label), + sprintf($message, "Click target [$label] should exist")); + } + + /** + * Clicks the submit button by label. The owning + * form will be submitted by this. + * @param string $label Button label. An unlabeled + * button can be triggered by 'Submit'. + * @param hash $additional Additional form values. + * @return boolean/string Page on success, else false. + * @access public + */ + function clickSubmit($label = 'Submit', $additional = false) { + return $this->_failOnError( + $this->_browser->clickSubmit($label, $additional)); + } + + /** + * Clicks the submit button by name attribute. The owning + * form will be submitted by this. + * @param string $name Name attribute of button. + * @param hash $additional Additional form values. + * @return boolean/string Page on success. + * @access public + */ + function clickSubmitByName($name, $additional = false) { + return $this->_failOnError( + $this->_browser->clickSubmitByName($name, $additional)); + } + + /** + * Clicks the submit button by ID attribute. The owning + * form will be submitted by this. + * @param string $id ID attribute of button. + * @param hash $additional Additional form values. + * @return boolean/string Page on success. + * @access public + */ + function clickSubmitById($id, $additional = false) { + return $this->_failOnError( + $this->_browser->clickSubmitById($id, $additional)); + } + + /** + * Checks for a valid button label. + * @param string $label Visible text. + * @return boolean True if click target. + * @access public + */ + function assertSubmit($label, $message = '%s') { + return $this->assertTrue( + $this->_browser->isSubmit($label), + sprintf($message, "Submit button [$label] should exist")); + } + + /** + * Clicks the submit image by some kind of label. Usually + * the alt tag or the nearest equivalent. The owning + * form will be submitted by this. Clicking outside of + * the boundary of the coordinates will result in + * a failure. + * @param string $label Alt attribute of button. + * @param integer $x X-coordinate of imaginary click. + * @param integer $y Y-coordinate of imaginary click. + * @param hash $additional Additional form values. + * @return boolean/string Page on success. + * @access public + */ + function clickImage($label, $x = 1, $y = 1, $additional = false) { + return $this->_failOnError( + $this->_browser->clickImage($label, $x, $y, $additional)); + } + + /** + * Clicks the submit image by the name. Usually + * the alt tag or the nearest equivalent. The owning + * form will be submitted by this. Clicking outside of + * the boundary of the coordinates will result in + * a failure. + * @param string $name Name attribute of button. + * @param integer $x X-coordinate of imaginary click. + * @param integer $y Y-coordinate of imaginary click. + * @param hash $additional Additional form values. + * @return boolean/string Page on success. + * @access public + */ + function clickImageByName($name, $x = 1, $y = 1, $additional = false) { + return $this->_failOnError( + $this->_browser->clickImageByName($name, $x, $y, $additional)); + } + + /** + * Clicks the submit image by ID attribute. The owning + * form will be submitted by this. Clicking outside of + * the boundary of the coordinates will result in + * a failure. + * @param integer/string $id ID attribute of button. + * @param integer $x X-coordinate of imaginary click. + * @param integer $y Y-coordinate of imaginary click. + * @param hash $additional Additional form values. + * @return boolean/string Page on success. + * @access public + */ + function clickImageById($id, $x = 1, $y = 1, $additional = false) { + return $this->_failOnError( + $this->_browser->clickImageById($id, $x, $y, $additional)); + } + + /** + * Checks for a valid image with atht alt text or title. + * @param string $label Visible text. + * @return boolean True if click target. + * @access public + */ + function assertImage($label, $message = '%s') { + return $this->assertTrue( + $this->_browser->isImage($label), + sprintf($message, "Image with text [$label] should exist")); + } + + /** + * Submits a form by the ID. + * @param string $id Form ID. No button information + * is submitted this way. + * @return boolean/string Page on success. + * @access public + */ + function submitFormById($id) { + return $this->_failOnError($this->_browser->submitFormById($id)); + } + + /** + * Follows a link by name. Will click the first link + * found with this link text by default, or a later + * one if an index is given. Match is case insensitive + * with normalised space. + * @param string $label Text between the anchor tags. + * @param integer $index Link position counting from zero. + * @return boolean/string Page on success. + * @access public + */ + function clickLink($label, $index = 0) { + return $this->_failOnError($this->_browser->clickLink($label, $index)); + } + + /** + * Follows a link by id attribute. + * @param string $id ID attribute value. + * @return boolean/string Page on success. + * @access public + */ + function clickLinkById($id) { + return $this->_failOnError($this->_browser->clickLinkById($id)); + } + + /** + * Tests for the presence of a link label. Match is + * case insensitive with normalised space. + * @param string $label Text between the anchor tags. + * @param mixed $expected Expected URL or expectation object. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if link present. + * @access public + */ + function assertLink($label, $expected = true, $message = '%s') { + $url = $this->_browser->getLink($label); + if ($expected === true || ($expected !== true && $url === false)) { + return $this->assertTrue($url !== false, sprintf($message, "Link [$label] should exist")); + } + if (! SimpleExpectation::isExpectation($expected)) { + $expected = new IdenticalExpectation($expected); + } + return $this->assert($expected, $url->asString(), sprintf($message, "Link [$label] should match")); + } + + /** + * Tests for the non-presence of a link label. Match is + * case insensitive with normalised space. + * @param string/integer $label Text between the anchor tags + * or ID attribute. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if link missing. + * @access public + */ + function assertNoLink($label, $message = '%s') { + return $this->assertTrue( + $this->_browser->getLink($label) === false, + sprintf($message, "Link [$label] should not exist")); + } + + /** + * Tests for the presence of a link id attribute. + * @param string $id Id attribute value. + * @param mixed $expected Expected URL or expectation object. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if link present. + * @access public + */ + function assertLinkById($id, $expected = true, $message = '%s') { + $url = $this->_browser->getLinkById($id); + if ($expected === true) { + return $this->assertTrue($url !== false, sprintf($message, "Link ID [$id] should exist")); + } + if (! SimpleExpectation::isExpectation($expected)) { + $expected = new IdenticalExpectation($expected); + } + return $this->assert($expected, $url->asString(), sprintf($message, "Link ID [$id] should match")); + } + + /** + * Tests for the non-presence of a link label. Match is + * case insensitive with normalised space. + * @param string $id Id attribute value. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if link missing. + * @access public + */ + function assertNoLinkById($id, $message = '%s') { + return $this->assertTrue( + $this->_browser->getLinkById($id) === false, + sprintf($message, "Link ID [$id] should not exist")); + } + + /** + * Sets all form fields with that label, or name if there + * is no label attached. + * @param string $name Name of field in forms. + * @param string $value New value of field. + * @return boolean True if field exists, otherwise false. + * @access public + */ + function setField($label, $value, $position=false) { + return $this->_browser->setField($label, $value, $position); + } + + /** + * Sets all form fields with that name. + * @param string $name Name of field in forms. + * @param string $value New value of field. + * @return boolean True if field exists, otherwise false. + * @access public + */ + function setFieldByName($name, $value, $position=false) { + return $this->_browser->setFieldByName($name, $value, $position); + } + + /** + * Sets all form fields with that id. + * @param string/integer $id Id of field in forms. + * @param string $value New value of field. + * @return boolean True if field exists, otherwise false. + * @access public + */ + function setFieldById($id, $value) { + return $this->_browser->setFieldById($id, $value); + } + + /** + * Confirms that the form element is currently set + * to the expected value. A missing form will always + * fail. If no value is given then only the existence + * of the field is checked. + * @param string $name Name of field in forms. + * @param mixed $expected Expected string/array value or + * false for unset fields. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if pass. + * @access public + */ + function assertField($label, $expected = true, $message = '%s') { + $value = $this->_browser->getField($label); + return $this->_assertFieldValue($label, $value, $expected, $message); + } + + /** + * Confirms that the form element is currently set + * to the expected value. A missing form element will always + * fail. If no value is given then only the existence + * of the field is checked. + * @param string $name Name of field in forms. + * @param mixed $expected Expected string/array value or + * false for unset fields. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if pass. + * @access public + */ + function assertFieldByName($name, $expected = true, $message = '%s') { + $value = $this->_browser->getFieldByName($name); + return $this->_assertFieldValue($name, $value, $expected, $message); + } + + /** + * Confirms that the form element is currently set + * to the expected value. A missing form will always + * fail. If no ID is given then only the existence + * of the field is checked. + * @param string/integer $id Name of field in forms. + * @param mixed $expected Expected string/array value or + * false for unset fields. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if pass. + * @access public + */ + function assertFieldById($id, $expected = true, $message = '%s') { + $value = $this->_browser->getFieldById($id); + return $this->_assertFieldValue($id, $value, $expected, $message); + } + + /** + * Tests the field value against the expectation. + * @param string $identifier Name, ID or label. + * @param mixed $value Current field value. + * @param mixed $expected Expected value to match. + * @param string $message Failure message. + * @return boolean True if pass + * @access protected + */ + function _assertFieldValue($identifier, $value, $expected, $message) { + if ($expected === true) { + return $this->assertTrue( + isset($value), + sprintf($message, "Field [$identifier] should exist")); + } + if (! SimpleExpectation::isExpectation($expected)) { + $identifier = str_replace('%', '%%', $identifier); + $expected = new FieldExpectation( + $expected, + "Field [$identifier] should match with [%s]"); + } + return $this->assert($expected, $value, $message); + } + + /** + * Checks the response code against a list + * of possible values. + * @param array $responses Possible responses for a pass. + * @param string $message Message to display. Default + * can be embedded with %s. + * @return boolean True if pass. + * @access public + */ + function assertResponse($responses, $message = '%s') { + $responses = (is_array($responses) ? $responses : array($responses)); + $code = $this->_browser->getResponseCode(); + $message = sprintf($message, "Expecting response in [" . + implode(", ", $responses) . "] got [$code]"); + return $this->assertTrue(in_array($code, $responses), $message); + } + + /** + * Checks the mime type against a list + * of possible values. + * @param array $types Possible mime types for a pass. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertMime($types, $message = '%s') { + $types = (is_array($types) ? $types : array($types)); + $type = $this->_browser->getMimeType(); + $message = sprintf($message, "Expecting mime type in [" . + implode(", ", $types) . "] got [$type]"); + return $this->assertTrue(in_array($type, $types), $message); + } + + /** + * Attempt to match the authentication type within + * the security realm we are currently matching. + * @param string $authentication Usually basic. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertAuthentication($authentication = false, $message = '%s') { + if (! $authentication) { + $message = sprintf($message, "Expected any authentication type, got [" . + $this->_browser->getAuthentication() . "]"); + return $this->assertTrue( + $this->_browser->getAuthentication(), + $message); + } else { + $message = sprintf($message, "Expected authentication [$authentication] got [" . + $this->_browser->getAuthentication() . "]"); + return $this->assertTrue( + strtolower($this->_browser->getAuthentication()) == strtolower($authentication), + $message); + } + } + + /** + * Checks that no authentication is necessary to view + * the desired page. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertNoAuthentication($message = '%s') { + $message = sprintf($message, "Expected no authentication type, got [" . + $this->_browser->getAuthentication() . "]"); + return $this->assertFalse($this->_browser->getAuthentication(), $message); + } + + /** + * Attempts to match the current security realm. + * @param string $realm Name of security realm. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertRealm($realm, $message = '%s') { + if (! SimpleExpectation::isExpectation($realm)) { + $realm = new EqualExpectation($realm); + } + return $this->assert( + $realm, + $this->_browser->getRealm(), + "Expected realm -> $message"); + } + + /** + * Checks each header line for the required value. If no + * value is given then only an existence check is made. + * @param string $header Case insensitive header name. + * @param mixed $value Case sensitive trimmed string to + * match against. An expectation object + * can be used for pattern matching. + * @return boolean True if pass. + * @access public + */ + function assertHeader($header, $value = false, $message = '%s') { + return $this->assert( + new HttpHeaderExpectation($header, $value), + $this->_browser->getHeaders(), + $message); + } + + /** + * @deprecated + */ + function assertHeaderPattern($header, $pattern, $message = '%s') { + return $this->assert( + new HttpHeaderExpectation($header, new PatternExpectation($pattern)), + $this->_browser->getHeaders(), + $message); + } + + /** + * Confirms that the header type has not been received. + * Only the landing page is checked. If you want to check + * redirect pages, then you should limit redirects so + * as to capture the page you want. + * @param string $header Case insensitive header name. + * @return boolean True if pass. + * @access public + */ + function assertNoHeader($header, $message = '%s') { + return $this->assert( + new NoHttpHeaderExpectation($header), + $this->_browser->getHeaders(), + $message); + } + + /** + * @deprecated + */ + function assertNoUnwantedHeader($header, $message = '%s') { + return $this->assertNoHeader($header, $message); + } + + /** + * Tests the text between the title tags. + * @param string/SimpleExpectation $title Expected title. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertTitle($title = false, $message = '%s') { + if (! SimpleExpectation::isExpectation($title)) { + $title = new EqualExpectation($title); + } + return $this->assert($title, $this->_browser->getTitle(), $message); + } + + /** + * Will trigger a pass if the text is found in the plain + * text form of the page. + * @param string $text Text to look for. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertText($text, $message = '%s') { + return $this->assert( + new TextExpectation($text), + $this->_browser->getContentAsText(), + $message); + } + + /** + * @deprecated + */ + function assertWantedText($text, $message = '%s') { + return $this->assertText($text, $message); + } + + /** + * Will trigger a pass if the text is not found in the plain + * text form of the page. + * @param string $text Text to look for. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertNoText($text, $message = '%s') { + return $this->assert( + new NoTextExpectation($text), + $this->_browser->getContentAsText(), + $message); + } + + /** + * @deprecated + */ + function assertNoUnwantedText($text, $message = '%s') { + return $this->assertNoText($text, $message); + } + + /** + * Will trigger a pass if the Perl regex pattern + * is found in the raw content. + * @param string $pattern Perl regex to look for including + * the regex delimiters. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertPattern($pattern, $message = '%s') { + return $this->assert( + new PatternExpectation($pattern), + $this->_browser->getContent(), + $message); + } + + /** + * @deprecated + */ + function assertWantedPattern($pattern, $message = '%s') { + return $this->assertPattern($pattern, $message); + } + + /** + * Will trigger a pass if the perl regex pattern + * is not present in raw content. + * @param string $pattern Perl regex to look for including + * the regex delimiters. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertNoPattern($pattern, $message = '%s') { + return $this->assert( + new NoPatternExpectation($pattern), + $this->_browser->getContent(), + $message); + } + + /** + * @deprecated + */ + function assertNoUnwantedPattern($pattern, $message = '%s') { + return $this->assertNoPattern($pattern, $message); + } + + /** + * Checks that a cookie is set for the current page + * and optionally checks the value. + * @param string $name Name of cookie to test. + * @param string $expected Expected value as a string or + * false if any value will do. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertCookie($name, $expected = false, $message = '%s') { + $value = $this->getCookie($name); + if (! $expected) { + return $this->assertTrue( + $value, + sprintf($message, "Expecting cookie [$name]")); + } + if (! SimpleExpectation::isExpectation($expected)) { + $expected = new EqualExpectation($expected); + } + return $this->assert($expected, $value, "Expecting cookie [$name] -> $message"); + } + + /** + * Checks that no cookie is present or that it has + * been successfully cleared. + * @param string $name Name of cookie to test. + * @param string $message Message to display. + * @return boolean True if pass. + * @access public + */ + function assertNoCookie($name, $message = '%s') { + return $this->assertTrue( + $this->getCookie($name) === false, + sprintf($message, "Not expecting cookie [$name]")); + } + + /** + * Called from within the test methods to register + * passes and failures. + * @param boolean $result Pass on true. + * @param string $message Message to display describing + * the test state. + * @return boolean True on pass + * @access public + */ + function assertTrue($result, $message = false) { + return $this->assert(new TrueExpectation(), $result, $message); + } + + /** + * Will be true on false and vice versa. False + * is the PHP definition of false, so that null, + * empty strings, zero and an empty array all count + * as false. + * @param boolean $result Pass on false. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertFalse($result, $message = '%s') { + return $this->assert(new FalseExpectation(), $result, $message); + } + + /** + * Will trigger a pass if the two parameters have + * the same value only. Otherwise a fail. This + * is for testing hand extracted text, etc. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertEqual($first, $second, $message = '%s') { + return $this->assert( + new EqualExpectation($first), + $second, + $message); + } + + /** + * Will trigger a pass if the two parameters have + * a different value. Otherwise a fail. This + * is for testing hand extracted text, etc. + * @param mixed $first Value to compare. + * @param mixed $second Value to compare. + * @param string $message Message to display. + * @return boolean True on pass + * @access public + */ + function assertNotEqual($first, $second, $message = '%s') { + return $this->assert( + new NotEqualExpectation($first), + $second, + $message); + } + + /** + * Uses a stack trace to find the line of an assertion. + * @return string Line number of first assert* + * method embedded in format string. + * @access public + */ + function getAssertionLine() { + $trace = new SimpleStackTrace(array('assert', 'click', 'pass', 'fail')); + return $trace->traceMethod(); + } +} +?> \ No newline at end of file diff --git a/tests/simpletest/xml.php b/tests/simpletest/xml.php new file mode 100644 index 000000000..1666cb930 --- /dev/null +++ b/tests/simpletest/xml.php @@ -0,0 +1,647 @@ +SimpleReporter(); + $this->_namespace = ($namespace ? $namespace . ':' : ''); + $this->_indent = $indent; + } + + /** + * Calculates the pretty printing indent level + * from the current level of nesting. + * @param integer $offset Extra indenting level. + * @return string Leading space. + * @access protected + */ + function _getIndent($offset = 0) { + return str_repeat( + $this->_indent, + count($this->getTestList()) + $offset); + } + + /** + * Converts character string to parsed XML + * entities string. + * @param string text Unparsed character data. + * @return string Parsed character data. + * @access public + */ + function toParsedXml($text) { + return str_replace( + array('&', '<', '>', '"', '\''), + array('&', '<', '>', '"', '''), + $text); + } + + /** + * Paints the start of a group test. + * @param string $test_name Name of test that is starting. + * @param integer $size Number of test cases starting. + * @access public + */ + function paintGroupStart($test_name, $size) { + parent::paintGroupStart($test_name, $size); + print $this->_getIndent(); + print "<" . $this->_namespace . "group size=\"$size\">\n"; + print $this->_getIndent(1); + print "<" . $this->_namespace . "name>" . + $this->toParsedXml($test_name) . + "_namespace . "name>\n"; + } + + /** + * Paints the end of a group test. + * @param string $test_name Name of test that is ending. + * @access public + */ + function paintGroupEnd($test_name) { + print $this->_getIndent(); + print "_namespace . "group>\n"; + parent::paintGroupEnd($test_name); + } + + /** + * Paints the start of a test case. + * @param string $test_name Name of test that is starting. + * @access public + */ + function paintCaseStart($test_name) { + parent::paintCaseStart($test_name); + print $this->_getIndent(); + print "<" . $this->_namespace . "case>\n"; + print $this->_getIndent(1); + print "<" . $this->_namespace . "name>" . + $this->toParsedXml($test_name) . + "_namespace . "name>\n"; + } + + /** + * Paints the end of a test case. + * @param string $test_name Name of test that is ending. + * @access public + */ + function paintCaseEnd($test_name) { + print $this->_getIndent(); + print "_namespace . "case>\n"; + parent::paintCaseEnd($test_name); + } + + /** + * Paints the start of a test method. + * @param string $test_name Name of test that is starting. + * @access public + */ + function paintMethodStart($test_name) { + parent::paintMethodStart($test_name); + print $this->_getIndent(); + print "<" . $this->_namespace . "test>\n"; + print $this->_getIndent(1); + print "<" . $this->_namespace . "name>" . + $this->toParsedXml($test_name) . + "_namespace . "name>\n"; + } + + /** + * Paints the end of a test method. + * @param string $test_name Name of test that is ending. + * @param integer $progress Number of test cases ending. + * @access public + */ + function paintMethodEnd($test_name) { + print $this->_getIndent(); + print "_namespace . "test>\n"; + parent::paintMethodEnd($test_name); + } + + /** + * Paints pass as XML. + * @param string $message Message to encode. + * @access public + */ + function paintPass($message) { + parent::paintPass($message); + print $this->_getIndent(1); + print "<" . $this->_namespace . "pass>"; + print $this->toParsedXml($message); + print "_namespace . "pass>\n"; + } + + /** + * Paints failure as XML. + * @param string $message Message to encode. + * @access public + */ + function paintFail($message) { + parent::paintFail($message); + print $this->_getIndent(1); + print "<" . $this->_namespace . "fail>"; + print $this->toParsedXml($message); + print "_namespace . "fail>\n"; + } + + /** + * Paints error as XML. + * @param string $message Message to encode. + * @access public + */ + function paintError($message) { + parent::paintError($message); + print $this->_getIndent(1); + print "<" . $this->_namespace . "exception>"; + print $this->toParsedXml($message); + print "_namespace . "exception>\n"; + } + + /** + * Paints exception as XML. + * @param Exception $exception Exception to encode. + * @access public + */ + function paintException($exception) { + parent::paintException($exception); + print $this->_getIndent(1); + print "<" . $this->_namespace . "exception>"; + $message = 'Unexpected exception of type [' . get_class($exception) . + '] with message ['. $exception->getMessage() . + '] in ['. $exception->getFile() . + ' line ' . $exception->getLine() . ']'; + print $this->toParsedXml($message); + print "_namespace . "exception>\n"; + } + + /** + * Paints the skipping message and tag. + * @param string $message Text to display in skip tag. + * @access public + */ + function paintSkip($message) { + parent::paintSkip($message); + print $this->_getIndent(1); + print "<" . $this->_namespace . "skip>"; + print $this->toParsedXml($message); + print "_namespace . "skip>\n"; + } + + /** + * Paints a simple supplementary message. + * @param string $message Text to display. + * @access public + */ + function paintMessage($message) { + parent::paintMessage($message); + print $this->_getIndent(1); + print "<" . $this->_namespace . "message>"; + print $this->toParsedXml($message); + print "_namespace . "message>\n"; + } + + /** + * Paints a formatted ASCII message such as a + * variable dump. + * @param string $message Text to display. + * @access public + */ + function paintFormattedMessage($message) { + parent::paintFormattedMessage($message); + print $this->_getIndent(1); + print "<" . $this->_namespace . "formatted>"; + print ""; + print "_namespace . "formatted>\n"; + } + + /** + * Serialises the event object. + * @param string $type Event type as text. + * @param mixed $payload Message or object. + * @access public + */ + function paintSignal($type, $payload) { + parent::paintSignal($type, $payload); + print $this->_getIndent(1); + print "<" . $this->_namespace . "signal type=\"$type\">"; + print ""; + print "_namespace . "signal>\n"; + } + + /** + * Paints the test document header. + * @param string $test_name First test top level + * to start. + * @access public + * @abstract + */ + function paintHeader($test_name) { + if (! SimpleReporter::inCli()) { + header('Content-type: text/xml'); + } + print "_namespace) { + print " xmlns:" . $this->_namespace . + "=\"www.lastcraft.com/SimpleTest/Beta3/Report\""; + } + print "?>\n"; + print "<" . $this->_namespace . "run>\n"; + } + + /** + * Paints the test document footer. + * @param string $test_name The top level test. + * @access public + * @abstract + */ + function paintFooter($test_name) { + print "_namespace . "run>\n"; + } +} + +/** + * Accumulator for incoming tag. Holds the + * incoming test structure information for + * later dispatch to the reporter. + * @package SimpleTest + * @subpackage UnitTester + */ +class NestingXmlTag { + var $_name; + var $_attributes; + + /** + * Sets the basic test information except + * the name. + * @param hash $attributes Name value pairs. + * @access public + */ + function NestingXmlTag($attributes) { + $this->_name = false; + $this->_attributes = $attributes; + } + + /** + * Sets the test case/method name. + * @param string $name Name of test. + * @access public + */ + function setName($name) { + $this->_name = $name; + } + + /** + * Accessor for name. + * @return string Name of test. + * @access public + */ + function getName() { + return $this->_name; + } + + /** + * Accessor for attributes. + * @return hash All attributes. + * @access protected + */ + function _getAttributes() { + return $this->_attributes; + } +} + +/** + * Accumulator for incoming method tag. Holds the + * incoming test structure information for + * later dispatch to the reporter. + * @package SimpleTest + * @subpackage UnitTester + */ +class NestingMethodTag extends NestingXmlTag { + + /** + * Sets the basic test information except + * the name. + * @param hash $attributes Name value pairs. + * @access public + */ + function NestingMethodTag($attributes) { + $this->NestingXmlTag($attributes); + } + + /** + * Signals the appropriate start event on the + * listener. + * @param SimpleReporter $listener Target for events. + * @access public + */ + function paintStart(&$listener) { + $listener->paintMethodStart($this->getName()); + } + + /** + * Signals the appropriate end event on the + * listener. + * @param SimpleReporter $listener Target for events. + * @access public + */ + function paintEnd(&$listener) { + $listener->paintMethodEnd($this->getName()); + } +} + +/** + * Accumulator for incoming case tag. Holds the + * incoming test structure information for + * later dispatch to the reporter. + * @package SimpleTest + * @subpackage UnitTester + */ +class NestingCaseTag extends NestingXmlTag { + + /** + * Sets the basic test information except + * the name. + * @param hash $attributes Name value pairs. + * @access public + */ + function NestingCaseTag($attributes) { + $this->NestingXmlTag($attributes); + } + + /** + * Signals the appropriate start event on the + * listener. + * @param SimpleReporter $listener Target for events. + * @access public + */ + function paintStart(&$listener) { + $listener->paintCaseStart($this->getName()); + } + + /** + * Signals the appropriate end event on the + * listener. + * @param SimpleReporter $listener Target for events. + * @access public + */ + function paintEnd(&$listener) { + $listener->paintCaseEnd($this->getName()); + } +} + +/** + * Accumulator for incoming group tag. Holds the + * incoming test structure information for + * later dispatch to the reporter. + * @package SimpleTest + * @subpackage UnitTester + */ +class NestingGroupTag extends NestingXmlTag { + + /** + * Sets the basic test information except + * the name. + * @param hash $attributes Name value pairs. + * @access public + */ + function NestingGroupTag($attributes) { + $this->NestingXmlTag($attributes); + } + + /** + * Signals the appropriate start event on the + * listener. + * @param SimpleReporter $listener Target for events. + * @access public + */ + function paintStart(&$listener) { + $listener->paintGroupStart($this->getName(), $this->getSize()); + } + + /** + * Signals the appropriate end event on the + * listener. + * @param SimpleReporter $listener Target for events. + * @access public + */ + function paintEnd(&$listener) { + $listener->paintGroupEnd($this->getName()); + } + + /** + * The size in the attributes. + * @return integer Value of size attribute or zero. + * @access public + */ + function getSize() { + $attributes = $this->_getAttributes(); + if (isset($attributes['SIZE'])) { + return (integer)$attributes['SIZE']; + } + return 0; + } +} + +/** + * Parser for importing the output of the XmlReporter. + * Dispatches that output to another reporter. + * @package SimpleTest + * @subpackage UnitTester + */ +class SimpleTestXmlParser { + var $_listener; + var $_expat; + var $_tag_stack; + var $_in_content_tag; + var $_content; + var $_attributes; + + /** + * Loads a listener with the SimpleReporter + * interface. + * @param SimpleReporter $listener Listener of tag events. + * @access public + */ + function SimpleTestXmlParser(&$listener) { + $this->_listener = &$listener; + $this->_expat = &$this->_createParser(); + $this->_tag_stack = array(); + $this->_in_content_tag = false; + $this->_content = ''; + $this->_attributes = array(); + } + + /** + * Parses a block of XML sending the results to + * the listener. + * @param string $chunk Block of text to read. + * @return boolean True if valid XML. + * @access public + */ + function parse($chunk) { + if (! xml_parse($this->_expat, $chunk)) { + trigger_error('XML parse error with ' . + xml_error_string(xml_get_error_code($this->_expat))); + return false; + } + return true; + } + + /** + * Sets up expat as the XML parser. + * @return resource Expat handle. + * @access protected + */ + function &_createParser() { + $expat = xml_parser_create(); + xml_set_object($expat, $this); + xml_set_element_handler($expat, '_startElement', '_endElement'); + xml_set_character_data_handler($expat, '_addContent'); + xml_set_default_handler($expat, '_default'); + return $expat; + } + + /** + * Opens a new test nesting level. + * @return NestedXmlTag The group, case or method tag + * to start. + * @access private + */ + function _pushNestingTag($nested) { + array_unshift($this->_tag_stack, $nested); + } + + /** + * Accessor for current test structure tag. + * @return NestedXmlTag The group, case or method tag + * being parsed. + * @access private + */ + function &_getCurrentNestingTag() { + return $this->_tag_stack[0]; + } + + /** + * Ends a nesting tag. + * @return NestedXmlTag The group, case or method tag + * just finished. + * @access private + */ + function _popNestingTag() { + return array_shift($this->_tag_stack); + } + + /** + * Test if tag is a leaf node with only text content. + * @param string $tag XML tag name. + * @return @boolean True if leaf, false if nesting. + * @private + */ + function _isLeaf($tag) { + return in_array($tag, array( + 'NAME', 'PASS', 'FAIL', 'EXCEPTION', 'SKIP', 'MESSAGE', 'FORMATTED', 'SIGNAL')); + } + + /** + * Handler for start of event element. + * @param resource $expat Parser handle. + * @param string $tag Element name. + * @param hash $attributes Name value pairs. + * Attributes without content + * are marked as true. + * @access protected + */ + function _startElement($expat, $tag, $attributes) { + $this->_attributes = $attributes; + if ($tag == 'GROUP') { + $this->_pushNestingTag(new NestingGroupTag($attributes)); + } elseif ($tag == 'CASE') { + $this->_pushNestingTag(new NestingCaseTag($attributes)); + } elseif ($tag == 'TEST') { + $this->_pushNestingTag(new NestingMethodTag($attributes)); + } elseif ($this->_isLeaf($tag)) { + $this->_in_content_tag = true; + $this->_content = ''; + } + } + + /** + * End of element event. + * @param resource $expat Parser handle. + * @param string $tag Element name. + * @access protected + */ + function _endElement($expat, $tag) { + $this->_in_content_tag = false; + if (in_array($tag, array('GROUP', 'CASE', 'TEST'))) { + $nesting_tag = $this->_popNestingTag(); + $nesting_tag->paintEnd($this->_listener); + } elseif ($tag == 'NAME') { + $nesting_tag = &$this->_getCurrentNestingTag(); + $nesting_tag->setName($this->_content); + $nesting_tag->paintStart($this->_listener); + } elseif ($tag == 'PASS') { + $this->_listener->paintPass($this->_content); + } elseif ($tag == 'FAIL') { + $this->_listener->paintFail($this->_content); + } elseif ($tag == 'EXCEPTION') { + $this->_listener->paintError($this->_content); + } elseif ($tag == 'SKIP') { + $this->_listener->paintSkip($this->_content); + } elseif ($tag == 'SIGNAL') { + $this->_listener->paintSignal( + $this->_attributes['TYPE'], + unserialize($this->_content)); + } elseif ($tag == 'MESSAGE') { + $this->_listener->paintMessage($this->_content); + } elseif ($tag == 'FORMATTED') { + $this->_listener->paintFormattedMessage($this->_content); + } + } + + /** + * Content between start and end elements. + * @param resource $expat Parser handle. + * @param string $text Usually output messages. + * @access protected + */ + function _addContent($expat, $text) { + if ($this->_in_content_tag) { + $this->_content .= $text; + } + return true; + } + + /** + * XML and Doctype handler. Discards all such content. + * @param resource $expat Parser handle. + * @param string $default Text of default content. + * @access protected + */ + function _default($expat, $default) { + } +} +?> From 8391c29fd0ff7a03cd23b1038c001e49c33a4173 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 31 Mar 2009 05:03:05 +0000 Subject: [PATCH 137/202] =?UTF-8?q?content=20widget=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80+=EC=A0=9C=EB=AA=A9=20=ED=83=80=EC=9E=85=20=EC=84=AC?= =?UTF-8?q?=EB=84=A4=EC=9D=BC=20=EB=AF=B8=ED=91=9C=EA=B8=B0=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20/=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9=20=EB=A7=81=ED=81=AC=20=EB=B2=84=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6002 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/content.class.php | 3 +-- widgets/content/skins/default/normal.html | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/widgets/content/content.class.php b/widgets/content/content.class.php index e9be12a52..3d3ac95e4 100644 --- a/widgets/content/content.class.php +++ b/widgets/content/content.class.php @@ -259,8 +259,7 @@ $content_item->setThumbnail($thumbnail); $content_item->setExtraImages($oDocument->printExtraImages($args->duration_new)); $content_item->add('mid', $args->mid_lists[$module_srl]); - if($first_thumbnail_idx==-1 && $thumbnail) $first_thumbnail_idx = $key; - + if($first_thumbnail_idx==-1 && $thumbnail) $first_thumbnail_idx = $i; $content_items[] = $content_item; } diff --git a/widgets/content/skins/default/normal.html b/widgets/content/skins/default/normal.html index ae73bb470..69516d377 100644 --- a/widgets/content/skins/default/normal.html +++ b/widgets/content/skins/default/normal.html @@ -8,7 +8,8 @@ - {$item->getBrowserTitle()} + + {$item->getBrowserTitle()} {$item->getCategory()} From 759d04c772977df4da5e8f483b91e06d41683b4b Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 31 Mar 2009 08:56:43 +0000 Subject: [PATCH 138/202] =?UTF-8?q?category=20widget=EC=97=90=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20text=20=EC=9E=85=EB=A0=A5=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6003 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/category/category.class.php | 1 + widgets/category/conf/info.xml | 5 +++++ widgets/category/skins/default/category.html | 3 +-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/widgets/category/category.class.php b/widgets/category/category.class.php index 748f12d1e..5b8612611 100644 --- a/widgets/category/category.class.php +++ b/widgets/category/category.class.php @@ -44,6 +44,7 @@ $widget_info->mid = $module_info->mid; $widget_info->document_category = $document_category; $widget_info->category_list = $category_list; + $widget_info->total_title = $args->total_title; if($module_info->site_srl) { $site_module_info = Context::get('site_module_info'); diff --git a/widgets/category/conf/info.xml b/widgets/category/conf/info.xml index 506ee6afb..6a64678a9 100644 --- a/widgets/category/conf/info.xml +++ b/widgets/category/conf/info.xml @@ -45,5 +45,10 @@ 将把所选模块当中的主题作为对象。只能选一个模块。 將所選擇的模組作為目標。只能選擇一個模組。 + + text + category 전체 타이틀 + category total text title + diff --git a/widgets/category/skins/default/category.html b/widgets/category/skins/default/category.html index 07697f524..5358c05a7 100644 --- a/widgets/category/skins/default/category.html +++ b/widgets/category/skins/default/category.html @@ -4,10 +4,9 @@ -
      black">
      - {$widget_info->module_info->browser_title} ({$widget_info->total_document_count}) + {$widget_info->total_title}{$widget_info->module_info->browser_title} ({$widget_info->total_document_count})
        From 870344d454f2e4d8d79ce29c81b1dd5f2a31fd17 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 31 Mar 2009 08:58:46 +0000 Subject: [PATCH 139/202] #17865150 : function getGroupImageMark return null if group image is disabled in configuration git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6004 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.view.php | 1 + modules/member/member.model.php | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 7a25b3a4a..c43ef5b35 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -77,6 +77,7 @@ if(!$config->profile_image_max_height) $config->profile_image_max_height = 80; if(!$config->skin) $config->skin = "default"; if(!$config->editor_skin) $config->editor_skin = "default"; + if(!$config->group_image_mark) $config->group_image_mark = "N"; Context::set('config',$config); // 회원 관리 모듈의 스킨 목록을 구함 diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 3b2a050f4..ecec36bfb 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -572,22 +572,27 @@ * @brief group의 이미지마크 정보를 구함 **/ function getGroupImageMark($member_srl,$site_srl=0) { - $member_group = $this->getMemberGroups($member_srl,$site_srl); + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->group_image_mark!='Y'){ + return null; + } + $member_group = $this->getMemberGroups($member_srl,$site_srl); - $groups_info = $this->getGroups($site_srl); - $image_mark = null; - if(count($member_group) > 0 && is_array($member_group)){ - $group_srl = array_keys($member_group); - $image_mark = $groups_info[$group_srl[0]]->image_mark; - } - if($image_mark){ + $groups_info = $this->getGroups($site_srl); + $image_mark = null; + if(count($member_group) > 0 && is_array($member_group)){ + $group_srl = array_keys($member_group); + $image_mark = $groups_info[$group_srl[0]]->image_mark; + } + if($image_mark){ list($width, $height, $type, $attrs) = getimagesize($image_mark); $info->width = $width; $info->height = $height; $info->src = $image_mark; return $info; - }else return false; + }else return false; } /** From 5c21d8b99791300095704f8ec3e500ac30dfc557 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 31 Mar 2009 09:00:18 +0000 Subject: [PATCH 140/202] fix html tag content widget git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6005 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/content/skins/default/image_title.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/content/skins/default/image_title.html b/widgets/content/skins/default/image_title.html index 76146ec14..81ad01da9 100644 --- a/widgets/content/skins/default/image_title.html +++ b/widgets/content/skins/default/image_title.html @@ -36,9 +36,9 @@ - {$item->printExtraImages()} + {$item->printExtraImages()} - + {$item->getNickName()} From 85a0a101d5d749f1439d4f6d5079c17aab7af7f2 Mon Sep 17 00:00:00 2001 From: haneul Date: Tue, 31 Mar 2009 09:33:27 +0000 Subject: [PATCH 141/202] #17896904 : change lock into db lock git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6006 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../tccommentnotify.controller.php | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/modules/tccommentnotify/tccommentnotify.controller.php b/modules/tccommentnotify/tccommentnotify.controller.php index d8c32a7a7..b3d7160fb 100644 --- a/modules/tccommentnotify/tccommentnotify.controller.php +++ b/modules/tccommentnotify/tccommentnotify.controller.php @@ -58,28 +58,10 @@ function procDoNotify() { - $lockFilePath = $this->cachedir.$this->lockfile; - if(file_exists($lockFilePath)) - { - return; - } - - $fp = null; - if(version_compare(PHP_VERSION, "4.3.2", '<')) - { - $fp = fopen($lockFilePath, "a"); - } - else - { - $fp = fopen($lockFilePath, "x"); - if(!$fp) - { - return; - } - } - - fwrite($fp, "lock"); - fclose($fp); + $oController = &getController('module'); + $output = $oController->lock('commentnotify', 400); + if(!$output->toBool()) return; + $deadline = $output->get('deadline'); if( file_exists($this->cachedir.$this->cachefile) ) { @@ -101,7 +83,7 @@ $this->sendCommentNotify($data->comment_srl); } } - FileHandler::removeFile($lockFilePath); + $oController->unlock('commentnotify', $deadline); } function deleteFromQueue($comment_srl) From d9b2fcfb05a97f996fe91349130b23c9e1e75ff9 Mon Sep 17 00:00:00 2001 From: royallin Date: Tue, 31 Mar 2009 14:46:56 +0000 Subject: [PATCH 142/202] Modified traditional Chinese git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6007 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/lang/zh-TW.lang.php | 3 ++- modules/document/lang/zh-TW.lang.php | 29 ++++++++++++++++++++++-- modules/issuetracker/lang/zh-TW.lang.php | 4 ++-- modules/menu/lang/zh-TW.lang.php | 2 +- modules/planet/lang/zh-TW.lang.php | 2 +- modules/wiki/lang/zh-TW.lang.php | 4 ++-- 6 files changed, 35 insertions(+), 9 deletions(-) diff --git a/modules/board/lang/zh-TW.lang.php b/modules/board/lang/zh-TW.lang.php index 5def06ad7..51d23532a 100644 --- a/modules/board/lang/zh-TW.lang.php +++ b/modules/board/lang/zh-TW.lang.php @@ -7,7 +7,7 @@ $lang->board = '討論板'; $lang->except_notice = '公告選項'; - $lang->use_anonymous = '익명 사용'; + $lang->use_anonymous = '匿名功能'; $lang->cmd_manage_menu = '選單管理'; $lang->list_target_item = '目標項目'; $lang->list_display_item = '顯示項目'; @@ -36,5 +36,6 @@ $lang->about_secret = '可用於討論板或回覆時選擇是否使用。'; $lang->about_admin_mail = '有新的主題或評論時,將自動發電子郵件來通知管理員。
        多數電子郵件由逗號(,)區隔。'; $lang->about_list_config = '可以放置想要的項目種類。
        當所使用的面板支援此功能時才可會正常實現。
        對目標項目/顯示項目中的物件案兩下可新增或移除。'; + $lang->msg_not_enough_point = '你的點數不夠在此討論板發表主題。'; ?> diff --git a/modules/document/lang/zh-TW.lang.php b/modules/document/lang/zh-TW.lang.php index 5ecc79dbe..2464c94e5 100644 --- a/modules/document/lang/zh-TW.lang.php +++ b/modules/document/lang/zh-TW.lang.php @@ -43,7 +43,7 @@ $lang->move_target_module = '移到'; - // 管理頁面搜尋的目標 + // 管理者頁面中搜尋的內容 $lang->search_target_list = array( 'title' => '標題', 'content' => '內容', @@ -66,8 +66,33 @@ 'ipaddress' => 'IP位址', ); - $lang->alias = "別名"; + $lang->alias = "Alias"; $lang->history = "歷史紀錄"; $lang->about_use_history = "選擇是否使用歷史記錄功能。選擇使用,將能夠編輯歷史紀錄並還原。"; $lang->trace_only = "追蹤"; + + $lang->cmd_trash = "垃圾桶"; + $lang->cmd_restore = "還原"; + $lang->cmd_restore_all = "全部還原"; + + $lang->in_trash = "垃圾桶"; + $lang->trash_nick_name = "暱稱"; + $lang->trash_date = "刪除日期"; + $lang->trash_description = "原因"; + + // 管理者頁面中垃圾桶的搜尋目標 + $lang->search_target_trash_list = array( + 'title' => '標題', + 'content' => '內容', + 'user_id' => '帳號', + 'member_srl' => '會員編號', + 'user_name' => '姓名', + 'nick_name' => '暱稱', + 'trash_member_srl' => '移除會員編號', + 'trash_user_name' => '移除姓名', + 'trash_nick_name' => '移除暱稱', + 'trash_date' => '刪除日期', + 'trash_ipaddress' => '移除IP位址', + ); + ?> diff --git a/modules/issuetracker/lang/zh-TW.lang.php b/modules/issuetracker/lang/zh-TW.lang.php index 3d05511b6..ec4326034 100644 --- a/modules/issuetracker/lang/zh-TW.lang.php +++ b/modules/issuetracker/lang/zh-TW.lang.php @@ -101,8 +101,8 @@ ); $lang->cmd_manage_issue = '問題管理'; - $lang->msg_changes_from = 'View changes from'; - $lang->duration = 'Duration'; + $lang->msg_changes_from = '開始日期'; + $lang->duration = '期間'; $lang->target_list = array( 'issue_created' => '建立問題', 'issue_changed' => '變更問題', diff --git a/modules/menu/lang/zh-TW.lang.php b/modules/menu/lang/zh-TW.lang.php index 2477aea25..46cdcca3f 100644 --- a/modules/menu/lang/zh-TW.lang.php +++ b/modules/menu/lang/zh-TW.lang.php @@ -45,7 +45,7 @@ $lang->about_menu_open_window = '按選單後,是否要以新視窗開啟。'; $lang->about_menu_expand = '使用樹型選單(tree_menu.js)時,總是呈現展開狀態。'; $lang->about_menu_img_btn = '如果登錄圖片按鈕,在版面中會自動替換顯示為圖片按鈕。'; - $lang->about_menu_group_srls = '如果選擇用戶組,只有所屬組用戶才能看到此選單。(如果可直接連結xml檔案,內容將無法隱藏)'; + $lang->about_menu_group_srls = '如果選擇群組,只有所屬群組才能看到此選單。(如果可直接連結xml檔案,內容將無法隱藏)'; $lang->about_menu = "選單模組可以透過選單管理器,管理已建立的模組並可和版面相互連結,輕鬆架設一個完整的網站。\n選單模組雖然可連結模組和版面,並透過版面來顯示多種類型的選單,但它不具備管理網站的功能。"; diff --git a/modules/planet/lang/zh-TW.lang.php b/modules/planet/lang/zh-TW.lang.php index fd1d0eec3..300dc75c9 100644 --- a/modules/planet/lang/zh-TW.lang.php +++ b/modules/planet/lang/zh-TW.lang.php @@ -172,5 +172,5 @@ $lang->planet_use_me2day = "Me2day"; $lang->about_use_me2day = "發表主題的同時也傳送到Me2day(http://me2day.net)。"; $lang->msg_search_thisplanet = "搜尋微型部落格"; - $lang->msg_welcome_planet = 'Congratulations on the Planet to open.'; + $lang->msg_welcome_planet = '歡迎加入微型部落格^_^'; ?> diff --git a/modules/wiki/lang/zh-TW.lang.php b/modules/wiki/lang/zh-TW.lang.php index e9a72c4f3..0b4a4fd9a 100644 --- a/modules/wiki/lang/zh-TW.lang.php +++ b/modules/wiki/lang/zh-TW.lang.php @@ -10,7 +10,7 @@ $lang->cmd_create = '檔案建立'; $lang->cmd_wiki_list = '列表'; $lang->cmd_view_info = '維基資訊'; - $lang->use_comment = 'Use comment'; - $lang->about_use_comment = 'You may configure to enable comments.'; + $lang->use_comment = '使用評論'; + $lang->about_use_comment = '可設定是否使用評論功能。'; $lang->contributors = 'Contributors'; ?> From d71222e2e7c47b1906ff9ffa8c72a617447497cb Mon Sep 17 00:00:00 2001 From: royallin Date: Wed, 1 Apr 2009 04:09:26 +0000 Subject: [PATCH 143/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6008 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/category/conf/info.xml | 1 + widgets/navigator/conf/info.xml | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/widgets/category/conf/info.xml b/widgets/category/conf/info.xml index 6a64678a9..50aae70fd 100644 --- a/widgets/category/conf/info.xml +++ b/widgets/category/conf/info.xml @@ -49,6 +49,7 @@ text category 전체 타이틀 category total text title + category total text title diff --git a/widgets/navigator/conf/info.xml b/widgets/navigator/conf/info.xml index cf2ba5a5a..04bd03fc3 100644 --- a/widgets/navigator/conf/info.xml +++ b/widgets/navigator/conf/info.xml @@ -6,7 +6,7 @@ メニュー表示機 메뉴 모듈에서 생성된 메뉴를 출력하는 위젯입니다. 此控件可以在任意位置显示菜单模块中的菜单。 - 메뉴 모듈에서 생성된 메뉴를 출력하는 위젯입니다. + 可在任何地方顯示選單。 メニューモジュールで作成したメニューを表示するウィジェットです。 0.1 2009-02-10 @@ -27,7 +27,7 @@ メニュー 선택하신 메뉴를 출력합니다. 선택하지 않으면 호출된 레이아웃의 첫번째 메뉴를 자동으로 지정합니다. 请选择要显示的菜单。 - 선택하신 메뉴를 출력합니다. 선택하지 않으면 호출된 레이아웃의 첫번째 메뉴를 자동으로 지정합니다. + 請選擇要顯示的選單。假如不選擇則自動指定為使用中的版面選單。 選択したメニューを表示します。選択しない場合、適用中のレイアウトの最初のメニューが自動に指定されます。 @@ -37,21 +37,21 @@ 階層數 開始階層 출력될 메뉴의 시작 깊이(depth)를 지정할 수 있습니다. 1이 최상단이고 2부터는 선택된 상위 메뉴가 있으면 출력하게 됩니다 - 请指定要显示的菜单开始深度(1为完整菜单,2开始只显示该处一级菜单下的2级菜单)。 - 출력될 메뉴의 시작 깊이(depth)를 지정할 수 있습니다. 1이 최상단이고 2부터는 선택된 상위 메뉴가 있으면 출력하게 됩니다 + 请指定要显示的菜单开始深度(1为完整菜单,2开始只显示该处一级菜单下的2级菜单)。 + 請設定要顯示的選單階層數。一層是最上層,選擇二層則會顯示子選單。 表示するメニューの開始階層(depth)を設定します。1が最上位階層で、2からは選択した上位メニューがある場合表示します。 1 1 depth 1 depth - 1 depth + 一層 1階層 2 2 depth 2 depth - 2 depth + 二層 2階層 From 587c728bdbd5088f881540ba6a179fd0b6c3c002 Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 1 Apr 2009 07:07:37 +0000 Subject: [PATCH 144/202] =?UTF-8?q?XpressEditor=EC=97=90=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=A0=20=EC=96=B8=EC=96=B4=ED=8C=A9=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6009 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/lang/en.lang.php | 307 ++++++++++++++-------------- modules/editor/lang/es.lang.php | 299 ++++++++++++++------------- modules/editor/lang/fr.lang.php | 307 ++++++++++++++-------------- modules/editor/lang/jp.lang.php | 314 +++++++++++++++-------------- modules/editor/lang/ko.lang.php | 313 ++++++++++++++-------------- modules/editor/lang/ru.lang.php | 299 ++++++++++++++------------- modules/editor/lang/zh-CN.lang.php | 311 ++++++++++++++-------------- modules/editor/lang/zh-TW.lang.php | 313 ++++++++++++++-------------- 8 files changed, 1290 insertions(+), 1173 deletions(-) diff --git a/modules/editor/lang/en.lang.php b/modules/editor/lang/en.lang.php index 194eb1203..c678a8fc9 100644 --- a/modules/editor/lang/en.lang.php +++ b/modules/editor/lang/en.lang.php @@ -1,146 +1,161 @@ - - * @brief WYSIWYG Editor module's basic language pack - **/ - - $lang->editor = 'WYSIWYG Editor'; - $lang->component_name = 'Component'; - $lang->component_version = 'Version'; - $lang->component_author = 'Developer'; - $lang->component_link = 'Link'; - $lang->component_date = 'Date'; - $lang->component_license = 'License'; - $lang->component_history = 'Updates'; - $lang->component_description = 'Description'; - $lang->component_extra_vars = 'Option Variable'; - $lang->component_grant = 'Permission Setting'; - - $lang->about_component = 'About component'; - $lang->about_component_grant = 'Selected group(s) will be able to use expanded components of editor.
        (Leave them blank if you want all groups to have permission)'; - $lang->about_component_mid = 'Editor components can select targets.
        (All targets will be selected when nothing is selected)'; - - $lang->msg_component_is_not_founded = 'Cannot find editor component %s'; - $lang->msg_component_is_inserted = 'Selected component is already inserted'; - $lang->msg_component_is_first_order = 'Selected component is located at the first position'; - $lang->msg_component_is_last_order = 'Selected component is located at the last position'; - $lang->msg_load_saved_doc = "There is an automatically saved article. Do you wish to recover it?\nThe auto-saved draft will be discarded after saving current article"; - $lang->msg_auto_saved = 'Automatically Saved'; - - $lang->cmd_disable = 'Inactive'; - $lang->cmd_enable = 'Active'; - - $lang->editor_skin = 'Editor Skin'; - $lang->upload_file_grant = 'Permission for Uploading'; - $lang->enable_default_component_grant = 'Permission for Default Components'; - $lang->enable_component_grant = 'Permission for Components'; - $lang->enable_html_grant = 'Permission for HTML'; - $lang->enable_autosave = 'Auto-Save'; - $lang->height_resizable = 'Height Resizable'; - $lang->editor_height = 'Height of Editor'; - - $lang->about_editor_skin = 'You may select the skin of editor.'; - $lang->about_upload_file_grant = 'Selected group(s) will be able to upload files. (Leave them blank if you want all groups to have permission)'; - $lang->about_default_component_grant = 'Selected group(s) will be able to use default components of editor. (Leave them blank if you want all groups to have permission)'; - $lang->about_editor_height = 'You may set the height of editor.'; - $lang->about_editor_height_resizable = 'You may decide whether height of editor can be resized.'; - $lang->about_enable_html_grant = 'Selected group(s) will be able to use HTML'; - $lang->about_enable_autosave = 'You may decide whether auto-save function will be used.'; - - $lang->edit->fontname = 'Font'; - $lang->edit->fontsize = 'Size'; - $lang->edit->use_paragraph = 'Paragraph Function'; - $lang->edit->fontlist = array( - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = 'Style'; - $lang->edit->header_list = array( - 'h1' => 'Subject 1', - 'h2' => 'Subject 2', - 'h3' => 'Subject 3', - 'h4' => 'Subject 4', - 'h5' => 'Subject 5', - 'h6' => 'Subject 6', - ); - - $lang->edit->submit = 'Submit'; - - $lang->edit->fontcolor = 'Text Color'; - $lang->edit->fontbgcolor = 'Background Color'; - $lang->edit->bold = 'Bold'; - $lang->edit->italic = 'Italic'; - $lang->edit->underline = 'Underline'; - $lang->edit->strike = 'Strike'; - $lang->edit->sup = 'Sup'; - $lang->edit->sub = 'Sub'; - $lang->edit->redo = 'Re Do'; - $lang->edit->undo = 'Un Do'; - $lang->edit->align_left = 'Align Left'; - $lang->edit->align_center = 'Align Center'; - $lang->edit->align_right = 'Align Right'; - $lang->edit->align_justify = 'Align Justify'; - $lang->edit->add_indent = 'Indent'; - $lang->edit->remove_indent = 'Outdent'; - $lang->edit->list_number = 'Orderd List'; - $lang->edit->list_bullet = 'Unordered List'; - $lang->edit->remove_format = 'Style Remover'; - - $lang->edit->help_remove_format = 'Tags in selected area will be removed'; - $lang->edit->help_strike_through = 'Strike will be on the words'; - $lang->edit->help_align_full = 'Align left and right'; - - $lang->edit->help_fontcolor = 'Select font color'; - $lang->edit->help_fontbgcolor = 'Select background color of font'; - $lang->edit->help_bold = 'Make font bold'; - $lang->edit->help_italic = 'Make italic font'; - $lang->edit->help_underline = 'Underline font'; - $lang->edit->help_strike = 'Strike font'; - $lang->edit->help_sup = 'Superscript'; - $lang->edit->help_sub = 'Subscript'; - $lang->edit->help_redo = 'Redo'; - $lang->edit->help_undo = 'Undo'; - $lang->edit->help_align_left = 'Align left'; - $lang->edit->help_align_center = 'Align center'; - $lang->edit->help_align_right = 'Align right'; - $lang->edit->help_add_indent = 'Add indent'; - $lang->edit->help_remove_indent = 'Remove indent'; - $lang->edit->help_list_number = 'Apply number list'; - $lang->edit->help_list_bullet = 'Apply bullet list'; - $lang->edit->help_use_paragraph = 'Press Ctrl+Enter to use paragraph. (Press Alt+S to submit)'; - - $lang->edit->url = 'URL'; - $lang->edit->blockquote = 'Blockquote'; - $lang->edit->table = 'Table'; - $lang->edit->image = 'Image'; - $lang->edit->multimedia = 'Movie'; - $lang->edit->emoticon = 'Emoticon'; - - $lang->edit->upload = 'Attachment'; - $lang->edit->upload_file = 'Attach'; - $lang->edit->link_file = 'Insert to Content'; - $lang->edit->delete_selected = 'Delete Selected'; - - $lang->edit->icon_align_article = 'Occupy a paragraph'; - $lang->edit->icon_align_left = 'Align Left'; - $lang->edit->icon_align_middle = 'Align Center'; - $lang->edit->icon_align_right = 'Align Right'; - - $lang->about_dblclick_in_editor = 'You may set detail component configures by double-clicking background, text, images, or quotations'; - - - $lang->edit->rich_editor = 'Rich Text Editor'; - $lang->edit->html_editor = 'HTML Editor'; - $lang->edit->extension ='Extension Components'; - $lang->edit->help = 'Help'; - $lang->edit->help_command = 'Help Hotkeys'; -?> + + * @brief WYSIWYG Editor module's basic language pack + **/ + + $lang->editor = 'WYSIWYG Editor'; + $lang->component_name = 'Component'; + $lang->component_version = 'Version'; + $lang->component_author = 'Developer'; + $lang->component_link = 'Link'; + $lang->component_date = 'Date'; + $lang->component_license = 'License'; + $lang->component_history = 'Updates'; + $lang->component_description = 'Description'; + $lang->component_extra_vars = 'Option Variable'; + $lang->component_grant = 'Permission Setting'; + + $lang->about_component = 'About component'; + $lang->about_component_grant = 'Selected group(s) will be able to use expanded components of editor.
        (Leave them blank if you want all groups to have permission)'; + $lang->about_component_mid = 'Editor components can select targets.
        (All targets will be selected when nothing is selected)'; + + $lang->msg_component_is_not_founded = 'Cannot find editor component %s'; + $lang->msg_component_is_inserted = 'Selected component is already inserted'; + $lang->msg_component_is_first_order = 'Selected component is located at the first position'; + $lang->msg_component_is_last_order = 'Selected component is located at the last position'; + $lang->msg_load_saved_doc = "There is an automatically saved article. Do you wish to recover it?\nThe auto-saved draft will be discarded after saving current article"; + $lang->msg_auto_saved = 'Automatically Saved'; + + $lang->cmd_disable = 'Inactive'; + $lang->cmd_enable = 'Active'; + + $lang->editor_skin = 'Editor Skin'; + $lang->upload_file_grant = 'Permission for Uploading'; + $lang->enable_default_component_grant = 'Permission for Default Components'; + $lang->enable_component_grant = 'Permission for Components'; + $lang->enable_html_grant = 'Permission for HTML'; + $lang->enable_autosave = 'Auto-Save'; + $lang->height_resizable = 'Height Resizable'; + $lang->editor_height = 'Height of Editor'; + + $lang->about_editor_skin = 'You may select the skin of editor.'; + $lang->about_upload_file_grant = 'Selected group(s) will be able to upload files. (Leave them blank if you want all groups to have permission)'; + $lang->about_default_component_grant = 'Selected group(s) will be able to use default components of editor. (Leave them blank if you want all groups to have permission)'; + $lang->about_editor_height = 'You may set the height of editor.'; + $lang->about_editor_height_resizable = 'You may decide whether height of editor can be resized.'; + $lang->about_enable_html_grant = 'Selected group(s) will be able to use HTML'; + $lang->about_enable_autosave = 'You may decide whether auto-save function will be used.'; + + $lang->edit->fontname = 'Font'; + $lang->edit->fontsize = 'Size'; + $lang->edit->use_paragraph = 'Paragraph Function'; + $lang->edit->fontlist = array( + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = 'Style'; + $lang->edit->header_list = array( + 'h1' => 'Subject 1', + 'h2' => 'Subject 2', + 'h3' => 'Subject 3', + 'h4' => 'Subject 4', + 'h5' => 'Subject 5', + 'h6' => 'Subject 6', + ); + + $lang->edit->submit = 'Submit'; + + $lang->edit->fontcolor = 'Text Color'; + $lang->edit->fontbgcolor = 'Background Color'; + $lang->edit->bold = 'Bold'; + $lang->edit->italic = 'Italic'; + $lang->edit->underline = 'Underline'; + $lang->edit->strike = 'Strike'; + $lang->edit->sup = 'Sup'; + $lang->edit->sub = 'Sub'; + $lang->edit->redo = 'Re Do'; + $lang->edit->undo = 'Un Do'; + $lang->edit->align_left = 'Align Left'; + $lang->edit->align_center = 'Align Center'; + $lang->edit->align_right = 'Align Right'; + $lang->edit->align_justify = 'Align Justify'; + $lang->edit->add_indent = 'Indent'; + $lang->edit->remove_indent = 'Outdent'; + $lang->edit->list_number = 'Orderd List'; + $lang->edit->list_bullet = 'Unordered List'; + $lang->edit->remove_format = 'Style Remover'; + + $lang->edit->help_remove_format = 'Tags in selected area will be removed'; + $lang->edit->help_strike_through = 'Strike will be on the words'; + $lang->edit->help_align_full = 'Align left and right'; + + $lang->edit->help_fontcolor = 'Select font color'; + $lang->edit->help_fontbgcolor = 'Select background color of font'; + $lang->edit->help_bold = 'Make font bold'; + $lang->edit->help_italic = 'Make italic font'; + $lang->edit->help_underline = 'Underline font'; + $lang->edit->help_strike = 'Strike font'; + $lang->edit->help_sup = 'Superscript'; + $lang->edit->help_sub = 'Subscript'; + $lang->edit->help_redo = 'Redo'; + $lang->edit->help_undo = 'Undo'; + $lang->edit->help_align_left = 'Align left'; + $lang->edit->help_align_center = 'Align center'; + $lang->edit->help_align_right = 'Align right'; + $lang->edit->help_add_indent = 'Add indent'; + $lang->edit->help_remove_indent = 'Remove indent'; + $lang->edit->help_list_number = 'Apply number list'; + $lang->edit->help_list_bullet = 'Apply bullet list'; + $lang->edit->help_use_paragraph = 'Press Ctrl+Enter to use paragraph. (Press Alt+S to submit)'; + + $lang->edit->url = 'URL'; + $lang->edit->blockquote = 'Blockquote'; + $lang->edit->table = 'Table'; + $lang->edit->image = 'Image'; + $lang->edit->multimedia = 'Movie'; + $lang->edit->emoticon = 'Emoticon'; + + $lang->edit->upload = 'Attachment'; + $lang->edit->upload_file = 'Attach'; + $lang->edit->link_file = 'Insert to Content'; + $lang->edit->delete_selected = 'Delete Selected'; + + $lang->edit->icon_align_article = 'Occupy a paragraph'; + $lang->edit->icon_align_left = 'Align Left'; + $lang->edit->icon_align_middle = 'Align Center'; + $lang->edit->icon_align_right = 'Align Right'; + + $lang->about_dblclick_in_editor = 'You may set detail component configures by double-clicking background, text, images, or quotations'; + + + $lang->edit->rich_editor = 'Rich Text Editor'; + $lang->edit->html_editor = 'HTML Editor'; + $lang->edit->extension ='Extension Components'; + $lang->edit->help = 'Help'; + $lang->edit->help_command = 'Help Hotkeys'; + + $lang->edit->lineheight = 'Line Height'; + $lang->edit->fontbgsampletext = 'ABC'; + + $lang->edit->hyperlink = 'Hyperlink'; + $lang->edit->target_blank = 'New Window'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/es.lang.php b/modules/editor/lang/es.lang.php index 2d310ad4f..1dd6eb641 100644 --- a/modules/editor/lang/es.lang.php +++ b/modules/editor/lang/es.lang.php @@ -1,142 +1,157 @@ - - * @sumario Paquete del idioma español para el editor de WYSIWYG - **/ - - $lang->editor = 'Editor WYSIWYG'; - $lang->component_name = 'Componente'; - $lang->component_version = 'Versión'; - $lang->component_author = 'Autor'; - $lang->component_link = 'Enlace'; - $lang->component_date = 'Fecha'; - $lang->component_license = 'License'; - $lang->component_history = 'History'; - $lang->component_description = 'Descripción'; - $lang->component_extra_vars = 'Varibles Extras'; - $lang->component_grant = 'Ajuste de las atribuciones'; - - $lang->about_component = 'Presentación del componente'; - $lang->about_component_grant = 'Usted puede configurar el permiso de utilizar la ampliación de los componentes de editor.
        (Todo el mundo tendría permiso si no comprobado)'; - $lang->about_component_mid = '에디터 컴포넌트가 사용될 대상을 지정할 수 있습니다.
        (모두 해제시 모든 대상에서 사용 가능합니다)'; - - $lang->msg_component_is_not_founded = 'No se puede encontrar el componente del editor %s'; - $lang->msg_component_is_inserted = 'El componente seleccionado ya esta insertado'; - $lang->msg_component_is_first_order = 'El componente seleccionado se localiza en la primera posición'; - $lang->msg_component_is_last_order = 'El componente seleccionado se localiza en la última posición'; - $lang->msg_load_saved_doc = "Existe un documento guardado automáticamente ¿desea recuperarlo ?\nDespués de guardar el documento escrito, el documento autoguardado sera eliminado."; - $lang->msg_auto_saved = 'Documento guardado automáticamente'; - - $lang->cmd_disable = 'Desactivado'; - $lang->cmd_enable = 'activado'; - - $lang->editor_skin = 'Editor de Cuidado de la Piel'; - $lang->upload_file_grant = 'La autorización para cargar'; - $lang->enable_default_component_grant = 'La autorización del uso de los componentes por defecto'; - $lang->enable_component_grant = 'La autorización de la utilización de componentes'; - $lang->enable_html_grant = 'La autorización de uso de HTML'; - $lang->enable_autosave = 'Utilice función de guardado automático,'; - $lang->height_resizable = 'Altura cambiar de tamaño'; - $lang->editor_height = 'Altura de Editor'; - - $lang->about_editor_skin = 'Usted puede seleccionar la piel del editor.'; - $lang->about_upload_file_grant = 'Usted puede configurar el permiso de archivo adjunto. (Todo el mundo tendría permiso si no comprobado)'; - $lang->about_default_component_grant = 'Usted puede configurar el permiso de uso de los componentes de editor por defecto. (Todo el mundo tendría permiso si no comprobado)'; - $lang->about_editor_height = 'Usted puede configurar la altura del editor.'; - $lang->about_editor_height_resizable = 'Permiso para cambiar el tamaño de la altura del editor.'; - $lang->about_enable_html_grant = 'Usted puede dar el permiso de uso de HTML'; - $lang->about_enable_autosave = 'Usted puede permitir que la función de guardado automático, en tanto que función de la redacción de artículos'; - - $lang->edit->fontname = 'Fuente'; - $lang->edit->fontsize = 'Tamaño'; - $lang->edit->use_paragraph = 'Párrafo'; - $lang->edit->fontlist = array( - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = 'Estilo'; - $lang->edit->header_list = array( - 'h1' => 'Título 1', - 'h2' => 'Título 2', - 'h3' => 'Título 3', - 'h4' => 'Título 4', - 'h5' => 'Título 5', - 'h6' => 'Título 6', - ); - - $lang->edit->submit = 'Confirmar'; - - $lang->edit->fontcolor = 'Text Color'; - $lang->edit->fontbgcolor = 'Background Color'; - $lang->edit->bold = 'Bold'; - $lang->edit->italic = 'Italic'; - $lang->edit->underline = 'Underline'; - $lang->edit->strike = 'Strike'; - $lang->edit->sup = 'Sup'; - $lang->edit->sub = 'Sub'; - $lang->edit->redo = 'Re Do'; - $lang->edit->undo = 'Un Do'; - $lang->edit->align_left = 'Align Left'; - $lang->edit->align_center = 'Align Center'; - $lang->edit->align_right = 'Align Right'; - $lang->edit->align_justify = 'Align Justify'; - $lang->edit->add_indent = 'Indent'; - $lang->edit->remove_indent = 'Outdent'; - $lang->edit->list_number = 'Orderd List'; - $lang->edit->list_bullet = 'Unordered List'; - $lang->edit->remove_format = 'Style Remover'; - - $lang->edit->help_fontcolor = 'Selecciona el color de las letras'; - $lang->edit->help_fontbgcolor = 'Selecciona el color del fondo de la letras'; - $lang->edit->help_bold = 'Letra gruesa'; - $lang->edit->help_italic = 'Letra cursiva'; - $lang->edit->help_underline = 'Letra subrayada'; - $lang->edit->help_strike = 'Letra con linea'; - $lang->edit->help_sup = 'Sup'; - $lang->edit->help_sub = 'Sub'; - $lang->edit->help_redo = 'Rehacer'; - $lang->edit->help_undo = 'Deshacer'; - $lang->edit->help_align_left = 'Margen izquierdo'; - $lang->edit->help_align_center = 'Margen central'; - $lang->edit->help_align_right = 'Margen derecho'; - $lang->edit->help_add_indent = 'Anadir tabulación'; - $lang->edit->help_remove_indent = 'Quitar tabulación'; - $lang->edit->help_list_number = 'Aplicar la lista con números'; - $lang->edit->help_list_bullet = 'Aplicar la lista con símbolos'; - $lang->edit->help_use_paragraph = 'Presiona Ctrl+Enter para usar el párrafo (Presiona Alt+S para guardar)'; - - $lang->edit->url = 'URL'; - $lang->edit->blockquote = 'Blockquote'; - $lang->edit->table = 'Table'; - $lang->edit->image = 'Image'; - $lang->edit->multimedia = 'Movie'; - $lang->edit->emoticon = 'Emoticon'; - - $lang->edit->upload = 'Adjuntar'; - $lang->edit->upload_file = 'Archivo adjunto'; - $lang->edit->link_file = 'Insertar en el contenido del documento'; - $lang->edit->delete_selected = 'Eliminar lo seleccionado'; - - $lang->edit->icon_align_article = 'Ocupar un párrafo'; - $lang->edit->icon_align_left = 'Margen izquierdo'; - $lang->edit->icon_align_middle = 'Margen central'; - $lang->edit->icon_align_right = 'Margen derecho'; - - $lang->about_dblclick_in_editor = 'Para la configuracion más detallada debera hacer dobleclick sobre el texto, imagen, fondo, etc.'; - - - $lang->edit->rich_editor = '스타일 편집기'; - $lang->edit->html_editor = 'HTML 편집기'; - $lang->edit->extension ='확장 컴포넌트'; - $lang->edit->help = '도움말'; - $lang->edit->help_command = '단축키 안내'; -?> + + * @sumario Paquete del idioma español para el editor de WYSIWYG + **/ + + $lang->editor = 'Editor WYSIWYG'; + $lang->component_name = 'Componente'; + $lang->component_version = 'Versión'; + $lang->component_author = 'Autor'; + $lang->component_link = 'Enlace'; + $lang->component_date = 'Fecha'; + $lang->component_license = 'License'; + $lang->component_history = 'History'; + $lang->component_description = 'Descripción'; + $lang->component_extra_vars = 'Varibles Extras'; + $lang->component_grant = 'Ajuste de las atribuciones'; + + $lang->about_component = 'Presentación del componente'; + $lang->about_component_grant = 'Usted puede configurar el permiso de utilizar la ampliación de los componentes de editor.
        (Todo el mundo tendría permiso si no comprobado)'; + $lang->about_component_mid = '에디터 컴포넌트가 사용될 대상을 지정할 수 있습니다.
        (모두 해제시 모든 대상에서 사용 가능합니다)'; + + $lang->msg_component_is_not_founded = 'No se puede encontrar el componente del editor %s'; + $lang->msg_component_is_inserted = 'El componente seleccionado ya esta insertado'; + $lang->msg_component_is_first_order = 'El componente seleccionado se localiza en la primera posición'; + $lang->msg_component_is_last_order = 'El componente seleccionado se localiza en la última posición'; + $lang->msg_load_saved_doc = "Existe un documento guardado automáticamente ¿desea recuperarlo ?\nDespués de guardar el documento escrito, el documento autoguardado sera eliminado."; + $lang->msg_auto_saved = 'Documento guardado automáticamente'; + + $lang->cmd_disable = 'Desactivado'; + $lang->cmd_enable = 'activado'; + + $lang->editor_skin = 'Editor de Cuidado de la Piel'; + $lang->upload_file_grant = 'La autorización para cargar'; + $lang->enable_default_component_grant = 'La autorización del uso de los componentes por defecto'; + $lang->enable_component_grant = 'La autorización de la utilización de componentes'; + $lang->enable_html_grant = 'La autorización de uso de HTML'; + $lang->enable_autosave = 'Utilice función de guardado automático,'; + $lang->height_resizable = 'Altura cambiar de tamaño'; + $lang->editor_height = 'Altura de Editor'; + + $lang->about_editor_skin = 'Usted puede seleccionar la piel del editor.'; + $lang->about_upload_file_grant = 'Usted puede configurar el permiso de archivo adjunto. (Todo el mundo tendría permiso si no comprobado)'; + $lang->about_default_component_grant = 'Usted puede configurar el permiso de uso de los componentes de editor por defecto. (Todo el mundo tendría permiso si no comprobado)'; + $lang->about_editor_height = 'Usted puede configurar la altura del editor.'; + $lang->about_editor_height_resizable = 'Permiso para cambiar el tamaño de la altura del editor.'; + $lang->about_enable_html_grant = 'Usted puede dar el permiso de uso de HTML'; + $lang->about_enable_autosave = 'Usted puede permitir que la función de guardado automático, en tanto que función de la redacción de artículos'; + + $lang->edit->fontname = 'Fuente'; + $lang->edit->fontsize = 'Tamaño'; + $lang->edit->use_paragraph = 'Párrafo'; + $lang->edit->fontlist = array( + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = 'Estilo'; + $lang->edit->header_list = array( + 'h1' => 'Título 1', + 'h2' => 'Título 2', + 'h3' => 'Título 3', + 'h4' => 'Título 4', + 'h5' => 'Título 5', + 'h6' => 'Título 6', + ); + + $lang->edit->submit = 'Confirmar'; + + $lang->edit->fontcolor = 'Text Color'; + $lang->edit->fontbgcolor = 'Background Color'; + $lang->edit->bold = 'Bold'; + $lang->edit->italic = 'Italic'; + $lang->edit->underline = 'Underline'; + $lang->edit->strike = 'Strike'; + $lang->edit->sup = 'Sup'; + $lang->edit->sub = 'Sub'; + $lang->edit->redo = 'Re Do'; + $lang->edit->undo = 'Un Do'; + $lang->edit->align_left = 'Align Left'; + $lang->edit->align_center = 'Align Center'; + $lang->edit->align_right = 'Align Right'; + $lang->edit->align_justify = 'Align Justify'; + $lang->edit->add_indent = 'Indent'; + $lang->edit->remove_indent = 'Outdent'; + $lang->edit->list_number = 'Orderd List'; + $lang->edit->list_bullet = 'Unordered List'; + $lang->edit->remove_format = 'Style Remover'; + + $lang->edit->help_fontcolor = 'Selecciona el color de las letras'; + $lang->edit->help_fontbgcolor = 'Selecciona el color del fondo de la letras'; + $lang->edit->help_bold = 'Letra gruesa'; + $lang->edit->help_italic = 'Letra cursiva'; + $lang->edit->help_underline = 'Letra subrayada'; + $lang->edit->help_strike = 'Letra con linea'; + $lang->edit->help_sup = 'Sup'; + $lang->edit->help_sub = 'Sub'; + $lang->edit->help_redo = 'Rehacer'; + $lang->edit->help_undo = 'Deshacer'; + $lang->edit->help_align_left = 'Margen izquierdo'; + $lang->edit->help_align_center = 'Margen central'; + $lang->edit->help_align_right = 'Margen derecho'; + $lang->edit->help_add_indent = 'Anadir tabulación'; + $lang->edit->help_remove_indent = 'Quitar tabulación'; + $lang->edit->help_list_number = 'Aplicar la lista con números'; + $lang->edit->help_list_bullet = 'Aplicar la lista con símbolos'; + $lang->edit->help_use_paragraph = 'Presiona Ctrl+Enter para usar el párrafo (Presiona Alt+S para guardar)'; + + $lang->edit->url = 'URL'; + $lang->edit->blockquote = 'Blockquote'; + $lang->edit->table = 'Table'; + $lang->edit->image = 'Image'; + $lang->edit->multimedia = 'Movie'; + $lang->edit->emoticon = 'Emoticon'; + + $lang->edit->upload = 'Adjuntar'; + $lang->edit->upload_file = 'Archivo adjunto'; + $lang->edit->link_file = 'Insertar en el contenido del documento'; + $lang->edit->delete_selected = 'Eliminar lo seleccionado'; + + $lang->edit->icon_align_article = 'Ocupar un párrafo'; + $lang->edit->icon_align_left = 'Margen izquierdo'; + $lang->edit->icon_align_middle = 'Margen central'; + $lang->edit->icon_align_right = 'Margen derecho'; + + $lang->about_dblclick_in_editor = 'Para la configuracion más detallada debera hacer dobleclick sobre el texto, imagen, fondo, etc.'; + + + $lang->edit->rich_editor = '스타일 편집기'; + $lang->edit->html_editor = 'HTML 편집기'; + $lang->edit->extension ='확장 컴포넌트'; + $lang->edit->help = '도움말'; + $lang->edit->help_command = '단축키 안내'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/fr.lang.php b/modules/editor/lang/fr.lang.php index 94218b65e..586d3c657 100644 --- a/modules/editor/lang/fr.lang.php +++ b/modules/editor/lang/fr.lang.php @@ -1,146 +1,161 @@ - Traduit par Pierre Duvent - * @brief Paquet du langage en français pour le module de Tel-tel Editeur - **/ - - $lang->editor = 'Tel-tel Editeur'; - $lang->component_name = 'Composant'; - $lang->component_version = 'Version'; - $lang->component_author = 'Développeur'; - $lang->component_link = 'Lien'; - $lang->component_date = 'Jour de Création'; - $lang->component_license = 'Licence'; - $lang->component_history = 'Histoire'; - $lang->component_description = 'Description'; - $lang->component_extra_vars = 'Variables d\'Option'; - $lang->component_grant = 'Configuration de la Permission'; - - $lang->about_component = 'Sur le Composant'; - $lang->about_component_grant = 'Vous pouvez configurer la Permission d\'utiliser des composants additionnels de l\'Editeur.
        (Tout le monde aura la Permission si vous ne cochez rien)'; - $lang->about_component_mid = 'Vous pouvez désigner les objectifs auquels les composants s\'appliquent
        (Tous les objectifs auront la Permission quand rien n\'est choisi.)'; - - $lang->msg_component_is_not_founded = 'Ne peut pas trouver Composant %s'; - $lang->msg_component_is_inserted = 'Composant choisi est déjà entré'; - $lang->msg_component_is_first_order = 'Composant choisi est localisé à la première position'; - $lang->msg_component_is_last_order = 'Composant choisi est localisé à la position dernière'; - $lang->msg_load_saved_doc = "Il y a un article conservé automatiquement. Voulez-vous le réstaurer?\nL'esquisse conservé automatiquement va être débarrasser après conserver l'article courant."; - $lang->msg_auto_saved = 'Conservé automatiquement'; - - $lang->cmd_disable = 'Invalider'; - $lang->cmd_enable = 'Valider'; - - $lang->editor_skin = 'Habillage de l\'Editeur'; - $lang->upload_file_grant = 'Permission de télécharger(téléverser) '; - $lang->enable_default_component_grant = 'Permission d\'utiliser les Composants Par Défaut'; - $lang->enable_component_grant = 'Permission d\'utiliser des composants'; - $lang->enable_html_grant = 'Permission d\'utiliser HTML'; - $lang->enable_autosave = 'Valider à conserver automatiquement'; - $lang->height_resizable = 'Permettre de remettre l\'hauteur'; - $lang->editor_height = 'Hauteur de l\'Editeur'; - - $lang->about_editor_skin = 'Vous pouvez choisir l\'habillage de l\'Editeur.'; - $lang->about_upload_file_grant = 'Vous pouvez configurer la permission d\'attacher les fichiers. (Tout le monde aura la permission si vous ne cochez rien)'; - $lang->about_default_component_grant = 'Vous pouvez configurer la permission d\'utiliser les Composants Par Défaut de l\'Editeur. (Tout le monde aura la permission si vous ne cochez rien)'; - $lang->about_editor_height = 'Vous pouvez configurer l\'hauteur de l\'Editeur.'; - $lang->about_editor_height_resizable = 'Permettre de remettre l\'hauteur de l\'Editeur.'; - $lang->about_enable_html_grant = 'Vous pouvez permettre d\'utiliser HTML'; - $lang->about_enable_autosave = 'Vous pouvez valider la fonction à Conserver Automatiquement pendant écrire des articles.'; - - $lang->edit->fontname = 'Police de caractères'; - $lang->edit->fontsize = 'Mesure'; - $lang->edit->use_paragraph = 'Fonctions sur Paragraphe'; - $lang->edit->fontlist = array( - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = 'Style'; - $lang->edit->header_list = array( - 'h1' => 'Titre 1', - 'h2' => 'Titre 2', - 'h3' => 'Titre 3', - 'h4' => 'Titre 4', - 'h5' => 'Titre 5', - 'h6' => 'Titre 6', - ); - - $lang->edit->submit = 'Soumettre'; - - $lang->edit->fontcolor = 'Text Color'; - $lang->edit->fontbgcolor = 'Background Color'; - $lang->edit->bold = 'Bold'; - $lang->edit->italic = 'Italic'; - $lang->edit->underline = 'Underline'; - $lang->edit->strike = 'Strike'; - $lang->edit->sup = 'Sup'; - $lang->edit->sub = 'Sub'; - $lang->edit->redo = 'Re Do'; - $lang->edit->undo = 'Un Do'; - $lang->edit->align_left = 'Align Left'; - $lang->edit->align_center = 'Align Center'; - $lang->edit->align_right = 'Align Right'; - $lang->edit->align_justify = 'Align Justify'; - $lang->edit->add_indent = 'Indent'; - $lang->edit->remove_indent = 'Outdent'; - $lang->edit->list_number = 'Orderd List'; - $lang->edit->list_bullet = 'Unordered List'; - $lang->edit->remove_format = 'Style Remover'; - - $lang->edit->help_remove_format = 'Supprimer les balises dans l\'endroit sélectionné'; - $lang->edit->help_strike_through = 'Représenter la ligne d\'annulation sur les lettres.'; - $lang->edit->help_align_full = 'Aligner pleinement selon largeur'; - - $lang->edit->help_fontcolor = 'Désigner la couleur de la Police de caractères'; - $lang->edit->help_fontbgcolor = 'Désigner la couleur de l\'arrière-plan de la Police de caractères.'; - $lang->edit->help_bold = 'Caractère gras'; - $lang->edit->help_italic = 'Caractère italique'; - $lang->edit->help_underline = 'Caractère souligné'; - $lang->edit->help_strike = 'Caractère biffé'; - $lang->edit->help_sup = 'Sup'; - $lang->edit->help_sub = 'Sub'; - $lang->edit->help_redo = 'Réfaire'; - $lang->edit->help_undo = 'Annuler'; - $lang->edit->help_align_left = 'Aligner à gauche'; - $lang->edit->help_align_center = 'Aligner centr'; - $lang->edit->help_align_right = 'Aligner droite'; - $lang->edit->help_add_indent = 'Ajouter un Rentré'; - $lang->edit->help_remove_indent = 'Enlever un Rentré'; - $lang->edit->help_list_number = 'Appliquer la liste numroté'; - $lang->edit->help_list_bullet = 'Appliquer la liste à puces'; - $lang->edit->help_use_paragraph = 'Appuyez Ctrl+Enter pour séparer les paragraphe. (Appuyez Alt+S pour conserver)'; - - $lang->edit->url = 'URL'; - $lang->edit->blockquote = 'Blockquote'; - $lang->edit->table = 'Table'; - $lang->edit->image = 'Image'; - $lang->edit->multimedia = 'Movie'; - $lang->edit->emoticon = 'Emoticon'; - - $lang->edit->upload = 'Attacher'; - $lang->edit->upload_file = 'Attacher un(des) Fichier(s)'; - $lang->edit->link_file = 'Insérer dans le Texte'; - $lang->edit->delete_selected = 'Supprimer le Sélectionné'; - - $lang->edit->icon_align_article = 'Occuper un paragraphe'; - $lang->edit->icon_align_left = 'Placer à gauche du texte'; - $lang->edit->icon_align_middle = 'Placer au centre'; - $lang->edit->icon_align_right = 'Placer à droite du texte'; - - $lang->about_dblclick_in_editor = 'Vous pouvez configurer en détail des composants par double-clic sur un arrière-plan, un texte, une image ou une citation'; - - - $lang->edit->rich_editor = '스타일 편집기'; - $lang->edit->html_editor = 'HTML 편집기'; - $lang->edit->extension ='확장 컴포넌트'; - $lang->edit->help = '도움말'; - $lang->edit->help_command = '단축키 안내'; -?> + Traduit par Pierre Duvent + * @brief Paquet du langage en français pour le module de Tel-tel Editeur + **/ + + $lang->editor = 'Tel-tel Editeur'; + $lang->component_name = 'Composant'; + $lang->component_version = 'Version'; + $lang->component_author = 'Développeur'; + $lang->component_link = 'Lien'; + $lang->component_date = 'Jour de Création'; + $lang->component_license = 'Licence'; + $lang->component_history = 'Histoire'; + $lang->component_description = 'Description'; + $lang->component_extra_vars = 'Variables d\'Option'; + $lang->component_grant = 'Configuration de la Permission'; + + $lang->about_component = 'Sur le Composant'; + $lang->about_component_grant = 'Vous pouvez configurer la Permission d\'utiliser des composants additionnels de l\'Editeur.
        (Tout le monde aura la Permission si vous ne cochez rien)'; + $lang->about_component_mid = 'Vous pouvez désigner les objectifs auquels les composants s\'appliquent
        (Tous les objectifs auront la Permission quand rien n\'est choisi.)'; + + $lang->msg_component_is_not_founded = 'Ne peut pas trouver Composant %s'; + $lang->msg_component_is_inserted = 'Composant choisi est déjà entré'; + $lang->msg_component_is_first_order = 'Composant choisi est localisé à la première position'; + $lang->msg_component_is_last_order = 'Composant choisi est localisé à la position dernière'; + $lang->msg_load_saved_doc = "Il y a un article conservé automatiquement. Voulez-vous le réstaurer?\nL'esquisse conservé automatiquement va être débarrasser après conserver l'article courant."; + $lang->msg_auto_saved = 'Conservé automatiquement'; + + $lang->cmd_disable = 'Invalider'; + $lang->cmd_enable = 'Valider'; + + $lang->editor_skin = 'Habillage de l\'Editeur'; + $lang->upload_file_grant = 'Permission de télécharger(téléverser) '; + $lang->enable_default_component_grant = 'Permission d\'utiliser les Composants Par Défaut'; + $lang->enable_component_grant = 'Permission d\'utiliser des composants'; + $lang->enable_html_grant = 'Permission d\'utiliser HTML'; + $lang->enable_autosave = 'Valider à conserver automatiquement'; + $lang->height_resizable = 'Permettre de remettre l\'hauteur'; + $lang->editor_height = 'Hauteur de l\'Editeur'; + + $lang->about_editor_skin = 'Vous pouvez choisir l\'habillage de l\'Editeur.'; + $lang->about_upload_file_grant = 'Vous pouvez configurer la permission d\'attacher les fichiers. (Tout le monde aura la permission si vous ne cochez rien)'; + $lang->about_default_component_grant = 'Vous pouvez configurer la permission d\'utiliser les Composants Par Défaut de l\'Editeur. (Tout le monde aura la permission si vous ne cochez rien)'; + $lang->about_editor_height = 'Vous pouvez configurer l\'hauteur de l\'Editeur.'; + $lang->about_editor_height_resizable = 'Permettre de remettre l\'hauteur de l\'Editeur.'; + $lang->about_enable_html_grant = 'Vous pouvez permettre d\'utiliser HTML'; + $lang->about_enable_autosave = 'Vous pouvez valider la fonction à Conserver Automatiquement pendant écrire des articles.'; + + $lang->edit->fontname = 'Police de caractères'; + $lang->edit->fontsize = 'Mesure'; + $lang->edit->use_paragraph = 'Fonctions sur Paragraphe'; + $lang->edit->fontlist = array( + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = 'Style'; + $lang->edit->header_list = array( + 'h1' => 'Titre 1', + 'h2' => 'Titre 2', + 'h3' => 'Titre 3', + 'h4' => 'Titre 4', + 'h5' => 'Titre 5', + 'h6' => 'Titre 6', + ); + + $lang->edit->submit = 'Soumettre'; + + $lang->edit->fontcolor = 'Text Color'; + $lang->edit->fontbgcolor = 'Background Color'; + $lang->edit->bold = 'Bold'; + $lang->edit->italic = 'Italic'; + $lang->edit->underline = 'Underline'; + $lang->edit->strike = 'Strike'; + $lang->edit->sup = 'Sup'; + $lang->edit->sub = 'Sub'; + $lang->edit->redo = 'Re Do'; + $lang->edit->undo = 'Un Do'; + $lang->edit->align_left = 'Align Left'; + $lang->edit->align_center = 'Align Center'; + $lang->edit->align_right = 'Align Right'; + $lang->edit->align_justify = 'Align Justify'; + $lang->edit->add_indent = 'Indent'; + $lang->edit->remove_indent = 'Outdent'; + $lang->edit->list_number = 'Orderd List'; + $lang->edit->list_bullet = 'Unordered List'; + $lang->edit->remove_format = 'Style Remover'; + + $lang->edit->help_remove_format = 'Supprimer les balises dans l\'endroit sélectionné'; + $lang->edit->help_strike_through = 'Représenter la ligne d\'annulation sur les lettres.'; + $lang->edit->help_align_full = 'Aligner pleinement selon largeur'; + + $lang->edit->help_fontcolor = 'Désigner la couleur de la Police de caractères'; + $lang->edit->help_fontbgcolor = 'Désigner la couleur de l\'arrière-plan de la Police de caractères.'; + $lang->edit->help_bold = 'Caractère gras'; + $lang->edit->help_italic = 'Caractère italique'; + $lang->edit->help_underline = 'Caractère souligné'; + $lang->edit->help_strike = 'Caractère biffé'; + $lang->edit->help_sup = 'Sup'; + $lang->edit->help_sub = 'Sub'; + $lang->edit->help_redo = 'Réfaire'; + $lang->edit->help_undo = 'Annuler'; + $lang->edit->help_align_left = 'Aligner à gauche'; + $lang->edit->help_align_center = 'Aligner centr'; + $lang->edit->help_align_right = 'Aligner droite'; + $lang->edit->help_add_indent = 'Ajouter un Rentré'; + $lang->edit->help_remove_indent = 'Enlever un Rentré'; + $lang->edit->help_list_number = 'Appliquer la liste numroté'; + $lang->edit->help_list_bullet = 'Appliquer la liste à puces'; + $lang->edit->help_use_paragraph = 'Appuyez Ctrl+Enter pour séparer les paragraphe. (Appuyez Alt+S pour conserver)'; + + $lang->edit->url = 'URL'; + $lang->edit->blockquote = 'Blockquote'; + $lang->edit->table = 'Table'; + $lang->edit->image = 'Image'; + $lang->edit->multimedia = 'Movie'; + $lang->edit->emoticon = 'Emoticon'; + + $lang->edit->upload = 'Attacher'; + $lang->edit->upload_file = 'Attacher un(des) Fichier(s)'; + $lang->edit->link_file = 'Insérer dans le Texte'; + $lang->edit->delete_selected = 'Supprimer le Sélectionné'; + + $lang->edit->icon_align_article = 'Occuper un paragraphe'; + $lang->edit->icon_align_left = 'Placer à gauche du texte'; + $lang->edit->icon_align_middle = 'Placer au centre'; + $lang->edit->icon_align_right = 'Placer à droite du texte'; + + $lang->about_dblclick_in_editor = 'Vous pouvez configurer en détail des composants par double-clic sur un arrière-plan, un texte, une image ou une citation'; + + + $lang->edit->rich_editor = '스타일 편집기'; + $lang->edit->html_editor = 'HTML 편집기'; + $lang->edit->extension ='확장 컴포넌트'; + $lang->edit->help = '도움말'; + $lang->edit->help_command = '단축키 안내'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php index f1ff4f762..f9e7c1187 100644 --- a/modules/editor/lang/jp.lang.php +++ b/modules/editor/lang/jp.lang.php @@ -1,150 +1,164 @@ - 翻訳:RisaPapa、ミニミ - * @brief ウィジウィグエディター(editor)モジュールの基本言語パッケージ - **/ - - $lang->editor = 'ウイジウイグエディター'; - $lang->component_name = 'コンポーネント'; - $lang->component_version = 'バージョン'; - $lang->component_author = '作者'; - $lang->component_link = 'リンク'; - $lang->component_date = '作成日'; - $lang->component_license = 'ライセンス'; - $lang->component_history = '変更履歴'; - $lang->component_description = '説明'; - $lang->component_extra_vars = '設定変数'; - $lang->component_grant = '権限設定'; - - $lang->about_component = 'コンポーネント情報'; - $lang->about_component_grant = '基本コンポーネント以外の拡張コンポーネント機能が利用可能な権限の設定が出来ます。
        (選択なしの場合、誰でも利用可能)'; - $lang->about_component_mid = 'エディターコンポーネントが使われる対象を指定します。
        (選択なしの場合、全ての対象で利用可能)'; - - $lang->msg_component_is_not_founded = '%s エディターのコンポーネントが見つかりません。'; - $lang->msg_component_is_inserted = '選択されたコンポーネントは既に入力されています。'; - $lang->msg_component_is_first_order = '選択されたコンポーネントは最初に位置しています。'; - $lang->msg_component_is_last_order = '選択されたコンポーネントは最後に位置しています。'; - $lang->msg_load_saved_doc = "自動保存された書き込みがあります。復旧しますか?\n書き終わってから登録すると前の自動保存データは削除されます。"; - $lang->msg_auto_saved = '自動保存されました。'; - - $lang->cmd_disable = '未使用'; - $lang->cmd_enable = '使用'; - - $lang->editor_skin = 'エディタースキン'; - $lang->upload_file_grant = 'ファイル添付権限'; - $lang->enable_default_component_grant = '基本コンポーネント使用権限'; - $lang->enable_component_grant = 'コンポーネント使用権限'; - $lang->enable_html_grant = 'HTML編集権限'; - $lang->enable_autosave = '自動保存使用'; - $lang->height_resizable = '高さの調整'; - $lang->editor_height = 'エディターの高さ'; - - $lang->about_editor_skin = 'エディターのスキンの選択が出来ます。'; - $lang->about_upload_file_grant = 'ファイル添付可能な権限の設定が出来ます。(選択なしの場合、誰でも添付が可能)'; - $lang->about_default_component_grant = 'エディターでの基本コンポーネントを使用可能な権限の設定が出来ます。(選択なしの場合、誰でも利用可能)'; - $lang->about_editor_height = 'エディターの基本高さを設定します。'; - $lang->about_editor_height_resizable = 'エディターの高さを変更出来るようにします。'; - $lang->about_enable_html_grant = 'HTML編集権限を設定します。'; - $lang->about_enable_autosave = '書き込みのとき、自動保存機能をオンにします。'; - - $lang->edit->fontname = 'フォント'; - $lang->edit->fontsize = 'フォントサイズ'; - $lang->edit->use_paragraph = '段落機能'; - $lang->edit->fontlist = array( - 'MS PGothic'=>'MS Pゴシック', - 'MS PMincho'=>'MS P明朝', - 'MS UI Gothic'=>'MS UI Gothic', - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = '見出し'; - $lang->edit->header_list = array( - 'h1' => '見出し1', - 'h2' => '見出し2', - 'h3' => '見出し3', - 'h4' => '見出し4', - 'h5' => '見出し5', - 'h6' => '見出し6', - ); - - $lang->edit->submit = '送信'; - - $lang->edit->fontcolor = 'テキストの色'; - $lang->edit->fontbgcolor = 'ハイライト カラー'; - $lang->edit->bold = '太字'; - $lang->edit->italic = '斜体'; - $lang->edit->underline = '下線'; - $lang->edit->strike = '取り消し線'; - $lang->edit->sup = '上付き文字'; - $lang->edit->sub = '下付き文字'; - $lang->edit->redo = '繰り返し'; - $lang->edit->undo = '元に戻す'; - $lang->edit->align_left = '左揃え'; - $lang->edit->align_center = '中央揃え'; - $lang->edit->align_right = '右揃え'; - $lang->edit->align_justify = '均等割付'; - $lang->edit->add_indent = 'インデント増'; - $lang->edit->remove_indent = 'インデント減'; - $lang->edit->list_number = '番号付リスト'; - $lang->edit->list_bullet = '箇条書き'; - $lang->edit->remove_format = '書式をクリア'; - - $lang->edit->help_remove_format = '選択領域の中のタグを消します。'; - $lang->edit->help_strike_through = 'テキストに取り消し線を表示します。'; - $lang->edit->help_align_full = '左右の余白に合わせて文字列を配置します。'; - - $lang->edit->help_fontcolor = 'テキストの色を指定します。'; - $lang->edit->help_fontbgcolor = 'テキストの背景色を指定します。'; - $lang->edit->help_bold = 'テキストを太字に指定します。'; - $lang->edit->help_italic = 'テキストを斜体にします。'; - $lang->edit->help_underline = 'テキストに下線(アンダーライン)を引きます。'; - $lang->edit->help_strike = '取り消し線を引きます。'; - $lang->edit->help_sup = '上付き文字'; - $lang->edit->help_sub = '下付き文字'; - $lang->edit->help_redo = '繰り返し'; - $lang->edit->help_undo = '元に戻す'; - $lang->edit->help_align_left = 'テキストを左揃えで表示します。'; - $lang->edit->help_align_center = 'テキストを中央揃えで表示します。'; - $lang->edit->help_align_right = 'テキストを右揃えで表示します。'; - $lang->edit->help_add_indent = 'インデントを増やします。'; - $lang->edit->help_remove_indent = 'インデントを減らします。'; - $lang->edit->help_list_number = '番号付リスト'; - $lang->edit->help_list_bullet = '箇条書き'; - $lang->edit->help_use_paragraph = '段落機能を使用する場合は、「Ctrl+Enter」を押します(書き終わった後、「Alt+S」を押すと保存されます)。'; - - $lang->edit->url = 'リンク'; - $lang->edit->blockquote = '引用文'; - $lang->edit->table = '表'; - $lang->edit->image = 'イメージ'; - $lang->edit->multimedia = '動画'; - $lang->edit->emoticon = '絵文字'; - - $lang->edit->upload = '添付'; - $lang->edit->upload_file = 'ファイル添付'; - $lang->edit->link_file = 'テキスト挿入'; - $lang->edit->delete_selected = '選択リスト削除'; - - $lang->edit->icon_align_article = '一段落'; - $lang->edit->icon_align_left = '左揃え'; - $lang->edit->icon_align_middle = '中央揃え'; - $lang->edit->icon_align_right = '右揃え'; - - $lang->about_dblclick_in_editor = '背景、文字、イメージ、引用文の上にカーソルを合わせ、ダブルクリックすると詳細設定出来るコンポーネントを表示します。'; - - - $lang->edit->rich_editor = 'ウイジウイグ編集'; - $lang->edit->html_editor = 'HTMLタグ編集'; - $lang->edit->extension ='拡張コンポーネント'; - $lang->edit->help = 'ヘルプ'; - $lang->edit->help_command = 'ショートカット‐キーの説明'; - -?> + 翻訳:RisaPapa、ミニミ + * @brief ウィジウィグエディター(editor)モジュールの基本言語パッケージ + **/ + + $lang->editor = 'ウイジウイグエディター'; + $lang->component_name = 'コンポーネント'; + $lang->component_version = 'バージョン'; + $lang->component_author = '作者'; + $lang->component_link = 'リンク'; + $lang->component_date = '作成日'; + $lang->component_license = 'ライセンス'; + $lang->component_history = '変更履歴'; + $lang->component_description = '説明'; + $lang->component_extra_vars = '設定変数'; + $lang->component_grant = '権限設定'; + + $lang->about_component = 'コンポーネント情報'; + $lang->about_component_grant = '基本コンポーネント以外の拡張コンポーネント機能が利用可能な権限の設定が出来ます。
        (選択なしの場合、誰でも利用可能)'; + $lang->about_component_mid = 'エディターコンポーネントが使われる対象を指定します。
        (選択なしの場合、全ての対象で利用可能)'; + + $lang->msg_component_is_not_founded = '%s エディターのコンポーネントが見つかりません。'; + $lang->msg_component_is_inserted = '選択されたコンポーネントは既に入力されています。'; + $lang->msg_component_is_first_order = '選択されたコンポーネントは最初に位置しています。'; + $lang->msg_component_is_last_order = '選択されたコンポーネントは最後に位置しています。'; + $lang->msg_load_saved_doc = "自動保存された書き込みがあります。復旧しますか?\n書き終わってから登録すると前の自動保存データは削除されます。"; + $lang->msg_auto_saved = '自動保存されました。'; + + $lang->cmd_disable = '未使用'; + $lang->cmd_enable = '使用'; + + $lang->editor_skin = 'エディタースキン'; + $lang->upload_file_grant = 'ファイル添付権限'; + $lang->enable_default_component_grant = '基本コンポーネント使用権限'; + $lang->enable_component_grant = 'コンポーネント使用権限'; + $lang->enable_html_grant = 'HTML編集権限'; + $lang->enable_autosave = '自動保存使用'; + $lang->height_resizable = '高さの調整'; + $lang->editor_height = 'エディターの高さ'; + + $lang->about_editor_skin = 'エディターのスキンの選択が出来ます。'; + $lang->about_upload_file_grant = 'ファイル添付可能な権限の設定が出来ます。(選択なしの場合、誰でも添付が可能)'; + $lang->about_default_component_grant = 'エディターでの基本コンポーネントを使用可能な権限の設定が出来ます。(選択なしの場合、誰でも利用可能)'; + $lang->about_editor_height = 'エディターの基本高さを設定します。'; + $lang->about_editor_height_resizable = 'エディターの高さを変更出来るようにします。'; + $lang->about_enable_html_grant = 'HTML編集権限を設定します。'; + $lang->about_enable_autosave = '書き込みのとき、自動保存機能をオンにします。'; + + $lang->edit->fontname = 'フォント'; + $lang->edit->fontsize = 'フォントサイズ'; + $lang->edit->use_paragraph = '段落機能'; + $lang->edit->fontlist = array( + 'MS PGothic'=>'MS Pゴシック', + 'MS PMincho'=>'MS P明朝', + 'MS UI Gothic'=>'MS UI Gothic', + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = '見出し'; + $lang->edit->header_list = array( + 'h1' => '見出し1', + 'h2' => '見出し2', + 'h3' => '見出し3', + 'h4' => '見出し4', + 'h5' => '見出し5', + 'h6' => '見出し6', + ); + + $lang->edit->submit = '送信'; + + $lang->edit->fontcolor = 'テキストの色'; + $lang->edit->fontbgcolor = 'ハイライト カラー'; + $lang->edit->bold = '太字'; + $lang->edit->italic = '斜体'; + $lang->edit->underline = '下線'; + $lang->edit->strike = '取り消し線'; + $lang->edit->sup = '上付き文字'; + $lang->edit->sub = '下付き文字'; + $lang->edit->redo = '繰り返し'; + $lang->edit->undo = '元に戻す'; + $lang->edit->align_left = '左揃え'; + $lang->edit->align_center = '中央揃え'; + $lang->edit->align_right = '右揃え'; + $lang->edit->align_justify = '均等割付'; + $lang->edit->add_indent = 'インデント増'; + $lang->edit->remove_indent = 'インデント減'; + $lang->edit->list_number = '番号付リスト'; + $lang->edit->list_bullet = '箇条書き'; + $lang->edit->remove_format = '書式をクリア'; + + $lang->edit->help_remove_format = '選択領域の中のタグを消します。'; + $lang->edit->help_strike_through = 'テキストに取り消し線を表示します。'; + $lang->edit->help_align_full = '左右の余白に合わせて文字列を配置します。'; + + $lang->edit->help_fontcolor = 'テキストの色を指定します。'; + $lang->edit->help_fontbgcolor = 'テキストの背景色を指定します。'; + $lang->edit->help_bold = 'テキストを太字に指定します。'; + $lang->edit->help_italic = 'テキストを斜体にします。'; + $lang->edit->help_underline = 'テキストに下線(アンダーライン)を引きます。'; + $lang->edit->help_strike = '取り消し線を引きます。'; + $lang->edit->help_sup = '上付き文字'; + $lang->edit->help_sub = '下付き文字'; + $lang->edit->help_redo = '繰り返し'; + $lang->edit->help_undo = '元に戻す'; + $lang->edit->help_align_left = 'テキストを左揃えで表示します。'; + $lang->edit->help_align_center = 'テキストを中央揃えで表示します。'; + $lang->edit->help_align_right = 'テキストを右揃えで表示します。'; + $lang->edit->help_add_indent = 'インデントを増やします。'; + $lang->edit->help_remove_indent = 'インデントを減らします。'; + $lang->edit->help_list_number = '番号付リスト'; + $lang->edit->help_list_bullet = '箇条書き'; + $lang->edit->help_use_paragraph = '段落機能を使用する場合は、「Ctrl+Enter」を押します(書き終わった後、「Alt+S」を押すと保存されます)。'; + + $lang->edit->url = 'リンク'; + $lang->edit->blockquote = '引用文'; + $lang->edit->table = '表'; + $lang->edit->image = 'イメージ'; + $lang->edit->multimedia = '動画'; + $lang->edit->emoticon = '絵文字'; + + $lang->edit->upload = '添付'; + $lang->edit->upload_file = 'ファイル添付'; + $lang->edit->link_file = 'テキスト挿入'; + $lang->edit->delete_selected = '選択リスト削除'; + + $lang->edit->icon_align_article = '一段落'; + $lang->edit->icon_align_left = '左揃え'; + $lang->edit->icon_align_middle = '中央揃え'; + $lang->edit->icon_align_right = '右揃え'; + + $lang->about_dblclick_in_editor = '背景、文字、イメージ、引用文の上にカーソルを合わせ、ダブルクリックすると詳細設定出来るコンポーネントを表示します。'; + + + $lang->edit->rich_editor = 'ウイジウイグ編集'; + $lang->edit->html_editor = 'HTMLタグ編集'; + $lang->edit->extension ='拡張コンポーネント'; + $lang->edit->help = 'ヘルプ'; + $lang->edit->help_command = 'ショートカット‐キーの説明'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/ko.lang.php b/modules/editor/lang/ko.lang.php index 20cc36f9c..9fc16284f 100644 --- a/modules/editor/lang/ko.lang.php +++ b/modules/editor/lang/ko.lang.php @@ -1,150 +1,163 @@ - - * @brief 위지윅에디터(editor) 모듈의 기본 언어팩 - **/ - - $lang->editor = '위지윅 에디터'; - $lang->component_name = '컴포넌트'; - $lang->component_version = '버전'; - $lang->component_author = '제작자 '; - $lang->component_link = '링크'; - $lang->component_date = '제작일'; - $lang->component_license = '라이선스'; - $lang->component_history = '변경 이력'; - $lang->component_description = '설명'; - $lang->component_extra_vars = '설정 변수'; - $lang->component_grant = '권한설정'; - - $lang->about_component = '컴포넌트 소개'; - $lang->about_component_grant = '기본 컴포넌트외의 확장 컴포넌트 기능을 사용할 수 있는 권한을 지정할 수 있습니다.
        (모두 해제시 아무나 사용 가능합니다)'; - $lang->about_component_mid = '에디터 컴포넌트가 사용될 대상을 지정할 수 있습니다.
        (모두 해제 시 모든 대상에서 사용 가능합니다)'; - - $lang->msg_component_is_not_founded = '%s 에디터 컴포넌트를 찾을 수 없습니다.'; - $lang->msg_component_is_inserted = '선택하신 컴포넌트는 이미 입력되어 있습니다.'; - $lang->msg_component_is_first_order = '선택하신 컴포넌트는 첫번째에 위치하고 있습니다.'; - $lang->msg_component_is_last_order = '선택하신 컴포넌트는 마지막에 위치하고 있습니다.'; - $lang->msg_load_saved_doc = "자동 저장된 글이 있습니다. 복구하시겠습니까?\n글을 다 쓰신 후 저장하시면 자동 저장본은 사라집니다."; - $lang->msg_auto_saved = '자동 저장되었습니다.'; - - $lang->cmd_disable = '비활성'; - $lang->cmd_enable = '활성'; - - $lang->editor_skin = '에디터 스킨'; - $lang->upload_file_grant = '파일 첨부 권한'; - $lang->enable_default_component_grant = '기본 컴포넌트 사용 권한'; - $lang->enable_component_grant = '컴포넌트 사용 권한'; - $lang->enable_html_grant = 'HTML편집 권한'; - $lang->enable_autosave = '자동저장 사용'; - $lang->height_resizable = '높이 조절 가능'; - $lang->editor_height = '에디터 높이'; - - $lang->about_editor_skin = '에디터 스킨을 선택하실 수 있습니다'; - $lang->about_upload_file_grant = '파일을 첨부할 수 있는 권한을 지정하실 수 있습니다. (모두 해제 시 아무나 첨부 가능합니다)'; - $lang->about_default_component_grant = '에디터에서 사용되는 기본 컴포넌트를 사용할 수 있는 권한을 지정할 수 있습니다. (모두 해제 시 아무나 사용 가능합니다)'; - $lang->about_editor_height = '에디터의 기본 높이를 지정하실 수 있습니다.'; - $lang->about_editor_height_resizable = '에디터의 높이를 직접 변경할 수 있도록 허용합니다.'; - $lang->about_enable_html_grant = 'HTML편집 권한을 부여할 수 있습니다.'; - $lang->about_enable_autosave = '글 작성시 자동 저장 기능을 활성화 시킬 수 있습니다.'; - - $lang->edit->fontname = '글꼴'; - $lang->edit->fontsize = '크기'; - $lang->edit->use_paragraph = '문단기능'; - $lang->edit->fontlist = array( - 'Dotum' => '돋움', - 'Gulim' => '굴림', - 'Batang' => '바탕', - 'Arial' => 'Arial', - 'Arial Black' => 'Arial Black', - 'Tahoma' => 'Tahoma', - 'Verdana' => 'Verdana', - 'Sans-serif' => 'Sans-serif', - 'Serif' => 'Serif', - 'Monospace' => 'Monospace', - 'Cursive' => 'Cursive', - 'Fantasy' => 'Fantasy', - ); - - $lang->edit->header = '형식'; - $lang->edit->header_list = array( - 'h1' => '제목 1', - 'h2' => '제목 2', - 'h3' => '제목 3', - 'h4' => '제목 4', - 'h5' => '제목 5', - 'h6' => '제목 6', - ); - - $lang->edit->submit = '확인'; - - $lang->edit->fontcolor = '글자 색'; - $lang->edit->fontbgcolor = '글자 배경색'; - $lang->edit->bold = '진하게'; - $lang->edit->italic = '기울임'; - $lang->edit->underline = '밑줄'; - $lang->edit->strike = '취소선'; - $lang->edit->sup = '위 첨자'; - $lang->edit->sub = '아래 첨자'; - $lang->edit->redo = '다시 실행'; - $lang->edit->undo = '되돌리기'; - $lang->edit->align_left = '왼쪽 정렬'; - $lang->edit->align_center = '가운데 정렬'; - $lang->edit->align_right = '오른쪽 정렬'; - $lang->edit->align_justify = '양쪽 정렬'; - $lang->edit->add_indent = '들여쓰기'; - $lang->edit->remove_indent = '내어쓰기'; - $lang->edit->list_number = '번호 매기기'; - $lang->edit->list_bullet = '목록'; - $lang->edit->remove_format = '글맵시 지우기'; - - $lang->edit->help_remove_format = '선택된 영역 내의 태그를 지웁니다.'; - $lang->edit->help_strike_through = '글자에 취소선을 표시합니다.'; - $lang->edit->help_align_full = '좌우 폭에 맞게 정렬을 합니다.'; - - $lang->edit->help_fontcolor = '글자의 색상을 지정합니다.'; - $lang->edit->help_fontbgcolor = '글자의 배경색상을 지정합니다.'; - $lang->edit->help_bold = '글자를 진하게 합니다.'; - $lang->edit->help_italic = '글자를 기울이게 합니다.'; - $lang->edit->help_underline = '밑줄을 긋습니다.'; - $lang->edit->help_strike = '취소선을 긋습니다.'; - $lang->edit->help_sup = '위 첨자를 입력합니다.'; - $lang->edit->help_sub = '아래 첨자를 입력합니다.'; - $lang->edit->help_redo = '다음 동작으로 돌아갑니다.'; - $lang->edit->help_undo = '이전 동작으로 돌아갑니다.'; - $lang->edit->help_align_left = '왼쪽 정렬을 합니다.'; - $lang->edit->help_align_center = '가운데 정렬을 합니다.'; - $lang->edit->help_align_right = '오른쪽 정렬을 합니다.'; - $lang->edit->help_add_indent = '단락의 들여쓰기 수준을 높입니다.'; - $lang->edit->help_remove_indent = '단락의 들여쓰기 수준을 낮춥니다.'; - $lang->edit->help_list_number = '숫자로된 목록을 적용합니다.'; - $lang->edit->help_list_bullet = '기호로된 목록을 적용합니다.'; - $lang->edit->help_use_paragraph = '문단 나누기를 하시려면 Ctrl+Enter를 누르시면 됩니다. (글 작성완료 후 Alt+S를 누르면 저장이 됩니다.)'; - - $lang->edit->url = '링크'; - $lang->edit->blockquote = '인용문'; - $lang->edit->table = '표'; - $lang->edit->image = '그림'; - $lang->edit->multimedia = '동영상'; - $lang->edit->emoticon = '이모티콘'; - - $lang->edit->upload = '첨부'; - $lang->edit->upload_file = '파일 첨부'; - $lang->edit->link_file = '본문 삽입'; - $lang->edit->delete_selected = '선택 삭제'; - - $lang->edit->icon_align_article = '한 문단을 차지'; - $lang->edit->icon_align_left = '글의 왼쪽으로'; - $lang->edit->icon_align_middle = '가운데 정렬'; - $lang->edit->icon_align_right = '글의 우측으로'; - - $lang->about_dblclick_in_editor = '배경, 글자, 이미지, 인용문등에서 더블클릭을 하시면 상세한 컴포넌트 설정이 가능합니다.'; - - - $lang->edit->rich_editor = '스타일 편집기'; - $lang->edit->html_editor = 'HTML 편집기'; - $lang->edit->extension ='확장 컴포넌트'; - $lang->edit->help = '도움말'; - $lang->edit->help_command = '단축키 안내'; - -?> + + * @brief 위지윅에디터(editor) 모듈의 기본 언어팩 + **/ + + $lang->editor = '위지윅 에디터'; + $lang->component_name = '컴포넌트'; + $lang->component_version = '버전'; + $lang->component_author = '제작자 '; + $lang->component_link = '링크'; + $lang->component_date = '제작일'; + $lang->component_license = '라이선스'; + $lang->component_history = '변경 이력'; + $lang->component_description = '설명'; + $lang->component_extra_vars = '설정 변수'; + $lang->component_grant = '권한설정'; + + $lang->about_component = '컴포넌트 소개'; + $lang->about_component_grant = '기본 컴포넌트외의 확장 컴포넌트 기능을 사용할 수 있는 권한을 지정할 수 있습니다.
        (모두 해제시 아무나 사용 가능합니다)'; + $lang->about_component_mid = '에디터 컴포넌트가 사용될 대상을 지정할 수 있습니다.
        (모두 해제 시 모든 대상에서 사용 가능합니다)'; + + $lang->msg_component_is_not_founded = '%s 에디터 컴포넌트를 찾을 수 없습니다.'; + $lang->msg_component_is_inserted = '선택하신 컴포넌트는 이미 입력되어 있습니다.'; + $lang->msg_component_is_first_order = '선택하신 컴포넌트는 첫번째에 위치하고 있습니다.'; + $lang->msg_component_is_last_order = '선택하신 컴포넌트는 마지막에 위치하고 있습니다.'; + $lang->msg_load_saved_doc = "자동 저장된 글이 있습니다. 복구하시겠습니까?\n글을 다 쓰신 후 저장하시면 자동 저장본은 사라집니다."; + $lang->msg_auto_saved = '자동 저장되었습니다.'; + + $lang->cmd_disable = '비활성'; + $lang->cmd_enable = '활성'; + + $lang->editor_skin = '에디터 스킨'; + $lang->upload_file_grant = '파일 첨부 권한'; + $lang->enable_default_component_grant = '기본 컴포넌트 사용 권한'; + $lang->enable_component_grant = '컴포넌트 사용 권한'; + $lang->enable_html_grant = 'HTML편집 권한'; + $lang->enable_autosave = '자동저장 사용'; + $lang->height_resizable = '높이 조절 가능'; + $lang->editor_height = '에디터 높이'; + + $lang->about_editor_skin = '에디터 스킨을 선택하실 수 있습니다'; + $lang->about_upload_file_grant = '파일을 첨부할 수 있는 권한을 지정하실 수 있습니다. (모두 해제 시 아무나 첨부 가능합니다)'; + $lang->about_default_component_grant = '에디터에서 사용되는 기본 컴포넌트를 사용할 수 있는 권한을 지정할 수 있습니다. (모두 해제 시 아무나 사용 가능합니다)'; + $lang->about_editor_height = '에디터의 기본 높이를 지정하실 수 있습니다.'; + $lang->about_editor_height_resizable = '에디터의 높이를 직접 변경할 수 있도록 허용합니다.'; + $lang->about_enable_html_grant = 'HTML편집 권한을 부여할 수 있습니다.'; + $lang->about_enable_autosave = '글 작성시 자동 저장 기능을 활성화 시킬 수 있습니다.'; + + $lang->edit->fontname = '글꼴'; + $lang->edit->fontsize = '크기'; + $lang->edit->use_paragraph = '문단기능'; + $lang->edit->fontlist = array( + 'Dotum' => '돋움', + 'Gulim' => '굴림', + 'Batang' => '바탕', + 'Arial' => 'Arial', + 'Arial Black' => 'Arial Black', + 'Tahoma' => 'Tahoma', + 'Verdana' => 'Verdana', + 'Sans-serif' => 'Sans-serif', + 'Serif' => 'Serif', + 'Monospace' => 'Monospace', + 'Cursive' => 'Cursive', + 'Fantasy' => 'Fantasy', + ); + + $lang->edit->header = '형식'; + $lang->edit->header_list = array( + 'h1' => '제목 1', + 'h2' => '제목 2', + 'h3' => '제목 3', + 'h4' => '제목 4', + 'h5' => '제목 5', + 'h6' => '제목 6', + ); + + $lang->edit->submit = '확인'; + + $lang->edit->fontcolor = '글자 색'; + $lang->edit->fontbgcolor = '글자 배경색'; + $lang->edit->bold = '진하게'; + $lang->edit->italic = '기울임'; + $lang->edit->underline = '밑줄'; + $lang->edit->strike = '취소선'; + $lang->edit->sup = '위 첨자'; + $lang->edit->sub = '아래 첨자'; + $lang->edit->redo = '다시 실행'; + $lang->edit->undo = '되돌리기'; + $lang->edit->align_left = '왼쪽 정렬'; + $lang->edit->align_center = '가운데 정렬'; + $lang->edit->align_right = '오른쪽 정렬'; + $lang->edit->align_justify = '양쪽 정렬'; + $lang->edit->add_indent = '들여쓰기'; + $lang->edit->remove_indent = '내어쓰기'; + $lang->edit->list_number = '번호 매기기'; + $lang->edit->list_bullet = '목록'; + $lang->edit->remove_format = '글맵시 지우기'; + + $lang->edit->help_remove_format = '선택된 영역 내의 태그를 지웁니다.'; + $lang->edit->help_strike_through = '글자에 취소선을 표시합니다.'; + $lang->edit->help_align_full = '좌우 폭에 맞게 정렬을 합니다.'; + + $lang->edit->help_fontcolor = '글자의 색상을 지정합니다.'; + $lang->edit->help_fontbgcolor = '글자의 배경색상을 지정합니다.'; + $lang->edit->help_bold = '글자를 진하게 합니다.'; + $lang->edit->help_italic = '글자를 기울이게 합니다.'; + $lang->edit->help_underline = '밑줄을 긋습니다.'; + $lang->edit->help_strike = '취소선을 긋습니다.'; + $lang->edit->help_sup = '위 첨자를 입력합니다.'; + $lang->edit->help_sub = '아래 첨자를 입력합니다.'; + $lang->edit->help_redo = '다음 동작으로 돌아갑니다.'; + $lang->edit->help_undo = '이전 동작으로 돌아갑니다.'; + $lang->edit->help_align_left = '왼쪽 정렬을 합니다.'; + $lang->edit->help_align_center = '가운데 정렬을 합니다.'; + $lang->edit->help_align_right = '오른쪽 정렬을 합니다.'; + $lang->edit->help_add_indent = '단락의 들여쓰기 수준을 높입니다.'; + $lang->edit->help_remove_indent = '단락의 들여쓰기 수준을 낮춥니다.'; + $lang->edit->help_list_number = '숫자로된 목록을 적용합니다.'; + $lang->edit->help_list_bullet = '기호로된 목록을 적용합니다.'; + $lang->edit->help_use_paragraph = '문단 나누기를 하시려면 Ctrl+Enter를 누르시면 됩니다. (글 작성완료 후 Alt+S를 누르면 저장이 됩니다.)'; + + $lang->edit->url = '링크'; + $lang->edit->blockquote = '인용문'; + $lang->edit->table = '표'; + $lang->edit->image = '그림'; + $lang->edit->multimedia = '동영상'; + $lang->edit->emoticon = '이모티콘'; + + $lang->edit->upload = '첨부'; + $lang->edit->upload_file = '파일 첨부'; + $lang->edit->link_file = '본문 삽입'; + $lang->edit->delete_selected = '선택 삭제'; + + $lang->edit->icon_align_article = '한 문단을 차지'; + $lang->edit->icon_align_left = '글의 왼쪽으로'; + $lang->edit->icon_align_middle = '가운데 정렬'; + $lang->edit->icon_align_right = '글의 우측으로'; + + $lang->about_dblclick_in_editor = '배경, 글자, 이미지, 인용문등에서 더블클릭을 하시면 상세한 컴포넌트 설정이 가능합니다.'; + + $lang->edit->rich_editor = '스타일 편집기'; + $lang->edit->html_editor = 'HTML 편집기'; + $lang->edit->extension ='확장 컴포넌트'; + $lang->edit->help = '도움말'; + $lang->edit->help_command = '단축키 안내'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/ru.lang.php b/modules/editor/lang/ru.lang.php index 7a7671421..f1da838cb 100644 --- a/modules/editor/lang/ru.lang.php +++ b/modules/editor/lang/ru.lang.php @@ -1,142 +1,157 @@ - | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467; - * @brief Russian basic language pack - **/ - - $lang->editor = 'WYSIWYG-Редактор'; - $lang->component_name = 'Компонент'; - $lang->component_version = 'Версия'; - $lang->component_author = 'Разработчик'; - $lang->component_link = 'Ссылка'; - $lang->component_date = 'Дата'; - $lang->component_license = 'License'; - $lang->component_history = 'History'; - $lang->component_description = 'Описание'; - $lang->component_extra_vars = 'Экстра перем.'; - $lang->component_grant = 'Настройки прав доступа'; - - $lang->about_component = 'О компоненте'; - $lang->about_component_grant = 'Только выбранным группам позволено использование.
        (Каждый может использовать его, если режим выключен)'; - $lang->about_component_mid = '에디터 컴포넌트가 사용될 대상을 지정할 수 있습니다.
        (모두 해제시 모든 대상에서 사용 가능합니다)'; - - $lang->msg_component_is_not_founded = 'Невозможно найти компонент редактора %s'; - $lang->msg_component_is_inserted = 'Выбранный компонент уже присутствует'; - $lang->msg_component_is_first_order = 'Выбранный компонент находится на первой позиции'; - $lang->msg_component_is_last_order = 'Выбранный компонент находится на последней позиции'; - $lang->msg_load_saved_doc = "Существует автоматически сохраненная статья. Хотите ли Вы ее восстановить?\nАвтоматически сохраненный черновик будет отменен после сохранения текущей статьи"; - $lang->msg_auto_saved = 'Автоматически сохранено'; - - $lang->cmd_disable = 'Неавтивно'; - $lang->cmd_enable = 'Активно'; - - $lang->editor_skin = '에디터 스킨'; - $lang->upload_file_grant = '파일 첨부 권한'; - $lang->enable_default_component_grant = '기본 컴포넌트 사용 권한'; - $lang->enable_component_grant = '컴포넌트 사용 권한'; - $lang->enable_html_grant = 'HTML편집 권한'; - $lang->enable_autosave = '자동저장 사용'; - $lang->height_resizable = '높이 조절 가능'; - $lang->editor_height = '에디터 높이'; - - $lang->about_editor_skin = '에디터 스킨을 선택하실 수 있습니다'; - $lang->about_upload_file_grant = '파일을 첨부할 수 있는 권한을 지정하실 수 있습니다 (모두 해제시 아무나 첨부 가능합니다)'; - $lang->about_default_component_grant = '에디터에서 사용되는 기본 컴포넌트를 사용할 수 있는 권한을 지정할 수 있습니다. (모두 해제시 아무나 사용 가능합니다)'; - $lang->about_editor_height = '에디터의 기본 높이를 지정하실 수 있습니다'; - $lang->about_editor_height_resizable = '에디터의 높이를 직접 변경할 수 있도록 허용합니다'; - $lang->about_enable_html_grant = 'HTML편집 권한을 부여할 수 있습니다.'; - $lang->about_enable_autosave = '글작성시 자동 저장 기능을 활성화 시킬 수 있습니다'; - - $lang->edit->fontname = 'Шрифт'; - $lang->edit->fontsize = 'Размер'; - $lang->edit->use_paragraph = 'Функции параграфа'; - $lang->edit->fontlist = array( - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = 'Стиль'; - $lang->edit->header_list = array( - 'h1' => 'Заголовок 1', - 'h2' => 'Заголовок 2', - 'h3' => 'Заголовок 3', - 'h4' => 'Заголовок 4', - 'h5' => 'Заголовок 5', - 'h6' => 'Заголовок 6', - ); - - $lang->edit->submit = 'Принять'; - - $lang->edit->fontcolor = 'Text Color'; - $lang->edit->fontbgcolor = 'Background Color'; - $lang->edit->bold = 'Bold'; - $lang->edit->italic = 'Italic'; - $lang->edit->underline = 'Underline'; - $lang->edit->strike = 'Strike'; - $lang->edit->sup = 'Sup'; - $lang->edit->sub = 'Sub'; - $lang->edit->redo = 'Re Do'; - $lang->edit->undo = 'Un Do'; - $lang->edit->align_left = 'Align Left'; - $lang->edit->align_center = 'Align Center'; - $lang->edit->align_right = 'Align Right'; - $lang->edit->align_justify = 'Align Justify'; - $lang->edit->add_indent = 'Indent'; - $lang->edit->remove_indent = 'Outdent'; - $lang->edit->list_number = 'Orderd List'; - $lang->edit->list_bullet = 'Unordered List'; - $lang->edit->remove_format = 'Style Remover'; - - $lang->edit->help_fontcolor = 'Выберать цвет шрифта'; - $lang->edit->help_fontbgcolor = 'Выберать цвет фона шрифта'; - $lang->edit->help_bold = 'Сделать шрифт жирным'; - $lang->edit->help_italic = 'Сделать шрифт наклонным'; - $lang->edit->help_underline = 'Сделать шрифт подчеркнутым'; - $lang->edit->help_strike = 'Сделать шрифт зачеркнутым'; - $lang->edit->help_sup = 'Sup'; - $lang->edit->help_sub = 'Sub'; - $lang->edit->help_redo = 'Восстановить отмененное'; - $lang->edit->help_undo = 'Отмена'; - $lang->edit->help_align_left = 'Выровнять по левому краю'; - $lang->edit->help_align_center = 'Выровнять по центру'; - $lang->edit->help_align_right = 'Выровнять по правому краю'; - $lang->edit->help_add_indent = 'Добавить отступ'; - $lang->edit->help_remove_indent = 'Удалить отступ'; - $lang->edit->help_list_number = 'Применить числовой список'; - $lang->edit->help_list_bullet = 'Применить маркированный список'; - $lang->edit->help_use_paragraph = 'Нажмите Ctrl+Enter, чтобы отметить параграф. (Нажмите Alt+S , чтобы сохранить)'; - - $lang->edit->url = 'URL'; - $lang->edit->blockquote = 'Blockquote'; - $lang->edit->table = 'Table'; - $lang->edit->image = 'Image'; - $lang->edit->multimedia = 'Movie'; - $lang->edit->emoticon = 'Emoticon'; - - $lang->edit->upload = 'Вложение'; - $lang->edit->upload_file = 'Вложить'; - $lang->edit->link_file = 'Вставить в содержание'; - $lang->edit->delete_selected = 'Удалить выбранное'; - - $lang->edit->icon_align_article = 'Занять весь параграф'; - $lang->edit->icon_align_left = 'Выровнять по левому краю'; - $lang->edit->icon_align_middle = 'Выровнять по центру'; - $lang->edit->icon_align_right = 'Выровнять по правому краю'; - - $lang->about_dblclick_in_editor = 'Вы можете установить детальную конфигурацию компонента двойным щелчком по фону, тексту, рисункам или цитатам'; - - - $lang->edit->rich_editor = '스타일 편집기'; - $lang->edit->html_editor = 'HTML 편집기'; - $lang->edit->extension ='확장 컴포넌트'; - $lang->edit->help = '도움말'; - $lang->edit->help_command = '단축키 안내'; -?> + | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467; + * @brief Russian basic language pack + **/ + + $lang->editor = 'WYSIWYG-Редактор'; + $lang->component_name = 'Компонент'; + $lang->component_version = 'Версия'; + $lang->component_author = 'Разработчик'; + $lang->component_link = 'Ссылка'; + $lang->component_date = 'Дата'; + $lang->component_license = 'License'; + $lang->component_history = 'History'; + $lang->component_description = 'Описание'; + $lang->component_extra_vars = 'Экстра перем.'; + $lang->component_grant = 'Настройки прав доступа'; + + $lang->about_component = 'О компоненте'; + $lang->about_component_grant = 'Только выбранным группам позволено использование.
        (Каждый может использовать его, если режим выключен)'; + $lang->about_component_mid = '에디터 컴포넌트가 사용될 대상을 지정할 수 있습니다.
        (모두 해제시 모든 대상에서 사용 가능합니다)'; + + $lang->msg_component_is_not_founded = 'Невозможно найти компонент редактора %s'; + $lang->msg_component_is_inserted = 'Выбранный компонент уже присутствует'; + $lang->msg_component_is_first_order = 'Выбранный компонент находится на первой позиции'; + $lang->msg_component_is_last_order = 'Выбранный компонент находится на последней позиции'; + $lang->msg_load_saved_doc = "Существует автоматически сохраненная статья. Хотите ли Вы ее восстановить?\nАвтоматически сохраненный черновик будет отменен после сохранения текущей статьи"; + $lang->msg_auto_saved = 'Автоматически сохранено'; + + $lang->cmd_disable = 'Неавтивно'; + $lang->cmd_enable = 'Активно'; + + $lang->editor_skin = '에디터 스킨'; + $lang->upload_file_grant = '파일 첨부 권한'; + $lang->enable_default_component_grant = '기본 컴포넌트 사용 권한'; + $lang->enable_component_grant = '컴포넌트 사용 권한'; + $lang->enable_html_grant = 'HTML편집 권한'; + $lang->enable_autosave = '자동저장 사용'; + $lang->height_resizable = '높이 조절 가능'; + $lang->editor_height = '에디터 높이'; + + $lang->about_editor_skin = '에디터 스킨을 선택하실 수 있습니다'; + $lang->about_upload_file_grant = '파일을 첨부할 수 있는 권한을 지정하실 수 있습니다 (모두 해제시 아무나 첨부 가능합니다)'; + $lang->about_default_component_grant = '에디터에서 사용되는 기본 컴포넌트를 사용할 수 있는 권한을 지정할 수 있습니다. (모두 해제시 아무나 사용 가능합니다)'; + $lang->about_editor_height = '에디터의 기본 높이를 지정하실 수 있습니다'; + $lang->about_editor_height_resizable = '에디터의 높이를 직접 변경할 수 있도록 허용합니다'; + $lang->about_enable_html_grant = 'HTML편집 권한을 부여할 수 있습니다.'; + $lang->about_enable_autosave = '글작성시 자동 저장 기능을 활성화 시킬 수 있습니다'; + + $lang->edit->fontname = 'Шрифт'; + $lang->edit->fontsize = 'Размер'; + $lang->edit->use_paragraph = 'Функции параграфа'; + $lang->edit->fontlist = array( + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = 'Стиль'; + $lang->edit->header_list = array( + 'h1' => 'Заголовок 1', + 'h2' => 'Заголовок 2', + 'h3' => 'Заголовок 3', + 'h4' => 'Заголовок 4', + 'h5' => 'Заголовок 5', + 'h6' => 'Заголовок 6', + ); + + $lang->edit->submit = 'Принять'; + + $lang->edit->fontcolor = 'Text Color'; + $lang->edit->fontbgcolor = 'Background Color'; + $lang->edit->bold = 'Bold'; + $lang->edit->italic = 'Italic'; + $lang->edit->underline = 'Underline'; + $lang->edit->strike = 'Strike'; + $lang->edit->sup = 'Sup'; + $lang->edit->sub = 'Sub'; + $lang->edit->redo = 'Re Do'; + $lang->edit->undo = 'Un Do'; + $lang->edit->align_left = 'Align Left'; + $lang->edit->align_center = 'Align Center'; + $lang->edit->align_right = 'Align Right'; + $lang->edit->align_justify = 'Align Justify'; + $lang->edit->add_indent = 'Indent'; + $lang->edit->remove_indent = 'Outdent'; + $lang->edit->list_number = 'Orderd List'; + $lang->edit->list_bullet = 'Unordered List'; + $lang->edit->remove_format = 'Style Remover'; + + $lang->edit->help_fontcolor = 'Выберать цвет шрифта'; + $lang->edit->help_fontbgcolor = 'Выберать цвет фона шрифта'; + $lang->edit->help_bold = 'Сделать шрифт жирным'; + $lang->edit->help_italic = 'Сделать шрифт наклонным'; + $lang->edit->help_underline = 'Сделать шрифт подчеркнутым'; + $lang->edit->help_strike = 'Сделать шрифт зачеркнутым'; + $lang->edit->help_sup = 'Sup'; + $lang->edit->help_sub = 'Sub'; + $lang->edit->help_redo = 'Восстановить отмененное'; + $lang->edit->help_undo = 'Отмена'; + $lang->edit->help_align_left = 'Выровнять по левому краю'; + $lang->edit->help_align_center = 'Выровнять по центру'; + $lang->edit->help_align_right = 'Выровнять по правому краю'; + $lang->edit->help_add_indent = 'Добавить отступ'; + $lang->edit->help_remove_indent = 'Удалить отступ'; + $lang->edit->help_list_number = 'Применить числовой список'; + $lang->edit->help_list_bullet = 'Применить маркированный список'; + $lang->edit->help_use_paragraph = 'Нажмите Ctrl+Enter, чтобы отметить параграф. (Нажмите Alt+S , чтобы сохранить)'; + + $lang->edit->url = 'URL'; + $lang->edit->blockquote = 'Blockquote'; + $lang->edit->table = 'Table'; + $lang->edit->image = 'Image'; + $lang->edit->multimedia = 'Movie'; + $lang->edit->emoticon = 'Emoticon'; + + $lang->edit->upload = 'Вложение'; + $lang->edit->upload_file = 'Вложить'; + $lang->edit->link_file = 'Вставить в содержание'; + $lang->edit->delete_selected = 'Удалить выбранное'; + + $lang->edit->icon_align_article = 'Занять весь параграф'; + $lang->edit->icon_align_left = 'Выровнять по левому краю'; + $lang->edit->icon_align_middle = 'Выровнять по центру'; + $lang->edit->icon_align_right = 'Выровнять по правому краю'; + + $lang->about_dblclick_in_editor = 'Вы можете установить детальную конфигурацию компонента двойным щелчком по фону, тексту, рисункам или цитатам'; + + + $lang->edit->rich_editor = '스타일 편집기'; + $lang->edit->html_editor = 'HTML 편집기'; + $lang->edit->extension ='확장 컴포넌트'; + $lang->edit->help = '도움말'; + $lang->edit->help_command = '단축키 안내'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/zh-CN.lang.php b/modules/editor/lang/zh-CN.lang.php index c9b639892..3cbc70416 100644 --- a/modules/editor/lang/zh-CN.lang.php +++ b/modules/editor/lang/zh-CN.lang.php @@ -1,148 +1,163 @@ - - * @brief 网页编辑器(editor) 模块语言包 - **/ - - $lang->editor = '网页编辑器'; - $lang->component_name = '组件'; - $lang->component_version = '版本'; - $lang->component_author = '作者'; - $lang->component_link = '链接'; - $lang->component_date = '编写日期'; - $lang->component_license = '版权'; - $lang->component_history = '更新日志'; - $lang->component_description = '说明'; - $lang->component_extra_vars = '变数设置'; - $lang->component_grant = '权限设置'; - - $lang->about_component = '组件简介'; - $lang->about_component_grant = '可以设置除默认组件外的扩展组件使用权限
        (全部解除时任何用户都可以使用)。'; - $lang->about_component_mid = '可以指定使用编辑器组件的对象。
        (全部解除时任何用户都可以使用)。'; - - $lang->msg_component_is_not_founded = '找不到%s 组件说明!'; - $lang->msg_component_is_inserted = '您选择的组件已插入!'; - $lang->msg_component_is_first_order = '您选择的组件已到最上端位置!'; - $lang->msg_component_is_last_order = '您选择的组件已到最下端位置!'; - $lang->msg_load_saved_doc = "有自动保存的内容, 确定要恢复吗?\n发布主题后,自动保存的文本将会被删除。"; - $lang->msg_auto_saved = '已自动保存!'; - - $lang->cmd_disable = '非激活'; - $lang->cmd_enable = '激活'; - - $lang->editor_skin = '编辑器皮肤'; - $lang->upload_file_grant = '文件上传权限'; - $lang->enable_default_component_grant = '默认组件使用权限'; - $lang->enable_component_grant = '组件使用权限'; - $lang->enable_html_grant = 'HTML编辑权限'; - $lang->enable_autosave = '内容自动保存'; - $lang->height_resizable = '高度调整'; - $lang->editor_height = '编辑器高度'; - - $lang->about_editor_skin = '可以选择编辑器皮肤。'; - $lang->about_upload_file_grant = '可以设置上传文件的权限(全部解除为无限制)。'; - $lang->about_default_component_grant = '可以设置编辑器默认组件的使用权限(全部解除为无限制)。'; - $lang->about_editor_height = '可以指定编辑器的默认高度。'; - $lang->about_editor_height_resizable = '允许用户拖动编辑器高度。'; - $lang->about_enable_html_grant = 'HTML代码编辑权限设置。'; - $lang->about_enable_autosave = '发表主题时激活内容自动保存功能。'; - - $lang->edit->fontname = '字体'; - $lang->edit->fontsize = '大小'; - $lang->edit->use_paragraph = '段落功能'; - $lang->edit->fontlist = array( - '宋体'=>'宋体', - '黑体'=>'黑体', - '楷体_GB2312'=>'楷体', - '仿宋_GB2312'=>'仿宋', - '隶书'=>'隶书', - '幼圆'=>'幼圆', - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = '样式'; - $lang->edit->header_list = array( - 'h1' => '标题 1', - 'h2' => '标题 2', - 'h3' => '标题 3', - 'h4' => '标题 4', - 'h5' => '标题 5', - 'h6' => '标题 6', - ); - - $lang->edit->submit = '确认'; - - $lang->edit->fontcolor = '文本颜色'; - $lang->edit->fontbgcolor = '背景颜色'; - $lang->edit->bold = '粗体'; - $lang->edit->italic = '斜体'; - $lang->edit->underline = '下划线'; - $lang->edit->strike = '取消线'; - $lang->edit->sup = '上标'; - $lang->edit->sub = '下标'; - $lang->edit->redo = '恢复'; - $lang->edit->undo = '撤销'; - $lang->edit->align_left = '左对齐'; - $lang->edit->align_center = '居中对齐'; - $lang->edit->align_right = '右对齐'; - $lang->edit->align_justify = '两端对齐'; - $lang->edit->add_indent = '增加缩进'; - $lang->edit->remove_indent = '减少缩进'; - $lang->edit->list_number = '有序列表'; - $lang->edit->list_bullet = '无序列表'; - $lang->edit->remove_format = '删除文字格式'; - - $lang->edit->help_fontcolor = '文本颜色'; - $lang->edit->help_fontbgcolor = '背景颜色'; - $lang->edit->help_bold = '粗体'; - $lang->edit->help_italic = '斜体'; - $lang->edit->help_underline = '下划线'; - $lang->edit->help_strike = '取消线'; - $lang->edit->help_sup = '上标'; - $lang->edit->help_sub = '下标'; - $lang->edit->help_redo = '恢复'; - $lang->edit->help_undo = '撤销'; - $lang->edit->help_align_left = '左对齐'; - $lang->edit->help_align_center = '居中对齐'; - $lang->edit->help_align_right = '右对齐'; - $lang->edit->help_add_indent = '增加缩进'; - $lang->edit->help_remove_indent = '减少缩进'; - $lang->edit->help_list_number = '有序列表'; - $lang->edit->help_list_bullet = '无序列表'; - $lang->edit->help_use_paragraph = '分段请按 ctrl+回车. (发表主题快捷键:alt+S)'; - - $lang->edit->url = '插入链接'; - $lang->edit->blockquote = '插入注释框'; - $lang->edit->table = '表格'; - $lang->edit->image = '图片'; - $lang->edit->multimedia = '视频'; - $lang->edit->emoticon = '表情图标'; - - $lang->edit->upload = '上传'; - $lang->edit->upload_file = '上传附件'; - $lang->edit->link_file = '插入附件'; - $lang->edit->delete_selected = '删除所选'; - - $lang->edit->icon_align_article = '占一个段落'; - $lang->edit->icon_align_left = '文本左侧'; - $lang->edit->icon_align_middle = '居中对齐'; - $lang->edit->icon_align_right = '文本右侧'; - - $lang->about_dblclick_in_editor = '双击背景, 文本, 图片, 引用即可对其相关组件进行详细设置。'; - - - $lang->edit->rich_editor = '所见即所得编辑器'; - $lang->edit->html_editor = 'HTML 编辑器'; - $lang->edit->extension ='扩展组建'; - $lang->edit->help = '帮助'; - $lang->edit->help_command = '快捷键说明'; -?> + + * @brief 网页编辑器(editor) 模块语言包 + **/ + + $lang->editor = '网页编辑器'; + $lang->component_name = '组件'; + $lang->component_version = '版本'; + $lang->component_author = '作者'; + $lang->component_link = '链接'; + $lang->component_date = '编写日期'; + $lang->component_license = '版权'; + $lang->component_history = '更新日志'; + $lang->component_description = '说明'; + $lang->component_extra_vars = '变数设置'; + $lang->component_grant = '权限设置'; + + $lang->about_component = '组件简介'; + $lang->about_component_grant = '可以设置除默认组件外的扩展组件使用权限
        (全部解除时任何用户都可以使用)。'; + $lang->about_component_mid = '可以指定使用编辑器组件的对象。
        (全部解除时任何用户都可以使用)。'; + + $lang->msg_component_is_not_founded = '找不到%s 组件说明!'; + $lang->msg_component_is_inserted = '您选择的组件已插入!'; + $lang->msg_component_is_first_order = '您选择的组件已到最上端位置!'; + $lang->msg_component_is_last_order = '您选择的组件已到最下端位置!'; + $lang->msg_load_saved_doc = "有自动保存的内容, 确定要恢复吗?\n发布主题后,自动保存的文本将会被删除。"; + $lang->msg_auto_saved = '已自动保存!'; + + $lang->cmd_disable = '非激活'; + $lang->cmd_enable = '激活'; + + $lang->editor_skin = '编辑器皮肤'; + $lang->upload_file_grant = '文件上传权限'; + $lang->enable_default_component_grant = '默认组件使用权限'; + $lang->enable_component_grant = '组件使用权限'; + $lang->enable_html_grant = 'HTML编辑权限'; + $lang->enable_autosave = '内容自动保存'; + $lang->height_resizable = '高度调整'; + $lang->editor_height = '编辑器高度'; + + $lang->about_editor_skin = '可以选择编辑器皮肤。'; + $lang->about_upload_file_grant = '可以设置上传文件的权限(全部解除为无限制)。'; + $lang->about_default_component_grant = '可以设置编辑器默认组件的使用权限(全部解除为无限制)。'; + $lang->about_editor_height = '可以指定编辑器的默认高度。'; + $lang->about_editor_height_resizable = '允许用户拖动编辑器高度。'; + $lang->about_enable_html_grant = 'HTML代码编辑权限设置。'; + $lang->about_enable_autosave = '发表主题时激活内容自动保存功能。'; + + $lang->edit->fontname = '字体'; + $lang->edit->fontsize = '大小'; + $lang->edit->use_paragraph = '段落功能'; + $lang->edit->fontlist = array( + '宋体'=>'宋体', + '黑体'=>'黑体', + '楷体_GB2312'=>'楷体', + '仿宋_GB2312'=>'仿宋', + '隶书'=>'隶书', + '幼圆'=>'幼圆', + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = '样式'; + $lang->edit->header_list = array( + 'h1' => '标题 1', + 'h2' => '标题 2', + 'h3' => '标题 3', + 'h4' => '标题 4', + 'h5' => '标题 5', + 'h6' => '标题 6', + ); + + $lang->edit->submit = '确认'; + + $lang->edit->fontcolor = '文本颜色'; + $lang->edit->fontbgcolor = '背景颜色'; + $lang->edit->bold = '粗体'; + $lang->edit->italic = '斜体'; + $lang->edit->underline = '下划线'; + $lang->edit->strike = '取消线'; + $lang->edit->sup = '上标'; + $lang->edit->sub = '下标'; + $lang->edit->redo = '恢复'; + $lang->edit->undo = '撤销'; + $lang->edit->align_left = '左对齐'; + $lang->edit->align_center = '居中对齐'; + $lang->edit->align_right = '右对齐'; + $lang->edit->align_justify = '两端对齐'; + $lang->edit->add_indent = '增加缩进'; + $lang->edit->remove_indent = '减少缩进'; + $lang->edit->list_number = '有序列表'; + $lang->edit->list_bullet = '无序列表'; + $lang->edit->remove_format = '删除文字格式'; + + $lang->edit->help_fontcolor = '文本颜色'; + $lang->edit->help_fontbgcolor = '背景颜色'; + $lang->edit->help_bold = '粗体'; + $lang->edit->help_italic = '斜体'; + $lang->edit->help_underline = '下划线'; + $lang->edit->help_strike = '取消线'; + $lang->edit->help_sup = '上标'; + $lang->edit->help_sub = '下标'; + $lang->edit->help_redo = '恢复'; + $lang->edit->help_undo = '撤销'; + $lang->edit->help_align_left = '左对齐'; + $lang->edit->help_align_center = '居中对齐'; + $lang->edit->help_align_right = '右对齐'; + $lang->edit->help_add_indent = '增加缩进'; + $lang->edit->help_remove_indent = '减少缩进'; + $lang->edit->help_list_number = '有序列表'; + $lang->edit->help_list_bullet = '无序列表'; + $lang->edit->help_use_paragraph = '分段请按 ctrl+回车. (发表主题快捷键:alt+S)'; + + $lang->edit->url = '插入链接'; + $lang->edit->blockquote = '插入注释框'; + $lang->edit->table = '表格'; + $lang->edit->image = '图片'; + $lang->edit->multimedia = '视频'; + $lang->edit->emoticon = '表情图标'; + + $lang->edit->upload = '上传'; + $lang->edit->upload_file = '上传附件'; + $lang->edit->link_file = '插入附件'; + $lang->edit->delete_selected = '删除所选'; + + $lang->edit->icon_align_article = '占一个段落'; + $lang->edit->icon_align_left = '文本左侧'; + $lang->edit->icon_align_middle = '居中对齐'; + $lang->edit->icon_align_right = '文本右侧'; + + $lang->about_dblclick_in_editor = '双击背景, 文本, 图片, 引用即可对其相关组件进行详细设置。'; + + + $lang->edit->rich_editor = '所见即所得编辑器'; + $lang->edit->html_editor = 'HTML 编辑器'; + $lang->edit->extension ='扩展组建'; + $lang->edit->help = '帮助'; + $lang->edit->help_command = '快捷键说明'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> diff --git a/modules/editor/lang/zh-TW.lang.php b/modules/editor/lang/zh-TW.lang.php index 3f4566dac..44011e26e 100644 --- a/modules/editor/lang/zh-TW.lang.php +++ b/modules/editor/lang/zh-TW.lang.php @@ -1,149 +1,164 @@ - 翻譯:royallin - * @brief 網頁編輯器(editor)模組正體中文語言 - **/ - - $lang->editor = '網頁編輯器'; - $lang->component_name = '組件'; - $lang->component_version = '版本'; - $lang->component_author = '作者'; - $lang->component_link = '連結'; - $lang->component_date = '編寫日期'; - $lang->component_license = '版權'; - $lang->component_history = '紀錄'; - $lang->component_description = '說明'; - $lang->component_extra_vars = '變數設置'; - $lang->component_grant = '權限設置'; - - $lang->about_component = '組件簡介'; - $lang->about_component_grant = '除預設組件外,可設置延伸組件的使用權限
        (全部解除時,任何用戶都可使用)。'; - $lang->about_component_mid = '可以指定使用編輯器組件的對象。
        (全部解除時,任何用戶都可使用)。'; - - $lang->msg_component_is_not_founded = '找不到%s 組件說明!'; - $lang->msg_component_is_inserted = '您選擇的組件已插入!'; - $lang->msg_component_is_first_order = '您選擇的組件已達最頂端位置!'; - $lang->msg_component_is_last_order = '您選擇的組件已達最底端位置!'; - $lang->msg_load_saved_doc = "有自動儲存的內容,確定要恢復嗎?\n儲存內容後,自動儲存的內容將會被刪除。"; - $lang->msg_auto_saved = '已自動儲存!'; - - $lang->cmd_disable = '暫停'; - $lang->cmd_enable = '啟動'; - - $lang->editor_skin = '編輯器面板'; - $lang->upload_file_grant = '檔案上傳權限'; - $lang->enable_default_component_grant = '預設組件使用權限'; - $lang->enable_component_grant = '組件使用權限'; - $lang->enable_html_grant = 'HTML編輯權限'; - $lang->enable_autosave = '內容自動儲存'; - $lang->height_resizable = '高度調整'; - $lang->editor_height = '編輯器高度'; - - $lang->about_editor_skin = '選擇編輯器面板。'; - $lang->about_upload_file_grant = '設置上傳檔案的權限(全部解除為無限制)。'; - $lang->about_default_component_grant = '設置編輯器預設組件的使用權限(全部解除為無限制)。'; - $lang->about_editor_height = '指定編輯器的預設高度。'; - $lang->about_editor_height_resizable = '允許用戶拖曳編輯器高度。'; - $lang->about_enable_html_grant = 'HTML原始碼編輯權限設置。'; - $lang->about_enable_autosave = '發表主題時,開啟內容自動儲存功能。'; - - $lang->edit->fontname = '字體'; - $lang->edit->fontsize = '大小'; - $lang->edit->use_paragraph = '段落功能'; - $lang->edit->fontlist = array( - '新細明體'=>'新細明體', - '標楷體'=>'標楷體', - '細明體'=>'細明體', - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = '樣式'; - $lang->edit->header_list = array( - 'h1' => '標題 1', - 'h2' => '標題 2', - 'h3' => '標題 3', - 'h4' => '標題 4', - 'h5' => '標題 5', - 'h6' => '標題 6', - ); - - $lang->edit->submit = '確認'; - - $lang->edit->fontcolor = '文字顏色'; - $lang->edit->fontbgcolor = '背景顏色'; - $lang->edit->bold = '粗體'; - $lang->edit->italic = '斜體'; - $lang->edit->underline = '底線'; - $lang->edit->strike = '虛線'; - $lang->edit->sup = '上標'; - $lang->edit->sub = '下標'; - $lang->edit->redo = '重新操作'; - $lang->edit->undo = '返回操作'; - $lang->edit->align_left = '靠左對齊'; - $lang->edit->align_center = '置中對齊'; - $lang->edit->align_right = '靠右對齊'; - $lang->edit->align_justify = '左右對齊'; - $lang->edit->add_indent = '縮排'; - $lang->edit->remove_indent = '凸排'; - $lang->edit->list_number = '編號'; - $lang->edit->list_bullet = '清單符號'; - $lang->edit->remove_format = '移除格式'; - - $lang->edit->help_remove_format = '移除格式'; - $lang->edit->help_strike_through = '文字刪除線'; - $lang->edit->help_align_full = '左右對齊'; - - $lang->edit->help_fontcolor = '文字顏色'; - $lang->edit->help_fontbgcolor = '背景顏色'; - $lang->edit->help_bold = '粗體'; - $lang->edit->help_italic = '斜體'; - $lang->edit->help_underline = '底線'; - $lang->edit->help_strike = '虛線'; - $lang->edit->help_sup = '上標'; - $lang->edit->help_sub = '下標'; - $lang->edit->help_redo = '重新操作'; - $lang->edit->help_undo = '返回操作'; - $lang->edit->help_align_left = '靠左對齊'; - $lang->edit->help_align_center = '置中對齊'; - $lang->edit->help_align_right = '靠右對齊'; - $lang->edit->help_add_indent = '縮排'; - $lang->edit->help_remove_indent = '凸排'; - $lang->edit->help_list_number = '編號'; - $lang->edit->help_list_bullet = '清單符號'; - $lang->edit->help_use_paragraph = '換行請按 Ctrl+Backspace (快速發表主題:Alt+S)'; - - $lang->edit->url = '連結'; - $lang->edit->blockquote = '引用'; - $lang->edit->table = '表格'; - $lang->edit->image = '圖片'; - $lang->edit->multimedia = '影片'; - $lang->edit->emoticon = '表情符號'; - - $lang->edit->upload = '上傳'; - $lang->edit->upload_file = '上傳附檔'; - $lang->edit->link_file = '插入圖片'; - $lang->edit->delete_selected = '刪除所選'; - - $lang->edit->icon_align_article = '段落'; - $lang->edit->icon_align_left = '靠左'; - $lang->edit->icon_align_middle = '置中'; - $lang->edit->icon_align_right = '靠右'; - - $lang->about_dblclick_in_editor = '對背景,文字,圖片,引用等組件按兩下,即可對其相關組件進行詳細設置。'; - - - $lang->edit->rich_editor = '所見即得'; - $lang->edit->html_editor = 'HTML'; - $lang->edit->extension ='延伸組件'; - $lang->edit->help = '使用說明'; - $lang->edit->help_command = '快速鍵指引'; -?> + 翻譯:royallin + * @brief 網頁編輯器(editor)模組正體中文語言 + **/ + + $lang->editor = '網頁編輯器'; + $lang->component_name = '組件'; + $lang->component_version = '版本'; + $lang->component_author = '作者'; + $lang->component_link = '連結'; + $lang->component_date = '編寫日期'; + $lang->component_license = '版權'; + $lang->component_history = '紀錄'; + $lang->component_description = '說明'; + $lang->component_extra_vars = '變數設置'; + $lang->component_grant = '權限設置'; + + $lang->about_component = '組件簡介'; + $lang->about_component_grant = '除預設組件外,可設置延伸組件的使用權限
        (全部解除時,任何用戶都可使用)。'; + $lang->about_component_mid = '可以指定使用編輯器組件的對象。
        (全部解除時,任何用戶都可使用)。'; + + $lang->msg_component_is_not_founded = '找不到%s 組件說明!'; + $lang->msg_component_is_inserted = '您選擇的組件已插入!'; + $lang->msg_component_is_first_order = '您選擇的組件已達最頂端位置!'; + $lang->msg_component_is_last_order = '您選擇的組件已達最底端位置!'; + $lang->msg_load_saved_doc = "有自動儲存的內容,確定要恢復嗎?\n儲存內容後,自動儲存的內容將會被刪除。"; + $lang->msg_auto_saved = '已自動儲存!'; + + $lang->cmd_disable = '暫停'; + $lang->cmd_enable = '啟動'; + + $lang->editor_skin = '編輯器面板'; + $lang->upload_file_grant = '檔案上傳權限'; + $lang->enable_default_component_grant = '預設組件使用權限'; + $lang->enable_component_grant = '組件使用權限'; + $lang->enable_html_grant = 'HTML編輯權限'; + $lang->enable_autosave = '內容自動儲存'; + $lang->height_resizable = '高度調整'; + $lang->editor_height = '編輯器高度'; + + $lang->about_editor_skin = '選擇編輯器面板。'; + $lang->about_upload_file_grant = '設置上傳檔案的權限(全部解除為無限制)。'; + $lang->about_default_component_grant = '設置編輯器預設組件的使用權限(全部解除為無限制)。'; + $lang->about_editor_height = '指定編輯器的預設高度。'; + $lang->about_editor_height_resizable = '允許用戶拖曳編輯器高度。'; + $lang->about_enable_html_grant = 'HTML原始碼編輯權限設置。'; + $lang->about_enable_autosave = '發表主題時,開啟內容自動儲存功能。'; + + $lang->edit->fontname = '字體'; + $lang->edit->fontsize = '大小'; + $lang->edit->use_paragraph = '段落功能'; + $lang->edit->fontlist = array( + '新細明體'=>'新細明體', + '標楷體'=>'標楷體', + '細明體'=>'細明體', + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = '樣式'; + $lang->edit->header_list = array( + 'h1' => '標題 1', + 'h2' => '標題 2', + 'h3' => '標題 3', + 'h4' => '標題 4', + 'h5' => '標題 5', + 'h6' => '標題 6', + ); + + $lang->edit->submit = '確認'; + + $lang->edit->fontcolor = '文字顏色'; + $lang->edit->fontbgcolor = '背景顏色'; + $lang->edit->bold = '粗體'; + $lang->edit->italic = '斜體'; + $lang->edit->underline = '底線'; + $lang->edit->strike = '虛線'; + $lang->edit->sup = '上標'; + $lang->edit->sub = '下標'; + $lang->edit->redo = '重新操作'; + $lang->edit->undo = '返回操作'; + $lang->edit->align_left = '靠左對齊'; + $lang->edit->align_center = '置中對齊'; + $lang->edit->align_right = '靠右對齊'; + $lang->edit->align_justify = '左右對齊'; + $lang->edit->add_indent = '縮排'; + $lang->edit->remove_indent = '凸排'; + $lang->edit->list_number = '編號'; + $lang->edit->list_bullet = '清單符號'; + $lang->edit->remove_format = '移除格式'; + + $lang->edit->help_remove_format = '移除格式'; + $lang->edit->help_strike_through = '文字刪除線'; + $lang->edit->help_align_full = '左右對齊'; + + $lang->edit->help_fontcolor = '文字顏色'; + $lang->edit->help_fontbgcolor = '背景顏色'; + $lang->edit->help_bold = '粗體'; + $lang->edit->help_italic = '斜體'; + $lang->edit->help_underline = '底線'; + $lang->edit->help_strike = '虛線'; + $lang->edit->help_sup = '上標'; + $lang->edit->help_sub = '下標'; + $lang->edit->help_redo = '重新操作'; + $lang->edit->help_undo = '返回操作'; + $lang->edit->help_align_left = '靠左對齊'; + $lang->edit->help_align_center = '置中對齊'; + $lang->edit->help_align_right = '靠右對齊'; + $lang->edit->help_add_indent = '縮排'; + $lang->edit->help_remove_indent = '凸排'; + $lang->edit->help_list_number = '編號'; + $lang->edit->help_list_bullet = '清單符號'; + $lang->edit->help_use_paragraph = '換行請按 Ctrl+Backspace (快速發表主題:Alt+S)'; + + $lang->edit->url = '連結'; + $lang->edit->blockquote = '引用'; + $lang->edit->table = '表格'; + $lang->edit->image = '圖片'; + $lang->edit->multimedia = '影片'; + $lang->edit->emoticon = '表情符號'; + + $lang->edit->upload = '上傳'; + $lang->edit->upload_file = '上傳附檔'; + $lang->edit->link_file = '插入圖片'; + $lang->edit->delete_selected = '刪除所選'; + + $lang->edit->icon_align_article = '段落'; + $lang->edit->icon_align_left = '靠左'; + $lang->edit->icon_align_middle = '置中'; + $lang->edit->icon_align_right = '靠右'; + + $lang->about_dblclick_in_editor = '對背景,文字,圖片,引用等組件按兩下,即可對其相關組件進行詳細設置。'; + + + $lang->edit->rich_editor = '所見即得'; + $lang->edit->html_editor = 'HTML'; + $lang->edit->extension ='延伸組件'; + $lang->edit->help = '使用說明'; + $lang->edit->help_command = '快速鍵指引'; + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; +?> From a50139a88478c833ff271b97ea71bc782d9be2b2 Mon Sep 17 00:00:00 2001 From: royallin Date: Wed, 1 Apr 2009 07:27:39 +0000 Subject: [PATCH 145/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6010 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/layout/lang/zh-TW.lang.php | 4 ++-- modules/module/lang/zh-TW.lang.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/layout/lang/zh-TW.lang.php b/modules/layout/lang/zh-TW.lang.php index f686f3aa2..04db26726 100644 --- a/modules/layout/lang/zh-TW.lang.php +++ b/modules/layout/lang/zh-TW.lang.php @@ -70,8 +70,8 @@ 29 => '靠右對齊', 30 => '寬度', 31 => '高度', - 32 => '바깥 여백', - 33 => '안쪽 여백', + 32 => '邊距', + 33 => '內距', 34 => '上', 35 => '左', 36 => '右', diff --git a/modules/module/lang/zh-TW.lang.php b/modules/module/lang/zh-TW.lang.php index b036dfd9f..b35f2d8cf 100644 --- a/modules/module/lang/zh-TW.lang.php +++ b/modules/module/lang/zh-TW.lang.php @@ -83,9 +83,9 @@ $lang->about_grant = '全部解除特定權限的對象時,沒有登錄的會員也將具有相關權限。'; $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; $lang->about_module = "除基本函式庫以外XE全部由模組組成。\n模組管理中列出所有已安裝的模組,因此易於管理。"; - $lang->about_extra_vars_default_value = '當復選或單選的預設值需要很多個時,用逗號(,)區隔。'; - $lang->about_search_virtual_site = "請輸入想要搜尋的虛擬網站(XE網咖等)的網域名稱。
        가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 不用輸入)"; + $lang->about_search_virtual_site = '가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
        가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 不用輸入)'; + $lang->about_extra_vars_eid_value = '확장변수의 이름을 적어주세요. ( 영문+[영문+숫자+_] 만 가능)'; $lang->about_langcode = "想要實現多國語言功能,請按[語言代碼]按鈕。"; $lang->about_file_extension= "只允許%s檔案。"; ?> From 9c88f8a395604f89260dd12ec4e3760dd6d9eda2 Mon Sep 17 00:00:00 2001 From: haneul Date: Wed, 1 Apr 2009 08:38:38 +0000 Subject: [PATCH 146/202] #17727625 : features to view old revision and to apply old revision git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6011 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/wiki/lang/en.lang.php | 1 + modules/wiki/lang/jp.lang.php | 1 + modules/wiki/lang/ko.lang.php | 1 + modules/wiki/lang/zh-CN.lang.php | 1 + modules/wiki/lang/zh-TW.lang.php | 1 + modules/wiki/skins/xe_wiki/css/wiki.css | 2 +- modules/wiki/skins/xe_wiki/header.html | 14 ++++++++- modules/wiki/skins/xe_wiki/histories.html | 21 ++++++++++++-- modules/wiki/skins/xe_wiki/view_document.html | 6 +++- modules/wiki/skins/xe_wiki/write_form.html | 4 +++ modules/wiki/tpl/js/wiki.js | 2 +- modules/wiki/wiki.view.php | 29 +++++++++++++++---- 12 files changed, 72 insertions(+), 11 deletions(-) diff --git a/modules/wiki/lang/en.lang.php b/modules/wiki/lang/en.lang.php index ece2d826a..f6ffcb704 100644 --- a/modules/wiki/lang/en.lang.php +++ b/modules/wiki/lang/en.lang.php @@ -13,4 +13,5 @@ $lang->use_comment = 'Use comment'; $lang->about_use_comment = 'You may configure to enable comments.'; $lang->contributors = 'Contributors'; + $lang->notice_old_revision = 'This is an old revision'; ?> diff --git a/modules/wiki/lang/jp.lang.php b/modules/wiki/lang/jp.lang.php index 1760c3597..c1d105885 100644 --- a/modules/wiki/lang/jp.lang.php +++ b/modules/wiki/lang/jp.lang.php @@ -13,4 +13,5 @@ $lang->use_comment = 'コメント機能を使う'; $lang->about_use_comment = 'コメント機能をオン・オフを設定します。'; $lang->contributors = 'Contributors'; + $lang->notice_old_revision = 'This is an old revision'; ?> diff --git a/modules/wiki/lang/ko.lang.php b/modules/wiki/lang/ko.lang.php index b08f8dfc9..ac58a506b 100644 --- a/modules/wiki/lang/ko.lang.php +++ b/modules/wiki/lang/ko.lang.php @@ -13,4 +13,5 @@ $lang->use_comment = '댓글 사용'; $lang->about_use_comment = '댓글을 활성화하거나 비활성화할 수 있습니다'; $lang->contributors = '공헌자'; + $lang->notice_old_revision = '옛날 버전을 보고 계십니다'; ?> diff --git a/modules/wiki/lang/zh-CN.lang.php b/modules/wiki/lang/zh-CN.lang.php index 505c98937..1475bd96c 100644 --- a/modules/wiki/lang/zh-CN.lang.php +++ b/modules/wiki/lang/zh-CN.lang.php @@ -13,4 +13,5 @@ $lang->use_comment = 'Use comment'; $lang->about_use_comment = 'You may configure to enable comments.'; $lang->contributors = 'Contributors'; + $lang->notice_old_revision = 'This is an old revision'; ?> diff --git a/modules/wiki/lang/zh-TW.lang.php b/modules/wiki/lang/zh-TW.lang.php index 0b4a4fd9a..75034df31 100644 --- a/modules/wiki/lang/zh-TW.lang.php +++ b/modules/wiki/lang/zh-TW.lang.php @@ -13,4 +13,5 @@ $lang->use_comment = '使用評論'; $lang->about_use_comment = '可設定是否使用評論功能。'; $lang->contributors = 'Contributors'; + $lang->notice_old_revision = 'This is an old revision'; ?> diff --git a/modules/wiki/skins/xe_wiki/css/wiki.css b/modules/wiki/skins/xe_wiki/css/wiki.css index ddd6756b5..98bd1c183 100644 --- a/modules/wiki/skins/xe_wiki/css/wiki.css +++ b/modules/wiki/skins/xe_wiki/css/wiki.css @@ -345,4 +345,4 @@ color:#666666; font-size:11px; font-weight:normal; margin-top:5px; padding-top:5 .pagination.a1 a.next{ padding-right:10px; background:#fff url(../images/common/arrowNextA1.gif) no-repeat right center; } .pagination.a1 a.nextEnd{ padding-right:15px; background:#fff url(../images/common/arrowNextEndA1.gif) no-repeat right center; } -.contributors +.oldhistory { float:left; margin-left: 5px; } diff --git a/modules/wiki/skins/xe_wiki/header.html b/modules/wiki/skins/xe_wiki/header.html index 08c768356..097f32d02 100644 --- a/modules/wiki/skins/xe_wiki/header.html +++ b/modules/wiki/skins/xe_wiki/header.html @@ -21,6 +21,9 @@
        + +
        last edited by {$history->nick_name}
        +
        last edited by @@ -35,13 +38,22 @@ last edited by {$oDocument->getNickName()}
        +
        + + {zdate($history->regdate, 'Y.m.d')} {zdate($history->regdate, 'H:i:s')} + {$oDocument->getUpdate('Y.m.d')} {$oDocument->getUpdate('H:i:s')} +
        + +
        [{$lang->notice_old_revision}] +
        +
        diff --git a/modules/wiki/skins/xe_wiki/histories.html b/modules/wiki/skins/xe_wiki/histories.html index 3eb14b5c2..2311c278f 100644 --- a/modules/wiki/skins/xe_wiki/histories.html +++ b/modules/wiki/skins/xe_wiki/histories.html @@ -2,16 +2,18 @@
        + +
        {$oDocument->getUpdate()} - by {$oDocument->getNickName()} + by {$oDocument->getNickName()} (current) - (current revision) + [View]
        @@ -21,9 +23,24 @@ by {$val->nick_name} + + [View] +
        + + diff --git a/modules/wiki/skins/xe_wiki/view_document.html b/modules/wiki/skins/xe_wiki/view_document.html index b1fd5460c..683a4b2cb 100644 --- a/modules/wiki/skins/xe_wiki/view_document.html +++ b/modules/wiki/skins/xe_wiki/view_document.html @@ -18,7 +18,11 @@
        - {$oDocument->getContent(false)} + + {$history->content} + + {$oDocument->getContent(false)} +
      diff --git a/modules/wiki/skins/xe_wiki/write_form.html b/modules/wiki/skins/xe_wiki/write_form.html index 119f4f454..048e7867b 100644 --- a/modules/wiki/skins/xe_wiki/write_form.html +++ b/modules/wiki/skins/xe_wiki/write_form.html @@ -2,7 +2,11 @@
      + + + + diff --git a/modules/wiki/tpl/js/wiki.js b/modules/wiki/tpl/js/wiki.js index 31084a251..f832b2d79 100644 --- a/modules/wiki/tpl/js/wiki.js +++ b/modules/wiki/tpl/js/wiki.js @@ -20,7 +20,7 @@ function completeDocumentInserted(ret_obj) { } else { - url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act',''); + url = current_url.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act','').setQuery('history_srl',''); } location.href = url; } diff --git a/modules/wiki/wiki.view.php b/modules/wiki/wiki.view.php index e7b0be2fd..e2292b761 100644 --- a/modules/wiki/wiki.view.php +++ b/modules/wiki/wiki.view.php @@ -44,14 +44,17 @@ function dispWikiHistory() { $oDocumentModel = &getModel('document'); $document_srl = Context::get('document_srl'); + $page = Context::get('page'); $oDocument = $oDocumentModel->getDocument($document_srl); if(!$oDocument->isExists()) return $this->stop('msg_invalid_request'); $entry = $oDocument->getTitleText(); Context::set('entry',$entry); - $histories = $oDocumentModel->getHistories($document_srl); + $histories = $oDocumentModel->getHistories($document_srl, 10, $page); if(!$histories) $histories = array(); - Context::set('histories',$histories); + Context::set('histories',$histories->data); Context::set('oDocument', $oDocument); + Context::set('page_navigation', $histories->page_navigation); + Context::set('page', $histories->page); $this->setTemplateFile('histories'); } @@ -65,6 +68,15 @@ $oDocument->add('module_srl', $this->module_srl); Context::set('document_srl',$document_srl); Context::set('oDocument', $oDocument); + $history_srl = Context::get('history_srl'); + if($history_srl) + { + $output = $oDocumentModel->getHistory($history_srl); + if($output && $output->content != null) + { + Context::set('history', $output); + } + } Context::addJsFilter($this->module_path.'tpl/filter', 'insert.xml'); @@ -109,9 +121,6 @@ $document_srl = $oDocumentModel->getDocumentSrlByAlias($this->module_info->mid, $entry); } - - // document model 객체 생성 - /** * 요청된 문서 번호가 있다면 문서를 구함 **/ @@ -131,6 +140,16 @@ // 상담기능이 사용되고 공지사항이 아니고 사용자의 글도 아니면 무시 + $history_srl = Context::get('history_srl'); + if($history_srl) + { + $output = $oDocumentModel->getHistory($history_srl); + if($output && $output->content != null) + { + Context::set('history', $output); + } + } + // 요청된 문서번호의 문서가 없으면 document_srl null 처리 및 경고 메세지 출력 } else { Context::set('document_srl','',true); From d0f4ec811c6a836ef96c8b8a3fad7fd05a38dab5 Mon Sep 17 00:00:00 2001 From: zero Date: Wed, 1 Apr 2009 09:22:55 +0000 Subject: [PATCH 147/202] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98(=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC)=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EC=9C=84=EC=A0=AF=EC=9D=98=20default=20=EC=8A=A4?= =?UTF-8?q?=ED=82=A8=EC=97=90=EC=84=9C=20=EB=B6=84=EB=A5=98=EA=B0=80=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EB=90=98=EC=96=B4=20=EC=9E=88=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9C=BC=EB=A9=B4=20=EB=A3=A8=ED=8A=B8=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98=EA=B0=80=20bold=EC=B2=98=EB=A6=AC=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6012 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/category/skins/default/category.html | 2 +- widgets/category/skins/default/css/widget.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/widgets/category/skins/default/category.html b/widgets/category/skins/default/category.html index 5358c05a7..d7e4e8b45 100644 --- a/widgets/category/skins/default/category.html +++ b/widgets/category/skins/default/category.html @@ -6,7 +6,7 @@
      black">
      - {$widget_info->total_title}{$widget_info->module_info->browser_title} ({$widget_info->total_document_count}) + {$widget_info->total_title}{$widget_info->module_info->browser_title} ({$widget_info->total_document_count})
        diff --git a/widgets/category/skins/default/css/widget.css b/widgets/category/skins/default/css/widget.css index 67fd0a391..2f9cd497e 100644 --- a/widgets/category/skins/default/css/widget.css +++ b/widgets/category/skins/default/css/widget.css @@ -3,6 +3,7 @@ /* Widget Tree */ .widgetTree { margin-top:10px;} .widgetTree a.title { background:url(../img/white/folder.gif) no-repeat left top; padding-left:20px;} +.widgetTree a.strong { font-weight:bold; } .widgetTree span { font-size:9px; font-family:tahoma; padding:0; margin:0; color:#999;} .widgetTree ul span { margin-left:15px; } .widgetTree *{ margin:0; padding:0; font-size:12px;} From 883bae440bef53146ecf88dd7d7828d3854e56d3 Mon Sep 17 00:00:00 2001 From: k10206 Date: Thu, 2 Apr 2009 05:30:33 +0000 Subject: [PATCH 148/202] =?UTF-8?q?RSS=20=EB=A6=AC=EB=8D=94=20=EC=9C=84?= =?UTF-8?q?=EC=A0=AF=20=EC=88=98=EC=A0=95=20-=20=EB=82=A0=EC=A7=9C,=20?= =?UTF-8?q?=EC=8A=A4=ED=82=A8=20=EA=B4=80=EB=A0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6013 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/rss_reader/rss_reader.class.php | 2 +- .../rss_reader/skins/sz_select/css/select.css | 33 ------ .../skins/sz_select/images/black/bulletD0.gif | Bin 44 -> 0 bytes .../sz_select/images/black/lineNotice.gif | Bin 139 -> 0 bytes .../skins/sz_select/images/forward.png | Bin 3662 -> 0 bytes .../rss_reader/skins/sz_select/images/new.gif | Bin 78 -> 0 bytes .../skins/sz_select/images/white/bulletD0.gif | Bin 44 -> 0 bytes .../sz_select/images/white/lineNotice.gif | Bin 139 -> 0 bytes widgets/rss_reader/skins/sz_select/js/tab.js | 17 --- widgets/rss_reader/skins/sz_select/list.html | 34 ------ widgets/rss_reader/skins/sz_select/skin.xml | 109 ------------------ .../rss_reader/skins/sz_xe/css/default.css | 34 ------ .../skins/sz_xe/images/default/bullet.gif | Bin 282 -> 0 bytes .../skins/sz_xe/images/default/bulletD0.gif | Bin 44 -> 0 bytes .../skins/sz_xe/images/default/lineNotice.gif | Bin 139 -> 0 bytes .../skins/sz_xe/images/ico_down.gif | Bin 172 -> 0 bytes .../skins/sz_xe/images/ico_new01.gif | Bin 881 -> 0 bytes .../rss_reader/skins/sz_xe/images/ico_up.gif | Bin 165 -> 0 bytes widgets/rss_reader/skins/sz_xe/images/new.gif | Bin 78 -> 0 bytes .../skins/sz_xe/images/num_realtime1.gif | Bin 64 -> 0 bytes .../skins/sz_xe/images/num_realtime10.gif | Bin 74 -> 0 bytes .../skins/sz_xe/images/num_realtime2.gif | Bin 66 -> 0 bytes .../skins/sz_xe/images/num_realtime3.gif | Bin 66 -> 0 bytes .../skins/sz_xe/images/num_realtime4.gif | Bin 66 -> 0 bytes .../skins/sz_xe/images/num_realtime5.gif | Bin 64 -> 0 bytes .../skins/sz_xe/images/num_realtime6.gif | Bin 67 -> 0 bytes .../skins/sz_xe/images/num_realtime7.gif | Bin 64 -> 0 bytes .../skins/sz_xe/images/num_realtime8.gif | Bin 68 -> 0 bytes .../skins/sz_xe/images/num_realtime9.gif | Bin 69 -> 0 bytes widgets/rss_reader/skins/sz_xe/list.html | 17 --- widgets/rss_reader/skins/sz_xe/skin.xml | 109 ------------------ .../rss_reader/skins/xe_official/list.html | 2 +- widgets/rss_reader/skins/xe_select/list.html | 2 +- 33 files changed, 3 insertions(+), 356 deletions(-) delete mode 100644 widgets/rss_reader/skins/sz_select/css/select.css delete mode 100644 widgets/rss_reader/skins/sz_select/images/black/bulletD0.gif delete mode 100644 widgets/rss_reader/skins/sz_select/images/black/lineNotice.gif delete mode 100644 widgets/rss_reader/skins/sz_select/images/forward.png delete mode 100644 widgets/rss_reader/skins/sz_select/images/new.gif delete mode 100644 widgets/rss_reader/skins/sz_select/images/white/bulletD0.gif delete mode 100644 widgets/rss_reader/skins/sz_select/images/white/lineNotice.gif delete mode 100644 widgets/rss_reader/skins/sz_select/js/tab.js delete mode 100644 widgets/rss_reader/skins/sz_select/list.html delete mode 100644 widgets/rss_reader/skins/sz_select/skin.xml delete mode 100644 widgets/rss_reader/skins/sz_xe/css/default.css delete mode 100644 widgets/rss_reader/skins/sz_xe/images/default/bullet.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/default/bulletD0.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/default/lineNotice.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/ico_down.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/ico_new01.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/ico_up.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/new.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime1.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime10.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime2.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime3.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime4.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime5.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime6.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime7.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime8.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/images/num_realtime9.gif delete mode 100644 widgets/rss_reader/skins/sz_xe/list.html delete mode 100644 widgets/rss_reader/skins/sz_xe/skin.xml diff --git a/widgets/rss_reader/rss_reader.class.php b/widgets/rss_reader/rss_reader.class.php index bdd8f025f..2a9b79231 100644 --- a/widgets/rss_reader/rss_reader.class.php +++ b/widgets/rss_reader/rss_reader.class.php @@ -102,7 +102,7 @@ } $date = $item->pubdate; - $item->date = date($DATE_FORMAT, strtotime($date)); + $item->date = $date ? date($DATE_FORMAT, strtotime($date)) : ''; $array_date[$key] = strtotime($date); $item->description = preg_replace('! ms_height) obj.style.height = ms_height + 'px' - obj.style.overflow = "auto" -} diff --git a/widgets/rss_reader/skins/sz_select/list.html b/widgets/rss_reader/skins/sz_select/list.html deleted file mode 100644 index 2160a7e18..000000000 --- a/widgets/rss_reader/skins/sz_select/list.html +++ /dev/null @@ -1,34 +0,0 @@ - - -{@ $tab_id = mt_rand()} -
        -
        - -

        {$widget_info->title}

        - - - -
        -
        - {@$i=1} - -
        -
        - - {@$i=1} -
        - -
        -
        {$item->date} | {$item->author}
        - {$item->description} -
        - {@$i++} - -
        -
        -
        diff --git a/widgets/rss_reader/skins/sz_select/skin.xml b/widgets/rss_reader/skins/sz_select/skin.xml deleted file mode 100644 index f789dd826..000000000 --- a/widgets/rss_reader/skins/sz_select/skin.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - Simulz 스킨 (Select 메뉴) - Simulz スキン (Select メニュー) - Simulz样式Select菜单型皮肤 - Simulz Skin (Select menu) - Simulz Cuidado de la Piel (menú Selección) - Simulz 下拉式選單面板 - Simulz 스킨입니다. - Simulz スキンです。 - Simulz样式Select菜单型皮肤。 - This is Simulz skin. - Esto es Simulz piel. - Simulz 下拉式選單面板。 - 0.1 - 2007-11-05 - http://www.zeroboard.com - - - Simulz - Simulz - Simulz - Simulz - Simulz - Simulz - - - - - 기본 - デフォルト - 默认 - Default - Default - 預設 - - - 회색 - - 灰色 - Gray - Gray - 灰色 - - - 연두 - 淡绿 - Yellowish Green - Verde amarillento - 淡綠 - - - 분홍 - ピンク - 粉红 - Pink - Pink - 粉紅 - - - 보라 - - 淡青 - Purple - Púrpura - 紫色 - - - 밝은 파랑 - - 浅蓝 - Bright Blue - Bright Blue - 淡藍 - - - 청록 - 青緑 - 青绿 - Bluish Green - Verde azulado - 青綠 - - - 초록 - - 草绿 - Green - Verde - 綠色 - - - 노랑 - - 黄色 - Yellow - Amarillo - 黃色 - - - 파랑 - - 蓝色 - Blue - Azul - 藍色 - - - \ No newline at end of file diff --git a/widgets/rss_reader/skins/sz_xe/css/default.css b/widgets/rss_reader/skins/sz_xe/css/default.css deleted file mode 100644 index b896b731c..000000000 --- a/widgets/rss_reader/skins/sz_xe/css/default.css +++ /dev/null @@ -1,34 +0,0 @@ -.rss_reader_sz_xe { position:relative;} -.rss_reader_sz_xe h2 { margin:0; padding;0; height:21px; padding:9px 0 0 0; font-size:1em;} - -.rss_reader_sz_xe ul { margin:0; padding:0; height:20px; overflow:hidden; list-style:none; white-space:nowrap; } - -.rss_reader_sz_xe ul li { height:20px; overflow:hidden; list-style:none; white-space:nowrap; } - -.rss_reader_sz_xe ul li .title a { color:#555555; font:0.9em Tahoma; text-decoration:none; } -.rss_reader_sz_xe ul li .title a:hover { text-decoration:underline; } - -.rss_reader_sz_xe ul li .date { color:#999999; font:.8em Tahoma; white-space:nowrap; margin-right:5px;} - -.rss_reader_sz_xe .sz_Box_000{ margin:1px; border:solid 0;padding:0;} -.rss_reader_sz_xe .sz_Box_001{ margin:1px; border:solid 1px;border-color:#E7E7E7;padding:5px 5px 2px 5px;background-color:#F4F4F4;color:#696969;} -.rss_reader_sz_xe .sz_Box_002{ margin:1px; border:solid 1px;border-color:#DDEAA8;padding:5px 5px 2px 5px;background-color:#FBFDF1;color:#99B81A;} -.rss_reader_sz_xe .sz_Box_003{ margin:1px; border:solid 1px;border-color:#F9D5D5;padding:5px 5px 2px 5px;background-color:#FEF6F6;color:#D98383;} -.rss_reader_sz_xe .sz_Box_004{ margin:1px; border:solid 1px;border-color:#EFDAF4;padding:5px 5px 2px 5px;background-color:#FCF7FD;color:#AF69C0;} -.rss_reader_sz_xe .sz_Box_005{ margin:1px; border:solid 1px;border-color:#DCDFF6;padding:5px 5px 2px 5px;background-color:#F6F7FE;color:#7381EA;} -.rss_reader_sz_xe .sz_Box_006{ margin:1px; border:solid 1px;border-color:#DAEAEE;padding:5px 5px 2px 5px;background-color:#F0F6F8;color:#619DAC;} -.rss_reader_sz_xe .sz_Box_007{ margin:1px; border:solid 1px;border-color:#D5EDDD;padding:5px 5px 2px 5px;background-color:#EFF9F2;color:#6FB587;} -.rss_reader_sz_xe .sz_Box_008{ margin:1px; border:solid 1px;border-color:#FFEC15;padding:5px 5px 2px 5px;background-color:#FFFCDF;color:#FF9900;} -.rss_reader_sz_xe .sz_Box_009{ margin:1px; border:solid 1px;border-color:#9DD7E8;padding:5px 5px 2px 5px;background-color:#F8FDFF;color:#0A8DBD;} - -.rss_reader_sz_xe .sz_Box_001 h2 a { text-decoration:none; color:#696969;} -.rss_reader_sz_xe .sz_Box_002 h2 a { text-decoration:none; color:#99B81A;} -.rss_reader_sz_xe .sz_Box_003 h2 a { text-decoration:none; color:#D98383;} -.rss_reader_sz_xe .sz_Box_004 h2 a { text-decoration:none; color:#AF69C0;} -.rss_reader_sz_xe .sz_Box_005 h2 a { text-decoration:none; color:#7381EA;} -.rss_reader_sz_xe .sz_Box_006 h2 a { text-decoration:none; color:#619DAC;} -.rss_reader_sz_xe .sz_Box_007 h2 a { text-decoration:none; color:#6FB587;} -.rss_reader_sz_xe .sz_Box_008 h2 a { text-decoration:none; color:#FF9900;} -.rss_reader_sz_xe .sz_Box_009 h2 a { text-decoration:none; color:#0A8DBD;} - -.rss_reader_sz_xe h2 a:hover { text-decoration:underline;} diff --git a/widgets/rss_reader/skins/sz_xe/images/default/bullet.gif b/widgets/rss_reader/skins/sz_xe/images/default/bullet.gif deleted file mode 100644 index 5a7b983073154cefd1934075bd069af95596a1ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmZ?wbhEHb6krfwxT?%hf9e0ki(l)Hzux)i_k;^y>vx{5KmDop9_w+zx=K{{-fZ~*NTHr8ZQ0STK7q7?&Y?#pLaa`tu_64{jLjnhrXsC_)>rLnbxL1 z^=H3nZTwYp;@#6Pf1ZB$yz$;It=VT+-v06b|9=J=0L7myj0_CQ3_2jQL4IOjGe0n~ zz(Yr>|HP7_lQwz`Qb&(1W^rI!(Clz>p@|-2r;$=of|}^kh0YE(I$mySQ#5L3{n%5t Jo`;FS8UPjPY2p9? diff --git a/widgets/rss_reader/skins/sz_xe/images/default/bulletD0.gif b/widgets/rss_reader/skins/sz_xe/images/default/bulletD0.gif deleted file mode 100644 index e8e17d4c63d93ac478a0a54a3abc39ad94eed969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 tcmZ?wbhEHbWM*JyXkcKtaNz<21B2pE79h#MpaUX6G7L=2E%mGn)&RoU2R8r! diff --git a/widgets/rss_reader/skins/sz_xe/images/default/lineNotice.gif b/widgets/rss_reader/skins/sz_xe/images/default/lineNotice.gif deleted file mode 100644 index dbf2c8220a7eb9d2b007167e9e0efe70cec5b33c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmV;60CfLHNk%w1VF(8T0DuAj{x%eRe0(AP6+?1mVRU6=Aa`kWXdqN*WgtgMO;7+V z000002nPZH00L2jkEzS;52Ku++KaQ^y!#J^;z*X}iKgnxw(bkZ@=VwEjpzE#_x=wI t3Wvm^@rX<+mrU2>35`mpl&1BH&1$#YuJ;QLi^t@$`HW7h*KAJ#06We2KUn|( diff --git a/widgets/rss_reader/skins/sz_xe/images/ico_down.gif b/widgets/rss_reader/skins/sz_xe/images/ico_down.gif deleted file mode 100644 index 881fd75f5c86f6d0b7fb03cb58ae6385e6170de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmV;d08{@*Nk%w1VFv&T0K^{v8-BlAyx&){-yVIx9Dcncg~lz8#Y?KzFO0_`gu_Fj z)M>`&Ub^2mn9pm(itRI%J>#pYMC-e0`l zFOAAAjmIT~#Q*>QA^8LW0018VEC2ui00#gH000Fk;P+*VBZ^zVoFAqMtaLzZR4MG# aP-4efoDRb9Nq7nu&*=deus(!S2mm`!uubm( diff --git a/widgets/rss_reader/skins/sz_xe/images/ico_new01.gif b/widgets/rss_reader/skins/sz_xe/images/ico_new01.gif deleted file mode 100644 index aa3ea60692c851df320bcc91c16b3bb01196fd27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 881 zcmZ?wbhEHb6k%Xx_%6!;1pk5H@4x>*`0xLp|3Lcx-~a#qfQ0@+nNbY?qZ$51GyIKZ z_!G_WCkDu6{2#;kFN*PR4C9|z#{bbw|6`c{M>716V*DS;^zYw4kh!B^Gz12H2q^w! zVPs&CWzYe+6qF|zIQ$sYOC&T54z)H5SsA?euzQ9wc^#G~+m1Fx)B$pM24jR#ug x)eSZjEOc(>Q(C%p_{`q-E7{oulnQxpGv`S3cA>vbjX%TVUm z#XPT4*k8r7y~^Z#8O8el|9=KjfZ|UUMg|4}1|5(lkev*yN(wBpM-;mb2+V1FBo*-S b%w`3%ADo7J-u>;+N_X@=U$Rbs`M4V+gEauPyBa9~ diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime1.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime1.gif deleted file mode 100644 index cbc8d4035a7459c4455cdd0b6348f6a3facaa247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbhEHbc?HFvEDRu^10p~&3{2uKeU;1JzGrAII>t5e%;|k+ O8)u%F8qX=hU=09Jc@(Dr diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime10.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime10.gif deleted file mode 100644 index 981f6c7d3ed9521277865badd1e8bb8dabe8263c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmZ?wbhEHbc?HFvEDRu^10p~&3`~kHeU;1J&S#h$bTPp2vT6Di Y-`hzQi`$kZXhuC^KYHOM11p0y04jhOkN^Mx diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime2.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime2.gif deleted file mode 100644 index 00df118e1a1c3c71f8cc1cfba52aa102feed78c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHbc?HFvEDRu^10p~&3`~+PeU;1J-fu|p)8o?JWBsBh PG|{B?uH;+?Mh0sDU||z$ diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime3.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime3.gif deleted file mode 100644 index ee4932c9b3a730d58c338507f6fb789a127a3d22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHbc?HFvEDRu^10p~&3`~+PeU;1J-fu|p)8op$_Mt4^ PFvg@dt=-mvk--`OW1JI7 diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime4.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime4.gif deleted file mode 100644 index ef6bb556e3895ffaae17160165e89a12d1513d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHbc?HFvEDRu^10p~&3`~+PeU;1J{%2?|+La}}%fla(`~7#XYqW!)3r diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime5.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime5.gif deleted file mode 100644 index add03282a176f80779e9830805e07aa0326407af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbhEHbc?HFvEDRu^10p~&3{2uKeU;1J-fx&P;ZVZ+Gqb*? O7oIAcx-49j!5RQ#L>2o0 diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime6.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime6.gif deleted file mode 100644 index 3521fad3c9239158111a228a4b4993b6c420400d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67 zcmZ?wbhEHbc?HFvEDRu^10p~&3`|lkeU;1J-fu|p(_5vpM>tE? QFhMQp$&RJ{k)jON0CcYu5&!@I diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime7.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime7.gif deleted file mode 100644 index cd2efb09b8daf80cf7d9268ac64ab03dd9ab6da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmZ?wbhEHbc?HFvEDRu^10p~&3{2uKeU;1Ju5XxAuu&`f#4P9k Ou?yWMJz^GNum%846BI!J diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime8.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime8.gif deleted file mode 100644 index cb6eb5cc15c8a716deff6e4fd8727c24202ba247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmZ?wbhEHbc?HFvEDRu^10p~&3{284eU;1J-fu|p(_58uq15SY Ss?Usu86Hlrw&$@jSOWl{FctX# diff --git a/widgets/rss_reader/skins/sz_xe/images/num_realtime9.gif b/widgets/rss_reader/skins/sz_xe/images/num_realtime9.gif deleted file mode 100644 index 8f66339eb5ec2297b47b75b9a4ae706b5fd9f4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69 zcmZ?wbhEHbc?HFvEDRu^10p~&3`{aEeU;1J-fu|p(_58uVd6(S T#}m^tQY5=pb=f*FGFSruxpfuz diff --git a/widgets/rss_reader/skins/sz_xe/list.html b/widgets/rss_reader/skins/sz_xe/list.html deleted file mode 100644 index 0404d3b52..000000000 --- a/widgets/rss_reader/skins/sz_xe/list.html +++ /dev/null @@ -1,17 +0,0 @@ - - -
        -
        - -

        {$widget_info->title}

        - - -
        -
        diff --git a/widgets/rss_reader/skins/sz_xe/skin.xml b/widgets/rss_reader/skins/sz_xe/skin.xml deleted file mode 100644 index 087f1a460..000000000 --- a/widgets/rss_reader/skins/sz_xe/skin.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - Simulz 스킨 (목록형) - Simulz スキン (リストスタイル) - Simulz样式目录型皮肤 - Simulz Skin (List Style) - Simulz Cuidado de la Piel (Lista Estilo) - Simulz 面板(列表樣式) - Simulz 스킨입니다. - Simulz スキンです。 - Simulz样式目录型皮肤。 - This is Simulz skin. - Esto es Simulz piel. - Simulz 面板 - 0.1 - 2007-10-26 - http://www.zeroboard.com - - - Simulz - Simulz - Simulz - Simulz - Simulz - Simulz - - - - - 기본 - デフォルト - 默认 - Default - Default - 預設 - - - 회색 - - 灰色 - Gray - Gray - 灰色 - - - 연두 - 淡绿 - Yellowish Green - Verde amarillento - 淡綠 - - - 분홍 - ピンク - 粉红 - Pink - Pink - 粉紅 - - - 보라 - - 淡青 - Purple - Púrpura - 紫色 - - - 밝은 파랑 - - 浅蓝 - Bright Blue - Bright Blue - 淺藍 - - - 청록 - 青緑 - 青绿 - Bluish Green - Verde azulado - 青綠 - - - 초록 - - 草绿 - Green - Verde - 綠色 - - - 노랑 - - 黄色 - Yellow - Amarillo - 黃色 - - - 파랑 - - 蓝色 - Blue - Azul - 藍色 - - - \ No newline at end of file diff --git a/widgets/rss_reader/skins/xe_official/list.html b/widgets/rss_reader/skins/xe_official/list.html index 381240b0e..00fddc08e 100644 --- a/widgets/rss_reader/skins/xe_official/list.html +++ b/widgets/rss_reader/skins/xe_official/list.html @@ -12,7 +12,7 @@
        • - {$item->date} + {$item->date} {htmlspecialchars(cut_str($item->title, $widget_info->subject_cut_size))}
        • diff --git a/widgets/rss_reader/skins/xe_select/list.html b/widgets/rss_reader/skins/xe_select/list.html index 78b1f5225..189cc2324 100644 --- a/widgets/rss_reader/skins/xe_select/list.html +++ b/widgets/rss_reader/skins/xe_select/list.html @@ -23,7 +23,7 @@
          -
          {$item->date} | {$item->author}
          +
          {$item->date} | {$item->author}
          {$item->description}
          {@$i++} From d5d2220df41ae22e4b0ff01cbc02b9383e31bf95 Mon Sep 17 00:00:00 2001 From: k10206 Date: Thu, 2 Apr 2009 05:37:41 +0000 Subject: [PATCH 149/202] =?UTF-8?q?rss=5Freader=20=EC=9C=84=EC=A0=AF=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0?= =?UTF-8?q?=EB=A1=9C=20title=20=EC=86=8D=EC=84=B1=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6014 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/rss_reader/skins/xe_official/list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/rss_reader/skins/xe_official/list.html b/widgets/rss_reader/skins/xe_official/list.html index 00fddc08e..3ef586075 100644 --- a/widgets/rss_reader/skins/xe_official/list.html +++ b/widgets/rss_reader/skins/xe_official/list.html @@ -11,7 +11,7 @@
            -
          • +
          • {$item->date} {htmlspecialchars(cut_str($item->title, $widget_info->subject_cut_size))}
          • From 658bafbd46cbeddd6ed59810a81903d9364ccc4c Mon Sep 17 00:00:00 2001 From: zero Date: Thu, 2 Apr 2009 08:36:55 +0000 Subject: [PATCH 150/202] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=EA=B0=80=20=EB=B6=84=EB=A5=98=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80/=EC=82=AD=EC=A0=9C/=EC=9D=B4=EB=8F=99/?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=95=98=EC=A7=80=20=EB=AA=BB=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B6=8C=ED=95=9C=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6015 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/conf/module.xml | 19 +- .../document/document.admin.controller.php | 171 +--------------- modules/document/document.admin.model.php | 61 ------ modules/document/document.controller.php | 185 ++++++++++++++++++ modules/document/document.model.php | 62 ++++++ .../document/tpl/filter/delete_category.xml | 2 +- .../document/tpl/filter/insert_category.xml | 2 +- modules/document/tpl/filter/move_category.xml | 2 +- modules/document/tpl/js/document_admin.js | 2 +- modules/document/tpl/js/document_category.js | 10 +- 10 files changed, 270 insertions(+), 246 deletions(-) diff --git a/modules/document/conf/module.xml b/modules/document/conf/module.xml index e3193eae3..072a861aa 100644 --- a/modules/document/conf/module.xml +++ b/modules/document/conf/module.xml @@ -4,8 +4,14 @@ + + + + + + @@ -28,16 +34,17 @@ - + + + + + + - - - - - + diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 4bf6f5356..e964ff1ac 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -380,179 +380,10 @@ $this->setMessage('success_deleted'); } - /** - * @brief 카테고리 추가 - **/ - function procDocumentAdminInsertCategory($args = null) { - // 입력할 변수 정리 - if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','title','expand','group_srls','color'); - - if($args->expand !="Y") $args->expand = "N"; - $args->group_srls = str_replace('|@|',',',$args->group_srls); - $args->parent_srl = (int)$args->parent_srl; - - $oDocumentController = &getController('document'); - $oDocumentModel = &getModel('document'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 이미 존재하는지를 확인 - if($args->category_srl) { - $category_info = $oDocumentModel->getCategory($args->category_srl); - if($category_info->category_srl != $args->category_srl) $args->category_srl = null; - } - - // 존재하게 되면 update를 해준다 - if($args->category_srl) { - $output = $oDocumentController->updateCategory($args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 존재하지 않으면 insert를 해준다 - } else { - $output = $oDocumentController->insertCategory($args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - - // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $oDocumentController->makeCategoryFile($args->module_srl); - - $oDB->commit(); - - $this->add('xml_file', $xml_file); - $this->add('module_srl', $args->module_srl); - $this->add('category_srl', $args->category_srl); - $this->add('parent_srl', $args->parent_srl); - } - - - /** - * @brief 카테고리 삭제 - **/ - function procDocumentAdminDeleteCategory() { - // 변수 정리 - $args = Context::gets('module_srl','category_srl'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $oDocumentModel = &getModel('document'); - - // 원정보를 가져옴 - $category_info = $oDocumentModel->getCategory($args->category_srl); - if($category_info->parent_srl) $parent_srl = $category_info->parent_srl; - - // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 - if($oDocumentModel->getCategoryChlidCount($args->category_srl)) return new Object(-1, 'msg_cannot_delete_for_child'); - - // DB에서 삭제 - $oDocumentController = &getController('document'); - $output = $oDocumentController->deleteCategory($args->category_srl); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $oDocumentController->makeCategoryFile($args->module_srl); - - $oDB->commit(); - - $this->add('xml_file', $xml_file); - $this->add('category_srl', $parent_srl); - $this->setMessage('success_deleted'); - } - - function procDocumentAdminMoveCategory() { - $source_category_srl = Context::get('source_srl'); - - // parent_srl 이 있으면 첫 자식으로 들어간다 - $parent_category_srl = Context::get('parent_srl'); - - // target_srl 이 있으면 target_srl 아래로 형제로 들어간다 - $target_category_srl = Context::get('target_srl'); - - $oDocumentModel = &getModel('document'); - $oDocumentController = &getController('document'); - $source_category = $oDocumentModel->getCategory($source_category_srl); - - - //parent_category_srl 의 첫 자식으로 넣자 - if($parent_category_srl > 0 || ($parent_category_srl == 0 && $target_category_srl == 0)){ - $parent_category = $oDocumentModel->getCategory($parent_category_srl); - - $args->module_srl = $source_category->module_srl; - $args->parent_srl = $parent_category_srl; - $output = executeQuery('document.getChildCategoryMinListOrder', $args); - - if(!$output->toBool()) return $output; - $args->list_order = (int)$output->data->list_order; - if(!$args->list_order) $args->list_order = 0; - $args->list_order--; - - - $source_args->category_srl = $source_category_srl; - $source_args->parent_srl = $parent_category_srl; - $source_args->list_order = $args->list_order; - $output = $oDocumentController->updateCategory($source_args); - if(!$output->toBool()) return $output; - - - // $target_category_srl의 아래동생으로 - }else if($target_category_srl > 0){ - $target_category = $oDocumentModel->getCategory($target_category_srl); - - //$target_category의 아래 동생을 모두 내린다 - $output = $oDocumentController->updateCategoryListOrder($target_category->module_srl, $target_category->list_order+1); - if(!$output->toBool()) return $output; - - - $source_args->category_srl = $source_category_srl; - $source_args->parent_srl = $target_category->parent_srl; - $source_args->list_order = $target_category->list_order+1; - $output = $oDocumentController->updateCategory($source_args); - if(!$output->toBool()) return $output; - - } - - - // xml파일 재생성 - $xml_file = $oDocumentController->makeCategoryFile($source_category->module_srl); - - // return 변수 설정 - $this->add('xml_file', $xml_file); - $this->add('source_category_srl', $source_category_srl); - - } - - /** - * @brief xml 파일을 갱신 - * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n - * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n - * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 - **/ - function procDocumentAdminMakeXmlFile() { - // 입력값을 체크 - $module_srl = Context::get('module_srl'); - - // xml파일 재생성 - $oDocumentController = &getController('document'); - $xml_file = $oDocumentController->makeCategoryFile($module_srl); - - // return 값 설정 - $this->add('xml_file',$xml_file); - } - /** * @brief 확장변수 순서 조절 **/ - function procAdminMoveExtraVar() { + function procDocumentAdminMoveExtraVar() { $type = Context::get('type'); $module_srl = Context::get('module_srl'); $var_idx = Context::get('var_idx'); diff --git a/modules/document/document.admin.model.php b/modules/document/document.admin.model.php index 3bb3e9e84..f7505f152 100644 --- a/modules/document/document.admin.model.php +++ b/modules/document/document.admin.model.php @@ -14,67 +14,6 @@ function init() { } - /** - * @brief 특정 카테고리의 정보를 이용하여 템플릿을 구한후 return - * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return - **/ - function getDocumentAdminCategoryTplInfo() { - // 해당 메뉴의 정보를 가져오기 위한 변수 설정 - $module_srl = Context::get('module_srl'); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - - $category_srl = Context::get('category_srl'); - $parent_srl = Context::get('parent_srl'); - - // 회원 그룹의 목록을 가져옴 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups($module_info->site_srl); - Context::set('group_list', $group_list); - - $oDocumentModel = &getModel('document'); - - // parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임 - if(!$category_srl && $parent_srl) { - // 상위 메뉴의 정보를 가져옴 - $parent_info = $oDocumentModel->getCategory($parent_srl); - - // 추가하려는 메뉴의 기본 변수 설정 - $category_info->category_srl = getNextSequence(); - $category_info->parent_srl = $parent_srl; - $category_info->parent_category_title = $parent_info->title; - - // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 - } else { - // category_srl 이 있으면 해당 메뉴의 정보를 가져온다 - if($category_srl) $category_info = $oDocumentModel->getCategory($category_srl); - - // 찾아진 값이 없다면 신규 메뉴 추가로 보고 category_srl값만 구해줌 - if(!$category_info->category_srl) { - $category_info->category_srl = getNextSequence(); - } - } - - - $category_info->title = htmlspecialchars($category_info->title); - Context::set('category_info', $category_info); - - // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile('./modules/document/tpl', 'category_info'); - $tpl = str_replace("\n",'',$tpl); - - // 사용자 정의 언어 변경 - $oModuleController = &getController('module'); - $oModuleController->replaceDefinedLangCode($tpl); - - - - // return 할 변수 설정 - $this->add('tpl', $tpl); - } - /** * @brief 휴지통에 존재하는 문서 목록을 가져옴 **/ diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 4dbb751d1..d2da9bd66 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1018,6 +1018,191 @@ Context::addHtmlHeader($js_code); } + /** + * @brief 카테고리 추가 + **/ + function procDocumentInsertCategory($args = null) { + // 입력할 변수 정리 + if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','title','expand','group_srls','color'); + + // 권한 체크 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + if($args->expand !="Y") $args->expand = "N"; + $args->group_srls = str_replace('|@|',',',$args->group_srls); + $args->parent_srl = (int)$args->parent_srl; + + $oDocumentModel = &getModel('document'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 이미 존재하는지를 확인 + if($args->category_srl) { + $category_info = $oDocumentModel->getCategory($args->category_srl); + if($category_info->category_srl != $args->category_srl) $args->category_srl = null; + } + + // 존재하게 되면 update를 해준다 + if($args->category_srl) { + $output = $this->updateCategory($args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 존재하지 않으면 insert를 해준다 + } else { + $output = $this->insertCategory($args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeCategoryFile($args->module_srl); + + $oDB->commit(); + + $this->add('xml_file', $xml_file); + $this->add('module_srl', $args->module_srl); + $this->add('category_srl', $args->category_srl); + $this->add('parent_srl', $args->parent_srl); + } + + + function procDocumentMoveCategory() { + $source_category_srl = Context::get('source_srl'); + + // parent_srl 이 있으면 첫 자식으로 들어간다 + $parent_category_srl = Context::get('parent_srl'); + + // target_srl 이 있으면 target_srl 아래로 형제로 들어간다 + $target_category_srl = Context::get('target_srl'); + + $oDocumentModel = &getModel('document'); + $source_category = $oDocumentModel->getCategory($source_category_srl); + + // 권한 체크 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($source_category->module_srl); + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + //parent_category_srl 의 첫 자식으로 넣자 + if($parent_category_srl > 0 || ($parent_category_srl == 0 && $target_category_srl == 0)){ + $parent_category = $oDocumentModel->getCategory($parent_category_srl); + + $args->module_srl = $source_category->module_srl; + $args->parent_srl = $parent_category_srl; + $output = executeQuery('document.getChildCategoryMinListOrder', $args); + + if(!$output->toBool()) return $output; + $args->list_order = (int)$output->data->list_order; + if(!$args->list_order) $args->list_order = 0; + $args->list_order--; + + + $source_args->category_srl = $source_category_srl; + $source_args->parent_srl = $parent_category_srl; + $source_args->list_order = $args->list_order; + $output = $this->updateCategory($source_args); + if(!$output->toBool()) return $output; + + + // $target_category_srl의 아래동생으로 + }else if($target_category_srl > 0){ + $target_category = $oDocumentModel->getCategory($target_category_srl); + + //$target_category의 아래 동생을 모두 내린다 + $output = $this->updateCategoryListOrder($target_category->module_srl, $target_category->list_order+1); + if(!$output->toBool()) return $output; + + + $source_args->category_srl = $source_category_srl; + $source_args->parent_srl = $target_category->parent_srl; + $source_args->list_order = $target_category->list_order+1; + $output = $this->updateCategory($source_args); + if(!$output->toBool()) return $output; + } + + // xml파일 재생성 + $xml_file = $this->makeCategoryFile($source_category->module_srl); + + // return 변수 설정 + $this->add('xml_file', $xml_file); + $this->add('source_category_srl', $source_category_srl); + + } + + /** + * @brief 카테고리 삭제 + **/ + function procDocumentDeleteCategory() { + // 변수 정리 + $args = Context::gets('module_srl','category_srl'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 권한 체크 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + $oDocumentModel = &getModel('document'); + + // 원정보를 가져옴 + $category_info = $oDocumentModel->getCategory($args->category_srl); + if($category_info->parent_srl) $parent_srl = $category_info->parent_srl; + + // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 + if($oDocumentModel->getCategoryChlidCount($args->category_srl)) return new Object(-1, 'msg_cannot_delete_for_child'); + + // DB에서 삭제 + $output = $this->deleteCategory($args->category_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeCategoryFile($args->module_srl); + + $oDB->commit(); + + $this->add('xml_file', $xml_file); + $this->add('category_srl', $parent_srl); + $this->setMessage('success_deleted'); + } + + /** + * @brief xml 파일을 갱신 + * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n + * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n + * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 + **/ + function procDocumentMakeXmlFile() { + // 입력값을 체크 + $module_srl = Context::get('module_srl'); + + // 권한 체크 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + $xml_file = $this->makeCategoryFile($module_srl); + + // return 값 설정 + $this->add('xml_file',$xml_file); + } + /** * @brief 카테고리를 캐시 파일로 저장 **/ diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 0f565d8ec..6567fdb59 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -852,6 +852,68 @@ return $oTemplate->compile($this->module_path.'tpl', 'category_list'); } + /** + * @brief 특정 카테고리의 정보를 이용하여 템플릿을 구한후 return + * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return + **/ + function getDocumentCategoryTplInfo() { + $oModuleModel = &getModel('module'); + $oMemberModel = &getModel('member'); + + // 해당 메뉴의 정보를 가져오기 위한 변수 설정 + $module_srl = Context::get('module_srl'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + // 권한 체크 + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + $category_srl = Context::get('category_srl'); + $parent_srl = Context::get('parent_srl'); + + // 회원 그룹의 목록을 가져옴 + $group_list = $oMemberModel->getGroups($module_info->site_srl); + Context::set('group_list', $group_list); + + // parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임 + if(!$category_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $this->getCategory($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 + $category_info->category_srl = getNextSequence(); + $category_info->parent_srl = $parent_srl; + $category_info->parent_category_title = $parent_info->title; + + // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 + } else { + // category_srl 이 있으면 해당 메뉴의 정보를 가져온다 + if($category_srl) $category_info = $this->getCategory($category_srl); + + // 찾아진 값이 없다면 신규 메뉴 추가로 보고 category_srl값만 구해줌 + if(!$category_info->category_srl) { + $category_info->category_srl = getNextSequence(); + } + } + + + $category_info->title = htmlspecialchars($category_info->title); + Context::set('category_info', $category_info); + + // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile('./modules/document/tpl', 'category_info'); + $tpl = str_replace("\n",'',$tpl); + + // 사용자 정의 언어 변경 + $oModuleController = &getController('module'); + $oModuleController->replaceDefinedLangCode($tpl); + + // return 할 변수 설정 + $this->add('tpl', $tpl); + } + + function getDocumentSrlByAlias($mid, $alias) { if(!$mid || !$alias) return null; diff --git a/modules/document/tpl/filter/delete_category.xml b/modules/document/tpl/filter/delete_category.xml index 7b942667c..f098c8e15 100644 --- a/modules/document/tpl/filter/delete_category.xml +++ b/modules/document/tpl/filter/delete_category.xml @@ -1,4 +1,4 @@ - + diff --git a/modules/document/tpl/filter/insert_category.xml b/modules/document/tpl/filter/insert_category.xml index 331038028..70f928a91 100644 --- a/modules/document/tpl/filter/insert_category.xml +++ b/modules/document/tpl/filter/insert_category.xml @@ -1,4 +1,4 @@ - +
            diff --git a/modules/document/tpl/filter/move_category.xml b/modules/document/tpl/filter/move_category.xml index 322299eeb..b94c575cc 100644 --- a/modules/document/tpl/filter/move_category.xml +++ b/modules/document/tpl/filter/move_category.xml @@ -1,4 +1,4 @@ - + diff --git a/modules/document/tpl/js/document_admin.js b/modules/document/tpl/js/document_admin.js index 1b26f5383..5660a6c27 100644 --- a/modules/document/tpl/js/document_admin.js +++ b/modules/document/tpl/js/document_admin.js @@ -142,7 +142,7 @@ function moveVar(type, module_srl, var_idx) { params['module_srl'] = module_srl; params['var_idx'] = var_idx; var response_tags = new Array('error','message'); - exec_xml('document','procAdminMoveExtraVar', params, function() { location.reload(); }); + exec_xml('document','procDocumentAdminMoveExtraVar', params, function() { location.reload(); }); } function completeRestoreTrash(ret_obj) { diff --git a/modules/document/tpl/js/document_category.js b/modules/document/tpl/js/document_category.js index 87e9527b1..c2e72f443 100644 --- a/modules/document/tpl/js/document_category.js +++ b/modules/document/tpl/js/document_category.js @@ -88,7 +88,7 @@ function Tree(url){ parent_srl = 0; } - jQuery.exec_json("board.procDocumentAdminMoveCategory",{ "module_srl":module_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl}, + jQuery.exec_json("board.procDocumentMoveCategory",{ "module_srl":module_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl}, function(data){ jQuery('#category_info').html(''); if(data.error > 0) Tree(xml_url); @@ -126,7 +126,7 @@ function addNode(node,e){ ,"module_srl":jQuery("#fo_category [name=module_srl]").val() }; - jQuery.exec_json('document.getDocumentAdminCategoryTplInfo', params, function(data){ + jQuery.exec_json('document.getDocumentCategoryTplInfo', params, function(data){ jQuery('#category_info').html(data.tpl).css('left',e.pageX).css('top',e.pageY); }); } @@ -138,7 +138,7 @@ function modifyNode(node,e){ ,"module_srl":jQuery("#fo_category [name=module_srl]").val() }; - jQuery.exec_json('document.getDocumentAdminCategoryTplInfo', params, function(data){ + jQuery.exec_json('document.getDocumentCategoryTplInfo', params, function(data){ jQuery('#category_info').html(data.tpl).css('left',e.pageX).css('top',e.pageY); }); } @@ -159,7 +159,7 @@ function deleteNode(node){ ,"module_srl":jQuery("#fo_category [name=module_srl]").val() }; - jQuery.exec_json('document.procDocumentAdminDeleteCategory', params, function(data){ + jQuery.exec_json('document.procDocumentDeleteCategory', params, function(data){ if(data.error==0) Tree(xml_url); }); } @@ -182,7 +182,7 @@ function doReloadTreeCategory(module_srl) { // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. var response_tags = new Array('error','message', 'xml_file'); - exec_xml('document', 'procDocumentAdminMakeXmlFile', params, completeInsertCategory, response_tags, params); + exec_xml('document', 'procDocumentMakeXmlFile', params, completeInsertCategory, response_tags, params); } function doCategoryFormMove() { From ba863dc17e39b3e73ba08e0b37394feae76666f2 Mon Sep 17 00:00:00 2001 From: ngleader Date: Fri, 3 Apr 2009 02:06:40 +0000 Subject: [PATCH 151/202] =?UTF-8?q?XpressEditor=20=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20lang=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6016 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/editor.model.php | 6 +++ modules/editor/lang/en.lang.php | 39 +++++++++++++++++ modules/editor/lang/es.lang.php | 39 +++++++++++++++++ modules/editor/lang/fr.lang.php | 39 +++++++++++++++++ modules/editor/lang/jp.lang.php | 39 +++++++++++++++++ modules/editor/lang/ko.lang.php | 70 +++++++++++++++++++++++------- modules/editor/lang/ru.lang.php | 40 ++++++++++++++++- modules/editor/lang/zh-CN.lang.php | 39 +++++++++++++++++ modules/editor/lang/zh-TW.lang.php | 41 ++++++++++++++++- modules/editor/tpl/js/uploader.js | 19 +++++--- 10 files changed, 346 insertions(+), 25 deletions(-) diff --git a/modules/editor/editor.model.php b/modules/editor/editor.model.php index 72b665bfa..d197db67c 100644 --- a/modules/editor/editor.model.php +++ b/modules/editor/editor.model.php @@ -88,6 +88,10 @@ // 스킨 설정 $skin = $option->skin; if(!$skin) $skin = 'default'; + + // xpresseditor룰 위한 셋팅 + //if($skin=='default') $skin = 'xpresseditor'; + $colorset = $option->colorset; Context::set('colorset', $colorset); Context::set('skin', $skin); @@ -188,6 +192,8 @@ $tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin); $tpl_file = 'editor.html'; + + if(!file_exists($tpl_path.$tpl_file)) { $skin = 'default'; $tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin); diff --git a/modules/editor/lang/en.lang.php b/modules/editor/lang/en.lang.php index c678a8fc9..a62e41234 100644 --- a/modules/editor/lang/en.lang.php +++ b/modules/editor/lang/en.lang.php @@ -158,4 +158,43 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + + ?> diff --git a/modules/editor/lang/es.lang.php b/modules/editor/lang/es.lang.php index 1dd6eb641..edb980ba6 100644 --- a/modules/editor/lang/es.lang.php +++ b/modules/editor/lang/es.lang.php @@ -154,4 +154,43 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + + ?> diff --git a/modules/editor/lang/fr.lang.php b/modules/editor/lang/fr.lang.php index 586d3c657..eb5961e60 100644 --- a/modules/editor/lang/fr.lang.php +++ b/modules/editor/lang/fr.lang.php @@ -158,4 +158,43 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + + ?> diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php index f9e7c1187..d146381fb 100644 --- a/modules/editor/lang/jp.lang.php +++ b/modules/editor/lang/jp.lang.php @@ -161,4 +161,43 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + + ?> diff --git a/modules/editor/lang/ko.lang.php b/modules/editor/lang/ko.lang.php index 9fc16284f..2b5d40dba 100644 --- a/modules/editor/lang/ko.lang.php +++ b/modules/editor/lang/ko.lang.php @@ -145,19 +145,57 @@ $lang->edit->extension ='확장 컴포넌트'; $lang->edit->help = '도움말'; $lang->edit->help_command = '단축키 안내'; - - $lang->edit->lineheight = '줄간격'; - $lang->edit->fontbgsampletext = '가나다'; - - $lang->edit->hyperlink = '하이퍼링크'; - $lang->edit->target_blank = '새창으로'; - - $lang->edit->quotestyle1 = '왼쪽 실선'; - $lang->edit->quotestyle2 = '인용 부호'; - $lang->edit->quotestyle3 = '실선'; - $lang->edit->quotestyle4 = '실선 + 배경'; - $lang->edit->quotestyle5 = '굵은 실선'; - $lang->edit->quotestyle6 = '점선'; - $lang->edit->quotestyle7 = '점선 + 배경'; - $lang->edit->quotestyle8 = '적용 취소'; -?> + + $lang->edit->lineheight = '줄간격'; + $lang->edit->fontbgsampletext = '가나다'; + + $lang->edit->hyperlink = '하이퍼링크'; + $lang->edit->target_blank = '새창으로'; + + $lang->edit->quotestyle1 = '왼쪽 실선'; + $lang->edit->quotestyle2 = '인용 부호'; + $lang->edit->quotestyle3 = '실선'; + $lang->edit->quotestyle4 = '실선 + 배경'; + $lang->edit->quotestyle5 = '굵은 실선'; + $lang->edit->quotestyle6 = '점선'; + $lang->edit->quotestyle7 = '점선 + 배경'; + $lang->edit->quotestyle8 = '적용 취소'; + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + +?> \ No newline at end of file diff --git a/modules/editor/lang/ru.lang.php b/modules/editor/lang/ru.lang.php index f1da838cb..ab217e620 100644 --- a/modules/editor/lang/ru.lang.php +++ b/modules/editor/lang/ru.lang.php @@ -154,4 +154,42 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; -?> + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + +?> \ No newline at end of file diff --git a/modules/editor/lang/zh-CN.lang.php b/modules/editor/lang/zh-CN.lang.php index 3cbc70416..12f82c2ed 100644 --- a/modules/editor/lang/zh-CN.lang.php +++ b/modules/editor/lang/zh-CN.lang.php @@ -160,4 +160,43 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + + ?> diff --git a/modules/editor/lang/zh-TW.lang.php b/modules/editor/lang/zh-TW.lang.php index 44011e26e..cb5e9364b 100644 --- a/modules/editor/lang/zh-TW.lang.php +++ b/modules/editor/lang/zh-TW.lang.php @@ -161,4 +161,43 @@ $lang->edit->quotestyle6 = '점선'; $lang->edit->quotestyle7 = '점선 + 배경'; $lang->edit->quotestyle8 = '적용 취소'; -?> + + + $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; + $lang->edit->set_sel = '칸 수 지정'; + $lang->edit->row = '행'; + $lang->edit->col = '열'; + $lang->edit->add_one_row = '1행추가'; + $lang->edit->del_one_row = '1행삭제'; + $lang->edit->add_one_col = '1열추가'; + $lang->edit->del_one_col = '1열삭제'; + + $lang->edit->table_config = '표 속성 지정'; + $lang->edit->border_width = '테두리 굵기'; + $lang->edit->border_color = '테두리 색'; + $lang->edit->add = '더하기'; + $lang->edit->del = '빼기'; + $lang->edit->search_color = '색상찾기'; + $lang->edit->table_backgroundcolor = '표 배경색'; + $lang->edit->special_character = '특수문자'; + $lang->edit->insert_special_character = '특수문자 삽입'; + $lang->edit->close_special_character = '특수문자 레이어 닫기'; + $lang->edit->symbol = '일반기호'; + $lang->edit->number_unit = '숫자와 단위'; + $lang->edit->circle_bracket = '원,괄호'; + $lang->edit->korean = '한글'; + $lang->edit->greece = '그리스'; + $lang->edit->Latin = '라틴어'; + $lang->edit->japan = '일본어'; + $lang->edit->selected_symbol = '선택한 기호'; + + $lang->edit->search_replace = '찾기/바꾸기'; + $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; + $lang->edit->replace_all = '모두바꾸기'; + $lang->edit->search_words = '찾을단어'; + $lang->edit->replace_words = '바꿀단어'; + $lang->edit->next_search_words = '다음찾기'; + $lang->edit->edit_height_control = '입력창 크기 조절'; + + +?> \ No newline at end of file diff --git a/modules/editor/tpl/js/uploader.js b/modules/editor/tpl/js/uploader.js index fa0acc9f4..862760858 100755 --- a/modules/editor/tpl/js/uploader.js +++ b/modules/editor/tpl/js/uploader.js @@ -395,14 +395,19 @@ function insertUploadedFile(editorSequence) { } - // html 모드 - if(editorMode[editorSequence]=='html'){ - if(text.length>0) xGetElementById('editor_textarea_'+editorSequence).value += text.join(''); - // 위지윅 모드 + if(jQuery.isFunction(editorRelKeys[editorSequence]['pasteHTML'])){ + editorRelKeys[editorSequence]['pasteHTML'](text.join('')); }else{ - var iframe_obj = editorGetIFrame(editorSequence); - if(!iframe_obj) return; - if(text.length>0) editorReplaceHTML(iframe_obj, text.join('')); + // html 모드 + if(editorMode[editorSequence]=='html'){ + if(text.length>0) xGetElementById('editor_textarea_'+editorSequence).value += text.join(''); + + // 위지윅 모드 + }else{ + var iframe_obj = editorGetIFrame(editorSequence); + if(!iframe_obj) return; + if(text.length>0) editorReplaceHTML(iframe_obj, text.join('')); + } } } From c03ff7adf45d77faeae1707a43dc204b14e7fdec Mon Sep 17 00:00:00 2001 From: zero Date: Fri, 3 Apr 2009 05:16:38 +0000 Subject: [PATCH 152/202] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6017 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/skins/xe_default/skin.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/board/skins/xe_default/skin.xml b/modules/board/skins/xe_default/skin.xml index 5d5a16220..834c1c495 100644 --- a/modules/board/skins/xe_default/skin.xml +++ b/modules/board/skins/xe_default/skin.xml @@ -468,7 +468,6 @@ 隱藏 ->>>>>>> .r5911 new표시 시간 (hours) Newの表示時間 (Hours) From 39e62dfbff51fa2b7a3ee9dd0ce7468c08495a7d Mon Sep 17 00:00:00 2001 From: ngleader Date: Fri, 3 Apr 2009 05:22:41 +0000 Subject: [PATCH 153/202] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20lang=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6018 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/en.lang.php | 3 +++ common/lang/es.lang.php | 3 +++ common/lang/fr.lang.php | 3 +++ common/lang/ge.lang.php | 3 +++ common/lang/jp.lang.php | 3 +++ common/lang/ko.lang.php | 3 +++ common/lang/ru.lang.php | 3 +++ common/lang/zh-CN.lang.php | 3 +++ common/lang/zh-TW.lang.php | 3 +++ 9 files changed, 27 insertions(+) diff --git a/common/lang/en.lang.php b/common/lang/en.lang.php index f20460b60..608699036 100644 --- a/common/lang/en.lang.php +++ b/common/lang/en.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = 'Load'; $lang->cmd_input = 'Input'; $lang->cmd_search = 'Search'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = 'Cancel'; $lang->cmd_back = 'Go Back'; $lang->cmd_vote = 'Recommend'; diff --git a/common/lang/es.lang.php b/common/lang/es.lang.php index 9d3b78048..978c4f714 100644 --- a/common/lang/es.lang.php +++ b/common/lang/es.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = 'Carga'; $lang->cmd_input = 'Ingresar'; $lang->cmd_search = 'Buscar'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = 'Cancelar'; $lang->cmd_back = 'Atrás'; $lang->cmd_vote = 'a Favor'; diff --git a/common/lang/fr.lang.php b/common/lang/fr.lang.php index e11016ffe..e3c79053a 100644 --- a/common/lang/fr.lang.php +++ b/common/lang/fr.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = 'Charger'; $lang->cmd_input = 'Entrer'; $lang->cmd_search = 'Rechercher'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = 'Annuler'; $lang->cmd_back = 'Retourner'; $lang->cmd_vote = 'Recommander'; diff --git a/common/lang/ge.lang.php b/common/lang/ge.lang.php index a26b0f854..5c8491c8b 100644 --- a/common/lang/ge.lang.php +++ b/common/lang/ge.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = 'Laden'; $lang->cmd_input = 'Input'; $lang->cmd_search = 'Suche'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = 'Abbrechen'; $lang->cmd_back = 'Zurück'; $lang->cmd_vote = 'Weiterempfehlen'; diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index ea0d37bba..06d660318 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = '読み込む'; $lang->cmd_input = '入力'; $lang->cmd_search = '検索'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = '取り消し'; $lang->cmd_back = '戻る'; $lang->cmd_vote = '推薦'; diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index 2a2735ade..5f3db74e5 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = '불러오기'; $lang->cmd_input = '입력'; $lang->cmd_search = '검색'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = '취소'; $lang->cmd_back = '돌아가기'; $lang->cmd_vote = '추천'; diff --git a/common/lang/ru.lang.php b/common/lang/ru.lang.php index a661688d8..e4d0d4fa8 100644 --- a/common/lang/ru.lang.php +++ b/common/lang/ru.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = 'Загрузить'; $lang->cmd_input = 'Ввести'; $lang->cmd_search = 'Искать'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = 'Отменить'; $lang->cmd_back = 'Вернуться'; $lang->cmd_vote = 'Рекомендовать'; diff --git a/common/lang/zh-CN.lang.php b/common/lang/zh-CN.lang.php index 6c82816d7..033d939c3 100644 --- a/common/lang/zh-CN.lang.php +++ b/common/lang/zh-CN.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = '导入'; $lang->cmd_input = '输入'; $lang->cmd_search = '搜索'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = '取消'; $lang->cmd_back = '返回'; $lang->cmd_vote = '推荐'; diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index 5a8564cba..1fff8d413 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -24,6 +24,9 @@ $lang->cmd_load = '讀取'; $lang->cmd_input = '輸入'; $lang->cmd_search = '搜尋'; + $lang->cmd_find = '찾기'; + $lang->cmd_replace = '바꾸기'; + $lang->cmd_confirm = '확인'; $lang->cmd_cancel = '取消'; $lang->cmd_back = '返回'; $lang->cmd_vote = '推薦'; From 96cda70a6b477d0227852a173dae56f3b7fa6ceb Mon Sep 17 00:00:00 2001 From: ngleader Date: Fri, 3 Apr 2009 06:19:17 +0000 Subject: [PATCH 154/202] =?UTF-8?q?php=EB=B2=84=EC=A0=84=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EA=B7=B8=EB=A3=B9=EB=A7=88=ED=81=AC?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B2=84=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6019 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.model.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/member/member.model.php b/modules/member/member.model.php index ecec36bfb..5759c4024 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -586,9 +586,9 @@ $image_mark = $groups_info[$group_srl[0]]->image_mark; } if($image_mark){ - list($width, $height, $type, $attrs) = getimagesize($image_mark); - $info->width = $width; - $info->height = $height; +// list($width, $height, $type, $attrs) = getimagesize($image_mark); +// $info->width = $width; +// $info->height = $height; $info->src = $image_mark; return $info; From 4c39cdfcc6ff605c2566c28203e134316fc40a57 Mon Sep 17 00:00:00 2001 From: heemin Date: Fri, 3 Apr 2009 07:19:55 +0000 Subject: [PATCH 155/202] =?UTF-8?q?=EC=9D=BC=EB=B6=80=20=EC=9D=BC=EB=B3=B8?= =?UTF-8?q?=EC=96=B4=20=EB=B2=88=EC=97=AD=20=EB=88=84=EB=9D=BD=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EB=B3=B4=EC=B6=A9=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6020 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/jp.lang.php | 6 +- modules/editor/lang/jp.lang.php | 98 ++++++++++++++++----------------- modules/wiki/lang/jp.lang.php | 4 +- widgets/category/conf/info.xml | 1 + 4 files changed, 54 insertions(+), 55 deletions(-) diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index 06d660318..fc684ee90 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -24,9 +24,9 @@ $lang->cmd_load = '読み込む'; $lang->cmd_input = '入力'; $lang->cmd_search = '検索'; - $lang->cmd_find = '찾기'; - $lang->cmd_replace = '바꾸기'; - $lang->cmd_confirm = '확인'; + $lang->cmd_find = '検索'; + $lang->cmd_replace = '置換'; + $lang->cmd_confirm = '確認'; $lang->cmd_cancel = '取り消し'; $lang->cmd_back = '戻る'; $lang->cmd_vote = '推薦'; diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php index d146381fb..f50d56b2e 100644 --- a/modules/editor/lang/jp.lang.php +++ b/modules/editor/lang/jp.lang.php @@ -140,64 +140,62 @@ $lang->about_dblclick_in_editor = '背景、文字、イメージ、引用文の上にカーソルを合わせ、ダブルクリックすると詳細設定出来るコンポーネントを表示します。'; - $lang->edit->rich_editor = 'ウイジウイグ編集'; $lang->edit->html_editor = 'HTMLタグ編集'; $lang->edit->extension ='拡張コンポーネント'; $lang->edit->help = 'ヘルプ'; $lang->edit->help_command = 'ショートカット‐キーの説明'; - $lang->edit->lineheight = '줄간격'; - $lang->edit->fontbgsampletext = '가나다'; - - $lang->edit->hyperlink = '하이퍼링크'; - $lang->edit->target_blank = '새창으로'; - - $lang->edit->quotestyle1 = '왼쪽 실선'; - $lang->edit->quotestyle2 = '인용 부호'; - $lang->edit->quotestyle3 = '실선'; - $lang->edit->quotestyle4 = '실선 + 배경'; - $lang->edit->quotestyle5 = '굵은 실선'; - $lang->edit->quotestyle6 = '점선'; - $lang->edit->quotestyle7 = '점선 + 배경'; - $lang->edit->quotestyle8 = '적용 취소'; + $lang->edit->lineheight = '行間'; + $lang->edit->fontbgsampletext = 'あいうえお'; + + $lang->edit->hyperlink = 'ハイパーリンク'; + $lang->edit->target_blank = '別のウィンドウズで'; + + $lang->edit->quotestyle1 = '左側実線'; + $lang->edit->quotestyle2 = '引用記号'; + $lang->edit->quotestyle3 = '実線'; + $lang->edit->quotestyle4 = '実線 + 背景'; + $lang->edit->quotestyle5 = '太い実線'; + $lang->edit->quotestyle6 = '点線'; + $lang->edit->quotestyle7 = '点線 + 背景'; + $lang->edit->quotestyle8 = '適用取り消し'; - $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; - $lang->edit->set_sel = '칸 수 지정'; - $lang->edit->row = '행'; - $lang->edit->col = '열'; - $lang->edit->add_one_row = '1행추가'; - $lang->edit->del_one_row = '1행삭제'; - $lang->edit->add_one_col = '1열추가'; - $lang->edit->del_one_col = '1열삭제'; + $lang->edit->jumptoedit = '編集ツール省略'; + $lang->edit->set_sel = 'マス数の指定'; + $lang->edit->row = '行'; + $lang->edit->col = '列'; + $lang->edit->add_one_row = '1行追加'; + $lang->edit->del_one_row = '1行削除'; + $lang->edit->add_one_col = '1列追加'; + $lang->edit->del_one_col = '1列削除'; - $lang->edit->table_config = '표 속성 지정'; - $lang->edit->border_width = '테두리 굵기'; - $lang->edit->border_color = '테두리 색'; - $lang->edit->add = '더하기'; - $lang->edit->del = '빼기'; - $lang->edit->search_color = '색상찾기'; - $lang->edit->table_backgroundcolor = '표 배경색'; - $lang->edit->special_character = '특수문자'; - $lang->edit->insert_special_character = '특수문자 삽입'; - $lang->edit->close_special_character = '특수문자 레이어 닫기'; - $lang->edit->symbol = '일반기호'; - $lang->edit->number_unit = '숫자와 단위'; - $lang->edit->circle_bracket = '원,괄호'; - $lang->edit->korean = '한글'; - $lang->edit->greece = '그리스'; - $lang->edit->Latin = '라틴어'; - $lang->edit->japan = '일본어'; - $lang->edit->selected_symbol = '선택한 기호'; + $lang->edit->table_config = '표属性の設定'; + $lang->edit->border_width = '外枠太さ'; + $lang->edit->border_color = '外枠色'; + $lang->edit->add = '挿入'; + $lang->edit->del = '削除'; + $lang->edit->search_color = 'その他の色'; + $lang->edit->table_backgroundcolor = '表の背景色'; + $lang->edit->special_character = '特殊文字'; + $lang->edit->insert_special_character = '特殊文字挿入'; + $lang->edit->close_special_character = '特殊文字レイヤーを閉じる'; + $lang->edit->symbol = '一般記号'; + $lang->edit->number_unit = '数字と単位'; + $lang->edit->circle_bracket = '円、括弧'; + $lang->edit->korean = '韓国語'; + $lang->edit->greece = 'ギリシャ語'; + $lang->edit->Latin = 'ラテン語'; + $lang->edit->japan = '日本語'; + $lang->edit->selected_symbol = '選択した記号'; - $lang->edit->search_replace = '찾기/바꾸기'; - $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; - $lang->edit->replace_all = '모두바꾸기'; - $lang->edit->search_words = '찾을단어'; - $lang->edit->replace_words = '바꿀단어'; - $lang->edit->next_search_words = '다음찾기'; - $lang->edit->edit_height_control = '입력창 크기 조절'; + $lang->edit->search_replace = '検索/置換'; + $lang->edit->close_search_replace = '検索/置換レイヤーを閉じる'; + $lang->edit->replace_all = 'すべて置換'; + $lang->edit->search_words = '検索テキスト'; + $lang->edit->replace_words = '置換テキスト'; + $lang->edit->next_search_words = '次を検索'; + $lang->edit->edit_height_control = '入力サイズ調整'; - -?> +?> \ No newline at end of file diff --git a/modules/wiki/lang/jp.lang.php b/modules/wiki/lang/jp.lang.php index c1d105885..23a55b216 100644 --- a/modules/wiki/lang/jp.lang.php +++ b/modules/wiki/lang/jp.lang.php @@ -12,6 +12,6 @@ $lang->cmd_view_info = 'wiki情報'; $lang->use_comment = 'コメント機能を使う'; $lang->about_use_comment = 'コメント機能をオン・オフを設定します。'; - $lang->contributors = 'Contributors'; - $lang->notice_old_revision = 'This is an old revision'; + $lang->contributors = '投稿者'; + $lang->notice_old_revision = '過去のバージョンです。'; ?> diff --git a/widgets/category/conf/info.xml b/widgets/category/conf/info.xml index 50aae70fd..3c6bc65e0 100644 --- a/widgets/category/conf/info.xml +++ b/widgets/category/conf/info.xml @@ -50,6 +50,7 @@ category 전체 타이틀 category total text title category total text title + カテゴリー全体タイトル From 40632228662d8ca166cd8bd863507129cf363fee Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 3 Apr 2009 09:29:55 +0000 Subject: [PATCH 156/202] =?UTF-8?q?=5FeditorAutoSave=20=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95=20:=20jQuery=20=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=9E=90=EB=8F=99=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=202=EC=B4=88=ED=9B=84=20?= =?UTF-8?q?=EC=82=AC=EB=9D=BC=EC=A7=80=EB=8F=84=EB=A1=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6021 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/tpl/js/editor_common.js | 792 ++++++++++++------------- 1 file changed, 396 insertions(+), 396 deletions(-) diff --git a/modules/editor/tpl/js/editor_common.js b/modules/editor/tpl/js/editor_common.js index 810df25b9..48a414e53 100644 --- a/modules/editor/tpl/js/editor_common.js +++ b/modules/editor/tpl/js/editor_common.js @@ -1,396 +1,396 @@ -/** - * 에디터에서 사용하기 위한 변수 - **/ -var editorMode = new Array(); ///<< 에디터의 html편집 모드 flag 세팅 변수 (html or null) -var editorAutoSaveObj = {fo_obj:null, editor_sequence:0, title:'', content:'', locked:false} ///< 자동저장을 위한 정보를 가진 object -var editorRelKeys = new Array(); ///< 에디터와 각 모듈과의 연동을 위한 key 값을 보관하는 변수 -var editorDragObj = {isDrag:false, y:0, obj:null, id:'', det:0, source_height:0} - -/** - * 에디터 사용시 사용되는 이벤트 연결 함수 호출 - **/ -xAddEventListener(document, 'click', editorEventCheck); -xAddEventListener(document, 'mousedown', editorDragStart); -xAddEventListener(document, 'mouseup', editorDragStop); - -function editorGetContent(editor_sequence) { - // 입력된 내용을 받아옴 - var content = editorRelKeys[editor_sequence]["func"](editor_sequence); - - // 첨부파일 링크시 url을 변경 - var reg_pattern = new RegExp( request_uri.replace(/\//g,'\\/')+"(files|common|modules|layouts|widgets)", 'ig' ); - return content.replace(reg_pattern, "$1"); -} - -// 에디터에 포커스를 줌 -function editorFocus(editor_sequence) { - var iframe_obj = editorGetIFrame(editor_sequence); - iframe_obj.contentWindow.focus(); -} - -/** - * 자동 저장 기능 - **/ -// 자동 저장 활성화 시키는 함수 (10초마다 자동저장) -function editorEnableAutoSave(fo_obj, editor_sequence) { - var title = fo_obj.title.value; - var content = editorRelKeys[editor_sequence]['content'].value; - editorAutoSaveObj = {"fo_obj":fo_obj, "editor_sequence":editor_sequence, "title":title, "content":content, locked:false}; - setTimeout(_editorAutoSave, 10000); -} - -// ajax를 이용하여 editor.procEditorSaveDoc 호출하여 자동 저장시킴 -function _editorAutoSave() { - var fo_obj = editorAutoSaveObj.fo_obj; - var editor_sequence = editorAutoSaveObj.editor_sequence; - - // 현재 자동저장중이면 중지 - if(editorAutoSaveObj.locked == true) return; - - // 대상이 없으면 자동저장 시키는 기능 자체를 중지 - if(!fo_obj || typeof(fo_obj.title)=='undefined' || !editor_sequence) return; - - // 자동저장을 위한 준비 - var title = fo_obj.title.value; - var content = editorGetContent(editor_sequence); - - // 내용이 이전에 저장하였던 것과 다르면 자동 저장을 함 - if(title != editorAutoSaveObj.title || content != editorAutoSaveObj.content ) { - var params = new Array(); - - params["title"] = title; - params["content"] = content; - params["document_srl"] = editorRelKeys[editor_sequence]['primary'].value; - - editorAutoSaveObj.title = title; - editorAutoSaveObj.content = content; - - var obj = xGetElementById("editor_autosaved_message_"+editor_sequence); - obj.style.display = 'block'; - var oDate = new Date(); - html = oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg; - xInnerHtml(obj, html); - obj.style.display = "block"; - - // 현재 자동저장중임을 설정 - editorAutoSaveObj.locked = true; - - // 서버 호출 (서버와 교신중이라는 메세지를 보이지 않도록 함) - show_waiting_message = false; - exec_xml("editor","procEditorSaveDoc", params, function() { editorAutoSaveObj.locked = false; } ); - show_waiting_message = true; - } - - // 10초마다 동기화를 시킴 - setTimeout(_editorAutoSave, 10000); -} - -// 자동저장된 모든 메세지를 삭제하는 루틴 -function editorRemoveSavedDoc() { - exec_xml("editor","procEditorRemoveSavedDoc"); -} - -/** - * 에디터의 상태나 객체를 구하기 위한 함수 - **/ - -// editor_sequence값에 해당하는 iframe의 object를 return -function editorGetIFrame(editor_sequence) { - if(editorRelKeys != undefined && editorRelKeys[editor_sequence] != undefined && editorRelKeys[editor_sequence]['editor'] != undefined) - return editorRelKeys[editor_sequence]['editor'].getFrame(); - return xGetElementById( 'editor_iframe_'+ editor_sequence ); -} -function editorGetTextarea(editor_sequence) { - return xGetElementById( 'editor_textarea_'+ editor_sequence ); -} -/** - * iframe 세로 크기 조절 드래그 관련 - **/ -function editorDragStart(evt) { - var e = new xEvent(evt); - var obj = e.target; - if(typeof(obj.id)=='undefined'||!obj.id) return; - - var id = obj.id; - if(id.indexOf('editor_drag_bar_')!=0) return; - - editorDragObj.isDrag = true; - editorDragObj.y = e.pageY; - editorDragObj.obj = e.target; - editorDragObj.id = id.substr('editor_drag_bar_'.length); - - var iframe_obj = editorGetIFrame(editorDragObj.id); - var textarea_obj = editorGetTextarea(editorDragObj.id); - var preview_obj = xGetElementById('editor_preview_'+editorDragObj.id); - editorDragObj.source_height = xHeight(iframe_obj) || xHeight(preview_obj); - xGetElementById('xeEditorMask_' + editorDragObj.id).style.display='block'; - - xAddEventListener(document, 'mousemove', editorDragMove, true); -// xAddEventListener(editorDragObj.obj, 'mousemove', editorDragMove, false); -} - -function editorDragMove(evt) { - - if(!editorDragObj.isDrag){ - if(editorDragObj.id) xGetElementById('xeEditorMask_' + editorDragObj.id).style.display='none'; - return; - } - - var e = new xEvent(evt); - var h = e.pageY - editorDragObj.y; - - editorDragObj.isDrag = true; - editorDragObj.y = e.pageY; - editorDragObj.obj = e.target; - - - var iframe_obj = editorGetIFrame(editorDragObj.id); - var textarea_obj = editorGetTextarea(editorDragObj.id); - var preview_obj = xGetElementById('editor_preview_'+editorDragObj.id); - var height = xHeight(iframe_obj) || xHeight(textarea_obj) || xHeight(preview_obj); - height += h; - xHeight(iframe_obj, height); - xHeight(textarea_obj, height); - xHeight(preview_obj, height); -// xHeight(iframe_obj.parentNode, height+200); -} - -function editorDragStop(evt) { - if(editorDragObj.id) xGetElementById('xeEditorMask_'+editorDragObj.id).style.display='none'; - if(!editorDragObj.isDrag){ - return; - } - - - xRemoveEventListener(document, 'mousemove', editorDragMove, false); -// xRemoveEventListener(editorDragObj.obj, 'mousemove', editorDragMove, false); - - var iframe_obj = editorGetIFrame(editorDragObj.id); - var textarea_obj = editorGetTextarea(editorDragObj.id); - if(typeof(fixAdminLayoutFooter)=='function') fixAdminLayoutFooter(xHeight(iframe_obj)-editorDragObj.source_height); - - - editorDragObj.isDrag = false; - editorDragObj.y = 0; - editorDragObj.obj = null; - editorDragObj.id = ''; -} - -// Editor Option Button -function eOptionOver(obj) { - obj.style.marginTop='-21px'; - obj.style.zIndex='99'; -} -function eOptionOut(obj) { - obj.style.marginTop='0'; - obj.style.zIndex='1'; -} -function eOptionClick(obj) { - obj.style.marginTop='-42px'; - obj.style.zIndex='99'; -} - -/** - * 에디터 컴포넌트 구현 부분 - **/ - -// 에디터 상단의 컴포넌트 버튼 클릭시 action 처리 (마우스다운 이벤트 발생시마다 요청이 됨) -var editorPrevSrl = null; -function editorEventCheck(evt) { - editorPrevNode = null; - - // 이벤트가 발생한 object의 ID를 구함 - var e = new xEvent(evt); - var target_id = e.target.id; - if(!target_id) return; - - // editor_sequence와 component name을 구함 (id가 포맷과 다르면 return) - var info = target_id.split('_'); - if(info[0]!="component") return; - var editor_sequence = info[1]; - var component_name = target_id.replace(/^component_([0-9]+)_/,''); - if(!editor_sequence || !component_name) return; - - if(editorMode[editor_sequence]=='html') return; - - switch(component_name) { - - // 기본 기능에 대한 동작 (바로 실행) - case 'Bold' : - case 'Italic' : - case 'Underline' : - case 'StrikeThrough' : - case 'undo' : - case 'redo' : - case 'JustifyLeft' : - case 'JustifyCenter' : - case 'JustifyRight' : - case 'JustifyFull' : - case 'Indent' : - case 'Outdent' : - case 'InsertOrderedList' : - case 'InsertUnorderedList' : - case 'SaveAs' : - case 'Print' : - case 'Copy' : - case 'Cut' : - case 'Paste' : - case 'RemoveFormat' : - case 'Subscript' : - case 'Superscript' : - editorDo(component_name, '', editor_sequence); - break; - - // 추가 컴포넌트의 경우 서버에 요청을 시도 - default : - openComponent(component_name, editor_sequence); - break; - } - - return; -} - -// 컴포넌트 팝업 열기 -function openComponent(component_name, editor_sequence, manual_url) { - editorPrevSrl = editor_sequence; - if(editorMode[editor_sequence]=='html') return; - - var popup_url = request_uri+"?module=editor&act=dispEditorPopup&editor_sequence="+editor_sequence+"&component="+component_name; - if(typeof(manual_url)!="undefined" && manual_url) popup_url += "&manual_url="+escape(manual_url); - - popopen(popup_url, 'editorComponent'); -} - -// 더블클릭 이벤트 발생시에 본문내에 포함된 컴포넌트를 찾는 함수 -var editorPrevNode = null; -function editorSearchComponent(evt) { - var e = new xEvent(evt); - - editorPrevNode = null; - var obj = e.target; - - // 위젯인지 일단 체크 - if(obj.getAttribute("widget")) { - // editor_sequence을 찾음 - var tobj = obj; - while(tobj && tobj.nodeName != "BODY") { - tobj = xParent(tobj); - } - if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) { - editorPrevNode = null; - return; - } - var editor_sequence = tobj.getAttribute("editor_sequence"); - var widget = obj.getAttribute("widget"); - editorPrevNode = obj; - - if(editorMode[editor_sequence]=='html') return; - popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+editor_sequence,'GenerateCodeInPage'); - return; - } - - // 선택되어진 object부터 상단으로 이동하면서 editor_component attribute가 있는지 검사 - if(!obj.getAttribute("editor_component")) { - while(obj && !obj.getAttribute("editor_component")) { - if(obj.parentElement) obj = obj.parentElement; - else obj = xParent(obj); - } - } - - if(!obj) obj = e.target; - - var editor_component = obj.getAttribute("editor_component"); - - // editor_component를 찾지 못했을 경우에 이미지/텍스트/링크의 경우 기본 컴포넌트와 연결 - if(!editor_component) { - // 이미지일 경우 - if(obj.nodeName == "IMG") { - editor_component = "image_link"; - editorPrevNode = obj; - - // 테이블의 td일 경우 - } else if(obj.nodeName == "TD") { - editor_component = "table_maker"; - editorPrevNode = obj; - - // 링크거나 텍스트인 경우 - } else if(obj.nodeName == "A" || obj.nodeName == "BODY" || obj.nodeName.indexOf("H")==0 || obj.nodeName == "LI" || obj.nodeName == "P") { - editor_component = "url_link"; - editorPrevNode = obj; - } - } else { - editorPrevNode = obj; - } - - // 아무런 editor_component가 없다면 return - if(!editor_component) { - editorPrevNode = null; - return; - } - - // editor_sequence을 찾음 - var tobj = obj; - while(tobj && tobj.nodeName != "BODY") { - tobj = xParent(tobj); - } - if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) { - editorPrevNode = null; - return; - } - var editor_sequence = tobj.getAttribute("editor_sequence"); - - // 해당 컴포넌트를 찾아서 실행 - openComponent(editor_component, editor_sequence); -} - -// 에디터 내의 선택된 부분의 html코드를 변경 -function editorReplaceHTML(iframe_obj, html) { - // 에디터가 활성화 되어 있는지 확인 후 비활성화시 활성화 - var editor_sequence = iframe_obj.contentWindow.document.body.getAttribute("editor_sequence"); - - // iframe 에디터에 포커스를 둠 - iframe_obj.contentWindow.focus(); - - if(xIE4Up) { - var range = iframe_obj.contentWindow.document.selection.createRange(); - if(range.pasteHTML) { - range.pasteHTML(html); - } else if(editorPrevNode) { - editorPrevNode.outerHTML = html; - } - - } else { - - try { - if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") { - var range = iframe_obj.contentDocument.createRange(); - range.setStart(iframe_obj.contentDocument.body,0); - range.setEnd(iframe_obj.contentDocument.body,0); - range.insertNode(range.createContextualFragment(html)); - } else { - var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); - range.deleteContents(); - range.insertNode(range.createContextualFragment(html)); - } - } catch(e) { - xInnerHtml(iframe_obj.contentWindow.document.body, html+xInnerHtml(iframe_obj.contentWindow.document.body)); - } - - } -} - -// 에디터 내의 선택된 부분의 html 코드를 return -function editorGetSelectedHtml(editor_sequence) { - var iframe_obj = editorGetIFrame(editor_sequence); - if(xIE4Up) { - var range = iframe_obj.contentWindow.document.selection.createRange(); - var html = range.htmlText; - return html; - } else { - var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); - var dummy = xCreateElement('div'); - dummy.appendChild(range.cloneContents()); - var html = xInnerHtml(dummy); - return html; - } -} +/** + * 에디터에서 사용하기 위한 변수 + **/ +var editorMode = new Array(); ///<< 에디터의 html편집 모드 flag 세팅 변수 (html or null) +var editorAutoSaveObj = {fo_obj:null, editor_sequence:0, title:'', content:'', locked:false} ///< 자동저장을 위한 정보를 가진 object +var editorRelKeys = new Array(); ///< 에디터와 각 모듈과의 연동을 위한 key 값을 보관하는 변수 +var editorDragObj = {isDrag:false, y:0, obj:null, id:'', det:0, source_height:0} + +/** + * 에디터 사용시 사용되는 이벤트 연결 함수 호출 + **/ +xAddEventListener(document, 'click', editorEventCheck); +xAddEventListener(document, 'mousedown', editorDragStart); +xAddEventListener(document, 'mouseup', editorDragStop); + +function editorGetContent(editor_sequence) { + // 입력된 내용을 받아옴 + var content = editorRelKeys[editor_sequence]["func"](editor_sequence); + + // 첨부파일 링크시 url을 변경 + var reg_pattern = new RegExp( request_uri.replace(/\//g,'\\/')+"(files|common|modules|layouts|widgets)", 'ig' ); + return content.replace(reg_pattern, "$1"); +} + +// 에디터에 포커스를 줌 +function editorFocus(editor_sequence) { + var iframe_obj = editorGetIFrame(editor_sequence); + iframe_obj.contentWindow.focus(); +} + +/** + * 자동 저장 기능 + **/ +// 자동 저장 활성화 시키는 함수 (10초마다 자동저장) +function editorEnableAutoSave(fo_obj, editor_sequence) { + var title = fo_obj.title.value; + var content = editorRelKeys[editor_sequence]['content'].value; + editorAutoSaveObj = {"fo_obj":fo_obj, "editor_sequence":editor_sequence, "title":title, "content":content, locked:false}; + setTimeout(_editorAutoSave, 10000); +} + +// ajax를 이용하여 editor.procEditorSaveDoc 호출하여 자동 저장시킴 +function _editorAutoSave() { + var fo_obj = editorAutoSaveObj.fo_obj; + var editor_sequence = editorAutoSaveObj.editor_sequence; + + // 현재 자동저장중이면 중지 + if(editorAutoSaveObj.locked == true) return; + + // 대상이 없으면 자동저장 시키는 기능 자체를 중지 + if(!fo_obj || typeof(fo_obj.title)=='undefined' || !editor_sequence) return; + + // 자동저장을 위한 준비 + var title = fo_obj.title.value; + var content = editorGetContent(editor_sequence); + + // 내용이 이전에 저장하였던 것과 다르면 자동 저장을 함 + if(title != editorAutoSaveObj.title || content != editorAutoSaveObj.content ) { + var params = new Array(); + + params["title"] = title; + params["content"] = content; + params["document_srl"] = editorRelKeys[editor_sequence]['primary'].value; + + editorAutoSaveObj.title = title; + editorAutoSaveObj.content = content; + + var obj = jQuery("#editor_autosaved_message_"+editor_sequence); + var oDate = new Date(); + + // 메시지 만들어서 보여줌 + obj.text(oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg).show(300); + setTimeout(function(){obj.hide(300)}, 2000); + + // 현재 자동저장중임을 설정 + editorAutoSaveObj.locked = true; + + // 서버 호출 (서버와 교신중이라는 메세지를 보이지 않도록 함) + show_waiting_message = false; + exec_xml("editor","procEditorSaveDoc", params, function() { editorAutoSaveObj.locked = false; } ); + show_waiting_message = true; + } + + // 10초마다 동기화를 시킴 + setTimeout(_editorAutoSave, 10000); +} + +// 자동저장된 모든 메세지를 삭제하는 루틴 +function editorRemoveSavedDoc() { + exec_xml("editor","procEditorRemoveSavedDoc"); +} + +/** + * 에디터의 상태나 객체를 구하기 위한 함수 + **/ + +// editor_sequence값에 해당하는 iframe의 object를 return +function editorGetIFrame(editor_sequence) { + if(editorRelKeys != undefined && editorRelKeys[editor_sequence] != undefined && editorRelKeys[editor_sequence]['editor'] != undefined) + return editorRelKeys[editor_sequence]['editor'].getFrame(); + return xGetElementById( 'editor_iframe_'+ editor_sequence ); +} +function editorGetTextarea(editor_sequence) { + return xGetElementById( 'editor_textarea_'+ editor_sequence ); +} +/** + * iframe 세로 크기 조절 드래그 관련 + **/ +function editorDragStart(evt) { + var e = new xEvent(evt); + var obj = e.target; + if(typeof(obj.id)=='undefined'||!obj.id) return; + + var id = obj.id; + if(id.indexOf('editor_drag_bar_')!=0) return; + + editorDragObj.isDrag = true; + editorDragObj.y = e.pageY; + editorDragObj.obj = e.target; + editorDragObj.id = id.substr('editor_drag_bar_'.length); + + var iframe_obj = editorGetIFrame(editorDragObj.id); + var textarea_obj = editorGetTextarea(editorDragObj.id); + var preview_obj = xGetElementById('editor_preview_'+editorDragObj.id); + editorDragObj.source_height = xHeight(iframe_obj) || xHeight(preview_obj); + xGetElementById('xeEditorMask_' + editorDragObj.id).style.display='block'; + + xAddEventListener(document, 'mousemove', editorDragMove, true); +// xAddEventListener(editorDragObj.obj, 'mousemove', editorDragMove, false); +} + +function editorDragMove(evt) { + + if(!editorDragObj.isDrag){ + if(editorDragObj.id) xGetElementById('xeEditorMask_' + editorDragObj.id).style.display='none'; + return; + } + + var e = new xEvent(evt); + var h = e.pageY - editorDragObj.y; + + editorDragObj.isDrag = true; + editorDragObj.y = e.pageY; + editorDragObj.obj = e.target; + + + var iframe_obj = editorGetIFrame(editorDragObj.id); + var textarea_obj = editorGetTextarea(editorDragObj.id); + var preview_obj = xGetElementById('editor_preview_'+editorDragObj.id); + var height = xHeight(iframe_obj) || xHeight(textarea_obj) || xHeight(preview_obj); + height += h; + xHeight(iframe_obj, height); + xHeight(textarea_obj, height); + xHeight(preview_obj, height); +// xHeight(iframe_obj.parentNode, height+200); +} + +function editorDragStop(evt) { + if(editorDragObj.id) xGetElementById('xeEditorMask_'+editorDragObj.id).style.display='none'; + if(!editorDragObj.isDrag){ + return; + } + + + xRemoveEventListener(document, 'mousemove', editorDragMove, false); +// xRemoveEventListener(editorDragObj.obj, 'mousemove', editorDragMove, false); + + var iframe_obj = editorGetIFrame(editorDragObj.id); + var textarea_obj = editorGetTextarea(editorDragObj.id); + if(typeof(fixAdminLayoutFooter)=='function') fixAdminLayoutFooter(xHeight(iframe_obj)-editorDragObj.source_height); + + + editorDragObj.isDrag = false; + editorDragObj.y = 0; + editorDragObj.obj = null; + editorDragObj.id = ''; +} + +// Editor Option Button +function eOptionOver(obj) { + obj.style.marginTop='-21px'; + obj.style.zIndex='99'; +} +function eOptionOut(obj) { + obj.style.marginTop='0'; + obj.style.zIndex='1'; +} +function eOptionClick(obj) { + obj.style.marginTop='-42px'; + obj.style.zIndex='99'; +} + +/** + * 에디터 컴포넌트 구현 부분 + **/ + +// 에디터 상단의 컴포넌트 버튼 클릭시 action 처리 (마우스다운 이벤트 발생시마다 요청이 됨) +var editorPrevSrl = null; +function editorEventCheck(evt) { + editorPrevNode = null; + + // 이벤트가 발생한 object의 ID를 구함 + var e = new xEvent(evt); + var target_id = e.target.id; + if(!target_id) return; + + // editor_sequence와 component name을 구함 (id가 포맷과 다르면 return) + var info = target_id.split('_'); + if(info[0]!="component") return; + var editor_sequence = info[1]; + var component_name = target_id.replace(/^component_([0-9]+)_/,''); + if(!editor_sequence || !component_name) return; + + if(editorMode[editor_sequence]=='html') return; + + switch(component_name) { + + // 기본 기능에 대한 동작 (바로 실행) + case 'Bold' : + case 'Italic' : + case 'Underline' : + case 'StrikeThrough' : + case 'undo' : + case 'redo' : + case 'JustifyLeft' : + case 'JustifyCenter' : + case 'JustifyRight' : + case 'JustifyFull' : + case 'Indent' : + case 'Outdent' : + case 'InsertOrderedList' : + case 'InsertUnorderedList' : + case 'SaveAs' : + case 'Print' : + case 'Copy' : + case 'Cut' : + case 'Paste' : + case 'RemoveFormat' : + case 'Subscript' : + case 'Superscript' : + editorDo(component_name, '', editor_sequence); + break; + + // 추가 컴포넌트의 경우 서버에 요청을 시도 + default : + openComponent(component_name, editor_sequence); + break; + } + + return; +} + +// 컴포넌트 팝업 열기 +function openComponent(component_name, editor_sequence, manual_url) { + editorPrevSrl = editor_sequence; + if(editorMode[editor_sequence]=='html') return; + + var popup_url = request_uri+"?module=editor&act=dispEditorPopup&editor_sequence="+editor_sequence+"&component="+component_name; + if(typeof(manual_url)!="undefined" && manual_url) popup_url += "&manual_url="+escape(manual_url); + + popopen(popup_url, 'editorComponent'); +} + +// 더블클릭 이벤트 발생시에 본문내에 포함된 컴포넌트를 찾는 함수 +var editorPrevNode = null; +function editorSearchComponent(evt) { + var e = new xEvent(evt); + + editorPrevNode = null; + var obj = e.target; + + // 위젯인지 일단 체크 + if(obj.getAttribute("widget")) { + // editor_sequence을 찾음 + var tobj = obj; + while(tobj && tobj.nodeName != "BODY") { + tobj = xParent(tobj); + } + if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) { + editorPrevNode = null; + return; + } + var editor_sequence = tobj.getAttribute("editor_sequence"); + var widget = obj.getAttribute("widget"); + editorPrevNode = obj; + + if(editorMode[editor_sequence]=='html') return; + popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+editor_sequence,'GenerateCodeInPage'); + return; + } + + // 선택되어진 object부터 상단으로 이동하면서 editor_component attribute가 있는지 검사 + if(!obj.getAttribute("editor_component")) { + while(obj && !obj.getAttribute("editor_component")) { + if(obj.parentElement) obj = obj.parentElement; + else obj = xParent(obj); + } + } + + if(!obj) obj = e.target; + + var editor_component = obj.getAttribute("editor_component"); + + // editor_component를 찾지 못했을 경우에 이미지/텍스트/링크의 경우 기본 컴포넌트와 연결 + if(!editor_component) { + // 이미지일 경우 + if(obj.nodeName == "IMG") { + editor_component = "image_link"; + editorPrevNode = obj; + + // 테이블의 td일 경우 + } else if(obj.nodeName == "TD") { + editor_component = "table_maker"; + editorPrevNode = obj; + + // 링크거나 텍스트인 경우 + } else if(obj.nodeName == "A" || obj.nodeName == "BODY" || obj.nodeName.indexOf("H")==0 || obj.nodeName == "LI" || obj.nodeName == "P") { + editor_component = "url_link"; + editorPrevNode = obj; + } + } else { + editorPrevNode = obj; + } + + // 아무런 editor_component가 없다면 return + if(!editor_component) { + editorPrevNode = null; + return; + } + + // editor_sequence을 찾음 + var tobj = obj; + while(tobj && tobj.nodeName != "BODY") { + tobj = xParent(tobj); + } + if(!tobj || tobj.nodeName != "BODY" || !tobj.getAttribute("editor_sequence")) { + editorPrevNode = null; + return; + } + var editor_sequence = tobj.getAttribute("editor_sequence"); + + // 해당 컴포넌트를 찾아서 실행 + openComponent(editor_component, editor_sequence); +} + +// 에디터 내의 선택된 부분의 html코드를 변경 +function editorReplaceHTML(iframe_obj, html) { + // 에디터가 활성화 되어 있는지 확인 후 비활성화시 활성화 + var editor_sequence = iframe_obj.contentWindow.document.body.getAttribute("editor_sequence"); + + // iframe 에디터에 포커스를 둠 + iframe_obj.contentWindow.focus(); + + if(xIE4Up) { + var range = iframe_obj.contentWindow.document.selection.createRange(); + if(range.pasteHTML) { + range.pasteHTML(html); + } else if(editorPrevNode) { + editorPrevNode.outerHTML = html; + } + + } else { + + try { + if(iframe_obj.contentWindow.getSelection().focusNode.tagName == "HTML") { + var range = iframe_obj.contentDocument.createRange(); + range.setStart(iframe_obj.contentDocument.body,0); + range.setEnd(iframe_obj.contentDocument.body,0); + range.insertNode(range.createContextualFragment(html)); + } else { + var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); + range.deleteContents(); + range.insertNode(range.createContextualFragment(html)); + } + } catch(e) { + xInnerHtml(iframe_obj.contentWindow.document.body, html+xInnerHtml(iframe_obj.contentWindow.document.body)); + } + + } +} + +// 에디터 내의 선택된 부분의 html 코드를 return +function editorGetSelectedHtml(editor_sequence) { + var iframe_obj = editorGetIFrame(editor_sequence); + if(xIE4Up) { + var range = iframe_obj.contentWindow.document.selection.createRange(); + var html = range.htmlText; + return html; + } else { + var range = iframe_obj.contentWindow.getSelection().getRangeAt(0); + var dummy = xCreateElement('div'); + dummy.appendChild(range.cloneContents()); + var html = xInnerHtml(dummy); + return html; + } +} From 8636546ffe34b3691abcf84b4e93644f843e4b85 Mon Sep 17 00:00:00 2001 From: haneul Date: Fri, 3 Apr 2009 09:38:34 +0000 Subject: [PATCH 157/202] english translation for common git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6022 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/en.lang.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/lang/en.lang.php b/common/lang/en.lang.php index 608699036..070d8c6b2 100644 --- a/common/lang/en.lang.php +++ b/common/lang/en.lang.php @@ -24,9 +24,9 @@ $lang->cmd_load = 'Load'; $lang->cmd_input = 'Input'; $lang->cmd_search = 'Search'; - $lang->cmd_find = '찾기'; - $lang->cmd_replace = '바꾸기'; - $lang->cmd_confirm = '확인'; + $lang->cmd_find = 'Find'; + $lang->cmd_replace = 'Replace'; + $lang->cmd_confirm = 'Confirm'; $lang->cmd_cancel = 'Cancel'; $lang->cmd_back = 'Go Back'; $lang->cmd_vote = 'Recommend'; @@ -78,7 +78,7 @@ $lang->secret = 'Secret'; $lang->category = $lang->category_srl = 'Category'; $lang->none_category = 'None category'; - $lang->none_image = '이미지 없음'; + $lang->none_image = 'Image does not exist'; $lang->document_srl = 'Doc. No.'; $lang->user_id = 'User ID'; $lang->author = 'Developer'; @@ -270,9 +270,9 @@ $lang->default_value = 'Default Value'; $lang->is_active = 'Active'; $lang->is_required = 'Required Field'; - $lang->eid = '확장변수 이름'; + $lang->eid = 'Name of extra variable'; - // ftp 관련 + // ftp-related $lang->ftp_form_title = 'Input FTP account information'; $lang->ftp = 'FTP'; $lang->ftp_port = 'FTP port'; From f691f3b20c72c133545b2f0fc35ffa679a1e1659 Mon Sep 17 00:00:00 2001 From: haneul Date: Fri, 3 Apr 2009 09:41:33 +0000 Subject: [PATCH 158/202] English translation for admin module git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6023 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/en.lang.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/admin/lang/en.lang.php b/modules/admin/lang/en.lang.php index 42b6527c7..132a24704 100644 --- a/modules/admin/lang/en.lang.php +++ b/modules/admin/lang/en.lang.php @@ -25,8 +25,8 @@ $lang->newest_news = "Latest News"; $lang->env_setup = "Setting"; - $lang->default_url = "기본 URL"; - $lang->about_default_url = "XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)"; + $lang->default_url = "Default URL"; + $lang->about_default_url = "If you use a virtual site feature (e.g., cafeXE), input default URL (parent-site's address), then SSO would be enabled, thus connection to documents/modules works properly. "; $lang->env_information = "Environment Information"; $lang->current_version = "Current Version"; From fe1da65e0de42f9097427dafd3f7584377eb96df Mon Sep 17 00:00:00 2001 From: haneul Date: Fri, 3 Apr 2009 14:21:26 +0000 Subject: [PATCH 159/202] #17901300 : fixed the bug that comment editor was not set properly when replying comment (since module_srl was not set in context) git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6024 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/board/board.view.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/board/board.view.php b/modules/board/board.view.php index 2654e00d1..b98893df3 100644 --- a/modules/board/board.view.php +++ b/modules/board/board.view.php @@ -499,6 +499,7 @@ // 필요한 정보들 세팅 Context::set('oSourceComment',$oSourceComment); Context::set('oComment',$oComment); + Context::set('module_srl',$this->module_info->module_srl); /** * 사용되는 javascript 필터 추가 From 4e06207bd495b5038c63029146a36941e5b10c7d Mon Sep 17 00:00:00 2001 From: haneul Date: Fri, 3 Apr 2009 14:53:09 +0000 Subject: [PATCH 160/202] #17898330 : fixed the bug that category tree was not displayed if a tilte of one of categories contains & (users should recreate cache file to apply this patch) git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6025 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index d2da9bd66..111bdf382 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1257,6 +1257,7 @@ foreach($list as $category_srl => $node) { $node->mid = $mid; $parent_srl = (int)$node->parent_srl; + $node->title = htmlspecialchars($node->title); $tree[$parent_srl][$category_srl] = $node; } From 6a48f60e11ffb99638c4fa3d72243a500c56d2ba Mon Sep 17 00:00:00 2001 From: haneul Date: Fri, 3 Apr 2009 15:22:12 +0000 Subject: [PATCH 161/202] =?UTF-8?q?=EC=9E=98=EB=AA=BB=EB=90=9C=20=EB=B2=88?= =?UTF-8?q?=EC=97=AD=20=EB=8F=8C=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6026 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/layout/lang/ko.lang.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/layout/lang/ko.lang.php b/modules/layout/lang/ko.lang.php index b54bd71e5..ab27d806c 100644 --- a/modules/layout/lang/ko.lang.php +++ b/modules/layout/lang/ko.lang.php @@ -27,7 +27,7 @@ $lang->about_layout = '레이아웃 모듈은 사이트의 레이아웃을 쉽게 만들 수 있도록 도와줍니다.
            레이아웃 설정과 메뉴의 연결을 통해서 다양한 모듈이 완성된 사이트의 모습으로 보여줄 수 있도록 합니다.
            * 삭제나 수정이 불가능한 레이아웃은 블로그나 기타 모듈의 자체 레이아웃이므로 해당 모듈로 가서 설정하셔야 합니다.'; $lang->about_layout_code = - "ちゅう 레이아웃의 코드를 직접 수정후 저장하시면 서비스에 반영이 됩니다. + "아래 레이아웃의 코드를 직접 수정후 저장하시면 서비스에 반영이 됩니다. 꼭 미리보기를 하신 후에 저장을 하세요. XE의 템플릿 문법은 XE 템플릿 을 참고하시면 됩니다."; From 65b757c51bacff6eecaa597c53ff2f503fdeedbb Mon Sep 17 00:00:00 2001 From: haneul Date: Sat, 4 Apr 2009 15:47:59 +0000 Subject: [PATCH 162/202] fixed a multiple-language error due to [6025] git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6027 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 111bdf382..bc601fd74 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1257,7 +1257,6 @@ foreach($list as $category_srl => $node) { $node->mid = $mid; $parent_srl = (int)$node->parent_srl; - $node->title = htmlspecialchars($node->title); $tree[$parent_srl][$category_srl] = $node; } @@ -1347,7 +1346,7 @@ $title = $node->title; $oModuleAdminModel = &getAdminModel('module'); $langs = $oModuleAdminModel->getLangCode($site_srl, $title); - if(count($langs)) foreach($langs as $key => $val) $xml_header_buff .= sprintf('$_titles[%d]["%s"] = "%s"; ', $category_srl, $key, str_replace('"','\\"',$val)); + if(count($langs)) foreach($langs as $key => $val) $xml_header_buff .= sprintf('$_titles[%d]["%s"] = "%s"; ', $category_srl, $key, str_replace('"','\\"',htmlspecialchars($val))); $attribute = sprintf( 'mid="%s" module_srl="%d" node_srl="%d" parent_srl="%d" category_srl="%d" text="" url="%s" expand="%s" color="%s" document_count="%d" ', @@ -1403,7 +1402,7 @@ $title = $node->title; $oModuleAdminModel = &getAdminModel('module'); $langs = $oModuleAdminModel->getLangCode($site_srl, $title); - if(count($langs)) foreach($langs as $key => $val) $php_header_buff .= sprintf('$_titles[%d]["%s"] = "%s"; ', $category_srl, $key, str_replace('"','\\"',$val)); + if(count($langs)) foreach($langs as $key => $val) $php_header_buff .= sprintf('$_titles[%d]["%s"] = "%s"; ', $category_srl, $key, str_replace('"','\\"',htmlspecialchars($val))); // 속성을 생성한다 ( category_srl_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) $attribute = sprintf( From 427365783a4d27150fb40ead31469a32b6094a35 Mon Sep 17 00:00:00 2001 From: bradly1 Date: Sun, 5 Apr 2009 05:28:26 +0000 Subject: [PATCH 163/202] =?UTF-8?q?=EC=8A=A4=ED=8E=98=EC=9D=B8=EC=96=B4=20?= =?UTF-8?q?=EB=B2=88=EC=97=AD,=20=EC=98=81=EC=96=B4=20=EC=95=BD=EA=B0=84?= =?UTF-8?q?=20=EB=B2=88=EC=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6028 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/lang/es.lang.php | 2 +- modules/admin/lang/es.lang.php | 22 ++++----- modules/board/lang/es.lang.php | 14 +++--- modules/homepage/lang/en.lang.php | 2 +- modules/homepage/lang/es.lang.php | 79 +++++++++++++++++++++++++++++++ modules/homepage/lang/ko.lang.php | 2 +- 6 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 modules/homepage/lang/es.lang.php diff --git a/modules/addon/lang/es.lang.php b/modules/addon/lang/es.lang.php index ffa27627f..fdc9b566b 100644 --- a/modules/addon/lang/es.lang.php +++ b/modules/addon/lang/es.lang.php @@ -12,6 +12,6 @@ $lang->addon_license = 'License'; $lang->addon_history = 'Historia de Addon '; - $lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.
            (모두 해제시 모든 대상에서 사용 가능합니다)"; + $lang->about_addon_mid = "Add-ons se puede utilizar para especificar el destino.
            (Todo gratis, están disponibles en todos los destinos)"; $lang->about_addon = 'Addon is para controlar las acciones y no para mostrar el resultado en HTML.
            Sólo con activar o desactivar el addon que desee, podrá obtener funciones útiles para la administración de tu sitio web.'; ?> diff --git a/modules/admin/lang/es.lang.php b/modules/admin/lang/es.lang.php index 00b1be7e6..80e7cdd7b 100644 --- a/modules/admin/lang/es.lang.php +++ b/modules/admin/lang/es.lang.php @@ -27,7 +27,7 @@ $lang->env_setup = "Configuración"; $lang->default_url = "기본 URL"; - $lang->about_default_url = "XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)"; + $lang->about_default_url = "XE sitio virtual (cafeXE, etc) tiene que introducir la URL base, al utilizar las capacidades de trabajo virtual y el tema de autenticación sayiteugan / módulos y las conexiones se realizan correctamente. (Ej: http:// dominio / ruta de instalación)"; $lang->env_information = "Información Ambiental"; $lang->current_version = "Versión actual"; @@ -64,16 +64,16 @@ $lang->yesterday = "Yesterday"; $lang->today = "Today"; - $lang->cmd_lang_select = "언어선택"; - $lang->about_cmd_lang_select = "선택된 언어들만 서비스 됩니다"; - $lang->about_recompile_cache = "쓸모없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다"; - $lang->use_ssl = "SSL 사용"; + $lang->cmd_lang_select = "Selección de Idioma"; + $lang->about_cmd_lang_select = "Seleccione el idioma es sólo el servicio"; + $lang->about_recompile_cache = "Inválido inútil archivo de caché puede organizar jyeotgeona"; + $lang->use_ssl = "Usar SSL"; $lang->ssl_options = array( - 'none' => "사용안함", - 'optional' => "선택적으로", - 'always' => "항상사용" + 'none' => "Desactivar", + 'optional' => "Opcionalmente el", + 'always' => "Utilice siempre el" ); - $lang->about_use_ssl = "선택적으로에서는 회원가입/정보수정등의 지정된 action에서 SSL을 사용하고 항상 사용은 모든 서비스가 SSL을 이용하게 됩니다."; - $lang->server_ports = "서버포트지정"; - $lang->about_server_ports = "HTTP는 80, HTTPS는 443이외의 다른 포트를 사용하는 경우에 포트를 지정해주어야합니다."; + $lang->about_use_ssl = "Opcionalmente, la composición de suscripción / editar la información y el uso de SSL especificada en la acción es siempre el uso de SSL para todos los servicios que se utilizarán"; + $lang->server_ports = "Especifique el puerto del servidor"; + $lang->about_server_ports = "80 de HTTP, HTTPS al puerto 443 si se utiliza otro que se especifique lo contrario, el puerto va a necesitar."; ?> diff --git a/modules/board/lang/es.lang.php b/modules/board/lang/es.lang.php index d6b7a0bc6..14d25db1b 100644 --- a/modules/board/lang/es.lang.php +++ b/modules/board/lang/es.lang.php @@ -17,11 +17,11 @@ $lang->cmd_layout_edit = 'Editar el diseño'; // Artículos - $lang->consultation = '상담 기능'; + $lang->consultation = 'Funciones de asesoramiento'; $lang->search_result = 'Resultado de la búsqueda'; - $lang->secret = '비밀글 기능'; - $lang->thisissecret = '비밀글입니다.'; - $lang->admin_mail = '관리자 메일'; + $lang->secret = 'Características Bimilgeul'; + $lang->thisissecret = 'Es bimilgeul.'; + $lang->admin_mail = 'Administrador de Correo'; // Palabras utilizadas en los botones $lang->cmd_board_list = 'Lista del tableros'; @@ -36,9 +36,9 @@ $lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다'; $lang->about_board = 'Este módulo es para crear y manejar los tableros.'; $lang->about_consultation = "No administrador de los miembros que consideran que su propia artocles. \ NNon miembros no serían capaces de escribir artículos al utilizar la consulta."; - $lang->about_secret = '게시판 및 댓글의 비밀글 사용할 수 있도록 합니다.'; - $lang->about_admin_mail = '글이나 댓글이 등록될때 등록된 메일주소로 메일이 발송됩니다
            ,(콤마)로 연결시 다수의 메일주소로 발송할 수 있습니다.'; - $lang->about_list_config = '게시판의 목록형식 사용시 원하는 항목들로 배치를 할 수 있습니다.
            단 스킨에서 지원하지 않는 경우 지원되지 않을 수 있습니다
            대상항목/ 표시항목의 항목을 더블클릭하면 추가/ 제거가 됩니다.'; + $lang->about_secret = 'Boletín y los comentarios de bimilgeul utilizar.'; + $lang->about_admin_mail = 'Comentarios por e-mail registrado geulyina cuando la inscripción se enviará a
            , (coma) como una conexión, puede enviar a varios e-mail.'; + $lang->about_list_config = 'Boletín de la lista, utilice el tipo de elemento que desee, puede colocar.
            Si no está sólo apoyada por la piel no puede ser apoyada
            meta de entrada y mostrar el tema cuando hace doble clic en la entrada en Agregar o quitar es.'; $lang->msg_not_enough_point = 'Your point is not enough to write an article in this board.'; ?> diff --git a/modules/homepage/lang/en.lang.php b/modules/homepage/lang/en.lang.php index dbead4d15..23f01ddef 100644 --- a/modules/homepage/lang/en.lang.php +++ b/modules/homepage/lang/en.lang.php @@ -61,7 +61,7 @@ ); $lang->about_cafe = "CafeXE package provides features to create cafes and to configure them conveniently"; $lang->about_cafe_title = "The title is only used for management, it would not be displayed."; - $lang->about_domain = "In order to create more than one cafe, each of them needs to have own domain name.
            Sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path installed xe.
            ex) www.zeroboard.com/zbxe"; + $lang->about_domain = "In order to create more than one cafe, each of them needs to have own domain name.
            Sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path installed xe.
            ex) www.xpressengine.com/zbxe"; $lang->about_menu_names = "You can set the title of the menu for each language displayed in the menus
            If you input one of the titles, titles for other languages will be set as same."; $lang->about_menu_option = "You can assign it to open a page in a new window when the menu clicked.
            The option for menu expand may work depending on the layout."; diff --git a/modules/homepage/lang/es.lang.php b/modules/homepage/lang/es.lang.php new file mode 100644 index 000000000..51a8d6338 --- /dev/null +++ b/modules/homepage/lang/es.lang.php @@ -0,0 +1,79 @@ +cafe = 'CafeXE'; + $lang->cafe_title = 'Nombre de café'; + $lang->module_type = 'Meta'; + $lang->board = 'Boletines'; + $lang->page = 'Página'; + $lang->module_id = 'Módulo ID'; + $lang->item_group_grant = 'Mostrar grupo'; + $lang->cafe_info = 'Cafe Información'; + $lang->cafe_admin = 'Gerente de café'; + $lang->do_selected_member = 'Los miembros seleccionados: '; + + $lang->default_menus = array( + 'home' => 'Inicio', + 'notice' => 'Anuncios', + 'levelup' => 'Deungeopsincheong', + 'freeboard' => 'Tablón de anuncios', + 'view_total' => 'Ver el artículo completo', + 'view_comment' => 'Historia', + 'cafe_album' => 'Café álbum', + 'menu' => 'Menú', + 'default_group1' => 'Miembro de espera', + 'default_group2' => 'Asociado', + 'default_group3' => 'Miembro', + ); + + $lang->cmd_admin_menus = array( + 'dispHomepageManage' => 'Café Conjunto', + 'dispHomepageMemberGroupManage' => 'Miembro Grupo de Gestión', + 'dispHomepageMemberManage' => 'Lista de miembros', + 'dispHomepageTopMenu' => 'Menú Principal de Gestión de', + "dispHomepageComponent" => "Conjunto de características", + 'dispHomepageCounter' => 'Estadísticas de acceso', + 'dispHomepageMidSetup' => 'Módulo detalle establecido', + ); + $lang->cmd_cafe_registration = 'La creación de Cafe'; + $lang->cmd_cafe_setup = 'Café Conjunto'; + $lang->cmd_cafe_delete = 'Eliminar Cafe'; + $lang->cmd_go_home = 'Ir a Portada'; + $lang->cmd_go_cafe_admin = 'Cafe Todos Administrar'; + $lang->cmd_change_layout = '변경'; + $lang->cmd_select_index = '초기화면 선택'; + $lang->cmd_add_new_menu = '새로운 메뉴 추가'; + $lang->default_language = '기본 언어'; + $lang->about_default_language = '처음 접속하는 사용자의 언어 설정을 지정할 수 있습니다.'; + + $lang->about_cafe_act = array( + 'dispHomepageManage' => 'Cafe의 모양을 꾸밀 수 있습니다', + 'dispHomepageMemberGroupManage' => 'Cafe 내에서 사용되는 그룹 관리를 할 수 있습니다', + 'dispHomepageMemberManage' => 'Cafe에 등록된 회원들을 보거나 관리할 수 있습니다', + 'dispHomepageTopMenu' => 'Cafe의 상단이나 좌측등에 나타나는 일반적인 메뉴를 수정하거나 추가할 수 있습니다', + "dispHomepageComponent" => "에디터 컴포넌트/ 애드온을 활성화 하거나 설정을 변경할 수 있습니다", + 'dispHomepageCounter' => 'Cafe의 접속 현황을 볼 수 있습니다', + 'dispHomepageMidSetup' => 'Cafe에서 사용하는 게시판, 페이지등의 모듈 세부 설정을 할 수 있습니다', + ); + $lang->about_cafe = 'Cafe 서비스 관리자는 다수의 Cafe를 만들 수 있고 또 각 Cafe를 편하게 설정할 수 있도록 합니다.'; + $lang->about_cafe_title = 'Cafe 이름은 관리를 위해서만 사용될 뿐 서비스에는 나타나지 않습니다'; + $lang->about_domain = 'Para crear un dominio privado de la cafetería requiere.
            Independiente de dominio o subdominio, y XE está instalado, el camino que en su conjunto.
            Ej.) www.xpressengine.com / zbxe'; + $lang->about_menu_names = 'Café en el nombre del idioma que aparezca en el menú para que usted pueda especificar.
            Puede entrar en un sólo aplica a todos ustedes '; + $lang->about_menu_option = 'selección de menú puede elegir para abrir saechangeuro.
            Menús desplegables se comportarán de acuerdo con el diseño; + $lang->about_group_grant = 'Cuando aparezca el menú, seleccionar un grupo de grupos seleccionados.
            Miembros no pueden ver cuando se apaga todas las'; + $lang->about_module_type = 'Tablones de anuncios, y el enlace URL de la página para crear un módulo.
            Saengseonghu no puede ser modificado'; + $lang->about_browser_title = 'Acceso a un menú de su navegador para que aparezca en el título se'; + $lang->about_module_id = 'Boletines, jeopsokhalttae jideung dirección de la página se utiliza.
            Sí) de dominio http:// Dominio/ [Módulo ID], dominio http:// Dominio/? Media = [Módulo ID]; + $lang->about_menu_item_url = 'Cuando es la dirección de la URL como vínculo de conexión.
            Http:// excepto para las palabras'; + $lang->about_menu_image_button = 'Menyumyeong pueden usar un menú en lugar de la imagen.'; + $lang->about_cafe_delete = 'Todos los módulos están conectados en caso de supresión de Café (Boletín, página jideung) y será suprimido en consecuencia geuldeulyi.
            ¿Necesita atención'; + $lang->about_cafe_admin = 'Cafe Manager se puede configurar.
            Cafe Manager dirección es http:// /? = Ley dispHomepageManage el administrador puede conectarse a una página que no existe, el usuario no está registrado como administrador'; + + $lang->confirm_change_layout = 'Si cambia el diseño de algunas de la información relativa al diseño puede desaparecer. ¿Te gustaría cambiar?'; + $lang->confirm_delete_menu_item = 'Eliminación de un elemento de menú o de la página, el módulo está conectado con el boletín se eliminarán. Si desea eliminar?'; + $lang->msg_already_registed_domain = 'Ya es de dominio registrado. Por favor, use un dominio diferente'; +?> diff --git a/modules/homepage/lang/ko.lang.php b/modules/homepage/lang/ko.lang.php index 0443a7f56..6ad0c5f00 100644 --- a/modules/homepage/lang/ko.lang.php +++ b/modules/homepage/lang/ko.lang.php @@ -61,7 +61,7 @@ ); $lang->about_cafe = 'Cafe 서비스 관리자는 다수의 Cafe를 만들 수 있고 또 각 Cafe를 편하게 설정할 수 있도록 합니다.'; $lang->about_cafe_title = 'Cafe 이름은 관리를 위해서만 사용될 뿐 서비스에는 나타나지 않습니다'; - $lang->about_domain = '1개 이상의 Cafe를 만들기 위해서는 전용 도메인이 있어야 합니다.
            독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요.
            ex) www.zeroboard.com/zbxe'; + $lang->about_domain = '1개 이상의 Cafe를 만들기 위해서는 전용 도메인이 있어야 합니다.
            독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요.
            ex) www.xpressengine.com/zbxe'; $lang->about_menu_names = 'Cafe에 나타날 메뉴 이름을 언어에 따라서 지정할 수 있습니다.
            하나만 입력하셔도 모두 같이 적용됩니다'; $lang->about_menu_option = '메뉴를 선택시 새창으로 열지를 선택할 수 있습니다.
            펼침 메뉴는 레이아웃에 따라 동작합니다'; $lang->about_group_grant = '그룹을 선택하면 선택된 그룹만 메뉴가 보입니다.
            모두 해제하면 비회원도 볼 수 있습니다'; From cbd221659111e319fc3a0f1af3e712615fedde79 Mon Sep 17 00:00:00 2001 From: bradly1 Date: Sun, 5 Apr 2009 05:29:15 +0000 Subject: [PATCH 164/202] zeroboard.com -> xpressengine.com git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6029 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/homepage/lang/jp.lang.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/homepage/lang/jp.lang.php b/modules/homepage/lang/jp.lang.php index 27376626c..5b0d4e558 100644 --- a/modules/homepage/lang/jp.lang.php +++ b/modules/homepage/lang/jp.lang.php @@ -60,8 +60,13 @@ "dispHomepageMidSetup" => "ホームページの掲示板、ページなどのモジュールを管理します。", ); $lang->about_cafe = "ホームページサービス管理者は複数のホームページ作成、および各ホームページを簡単に管理が出来ます。"; +<<<<<<< .mine + $lang->about_cafe_title = "ホームページ名は管理のためのみ使われ、実サービスには表示されません。"; + $lang->about_domain = "複数のホームページを作成するためには、専用のドメインが必要です。オリジナルドメインやサブ ドメインがあれば結構です。
            また、 XEインストールパスも一緒に記入してください。
            ex) www.xpresengine.com/zbxe"; +======= $lang->about_cafe_title = "ホームページ名は管理をするためだけに使われ、実サービスには表示されません。"; $lang->about_domain = "複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
            また、 XEインストールパスも一緒に記入して下さい。
            ex) www.zeroboard.com/xe"; +>>>>>>> .r6027 $lang->about_menu_names = "ホームページに使うメニュー名を言語別に指定出来ます。
            一個だけ記入した場合、他言語に一括適用されます。"; $lang->about_menu_option = "メニューを選択するとき新しいウィンドウズに開けるかを選択します。
            拡張メニューはレイアウトによって動作します。"; $lang->about_group_grant = "選択グループのみ、メニューが見えます。
            全てを解除すると非会員にも見えます。"; From 24db9a05be785bc51153e417096bd9284ca47c8e Mon Sep 17 00:00:00 2001 From: bradly1 Date: Sun, 5 Apr 2009 05:30:30 +0000 Subject: [PATCH 165/202] zeroboard.com -> xpressengine.com git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6030 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/homepage/lang/jp.lang.php | 2 +- modules/homepage/lang/zh-CN.lang.php | 2 +- modules/homepage/lang/zh-TW.lang.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/homepage/lang/jp.lang.php b/modules/homepage/lang/jp.lang.php index 5b0d4e558..b5f9e3aba 100644 --- a/modules/homepage/lang/jp.lang.php +++ b/modules/homepage/lang/jp.lang.php @@ -65,7 +65,7 @@ $lang->about_domain = "複数のホームページを作成するためには、専用のドメインが必要です。オリジナルドメインやサブ ドメインがあれば結構です。
            また、 XEインストールパスも一緒に記入してください。
            ex) www.xpresengine.com/zbxe"; ======= $lang->about_cafe_title = "ホームページ名は管理をするためだけに使われ、実サービスには表示されません。"; - $lang->about_domain = "複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
            また、 XEインストールパスも一緒に記入して下さい。
            ex) www.zeroboard.com/xe"; + $lang->about_domain = "複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
            また、 XEインストールパスも一緒に記入して下さい。
            ex) www.xpressengine.com/xe"; >>>>>>> .r6027 $lang->about_menu_names = "ホームページに使うメニュー名を言語別に指定出来ます。
            一個だけ記入した場合、他言語に一括適用されます。"; $lang->about_menu_option = "メニューを選択するとき新しいウィンドウズに開けるかを選択します。
            拡張メニューはレイアウトによって動作します。"; diff --git a/modules/homepage/lang/zh-CN.lang.php b/modules/homepage/lang/zh-CN.lang.php index a137d10d9..bf33dac5c 100644 --- a/modules/homepage/lang/zh-CN.lang.php +++ b/modules/homepage/lang/zh-CN.lang.php @@ -61,7 +61,7 @@ ); $lang->about_cafe = "站点工具不仅可以迅速建立多个站点,而且非常方便各项设置。"; $lang->about_cafe_title = "建议使用一个即简洁又直观的名称。此名称不会显示到用户页面当中。"; - $lang->about_domain = "要创建一个站点必须有一个专用域名。
            一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
            ex) www.zeroboard.com/zbxe"; + $lang->about_domain = "要创建一个站点必须有一个专用域名。
            一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
            ex) www.xpressengine.com/zbxe"; $lang->about_menu_names = "在此可以指定多国语言菜单。
            如只输入一项,其他语言同时只应用此项语言。"; $lang->about_menu_option = "可以设置点击菜单时是否要在新窗口中打开。
            展开选项随布局。"; $lang->about_group_grant = "如选择用户组,只有所属组用户才能看到此菜单。
            不选非用户也可以查看。"; diff --git a/modules/homepage/lang/zh-TW.lang.php b/modules/homepage/lang/zh-TW.lang.php index 58a35f0ff..644d10bc4 100644 --- a/modules/homepage/lang/zh-TW.lang.php +++ b/modules/homepage/lang/zh-TW.lang.php @@ -61,7 +61,7 @@ ); $lang->about_cafe = "虛擬網站模組可快速建立網站,且容易進行設定。"; $lang->about_cafe_title = "只有在管理時才看的到此標題。"; - $lang->about_domain = "要建立網站必須要有個專屬域名。
            頂級域名或次級域名都可以。輸入時,請將XE安裝路徑也一起輸入。
            例) www.zeroboard.com/zbxe"; + $lang->about_domain = "要建立網站必須要有個專屬域名。
            頂級域名或次級域名都可以。輸入時,請將XE安裝路徑也一起輸入。
            例) www.xpressengine.com/zbxe"; $lang->about_menu_names = "可指定語言。
            如果只輸入其中一項,其他語言將會顯示一樣。"; $lang->about_menu_option = "可設定案選單時,是否要以新視窗開啟。
            選展開的話,是隨版面。"; From 151793ec6402eb69720542d2f0aab4d75fce8823 Mon Sep 17 00:00:00 2001 From: bradly1 Date: Sun, 5 Apr 2009 05:33:49 +0000 Subject: [PATCH 166/202] =?UTF-8?q?=EC=9E=98=EB=AA=BB=EB=A7=8C=EC=A0=B8?= =?UTF-8?q?=EC=84=9C..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit zeroboard -> xpressengine git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6031 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/homepage/lang/jp.lang.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/homepage/lang/jp.lang.php b/modules/homepage/lang/jp.lang.php index b5f9e3aba..689c90db8 100644 --- a/modules/homepage/lang/jp.lang.php +++ b/modules/homepage/lang/jp.lang.php @@ -60,13 +60,8 @@ "dispHomepageMidSetup" => "ホームページの掲示板、ページなどのモジュールを管理します。", ); $lang->about_cafe = "ホームページサービス管理者は複数のホームページ作成、および各ホームページを簡単に管理が出来ます。"; -<<<<<<< .mine - $lang->about_cafe_title = "ホームページ名は管理のためのみ使われ、実サービスには表示されません。"; - $lang->about_domain = "複数のホームページを作成するためには、専用のドメインが必要です。オリジナルドメインやサブ ドメインがあれば結構です。
            また、 XEインストールパスも一緒に記入してください。
            ex) www.xpresengine.com/zbxe"; -======= $lang->about_cafe_title = "ホームページ名は管理をするためだけに使われ、実サービスには表示されません。"; $lang->about_domain = "複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
            また、 XEインストールパスも一緒に記入して下さい。
            ex) www.xpressengine.com/xe"; ->>>>>>> .r6027 $lang->about_menu_names = "ホームページに使うメニュー名を言語別に指定出来ます。
            一個だけ記入した場合、他言語に一括適用されます。"; $lang->about_menu_option = "メニューを選択するとき新しいウィンドウズに開けるかを選択します。
            拡張メニューはレイアウトによって動作します。"; $lang->about_group_grant = "選択グループのみ、メニューが見えます。
            全てを解除すると非会員にも見えます。"; From d9de0ede4fe955ef64cc059e1705d4377f7a38da Mon Sep 17 00:00:00 2001 From: ngleader Date: Mon, 6 Apr 2009 02:32:58 +0000 Subject: [PATCH 167/202] =?UTF-8?q?=EC=9C=84=EC=A0=AF=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20extar=5Fvar=20=EC=A4=91=20=EB=A7=81=ED=81=AC?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=8B=9C=20http://=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6032 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgetstyles/colorbox/skin.xml | 5 +---- widgetstyles/colorbox/widgetstyle.html | 2 ++ widgetstyles/line/skin.xml | 5 +---- widgetstyles/line/widgetstyle.html | 8 +++++++- widgetstyles/memo/skin.xml | 5 +---- widgetstyles/memo/widgetstyle.html | 8 +++++++- widgetstyles/postitWire/skin.xml | 5 +---- widgetstyles/postitWire/widgetstyle.html | 8 +++++++- widgetstyles/roundFace/skin.xml | 5 +---- widgetstyles/roundFace/widgetstyle.html | 9 ++++++++- widgetstyles/roundWire/skin.xml | 5 +---- widgetstyles/roundWire/widgetstyle.html | 10 ++++++++-- widgetstyles/simple/widgetstyle.html | 10 +++++++++- widgetstyles/simpleRound/skin.xml | 5 +---- widgetstyles/simpleRound/widgetstyle.html | 10 ++++++++-- widgetstyles/simpleSquare/skin.xml | 5 +---- widgetstyles/simpleSquare/widgetstyle.html | 8 +++++++- widgetstyles/simpleTitle/skin.xml | 5 +---- widgetstyles/simpleTitle/widgetstyle.html | 8 +++++++- widgetstyles/squareWire/skin.xml | 5 +---- widgetstyles/squareWire/widgetstyle.html | 8 +++++++- 21 files changed, 87 insertions(+), 52 deletions(-) diff --git a/widgetstyles/colorbox/skin.xml b/widgetstyles/colorbox/skin.xml index e68832bfd..247fe9358 100644 --- a/widgetstyles/colorbox/skin.xml +++ b/widgetstyles/colorbox/skin.xml @@ -86,10 +86,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/colorbox/widgetstyle.html b/widgetstyles/colorbox/widgetstyle.html index a97301df8..85994befa 100644 --- a/widgetstyles/colorbox/widgetstyle.html +++ b/widgetstyles/colorbox/widgetstyle.html @@ -21,6 +21,8 @@ {$widget_content} +{@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);$widgetstyle_extar_var->ws_more_url=substr($widgetstyle_extar_var->ws_more_url,0,4)=='http'?$widgetstyle_extar_var->ws_more_url:'http://' . $widgetstyle_extar_var->ws_more_url;} + diff --git a/widgetstyles/line/skin.xml b/widgetstyles/line/skin.xml index 42aa08af8..546607b1a 100644 --- a/widgetstyles/line/skin.xml +++ b/widgetstyles/line/skin.xml @@ -72,10 +72,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/line/widgetstyle.html b/widgetstyles/line/widgetstyle.html index a97301df8..3e1e05f04 100644 --- a/widgetstyles/line/widgetstyle.html +++ b/widgetstyles/line/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + diff --git a/widgetstyles/memo/skin.xml b/widgetstyles/memo/skin.xml index e5eca0df7..b1fcb988d 100644 --- a/widgetstyles/memo/skin.xml +++ b/widgetstyles/memo/skin.xml @@ -87,10 +87,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/memo/widgetstyle.html b/widgetstyles/memo/widgetstyle.html index a97301df8..3e1e05f04 100644 --- a/widgetstyles/memo/widgetstyle.html +++ b/widgetstyles/memo/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + diff --git a/widgetstyles/postitWire/skin.xml b/widgetstyles/postitWire/skin.xml index 48eb2a71c..23e85d302 100644 --- a/widgetstyles/postitWire/skin.xml +++ b/widgetstyles/postitWire/skin.xml @@ -87,10 +87,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/postitWire/widgetstyle.html b/widgetstyles/postitWire/widgetstyle.html index a97301df8..3e1e05f04 100644 --- a/widgetstyles/postitWire/widgetstyle.html +++ b/widgetstyles/postitWire/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + diff --git a/widgetstyles/roundFace/skin.xml b/widgetstyles/roundFace/skin.xml index 1b84be9b8..a65f750a9 100644 --- a/widgetstyles/roundFace/skin.xml +++ b/widgetstyles/roundFace/skin.xml @@ -84,10 +84,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/roundFace/widgetstyle.html b/widgetstyles/roundFace/widgetstyle.html index 06c118557..59fcdf4ac 100644 --- a/widgetstyles/roundFace/widgetstyle.html +++ b/widgetstyles/roundFace/widgetstyle.html @@ -21,8 +21,15 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + + diff --git a/widgetstyles/roundWire/skin.xml b/widgetstyles/roundWire/skin.xml index aa9cf7816..d27439c7c 100644 --- a/widgetstyles/roundWire/skin.xml +++ b/widgetstyles/roundWire/skin.xml @@ -84,10 +84,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/roundWire/widgetstyle.html b/widgetstyles/roundWire/widgetstyle.html index 06c118557..3e1e05f04 100644 --- a/widgetstyles/roundWire/widgetstyle.html +++ b/widgetstyles/roundWire/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + @@ -41,4 +47,4 @@
          -
      +
      \ No newline at end of file diff --git a/widgetstyles/simple/widgetstyle.html b/widgetstyles/simple/widgetstyle.html index 09bbfbe2d..ae51dc957 100644 --- a/widgetstyles/simple/widgetstyle.html +++ b/widgetstyles/simple/widgetstyle.html @@ -7,9 +7,17 @@ +{@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} diff --git a/widgetstyles/simpleRound/skin.xml b/widgetstyles/simpleRound/skin.xml index 022845eb6..92bb68b02 100644 --- a/widgetstyles/simpleRound/skin.xml +++ b/widgetstyles/simpleRound/skin.xml @@ -71,10 +71,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/simpleRound/widgetstyle.html b/widgetstyles/simpleRound/widgetstyle.html index 06c118557..3e1e05f04 100644 --- a/widgetstyles/simpleRound/widgetstyle.html +++ b/widgetstyles/simpleRound/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + @@ -41,4 +47,4 @@
      -
      +
      \ No newline at end of file diff --git a/widgetstyles/simpleSquare/skin.xml b/widgetstyles/simpleSquare/skin.xml index c01f2779f..5e414a8b7 100644 --- a/widgetstyles/simpleSquare/skin.xml +++ b/widgetstyles/simpleSquare/skin.xml @@ -71,10 +71,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/simpleSquare/widgetstyle.html b/widgetstyles/simpleSquare/widgetstyle.html index a97301df8..3e1e05f04 100644 --- a/widgetstyles/simpleSquare/widgetstyle.html +++ b/widgetstyles/simpleSquare/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + diff --git a/widgetstyles/simpleTitle/skin.xml b/widgetstyles/simpleTitle/skin.xml index b3deba1d1..a04472642 100644 --- a/widgetstyles/simpleTitle/skin.xml +++ b/widgetstyles/simpleTitle/skin.xml @@ -71,10 +71,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + 제외한 URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/simpleTitle/widgetstyle.html b/widgetstyles/simpleTitle/widgetstyle.html index a97301df8..3e1e05f04 100644 --- a/widgetstyles/simpleTitle/widgetstyle.html +++ b/widgetstyles/simpleTitle/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + diff --git a/widgetstyles/squareWire/skin.xml b/widgetstyles/squareWire/skin.xml index 671d8c827..979f30443 100644 --- a/widgetstyles/squareWire/skin.xml +++ b/widgetstyles/squareWire/skin.xml @@ -84,10 +84,7 @@ 查看更多(链接) more URL 「もっと見る」URL - http:// 제외한 URL를 등록합니다. - 请输入除http://以外的URL地址。 - 請輸入http://以外的URL網址。 - http:// を除いたURLを登録します。 + URL를 등록합니다. 더보기 이미지 diff --git a/widgetstyles/squareWire/widgetstyle.html b/widgetstyles/squareWire/widgetstyle.html index a97301df8..3e1e05f04 100644 --- a/widgetstyles/squareWire/widgetstyle.html +++ b/widgetstyles/squareWire/widgetstyle.html @@ -21,8 +21,14 @@ {$widget_content} + {@$widgetstyle_extar_var->ws_more_url=trim($widgetstyle_extar_var->ws_more_url);} - + + + + + + From d391f4db8ca9565327b575ba746361f284a24001 Mon Sep 17 00:00:00 2001 From: ngleader Date: Mon, 6 Apr 2009 08:40:54 +0000 Subject: [PATCH 168/202] html fix git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6033 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/tpl/insert_join_form.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/member/tpl/insert_join_form.html b/modules/member/tpl/insert_join_form.html index 67b546099..f456f02ac 100644 --- a/modules/member/tpl/insert_join_form.html +++ b/modules/member/tpl/insert_join_form.html @@ -30,9 +30,9 @@
      From f847428aa4ed51f00bf996884d61339af56b16ea Mon Sep 17 00:00:00 2001 From: k10206 Date: Mon, 6 Apr 2009 12:10:26 +0000 Subject: [PATCH 169/202] =?UTF-8?q?=EC=9E=91=EB=8F=99=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EC=8A=A4=ED=82=A8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6034 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../skins/cloud_preview/css/normal.css | 26 -------- .../skins/cloud_preview/images/blank.gif | Bin 43 -> 0 bytes .../cloud_preview/images/normal/bulletD0.gif | Bin 44 -> 0 bytes .../images/normal/lineNotice.gif | Bin 139 -> 0 bytes .../skins/cloud_preview/list.html | 61 ------------------ .../skins/cloud_preview/skin.xml | 31 --------- 6 files changed, 118 deletions(-) delete mode 100644 widgets/newest_images/skins/cloud_preview/css/normal.css delete mode 100644 widgets/newest_images/skins/cloud_preview/images/blank.gif delete mode 100644 widgets/newest_images/skins/cloud_preview/images/normal/bulletD0.gif delete mode 100644 widgets/newest_images/skins/cloud_preview/images/normal/lineNotice.gif delete mode 100644 widgets/newest_images/skins/cloud_preview/list.html delete mode 100644 widgets/newest_images/skins/cloud_preview/skin.xml diff --git a/widgets/newest_images/skins/cloud_preview/css/normal.css b/widgets/newest_images/skins/cloud_preview/css/normal.css deleted file mode 100644 index 0df27573e..000000000 --- a/widgets/newest_images/skins/cloud_preview/css/normal.css +++ /dev/null @@ -1,26 +0,0 @@ -.imgcloudoutline_preview { padding-bottom:5px; overflow:hidden; position:relative;} -.imgcloudoutline_preview h2 { text-align:left; font-size:1em; display:block; height:21px; padding:9px 0 0 9px; margin-bottom:5px; color:#000000; background:url(../images/normal/lineNotice.gif) no-repeat left bottom;} - -.imgcloudoutline_preview { padding-bottom:5px; overflow:hidden; position:relative;} -.imgcloudoutline_preview .more { position:absolute; top:12px; right:11px; color:#000000; font:.8em Tahoma;} -.imgcloudoutline_preview a.more { text-decoration:none;} -.imgcloudoutline_preview a.more:hover { text-decoration:underline;} - -.imgcloudoutline_preview table { - border:1px solid #ddd; -} - -.imgcloudoutline_preview table td { - vertical-align:middle; - text-align:center; -} - -.imgcloudoutline_preview table tbody tr td { - padding:1px; - background-color:transparent; - vertical-align:middle; -} - -.imgcloudoutline_preview table tbody tr td:hover { - background-color:#7899AF; -} diff --git a/widgets/newest_images/skins/cloud_preview/images/blank.gif b/widgets/newest_images/skins/cloud_preview/images/blank.gif deleted file mode 100644 index 35d42e808f0a8017b8d52a06be2f8fec0b466a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ diff --git a/widgets/newest_images/skins/cloud_preview/images/normal/bulletD0.gif b/widgets/newest_images/skins/cloud_preview/images/normal/bulletD0.gif deleted file mode 100644 index e8e17d4c63d93ac478a0a54a3abc39ad94eed969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 tcmZ?wbhEHbWM*JyXkcKtaNz<21B2pE79h#MpaUX6G7L=2E%mGn)&RoU2R8r! diff --git a/widgets/newest_images/skins/cloud_preview/images/normal/lineNotice.gif b/widgets/newest_images/skins/cloud_preview/images/normal/lineNotice.gif deleted file mode 100644 index dbf2c8220a7eb9d2b007167e9e0efe70cec5b33c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmV;60CfLHNk%w1VF(8T0DuAj{x%eRe0(AP6+?1mVRU6=Aa`kWXdqN*WgtgMO;7+V z000002nPZH00L2jkEzS;52Ku++KaQ^y!#J^;z*X}iKgnxw(bkZ@=VwEjpzE#_x=wI t3Wvm^@rX<+mrU2>35`mpl&1BH&1$#YuJ;QLi^t@$`HW7h*KAJ#06We2KUn|( diff --git a/widgets/newest_images/skins/cloud_preview/list.html b/widgets/newest_images/skins/cloud_preview/list.html deleted file mode 100644 index 1435d8f5e..000000000 --- a/widgets/newest_images/skins/cloud_preview/list.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - {@ shuffle($widget_info->document_list)} - - - {@ $width = 40} - - {@ $width = $widget_info->thumbnail_width } - - - {@ $height = 40} - - {@ $height = $widget_info->thumbnail_height } - - -
      - -

      {$widget_info->title}

      - - - - more - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - -
      diff --git a/widgets/newest_images/skins/cloud_preview/skin.xml b/widgets/newest_images/skins/cloud_preview/skin.xml deleted file mode 100644 index 6d8721b5a..000000000 --- a/widgets/newest_images/skins/cloud_preview/skin.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - 이미지 클라우드 (팝업) - 相册型最新图片列表皮肤(预览) - イメージクラウド(イメージポップアップ) - 最新圖片相簿型面板(預覽) - 올블로그 이미지 클라우드 (미리보기 팝업 창을 띄웁니다) - 相册型最新图片列表皮肤(预览窗)。 - オールブログイメージクラウド(プレビューポップアップのウィンドウを開きます) - 最新圖片相簿型面板(預覽視窗)。 - 0.1 - 2007-09-28 - http://www.zeroboard.com - - - Simulz - Simulz - Simulz - Simulz - - - - - 기본 컬러 - デフォルトカラー - 默认颜色 - Default Color - 預設顏色 - - - From f6b78ec88c1bf9c9d23523a5b320acd9a8f66252 Mon Sep 17 00:00:00 2001 From: k10206 Date: Mon, 6 Apr 2009 14:12:19 +0000 Subject: [PATCH 170/202] =?UTF-8?q?=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6035 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/newest_images/skins/cloud/css/normal.css | 1 - widgets/newest_images/skins/cloud/list.html | 16 ---------------- widgets/newest_images/skins/cloud/skin.xml | 2 +- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/widgets/newest_images/skins/cloud/css/normal.css b/widgets/newest_images/skins/cloud/css/normal.css index d20e4ad63..575f3f11e 100644 --- a/widgets/newest_images/skins/cloud/css/normal.css +++ b/widgets/newest_images/skins/cloud/css/normal.css @@ -1,7 +1,6 @@ .imgcloudoutline { padding-bottom:5px; overflow:hidden; position:relative; } .imgcloudoutline h2 { text-align:left; font-size:1em; display:block; height:21px; padding:9px 0 0 9px; margin-bottom:5px; color:#000000; background:url(../images/normal/lineNotice.gif) no-repeat left bottom;} -.imgcloudoutline { padding-bottom:5px; overflow:hidden; position:relative;} .imgcloudoutline .more { position:absolute; top:12px; right:11px; color:#000000; font:.8em Tahoma;} .imgcloudoutline a.more { text-decoration:none;} .imgcloudoutline a.more:hover { text-decoration:underline;} diff --git a/widgets/newest_images/skins/cloud/list.html b/widgets/newest_images/skins/cloud/list.html index 961797f4b..946f0f946 100644 --- a/widgets/newest_images/skins/cloud/list.html +++ b/widgets/newest_images/skins/cloud/list.html @@ -6,26 +6,10 @@ {@ shuffle($widget_info->document_list)} - - {@ $width = 40} - {@ $width = $widget_info->thumbnail_width } - - - {@ $height = 40} - {@ $height = $widget_info->thumbnail_height } -
      - -

      {$widget_info->title}

      - - - - more - - diff --git a/widgets/newest_images/skins/cloud/skin.xml b/widgets/newest_images/skins/cloud/skin.xml index 26489a773..7c04e1eae 100644 --- a/widgets/newest_images/skins/cloud/skin.xml +++ b/widgets/newest_images/skins/cloud/skin.xml @@ -12,7 +12,7 @@ 2007-09-28http://www.zeroboard.com - + Simulz Simulz Simulz From 1ce3a67992549746610e017b94b1d3742aefa9b0 Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 6 Apr 2009 23:37:48 +0000 Subject: [PATCH 171/202] =?UTF-8?q?HTTP=20Request=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=90=EB=95=8C=20XE=20=EA=B5=AC=EB=8F=99=EC=9D=B4=20?= =?UTF-8?q?=EB=90=98=EB=A9=B4=20request=5Furi=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=B2=98=EB=A6=AC=EB=A5=BC=20=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20Context::getRequestUri=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6036 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index cc23168c3..28df9134a 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -876,6 +876,9 @@ * @brief 요청이 들어온 URL에서 argument를 제거하여 return **/ function getRequestUri($ssl_mode = FOLLOW_REQUEST_SSL, $domain = null) { + // HTTP Request가 아니면 패스 + if(!isset($_SERVER['SERVER_PROTOCOL'])) return ; + static $url = array(); if(Context::get('_use_ssl') == "always") $ssl_mode = ENFORCE_SSL; @@ -905,14 +908,11 @@ } $url_info = parse_url('http://'.$target_url); - if($use_ssl) - { + if($use_ssl) { if(Context::get("_https_port") && Context::get("_https_port") != 443) { $url_info['port'] = Context::get("_https_port"); } - } - else - { + } else { if(Context::get("_http_port") && Context::get("_http_port") != 80) { $url_info['port'] = Context::get("_http_port"); } From a1f49ed545316a8550666df51ed208bba63d2be3 Mon Sep 17 00:00:00 2001 From: zero Date: Tue, 7 Apr 2009 02:43:14 +0000 Subject: [PATCH 172/202] =?UTF-8?q?XE=EC=9D=98=20FileHandler::getRemoteFil?= =?UTF-8?q?e=EC=9D=84=20PEAR::HTTPReuqest=EB=A5=BC=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95.=20FileHandler?= =?UTF-8?q?::getRemoteResource=EB=A5=BC=20FileHandler::getRemoteFile=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=8B=A4=EC=8B=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=ED=95=98=EA=B3=A0=20config.inc.p?= =?UTF-8?q?hp=EC=97=90=EC=84=9C=20=5F=5FPROXY=5FSERVER=5F=5F=20=EB=9D=BC?= =?UTF-8?q?=EB=8A=94=20=EC=83=81=EC=88=98=EB=A5=BC=20=ED=86=B5=ED=95=B4=20?= =?UTF-8?q?=ED=8A=B9=EC=A0=95=20=EC=84=9C=EB=B2=84=EB=A5=BC=20=EA=B1=B0?= =?UTF-8?q?=EC=B3=90=EC=84=9C=20=EC=99=B8=EB=B6=80=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=EC=9D=84=20=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6037 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/file/FileHandler.class.php | 91 ++++++++++++++------------ classes/widget/WidgetHandler.class.php | 2 +- config/config.inc.php | 8 +++ modules/planet/libs/me2day.api.php | 43 +++--------- 4 files changed, 69 insertions(+), 75 deletions(-) diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 830da21aa..148e0d951 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -266,51 +266,60 @@ return sprintf("%0.2fMB",$size / (1024*1024)); } + /** + * @brief 원격파일을 다운받아 return + **/ + function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array()) { + set_include_path(_XE_PATH_."libs/PEAR"); + require_once('PEAR.php'); + require_once('HTTP/Request.php'); + + if(__PROXY_SERVER__!==null) { + $oRequest = new HTTP_Request(__PROXY_SERVER__); + $oRequest->setMethod('POST'); + $oRequest->_timeout = $timeout; + $oRequest->addPostData('arg', serialize(array('Destination'=>$url, 'method'=>$method, 'body'=>$body, 'content_type'=>$content_type, "headers"=>$headers))); + } else { + $oRequest = new HTTP_Request($url); + if(!$content_type) $oRequest->addHeader('Content-Type', 'text/html'); + else $oRequest->addHeader('Content-Type', $content_type); + if(count($headers)) { + foreach($headers as $key => $val) { + $oRequest->addHeader($key, $val); + } + } + $oRequest->setMethod($method); + if($body) $oRequest->setBody($body); + + $oRequest->_timeout = $timeout; + } + + $oResponse = $oRequest->sendRequest(); + if(PEAR::isError($oResponse)) return; + + $code = $oRequest->getResponseCode(); + $header = $oRequest->getResponseHeader(); + $body = $oRequest->getResponseBody(); + + if($code == 301) { + $url = $header['location']; + if($url) return FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers); + else return; + } + + if($code != 200) return; + + return $body; + } + /** * @brief 원격파일을 다운받아서 특정 위치에 저장 **/ - function getRemoteFile($url, $target_filename) { + function getRemoteFile($url, $target_filename, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array()) { + $body = FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers); + if(!$body) return; $target_filename = FileHandler::getRealPath($target_filename); - - $url_info = parse_url($url); - - if(!$url_info['port']) $url_info['port'] = 80; - if(!$url_info['path']) $url_info['path'] = '/'; - - $fp = @fsockopen($url_info['host'], $url_info['port']); - if(!$fp) return; - - // 한글 파일이 있으면 한글파일 부분만 urlencode하여 처리 (iconv 필수) - /* - $path = $url_info['path']; - if(preg_match('/[\xEA-\xED][\x80-\xFF]{2}/', $path)&&function_exists('iconv')) { - $path_list = explode('/',$path); - $cnt = count($path_list); - $filename = $path_list[$cnt-1]; - $filename = urlencode(iconv("UTF-8","EUC-KR",$filename)); - $path_list[$cnt-1] = $filename; - $path = implode('/',$path_list); - $url_info['path'] = $path; - } - */ - - $header = sprintf("GET %s%s HTTP/1.0\r\nHost: %s\r\nAccept-Charset: utf-8;q=0.7,*;q=0.7\r\nReferer: %s://%s\r\nRequestUrl: %s\r\nConnection: Close\r\n\r\n", $url_info['path'], $url_info['query']?'?'.$url_info['query']:'', $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri()); - - @fwrite($fp, $header); - - $ft = @fopen($target_filename, 'w'); - if(!$ft) return; - - $begin = false; - while(!feof($fp)) { - $str = fgets($fp, 1024); - if($begin) @fwrite($ft, $str); - if(!trim($str)) $begin = true; - } - @fclose($ft); - @fclose($fp); - @chmod($target_filename, 0644); - + FileHandler::writeFile($target_filename, $body); return true; } diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php index 3928d4125..199e71ea1 100644 --- a/classes/widget/WidgetHandler.class.php +++ b/classes/widget/WidgetHandler.class.php @@ -273,7 +273,7 @@ } $output = $widget_content_header . $widget_content_body . $widget_content_footer; -//if($widget=='widgetBox')debugPrint($output); + // 위젯 결과물 생성 시간을 debug 정보에 추가 if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start; // 결과 return diff --git a/config/config.inc.php b/config/config.inc.php index e79fe0532..2a791e0c3 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -31,6 +31,8 @@ * define('__DEBUG_DB_OUTPUT__', 0); * define('__LOG_SLOW_QUERY__', 0); * define('__OB_GZHANDLER_ENABLE__', 1); + * + * define('__PROXY_SERVER__', 'http://domain:port/path'); * ?> */ if(file_exists(_XE_PATH_.'config/config.user.inc.php')) { @@ -85,6 +87,12 @@ **/ if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 1); + /** + * @brief __PROXY_SERVER__ 는 대상 서버를 거쳐서 외부 요청을 하도록 하는 서버의 정보를 가지고 있음 + * FileHandler::getRemoteResource 에서 이 상수를 사용함 + **/ + if(!defined('__PROXY_SERVER__')) define('__PROXY_SERVER__', null); + /** * @brief Firebug 콘솔 출력 사용시 관련 파일 require **/ diff --git a/modules/planet/libs/me2day.api.php b/modules/planet/libs/me2day.api.php index b9163cea3..a6389a4d2 100644 --- a/modules/planet/libs/me2day.api.php +++ b/modules/planet/libs/me2day.api.php @@ -3,11 +3,9 @@ var $user_id = null; var $user_key = null; + var $api_url = 'http://me2day.net:80'; var $application_key = '537a368d9049d9e86b2b169d75a2a4c3'; - var $api_host = 'me2day.net'; - var $api_port = 80; - function me2api($user_id, $user_key) { $this->user_id = $user_id; $this->user_key = $user_key; @@ -29,9 +27,7 @@ } function _getContent($method, $user_id = null, $params = null) { - $host = $this->api_host; - $path = $this->_getPath($method, $user_id); - $port = $this->api_port; + $url = $this->api_url.$this->_getPath($method, $user_id); $auth = base64_encode($this->user_id.':'.$this->_getAuthKey()); $arr_content = array(); @@ -39,35 +35,16 @@ foreach($params as $key => $val) { $arr_content[] = sprintf('%s=%s', $key, urlencode($val)); } - $content = implode('&',$arr_content); + $body = implode('&',$arr_content); } - $header = sprintf( - "POST %s HTTP/1.0\r\n". - "Host: %s\r\n". - "me2_application_key: %s\r\n". - "Content-Type: application/x-www-form-urlencoded\r\n". - "Authorization: Basic %s\r\n". - "Content-Length: %d\r\n\r\n", - $path, - $host, - $this->application_key, - $auth, - strlen($content) - ); - if($content) $header.=$content."\r\n\r\n"; - $fp = fsockopen($host, $port); - if(!$fp) return null; - fwrite($fp, $header); - - $started = false; - while(!feof($fp)) { - $str = fgets($fp, 1024); - if(!trim($str)) $started = true; - if($started) $buff .= $str; - } - fclose($fp); - return trim($buff); + $buff = FileHandler::getRemoteResource($url, $body, 3, 'POST', 'application/x-www-form-urlencoded', + array( + 'me2_application_key'=>$this->application_key, + 'Authorization'=>'Basic '.$auth, + ) + ); + return $buff; } function chkNoop() { From e755e60efc076f9d5bd1973fe91e0fef170e0161 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 7 Apr 2009 05:31:52 +0000 Subject: [PATCH 173/202] Don't hide autosave message. git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6038 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/tpl/js/editor_common.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/editor/tpl/js/editor_common.js b/modules/editor/tpl/js/editor_common.js index 48a414e53..b0ecdc974 100644 --- a/modules/editor/tpl/js/editor_common.js +++ b/modules/editor/tpl/js/editor_common.js @@ -70,7 +70,6 @@ function _editorAutoSave() { // 메시지 만들어서 보여줌 obj.text(oDate.getHours()+':'+oDate.getMinutes()+' '+auto_saved_msg).show(300); - setTimeout(function(){obj.hide(300)}, 2000); // 현재 자동저장중임을 설정 editorAutoSaveObj.locked = true; From 5a99e7faece7a83ff4fd32bb7cb53053d6baa389 Mon Sep 17 00:00:00 2001 From: ngleader Date: Tue, 7 Apr 2009 05:44:56 +0000 Subject: [PATCH 174/202] add XpressEditor git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6039 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/skins/xpresseditor/LICENSE.txt | 9 + modules/editor/skins/xpresseditor/blank.html | 8 + .../editor/skins/xpresseditor/css/default.css | 370 +++++++++++++ .../editor/skins/xpresseditor/css/style.css | 30 ++ modules/editor/skins/xpresseditor/editor.html | 494 ++++++++++++++++++ .../skins/xpresseditor/img/bg_qmark.gif | Bin 0 -> 59 bytes .../editor/skins/xpresseditor/img/bg_tool.gif | Bin 0 -> 98 bytes .../skins/xpresseditor/img/btn_confirm.gif | Bin 0 -> 651 bytes .../skins/xpresseditor/img/btn_expand.gif | Bin 0 -> 63 bytes .../skins/xpresseditor/img/btn_extension.gif | Bin 0 -> 2659 bytes .../xpresseditor/img/btn_layer_cancel.gif | Bin 0 -> 372 bytes .../img/btn_layer_cell_adjust.gif | Bin 0 -> 162 bytes .../xpresseditor/img/btn_layer_close.gif | Bin 0 -> 211 bytes .../xpresseditor/img/btn_layer_confirm.gif | Bin 0 -> 374 bytes .../xpresseditor/img/btn_layer_find_next.gif | Bin 0 -> 417 bytes .../img/btn_layer_find_next_strong.gif | Bin 0 -> 456 bytes .../xpresseditor/img/btn_layer_replace.gif | Bin 0 -> 392 bytes .../img/btn_layer_replace_all.gif | Bin 0 -> 443 bytes .../skins/xpresseditor/img/btn_layer_tab.gif | Bin 0 -> 216 bytes .../skins/xpresseditor/img/btn_qmark.gif | Bin 0 -> 1165 bytes .../skins/xpresseditor/img/btn_search.gif | Bin 0 -> 1078 bytes .../editor/skins/xpresseditor/img/btn_set.gif | Bin 0 -> 11155 bytes .../skins/xpresseditor/img/btn_set_blank.gif | Bin 0 -> 2244 bytes .../skins/xpresseditor/img/bx_character.gif | Bin 0 -> 2092 bytes .../editor/skins/xpresseditor/img/bx_find.gif | Bin 0 -> 514 bytes .../skins/xpresseditor/img/bx_table.gif | Bin 0 -> 721 bytes .../editor/skins/xpresseditor/img/bx_url.gif | Bin 0 -> 399 bytes .../xpresseditor/img/vr_layer_character.gif | Bin 0 -> 44 bytes .../skins/xpresseditor/js/Xpress_Editor.js | 249 +++++++++ .../skins/xpresseditor/js/xe_interface.js | 155 ++++++ modules/editor/skins/xpresseditor/skin.xml | 37 ++ 31 files changed, 1352 insertions(+) create mode 100644 modules/editor/skins/xpresseditor/LICENSE.txt create mode 100644 modules/editor/skins/xpresseditor/blank.html create mode 100644 modules/editor/skins/xpresseditor/css/default.css create mode 100644 modules/editor/skins/xpresseditor/css/style.css create mode 100644 modules/editor/skins/xpresseditor/editor.html create mode 100644 modules/editor/skins/xpresseditor/img/bg_qmark.gif create mode 100644 modules/editor/skins/xpresseditor/img/bg_tool.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_confirm.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_expand.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_extension.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_cancel.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_cell_adjust.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_close.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_confirm.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_find_next.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_find_next_strong.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_replace.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_replace_all.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_layer_tab.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_qmark.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_search.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_set.gif create mode 100644 modules/editor/skins/xpresseditor/img/btn_set_blank.gif create mode 100644 modules/editor/skins/xpresseditor/img/bx_character.gif create mode 100644 modules/editor/skins/xpresseditor/img/bx_find.gif create mode 100644 modules/editor/skins/xpresseditor/img/bx_table.gif create mode 100644 modules/editor/skins/xpresseditor/img/bx_url.gif create mode 100644 modules/editor/skins/xpresseditor/img/vr_layer_character.gif create mode 100644 modules/editor/skins/xpresseditor/js/Xpress_Editor.js create mode 100644 modules/editor/skins/xpresseditor/js/xe_interface.js create mode 100644 modules/editor/skins/xpresseditor/skin.xml diff --git a/modules/editor/skins/xpresseditor/LICENSE.txt b/modules/editor/skins/xpresseditor/LICENSE.txt new file mode 100644 index 000000000..f237bc556 --- /dev/null +++ b/modules/editor/skins/xpresseditor/LICENSE.txt @@ -0,0 +1,9 @@ +XpressEditor - http://www.xpressengine.com + +XpressEditor nhn SmartEditor Basic ߽ϴ. +SmartEditor Basic LGPL v2 Ƿ, XpressEditor ش ̼ ϴ. + XpressEditor Ѵٴ XpressEditor ̼ ǹմϴ. + +LGPL v2̼ URL Ȯ ֽϴ. + +http://www.gnu.org/licenses/lgpl-2.1.html \ No newline at end of file diff --git a/modules/editor/skins/xpresseditor/blank.html b/modules/editor/skins/xpresseditor/blank.html new file mode 100644 index 000000000..5635bcfdc --- /dev/null +++ b/modules/editor/skins/xpresseditor/blank.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/editor/skins/xpresseditor/css/default.css b/modules/editor/skins/xpresseditor/css/default.css new file mode 100644 index 000000000..46fe5dbb3 --- /dev/null +++ b/modules/editor/skins/xpresseditor/css/default.css @@ -0,0 +1,370 @@ +@charset "utf-8"; + +/* Type Selector */ +.xpress-editor *{margin:0; padding:0; font-style:normal; font-size:12px; font-family: 돋움, Dotum, 굴림, Gulim, AppleGothic, Sans-serif;} +.xpress-editor img, +.xpress-editor fieldset, +.xpress-editor button{ border:0;} +.xpress-editor button{ background:none; background-repeat:no-repeat; cursor:pointer; _cursor /**/:hand;} +.xpress-editor button *{ visibility:hidden;} +.xpress-editor legend{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;} +.xpress-editor label{ cursor:pointer; _cursor /**/:hand;} +.xpress-editor hr{ display:none;} +.xpress-editor li{list-style:none;} + +/* Layout Selector */ +.xpress-editor{ position:relative; background:#fff;} +.xpress-editor #smart_content{ position:relative; clear:both; margin:0 0 10px 0; border:1px solid #c2c2c2; *zoom:1;} +.xpress-editor #smart_footer{ position:relative; text-align:center; padding:10px 0;} + +/* Footer */ +.xpress-editor #smart_footer *{ vertical-align:top;} +.xpress-editor #smart_footer button{ position:relative; width:67px; height:25px; margin:0 5px 0 0;} +.xpress-editor #smart_footer button.save_temp{ background:url(../img/btn_save_temp.gif) no-repeat;} +.xpress-editor #smart_footer button.preview{ background:url(../img/btn_preview.gif) no-repeat;} +.xpress-editor #smart_footer input{ margin:0;} +.xpress-editor #smart_footer input.reset{ width:67px; height:25px; border:0; background:url(../img/btn_cancel.gif) no-repeat; cursor:pointer; margin-left:5px;} + +/* Content > Input Area */ +.xpress-editor a.skip{ position:relative; display:block; top:0; right:0; width:0; height:0; overflow:hidden; clear:both; zoom:1} +.xpress-editor a.skip:hover, +.xpress-editor a.skip:active, +.xpress-editor a.skip:focus{ position:relative; display:block; padding:5px; right:0; z-index:60; width:auto; height:auto; text-align:right; white-space:nowrap; color:#000; text-decoration:none; letter-spacing:-1px; _zoom:1;} + +.xpress-editor .input_area{ position:relative; margin:10px; z-index:30; *zoom:1; height:400px;} +.xpress-editor .input_area iframe, +.xpress-editor .input_area textarea{ display:block; width:100%; position:relative; height:100%; border:0; overflow:auto;} +.xpress-editor .input_area iframe{} +.xpress-editor .input_area textarea{ *margin:0 -10px; _margin-bottom:-2px;} +.xpress-editor .input_area textarea.blind{ display:none;} +.xpress-editor .input_control{ position:relative; display:block; width:100%; clear:both; text-align:center; background:#fbfbfb url(../img/btn_expand.gif) no-repeat center center; cursor:n-resize;} +.xpress-editor .input_control span{ display:block; height:10px; border-top:1px solid #dfdfdf; visibility:visible; font-size:0; line-height:200%; white-space:nowrap; color:#fff;} + +.xpress-editor .tool{ position:relative; overflow:visible; padding:5px 10px 6px 10px; *padding:5px 10px 8px 10px; z-index:40; clear:both; background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom; border:0; *zoom:1;} +.xpress-editor .tool:after{ content:""; display:block; clear:both;} +.xpress-editor .tool ul{ position:relative; overflow:visible; float:left; margin:0 5px 2px 0; z-index:2;} +.xpress-editor .tool ul.action{ width:43px;} +.xpress-editor .tool ul.type{ width:auto; white-space:nowrap;} +.xpress-editor .tool ul.style{ width:169px; z-index:5;} +.xpress-editor .tool ul.paragraph{ width:169px; z-index:4;} +.xpress-editor .tool ul.extra1{ width:111px; z-index:3;} +.xpress-editor .tool ul.extra2{ width:auto; z-index:2;} +.xpress-editor .tool ul.extra3{ float:right; width:auto; z-index:1; margin-right:1px;} +.xpress-editor .tool ul.extra3 li{ margin-right:4px;} +.xpress-editor .tool li{ position:relative; float:left;} +.xpress-editor .tool li button{ width:21px; height:21px; background:url(../img/btn_set.gif) no-repeat 0 0; vertical-align:top;} +.xpress-editor .tool li button span{ position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden;} + +.xpress-editor .tool li.extensions span.exButton, +.xpress-editor .tool li.extensions span.exButton button{ float:left; position:relative; display:inline-block; width:auto; background:url(../img/btn_extension.gif) no-repeat left top;} +.xpress-editor .tool li.extensions span.exButton{ margin-right:18px;} +.xpress-editor .tool li.extensions span.exButton button{ left:18px; height:21px; background-position:right top; padding:0 4px 0 0; font:11px/21px Tahoma, Sans-serif; text-align:left;} + +.xpress-editor .tool li.html span, +.xpress-editor .tool li.html span button, +.xpress-editor .tool li.preview span, +.xpress-editor .tool li.preview span button{ float:left; position:relative; display:inline-block; width:auto; height:auto; visibility:visible; background:url(../img/btn_set_blank.gif) no-repeat 0 0; white-space:nowrap;} + +.xpress-editor .tool li.html span, +.xpress-editor .tool li.preview span{ margin-right:2px; background-position:left top;} +.xpress-editor .tool li.html span button, +.xpress-editor .tool li.preview span button{ left:2px; height:21px; background-position:right top; font:11px/21px Tahoma, Sans-serif; padding:0 4px;} + +.xpress-editor .tool ul.type li{ float:none; display:inline; *top:1px;} +.xpress-editor .tool ul.type li select{ height:21px; width:62px;} + +/* Content > Tool > Button Default */ +.xpress-editor .tool li.undo button{ width:22px; background-position:0 0;} +.xpress-editor .tool li.redo button{ background-position:-22px 0;} +.xpress-editor .tool li.bold button{ width:22px; background-position:-43px 0;} +.xpress-editor .tool li.underline button{ background-position:-65px 0;} +.xpress-editor .tool li.italic button{ background-position:-86px 0;} +.xpress-editor .tool li.del button{ background-position:-107px 0;} +.xpress-editor .tool li.fcolor button{ background-position:-128px 0;} +.xpress-editor .tool li.bcolor button{ background-position:-149px 0;} +.xpress-editor .tool li.sup button{ background-position:-170px 0;} +.xpress-editor .tool li.sub button{ background-position:-191px 0;} +.xpress-editor .tool li.left button{ width:22px; background-position:-212px 0;} +.xpress-editor .tool li.center button{ background-position:-234px 0;} +.xpress-editor .tool li.right button{ background-position:-255px 0;} +.xpress-editor .tool li.justify button{ background-position:-276px 0;} +.xpress-editor .tool li.ol button{ background-position:-297px 0;} +.xpress-editor .tool li.ul button{ background-position:-318px 0;} +.xpress-editor .tool li.outdent button{ background-position:-339px 0;} +.xpress-editor .tool li.indent button{ background-position:-360px 0;} +.xpress-editor .tool li.blockquote button{ width:22px; background-position:-381px 0;} +.xpress-editor .tool li.url button{ width:26px; background-position:-403px 0;} +.xpress-editor .tool li.table button{ background-position:-429px 0;} +.xpress-editor .tool li.character button{ background-position:-450px 0;} +.xpress-editor .tool li.find button{ background-position:-471px 0;} +.xpress-editor .tool li.extensions span{ background-position:0 0;} +.xpress-editor .tool li.extensions span button{ background-position:right 0;} +.xpress-editor .tool li.html span{ background-position:0 0;} +.xpress-editor .tool li.html span button{ background-position:right 0;} +.xpress-editor .tool li.preview span{ background-position:0 0;} +.xpress-editor .tool li.preview span button{ background-position:right 0;} + +/* Content > Tool > Button Hover */ +.xpress-editor .tool li.undo button.hover{ width:22px; background-position:0 -21px;} +.xpress-editor .tool li.redo button.hover{ background-position:-22px -21px;} +.xpress-editor .tool li.bold button.hover{ width:22px; background-position:-43px -21px;} +.xpress-editor .tool li.underline button.hover{ background-position:-65px -21px;} +.xpress-editor .tool li.italic button.hover{ background-position:-86px -21px;} +.xpress-editor .tool li.del button.hover{ background-position:-107px -21px;} +.xpress-editor .tool li.fcolor button.hover{ background-position:-128px -21px;} +.xpress-editor .tool li.bcolor button.hover{ background-position:-149px -21px;} +.xpress-editor .tool li.sup button.hover{ background-position:-170px -21px;} +.xpress-editor .tool li.sub button.hover{ background-position:-191px -21px;} +.xpress-editor .tool li.left button.hover{ width:22px; background-position:-212px -21px;} +.xpress-editor .tool li.center button.hover{ background-position:-234px -21px;} +.xpress-editor .tool li.right button.hover{ background-position:-255px -21px;} +.xpress-editor .tool li.justify button.hover{ background-position:-276px -21px;} +.xpress-editor .tool li.ol button.hover{ background-position:-297px -21px;} +.xpress-editor .tool li.ul button.hover{ background-position:-318px -21px;} +.xpress-editor .tool li.outdent button.hover{ background-position:-339px -21px;} +.xpress-editor .tool li.indent button.hover{ background-position:-360px -21px;} +.xpress-editor .tool li.blockquote button.hover{ width:22px; background-position:-381px -21px;} +.xpress-editor .tool li.url button.hover{ width:26px; background-position:-403px -21px;} +.xpress-editor .tool li.table button.hover{ background-position:-429px -21px;} +.xpress-editor .tool li.character button.hover{ background-position:-450px -21px;} +.xpress-editor .tool li.find button.hover{ background-position:-471px -21px;} +.xpress-editor .tool li.extensions span.hover{ background-position:0 -21px;} +.xpress-editor .tool li.extensions span.hover button,{ background-position:right -21px;} +.xpress-editor .tool li.html span.hover{ background-position:0 -21px;} +.xpress-editor .tool li.html span.hover button{ background-position:right -21px;} +.xpress-editor .tool li.preview span.hover{ background-position:0 -21px;} +.xpress-editor .tool li.preview span.hover button{ background-position:right -21px;} + +/* Content > Tool > Button Active */ +.xpress-editor .tool li.undo button.active{ width:22px; background-position:0 -42px;} +.xpress-editor .tool li.redo button.active{ background-position:-22px -42px;} +.xpress-editor .tool li.bold button.active{ width:22px; background-position:-43px -42px;} +.xpress-editor .tool li.underline button.active{ background-position:-65px -42px;} +.xpress-editor .tool li.italic button.active{ background-position:-86px -42px;} +.xpress-editor .tool li.del button.active{ background-position:-107px -42px;} +.xpress-editor .tool li.fcolor button.active{ background-position:-128px -42px;} +.xpress-editor .tool li.bcolor button.active{ background-position:-149px -42px;} +.xpress-editor .tool li.sup button.active{ background-position:-170px -42px;} +.xpress-editor .tool li.sub button.active{ background-position:-191px -42px;} +.xpress-editor .tool li.left button.active{ width:22px; background-position:-212px -42px;} +.xpress-editor .tool li.center button.active{ background-position:-234px -42px;} +.xpress-editor .tool li.right button.active{ background-position:-255px -42px;} +.xpress-editor .tool li.justify button.active{ background-position:-276px -42px;} +.xpress-editor .tool li.ol button.active{ background-position:-297px -42px;} +.xpress-editor .tool li.ul button.active{ background-position:-318px -42px;} +.xpress-editor .tool li.outdent button.active{ background-position:-339px -42px;} +.xpress-editor .tool li.indent button.active{ background-position:-360px -42px;} +.xpress-editor .tool li.blockquote button.active{ width:22px; background-position:-381px -42px;} +.xpress-editor .tool li.url button.active{ width:26px; background-position:-403px -42px;} +.xpress-editor .tool li.table button.active{ background-position:-429px -42px;} +.xpress-editor .tool li.character button.active{ background-position:-450px -42px;} +.xpress-editor .tool li.find button.active{ background-position:-471px -42px;} +.xpress-editor .tool li.extensions span.active{ background-position:0 -42px;} +.xpress-editor .tool li.extensions span.active button{ background-position:right -42px;} +.xpress-editor .tool li.html span.active{ background-position:0 -42px;} +.xpress-editor .tool li.html span.active button{ background-position:right -42px;} +.xpress-editor .tool li.preview span.active{ background-position:0 -42px;} +.xpress-editor .tool li.preview span.active button{ background-position:right -42px;} + +/* Content > Tool > Button Off */ +.xpress-editor .tool.off li.undo button, +.xpress-editor .tool li.undo button.off{ width:22px; background-position:0 -63px;} +.xpress-editor .tool.off li.redo button, +.xpress-editor .tool li.redo button.off{ background-position:-22px -63px;} +.xpress-editor .tool.off li.bold button{ width:22px; background-position:-43px -63px;} +.xpress-editor .tool.off li.underline button{ background-position:-65px -63px;} +.xpress-editor .tool.off li.italic button{ background-position:-86px -63px;} +.xpress-editor .tool.off li.del button{ background-position:-107px -63px;} +.xpress-editor .tool.off li.fcolor button{ background-position:-128px -63px;} +.xpress-editor .tool.off li.bcolor button{ background-position:-149px -63px;} +.xpress-editor .tool.off li.sup button{ background-position:-170px -63px;} +.xpress-editor .tool.off li.sub button{ background-position:-191px -63px;} +.xpress-editor .tool.off li.left button{ width:22px; background-position:-212px -63px;} +.xpress-editor .tool.off li.center button{ background-position:-234px -63px;} +.xpress-editor .tool.off li.right button{ background-position:-255px -63px;} +.xpress-editor .tool.off li.justify button{ background-position:-276px -63px;} +.xpress-editor .tool.off li.ol button{ background-position:-297px -63px;} +.xpress-editor .tool.off li.ul button{ background-position:-318px -63px;} +.xpress-editor .tool.off li.outdent button{ background-position:-339px -63px;} +.xpress-editor .tool.off li.indent button{ background-position:-360px -63px;} +.xpress-editor .tool.off li.blockquote button{ width:22px; background-position:-381px -63px;} +.xpress-editor .tool.off li.url button{ width:26px; background-position:-403px -63px;} +.xpress-editor .tool.off li.table button{ background-position:-429px -63px;} +.xpress-editor .tool.off li.character button{ background-position:-450px -63px;} +.xpress-editor .tool.off li.find button{ background-position:-471px -63px;} +.xpress-editor .tool.off li.extensions span{ background-position:0 -63px;} +.xpress-editor .tool.off li.extensions span button{ background-position:right -63px; color:#bcbcbc;} +.xpress-editor .tool.off li button{ cursor:default;} +.xpress-editor .tool.off ul.extra3 li button{ cursor:pointer;} + +/* Content > Tool > Layer */ +.xpress-editor .tool .layer{ display:none; position:absolute; left:0; top:20px; background-color:#fbfbfb; border:1px solid #c5c5c5; border-right:1px solid #9f9f9f; border-bottom:1px solid #9f9f9f;} +.xpress-editor .tool .layer li{ float:none; left:0;} +.xpress-editor .tool .layer button{ margin:0 !important; width:auto; height:auto; background:none;} +.xpress-editor .tool .layer button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;} +.xpress-editor .tool .btn_area{ position:relative; clear:both; text-align:center !important; padding:7px 0 12px 0; width:100%; white-space:nowrap; *zoom:1;} +.xpress-editor .tool .btn_area *{ vertical-align:top;} +.xpress-editor .tool button.close{ position:absolute; top:4px; right:3px; width:21px; height:20px; background:url(../img/btn_layer_close.gif) no-repeat center center !important;} +.xpress-editor .tool button.close span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} +.xpress-editor .tool .layer .btn_area button{ *margin:0 2px !important;} +.xpress-editor .tool .layer .btn_area button.confirm{ width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;} +.xpress-editor .tool .layer .btn_area button.cancel{ width:38px; height:21px; background:url(../img/btn_layer_cancel.gif) no-repeat;} + +.xpress-editor .tool li.fcolor .layer{ width:218px !important; height:auto !important; background-image:none !important; overflow:hidden;} +.xpress-editor .tool .layer .palette{ width:210px; position:relative; left:7px; padding:8px 0 7px 0; margin:0;} +.xpress-editor .tool .layer .palette li{ float:left; margin:0 1px 1px 0; font-size:0; line-height:0;} +.xpress-editor .tool .layer .palette button{ position:relative; overflow:hidden; width:11px; height:11px;} + +.xpress-editor .tool li.bcolor .layer { width:218px; overflow:hidden;} +.xpress-editor .tool .layer .background{ width:210px; position:relative; left:7px; margin:0 0 -2px 0; padding:8px 0 0 0; *padding-bottom:8px; _padding-bottom:4px;} +.xpress-editor .tool .layer .background li{ float:left; margin:0 5px 2px 0;} +.xpress-editor .tool .layer .background button{ position:relative; overflow:hidden; width:65px; height:19px; text-align:left; padding:4px;} +.xpress-editor .tool .layer .background button span{ position:relative; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto;} + +.xpress-editor .tool li.style .layer{ padding:4px 2px; _overflow:hidden; filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2);} +.xpress-editor .tool li.style .layer li{ position:relative; background:#fbfbfb;} +.xpress-editor .tool li.style .layer li button{ display:block; width:134px; position:relative;} +.xpress-editor .tool li.style .layer li button span{ display:block; width:130px; text-align:left; letter-spacing:normal;} +.xpress-editor .tool li.style .layer li.h3 button span{ padding:3px 0 1px 4px; height:15px; _height /**/:19px; font-size:16px; font-weight:bold;} +.xpress-editor .tool li.style .layer li.h4 button span{ padding:3px 0 2px 4px; height:13px; _height /**/:18px; font-size:14px; font-weight:bold;} +.xpress-editor .tool li.style .layer li.h5 button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px; font-weight:bold;} +.xpress-editor .tool li.style .layer li.h6 button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px;} +.xpress-editor .tool li.style .layer li.p button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px; color:#5d5d5d;} +.xpress-editor .tool li.style .layer li button.hover{ background:#c1f471; *height:1%;} + +.xpress-editor .tool li.blockquote .layer{ padding:6px 5px 6px 7px; left:0; width:288px;} +.xpress-editor .tool li.blockquote .layer ul{ *zoom:1; margin:0;} +.xpress-editor .tool li.blockquote .layer ul:after{ content:""; display:block; clear:both;} +.xpress-editor .tool li.blockquote .layer li{ position:relative; float:left; overflow:hidden; width:32px; height:34px; margin:0 2px 0 0; border:1px solid #cdcecc; background-image:url(../img/btn_qmark.gif); background-repeat:no-repeat;} +.xpress-editor .tool li.blockquote .layer li.q1{ background-position:0 0;} +.xpress-editor .tool li.blockquote .layer li.q2{ background-position:-32px 0;} +.xpress-editor .tool li.blockquote .layer li.q3{ background-position:-64px 0;} +.xpress-editor .tool li.blockquote .layer li.q4{ background-position:-96px 0;} +.xpress-editor .tool li.blockquote .layer li.q5{ background-position:-128px 0;} +.xpress-editor .tool li.blockquote .layer li.q6{ background-position:-160px 0;} +.xpress-editor .tool li.blockquote .layer li.q7{ background-position:-192px 0;} +.xpress-editor .tool li.blockquote .layer li.q8{ background-position:-224px 0;} +.xpress-editor .tool li.blockquote .layer li button{ width:32px; height:34px;} + +.xpress-editor .tool li.url .layer{ width:231px; height:125px; background-image:url(../img/bx_url.gif); background-repeat:no-repeat; background-position:10px 14px;} +.xpress-editor .tool li.url .layer fieldset{ position:absolute; width:212px; left:10px; top:14px;} +.xpress-editor .tool li.url .layer fieldset h3{ position:absolute; top:-4px; left:15px; color:#404040; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto; background:none; margin:0; padding:0; font-weight:normal;} +.xpress-editor .tool li.url .layer fieldset input.link{ position:absolute; left:12px; top:19px; width:179px; padding:2px 0 1px 6px; *margin:-1px 0; font-size:11px; height:13px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} +.xpress-editor .tool li.url .layer fieldset p{ position:absolute; left:12px; top:44px;} +.xpress-editor .tool li.url .layer fieldset p input{ width:13px; height:13px; vertical-align:middle; margin-right:3px;} +.xpress-editor .tool li.url .layer .btn_area{ position:absolute; bottom:12px; padding:0;} + +.xpress-editor .tool li.table .layer{ width:242px; height:239px; background-image:url(../img/bx_table.gif); background-repeat:no-repeat; background-position:10px 14px;} +.xpress-editor .tool li.table .layer fieldset{ position:absolute; width:222px; left:10px;} +.xpress-editor .tool li.table .layer fieldset h3{ position:absolute; top:-4px; left:15px; color:#404040; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto; background:none; margin:0; padding:0; font-weight:normal;} + +.xpress-editor .tool li.table .layer fieldset dl{ position:absolute; left:10px;} +.xpress-editor .tool li.table .layer fieldset dt{ float:left; padding:3px 0 0 0; height:20px; white-space:nowrap; letter-spacing:-1px;} +.xpress-editor .tool li.table .layer fieldset dd{ float:right; position:relative;} +.xpress-editor .tool li.table .layer fieldset dd button.add, +.xpress-editor .tool li.table .layer fieldset dd button.del{ position:absolute; left:27px; width:15px; height:8px; background:url(../img/btn_layer_cell_adjust.gif) no-repeat;} +.xpress-editor .tool li.table .layer fieldset dd button.add{ top:1px;} +.xpress-editor .tool li.table .layer fieldset dd button.del{ top:9px; background-position:0 -8px;} +.xpress-editor .tool li.table .layer fieldset dd .preview_palette{ display:block; float:left; margin:0 3px 0 0; padding:2px; position:relative; border:1px solid #c8c9c6; width:14px; height:14px; overflow:hidden;} +.xpress-editor .tool li.table .layer fieldset dd .preview_palette button{ width:14px; height:14px; font-size:500px; line-height:0;} +.xpress-editor .tool li.table .layer fieldset dd .find_palette{ width:33px; height:20px; background:url(../img/btn_search.gif) no-repeat;} + +.xpress-editor .tool li.table .layer fieldset.num{ top:14px;} +.xpress-editor .tool li.table .layer fieldset.num dl{ top:18px; width:60px;} +.xpress-editor .tool li.table .layer fieldset.num dt{ height:20px;} +.xpress-editor .tool li.table .layer fieldset.num dd{ height:23px;} +.xpress-editor .tool li.table .layer fieldset.num dt label{ font-size:11px; color:#333;} +.xpress-editor .tool li.table .layer fieldset.num dd input{ padding:3px 0 0 6px; *margin:-1px 0; width:35px; height:13px; font-size:11px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} + +.xpress-editor .tool li.table .layer fieldset.color{ top:96px;} +.xpress-editor .tool li.table .layer fieldset.color dl{ top:18px; width:210px;} +.xpress-editor .tool li.table .layer fieldset.color dt{ height:23px;} +.xpress-editor .tool li.table .layer fieldset.color dd{ height:26px; width:146px;} +.xpress-editor .tool li.table .layer fieldset.color dt label{ font-size:11px; color:#333;} +.xpress-editor .tool li.table .layer fieldset.color dd input{ padding:3px 0 0 6px; *margin:-1px 0; font-size:11px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} +.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_width{ width:35px; height:13px;} +.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_color, +.xpress-editor .tool li.table .layer fieldset.color dd input#table_bg_color{ width:70px; height:15px; *margin-right:3px;} + +.xpress-editor .tool li.table .layer table{ position:absolute; top:18px; left:75px; width:137px; height:40px; table-layout:fixed;} +.xpress-editor .tool li.table .layer table *{ font-size:0; line-height:0;} +.xpress-editor .tool li.table .layer table th, +.xpress-editor .tool li.table .layer table td{ text-align:center;} +.xpress-editor .tool li.table .layer .btn_area{ position:absolute; bottom:12px; padding:0; z-index:1;} + +.xpress-editor .tool li.table .layer .palette{ display:none; position:absolute; z-index:2; left:11px; width:204px; padding:8px 7px 7px 7px; _padding-right:6px; background-color:#fbfbfb; border:1px solid #c5c5c5; border-right:1px solid #9f9f9f; border-bottom:1px solid #9f9f9f;} +.xpress-editor .tool li.table .layer.p1 .palette{ display:block; top:163px;} +.xpress-editor .tool li.table .layer.p2 .palette{ display:block; top:189px;} + +.xpress-editor .tool li.character .layer{ width:433px; height:242px; overflow:hidden;} +.xpress-editor .tool li.character .layer ul{ margin:0;} +.xpress-editor .tool li.character .layer h3{position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} +.xpress-editor .tool li.character .layer .nav{ position:absolute; top:11px; left:-1px; overflow:hidden; white-space:nowrap;} +.xpress-editor .tool li.character .layer .nav li{ display:inline; margin:0 -4px 0 0; padding:0 8px; background:url(../img/vr_layer_character.gif) no-repeat 0 0;} +.xpress-editor .tool li.character .layer .nav li a{ color:#444; text-decoration:none; letter-spacing:-1px;} +.xpress-editor .tool li.character .layer .nav li a:hover, +.xpress-editor .tool li.character .layer .nav li a:active, +.xpress-editor .tool li.character .layer .nav li a:focus{ text-decoration:underline;} +.xpress-editor .tool li.character .layer .nav li a.on{ font-weight:bold; color:#004790; display:inline;} +.xpress-editor .tool li.character .layer .list{ position:absolute; left:7px; top:30px; width:421px; height:172px; background:url(../img/bx_character.gif) no-repeat;} +.xpress-editor .tool li.character .layer .list li{ position:relative; top:1px; left:1px; float:left; width:20px; height:18px; margin:0 1px 1px 0;} +.xpress-editor .tool li.character .layer .list li button{ width:20px; height:18px;} +.xpress-editor .tool li.character .layer .list li button.hover{ border:2px solid #27c11a;} +.xpress-editor .tool li.character .layer .list li button span{ overflow:visible; font-size:12px; width:auto; height:auto; position:relative; visibility:visible; line-height:normal;} +.xpress-editor .tool li.character .layer p{ position:absolute; top:212px; left:7px;} +.xpress-editor .tool li.character .layer p *{ vertical-align:top;} +.xpress-editor .tool li.character .layer p label{ position:relative; top:4px; margin:0 7px 0 0; color:#333; letter-spacing:-1px;} +.xpress-editor .tool li.character .layer p input{ padding:3px 0 0 4px; margin:0 4px 0 0; width:300px; _width /**/:306px; height:16px; _height /**/:20px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} +.xpress-editor .tool li.character .layer p button{ position:relative; *top:1px; width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;} +.xpress-editor .tool li.character .layer p button span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} + +.xpress-editor .tool li.find .layer{ width:242px;} +.xpress-editor .tool li.find .layer h3{ background:#f2f2f2; color:#333; height:21px; margin:0 0 11px 0; padding:7px 0 0 5px;} +.xpress-editor .tool li.find .layer .menu_tab{ position:relative; z-index:20; width:100%; *zoom:1;} +.xpress-editor .tool li.find .layer .menu_tab:after{ content:""; display:block; clear:both;} +.xpress-editor .tool li.find .layer .layer_tab{ position:relative; left:10px; padding:0; margin:0; clear:both;} +.xpress-editor .tool li.find .layer .layer_tab li{ position:relative; z-index:1; float:left; margin-right:1px; background:url(../img/btn_layer_tab.gif) no-repeat 0 0;} +.xpress-editor .tool li.find .layer .layer_tab li a{ position:relative; display:block; float:left; left:2px; height:15px; padding:4px 9px 0 5px; color:#404040; text-decoration:none; background:url(../img/btn_layer_tab.gif) no-repeat right 0;} +.xpress-editor .tool li.find .layer.find .layer_tab li.tab1, +.xpress-editor .tool li.find .layer.replace .layer_tab li.tab2{ top:-1px; margin-bottom:-1px;} +.xpress-editor .tool li.find .layer.find .layer_tab li.tab1 a, +.xpress-editor .tool li.find .layer.replace .layer_tab li.tab2 a{ height:18px;} +.xpress-editor .tool li.find .layer .container{ position:relative; z-index:1; clear:both; top:-2px;} +.xpress-editor .tool li.find .layer .container .bx{ display:none; position:relative; width:222px; left:10px; clear:both; z-index:1; background:url(../img/bx_find.gif) no-repeat;} +.xpress-editor .tool li.find .layer.find .container #find, +.xpress-editor .tool li.find .layer.replace .container #replace{ display:block;} + +.xpress-editor .tool li.find .layer .bx fieldset{ position:relative; padding:13px 0 17px 11px;} +.xpress-editor .tool li.find .layer .bx fieldset *{ vertical-align:top;} +.xpress-editor .tool li.find .layer .bx label{ position:relative; top:4px; margin:0 7px 0 0; font-size:11px; letter-spacing:-1px; color:#333;} +.xpress-editor .tool li.find .layer .bx input{ padding:3px 0 0 4px; width:144px; _width /**/:150px; height:14px; _height /**/:19px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} +.xpress-editor .tool li.find .layer .bx .cap{ position:absolute; left:0; bottom:0; display:block; width:222px; height:2px; _margin:0 0 -1px 0; overflow:hidden; background:#fff url(../img/bx_find.gif) no-repeat left bottom; font-size:0; line-height:0;} +.xpress-editor .tool li.find .layer .bx#replace fieldset{ height:45px; _height /**/:75px;} +.xpress-editor .tool li.find .layer .bx#replace fieldset #keyword2{ margin-bottom:6px;} +.xpress-editor .tool li.find .layer .btn_area button{ display:none; *margin:0 2px !important;} +.xpress-editor .tool li.find .layer.find .btn_area .find_next{ display:inline; width:62px; height:21px; background:url(../img/btn_layer_find_next_strong.gif) no-repeat;} +.xpress-editor .tool li.find .layer.replace .btn_area .find_next{ display:inline; width:55px; height:21px; background:url(../img/btn_layer_find_next.gif) no-repeat;} +.xpress-editor .tool li.find .layer.replace .btn_area .replace{ display:inline; width:48px; height:21px; background:url(../img/btn_layer_replace.gif) no-repeat;} +.xpress-editor .tool li.find .layer.replace .btn_area .replace_all{ display:inline; width:69px; height:21px; background:url(../img/btn_layer_replace_all.gif) no-repeat;} +.xpress-editor .tool li.find .layer .btn_area .cancel{ display:inline;} + +.xpress-editor .tool li.extensions .layer{ width:auto; white-space:nowrap; padding:5px 10px;} +.xpress-editor .tool li.extensions .layer li{ margin:2px 0;} + +/* File Uploader */ +.xpress-editor .fileUploader{ clear:both; position:relative; padding-top:5px; *zoom:1; *margin-bottom:5px;} +.xpress-editor .fileUploader:after{ content:""; display:block; clear:both;} +.xpress-editor .fileUploader .preview{ float:left; width:64px; height:64px; border:1px solid #ccc;; padding:2px; margin:0 10px 5px 10px;} +.xpress-editor .fileUploader .preview.black { background-color:#000; border:1px solid #666;} +.xpress-editor .fileUploader .preview img{ display:block; width:64px; height:64px;} +.xpress-editor .fileUploader .fileListArea{ float:left; width:260px; margin:0 10px 5px 0;} +.xpress-editor .fileUploader .fileListArea select{ width:100%; height:70px; overflow:auto;} +.xpress-editor .fileUploader .fileListArea select option{ font-size:11px;} +.xpress-editor .fileUploader .fileListArea.black select { background-color:#000; border:1px solid #666;} +.xpress-editor .fileUploader .fileListArea.black select option { color:#aaa; } +.xpress-editor .fileUploader .fileUploadControl{ clear:right;} +.xpress-editor .fileUploader .fileUploadControl .button{ margin-bottom:5px;} +.xpress-editor .fileUploader .file_attach_info{ clear:right; margin:5px 0;} + +/* Auto Save */ +.xpress-editor .autosave_message { display:none; background: #f6ffdb; padding:6px 10px; margin:0; line-height:1;} \ No newline at end of file diff --git a/modules/editor/skins/xpresseditor/css/style.css b/modules/editor/skins/xpresseditor/css/style.css new file mode 100644 index 000000000..6089b05c0 --- /dev/null +++ b/modules/editor/skins/xpresseditor/css/style.css @@ -0,0 +1,30 @@ +@charset "utf-8"; +/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) 200812 */ + +html, +body{ height:100%;} + +#xpressInput{ margin:0 10px 0 0;} +.xpressOutput{ font-size:12px; line-height:1.6; font-family:Dotum, AppleGothic, Sans-serif;} + +.xpressOutput p{ margin-top:7px; margin-bottom:7px;} + +.xpressOutput blockquote.q1, +.xpressOutput blockquote.q2, +.xpressOutput blockquote.q3, +.xpressOutput blockquote.q4, +.xpressOutput blockquote.q5, +.xpressOutput blockquote.q6, +.xpressOutput blockquote.q7{ padding:10px; margin-left:15px; margin-right:15px;} + +.xpressOutput blockquote.q1{ padding:0 10px; border-left:2px solid #ccc;} +.xpressOutput blockquote.q2{ padding:0 10px; background:url(../img/bg_qmark.gif) no-repeat;} +.xpressOutput blockquote.q3{ border:1px solid #d9d9d9;} +.xpressOutput blockquote.q4{ border:1px solid #d9d9d9; background:#fbfbfb;} +.xpressOutput blockquote.q5{ border:2px solid #707070;} +.xpressOutput blockquote.q6{ border:1px dashed #707070;} +.xpressOutput blockquote.q7{ border:1px dashed #707070; background:#fbfbfb;} + +.xpressOutput sup{ font:10px Tahoma;} +.xpressOutput sub{ font:10px Tahoma;} +.xpressOutput table td{ padding:4px;} diff --git a/modules/editor/skins/xpresseditor/editor.html b/modules/editor/skins/xpresseditor/editor.html new file mode 100644 index 000000000..45930429e --- /dev/null +++ b/modules/editor/skins/xpresseditor/editor.html @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + +
      +
      + + +
      + + +
        +
      • +
      • +
      +
        +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      +
        +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + + + + +
      • +
      • + + + + +
      • +
      • + +
      • +
      • + +
      • +
      +
        +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      • + +
      • +
      +
        +
      • + + + + +
      • + +
      • + + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
          
          
          
          
      + +
      +

      {$lang->edit->table_config}

      +
      +
      + +
      +
      + + + +
      +
      + +
      +
      + + + +
      +
      + +
      +
      + + + +
      +
      +
      +
      + + +
      +
      + + +
    • + + + + +
    • +
    • + + + + +
    • +
    + + + + + + +
      + + +
    • + + +
    +
    + + +
    + +
    + + +

     

    + + + + + +
    + + + + + + +
    +
    +
    + +
    +
    + + + +
    +
    {$upload_status}
    +
    + +
    + + + \ No newline at end of file diff --git a/modules/editor/skins/xpresseditor/img/bg_qmark.gif b/modules/editor/skins/xpresseditor/img/bg_qmark.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a8a44625d0bcdbc038ee4aaa0f75575fbc4f146 GIT binary patch literal 59 zcmZ?wbhEHbWM|-IX!y@?;J|^No*u=YEQ}05paUX6G7d~aEJ@R)YxnU?%3Kv;T*6z* J)5gkR4FK554=Mlv literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/bg_tool.gif b/modules/editor/skins/xpresseditor/img/bg_tool.gif new file mode 100644 index 0000000000000000000000000000000000000000..219957adad07aa81927c5cda0a06ea38f0eed2a6 GIT binary patch literal 98 zcmZ?wbhEHbWMq(F*v!E2@#DvT|Ngyu_wM!U*I&PW{q*V6`}gnX&!7L{!-oeC9=v_~ z_Vee@-@bkO{{8!xFJBlK7!-f907(W09S{LBgMo#AgQr{P?sCzFo&e_p6>k;>YXF9D BGa&!~ literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_confirm.gif b/modules/editor/skins/xpresseditor/img/btn_confirm.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd78c5fdd68848dc434547407ae52cb0d4024b68 GIT binary patch literal 651 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 D19YBO literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_layer_cancel.gif b/modules/editor/skins/xpresseditor/img/btn_layer_cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..789f82ae56f25d585960724a94ad2901947459f8 GIT binary patch literal 372 zcmZ?wbhEHbRAUfjI3mXI{rmTS|NedX^5xsNZ|~o~|NsC0jT<-i?c29!&z{SdFaP}c z^TUS^*RNmy@#Dw4ckh1v`t|qkUl$jbKY#x0-Mjbe*RQ{S{|0Jdzzr0CvM@3*h%xAZ zlz{AHVEwot)h8u$-iyu!?TT`ZD(6dbuZQybo?#Sa>?rWik!qi$AZX$EMC-ze60f;- z%O0QlIeD?DDMkj;yADmQ)6jrOTEt6I`)!IkU(*5r#?zrsXx;MOLlexq9oy z&Aa!k*}ZEi6Z2Lk1}+t@B}cZc+|M~mRcW*eABFg*X z{jv2-`xt~&7+F~Oe*gLV@Bg1Kf)NwWGd3~^yD{uMxIwXn!Lflw!$7gILqx(jYl{RE GgEato%&orw literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_layer_cell_adjust.gif b/modules/editor/skins/xpresseditor/img/btn_layer_cell_adjust.gif new file mode 100644 index 0000000000000000000000000000000000000000..3d7110db49d104844415c510154b96bc2ce4b438 GIT binary patch literal 162 zcmV;T0A2q_Nk%w1VGjTh0J8u9{{H^`{r%6*&dkir!NI}R)zx8PVWgv@?(XjL^78xp z`}p|y<>lp;mX^A@y8r+GA^8LV00000EC2ui01p5V000C}u((Mp9WJQNy9$Q`EM#de zK=>pqYqad6A~a&$H6l9?I4oD%$P6pNh1=ZdZ&#og&*1d7* z$z5}($lE_~%d^+LulLMbGWGICx9+x0fjJEGIwmGaoe*8q$dLTx#j{;~`Q=|UW}kl+ b$aE-Ao~{3&gQ3xu_vOtlDX-o;Ggt!v)dy&Q literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_layer_confirm.gif b/modules/editor/skins/xpresseditor/img/btn_layer_confirm.gif new file mode 100644 index 0000000000000000000000000000000000000000..519fb734df769acc87f31a379ba10b933365a48e GIT binary patch literal 374 zcmZ?wbhEHbRAUfjI3mXI{rmTS|NedX^5xsNZ|~o~|NsC0jT<-i?c29!&z{SdFaP}c z^TUS^*RNmy@#Dw4ckh1v`t|qk-#>r;?A^Q9#l_|8*RQ{S{|0Jdzzr0CvM@3*h%xAZ zlz{AHVEw!x)gvWy-iyu!?TT`aD(6dbuZQw_o?#Sa>?rWik!qi)AgJN^MC-ze60f;- z%OuyOvF-NiUU%K~t!`8F& zc;9^5b^0KKpb8@k3*X;={~4HnJ$6qxXvfaNz%UHE;xj;t~^VyQz`xWc1`?qlPH$HaMk?KFOq$pCvO+`@+O@?Q2BQD&{a#xhSz1%xSeYo&Sl?NcS5s2k zUCJFB-_cdl*WcScDJ^~4+(k*bt#f(;7YGI}?rd4#+`6!;AK4S)YJu-$PNNN8k=W6_B)U%$|~{n>>8j}IFbxh66wOenapfRT|& y*11c@bJLQOljWr4EIJIFPVlfBB%hk&xp~>y*?ep+1`18B=jS{4f8b$cum%A8<;-FL literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_layer_find_next_strong.gif b/modules/editor/skins/xpresseditor/img/btn_layer_find_next_strong.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1f183ec1b42e4e567038dc8ea7349f9415d5c86 GIT binary patch literal 456 zcmZ?wbhEHbv||uuI3mXI{rmTC-@g6-|Nq8~8~gU{d-v|$<;$0U{``6U`t=VVKJ3}E z=f{s9zkdDt^5x6>_wWDx`}gr;?A^Q9#l_|8*RQ{S{|4%1zzr0CvM@3*h%xAZ zlz{AHVEwGFm1=Y%gZOl06ad;V_4y}dUc?YVgE`pw&CdH23N z@#6jSCs#kd;ALP}VL$$c@yv%8Hy4W=$e0$s%KO`WZ9(+mGGV#C?i(M@Id_QY$1N!~ zbZ9VOk@&(~v0=%{$(KI3?p(QHL1aVQiCqilcnV83aHz;x6a*}2XlAi)=92Z=vf|=m qms-0C22C8jN-lCPwGLZXU0ofqIqR;LLldK*?x8N()sM0{7_0%f=j1j3 literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_layer_replace.gif b/modules/editor/skins/xpresseditor/img/btn_layer_replace.gif new file mode 100644 index 0000000000000000000000000000000000000000..10051f3df99d9d25c9e7ead0a266b67978354c9e GIT binary patch literal 392 zcmZ?wbhEHbG++>AI3mjM{rmSDH*W0Px9|V||L@+t`}XbI<;$0U{``6U`t=__e(c$^ z=hv@aU%q^K|Ni~IfB*je{rl(7pS^qcy12M}{rdIy@83XO40wU!PZmZ7pjA2`RUkVV zSpO%8x};>z%UHF{Nr8(`<$Ou*{T+W@IzI69wHJ8kNcEpkGFY_0LF2-T60fyUEBje9 zKklj8AKzhiD7HdXNVDp!-SWkca;G=7U3-~d`tRJc=L?f#0_)1^TbtV|+8ZK^I=aiN z`h!~nj2eq;^Cxz9g-rD;6!e>1S30Y9(p-_=6b9i985@N*Z`ihN)Ak)(wr*o+WZ>Dm zbLTGMquWoM*dM)qbI#slCyrk}%EQ2}!hY`9?z>m+?>e0L-Mi;wp! XI2XwX9Bk+i)d*%?rIKjG!e9*moi@G9 literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_layer_replace_all.gif b/modules/editor/skins/xpresseditor/img/btn_layer_replace_all.gif new file mode 100644 index 0000000000000000000000000000000000000000..7264bb1adfa147b2f9f14d06b7a311961abdff57 GIT binary patch literal 443 zcmZ?wbhEHbbY&1_I3mjM>({UE-@o6uabw@UegFUe|MuO$^3m+;xdG^wob62iizbVW(fsyCN`3JXdUVeD(>A4rrPTomA@!-|V z=fzi_fBtrohml={{r#m2A39g7=PMk{-OZ(ud|<=E!|goE4s%X8D7kct$R_CoIGkZ% z_|MZN;~6w(Uo5wm#j2P{BL)^BJ}DD}1czm3XIm7%x^r@~`ng$rDm@BLhZ`?0_L!^{ aduq$d%S%{P6a+3VT6J}G#PT)<25SHg(#>-`?Kf-t6t{+uhs$|Nr~@`~Uy{A^8LW000L7 zEC2ui0LTCq000A>cp%jNFv>}*y*TU5yMF?p3`J?4XsWJk>%MR-&vb340}vEO@BhG{ za7Zi~kI1BQ$!t1~mzkW8o1LJBpP{6Gqot^Lr>U%NtF5qR Sud%dY1qTOlwYz1v2>?6Vo^GcA literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_qmark.gif b/modules/editor/skins/xpresseditor/img/btn_qmark.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1fef0a5b3aa12d117be37a28a41508257783597 GIT binary patch literal 1165 zcmV;81akXFNk%w1VE_Rl0J8u9Mn*=csHkjgY?+yvva+&paBz{4k&=>pZO_IOBf^8j5*{^*<=2kLCsKFq#mtF>{8q0KE2URReU99 z&0BO={bh$gV|ZD9rl;*|d|Uq>&HZ(NcY=9@dxm`{afmpBihqxRk&aVtjfIn#m3)_n znVy@BK%I%9pQVeZq^qN?P^_=6V6d~YmbRR@qOrWSy|=%)zXZeq#>d9Q%F4*d8qCef z%h1sp1=j-E+S%9L-P_w51LGG4<{9Gy69eZK<_6;A?(Gff>+KBh9svCP3;;j+@l&OX zV6a^h2p|NOaKQov5FEXae8`mkj`D za0$tj%~X{X8uZoh;mVX2S7zMFu%5_;C4HU*YEq~Om;Oq~q(Bpeq?xBRl znXXj8bODEKsIscP${{S!v1L&VlrYtTK!CK?9q`I_Ed#D;`&s}?R_srvX9WbN#FsG! zw<+Nw1~Ikr2%30x4cO~fQ)9q+?GP?28EE3go;!DaT=?x_(;PC#oE`ISKh2y4JJt=l zAcxV0mrlNbHnboEt92WItnzhAthx(rZk(ET^4))#2Ne#RxMJgzkfXl7yme&f6-n5x z`%mEbKGRjdNuUUU_4kc{yXO8JLvi02hzB132j!859z~VZRn&s#26xd=NnTgo9ZX7O;7Jv#c7QrJVj!e_L>5UDlGL@aWQbNe zi4g_Y;E2>wL?tz2b6CQtA_H3nDI^17@^mDeIaP_0nh`-+W*A&XiKw7D*0~Qqc6~9G zo1f&_rI#6qIVPZEoH^%qPqJA6rIjRls5p$8M`x%?z%;?6QCjM!kw%i~AqAf9h-RUp zl6opGsb0zIt0uZS8+%%EIV-1S*!p1q7`bK$>Y5X@sc4pU1WPDOPyG{V3X{qdtFlGW zx{$MXLaXh5!!}^;ub0lT?s<+9`;xcq&9tDDc#>l(QR5dZ)?%_BY! literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_search.gif b/modules/editor/skins/xpresseditor/img/btn_search.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f69bd4ec65609e7ce558e8e52a31c0c47a2c637 GIT binary patch literal 1078 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 I0YK^h0BDEU=l}o! literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/btn_set_blank.gif b/modules/editor/skins/xpresseditor/img/btn_set_blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..5da1aab28e02a8f5f7c227ac09674384e35e64db GIT binary patch literal 2244 zcmV;#2s`&jNk%w1VJrbu0M$DHZkt1WwN2ppySwau|NsBu;^Mx(zJan&=jZ2hsY1cQ z!NK)=#`cEg|H9e(s?qtH!}Wjg@bJ#@nb!NI$@h!S_?6G_oZ$Vp-TkxM{IB8uyTtZ` zjN!c+>iztE;Qu-{0Nc-TC?XoyKS6wzjs|*x0Vyo4L8V_4W16 z@S5}U^Ud*?^z`)a@9)g>mGSZM?Ck8y^pW=V_V@Sq&+nb`^78oj`2YX^0000000000 z00000A^8LW0027xEC2ui04xDi000L6z@1`9EECahU3SOBTJr4xw7TUm@{kM%(=7Y&!9t#9u2xN>C>oFt6t5zwd>cGHJ%^Fa{A5Ofu@#DyoD__pMx%21Hqf4Joy}I-gAa)qo&b_<$@8H9WA5Xr# z`Sa-0t6$H)z5Dm@-|yHFpuYY4`19-E&%eL_{{RLk;D7`cXyAbeCa7S7^qJ7WgAhh2 z;e-@cXyJtzW~kwY9Cqmc;fElGDB_4DhG;^40&t+>iY&J1;)^iGDC3MY)@b96IOeG1 zjy(40NG7S|l1w(~u4s804wvo_zM{=bwNED(Iku7Ha6Bh$gD&qKr1` z=%ROKAnBx(R%+>`m}aW!rkr-_>8GHED(a}DmTKy$q~7Vks;su^>Z`EED(kGY)@tjm zxaO+suDtf@>#xA}dglbh7HjOW$R?}ovdlK??6c5DEA6z@R%`9G*k)_(ogZ}T?YH2D zEAF`DmTT_0=%%ax?z-%@>+ZYo#w+i;cRpb6z4+#<@4o!@>+in+2Q2Ww1Q%@Z!3Za; z@WKe+S;4~)M=bHg6jyBV#TaL-@x~l??D5AShb;2QB!_%w2Pmhk^2#i??DESn$1L;A zG}mnN%{b?*^Ugf?tn-}|1TFN?L>F!J(MTt)^wLZ>?ex=7M=kZ#R99{F)ORwV_10W> z?e*7Shb{KlWS4FB*=VP&_S$T>?e^Pj-?_oubk}Y7-FWA%_uhQ>?f2h+2QK*Fgcol3 z;fNQ0Cj^W)?)c-7M=tr~lvi%~<(Ox#`R1H=?)m4Shwk~E3zTm9>8Pi!`s%E=?)vMn z$1eNqwAXI``|Y^ruKVqGdf@x-zy~k<@WdBy{PD;qul(}NH}CxO&_^%*^w4vuf&kcO zul@Gickli8;D;~%_~e&w{`u&qum1Y%x3B(*J0u|g{Pfpv|NZ#qumAr1_wWDz01Ti2 z2S~sI8t{MyoDTpN$iN0V@PQDFpadsK!3tXNf*8!81~BPnDB%s zOrZ)_$if!7@P#mpp$un8!y4M~hB(Zj4tIz{5-e~4H3*^*he*UC8u5roOrjE($iyZ( z@rh83q7ptY8OA*uon2u!v2pVi(KU#ya+~kd3TlBfEnV!~hbQ&8%iO%UMOlpa2E9 zL1#xx+R~cVv^M~)Xiv-9*1Gn!dq{0)VN2WE+V-}t04;8J%iG>+wg4f(g>Z*U+~OMd zxW)}Z2wZ{O<~sMe(2XuGbfDZ`h~v80&8~L0%U$eJceyMGuXx8x-twCFyy#8guX@+Z z-uAlpz3`2%eCJEw`r3EC-yOky_sie@`uD#84zPd+tlkkQcLXpL SP3S@!`p}3@bfR|<1OPklCn6O9 literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/bx_character.gif b/modules/editor/skins/xpresseditor/img/bx_character.gif new file mode 100644 index 0000000000000000000000000000000000000000..eff0d89216fbc6e04b05c91710dbeb9de418a00c GIT binary patch literal 2092 zcmV+{2-EjRNk%w1VWk1A0Du4h-{Ic>|NkNR1ONa4001li0001`0jvN30{?`MsmtvT zqnxzbi?iOm`wvpVNS3AvoT{3x?%2L-ET42;-Z;G5J^IT9NxEGTcdR94%U9F&oDF$X z!!!_OU9-OG_UjD~xj=D{EHwYnMDTdaroPp^IM#i}ul04l(T@bEB*+9u=yV8`C`I?z z82C6CSvZMUsdzbKx4Ed5={Xmg_t_=7M_OjuhnhCV$=U`hH>&Db3wbM`cBa-fX^heV$zo?Jf;ZEzipy zPQQ)ct^a+t&Oa`lz;^@V6`Xgl9zb*i8ya+o(8#}p`6%wQ*l%GwjQ;^4D&)xUp~#3M ztqt4gv0}=LD>H&bSyE+8mNQ+p>{ye<#G4^W`uxZf=1-YJX%@AavnSA`LQTrL^K>WE zdoQU5wK_ExIIZ@$YQ(BU>QS6yl@eWAw&~fmM$x)ui!?3Rw@}2=jeD1DUbAiC>h;SP zFJQHO3kx=^^W@yYixCI@>zMH2$&e{OzAU-2X3RP4GWJ>(^i|PWXMH6t7xmuEoK=4| zT_=R>*|clhzKuJ#?%li@D0UsWv1Qi8g>Nnne7Nz}utzs94b|1}=c%c$UXI-Q>*!sz z2Ty(+yLj--v3UOOT{-#e+)t+uzkdAt^5@mhXKy9y^!B0e%m3%^9DvZ(2cLiO9cW;J z=IuuyeGERRUxZsJ*dTs}NZ6f#)oFMgf*fvF;eR1|I3k55euy55_NiDPiwOP;x6nqsciPz|p7iP2C!cxxIU}8d zzKA5CgC1I_l8pNJD49_yim0Q8UTSHkO-5=Wp^##_DX39$I;NMT_J(Szs;3I2XzQ)A?&!2BZ5g!Z->nEwl_j>~O?YKum7J>dMQl#q$D5F}>7c94^5hYn-t}5__C4$n1)o zGRYyUb27^VtGqAG{T_UAY%$whu);p)jPu4kceb<3D-Ydr&?WyYw9XYP{j$+DOMNrb zON05e)loxzG}S!=t+ghwj!kyiW}l5VtVMG@HQQB#4R_OSqtLO;4QCzq)pCcOXWdB8 z?DfcV3(oi3PN59=;7J$$_1<}JUFF)06aIMDivK4*`Qlh3emCcS2d=r}qJ#MP<(=DI zdgho{o*3SvL(aP4de08~>*IPZdF+kTZn^5G->&?n zh&?2d4+azrA`y?+#3Cv&e^G?u5Pyh8BmX{ei$tg*7qythDMrwXVf0`O&p1Oef^m&v zY?B(>=)^K!k&SOOV;biOM=913kNV@IA4M2PI`VOkfYjq3W!OF&A##F;L}McBNXSLj zu#i@yWcMVQ#7H`lk(TUYBk$NrL54Dq_|YUNF}Xxieo>Vq>YyuM3Cmc@as!`yWGy*~ zN-ExRlDQn?E;DILTaGfAxa8O`Q%Ou-ZjyM(%;Yii_sn8N(}k=QWiP4uux282nt`mQ zH-p4YLk=^Xm3-DX&w0&mYLj&2T;)1_iB4n2^OVbU<~$$yPHeVQj`v*HKCM~LZT6Fy z|NLe_^Qq2V1r(YCwP!lT*{+4c^Z%jcl&C%@bG5|p?-9y%4DiT z{n1jVa#W@)Jrz=MN>!{%m7x*cYD~TQ)2!+=U{N)ySc7`hI;B;qMdhhk(|Fafx^=Ei zeXC8+8dtR9^`Lp}Ygy@aw@I)x9Kq>#NoHTKBl`MQ>^G3tavpbG_~raCQN_T=Je* zzpnK!$2tq)2upav4^Xgt3w+@D4%Nc@%`k@BJ75ksn8Eo)aCiT!;R_oW#2${HgI`SI z0Jr$IDE=^gQ`}(|6HvV(E-{WrY%(4TxyCETCV`8*U=#DT$1>LOjcvT)A>a4MK8CUh zr3_;wW0|a5)-sW2>|_{bnaWLmGLlt%J|=%R#%uO6X{T)E9Ge-;bKdcn!;EG;%Q?y8 W?J}9${O7(>c+i9{Gy_Tt0029YWIy)+ literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/bx_find.gif b/modules/editor/skins/xpresseditor/img/bx_find.gif new file mode 100644 index 0000000000000000000000000000000000000000..4dc6c8e953f84aa999054894eaf143703bdebdac GIT binary patch literal 514 zcmZ?wbhEHbyvN|pa72jV_TAeXw{6_9XUFzE+h4tY_2uiAOII&lzIOS|+c)>_-@9_{ z%Ga-7-@Si#^Y+afw{QIT`Q!ip|G$6#29gZK0mYvzj0_Ay3_2j?AUhdY|1V(aNy(g- zv1(n;>wN_}=S$WKDKWpTdH?^wf&vd6ss0m7icaRR334&0IIWFZe`8JA>9!_w`Sx?43Ae>a@hk z(`U_|HFM7V1zqzNE?HW=c-hKTc`H`0Tc5CY!{#kvo3`#)zkTPPWxMwtn7{wvk!gpI zp6EY*@=V9+vlklAU%WD@?COnk*Kgjrbo=guYxNJGlwW@OBKG;qHxaMjeh_^B@y+Ki zFTQ<$^7Ge&KY#E1V?3f(ps=-xZK0yii5x}e6h3*OZVf?+qg{LSl8!7bR9@RBm)OYj zGE2oXRL#Hs*RN$o@~5Z$i#x=lQLJ`wmKpz}Gb;C+wSjs`Vd{Z^WDX;a$FMZUjFbZ_@_-q}~XHGzSVo%Pux stqTtvSeTiZIOKeGYFDtA@bB>N`}_Ox^6~KT@bU5S=I7@B|Nj60 z00000000000000000000A^8LW000R9EC2ui0Nwz(000F4keGm~MJemeyZ>M)idSi# zXsWJk>%MRm7=&;DW3KOf@BhG{aM%GH1OXgz$!t2GP$z&Aty-_x?60EjdcWW$H%u;@ z&EvCr&32~S@VK0WncMI4H-66#>-&I#ReyqohC+mgii;zOjE|5Rj**myla-i&mzkV* zo1LI=pP{5@qot@|r>U%2tF5q6ud%dDv$eQEx4FDLyS>14!NX0z#K)3#$jd#(%)!pj zz0uOS)YY}u*s>mCnTLd-SiBqPe1`BL?ZzxARxg23NfNeol3Q;)vH*u1{jdEtJkk! z!-^eCwyfE+Xw#})n`OcYT3O@DovUI-0vkx#&M|@{uim{>{xTdYIAmcwKo4t3tT+K< z#g7k1E<9Oq<-eEpW@fv2ZD+Ng(}qSn`fO>lr^}`$yLxPEv9H6%20Qy}ZLhbx=1#hs zXz!rEeFon-9B1*G$7LpextwM5l+R5@A2}Ul^^VsyX1}o(Yc@yA%HUnZ)U^NFyli)K8GSlEP4 zl7$sjh#^cGZa9;NZA?gvh{KQwO@|=ngkp+3v8aZL39aa&P&1+-V~t|mh~p42PNU*wPAW4uJ3@rZzCKjx+)p&h&_x}WqqVUXl8LQUiyxy1Rpy0&VQ?c%S&HMic7VrlM zu;d+DQgkxMYAVC2Vz0GP>vwULoqk(Ye`|e(&%3tMFSb}!#O=OcAf)EEe);Whd;WFZ z|NY;qwxPKtvbeRQQ?aS5x1*;t+#C3skCF)UfDhS4sskgwD-u-oySjXJ#~8H*>h_zTwHni%F=7s7v8)z z_s-p!_a97s^myXaXT2|8cD{bo`tE)6$4`^nzwZ0;qw3f1>EHk5eC3u%S2*a)z`x6A zMF8*Nw)sL%CSMC4&FB(y_dN50Q`ucl&c=S;EsaY-CnkmZEsAk1TB~yv literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/img/vr_layer_character.gif b/modules/editor/skins/xpresseditor/img/vr_layer_character.gif new file mode 100644 index 0000000000000000000000000000000000000000..e77bbe640959e3ebcda40b03d9ae88f5b67eeed9 GIT binary patch literal 44 tcmZ?wbhEHbWMtrGXkcKta^(sG1B2pE79h#MpaUX6G7L=2E&Txu)&RzC2dV%7 literal 0 HcmV?d00001 diff --git a/modules/editor/skins/xpresseditor/js/Xpress_Editor.js b/modules/editor/skins/xpresseditor/js/Xpress_Editor.js new file mode 100644 index 000000000..73d6a8c3c --- /dev/null +++ b/modules/editor/skins/xpresseditor/js/Xpress_Editor.js @@ -0,0 +1,249 @@ + +(function($){$.extend({Class:function(def){function c(){if(typeof this.$super!='undefined')this.$super.$this=this;if($.isFunction(this.$init))this.$init.apply(this,arguments);} +c.prototype=def;c.constructor=c;c.extend=Class_extend;return c;},$:function(id){if(typeof id=='string'){if(id.substring(0,1)=='<')return $(id).get(0);return $('#'+id).get(0);}else{return id;}},fnBind:function(fn,th){var args=$.makeArray(arguments);args.shift();args.shift();return function(){var a=args.concat($.makeArray(arguments));return fn.apply(th,a);};}});$.browser.nVersion=parseFloat($.browser.version);function Class_extend(superDef){var Super=superDef.prototype;this.prototype.$super={};function bind(fn){return function(){return fn.apply(this.$this,arguments);};} +for(var x in Super){if(!Super.propertyIsEnumerable(x))continue;if(typeof this.prototype[x]=='undefined')this.prototype[x]=Super[x];this.prototype.$super[x]=$.isFunction(Super[x])?bind(Super[x]):Super[x];} +return this;}})(jQuery);if(typeof window.xe=='undefined')window.xe={};xe.XpressCore=jQuery.Class({name:"XpressCore",$init:function(htOptions){htOptions=!htOptions?{}:jQuery.Class({}).extend({oDebugger:null}).extend(htOptions);if(htOptions.oDebugger){this.oDebugger=htOptions.oDebugger;this.oDebugger.oApp=this;} +this.commandQueue=[];this.oCommandMap={};this.oDisabledCommand={};this.aPlugins=[];this.appStatus=xe.APP_STATUS["NOT_READY"];this.registerPlugin(this);},exec:function(msg,args,oEvent){if(this.appStatus==xe.APP_STATUS["NOT_READY"]){this.commandQueue[this.commandQueue.length]={'msg':msg,'args':args,'event':oEvent};return true;} +this.exec=this._exec;this.exec(msg,args,oEvent);},delayedExec:function(msg,args,nDelay,oEvent){var fExec=jQuery.fnBind(this.exec,this,msg,args,oEvent);setTimeout(fExec,nDelay);},_exec:function(msg,args,oEvent){return(this._exec=this.oDebugger?this._execWithDebugger:this._execWithoutDebugger).call(this,msg,args,oEvent);},_execWithDebugger:function(msg,args,oEvent){this.oDebugger.log_MessageStart(msg,args);var bResult=this._doExec(msg,args,oEvent);this.oDebugger.log_MessageEnd(msg,args);return bResult;},_execWithoutDebugger:function(msg,args,oEvent){return this._doExec(msg,args,oEvent);},_doExec:function(msg,args,oEvent){var bContinue=false;if(!this.oDisabledCommand[msg]){var allArgs=[];if(args&&args.length){var iLen=args.length;for(var i=0;i=0&&xe.DOMFix.parentNode(aAllNodes[iChildIdx])==aAllNodes[iCurIdx]){iChildIdx=this._recurConstructClonedTree(aAllNodes,iChildIdx,aAllNodes[iCurIdx],oCurNodeCloneWithChildren,oClonedStartContainer,oClonedEndContainer);} +oClonedParentNode.insertBefore(oCurNodeCloneWithChildren,oClonedParentNode.firstChild);return iChildIdx;};aNodes[aNodes.length]=xe.DOMFix.parentNode(aNodes[aNodes.length-1]);_recurConstructClonedTree(aNodes,aNodes.length-1,aNodes[aNodes.length-1],oClonedParentNode);return{oStartContainer:oClonedStartContainer,oEndContainer:oClonedEndContainer};},cloneRange:function(){return this._copyRange(new xe.W3CDOMRange(this._document));},_copyRange:function(oClonedRange){oClonedRange.collapsed=this.collapsed;oClonedRange.commonAncestorContainer=this.commonAncestorContainer;oClonedRange.endContainer=this.endContainer;oClonedRange.endOffset=this.endOffset;oClonedRange.startContainer=this.startContainer;oClonedRange.startOffset=this.startOffset;oClonedRange._document=this._document;return oClonedRange;},collapse:function(toStart){if(toStart){this.endContainer=this.startContainer;this.endOffset=this.startOffset;}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset;} +this._updateRangeInfo();},compareBoundaryPoints:function(how,sourceRange){switch(how){case xe.W3CDOMRange.START_TO_START:return this._compareEndPoint(this.startContainer,this.startOffset,sourceRange.startContainer,sourceRange.startOffset);case xe.W3CDOMRange.START_TO_END:return this._compareEndPoint(this.endContainer,this.endOffset,sourceRange.startContainer,sourceRange.startOffset);case xe.W3CDOMRange.END_TO_END:return this._compareEndPoint(this.endContainer,this.endOffset,sourceRange.endContainer,sourceRange.endOffset);case xe.W3CDOMRange.END_TO_START:return this._compareEndPoint(this.startContainer,this.startOffset,sourceRange.endContainer,sourceRange.endOffset);}},_findBody:function(oNode){if(!oNode)return null;while(oNode){if(oNode.tagName=="BODY")return oNode;oNode=xe.DOMFix.parentNode(oNode);} +return null;},_compareEndPoint:function(oContainerA,iOffsetA,oContainerB,iOffsetB){var iIdxA,iIdxB;if(!oContainerA||this._findBody(oContainerA)!=this._document.body){oContainerA=this._document.body;iOffsetA=0;} +if(!oContainerB||this._findBody(oContainerB)!=this._document.body){oContainerB=this._document.body;iOffsetB=0;} +var compareIdx=function(iIdxA,iIdxB){if(iIdxB==-1)iIdxB=iIdxA+1;if(iIdxAoNode.nodeValue.length)iOffset=oNode.nodeValue.length;}else{if(iOffset>xe.DOMFix.childNodes(oNode).length)iOffset=xe.DOMFix.childNodes(oNode).length;} +return iOffset;},setEnd:function(refNode,offset){offset=this._endsNodeValidation(refNode,offset);this.endContainer=refNode;this.endOffset=offset;if(!this.startContainer||this._compareEndPoint(this.startContainer,this.startOffset,this.endContainer,this.endOffset)!=-1)this.collapse(false);this._updateRangeInfo();},setEndAfter:function(refNode){if(!refNode)throw new Error("INVALID_NODE_TYPE_ERR in setEndAfter");if(refNode.tagName=="BODY"){this.setEnd(refNode,xe.DOMFix.childNodes(refNode).length);return;} +this.setEnd(xe.DOMFix.parentNode(refNode),this._getPosIdx(refNode)+1);},setEndBefore:function(refNode){if(!refNode)throw new Error("INVALID_NODE_TYPE_ERR in setEndBefore");if(refNode.tagName=="BODY"){this.setEnd(refNode,0);return;} +this.setEnd(xe.DOMFix.parentNode(refNode),this._getPosIdx(refNode));},setStart:function(refNode,offset){offset=this._endsNodeValidation(refNode,offset);this.startContainer=refNode;this.startOffset=offset;if(!this.endContainer||this._compareEndPoint(this.startContainer,this.startOffset,this.endContainer,this.endOffset)!=-1)this.collapse(true);this._updateRangeInfo();},setStartAfter:function(refNode){if(!refNode)throw new Error("INVALID_NODE_TYPE_ERR in setStartAfter");if(refNode.tagName=="BODY"){this.setStart(refNode,xe.DOMFix.childNodes(refNode).length);return;} +this.setStart(xe.DOMFix.parentNode(refNode),this._getPosIdx(refNode)+1);},setStartBefore:function(refNode){if(!refNode)throw new Error("INVALID_NODE_TYPE_ERR in setStartBefore");if(refNode.tagName=="BODY"){this.setStart(refNode,0);return;} +this.setStart(xe.DOMFix.parentNode(refNode),this._getPosIdx(refNode));},surroundContents:function(newParent){newParent.appendChild(this.extractContents());this.insertNode(newParent);this.selectNode(newParent);},toString:function(){var oTmpContainer=this._document.createElement("DIV");oTmpContainer.appendChild(this.cloneContents());return oTmpContainer.textContent||oTmpContainer.innerText||"";},_isBlankTextNode:function(oNode){if(oNode.nodeType==3&&oNode.nodeValue=="")return true;return false;},_getPosIdx:function(refNode){var idx=0;for(var node=refNode.previousSibling;node;node=node.previousSibling)idx++;return idx;},_updateRangeInfo:function(){if(!this.startContainer){this.init(this._document);return;} +this.collapsed=this._isCollapsed(this.startContainer,this.startOffset,this.endContainer,this.endOffset);this.commonAncestorContainer=this._getCommonAncestorContainer(this.startContainer,this.endContainer);},_isCollapsed:function(oStartContainer,iStartOffset,oEndContainer,iEndOffset){var bCollapsed=false;if(oStartContainer==oEndContainer&&iStartOffset==iEndOffset){bCollapsed=true;}else{var oActualStartNode=this._getActualStartNode(oStartContainer,iStartOffset);var oActualEndNode=this._getActualEndNode(oEndContainer,iEndOffset);oActualStartNode=this._getNextNode(this._getPrevNode(oActualStartNode));oActualEndNode=this._getPrevNode(this._getNextNode(oActualEndNode));if(oActualStartNode&&oActualEndNode&&oActualEndNode.tagName!="BODY"&&(this._getNextNode(oActualEndNode)==oActualStartNode||(oActualEndNode==oActualStartNode&&this._isBlankTextNode(oActualEndNode)))) +bCollapsed=true;} +return bCollapsed;},_splitTextEndNodesOfTheRange:function(){var oEndPoints=this._splitTextEndNodes({oStartContainer:this.startContainer,iStartOffset:this.startOffset,oEndContainer:this.endContainer,iEndOffset:this.endOffset});this.startContainer=oEndPoints.oStartContainer;this.startOffset=oEndPoints.iStartOffset;this.endContainer=oEndPoints.oEndContainer;this.endOffset=oEndPoints.iEndOffset;},_splitTextEndNodes:function(oEndPoints){oEndPoints=this._splitStartTextNode(oEndPoints);oEndPoints=this._splitEndTextNode(oEndPoints);return oEndPoints;},_splitStartTextNode:function(oEndPoints){var oStartContainer=oEndPoints.oStartContainer;var iStartOffset=oEndPoints.iStartOffset;var oEndContainer=oEndPoints.oEndContainer;var iEndOffset=oEndPoints.iEndOffset;if(!oStartContainer)return oEndPoints;if(oStartContainer.nodeType!=3)return oEndPoints;if(iStartOffset==0)return oEndPoints;if(oStartContainer.nodeValue.length<=iStartOffset)return oEndPoints;var oLastPart=oStartContainer.splitText(iStartOffset);if(oStartContainer==oEndContainer){iEndOffset-=iStartOffset;oEndContainer=oLastPart;} +oStartContainer=oLastPart;iStartOffset=0;return{oStartContainer:oStartContainer,iStartOffset:iStartOffset,oEndContainer:oEndContainer,iEndOffset:iEndOffset};},_splitEndTextNode:function(oEndPoints){var oStartContainer=oEndPoints.oStartContainer;var iStartOffset=oEndPoints.iStartOffset;var oEndContainer=oEndPoints.oEndContainer;var iEndOffset=oEndPoints.iEndOffset;if(!oEndContainer)return oEndPoints;if(oEndContainer.nodeType!=3)return oEndPoints;if(iEndOffset>=oEndContainer.nodeValue.length)return oEndPoints;if(iEndOffset==0)return oEndPoints;oEndContainer.splitText(iEndOffset);return{oStartContainer:oStartContainer,iStartOffset:iStartOffset,oEndContainer:oEndContainer,iEndOffset:iEndOffset};},_getNodesInRange:function(){if(this.collapsed)return[];var oStartNode=this._getActualStartNode(this.startContainer,this.startOffset);var oEndNode=this._getActualEndNode(this.endContainer,this.endOffset);return this._getNodesBetween(oStartNode,oEndNode);},_getActualStartNode:function(oStartContainer,iStartOffset){var oStartNode=oStartContainer;;if(oStartContainer.nodeType==3){if(iStartOffset>=oStartContainer.nodeValue.length){oStartNode=this._getNextNode(oStartContainer);if(oStartNode.tagName=="BODY")oStartNode=null;}else{oStartNode=oStartContainer;}}else{if(iStartOffset=this.startContainer.nodeValue.length)return this._getNextNode(this.startContainer);return this.startContainer;}else{if(this.startOffset>=xe.DOMFix.childNodes(this.startContainer).length)return this._getNextNode(this.startContainer);return xe.DOMFix.childNodes(this.startContainer)[this.startOffset];}},getEndNode:function(){if(this.collapsed)return this.getStartNode();if(this.endContainer.nodeType==3){if(this.endOffset==0)return this._getPrevNode(this.endContainer);return this.endContainer;}else{if(this.endOffset==0)return this._getPrevNode(this.endContainer);return xe.DOMFix.childNodes(this.endContainer)[this.endOffset-1];}},getNodeAroundRange:function(bBefore,bStrict){if(this.collapsed&&this.startContainer&&this.startContainer.nodeType==3)return this.startContainer;if(!this.collapsed||(this.startContainer&&this.startContainer.nodeType==3))return this.getStartNode();var oBeforeRange,oAfterRange,oResult;if(this.startOffset>=xe.DOMFix.childNodes(this.startContainer).length) +oAfterRange=this._getNextNode(this.startContainer);else +oAfterRange=xe.DOMFix.childNodes(this.startContainer)[this.startOffset];if(this.endOffset==0) +oBeforeRange=this._getPrevNode(this.endContainer);else +oBeforeRange=xe.DOMFix.childNodes(this.endContainer)[this.endOffset-1];if(bBefore){oResult=oBeforeRange;if(!oResult&&!bStrict)oResult=oAfterRange;}else{oResult=oAfterRange;if(!oResult&&!bStrict)oResult=oBeforeRange;} +return oResult;},_getXPath:function(elNode){var sXPath="";while(elNode&&elNode.nodeType==1){sXPath="/"+elNode.tagName+"["+this._getPosIdx4XPath(elNode)+"]"+sXPath;elNode=xe.DOMFix.parentNode(elNode);} +return sXPath;},_getPosIdx4XPath:function(refNode){var idx=0;for(var node=refNode.previousSibling;node;node=node.previousSibling) +if(node.tagName==refNode.tagName)idx++;return idx;},_evaluateXPath:function(sXPath,oDoc){sXPath=sXPath.substring(1,sXPath.length-1);var aXPath=sXPath.split(/\//);var elNode=oDoc.body;for(var i=2;i-1&&elContainer){var aChildNodes=xe.DOMFix.childNodes(elContainer);var elNode=null;var nIdx=nTextNodeIdx;var nOffsetLeft=nOffset;while((elNode=aChildNodes[nIdx])&&elNode.nodeType==3&&elNode.nodeValue.length=0)return true;if(bIncludePartlyIncluded){if(startToEnd==1)return false;if(endToStart==-1)return false;return true;} +return false;},isNodeInRange:function(oNode,bIncludePartlySelected,bContentOnly){var oTmpRange=new xe.XpressRange(this._window);if(bContentOnly&&oNode.firstChild){oTmpRange.setStartBefore(oNode.firstChild);oTmpRange.setEndAfter(oNode.lastChild);}else{oTmpRange.selectNode(oNode);} +return isRangeInRange(oTmpRange,bIncludePartlySelected);},pasteHTML:function(sHTML){if(sHTML==""){this.deleteContents();return;} +var oTmpDiv=this._document.createElement("DIV");oTmpDiv.innerHTML=sHTML;var oFirstNode=oTmpDiv.firstChild;var oLastNode=oTmpDiv.lastChild;var clone=this.cloneRange();var sBM=clone.placeStringBookmark();while(oTmpDiv.lastChild)this.insertNode(oTmpDiv.lastChild);this.setEndNodes(oFirstNode,oLastNode);clone.moveToBookmark(sBM);clone.deleteContents();clone.removeStringBookmark(sBM);},toString:function(){this.toString=xe.W3CDOMRange.prototype.toString;return this.toString();},toHTMLString:function(){var oTmpContainer=this._document.createElement("DIV");oTmpContainer.appendChild(this.cloneContents());return oTmpContainer.innerHTML;},findAncestorByTagName:function(sTagName){var oNode=this.commonAncestorContainer;while(oNode&&oNode.tagName!=sTagName)oNode=xe.DOMFix.parentNode(oNode);return oNode;},selectNodeContents:function(oNode){if(!oNode)return;var oFirstNode=oNode.firstChild?oNode.firstChild:oNode;var oLastNode=oNode.lastChild?oNode.lastChild:oNode;if(oFirstNode.nodeType==3) +this.setStart(oFirstNode,0);else +this.setStartBefore(oFirstNode);if(oLastNode.nodeType==3) +this.setEnd(oLastNode,oLastNode.nodeValue.length);else +this.setEndAfter(oLastNode);},styleRange:function(oStyle,oAttribute,sNewSpanMarker){var aStyleParents=this._getStyleParentNodes(sNewSpanMarker);if(aStyleParents.length<1)return;var sName,sValue;for(var i=0;i=0)){oSNode=this.getNodeAroundRange(false,true);oENode=this.getNodeAroundRange(false,true);oStart=this._getLineStartInfo(oSNode);oEnd=this._getLineEndInfo(oENode);} +return{oStart:oStart,oEnd:oEnd};}}).extend(xe.W3CDOMRange);xe.SimpleSelection=function(win){this.init=function(win){this._window=win||window;this._document=this._window.document;};this.init(win);if(jQuery.browser.msie) +xe.SimpleSelectionImpl_IE.apply(this);else +xe.SimpleSelectionImpl_FF.apply(this);this.selectRange=function(oRng){this.selectNone();this.addRange(oRng);};this.selectionLoaded=true;if(!this._oSelection)this.selectionLoaded=false;};xe.SimpleSelectionImpl_FF=function(){this._oSelection=this._window.getSelection();this.getRangeAt=function(iNum){iNum=iNum||0;try{var oFFRange=this._oSelection.getRangeAt(iNum);}catch(e){return new xe.W3CDOMRange(this._document);} +return this._FFRange2W3CRange(oFFRange);};this.addRange=function(oW3CRange){var oFFRange=this._W3CRange2FFRange(oW3CRange);this._oSelection.addRange(oFFRange);};this.selectNone=function(){this._oSelection.removeAllRanges();};this._FFRange2W3CRange=function(oFFRange){var oW3CRange=new xe.W3CDOMRange(this._document);oW3CRange.setStart(oFFRange.startContainer,oFFRange.startOffset);oW3CRange.setEnd(oFFRange.endContainer,oFFRange.endOffset);return oW3CRange;};this._W3CRange2FFRange=function(oW3CRange){var oFFRange=this._document.createRange();oFFRange.setStart(oW3CRange.startContainer,oW3CRange.startOffset);oFFRange.setEnd(oW3CRange.endContainer,oW3CRange.endOffset);return oFFRange;};};xe.SimpleSelectionImpl_IE=function(){this._oSelection=this._document.selection;this.getRangeAt=function(iNum){iNum=iNum||0;if(this._oSelection.type=="Control"){var oW3CRange=new xe.W3CDOMRange(this._document);var oSelectedNode=this._oSelection.createRange().item(iNum);if(!oSelectedNode||oSelectedNode.ownerDocument!=this._document)return oW3CRange;oW3CRange.selectNode(oSelectedNode);return oW3CRange;}else{var oSelectedNode=this._oSelection.createRangeCollection().item(iNum).parentElement();if(!oSelectedNode||oSelectedNode.ownerDocument!=this._document){var oW3CRange=new xe.W3CDOMRange(this._document);return oW3CRange;} +return this._IERange2W3CRange(this._oSelection.createRangeCollection().item(iNum));}};this.addRange=function(oW3CRange){var oIERange=this._W3CRange2IERange(oW3CRange);oIERange.select();};this.selectNone=function(){this._oSelection.empty();};this._W3CRange2IERange=function(oW3CRange){var oStartIERange=this._getIERangeAt(oW3CRange.startContainer,oW3CRange.startOffset);var oEndIERange=this._getIERangeAt(oW3CRange.endContainer,oW3CRange.endOffset);oStartIERange.setEndPoint("EndToEnd",oEndIERange);return oStartIERange;};this._getIERangeAt=function(oW3CContainer,iW3COffset){var oIERange=this._document.body.createTextRange();var oEndPointInfoForIERange=this._getSelectableNodeAndOffsetForIE(oW3CContainer,iW3COffset);var oSelectableNode=oEndPointInfoForIERange.oSelectableNodeForIE;var iIEOffset=oEndPointInfoForIERange.iOffsetForIE;oIERange.moveToElementText(oSelectableNode);oIERange.collapse(oEndPointInfoForIERange.bCollapseToStart);oIERange.moveStart("character",iIEOffset);return oIERange;};this._getSelectableNodeAndOffsetForIE=function(oW3CContainer,iW3COffset){var oIERange=this._document.body.createTextRange();var oNonTextNode=null;var aChildNodes=null;var iNumOfLeftNodesToCount=0;if(oW3CContainer.nodeType==3){oNonTextNode=xe.DOMFix.parentNode(oW3CContainer);aChildNodes=xe.DOMFix.childNodes(oNonTextNode);iNumOfLeftNodesToCount=aChildNodes.length;}else{oNonTextNode=oW3CContainer;aChildNodes=xe.DOMFix.childNodes(oNonTextNode);iNumOfLeftNodesToCount=iW3COffset;} +var oNodeTester=null;var iResultOffset=0;var bCollapseToStart=true;for(var i=0;i=0)break;oPrevNonTextNode=aChildNodes[i];} +var pointRangeIdx=i;if(pointRangeIdx!=0&&aChildNodes[pointRangeIdx-1].nodeType==3){var oRgTextStart=this._document.body.createTextRange();var oCurTextNode=null;if(oPrevNonTextNode){oRgTextStart.moveToElementText(oPrevNonTextNode);oRgTextStart.collapse(false);oCurTextNode=oPrevNonTextNode.nextSibling;}else{oRgTextStart.moveToElementText(oContainer);oRgTextStart.collapse(true);oCurTextNode=oContainer.firstChild;} +var oRgTextsUpToThePoint=oRgOrigPoint.duplicate();oRgTextsUpToThePoint.setEndPoint("StartToStart",oRgTextStart);var textCount=oRgTextsUpToThePoint.text.length +while(textCount>oCurTextNode.nodeValue.length&&oCurTextNode.nextSibling){textCount-=oCurTextNode.nodeValue.length;oCurTextNode=oCurTextNode.nextSibling;} +var oTmp=oCurTextNode.nodeValue;if(bStartPt&&oCurTextNode.nextSibling&&oCurTextNode.nextSibling.nodeType==3&&textCount==oCurTextNode.nodeValue.length){textCount-=oCurTextNode.nodeValue.length;oCurTextNode=oCurTextNode.nextSibling;} +oContainer=oCurTextNode;offset=textCount;}else{oContainer=oRgOrigPoint.parentElement();offset=pointRangeIdx;} +return{"oContainer":oContainer,"iOffset":offset};};} +xe.DOMFix=new(jQuery.Class({$init:function(){if(jQuery.browser.msie||jQuery.browser.opera){this.childNodes=this._childNodes_Fix;this.parentNode=this._parentNode_Fix;}else{this.childNodes=this._childNodes_Native;this.parentNode=this._parentNode_Native;}},_parentNode_Native:function(elNode){return elNode.parentNode;},_parentNode_Fix:function(elNode){if(!elNode)return elNode;while(elNode.previousSibling){elNode=elNode.previousSibling;} +return elNode.parentNode;},_childNodes_Native:function(elNode){return elNode.childNodes;},_childNodes_Fix:function(elNode){var aResult=null;var nCount=0;if(elNode){var aResult=[];elNode=elNode.firstChild;while(elNode){aResult[nCount++]=elNode;elNode=elNode.nextSibling;}} +return aResult;}}))();xe.FindReplace=jQuery.Class({sKeyword:"",window:null,document:null,bBrowserSupported:false,bEOC:false,$init:function(win){this.window=win;this.document=this.window.document;if(this.document.domain!=this.document.location.hostname){if(jQuery.browser.mozilla&&jQuery.browser.nVersion<3){this.bBrowserSupported=false;this.find=function(){return 3};return;}} +this.bBrowserSupported=true;},find:function(sKeyword,bCaseMatch,bBackwards,bWholeWord){var bSearchResult,bFreshSearch;this.window.focus();if(!sKeyword)return 2;this.bEOC=false;bSearchResult=this.findNext(sKeyword,bCaseMatch,bBackwards,bWholeWord);if(bSearchResult)return 0;this.bEOC=true;bSearchResult=this.findNew(sKeyword,bCaseMatch,bBackwards,bWholeWord);if(bSearchResult)return 0;return 1;},findNew:function(sKeyword,bCaseMatch,bBackwards,bWholeWord){this.findReset();return this.findNext(sKeyword,bCaseMatch,bBackwards,bWholeWord);},findNext:function(sKeyword,bCaseMatch,bBackwards,bWholeWord){var bSearchResult;bCaseMatch=bCaseMatch||false;bWholeWord=bWholeWord||false;bBackwards=bBackwards||false;if(this.window.find){var bWrapAround=false;return this.window.find(sKeyword,bCaseMatch,bBackwards,bWrapAround,bWholeWord);} +if(this.document.body.createTextRange){var iOption=0;if(bBackwards)iOption+=1;if(bWholeWord)iOption+=2;if(bCaseMatch)iOption+=4;this.window.focus();this._range=this.document.selection.createRangeCollection().item(0);this._range.collapse(false);bSearchResult=this._range.findText(sKeyword,1,iOption);this._range.select();return bSearchResult;} +return false;},findReset:function(){if(this.window.find){this.window.getSelection().removeAllRanges();return;} +if(this.document.body.createTextRange){this._range=this.document.body.createTextRange();this._range.collapse(true);this._range.select();}},replace:function(sOriginalWord,Replacement,bCaseMatch,bBackwards,bWholeWord){if(!sOriginalWord)return 4;var oSelection=new xe.XpressRange(this.window);oSelection.setFromSelection();bCaseMatch=bCaseMatch||false;var bMatch,selectedText=oSelection.toString();if(bCaseMatch) +bMatch=(selectedText==sOriginalWord);else +bMatch=(selectedText.toLowerCase()==sOriginalWord.toLowerCase());if(!bMatch) +return this.find(sOriginalWord,bCaseMatch,bBackwards,bWholeWord)+2;if(typeof Replacement=="function"){oSelection=Replacement(oSelection);}else{oSelection.pasteHTML(Replacement);} +oSelection.select();return this.find(sOriginalWord,bCaseMatch,bBackwards,bWholeWord);},replaceAll:function(sOriginalWord,Replacement,bCaseMatch,bWholeWord){if(!sOriginalWord)return-1;var bBackwards=false;var iReplaceResult;var iResult=0;var win=this.window;var oSelection=new xe.XpressRange(this.window);oSelection.setFromSelection();var sBookmark=oSelection.placeStringBookmark();this.bEOC=false;while(!this.bEOC){iReplaceResult=this.replace(sOriginalWord,Replacement,bCaseMatch,bBackwards,bWholeWord);if(iReplaceResult==0||iReplaceResult==1)iResult++;} +var startingPointReached=function(){var oCurSelection=new xe.XpressRange(win);oCurSelection.setFromSelection();oSelection.moveToBookmark(sBookmark);var pos=oSelection.compareBoundaryPoints(xe.W3CDOMRange.START_TO_END,oCurSelection);if(pos==1)return false;return true;} +iReplaceResult=0;this.bEOC=false;while(!startingPointReached()&&iReplaceResult==0&&!this.bEOC){iReplaceResult=this.replace(sOriginalWord,Replacement,bCaseMatch,bBackwards,bWholeWord);if(iReplaceResult==0||iReplaceResult==1)iResult++;} +oSelection.moveToBookmark(sBookmark);oSelection.select();oSelection.removeStringBookmark(sBookmark);return iResult;}});xe.DraggableLayer=jQuery.Class({$init:function(oLayer,oOptions){this.oOptions=jQuery.extend({bModal:"false",oHandle:oLayer,iMinX:-999999,iMinY:-999999,iMaxX:999999,iMaxY:999999},oOptions);this.oHandle=this.oOptions.oHandle;oLayer.style.display="block";oLayer.style.position="absolute";oLayer.style.zIndex="9999";this.aBasePosition=this.getBaseOffset(oLayer);oLayer.style.top=(this.toInt(jQuery(oLayer).offset().top)-this.aBasePosition.top)+"px";oLayer.style.left=(this.toInt(jQuery(oLayer).offset().left)-this.aBasePosition.left)+"px";this.$FnMouseDown=jQuery.fnBind(this._mousedown,this,oLayer);this.$FnMouseMove=jQuery.fnBind(this._mousemove,this,oLayer);this.$FnMouseUp=jQuery.fnBind(this._mouseup,this,oLayer);jQuery(this.oHandle).bind("mousedown",this.$FnMouseDown);},_mousedown:function(oLayer,oEvent){if(oEvent.target.tagName=="INPUT")return;this.MouseOffsetY=(oEvent.pageY-this.toInt(oLayer.style.top)-this.aBasePosition['top']);this.MouseOffsetX=(oEvent.pageX-this.toInt(oLayer.style.left)-this.aBasePosition['left']);jQuery(oLayer).bind("mousemove",this.$FnMouseMove);jQuery(oLayer).bind("mouseup",this.$FnMouseUp);},_mousemove:function(oLayer,oEvent){var iTop=(oEvent.pageY-this.MouseOffsetY-this.aBasePosition['top']);var iLeft=(oEvent.pageX-this.MouseOffsetX-this.aBasePosition['left']);if(iTopthis.oOptions.iMaxY)iTop=this.oOptions.iMaxY;if(iLeftthis.oOptions.iMaxX)iLeft=this.oOptions.iMaxX;oLayer.style.top=iTop+"px";oLayer.style.left=iLeft+"px";},_mouseup:function(oLayer,oEvent){jQuery(oLayer).unbind("mousemove",this.$FnMouseMove);jQuery(oLayer).unbind("mouseup",this.$FnMouseUp);},toInt:function(num){var result=parseInt(num);return result||0;},findNonStatic:function(oEl){if(!oEl)return null;if(oEl.tagName=="BODY")return oEl;if(jQuery(oEl).css("position").match(/absolute|relative/i))return oEl;return this.findNonStatic(oEl.offsetParent);},getBaseOffset:function(oEl){var oBase=this.findNonStatic(oEl.offsetParent);var tmp=jQuery(oBase).offset();return{top:tmp.top,left:tmp.left};}});xe.CorePlugin=jQuery.Class({name:"CorePlugin",$init:function(funcOnReady){this.funcOnReady=funcOnReady;},$AFTER_MSG_APP_READY:function(){this.oApp.exec("EXEC_ON_READY_FUNCTION",[]);},$ON_ADD_APP_PROPERTY:function(sPropertyName,oProperty){this.oApp[sPropertyName]=oProperty;},$ON_REGISTER_BROWSER_EVENT:function(obj,sEvent,sCMD,aParams,nDelay){this.oApp.registerBrowserEvent(obj,sEvent,sCMD,aParams,nDelay);},$ON_DISABLE_COMMAND:function(sCommand){this.oApp.disableCommand(sCommand,true);},$ON_ENABLE_COMMAND:function(sCommand){this.oApp.disableCommand(sCommand,false);},$ON_EXEC_ON_READY_FUNCTION:function(){if(typeof this.funcOnReady=="function")this.funcOnReady();}});xe.Utils=jQuery.Class({name:"Utils",$init:function(){if(jQuery.browser.msie&&jQuery.browser.nVersion==6){try{document.execCommand('BackgroundImageCache',false,true);}catch(e){}}},$ON_ATTACH_HOVER_EVENTS:function(aElms,sHoverClass){sHoverClass=sHoverClass||"hover";if(!aElms)return;jQuery(aElms).hover(function(){jQuery(this).addClass(sHoverClass)},function(){jQuery(this).removeClass(sHoverClass)});}});xe.XpressRangeManager=jQuery.Class({name:"XpressRangeManager",oWindow:null,$init:function(win){this.oWindow=win||window;},$BEFORE_MSG_APP_READY:function(){if(this.oWindow&&this.oWindow.tagName=="IFRAME") +this.oWindow=this.oWindow.contentWindow;this.oApp.exec("ADD_APP_PROPERTY",["getSelection",jQuery.fnBind(this.getSelection,this)]);this.oApp.exec("ADD_APP_PROPERTY",["getEmptySelection",jQuery.fnBind(this.getEmptySelection,this)]);},$ON_SET_EDITING_WINDOW:function(oWindow){this.oWindow=oWindow;},getEmptySelection:function(){var oXpressRange=new xe.XpressRange(this.oWindow);return oXpressRange;},getSelection:function(){this.oApp.exec("RESTORE_IE_SELECTION",[]);var oXpressRange=this.getEmptySelection();try{oXpressRange.setFromSelection();}catch(e){} +return oXpressRange;}});xe.Hotkey=jQuery.Class({name:"Hotkey",storage:{},keyhash:{},$init:function(){this.storage={};this.keyhash={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,meta:224,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:46,comma:188,period:190,slash:191,hyphen:109,equal:61};if(jQuery.browser.msie||jQuery.browser.safari){this.keyhash.hyphen=189;this.keyhash.equal=187;this.keyhash.meta=91;}},$ON_MSG_APP_READY:function(){jQuery(this.oApp.getWYSIWYGDocument()||document).keydown(jQuery.fnBind(this.keydown,this));},$ON_REGISTER_HOTKEY:function(sHotkey,sCMD,sArgs){if(!sArgs)sArgs=[];var func=jQuery.fnBind(this.oApp.exec,this.oApp,sCMD,sArgs);sHotkey=this.normalize(sHotkey);if(!sHotkey)return false;this.add(sHotkey,func);},add:function(sHotkey,func){if(typeof this.storage[sHotkey]=='undefined'){this.storage[sHotkey]=[func];}else{this.storage[sHotkey].push(func);}},keydown:function(event){var key=[],kh=this.keyhash;if(jQuery.inArray(event.keyCode,[kh.shift,kh.ctrl,kh.alt,kh.meta])>=0)return;if(event.shiftKey)key.push('shift');if(event.altKey)key.push('alt');if(event.ctrlKey)key.push('ctrl');if(event.metaKey)key.push('meta');if(!key.length)return;if(key.length==1&&event.metaKey)key=['ctrl','meta'];key.push(event.keyCode);key=key.join('+');if(!this.storage[key])return;jQuery.each(this.storage[key],function(){this();});return false;},normalize:function(sHotkey){var shift,ctrl,alt,meta,key,keys=(sHotkey||"").toLowerCase().split('+');shift=ctrl=alt=meta=key=false;jQuery.each(keys,function(){var s=""+this;switch(s){case'shift':shift=true;case'alt':alt=true;case'ctrl':ctrl=true;case'meta':meta=true;default:key=s;}});if(!key)return'';keys=[];if(shift)keys.push('shift');if(alt)keys.push('alt');if(ctrl)keys.push('ctrl');if(meta||(ctrl&&!shift&&!alt))keys.push('meta');keys.push(this.keyhash[key]||key.toUpperCase().charCodeAt(0));return keys.join('+');}});xe.DialogLayerManager=jQuery.Class({name:"DialogLayerManager",aMadeDraggable:null,aOpenedLayers:null,$init:function(){this.aMadeDraggable=[];this.aOpenedLayers=[];},$ON_SHOW_DIALOG_LAYER:function(oLayer,bModal){oLayer=jQuery.$(oLayer);bModal=jQuery.$(bModal)||false;if(!oLayer)return;if(jQuery.inArray(oLayer,this.aOpenedLayers))return;this.oApp.exec("POSITION_DIALOG_LAYER",[oLayer]);this.aOpenedLayers[this.aOpenedLayers.length]=oLayer;if(!jQuery.inArray(oLayer,this.aMadeDraggable)){new xe.DraggableLayer(oLayer,{bModal:bModal,iMinY:0});this.aMadeDraggable[this.aMadeDraggable.length]=oLayer;}else{oLayer.style.display="block";}},$ON_HIDE_LAST_DIALOG_LAYER:function(){this.oApp.exec("HIDE_DIALOG_LAYER",[this.aOpenedLayers[this.aOpenedLayers.length-1]]);},$ON_HIDE_ALL_DIALOG_LAYER:function(){for(var i=this.aOpenedLayers.length-1;i>=0;i--) +this.oApp.exec("HIDE_DIALOG_LAYER",[this.aOpenedLayers[i]]);},$ON_HIDE_DIALOG_LAYER:function(oLayer){oLayer=jQuery.$(oLayer);if(oLayer)oLayer.style.display="none";this.aOpenedLayers=jQuery.grep(this.aOpenedLayers,function(a){return a!=oLayer});},$ON_SET_DIALOG_LAYER_POSITION:function(oLayer,iTop,iLeft){oLayer.style.top=iTop;oLayer.style.left=iLeft;}});xe.ActiveLayerManager=jQuery.Class({name:"ActiveLayerManager",oCurrentLayer:null,$ON_TOGGLE_ACTIVE_LAYER:function(oLayer,sOnOpenCmd,aOnOpenParam,sOnCloseCmd,aOnCloseParam){if(oLayer==this.oCurrentLayer){this.oApp.exec("HIDE_ACTIVE_LAYER",[]);}else{this.oApp.exec("SHOW_ACTIVE_LAYER",[oLayer,sOnCloseCmd,aOnCloseParam]);if(sOnOpenCmd)this.oApp.exec(sOnOpenCmd,aOnOpenParam);}},$ON_SHOW_ACTIVE_LAYER:function(oLayer,sOnCloseCmd,aOnCloseParam){oLayer=jQuery.$(oLayer);this.sOnCloseCmd=sOnCloseCmd;this.aOnCloseParam=aOnCloseParam;var oPrevLayer=this.oCurrentLayer;if(oLayer==oPrevLayer)return;this.oApp.exec("HIDE_ACTIVE_LAYER",[]);oLayer.style.display="block";this.oCurrentLayer=oLayer;},$ON_HIDE_ACTIVE_LAYER:function(){var oLayer=this.oCurrentLayer;if(!oLayer)return;oLayer.style.display="none";this.oCurrentLayer=null;if(this.sOnCloseCmd) +this.oApp.exec(this.sOnCloseCmd,this.aOnCloseParam);},$ON_HIDE_CURRENT_ACTIVE_LAYER:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[]);},$ON_EVENT_EDITING_AREA_KEYDOWN:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[]);},$ON_EVENT_EDITING_AREA_MOUSEDOWN:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[]);}});xe.StringConverterManager=jQuery.Class({name:"StringConverterManager",oConverters:null,$init:function(){this.oConverters={};},$BEFORE_MSG_APP_READY:function(){this.oApp.exec("ADD_APP_PROPERTY",["applyConverter",jQuery.fnBind(this.applyConverter,this)]);this.oApp.exec("ADD_APP_PROPERTY",["addConverter",jQuery.fnBind(this.addConverter,this)]);},applyConverter:function(sRuleName,sContent){var aConverters=this.oConverters[sRuleName];if(!aConverters)return sContent;for(var i=0;i*:first-child",aAllLi[i]).get(0);}}},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.toolbarArea,"mouseover","EVENT_TOOLBAR_MOUSEOVER",[]);this.oApp.registerBrowserEvent(this.toolbarArea,"mouseout","EVENT_TOOLBAR_MOUSEOUT",[]);this.oApp.exec("ADD_APP_PROPERTY",["getToolbarButtonByUIName",jQuery.fnBind(this.getToolbarButtonByUIName,this)]);},$ON_EVENT_TOOLBAR_MOUSEOVER:function(weEvent){if(weEvent.target.tagName=="BUTTON")jQuery(weEvent.target).addClass("hover").parent("span").addClass("hover");},$ON_EVENT_TOOLBAR_MOUSEOUT:function(weEvent){if(weEvent.target.tagName=="BUTTON")jQuery(weEvent.target).removeClass("hover").parent("span").removeClass("hover");},$ON_TOGGLE_TOOLBAR_ACTIVE_LAYER:function(oLayer,oBtn,sOpenCmd,aOpenArgs,sCloseCmd,aCloseArgs){this.oApp.exec("TOGGLE_ACTIVE_LAYER",[oLayer,"MSG_TOOLBAR_LAYER_SHOWN",[oLayer,oBtn,sOpenCmd,aOpenArgs],sCloseCmd,aCloseArgs]);},$ON_MSG_TOOLBAR_LAYER_SHOWN:function(oLayer,oBtn,aOpenCmd,aOpenArgs){this.oApp.exec("POSITION_TOOLBAR_LAYER",[oLayer,oBtn]);if(aOpenCmd)this.oApp.exec(aOpenCmd,aOpenArgs);},$ON_SHOW_TOOLBAR_ACTIVE_LAYER:function(oLayer,sCmd,aArgs,oBtn){this.oApp.exec("SHOW_ACTIVE_LAYER",[oLayer,sCmd,aArgs]);this.oApp.exec("POSITION_TOOLBAR_LAYER",[oLayer,oBtn]);},$ON_ENABLE_UI:function(sUIName){var elUI=this.htUIList[sUIName];if(!elUI)return;jQuery(elUI).removeClass("off");elUI.disabled=false;var sCmd="";if(this.aUICmdMap[sUIName]){for(var i=0;inToolbarLeft)oLayer.style.left=(nToolbarLeft-nLayerLeft-5)+"px";},getToolbarButtonByUIName:function(sUIName){return this.htUIList[sUIName];}});xe.XE_EditingAreaManager=jQuery.Class({name:"XE_EditingAreaManager",oActivePlugin:null,oIRField:null,bIsDirty:false,$init:function(sInitialMode,oIRField,oDimension,fOnBeforeUnload,oAppContainer){this.sInitialMode=sInitialMode;this.oIRField=jQuery.$(oIRField);this._assignHTMLObjects(oAppContainer);this.fOnBeforeUnload=fOnBeforeUnload;this.oEditingMode={};this.elEditingAreaContainer.style.height=parseInt(oDimension.nHeight||this.elEditingAreaContainer.offsetHeight)+"px";this.nMinHeight=oDimension.nMinHeight||10;this.niMinWidth=oDimension.nMinWidth||10;},_assignHTMLObjects:function(oAppContainer){oAppContainer=jQuery.$(oAppContainer)||document;this.elEditingAreaContainer=jQuery("DIV.xpress_xeditor_editing_area_container",oAppContainer).get(0);this.elEditingAreaSkipUI=jQuery("A.skip",oAppContainer).get(0);},$BEFORE_MSG_APP_READY:function(msg){this.oApp.exec("ADD_APP_PROPERTY",["elEditingAreaContainer",this.elEditingAreaContainer]);this.oApp.exec("ADD_APP_PROPERTY",["getIR",jQuery.fnBind(this.getIR,this)]);this.oApp.exec("ADD_APP_PROPERTY",["setIR",this.setIR]);this.oApp.exec("ADD_APP_PROPERTY",["getEditingMode",jQuery.fnBind(this.getEditingMode,this)]);},$ON_MSG_APP_READY:function(){this.oApp.exec("CHANGE_EDITING_MODE",[this.sInitialMode,true]);this.oApp.exec("LOAD_IR_FIELD",[false]);this.oApp.registerBrowserEvent(this.elEditingAreaSkipUI,"focus","MSG_EDITING_AREA_SIZE_CHANGED",[],50);this.oApp.registerBrowserEvent(this.elEditingAreaSkipUI,"blur","MSG_EDITING_AREA_SIZE_CHANGED",[],50);var fOnBeforeUnload=this.fOnBeforeUnload||function(){if(this.getIR()!=this.oIRField.value||this.bIsDirty)return this.oApp.$MSG("XE_EditingAreaManager.onExit")};jQuery(window).bind("beforeunload",jQuery.fnBind(fOnBeforeUnload,this));},$AFTER_MSG_APP_READY:function(){this.oApp.exec("UPDATE_IR_FIELD",[]);},$ON_LOAD_IR_FIELD:function(bDontAddUndo){this.oApp.setIR(this.oIRField.value,bDontAddUndo);},$ON_UPDATE_IR_FIELD:function(){this.oIRField.value=this.oApp.getIR();},$BEFORE_CHANGE_EDITING_MODE:function(sMode){this._oPrevActivePlugin=this.oActivePlugin;this.oActivePlugin=this.oEditingMode[sMode];},$AFTER_CHANGE_EDITING_MODE:function(sMode,bNoFocus){if(this._oPrevActivePlugin){var sIR=this._oPrevActivePlugin.getIR();this.oApp.exec("SET_IR",[sIR]);this.oApp.exec("ENABLE_UI",[this._oPrevActivePlugin.sMode]);this._setEditingAreaDimension();} +this.oApp.exec("DISABLE_UI",[this.oActivePlugin.sMode]);if(!bNoFocus){this.oApp.exec("FOCUS",[]);}},$ON_SET_IS_DIRTY:function(bIsDirty){this.bIsDirty=bIsDirty;},$ON_FOCUS:function(){if(!this.oActivePlugin||typeof this.oActivePlugin.setIR!="function")return +this.oActivePlugin.focus();},$BEFORE_SET_IR:function(sIR,bDontAddUndoHistory){bDontAddUndoHistory=bDontAddUndoHistory||false;if(!bDontAddUndoHistory)this.oApp.exec("RECORD_UNDO_ACTION",["SET CONTENTS"]);},$ON_SET_IR:function(sIR){if(!this.oActivePlugin||typeof this.oActivePlugin.setIR!="function")return +this.oActivePlugin.setIR(sIR);},$AFTER_SET_IR:function(sIR,bDontAddUndoHistory){bDontAddUndoHistory=bDontAddUndoHistory||false;if(!bDontAddUndoHistory)this.oApp.exec("RECORD_UNDO_ACTION",["SET CONTENTS"]);},$ON_REGISTER_EDITING_AREA:function(oEditingAreaPlugin){this.oEditingMode[oEditingAreaPlugin.sMode]=oEditingAreaPlugin;this.attachDocumentEvents(oEditingAreaPlugin.oEditingArea);},$ON_MSG_EDITING_AREA_RESIZE_STARTED:function(){this.oActivePlugin.elEditingArea.style.display="none";this.iStartingHeight=parseInt(this.elEditingAreaContainer.style.height);},$ON_RESIZE_EDITING_AREA:function(ipNewWidth,ipNewHeight){var iNewWidth=parseInt(ipNewWidth);var iNewHeight=parseInt(ipNewHeight);if(iNewWidth=33&&oEvent.keyCode<=40)||oEvent.keyCode==16)return;this._recordUndo(oEvent);},$ON_PASTE_HTML:function(sHTML,oPSelection){if(this.oApp.getEditingMode()!=this.sMode)return;var oSelection=oPSelection||this.oApp.getSelection();oSelection.pasteHTML(sHTML);if(!jQuery.browser.msie){var sTmpBookmark=oSelection.placeStringBookmark();this.oApp.getWYSIWYGDocument().body.innerHTML=this.oApp.getWYSIWYGDocument().body.innerHTML;oSelection.moveToBookmark(sTmpBookmark);oSelection.collapseToEnd();oSelection.select();oSelection.removeStringBookmark(sTmpBookmark);} +this.oApp.exec("RECORD_UNDO_ACTION",["INSERT HTML"]);},$AFTER_MSG_EDITING_AREA_RESIZE_ENDED:function(FnMouseDown,FnMouseMove,FnMouseUp){this.oApp.exec("REFRESH_WYSIWYG",[]);},$ON_RESTORE_IE_SELECTION:function(){if(this._oIERange){this._oIERange.select();this._oPrevIERange=this._oIERange;this._oIERange=null;}},initIframe:function(){try{this.doc=this.iframe.contentWindow.document;if(this.doc==null||this.doc.location.href=='about:blank'){throw new Error('Access denied');} +this._enableWYSIWYG();this.status=xe.PLUGIN_STATUS["READY"];}catch(e){if(this._nIFrameReadyCount-->0){setTimeout(jQuery.fnBind(this.initIframe,this),100);}else{throw("iframe for WYSIWYG editing mode can't be initialized. Please check if the iframe document exists and is also accessable(cross-domain issues). ");}}},getIR:function(){var sContent=this.doc.body.innerHTML;var sIR;if(this.oApp.applyConverter) +sIR=this.oApp.applyConverter(this.sMode+"_TO_IR",sContent);else +sIR=sContent;return sIR;},setIR:function(sIR){var sContent;if(this.oApp.applyConverter) +sContent=this.oApp.applyConverter("IR_TO_"+this.sMode,sIR);else +sContent=sIR;this.doc.body.innerHTML=sContent;if(jQuery.browser.mozilla){if(this.doc.body.innerHTML=="")this.doc.body.innerHTML="
    ";}},getWindow:function(){return this.iframe.contentWindow;},getDocument:function(){return this.iframe.contentWindow.document;},focus:function(){this.getWindow().focus();this.oApp.exec("RESTORE_IE_SELECTION",[]);},_recordUndo:function(oKeyInfo){var curTime=new Date();if(curTime-this.iLastUndoRecorded";if(oEWrapper.innerHTML=="")oEWrapper.innerHTML="
    ";if(oEWrapper.nextSibling&&oEWrapper.nextSibling.tagName=="BR")oEWrapper.parentNode.removeChild(oEWrapper.nextSibling);oSelection.selectNodeContents(oEWrapper);oSelection.collapseToStart();oSelection.select();this.oApp.exec("CHECK_STYLE_CHANGE",[]);}else{oSelection.removeStringBookmark(sBM);}}}});xe.XE_WYSIWYGStyler=jQuery.Class({name:"XE_WYSIWYGStyler",$PRECONDITION:function(sFullCommand,aArgs){return(this.oApp.getEditingMode()=="WYSIWYG");},$ON_SET_WYSIWYG_STYLE:function(oStyles){var oSelection=this.oApp.getSelection();if(oSelection.collapsed){var oSpan=this.oApp.getWYSIWYGDocument().createElement("SPAN");oSelection.insertNode(oSpan);oSpan.innerHTML=unescape("%uFEFF");var sValue;for(var sName in oStyles){sValue=oStyles[sName];if(typeof sValue!="string")continue;oSpan.style[sName]=sValue;} +oSelection.selectNodeContents(oSpan);oSelection.collapseToEnd();oSelection._window.focus();oSelection._window.document.body.focus();oSelection.select();if(jQuery.browser.mozilla&&jQuery.browser.nVersion==3) +oSpan.innerHTML="";return;} +this.oApp.exec("RECORD_UNDO_BEFORE_ACTION",["FONT STYLE"]);oSelection.styleRange(oStyles);oSelection._window.focus();oSelection.select();this.oApp.exec("RECORD_UNDO_AFTER_ACTION",["FONT STYLE"]);}});xe.XE_WYSIWYGStyleGetter=jQuery.Class({name:"XE_WYSIWYGStyleGetter",hKeyUp:null,getStyleInterval:200,oStyleMap:{fontFamily:{type:"Value",css:"fontFamily"},fontSize:{type:"Value",css:"fontSize"},lineHeight:{type:"Value",css:"lineHeight",converter:function(sValue,oStyle){if(!sValue.match(/px$/))return sValue;return Math.ceil((parseInt(sValue)/parseInt(oStyle.fontSize))*10)/10;}},bold:{command:"bold"},underline:{command:"underline"},italic:{command:"italic"},lineThrough:{command:"strikethrough"},superscript:{command:"superscript"},subscript:{command:"subscript"},justifyleft:{command:"justifyleft"},justifycenter:{command:"justifycenter"},justifyright:{command:"justifyright"},justifyfull:{command:"justifyfull"},orderedlist:{command:"insertorderedlist"},unorderedlist:{command:"insertunorderedlist"}},$init:function(){this.oStyle=this._getBlankStyle();},$PRECONDITION:function(){if(this.oApp.getEditingMode()!="WYSIWYG")return false;return true;},$ON_MSG_APP_READY:function(){this.oDocument=this.oApp.getWYSIWYGDocument();this.oApp.exec("ADD_APP_PROPERTY",["getCurrentStyle",jQuery.fnBind(this.getCurrentStyle,this)]);},$ON_EVENT_EDITING_AREA_MOUSEUP:function(oEvnet){if(this.hKeyUp)clearTimeout(this.hKeyUp);this.oApp.exec("CHECK_STYLE_CHANGE",[]);},$ON_EVENT_EDITING_AREA_KEYUP:function(oEvent){if(!(oEvent.keyCode==8||(oEvent.keyCode>=33&&oEvent.keyCode<=40)||oEvent.keyCode==45||oEvent.keyCode==46))return;if(this.hKeyUp)clearTimeout(this.hKeyUp);this.hKeyUp=setTimeout(jQuery.fnBind(this.oApp.exec,this.oApp,"CHECK_STYLE_CHANGE",[]),this.getStyleInterval);},$ON_CHECK_STYLE_CHANGE:function(){this._getStyle();},$ON_RESET_STYLE_STATUS:function(){var oBlankStyle=this._getBlankStyle();for(var sAttributeName in oBlankStyle) +this.oApp.exec("SET_STYLE_STATUS",[sAttributeName,oBlankStyle[sAttributeName]]);},getCurrentStyle:function(){return this.oStyle;},_check_style_change:function(){this.oApp.exec("CHECK_STYLE_CHANGE",[]);},_getBlankStyle:function(){var oBlankStyle={};for(var attributeName in this.oStyleMap){if(this.oStyleMap[attributeName].type=="Value") +oBlankStyle[attributeName]="";else +oBlankStyle[attributeName]=0;} +return oBlankStyle;},_getStyle:function(){var oSelection=this.oApp.getSelection();var funcFilter=function(oNode){if(!oNode.childNodes||oNode.childNodes.length==0) +return true;else +return false;} +var aBottomNodes=oSelection.getNodes(false,funcFilter);var oStyle,oBaseStyle,oTmpStyle,attributeName;if(aBottomNodes.length==0){oStyle=this._getStyleOf(oSelection.commonAncestorContainer);}else{oStyle=this._getStyleOf(aBottomNodes[0]);} +for(attributeName in oStyle){if(this.oStyleMap[attributeName].converter){oStyle[attributeName]=this.oStyleMap[attributeName].converter(oStyle[attributeName],oStyle);} +if(this.oStyle[attributeName]!=oStyle[attributeName]) +this.oApp.exec("MSG_STYLE_CHANGED",[attributeName,oStyle[attributeName]]);} +this.oStyle=oStyle;},_getStyleOf:function(oNode){var oStyle=this._getBlankStyle();if(!oNode)return oStyle;if(oNode.nodeType==3)oNode=oNode.parentNode;var welNode=jQuery(oNode);var attribute,cssName;for(var styleName in this.oStyle){attribute=this.oStyleMap[styleName];if(attribute.type&&attribute.type=="Value"){if(attribute.css){var sValue=welNode.css(attribute.css);if(styleName=="fontFamily"){sValue=sValue.split(/,/)[0];} +oStyle[styleName]=sValue;}else{if(attribute.command){try{oStyle[styleName]=this.oDocument.queryCommandState(attribute.command);}catch(e){}}else{}}}else{if(attribute.command){try{if(this.oDocument.queryCommandState(attribute.command)){oStyle[styleName]=1;}else{oStyle[styleName]=0;}}catch(e){}}else{}}} +return oStyle;}});xe.XE_FontSizeWithSelectUI=jQuery.Class({name:"XE_FontSizeWithSelectUI",$init:function(elAppContainer){this._assignHTMLObjects(elAppContainer);},_assignHTMLObjects:function(elAppContainer){this.elFontSizeSelect=jQuery("SELECT.xpress_xeditor_ui_fontSize_select",elAppContainer).get(0);},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.elFontSizeSelect,"change","SET_FONTSIZE_FROM_SELECT_UI");this.elFontSizeSelect.selectedIndex=0;},$ON_MSG_STYLE_CHANGED:function(sAttributeName,sAttributeValue){if(sAttributeName=="fontSize"){this.elFontSizeSelect.value=sAttributeValue;if(this.elFontSizeSelect.selectedIndex<0)this.elFontSizeSelect.selectedIndex=0;}},$ON_SET_FONTSIZE_FROM_SELECT_UI:function(){var sFontSize=this.elFontSizeSelect.value;if(!sFontSize)return;this.oApp.exec("SET_WYSIWYG_STYLE",[{"fontSize":sFontSize}]);this.oApp.exec("CHECK_STYLE_CHANGE",[]);}});xe.XE_FontNameWithSelectUI=jQuery.Class({name:"XE_FontNameWithSelectUI",$init:function(elAppContainer){this._assignHTMLObjects(elAppContainer);},_assignHTMLObjects:function(elAppContainer){this.elFontNameSelect=jQuery("SELECT.xpress_xeditor_ui_fontName_select",elAppContainer).get(0);},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.elFontNameSelect,"change","SET_FONTNAME_FROM_SELECT_UI");this.elFontNameSelect.selectedIndex=0;},$ON_MSG_STYLE_CHANGED:function(sAttributeName,sAttributeValue){if(sAttributeName=="fontFamily"){this.elFontNameSelect.value=sAttributeValue.toLowerCase();if(this.elFontNameSelect.selectedIndex<0)this.elFontNameSelect.selectedIndex=0;}},$ON_SET_FONTNAME_FROM_SELECT_UI:function(){var sFontName=this.elFontNameSelect.value;if(!sFontName)return;this.oApp.exec("SET_WYSIWYG_STYLE",[{"fontFamily":sFontName}]);this.oApp.exec("CHECK_STYLE_CHANGE",[]);}});xe.XE_LineHeight=jQuery.Class({name:"XE_LineHeight",$init:function(oAppContainer){this._assignHTMLObjects(oAppContainer);},_assignHTMLObjects:function(oAppContainer){},$ON_SET_LINEHEIGHT:function(nLineHeight){this.setLineHeight(nLineHeight);},getLineHeight:function(){var nodes=this._getSelectedNodes(false);var curWrapper,prevWrapper;var iCurHeight,iHeight;if(nodes.length==0)return-1;var iLength=nodes.length;if(iLength==0){iHeight=-1;}else{prevWrapper=this._getLineWrapper(nodes[0]);iHeight=this._getWrapperLineheight(prevWrapper);} +var firstNode=this.oSelection.getStartNode();if(iHeight>0){for(var i=1;i=0;i--){if(aNodes[i].nodeType==3||aNodes[i].tagName=="BR"){var oP=oSelection._document.createElement("P");oInsertionPoint=aNodes[i].nextSibling;while(i>=0&&aNodes[i]&&(aNodes[i].nodeType==3||aNodes[i].tagName=="BR")){oP.insertBefore(aNodes[i--],oP.firstChild);} +oFormattingNode.insertBefore(oP,oInsertionPoint);i++;}} +if(oFormattingNode&&oFormattingNode.parentNode){var oP=oSelection._document.createElement("P");oP.innerHTML=unescape("
    ");oFormattingNode.parentNode.insertBefore(oP,oFormattingNode.nextSibling);} +this.oApp.exec("RECORD_UNDO_ACTION",["Block Quote"]);return oFormattingNode;},_expandToTableStart:function(oSelection,oNode){var oC=oSelection.commonAncestorContainer;var oResultNode=null;var bLastIteration=false;while(oNode&&!bLastIteration){if(oNode==oC)bLastIteration=true;if(/TBODY|TFOOT|THEAD|TR/i.test(oNode.tagName)){oResultNode=this._getTableRoot(oNode);break;} +oNode=oNode.parentNode;} +return oResultNode;},_getTableRoot:function(oNode){while(oNode&&oNode.tagName!="TABLE")oNode=oNode.parentNode;return oNode;}});xe.XE_SCharacter=jQuery.Class({name:"XE_SCharacter",$init:function(oAppContainer){this.bIE=jQuery.browser.msie;this._assignHTMLObjects(oAppContainer);this.charSet=[];this.charSet[0]=unescape('FF5B FF5D 3014 3015 3008 3009 300A 300B 300C 300D 300E 300F 3010 3011 2018 2019 201C 201D 3001 3002 %B7 2025 2026 %A7 203B 2606 2605 25CB 25CF 25CE 25C7 25C6 25A1 25A0 25B3 25B2 25BD 25BC 25C1 25C0 25B7 25B6 2664 2660 2661 2665 2667 2663 2299 25C8 25A3 25D0 25D1 2592 25A4 25A5 25A8 25A7 25A6 25A9 %B1 %D7 %F7 2260 2264 2265 221E 2234 %B0 2032 2033 2220 22A5 2312 2202 2261 2252 226A 226B 221A 223D 221D 2235 222B 222C 2208 220B 2286 2287 2282 2283 222A 2229 2227 2228 FFE2 21D2 21D4 2200 2203 %B4 FF5E 02C7 02D8 02DD 02DA 02D9 %B8 02DB %A1 %BF 02D0 222E 2211 220F 266D 2669 266A 266C 327F 2192 2190 2191 2193 2194 2195 2197 2199 2196 2198 321C 2116 33C7 2122 33C2 33D8 2121 2668 260F 260E 261C 261E %B6 2020 2021 %AE %AA %BA 2642 2640').replace(/(\S{4})/g,function(a){return"%u"+a}).split(' ');this.charSet[1]=unescape('%BD 2153 2154 %BC %BE 215B 215C 215D 215E %B9 %B2 %B3 2074 207F 2081 2082 2083 2084 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 FFE6 %24 FFE5 FFE1 20AC 2103 212B 2109 FFE0 %A4 2030 3395 3396 3397 2113 3398 33C4 33A3 33A4 33A5 33A6 3399 339A 339B 339C 339D 339E 339F 33A0 33A1 33A2 33CA 338D 338E 338F 33CF 3388 3389 33C8 33A7 33A8 33B0 33B1 33B2 33B3 33B4 33B5 33B6 33B7 33B8 33B9 3380 3381 3382 3383 3384 33BA 33BB 33BC 33BD 33BE 33BF 3390 3391 3392 3393 3394 2126 33C0 33C1 338A 338B 338C 33D6 33C5 33AD 33AE 33AF 33DB 33A9 33AA 33AB 33AC 33DD 33D0 33D3 33C3 33C9 33DC 33C6').replace(/(\S{4})/g,function(a){return"%u"+a}).split(' ');this.charSet[2]=unescape('3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 326A 326B 326C 326D 326E 326F 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 327A 327B 24D0 24D1 24D2 24D3 24D4 24D5 24D6 24D7 24D8 24D9 24DA 24DB 24DC 24DD 24DE 24DF 24E0 24E1 24E2 24E3 24E4 24E5 24E6 24E7 24E8 24E9 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 246A 246B 246C 246D 246E 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 320A 320B 320C 320D 320E 320F 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 321A 321B 249C 249D 249E 249F 24A0 24A1 24A2 24A3 24A4 24A5 24A6 24A7 24A8 24A9 24AA 24AB 24AC 24AD 24AE 24AF 24B0 24B1 24B2 24B3 24B4 24B5 2474 2475 2476 2477 2478 2479 247A 247B 247C 247D 247E 247F 2480 2481 2482').replace(/(\S{4})/g,function(a){return"%u"+a}).split(' ');this.charSet[3]=unescape('3131 3132 3133 3134 3135 3136 3137 3138 3139 313A 313B 313C 313D 313E 313F 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 314A 314B 314C 314D 314E 314F 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 315A 315B 315C 315D 315E 315F 3160 3161 3162 3163 3165 3166 3167 3168 3169 316A 316B 316C 316D 316E 316F 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 317A 317B 317C 317D 317E 317F 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 318A 318B 318C 318D 318E').replace(/(\S{4})/g,function(a){return"%u"+a}).split(' ');this.charSet[4]=unescape('0391 0392 0393 0394 0395 0396 0397 0398 0399 039A 039B 039C 039D 039E 039F 03A0 03A1 03A3 03A4 03A5 03A6 03A7 03A8 03A9 03B1 03B2 03B3 03B4 03B5 03B6 03B7 03B8 03B9 03BA 03BB 03BC 03BD 03BE 03BF 03C0 03C1 03C3 03C4 03C5 03C6 03C7 03C8 03C9 %C6 %D0 0126 0132 013F 0141 %D8 0152 %DE 0166 014A %E6 0111 %F0 0127 I 0133 0138 0140 0142 0142 0153 %DF %FE 0167 014B 0149 0411 0413 0414 0401 0416 0417 0418 0419 041B 041F 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F 0431 0432 0433 0434 0451 0436 0437 0438 0439 043B 043F 0444 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F').replace(/(\S{4})/g,function(a){return"%u"+a}).split(' ');this.charSet[5]=unescape('3041 3042 3043 3044 3045 3046 3047 3048 3049 304A 304B 304C 304D 304E 304F 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 305A 305B 305C 305D 305E 305F 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 306A 306B 306C 306D 306E 306F 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 307A 307B 307C 307D 307E 307F 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 308A 308B 308C 308D 308E 308F 3090 3091 3092 3093 30A1 30A2 30A3 30A4 30A5 30A6 30A7 30A8 30A9 30AA 30AB 30AC 30AD 30AE 30AF 30B0 30B1 30B2 30B3 30B4 30B5 30B6 30B7 30B8 30B9 30BA 30BB 30BC 30BD 30BE 30BF 30C0 30C1 30C2 30C3 30C4 30C5 30C6 30C7 30C8 30C9 30CA 30CB 30CC 30CD 30CE 30CF 30D0 30D1 30D2 30D3 30D4 30D5 30D6 30D7 30D8 30D9 30DA 30DB 30DC 30DD 30DE 30DF 30E0 30E1 30E2 30E3 30E4 30E5 30E6 30E7 30E8 30E9 30EA 30EB 30EC 30ED 30EE 30EF 30F0 30F1 30F2 30F3 30F4 30F5 30F6').replace(/(\S{4})/g,function(a){return"%u"+a}).split(' ');},_assignHTMLObjects:function(oAppContainer){oAppContainer=jQuery.$(oAppContainer)||document;this.elDropdownLayer=jQuery("DIV.xpress_xeditor_sCharacter_layer",oAppContainer).get(0);this.oTextField=jQuery("INPUT",this.elDropdownLayer).get(0);this.oInsertButton=jQuery("+ BUTTON",this.oTextField).get(0);this.aCloseButton=jQuery("BUTTON.close",this.elDropdownLayer).get();this.aSCharList=jQuery(".list",this.elDropdownLayer).get();var oLabelUL=jQuery(">UL",this.elDropdownLayer).get(0);this.aLabelA=jQuery("A",oLabelUL).get();},$ON_MSG_APP_READY:function(){var funcInsert=jQuery.fnBind(this.oApp.exec,this.oApp,"INSERT_SCHARACTERS",[this.oTextField.value]);jQuery(this.oInsertButton).click(funcInsert,this);this.oApp.exec("SET_SCHARACTER_LIST",[this.charSet]);for(var i=0;i");}else{button=document.createElement("BUTTON");button.type="button";} +span=document.createElement("SPAN");span.innerHTML=unescape(this.charSet[i][ii]);button.appendChild(span);aLI[ii].appendChild(button);this.aSCharList[i].appendChild(aLI[ii]);}},_stopBrowserEvent:function(obj,sEvent){jQuery(obj).bind(sEvent,function(e){e.stopPropagation();e.preventDefault();})}});xe.XE_UndoRedo=jQuery.Class({name:"XE_UndoRedo",actionHistory:null,oCurStateIdx:null,iMinimumSizeChange:10,sBlankContentsForFF:"
    ",$init:function(){this.aUndoHistory=[];this.oCurStateIdx={nIdx:0,nStep:0};},$PRECONDITION:function(sCmd){if(sCmd.match(/_DO_RECORD_UNDO_HISTORY_AT$/))return true;try{if(this.oApp.getEditingMode()!="WYSIWYG")return false;}catch(e){return false;} +return true;},$BEFORE_MSG_APP_READY:function(){this.oApp.exec("DO_RECORD_UNDO_HISTORY_AT",[this.oCurStateIdx,"","",null]);},$ON_MSG_APP_READY:function(){this.bFF=jQuery.browser.mozilla;this.oApp.exec("ADD_APP_PROPERTY",["getUndoHistory",jQuery.fnBind(this.getUndoHistory,this)]);this.oApp.exec("ADD_APP_PROPERTY",["getUndoStateIdx",jQuery.fnBind(this.getUndoStateIdx,this)]);this.oApp.exec("REGISTER_UI_EVENT",["undo","click","UNDO"]);this.oApp.exec("REGISTER_UI_EVENT",["redo","click","REDO"]);this.oApp.exec("REGISTER_HOTKEY",["ctrl+z","UNDO"]);this.oApp.exec("REGISTER_HOTKEY",["ctrl+y","REDO"]);},$ON_UNDO:function(){var oTmpStateIdx={};this.oApp.exec("DO_RECORD_UNDO_HISTORY",["KEYPRESS",false,false,1]);if(this.oCurStateIdx.nIdx==0)return;if(this.oCurStateIdx.nStep>0){this.oCurStateIdx.nStep--;}else{var oTmpHistory=this.aUndoHistory[this.oCurStateIdx.nIdx];this.oCurStateIdx.nIdx--;if(oTmpHistory.nTotalSteps>1){this.oCurStateIdx.nStep=0;}else{oTmpHistory=this.aUndoHistory[this.oCurStateIdx.nIdx];this.oCurStateIdx.nStep=oTmpHistory.nTotalSteps-1;}} +this.oApp.exec("RESTORE_UNDO_HISTORY",[this.oCurStateIdx.nIdx,this.oCurStateIdx.nStep]);this.oApp.exec("CHECK_STYLE_CHANGE",[]);},$ON_REDO:function(){if(this.oCurStateIdx.nIdx>=this.aUndoHistory.length)return;var oCurHistory=this.aUndoHistory[this.oCurStateIdx.nIdx];if(this.oCurStateIdx.nIdx==this.aUndoHistory.length-1&&this.oCurStateIdx.nStep>=oCurHistory.nTotalSteps-1)return;if(this.oCurStateIdx.nStep .bx",this.oUILayer).get();this.oFindInputSet=oTmp[0];this.oReplaceInputSet=oTmp[1];this.oFindInput_Keyword=jQuery("INPUT",this.oFindInputSet).get(0);oTmp=jQuery("INPUT",this.oReplaceInputSet).get();this.oReplaceInput_Original=oTmp[0];this.oReplaceInput_Replacement=oTmp[1];this.oFindNextButton=jQuery("BUTTON.find_next",this.oUILayer).get(0);this.oCancelButton=jQuery("BUTTON.cancel",this.oUILayer).get(0);this.oReplaceButton=jQuery("BUTTON.replace",this.oUILayer).get(0);this.oReplaceAllButton=jQuery("BUTTON.replace_all",this.oUILayer).get(0);this.aCloseButtons=jQuery("BUTTON.close",this.oUILayer).get();this.aCloseButtons[this.aCloseButtons.length]=this.oCancelButton;},$ON_MSG_APP_READY:function(){if(this.oEditingWindow&&this.oEditingWindow.tagName=="IFRAME") +this.oEditingWindow=this.oEditingWindow.contentWindow;this.oFindReplace=new xe.FindReplace(this.oEditingWindow);if(!this.oFindReplace.bBrowserSupported){this.oApp.exec("DISABLE_UI",["find_replace"]);return;} +for(var i=0;i"+sURL+"";this.oSelection.pasteHTML(str);}else{var nSession=Math.ceil(Math.random()*10000);var arg=(sURL==""?["unlink"]:["createLink",false,this.sATagMarker+nSession+sURL]);this.oApp.exec("EXECCOMMAND",arg);this.oSelection.setFromSelection();var oDoc=this.oApp.getWYSIWYGDocument();var aATags=oDoc.body.getElementsByTagName("A");var nLen=aATags.length;var rxMarker=new RegExp(this.sRXATagMarker+nSession,"i");var elATag;for(var i=0;ithis.iMaxRows)iRows=this.iMaxRows;this.oRowInput.value=iRows;this._showNewTable();},$ON_ST_SET_COLUMN_NUM:function(iColumns,iColumnDiff){iColumns=iColumns||parseInt(this.oColumnInput.value);iColumnDiff=iColumnDiff||0;iColumns+=iColumnDiff;if(iColumnsthis.iMaxColumns)iColumns=this.iMaxColumns;this.oColumnInput.value=iColumns;this._showNewTable();},$ON_ST_INSERT_TABLE:function(){var sTable=this._getTableString();this.oApp.exec("PASTE_HTML",[sTable]);this.oApp.exec("ST_CLOSE",[]);},$ON_ST_CLOSE:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[]);},$ON_ST_SET_BORDER_WIDTH:function(iBorderWidth,iBorderWidthDiff){iBorderWidth=iBorderWidth||parseInt(this.oBorderWidthInput.value);iBorderWidthDiff=iBorderWidthDiff||0;iBorderWidth+=iBorderWidthDiff;if(iBorderWidththis.iMaxBorderWidth)iBorderWidth=this.iMaxBorderWidth;this.oBorderWidthInput.value=iBorderWidth;this._showNewTable();},$ON_ST_INC_BORDER_WIDTH:function(){this.oApp.exec("ST_SET_BORDER_WIDTH",[null,1]);},$ON_ST_DEC_BORDER_WIDTH:function(){this.oApp.exec("ST_SET_BORDER_WIDTH",[null,-1]);},$ON_ST_TOGGLE_BORDER_COLOR_LAYER:function(){if(this.welDropdownLayer.hasClass("p1")) +this.oApp.exec("ST_HIDE_BORDER_COLOR_LAYER",[]);else +this.oApp.exec("ST_SHOW_BORDER_COLOR_LAYER",[]);},$ON_ST_SHOW_BORDER_COLOR_LAYER:function(){this.welDropdownLayer.addClass("p1");this.welDropdownLayer.removeClass("p2");this.oApp.exec("SHOW_COLOR_PALETTE",["ST_SET_BORDER_COLOR_FROM_PALETTE",this.elDropdownLayer]);},$ON_ST_HIDE_BORDER_COLOR_LAYER:function(){this.welDropdownLayer.removeClass("p1");this.oApp.exec("HIDE_COLOR_PALETTE",[]);},$ON_ST_TOGGLE_BGCOLOR_LAYER:function(){if(this.welDropdownLayer.hasClass("p2")) +this.oApp.exec("ST_HIDE_BGCOLOR_LAYER",[]);else +this.oApp.exec("ST_SHOW_BGCOLOR_LAYER",[]);},$ON_ST_SHOW_BGCOLOR_LAYER:function(){this.welDropdownLayer.removeClass("p1");this.welDropdownLayer.addClass("p2");this.oApp.exec("SHOW_COLOR_PALETTE",["ST_SET_BGCOLOR_FROM_PALETTE",this.elDropdownLayer]);},$ON_ST_HIDE_BGCOLOR_LAYER:function(){this.welDropdownLayer.removeClass("p2");this.oApp.exec("HIDE_COLOR_PALETTE",[]);},$ON_ST_SET_BORDER_COLOR_FROM_PALETTE:function(sColorCode){this.oApp.exec("ST_SET_BORDER_COLOR",[sColorCode]);this.oApp.exec("ST_HIDE_BORDER_COLOR_LAYER",[]);},$ON_ST_SET_BORDER_COLOR:function(sColorCode){this.oBorderColorInput.value=sColorCode;this.oButton_BorderColorPreview.style.backgroundColor=sColorCode;this._showNewTable();},$ON_ST_SET_BGCOLOR_FROM_PALETTE:function(sColorCode){this.oApp.exec("ST_SET_BGCOLOR",[sColorCode]);this.oApp.exec("ST_HIDE_BGCOLOR_LAYER",[]);},$ON_ST_SET_BGCOLOR:function(sColorCode){this.oBGColorInput.value=sColorCode;this.oButton_BGColorPreview.style.backgroundColor=sColorCode;this._showNewTable();},_showNewTable:function(){var oTmp=document.createElement("DIV");oTmp.innerHTML=this._getTableString();var oNewTable=oTmp.firstChild;this.oSampleTable.parentNode.insertBefore(oNewTable,this.oSampleTable);this.oSampleTable.parentNode.removeChild(this.oSampleTable);this.oSampleTable=oNewTable;},_getTableString:function(){var sBorderColorCode=this.oBorderColorInput.value;var sBGColorCode=this.oBGColorInput.value;var iBorderWidth=this.oBorderWidthInput.value;var sTD="";if(jQuery.browser.msie){sTD="

    ";}else{if(jQuery.browser.firefox){sTD="


    ";}else{sTD="

     

    ";}} +var sTable='';var sRow='';var iColumns=this.oColumnInput.value;for(var i=0;i";for(var i=0;i/ig,regex_meanless_css2=/(?:(?:margin|padding)\s*:\s*0(?:px)?|\-(?:moz|ms|webkit|opera)\-[\w-]+\s*:\s*.*?|[\w-]+\s*:\s*\-(?:moz|ms|webkit|opera)\-[\w-]+|(?:line-height|font-variant|font-stretch|font-size-adjust|font-size)\s*:\s*[a-z_-]+)\s*;?\s*|font-(?:weight|style)\s*:\s*normal;?/ig,regex_class=/<(.*?)\s+class\s*=(?:\s*".*?"|\s*'.*?'|[^\s>]+)(.*?)>/ig,regex_handler=/<(.*?)\s+on[a-z]+\s*=(?:\s*".*?"|\s*'.*?'|[^\s>]+)(.*?)>/ig,regex_id=/<(.*?)\s+id\s*=(?:[^\s>]+|\s*".*?"|\s*'.*?')(.*?)>/ig,regex_script=//ig,regex_font_color=/color\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i,regex_font_face=/face\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i,regex_font_size=/size\s*=(?:\s*"(\d+)"|\s*'(\d+)'|(\d+))/i,regex_style=/style\s*=\s*(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i,regex_font_weight=/font-weight\s*:\s*([a-z]+);?/i,regex_font_style=/font-style\s*:\s*italic;?/i,regex_font_decoration=/text-decoration\s*:\s*([a-z -]+);?/i;var +allow_tags='a,abbr,acronym,address,area,blockquote,br,caption,center,cite,code,col,colgroup,dd,del,dfn,div,dl,dt,em,embed,h1,h2,h3,h4,h5,h6,hr,img,ins,kbd,li,map,object,ol,p,param,pre,q,samp,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,tt,u,ul,var'.split(','),lonely_tags='area,br,col,embed,hr,img,input,param'.split(',');var +replace_tags={'b':'strong','i':'em','s':'del','strike':'del'};xe.XE_XHTMLConverter=$.Class({name:"XE_XHTMLConverter",$ON_MSG_APP_READY:function(){this.oApp.addConverter("WYSIWYG_TO_IR",this.TO_IR);this.oApp.addConverter("HTMLSrc_TO_IR",this.TO_IR);this.oApp.addConverter("IR_TO_HTMLSrc",this.IR_TO);this.oApp.addConverter("IR_TO_WYSIWYG",this.IR_TO);},TO_IR:function(sContent){var stack=[];sContent=sContent.replace(regex_meanless_css1,function(m0,m1,m2,m3){m2=m2.replace(regex_meanless_css2,'');return'<'+m1+(m2?' style="'+m2+'"':'')+m3+'>';});sContent=sContent.replace(regex_class,'<$1$2>');sContent=sContent.replace(regex_handler,'<$1$2>');sContent=sContent.replace(regex_id,'<$1$2>');sContent=sContent.replace(regex_script,'');regex=/<(\/)?([:\w\/-]+)(.*?)>/ig;sContent=sContent.replace(regex,function(m0,m1,m2,m3){var m3s=[];var state='';m1=m1||'';m2=m2.toLowerCase();m3=$.trim(m3||'');if(!m1){if($.inArray(m2,lonely_tags)>=0){var len=m3.length;if(m2=='br')m3='';if(!m3||m3.substring(len-1,len)!='/')m3+=' /';return'<'+m2+' '+m3+'>';} +if(replace_tags[m2]){stack.push({tag:m2,state:'deleted'});m2=replace_tags[m2];state='inserted';}else if(m2=='font'){stack.push({tag:m2,state:'deleted'});m2='span';m3s=[];if(regex_font_color.test(m3))m3s.push('color:'+(RegExp.$1||RegExp.$2||RegExp.$3)+';');if(regex_font_face.test(m3))m3s.push('font-family:'+(RegExp.$1||RegExp.$2||RegExp.$3)+';');m3=m3s.length?'style="'+m3s.join('')+'"':'';state='inserted';}else if(m2=='center'){stack.push({tag:m2,state:'deleted'});m2='div' +m3='style="text-align:center"';state='inserted';}else if(m2=='span'){var style='';if(!m3){stack.push({tag:m3,state:'deleted'});return'';} +if(regex_style.test(m3)){var tmpstack=[];var tmptag='';style=RegExp.$1||RegExp.$2||RegExp.$3;m3=m3.replace(regex_style,'');if(regex_font_weight.test(style)){if(RegExp.$1=='bold'||RegExp.$1=='bolder'){style=style.replace(regex_font_weight,'');tmpstack.push({tag:'strong',state:'inserted'});tmptag+='';}} +if(regex_font_style.test(style)){style=style.replace(regex_font_style,'');tmpstack.push({tag:'em',state:'inserted'});tmptag+='';} +if(regex_font_decoration.test(style)){var deco_css=' '+RegExp.$1.toLowerCase()+' ';if(deco_css.indexOf('underline ')>0){deco_css=deco_css.replace('underline ','');tmpstack.push({tag:'u',state:'inserted'});tmptag+='';} +if(deco_css.indexOf('line-through ')>0){deco_css=deco_css.replace('line-through ','');tmpstack.push({tag:'del',state:'inserted'});tmptag+='';} +deco_css=$.trim(deco_css);style=style.replace(regex_font_decoration,(deco_css?'text-decoration:'+deco_css+';':''));} +style=$.trim(style);stack.push({tag:m2,state:(!m3&&!style?'deleted':'')});stack=stack.concat(tmpstack);return(!m3&&!style?'':'')+tmptag;}}else{state=(jQuery.inArray(m2,allow_tags)<0)?'deleted':'';if(state=='deleted')return'';} +stack.push({tag:m2,state:state});}else{var tags=[],t='';if(!stack.length)return'';do{t=stack.pop();if(t.state!='inserted'&&t.tag!=m2){stack.push(t);return tags.join('');} +if(t.state!='deleted')tags.push('');}while(stack.length&&t.tag!=m2);return tags.join('');} +return'<'+m1+m2+(m3?' '+m3:'')+'>';});if(stack.length){var t='';do{t=stack.pop();if(t.state!='deleted')sContent+='';}while(stack.length);} +return sContent;},IR_TO:function(sContent){return sContent;}});})(jQuery);xe.XE_Extension=jQuery.Class({name:"XE_Extension",seq:'',$init:function(elAppContainer,editor_sequence){this.seq=editor_sequence;this._assignHTMLObjects(elAppContainer);},_assignHTMLObjects:function(elAppContainer){this.elDropdownLayer=jQuery('DIV.xpress_xeditor_extension_layer',elAppContainer).get(0);},_removeAttrs:function(sContent){sContent=sContent.replace(/]*?) xe_handled\s*=\s*".+?"([^>]*?)>/i,'');return sContent;},_addEvent:function(){if(this.oApp.getEditingMode()!='WYSIWYG')return;var doc=this.oApp.getWYSIWYGDocument();var seq=this.seq;var fn=function(){var img=jQuery(this);var comp=img.attr('editor_component');if(comp&&jQuery.isFunction(openComponent)){editorPrevNode=img.get(0);openComponent(comp,seq);}};jQuery('img[editor_component]',doc).each(function(){var img=jQuery(this);if(!img.attr('xe_handled')){img.attr('xe_handled','yes').dblclick(fn);}});},$ON_MSG_APP_READY:function(){this.oApp.exec('REGISTER_UI_EVENT',['extension','click','TOGGLE_EXTENSION_LAYER']);this.oApp.addConverter("WYSIWYG_TO_IR",this._removeAttrs);},$ON_TOGGLE_EXTENSION_LAYER:function(){this.oApp.exec('TOGGLE_TOOLBAR_ACTIVE_LAYER',[this.elDropdownLayer]);},$ON_CHANGE_EDITING_MODE:function(mode){this._addEvent();},$ON_PASTE_HTML:function(){this._addEvent();},$ON_LOAD_IR_FIELD:function(){this._addEvent();},$ON_SET_IR:function(){this._addEvent();}});xe.XE_AutoSave=jQuery.Class({name:"XE_AutoSave",form:null,textarea:null,$init:function(oIRTextarea,elAppContainer){this.form=oIRTextarea.form;this.textarea=oIRTextarea;this._assignHTMLObjects(elAppContainer);},_assignHTMLObjects:function(elAppContainer){this.welMessageBox=jQuery('autosave_message');},$ON_MSG_APP_READY:function(){var elTitle=jQuery(this.form._saved_doc_title);var elContent=jQuery(this.form._saved_doc_content);var title=jQuery.trim(elTitle.val());var content=jQuery.trim(elContent.val());if(title||content){if(confirm(this.form._saved_doc_message.value)){jQuery(this.form.title).val(title);this.oApp.setIR(content);}else{editorRemoveSavedDoc();}} +editorEnableAutoSave(this.form,jQuery(this.form).attr("editor_sequence"));this.oApp.exec('REGISTER_HOTKEY',['ctrl+shift+s','AUTO_SAVE']);},$ON_AUTO_SAVE:function(){_editorAutoSave();}});xe.XE_FormatWithSelectUI=jQuery.Class({name:"XE_FormatWithSelectUI",$init:function(elAppContainer){this._assignHTMLObjects(elAppContainer);},_assignHTMLObjects:function(elAppContainer){this.elFormatSelect=jQuery("SELECT.xpress_xeditor_ui_format_select",elAppContainer).get(0);},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.elFormatSelect,"change","SET_FORMAT_FROM_SELECT_UI");this.elFormatSelect.selectedIndex=0;},$ON_MSG_STYLE_CHANGED:function(sAttributeName,sAttributeValue){var blockName=this.oApp.getWYSIWYGDocument().queryCommandValue("FormatBlock");this.elFormatSelect.value=blockName.toLowerCase();if(this.elFormatSelect.selectedIndex<0)this.elFormatSelect.selectedIndex=0;},$ON_SET_FORMAT_FROM_SELECT_UI:function(){var sFormat=this.elFormatSelect.value;if(!sFormat)return;this.oApp.exec("EXECCOMMAND",["FormatBlock",false,sFormat]);this.oApp.exec("CHECK_STYLE_CHANGE",[]);}}); \ No newline at end of file diff --git a/modules/editor/skins/xpresseditor/js/xe_interface.js b/modules/editor/skins/xpresseditor/js/xe_interface.js new file mode 100644 index 000000000..684b6a3ae --- /dev/null +++ b/modules/editor/skins/xpresseditor/js/xe_interface.js @@ -0,0 +1,155 @@ +if (!window.xe) xe = {}; + +xe.Editors = []; + +function editorStart_xe(editor_sequence, primary_key, content_key, editor_height) { + + var textarea = jQuery("#xpress-editor-"+editor_sequence); + var iframe = jQuery('