6 Commits
Author SHA1 Message Date
orrisroot f55b92868c chore: correct the package name recorded in the lockfile 2026-09-15 20:30:53 +09:00
orrisroot f5e416beeb fix: keep text dark on form controls given a white background
sanitize.css forms.css makes form controls inherit the text color, so
the rules that put them back on white left white text wherever the
surrounding panel sets it, as in the nimgsearch search panel and the
open.neuroinf.jp advanced search.

- set the text to black next to each white control background,
  matching how the browser drew the controls before sanitize.css
2026-09-15 20:02:10 +09:00
orrisroot d6824425f1 fix: draw the index tree lines at the right depth
The index tree has a single root, so its first indent unit is always
marked as an end and every line was shifted one column to the right,
doubling the vertical line under the root. Hide that unit and draw the
node's own branch (├ or └) after the indent from the leaf-last class,
as nimg.neuroinf.jp already does.
2026-09-15 18:27:18 +09:00
orrisroot d880bcaa3a fix: serve data files with reserved characters in dev and preview
sirv decodes request paths with decodeURI, which leaves %26 (&) and
%23 (#) encoded, so data files with such characters in their names
were not found by the dev and preview servers. Hand sirv the fully
decoded path, the way Apache resolves it in production.
2026-09-14 18:33:37 +09:00
orrisroot 87c0274bc1 feat: migrate from Create React App to Vite
Rebuild the site on the stack the other converted sites share: Vite 8,
React 19, TypeScript 7, react-router 8, Biome and sanitize.css, with the
site data moved out of the bundle into static-contents/.

- base the database, credits and pico code on cerebellum.neuroinf.jp,
  keeping this site's item types, rankings and menus
- port the MediaWiki pages to function components
- serve all module data from modules/, redirecting the old download and
  /database/file URLs
- tile the plate texture and keep form controls on white
- track page views with GA4
2026-09-14 16:57:14 +09:00
orrisroot 7069196a5b chore: move XOOPS conversion tools to xoops-static-exporter
The dump scripts are site-specific but belong with the other sites'
tools rather than inside the front-end repository. They now live in
xoops-static-exporter under sites/dynamicbrain.neuroinf.jp/.
2026-09-14 16:57:13 +09:00
198 changed files with 6561 additions and 17509 deletions
+21 -32
View File
@@ -1,36 +1,25 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
.eslintcache
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
# database contents
/dl-limit-items.csv
/public/database
/public/credits
/public/documents
/public/hackathon
/public/mediawiki
/src/database/assets/*.json
/src/credits/assets/*.json
/src/pico/assets/*.json
/src/mediawiki/assets/*.json
node_modules
dist
dist-ssr
coverage
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
+6
View File
@@ -0,0 +1,6 @@
// Keep @types/node on the 24.x line to match the deployment target. Its
// "latest" dist-tag points at the 22.x line, so the default target would
// report no updates at all instead of offering 24.x patches.
export default {
target: (name) => (name === '@types/node' ? 'minor' : 'latest'),
};
+89 -25
View File
@@ -1,44 +1,108 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
# Dynamic Brain Platform
## Available Scripts
Static front-end for the archived [Dynamic Brain Platform](https://dynamicbrain.neuroinf.jp/),
built with [Vite](https://vite.dev/), React and TypeScript.
In the project directory, you can run:
## Requirements
### `npm start`
- Node.js 20.19+ / 22.12+ (Vite 8)
- npm
Runs the app in the development mode.<br>
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
## Setup
The page will reload if you make edits.<br>
You will also see any lint errors in the console.
```sh
npm install
```
### `npm test`
## Site data
Launches the test runner in the interactive watch mode.<br>
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
The pages are rendered from JSON dumped out of the original XOOPS installation
by [xoops-static-exporter](https://git.ni.riken.jp/niu/xoops-static-exporter)
(`sites/dynamicbrain.neuroinf.jp/`). All of it lives in `static-contents/`,
which sits next to the repository rather than inside it:
### `npm run build`
```
dynamicbrain.neuroinf.jp/
├── dynamicbrain.neuroinf.jp/ this repository
└── static-contents/
├── modules/ one directory per source XOOPS module
│ ├── credits/ credits.json, images/
│ ├── documents/ pico: config.json, <content id>.json, images/
│ ├── hackathon/ pico: config.json, <content id>.json, images/, data/
│ ├── mediawiki/ contents.json, contents/<id>.json, images/
│ └── xoonips/ tree.json, items.json, rankings, file/<id>/
├── conferences/ static conference sites, served as they are
├── hetero/ static project site, served as it is
└── rss.xml
```
Builds the app for production to the `build` folder.<br>
It correctly bundles React in production mode and optimizes the build for the best performance.
The `RewriteBase` in every `modules/xoonips/file/<id>/.htaccess` carries the
absolute path of that directory, and the image and file URLs inside the JSON
carry `/modules/<module>/...`; both have to move with the layout.
The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed!
The dev and preview servers mount that directory at the site root. It is kept
out of `dist/`, and it is not tracked in git.
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
## Scripts
### `npm run eject`
| Command | Description |
| --- | --- |
| `npm run dev` | Start the dev server on http://localhost:5173 |
| `npm run build` | Type-check and build into `dist/` |
| `npm run preview` | Serve the production build on http://localhost:4173 |
| `npm run lint` | Lint with [Biome](https://biomejs.dev/) |
| `npm run format` | Format with Biome |
| `npm run check` | Lint, format and organize imports, applying the safe fixes |
**Note: this is a one-way operation. Once you `eject`, you cant go back!**
`@types/node` is pinned to the major that matches the Node runtime in use (24);
`.ncurc.js` keeps `npm-check-updates` from bumping it past that.
If you arent satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
There is currently no test suite.
Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point youre on your own.
## Styles
You dont have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldnt feel obligated to use this feature. However we understand that this tool wouldnt be useful if you couldnt customize it when you are ready for it.
The base stylesheet is `sanitize.css` with its `forms` and `typography` sheets,
with its `box-sizing: border-box` kept. Where one of its defaults does not suit
the theme, the theme rule for that place sets its own value rather than
overriding the element everywhere.
## Learn More
## Deployment
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
Build locally and copy the result up; the server does not need a toolchain.
To learn React, check out the [React documentation](https://reactjs.org/).
```sh
npm ci
npm run check
npm run build
../deploy.sh
```
`deploy.sh`, next to `static-contents/`, sends the data to
`archive:/data/www/dynamicbrain.neuroinf.jp/static-contents/`, then `dist/` to
`.../html/`, and finally links every top-level entry of `static-contents/` into
the document root over ssh (`ln -sfn ../static-contents/* .`). The data has to
go first: the document root's `rsync --delete` removes those links, and they
are only put back at the end.
Apache needs `Options FollowSymLinks` and `AllowOverride All` on both
directories. Use symlinks rather than `Alias`: an `Alias` maps the URL outside
the document root, so `.htaccess` no longer applies and the SPA fallback and
the redirects stop working.
### Redirects
`.htaccess` redirects these addresses with a 301:
| From | To |
| --- | --- |
| `/modules/xoonips/download.php?file_id=N` | `/modules/xoonips/file/N` |
| `/database/file/...` | `/modules/xoonips/file/...` |
XOOPS-style addresses (`/modules/xoonips/detail.php?item_id=N`,
`/modules/mediawiki/index.php/<page>`, `/modules/documents/...`,
`/modules/credits/...`, `/index.php`) are redirected inside the app.
## Google Analytics
`GOOGLE_ANALYTICS_TRACKING_ID` in `src/config.ts` carries the GA4 measurement
ID. Emptying it disables tracking. Only production builds send page views.
+39
View File
@@ -0,0 +1,39 @@
{
"$schema": "https://biomejs.dev/schemas/2.5.13/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"includes": ["**", "!**/dist", "!src/common/assets", "!src/mediawiki/assets"]
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 4,
"lineWidth": 120
},
"javascript": {
"formatter": {
"quoteStyle": "single",
"jsxQuoteStyle": "double",
"semicolons": "always",
"trailingCommas": "es5",
"arrowParentheses": "always"
}
},
"linter": {
"enabled": true,
"rules": {
"preset": "recommended"
}
},
"assist": {
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
-197
View File
@@ -1,197 +0,0 @@
<?php
require_once __DIR__.'/config.inc.php';
define('PROTECTOR_SKIP_DOS_CHECK', 1);
define('PROTECTOR_SKIP_FILESCHECKER', 1);
// disable query logger
define('XOOPS_LOGGER_ADDQUERY_DISABLED', true);
// ----
if (!file_exists($mainfile)) {
echo 'ERROR : mainfile.php not found'.PHP_EOL;
exit(1);
}
$xoops_path = '';
$xoops_url = '';
foreach (file($mainfile) as $line) {
if (preg_match('/^\s*define\s*\(\s*[\'"]XOOPS_ROOT_PATH[\'"]\s*,\s*[\'"](.+)[\'"]\)\s*;\s*$/', $line, $matches)) {
$xoops_path = $matches[1];
}
if (preg_match('/^\s*define\s*\(\s*[\'"]XOOPS_URL[\'"]\s*,\s*[\'"](.+)[\'"]\)\s*;\s*$/', $line, $matches)) {
$xoops_url = $matches[1];
}
}
if (isset($method) && 'POST' == strtoupper($method)) {
$method = 'POST';
} else {
$method = 'GET';
}
$_SERVER['HTTP_USER_AGENT'] = 'php-cli';
$_SERVER['REQUEST_METHOD'] = $method;
$_ENV['HTTP_REFERER'] = $xoops_url.'/index.php';
$_SERVER['QUERY_STRING'] = '/index.php';
$_SERVER['REMOTE_ADDR'] = '192.168.0.1';
if (file_exists($xoops_path.'/modules/xoonips/include/common.inc.php')) {
require_once $xoops_path.'/modules/xoonips/include/common.inc.php';
} else {
require_once $xoops_path.'/mainfile.php';
require_once $xoops_path.'/modules/xoonips/condefs.php';
require_once $xoops_path.'/modules/xoonips/include/functions.php';
}
if (defined('XOOPS_DB_PROXY') && XOOPS_DB_PROXY == 1 && 'POST' == $method) {
die('Error: not accept POST request'."\n");
}
error_reporting(E_ALL);
// remove ob fileters
while (ob_get_level()) {
ob_end_clean();
}
define('MYDUMPTOOL_OUTPUTDIR', __DIR__.'/data');
MyDumpTool::makeDirectory('');
MyDumpTool::makeDirectory('src');
MyDumpTool::makeDirectory('public');
class MyDumpTool
{
public static function decode(&$data)
{
$textutil = xoonips_getutility('text');
foreach ($data as $k => $v) {
if (is_string($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);
} elseif (null === $v) {
$data[$k] = '';
}
}
}
public static function convertToInt(&$data, $keys, $zerofill = false)
{
foreach ($keys as $key) {
if (isset($data[$key])) {
$data[$key] = '' === $data[$key] ? ($zerofill ? 0 : null) : (int) $data[$key];
}
}
}
public static function dropColumn(&$data, $keys)
{
foreach ($keys as $key) {
if (isset($data[$key])) {
unset($data[$key]);
}
}
}
public static function fileCopy($from, $to)
{
system('rsync -aq '.escapeshellarg($from).' '.escapeshellarg($to), $ret);
return 0 === $ret;
}
public static function fixHtml($text)
{
static $config = [
//'clean' => true,
'hide-comments' => true,
'indent' => true,
'output-xhtml' => true,
'preserve-entities' => true,
'show-body-only' => true,
'wrap' => 0,
'input-encoding' => 'utf8',
'output-encoding' => 'utf8',
'output-bom' => false,
];
$text = tidy_repair_string($text, $config);
$text = preg_replace('/<table([^>]*)>((?:\s*<caption[^>]*>.*<\/caption>)?\s*)<tr([^>]*)>/Us', '<table\1>\2<tbody><tr\3>', $text);
$text = preg_replace('/<\/tr>(\s*)<\/table>/s', '</tr></tbody>\1</table>', $text);
return $text;
}
public static function tableExists($name)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$sql = <<< SQL
SELECT 1
FROM `${prefix}_${name}`
LIMIT 1
SQL;
if (!($res = $xoopsDB->query($sql))) {
return false;
}
$xoopsDB->freeRecordSet($res);
return true;
}
public static function makeDirectory($dirname)
{
$path = MYDUMPTOOL_OUTPUTDIR.('' !== $dirname ? '/'.$dirname : '');
if (!is_dir($path)) {
if (!@mkdir($path)) {
exit('Failed to create directory: '.$path.PHP_EOL);
}
}
}
public static function saveJson($fname, $data)
{
$path = MYDUMPTOOL_OUTPUTDIR.'/'.$fname;
if (false === file_put_contents($path, json_encode($data, JSON_UNESCAPED_UNICODE))) {
exit('Failed to save json file: '.$path.PHP_EOL);
}
}
public static function fileDownload($url, $fpath)
{
$fp = fopen($fpath, 'w');
if (false === $fp) {
exit('Failed to open file: '.$fpath.PHP_EOL);
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$ret = curl_exec($curl);
fclose($fp);
if (false === $ret) {
exit('Failed to download file, unexpected error: '.$url.PHP_EOL);
}
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if (200 !== $code) {
exit('Failed to download file, invalid status code('.$code.'): '.$url.PHP_EOL);
}
curl_close($curl);
return true;
}
public static function getMimeType($fpath)
{
$finfo = finfo_open(FILEINFO_MIME);
$mime = finfo_file($finfo, $fpath);
finfo_close($finfo);
$mime = preg_replace('/(;.*)$/', '', $mime);
return $mime;
}
}
-9
View File
@@ -1,9 +0,0 @@
<?php
$mainfile = '/data/www/html/mainfile.php';
$XOONIPS_SIMPF_LINKFILE = __DIR__.'/simpflink.csv';
#$XOOPS_MODULE_D3FORUM = ['forum'];
$XOOPS_MODULE_PICO = ['documents', 'hackathon'];
define('XOONIPS_RANNKING_LIMIT', 10);
-156
View File
@@ -1,156 +0,0 @@
<?php
require_once __DIR__.'/common.inc.php';
$prefix = $xoopsDB->prefix();
$table = 'nipfcredits_organization';
if (!MyDumpTool::tableExists($table)) {
exit('credits module not found'.PHP_EOL);
}
MyDumpTool::makeDirectory('src/credits');
MyDumpTool::makeDirectory('src/credits/assets');
// organization
$organization = [];
$sql = <<< SQL
SELECT
`o`.*
FROM `${prefix}_nipfcredits_organization` AS `o`
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
$organization = $row;
}
$xoopsDB->freeRecordSet($res);
$organization['com_email'] = str_replace('@', ' (at) ', $organization['com_email']);
$organization['com_url'] = XOOPS_URL;
$organization['institute'] = 'Neuroinformatics Unit, RIKEN Center for Brain Science';
$organization['url'] = 'https://www.ni.riken.jp/';
$organization['email'] = 'office (at) ni.riken.jp';
$organization['address'] = 'Hirosawa 2-1, Wako, Saitama, 351-0198 Japan';
$organization['tel'] = '+81 48 (462) 1111';
// member
$member = [];
$sql = <<< SQL
SELECT
`m`.*
FROM `${prefix}_nipfcredits_member` AS `m`
ORDER BY `m`.`weight`
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
$member[] = $row;
}
$xoopsDB->freeRecordSet($res);
$opage = getOrganizationPage($organization, $member);
//var_dump($opage);
// pages
$pages = [];
$sql = <<< SQL
SELECT
`p`.*
FROM `${prefix}_nipfcredits_page` AS `p`
ORDER BY `p`.`weight`
SQL;
if (!($res = $xoopsDB->query($sql))) {
var_dump($xoopsDB);
exit();
}
while ($row = $xoopsDB->fetchArray($res)) {
MyDumpTool::decode($row);
myDumpTool::convertToInt($row, ['pid', 'weight', 'lastupdate']);
$content = replaceOrganization($row['content'], $organization);
$content = MyDumpTool::fixHtml($content);
$content = preg_replace('/href="(?:\.\/|'.preg_quote(XOOPS_URL, '/').'\/modules\/credits\/)?index\.php\?id=(\d+)"/', 'href="/credits/\1"', $content);
$imageUrl = [];
$content = preg_replace_callback('/<img ([^>]*)src="([^"]+)"([^>]*)\/>/Usi', function ($matches) use (&$imageUrl, $row) {
$url = $matches[2];
if (preg_match('/^(.+)\/([^\/]+\.(:?png|jpg|gif|svg))(\?.+)?$/i', $url, $m)) {
if (!isset($imageUrl[$m[1]])) {
$imageUrl[$m[1]] = count($imageUrl) + 1;
}
$id = $imageUrl[$m[1]];
$fname = '/credits/images/'.$row['pid'].'/'.$id.'/'.urldecode($m[2]);
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
if (!file_exists($fpath)) {
MyDumpTool::makeDirectory('public/credits');
MyDumpTool::makeDirectory('public/credits/images');
MyDumpTool::makeDirectory('public/credits/images/'.$row['pid']);
MyDumpTool::makeDirectory('public/credits/images/'.$row['pid'].'/'.$id);
if (preg_match('/^\//', $url)) {
$url = XOOPS_URL.$url;
}
MyDumpTool::fileDownload($url, $fpath);
}
$url = '/credits/images/'.$row['pid'].'/'.$id.'/'.$m[2];
}
return '<img '.$matches[1].'src="'.$url.'"'.$matches[3].'/>';
}, $content);
$content = preg_replace('/<a (?:[^>]*)href="(?:'.preg_quote(XOOPS_URL, '/').')?\/modules\/xoonips\/(?:register|edit|user)[^"]*"(?:[^>]*)>(.*)<\/a>/Usi', '<s>\1</s>(closed)', $content);
$row['content'] = $content;
MyDumpTool::dropColumn($row, ['weight']);
$pages[] = $row;
}
$xoopsDB->freeRecordSet($res);
//var_dump($pages);
$data = [
'organization' => $opage,
'pages' => $pages,
];
MyDumpTool::saveJson('src/credits/assets/credits.json', $data);
function replaceOrganization($text, $org)
{
$textutil = xoonips_getutility('text');
$map = [
'{COMMITTEE_NAME}' => $textutil->html_special_chars($org['committee']),
'{COMMITTEE_EMAIL}' => '<s>'.$textutil->html_special_chars($org['com_email']).'</s>(committee email has been closed)',
'{INSTITUTE_NAME}' => $textutil->html_special_chars($org['institute']),
'{INSTITUTE_URL}' => $textutil->html_special_chars($org['url']),
'{INSTITUTE_EMAIL}' => $textutil->html_special_chars($org['email']),
'{INSTITUTE_ADDRESS}' => $textutil->html_special_chars($org['address']),
'{INSTITUTE_TEL}' => $textutil->html_special_chars($org['tel']),
'{PLATFORM_URL}' => XOOPS_URL,
];
return str_replace(array_keys($map), $map, $text);
}
function getOrganizationPage($org, $member)
{
$textutil = xoonips_getutility('text');
$members = [];
foreach ($member as $m) {
$members[] = ' <li>'.$textutil->html_special_chars($m['name'].' : '.$m['division']).'</li>';
}
$members = implode("\n", $members);
$committee = $textutil->html_special_chars($org['committee']);
$institute = $textutil->html_special_chars($org['institute']);
$address = $textutil->html_special_chars($org['address']);
$url = $textutil->html_special_chars($org['url']);
$html = <<< HTML
<h4>${committee}</h4>
<ul>
<li>Members
<ul>
${members}
</ul>
</li>
</ul>
HTML;
return $html;
}
-198
View File
@@ -1,198 +0,0 @@
<?php
define('PROTECTOR_SKIP_DOS_CHECK', 1);
define('PROTECTOR_SKIP_FILESCHECKER', 1);
define('XOOPS_LOGGER_ADDQUERY_DISABLED', true);
$_SERVER['HTTP_USER_AGENT'] = 'php-cli';
//$_SERVER['REQUEST_METHOD'] = 'GET';
$_ENV['HTTP_REFERER'] = 'http://localhost/index.php';
$_SERVER['QUERY_STRING'] = '/index.php';
$_SERVER['REMOTE_ADDR'] = '192.168.0.1';
$basedir = '/data/www/html/modules/mediawiki/w/maintenance';
define('API_URL', 'https://dynamicbrain.neuroinf.jp/modules/mediawiki/w/api.php');
define('IMAGE_DIR', '/data/www/html/uploads/mediawiki');
define('DEST_IMAGE_DIR', __DIR__.'/data/public/mediawiki/images');
require_once $basedir.'/Maintenance.php';
class DumpMediaWiki extends Maintenance
{
public function execute()
{
error_reporting(E_ALL);
while (ob_get_level()) {
ob_end_clean();
}
$mwlist = [];
$this->makedir(__DIR__.'/data');
$this->makedir(__DIR__.'/data/src');
$this->makedir(__DIR__.'/data/src/mediawiki');
$this->makedir(__DIR__.'/data/src/mediawiki/assets');
$this->makedir(__DIR__.'/data/public');
$this->makedir(__DIR__.'/data/public/mediawiki');
$this->makedir(__DIR__.'/data/public/mediawiki/images');
$this->makedir(__DIR__.'/data/public/mediawiki/contents');
$this->makedir(__DIR__.'/temp');
$this->makedir(__DIR__.'/temp/mediawiki');
$url = API_URL.'?action=query&list=allpages&aplimit=500&utf8=&format=json';
$json = $this->fetchData($url);
$data = json_decode($json, true);
$allpages = $data['query']['allpages'];
$num = 0;
$start = 0;
foreach ($allpages as $page) {
if ($num < $start) {
++$num;
continue;
}
$name = urlencode(str_replace(' ', '_', $page['title']));
$url = API_URL.'?action=parse&format=json&page='.$name;
$json = $this->fetchData($url);
$data = json_decode($json, true);
$detail = $data['parse'];
echo $num.'('.$detail['revid'].'): '.$page['title'].PHP_EOL;
$mwlist[] = [
'id' => (int) $detail['revid'],
'title' => $page['title'],
];
if (!isset($detail['images'])) {
var_dump($json);
var_dump($page);
var_dump($name);
var_dump($data);
exit();
}
foreach ($detail['images'] as $image) {
$fpath = $this->getImagePath(IMAGE_DIR, $image);
if (!file_exists($fpath)) {
exit('File not found: '.$fpath.PHP_EOL);
}
$dfpath = $this->getImagePath(DEST_IMAGE_DIR, $image);
$pddpath = dirname($dfpath);
$ppddpath = dirname($pddpath);
$this->makedir($ppddpath);
$this->makedir($pddpath);
$this->fileCopy($fpath, $dfpath);
}
$text = $this->fixHtml($detail['text']['*']);
$title = $detail['title'];
$sections = [];
foreach ($detail['sections'] as $section) {
$sections[] = [
'toclevel' => $section['toclevel'],
'line' => $section['line'],
'number' => $section['number'],
'anchor' => $section['anchor'],
];
}
$data = [
'title' => $title,
'text' => $text,
'sections' => $sections,
];
$fname = __DIR__.'/temp/mediawiki/'.$detail['revid'].'.dump.json';
file_put_contents($fname, json_encode($data, JSON_UNESCAPED_UNICODE));
++$num;
}
$fname = __DIR__.'/data/src/mediawiki/assets/contents.json';
file_put_contents($fname, json_encode($mwlist, JSON_UNESCAPED_UNICODE));
echo "Hello, World!\n";
}
public function fixHtml($text)
{
$text = preg_replace('/<span class="mw-editsection"><span class="mw-editsection-bracket">\[<\/span><a href="(?:[^"]*)" title="(?:[^"]*)">edit<\/a><span class="mw-editsection-bracket">\]<\/span><\/span>/Us', '', $text);
$text = preg_replace('/<a href="\/modules\/mediawiki\/w\/index.php\?title=(?:[^"]+)&amp;action=edit&amp;redlink=1" class="new" title="(?:[^"]*)">([^<]+)<\/a>/Us', '\1', $text);
$text = preg_replace('/<li>\s*(.*)\s*<\/li>/Us', '<li>\1</li>', $text);
$text = preg_replace('/<!-- .* -->/Us', '', $text);
$text = trim($text);
return $text;
}
public function makedir($path)
{
if (is_dir($path)) {
return true;
}
if (false === @mkdir($path)) {
exit('Failed to create directroy: '.$path.PHP_EOL);
}
return true;
}
public function getImagePath($basedir, $fname)
{
$hash = md5($fname);
return $basedir.'/'.substr($hash, 0, 1).'/'.substr($hash, 0, 2).'/'.$fname;
}
public function fileCopy($from, $to)
{
system('rsync -aq '.escapeshellarg($from).' '.escapeshellarg($to), $ret);
if (0 !== $ret) {
exit('Failed to copy file: '.$from.' -> '.$to.PHP_EOL);
}
return 0 === $ret;
}
public function fetchData($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$ret = curl_exec($curl);
if (false === $ret) {
exit('Failed to fetch data, unexpected error: '.$url.PHP_EOL);
}
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if (200 !== $code) {
exit('Failed to fetch data, invalid status code('.$code.'): '.$url.PHP_EOL);
}
curl_close($curl);
return $ret;
}
public function fileDownload($url, $fpath)
{
$fp = fopen($fpath, 'w');
if (false === $fp) {
exit('Failed to open file: '.$fpath.PHP_EOL);
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$ret = curl_exec($curl);
fclose($fp);
if (false === $ret) {
exit('Failed to download file, unexpected error: '.$url.PHP_EOL);
}
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if (200 !== $code) {
exit('Failed to download file, invalid status code('.$code.'): '.$url.PHP_EOL);
}
curl_close($curl);
return true;
}
}
$maintClass = DumpMediaWiki::class;
require_once RUN_MAINTENANCE_IF_MAIN;
-163
View File
@@ -1,163 +0,0 @@
<?php
require_once __DIR__.'/common.inc.php';
if (!isset($XOOPS_MODULE_PICO) || empty($XOOPS_MODULE_PICO)) {
exit('Not configured for pico module'.PHP_EOL);
}
error_reporting(0);
require_once XOOPS_TRUST_PATH.'/modules/pico/include/main_functions.php';
require_once XOOPS_TRUST_PATH.'/modules/pico/include/common_functions.php';
require_once XOOPS_TRUST_PATH.'/modules/pico/class/pico.textsanitizer.php';
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoUriMapper.class.php';
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoPermission.class.php';
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoModelCategory.class.php';
require_once XOOPS_TRUST_PATH.'/modules/pico/class/PicoModelContent.class.php';
require_once XOOPS_TRUST_PATH.'/libs/altsys/class/AltsysBreadcrumbs.class.php';
error_reporting(E_ALL);
$config = [];
foreach ($XOOPS_MODULE_PICO as $pico) {
dumpPico($pico, $config);
}
MyDumpTool::makeDirectory('src/pico');
MyDumpTool::makeDirectory('src/pico/assets');
MyDumpTool::saveJson('src/pico/assets/config.json', $config);
function dumpPico($pico, &$config)
{
global $xoopsDB;
$prefix = $xoopsDB->prefix();
$table = $pico.'_contents';
if (!MyDumpTool::tableExists($table)) {
exit('pico('.$pico.') module not found'.PHP_EOL);
}
MyDumpTool::makeDirectory('public/'.$pico);
MyDumpTool::makeDirectory('public/'.$pico.'/images');
$moduleHandler = xoops_gethandler('module');
$module = $moduleHandler->getByDirname($pico);
$moduleConfigHandler = xoops_gethandler('config');
$moduleConfig = $moduleConfigHandler->getConfigsByDirname($pico);
$permObj = PicoPermission::getInstance();
$perms = $permObj->getPermissions($pico);
$categoryHandler = new PicoCategoryHandler($pico, $perms);
$contentHandler = new PicoContentHandler($pico);
$cats = $categoryHandler->getAllCategories();
$confContents = [];
$confCategories = [];
foreach ($cats as $cat) {
$catData = $cat->getData();
$modConfig = $cat->getOverriddenModConfig();
$link = pico_common_make_category_link4html($modConfig, $catData, $pico);
MyDumpTool::decode($catData);
$confCategories[] = [
'id' => $catData['id'],
'title' => $catData['cat_title'],
'desc' => (string) $catData['cat_desc'],
'pid' => (int) $catData['pid'],
'weight' => (int) $catData['cat_weight'],
'link' => $link,
];
$contents = $contentHandler->getCategoryContents($cat);
foreach ($contents as $content) {
$data = $content->getData();
$link = pico_common_make_content_link4html($modConfig, $data);
MyDumpTool::decode($data);
$content = MyDumpTool::fixHtml($data['body_cached']);
$imageId = 1;
$dataId = [];
$content = preg_replace_callback('/<img ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use (&$imageId, $pico, $data, $link) {
$url = $matches[2];
if (!preg_match('/^http/', $url)) {
if (preg_match('/^\//', $url)) {
$url = XOOPS_URL.$url;
} else {
$xpath = dirname($link);
$url = XOOPS_URL.'/modules/'.$pico.'/'.$xpath.'/'.$url;
}
}
$fname = '/'.$pico.'/images/'.$data['id'].'_'.$imageId.'.dat';
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
MyDumpTool::fileDownload($url, $fpath);
$mime = MyDumpTool::getMimeType($fpath);
switch ($mime) {
case 'image/gif':
$fpath_ = preg_replace('/.dat$/', '.gif', $fpath);
$fname = preg_replace('/.dat$/', '.gif', $fname);
rename($fpath, $fpath_);
$fpath = $fpath_;
break;
case 'image/png':
$fpath_ = preg_replace('/.dat$/', '.png', $fpath);
$fname = preg_replace('/.dat$/', '.png', $fname);
rename($fpath, $fpath_);
$fpath = $fpath_;
break;
case 'image/jpeg':
$fpath_ = preg_replace('/.dat$/', '.jpeg', $fpath);
$fname = preg_replace('/.dat$/', '.jpeg', $fname);
rename($fpath, $fpath_);
$fpath = $fpath_;
break;
default:
exit('unknown mime type '.$mime.' found: '.$fname.' from '.$url.PHP_EOL);
}
++$imageId;
return '<img '.$matches[1].'src="'.$fname.'"'.$matches[3].'/>';
}, $content);
$content = preg_replace_callback('/<a ([^>]*)href="([^"]+)"([^>]*)>/Us', function ($matches) use (&$dataId, $pico, $data, $link) {
$url = $matches[2];
if (preg_match('/^(.+)\/([^\/]+\.pdf)(\?.+)?$/', $url, $m)) {
if (!isset($dataId[$m[1]])) {
$dataId[$m[1]] = count($dataId) + 1;
}
$id = $dataId[$m[1]];
$fname = '/'.$pico.'/data/'.$data['id'].'/'.$id.'/'.urldecode($m[2]);
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
if (!file_exists($fpath)) {
MyDumpTool::makeDirectory('public/'.$pico.'/data');
MyDumpTool::makeDirectory('public/'.$pico.'/data/'.$data['id']);
MyDumpTool::makeDirectory('public/'.$pico.'/data/'.$data['id'].'/'.$id);
if (preg_match('/^\//', $url)) {
$url = XOOPS_URL.$url;
}
MyDumpTool::fileDownload($url, $fpath);
}
$url = '/'.$pico.'/data/'.$data['id'].'/'.$id.'/'.$m[2];
}
return '<a '.$matches[1].'href="'.$url.'"'.$matches[3].'>';
}, $content);
$item = [
'id' => $data['id'],
'title' => $data['subject_raw'],
'content' => $content,
];
MyDumpTool::saveJson('public/'.$pico.'/'.$data['id'].'.json', $item);
$confContents[] = [
'id' => $item['id'],
'title' => $data['subject_raw'],
'cat_id' => (int) $data['cat_id'],
'weight' => (int) $data['weight'],
'link' => $link,
];
}
}
$moduleinfo = [
'name' => $module->get('name'),
'dirname' => $pico,
'message' => $moduleConfig['top_message'],
'show_menuinmoduletop' => (int) $moduleConfig['show_menuinmoduletop'],
'show_listasindex' => (int) $moduleConfig['show_listasindex'],
'show_breadcrumbs' => (int) $moduleConfig['show_breadcrumbs'],
'show_pagenavi' => (int) $moduleConfig['show_pagenavi'],
];
MyDumpTool::decode($moduleinfo);
$config[] = [
'module' => $moduleinfo,
'categories' => $confCategories,
'contents' => $confContents,
];
}
-1176
View File
File diff suppressed because it is too large Load Diff
-180
View File
@@ -1,180 +0,0 @@
<?php
define('IMAGE_DIR', '/data/www/html/uploads/mediawiki');
define('DEST_IMAGE_DIR', __DIR__.'/data/public/mediawiki/images');
$contents = json_decode(file_get_contents(__DIR__.'/data/src/mediawiki/assets/contents.json'), true);
MyUtil::makedir(DEST_IMAGE_DIR.'/thumb');
MyUtil::makedir(DEST_IMAGE_DIR.'/math');
foreach ($contents as $content) {
$data = json_decode(file_get_contents(__DIR__.'/temp/mediawiki/'.$content['id'].'.dump.json'), true);
$text = MyUtil::fixHtml($data['text'], $content['id']);
$data2 = [
'title' => $data['title'],
'text' => $text,
];
file_put_contents(__DIR__.'/data/public/mediawiki/contents/'.$content['id'].'.json', json_encode($data2, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}
class MyUtil
{
public static function fixHtml($text, $revid)
{
$text = preg_replace('/<div class="magnify">.+<\/div>/Us', '', $text);
$text = preg_replace_callback('/<a href="\/modules\/mediawiki\/File:([^"]+)" class="image">(.+)<\/a>/Us', function ($m) {
$fpath = MyUtil::getImagePath('/mediawiki/images', urldecode($m[1]));
return '<a href="'.$fpath.'" class="image">'.$m[2].'</a>';
}, $text);
$text = preg_replace_callback('/<img alt="(?:[^"]*)" src="https?:\/\/dynamicbrain\.neuroinf\.jp\/uploads\/mediawiki\/(.)\/(..)\/([^"]+)" width="(\d+)" height="(\d+)" (?:class="thumbimage" )?\/>/Us', function ($m) {
return '<img alt="'.$m[3].'" src="/mediawiki/images/'.$m[1].'/'.$m[2].'/'.$m[3].'" width="'.$m[4].'" height="'.$m[5].'" class="thumbimage" />';
}, $text);
$text = preg_replace_callback('/<img alt="(?:[^"]*)" src="https?:\/\/dynamicbrain\.neuroinf\.jp\/uploads\/mediawiki\/thumb\/(.)\/(..)\/([^\/]+)\/([^"]+)" width="(\d+)" height="(\d+)" (?:class="thumbimage" )?srcset="([^"]+)" \/>/Us', function ($m) {
$bpath = 'thumb/'.$m[1];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$bpath);
$bpath .= '/'.$m[2];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$bpath);
$bpath_ = $bpath.'/'.$m[3];
$bpath .= '/'.urldecode($m[3]);
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$bpath);
$fpath_ = $bpath_.'/'.$m[4];
$fpath = $bpath.'/'.urldecode($m[4]);
MyUtil::fileCopy(IMAGE_DIR.'/'.$fpath, DEST_IMAGE_DIR.'/'.$fpath);
$srcset = [];
foreach (explode(', ', $m[7]) as $src) {
if (preg_match('/^https?:\/\/dynamicbrain\.neuroinf\.jp\/uploads\/mediawiki\/thumb\/(.)\/(..)\/([^\/]+)\/([^ ]+) (.+)$/Us', trim($src), $sm)) {
$sfpath_ = $bpath_.'/'.$sm[4];
$sfpath = $bpath.'/'.urldecode($sm[4]);
MyUtil::fileCopy(IMAGE_DIR.'/'.$sfpath, DEST_IMAGE_DIR.'/'.$sfpath);
$srcset[] = '/mediawiki/images/'.$sfpath_.' '.$sm[5];
}
}
return '<img alt="'.$m[3].'" src="/mediawiki/images/'.$fpath_.'" width="'.$m[5].'" height="'.$m[6].'" class="thumbimage" srcset="'.implode(', ', $srcset).'"/>';
}, $text);
$text = preg_replace_callback('/<a rel="nofollow" class="(?:[^"]+)" href="https?:\/\/dynamicbrain\.neuroinf\.jp\/modules\/xoonips\/([a-z]+\.php)\?([^"]+)">(.+)<\/a>/Us', function ($m) {
parse_str(htmlspecialchars_decode($m[2], ENT_QUOTES), $params);
$url = '';
switch ($m[1]) {
case 'detail.php':
if (isset($params['item_id'])) {
$url = 'item/'.$params['item_id'];
} elseif (isset($params['id'])) {
$url = 'item/id/'.$params['id'];
} else {
var_dump($m);
exit('Unexpected parameter found..');
}
break;
case 'itemselect.php':
if (!isset($params['op'])) {
var_dump($m);
exit('Unexpected url found..');
break;
}
switch ($params['op']) {
case 'quicksearch':
if (!isset($params['keyword'])) {
var_dump($m);
exit('Unexpected url found.. parameter keyword not found');
break;
}
if (!isset($params['search_itemtype'])) {
var_dump($m);
exit('Unexpected url found.. parameter search_itemtype not found');
break;
}
$url = 'search?keyword='.$params['keyword'].'&type='.preg_replace('/^xnp/', '', $params['search_itemtype']);
break;
default:
var_dump($m);
exit('not impremented yet..');
break;
}
break;
default:
var_dump($m);
exit('not impremented yet..');
break;
}
return '<a href="/database/'.$url.'">'.$m[3].'</a>';
}, $text);
$text = preg_replace_callback('/<img class="mwe-math-fallback-png-inline tex" alt="" src="https?:\/\/dynamicbrain.neuroinf.jp\/uploads\/mediawiki\/math\/(.)\/(.)\/(.)\/([^"]+)" \/>/Us', function ($m) {
$fpath = 'math/'.$m[1];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$fpath);
$fpath .= '/'.$m[2];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$fpath);
$fpath .= '/'.$m[3];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$fpath);
$fpath .= '/'.$m[4];
MyUtil::fileCopy(IMAGE_DIR.'/'.$fpath, DEST_IMAGE_DIR.'/'.$fpath);
return '<img class="mwe-math-fallback-png-inline tex" alt="'.$m[4].'" src="/mediawiki/images/'.$fpath.'" />';
}, $text);
$text = preg_replace('/<p>\s*(.*)\s*<\/p>/Us', '<p>\1</p>', $text);
$text = preg_replace_callback('/href="(?:https?:\/\/dynamicbrain\.neuroinf\.jp)?\/modules\/mediawiki\/(?:index.php\/)?([^"]+)"/Us', function ($m) {
return 'href="/mediawiki/'.urlencode(str_replace(' ', '_', $m[1])).'"';
}, $text);
$text = preg_replace_callback('/<a rel="nofollow" class="external text" href="https?:\/\/dynamicbrain\.neuroinf\.jp\/uploads\/mediawiki\/(.)\/(..)\/([^"]+)">/Us', function ($m) {
$fpath = '/'.$m[1];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$fpath);
$fpath .= '/'.$m[2];
MyUtil::makedir(DEST_IMAGE_DIR.'/'.$fpath);
$fpath_ = $fpath.'/'.$m[3];
$fpath .= '/'.urldecode($m[3]);
MyUtil::fileCopy(IMAGE_DIR.'/'.$fpath, DEST_IMAGE_DIR.'/'.$fpath);
return '<a class="download" href="/mediawiki/images'.$fpath_.'" download="'.urldecode($m[3]).'">';
}, $text);
$text = preg_replace('/<a rel="nofollow" class="(?:[^"]+)" href="https?:\/\/dynamicbrain\.neuroinf\.jp\/modules\/xoonips\/registeruser.php">(.+)<\/a>/Us', '\1', $text);
$text = preg_replace('/href="https?:\/\/dynamicbrain\.neuroinf\.jp\/hetero/Us', 'href="/hetero', $text);
$text = preg_replace('/href="https?:\/\/dynamicbrain\.neuroinf\.jp\/modules\/hackathon\//Us', 'href="/hackathon/', $text);
$text = preg_replace('/href="https?:\/\/dynamicbrain\.neuroinf\.jp\/conferences\//Us', 'href="/conferences/', $text);
$text = preg_replace('/href="https?:\/\/dynamicbrain\.neuroinf\.jp\/modules\/documents\/(.*)"/Us', 'href="/documents/\1"', $text);
$text = preg_replace('/https?:\/\/dynamicbrain\.neuroinf\.jp\/modules\/hackathon\//Us', 'https://dynamicbrain.neuroinf.jp/hackathon/', $text);
$text = preg_replace('/<table([^>]*)>(\s)*<tr([^>]*)>/Us', '<table\1><tbody>\2<tr\3>', $text);
$text = preg_replace('/<\/tr>(\s*)<\/table>/s', '</tr></tbody>\1</table>', $text);
$text = trim($text);
if (preg_match('/https?:\/\/dynamicbrain\.neuroinf\.jp/', $text)) {
$okids = [2614];
if (!in_array($revid, $okids)) {
echo $text.PHP_EOL;
die('dynamicbrain internal url link still found: '.$revid.PHP_EOL);
}
}
return $text;
}
public static function makedir($path)
{
if (is_dir($path)) {
return true;
}
if (false === @mkdir($path)) {
exit('Failed to create directroy: '.$path.PHP_EOL);
}
return true;
}
public static function getImagePath($basedir, $fname)
{
$hash = md5($fname);
return $basedir.'/'.substr($hash, 0, 1).'/'.substr($hash, 0, 2).'/'.$fname;
}
public static function fileCopy($from, $to)
{
system('rsync -aq '.escapeshellarg($from).' '.escapeshellarg($to), $ret);
if (0 !== $ret) {
exit('Failed to copy file: '.$from.' -> '.$to.PHP_EOL);
}
return 0 === $ret;
}
}
-465
View File
@@ -1,465 +0,0 @@
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6045,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=25
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=909,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=27
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1648,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=28
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=913,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=29
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1623,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=30
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1620,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=32
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=896,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=33
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2434,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=34
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2441,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=35
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5307,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=37
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?id=943,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=38
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=403,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=39
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=398,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=40
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=350,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=41
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=366,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=43
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=370,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=44
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=361,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=45
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=46
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6110,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=47
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7252867b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=48
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6105,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=49
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2861,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=50
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=16625198b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=51
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6422,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=52
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=19281836b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=53
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7941380b,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=54
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6448,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=55
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6106,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=56
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1027,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=57
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1030,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=58
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1031,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=59
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1033,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=61
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1034,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=62
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1035,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=63
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1036,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=64
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1037,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=65
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1038,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=66
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1041,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=67
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1042,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=68
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1043,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=69
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1044,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=70
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=71
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1046,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=72
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1047,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=73
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1048,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=74
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1051,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=76
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1052,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=77
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1054,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=78
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1056,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=79
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1057,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=80
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1059,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=81
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1060,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=82
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1061,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=83
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1062,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=84
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1064,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=85
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1065,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=86
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1066,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=87
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1067,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=114
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1068,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=116
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1069,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=117
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1071,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=119
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1073,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=121
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1076,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=124
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1077,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=125
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1078,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=126
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1079,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=127
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=296,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=128
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5586,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=129
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=297,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=130
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1080,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=131
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1081,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=132
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1082,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=133
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1084,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=134
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1085,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=135
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1086,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=136
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1087,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=137
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1088,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=138
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1089,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=139
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1098,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=140
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1099,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=141
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1100,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=142
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1101,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=143
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1102,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=144
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1103,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=145
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1105,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=146
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1106,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=147
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1107,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=148
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1108,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=149
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1109,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=150
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1110,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=151
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1111,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=152
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1112,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=153
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1113,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=154
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1114,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=155
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1115,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=156
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1119,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=159
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1120,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=160
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1121,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=161
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1122,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=162
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1123,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=163
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1124,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=164
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1125,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=165
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1127,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=167
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1128,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=168
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1129,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=169
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1130,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=170
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1131,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=171
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1132,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=172
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1134,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=174
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1135,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=175
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1136,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=176
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1137,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=177
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1138,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=178
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1139,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=179
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1140,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=180
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1141,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=181
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1142,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=182
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1143,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=183
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1144,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=184
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1146,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=186
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1147,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=187
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1148,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=188
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1149,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=189
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1150,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=190
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1152,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=192
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1153,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=193
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1154,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=194
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1156,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=195
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1157,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=196
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1159,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=198
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1160,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=199
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1161,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=200
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1162,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=201
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1163,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=202
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1164,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=203
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1165,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=204
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1166,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=205
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1167,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=206
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1168,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=207
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1169,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=208
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1170,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=209
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1171,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=210
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1173,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=212
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1174,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=213
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1175,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=214
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1176,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=215
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1177,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=216
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1178,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=217
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1179,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=218
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1180,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=219
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1181,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=220
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1182,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=221
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1183,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=222
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1184,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=223
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1185,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=224
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1186,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=225
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1187,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=226
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1188,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=227
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1189,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=228
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1190,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=229
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1191,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=230
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1192,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=231
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1193,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=232
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=15929656d,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=233
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=376,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=234
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=298,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=235
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1629,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=236
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1647,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=237
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1209,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=239
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1210,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=240
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1211,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=241
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1212,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=242
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1213,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=243
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1214,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=244
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1215,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=245
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1216,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=246
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1218,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=248
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1219,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=249
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1220,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=250
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1222,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=251
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1223,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=252
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1224,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=253
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1225,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=254
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1226,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=255
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1227,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=256
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1228,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=257
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1230,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=258
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1231,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=259
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1232,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=260
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1233,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=261
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1234,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=262
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1235,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=263
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1236,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=264
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1237,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=265
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1238,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=266
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1239,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=267
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1240,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=268
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1241,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=269
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1242,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=270
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1243,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=271
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1244,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=272
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1245,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=273
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1246,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=274
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1247,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=275
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1248,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=276
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1251,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=279
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1252,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=280
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1255,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=281
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1256,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=282
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1257,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=283
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1258,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=284
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1262,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=286
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1263,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=287
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1264,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=288
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1265,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=289
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1266,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=290
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1268,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=292
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1269,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=293
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1270,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=294
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1271,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=295
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1272,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=296
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1273,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=297
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1278,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=302
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1279,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=303
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1280,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=304
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1281,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=305
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1282,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=306
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1283,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=307
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1284,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=308
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1285,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=309
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1286,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=310
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1287,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=311
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1288,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=312
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1289,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=313
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1291,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=315
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1292,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=316
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1293,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=317
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1294,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=318
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1295,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=319
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1296,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=320
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1298,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=322
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1299,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=323
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1300,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=324
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1302,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=326
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1306,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=330
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1312,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=336
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1313,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=337
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1314,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=338
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1315,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=339
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=162,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=341
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5936,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=342
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/558/weaverWearne06.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=360
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054c,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=367
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1039,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=416
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1040,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=417
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7051,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=444
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=485
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=486
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=487
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=488
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=489
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=490
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=491
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=492
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=493
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1417,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=494
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=496
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=497
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=498
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=499
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=500
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=501
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=502
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=503
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=504
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=505
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1408,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=506
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1406,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=507
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=511
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=514
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=515
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=516
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=517
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=518
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=519
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=520
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=521
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=523
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=524
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=525
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=526
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=527
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=528
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=529
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1373,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=530
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=531
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=532
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=533
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=534
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=535
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=536
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=537
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=538
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=539
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=540
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=541
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=542
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=543
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=544
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=545
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=546
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=547
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=550
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=551
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=552
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=553
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=554
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=555
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=556
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=557
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=558
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=559
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=560
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=562
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=563
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=564
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1379,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=565
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=566
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=567
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=568
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=569
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=571
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=572
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=573
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=574
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=575
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=576
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=577
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=578
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=579
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=580
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=581
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=582
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=583
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=584
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=585
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1400,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=586
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=587
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1402,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=588
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=589
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=590
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=591
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=592
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=593
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=594
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=595
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=596
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=598
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=599
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=600
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=601
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=602
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=603
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=604
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=605
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=606
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1428,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=607
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1429,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=608
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1430,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=609
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1431,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=610
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1432,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=611
visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7252,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=612
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1434,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=613
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1435,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=614
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1450,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=615
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1452,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=616
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1453,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=617
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1454,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=618
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1455,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=619
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1458,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=620
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1460,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=621
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1461,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=622
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1462,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=623
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1463,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=624
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1466,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=625
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1465,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=626
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1467,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=627
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1470,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=628
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1471,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=629
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1472,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=630
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1473,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=631
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1474,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=632
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1476,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=633
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1477,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=634
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1479,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=635
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1481,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=636
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1482,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=637
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1483,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=638
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1486,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=639
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1487,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=640
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1488,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=641
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1489,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=642
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1490,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=643
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1493,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=644
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1496,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=645
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1497,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=646
cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1498,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=647
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/533/SundtEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=656
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/536/baker_etal_JCNS_2010.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=657
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/538/CS56PyModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=659
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/539/TCconvergenceModel.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=660
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/540/BahlEtAl2012.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=661
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/541/ACh_ModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=662
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/543/OLMmodel_r3.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=664
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/548/GentilettiEtAl2016.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=668
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/556/FUS_model.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=677
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/560/ShepherdBrayton1979.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=680
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/561/gc-1.1_r2.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=681
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/564/VladimirovTuTraub2012.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=683
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/565/xiaoshenli.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=684
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/566/kv72-R213QW-mutations_r2.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=685
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/567/Ih_current.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=686
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/569/Schizophr.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=687
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/570/SaudargieneEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=688
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/571/bpap.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=689
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/572/magical7.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=691
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/575/HyunEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=696
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/576/MasurkarChen2011_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=697
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/577/Nakano_FICN_model_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=698
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/582/AshhadNarayanan2013.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=699
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/583/DiFrancescoNoble1985.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=700
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/584/DGC.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=701
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/586/DG_BC.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=703
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/587/DRG_Devor.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=704
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/588/Kv72_ModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=705
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/589/SousaEtAl2014.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=706
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/590/MiglioreEtAl2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=707
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/592/Chloride_Model.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=708
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/593/MiglioreEJN2016_r2.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=709
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/595/Moore2015.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=711
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/597/FFI_CA1_r3.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=713
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/598/stadler2014_layerV_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=714
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/600/2VN.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=716
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/602/Branch_Point_Tapering.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=718
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/604/MenonEtAl2009_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=720
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/606/CA3Atrophy.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=722
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/607/Gorin_et_al_2016.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=723
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/608/Poleg-PolskyDiamond2011.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=724
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/613/Demo.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=728
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/614/ShortEtAl2016.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=729
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/618/Casaleggio2014.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=733
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/623/MiglioreMcTavish2013.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=736
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/624/KimEtAl2017.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=737
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/626/fig1b.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=738
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/627/cortex_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=739
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/629/oltedal.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=741
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/632/ka_rgc.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=744
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/634/na_rgc.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=745
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/636/V1_PFC_ModelDB.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=747
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/640/moore83.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=751
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/642/SpaceClampDemo.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=753
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/644/anderson.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=755
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=756
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=757
cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/647/Watanabe-et-al_2017_r1.zip,http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=758
1 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6045 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=25
2 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=909 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=27
3 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1648 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=28
4 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=913 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=29
5 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1623 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=30
6 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1620 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=32
7 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=896 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=33
8 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2434 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=34
9 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2441 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=35
10 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5307 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=37
11 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?id=943 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=38
12 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=403 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=39
13 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=398 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=40
14 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=350 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=41
15 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=366 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=43
16 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=370 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=44
17 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=361 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=45
18 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054b http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=46
19 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6110 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=47
20 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7252867b http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=48
21 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6105 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=49
22 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2861 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=50
23 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=16625198b http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=51
24 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6422 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=52
25 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=19281836b http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=53
26 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7941380b http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=54
27 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6448 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=55
28 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6106 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=56
29 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1027 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=57
30 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1030 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=58
31 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1031 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=59
32 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1033 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=61
33 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1034 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=62
34 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1035 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=63
35 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1036 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=64
36 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1037 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=65
37 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1038 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=66
38 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1041 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=67
39 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1042 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=68
40 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1043 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=69
41 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1044 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=70
42 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=71
43 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1046 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=72
44 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1047 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=73
45 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1048 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=74
46 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1051 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=76
47 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1052 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=77
48 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1054 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=78
49 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1056 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=79
50 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1057 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=80
51 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1059 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=81
52 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1060 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=82
53 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1061 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=83
54 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1062 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=84
55 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1064 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=85
56 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1065 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=86
57 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1066 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=87
58 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1067 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=114
59 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1068 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=116
60 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1069 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=117
61 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1071 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=119
62 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1073 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=121
63 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1076 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=124
64 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1077 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=125
65 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1078 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=126
66 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1079 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=127
67 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=296 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=128
68 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5586 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=129
69 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=297 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=130
70 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1080 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=131
71 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1081 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=132
72 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1082 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=133
73 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1084 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=134
74 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1085 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=135
75 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1086 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=136
76 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1087 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=137
77 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1088 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=138
78 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1089 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=139
79 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1098 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=140
80 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1099 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=141
81 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1100 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=142
82 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1101 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=143
83 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1102 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=144
84 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1103 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=145
85 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1105 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=146
86 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1106 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=147
87 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1107 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=148
88 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1108 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=149
89 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1109 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=150
90 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1110 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=151
91 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1111 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=152
92 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1112 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=153
93 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1113 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=154
94 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1114 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=155
95 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1115 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=156
96 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1119 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=159
97 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1120 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=160
98 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1121 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=161
99 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1122 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=162
100 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1123 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=163
101 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1124 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=164
102 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1125 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=165
103 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1127 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=167
104 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1128 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=168
105 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1129 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=169
106 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1130 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=170
107 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1131 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=171
108 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1132 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=172
109 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1134 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=174
110 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1135 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=175
111 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1136 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=176
112 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1137 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=177
113 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1138 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=178
114 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1139 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=179
115 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1140 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=180
116 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1141 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=181
117 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1142 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=182
118 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1143 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=183
119 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1144 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=184
120 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1146 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=186
121 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1147 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=187
122 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1148 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=188
123 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1149 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=189
124 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1150 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=190
125 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1152 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=192
126 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1153 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=193
127 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1154 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=194
128 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1156 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=195
129 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1157 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=196
130 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1159 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=198
131 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1160 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=199
132 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1161 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=200
133 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1162 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=201
134 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1163 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=202
135 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1164 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=203
136 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1165 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=204
137 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1166 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=205
138 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1167 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=206
139 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1168 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=207
140 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1169 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=208
141 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1170 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=209
142 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1171 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=210
143 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1173 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=212
144 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1174 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=213
145 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1175 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=214
146 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1176 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=215
147 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1177 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=216
148 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1178 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=217
149 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1179 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=218
150 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1180 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=219
151 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1181 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=220
152 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1182 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=221
153 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1183 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=222
154 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1184 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=223
155 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1185 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=224
156 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1186 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=225
157 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1187 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=226
158 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1188 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=227
159 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1189 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=228
160 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1190 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=229
161 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1191 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=230
162 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1192 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=231
163 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1193 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=232
164 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=15929656d http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=233
165 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=376 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=234
166 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=298 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=235
167 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1629 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=236
168 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1647 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=237
169 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1209 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=239
170 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1210 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=240
171 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1211 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=241
172 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1212 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=242
173 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1213 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=243
174 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1214 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=244
175 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1215 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=245
176 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1216 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=246
177 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1218 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=248
178 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1219 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=249
179 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1220 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=250
180 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1222 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=251
181 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1223 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=252
182 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1224 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=253
183 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1225 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=254
184 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1226 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=255
185 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1227 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=256
186 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1228 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=257
187 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1230 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=258
188 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1231 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=259
189 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1232 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=260
190 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1233 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=261
191 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1234 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=262
192 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1235 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=263
193 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1236 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=264
194 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1237 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=265
195 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1238 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=266
196 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1239 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=267
197 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1240 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=268
198 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1241 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=269
199 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1242 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=270
200 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1243 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=271
201 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1244 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=272
202 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1245 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=273
203 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1246 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=274
204 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1247 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=275
205 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1248 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=276
206 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1251 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=279
207 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1252 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=280
208 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1255 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=281
209 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1256 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=282
210 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1257 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=283
211 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1258 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=284
212 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1262 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=286
213 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1263 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=287
214 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1264 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=288
215 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1265 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=289
216 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1266 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=290
217 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1268 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=292
218 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1269 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=293
219 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1270 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=294
220 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1271 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=295
221 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1272 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=296
222 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1273 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=297
223 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1278 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=302
224 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1279 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=303
225 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1280 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=304
226 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1281 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=305
227 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1282 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=306
228 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1283 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=307
229 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1284 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=308
230 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1285 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=309
231 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1286 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=310
232 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1287 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=311
233 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1288 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=312
234 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1289 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=313
235 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1291 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=315
236 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1292 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=316
237 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1293 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=317
238 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1294 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=318
239 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1295 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=319
240 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1296 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=320
241 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1298 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=322
242 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1299 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=323
243 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1300 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=324
244 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1302 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=326
245 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1306 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=330
246 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1312 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=336
247 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1313 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=337
248 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1314 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=338
249 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1315 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=339
250 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=162 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=341
251 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5936 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=342
252 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/558/weaverWearne06.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=360
253 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054c http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=367
254 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1039 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=416
255 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1040 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=417
256 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7051 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=444
257 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=485
258 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=486
259 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=487
260 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=488
261 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=489
262 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=490
263 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=491
264 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=492
265 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=493
266 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1417 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=494
267 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=496
268 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=497
269 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=498
270 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=499
271 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=500
272 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=501
273 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=502
274 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=503
275 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=504
276 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=505
277 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1408 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=506
278 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1406 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=507
279 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=511
280 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=514
281 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=515
282 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=516
283 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=517
284 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=518
285 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=519
286 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=520
287 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=521
288 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=523
289 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=524
290 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=525
291 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=526
292 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=527
293 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=528
294 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=529
295 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1373 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=530
296 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=531
297 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=532
298 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=533
299 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=534
300 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=535
301 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=536
302 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=537
303 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=538
304 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=539
305 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=540
306 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=541
307 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=542
308 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=543
309 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=544
310 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=545
311 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=546
312 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=547
313 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=550
314 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=551
315 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=552
316 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=553
317 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=554
318 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=555
319 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=556
320 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=557
321 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=558
322 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=559
323 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=560
324 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=562
325 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=563
326 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=564
327 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1379 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=565
328 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=566
329 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=567
330 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=568
331 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=569
332 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=571
333 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=572
334 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=573
335 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=574
336 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=575
337 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=576
338 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=577
339 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=578
340 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=579
341 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=580
342 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=581
343 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=582
344 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=583
345 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=584
346 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=585
347 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1400 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=586
348 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=587
349 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1402 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=588
350 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=589
351 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=590
352 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=591
353 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=592
354 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=593
355 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=594
356 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=595
357 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=596
358 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=598
359 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=599
360 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=600
361 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=601
362 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=602
363 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=603
364 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=604
365 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=605
366 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=606
367 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1428 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=607
368 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1429 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=608
369 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1430 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=609
370 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1431 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=610
371 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1432 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=611
372 visiome https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7252 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=612
373 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1434 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=613
374 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1435 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=614
375 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1450 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=615
376 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1452 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=616
377 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1453 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=617
378 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1454 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=618
379 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1455 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=619
380 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1458 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=620
381 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1460 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=621
382 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1461 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=622
383 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1462 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=623
384 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1463 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=624
385 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1466 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=625
386 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1465 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=626
387 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1467 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=627
388 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1470 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=628
389 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1471 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=629
390 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1472 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=630
391 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1473 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=631
392 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1474 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=632
393 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1476 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=633
394 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1477 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=634
395 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1479 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=635
396 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1481 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=636
397 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1482 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=637
398 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1483 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=638
399 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1486 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=639
400 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1487 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=640
401 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1488 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=641
402 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1489 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=642
403 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1490 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=643
404 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1493 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=644
405 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1496 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=645
406 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1497 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=646
407 cerebellum https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1498 http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=647
408 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/533/SundtEtAl2015.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=656
409 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/536/baker_etal_JCNS_2010.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=657
410 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/538/CS56PyModelDB.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=659
411 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/539/TCconvergenceModel.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=660
412 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/540/BahlEtAl2012.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=661
413 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/541/ACh_ModelDB.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=662
414 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/543/OLMmodel_r3.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=664
415 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/548/GentilettiEtAl2016.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=668
416 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/556/FUS_model.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=677
417 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/560/ShepherdBrayton1979.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=680
418 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/561/gc-1.1_r2.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=681
419 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/564/VladimirovTuTraub2012.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=683
420 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/565/xiaoshenli.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=684
421 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/566/kv72-R213QW-mutations_r2.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=685
422 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/567/Ih_current.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=686
423 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/569/Schizophr.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=687
424 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/570/SaudargieneEtAl2015.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=688
425 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/571/bpap.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=689
426 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/572/magical7.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=691
427 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/575/HyunEtAl2015.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=696
428 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/576/MasurkarChen2011_r1.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=697
429 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/577/Nakano_FICN_model_r1.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=698
430 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/582/AshhadNarayanan2013.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=699
431 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/583/DiFrancescoNoble1985.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=700
432 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/584/DGC.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=701
433 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/586/DG_BC.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=703
434 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/587/DRG_Devor.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=704
435 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/588/Kv72_ModelDB.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=705
436 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/589/SousaEtAl2014.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=706
437 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/590/MiglioreEtAl2015.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=707
438 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/592/Chloride_Model.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=708
439 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/593/MiglioreEJN2016_r2.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=709
440 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/595/Moore2015.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=711
441 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/597/FFI_CA1_r3.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=713
442 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/598/stadler2014_layerV_r1.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=714
443 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/600/2VN.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=716
444 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/602/Branch_Point_Tapering.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=718
445 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/604/MenonEtAl2009_r1.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=720
446 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/606/CA3Atrophy.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=722
447 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/607/Gorin_et_al_2016.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=723
448 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/608/Poleg-PolskyDiamond2011.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=724
449 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/613/Demo.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=728
450 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/614/ShortEtAl2016.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=729
451 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/618/Casaleggio2014.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=733
452 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/623/MiglioreMcTavish2013.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=736
453 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/624/KimEtAl2017.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=737
454 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/626/fig1b.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=738
455 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/627/cortex_r1.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=739
456 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/629/oltedal.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=741
457 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/632/ka_rgc.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=744
458 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/634/na_rgc.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=745
459 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/636/V1_PFC_ModelDB.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=747
460 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/640/moore83.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=751
461 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/642/SpaceClampDemo.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=753
462 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/644/anderson.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=755
463 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=756
464 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=757
465 cns https://cns.neuroinf.jp/modules/fmanager/index.php/view/647/Watanabe-et-al_2017_r1.zip http://sim.neuroinf.jp/modules/xoonips/detail.php?item_id=758
+5 -4
View File
@@ -1,8 +1,8 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" sizes="any" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
@@ -13,11 +13,12 @@
<meta name="keywords" content="neuroinformatics, xoonips, database, dynamic brain platform, dynamic principles of brain functions" />
<meta name="author" content="Neuroinformatics Unit, RIKEN Center for Brain Science" />
<meta name="copyright" content="Copyright &copy; 2019" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="manifest" href="/manifest.json" />
<title>Dynamic Brain Platform - Official Site</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+2104
View File
File diff suppressed because it is too large Load Diff
+41 -62
View File
@@ -1,64 +1,43 @@
{
"name": "dynamicbrain",
"version": "1.0.0",
"private": true,
"dependencies": {
"@types/async-lock": "^1.1.1",
"@types/jest": "26.0.23",
"@types/lokijs": "^1.5.4",
"@types/node": "15.6.1",
"@types/react": "17.0.8",
"@types/react-dom": "17.0.5",
"@types/react-helmet": "^6.1.1",
"@types/react-html-parser": "^2.0.1",
"@types/react-router-dom": "^5.1.7",
"@types/react-router-hash-link": "^2.4.0",
"async-lock": "^1.3.0",
"axios": "^0.21.1",
"lokijs": "^1.5.12",
"moment": "^2.29.1",
"rc-tree": "^4.1.5",
"react": "^17.0.2",
"react-app-polyfill": "^2.0.0",
"react-cookie": "^4.0.3",
"react-dom": "^17.0.2",
"react-ga": "^3.3.0",
"react-helmet": "^6.1.0",
"react-html-parser": "^2.0.2",
"react-image-lightbox": "^5.1.1",
"react-overlays": "^5.0.1",
"react-router-dom": "^5.2.0",
"react-router-hash-link": "^2.4.3",
"react-scripts": "4.0.3",
"react-spinner-material": "^1.1.3",
"react-twitter-widgets": "^1.10.0",
"typescript": "4.3.2",
"xregexp": "^5.0.2"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all",
"ie 11"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version",
"ie 11"
]
},
"devDependencies": {
"less": "^4.1.1"
}
"name": "dynamicbrain",
"version": "2.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview",
"lint": "biome lint",
"format": "biome format --write",
"check": "biome check --write"
},
"dependencies": {
"@dr.pogodin/react-helmet": "^3.2.3",
"@orrisroot/react-html-parser": "^3.0.1",
"async-lock": "^1.4.1",
"date-fns": "^4.4.0",
"ky": "^2.1.0",
"lokijs": "^1.5.12",
"rc-tree": "^5.13.1",
"react": "^19.3.0",
"react-cookie": "^8.1.2",
"react-dom": "^19.3.0",
"react-ga4": "^3.0.1",
"react-overlays": "^5.2.1",
"react-router": "^8.3.1",
"sanitize.css": "^13.0.0",
"yet-another-react-lightbox": "^3.32.2"
},
"devDependencies": {
"@biomejs/biome": "^2.5.13",
"@types/async-lock": "^1.4.2",
"@types/lokijs": "^1.5.14",
"@types/node": "^24.13.4",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"@vitejs/plugin-react": "^6.1.1",
"sirv": "^3.0.2",
"typescript": "~7.0.2",
"vite": "^8.3.0"
}
}
+4 -1
View File
@@ -2,7 +2,10 @@ RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&)
RewriteRule ^modules/xoonips/download.php /database/file/%2? [R=301,L]
RewriteRule ^modules/xoonips/download.php /modules/xoonips/file/%2? [R=301,L]
# File downloads moved under /modules/xoonips/ ; keep the v1.0.0 links alive.
RewriteRule ^database/file/(.*)$ /modules/xoonips/file/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d [OR]
+13 -13
View File
@@ -1,15 +1,15 @@
{
"short_name": "Dynamic Brain Platform",
"name": "Dynamic Brain Platform",
"icons": [
{
"src": "favicon.ico",
"sizes": "32x32 16x16",
"type": "image/x-icon"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
"short_name": "Dynamic Brain Platform",
"name": "Dynamic Brain Platform",
"icons": [
{
"src": "favicon.ico",
"sizes": "32x32 16x16",
"type": "image/x-icon"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
+1 -2
View File
@@ -1,2 +1 @@
@import url('./common/assets/xoops.css');
@import url('./common/assets/theme/style.css');
@import url("./common/assets/theme/style.css");
-9
View File
@@ -1,9 +0,0 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
ReactDOM.unmountComponentAtNode(div);
});
+11 -14
View File
@@ -1,20 +1,17 @@
import React, { Component } from 'react';
import { BrowserRouter } from 'react-router-dom';
import { HelmetProvider } from '@dr.pogodin/react-helmet';
import { CookiesProvider } from 'react-cookie';
import { BrowserRouter } from 'react-router';
import AppRoot from './common/AppRoot';
import './App.css';
class App extends Component {
render() {
return (
<CookiesProvider>
<BrowserRouter>
<AppRoot />
</BrowserRouter>
</CookiesProvider>
);
}
}
const App = () => (
<HelmetProvider>
<CookiesProvider>
<BrowserRouter>
<AppRoot />
</BrowserRouter>
</CookiesProvider>
</HelmetProvider>
);
export default App;
+47 -66
View File
@@ -1,85 +1,66 @@
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 { Helmet } from '@dr.pogodin/react-helmet';
import { useEffect, useRef } from 'react';
import { useCookies } from 'react-cookie';
import ReactGA from 'react-ga4';
import { useLocation } from 'react-router';
import Config, { type MultiLang } from '../config';
import Functions from '../functions';
import CenterColumn from './CenterColumn';
import Footer from './Footer';
import Header from './Header';
import LeftColumn from './LeftColumn';
import Footer from './Footer';
const isAnalyticsEnabled = import.meta.env.PROD && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '';
interface Props extends RouteComponentProps, ReactCookieProps { }
interface State {
lang: MultiLang;
if (isAnalyticsEnabled) {
// Page views are sent from the location effect below, the first one included;
// gtag's own page_view on config would count the landing page twice.
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID, { gtagOptions: { send_page_view: false } });
}
class AppRoot extends Component<Props, State> {
const toMultiLang = (value: unknown): MultiLang | null => (value === 'en' || value === 'ja' ? value : null);
constructor(props: Props) {
super(props);
this.state = { lang: 'en' };
if (process.env.NODE_ENV === 'production' && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') {
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID);
}
}
const AppRoot = () => {
const location = useLocation();
const [cookies, setCookie] = useCookies(['ml_lang']);
const previousLocation = useRef<string | null>(null);
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;
}
const paramLang = toMultiLang(new URLSearchParams(location.search).get('ml_lang'));
const cookieLang = toMultiLang(cookies.ml_lang);
const lang: MultiLang = paramLang ?? cookieLang ?? 'en';
componentDidMount() {
const { pathname } = this.props.location;
if (process.env.NODE_ENV === 'production' && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') {
ReactGA.set({ page: pathname });
ReactGA.pageview(pathname);
useEffect(() => {
if (cookies.ml_lang !== lang) {
setCookie('ml_lang', lang, { path: '/' });
}
}
}, [cookies.ml_lang, lang, setCookie]);
componentDidUpdate(prevProps: Props) {
const { pathname, search } = this.props.location;
if (process.env.NODE_ENV === 'production' && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '') {
ReactGA.set({ page: pathname });
ReactGA.pageview(pathname);
useEffect(() => {
if (isAnalyticsEnabled) {
ReactGA.send({ hitType: 'pageview', page: location.pathname + location.search });
}
if (pathname !== prevProps.location.pathname || search !== prevProps.location.search) {
const current = location.pathname + location.search;
if (previousLocation.current !== null && previousLocation.current !== current) {
window.scrollTo(0, 0);
}
}
previousLocation.current = current;
}, [location.pathname, location.search]);
render() {
const { lang } = this.state;
return (
<div id="page">
<Helmet>
<title>{Functions.siteTitle(lang)} - {Functions.siteSlogan(lang)}</title>
</Helmet>
<Header lang={lang} />
<div id="main" className="clearfix">
<LeftColumn lang={lang} />
<CenterColumn lang={lang} />
</div>
<Footer lang={lang} />
return (
<div id="page">
<Helmet>
<title>
{Functions.siteTitle(lang)} - {Functions.siteSlogan(lang)}
</title>
</Helmet>
<Header lang={lang} />
<div id="main" className="clearfix">
<LeftColumn lang={lang} />
<CenterColumn lang={lang} />
</div>
);
}
}
<Footer lang={lang} />
</div>
);
};
export default withCookies(withRouter(AppRoot));
export default AppRoot;
+22 -18
View File
@@ -1,6 +1,5 @@
import React from 'react';
import { Route, Switch } from 'react-router-dom';
import { MultiLang } from '../config';
import { Route, Routes } from 'react-router';
import type { MultiLang } from '../config';
import Welcome from '../custom/blocks/Welcome';
import Rankings from '../database/blocks/Rankings';
import RecentContents from '../database/blocks/RecentContents';
@@ -25,7 +24,9 @@ const CenterBlocks = (props: Props) => {
<div className="clearfix plate">
<div className="centerLcolumn">
<div className="block">
<div className="blockTitle">{Functions.mlang('[en]XooNIps Rankings[/en][ja]XooNIps ランキング[/ja]', lang)}</div>
<div className="blockTitle">
{Functions.mlang('[en]XooNIps Rankings[/en][ja]XooNIps ランキング[/ja]', lang)}
</div>
<div className="blockContent">
<Rankings lang={lang} />
</div>
@@ -33,33 +34,36 @@ const CenterBlocks = (props: Props) => {
</div>
<div className="centerRcolumn">
<div className="block">
<div className="blockTitle">{Functions.mlang('[en]XooNIps Update[/en][ja]XooNIps アップデート[/ja]', lang)}</div>
<div className="blockTitle">
{Functions.mlang('[en]XooNIps Update[/en][ja]XooNIps アップデート[/ja]', lang)}
</div>
<div className="blockContent">
<RecentContents lang={lang} />
</div>
</div>
</div>
</div>
</>
);
}
};
const CenterColumn = (props: Props) => {
const { lang } = props;
return (
<div className="centercolumn">
<Switch>
<Route exact path="/" render={() => <CenterBlocks lang={lang} />} />
<Route render={() =>
<div className="block plate">
<MainContent lang={lang} />
</div>
} />
</Switch>
<Routes>
<Route path="/" element={<CenterBlocks lang={lang} />} />
<Route
path="*"
element={
<div className="block plate">
<MainContent lang={lang} />
</div>
}
/>
</Routes>
</div>
);
}
};
export default CenterColumn;
export default CenterColumn;
+25 -9
View File
@@ -1,11 +1,10 @@
import React from 'react';
import { MultiLang } from '../config';
import LinkImage from './lib/LinkImage';
import type { MultiLang } from '../config';
import Functions from '../functions';
import bannerPhysiome from './assets/theme/images/banner_physiome.png';
import bannerCBS from './assets/theme/images/banner_riken-cbs.png';
import bannerRIKEN from './assets/theme/images/banner_riken.png';
import bannerCBS from './assets/theme/images/banner_riken-cbs.png';
import bannerXooNIps from './assets/theme/images/banner_xoonips.png';
import LinkImage from './lib/LinkImage';
interface Props {
lang: MultiLang;
@@ -16,16 +15,33 @@ const Footer = (props: Props) => {
return (
<footer id="footer">
<div className="plate">
<div className="copyright">Copyright (C) 2018 Neuroinformatics Unit, RIKEN Center for Brain Science</div>
<div className="copyright">
Copyright (C) 2018 Neuroinformatics Unit, RIKEN Center for Brain Science
</div>
<div className="links">
<LinkImage image={bannerPhysiome} title={'Physiome.jp'} url={'http://www.physiome.jp/'} />
<LinkImage image={bannerRIKEN} title={Functions.mlang('[en]RIKEN[/en][ja]理化学研究所[/ja]', lang)} url={'http://www.riken.jp/'} />
<LinkImage image={bannerCBS} title={Functions.mlang('[en]RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター[/ja]', lang)} url={'https://cbs.riken.jp/'} />
<LinkImage image={bannerXooNIps} title={Functions.mlang('[en]The XooNIps Project[/en][ja]XooNIps 公式サイト[/ja]', lang)} url={'https://xoonips.osdn.jp/'} />
<LinkImage
image={bannerRIKEN}
title={Functions.mlang('[en]RIKEN[/en][ja]理化学研究所[/ja]', lang)}
url={'http://www.riken.jp/'}
/>
<LinkImage
image={bannerCBS}
title={Functions.mlang(
'[en]RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター[/ja]',
lang
)}
url={'https://cbs.riken.jp/'}
/>
<LinkImage
image={bannerXooNIps}
title={Functions.mlang('[en]The XooNIps Project[/en][ja]XooNIps 公式サイト[/ja]', lang)}
url={'https://xoonips.osdn.jp/'}
/>
</div>
</div>
</footer>
);
}
};
export default Footer;
+34 -44
View File
@@ -1,58 +1,48 @@
import React, { ChangeEvent, Component, MouseEvent } from 'react';
import { RouteComponentProps, withRouter, Link } from 'react-router-dom';
import imageJapanNode from '../common/assets/theme/images/icon_jnode.png';
import Config, { MultiLang } from '../config';
import { type ChangeEvent, type MouseEvent, useState } from 'react';
import { Link, useNavigate } from 'react-router';
import Config, { type MultiLang } from '../config';
import ItemUtil from '../database/lib/ItemUtil';
import Functions from '../functions';
import imageJapanNode from './assets/theme/images/icon_jnode.png';
import LinkImage from './lib/LinkImage';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
interface State {
keyword: string;
}
const Header = (props: Props) => {
const { lang } = props;
const navigate = useNavigate();
const [keyword, setKeyword] = useState('');
class Header extends Component<Props, State> {
const handleChangeKeyword = (event: ChangeEvent<HTMLInputElement>) => {
setKeyword(event.target.value);
};
constructor(props: Props) {
super(props);
this.handleChangeKeyword = this.handleChangeKeyword.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.state = { keyword: '' };
}
handleChangeKeyword(event: ChangeEvent<HTMLInputElement>) {
const keyword = event.target.value;
this.setState({ keyword });
}
handleSubmit(event: MouseEvent<HTMLButtonElement>) {
const handleSubmit = (event: MouseEvent<HTMLButtonElement>) => {
event.preventDefault();
const keyword = this.state.keyword.trim();
if (keyword !== '') {
const url = ItemUtil.getSearchByKeywordUrl('all', this.state.keyword);
this.props.history.push(url);
if (keyword.trim() !== '') {
void navigate(ItemUtil.getSearchByKeywordUrl('all', keyword));
}
}
};
render() {
const { lang } = this.props;
const title = Functions.mlang(Config.SITE_TITLE, lang);
return (
<div id="header" className="clearfix">
<div className="left logo">
<Link to="/"><span className="hidden">{title}</span></Link>
</div>
<div className="right">
<input className="searchInput" type="text" value={this.state.keyword} onChange={this.handleChangeKeyword} />
<button className="searchButton" onClick={this.handleSubmit}>Search</button>
<LinkImage image={imageJapanNode} title="INCF Japan Node" url={'https://www.neuroinf.jp/'} />
</div>
const title = Functions.mlang(Config.SITE_TITLE, lang);
return (
<div id="header" className="clearfix">
<div className="left logo">
<Link to="/">
<span className="hidden">{title}</span>
</Link>
</div>
);
}
}
<div className="right">
<input className="searchInput" type="text" value={keyword} onChange={handleChangeKeyword} />
<button type="button" className="searchButton" onClick={handleSubmit}>
Search
</button>
<LinkImage image={imageJapanNode} title="INCF Japan Node" url={'https://www.neuroinf.jp/'} />
</div>
</div>
);
};
export default withRouter(Header);
export default Header;
+32 -22
View File
@@ -1,12 +1,11 @@
import React from 'react';
import { Route, Switch } from 'react-router';
import { Timeline } from 'react-twitter-widgets';
import { MultiLang } from '../config';
import { Route, Routes } from 'react-router';
import type { MultiLang } from '../config';
import CreditsMenu from '../credits/block/CreditsMenu';
import IndexTree from '../database/blocks/IndexTree';
import Functions from '../functions';
import MainMenu from './blocks/MainMenu';
import SelectLang from './blocks/SelectLang';
import TwitterTimeline from './lib/TwitterTimeline';
interface Props {
lang: MultiLang;
@@ -28,31 +27,42 @@ const LeftColumn = (props: Props) => {
</div>
</div>
<div className="block plate">
<div className="blockTitle">{Functions.mlang('[en]Site Information[/en][ja]ウェブサイト情報[/ja]', lang)}</div>
<div className="blockTitle">
{Functions.mlang('[en]Site Information[/en][ja]ウェブサイト情報[/ja]', lang)}
</div>
<div className="blockContent">
<CreditsMenu lang={lang} showAboutUs={false} />
</div>
</div>
<Switch>
<Route exact path="/" render={() =>
<div className="block plate">
<div className="blockTitle">Twitter</div>
<div className="blockContent">
<Timeline dataSource={{ sourceType: 'profile', screenName: 'DynamicBrainPF' }} options={{ height: '600', lang: lang }} />
<Routes>
<Route
path="/"
element={
<div className="block plate">
<div className="blockTitle">Twitter</div>
<div className="blockContent">
<TwitterTimeline lang={lang} screenName="DynamicBrainPF" height={600} />
</div>
</div>
</div>
} />
<Route path="/database" render={() =>
<div className="block plate">
<div className="blockTitle">{Functions.mlang('[en]Index Tree[/en][ja]インデックスツリー[/ja]', lang)}</div>
<div className="blockContent">
<IndexTree lang={lang} />
}
/>
<Route
path="/database/*"
element={
<div className="block plate">
<div className="blockTitle">
{Functions.mlang('[en]Index Tree[/en][ja]インデックスツリー[/ja]', lang)}
</div>
<div className="blockContent">
<IndexTree lang={lang} />
</div>
</div>
</div>
} />
</Switch>
}
/>
<Route path="*" element={null} />
</Routes>
</div>
);
}
};
export default LeftColumn;
+33 -29
View File
@@ -1,50 +1,54 @@
import React from 'react';
import { Redirect, Route, RouteComponentProps, Switch } from 'react-router-dom';
import Config, { MultiLang } from '../config';
import { Navigate, Route, Routes, useParams } from 'react-router';
import Config, { type MultiLang } from '../config';
import Credits from '../credits/Credits';
import CreditsXoopsPathRedirect from '../credits/CreditsXoopsPathRedirect';
import Database from '../database/Database';
import DatabaseXoopsPathRedirect from '../database/DatabaseXoopsPathRedirect';
import MediaWikiUtils from '../mediawiki/lib/MediaWikiUtils';
import MediaWiki from '../mediawiki/MediaWiki';
import MediaWikiXoopsPathRedirect from '../mediawiki/MediaWikiXoopsPathRedirect';
import Pico from '../pico/Pico';
import PicoXoopsPathRedirect from '../pico/PicoXoopsPathRedirect';
import XoopsPathRedirect from './XoopsPathRedirect';
interface Props {
lang: MultiLang;
}
const MediaWikiRoute = (props: Props) => {
const { name = '' } = useParams<{ name?: string }>();
return <MediaWiki lang={props.lang} name={name} />;
};
const MainContent = (props: Props) => {
const { lang } = props;
return (
<div className="mainContent">
<Switch>
<Route path="/database" render={() => <Database {...props} />} />
<Route path="/credits" render={() => <Credits lang={lang} />} />
{Config.PICO_MODULES.map((name) =>
<Route key={name} path={'/' + name} render={() => <Pico lang={lang} name={name} />} />
)}
<Route exact path="/mediawiki" render={() => {
const name = lang === 'en' ? 'Main_Page' : 'メインページ';
return <Redirect to={'/mediawiki/' + name} />;
}} />
<Route path="/mediawiki/:name" render={(props: RouteComponentProps<{ name: string }>) => {
const { match } = props;
const { params } = match;
const name = params.name;
return <MediaWiki lang={lang} name={name} />;
}} />
<Route path="/modules/xoonips" render={() => <DatabaseXoopsPathRedirect lang={lang} />} />
<Route path="/modules/credits" render={() => <CreditsXoopsPathRedirect lang={lang} />} />
{Config.PICO_MODULES.map((name) =>
<Route key={name} path={'/' + name} render={() => <Pico lang={lang} name={name} />} />
)}
<Route path="/modules/mediawiki" render={() => <MediaWikiXoopsPathRedirect lang={lang} />} />
<Route component={XoopsPathRedirect} />
</Switch>
<Routes>
<Route path="/database/*" element={<Database lang={lang} />} />
<Route path="/credits/*" element={<Credits lang={lang} />} />
{Config.PICO_MODULES.map((name) => (
<Route key={name} path={`/${name}/*`} element={<Pico lang={lang} name={name} />} />
))}
<Route
path="/mediawiki"
element={<Navigate to={`/mediawiki/${MediaWikiUtils.getMainPageName(lang)}`} replace />}
/>
<Route path="/mediawiki/:name" element={<MediaWikiRoute lang={lang} />} />
<Route path="/modules/xoonips/*" element={<DatabaseXoopsPathRedirect lang={lang} />} />
<Route path="/modules/credits/*" element={<CreditsXoopsPathRedirect lang={lang} />} />
{Config.PICO_MODULES.map((name) => (
<Route
key={name}
path={`/modules/${name}/*`}
element={<PicoXoopsPathRedirect lang={lang} name={name} />}
/>
))}
<Route path="/modules/mediawiki/*" element={<MediaWikiXoopsPathRedirect lang={lang} />} />
<Route path="*" element={<XoopsPathRedirect lang={lang} />} />
</Routes>
</div>
);
}
};
export default MainContent;
+20 -30
View File
@@ -1,40 +1,30 @@
import React, { Component } from 'react';
import { Redirect, RouteComponentProps } from 'react-router';
import { MultiLang } from '../config';
import { Navigate, useLocation } from 'react-router';
import type { MultiLang } from '../config';
import PageNotFound from './lib/PageNotFound';
interface Params {
module: string;
pathname: string;
}
interface Props extends RouteComponentProps<Params> {
interface Props {
lang: MultiLang;
}
class XoopsPathRedirect extends Component<Props> {
getRedirectUrl() {
const { pathname } = this.props.location;
switch (pathname || '') {
case '/index.php': {
return '/';
}
}
return '';
const getRedirectUrl = (pathname: string): string => {
switch (pathname || '') {
case '/index.php':
return '/';
}
return '';
};
render() {
const { lang } = this.props;
if (this.props.location.pathname === '/') {
return null;
}
const url = this.getRedirectUrl();
if (url === '') {
return <PageNotFound lang={lang} />;
}
return <Redirect to={url} />;
const XoopsPathRedirect = (props: Props) => {
const { lang } = props;
const location = useLocation();
if (location.pathname === '/') {
return null;
}
}
const url = getRedirectUrl(location.pathname);
if (url === '') {
return <PageNotFound lang={lang} />;
}
return <Navigate to={url} replace />;
};
export default XoopsPathRedirect;
+9
View File
@@ -99,6 +99,8 @@ th {
.plate {
background-image: url(images/plate.png);
/* sanitize.css turns background repeating off; the plate texture tiles */
background-repeat: repeat;
border-left: 3px solid #999;
border-right: 3px solid #999;
color: #000;
@@ -310,3 +312,10 @@ ul.mainmenu {
overflow: hidden;
text-overflow: ellipsis;
}
/* sanitize.css forms.css leaves form controls transparent; keep the language
selector on white. */
.leftcolumn .blockContent select {
background-color: #ffffff;
color: #000000;
}
+62 -17
View File
@@ -1,17 +1,62 @@
img {border: 0;}
#xoopsHiddenText {visibility: hidden; color: #000000; font-weight: normal; font-style: normal; text-decoration: none;}
.pagneutral {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagneutral.gif);}
.pagact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/pagact.gif);}
.paginact {font-size: 10px; width: 16px; height: 19px;text-align: center; background-image: url(./images/paginact.gif);}
#mainmenu a {text-align:left; display: block; margin: 0; padding: 4px;}
#mainmenu a.menuTop {padding-left: 3px;}
#mainmenu a.menuMain {padding-left: 3px;}
#mainmenu a.menuSub {padding-left: 9px;}
#usermenu a {text-align:left; display: block; margin: 0; padding: 4px;}
#usermenu a.menuTop {}
#usermenu a.highlight {color: #0000ff; background-color: #fcc;}
img {
border: 0;
}
#xoopsHiddenText {
visibility: hidden;
color: #000000;
font-weight: normal;
font-style: normal;
text-decoration: none;
}
.pagneutral {
font-size: 10px;
width: 16px;
height: 19px;
text-align: center;
background-image: url(./images/pagneutral.gif);
}
.pagact {
font-size: 10px;
width: 16px;
height: 19px;
text-align: center;
background-image: url(./images/pagact.gif);
}
.paginact {
font-size: 10px;
width: 16px;
height: 19px;
text-align: center;
background-image: url(./images/paginact.gif);
}
#mainmenu a {
text-align: left;
display: block;
margin: 0;
padding: 4px;
}
#mainmenu a.menuTop {
padding-left: 3px;
}
#mainmenu a.menuMain {
padding-left: 3px;
}
#mainmenu a.menuSub {
padding-left: 9px;
}
#usermenu a {
text-align: left;
display: block;
margin: 0;
padding: 4px;
}
#usermenu a.menuTop {
}
#usermenu a.highlight {
color: #0000ff;
background-color: #fcc;
}
+18 -14
View File
@@ -1,6 +1,5 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config.js';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import mainMenus from '../assets/main-menu.json';
@@ -12,17 +11,22 @@ const MainMenu = (props: Props) => {
const { lang } = props;
const links = mainMenus.map((item, idx) => {
const title = Functions.mlang(item.title, lang);
const style = idx === 0 ? "menuTop" : "menuMain";
const link = item.link.match(/^https?:\/\//) ?
<a className={style} href={item.link} target="_blank" rel="noopener noreferrer">{title}</a> :
<Link className={style} to={item.link}>{title}</Link>;
return <li key={idx}>{link}</li>
const style = idx === 0 ? 'menuTop' : 'menuMain';
return (
<li key={item.link}>
{/^https?:\/\//.test(item.link) ? (
<a className={style} href={item.link} target="_blank" rel="noopener noreferrer">
{title}
</a>
) : (
<Link className={style} to={item.link}>
{title}
</Link>
)}
</li>
);
});
return (
<ul className="mainmenu">
{links}
</ul>
);
}
return <ul className="mainmenu">{links}</ul>;
};
export default MainMenu;
+23 -16
View File
@@ -1,13 +1,14 @@
import React from 'react';
import { RouteComponentProps, withRouter } from 'react-router';
import { MultiLang } from '../../config';
import { useLocation, useNavigate } from 'react-router';
import type { MultiLang } from '../../config';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
const SelectLang = (props: Props) => {
const { lang, history } = props;
const { lang } = props;
const location = useLocation();
const navigate = useNavigate();
const langs: MultiLang[] = ['en', 'ja'];
const titles = {
en: 'English',
@@ -15,20 +16,26 @@ const SelectLang = (props: Props) => {
};
return (
<div>
<select value={lang} onChange={(e) => {
const xlang = e.target.value;
const params = new URLSearchParams(history.location.search);
params.set('ml_lang', xlang);
const url = history.location.pathname + '?' + params.toString();
history.push(url);
}}>
<select
value={lang}
onChange={(e) => {
const xlang = e.target.value;
const params = new URLSearchParams(location.search);
params.set('ml_lang', xlang);
const url = `${location.pathname}?${params.toString()}`;
navigate(url);
}}
>
{langs.map((xlang) => {
return <option key={xlang} value={xlang}>{titles[xlang]}</option>;
return (
<option key={xlang} value={xlang}>
{titles[xlang]}
</option>
);
})}
</select>
</div>
);
}
};
export default withRouter(SelectLang);
export default SelectLang;
+53
View File
@@ -0,0 +1,53 @@
import type { ComponentProps, MouseEvent } from 'react';
import { Link, type To } from 'react-router';
type LinkProps = ComponentProps<typeof Link>;
const RETRY_INTERVAL_MS = 16;
const RETRY_COUNT = 20;
const hashOf = (to: To): string => {
if (typeof to === 'string') {
const idx = to.indexOf('#');
return idx === -1 ? '' : to.slice(idx + 1);
}
return (to.hash ?? '').replace(/^#/, '');
};
const scrollToHash = (hash: string, remaining = RETRY_COUNT) => {
if (hash === '') {
return;
}
const id = decodeURIComponent(hash);
const target = document.getElementById(id) ?? document.querySelector(`[name="${CSS.escape(id)}"]`);
if (target !== null) {
target.scrollIntoView();
return;
}
// The target may not be in the DOM yet (pico pages fetch their content).
if (remaining > 0) {
setTimeout(() => {
scrollToHash(hash, remaining - 1);
}, RETRY_INTERVAL_MS);
}
};
/**
* A `<Link>` that also scrolls to the element named by the URL fragment.
* Replaces `react-router-hash-link`, which is unmaintained and still targets react-router v5.
*/
const HashLink = ({ onClick, to, ...rest }: LinkProps) => {
const handleClick = (e: MouseEvent<HTMLAnchorElement>) => {
onClick?.(e);
if (e.defaultPrevented) {
return;
}
// Let react-router commit the navigation before looking for the target.
setTimeout(() => {
scrollToHash(hashOf(to));
}, 0);
};
return <Link {...rest} to={to} onClick={handleClick} />;
};
export default HashLink;
+14 -11
View File
@@ -1,11 +1,9 @@
import React from 'react';
import { RouteComponentProps, withRouter } from 'react-router';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config';
import { Link, useLocation } from 'react-router';
import type { MultiLang } from '../../config';
import mlangEnglish from '../assets/images/mlang_english.gif';
import mlangJapanese from '../assets/images/mlang_japanese.gif';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
@@ -23,16 +21,21 @@ const langResources = {
const LangFlag = (props: Props) => {
const { lang } = props;
const params = new URLSearchParams(props.location.search);
const location = useLocation();
const params = new URLSearchParams(location.search);
const flagLang = lang === 'en' ? 'ja' : 'en';
params.set('ml_lang', flagLang);
const url = props.location.pathname + '?' + params.toString();
const url = `${location.pathname}?${params.toString()}`;
return (
<Link style={styleLink} to={url}>
<img style={styleImage} src={langResources[flagLang].image} alt={langResources[flagLang].title} title={langResources[flagLang].title}/>
<img
style={styleImage}
src={langResources[flagLang].image}
alt={langResources[flagLang].title}
title={langResources[flagLang].title}
/>
</Link>
);
}
};
export default withRouter(LangFlag);
export default LangFlag;
+20 -7
View File
@@ -1,5 +1,5 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Component } from 'react';
import { Link } from 'react-router';
interface Props {
url: string;
@@ -13,7 +13,6 @@ interface State {
}
class LinkImage extends Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
@@ -26,14 +25,14 @@ class LinkImage extends Component<Props, State> {
handleMouseOver() {
const { imageHover } = this.props;
if (typeof imageHover !== 'undefined') {
this.setState({ image: imageHover })
this.setState({ image: imageHover });
}
}
handleMouseOut() {
const { image: imageNormal, imageHover } = this.props;
if (typeof imageHover !== 'undefined') {
this.setState({ image: imageNormal })
this.setState({ image: imageNormal });
}
}
@@ -42,13 +41,27 @@ class LinkImage extends Component<Props, State> {
const image = <img style={{ verticalAlign: 'middle' }} src={this.state.image} alt={title} title={title} />;
if (url.match(/^(\/|\.)/) === null) {
return (
<a href={url} target="_blank" rel="noopener noreferrer" onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<a
href={url}
target="_blank"
rel="noopener noreferrer"
onMouseOver={this.handleMouseOver}
onMouseOut={this.handleMouseOut}
onFocus={this.handleMouseOver}
onBlur={this.handleMouseOut}
>
{image}
</a>
);
}
return (
<Link to={url} onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
<Link
to={url}
onMouseOver={this.handleMouseOver}
onMouseOut={this.handleMouseOut}
onFocus={this.handleMouseOver}
onBlur={this.handleMouseOut}
>
{image}
</Link>
);
+27
View File
@@ -0,0 +1,27 @@
.container {
display: flex;
justify-content: center;
align-content: center;
margin: 100px 0;
}
.spinner {
width: 120px;
height: 120px;
border: 8px solid #eeeeee;
border-top-color: #cccccc;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: reduce) {
.spinner {
animation-duration: 4s;
}
}
+7 -10
View File
@@ -1,12 +1,9 @@
import React from 'react';
import Spinner from 'react-spinner-material';
import styles from './Loading.module.css';
const Loading = () => {
return (
<div style={{ display: 'flex', justifyContent: 'center', alignContent: 'center', margin: '100px 0' }}>
<Spinner radius={60} color={'#cccccc'} stroke={8} visible={true} />
</div>
);
}
const Loading = () => (
<div className={styles.container}>
<div className={styles.spinner} role="status" aria-label="Loading" />
</div>
);
export default Loading;
export default Loading;
+5 -5
View File
@@ -1,5 +1,4 @@
import React from 'react';
import { MultiLang } from '../../config';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
interface Props {
@@ -8,8 +7,9 @@ interface Props {
const NoticeSiteHasBeenArchived = (props: Props) => {
const { lang } = props;
const notice = '[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]';
const notice =
'[en]This site has been archived since FY2019 and is no longer updated.[/en][ja]このサイトは、2019年度よりアーカイブサイトとして運用されています。[/ja]';
return <p style={{ color: 'red' }}>{Functions.mlang(notice, lang)}</p>;
}
};
export default NoticeSiteHasBeenArchived;
export default NoticeSiteHasBeenArchived;
+34 -42
View File
@@ -1,52 +1,44 @@
import React, { Component } from 'react';
import { Helmet } from 'react-helmet';
import { RouteComponentProps, withRouter } from 'react-router';
import { MultiLang } from '../../config';
import { Helmet } from '@dr.pogodin/react-helmet';
import { useEffect } from 'react';
import { useLocation, useNavigate } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
class PageNotFound extends Component<Props> {
const TOP_URL = '/';
private url = '/';
private timer: NodeJS.Timer | null = null;
const PageNotFound = (props: Props) => {
const { lang } = props;
const location = useLocation();
const navigate = useNavigate();
goToTopPage() {
if (this.props.location.pathname !== '/') {
if (this.timer) {
clearTimeout(this.timer);
}
this.timer = setTimeout(() => {
this.timer = null;
this.props.history.push(this.url);
}, 5000);
useEffect(() => {
if (location.pathname === TOP_URL) {
return;
}
}
const timer = setTimeout(() => {
void navigate(TOP_URL);
}, 5000);
return () => clearTimeout(timer);
}, [location.pathname, navigate]);
componentWillUnmount() {
if (this.timer) {
clearTimeout(this.timer);
}
}
return (
<div>
<Helmet>
<title>Page Not Found - {Functions.siteTitle(lang)}</title>
</Helmet>
<h1>Page Not Found</h1>
<section>
<p>The page you were trying to access doesn't exist.</p>
<p>
If the page does not automatically reload, please go to the <a href={TOP_URL}>top page</a>
</p>
</section>
</div>
);
};
render() {
const { lang } = this.props;
this.goToTopPage();
return (
<div>
<Helmet>
<title>Page Not Found - {Functions.siteTitle(lang)}</title>
</Helmet>
<h1>Page Not Found</h1>
<section>
<p>The page you were trying to access doesn't exist.</p>
<p>If the page does not automatically reload, please click <a href={this.url}>here</a></p>
</section>
</div>
);
}
}
export default withRouter(PageNotFound);
export default PageNotFound;
+57
View File
@@ -0,0 +1,57 @@
import { useEffect, useRef } from 'react';
import type { MultiLang } from '../../config';
interface Props {
lang: MultiLang;
screenName: string;
height: number;
}
interface TwitterWidgets {
widgets: { load: (element?: HTMLElement) => void };
}
declare global {
interface Window {
twttr?: TwitterWidgets;
}
}
const WIDGETS_URL = 'https://platform.twitter.com/widgets.js';
/**
* The embedded profile timeline, rendered by Twitter's own widgets.js: the
* script turns the anchor into the timeline, and the anchor stays a plain link
* to the profile if the script cannot load.
*/
const TwitterTimeline = (props: Props) => {
const { lang, screenName, height } = props;
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const container = ref.current;
if (container === null) {
return;
}
container.innerHTML = '';
const anchor = document.createElement('a');
anchor.className = 'twitter-timeline';
anchor.href = `https://twitter.com/${screenName}`;
anchor.dataset.height = String(height);
anchor.dataset.lang = lang;
anchor.textContent = `Tweets by ${screenName}`;
container.appendChild(anchor);
if (window.twttr) {
window.twttr.widgets.load(container);
} else if (document.querySelector(`script[src="${WIDGETS_URL}"]`) === null) {
const script = document.createElement('script');
script.src = WIDGETS_URL;
script.async = true;
document.body.appendChild(script);
}
}, [lang, screenName, height]);
return <div ref={ref} />;
};
export default TwitterTimeline;
+6 -8
View File
@@ -1,8 +1,7 @@
import React from 'react';
import { MultiLang } from '../../config';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import imageRank2 from '../assets/images/rank3dbf8e94a6f72.gif';
import imageRank3 from '../assets/images/rank3dbf8e9e7d88d.gif';
import imageRank2 from '../assets/images/rank3dbf8e94a6f72.gif';
import imageRank4 from '../assets/images/rank3dbf8ea81e642.gif';
import imageRank5 from '../assets/images/rank3dbf8eb1a72e7.gif';
import imageRank6 from '../assets/images/rank3dbf8edf15093.gif';
@@ -19,7 +18,7 @@ const userRanks = [
{ title: '[en]Just popping in[/en][ja]新米[/ja]', min: 0, max: 20, special: false, image: imageRank1 },
{ title: '[en]Not too shy to talk[/en][ja]半人前[/ja]', min: 21, max: 40, special: false, image: imageRank2 },
{ title: '[en]Quite a regular[/en][ja]常連[/ja]', min: 41, max: 70, special: false, image: imageRank3 },
{ title: '[en]Just can\'t stay away[/en][ja]一人前[/ja]', min: 71, max: 150, special: false, image: imageRank4 },
{ title: "[en]Just can't stay away[/en][ja]一人前[/ja]", min: 71, max: 150, special: false, image: imageRank4 },
{ title: '[en]Home away from home[/en][ja]長老[/ja]', min: 151, max: 10000, special: false, image: imageRank5 },
{ title: '[en]Moderator[/en][ja]モデレータ[/ja]', min: 0, max: 0, special: true, image: imageRank6 },
{ title: '[en]Webmaster[/en][ja]管理人[/ja]', min: 0, max: 0, special: true, image: imageRank7 },
@@ -35,11 +34,10 @@ const UserRankStarImage = (props: Props) => {
return false;
});
return typeof rank !== 'undefined' ? rank : userRanks[0];
}
};
const userRank = rank > 0 && rank <= 7 ? userRanks[rank - 1] : findRank(posts);
const title = Functions.mlang(userRank.title, lang);
return <img src={userRank.image} alt={title} title={title} />;
}
};
export default UserRankStarImage;
export default UserRankStarImage;
+95 -69
View File
@@ -1,8 +1,14 @@
import React, { ReactElement } from 'react';
import ReactHtmlParser, { convertNodeToElement } from 'react-html-parser';
import { HashLink } from 'react-router-hash-link';
import { MultiLang } from '../../config';
import ReactHtmlParser, {
convertNodeToElement,
type DomElement,
type DomNode,
type Transform,
} from '@orrisroot/react-html-parser';
import type { CSSProperties } from 'react';
import { useLocation } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import HashLink from './HashLink';
interface Props {
lang: MultiLang;
@@ -16,101 +22,121 @@ interface Props {
const preConvertXCode = (text: string, doxcode: boolean): string => {
if (doxcode) {
return text.replace(/\[code\](.*)\[\/code\]/sg, (m0, m1) => {
return '[code]' + Functions.base64Encode(m1) + '[/code]';
return text.replace(/\[code\](.*)\[\/code\]/gs, (_m0, m1) => {
return `[code]${Functions.base64Encode(m1)}[/code]`;
});
}
return text;
}
};
const postConvertXCode = (text: string, doxcode: boolean, doimage: boolean): string => {
if (doxcode) {
return text.replace(/\[code\](.*)\[\/code\]/sg, (m0, m1) => {
return text.replace(/\[code\](.*)\[\/code\]/gs, (_m0, m1) => {
const text = convertXCode(Functions.htmlspecialchars(Functions.base64Decode(m1)), doimage);
return '<div class="xoopsCode"><pre><code>' + text + '</code></pre></div>';
return `<div class="xoopsCode"><pre><code>${text}</code></pre></div>`;
});
}
return text;
}
};
const convertClickable = (text: string) => {
text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g, (...matches) => {
return matches[1] + '<a href="' + matches[2] + '" target="_blank" rel="external noopener noreferrer">' + matches[2] + '</a>';
});
text = text.replace(/(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g, (...matches) => {
return matches[1] + '<a href="mailto:' + matches[2] + '">' + matches[2] + '</a>';
});
text = text.replace(
/(^|[^\]_a-zA-Z0-9-="'/]+)((?:https?|ftp)(?::\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+[a-zA-Z0-9=]))/g,
(...matches) => {
return (
matches[1] +
'<a href="' +
matches[2] +
'" target="_blank" rel="external noopener noreferrer">' +
matches[2] +
'</a>'
);
}
);
text = text.replace(
/(^|[^\]_a-zA-Z0-9-="'/:.]+)([a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+)/g,
(...matches) => {
return `${matches[1]}<a href="mailto:${matches[2]}">${matches[2]}</a>`;
}
);
return text;
}
};
const convertXCode = (text: string, doimage: boolean): string => {
const convertXCode = (text: string, _doimage: boolean): string => {
// TODO: implement
return text;
}
};
const convertSmiley = (text: string) => {
// TODO: implement
return text;
}
};
const convertBr = (text: string): string => {
return text.replace(/(\r?\n|\r)/g, '<br />');
}
};
interface TransformParsedNode {
type: string;
next: object | null;
prev: object | null;
parent: object | null;
name: string;
attribs: any;
children: object[];
data: string;
}
const cssConvert = (text: string): object => {
const ret: any = {};
const cssConvert = (text: string): CSSProperties => {
const ret: Record<string, string> = {};
text.split(';').forEach((line) => {
const line_ = line.trim();
if (line.length === 0) {
if (line_.length === 0) {
return;
}
const kv = line_.split(':');
const key = Functions.camelCase(kv[0].trim());
const value = kv[1].trim();
ret[key] = value;
})
return ret;
}
const transform = (node: object, idx: number): ReactElement | null | void => {
const node_ = node as TransformParsedNode;
if (node_.type === 'tag' && node_.name === 'a') {
const url = (node_.attribs && node_.attribs['href']) || '/';
const download = (node_.attribs && node_.attribs['download']) || '';
const rel = (node_.attribs && node_.attribs['rel']) || '';
const klass = (node_.attribs && node_.attribs['class']) || '';
const isFile = download !== '' || /\.(zip|pdf|png|gif|jpg)$/.test(url);
const isExternal = /external/.test(rel) || /external/.test(klass) || /^(mailto|https?:?\/\/)/.test(url);
if (!isFile && !isExternal) {
const style = (node_.attribs && node_.attribs['style']) || '';
const title = (node_.attribs && node_.attribs['title']) || null;
return <HashLink key={idx} to={url} style={cssConvert(style)} title={title}>
{node_.children.map((value: object, index: number) => {
return convertNodeToElement(value, index, transform);
})}
</HashLink>;
if (kv.length < 2) {
return;
}
}
if (node_.type === 'tag' && node_.name === 'img') {
const src = (node_.attribs && node_.attribs['src']) || '';
node_.attribs['src'] = src.replace('`XOOPS_URL`', process.env.PUBLIC_URL);
return convertNodeToElement(node_ as object, idx, transform);
}
}
ret[Functions.camelCase(kv[0].trim())] = kv.slice(1).join(':').trim();
});
return ret as CSSProperties;
};
/**
* Stored content links are written relative to the page that contains them
* (`node4.html`, `manual.html#SECTION1`, ...), so they have to be resolved the
* way a browser resolves an `href`. react-router would instead resolve them
* against the whole current pathname, turning `/manual_ja/node3.html` +
* `node4.html` into `/manual_ja/node3.html/node4.html`.
*/
const resolveUrl = (href: string, basePath: string): string => {
const url = new URL(href, window.location.origin + basePath);
return url.pathname + url.search + url.hash;
};
const makeTransform = (basePath: string): Transform => {
const transform: Transform = (node: DomNode, idx: number | string) => {
if (node.type !== 'tag') {
return undefined;
}
const element = node as DomElement;
if (element.name !== 'a') {
return undefined;
}
const url = element.attribs?.href;
const download = element.attribs?.download || '';
const rel = element.attribs?.rel || '';
const klass = element.attribs?.class || '';
// Downloads, links to files and links marked external leave the app.
const isFile = download !== '' || /\.(zip|pdf|png|gif|jpg)$/.test(url || '');
const isExternal = !url || /external/.test(rel) || /external/.test(klass) || /^(mailto|https?:?\/\/)/.test(url);
if (isFile || isExternal) {
return undefined;
}
const style = element.attribs?.style || '';
const title = element.attribs?.title || '';
return (
<HashLink key={idx} to={resolveUrl(url, basePath)} style={cssConvert(style)} title={title}>
{element.children.map((child, index) => convertNodeToElement(child, index, transform))}
</HashLink>
);
};
return transform;
};
const XoopsCode = (props: Props) => {
const { lang } = props;
const { pathname } = useLocation();
let text = props.text;
const dohtml = !!props.dohtml;
const dosmiley = !!props.dosmiley;
@@ -133,7 +159,7 @@ const XoopsCode = (props: Props) => {
}
text = postConvertXCode(text, doxcode, doimage);
text = Functions.mlang(text, lang);
return <div>{ReactHtmlParser(text, { transform })}</div>;
}
return <div>{ReactHtmlParser(text, { transform: makeTransform(pathname) })}</div>;
};
export default XoopsCode;
export default XoopsCode;
+24 -3
View File
@@ -1,9 +1,29 @@
const SITE_TITLE = 'Dynamic Brain Platform';
const SITE_SLOGAN = 'Official Site';
const GOOGLE_ANALYTICS_TRACKING_ID = 'UA-23709948-1';
const XOONIPS_ITEMTYPES = ['model', 'data', 'tool', 'book', 'paper', 'conference', 'url', 'presentation', 'simulator', 'stimulus', 'memo', 'files', 'binder'];
// Replaces the Universal Analytics property (UA-23709948-1), shut down in 2023.
const GOOGLE_ANALYTICS_TRACKING_ID = 'G-HZHCC88CP2';
const XOONIPS_ITEMTYPES = [
'model',
'data',
'tool',
'book',
'paper',
'conference',
'url',
'presentation',
'simulator',
'stimulus',
'memo',
'files',
'binder',
];
const PICO_MODULES = ['documents', 'hackathon'];
// Vite's BASE_URL always carries a trailing slash ('/' when the app is served
// from the document root). Strip it so it can be concatenated the same way
// CRA's Config.BASE_URL was.
const BASE_URL = import.meta.env.BASE_URL.replace(/\/$/, '');
export type MultiLang = 'en' | 'ja';
const Config = {
@@ -12,6 +32,7 @@ const Config = {
GOOGLE_ANALYTICS_TRACKING_ID,
XOONIPS_ITEMTYPES,
PICO_MODULES,
}
BASE_URL,
};
export default Config;
+12 -11
View File
@@ -1,8 +1,7 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { Route, RouteComponentProps, Switch } from 'react-router-dom';
import { Helmet } from '@dr.pogodin/react-helmet';
import { Route, Routes } from 'react-router';
import PageNotFound from '../common/lib/PageNotFound';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
import CreditsAboutUs from './CreditsAboutUs';
import CreditsPage from './CreditsPage';
@@ -17,15 +16,17 @@ const Credits = (props: Props) => {
return (
<>
<Helmet>
<title>{CreditsUtils.getTitle(lang)} - {Functions.siteTitle(lang)}</title>
<title>
{CreditsUtils.getTitle(lang)} - {Functions.siteTitle(lang)}
</title>
</Helmet>
<Switch>
<Route exact path="/credits" render={() => <CreditsAboutUs {...props} />} />
<Route exact path="/credits/:id" render={(props: RouteComponentProps<{ id: string }>) => <CreditsPage lang={lang} {...props} />} />
<Route component={PageNotFound} />
</Switch>
<Routes>
<Route index element={<CreditsAboutUs lang={lang} />} />
<Route path=":id" element={<CreditsPage lang={lang} />} />
<Route path="*" element={<PageNotFound lang={lang} />} />
</Routes>
</>
);
}
};
export default Credits;
+3 -4
View File
@@ -1,9 +1,8 @@
import React from 'react';
import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived';
import XoopsCode from '../common/lib/XoopsCode';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
import CreditsUtil from './lib/CreditsUtils';
import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived';
interface Props {
lang: MultiLang;
@@ -19,6 +18,6 @@ const CreditsAboutUs = (props: Props) => {
<XoopsCode lang={lang} text={CreditsUtil.getAboutUsContent()} dohtml={true} />
</>
);
}
};
export default CreditsAboutUs;
+18 -18
View File
@@ -1,29 +1,24 @@
import moment from 'moment';
import React from 'react';
import { RouteComponentProps } from 'react-router';
import { Helmet } from '@dr.pogodin/react-helmet';
import { format } from 'date-fns';
import { useParams } from 'react-router';
import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived';
import PageNotFound from '../common/lib/PageNotFound';
import XoopsCode from '../common/lib/XoopsCode';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
import CreditsUtils from './lib/CreditsUtils';
import NoticeSiteHasBeenArchived from '../common/lib/NoticeSiteHasBeenArchived';
import { Helmet } from 'react-helmet';
interface Params {
id: string;
}
interface Props extends RouteComponentProps<Params> {
interface Props {
lang: MultiLang;
}
const CreditsPage = (props: Props) => {
const { lang } = props;
const params = props.match.params;
if (params.id === '') {
const { id } = useParams<{ id: string }>();
if (!id) {
return <PageNotFound lang={lang} />;
}
const pageId = parseInt(props.match.params.id, 10);
const pageId = parseInt(id, 10);
const page = CreditsUtils.getPage(pageId);
if (page === null) {
return <PageNotFound lang={lang} />;
@@ -32,15 +27,20 @@ const CreditsPage = (props: Props) => {
return (
<>
<Helmet>
<title>{title} - {Functions.siteTitle(lang)}</title>
<title>
{title} - {Functions.siteTitle(lang)}
</title>
</Helmet>
<h3>{title}</h3>
<NoticeSiteHasBeenArchived lang={lang} />
<div style={{ textAlign: 'right' }}>{Functions.mlang('[en]Last Update[/en][ja]最終更新日[/ja]', lang)} : {moment(new Date(page.lastupdate * 1000)).format('MMMM Do, YYYY')}</div>
<div style={{ textAlign: 'right' }}>
{Functions.mlang('[en]Last Update[/en][ja]最終更新日[/ja]', lang)} :{' '}
{format(new Date(page.lastupdate * 1000), 'MMMM do, yyyy')}
</div>
<hr />
<XoopsCode lang={lang} text={page.content} dohtml={true} />
</>
);
}
};
export default CreditsPage;
export default CreditsPage;
+31 -42
View File
@@ -1,53 +1,42 @@
import React, { Component } from 'react';
import { Redirect, RouteComponentProps, withRouter } from 'react-router';
import { Navigate, useLocation } from 'react-router';
import PageNotFound from '../common/lib/PageNotFound';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
class CreditsXoopsPathRedirect extends Component<Props> {
const NAME = 'credits';
getRedirectUrl(): string {
const { location } = this.props;
const name = 'credits';
const pathname = location.pathname || '';
const query = new URLSearchParams(location.search);
const search = new RegExp(`^/modules/${name}(?:/+(.*))?$`);
const matches = pathname.match(search);
if (matches === null) {
return '';
}
const path = matches[1] || '';
switch (path) {
case '':
case 'index.php': {
const id = query.get('id');
if (id !== null) {
if (id.match(/^\d+$/) !== null) {
return '/' + name + '/' + id;
}
return '';
}
return '/' + name;
}
case 'aboutus.php': {
return '/' + name;
}
}
const getRedirectUrl = (pathname: string, search: string): string => {
const query = new URLSearchParams(search);
const matches = (pathname || '').match(new RegExp(`^/modules/${NAME}(?:/+(.*))?$`));
if (matches === null) {
return '';
}
render() {
const { lang } = this.props;
const url = this.getRedirectUrl();
if (url === '') {
return <PageNotFound lang={lang} />;
switch (matches[1] || '') {
case '':
case 'index.php': {
const id = query.get('id');
if (id !== null) {
return id.match(/^\d+$/) !== null ? `/${NAME}/${id}` : '';
}
return `/${NAME}`;
}
return <Redirect to={url} />;
case 'aboutus.php':
return `/${NAME}`;
}
}
return '';
};
export default withRouter(CreditsXoopsPathRedirect);
const CreditsXoopsPathRedirect = (props: Props) => {
const { lang } = props;
const location = useLocation();
const url = getRedirectUrl(location.pathname, location.search);
if (url === '') {
return <PageNotFound lang={lang} />;
}
return <Navigate to={url} replace />;
};
export default CreditsXoopsPathRedirect;
+11 -10
View File
@@ -1,6 +1,5 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import CreditsUtils from '../lib/CreditsUtils';
@@ -15,13 +14,15 @@ const CreditsMenu = (props: Props) => {
const links = menu.map((item, idx) => {
const title = Functions.mlang(item.title, lang);
const style = idx === 0 ? 'menuTop' : 'menuMain';
return <li key={idx}><Link className={style} to={item.link}>{title}</Link></li>
return (
<li key={item.link}>
<Link className={style} to={item.link}>
{title}
</Link>
</li>
);
});
return (
<ul className="mainmenu">
{links}
</ul>
);
}
return <ul className="mainmenu">{links}</ul>;
};
export default CreditsMenu;
+20 -12
View File
@@ -1,6 +1,5 @@
import { MultiLang } from '../../config';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import creditsJson from '../assets/credits.json';
export interface CreditsPageData {
pid: number;
@@ -9,7 +8,7 @@ export interface CreditsPageData {
lastupdate: number;
}
interface CreditsData {
export interface CreditsData {
organization: string;
pages: CreditsPageData[];
}
@@ -20,12 +19,19 @@ export interface CreditsMenu {
}
class CreditsUtils {
private data: CreditsData;
private data: CreditsData | null = null;
constructor(json: CreditsData) {
init(json: CreditsData): void {
this.data = json;
}
private get credits(): CreditsData {
if (this.data === null) {
throw new Error('credits data was read before loadSiteData() completed');
}
return this.data;
}
getTitle(lang: MultiLang): string {
return Functions.mlang('[en]Site Information[/en][ja]サイト情報[/ja]', lang);
}
@@ -35,12 +41,12 @@ class CreditsUtils {
}
getPageUrl(pageId: number): string {
return this.getIndexUrl() + '/' + pageId;
return `${this.getIndexUrl()}/${pageId}`;
}
getMenu(showAboutUs: boolean): CreditsMenu[] {
getMenu(showAboutUs = true): CreditsMenu[] {
const menu: CreditsMenu[] = [];
this.data.pages.forEach((page) => {
this.credits.pages.forEach((page) => {
menu.push({ title: page.title, link: this.getPageUrl(page.pid) });
});
if (showAboutUs) {
@@ -50,7 +56,9 @@ class CreditsUtils {
}
getPage(pageId: number): CreditsPageData | null {
const page = this.data.pages.find((page) => { return page.pid === pageId; });
const page = this.credits.pages.find((page) => {
return page.pid === pageId;
});
if (typeof page === 'undefined') {
return null;
}
@@ -58,7 +66,7 @@ class CreditsUtils {
}
countPages(): number {
return this.data.pages.length;
return this.credits.pages.length;
}
getAboutUsTitle(): string {
@@ -66,8 +74,8 @@ class CreditsUtils {
}
getAboutUsContent(): string {
return this.data.organization;
return this.credits.organization;
}
}
export default new CreditsUtils(creditsJson);
export default new CreditsUtils();
+33 -20
View File
@@ -1,8 +1,7 @@
import React from 'react';
import { Link } from 'react-router';
import NoticeSiteHasBeenArchived from '../../common/lib/NoticeSiteHasBeenArchived';
import { MultiLang } from '../../config';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import { Link } from 'react-router-dom';
interface Props {
lang: MultiLang;
@@ -12,67 +11,81 @@ const articles = {
en: [
{
title: 'Minoru Tsukada, Memory and Learning mechanism in the Hippocampal Network',
link: '/mediawiki/Memory_and_Learning_mechanism_in_the_Hippocampal_Network'
link: '/mediawiki/Memory_and_Learning_mechanism_in_the_Hippocampal_Network',
},
{
title: 'Yoko Yamaguchi, Theta Rhythm and Memory Formation in Rat Hippocampus',
link: '/mediawiki/Theta_Rhythm_and_Memory_Formation_in_Rat_Hippocampus'
link: '/mediawiki/Theta_Rhythm_and_Memory_Formation_in_Rat_Hippocampus',
},
{
title: 'Hatsuo Hayashi, Dynamical features of neurons and the brain: Chaos, synchronization, and propagation',
link: '/mediawiki/Dynamical_features_of_neurons_and_the_brain:_Chaos,_synchronization,_and_propagation'
link: '/mediawiki/Dynamical_features_of_neurons_and_the_brain:_Chaos,_synchronization,_and_propagation',
},
{
title: 'Ichiro Tsuda, Computational Life Science',
link: '/mediawiki/Computational_Life_Science'
link: '/mediawiki/Computational_Life_Science',
},
{
title: 'Yutaka Sakai, From synapse to behavior',
link: '/mediawiki/From_synapse_to_behavior'
link: '/mediawiki/From_synapse_to_behavior',
},
],
ja: [
{
title: '塚田稔「学習と記憶の理論的・実験的研究」',
link: '/mediawiki/学習と記憶の理論的・実験的研究'
link: '/mediawiki/学習と記憶の理論的・実験的研究',
},
{
title: '山口陽子「ラット海馬のシータリズムと記憶形成」',
link: '/mediawiki/ラット海馬のシータリズムと記憶形成'
link: '/mediawiki/ラット海馬のシータリズムと記憶形成',
},
{
title: '林初男「ニューロンと脳のダイナミクス:カオス、同期、伝搬」',
link: '/mediawiki/ニューロンと脳のダイナミクス:カオス、同期、伝搬'
link: '/mediawiki/ニューロンと脳のダイナミクス:カオス、同期、伝搬',
},
{
title: '津田一郎 「Computational Life Science」',
link: '/mediawiki/Computational_Life_Science'
link: '/mediawiki/Computational_Life_Science',
},
{
title: '酒井裕「シナプスから行動へ」 ',
link: '/mediawiki/From_synapse_to_behavior'
link: '/mediawiki/From_synapse_to_behavior',
},
]
],
};
const Welcome = (props: Props) => {
const { lang } = props;
return (
<div className="welcome">
<NoticeSiteHasBeenArchived lang={lang} />
<p className="concept">{Functions.mlang('[en]This site promotes studies on the dynamic principles of brain functions through unifying experimental and computational approaches in cellular, local circuit, global network and behavioral levels. Our goal is to capture the autonomy and the creativity in living organisms which enlightens the complexity of nature and society.[/en][ja]当サイトでは、脳の動的原理を解明することを目的として、細胞、局所回路、脳全域、行動などの様々なレベルでの実験的計算論的アプローチの統合的な研究を推進します。これらの研究から生命の自律性と情報創成の原理を捉え、さらに自然や人間社会の複雑性の理解を進めることを目指します。[/ja]', lang)}</p>
<NoticeSiteHasBeenArchived lang={lang} />
<p className="concept">
{Functions.mlang(
'[en]This site promotes studies on the dynamic principles of brain functions through unifying experimental and computational approaches in cellular, local circuit, global network and behavioral levels. Our goal is to capture the autonomy and the creativity in living organisms which enlightens the complexity of nature and society.[/en][ja]当サイトでは、脳の動的原理を解明することを目的として、細胞、局所回路、脳全域、行動などの様々なレベルでの実験的計算論的アプローチの統合的な研究を推進します。これらの研究から生命の自律性と情報創成の原理を捉え、さらに自然や人間社会の複雑性の理解を進めることを目指します。[/ja]',
lang
)}
</p>
<h3>{Functions.mlang('[en]Feature Articles[/en][ja]特集記事[/ja]', lang)}</h3>
<ul className="articles">
{articles[lang].map((i) => {
return <li key={i.title} className="article"><Link to={i.link}><span className="title">{i.title}</span></Link></li>;
return (
<li key={i.title} className="article">
<Link to={i.link}>
<span className="title">{i.title}</span>
</Link>
</li>
);
})}
</ul>
<h3>{Functions.mlang('[en]Announcements[/en][ja]お知らせ[/ja]', lang)}</h3>
<p className="announce">
<Link to={lang === 'en' ? '/hackathon/nix-odml2017_eng.html' : '/hackathon/nix-odml2017.html'}>NIX-odML Global Workshop &amp; Hackathon 2017 in Japan ({Functions.mlang('[en]Sept. 25-28, 2017[/en][ja]2017年9月25-28日[/ja]', lang)})</Link>
<Link to={lang === 'en' ? '/hackathon/nix-odml2017_eng.html' : '/hackathon/nix-odml2017.html'}>
NIX-odML Global Workshop &amp; Hackathon 2017 in Japan (
{Functions.mlang('[en]Sept. 25-28, 2017[/en][ja]2017年9月25-28日[/ja]', lang)})
</Link>
</p>
</div>
);
}
};
export default Welcome;
export default Welcome;
+11
View File
@@ -68,3 +68,14 @@
.database :global(.advancedSearch .fieldDate input) {
margin: 0 5px 0 0;
}
/* sanitize.css forms.css leaves form controls transparent; keep them on white. */
.database :global(.formButton),
.database :global(.fieldInputText),
.database :global(.fieldSelect),
.database :global(.fieldDate select),
.database :global(.fieldDate input),
.database :global(.listTable select) {
background-color: #ffffff;
color: #000000;
}
+24 -20
View File
@@ -1,8 +1,7 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { Route, RouteComponentProps, Switch } from 'react-router-dom';
import { Helmet } from '@dr.pogodin/react-helmet';
import { Route, Routes } from 'react-router';
import PageNotFound from '../common/lib/PageNotFound';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
import styles from './Database.module.css';
import DatabaseAdvancedSearch from './DatabaseAdvancedSearch';
@@ -22,23 +21,28 @@ const Database = (props: Props) => {
return (
<div className={styles.database}>
<Helmet>
<title>{Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}</title>
<title>
{Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}
</title>
</Helmet>
<Switch>
<Route exact path="/database" render={(props: RouteComponentProps) => <DatabaseTop lang={lang} {...props} />} />
<Route exact path="/database/item/:id" render={(props: RouteComponentProps<{ id: string }>) => <DatabaseDetailItem lang={lang} {...props} />} />
<Route exact path="/database/item/id/:doi" render={(props: RouteComponentProps<{ doi: string }>) => <DatabaseDetailItem lang={lang} {...props} />} />
<Route exact path="/database/advanced" render={(props: RouteComponentProps) => <DatabaseAdvancedSearch lang={lang} {...props} />} />
<Route exact path="/database/list" render={(props: RouteComponentProps) => <DatabaseSearchByIndexId lang={lang} {...props} />} />
<Route exact path="/database/list/:id" render={(props: RouteComponentProps<{ id: string }>) => <DatabaseSearchByIndexId lang={lang} {...props} />} />
<Route exact path="/database/search" render={(props: RouteComponentProps) => <DatabaseSearchByKeyword lang={lang} {...props} />} />
<Route exact path="/database/search/advanced" render={(props: RouteComponentProps) => <DatabaseSearchByAdvancedKeyword lang={lang} {...props} />} />
<Route exact path="/database/search/itemtype/:itemType" render={(props: RouteComponentProps<{ itemType: string }>) => <DatabaseSearchByItemType lang={lang} {...props} />} />
<Route exact path="/database/search/itemtype/:itemType/:subItemType" render={(props: RouteComponentProps<{ itemType: string; subItemType: string }>) => <DatabaseSearchByItemType lang={lang} {...props} />} />
<Route component={PageNotFound} />
</Switch>
<Routes>
<Route index element={<DatabaseTop lang={lang} />} />
<Route path="item/:id" element={<DatabaseDetailItem lang={lang} />} />
<Route path="item/id/:doi" element={<DatabaseDetailItem lang={lang} />} />
<Route path="advanced" element={<DatabaseAdvancedSearch lang={lang} />} />
<Route path="list" element={<DatabaseSearchByIndexId lang={lang} />} />
<Route path="list/:id" element={<DatabaseSearchByIndexId lang={lang} />} />
<Route path="search" element={<DatabaseSearchByKeyword lang={lang} />} />
<Route path="search/advanced" element={<DatabaseSearchByAdvancedKeyword lang={lang} />} />
<Route path="search/itemtype/:itemType" element={<DatabaseSearchByItemType lang={lang} />} />
<Route
path="search/itemtype/:itemType/:subItemType"
element={<DatabaseSearchByItemType lang={lang} />}
/>
<Route path="*" element={<PageNotFound lang={lang} />} />
</Routes>
</div>
);
}
};
export default Database;
export default Database;
+32 -35
View File
@@ -1,48 +1,45 @@
import React, { Component } from 'react';
import { RouteComponentProps } from 'react-router';
import Config, { MultiLang } from '../config';
import { useState } from 'react';
import { useNavigate } from 'react-router';
import Config, { type MultiLang } from '../config';
import Functions from '../functions';
import ItemType from './item-type';
import AdvancedSearchQuery from './lib/AdvancedSearchQuery';
import ItemUtil from './lib/ItemUtil';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
class DatabaseAdvancedSearch extends Component<Props> {
const DatabaseAdvancedSearch = (props: Props) => {
const { lang } = props;
const navigate = useNavigate();
// The child fields mutate this instance directly, so it must survive re-renders.
const [query] = useState(() => new AdvancedSearchQuery());
private query: AdvancedSearchQuery = new AdvancedSearchQuery();
constructor(props: Props) {
super(props);
this.handleClickSearchButton = this.handleClickSearchButton.bind(this);
}
handleClickSearchButton() {
if (!this.query.empty()) {
const url = ItemUtil.getSearchByAdvancedKeywordsUrl(this.query);
this.props.history.push(url);
const handleClickSearchButton = () => {
if (!query.empty()) {
void navigate(ItemUtil.getSearchByAdvancedKeywordsUrl(query));
}
}
};
render() {
const { lang } = this.props;
return (
<div className="advancedSearch">
<h3>{Functions.mlang('[en]Search Items[/en][ja]アイテム検索[/ja]', lang)}</h3>
<div className="search">
<button className="formButton" onClick={this.handleClickSearchButton}>Search</button>
</div>
{Config.XOONIPS_ITEMTYPES.map((type) => {
return <ItemType.AdvancedSearch key={type} type={'xnp' + type} lang={lang} query={this.query} />;
})}
<div className="search">
<button className="formButton" onClick={this.handleClickSearchButton}>Search</button>
</div>
return (
<div className="advancedSearch">
<h3>{Functions.mlang('[en]Search Items[/en][ja]アイテム検索[/ja]', lang)}</h3>
<div className="search">
<button type="button" className="formButton" onClick={handleClickSearchButton}>
Search
</button>
</div>
);
}
}
{Config.XOONIPS_ITEMTYPES.map((type) => {
return <ItemType.AdvancedSearch key={type} type={`xnp${type}`} lang={lang} query={query} />;
})}
<div className="search">
<button type="button" className="formButton" onClick={handleClickSearchButton}>
Search
</button>
</div>
</div>
);
};
export default DatabaseAdvancedSearch;
export default DatabaseAdvancedSearch;
+49 -74
View File
@@ -1,89 +1,64 @@
import React, { Component } from 'react';
import { Helmet } from 'react-helmet';
import { RouteComponentProps } from 'react-router';
import { Helmet } from '@dr.pogodin/react-helmet';
import { useEffect, useState } from 'react';
import { useParams } from 'react-router';
import Loading from '../common/lib/Loading';
import PageNotFound from '../common/lib/PageNotFound';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
import ItemType from './item-type';
import ItemUtil, { Item } from './lib/ItemUtil';
import ItemUtil, { type Item } from './lib/ItemUtil';
interface Params {
id?: string;
doi?: string;
}
interface Props extends RouteComponentProps<Params> {
interface Props {
lang: MultiLang;
}
interface State {
loading: boolean;
item: Item | null;
}
const DatabaseDetailItem = (props: Props) => {
const { lang } = props;
const params = useParams<{ id?: string; doi?: string }>();
const id = typeof params.id !== 'undefined' ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : 0;
const doi = params.doi ?? '';
const [loading, setLoading] = useState(true);
const [item, setItem] = useState<Item | null>(null);
class DatabaseDetailItem extends Component<Props, State> {
private id: number;
private doi: string;
constructor(props: Props) {
super(props);
this.state = {
loading: true,
item: null,
useEffect(() => {
let active = true;
const receive = (found: Item | null) => {
if (active) {
setItem(found);
setLoading(false);
}
};
const { params } = this.props.match;
this.id = typeof params.id !== 'undefined' ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : 0;
this.doi = typeof params.doi !== 'undefined' ? params.doi : '';
}
componentDidMount() {
this.updateItem();
}
componentDidUpdate() {
const { params } = this.props.match;
const id = typeof params.id !== 'undefined' ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : 0;
const doi = typeof params.doi !== 'undefined' ? params.doi : '';
if (this.id !== id || this.doi !== doi) {
this.id = id;
this.doi = doi;
this.updateItem();
if (doi !== '') {
ItemUtil.getByDoi(doi, receive);
} else if (id !== 0) {
ItemUtil.get(id, receive);
} else {
receive(null);
}
}
return () => {
active = false;
};
}, [id, doi]);
updateItem() {
if (this.doi !== '') {
ItemUtil.getByDoi(this.doi, (item) => {
this.setState({ loading: false, item });
});
} else if (this.id !== 0) {
ItemUtil.get(this.id, (item) => {
this.setState({ loading: false, item });
});
}
if (loading) {
return <Loading />;
}
render() {
const { lang } = this.props;
if (this.state.loading) {
return <Loading />;
}
if (this.state.item === null) {
return <PageNotFound lang={lang} />;
}
return (
<>
<Helmet>
<title>{Functions.mlang(this.state.item.title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}</title>
</Helmet>
<h3>{Functions.mlang('[en]Item Detail[/en][ja]アイテム詳細[/ja]', lang)}</h3>
<br />
<ItemType.Detail lang={lang} item={this.state.item} />
</>
);
if (item === null) {
return <PageNotFound lang={lang} />;
}
}
return (
<>
<Helmet>
<title>
{Functions.mlang(item.title, lang)} -{' '}
{Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}
</title>
</Helmet>
<h3>{Functions.mlang('[en]Item Detail[/en][ja]アイテム詳細[/ja]', lang)}</h3>
<br />
<ItemType.Detail lang={lang} item={item} />
</>
);
};
export default DatabaseDetailItem;
export default DatabaseDetailItem;
@@ -1,56 +1,31 @@
import React, { Component } from 'react';
import { RouteComponentProps } from 'react-router';
import { MultiLang } from '../config';
import AdvancedSearchQuery from './lib/AdvancedSearchQuery';
import { useCallback, useMemo } from 'react';
import { useLocation } from 'react-router';
import type { MultiLang } from '../config';
import DatabaseListItem from './lib/DatabaseListItem';
import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
interface Props extends RouteComponentProps {
lang: MultiLang
interface Props {
lang: MultiLang;
}
interface State {
search: string;
query: AdvancedSearchQuery;
}
const DatabaseSearchByAdvancedKeyword = (props: Props) => {
const { lang } = props;
const location = useLocation();
const query = useMemo(() => ItemUtil.getAdvancedSearchQueryByQuery(location.search), [location.search]);
class DatabaseSearchByAdvancedKeyword extends Component<Props, State> {
const searchFunc = useCallback(
(condition: SortCondition, func: SearchCallbackFunc) => {
ItemUtil.getListByAdvancedSearchQuery(query, condition, func);
},
[query]
);
constructor(props: Props) {
super(props);
const search = props.location.search;
const query = ItemUtil.getAdvancedSearchQueryByQuery(search);
this.state = { search, query };
this.searchFunc = this.searchFunc.bind(this);
}
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
const search = nextProps.location.search;
if (prevState.search !== search) {
const query = ItemUtil.getAdvancedSearchQueryByQuery(search);
return { search, query };
}
return null;
}
getUrl() {
return ItemUtil.getSearchByAdvancedKeywordsUrl(this.state.query);
}
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
ItemUtil.getListByAdvancedSearchQuery(this.state.query, condition, func);
}
render() {
const { lang } = this.props;
const baseUrl = this.getUrl();
return (
<div className="list">
<h3>Listing item</h3>
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
</div>
);
}
}
return (
<div className="list">
<h3>Listing item</h3>
<DatabaseListItem lang={lang} url={ItemUtil.getSearchByAdvancedKeywordsUrl(query)} search={searchFunc} />
</div>
);
};
export default DatabaseSearchByAdvancedKeyword;
+47 -76
View File
@@ -1,89 +1,60 @@
import React, { Component, Fragment } from 'react';
import { Helmet } from 'react-helmet';
import { RouteComponentProps } from 'react-router';
import { Link } from 'react-router-dom';
import { Helmet } from '@dr.pogodin/react-helmet';
import { Fragment, useCallback } from 'react';
import { Link, useParams } from 'react-router';
import PageNotFound from '../common/lib/PageNotFound';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
import DatabaseListIndex from './lib/DatabaseListIndex';
import DatabaseListItem from './lib/DatabaseListItem';
import IndexUtil, { Index, INDEX_ID_PUBLIC } from './lib/IndexUtil';
import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
import IndexUtil, { INDEX_ID_PUBLIC, type Index } from './lib/IndexUtil';
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
interface Params {
id?: string;
}
export interface Props extends RouteComponentProps<Params> {
export interface Props {
lang: MultiLang;
}
interface State {
indexId: number;
}
const DatabaseSearchByIndexId = (props: Props) => {
const { lang } = props;
const { id } = useParams<{ id?: string }>();
const indexId = id ? (id.match(/^\d+$/) !== null ? parseInt(id, 10) : 0) : INDEX_ID_PUBLIC;
class DatabaseSearchByIndexId extends Component<Props, State> {
const searchFunc = useCallback(
(condition: SortCondition, func: SearchCallbackFunc) => {
if (indexId === 0) {
func({ total: 0, data: [] });
} else {
ItemUtil.getListByIndexId(indexId, condition, func);
}
},
[indexId]
);
constructor(props: Props) {
super(props);
const { params } = props.match;
this.state = {
indexId: params.id ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : INDEX_ID_PUBLIC,
}
this.searchFunc = this.searchFunc.bind(this);
const index = IndexUtil.get(indexId);
if (index === null) {
return <PageNotFound lang={lang} />;
}
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
const { params } = nextProps.match;
const indexId = params.id ? (params.id.match(/^\d+$/) !== null ? parseInt(params.id, 10) : 0) : INDEX_ID_PUBLIC;
if (prevState.indexId !== indexId) {
return { indexId };
}
return null;
}
getUrl() {
if (this.state.indexId === 0) {
return '/';
}
return IndexUtil.getUrl(this.state.indexId);
}
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
if (this.state.indexId === 0) {
const res = { total: 0, data: [] };
func(res);
} else {
ItemUtil.getListByIndexId(this.state.indexId, condition, func);
}
}
render() {
const { lang } = this.props;
const index = IndexUtil.get(this.state.indexId);
if (index === null) {
return <PageNotFound lang={lang} />;
}
const baseUrl = this.getUrl();
const pIndexes = IndexUtil.getParents(this.state.indexId);
const parents = pIndexes.map((value: Index) => {
const url: string = IndexUtil.getUrl(value.id);
const title = Functions.mlang(value.title, lang);
return <Fragment key={value.id}>/ <Link to={url}>{title}</Link> </Fragment>;
});
const title = pIndexes.map((value) => { return '/' + Functions.mlang(value.title, lang); }).join('');
return (
<div className="list">
<Helmet>
<title>{Functions.mlang(title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} - {Functions.siteTitle(lang)}</title>
</Helmet>
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
<div>{parents}</div>
<DatabaseListIndex lang={lang} index={index} />
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
</div>
);
}
}
const baseUrl = indexId === 0 ? '/' : IndexUtil.getUrl(indexId);
const pIndexes = IndexUtil.getParents(indexId);
const parents = pIndexes.map((value: Index) => (
<Fragment key={value.id}>
/ <Link to={IndexUtil.getUrl(value.id)}>{Functions.mlang(value.title, lang)}</Link>{' '}
</Fragment>
));
const title = pIndexes.map((value) => `/${Functions.mlang(value.title, lang)}`).join('');
return (
<div className="list">
<Helmet>
<title>
{Functions.mlang(title, lang)} - {Functions.mlang('[en]Database[/en][ja]データベース[/ja]', lang)} -{' '}
{Functions.siteTitle(lang)}
</title>
</Helmet>
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
<div>{parents}</div>
<DatabaseListIndex lang={lang} index={index} />
<DatabaseListItem lang={lang} url={baseUrl} search={searchFunc} />
</div>
);
};
export default DatabaseSearchByIndexId;
+30 -62
View File
@@ -1,73 +1,41 @@
import React, { Component } from 'react';
import { RouteComponentProps } from 'react-router';
import { MultiLang } from '../config';
import { useCallback } from 'react';
import { useParams } from 'react-router';
import type { MultiLang } from '../config';
import Functions from '../functions';
import DatabaseListItem from './lib/DatabaseListItem';
import ItemUtil, { SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
interface Params {
itemType: string;
subItemType?: string;
}
interface Props extends RouteComponentProps<Params> {
interface Props {
lang: MultiLang;
}
interface State {
itemType: string;
subItemType: string;
}
const DatabaseSearchByItemType = (props: Props) => {
const { lang } = props;
const params = useParams<{ itemType?: string; subItemType?: string }>();
const itemType = params.itemType ?? '';
const subItemType = params.subItemType ?? '';
class DatabaseSearchByItemType extends Component<Props, State> {
const searchFunc = useCallback(
(condition: SortCondition, func: SearchCallbackFunc) => {
if (itemType === '') {
func({ total: 0, data: [] });
} else {
ItemUtil.getListByItemType(itemType, subItemType, condition, func);
}
},
[itemType, subItemType]
);
constructor(props: Props) {
super(props);
const { params } = this.props.match;
this.state = {
itemType: params.itemType ? params.itemType : '',
subItemType: params.subItemType ? params.subItemType : '',
};
this.searchFunc = this.searchFunc.bind(this);
let baseUrl = ItemUtil.getItemTypeSearchUrl(itemType);
if (subItemType !== '') {
baseUrl += `/${subItemType}`;
}
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
const { params } = nextProps.match;
const item_type = params.itemType ? params.itemType : '';
const sub_item_type = params.subItemType ? params.subItemType : '';
if (prevState.itemType !== item_type || prevState.subItemType !== sub_item_type) {
return { item_type, sub_item_type };
}
return null;
}
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
if (this.state.itemType === '') {
const res = { total: 0, data: [] };
func(res);
} else {
ItemUtil.getListByItemType(this.state.itemType, this.state.subItemType, condition, func);
}
}
getUrl() {
let url = ItemUtil.getItemTypeSearchUrl(this.state.itemType);
if (this.state.subItemType !== '') {
url += '/' + this.state.subItemType;
}
return url;
}
render() {
const { lang } = this.props;
const baseUrl = this.getUrl();
return (
<div className="list">
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
</div>
);
}
}
return (
<div className="list">
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
<DatabaseListItem lang={lang} url={baseUrl} search={searchFunc} />
</div>
);
};
export default DatabaseSearchByItemType;
+29 -50
View File
@@ -1,60 +1,39 @@
import React, { Component } from 'react';
import { RouteComponentProps } from 'react-router';
import { MultiLang } from '../config';
import { useCallback } from 'react';
import { useLocation } from 'react-router';
import type { MultiLang } from '../config';
import Functions from '../functions';
import DatabaseListItem from './lib/DatabaseListItem';
import ItemUtil, { KeywordSearchType, SearchCallbackFunc, SortCondition } from './lib/ItemUtil';
import ItemUtil, { type SearchCallbackFunc, type SortCondition } from './lib/ItemUtil';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
interface State {
type: KeywordSearchType;
keyword: string;
}
const DatabaseSearchByKeyword = (props: Props) => {
const { lang } = props;
const location = useLocation();
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(location.search);
class DatabaseSearchByKeyword extends Component<Props, State> {
const searchFunc = useCallback(
(condition: SortCondition, func: SearchCallbackFunc) => {
if (keyword === '') {
func({ total: 0, data: [] });
} else {
ItemUtil.getListByKeyword(type, keyword, condition, func);
}
},
[type, keyword]
);
constructor(props: Props) {
super(props);
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(this.props.location.search);
this.state = { type, keyword };
this.searchFunc = this.searchFunc.bind(this);
}
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(nextProps.location.search);
if (prevState.type !== type || prevState.keyword !== keyword) {
return { type, keyword };
}
return null;
}
getUrl() {
return ItemUtil.getSearchByKeywordUrl(this.state.type, this.state.keyword);
}
searchFunc(condition: SortCondition, func: SearchCallbackFunc) {
if (this.state.keyword === '') {
const res = { total: 0, data: [] };
func(res);
} else {
ItemUtil.getListByKeyword(this.state.type, this.state.keyword, condition, func);
}
}
render() {
const { lang } = this.props;
const baseUrl = this.getUrl();
return (
<div className="list">
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
<p>{Functions.mlang('[en]Search Keyword[/en][ja]検索キーワード[/ja]', lang)} : {this.state.keyword}</p>
<DatabaseListItem lang={lang} url={baseUrl} search={this.searchFunc} />
</div>
);
}
}
return (
<div className="list">
<h3>{Functions.mlang('[en]Listing item[/en][ja]アイテム一覧[/ja]', lang)}</h3>
<p>
{Functions.mlang('[en]Search Keyword[/en][ja]検索キーワード[/ja]', lang)} : {keyword}
</p>
<DatabaseListItem lang={lang} url={ItemUtil.getSearchByKeywordUrl(type, keyword)} search={searchFunc} />
</div>
);
};
export default DatabaseSearchByKeyword;
+1 -1
View File
@@ -10,4 +10,4 @@
.itemTypes .itemType :global(table .itemTypeName) {
vertical-align: middle;
font-size: large;
}
}
+7 -8
View File
@@ -1,5 +1,4 @@
import React from 'react';
import Config, { MultiLang } from '../config';
import Config, { type MultiLang } from '../config';
import styles from './DatabaseTop.module.css';
import ItemType from './item-type';
@@ -19,13 +18,13 @@ const DatabaseTop = (props: Props) => {
return (
<table className={styles.itemTypes}>
<tbody>
{types.map((value, idx) => {
{types.map((value) => {
return (
<tr key={idx}>
{value.map((type, idx) => {
<tr key={value.join('-')}>
{value.map((type) => {
return (
<td key={idx} className={styles.itemType}>
{type !== '' && <ItemType.Top lang={lang} type={'xnp' + type} />}
<td key={type} className={styles.itemType}>
{type !== '' && <ItemType.Top lang={lang} type={`xnp${type}`} />}
</td>
);
})}
@@ -35,6 +34,6 @@ const DatabaseTop = (props: Props) => {
</tbody>
</table>
);
}
};
export default DatabaseTop;
+31 -33
View File
@@ -1,20 +1,17 @@
import React, { Component } from 'react';
import { Redirect, RouteComponentProps, withRouter } from 'react-router';
import { Navigate, useLocation } from 'react-router';
import PageNotFound from '../common/lib/PageNotFound';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import Functions from '../functions';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
class DatabaseXoopsPathRedirect extends Component<Props> {
getRedirectUrl(): string {
const { location } = this.props;
const getRedirectUrl = (location: { pathname: string; search: string }): string => {
{
const pathname = location.pathname || '';
const query = new URLSearchParams(location.search);
const search = new RegExp('^/modules/xoonips(?:/+(.*))?$');
const search = /^\/modules\/xoonips(?:\/+(.*))?$/;
const matches = pathname.match(search);
if (matches === null) {
return '';
@@ -28,11 +25,11 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
case 'detail.php': {
const id = query.get('id');
if (id !== null) {
return '/database/item/id/' + Functions.escape(id);
return `/database/item/id/${Functions.escape(id)}`;
}
const itemId = query.get('item_id');
if (itemId !== null && itemId.match(/^\d+$/) !== null) {
return '/database/item/' + Functions.escape(itemId);
return `/database/item/${Functions.escape(itemId)}`;
}
return '';
}
@@ -40,13 +37,13 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
const indexId = query.get('index_id');
if (indexId !== null && indexId.match(/^\d+$/) !== null) {
const params = new URLSearchParams();
const map: any = {
const map: Record<string, { key: string; isNumber: boolean }> = {
orderby: { key: 'orderby', isNumber: false },
order_dir: { key: 'order_dir', isNumber: true },
itemcount: { key: 'itemcount', isNumber: true },
page: { key: 'page', isNumber: true }
page: { key: 'page', isNumber: true },
};
for (let k in map) {
for (const k in map) {
const v = query.get(k);
if (v === null || v.length === 0) {
continue;
@@ -57,7 +54,7 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
params.set(map[k].key, v);
}
const paramStr = params.toString();
return '/database/list/' + Functions.escape(indexId) + (paramStr.length > 0 ? '?' + paramStr : '');
return `/database/list/${Functions.escape(indexId)}${paramStr.length > 0 ? `?${paramStr}` : ''}`;
}
break;
}
@@ -78,13 +75,13 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
return '';
}
const params = new URLSearchParams({ type, keyword });
const map: any = {
const map: Record<string, { key: string; isNumber: boolean }> = {
orderby: { key: 'orderby', isNumber: false },
orderdir: { key: 'order_dir', isNumber: true },
item_per_page: { key: 'itemcount', isNumber: true },
page: { key: 'page', isNumber: true }
page: { key: 'page', isNumber: true },
};
for (let k in map) {
for (const k in map) {
const v = query.get(k);
if (v === null || v.length === 0) {
continue;
@@ -94,7 +91,7 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
}
params.set(map[k].key, v);
}
return '/database/search?' + params.toString();
return `/database/search?${params.toString()}`;
}
case 'itemtypesearch': {
const itemType = query.get('search_itemtype');
@@ -102,22 +99,22 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
return '';
}
const type = itemType.replace('xnp', '');
return '/database/search/itemtype/' + Functions.escape(type);
return `/database/search/itemtype/${Functions.escape(type)}`;
}
case 'itemsubtypesearch': {
let type = '';
let subtype = '';
query.forEach((v, k) => {
if (k.match(/^xnp[a-z]+$/) !== null && !!v) {
if (k.match(/^xnp[a-z]+$/) !== null && v) {
type = k.replace('xnp', '');
return;
}
})
});
if (type === '') {
return '';
}
query.forEach((v, k) => {
if (k.match(`^xnp${type}_.+$`) !== null && !!v) {
if (k.match(`^xnp${type}_.+$`) !== null && v) {
subtype = v;
return;
}
@@ -125,7 +122,7 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
if (subtype === '') {
return '';
}
return '/database/search/itemtype/' + Functions.escape(type) + '/' + Functions.escape(subtype);
return `/database/search/itemtype/${Functions.escape(type)}/${Functions.escape(subtype)}`;
}
}
return '';
@@ -136,15 +133,16 @@ class DatabaseXoopsPathRedirect extends Component<Props> {
}
return '';
}
};
render() {
const { lang } = this.props;
const url = this.getRedirectUrl();
if (url === '') {
return <PageNotFound lang={lang} />;
}
return <Redirect to={url} />;
const DatabaseXoopsPathRedirect = (props: Props) => {
const { lang } = props;
const location = useLocation();
const url = getRedirectUrl(location);
if (url === '') {
return <PageNotFound lang={lang} />;
}
}
return <Navigate to={url} replace />;
};
export default withRouter(DatabaseXoopsPathRedirect);
export default DatabaseXoopsPathRedirect;
+27 -9
View File
@@ -4,8 +4,10 @@
border-bottom: 1px solid #404040;
border-right: 1px solid #404040;
background-color: white;
height: 400px;
width: calc(100% - 6px);
/* border-box totals: 400 + 3px padding + 1px border per side, and a width
that keeps the 2px the original content-box rule overflowed by. */
height: 408px;
width: calc(100% + 2px);
overflow: auto;
margin: 0 auto;
padding: 3px;
@@ -14,6 +16,9 @@
.formButton {
margin: 3px 3px 10px;
/* sanitize.css forms.css leaves buttons transparent */
background-color: #ffffff;
color: #000000;
}
.indexTree div span {
@@ -39,24 +44,37 @@
display: inline-block;
height: 20px;
width: 9px;
background: url(../assets/images/tree_line.png);
background: url(../assets/images/tree_line.png) no-repeat -18px 0;
}
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child)) {
/* treeData has a single root, so the first indent unit never carries a line. */
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:first-child) {
display: none;
}
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(.rc-tree-indent-unit-end)) {
background-position: -9px 0;
}
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child).rc-tree-indent-unit-end) {
background-position: -18px 0;
/* The node's own branch (├ or └) is drawn after the indent units. */
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent)::after {
content: "";
display: inline-block;
vertical-align: bottom;
height: 20px;
width: 9px;
background: url(../assets/images/tree_line.png) no-repeat 0 0;
}
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:last-child.rc-tree-indent-unit-end) {
.indexTree:global(.rc-tree .rc-tree-treenode.rc-tree-treenode-leaf-last .rc-tree-indent)::after {
background-position: -27px 0;
}
.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-indent)::after {
display: none;
}
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-switcher) {
display: inline-block;
height: 20px;
width: 16px;
margin-right: 2px;
background: url(../assets/images/tree_node.png);
background: url(../assets/images/tree_node.png) no-repeat;
cursor: pointer;
}
.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-switcher.rc-tree-switcher-noop) {
@@ -88,4 +106,4 @@
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper .rc-tree-title) {
vertical-align: middle;
line-height: 20px;
}
}
+78 -107
View File
@@ -1,124 +1,95 @@
import Tree from 'rc-tree';
import { DataNode, EventDataNode } from 'rc-tree/lib/interface';
import React, { Component, ReactText } from 'react';
import { RouteComponentProps, withRouter } from 'react-router';
import { MultiLang } from '../../config';
import type { DataNode, EventDataNode } from 'rc-tree/lib/interface';
import { type Key, useMemo, useState } from 'react';
import { useNavigate } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import IndexUtil, { Index, INDEX_ID_PUBLIC } from '../lib/IndexUtil';
import IndexUtil, { INDEX_ID_PUBLIC, type Index } from '../lib/IndexUtil';
import styles from './IndexTree.module.css';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
interface State {
tree: DataNode[];
interface TreeData {
elements: DataNode[];
expandableKeys: string[];
expandedKeys: string[];
selectedKeys: number[];
defaultExpandedKeys: string[];
}
class IndexTree extends Component<Props, State> {
constructor(props: Props) {
super(props);
this.handleClickOpenAll = this.handleClickOpenAll.bind(this);
this.handleClickCloseAll = this.handleClickCloseAll.bind(this);
this.handleExpand = this.handleExpand.bind(this);
this.handleSelect = this.handleSelect.bind(this);
const res = this.load();
this.state = {
tree: res.elements,
expandableKeys: res.keys,
expandedKeys: res.expandedKeys,
selectedKeys: [],
};
}
load() {
const { lang } = this.props;
let keys: string[] = [];
let eKeys: string[] = [];
const makeTreeNode = (index: Index, depth: number): DataNode => {
const title = Functions.mlang(index.title, lang) + (index.numOfItems > 0 ? ' (' + index.numOfItems + ')' : '');
const children = IndexUtil.getChildren(index.id);
if (children.length === 0) {
return { key: String(index.id), title: title };
}
const childTreeNodes = children.map((value: Index) => {
return makeTreeNode(value, depth + 1);
});
if (depth < 1) {
eKeys.push(String(index.id));
}
keys.push(String(index.id));
return { key: String(index.id), title: title, children: childTreeNodes };
};
let elements: DataNode[] = [];
const index = IndexUtil.get(INDEX_ID_PUBLIC);
if (index !== null) {
elements.push(makeTreeNode(index, 0));
const load = (lang: MultiLang): TreeData => {
const expandableKeys: string[] = [];
const defaultExpandedKeys: string[] = [];
const makeTreeNode = (index: Index, depth: number): DataNode => {
const title = Functions.mlang(index.title, lang) + (index.numOfItems > 0 ? ` (${index.numOfItems})` : '');
const children = IndexUtil.getChildren(index.id);
if (children.length === 0) {
return { key: String(index.id), title: title };
}
return {
elements: elements,
keys: keys,
expandedKeys: eKeys,
const childTreeNodes = children.map((value: Index) => makeTreeNode(value, depth + 1));
if (depth < 1) {
defaultExpandedKeys.push(String(index.id));
}
expandableKeys.push(String(index.id));
return { key: String(index.id), title: title, children: childTreeNodes };
};
const elements: DataNode[] = [];
const index = IndexUtil.get(INDEX_ID_PUBLIC);
if (index !== null) {
elements.push(makeTreeNode(index, 0));
}
return { elements, expandableKeys, defaultExpandedKeys };
};
componentDidUpdate(prevProps: Props, prevState: State) {
const { lang } = this.props;
if (prevProps.lang !== lang) {
const res = this.load();
this.setState({
tree: res.elements,
selectedKeys: [],
});
const toStringKeys = (keys: Key[]): string[] => keys.map((key) => (typeof key === 'string' ? key : String(key)));
const IndexTree = (props: Props) => {
const { lang } = props;
const data = useMemo(() => load(lang), [lang]);
const [expandedKeys, setExpandedKeys] = useState<string[]>(data.defaultExpandedKeys);
const navigate = useNavigate();
const handleExpand = (
keys: Key[],
_info: { node: EventDataNode<DataNode>; expanded: boolean; nativeEvent: MouseEvent }
) => {
setExpandedKeys(toStringKeys(keys));
};
const handleSelect = (
selectedKeys: Key[],
_info: {
event: 'select';
selected: boolean;
node: EventDataNode<DataNode>;
selectedNodes: DataNode[];
nativeEvent: MouseEvent;
}
}
) => {
const selectedKey = selectedKeys[0] ?? 0;
const key = typeof selectedKey === 'string' ? parseInt(selectedKey, 10) : Number(selectedKey);
void navigate(IndexUtil.getUrl(key));
};
handleClickOpenAll() {
this.setState({ expandedKeys: this.state.expandableKeys })
}
return (
<div className={styles.container}>
<button type="button" className={styles.formButton} onClick={() => setExpandedKeys(data.expandableKeys)}>
open all
</button>
<button type="button" className={styles.formButton} onClick={() => setExpandedKeys([])}>
close all
</button>
<Tree
className={styles.indexTree}
expandedKeys={expandedKeys}
selectedKeys={[]}
onExpand={handleExpand}
onSelect={handleSelect}
showIcon={false}
treeData={data.elements}
/>
</div>
);
};
handleClickCloseAll() {
this.setState({ expandedKeys: [] })
}
handleExpand(expandedKeys: ReactText[], info: {
node: EventDataNode;
expanded: boolean;
nativeEvent: MouseEvent;
}): void {
const keys: string[] = expandedKeys.map((key) => {
return typeof key === 'string' ? key : String(key);
});
this.setState({ expandedKeys: keys });
}
handleSelect(selectedKeys: ReactText[], info: {
event: 'select';
selected: boolean;
node: EventDataNode;
selectedNodes: DataNode[];
nativeEvent: MouseEvent;
}): void {
const selectedKey = selectedKeys.shift() || 0;
const key = typeof selectedKey === 'string' ? parseInt(selectedKey, 10) : selectedKey;
const url = IndexUtil.getUrl(key);
this.props.history.push(url);
this.setState({ selectedKeys: [] });
}
render() {
return (
<div className={styles.container}>
<button className={styles.formButton} onClick={this.handleClickOpenAll}>open all</button>
<button className={styles.formButton} onClick={this.handleClickCloseAll}>close all</button>
<Tree className={styles.indexTree} expandedKeys={this.state.expandedKeys} selectedKeys={this.state.selectedKeys} onExpand={this.handleExpand} onSelect={this.handleSelect} showIcon={false} treeData={this.state.tree} />
</div>
);
}
}
export default withRouter(IndexTree);
export default IndexTree;
+1 -1
View File
@@ -25,4 +25,4 @@
.star {
margin-left: 5px;
}
}
+38 -19
View File
@@ -1,10 +1,10 @@
import React, { Fragment } from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config';
import { Fragment } from 'react';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import { siteData } from '../../siteData';
import imageStar from '../assets/images/star.gif';
import rankings from '../assets/rankings.json';
import ItemUtil, { ItemCore } from '../lib/ItemUtil';
import ItemUtil, { type ItemCore } from '../lib/ItemUtil';
import styles from './Rankings.module.css';
interface Props {
@@ -12,37 +12,56 @@ interface Props {
}
const orderLabel = (order: number, lang: string) => {
return String(order) + (lang === 'en' ? Functions.ordinal(order) : '位')
}
return String(order) + (lang === 'en' ? Functions.ordinal(order) : '位');
};
const Rankings = (props: Props) => {
const items = [
{
title: Functions.mlang('[en]Frequently accessed items[/en][ja]頻繁に閲覧されるアイテム[/ja]', props.lang),
list: rankings.accessed.map((item, idx) => {
list: siteData().rankings.accessed.map((item, idx) => {
const url = ItemUtil.getUrl(item as ItemCore);
const title = Functions.mlang(item.title, props.lang);
const order = orderLabel(idx + 1, props.lang);
return (
<div key={idx} className={styles.item}>
<div key={url} className={styles.item}>
<div className={styles.order}>{order}</div>
<div className={styles.title}><Link to={url} title={title}>{title}</Link></div>
{idx === 0 && <div className={styles.star}><img src={imageStar} alt={order} /></div>}
<div className={styles.title}>
<Link to={url} title={title}>
{title}
</Link>
</div>
{idx === 0 && (
<div className={styles.star}>
<img src={imageStar} alt={order} />
</div>
)}
</div>
);
}),
},
{
title: Functions.mlang('[en]Frequently downloaded items[/en][ja]頻繁にダウンロードされるアイテム[/ja]', props.lang),
list: rankings.downloaded.map((item, idx) => {
title: Functions.mlang(
'[en]Frequently downloaded items[/en][ja]頻繁にダウンロードされるアイテム[/ja]',
props.lang
),
list: siteData().rankings.downloaded.map((item, idx) => {
const url = ItemUtil.getUrl(item as ItemCore);
const title = Functions.mlang(item.title, props.lang);
const order = orderLabel(idx + 1, props.lang);
return (
<div key={idx} className={styles.item}>
<div key={url} className={styles.item}>
<div className={styles.order}>{order}</div>
<div className={styles.title}><Link to={url} title={title}>{title}</Link></div>
{idx === 0 && <div className={styles.star}><img src={imageStar} alt={order} /></div>}
<div className={styles.title}>
<Link to={url} title={title}>
{title}
</Link>
</div>
{idx === 0 && (
<div className={styles.star}>
<img src={imageStar} alt={order} />
</div>
)}
</div>
);
}),
@@ -52,7 +71,7 @@ const Rankings = (props: Props) => {
<div>
{items.map((item, idx) => {
return (
<Fragment key={idx}>
<Fragment key={item.title}>
{idx !== 0 && <hr />}
<h3 className={styles.heading}>{item.title}</h3>
<div>{item.list}</div>
@@ -61,6 +80,6 @@ const Rankings = (props: Props) => {
})}
</div>
);
}
};
export default Rankings;
export default Rankings;
@@ -25,4 +25,4 @@
.star {
margin-left: 5px;
}
}
+23 -14
View File
@@ -1,11 +1,10 @@
import moment from 'moment';
import React from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config';
import { format } from 'date-fns';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
import { siteData } from '../../siteData';
import imageStar from '../assets/images/star.gif';
import contents from '../assets/recent-contents.json';
import ItemUtil, { ItemCore } from '../lib/ItemUtil';
import ItemUtil, { type ItemCore } from '../lib/ItemUtil';
import styles from './RecentContents.module.css';
interface Props {
@@ -14,26 +13,36 @@ interface Props {
const RecentContents = (props: Props) => {
const { lang } = props;
const list = contents.map((item, idx) => {
const list = siteData().recentContents.map((item, idx) => {
const url = ItemUtil.getUrl(item as ItemCore);
const title = Functions.mlang(item.title, lang);
const date = moment(new Date(item.last_update_date * 1000)).format('Y/M/D');
const date = format(new Date(item.last_update_date * 1000), 'y/M/d');
const order = String(idx + 1) + (lang === 'en' ? Functions.ordinal(idx + 1) : '位');
return (
<div key={idx} className={styles.item}>
<div key={url} className={styles.item}>
<div className={styles.order}>{order}</div>
<div className={styles.title}><Link className={styles.title} to={url} title={title}>{title}</Link></div>
<div className={styles.title}>
<Link className={styles.title} to={url} title={title}>
{title}
</Link>
</div>
<div className={styles.date}> ({date})</div>
{idx === 0 && <div className={styles.star}><img src={imageStar} alt={order} /></div>}
{idx === 0 && (
<div className={styles.star}>
<img src={imageStar} alt={order} />
</div>
)}
</div>
);
});
return (
<div>
<h3 className={styles.heading}>{Functions.mlang('[en]Newly Arrived Items[/en][ja]新着アイテム[/ja]', lang)}</h3>
<h3 className={styles.heading}>
{Functions.mlang('[en]Newly Arrived Items[/en][ja]新着アイテム[/ja]', lang)}
</h3>
<div>{list}</div>
</div>
);
}
};
export default RecentContents;
export default RecentContents;
+57 -78
View File
@@ -1,90 +1,69 @@
import React, { ChangeEvent, Component, FormEvent } from 'react';
import { Link, RouteComponentProps, withRouter } from 'react-router-dom';
import Config, { MultiLang } from '../../config';
import { type ChangeEvent, type FormEvent, useEffect, useState } from 'react';
import { Link, useLocation, useNavigate } from 'react-router';
import Config, { type MultiLang } from '../../config';
import Functions from '../../functions';
import ItemUtil, { KeywordSearchType } from '../lib/ItemUtil';
import ItemUtil, { type KeywordSearchType } from '../lib/ItemUtil';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
interface State {
type: KeywordSearchType;
keyword: string;
pathname: string;
}
const SEARCH_PATH = '/database/search';
class Search extends Component<Props, State> {
const Search = (props: Props) => {
const { lang } = props;
const location = useLocation();
const navigate = useNavigate();
const [type, setType] = useState<KeywordSearchType>('all');
const [keyword, setKeyword] = useState('');
constructor(props: Props) {
super(props);
this.state = {
type: 'all',
keyword: '',
pathname: '',
};
this.handleChangeType = this.handleChangeType.bind(this);
this.handleChangeKeyword = this.handleChangeKeyword.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
const pathname = nextProps.location.pathname;
if (pathname !== prevState.pathname) {
if (pathname === '/database/search') {
const { type, keyword } = ItemUtil.getSearchKeywordByQuery(nextProps.location.search);
return { type, keyword, pathname };
}
return {
type: prevState.type,
keyword: prevState.keyword,
pathname
};
// Landing on the results page adopts the query it was called with; moving
// anywhere else leaves whatever the visitor has typed alone.
useEffect(() => {
if (location.pathname === SEARCH_PATH) {
const parsed = ItemUtil.getSearchKeywordByQuery(location.search);
setType(parsed.type);
setKeyword(parsed.keyword);
}
return null;
}
}, [location.pathname, location.search]);
handleChangeKeyword(event: ChangeEvent<HTMLInputElement>) {
const keyword = event.target.value.trim();
this.setState({ keyword });
}
handleChangeType(event: ChangeEvent<HTMLSelectElement>) {
const type = event.target.value as KeywordSearchType;
this.setState({ type });
}
handleSubmit(event: FormEvent<HTMLFormElement>) {
const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
const url = ItemUtil.getSearchByKeywordUrl(this.state.type, this.state.keyword);
this.props.history.push(url);
}
void navigate(ItemUtil.getSearchByKeywordUrl(type, keyword));
};
render() {
const { lang } = this.props;
const options = [
{ value: 'all', label: '[en]All[/en][ja]全て[/ja]' },
{ value: 'basic', label: '[en]Title & Keyword[/en][ja]タイトル&キーワード[/ja]' },
];
Config.XOONIPS_ITEMTYPES.forEach((type) => {
options.push({value: type, label: Functions.pascalCase(type)})
});
return (
<form onSubmit={this.handleSubmit}>
<input style={{width: '170px'}} type="text" value={this.state.keyword} onChange={this.handleChangeKeyword} />
&nbsp;&nbsp;
<select value={this.state.type} onChange={this.handleChangeType}>
{options.map((option) => {
return <option key={option.value} value={option.value}>{Functions.mlang(option.label, lang)}</option>;
})}
</select>
<br />
<input className="formButton" type="submit" value="Search" />
&nbsp;&nbsp;&nbsp;&nbsp;
<Link to="/database/advanced">{Functions.mlang('[en]Advanced[/en][ja]詳細検索[/ja]', lang)}</Link>
</form>
);
}
}
const options = [
{ value: 'all', label: '[en]All[/en][ja]全て[/ja]' },
{ value: 'basic', label: '[en]Title & Keyword[/en][ja]タイトル&キーワード[/ja]' },
];
Config.XOONIPS_ITEMTYPES.forEach((itemType) => {
options.push({ value: itemType, label: Functions.pascalCase(itemType) });
});
return (
<form onSubmit={handleSubmit}>
<input
style={{ width: '170px' }}
type="text"
value={keyword}
onChange={(event: ChangeEvent<HTMLInputElement>) => setKeyword(event.target.value.trim())}
/>
&nbsp;&nbsp;
<select
value={type}
onChange={(event: ChangeEvent<HTMLSelectElement>) => setType(event.target.value as KeywordSearchType)}
>
{options.map((option) => (
<option key={option.value} value={option.value}>
{Functions.mlang(option.label, lang)}
</option>
))}
</select>
<br />
<input className="formButton" type="submit" value="Search" />
&nbsp;&nbsp;&nbsp;&nbsp;
<Link to="/database/advanced">{Functions.mlang('[en]Advanced[/en][ja]詳細検索[/ja]', lang)}</Link>
</form>
);
};
export default withRouter(Search);
export default Search;
@@ -1,21 +1,23 @@
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class BinderAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
this.type = 'binder';
this.title = 'Binder';
this.state.values['title'] = '';
this.state.values['keyword'] = '';
this.state.values['description'] = '';
this.state.values['doi'] = '';
this.state.values.title = '';
this.state.values.keyword = '';
this.state.values.description = '';
this.state.values.doi = '';
}
getRows() {
const rows = [
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: this.renderFieldInputText('keyword', 50),
},
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
{ label: 'ID', value: this.renderFieldInputText('doi', 50) },
];
+37 -14
View File
@@ -1,10 +1,10 @@
import React, { Component } from 'react';
import { Component } from 'react';
import type { MultiLang } from '../../../config';
import Functions from '../../../functions';
import ItemUtil, { ItemBinder, Item } from '../../lib/ItemUtil';
import ItemUtil, { type Item, type ItemBinder } from '../../lib/ItemUtil';
import ItemType from '..';
import DetailBase from '../lib/DetailBase';
import ItemTypeField from '../lib/field';
import { MultiLang } from '../../../config';
import ItemType from '..';
interface Props {
lang: MultiLang;
@@ -27,7 +27,7 @@ class BinderLinkItems extends Component<Props, State> {
this.updateItems();
}
componentDidUpdate(prevProps: Props, prevState: State) {
componentDidUpdate(prevProps: Props) {
const prevItemIds = prevProps.item.item_link;
const nextItemIds = this.props.item.item_link;
if (prevItemIds.toString() !== nextItemIds.toString()) {
@@ -51,7 +51,13 @@ class BinderLinkItems extends Component<Props, State> {
<tbody>
{this.state.items.map((item, idx) => {
const evenodd = idx % 2 ? 'even' : 'odd';
return <tr key={item.item_id}><td className={evenodd}><ItemType.List lang={lang} item={item} /></td></tr>;
return (
<tr key={item.item_id}>
<td className={evenodd}>
<ItemType.List lang={lang} item={item} />
</td>
</tr>
);
})}
</tbody>
</table>
@@ -60,20 +66,37 @@ class BinderLinkItems extends Component<Props, State> {
}
class BinderDetail extends DetailBase {
getFields() {
const { lang } = this.props;
const item = this.props.item as ItemBinder;
return [
{ label: 'ID', value: item.doi },
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
},
{
label: '[en]Description[/en][ja]概要[/ja]',
value: <ItemTypeField.Description lang={lang} description={item.description} />,
},
{
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
},
{
label: '[en]Created Date[/en][ja]作成日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
},
{
label: '[en]Contributor[/en][ja]登録者[/ja]',
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
},
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
{
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
},
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
];
}
@@ -92,4 +115,4 @@ class BinderDetail extends DetailBase {
}
}
export default BinderDetail;
export default BinderDetail;
+5 -6
View File
@@ -1,12 +1,10 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { Link } from 'react-router';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_binder.gif';
import { ItemBinder } from '../../lib/ItemUtil';
import ListBase, { ListBaseProps } from '../lib/ListBase';
import type { ItemBinder } from '../../lib/ItemUtil';
import ListBase, { type ListBaseProps } from '../lib/ListBase';
class BinderList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
this.label = 'Binder';
@@ -18,7 +16,8 @@ class BinderList extends ListBase {
const item = this.props.item as ItemBinder;
return (
<>
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
<br />
{Functions.mlang(item.description, lang)}
</>
);
+2 -3
View File
@@ -1,8 +1,7 @@
import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_binder.gif';
import TopBase, { type TopBaseProps } from '../lib/TopBase';
class BinderTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
this.type = 'binder';
@@ -12,4 +11,4 @@ class BinderTop extends TopBase {
}
}
export default BinderTop;
export default BinderTop;
@@ -1,35 +1,43 @@
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class BookAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
this.type = 'book';
this.title = 'Book';
this.state.values['title'] = '';
this.state.values['keyword'] = '';
this.state.values['description'] = '';
this.state.values['doi'] = '';
this.state.values['author'] = '';
this.state.values['editor'] = '';
this.state.values['publisher'] = '';
this.state.values['publication_year'] = '';
this.state.values['isbn'] = '';
this.state.values.title = '';
this.state.values.keyword = '';
this.state.values.description = '';
this.state.values.doi = '';
this.state.values.author = '';
this.state.values.editor = '';
this.state.values.publisher = '';
this.state.values.publication_year = '';
this.state.values.isbn = '';
this.state.values['file.book_pdf.original_file_name'] = '';
}
getRows() {
const rows = [
{ label: '[en]Book Title[/en][ja]著書名[/ja]', value: this.renderFieldInputText('title', 50) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: this.renderFieldInputText('keyword', 50),
},
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
{ label: 'ID', value: this.renderFieldInputText('doi', 50) },
{ label: '[en]Author[/en][ja]著者[/ja]', value: this.renderFieldInputText('author', 50) },
{ label: '[en]Editor[/en][ja]編集者[/ja]', value: this.renderFieldInputText('editor', 50) },
{ label: '[en]Publisher[/en][ja]出版社[/ja]', value: this.renderFieldInputText('publisher', 50) },
{ label: '[en]Publication Year[/en][ja]出版年[/ja]', value: this.renderFieldInputText('publication_year', 10) },
{
label: '[en]Publication Year[/en][ja]出版年[/ja]',
value: this.renderFieldInputText('publication_year', 10),
},
{ label: 'ISBN', value: this.renderFieldInputText('isbn', 50) },
{ label: '[en]PDF File[/en][ja]PDF ファイル[/ja]', value: this.renderFieldInputText('file.book_pdf.original_file_name', 50) },
{
label: '[en]PDF File[/en][ja]PDF ファイル[/ja]',
value: this.renderFieldInputText('file.book_pdf.original_file_name', 50),
},
];
return rows;
}
+52 -13
View File
@@ -1,33 +1,72 @@
import React from 'react';
import Functions from '../../../functions';
import { ItemBook } from '../../lib/ItemUtil';
import type { ItemBook } from '../../lib/ItemUtil';
import DetailBase from '../lib/DetailBase';
import ItemTypeField from '../lib/field';
class BookDetail extends DetailBase {
getFields() {
const { lang } = this.props;
const item = this.props.item as ItemBook;
return [
{ label: 'ID', value: item.doi },
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
{
label: '[en]Language[/en][ja]言語[/ja]',
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
},
{ label: '[en]Book Title[/en][ja]著書名[/ja]', value: Functions.mlang(item.title, lang) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
},
{
label: '[en]Description[/en][ja]概要[/ja]',
value: <ItemTypeField.Description lang={lang} description={item.description} />,
},
{
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
},
{
label: '[en]Created Date[/en][ja]作成日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
},
{
label: '[en]Contributor[/en][ja]登録者[/ja]',
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
},
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
{
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
},
{ label: '[en]Author[/en][ja]著者[/ja]', value: <ItemTypeField.Author lang={lang} author={item.author} /> },
{ label: '[en]Editor[/en][ja]編集者[/ja]', value: Functions.mlang(item.editor, lang) },
{ label: '[en]Publisher[/en][ja]出版社[/ja]', value: Functions.mlang(item.publisher, lang) },
{ label: '[en]Publication Year[/en][ja]出版年[/ja]', value: item.publication_year },
{ label: 'URL', value: <a href={item.url} target="_blank" rel="noopener noreferrer">{item.url}</a> },
{ label: '[en]PDF File[/en][ja]PDF ファイル[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="book_pdf" downloadLimit={item.attachment_dl_limit} /> },
{
label: 'URL',
value: (
<a href={item.url} target="_blank" rel="noopener noreferrer">
{item.url}
</a>
),
},
{
label: '[en]PDF File[/en][ja]PDF ファイル[/ja]',
value: (
<ItemTypeField.ItemFile
lang={lang}
file={item.file}
type="book_pdf"
downloadLimit={item.attachment_dl_limit}
/>
),
},
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
{
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
},
];
}
}
+6 -9
View File
@@ -1,12 +1,10 @@
import React, { Fragment } from 'react';
import { Link } from 'react-router-dom';
import { Link } from 'react-router';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_book.gif';
import { ItemBook } from '../../lib/ItemUtil';
import ListBase, { ListBaseProps } from '../lib/ListBase';
import type { ItemBook } from '../../lib/ItemUtil';
import ListBase, { type ListBaseProps } from '../lib/ListBase';
class BookList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
this.label = 'Book';
@@ -16,12 +14,11 @@ class BookList extends ListBase {
renderBody() {
const { lang } = this.props;
const item = this.props.item as ItemBook;
const authors = item.author.map((author, i) => {
return <Fragment key={i}>{i > 0 && ', '}{Functions.mlang(author, lang)}</Fragment>
});
const authors = item.author.map((author) => Functions.mlang(author, lang)).join(', ');
return (
<>
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
<br />
{authors}
</>
);
+2 -3
View File
@@ -1,8 +1,7 @@
import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_book.gif';
import TopBase, { type TopBaseProps } from '../lib/TopBase';
class BookTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
this.type = 'book';
@@ -12,4 +11,4 @@ class BookTop extends TopBase {
}
}
export default BookTop;
export default BookTop;
+3 -3
View File
@@ -1,7 +1,7 @@
import BookTop from './BookTop';
import BookList from './BookList';
import BookDetail from './BookDetail';
import BookAdvancedSearch from './BookAdvancedSearch';
import BookDetail from './BookDetail';
import BookList from './BookList';
import BookTop from './BookTop';
const ItemTypeBook = {
Top: BookTop,
@@ -1,9 +1,7 @@
import React from 'react';
import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class ConferenceAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
this.type = 'conference';
@@ -12,15 +10,15 @@ class ConferenceAdvancedSearch extends AdvancedSearchBase {
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
this.state.values['title'] = '';
this.state.values['presentation_type'] = '';
this.state.values['author'] = '';
this.state.values['conference_from_year'] = year;
this.state.values['conference_from_month'] = month;
this.state.values['conference_from_mday'] = mday;
this.state.values['conference_to_year'] = year;
this.state.values['conference_to_month'] = month;
this.state.values['conference_to_mday'] = mday;
this.state.values.title = '';
this.state.values.presentation_type = '';
this.state.values.author = '';
this.state.values.conference_from_year = year;
this.state.values.conference_from_month = month;
this.state.values.conference_from_mday = mday;
this.state.values.conference_to_year = year;
this.state.values.conference_to_month = month;
this.state.values.conference_to_mday = mday;
this.setIgnoreKey('conference_from_year');
this.setIgnoreKey('conference_from_month');
this.setIgnoreKey('conference_from_mday');
@@ -33,8 +31,12 @@ class ConferenceAdvancedSearch extends AdvancedSearchBase {
return (
<>
<div>
{this.renderFieldDate('From', 'conference_from_year', 'conference_from_month', 'conference_from_mday')}
{this.renderFieldDate(
'From',
'conference_from_year',
'conference_from_month',
'conference_from_mday'
)}
</div>
<div>
{this.renderFieldDate('To', 'conference_to_year', 'conference_to_month', 'conference_to_mday')}
@@ -46,12 +48,15 @@ class ConferenceAdvancedSearch extends AdvancedSearchBase {
getRows() {
const rows = [
{ label: '[en]Presentation Title[/en][ja]発表議題[/ja]', value: this.renderFieldInputText('title', 50) },
{ label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]', value: this.renderFieldSelect('presentation_type', ItemConferenceSubTypes) },
{
label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]',
value: this.renderFieldSelect('presentation_type', ItemConferenceSubTypes),
},
{ label: '[en]Author[/en][ja]発表者[/ja]', value: this.renderFieldInputText('author', 50) },
{ label: '[en]Date[/en][ja]日付[/ja]', value: this.renderDate() }
{ label: '[en]Date[/en][ja]日付[/ja]', value: this.renderDate() },
];
return rows;
}
}
export default ConferenceAdvancedSearch;
export default ConferenceAdvancedSearch;
@@ -1,36 +1,67 @@
import React from 'react';
import Functions from '../../../functions';
import { ItemConference } from '../../lib/ItemUtil';
import type { ItemConference } from '../../lib/ItemUtil';
import DetailBase from '../lib/DetailBase';
import ItemTypeField from '../lib/field';
import ConferenceUtil from './ConferenceUtil';
class ConferenceDetail extends DetailBase {
getFields() {
const { lang } = this.props;
const item = this.props.item as ItemConference;
return [
{ label: 'ID', value: item.doi },
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
{
label: '[en]Language[/en][ja]言語[/ja]',
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
},
{ label: '[en]Conference Title[/en][ja]学会名[/ja]', value: Functions.mlang(item.conference_title, lang) },
{ label: '[en]Place[/en][ja]開催地[/ja]', value: item.place },
{ label: '[en]Date[/en][ja]日付[/ja]', value: <ConferenceUtil.ConferenceDate lang={lang} item={item} /> },
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
{
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
},
{
label: '[en]Created Date[/en][ja]作成日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
},
{
label: '[en]Contributor[/en][ja]登録者[/ja]',
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
},
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
{
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
},
{ label: '[en]Presentation Title[/en][ja]発表議題[/ja]', value: Functions.mlang(item.title, lang) },
{ label: '[en]Author[/en][ja]発表者[/ja]', value: <ItemTypeField.Author lang={lang} author={item.author} /> },
{ label: '[en]Abstract[/en][ja]要約[/ja]', value: <ItemTypeField.Description lang={lang} description={item.abstract} /> },
{ label: '[en]Presentation File[/en][ja]発表資料[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_file" /> },
{ label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]', value: <ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} /> },
{ label: '[en]Conference Paper[/en][ja]学会資料[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_paper" /> },
{
label: '[en]Author[/en][ja]発表者[/ja]',
value: <ItemTypeField.Author lang={lang} author={item.author} />,
},
{
label: '[en]Abstract[/en][ja]要約[/ja]',
value: <ItemTypeField.Description lang={lang} description={item.abstract} />,
},
{
label: '[en]Presentation File[/en][ja]発表資料[/ja]',
value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_file" />,
},
{
label: '[en]Presentation Type[/en][ja]発表資料ファイル形式[/ja]',
value: <ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} />,
},
{
label: '[en]Conference Paper[/en][ja]学会資料[/ja]',
value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="conference_paper" />,
},
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
{
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
},
];
}
}
export default ConferenceDetail;
export default ConferenceDetail;
@@ -1,13 +1,11 @@
import React, { Fragment } from 'react';
import { Link } from 'react-router-dom';
import { ItemConference } from '../../lib/ItemUtil';
import ListBase, { ListBaseProps } from '../lib/ListBase';
import ConferenceUtil from './ConferenceUtil';
import iconFile from '../../assets/images/icon_conference.gif';
import { Link } from 'react-router';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_conference.gif';
import type { ItemConference } from '../../lib/ItemUtil';
import ListBase, { type ListBaseProps } from '../lib/ListBase';
import ConferenceUtil from './ConferenceUtil';
class ConferenceList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
this.label = 'Conference';
@@ -17,17 +15,17 @@ class ConferenceList extends ListBase {
renderBody() {
const { lang } = this.props;
const item = this.props.item as ItemConference;
const authors = item.author.map((author, i) => {
return <Fragment key={i}>{i > 0 && ', '}{Functions.mlang(author, lang)}</Fragment>
});
const authors = item.author.map((author) => Functions.mlang(author, lang)).join(', ');
return (
<>
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
{Functions.mlang(item.conference_title, lang)} (<ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} />)<br />
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
<br />
{Functions.mlang(item.conference_title, lang)} (
<ConferenceUtil.PresentationType lang={lang} type={item.presentation_type} />)<br />
{authors}
</>
);
}
}
export default ConferenceList;
export default ConferenceList;
@@ -1,19 +1,16 @@
import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_conference.gif';
import { ItemConferenceSubTypes } from '../../lib/ItemUtil';
import TopBase, { type TopBaseProps } from '../lib/TopBase';
class ConferenceTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
this.type = 'conference';
this.label = 'Conference';
this.icon = iconFile;
// DBPF:
// this.description = '[en]Electrical presentation files for conference.[/en][ja]学会発表[/ja]';
this.description = '[en]Presentations in conferences.[/en][ja]学術会議での発表[/ja]';
this.subTypes = ItemConferenceSubTypes;
}
}
export default ConferenceTop;
export default ConferenceTop;
@@ -1,6 +1,5 @@
import React from 'react';
import { MultiLang } from '../../../config';
import { ItemConference, ItemConferenceSubType, ItemConferenceSubTypes } from '../../lib/ItemUtil';
import type { MultiLang } from '../../../config';
import { type ItemConference, type ItemConferenceSubType, ItemConferenceSubTypes } from '../../lib/ItemUtil';
interface PresentationTypeProps {
lang: MultiLang;
@@ -9,12 +8,14 @@ interface PresentationTypeProps {
const PresentationType = (props: PresentationTypeProps) => {
const { type } = props;
const subtype = ItemConferenceSubTypes.find((value) => { return value.type === type; });
const subtype = ItemConferenceSubTypes.find((value) => {
return value.type === type;
});
if (typeof subtype === 'undefined') {
return null;
}
return (<span>{subtype.label}</span>);
}
return <span>{subtype.label}</span>;
};
interface ConferenceDateProps {
lang: MultiLang;
@@ -24,14 +25,30 @@ interface ConferenceDateProps {
const ConferenceDate = (props: ConferenceDateProps) => {
const { item } = props;
const monthStr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const from = 'From: ' + monthStr[item.conference_from_month - 1] + ' ' + item.conference_from_mday + ', ' + item.conference_from_year;
const to = 'To: ' + monthStr[item.conference_to_month - 1] + ' ' + item.conference_to_mday + ', ' + item.conference_to_year;
return (<span>{from} {to}</span>);
}
const from =
'From: ' +
monthStr[item.conference_from_month - 1] +
' ' +
item.conference_from_mday +
', ' +
item.conference_from_year;
const to =
'To: ' +
monthStr[item.conference_to_month - 1] +
' ' +
item.conference_to_mday +
', ' +
item.conference_to_year;
return (
<span>
{from} {to}
</span>
);
};
const ConferenceUtil = {
PresentationType,
ConferenceDate,
}
};
export default ConferenceUtil;
export default ConferenceUtil;
+4 -4
View File
@@ -1,7 +1,7 @@
import ConferenceTop from './ConferenceTop';
import ConferenceList from './ConferenceList';
import ConferenceDetail from './ConferenceDetail';
import ConferenceAdvancedSearch from './ConferenceAdvancedSearch';
import ConferenceDetail from './ConferenceDetail';
import ConferenceList from './ConferenceList';
import ConferenceTop from './ConferenceTop';
const ItemTypeConference = {
Top: ConferenceTop,
@@ -10,4 +10,4 @@ const ItemTypeConference = {
AdvancedSearch: ConferenceAdvancedSearch,
};
export default ItemTypeConference;
export default ItemTypeConference;
@@ -1,8 +1,7 @@
import { ItemDataSubTypes } from '../../lib/ItemUtil';
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class DataAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
this.type = 'data';
@@ -11,15 +10,15 @@ class DataAdvancedSearch extends AdvancedSearchBase {
const year = String(now.getFullYear());
const month = String(now.getMonth() + 1);
const mday = String(now.getDate());
this.state.values['title'] = '';
this.state.values['keyword'] = '';
this.state.values['description'] = '';
this.state.values['doi'] = '';
this.state.values['data_type'] = '';
this.state.values['experimenter'] = '';
this.state.values['publication_year'] = year;
this.state.values['publication_month'] = month;
this.state.values['publication_mday'] = mday;
this.state.values.title = '';
this.state.values.keyword = '';
this.state.values.description = '';
this.state.values.doi = '';
this.state.values.data_type = '';
this.state.values.experimenter = '';
this.state.values.publication_year = year;
this.state.values.publication_month = month;
this.state.values.publication_mday = mday;
this.state.values['file.preview.caption'] = '';
this.state.values['file.data_file.original_file_name'] = '';
this.setIgnoreKey('publication_year');
@@ -30,17 +29,32 @@ class DataAdvancedSearch extends AdvancedSearchBase {
getRows() {
const rows = [
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: this.renderFieldInputText('keyword', 50),
},
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
{ label: 'ID', value: this.renderFieldInputText('doi', 50) },
{ label: '[en]Data Type[/en][ja]データタイプ[/ja]', value: this.renderFieldSelect('data_type', ItemDataSubTypes) },
{
label: '[en]Data Type[/en][ja]データタイプ[/ja]',
value: this.renderFieldSelect('data_type', ItemDataSubTypes),
},
{ label: '[en]Experimenter[/en][ja]実験者[/ja]', value: this.renderFieldInputText('experimenter', 50) },
{ label: '[en]Date[/en][ja]日付[/ja]', value: this.renderFieldDate('', 'publication_year', 'publication_month', 'publication_mday') },
{ label: '[en]Caption[/en][ja]キャプション[/ja]', value: this.renderFieldInputText('file.preview.caption', 50) },
{ label: '[en]Data File[/en][ja]データファイル[/ja]', value: this.renderFieldInputText('file.data_file.original_file_name', 50) },
{
label: '[en]Date[/en][ja]日付[/ja]',
value: this.renderFieldDate('', 'publication_year', 'publication_month', 'publication_mday'),
},
{
label: '[en]Caption[/en][ja]キャプション[/ja]',
value: this.renderFieldInputText('file.preview.caption', 50),
},
{
label: '[en]Data File[/en][ja]データファイル[/ja]',
value: this.renderFieldInputText('file.data_file.original_file_name', 50),
},
];
return rows;
}
}
export default DataAdvancedSearch;
export default DataAdvancedSearch;
+88 -19
View File
@@ -1,44 +1,113 @@
import React from 'react';
import Functions from '../../../functions';
import ItemUtil, { ItemData } from '../../lib/ItemUtil';
import ItemUtil, { type ItemData } from '../../lib/ItemUtil';
import DetailBase from '../lib/DetailBase';
import ItemTypeField from '../lib/field';
import SimPFLinkIcon from '../lib/field/SimPFLinkIcon';
import DataUtil from './DataUtil';
class DataDetail extends DetailBase {
getFields() {
const { lang } = this.props;
const item = this.props.item as ItemData;
const fields = [
{ label: 'ID', value: item.doi },
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
{
label: '[en]Language[/en][ja]言語[/ja]',
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
},
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
{ label: '[en]Date[/en][ja]日付[/ja]', value: <ItemTypeField.PublicationDate lang={lang} year={item.publication_year} month={item.publication_month} mday={item.publication_mday} /> },
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
},
{
label: '[en]Description[/en][ja]概要[/ja]',
value: <ItemTypeField.Description lang={lang} description={item.description} />,
},
{
label: '[en]Date[/en][ja]日付[/ja]',
value: (
<ItemTypeField.PublicationDate
lang={lang}
year={item.publication_year}
month={item.publication_month}
mday={item.publication_mday}
/>
),
},
{
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
},
{
label: '[en]Created Date[/en][ja]作成日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
},
{
label: '[en]Contributor[/en][ja]登録者[/ja]',
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
},
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
{ label: '[en]Data Type[/en][ja]データタイプ[/ja]', value: <DataUtil.DataType lang={lang} type={item.data_type} /> },
{ label: '[en]Experimenter[/en][ja]実験者[/ja]', value: <ItemTypeField.Author lang={lang} author={item.experimenter} /> },
{ label: '[en]Preview[/en][ja]プレビュー[/ja]', value: <ItemTypeField.Preview lang={lang} file={item.file} /> },
{ label: '[en]Data File[/en][ja]データファイル[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="data_file" rights={item.rights} useCc={item.use_cc} ccCommercialUse={item.cc_commercial_use} ccModification={item.cc_modification} downloadLimit={item.attachment_dl_limit} /> },
{
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
},
{
label: '[en]Data Type[/en][ja]データタイプ[/ja]',
value: <DataUtil.DataType lang={lang} type={item.data_type} />,
},
{
label: '[en]Experimenter[/en][ja]実験者[/ja]',
value: <ItemTypeField.Author lang={lang} author={item.experimenter} />,
},
{
label: '[en]Preview[/en][ja]プレビュー[/ja]',
value: <ItemTypeField.Preview lang={lang} file={item.file} />,
},
{
label: '[en]Data File[/en][ja]データファイル[/ja]',
value: (
<ItemTypeField.ItemFile
lang={lang}
file={item.file}
type="data_file"
rights={item.rights}
useCc={item.use_cc}
ccCommercialUse={item.cc_commercial_use}
ccModification={item.cc_modification}
downloadLimit={item.attachment_dl_limit}
/>
),
},
{ label: 'Readme', value: <ItemTypeField.Readme lang={lang} readme={item.readme} /> },
{ label: 'Rights', value: <ItemTypeField.Rights lang={lang} rights={item.rights} useCc={item.use_cc} ccCommercialUse={item.cc_commercial_use} ccModification={item.cc_modification} /> },
{
label: 'Rights',
value: (
<ItemTypeField.Rights
lang={lang}
rights={item.rights}
useCc={item.use_cc}
ccCommercialUse={item.cc_commercial_use}
ccModification={item.cc_modification}
/>
),
},
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
{
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
},
];
const simpfLinkUrl = ItemUtil.getSimPFLinkUrl(item.item_id);
if (simpfLinkUrl !== '') {
const field = { label: 'Online Simulation', value: <SimPFLinkIcon lang={lang} url={simpfLinkUrl} isDetail={true} /> };
const field = {
label: 'Online Simulation',
value: <SimPFLinkIcon lang={lang} url={simpfLinkUrl} isDetail={true} />,
};
fields.splice(14, 0, field);
}
return fields;
}
}
export default DataDetail;
export default DataDetail;
+7 -10
View File
@@ -1,12 +1,10 @@
import React, { Fragment } from 'react';
import { Link } from 'react-router-dom';
import { Link } from 'react-router';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_data.gif';
import { ItemData } from '../../lib/ItemUtil';
import ListBase, { ListBaseProps } from '../lib/ListBase';
import type { ItemData } from '../../lib/ItemUtil';
import ListBase, { type ListBaseProps } from '../lib/ListBase';
class DataList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
this.label = 'Data';
@@ -16,16 +14,15 @@ class DataList extends ListBase {
renderBody() {
const { lang } = this.props;
const item = this.props.item as ItemData;
const authors = item.experimenter.map((author, i) => {
return <Fragment key={i}>{i > 0 && ', '}{Functions.mlang(author, lang)}</Fragment>
});
const authors = item.experimenter.map((author) => Functions.mlang(author, lang)).join(', ');
return (
<>
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
<br />
{authors}
</>
);
}
}
export default DataList;
export default DataList;
+5 -7
View File
@@ -1,19 +1,17 @@
import { ItemDataSubTypes } from '../../lib/ItemUtil';
import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_data.gif';
import { ItemDataSubTypes } from '../../lib/ItemUtil';
import TopBase, { type TopBaseProps } from '../lib/TopBase';
class DataTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
this.type = 'data';
this.label = 'Data';
this.icon = iconFile;
// DBPF:
// this.description = '[en]Result data in numerical text/image/movie formats.[/en][ja]実験結果の数値データ/画像/動画など[/ja]';
this.description = '[en]Data from experiments or simulations.[/en][ja]実験やシミュレーションで得られたデータ[/ja]';
this.description =
'[en]Data from experiments or simulations.[/en][ja]実験やシミュレーションで得られたデータ[/ja]';
this.subTypes = ItemDataSubTypes;
}
}
export default DataTop;
export default DataTop;
+9 -8
View File
@@ -1,6 +1,5 @@
import React from 'react';
import { MultiLang } from '../../../config';
import { ItemDataSubType, ItemDataSubTypes } from '../../lib/ItemUtil';
import type { MultiLang } from '../../../config';
import { type ItemDataSubType, ItemDataSubTypes } from '../../lib/ItemUtil';
interface DataTypeProps {
lang: MultiLang;
@@ -9,15 +8,17 @@ interface DataTypeProps {
const DataType = (props: DataTypeProps) => {
const { type } = props;
const subtype = ItemDataSubTypes.find((value) => { return value.type === type; });
const subtype = ItemDataSubTypes.find((value) => {
return value.type === type;
});
if (typeof subtype === 'undefined') {
return null;
}
return (<span>{subtype.label}</span>);
}
return <span>{subtype.label}</span>;
};
const DataUtil = {
DataType,
}
};
export default DataUtil;
export default DataUtil;
+4 -4
View File
@@ -1,7 +1,7 @@
import DataTop from './DataTop';
import DataList from './DataList';
import DataDetail from './DataDetail';
import DataAdvancedSearch from './DataAdvancedSearch';
import DataDetail from './DataDetail';
import DataList from './DataList';
import DataTop from './DataTop';
const ItemTypeData = {
Top: DataTop,
@@ -10,4 +10,4 @@ const ItemTypeData = {
AdvancedSearch: DataAdvancedSearch,
};
export default ItemTypeData;
export default ItemTypeData;
@@ -1,30 +1,41 @@
import AdvancedSearchBase, { AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
import AdvancedSearchBase, { type AdvancedSearchBaseProps } from '../lib/AdvancedSearchBase';
class FilesAdvancedSearch extends AdvancedSearchBase {
constructor(props: AdvancedSearchBaseProps) {
super(props);
this.type = 'files';
this.title = 'Files';
this.state.values['title'] = '';
this.state.values['data_file_name'] = '';
this.state.values['data_file_mimetype'] = '';
this.state.values['data_file_filetype'] = '';
this.state.values['keyword'] = '';
this.state.values['description'] = '';
this.state.values.title = '';
this.state.values.data_file_name = '';
this.state.values.data_file_mimetype = '';
this.state.values.data_file_filetype = '';
this.state.values.keyword = '';
this.state.values.description = '';
}
getRows() {
const rows = [
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: this.renderFieldInputText('title', 50) },
{ label: '- [en]File Name[/en][ja]ファイル名[/ja]', value: this.renderFieldInputText('data_file_name', 50) },
{ label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]', value: this.renderFieldInputText('data_file_mimetype', 50) },
{ label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]', value: this.renderFieldInputText('data_file_filetype', 20) },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: this.renderFieldInputText('keyword', 50) },
{
label: '- [en]File Name[/en][ja]ファイル名[/ja]',
value: this.renderFieldInputText('data_file_name', 50),
},
{
label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]',
value: this.renderFieldInputText('data_file_mimetype', 50),
},
{
label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]',
value: this.renderFieldInputText('data_file_filetype', 20),
},
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: this.renderFieldInputText('keyword', 50),
},
{ label: '[en]Description[/en][ja]概要[/ja]', value: this.renderFieldInputText('description', 50) },
];
return rows;
}
}
export default FilesAdvancedSearch;
export default FilesAdvancedSearch;
+37 -12
View File
@@ -1,31 +1,56 @@
import React from 'react';
import Functions from '../../../functions';
import { ItemFiles } from '../../lib/ItemUtil';
import type { ItemFiles } from '../../lib/ItemUtil';
import DetailBase from '../lib/DetailBase';
import ItemTypeField from '../lib/field';
class FilesDetail extends DetailBase {
getFields() {
const { lang } = this.props;
const item = this.props.item as ItemFiles;
return [
{ label: 'ID', value: item.doi },
{ label: '[en]Language[/en][ja]言語[/ja]', value: <ItemTypeField.Language lang={lang} itemLang={item.lang} /> },
{
label: '[en]Language[/en][ja]言語[/ja]',
value: <ItemTypeField.Language lang={lang} itemLang={item.lang} />,
},
{ label: '[en]Title[/en][ja]タイトル[/ja]', value: Functions.mlang(item.title, lang) },
{ label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} /> },
{ label: '[en]Created Date[/en][ja]作成日[/ja]', value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} /> },
{ label: '[en]Contributor[/en][ja]登録者[/ja]', value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} /> },
{
label: '[en]Last Modified Date[/en][ja]最終更新日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.last_update_date} />,
},
{
label: '[en]Created Date[/en][ja]作成日[/ja]',
value: <ItemTypeField.DateTime lang={lang} date={item.creation_date} />,
},
{
label: '[en]Contributor[/en][ja]登録者[/ja]',
value: <ItemTypeField.Contributer lang={lang} uname={item.uname} name={item.name} />,
},
{ label: '[en]Item Type[/en][ja]アイテムタイプ[/ja]', value: item.item_type_display_name },
{ label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]', value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} /> },
{ label: '[en]Data File[/en][ja]データファイル[/ja]', value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="files_file" /> },
{
label: '[en]Change Log(History)[/en][ja]変更履歴[/ja]',
value: <ItemTypeField.ChangeLog lang={lang} changelog={item.changelog} />,
},
{
label: '[en]Data File[/en][ja]データファイル[/ja]',
value: <ItemTypeField.ItemFile lang={lang} file={item.file} type="files_file" />,
},
{ label: '- [en]File Name[/en][ja]ファイル名[/ja]', value: item.data_file_name },
{ label: '- [en]MIME Type[/en][ja]MIMEタイプ[/ja]', value: item.data_file_mimetype },
{ label: '- [en]File Type[/en][ja]ファイルタイプ[/ja]', value: item.data_file_filetype },
{ label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]', value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} /> },
{ label: '[en]Description[/en][ja]概要[/ja]', value: <ItemTypeField.Description lang={lang} description={item.description} /> },
{
label: '[en]Free Keywords[/en][ja]フリーキーワード[/ja]',
value: <ItemTypeField.FreeKeyword lang={lang} keyword={item.keyword} />,
},
{
label: '[en]Description[/en][ja]概要[/ja]',
value: <ItemTypeField.Description lang={lang} description={item.description} />,
},
{ label: 'Index', value: <ItemTypeField.ItemIndex lang={lang} index={item.index} /> },
{ label: '[en]Related to[/en][ja]関連アイテム[/ja]', value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} /> },
{
label: '[en]Related to[/en][ja]関連アイテム[/ja]',
value: <ItemTypeField.RelatedTo lang={lang} relatedTo={item.related_to} />,
},
];
}
}
+8 -8
View File
@@ -1,13 +1,11 @@
import React from 'react';
import { Link } from 'react-router-dom';
import { Link } from 'react-router';
import Functions from '../../../functions';
import iconFile from '../../assets/images/icon_files.gif';
import { ItemFiles } from '../../lib/ItemUtil';
import type { ItemFiles } from '../../lib/ItemUtil';
import Contributer from '../lib/field/Contributer';
import ListBase, { ListBaseProps } from '../lib/ListBase';
import ListBase, { type ListBaseProps } from '../lib/ListBase';
class FilesList extends ListBase {
constructor(props: ListBaseProps) {
super(props);
this.label = 'Files';
@@ -19,12 +17,14 @@ class FilesList extends ListBase {
const item = this.props.item as ItemFiles;
return (
<>
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link><br />
<Contributer lang={lang} uname={item.uname} name={item.name} /><br />
<Link to={this.url}>{Functions.mlang(item.title, lang)}</Link>
<br />
<Contributer lang={lang} uname={item.uname} name={item.name} />
<br />
{item.data_file_mimetype}
</>
);
}
}
export default FilesList;
export default FilesList;
+2 -3
View File
@@ -1,9 +1,8 @@
import TopBase, { TopBaseProps } from '../lib/TopBase';
import iconFile from '../../assets/images/icon_files.gif';
import { ItemFilesSubTypes } from '../../lib/ItemUtil';
import TopBase, { type TopBaseProps } from '../lib/TopBase';
class FilesTop extends TopBase {
constructor(props: TopBaseProps) {
super(props);
this.type = 'files';
@@ -14,4 +13,4 @@ class FilesTop extends TopBase {
}
}
export default FilesTop;
export default FilesTop;
+2 -4
View File
@@ -1,5 +1,3 @@
const FilesUtil = {};
const FilesUtil = {
}
export default FilesUtil;
export default FilesUtil;
+4 -4
View File
@@ -1,7 +1,7 @@
import FilesTop from './FilesTop';
import FilesList from './FilesList';
import FilesDetail from './FilesDetail';
import FilesAdvancedSearch from './FilesAdvancedSearch';
import FilesDetail from './FilesDetail';
import FilesList from './FilesList';
import FilesTop from './FilesTop';
const ItemTypeFiles = {
Top: FilesTop,
@@ -10,4 +10,4 @@ const ItemTypeFiles = {
AdvancedSearch: FilesAdvancedSearch,
};
export default ItemTypeFiles;
export default ItemTypeFiles;
+25 -11
View File
@@ -1,7 +1,21 @@
import React from 'react';
import { MultiLang } from '../../config';
import AdvancedSearchQuery from '../lib/AdvancedSearchQuery';
import { Item, ItemBinder, ItemBook, ItemConference, ItemData, ItemFiles, ItemModel, ItemPaper, ItemPresentation, ItemSimulator, ItemStimulus, ItemTool, ItemUrl, ItemMemo } from '../lib/ItemUtil';
import type { MultiLang } from '../../config';
import type AdvancedSearchQuery from '../lib/AdvancedSearchQuery';
import type {
Item,
ItemBinder,
ItemBook,
ItemConference,
ItemData,
ItemFiles,
ItemMemo,
ItemModel,
ItemPaper,
ItemPresentation,
ItemSimulator,
ItemStimulus,
ItemTool,
ItemUrl,
} from '../lib/ItemUtil';
import ItemTypeBinder from './binder';
import ItemTypeBook from './book';
import ItemTypeConference from './conference';
@@ -52,7 +66,7 @@ const Top = (props: TopProps) => {
default:
return null;
}
}
};
interface ListProps {
lang: MultiLang;
@@ -90,7 +104,7 @@ const List = (props: ListProps) => {
default:
return null;
}
}
};
interface DetailProps {
lang: MultiLang;
@@ -128,7 +142,7 @@ const Detail = (props: DetailProps) => {
default:
return null;
}
}
};
interface AdvancedSearchProps {
lang: MultiLang;
@@ -167,13 +181,13 @@ const AdvancedSearch = (props: AdvancedSearchProps) => {
default:
return null;
}
}
};
const ItemType = {
Top,
List,
Detail,
AdvancedSearch
}
AdvancedSearch,
};
export default ItemType;
export default ItemType;
@@ -1,8 +1,9 @@
import React, { ChangeEvent, Component } from 'react';
import { MultiLang } from '../../../config';
import type { ReactElement } from 'react';
import { type ChangeEvent, Component } from 'react';
import type { MultiLang } from '../../../config';
import Functions from '../../../functions';
import AdvancedSearchQuery from '../../lib/AdvancedSearchQuery';
import { ItemSubTypes } from '../../lib/ItemUtil';
import type AdvancedSearchQuery from '../../lib/AdvancedSearchQuery';
import type { ItemSubTypes } from '../../lib/ItemUtil';
export interface AdvancedSearchBaseProps {
lang: MultiLang;
@@ -11,12 +12,11 @@ export interface AdvancedSearchBaseProps {
interface State {
show: boolean;
values: any;
values: Record<string, string>;
}
class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
protected type: string = 'base'
protected type: string = 'base';
protected title: string = 'Base';
protected query: AdvancedSearchQuery;
protected ignoreKeys: string[] = [];
@@ -26,7 +26,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
this.state = {
show: false,
values: {},
}
};
this.query = props.query;
this.handleChangeTitleCheck = this.handleChangeTitleCheck.bind(this);
}
@@ -49,14 +49,14 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
deleteIgnoreKey(key: string) {
if (this.ignoreKeys.includes(key)) {
this.ignoreKeys = this.ignoreKeys.filter((v) => {
return (v !== key);
return v !== key;
});
}
this.query.set(this.type, key, this.state.values[key]);
}
updateField(key: string, value: string) {
let values = Object.assign({}, this.state.values);
const values = Object.assign({}, this.state.values);
values[key] = value;
this.updateQuery(key, value);
this.setState({ values });
@@ -75,7 +75,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
this.setState({ show });
}
getRows(): { label: string, value: JSX.Element }[] {
getRows(): { label: string; value: ReactElement }[] {
return [];
}
@@ -84,20 +84,30 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
this.updateField(key, e.target.value);
};
return (
<input className="fieldInputText" type="text" value={this.state.values[key]} size={size} onChange={onChange} />
<input
className="fieldInputText"
type="text"
value={this.state.values[key]}
size={size}
onChange={onChange}
/>
);
}
renderFieldSelect(key: string, values: ItemSubTypes<any>) {
renderFieldSelect(key: string, values: ItemSubTypes<string>) {
const onChange = (e: ChangeEvent<HTMLSelectElement>) => {
this.updateField(key, e.target.value);
};
const options = values.map(({ type, label }, i) => {
return <option key={i} value={type}>{label}</option>;
const options = values.map(({ type, label }) => {
return (
<option key={type} value={type}>
{label}
</option>
);
});
return (
<select className="fieldSelect" value={this.state.values[key]} onChange={onChange}>
<option value=''>Any</option>
<option value="">Any</option>
{options}
</select>
);
@@ -107,37 +117,68 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
const onChange = (e: ChangeEvent<HTMLInputElement>) => {
if (e.target.checked) {
this.deleteIgnoreKey(keyYear);
keyMonth !== '' && this.deleteIgnoreKey(keyMonth);
keyMday !== '' && this.deleteIgnoreKey(keyMday);
if (keyMonth !== '') {
this.deleteIgnoreKey(keyMonth);
}
if (keyMday !== '') {
this.deleteIgnoreKey(keyMday);
}
} else {
this.setIgnoreKey(keyYear);
keyMonth !== '' && this.setIgnoreKey(keyMonth);
keyMday !== '' && this.setIgnoreKey(keyMday);
if (keyMonth !== '') {
this.setIgnoreKey(keyMonth);
}
if (keyMday !== '') {
this.setIgnoreKey(keyMday);
}
}
};
const month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const monthOptions = month.map((value, i) => {
return <option key={i} value={i + 1}>{value}</option>;
})
let mdayOptions: JSX.Element[] = [];
return (
<option key={value} value={i + 1}>
{value}
</option>
);
});
const mdayOptions: ReactElement[] = [];
for (let i = 1; i <= 31; i++) {
mdayOptions.push(<option key={i} value={i}>{i}</option>)
mdayOptions.push(
<option key={i} value={i}>
{i}
</option>
);
}
return (
<div className="fieldDate">
<input type="checkbox" onChange={onChange} />
{label.length !== 0 && <label className="fieldDateLabel">{label}</label>}
{keyMonth !== '' &&
<select value={this.state.values[keyMonth]} onChange={(e) => this.updateField(keyMonth, e.target.value)}>
<input type="checkbox" id={keyYear} onChange={onChange} />
{label.length !== 0 && (
<label className="fieldDateLabel" htmlFor={keyYear}>
{label}
</label>
)}
{keyMonth !== '' && (
<select
value={this.state.values[keyMonth]}
onChange={(e) => this.updateField(keyMonth, e.target.value)}
>
{monthOptions}
</select>
}
{keyMday !== '' &&
<select value={this.state.values[keyMday]} onChange={(e) => this.updateField(keyMday, e.target.value)}>
)}
{keyMday !== '' && (
<select
value={this.state.values[keyMday]}
onChange={(e) => this.updateField(keyMday, e.target.value)}
>
{mdayOptions}
</select>
}
<input type="text" value={this.state.values[keyYear]} size={5} onChange={(e) => this.updateField(keyYear, e.target.value)} />
)}
<input
type="text"
value={this.state.values[keyYear]}
size={5}
onChange={(e) => this.updateField(keyYear, e.target.value)}
/>
</div>
);
}
@@ -151,7 +192,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
const fields = rows.map((value, idx) => {
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
<tr key={idx}>
<tr key={value.label}>
<td className="head">{Functions.mlang(value.label, lang)}</td>
<td className={evenodd}>{value.value}</td>
</tr>
@@ -159,9 +200,7 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
});
return (
<table className="itemtypeFields outer">
<tbody>
{fields}
</tbody>
<tbody>{fields}</tbody>
</table>
);
}
@@ -173,7 +212,11 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
<tbody>
<tr>
<th align="left">
<input type="checkbox" checked={this.state.show} onChange={this.handleChangeTitleCheck} />
<input
type="checkbox"
checked={this.state.show}
onChange={this.handleChangeTitleCheck}
/>
{this.title}
</th>
</tr>
@@ -183,7 +226,6 @@ class AdvancedSearchBase extends Component<AdvancedSearchBaseProps, State> {
</div>
);
}
}
export default AdvancedSearchBase;
export default AdvancedSearchBase;
+8 -11
View File
@@ -1,7 +1,7 @@
import React, { Component, ReactNode } from 'react';
import { MultiLang } from '../../../config';
import { Component, type ReactNode } from 'react';
import type { MultiLang } from '../../../config';
import Functions from '../../../functions';
import { Item } from '../../lib/ItemUtil';
import type { Item } from '../../lib/ItemUtil';
export interface DetailBaseField {
label: string;
@@ -10,11 +10,10 @@ export interface DetailBaseField {
export interface DetailBaseProps {
lang: MultiLang;
item: Item
item: Item;
}
class DetailBase extends Component<DetailBaseProps> {
getFields(): DetailBaseField[] {
return [];
}
@@ -24,20 +23,18 @@ class DetailBase extends Component<DetailBaseProps> {
const elements = this.getFields().map((value, idx) => {
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return (
<tr key={idx}>
<tr key={value.label}>
<td className="head">{Functions.mlang(value.label, lang)}</td>
<td className={evenodd}>{value.value}</td>
</tr>
)
);
});
return (
<table className="outer itemDetail">
<tbody>
{elements}
</tbody>
<tbody>{elements}</tbody>
</table>
);
}
}
export default DetailBase;
export default DetailBase;
+9 -12
View File
@@ -1,15 +1,14 @@
import React, { Component } from 'react';
import { MultiLang } from '../../../config';
import ItemUtil, { Item } from '../../lib/ItemUtil';
import { Component } from 'react';
import type { MultiLang } from '../../../config';
import ItemUtil, { type Item } from '../../lib/ItemUtil';
import SimPFLinkIcon from './field/SimPFLinkIcon';
export interface ListBaseProps {
lang: MultiLang;
item: Item
};
item: Item;
}
class ListBase extends Component<ListBaseProps> {
protected label = '';
protected icon = '';
protected url: string;
@@ -21,8 +20,8 @@ class ListBase extends Component<ListBaseProps> {
this.simpfLinkUrl = ItemUtil.getSimPFLinkUrl(props.item.item_id);
}
renderBody() {
return <></>;
renderBody(): React.ReactNode {
return null;
}
render() {
@@ -34,9 +33,7 @@ class ListBase extends Component<ListBaseProps> {
<td className="listIcon">
<img src={this.icon} alt={this.label} />
</td>
<td>
{this.renderBody()}
</td>
<td>{this.renderBody()}</td>
<td className="listExtra">
<SimPFLinkIcon lang={lang} url={this.simpfLinkUrl} isDetail={false} />
</td>
@@ -47,4 +44,4 @@ class ListBase extends Component<ListBaseProps> {
}
}
export default ListBase;
export default ListBase;
+12 -8
View File
@@ -1,26 +1,30 @@
import React, { Component, Fragment } from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../../config';
import { Component, Fragment } from 'react';
import { Link } from 'react-router';
import type { MultiLang } from '../../../config';
import Functions from '../../../functions';
import ItemUtil, { ItemSubTypes } from '../../lib/ItemUtil';
import ItemUtil, { type ItemSubTypes } from '../../lib/ItemUtil';
export interface TopBaseProps {
lang: MultiLang;
}
class TopBase extends Component<TopBaseProps> {
protected type: string = '';
protected label: string = '';
protected icon: string = '';
protected description: string = '';
protected subTypes: ItemSubTypes<any> = [];
protected subTypes: ItemSubTypes<string> = [];
render() {
const { lang } = this.props;
const url = ItemUtil.getItemTypeSearchUrl(this.type);
const links = this.subTypes.map(({ type, label }, i) => {
return <Fragment key={i}>{i > 0 && ' / '}<Link to={url + '/' + type}>{label}</Link></Fragment>;
return (
<Fragment key={type}>
{i > 0 && ' / '}
<Link to={`${url}/${type}`}>{label}</Link>
</Fragment>
);
});
return (
<div>
@@ -44,4 +48,4 @@ class TopBase extends Component<TopBaseProps> {
}
}
export default TopBase;
export default TopBase;
+13 -6
View File
@@ -1,5 +1,4 @@
import React from 'react';
import { MultiLang } from '../../../../config';
import type { MultiLang } from '../../../../config';
interface Props {
lang: MultiLang;
@@ -13,9 +12,17 @@ const Author = (props: Props) => {
}
const elements = author.map((value, idx) => {
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
return <tr key={idx}><td className={evenodd}>{value}</td></tr>;
return (
<tr key={value}>
<td className={evenodd}>{value}</td>
</tr>
);
});
return <table><tbody>{elements}</tbody></table>;
}
return (
<table>
<tbody>{elements}</tbody>
</table>
);
};
export default Author;
export default Author;

Some files were not shown because too many files have changed in this diff Show More