18 Commits
Author SHA1 Message Date
Yoshihiro OKUMURA 9a0ba44fb0 chore: tidy up files left over from the conversion
- adopt bsi-ni's .gitignore, which is the vite template's
- delete dl-limit-items.csv, an exporter report that xoops-static-
  exporter now writes into its own data/
- add a description meta tag, which bsi-ni already had
- the ncu config is .ncurc.js now, not .ncurc.json
2026-09-11 19:18:07 +09:00
Yoshihiro OKUMURA 8e2a40bf92 feat: resolve data URLs through Config.BASE_URL
Every data URL was written as a root-absolute path, so the app only
worked when served from the document root. Derive a base from
import.meta.env.BASE_URL the way bsi-ni does, and prefix the URLs
with it. Routing still assumes the root: BrowserRouter takes no
basename in either site.
2026-09-11 19:17:56 +09:00
Yoshihiro OKUMURA d5d25d5657 build: align the TypeScript and vite setup with bsi-ni
The tsconfigs were still the ones the CRA conversion produced, while
bsi-ni had been brought in line with the npm create vite@latest
react-ts template.

- take the three tsconfigs from bsi-ni verbatim: ES2023, and
  types: ["vite/client"] in place of src/vite-env.d.ts, which the
  template no longer ships
- drop the CRA leftovers useDefineForClassFields, resolveJsonModule,
  esModuleInterop and forceConsistentCasingInFileNames
- pin typescript with ~ rather than ^, as bsi-ni does
- drop the redundant build.outDir and the server/preview port
  overrides, leaving vite's defaults
- fix a vite.config comment that still pointed at the removed etc/
2026-09-11 19:17:47 +09:00
Yoshihiro OKUMURA 1c73645552 docs: write down the deployment procedure
The old section said only "upload the contents of dist/", which misses
everything the modules/ layout needs.

- spell out the five steps: build, send the data, push the build, link
  the data in, check the result
- push the build before creating the symlinks, so that --delete needs
  no --exclude and each deploy recreates the links from scratch
- link the data in with a glob over static-contents/, which keeps
  rss.xml from being forgotten: it sits beside modules/ rather than
  inside it, so linking only modules leaves /rss.xml a 404 that
  npm run preview cannot reproduce
- record what an upgrade from v1.0.0 does and does not need
2026-09-11 18:51:54 +09:00
Yoshihiro OKUMURA 40c27aa70d refactor: move the site data under modules/
The dumped data shared a namespace with the SPA routes: /database
served both /database/item/1587 and /database/file/..., and the same
went for /credits and the pico modules. It only worked because a real
file wins over the SPA fallback. Group it by source XOOPS module the
way bsi-ni.brain.riken.jp does, so routes and data no longer collide.

- database/ -> modules/xoonips/, credits/ -> modules/credits/,
  manual_ja/ and primface/ -> modules/
- give each pico module its own modules/<dirname>/config.json instead
  of one shared pico/config.json, so its index sits next to its pages
- redirect the v1.0.0 /database/file/ links to their new home, and
  point the legacy download.php redirect there too
2026-09-11 18:28:44 +09:00
Yoshihiro OKUMURA d05ceb49a4 build: split dependencies into vendor chunks
The bundle was a single 745 kB chunk, and lokijs pulled in a bare `fs`
import that vite had to externalize.

- externalize fs and exclude it from dependency optimization
- split node_modules into vendor-react (react, react-dom, scheduler)
  and vendor-misc: react is over 200 kB on its own, so a single
  dependency chunk would stay above the 500 kB warning threshold, and
  it changes far less often than the rest
- configure this through rolldownOptions.output.codeSplitting, the
  native rolldown API: manualChunks is only a compatibility shim under
  vite 8 and did not group the react packages as asked, and
  rollupOptions is deprecated
2026-09-11 18:01:11 +09:00
Yoshihiro OKUMURA 4990f95d71 build: track @types/node patches within the 24.x line
@types/node was excluded from ncu via `reject`, which also hid patch
and minor releases inside the 24.x line we pin to match the Node 24
runtime. Its "latest" dist-tag points at the 22.x line, so merely
dropping the rule would report no updates either. Select the target
per package instead.

- replace .ncurc.json with .ncurc.js so target can be a function
- use the "minor" target for @types/node, "latest" for everything else
- pick up @types/node 24.13.4
2026-09-11 17:36:23 +09:00
Yoshihiro OKUMURA 2b47d882f7 refactor: clear all biome lint diagnostics
Biome reported 229 diagnostics after aligning the config with
bsi-ni.brain.riken.jp. Fix them all so `biome check` passes clean
without per-rule overrides.

- replace `any` in LokiJS queries with an `ItemFilter` interface and
  a single `asLokiQuery()` cast, matching bsi-ni
- type the XOOPS redirect maps as
  `Record<string, { key: string; isNumber: boolean }>`
- use `ItemSubTypes<string>` instead of `any` for sub item types
- join author lists with `.join(', ')` instead of index-keyed nodes
- give list elements stable keys derived from their own data
- return `React.ReactNode` from `ListBase.renderBody()`
- drop the temporary `noArrayIndexKey` override from biome.json
2026-09-11 17:28:44 +09:00
Yoshihiro OKUMURA 5a8d2f209f style: align the biome config with the other sites
- narrow lineWidth to 120 and use es5 trailing commas
- format JSON at the same indent as the rest, dropping the override
- exclude the vendored XOOPS theme under src/common/assets
- drop the stale static-contents and public exclusions
2026-09-11 17:19:20 +09:00
Yoshihiro OKUMURA c514de9b17 refactor: drop xregexp for the native dotAll flag
The only use was the s flag in the multilingual tag stripper, which
JavaScript has supported natively since ES2018.
2026-09-11 17:18:42 +09:00
Yoshihiro OKUMURA 3dcca6c848 docs: describe the current data layout
etc/ has moved to xoops-static-exporter, static-contents/ now sits next
to the repository, and the build no longer copies it into dist/.
2026-09-11 17:17:35 +09:00
Yoshihiro OKUMURA 5a8a26eaa4 chore: move XOOPS conversion tools to xoops-static-exporter
The dump scripts under etc/ are shared with the other archived sites,
so they now live in a dedicated repository instead of being
duplicated per site.
2026-09-11 17:17:12 +09:00
Yoshihiro OKUMURA e8a044950b refactor: load the generated JSON at runtime
The dumps were imported into the bundle, which tied a data refresh to a
rebuild and put generated content in the source tree. They now sit in
static-contents/ with the rest of the site data, as on
bsi-ni.brain.riken.jp.

