From bbaef3d8104c3dad4edd9ed48fc024a0cc8231b1 Mon Sep 17 00:00:00 2001 From: Yoshihiro OKUMURA Date: Mon, 17 Jun 2019 15:39:52 +0900 Subject: [PATCH] add latst sources of cbsn platform archive. --- .gitignore | 8 + etc/common.inc.php | 87 + etc/config.inc.php | 3 + etc/dumpForum.php | 131 ++ etc/dumpXooNIps.php | 1118 +++++++++++++ package.json | 29 +- public/.htaccess | 8 + public/favicon.ico | Bin 3870 -> 1406 bytes public/index.html | 29 +- public/manifest.json | 6 +- src/App.css | 301 +++- src/App.tsx | 36 +- src/common/About.module.css | 13 + src/common/About.tsx | 28 + src/common/AppRoot.tsx | 79 + src/common/CenterColumn.module.css | 94 ++ src/common/CenterColumn.tsx | 85 + src/common/Container.module.css | 25 + src/common/Container.tsx | 26 + src/common/Footer.module.css | 12 + src/common/Footer.tsx | 59 + src/common/Header.module.css | 64 + src/common/Header.tsx | 52 + src/common/LeftColumn.module.css | 28 + src/common/LeftColumn.tsx | 46 + src/common/MainContent.module.css | 9 + src/common/MainContent.tsx | 27 + src/common/XoopsPathRedirect.tsx | 184 +++ src/common/assets/images/mlang_english.gif | Bin 0 -> 175 bytes src/common/assets/images/mlang_japanese.gif | Bin 0 -> 126 bytes src/common/assets/images/no_avatar.gif | Bin 0 -> 985 bytes src/common/assets/images/pagact.gif | Bin 0 -> 121 bytes src/common/assets/images/paginact.gif | Bin 0 -> 121 bytes src/common/assets/images/pagneutral.gif | Bin 0 -> 121 bytes .../assets/images/rank3dbf8e94a6f72.gif | Bin 0 -> 905 bytes .../assets/images/rank3dbf8e9e7d88d.gif | Bin 0 -> 1276 bytes .../assets/images/rank3dbf8ea81e642.gif | Bin 0 -> 894 bytes .../assets/images/rank3dbf8eb1a72e7.gif | Bin 0 -> 856 bytes .../assets/images/rank3dbf8edf15093.gif | Bin 0 -> 789 bytes .../assets/images/rank3dbf8ee8681cd.gif | Bin 0 -> 779 bytes .../assets/images/rank3e632f95e81ca.gif | Bin 0 -> 475 bytes .../assets/images/smil3dbd4bf386b36.gif | Bin 0 -> 210 bytes .../assets/images/smil3dbd4d4e4c4f2.gif | Bin 0 -> 204 bytes .../assets/images/smil3dbd4d6422f04.gif | Bin 0 -> 174 bytes .../assets/images/smil3dbd4d75edb5e.gif | Bin 0 -> 204 bytes .../assets/images/smil3dbd4d8676346.gif | Bin 0 -> 176 bytes .../assets/images/smil3dbd4d99c6eaa.gif | Bin 0 -> 207 bytes .../assets/images/smil3dbd4daabd491.gif | Bin 0 -> 170 bytes .../assets/images/smil3dbd4dbc14f3f.gif | Bin 0 -> 210 bytes .../assets/images/smil3dbd4dcd7b9f4.gif | Bin 0 -> 278 bytes .../assets/images/smil3dbd4ddd6835f.gif | Bin 0 -> 202 bytes .../assets/images/smil3dbd4df1944ee.gif | Bin 0 -> 678 bytes .../assets/images/smil3dbd4e02c5440.gif | Bin 0 -> 263 bytes .../assets/images/smil3dbd4e1748cc9.gif | Bin 0 -> 209 bytes .../assets/images/smil3dbd4e29bbcc7.gif | Bin 0 -> 492 bytes .../assets/images/smil3dbd4e398ff7b.gif | Bin 0 -> 205 bytes .../assets/images/smil3dbd4e4c2e742.gif | Bin 0 -> 4959 bytes .../assets/images/smil3dbd4e5e7563a.gif | Bin 0 -> 736 bytes .../assets/images/smil3dbd4e7853679.gif | Bin 0 -> 273 bytes .../assets/images/theme/banner_cbsn.gif | Bin 0 -> 3084 bytes src/common/assets/images/theme/banner_ibr.gif | Bin 0 -> 1932 bytes .../images/theme/banner_incf-japan-node.gif | Bin 0 -> 4323 bytes .../assets/images/theme/banner_riken-cbs.gif | Bin 0 -> 2731 bytes .../assets/images/theme/banner_riken.gif | Bin 0 -> 1540 bytes .../assets/images/theme/banner_xoonips.gif | Bin 0 -> 2026 bytes .../assets/images/theme/header_back.gif | Bin 0 -> 105 bytes .../assets/images/theme/header_left.gif | Bin 0 -> 300 bytes .../assets/images/theme/header_right.jpg | Bin 0 -> 16206 bytes src/common/assets/images/theme/icon_home.gif | Bin 0 -> 273 bytes .../assets/images/theme/icon_home_h.gif | Bin 0 -> 1292 bytes .../assets/images/theme/icon_inquiry.gif | Bin 0 -> 272 bytes .../assets/images/theme/icon_inquiry_h.gif | Bin 0 -> 1270 bytes src/common/assets/images/theme/logo.png | Bin 0 -> 9104 bytes .../assets/images/theme/menu_indent.gif | Bin 0 -> 1025 bytes .../assets/images/theme/menu_indent_h.gif | Bin 0 -> 5260 bytes .../assets/images/theme/title_indent.gif | Bin 0 -> 1217 bytes .../assets/images/theme/title_indent2.gif | Bin 0 -> 1176 bytes .../assets/images/theme/title_indent3.gif | Bin 0 -> 1185 bytes .../assets/images/theme/xoops_quote.jpg | Bin 0 -> 5550 bytes src/common/assets/main-menu.json | 14 + src/common/assets/xoops.css | 17 + src/common/blocks/Announce.tsx | 29 + src/common/blocks/MainMenu.module.css | 27 + src/common/blocks/MainMenu.tsx | 25 + src/common/lib/LangFlag.tsx | 37 + src/common/lib/LinkImage.tsx | 48 + src/common/lib/Loading.module.css | 6 + src/common/lib/Loading.tsx | 13 + src/common/lib/PageNotFound.module.css | 0 src/common/lib/PageNotFound.tsx | 48 + src/common/lib/UserRankStarImage.tsx | 45 + src/common/lib/XoopsCode.tsx | 85 + src/config.ts | 13 + src/database/Database.module.css | 52 + src/database/Database.tsx | 44 + src/database/DatabaseAdvancedSearch.tsx | 49 + src/database/DatabaseDetailItem.tsx | 89 + .../DatabaseSearchByAdvancedKeyword.tsx | 56 + src/database/DatabaseSearchByIndexId.tsx | 88 + src/database/DatabaseSearchByItemType.tsx | 73 + src/database/DatabaseSearchByKeyword.tsx | 60 + src/database/DatabaseTop.module.css | 13 + src/database/DatabaseTop.tsx | 34 + src/database/assets/images/icon_binder.gif | Bin 0 -> 369 bytes src/database/assets/images/icon_book.gif | Bin 0 -> 375 bytes .../assets/images/icon_conference.gif | Bin 0 -> 427 bytes src/database/assets/images/icon_data.gif | Bin 0 -> 402 bytes src/database/assets/images/icon_files.gif | Bin 0 -> 433 bytes src/database/assets/images/icon_folder.gif | Bin 0 -> 1508 bytes src/database/assets/images/icon_memo.gif | Bin 0 -> 166 bytes src/database/assets/images/icon_model.gif | Bin 0 -> 409 bytes src/database/assets/images/icon_paper.gif | Bin 0 -> 479 bytes .../assets/images/icon_presentation.gif | Bin 0 -> 423 bytes src/database/assets/images/icon_simulator.gif | Bin 0 -> 562 bytes src/database/assets/images/icon_stimulus.gif | Bin 0 -> 302 bytes src/database/assets/images/icon_tool.gif | Bin 0 -> 399 bytes src/database/assets/images/icon_url.gif | Bin 0 -> 574 bytes src/database/assets/images/star.gif | Bin 0 -> 538 bytes .../assets/images/tree_folder_end_close.gif | Bin 0 -> 1039 bytes .../assets/images/tree_folder_end_normal.gif | Bin 0 -> 619 bytes .../assets/images/tree_folder_end_open.gif | Bin 0 -> 619 bytes .../images/tree_folder_middle_close.gif | Bin 0 -> 1044 bytes .../images/tree_folder_middle_normal.gif | Bin 0 -> 627 bytes .../assets/images/tree_folder_middle_open.gif | Bin 0 -> 625 bytes .../assets/images/tree_line_empty.gif | Bin 0 -> 53 bytes .../assets/images/tree_line_normal.gif | Bin 0 -> 64 bytes .../assets/images/tree_root_close.gif | Bin 0 -> 594 bytes .../assets/images/tree_root_normal.gif | Bin 0 -> 581 bytes src/database/assets/images/tree_root_open.gif | Bin 0 -> 586 bytes src/database/blocks/IndexTree.module.css | 78 + src/database/blocks/IndexTree.tsx | 104 ++ src/database/blocks/Rankings.module.css | 28 + src/database/blocks/Rankings.tsx | 97 ++ src/database/blocks/RecentContents.module.css | 28 + src/database/blocks/RecentContents.tsx | 39 + src/database/blocks/Search.module.css | 7 + src/database/blocks/Search.tsx | 95 ++ .../item-type/book/BookAdvancedSearch.tsx | 38 + src/database/item-type/book/BookDetail.tsx | 40 + src/database/item-type/book/BookList.tsx | 31 + src/database/item-type/book/BookTop.tsx | 15 + src/database/item-type/book/index.tsx | 13 + .../conference/ConferenceAdvancedSearch.tsx | 57 + .../item-type/conference/ConferenceDetail.tsx | 36 + .../item-type/conference/ConferenceList.tsx | 33 + .../item-type/conference/ConferenceTop.tsx | 17 + .../item-type/conference/ConferenceUtil.tsx | 37 + src/database/item-type/conference/index.tsx | 13 + .../item-type/data/DataAdvancedSearch.tsx | 46 + src/database/item-type/data/DataDetail.tsx | 37 + src/database/item-type/data/DataList.tsx | 31 + src/database/item-type/data/DataTop.tsx | 17 + src/database/item-type/data/DataUtil.tsx | 23 + src/database/item-type/data/index.tsx | 13 + .../item-type/files/FilesAdvancedSearch.tsx | 30 + src/database/item-type/files/FilesDetail.tsx | 33 + src/database/item-type/files/FilesList.tsx | 30 + src/database/item-type/files/FilesTop.tsx | 17 + src/database/item-type/files/FilesUtil.tsx | 5 + src/database/item-type/files/index.tsx | 13 + src/database/item-type/index.tsx | 161 ++ .../item-type/lib/AdvancedSearchBase.tsx | 191 +++ src/database/item-type/lib/DetailBase.tsx | 43 + src/database/item-type/lib/ListBase.tsx | 45 + src/database/item-type/lib/TopBase.tsx | 47 + src/database/item-type/lib/field/Author.tsx | 21 + .../item-type/lib/field/ChangeLog.tsx | 28 + .../item-type/lib/field/Contributer.tsx | 18 + .../item-type/lib/field/CreativeCommons.tsx | 56 + src/database/item-type/lib/field/DateTime.tsx | 21 + .../item-type/lib/field/Description.tsx | 18 + .../lib/field/FileDownloadButton.module.css | 21 + .../lib/field/FileDownloadButton.tsx | 55 + src/database/item-type/lib/field/FileSize.tsx | 17 + .../item-type/lib/field/FreeKeyword.tsx | 18 + src/database/item-type/lib/field/ItemFile.tsx | 50 + .../item-type/lib/field/ItemIndex.tsx | 26 + src/database/item-type/lib/field/Language.tsx | 35 + .../field/LicenseAgreementDialog.module.css | 38 + .../lib/field/LicenseAgreementDialog.tsx | 115 ++ .../item-type/lib/field/Preview.module.css | 23 + src/database/item-type/lib/field/Preview.tsx | 84 + .../item-type/lib/field/PublicationDate.tsx | 19 + src/database/item-type/lib/field/Readme.tsx | 15 + .../item-type/lib/field/RelatedTo.tsx | 65 + src/database/item-type/lib/field/Rights.tsx | 23 + src/database/item-type/lib/field/index.tsx | 39 + .../item-type/model/ModelAdvancedSearch.tsx | 35 + src/database/item-type/model/ModelDetail.tsx | 36 + src/database/item-type/model/ModelList.tsx | 31 + src/database/item-type/model/ModelTop.tsx | 17 + src/database/item-type/model/ModelUtil.tsx | 23 + src/database/item-type/model/index.tsx | 13 + .../item-type/paper/PaperAdvancedSearch.tsx | 39 + src/database/item-type/paper/PaperDetail.tsx | 39 + src/database/item-type/paper/PaperList.tsx | 38 + src/database/item-type/paper/PaperTop.tsx | 15 + src/database/item-type/paper/PaperUtil.tsx | 22 + src/database/item-type/paper/index.tsx | 13 + .../PresentationAdvancedSearch.tsx | 48 + .../presentation/PresentationDetail.tsx | 42 + .../presentation/PresentationList.tsx | 33 + .../presentation/PresentationTop.tsx | 17 + .../presentation/PresentationUtil.tsx | 23 + src/database/item-type/presentation/index.tsx | 13 + .../simulator/SimulatorAdvancedSearch.tsx | 44 + .../item-type/simulator/SimulatorDetail.tsx | 37 + .../item-type/simulator/SimulatorList.tsx | 31 + .../item-type/simulator/SimulatorTop.tsx | 17 + .../item-type/simulator/SimulatorUtil.tsx | 23 + src/database/item-type/simulator/index.tsx | 13 + .../stimulus/StimulusAdvancedSearch.tsx | 44 + .../item-type/stimulus/StimulusDetail.tsx | 37 + .../item-type/stimulus/StimulusList.tsx | 31 + .../item-type/stimulus/StimulusTop.tsx | 17 + .../item-type/stimulus/StimulusUtil.tsx | 23 + src/database/item-type/stimulus/index.tsx | 13 + .../item-type/tool/ToolAdvancedSearch.tsx | 46 + src/database/item-type/tool/ToolDetail.tsx | 36 + src/database/item-type/tool/ToolList.tsx | 29 + src/database/item-type/tool/ToolTop.tsx | 17 + src/database/item-type/tool/ToolUtil.tsx | 23 + src/database/item-type/tool/index.tsx | 13 + .../item-type/url/UrlAdvancedSearch.tsx | 28 + src/database/item-type/url/UrlDetail.tsx | 32 + src/database/item-type/url/UrlList.tsx | 28 + src/database/item-type/url/UrlTop.tsx | 15 + src/database/item-type/url/UrlUtil.tsx | 29 + src/database/item-type/url/index.tsx | 13 + src/database/lib/AdvancedSearchQuery.ts | 95 ++ src/database/lib/DatabaseListIndex.tsx | 58 + src/database/lib/DatabaseListItem.module.css | 11 + src/database/lib/DatabaseListItem.tsx | 244 +++ src/database/lib/IndexUtil.ts | 95 ++ src/database/lib/ItemUtil.ts | 675 ++++++++ src/forum/Forum.tsx | 38 + src/forum/ForumCategory.tsx | 169 ++ src/forum/ForumForum.tsx | 126 ++ src/forum/ForumPost.tsx | 79 + src/forum/ForumTop.tsx | 157 ++ src/forum/ForumTopic.tsx | 120 ++ src/forum/assets/d3forum_common.css | 31 + src/forum/assets/d3forum_main.css | 504 ++++++ src/forum/assets/images/category_0.gif | Bin 0 -> 1393 bytes src/forum/assets/images/category_1.gif | Bin 0 -> 1322 bytes src/forum/assets/images/forum_0.gif | Bin 0 -> 1079 bytes src/forum/assets/images/forum_1.gif | Bin 0 -> 1010 bytes src/forum/assets/images/posticon0.gif | Bin 0 -> 189 bytes src/forum/assets/images/posticon1.gif | Bin 0 -> 189 bytes src/forum/assets/images/posticon2.gif | Bin 0 -> 190 bytes src/forum/assets/images/posticon3.gif | Bin 0 -> 190 bytes src/forum/assets/images/posticon4.gif | Bin 0 -> 130 bytes src/forum/assets/images/posticon5.gif | Bin 0 -> 127 bytes src/forum/assets/images/posticon6.gif | Bin 0 -> 97 bytes src/forum/assets/images/posticon7.gif | Bin 0 -> 137 bytes src/forum/assets/images/topic_01.gif | Bin 0 -> 906 bytes src/forum/assets/images/topic_10.gif | Bin 0 -> 878 bytes src/forum/assets/images/topic_11.gif | Bin 0 -> 881 bytes src/forum/assets/images/topic_invisible.gif | Bin 0 -> 643 bytes .../assets/images/topic_status_locked1.gif | Bin 0 -> 544 bytes .../assets/images/topic_status_marked1.gif | Bin 0 -> 523 bytes .../assets/images/topic_status_solved0.gif | Bin 0 -> 540 bytes src/forum/assets/images/topic_sticky0.gif | Bin 0 -> 1476 bytes src/forum/lib/CategoryJump.tsx | 44 + src/forum/lib/ForumJump.tsx | 44 + src/forum/lib/ForumUtils.ts | 326 ++++ src/forum/lib/Post.tsx | 96 ++ src/forum/lib/PostIcon.tsx | 32 + src/forum/lib/PostsTree.tsx | 48 + src/functions.ts | 108 ++ src/index.css | 14 +- src/index.tsx | 11 +- src/logo.svg | 7 - yarn.lock | 1445 ++++++++++++----- 274 files changed, 11130 insertions(+), 528 deletions(-) create mode 100644 etc/common.inc.php create mode 100644 etc/config.inc.php create mode 100644 etc/dumpForum.php create mode 100644 etc/dumpXooNIps.php create mode 100644 public/.htaccess create mode 100644 src/common/About.module.css create mode 100644 src/common/About.tsx create mode 100644 src/common/AppRoot.tsx create mode 100644 src/common/CenterColumn.module.css create mode 100644 src/common/CenterColumn.tsx create mode 100644 src/common/Container.module.css create mode 100644 src/common/Container.tsx create mode 100644 src/common/Footer.module.css create mode 100644 src/common/Footer.tsx create mode 100644 src/common/Header.module.css create mode 100644 src/common/Header.tsx create mode 100644 src/common/LeftColumn.module.css create mode 100644 src/common/LeftColumn.tsx create mode 100644 src/common/MainContent.module.css create mode 100644 src/common/MainContent.tsx create mode 100644 src/common/XoopsPathRedirect.tsx create mode 100644 src/common/assets/images/mlang_english.gif create mode 100644 src/common/assets/images/mlang_japanese.gif create mode 100644 src/common/assets/images/no_avatar.gif create mode 100644 src/common/assets/images/pagact.gif create mode 100644 src/common/assets/images/paginact.gif create mode 100644 src/common/assets/images/pagneutral.gif create mode 100644 src/common/assets/images/rank3dbf8e94a6f72.gif create mode 100644 src/common/assets/images/rank3dbf8e9e7d88d.gif create mode 100644 src/common/assets/images/rank3dbf8ea81e642.gif create mode 100644 src/common/assets/images/rank3dbf8eb1a72e7.gif create mode 100644 src/common/assets/images/rank3dbf8edf15093.gif create mode 100644 src/common/assets/images/rank3dbf8ee8681cd.gif create mode 100644 src/common/assets/images/rank3e632f95e81ca.gif create mode 100644 src/common/assets/images/smil3dbd4bf386b36.gif create mode 100644 src/common/assets/images/smil3dbd4d4e4c4f2.gif create mode 100644 src/common/assets/images/smil3dbd4d6422f04.gif create mode 100644 src/common/assets/images/smil3dbd4d75edb5e.gif create mode 100644 src/common/assets/images/smil3dbd4d8676346.gif create mode 100644 src/common/assets/images/smil3dbd4d99c6eaa.gif create mode 100644 src/common/assets/images/smil3dbd4daabd491.gif create mode 100644 src/common/assets/images/smil3dbd4dbc14f3f.gif create mode 100644 src/common/assets/images/smil3dbd4dcd7b9f4.gif create mode 100644 src/common/assets/images/smil3dbd4ddd6835f.gif create mode 100644 src/common/assets/images/smil3dbd4df1944ee.gif create mode 100644 src/common/assets/images/smil3dbd4e02c5440.gif create mode 100644 src/common/assets/images/smil3dbd4e1748cc9.gif create mode 100644 src/common/assets/images/smil3dbd4e29bbcc7.gif create mode 100644 src/common/assets/images/smil3dbd4e398ff7b.gif create mode 100644 src/common/assets/images/smil3dbd4e4c2e742.gif create mode 100644 src/common/assets/images/smil3dbd4e5e7563a.gif create mode 100644 src/common/assets/images/smil3dbd4e7853679.gif create mode 100644 src/common/assets/images/theme/banner_cbsn.gif create mode 100644 src/common/assets/images/theme/banner_ibr.gif create mode 100644 src/common/assets/images/theme/banner_incf-japan-node.gif create mode 100644 src/common/assets/images/theme/banner_riken-cbs.gif create mode 100644 src/common/assets/images/theme/banner_riken.gif create mode 100644 src/common/assets/images/theme/banner_xoonips.gif create mode 100644 src/common/assets/images/theme/header_back.gif create mode 100644 src/common/assets/images/theme/header_left.gif create mode 100644 src/common/assets/images/theme/header_right.jpg create mode 100644 src/common/assets/images/theme/icon_home.gif create mode 100644 src/common/assets/images/theme/icon_home_h.gif create mode 100644 src/common/assets/images/theme/icon_inquiry.gif create mode 100644 src/common/assets/images/theme/icon_inquiry_h.gif create mode 100644 src/common/assets/images/theme/logo.png create mode 100644 src/common/assets/images/theme/menu_indent.gif create mode 100644 src/common/assets/images/theme/menu_indent_h.gif create mode 100644 src/common/assets/images/theme/title_indent.gif create mode 100644 src/common/assets/images/theme/title_indent2.gif create mode 100644 src/common/assets/images/theme/title_indent3.gif create mode 100644 src/common/assets/images/theme/xoops_quote.jpg create mode 100644 src/common/assets/main-menu.json create mode 100644 src/common/assets/xoops.css create mode 100644 src/common/blocks/Announce.tsx create mode 100644 src/common/blocks/MainMenu.module.css create mode 100644 src/common/blocks/MainMenu.tsx create mode 100644 src/common/lib/LangFlag.tsx create mode 100644 src/common/lib/LinkImage.tsx create mode 100644 src/common/lib/Loading.module.css create mode 100644 src/common/lib/Loading.tsx create mode 100644 src/common/lib/PageNotFound.module.css create mode 100644 src/common/lib/PageNotFound.tsx create mode 100644 src/common/lib/UserRankStarImage.tsx create mode 100644 src/common/lib/XoopsCode.tsx create mode 100644 src/config.ts create mode 100644 src/database/Database.module.css create mode 100644 src/database/Database.tsx create mode 100644 src/database/DatabaseAdvancedSearch.tsx create mode 100644 src/database/DatabaseDetailItem.tsx create mode 100644 src/database/DatabaseSearchByAdvancedKeyword.tsx create mode 100644 src/database/DatabaseSearchByIndexId.tsx create mode 100644 src/database/DatabaseSearchByItemType.tsx create mode 100644 src/database/DatabaseSearchByKeyword.tsx create mode 100644 src/database/DatabaseTop.module.css create mode 100644 src/database/DatabaseTop.tsx create mode 100644 src/database/assets/images/icon_binder.gif create mode 100644 src/database/assets/images/icon_book.gif create mode 100644 src/database/assets/images/icon_conference.gif create mode 100644 src/database/assets/images/icon_data.gif create mode 100644 src/database/assets/images/icon_files.gif create mode 100644 src/database/assets/images/icon_folder.gif create mode 100644 src/database/assets/images/icon_memo.gif create mode 100644 src/database/assets/images/icon_model.gif create mode 100644 src/database/assets/images/icon_paper.gif create mode 100644 src/database/assets/images/icon_presentation.gif create mode 100644 src/database/assets/images/icon_simulator.gif create mode 100644 src/database/assets/images/icon_stimulus.gif create mode 100644 src/database/assets/images/icon_tool.gif create mode 100644 src/database/assets/images/icon_url.gif create mode 100644 src/database/assets/images/star.gif create mode 100644 src/database/assets/images/tree_folder_end_close.gif create mode 100644 src/database/assets/images/tree_folder_end_normal.gif create mode 100644 src/database/assets/images/tree_folder_end_open.gif create mode 100644 src/database/assets/images/tree_folder_middle_close.gif create mode 100644 src/database/assets/images/tree_folder_middle_normal.gif create mode 100644 src/database/assets/images/tree_folder_middle_open.gif create mode 100644 src/database/assets/images/tree_line_empty.gif create mode 100644 src/database/assets/images/tree_line_normal.gif create mode 100644 src/database/assets/images/tree_root_close.gif create mode 100644 src/database/assets/images/tree_root_normal.gif create mode 100644 src/database/assets/images/tree_root_open.gif create mode 100644 src/database/blocks/IndexTree.module.css create mode 100644 src/database/blocks/IndexTree.tsx create mode 100644 src/database/blocks/Rankings.module.css create mode 100644 src/database/blocks/Rankings.tsx create mode 100644 src/database/blocks/RecentContents.module.css create mode 100644 src/database/blocks/RecentContents.tsx create mode 100644 src/database/blocks/Search.module.css create mode 100644 src/database/blocks/Search.tsx create mode 100644 src/database/item-type/book/BookAdvancedSearch.tsx create mode 100644 src/database/item-type/book/BookDetail.tsx create mode 100644 src/database/item-type/book/BookList.tsx create mode 100644 src/database/item-type/book/BookTop.tsx create mode 100644 src/database/item-type/book/index.tsx create mode 100644 src/database/item-type/conference/ConferenceAdvancedSearch.tsx create mode 100644 src/database/item-type/conference/ConferenceDetail.tsx create mode 100644 src/database/item-type/conference/ConferenceList.tsx create mode 100644 src/database/item-type/conference/ConferenceTop.tsx create mode 100644 src/database/item-type/conference/ConferenceUtil.tsx create mode 100644 src/database/item-type/conference/index.tsx create mode 100644 src/database/item-type/data/DataAdvancedSearch.tsx create mode 100644 src/database/item-type/data/DataDetail.tsx create mode 100644 src/database/item-type/data/DataList.tsx create mode 100644 src/database/item-type/data/DataTop.tsx create mode 100644 src/database/item-type/data/DataUtil.tsx create mode 100644 src/database/item-type/data/index.tsx create mode 100644 src/database/item-type/files/FilesAdvancedSearch.tsx create mode 100644 src/database/item-type/files/FilesDetail.tsx create mode 100644 src/database/item-type/files/FilesList.tsx create mode 100644 src/database/item-type/files/FilesTop.tsx create mode 100644 src/database/item-type/files/FilesUtil.tsx create mode 100644 src/database/item-type/files/index.tsx create mode 100644 src/database/item-type/index.tsx create mode 100644 src/database/item-type/lib/AdvancedSearchBase.tsx create mode 100644 src/database/item-type/lib/DetailBase.tsx create mode 100644 src/database/item-type/lib/ListBase.tsx create mode 100644 src/database/item-type/lib/TopBase.tsx create mode 100644 src/database/item-type/lib/field/Author.tsx create mode 100644 src/database/item-type/lib/field/ChangeLog.tsx create mode 100644 src/database/item-type/lib/field/Contributer.tsx create mode 100644 src/database/item-type/lib/field/CreativeCommons.tsx create mode 100644 src/database/item-type/lib/field/DateTime.tsx create mode 100644 src/database/item-type/lib/field/Description.tsx create mode 100644 src/database/item-type/lib/field/FileDownloadButton.module.css create mode 100644 src/database/item-type/lib/field/FileDownloadButton.tsx create mode 100644 src/database/item-type/lib/field/FileSize.tsx create mode 100644 src/database/item-type/lib/field/FreeKeyword.tsx create mode 100644 src/database/item-type/lib/field/ItemFile.tsx create mode 100644 src/database/item-type/lib/field/ItemIndex.tsx create mode 100644 src/database/item-type/lib/field/Language.tsx create mode 100644 src/database/item-type/lib/field/LicenseAgreementDialog.module.css create mode 100644 src/database/item-type/lib/field/LicenseAgreementDialog.tsx create mode 100644 src/database/item-type/lib/field/Preview.module.css create mode 100644 src/database/item-type/lib/field/Preview.tsx create mode 100644 src/database/item-type/lib/field/PublicationDate.tsx create mode 100644 src/database/item-type/lib/field/Readme.tsx create mode 100644 src/database/item-type/lib/field/RelatedTo.tsx create mode 100644 src/database/item-type/lib/field/Rights.tsx create mode 100644 src/database/item-type/lib/field/index.tsx create mode 100644 src/database/item-type/model/ModelAdvancedSearch.tsx create mode 100644 src/database/item-type/model/ModelDetail.tsx create mode 100644 src/database/item-type/model/ModelList.tsx create mode 100644 src/database/item-type/model/ModelTop.tsx create mode 100644 src/database/item-type/model/ModelUtil.tsx create mode 100644 src/database/item-type/model/index.tsx create mode 100644 src/database/item-type/paper/PaperAdvancedSearch.tsx create mode 100644 src/database/item-type/paper/PaperDetail.tsx create mode 100644 src/database/item-type/paper/PaperList.tsx create mode 100644 src/database/item-type/paper/PaperTop.tsx create mode 100644 src/database/item-type/paper/PaperUtil.tsx create mode 100644 src/database/item-type/paper/index.tsx create mode 100644 src/database/item-type/presentation/PresentationAdvancedSearch.tsx create mode 100644 src/database/item-type/presentation/PresentationDetail.tsx create mode 100644 src/database/item-type/presentation/PresentationList.tsx create mode 100644 src/database/item-type/presentation/PresentationTop.tsx create mode 100644 src/database/item-type/presentation/PresentationUtil.tsx create mode 100644 src/database/item-type/presentation/index.tsx create mode 100644 src/database/item-type/simulator/SimulatorAdvancedSearch.tsx create mode 100644 src/database/item-type/simulator/SimulatorDetail.tsx create mode 100644 src/database/item-type/simulator/SimulatorList.tsx create mode 100644 src/database/item-type/simulator/SimulatorTop.tsx create mode 100644 src/database/item-type/simulator/SimulatorUtil.tsx create mode 100644 src/database/item-type/simulator/index.tsx create mode 100644 src/database/item-type/stimulus/StimulusAdvancedSearch.tsx create mode 100644 src/database/item-type/stimulus/StimulusDetail.tsx create mode 100644 src/database/item-type/stimulus/StimulusList.tsx create mode 100644 src/database/item-type/stimulus/StimulusTop.tsx create mode 100644 src/database/item-type/stimulus/StimulusUtil.tsx create mode 100644 src/database/item-type/stimulus/index.tsx create mode 100644 src/database/item-type/tool/ToolAdvancedSearch.tsx create mode 100644 src/database/item-type/tool/ToolDetail.tsx create mode 100644 src/database/item-type/tool/ToolList.tsx create mode 100644 src/database/item-type/tool/ToolTop.tsx create mode 100644 src/database/item-type/tool/ToolUtil.tsx create mode 100644 src/database/item-type/tool/index.tsx create mode 100644 src/database/item-type/url/UrlAdvancedSearch.tsx create mode 100644 src/database/item-type/url/UrlDetail.tsx create mode 100644 src/database/item-type/url/UrlList.tsx create mode 100644 src/database/item-type/url/UrlTop.tsx create mode 100644 src/database/item-type/url/UrlUtil.tsx create mode 100644 src/database/item-type/url/index.tsx create mode 100644 src/database/lib/AdvancedSearchQuery.ts create mode 100644 src/database/lib/DatabaseListIndex.tsx create mode 100644 src/database/lib/DatabaseListItem.module.css create mode 100644 src/database/lib/DatabaseListItem.tsx create mode 100644 src/database/lib/IndexUtil.ts create mode 100644 src/database/lib/ItemUtil.ts create mode 100644 src/forum/Forum.tsx create mode 100644 src/forum/ForumCategory.tsx create mode 100644 src/forum/ForumForum.tsx create mode 100644 src/forum/ForumPost.tsx create mode 100644 src/forum/ForumTop.tsx create mode 100644 src/forum/ForumTopic.tsx create mode 100644 src/forum/assets/d3forum_common.css create mode 100644 src/forum/assets/d3forum_main.css create mode 100644 src/forum/assets/images/category_0.gif create mode 100644 src/forum/assets/images/category_1.gif create mode 100644 src/forum/assets/images/forum_0.gif create mode 100644 src/forum/assets/images/forum_1.gif create mode 100644 src/forum/assets/images/posticon0.gif create mode 100644 src/forum/assets/images/posticon1.gif create mode 100644 src/forum/assets/images/posticon2.gif create mode 100644 src/forum/assets/images/posticon3.gif create mode 100644 src/forum/assets/images/posticon4.gif create mode 100644 src/forum/assets/images/posticon5.gif create mode 100644 src/forum/assets/images/posticon6.gif create mode 100644 src/forum/assets/images/posticon7.gif create mode 100644 src/forum/assets/images/topic_01.gif create mode 100644 src/forum/assets/images/topic_10.gif create mode 100644 src/forum/assets/images/topic_11.gif create mode 100644 src/forum/assets/images/topic_invisible.gif create mode 100644 src/forum/assets/images/topic_status_locked1.gif create mode 100644 src/forum/assets/images/topic_status_marked1.gif create mode 100644 src/forum/assets/images/topic_status_solved0.gif create mode 100644 src/forum/assets/images/topic_sticky0.gif create mode 100644 src/forum/lib/CategoryJump.tsx create mode 100644 src/forum/lib/ForumJump.tsx create mode 100644 src/forum/lib/ForumUtils.ts create mode 100644 src/forum/lib/Post.tsx create mode 100644 src/forum/lib/PostIcon.tsx create mode 100644 src/forum/lib/PostsTree.tsx create mode 100644 src/functions.ts delete mode 100644 src/logo.svg diff --git a/.gitignore b/.gitignore index 4d29575..89deecf 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,11 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +# database contents +/public/database/items.json +/public/database/file +/src/database/assets/tree.json +/src/database/assets/rankings.json +/src/database/assets/recent-contents.json +/src/forum/assets/forum.json diff --git a/etc/common.inc.php b/etc/common.inc.php new file mode 100644 index 0000000..9c51453 --- /dev/null +++ b/etc/common.inc.php @@ -0,0 +1,87 @@ + $v) { + $v = $textutil->html_numeric_entities($v); + $v = mb_decode_numericentity($v, array(0x0, 0x10000, 0, 0xfffff), 'UTF-8'); + $data[$k] = \Normalizer::normalize(trim($v), \Normalizer::FORM_C); + } +} + +function myDumpToolConvertToInt(&$data, $keys, $zerofill = false) +{ + foreach ($keys as $key) { + if (isset($data[$key])) { + $data[$key] = '' === $data[$key] ? ($zerofill ? 0 : null) : (int) $data[$key]; + } + } +} + +function myDumpToolDropColumn(&$data, $keys) +{ + foreach ($keys as $key) { + if (isset($data[$key])) { + unset($data[$key]); + } + } +} + diff --git a/etc/config.inc.php b/etc/config.inc.php new file mode 100644 index 0000000..26e7d56 --- /dev/null +++ b/etc/config.inc.php @@ -0,0 +1,3 @@ +prefix(); + +$d3forum = 'forum'; + +$gidGuest = XOOPS_GROUP_ANONYMOUS; + +// get anonymous readable categories +$categories = []; +$sql = <<< SQL +SELECT + `c`.* + FROM `${prefix}_${d3forum}_categories` AS `c` + INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `c`.`cat_id`=`ca`.`cat_id` + WHERE `ca`.`groupid`=${gidGuest} + GROUP BY `c`.`cat_id` + ORDER BY `c`.`cat_order_in_tree` ASC, `c`.`cat_weight` ASC +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, ['cat_id', 'pid', 'cat_topics_count', 'cat_posts_count', 'cat_last_post_id', 'cat_last_post_time', 'cat_topics_count_in_tree', 'cat_posts_count_in_tree', 'cat_last_post_id_in_tree', 'cat_last_post_time_in_tree', 'cat_depth_in_tree', 'cat_order_in_tree', 'cat_weight']); + $row['cat_path_in_tree'] = unserialize($row['cat_path_in_tree']); + $row['cat_options'] = unserialize($row['cat_options']); + $categories[] = $row; +} +$xoopsDB->freeRecordSet($res); +//var_dump($categories); + +// get anonymous readable forums +$forums = []; +$sql = <<< SQL +SELECT + `f`.* + FROM `${prefix}_${d3forum}_forums` AS `f` + INNER JOIN `${prefix}_${d3forum}_forum_access` AS `fa` ON `f`.`forum_id`=`fa`.`forum_id` + INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `f`.`cat_id`=`ca`.`cat_id` + WHERE `fa`.`groupid`=${gidGuest} + AND `ca`.`groupid`=${gidGuest} + GROUP BY `f`.`forum_id` + ORDER BY `f`.`cat_id` ASC, `f`.`forum_weight` ASC +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, ['forum_id', 'cat_id', 'forum_topics_count', 'forum_posts_count', 'forum_last_post_id', 'forum_last_post_time', 'forum_weight'], true); + $row['forum_options'] = unserialize($row['forum_options']); + $forums[] = $row; +} +$xoopsDB->freeRecordSet($res); +//var_dump($forums); + +// get anonymous readable topics +$topics = []; +$sql = <<< SQL +SELECT + `t`.*, + `uf`.`name` AS `topic_first_uid_name`, `uf`.`uname` AS `topic_first_uid_uname`, + `ul`.`name` AS `topic_last_uid_name`, `ul`.`uname` AS `topic_last_uid_uname` + FROM `${prefix}_${d3forum}_topics` AS `t` + INNER JOIN `${prefix}_${d3forum}_forums` AS `f` ON `t`.`forum_id`=`f`.`forum_id` + INNER JOIN `${prefix}_${d3forum}_forum_access` AS `fa` ON `f`.`forum_id`=`fa`.`forum_id` + INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `f`.`cat_id`=`ca`.`cat_id` + LEFT JOIN `${prefix}_users` AS `uf` ON `t`.`topic_first_uid`=`uf`.`uid` + LEFT JOIN `${prefix}_users` AS `ul` ON `t`.`topic_last_uid`=`ul`.`uid` + WHERE `fa`.`groupid`=${gidGuest} + AND `ca`.`groupid`=${gidGuest} + GROUP BY `t`.`topic_id` + ORDER BY `t`.`forum_id` ASC, `t`.`topic_id` ASC +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, ['topic_id', 'forum_id', 'topic_first_uid', 'topic_first_post_id', 'topic_first_post_time', 'topic_last_uid', 'topic_last_post_id', 'topic_last_post_time', 'topic_views', 'topic_posts_count', 'topic_locked', 'topic_sticky', 'topic_solved', 'topic_invisible', 'topic_votes_sum', 'topic_votes_count'], true); + $topics[] = $row; +} +$xoopsDB->freeRecordSet($res); +//var_dump($topics); + +// get anonymous readable posts +$posts = []; +$sql = <<< SQL +SELECT + `p`.*, + `u`.`name` AS `uid_name`, `u`.`uname` AS `uid_uname`, `u`.`rank` AS `uid_rank`, `u`.`posts` AS `uid_posts` + FROM `${prefix}_${d3forum}_posts` AS `p` + INNER JOIN `${prefix}_${d3forum}_topics` AS `t` ON `p`.`topic_id`=`t`.`topic_id` + INNER JOIN `${prefix}_${d3forum}_forums` AS `f` ON `t`.`forum_id`=`f`.`forum_id` + INNER JOIN `${prefix}_${d3forum}_forum_access` AS `fa` ON `f`.`forum_id`=`fa`.`forum_id` + INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `f`.`cat_id`=`ca`.`cat_id` + LEFT JOIN `${prefix}_users` AS `u` ON `p`.`uid`=`u`.`uid` + WHERE `fa`.`groupid`=${gidGuest} + AND `ca`.`groupid`=${gidGuest} + GROUP BY `p`.`post_id` + ORDER BY `t`.`topic_id` ASC, `p`.`post_id` ASC +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, ['post_id', 'pid', 'topic_id', 'post_time', 'modified_time', 'uid', 'uid_hidden', 'html', 'smiley', 'xcode', 'br', 'number_entity', 'special_entity', 'icon', 'attachsig', 'invisible', 'approval', 'votes_sum', 'votes_count', 'depth_in_tree', 'order_in_tree', 'uid_rank', 'uid_posts'], true); + myDumpToolDropColumn($row, ['guest_email', 'guest_url', 'guest_pass_md5', 'guest_trip']); + $posts[] = $row; +} +$xoopsDB->freeRecordSet($res); +//var_dump($posts); +var_dump(count($posts)); + + +$data = [ + 'categories' => $categories, + 'forums' => $forums, + 'topics' => $topics, + 'posts' => $posts, +]; + +file_put_contents(MYDUMPTOOL_OUTPUTDIR.'/forum.json', json_encode($data, JSON_UNESCAPED_UNICODE)); diff --git a/etc/dumpXooNIps.php b/etc/dumpXooNIps.php new file mode 100644 index 0000000..c84befe --- /dev/null +++ b/etc/dumpXooNIps.php @@ -0,0 +1,1118 @@ +prefix(); + +// Recent Contents +$sql = <<< SQL +SELECT + `ib`.`item_id`, `ib`.`doi`, `ib`.`last_update_date`, + GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title` + FROM `${prefix}_xoonips_ranking_new_item` AS `ri` + INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `ri`.`item_id`=`ib`.`item_id` + INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` + INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` + WHERE `iil`.`certify_state`=2 + GROUP BY `ib`.`item_id` + ORDER BY `ib`.`last_update_date` DESC +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +$ranking = []; +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('item_id', 'last_update_date')); + $ranking[] = $row; +} +$xoopsDB->freeRecordSet($res); +file_put_contents(MYDUMPTOOL_OUTPUTDIR.'/recent-contents.json', json_encode($ranking, JSON_UNESCAPED_UNICODE)); +unset($ranking); + +// Rankings +$ranking = []; +// - most accessed items +$ranking['accessed'] = []; +$sql = <<< SQL +SELECT + `ib`.`item_id`, `ib`.`doi`, + GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`, + `vi`.`count` + FROM `${prefix}_xoonips_ranking_viewed_item` AS `vi` + INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `vi`.`item_id`=`ib`.`item_id` + INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` + INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` + WHERE `iil`.`certify_state`=2 + GROUP BY `ib`.`item_id` + ORDER BY `vi`.`count` DESC + LIMIT 10 +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('item_id', 'count')); + $ranking['accessed'][] = $row; +} +$xoopsDB->freeRecordSet($res); +// - most accessed items +$ranking['downloaded'] = []; +$sql = <<< SQL +SELECT + `ib`.`item_id`, `ib`.`doi`, + GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`, + `di`.`count` + FROM `${prefix}_xoonips_ranking_downloaded_item` AS `di` + INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `di`.`item_id`=`ib`.`item_id` + INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` + INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` + WHERE `iil`.`certify_state`=2 + GROUP BY `ib`.`item_id` + ORDER BY `di`.`count` DESC + LIMIT 10 +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('item_id', 'count')); + $ranking['downloaded'][] = $row; +} +$xoopsDB->freeRecordSet($res); +// - most contributed users +$ranking['contributed'] = []; +$sql = <<< SQL +SELECT + `u`.`uid`, `u`.`uname`, `u`.`name`, COUNT(`cu`.`item_id`) AS `count` + FROM `${prefix}_xoonips_ranking_contributing_user` AS `cu` + INNER JOIN `${prefix}_users` AS `u` ON `cu`.`uid`=`u`.`uid` + GROUP BY `u`.`uid` + ORDER BY `count` DESC + LIMIT 10 +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('uid', 'count')); + $ranking['contributed'][] = $row; +} +$xoopsDB->freeRecordSet($res); +// - most searched keywords +$ranking['searched'] = []; +$sql = <<< SQL +SELECT + `sk`.`keyword`, `sk`.`count` + FROM `${prefix}_xoonips_ranking_searched_keyword` AS `sk` + ORDER BY `sk`.`count` DESC + LIMIT 10 +SQL; +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('count')); + $ranking['searched'][] = $row; +} +$xoopsDB->freeRecordSet($res); +file_put_contents(MYDUMPTOOL_OUTPUTDIR.'/rankings.json', json_encode($ranking, JSON_UNESCAPED_UNICODE)); +unset($ranking); + +// get public index with certified item count +$sql = <<< SQL +SELECT + `idx`.*, + `it`.`title`, + (SELECT COUNT(*) + FROM `${prefix}_xoonips_index_item_link` AS `iil` + INNER JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `iil`.`item_id`=`ib`.`item_id` + WHERE `iil`.`index_id`=`idx`.`index_id` AND `iil`.`certify_state`=2 + ) AS `num_items` + FROM `${prefix}_xoonips_index` AS `idx` + INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `idx`.`index_id`=`it`.`item_id` + WHERE `it`.`title_id`=0 + AND `idx`.`open_level`=1 +SQL; + +$limitItems = array(); +$limitFiles = array(); + +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +$tree = array(); +$root = array(); +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + $tree[$row['index_id']] = $row; + $root[$row['parent_index_id']][$row['sort_number']] = $row['index_id']; +} +$xoopsDB->freeRecordSet($res); +foreach ($root as &$node) { + ksort($node); +} +unset($node); + +$data[] = getTreeNode($tree, $root, 3); +$json = json_encode($data, JSON_UNESCAPED_UNICODE); //, JSON_PRETTY_PRINT); +file_put_contents(MYDUMPTOOL_OUTPUTDIR.'/tree.json', $json); +unset($json, $data, $root); + +// get public items +$sql = <<< SQL +SELECT + `ib`.*, + GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`, + `ity`.`display_name` AS `item_type_display_name`, `ity`.`name` AS `item_type_name`, + `u`.`uname`, `u`.`name`, `u`.`email` + FROM `${prefix}_xoonips_item_basic` AS `ib` + INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id` + INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `ib`.`item_type_id`=`ity`.`item_type_id` + INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id` + LEFT JOIN `${prefix}_users` AS `u` ON `ib`.`uid`=`u`.`uid` + WHERE `ity`.`display_name` != 'Index' + AND `iil`.`certify_state`=2 + GROUP BY `ib`.`item_id` + ORDER BY `ib`.`item_id` ASC +SQL; + +if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); +} +$items = array(); +while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('item_id', 'item_type_id', 'uid', 'last_update_date', 'creation_date', 'publication_year', 'publication_month', 'publication_mday')); + // $row['item_url'] = getItemUrl($row); + $row['index'] = getIndexes($tree, $row['item_id']); + if (0 === count($row['index'])) { + // no public indexes found. + continue; + } + $row['changelog'] = getChangeLogs($row['item_id']); + $row['related_to'] = getRelatedTo($row['item_id']); + $row['keyword'] = getKeyword($row['item_id']); + $row['file'] = getFile($row['item_id']); + switch ($row['item_type_name']) { + case 'xnpbinder': + appendBinderInfo($row); + break; + case 'xnpbook': + appendBookInfo($row); + break; + case 'xnpconference': + appendConferenceInfo($row); + break; + case 'xnpdata': + appendDataInfo($row); + break; + case 'xnpfiles': + appendFilesInfo($row); + break; + case 'xnpmemo': + appendMemoInfo($row); + break; + case 'xnpmodel': + appendModelInfo($row); + break; + case 'xnppaper': + appendPaperInfo($row); + break; + case 'xnppresentation': + appendPresentationInfo($row); + break; + case 'xnpsimulator': + appendSimulatorInfo($row); + break; + case 'xnpstimulus': + appendStimulusInfo($row); + break; + case 'xnptool': + appendToolInfo($row); + break; + case 'xnpurl': + appendUrlInfo($row); + break; + case 'xnpnimgcenter': + appendNimgcenterInfo($row); + break; + default: + exit('Unsupported item type: '.$row['item_type_name']); + } + if (isset($row['attachment_dl_limit']) && $row['attachment_dl_limit']) { + $found = false; + foreach ($row['file'] as $file) { + if ($file['file_type_name'] !== 'preview') { + $limitFiles[] = $file['file_id']; + $found = true; + } + } + if ($found) { + $limitItems[] = array( + 'uname' => $row['uname'], + 'name' => $row['name'], + 'email' => $row['email'], + 'item_id' => $row['item_id'], + 'doi' => $row['doi'], + ); + } + } + myDumpToolDropColumn($row, ['email', 'item_type_id']); + if (isset($row['rights']) && isset($row['use_cc']) && isset($row['cc_commercial_use']) && isset($row['cc_modification']) && $row['use_cc'] == 1) { + $label = 'Creative Commons Attribution'; + if ($row['cc_commercial_use'] == 0) { + $label .= '-NonCommercial'; + } + switch ($row['cc_modification']) {; + case 0: + $label .= '-NoDerivatives'; + break; + case 1: + $label .= '-ShareAlike'; + break; + } + $label .= ' 4.0 International License.'; + $row['rights'] = $label; + } + $items[] = $row; + //if (!is_dir(MYDUMPTOOL_OUTPUTDIR.'/items')) { + // mkdir(MYDUMPTOOL_OUTPUTDIR.'/items'); + //} + // $json = json_encode($row, JSON_UNESCAPED_UNICODE); //, JSON_PRETTY_PRINT); + //file_put_contents(MYDUMPTOOL_OUTPUTDIR.'/items/'.$row['item_id'].'.json', $json); +} +$xoopsDB->freeRecordSet($res); +$json = json_encode($items, JSON_UNESCAPED_UNICODE); //, JSON_PRETTY_PRINT); +file_put_contents(MYDUMPTOOL_OUTPUTDIR.'/items.json', $json); + +$fp = fopen(MYDUMPTOOL_OUTPUTDIR.'/dl-limit-items.csv', 'w'); +foreach ($limitItems as $row) { + $data = array( + $row['item_id'], + $row['uname'], + $row['name'], + $row['email'], + getItemUrl($row), + ); + fputcsv($fp, $data); +} +fclose($fp); + +// get files +$fthandler = xoonips_getormhandler('xoonips', 'file_type'); +$criteria = new Criteria('name', 'preview'); +$ftobjs = $fthandler->getObjects($criteria); +$ftId = $ftobjs[0]->get('file_type_id'); +$fhandler = xoonips_getormhandler('xoonips', 'file'); +$join = new XooNIpsJoinCriteria('xoonips_item_basic', 'item_id', 'item_id', 'INNER', 'ib'); +$join->cascade(new XooNIpsJoinCriteria('xoonips_index_item_link', 'item_id', 'item_id', 'INNER', 'iil'), 'ib', true); +$join->cascade(new XooNIpsJoinCriteria('xoonips_index', 'index_id', 'index_id', 'INNER', 'idx'), 'iil', true); +$criteria = new CriteriaCompo(new Criteria('is_deleted', 0)); +// $criteria->add(new Criteria('file_type_id', $ftId)); +$criteria->add(new Criteria('certify_state', 2)); +$criteria->add(new Criteria('open_level', 1)); +$res = $fhandler->open($criteria, '', false, $join); +$filesDir = MYDUMPTOOL_OUTPUTDIR.'/file'; +if (!is_dir($filesDir)) { + mkdir($filesDir); +} +$xconfig_handler = xoonips_getormhandler('xoonips', 'config'); +$basePath = $xconfig_handler->getValue('upload_dir'); +while ($obj = $fhandler->getNext($res)) { + $file_id = $obj->get('file_id'); + $file_name = $obj->get('original_file_name'); + if (in_array($file_id, $limitFiles)) { + echo 'download limit file found.. skip to copy .. file_id:'.$file_id.PHP_EOL; + continue; + } + $tmp = []; + $tmp['file_name'] = $file_name; + myDumpToolDecode($tmp); + $file_name = $tmp['file_name']; + $file_dir = $filesDir.'/'.$file_id; + if (!is_dir($file_dir)) { + @mkdir($file_dir); + } + if (!file_exists($file_dir.'/'.$file_name)) { + if (!copy($basePath.'/'.$file_id, $file_dir.'/'.$file_name)) { + echo 'failed to copy file: '.$basePath.'/'.$file_id.PHP_EOL; + } + $htaccess = $file_dir.'/.htaccess'; + $data = "RewriteEngine On\nRewriteBase /database/file/$file_id\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteRule .* $file_name [R=301,L]\n"; + file_put_contents($htaccess, $data); + } + if ($ftId == $obj->get('file_type_id')) { + // create preview thubmnails + createThumbnail($obj, $basePath, $filesDir); + } +} +$fhandler->close($res); + +// functions + +function getItemUrl($row) +{ + $url = XOONIPS_URL.'/detail.php?'; + if ('' != $row['doi']) { + $url .= XNP_CONFIG_DOI_FIELD_PARAM_NAME.'='.$row['doi']; + } else { + $url .= 'item_id='.$row['item_id']; + } + + return $url; +} + +function getTreeNode($tree, $root, $index_id) +{ + $children = array(); + if (isset($root[$index_id])) { + foreach ($root[$index_id] as $child_index_id) { + $children[] = getTreeNode($tree, $root, $child_index_id); + } + } + + return array( + 'id' => (int) $tree[$index_id]['index_id'], + 'title' => $tree[$index_id]['title'], + 'num_of_items' => (int) $tree[$index_id]['num_items'], + 'children' => $children, + ); +} + +function getIndexes($tree, $item_id) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $sql = <<< SQL +SELECT + `iil`.* + FROM `${prefix}_xoonips_index_item_link` AS `iil` + WHERE `iil`.`item_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $indexes = array(); + while ($row = $xoopsDB->fetchArray($res)) { + $index_id = $row['index_id']; + if (isset($tree[$index_id])) { + $idxes = array(); + $idxes[] = $tree[$index_id]['title']; + $parent_id = $tree[$index_id]['parent_index_id']; + while (1 != $parent_id) { + $idxes[] = $tree[$parent_id]['title']; + $parent_id = $tree[$parent_id]['parent_index_id']; + } + $idxes[] = ''; + $indexes[] = array( + 'index_id' => (int) $index_id, + 'title' => trim(implode(' / ', array_reverse($idxes))), + ); + } + } + $xoopsDB->freeRecordSet($res); + + return $indexes; +} + +function getChangeLogs($item_id) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $sql = <<< SQL +SELECT `log_date`, `log` + FROM `${prefix}_xoonips_changelog` + WHERE `item_id`=$item_id + ORDER BY `log_date` DESC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $ret = array(); + while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('log_date')); + $ret[] = $row; + } + $xoopsDB->freeRecordSet($res); + + return $ret; +} + +function getRelatedTo($item_id) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $sql = <<< SQL +SELECT `item_id` + FROM `${prefix}_xoonips_related_to` + WHERE `parent_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $ret = array(); + while ($row = $xoopsDB->fetchArray($res)) { + $ret[] = (int) $row['item_id']; + } + $xoopsDB->freeRecordSet($res); + + return $ret; +} + +function getKeyword($item_id) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xoonips_item_keyword` + WHERE `item_id`=$item_id + ORDER BY `keyword_id` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $ret = array(); + while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + $ret[] = $row['keyword']; + } + $xoopsDB->freeRecordSet($res); + + return $ret; +} + +function getFile($item_id) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $sql = <<< SQL +SELECT `f`.`file_id`, `f`.`original_file_name`, `f`.`mime_type`, `f`.`file_size`, `f`.`caption`, `f`.`timestamp`, + `ft`.`name` AS `file_type_name`, `ft`.`display_name` AS `file_type_display_name` + FROM `${prefix}_xoonips_file` AS `f` + INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id` + WHERE `item_id`=$item_id + AND `is_deleted`=0 + ORDER BY `ft`.`name` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $ret = array(); + while ($row = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($row); + myDumpToolConvertToInt($row, array('file_id', 'file_size')); + $ret[] = $row; + } + $xoopsDB->freeRecordSet($res); + + return $ret; +} + +function appendBinderInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpbinder_item_detail` + WHERE `binder_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('binder_id')); + myDumpToolDropColumn($detail, ['binder_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpbinder_binder_item_link` + WHERE `binder_id`=$item_id + ORDER BY `binder_item_link_id` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($link = $xoopsDB->fetchArray($res)) { + $row['link_item_ids'][] = (int) $link['item_id']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendBookInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpbook_item_detail` + WHERE `book_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('book_id', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolConvertToInt($detail, array('volume', 'number')); // for CBSN + myDumpToolDropColumn($detail, ['book_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpbook_author` + WHERE `book_id`=$item_id + ORDER BY `author_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['author'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['author'][] = $author['author']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendConferenceInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpconference_item_detail` + WHERE `conference_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('conference_id', 'conference_from_year', 'conference_from_month', 'conference_from_mday', 'conference_to_year', 'conference_to_month', 'conference_to_mday', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['conference_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpconference_author` + WHERE `conference_id`=$item_id + ORDER BY `author_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['author'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['author'][] = $author['author']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendDataInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpdata_item_detail` + WHERE `data_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('data_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['data_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpdata_experimenter` + WHERE `data_id`=$item_id + ORDER BY `experimenter_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['experimenter'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['experimenter'][] = $author['experimenter']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendFilesInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpfiles_item_detail` + WHERE `files_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('files_id')); + myDumpToolDropColumn($detail, ['files_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); +} + +function appendMemoInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpmemo_item_detail` + WHERE `memo_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('memo_id')); + myDumpToolDropColumn($detail, ['memo_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); +} + +function appendModelInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpmodel_item_detail` + WHERE `model_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('model_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['model_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpmodel_creator` + WHERE `model_id`=$item_id + ORDER BY `creator_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['creator'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['creator'][] = $author['creator']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendPaperInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnppaper_item_detail` + WHERE `paper_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('paper_id', 'volume', 'number')); + myDumpToolDropColumn($detail, ['paper_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnppaper_author` + WHERE `paper_id`=$item_id + ORDER BY `author_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['author'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['author'][] = $author['author']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendPresentationInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnppresentation_item_detail` + WHERE `presentation_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('presentation_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['presentation_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnppresentation_creator` + WHERE `presentation_id`=$item_id + ORDER BY `creator_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['creator'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['creator'][] = $author['creator']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendSimulatorInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpsimulator_item_detail` + WHERE `simulator_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('simulator_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['simulator_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpsimulator_developer` + WHERE `simulator_id`=$item_id + ORDER BY `developer_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['developer'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['developer'][] = $author['developer']; + } + $xoopsDB->freeRecordSet($res); +} + + +function appendStimulusInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpstimulus_item_detail` + WHERE `stimulus_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('stimulus_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['stimulus_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpstimulus_developer` + WHERE `stimulus_id`=$item_id + ORDER BY `developer_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['developer'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['developer'][] = $author['developer']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendToolInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnptool_item_detail` + WHERE `tool_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('tool_id', 'use_cc', 'cc_commercial_use', 'cc_modification', 'attachment_dl_limit', 'attachment_dl_notify')); + myDumpToolDropColumn($detail, ['tool_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnptool_developer` + WHERE `tool_id`=$item_id + ORDER BY `developer_order` ASC +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['developer'] = array(); + while ($author = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($author); + $row['developer'][] = $author['developer']; + } + $xoopsDB->freeRecordSet($res); +} + +function appendUrlInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpurl_item_detail` + WHERE `url_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + myDumpToolConvertToInt($detail, array('url_id', 'url_count')); + myDumpToolDropColumn($detail, ['url_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); +} + +function appendNimgcenterInfo(&$row) +{ + global $xoopsDB; + $prefix = $xoopsDB->prefix(); + $item_id = $row['item_id']; + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpnimgcenter_item_detail` + WHERE `nimgcenter_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + while ($detail = $xoopsDB->fetchArray($res)) { + myDumpToolDecode($detail); + $detail['coord_type_name'] = (0 === $detail['coord_type']) ? 'Talairach' : 'MNI'; + myDumpToolDropColumn($detail, ['nimgcenter_id']); + $row += $detail; + } + $xoopsDB->freeRecordSet($res); + $sql = <<< SQL +SELECT * + FROM `${prefix}_xnpnimgcenter_talairach_list` + WHERE `nimgcenter_id`=$item_id +SQL; + if (!($res = $xoopsDB->query($sql))) { + var_dump($xoopsDB); + exit(); + } + $row['coordinate'] = array(); + while ($t = $xoopsDB->fetchArray($res)) { + $row['coordinate'][] = $t; + } + $xoopsDB->freeRecordSet($res); +} + +function createThumbnail($obj, $basePath, $outputDir) +{ + $fileId = $obj->get('file_id'); + $outputFile = $outputDir.'/'.$fileId.'.png'; + $thumbnail_file = $obj->get('thumbnail_file'); + $size = strlen($thumbnail_file); + if ($size > 0) { + file_put_contents($outputFile, $thumbnail_file); + + return true; + } + $file_path = $basePath.'/'.$fileId; + $finfo = finfo_open(FILEINFO_NONE); + $label = finfo_file($finfo, $file_path); + finfo_close($finfo); + $mime_type = $obj->get('mime_type'); + if (preg_match('/^([^\\/]*)\\/(.*)$/', $mime_type, $matches)) { + if ('audio' == $matches[1]) { + $img_type = 'audio'; + } elseif ('image' == $matches[1]) { + $img_type = 'image'; + } elseif ('video' == $matches[1]) { + $img_type = 'video'; + } elseif ('text' == $matches[1]) { + $img_type = 'text'; + } elseif ('application' == $matches[1]) { + $text_types = array('pdf', 'xml', 'msword', 'vnd.ms-excel'); + $image_types = array('vnd.ms-powerpoint', 'postscript'); + $audio_types = array('vnd.rn-realmedia'); + if (in_array($matches[2], $text_types)) { + $img_type = 'text'; + } elseif (in_array($matches[2], $audio_types)) { + $img_type = 'audio'; + } elseif (in_array($matches[2], $image_types)) { + $img_type = 'image'; + } else { + $img_type = 'application'; + } + } else { + $img_type = 'unknown'; + } + } else { + $img_type = 'unknown'; + } + $img_file = XOOPS_ROOT_PATH.'/modules/xoonips/images/thumbnail_'.$img_type.'.png'; + // create image resource + $w = 100; + $h = 100; + $im = imagecreatetruecolor($w, $h); + // label setting + $f = 2; + // font number + $lp = 5; + // label padding + $fw = imagefontwidth($f); + // font width + $fh = imagefontheight($f); + // font height + $fmaxlen = ($w - $lp * 2) / $fw; + // max label length + $labels = explode(',', $label); + $label = $labels[0]; + $llen = strlen($label); + if ($llen > $fmaxlen) { + $label = substr($label, 0, $fmaxlen - 3); + $label .= '...'; + $llen = strlen($label); + } + $lx = ($w - $llen * $fw) / 2; + $ly = $h - $fh - $lp; + // change alpha attributes and create transparent color + imageantialias($im, true); + imagealphablending($im, false); + imagesavealpha($im, true); + $transparent = imagecolorallocatealpha($im, 255, 255, 255, 0); + $col_white = imagecolorallocate($im, 255, 255, 255); + $col_gray = imagecolorallocate($im, 127, 127, 127); + $col_black = imagecolorallocate($im, 0, 0, 0); + // fill all area with transparent color + imagefill($im, 0, 0, $col_white); + imagealphablending($im, true); + $imicon = imagecreatefrompng($img_file); + imagecopy($im, $imicon, $w / 2 - 48 / 2, $h / 2 - 48 / 2, 0, 0, 48, 48); + imagepolygon($im, array(0, 0, $w - 1, 0, $w - 1, $h - 1, 0, $h - 1), 4, $col_gray); + if (0 != strlen($label)) { + imagestring($im, $f, $lx, $ly, $label, $black); + } + imagepng($im, $outputFile); + imagedestroy($imicon); + imagedestroy($im); + + return true; +} diff --git a/package.json b/package.json index f96daa4..39784c9 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,36 @@ { "name": "cbsn", - "version": "0.1.0", + "version": "1.0.0", "private": true, "dependencies": { + "@types/async-lock": "^1.1.1", "@types/jest": "24.0.15", + "@types/lokijs": "^1.5.2", "@types/node": "12.0.8", + "@types/rc-tree": "^1.11.3", "@types/react": "16.8.20", "@types/react-dom": "16.8.4", + "@types/react-helmet": "^5.0.8", + "@types/react-overlays": "^1.1.2", + "@types/react-router-dom": "^4.3.4", + "@types/react-router-hash-link": "^1.2.1", + "async-lock": "^1.2.0", + "axios": "^0.19.0", + "lokijs": "^1.5.6", + "moment": "^2.24.0", + "rc-tree": "^2.1.0", "react": "^16.8.6", + "react-app-polyfill": "^1.0.1", + "react-cookie": "^4.0.0", "react-dom": "^16.8.6", + "react-ga": "^2.5.7", + "react-helmet": "^5.2.1", + "react-image-lightbox": "^5.1.0", + "react-overlays": "^1.2.0", + "react-router-dom": "^5.0.0", + "react-router-hash-link": "^1.2.1", "react-scripts": "3.0.1", + "react-spinner-material": "^1.1.1", "typescript": "3.5.2" }, "scripts": { @@ -25,12 +46,14 @@ "production": [ ">0.2%", "not dead", - "not op_mini all" + "not op_mini all", + "ie 11" ], "development": [ "last 1 chrome version", "last 1 firefox version", - "last 1 safari version" + "last 1 safari version", + "ie 11" ] } } diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..c0d9bbc --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,8 @@ +RewriteEngine on +RewriteBase / + +RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&) +RewriteRule ^modules/xoonips/download.php /database/file/%2? [R=301,L] + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule . /index.html [L] diff --git a/public/favicon.ico b/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..40ed9b8d8a359d69c497b716168d222dc0f6e9e2 100644 GIT binary patch literal 1406 zcmeH{-AmJ96vsc-TsEo1QcSFDgg*UzS*v6wGIQCs{)MP32`aS6ti-|+i>R3NrkIuG zOJeG9YiX^?G&RjRC6&lb=ncCuDhmv{uzo)cZ@la-JP+sae7@)KaL&1SAV5ALA;>X^ z{ech;2-#(cXxSBgo(0S*HJQ8F^SGPZOT|<>TbLLdrL?LJSN>6M4-9jov>b2ObL=@; z3_9)f+%3m(rjV%DUwPBn#~%P^ z4$xV0mF5%2aGyHK`0yZOU7d`2J=ACJ#oFqp#CDm2`wnWZm*F^)jjyT#Z_!!e-+trQ z)D(?}v+1xE<0(9i@8&J+$8)iHp3;(+$47r3nf;@@YIV~m_cQrvoR<$DFx1e%P(i39FEQ=f5s;vl>xBU+X!*9K(JO<}^x;YanpFu~S1(={m@FZe3;D%} j_(e&Zw`lYh1%-%=(@GJNq%qB+qL?=6R5PTs_b>Jb7hbkb literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/public/index.html b/public/index.html index dd1ccfd..77d53a0 100644 --- a/public/index.html +++ b/public/index.html @@ -5,34 +5,15 @@ - + + + + - - React App + CBSN platform - XooNIps for CBSN
- diff --git a/public/manifest.json b/public/manifest.json index 1f2f141..3502fae 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,10 +1,10 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "CBSN Platform", + "name": "Comprehensive Brain Science Network Platform", "icons": [ { "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", + "sizes": "16x16", "type": "image/x-icon" } ], diff --git a/src/App.css b/src/App.css index b41d297..a879fe7 100644 --- a/src/App.css +++ b/src/App.css @@ -1,33 +1,286 @@ -.App { - text-align: center; +/* HTML TAG Re-definition */ +body { + background: #fff; + font-family: Verdana, Arial, Helvetica, sans-serif, "MS Pゴシック", Osaka, "ヒラギノ角ゴ Pro W3"; + color: #666666; + margin: 0px; + padding: 0px 15px 15px; + font-size: 80%; + min-width: 880px; + max-width: 1280px; +} +a { + color: #6075aa; +} +a:hover { + color: #ff9900; +} +h1, +h2, +h3 { + color: #286367; +} +h4, +h5 { + color: #6075aa; +} +ul { + margin: 2px; + padding: 2px; + list-style: decimal inside; + text-align: left; +} +li { + margin-left: 2px; + list-style: square inside; +} +table { + width: 100%; + margin: 0; + padding: 0; +} +th { + color: #6075aa; + background-color: #e3e7f0; + padding: 4px; + vertical-align: middle; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #c7c7c7; +} +td { + padding: 0; + vertical-align: top; + font-family: Verdana, Arial, Helvetica, sans-serif; +} +legend { + padding: 3px; + color: #990000; + font-size: 120%; + font-weight: bold; +} +form { + margin: 0; + padding: 0; +} +textarea { + width: 400px; } -.App-logo { - animation: App-logo-spin infinite 20s linear; - height: 40vmin; - pointer-events: none; +.clearfix::after { + content: ""; + display: block; + clear: both; } -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; +/* XOOPS Newbb & tabular work */ +.outer { + border: 0px solid #cc0000; +} +.head, +tr.head td { + padding: 5px; + font-weight: bold; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #c7c7c7; + background-color: #f0f2f7; +} +.even { + padding: 2px; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #c7c7c7; + background-color: #f8fafe; +} +.odd { + padding: 2px; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #c7c7c7; + background-color: #ffffff; } -.App-link { - color: #61dafb; +tr.even td { + padding: 2px; + background-color: #f8fafe; +} +tr.odd td { + padding: 2px; + background-color: #ffffff; +} +.foot { + padding: 5px; + font-weight: bold; } -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } +.comTitle { + font-weight: bold; + margin-bottom: 2px; } +.comText { + padding: 2px; +} +.comUserStat { + font-size: 90%; + color: #2f5376; + font-weight: bold; + border: 1px solid silver; + background-color: #ffffff; + margin: 2px; + padding: 2px; +} +.comUserStatCaption { + font-weight: normal; +} +.comUserStatus { + margin-left: 2px; + margin-top: 10px; + color: #2f5376; + font-weight: bold; + font-size: 10px; +} +.comUserRank { + margin: 2px; +} +.comUserRankText { + font-size: 90%; + font-weight: bold; +} +.comUserRankImg { + border: 0; +} +.comUserImg { + margin: 2px; +} +.comDate { + font-style: normal; + font-size: 85%; +} +.comDateCaption { + font-weight: bold; + font-style: normal; +} + +/* XOOPS News */ +.itemHead { + padding: 3px; +} +.itemInfo { + text-align: right; + padding: 3px; + margin-bottom: 5px; + border-bottom: 1px solid silver; + font-style: italic; +} +.itemTitle { + padding: 3px; + font-size: 120%; + font-weight: bold; + color: #6075aa; +} +.itemTitle a { + color: #286367; + text-decoration: none; +} +.itemTitle a:hover { + color: #ff9900; +} +.itemPoster { + font-size: 90%; + font-style: italic; +} +.itemPostDate { + font-size: 90%; + font-style: italic; +} +.itemStats { + font-size: 80%; +} +.itemBody { + padding: 3px; +} +.itemBody img { + padding: 5px; +} +.itemTopicImage { + float: left; +} +.itemText { + margin-top: 5px; + margin-bottom: 5px; + line-height: 1.5em; +} +.itemText:first-letter { + font-size: 133%; + font-weight: bold; +} +.itemFoot { + text-align: right; + padding: 3px; + margin-top: 5px; + background-color: #efefef; + border: 1px solid silver; +} +.itemAdminLink { + font-size: 90%; +} +.itemPermaLink { + font-size: 90%; +} + +/* XOOPS Error Msg */ +div.errorMsg { + background-color: #ffcccc; + text-align: center; + border-top: 1px solid #ddddff; + border-left: 1px solid #ddddff; + border-right: 1px solid #aaaaaa; + border-bottom: 1px solid #aaaaaa; + font-weight: bold; + padding: 10px; +} +div.confirmMsg { + background-color: #ddffdf; + color: #136c99; + text-align: center; + border-top: 1px solid #ddddff; + border-left: 1px solid #ddddff; + border-right: 1px solid #aaaaaa; + border-bottom: 1px solid #aaaaaa; + font-weight: bold; + padding: 10px; +} +div.resultMsg { + background-color: #cccccc; + color: #333333; + text-align: center; + border-top: 1px solid silver; + border-left: 1px solid silver; + font-weight: bold; + border-right: 1px solid #666666; + border-bottom: 1px solid #666666; + padding: 10px; +} + +/* XOOPS Code &Quote */ +div.xoopsCode { + background: #ffffff url(./common/assets/images/theme/xoops_quote.jpg) no-repeat right top; + border: 1px inset #000080; + overflow: auto; + max-height: 300px; + max-width: 600px; +} +div.xoopsQuote { + background: #ffffff url(./common/assets/images/theme/xoops_quote.jpg) no-repeat right top; + border: 1px inset #000080; + overflow: auto; + max-height: 300px; + max-width: 600px; +} + +/* other */ +table.report { + background-color: #ff8; +} + diff --git a/src/App.tsx b/src/App.tsx index 226ee63..822f033 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,26 +1,20 @@ -import React from 'react'; -import logo from './logo.svg'; +import React, { Component } from 'react'; +import { BrowserRouter } from 'react-router-dom'; +import { CookiesProvider } from 'react-cookie'; +import AppRoot from './common/AppRoot'; import './App.css'; -const App: React.FC = () => { - return ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

-
- Learn React - -
-
- ); +class App extends Component { + + render() { + return ( + + + + + + ); + } } export default App; diff --git a/src/common/About.module.css b/src/common/About.module.css new file mode 100644 index 0000000..1d8fcd3 --- /dev/null +++ b/src/common/About.module.css @@ -0,0 +1,13 @@ +.notice { + color: red; + text-align: center; + margin: 10px 0; +} +.title { + margin-top: 25px; + border-bottom: solid 1px #cccccc; +} + +.content { + margin: 10px 0 10px 0; +} \ No newline at end of file diff --git a/src/common/About.tsx b/src/common/About.tsx new file mode 100644 index 0000000..a72f0bb --- /dev/null +++ b/src/common/About.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import Helmet from 'react-helmet'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import styles from './About.module.css'; +import Announce from './blocks/Announce'; + +interface Props { + lang: MultiLang; +} + +const About = (props: Props) => { + const {lang} = props; + const title = Functions.mlang('[en]Announce[/en][ja]ご案内[/ja]', lang); + return ( +
+ + {title} - {Functions.mlang(Config.SITE_TITLE, lang)} + +

{title}

+
+ +
+
+ ); +} + +export default About; \ No newline at end of file diff --git a/src/common/AppRoot.tsx b/src/common/AppRoot.tsx new file mode 100644 index 0000000..50b4f85 --- /dev/null +++ b/src/common/AppRoot.tsx @@ -0,0 +1,79 @@ +import React, { Component } from 'react'; +import { ReactCookieProps, withCookies } from 'react-cookie'; +import ReactGA from 'react-ga'; +import Helmet from 'react-helmet'; +import { RouteComponentProps, withRouter } from 'react-router-dom'; +import Config, { MultiLang } from '../config'; +import Functions from '../functions'; +import Container from './Container'; +import Footer from './Footer'; +import Header from './Header'; + +interface Props extends RouteComponentProps, ReactCookieProps { } +interface State { + lang: MultiLang; +} + +class AppRoot extends Component { + + constructor(props: Props) { + super(props); + this.state = { lang: 'en' }; + } + + static getDerivedStateFromProps(nextProps: Props, prevState: State) { + const params = new URLSearchParams(nextProps.location.search); + const param_lang = params.get('ml_lang'); + const cookie_lang = typeof nextProps.cookies !== 'undefined' ? nextProps.cookies.get('ml_lang') : null; + let lang = param_lang || (typeof cookie_lang === 'string' ? cookie_lang : null) || prevState.lang; + if (lang !== 'en' && lang !== 'ja') { + lang = 'en'; + } + if (cookie_lang !== lang) { + if (typeof nextProps.cookies !== 'undefined') { + nextProps.cookies.set('ml_lang', lang, { path: '/' }); + } + } + if (prevState.lang !== lang) { + return { lang }; + } + return null; + } + + componentDidMount() { + const { pathname } = this.props.location; + if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') { + ReactGA.set({ page: pathname }); + ReactGA.pageview(pathname); + } + } + + componentDidUpdate(prevProps: Props) { + const { pathname, search } = this.props.location; + if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') { + ReactGA.set({ page: pathname }); + ReactGA.pageview(pathname); + } + if (pathname !== prevProps.location.pathname || search !== prevProps.location.search) { + window.scrollTo(0, 0); + } + } + + render() { + const { lang } = this.state; + const title = Functions.mlang(Config.SITE_TITLE, lang); + const slogan = Functions.mlang(Config.SITE_SLOGAN, lang); + return ( + <> + + {title} - {slogan} + +
+ +