- add siteData.ts, which fetches the six files in parallel
- hand them to the singletons from main.tsx before the first render, so
  components still read them synchronously
- type the four ranking lists, which have three different shapes
2026-09-11 17:15:41 +09:00
Yoshihiro OKUMURA 62bdc2876a refactor: replace the withRouter shim with router hooks
react-router removed withRouter in v6, and the shim that replaced it
kept nineteen components tied to injected router props. They now read
the state directly, matching how bsi-ni.brain.riken.jp is written.

- convert the remaining class components to function components
- call useLocation, useNavigate and useParams in place of the props
- drop src/common/lib/withRouter.tsx
2026-09-11 17:10:58 +09:00
Yoshihiro OKUMURA a312a420ae fix: remove the stray td elements from the center column
They are left over from the XOOPS table layout, render nothing, and
make React report invalid nesting under a div.
2026-09-11 17:02:05 +09:00
Yoshihiro OKUMURA 9808d6692c build: keep static-contents out of the build output
writeBundle copied all 10 GB of it into dist/ on every build, although
the web server maps the directory in directly.

- drop the copy, which takes dist from 10 GB to 4.8 MB
- mount the directory on the preview server too, so that previewing a
  build still behaves like production
2026-09-11 17:02:05 +09:00
Yoshihiro OKUMURA f6bf706372 chore: move static-contents next to the repository
The generated site data is not part of the source tree, so it now sits
beside the checkout, matching the bsi-ni.brain.riken.jp layout.

- resolve the directory from config.root rather than the process cwd
- drop the ignore rule, which no longer matches anything
2026-09-11 17:02:03 +09:00
Yoshihiro OKUMURA d240bbae03 feat: migrate from Create React App to Vite
The CRA toolchain was several major versions behind and no longer
maintained, so the whole build, lint and runtime stack is replaced.

- replace react-scripts with Vite 8 and TypeScript 7
- upgrade to React 19 and react-router 8
- swap unmaintained libraries: react-html-parser, axios, react-ga,
  react-image-lightbox, react-helmet, moment, react-spinner-material
- replace ESLint with Biome for linting and formatting
- switch the package manager from yarn to npm
- serve static-contents/ with sirv in dev and copy it into the bundle
- keep a withRouter shim so the class components can stay as they are
  for now
2026-09-11 16:48:14 +09:00
195 changed files with 6379 additions and 16989 deletions
+21 -33
View File
@@ -1,37 +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/items.json
/public/database/file
/public/primface/images
/public/primface/*.json
/public/manual_ja/images
/public/manual_ja/*.json
/src/database/assets/*.json
/src/credits/assets/*.json
/src/forum/assets/*.json
/src/pico/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'),
};
+157 -25
View File
@@ -1,44 +1,176 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
# Visiome Platform
## Available Scripts
Static front-end for the archived [Visiome Platform](http://visiome.neuroinf.jp/) site,
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 XooNIps/XOOPS
installation by [xoops-static-exporter](https://git.ni.riken.jp/niu/xoops-static-exporter)
(`sites/visiome.neuroinf.jp/`).
### `npm run build`
All of it lives in `static-contents/`, which sits next to the repository rather
than inside it:
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.
```
visiome.neuroinf.jp/
├── visiome.neuroinf.jp/ this repository
└── static-contents/
├── modules/ one directory per source XOOPS module
│ ├── credits/ credits.json
│ ├── manual_ja/ config.json, <content id>.json, images/
│ ├── primface/ config.json, <content id>.json, images/
│ └── xoonips/ tree.json, items.json, file/, ...
└── rss.xml
```
The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed!
Each pico module keeps its own `config.json` — the index of its categories and
pages — next to the page bodies it describes.
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
The dev and preview servers mount that directory at the site root. It is
deliberately kept out of `dist/`: it runs to gigabytes, and the web server maps
it in directly. It is generated content and is not tracked in git.
### `npm run eject`
## Scripts
**Note: this is a one-way operation. Once you `eject`, you cant go back!**
| 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 |
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.
`@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.
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.
There is currently no test suite.
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.
## Deployment
## Learn More
Build locally and copy the result up; the server does not need a toolchain.
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
### 1. Build and check
To learn React, check out the [React documentation](https://reactjs.org/).
```sh
npm ci
npm run check # biome, writes fixes
npm run build # runs tsc -b, then vite build
npm run preview # localhost:4173 , serves dist/ + static-contents/
```
`dist/` is a few MB. `static-contents/` is never part of it — the dev and
preview servers mount it, and in production the web server maps it in.
### 2. Send up the site data
About 10 GB, almost all of it under `modules/xoonips/file/`. The server mirrors
the local layout: `static-contents/` sits next to the document root. Run this
from the directory that holds both the repository and `static-contents/`:
```
/data/www/visiome.neuroinf.jp/
├── html/ document root
└── static-contents/
```
```sh
rsync -a --delete static-contents/ \
user@server:/data/www/visiome.neuroinf.jp/static-contents/
```
### 3. Push the build
```sh
rsync -a --delete dist/ user@server:/data/www/visiome.neuroinf.jp/html/
```
`--delete` clears out the previous build, and with it the data symlinks from
step 4 — that is deliberate, they are recreated right after. Anything left over
from an older deployment goes too.
### 4. Link the site data into the document root
```sh
cd /data/www/visiome.neuroinf.jp/html
ln -s ../static-contents/* .
```
That links every top-level entry of `static-contents/` — currently `modules/`
and `rss.xml`:
```
/data/www/visiome.neuroinf.jp/html/
├── index.html from dist/
├── assets/ from dist/
├── .htaccess from dist/
├── modules -> ../static-contents/modules
└── rss.xml -> ../static-contents/rss.xml
```
The glob keeps the two in step, which matters because `rss.xml` sits beside
`modules/` rather than inside it: linking `modules` alone leaves `/rss.xml`
returning 404, a break that `npm run preview` cannot reproduce because it mounts
the whole directory. It also picks up anything added to `static-contents/`
later. Note that it skips dotfiles, of which there are none today.
The links are relative, so the whole tree can be moved without rewriting them.
Run steps 3 and 4 back to back. In between, `/modules/...` and `/rss.xml` are
404 because step 3 removed the links; that is why plain `ln -s` works here
without `-f`, and why a stale or wrong link repairs itself on the next deploy.
Apache needs `Options FollowSymLinks`, `AllowOverride All` and
`Require all granted` on the document root, and `Options FollowSymLinks` with
`Require all granted` on `static-contents/`.
Use symlinks rather than `Alias`. An `Alias /modules ...` maps the URL outside
the document root, so `.htaccess` no longer applies to it and every legacy
`/modules/xoonips/*.php` URL stops reaching the SPA redirect handler. With
symlinks the normal precedence still holds: real files are served directly and
everything else falls through to `index.html`.
### 5. Check the deployed site
```sh
curl -I https://visiome.neuroinf.jp/rss.xml # 200
curl -I https://visiome.neuroinf.jp/database/file/3.png # 301
curl -I https://visiome.neuroinf.jp/modules/xoonips/tree.json # 200
```
Then load `/`, an item page, `/primface` and `/manual_ja/manual.html` in a
browser and confirm the images resolve.
### Upgrading from v1.0.0
v1.0.0 served the data from `database/`, `credits/`, `pico/`, `manual_ja/` and
`primface/` at the site root; it all moved under `modules/`. Nothing extra is
needed: `--delete` in step 2 clears the old data layout, and `--delete` in
step 3 removes the v1.0.0 symlinks from the document root along with the old
build.
Run steps 2 to 4 back to back: in between, the live v1.0.0 build points at paths
that no longer exist.
The v1.0.0 download links stay alive. `.htaccess` sends `/database/file/...` to
`/modules/xoonips/file/...` with a 301. The links inside `rss.xml` are legacy
XOOPS URLs (`/modules/xoonips/detail.php?item_id=`), unaffected by the move and
resolved by the SPA as before.
## Google Analytics
`GOOGLE_ANALYTICS_TRACKING_ID` in `src/config.ts` is empty, which disables
tracking. Set a GA4 measurement ID (`G-XXXXXXXXXX`) to enable it; the old
Universal Analytics property was shut down in 2023.
+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"]
},
"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(string $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(string $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, 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;
}
public static function getMimeType($fpath)
{
$finfo = finfo_open(FILEINFO_MIME);
$mime = finfo_file($finfo, $fpath);
finfo_close($finfo);
$mime = preg_replace('/(;.*)$/', '', $mime);
return $mime;
}
}
-6
View File
@@ -1,6 +0,0 @@
<?php
$mainfile = '/data/www/platform/html/mainfile.php';
$XOONIPS_SIMPF_LINKFILE = __DIR__.'/simpflink.csv';
$XOOPS_MODULE_PICO = ['manual_ja', 'primface'];
-129
View File
@@ -1,129 +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);
$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;
}
-146
View File
@@ -1,146 +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;
$content = preg_replace_callback('/<img ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use (&$imageId, $pico, $data, $link) {
$url = $matches[2];
if (!preg_match('/^http/', $url)) {
$xpath = dirname($link);
$wrap_fpath = XOOPS_TRUST_PATH._MD_PICO_WRAPBASE.'/'.$pico.'/'.$url;
if (file_exists($wrap_fpath)) {
$url = $wrap_fpath;
} else {
$url = XOOPS_URL.'/modules/'.$pico.'/'.($xpath === '.' ? '' : '/').$url;
}
}
$fname = '/'.$pico.'/images/'.$data['id'].'_'.$imageId.'.dat';
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
if (preg_match('/^\//', $url)) {
if (!MyDumpTool::fileCopy($url, $fpath)) {
exit('failed to copy file: '.$url.PHP_EOL);
}
} else {
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);
$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
-53
View File
@@ -1,53 +0,0 @@
<?php
$SITENAME = 'Visiome Platform';
$HOSTNAME = 'visiome';
$FQDN = $HOSTNAME.'.neuroinf.jp';
$URL = 'https://'.$FQDN;
$XOOPS_URL = $URL;
$JSON = __DIR__.'/../src/database/assets/recent-contents.json';
if (!file_exists($JSON)) {
echo 'Error: Json file not found:'.$JSON.PHP_EOL;
exit(1);
}
$items = json_decode(file_get_contents($JSON), true);
//var_dump($items);
$xml = <<< HEAD
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="${XOOPS_URL}/rss.xml" rel="self" type="application/rss+xml" />
<title>${SITENAME}</title>
<link>${URL}</link>
<description>${SITENAME}</description>
<language>en</language>
HEAD;
foreach($items as $item) {
$title = htmlspecialchars($item['title'], ENT_QUOTES);
$url = $XOOPS_URL.'/modules/xoonips/detail.php?'.($item['doi'] !== '' ? 'id='.$item['doi'] : 'item_id='.$item['item_id']);
$pubDate = gmdate(DATE_RSS, $item['last_update_date']);
$xml .= <<< ITEM
<item>
<title>$title</title>
<link>$url</link>
<pubDate>$pubDate</pubDate>
<guid>$url</guid>
<description></description>
<category>Incoming Public Item</category>
</item>
ITEM;
}
$xml .= <<< FOOTER
</channel>
</rss>
FOOTER;
file_put_contents(__DIR__.'/rss.xml', $xml);
-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
+10 -5
View File
@@ -1,19 +1,24 @@
<!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 name="robots" content="index,follow" />
<meta
name="description"
content="Visiome Platform is a web-based database system with a variety of digital research resources in Vision Science. This platform provides several types of contents, such as Experimental data, Mathematical model, Illusion stimulus, Analytical tools."
/>
<meta name="robots" content="index,follow" />
<meta name="keywords" content="neuroinformatics, xoonips, database, visiome platform, vision" />
<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>Visiome Platform - Digital archive for vision science</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>
+1959
View File
File diff suppressed because it is too large Load Diff
+40 -58
View File
@@ -1,60 +1,42 @@
{
"name": "visiome",
"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",
"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"
]
}
"name": "visiome",
"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",
"modern-normalize": "^3.0.1",
"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-router": "^8.3.1",
"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": "Visiome Platform",
"name": "Visiome Platform",
"icons": [
{
"src": "favicon.ico",
"sizes": "16x16",
"type": "image/x-icon"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
"short_name": "Visiome Platform",
"name": "Visiome Platform",
"icons": [
{
"src": "favicon.ico",
"sizes": "16x16",
"type": "image/x-icon"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
+1 -1
View File
@@ -1 +1 @@
@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;
+44 -65
View File
@@ -1,83 +1,62 @@
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 Header from './Header';
import LeftColumn from './LeftColumn';
const isAnalyticsEnabled = Config.GOOGLE_ANALYTICS_TRACKING_ID !== '';
interface Props extends RouteComponentProps, ReactCookieProps { }
interface State {
lang: MultiLang;
if (isAnalyticsEnabled) {
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID);
}
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 (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 (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 (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 (
<>
<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>
</>
);
}
}
return (
<>
<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>
</>
);
};
export default withCookies(withRouter(AppRoot));
export default AppRoot;
+9 -15
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 VisiomeLinks from '../custom/blocks/VisiomeLinks';
import VisiomeNewItems from '../custom/blocks/VisiomeNewItems';
import VisiomePreviewList from '../custom/blocks/VisiomePreviewList';
@@ -17,12 +16,6 @@ const CenterBlocks = (props: Props) => {
const { lang } = props;
return (
<div className="block">
<div className="clearfix">
<td className="centerLcolumn">
</td>
<td className="centerRcolumn">
</td>
</div>
<div className="centerCcolumn">
<div className="block">
<div className="blockTitle">Welcome to Visiome Platform !</div>
@@ -57,15 +50,16 @@ const CenterBlocks = (props: Props) => {
</div>
</div>
);
}
};
const CenterColumn = (props: Props) => {
const { lang } = props;
return (
<div className="centercolumn">
<Switch>
<Route exact path="/" render={() => <CenterBlocks lang={lang} />} />
</Switch>
<Routes>
<Route path="/" element={<CenterBlocks lang={lang} />} />
<Route path="*" element={null} />
</Routes>
<div className="block">
<MainContent lang={lang} />
</div>
@@ -74,6 +68,6 @@ const CenterColumn = (props: Props) => {
</div>
</div>
);
}
};
export default CenterColumn;
export default CenterColumn;
+3 -4
View File
@@ -1,17 +1,16 @@
import React from 'react';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
interface Props {
lang: MultiLang;
}
const Footer = (props: Props) => {
const Footer = (_props: Props) => {
return (
<footer className="footer">
<hr />
<span className="copyright">Copyright (C) 2018 Neuroinformatics Unit, RIKEN Center for Brain Science</span>
</footer>
);
}
};
export default Footer;
+82 -24
View File
@@ -1,6 +1,6 @@
import React from 'react';
import { Link, RouteComponentProps, withRouter } from 'react-router-dom';
import { MultiLang } from '../config';
import type { MouseEvent } from 'react';
import { Link, useNavigate } from 'react-router';
import type { MultiLang } from '../config';
import CreditsUtils from '../credits/lib/CreditsUtils';
import Functions from '../functions';
import imageHeaderLeft from './assets/theme/images/header_left.gif';
@@ -10,22 +10,23 @@ import iconHelp from './assets/theme/images/icon_help.gif';
import iconHome from './assets/theme/images/icon_home.gif';
import LangFlag from './lib/LangFlag';
interface Props extends RouteComponentProps {
interface Props {
lang: MultiLang;
}
const Header = (props: Props) => {
const { lang } = props;
const onClickMap = (e: React.MouseEvent<HTMLAreaElement>, url: string) => {
const navigate = useNavigate();
const onClickMap = (e: MouseEvent<HTMLAreaElement>, url: string) => {
e.preventDefault();
if (url.match(/^https?:\/\//)) {
window.open(url, '_blank');
return;
}
props.history.push(url);
}
void navigate(url);
};
const urlHome = '/';
const urlHelp = (lang === 'en' ? 'https://xoonips.osdn.jp/manuals/usersman-en/index.html' : '/manual_ja/manual.html');
const urlHelp = lang === 'en' ? 'https://xoonips.osdn.jp/manuals/usersman-en/index.html' : '/manual_ja/manual.html';
const urlContact = CreditsUtils.getIndexUrl();
const titleHome = 'Home';
const titleHelp = 'Help';
@@ -37,31 +38,88 @@ const Header = (props: Props) => {
</div>
<div className="menu_bar clearfix">
<div className="menu_img">
<img src={iconHome} alt={titleHome} useMap="#home" /><br />
<Link to={urlHome} title={titleHome}>{titleHome}</Link>
<img src={iconHome} alt={titleHome} useMap="#home" />
<br />
<Link to={urlHome} title={titleHome}>
{titleHome}
</Link>
</div>
<div className="menu_img">
<img src={iconHelp} alt={titleHelp} useMap="#help" /><br />
{lang === 'en' ?
<a href={urlHelp} title={titleHelp} target="_blank" rel="noopener noreferrer">{titleHelp}</a> :
<Link to={urlHelp} title={titleHelp}>{titleHelp}</Link>
}
<img src={iconHelp} alt={titleHelp} useMap="#help" />
<br />
{lang === 'en' ? (
<a href={urlHelp} title={titleHelp} target="_blank" rel="noopener noreferrer">
{titleHelp}
</a>
) : (
<Link to={urlHelp} title={titleHelp}>
{titleHelp}
</Link>
)}
</div>
<div className="menu_img">
<img src={iconContact} alt={titleContact} useMap="#contact" /><br />
<Link to={urlContact} title={titleContact}>{titleContact}</Link>
<img src={iconContact} alt={titleContact} useMap="#contact" />
<br />
<Link to={urlContact} title={titleContact}>
{titleContact}
</Link>
</div>
<div className="menu_img">
<img src={imageHeaderRight} alt="eye" /><br />
<img src={imageHeaderRight} alt="eye" />
<br />
<LangFlag lang="en" /> <LangFlag lang="ja" />
</div>
</div>
<map name="logo"><area shape="rect" coords="13,20,191,54" title={titleHome} alt={titleHome} href={urlHome} onClick={(e) => { onClickMap(e, urlHome); }} /></map>
<map name="home"><area shape="circle" coords="37,63,17" title={titleHome} alt={titleHome} href={urlHome} onClick={(e) => { onClickMap(e, urlHome); }} /></map>
<map name="help"><area shape="circle" coords="37,63,17" title={titleHelp} alt={titleHelp} href={urlHelp} onClick={(e) => { onClickMap(e, urlHelp); }} /></map>
<map name="contact"><area shape="circle" coords="37,63,17" title={titleContact} alt={titleContact} href={urlContact} onClick={(e) => { onClickMap(e, urlContact); }} /></map>
<map name="logo">
<area
shape="rect"
coords="13,20,191,54"
title={titleHome}
alt={titleHome}
href={urlHome}
onClick={(e) => {
onClickMap(e, urlHome);
}}
/>
</map>
<map name="home">
<area
shape="circle"
coords="37,63,17"
title={titleHome}
alt={titleHome}
href={urlHome}
onClick={(e) => {
onClickMap(e, urlHome);
}}
/>
</map>
<map name="help">
<area
shape="circle"
coords="37,63,17"
title={titleHelp}
alt={titleHelp}
href={urlHelp}
onClick={(e) => {
onClickMap(e, urlHelp);
}}
/>
</map>
<map name="contact">
<area
shape="circle"
coords="37,63,17"
title={titleContact}
alt={titleContact}
href={urlContact}
onClick={(e) => {
onClickMap(e, urlContact);
}}
/>
</map>
</header>
);
}
};
export default withRouter(Header);
export default Header;
+2 -3
View File
@@ -1,5 +1,4 @@
import React from 'react';
import { MultiLang } from '../config';
import type { MultiLang } from '../config';
import CreditsMenu from '../credits/block/CreditsMenu';
import IndexTree from '../database/blocks/IndexTree';
import Search from '../database/blocks/Search';
@@ -46,6 +45,6 @@ const LeftColumn = (props: Props) => {
</div>
</div>
);
}
};
export default LeftColumn;
+22 -19
View File
@@ -1,6 +1,5 @@
import React from 'react';
import { Redirect, Route, Switch } from 'react-router-dom';
import Config, { MultiLang } from '../config';
import { Navigate, Route, Routes } from 'react-router';
import Config, { type MultiLang } from '../config';
import Credits from '../credits/Credits';
import CreditsXoopsPathRedirect from '../credits/CreditsXoopsPathRedirect';
import Database from '../database/Database';
@@ -17,22 +16,26 @@ const MainContent = (props: Props) => {
const { lang } = props;
return (
<div className="mainContent">
<Switch>
<Route exact path="/database/list/6940" render={() => <Redirect to="/primface" />} />
<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 path="/modules/xoonips" render={() => <DatabaseXoopsPathRedirect lang={lang} />} />
<Route path="/modules/credits" render={() => <CreditsXoopsPathRedirect lang={lang} />} />
{Config.PICO_MODULES.map((name) =>
<Route key={name} path={'/modules/' + name} render={() => <PicoXoopsPathRedirect lang={lang} name={name} />} />
)}
<Route component={XoopsPathRedirect} />
</Switch>
<Routes>
<Route path="/database/list/6940" element={<Navigate to="/primface" replace />} />
<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="/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="*" element={<XoopsPathRedirect lang={lang} />} />
</Routes>
</div>
);
}
};
export default MainContent;
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;
+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;
}
+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 -38
View File
@@ -1,48 +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 !== '/') {
this.timer = setTimeout(() => {
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;
+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;
+90 -58
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,90 +22,116 @@ 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 isExternal = !url || /^(mailto|https?:?\/\/)/.test(url);
if (!isExternal) {
const style = (node_.attribs && node_.attribs['style']) || '';
const title = (node_.attribs && node_.attribs['title']) || '';
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;
}
}
}
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 isExternal = !url || /^(mailto|https?:?\/\/)/.test(url);
if (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;
@@ -122,7 +154,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;
+10 -2
View File
@@ -1,9 +1,16 @@
const SITE_TITLE = 'Visiome Platform';
const SITE_SLOGAN = 'Digital archive for vision science';
const GOOGLE_ANALYTICS_TRACKING_ID = 'UA-2787276-1';
// GA4 measurement ID (G-XXXXXXXXXX); empty disables tracking.
// The former Universal Analytics property (UA-2787276-1) was shut down in 2023.
const GOOGLE_ANALYTICS_TRACKING_ID = '';
const XOONIPS_ITEMTYPES = ['binder', 'model', 'data', 'stimulus', 'tool', 'presentation', 'paper', 'book', 'url'];
const PICO_MODULES = ['manual_ja', 'primface'];
// 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 +19,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';
@@ -14,13 +13,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;
+19 -11
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(): CreditsMenu[] {
const menu: CreditsMenu[] = [];
this.data.pages.forEach((page) => {
this.credits.pages.forEach((page) => {
menu.push({ title: page.title, link: this.getPageUrl(page.pid) });
});
menu.push({ title: this.getAboutUsTitle(), link: this.getIndexUrl() });
@@ -48,7 +54,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;
}
@@ -56,7 +64,7 @@ class CreditsUtils {
}
countPages(): number {
return this.data.pages.length;
return this.credits.pages.length;
}
getAboutUsTitle(): string {
@@ -64,8 +72,8 @@ class CreditsUtils {
}
getAboutUsContent(): string {
return this.data.organization;
return this.credits.organization;
}
}
export default new CreditsUtils(creditsJson);
export default new CreditsUtils();
+38 -13
View File
@@ -1,11 +1,10 @@
import React from 'react';
import bannerJapanNode from '../../common/assets/theme/images/banner_incf-japan-node.gif';
import bannerNIF from '../../common/assets/theme/images/banner_nif.gif';
import bannerCBS from '../../common/assets/theme/images/banner_riken-cbs.gif';
import bannerXooNIps from '../../common/assets/theme/images/banner_xoonips.gif';
import LinkImage from "../../common/lib/LinkImage";
import { MultiLang } from "../../config";
import Functions from "../../functions";
import LinkImage from '../../common/lib/LinkImage';
import type { MultiLang } from '../../config';
import Functions from '../../functions';
interface Props {
lang: MultiLang;
@@ -13,17 +12,43 @@ interface Props {
const VisiomeLinks = (props: Props) => {
const { lang } = props;
const iconJapanNode = <LinkImage image={bannerJapanNode} title={Functions.mlang('[en]INCF Japan Node[/en][ja]INCF 日本ノード[/ja]', lang)} url={'https://www.neuroinf.jp/'} />;
const iconXooNIps = <LinkImage image={bannerXooNIps} title={Functions.mlang('[en]The XooNIps Project[/en][ja]XooNIps 公式サイト[/ja]', lang)} url={'https://xoonips.osdn.jp/'} />;
const iconCBS = <LinkImage image={bannerCBS} title={Functions.mlang('[en]RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター[/ja]', lang)} url={'https://cbs.riken.jp/'} />;
const iconNIF = <LinkImage image={bannerNIF} title={Functions.mlang('NIF: Neuroscience Information Framework', lang)} url={'https://www.neuinfo.org/'} />;
const iconJapanNode = (
<LinkImage
image={bannerJapanNode}
title={Functions.mlang('[en]INCF Japan Node[/en][ja]INCF 日本ノード[/ja]', lang)}
url={'https://www.neuroinf.jp/'}
/>
);
const iconXooNIps = (
<LinkImage
image={bannerXooNIps}
title={Functions.mlang('[en]The XooNIps Project[/en][ja]XooNIps 公式サイト[/ja]', lang)}
url={'https://xoonips.osdn.jp/'}
/>
);
const iconCBS = (
<LinkImage
image={bannerCBS}
title={Functions.mlang(
'[en]RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター[/ja]',
lang
)}
url={'https://cbs.riken.jp/'}
/>
);
const iconNIF = (
<LinkImage
image={bannerNIF}
title={Functions.mlang('NIF: Neuroscience Information Framework', lang)}
url={'https://www.neuinfo.org/'}
/>
);
return (
<div style={{ fontSize: '10pt' }}>
This site is a part of {iconJapanNode}, and is powered by {iconXooNIps}.
The server for this site is located in {iconCBS}.
{iconNIF}
This site is a part of {iconJapanNode}, and is powered by {iconXooNIps}. The server for this site is located
in {iconCBS}.{iconNIF}
</div>
);
}
};
export default VisiomeLinks;
export default VisiomeLinks;
+22 -16
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 Functions from '../../functions';
import { format } from 'date-fns';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import imageStar from '../../database/assets/images/star.gif';
import contents from '../../database/assets/recent-contents.json';
import ItemUtil, { ItemCore } from '../../database/lib/ItemUtil';
import ItemUtil, { type ItemCore } from '../../database/lib/ItemUtil';
import Functions from '../../functions';
import { siteData } from '../../siteData';
import VisiomePreviewList from './VisiomePreviewList';
interface Props {
@@ -16,25 +15,32 @@ const dummyItemIds = [6412, 6975, 6748, 6448, 6735, 6894, 6981, 6722, 6721, 6177
const VisiomeNewItems = (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 order = String(idx + 1) + (lang === 'en' ? Functions.ordinal(idx + 1) : '位')
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={item.item_id}>
{date} <Link to={url} title={title}>{title}</Link>
{idx === 0 && <img style={{ marginLeft: '3px', verticalAlign: 'middle' }} src={imageStar} alt={order} />}
{date}{' '}
<Link to={url} title={title}>
{title}
</Link>
{idx === 0 && (
<img style={{ marginLeft: '3px', verticalAlign: 'middle' }} src={imageStar} alt={order} />
)}
</div>
);
});
const itemIds = contents.map((itemCore: ItemCore) => { return itemCore.item_id; });
const itemIds = siteData().recentContents.map((itemCore: ItemCore) => {
return itemCore.item_id;
});
return (
<div>
<VisiomePreviewList lang={lang} number={10} itemIds={itemIds.concat(dummyItemIds)} />
<div>{list}</div>
</div >
</div>
);
}
};
export default VisiomeNewItems;
export default VisiomeNewItems;
+23 -12
View File
@@ -1,8 +1,9 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config';
import type { ReactElement } from 'react';
import { Component } from 'react';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import ItemUtil, { type Item } from '../../database/lib/ItemUtil';
import Functions from '../../functions';
import ItemUtil, { Item } from '../../database/lib/ItemUtil';
interface Props {
lang: MultiLang;
@@ -20,18 +21,19 @@ const findPreview = (item: Item) => {
});
};
class VisiomePreviewList extends Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
previews: [],
}
};
}
componentDidMount() {
const { number, itemIds } = this.props;
const uniqItemIds = itemIds.filter((itemId, idx, self) => { return self.indexOf(itemId) === idx; });
const uniqItemIds = itemIds.filter((itemId, idx, self) => {
return self.indexOf(itemId) === idx;
});
ItemUtil.getList(uniqItemIds, (results) => {
const items: Item[] = [];
results.data.forEach((item) => {
@@ -49,7 +51,7 @@ class VisiomePreviewList extends Component<Props, State> {
render() {
const { lang } = this.props;
const previews: JSX.Element[] = [];
const previews: ReactElement[] = [];
this.state.previews.forEach((item) => {
const file = findPreview(item);
if (typeof file === 'undefined') {
@@ -59,13 +61,22 @@ class VisiomePreviewList extends Component<Props, State> {
const title = Functions.mlang(item.title, lang);
const image = ItemUtil.getPreviewFileUrl(file);
previews.push(
<div key={item.item_id} style={{ float: 'left', textAlign: 'center', margin: '5px 15px', width: '100px', height: '100px' }}>
<Link to={url}><img src={image} alt={title} title={title} /></Link>
<div
key={item.item_id}
style={{ float: 'left', textAlign: 'center', margin: '5px 15px', width: '100px', height: '100px' }}
>
<Link to={url}>
<img src={image} alt={title} title={title} />
</Link>
</div>
);
});
return <div className="clearfix" style={{ width: '680px', margin: '0 auto' }}>{previews}</div>;
return (
<div className="clearfix" style={{ width: '680px', margin: '0 auto' }}>
{previews}
</div>
);
}
}
export default VisiomePreviewList;
export default VisiomePreviewList;
+33 -20
View File
@@ -1,10 +1,10 @@
import React, { Fragment } from 'react';
import { Link } from 'react-router-dom';
import { MultiLang } from '../../config';
import Functions from '../../functions';
import { Fragment } from 'react';
import { Link } from 'react-router';
import type { MultiLang } from '../../config';
import imageStar from '../../database/assets/images/star.gif';
import rankings from '../../database/assets/rankings.json';
import ItemUtil, { ItemCore } from '../../database/lib/ItemUtil';
import ItemUtil, { type ItemCore } from '../../database/lib/ItemUtil';
import Functions from '../../functions';
import { siteData } from '../../siteData';
import VisiomePreviewList from './VisiomePreviewList';
interface Props {
@@ -12,8 +12,8 @@ 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 dummyItemIds = [5979, 6291, 6106, 5953, 5998, 6448, 6163, 6434, 6181, 6069];
@@ -23,30 +23,43 @@ const VisiomeTop10Items = (props: Props) => {
const items = [
{
title: Functions.mlang('[en]Frequently accessed items[/en][ja]頻繁に閲覧されるアイテム[/ja]', 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, lang);
const order = orderLabel(idx + 1, lang);
itemIds.push(item.item_id);
return (
<div key={idx}>
{order} <Link to={url} title={title}>{title}</Link>
{idx === 0 && <img style={{ marginLeft: '3px', verticalAlign: 'middle' }} src={imageStar} alt={order} />}
<div key={url}>
{order}{' '}
<Link to={url} title={title}>
{title}
</Link>
{idx === 0 && (
<img style={{ marginLeft: '3px', verticalAlign: 'middle' }} src={imageStar} alt={order} />
)}
</div>
);
}),
},
{
title: Functions.mlang('[en]Frequently downloaded items[/en][ja]頻繁にダウンロードされるアイテム[/ja]', lang),
list: rankings.downloaded.map((item, idx) => {
title: Functions.mlang(
'[en]Frequently downloaded items[/en][ja]頻繁にダウンロードされるアイテム[/ja]',
lang
),
list: siteData().rankings.downloaded.map((item, idx) => {
const url = ItemUtil.getUrl(item as ItemCore);
const title = Functions.mlang(item.title, lang);
const order = orderLabel(idx + 1, lang);
itemIds.push(item.item_id);
return (
<div key={idx}>
{order} <Link to={url} title={title}>{title}</Link>
{idx === 0 && <img style={{ marginLeft: '3px', verticalAlign: 'middle' }} src={imageStar} alt={order} />}
<div key={url}>
{order}{' '}
<Link to={url} title={title}>
{title}
</Link>
{idx === 0 && (
<img style={{ marginLeft: '3px', verticalAlign: 'middle' }} src={imageStar} alt={order} />
)}
</div>
);
}),
@@ -57,7 +70,7 @@ const VisiomeTop10Items = (props: Props) => {
<VisiomePreviewList lang={lang} number={10} itemIds={itemIds.concat(dummyItemIds)} />
{items.map((item, idx) => {
return (
<Fragment key={idx}>
<Fragment key={item.title}>
{idx !== 0 && <hr />}
<span>{item.title}</span>
<div>{item.list}</div>
@@ -66,6 +79,6 @@ const VisiomeTop10Items = (props: Props) => {
})}
</div>
);
}
};
export default VisiomeTop10Items;
export default VisiomeTop10Items;
+62 -16
View File
@@ -1,6 +1,5 @@
import React from 'react';
import NoticeSiteHasBeenArchived from '../../common/lib/NoticeSiteHasBeenArchived';
import { MultiLang } from '../../config';
import type { MultiLang } from '../../config';
interface Props {
lang: MultiLang;
@@ -9,29 +8,76 @@ interface Props {
const Welcome = (props: Props) => {
const { lang } = props;
const announce = {
'en':
en: (
<p>
Visiome Platform is a web-based database system with a variety of digital research resources in Vision Science.
This platform provides several types of contents, such as Experimental data, Mathematical model, Illusion stimulus, Analytical tools. Archive files may be written in any formats and may include explanatory figures, program sources, readme files, and other related files.
The readme file describes the purpose and usage of the archive file. This platform provides a data sharing framework, and thus, users can improve the reproducibility of simulations.
Users can also browse the platform contents via branch sites (<a href="http://www.psy.ritsumei.ac.jp/~akitaoka/cataloge.html" target="_blank" rel="noopener noreferrer">A catalogue of illusions</a>, <a href="http://visitope.org/visualstimuluslist.html?lang=en" target="_blank" rel="noopener noreferrer">Visitope</a>, <a href="http://www.youtube.com/user/VisiomeChannel?feature=watch" target="_blank" rel="noopener noreferrer">Visiome Channel</a>), which introduce user friendly view of items such as basic images and original artworks of visual illusions with high resolution.
The items in Visiome Platform are useful not only for reproducing the published results, but also for advancing and expanding the research in Vision Science.
</p>,
'ja':
Visiome Platform is a web-based database system with a variety of digital research resources in Vision
Science. This platform provides several types of contents, such as Experimental data, Mathematical
model, Illusion stimulus, Analytical tools. Archive files may be written in any formats and may include
explanatory figures, program sources, readme files, and other related files. The readme file describes
the purpose and usage of the archive file. This platform provides a data sharing framework, and thus,
users can improve the reproducibility of simulations. Users can also browse the platform contents via
branch sites (
<a
href="http://www.psy.ritsumei.ac.jp/~akitaoka/cataloge.html"
target="_blank"
rel="noopener noreferrer"
>
A catalogue of illusions
</a>
,{' '}
<a href="http://visitope.org/visualstimuluslist.html?lang=en" target="_blank" rel="noopener noreferrer">
Visitope
</a>
,{' '}
<a
href="http://www.youtube.com/user/VisiomeChannel?feature=watch"
target="_blank"
rel="noopener noreferrer"
>
Visiome Channel
</a>
), which introduce user friendly view of items such as basic images and original artworks of visual
illusions with high resolution. The items in Visiome Platform are useful not only for reproducing the
published results, but also for advancing and expanding the research in Vision Science.
</p>
),
ja: (
<p>
Visiome PlatformはWebベースのデジタルアーカイブサイトです
Visiome
PlatformはWebベースのデジタルアーカイブサイトです
使
使
<a href="http://www.psy.ritsumei.ac.jp/~akitaoka/catalog.html" target="_blank" rel="noopener noreferrer"></a><a href="http://visitope.org/visualstimuluslist.html?lang=jp" target="_blank" rel="noopener noreferrer">Visitope</a><a href="http://www.youtube.com/user/VisiomeChannel?feature=watch" target="_blank" rel="noopener noreferrer">Visiome Channel</a>
</p>,
}
<a
href="http://www.psy.ritsumei.ac.jp/~akitaoka/catalog.html"
target="_blank"
rel="noopener noreferrer"
>
</a>
<a href="http://visitope.org/visualstimuluslist.html?lang=jp" target="_blank" rel="noopener noreferrer">
Visitope
</a>
<a
href="http://www.youtube.com/user/VisiomeChannel?feature=watch"
target="_blank"
rel="noopener noreferrer"
>
Visiome Channel
</a>
</p>
),
};
return (
<>
<NoticeSiteHasBeenArchived lang={lang} />
{announce[props.lang]}
</>
);
}
};
export default Welcome;
export default Welcome;
+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;
+4 -2
View File
@@ -44,7 +44,9 @@
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child)) {
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) {
.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;
}
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:last-child.rc-tree-indent-unit-end) {
@@ -88,4 +90,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;
}
}
+67 -30
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,68 +12,105 @@ 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>
);
}),
},
{
title: Functions.mlang('[en]Most active contributers[/en][ja]最も多くアイテムを公開したユーザ[/ja]', props.lang),
list: rankings.contributed.map((item, idx) => {
const name = item.name !== '' ? item.name + ' (' + item.uname + ')' : item.uname;
title: Functions.mlang(
'[en]Most active contributers[/en][ja]最も多くアイテムを公開したユーザ[/ja]',
props.lang
),
list: siteData().rankings.contributed.map((item, idx) => {
const name = item.name !== '' ? `${item.name} (${item.uname})` : item.uname;
const title = Functions.mlang(name, props.lang);
const order = orderLabel(idx + 1, props.lang);
return (
<div key={idx} className={styles.item}>
<div key={item.uname} className={styles.item}>
<div className={styles.order}>{order}</div>
<div className={styles.uname}>{title}</div>
<div className={styles.count}>({item.count})</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>
);
}),
},
{
title: Functions.mlang('[en]Frequently searched keywords[/en][ja]頻繁に検索されるキーワード[/ja]', props.lang),
list: rankings.searched.map((item, idx) => {
title: Functions.mlang(
'[en]Frequently searched keywords[/en][ja]頻繁に検索されるキーワード[/ja]',
props.lang
),
list: siteData().rankings.searched.map((item, idx) => {
const url = ItemUtil.getSearchByKeywordUrl('all', item.keyword);
const title = 'Search by: ' + item.keyword;
const title = `Search by: ${item.keyword}`;
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}>{item.keyword}</Link></div>
{idx === 0 && <div className={styles.star}><img src={imageStar} alt={order} /></div>}
<div className={styles.title}>
<Link to={url} title={title}>
{item.keyword}
</Link>
</div>
{idx === 0 && (
<div className={styles.star}>
<img src={imageStar} alt={order} />
</div>
)}
</div>
);
}),
@@ -83,7 +120,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>
@@ -92,6 +129,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,9 +1,8 @@
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';
@@ -14,4 +13,4 @@ class ConferenceTop extends TopBase {
}
}
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 -5
View File
@@ -1,17 +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;
this.description = '[en]Result data in numerical text/image/movie formats.[/en][ja]実験結果の数値データ/画像/動画など[/ja]';
this.description =
'[en]Result data in numerical text/image/movie formats.[/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;
+14 -9
View File
@@ -1,7 +1,6 @@
import React from 'react';
import { MultiLang } from '../../../../config';
import type { MultiLang } from '../../../../config';
import Functions from '../../../../functions';
import { ItemBasicChangeLog } from '../../../lib/ItemUtil';
import type { ItemBasicChangeLog } from '../../../lib/ItemUtil';
import DateTime from './DateTime';
interface Props {
@@ -14,15 +13,21 @@ const ChangeLog = (props: Props) => {
if (changelog.length === 0) {
return null;
}
const elements = changelog.map((value, i) => {
const elements = changelog.map((value) => {
return (
<tr key={i}>
<td><DateTime lang={lang} date={value.log_date} onlyDate={true} /></td>
<tr key={`${value.log_date}:${value.log}`}>
<td>
<DateTime lang={lang} date={value.log_date} onlyDate={true} />
</td>
<td>{Functions.mlang(value.log, lang)}</td>
</tr>
);
});
return (<table><tbody>{elements}</tbody></table>);
}
return (
<table>
<tbody>{elements}</tbody>
</table>
);
};
export default ChangeLog;
export default ChangeLog;

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