Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d18f7ab4d
|
||
|
|
6cfc22d252
|
||
|
|
1402cadecb
|
||
|
|
1abc0f9f4b
|
||
|
|
9dd3492f37
|
||
|
|
e255e8ea4b
|
||
|
|
a14bc6dd4b
|
||
|
|
f6ad3b413a
|
+21
-31
@@ -1,35 +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/documents/images
|
||||
/public/documents/*.json
|
||||
/src/database/assets/*.json
|
||||
/src/credits/assets/*.json
|
||||
/src/d3forum/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?
|
||||
|
||||
@@ -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'),
|
||||
};
|
||||
@@ -1,44 +1,177 @@
|
||||
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
|
||||
# Cerebellar Platform
|
||||
|
||||
## Available Scripts
|
||||
Static front-end for the archived [Cerebellar Platform](http://cerebellum.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/cerebellum.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.
|
||||
```
|
||||
cerebellum.neuroinf.jp/
|
||||
├── cerebellum.neuroinf.jp/ this repository
|
||||
└── static-contents/
|
||||
├── modules/ one directory per source XOOPS module
|
||||
│ ├── credits/ credits.json
|
||||
│ ├── documents/ config.json, <content id>.json, images/
|
||||
│ ├── forum/ d3forum.json
|
||||
│ └── 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, and each d3forum module its own
|
||||
`d3forum.json`.
|
||||
|
||||
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 can’t 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 aren’t 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 you’re on your own.
|
||||
There is currently no test suite.
|
||||
|
||||
You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t 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 150 MB, 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/cerebellum.neuroinf.jp/
|
||||
├── html/ document root
|
||||
└── static-contents/
|
||||
```
|
||||
|
||||
```sh
|
||||
rsync -a --delete static-contents/ \
|
||||
user@server:/data/www/cerebellum.neuroinf.jp/static-contents/
|
||||
```
|
||||
|
||||
### 3. Push the build
|
||||
|
||||
```sh
|
||||
rsync -a --delete dist/ user@server:/data/www/cerebellum.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/cerebellum.neuroinf.jp/html
|
||||
ln -s ../static-contents/* .
|
||||
```
|
||||
|
||||
That links every top-level entry of `static-contents/` — currently `modules/`
|
||||
and `rss.xml`:
|
||||
|
||||
```
|
||||
/data/www/cerebellum.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://cerebellum.neuroinf.jp/rss.xml # 200
|
||||
curl -I https://cerebellum.neuroinf.jp/database/file/1.png # 301
|
||||
curl -I https://cerebellum.neuroinf.jp/modules/xoonips/tree.json # 200
|
||||
```
|
||||
|
||||
Then load `/`, an item page, `/forum` and `/documents/` in a browser and
|
||||
confirm the images resolve.
|
||||
|
||||
### Upgrading from v1.0.0
|
||||
|
||||
v1.0.0 bundled most of the data into the JavaScript and served the rest from
|
||||
`database/` and `documents/` 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` carries the GA4 measurement
|
||||
ID that replaced the Universal Analytics property shut down in 2023. Emptying
|
||||
it disables tracking.
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/2.5.13/schema.json",
|
||||
"vcs": {
|
||||
"enabled": true,
|
||||
"clientKind": "git",
|
||||
"useIgnoreFile": true
|
||||
},
|
||||
"files": {
|
||||
"includes": ["**", "!**/dist", "!src/common/assets", "!src/d3forum/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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
$mainfile = '/data/www/html/mainfile.php';
|
||||
|
||||
$XOONIPS_SIMPF_LINKFILE = __DIR__.'/simpflink.csv';
|
||||
$XOOPS_MODULE_D3FORUM = ['forum'];
|
||||
$XOOPS_MODULE_PICO = ['documents'];
|
||||
|
||||
define('XOONIPS_RANNKING_LIMIT', 5);
|
||||
@@ -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;
|
||||
}
|
||||
@@ -1,162 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/common.inc.php';
|
||||
|
||||
if (!isset($XOOPS_MODULE_D3FORUM) || empty($XOOPS_MODULE_D3FORUM)) {
|
||||
exit('Not configured for d3forum module'.PHP_EOL);
|
||||
}
|
||||
|
||||
$contents = [];
|
||||
foreach ($XOOPS_MODULE_D3FORUM as $d3forum) {
|
||||
dumpD3Forum($d3forum, $contents);
|
||||
}
|
||||
MyDumpTool::makeDirectory('src/d3forum');
|
||||
MyDumpTool::makeDirectory('src/d3forum/assets');
|
||||
MyDumpTool::saveJson('src/d3forum/assets/d3forum.json', $contents);
|
||||
|
||||
function dumpD3Forum($d3forum, &$contents)
|
||||
{
|
||||
global $xoopsDB;
|
||||
$prefix = $xoopsDB->prefix();
|
||||
|
||||
$moduleHandler = xoops_gethandler('module');
|
||||
$module = $moduleHandler->getByDirname($d3forum);
|
||||
$moduleConfigHandler = xoops_gethandler('config');
|
||||
$moduleConfig = $moduleConfigHandler->getConfigsByDirname($d3forum);
|
||||
|
||||
$table = $d3forum.'_categories';
|
||||
if (!MyDumpTool::tableExists($table)) {
|
||||
exit('d3forum('.$d3forum.') module not found'.PHP_EOL);
|
||||
}
|
||||
|
||||
$gidGuest = XOOPS_GROUP_ANONYMOUS;
|
||||
|
||||
// get anonymous readable categories
|
||||
$categories = [];
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`c`.*
|
||||
FROM `${prefix}_${d3forum}_categories` AS `c`
|
||||
INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `c`.`cat_id`=`ca`.`cat_id`
|
||||
WHERE `ca`.`groupid`=${gidGuest}
|
||||
GROUP BY `c`.`cat_id`
|
||||
ORDER BY `c`.`cat_order_in_tree` ASC, `c`.`cat_weight` ASC
|
||||
SQL;
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
var_dump($xoopsDB);
|
||||
exit();
|
||||
}
|
||||
while ($row = $xoopsDB->fetchArray($res)) {
|
||||
MyDumpTool::decode($row);
|
||||
MyDumpTool::convertToInt($row, ['cat_id', 'pid', 'cat_topics_count', 'cat_posts_count', 'cat_last_post_id', 'cat_last_post_time', 'cat_topics_count_in_tree', 'cat_posts_count_in_tree', 'cat_last_post_id_in_tree', 'cat_last_post_time_in_tree', 'cat_depth_in_tree', 'cat_order_in_tree', 'cat_weight']);
|
||||
$row['cat_path_in_tree'] = unserialize($row['cat_path_in_tree']);
|
||||
$row['cat_options'] = unserialize($row['cat_options']);
|
||||
$categories[] = $row;
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
//var_dump($categories);
|
||||
|
||||
// get anonymous readable forums
|
||||
$forums = [];
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`f`.*
|
||||
FROM `${prefix}_${d3forum}_forums` AS `f`
|
||||
INNER JOIN `${prefix}_${d3forum}_forum_access` AS `fa` ON `f`.`forum_id`=`fa`.`forum_id`
|
||||
INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `f`.`cat_id`=`ca`.`cat_id`
|
||||
WHERE `fa`.`groupid`=${gidGuest}
|
||||
AND `ca`.`groupid`=${gidGuest}
|
||||
GROUP BY `f`.`forum_id`
|
||||
ORDER BY `f`.`cat_id` ASC, `f`.`forum_weight` ASC
|
||||
SQL;
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
var_dump($xoopsDB);
|
||||
exit();
|
||||
}
|
||||
while ($row = $xoopsDB->fetchArray($res)) {
|
||||
MyDumpTool::decode($row);
|
||||
MyDumpTool::convertToInt($row, ['forum_id', 'cat_id', 'forum_topics_count', 'forum_posts_count', 'forum_last_post_id', 'forum_last_post_time', 'forum_weight'], true);
|
||||
$row['forum_options'] = unserialize($row['forum_options']);
|
||||
$forums[] = $row;
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
//var_dump($forums);
|
||||
|
||||
// get anonymous readable topics
|
||||
$topics = [];
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`t`.*,
|
||||
`uf`.`name` AS `topic_first_uid_name`, `uf`.`uname` AS `topic_first_uid_uname`,
|
||||
`ul`.`name` AS `topic_last_uid_name`, `ul`.`uname` AS `topic_last_uid_uname`
|
||||
FROM `${prefix}_${d3forum}_topics` AS `t`
|
||||
INNER JOIN `${prefix}_${d3forum}_forums` AS `f` ON `t`.`forum_id`=`f`.`forum_id`
|
||||
INNER JOIN `${prefix}_${d3forum}_forum_access` AS `fa` ON `f`.`forum_id`=`fa`.`forum_id`
|
||||
INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `f`.`cat_id`=`ca`.`cat_id`
|
||||
LEFT JOIN `${prefix}_users` AS `uf` ON `t`.`topic_first_uid`=`uf`.`uid`
|
||||
LEFT JOIN `${prefix}_users` AS `ul` ON `t`.`topic_last_uid`=`ul`.`uid`
|
||||
WHERE `fa`.`groupid`=${gidGuest}
|
||||
AND `ca`.`groupid`=${gidGuest}
|
||||
GROUP BY `t`.`topic_id`
|
||||
ORDER BY `t`.`forum_id` ASC, `t`.`topic_id` ASC
|
||||
SQL;
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
var_dump($xoopsDB);
|
||||
exit();
|
||||
}
|
||||
while ($row = $xoopsDB->fetchArray($res)) {
|
||||
MyDumpTool::decode($row);
|
||||
MyDumpTool::convertToInt($row, ['topic_id', 'forum_id', 'topic_first_uid', 'topic_first_post_id', 'topic_first_post_time', 'topic_last_uid', 'topic_last_post_id', 'topic_last_post_time', 'topic_views', 'topic_posts_count', 'topic_locked', 'topic_sticky', 'topic_solved', 'topic_invisible', 'topic_votes_sum', 'topic_votes_count'], true);
|
||||
$topics[] = $row;
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
//var_dump($topics);
|
||||
|
||||
// get anonymous readable posts
|
||||
$posts = [];
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`p`.*,
|
||||
`u`.`name` AS `uid_name`, `u`.`uname` AS `uid_uname`, `u`.`rank` AS `uid_rank`, `u`.`posts` AS `uid_posts`
|
||||
FROM `${prefix}_${d3forum}_posts` AS `p`
|
||||
INNER JOIN `${prefix}_${d3forum}_topics` AS `t` ON `p`.`topic_id`=`t`.`topic_id`
|
||||
INNER JOIN `${prefix}_${d3forum}_forums` AS `f` ON `t`.`forum_id`=`f`.`forum_id`
|
||||
INNER JOIN `${prefix}_${d3forum}_forum_access` AS `fa` ON `f`.`forum_id`=`fa`.`forum_id`
|
||||
INNER JOIN `${prefix}_${d3forum}_category_access` AS `ca` ON `f`.`cat_id`=`ca`.`cat_id`
|
||||
LEFT JOIN `${prefix}_users` AS `u` ON `p`.`uid`=`u`.`uid`
|
||||
WHERE `fa`.`groupid`=${gidGuest}
|
||||
AND `ca`.`groupid`=${gidGuest}
|
||||
GROUP BY `p`.`post_id`
|
||||
ORDER BY `t`.`topic_id` ASC, `p`.`post_id` ASC
|
||||
SQL;
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
var_dump($xoopsDB);
|
||||
exit();
|
||||
}
|
||||
while ($row = $xoopsDB->fetchArray($res)) {
|
||||
MyDumpTool::decode($row);
|
||||
MyDumpTool::convertToInt($row, ['post_id', 'pid', 'topic_id', 'post_time', 'modified_time', 'uid', 'uid_hidden', 'html', 'smiley', 'xcode', 'br', 'number_entity', 'special_entity', 'icon', 'attachsig', 'invisible', 'approval', 'votes_sum', 'votes_count', 'depth_in_tree', 'order_in_tree', 'uid_rank', 'uid_posts'], true);
|
||||
MyDumpTool::dropColumn($row, ['guest_email', 'guest_url', 'guest_pass_md5', 'guest_trip']);
|
||||
$posts[] = $row;
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
//var_dump($posts);
|
||||
var_dump(count($posts));
|
||||
|
||||
$moduleinfo = [
|
||||
'name' => $module->get('name'),
|
||||
'dirname' => $d3forum,
|
||||
'message' => $moduleConfig['top_message'],
|
||||
];
|
||||
MyDumpTool::decode($moduleinfo);
|
||||
|
||||
$data = [
|
||||
'module' => $moduleinfo,
|
||||
'categories' => $categories,
|
||||
'forums' => $forums,
|
||||
'topics' => $topics,
|
||||
'posts' => $posts,
|
||||
];
|
||||
|
||||
$contents[] = $data;
|
||||
}
|
||||
@@ -1,135 +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);
|
||||
$url = XOOPS_URL.'/modules/'.$pico.'/'.$xpath.'/'.$url;
|
||||
}
|
||||
$fname = '/'.$pico.'/images/'.$data['id'].'_'.$imageId.'.dat';
|
||||
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public'.$fname;
|
||||
MyDumpTool::fileDownload($url, $fpath);
|
||||
$mime = MyDumpTool::getMimeType($fpath);
|
||||
switch ($mime) {
|
||||
case 'image/gif':
|
||||
$fpath_ = preg_replace('/.dat$/', '.gif', $fpath);
|
||||
$fname = preg_replace('/.dat$/', '.gif', $fname);
|
||||
rename($fpath, $fpath_);
|
||||
$fpath = $fpath_;
|
||||
break;
|
||||
case 'image/png':
|
||||
$fpath_ = preg_replace('/.dat$/', '.png', $fpath);
|
||||
$fname = preg_replace('/.dat$/', '.png', $fname);
|
||||
rename($fpath, $fpath_);
|
||||
$fpath = $fpath_;
|
||||
break;
|
||||
case 'image/jpeg':
|
||||
$fpath = preg_replace('/.dat$/', '.jpeg', $fpath);
|
||||
$fname = preg_replace('/.dat$/', '.jpeg', $fname);
|
||||
rename($fpath, $fpath_);
|
||||
$fpath = $fpath_;
|
||||
break;
|
||||
default:
|
||||
exit('unknown mime type '.$mime.' found: '.$fname.' from '.$url.PHP_EOL);
|
||||
}
|
||||
++$imageId;
|
||||
|
||||
return '<img '.$matches[1].'src="'.$fname.'"'.$matches[3].'/>';
|
||||
}, $content);
|
||||
$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,
|
||||
];
|
||||
}
|
||||
@@ -1,231 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/common.inc.php';
|
||||
|
||||
$prefix = $xoopsDB->prefix();
|
||||
|
||||
$table = 'xoonips_item_basic';
|
||||
if (!MyDumpTool::tableExists($table)) {
|
||||
exit('xoonips module not found'.PHP_EOL);
|
||||
}
|
||||
$dllimit = getDLLimitItems();
|
||||
|
||||
$xoops_url_path = parse_url(XOOPS_URL, PHP_URL_PATH);
|
||||
$xoops_url_host = parse_url(XOOPS_URL, PHP_URL_HOST);
|
||||
$host = preg_replace('/\..*$/', '', $xoops_url_host);
|
||||
is_dir(__DIR__.'/simpf') || mkdir(__DIR__.'/simpf');
|
||||
is_dir(__DIR__.'/simpf/'.$host) || mkdir(__DIR__.'/simpf/'.$host);
|
||||
|
||||
$xconfig_handler = xoonips_getormhandler('xoonips', 'config');
|
||||
$fileutil = xoonips_getutility('file');
|
||||
$basePath = $xconfig_handler->getValue('upload_dir');
|
||||
|
||||
// get simpf link data
|
||||
$lines = file(__DIR__.'/simpflink2.csv');
|
||||
foreach ($lines as $line) {
|
||||
list($simpfItemId, $simpfIsPublic, $pfname, $url) = array_map('trim', explode(',', $line));
|
||||
if ($pfname === $host) {
|
||||
$pUrl = parse_url($url);
|
||||
if ($pUrl['path'] != $xoops_url_path.'/modules/xoonips/detail.php') {
|
||||
echo 'not xoonips url found in simpf link file. URL:'.$url.PHP_EOL;
|
||||
continue;
|
||||
}
|
||||
if (preg_match('/(?:^|&)(id|item_id)=([^$&]+)/', $pUrl['query'], $matches)) {
|
||||
$key = $matches[1];
|
||||
$value = $matches[2];
|
||||
$itemId = 0;
|
||||
if ('item_id' == $key) {
|
||||
$itemId = (int) $value;
|
||||
} elseif ('id' == $key) {
|
||||
$itemId = doi2itemid($value);
|
||||
if (0 == $itemId) {
|
||||
echo 'failed to lookup item id from doi. DOI:'.$value.PHP_EOL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$files = getFile($itemId);
|
||||
$data = false;
|
||||
foreach ($files as $file) {
|
||||
if (in_array($file['file_type_name'], ['preview', 'readme', 'rights', 'license'])) {
|
||||
continue;
|
||||
}
|
||||
if (false === $data) {
|
||||
$data = $file;
|
||||
} else {
|
||||
echo 'multiple data file found in item id.:'.$itemId.PHP_EOL;
|
||||
}
|
||||
}
|
||||
$isPublic = isPublicItemId($itemId);
|
||||
$isDLLimit = in_array($itemId, $dllimit);
|
||||
$url = XOOPS_URL.'/database/file/'.$data['file_id'].'/'.$data['original_file_name'];
|
||||
if (!$isPublic || $isDLLimit) {
|
||||
$url = 'simpf:'.$host.'/'.$data['file_id'].'/'.$data['original_file_name'];
|
||||
$destDir = __DIR__.'/simpf/'.$host.'/'.$data['file_id'];
|
||||
$srcFile = $basePath.'/'.$data['file_id'];
|
||||
if (!is_dir($destDir)) {
|
||||
@mkdir($destDir);
|
||||
}
|
||||
if (!MyDumpTool::fileCopy($srcFile, $destDir.'/'.$data['original_file_name'])) {
|
||||
echo 'failed to copy file: '.$srcFile.PHP_EOL;
|
||||
}
|
||||
}
|
||||
echo sprintf('%s,%s', $simpfItemId, $url).PHP_EOL;
|
||||
}
|
||||
}
|
||||
}
|
||||
exit();
|
||||
|
||||
function isPublicItemId($itemId)
|
||||
{
|
||||
$db = XoopsDatabaseFactory::getDatabaseConnection();
|
||||
$prefix = $db->prefix();
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`ib`.`item_id`
|
||||
FROM `${prefix}_xoonips_item_basic` AS `ib`
|
||||
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
|
||||
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
||||
WHERE `ib`.`item_id`=$itemId
|
||||
AND `iil`.`certify_state`=2
|
||||
AND `idx`.`open_level`=1
|
||||
GROUP BY `ib`.`item_id`
|
||||
SQL;
|
||||
if (!($res = $db->query($sql))) {
|
||||
var_dump($db);
|
||||
exit();
|
||||
}
|
||||
$items = array();
|
||||
$row = $db->fetchArray($res);
|
||||
$db->freeRecordSet($res);
|
||||
|
||||
return is_array($row);
|
||||
}
|
||||
|
||||
function doi2itemid($doi)
|
||||
{
|
||||
$db = XoopsDatabaseFactory::getDatabaseConnection();
|
||||
$prefix = $db->prefix();
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`ib`.`item_id`
|
||||
FROM `${prefix}_xoonips_item_basic` AS `ib`
|
||||
WHERE `ib`.`doi`='${doi}'
|
||||
SQL;
|
||||
if (!($res = $db->query($sql))) {
|
||||
var_dump($db);
|
||||
exit();
|
||||
}
|
||||
$items = array();
|
||||
$row = $db->fetchArray($res);
|
||||
$db->freeRecordSet($res);
|
||||
|
||||
return is_array($row) ? (int) $row['item_id'] : 0;
|
||||
}
|
||||
|
||||
function getDLLimitItems()
|
||||
{
|
||||
$lines = file(MYDUMPTOOL_OUTPUTDIR.'/dl-limit-items.csv');
|
||||
$ret = [];
|
||||
foreach ($lines as $line) {
|
||||
list($itemId) = explode(',', $line);
|
||||
$ret[] = (int) $itemId;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
// get files
|
||||
$xconfig_handler = xoonips_getormhandler('xoonips', 'config');
|
||||
$fileutil = xoonips_getutility('file');
|
||||
|
||||
$basePath = $xconfig_handler->getValue('upload_dir');
|
||||
$sql = <<< SQL
|
||||
SELECT
|
||||
`f`.`file_id`, `f`.`item_id`, `f`.`original_file_name`,
|
||||
`ft`.`name` AS `file_type_name`
|
||||
FROM `${prefix}_xoonips_file` AS `f`
|
||||
INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id`
|
||||
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `f`.`item_id`=`iil`.`item_id`
|
||||
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
||||
WHERE `f`.`is_deleted`=0
|
||||
AND `ft`.`name` NOT IN('readme' , 'license', 'rights')
|
||||
AND `iil`.`certify_state`=2
|
||||
AND `idx`.`open_level`=1
|
||||
GROUP BY `f`.`file_id`
|
||||
ORDER BY `f`.`file_id` ASC
|
||||
SQL;
|
||||
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
var_dump($xoopsDB);
|
||||
exit();
|
||||
}
|
||||
$filesDir = MYDUMPTOOL_OUTPUTDIR.'/public/database/file';
|
||||
while ($row = $xoopsDB->fetchArray($res)) {
|
||||
MyDumpTool::decode($row);
|
||||
MyDumpTool::convertToInt($row, array('file_id', 'item_id'));
|
||||
$file_id = $row['file_id'];
|
||||
$item_id = $row['item_id'];
|
||||
$file_name = $row['original_file_name'];
|
||||
$file_type = $row['file_type_name'];
|
||||
if (in_array($file_id, $limitFiles)) {
|
||||
echo "download limit file found.. skip to copy.. item_id:$item_id, file_id:$file_id".PHP_EOL;
|
||||
continue;
|
||||
}
|
||||
$file_dir = $filesDir.'/'.$file_id;
|
||||
$src_file = $basePath.'/'.$file_id;
|
||||
if (!is_dir($file_dir)) {
|
||||
@mkdir($file_dir);
|
||||
}
|
||||
//if (!file_exists($file_dir.'/'.$file_name)) {
|
||||
if (!MyDumpTool::fileCopy($src_file, $file_dir.'/'.$file_name)) {
|
||||
echo 'failed to copy file: '.$basePath.'/'.$file_id.PHP_EOL;
|
||||
}
|
||||
$htaccess = $file_dir.'/.htaccess';
|
||||
$xfilename = str_replace(' ', '\\ ', $file_name);
|
||||
$data = "RewriteEngine On\nRewriteBase /database/file/$file_id\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteRule .* $xfilename [R=301,L]\n";
|
||||
file_put_contents($htaccess, $data);
|
||||
//}
|
||||
if ('preview' == $file_type) {
|
||||
$thumbnail_file = $file_dir.'.png';
|
||||
if (!file_exists($thumbnail_file)) {
|
||||
$mimetype = $fileutil->get_mimetype($src_file, $file_name);
|
||||
$thumbnail = $fileutil->get_thumbnail($src_file, $mimetype);
|
||||
if (null !== $thumbnail) {
|
||||
file_put_contents($thumbnail_file, $thumbnail);
|
||||
} else {
|
||||
createThumbnail($src_file, $mimetype, $thumbnail_file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
|
||||
// functions
|
||||
|
||||
function getFile($item_id)
|
||||
{
|
||||
global $xoopsDB;
|
||||
$prefix = $xoopsDB->prefix();
|
||||
$sql = <<< SQL
|
||||
SELECT `f`.`file_id`, `f`.`original_file_name`, `f`.`mime_type`, `f`.`file_size`, `f`.`caption`, `f`.`timestamp`,
|
||||
`ft`.`name` AS `file_type_name`, `ft`.`display_name` AS `file_type_display_name`
|
||||
FROM `${prefix}_xoonips_file` AS `f`
|
||||
INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id`
|
||||
WHERE `item_id`=$item_id
|
||||
AND `is_deleted`=0
|
||||
ORDER BY `ft`.`name` ASC
|
||||
SQL;
|
||||
if (!($res = $xoopsDB->query($sql))) {
|
||||
var_dump($xoopsDB);
|
||||
exit();
|
||||
}
|
||||
$ret = array();
|
||||
while ($row = $xoopsDB->fetchArray($res)) {
|
||||
MyDumpTool::decode($row);
|
||||
MyDumpTool::convertToInt($row, array('file_id', 'file_size'));
|
||||
$ret[] = $row;
|
||||
}
|
||||
$xoopsDB->freeRecordSet($res);
|
||||
|
||||
return $ret;
|
||||
}
|
||||
-1176
File diff suppressed because it is too large
Load Diff
@@ -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,625 +0,0 @@
|
||||
24,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=375
|
||||
25,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6045
|
||||
26,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6149
|
||||
27,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=909
|
||||
28,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1648
|
||||
29,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=913
|
||||
30,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1623
|
||||
31,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1621
|
||||
32,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1620
|
||||
33,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=896
|
||||
34,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2434
|
||||
35,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2441
|
||||
36,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=9068858b
|
||||
37,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5307
|
||||
38,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?id=943
|
||||
39,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=403
|
||||
40,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=398
|
||||
41,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=350
|
||||
42,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=363
|
||||
43,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=366
|
||||
44,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=370
|
||||
45,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=361
|
||||
46,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054b
|
||||
47,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6110
|
||||
48,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7252867b
|
||||
49,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6105
|
||||
50,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2861
|
||||
51,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=16625198b
|
||||
52,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6422
|
||||
53,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=19281836b
|
||||
54,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=7941380b
|
||||
55,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6448
|
||||
56,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6106
|
||||
57,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1027
|
||||
58,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1030
|
||||
59,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1031
|
||||
60,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1032
|
||||
61,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1033
|
||||
62,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1034
|
||||
63,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1035
|
||||
64,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1036
|
||||
65,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1037
|
||||
66,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1038
|
||||
67,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1041
|
||||
68,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1042
|
||||
69,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1043
|
||||
70,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1044
|
||||
71,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045
|
||||
72,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1046
|
||||
73,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1047
|
||||
74,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1048
|
||||
75,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1049
|
||||
76,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1051
|
||||
77,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1052
|
||||
78,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1054
|
||||
79,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1056
|
||||
80,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1057
|
||||
81,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1059
|
||||
82,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1060
|
||||
83,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1061
|
||||
84,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1062
|
||||
85,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1064
|
||||
86,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1065
|
||||
87,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1066
|
||||
114,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1067
|
||||
116,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1068
|
||||
117,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1069
|
||||
118,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1070
|
||||
119,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1071
|
||||
120,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1072
|
||||
121,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1073
|
||||
122,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1074
|
||||
123,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1075
|
||||
124,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1076
|
||||
125,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1077
|
||||
126,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1078
|
||||
127,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1079
|
||||
128,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=296
|
||||
129,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5586
|
||||
130,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=297
|
||||
131,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1080
|
||||
132,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1081
|
||||
133,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1082
|
||||
134,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1084
|
||||
135,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1085
|
||||
136,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1086
|
||||
137,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1087
|
||||
138,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1088
|
||||
139,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1089
|
||||
140,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1098
|
||||
141,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1099
|
||||
142,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1100
|
||||
143,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1101
|
||||
144,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1102
|
||||
145,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1103
|
||||
146,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1105
|
||||
147,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1106
|
||||
148,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1107
|
||||
149,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1108
|
||||
150,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1109
|
||||
151,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1110
|
||||
152,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1111
|
||||
153,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1112
|
||||
154,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1113
|
||||
155,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1114
|
||||
156,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1115
|
||||
157,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1116
|
||||
158,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1117
|
||||
159,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1119
|
||||
160,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1120
|
||||
161,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1121
|
||||
162,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1122
|
||||
163,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1123
|
||||
164,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1124
|
||||
165,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1125
|
||||
166,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1126
|
||||
167,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1127
|
||||
168,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1128
|
||||
169,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1129
|
||||
170,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1130
|
||||
171,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1131
|
||||
172,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1132
|
||||
173,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1133
|
||||
174,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1134
|
||||
175,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1135
|
||||
176,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1136
|
||||
177,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1137
|
||||
178,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1138
|
||||
179,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1139
|
||||
180,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1140
|
||||
181,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1141
|
||||
182,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1142
|
||||
183,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1143
|
||||
184,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1144
|
||||
185,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1145
|
||||
186,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1146
|
||||
187,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1147
|
||||
188,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1148
|
||||
189,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1149
|
||||
190,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1150
|
||||
191,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1151
|
||||
192,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1152
|
||||
193,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1153
|
||||
194,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1154
|
||||
195,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1156
|
||||
196,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1157
|
||||
197,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1158
|
||||
198,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1159
|
||||
199,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1160
|
||||
200,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1161
|
||||
201,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1162
|
||||
202,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1163
|
||||
203,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1164
|
||||
204,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1165
|
||||
205,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1166
|
||||
206,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1167
|
||||
207,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1168
|
||||
208,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1169
|
||||
209,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1170
|
||||
210,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1171
|
||||
211,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1172
|
||||
212,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1173
|
||||
213,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1174
|
||||
214,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1175
|
||||
215,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1176
|
||||
216,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1177
|
||||
217,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1178
|
||||
218,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1179
|
||||
219,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1180
|
||||
220,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1181
|
||||
221,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1182
|
||||
222,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1183
|
||||
223,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1184
|
||||
224,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1185
|
||||
225,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1186
|
||||
226,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1187
|
||||
227,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1188
|
||||
228,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1189
|
||||
229,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1190
|
||||
230,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1191
|
||||
231,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1192
|
||||
232,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1193
|
||||
233,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=15929656d
|
||||
234,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=376
|
||||
235,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=298
|
||||
236,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1629
|
||||
237,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=1647
|
||||
238,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1208
|
||||
239,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1209
|
||||
240,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1210
|
||||
241,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1211
|
||||
242,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1212
|
||||
243,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1213
|
||||
244,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1214
|
||||
245,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1215
|
||||
246,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1216
|
||||
247,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1217
|
||||
248,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1218
|
||||
249,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1219
|
||||
250,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1220
|
||||
251,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1222
|
||||
252,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1223
|
||||
253,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1224
|
||||
254,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1225
|
||||
255,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1226
|
||||
256,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1227
|
||||
257,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1228
|
||||
258,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1230
|
||||
259,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1231
|
||||
260,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1232
|
||||
261,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1233
|
||||
262,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1234
|
||||
263,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1235
|
||||
264,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1236
|
||||
265,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1237
|
||||
266,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1238
|
||||
267,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1239
|
||||
268,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1240
|
||||
269,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1241
|
||||
270,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1242
|
||||
271,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1243
|
||||
272,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1244
|
||||
273,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1245
|
||||
274,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1246
|
||||
275,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1247
|
||||
276,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1248
|
||||
277,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1249
|
||||
278,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1250
|
||||
279,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1251
|
||||
280,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1252
|
||||
281,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1255
|
||||
282,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1256
|
||||
283,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1257
|
||||
284,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1258
|
||||
285,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1261
|
||||
286,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1262
|
||||
287,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1263
|
||||
288,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1264
|
||||
289,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1265
|
||||
290,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1266
|
||||
291,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1267
|
||||
292,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1268
|
||||
293,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1269
|
||||
294,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1270
|
||||
295,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1271
|
||||
296,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1272
|
||||
297,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1273
|
||||
298,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1274
|
||||
299,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1275
|
||||
300,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1276
|
||||
301,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1277
|
||||
302,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1278
|
||||
303,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1279
|
||||
304,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1280
|
||||
305,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1281
|
||||
306,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1282
|
||||
307,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1283
|
||||
308,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1284
|
||||
309,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1285
|
||||
310,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1286
|
||||
311,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1287
|
||||
312,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1288
|
||||
313,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1289
|
||||
314,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1290
|
||||
315,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1291
|
||||
316,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1292
|
||||
317,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1293
|
||||
318,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1294
|
||||
319,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1295
|
||||
320,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1296
|
||||
321,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1297
|
||||
322,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1298
|
||||
323,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1299
|
||||
324,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1300
|
||||
325,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1301
|
||||
326,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1302
|
||||
327,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1303
|
||||
328,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1304
|
||||
329,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1305
|
||||
330,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1306
|
||||
331,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1307
|
||||
332,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1308
|
||||
333,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1309
|
||||
334,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1310
|
||||
335,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1311
|
||||
336,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1312
|
||||
337,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1313
|
||||
338,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1314
|
||||
339,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1315
|
||||
340,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1316
|
||||
341,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=162
|
||||
342,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5936
|
||||
343,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2852
|
||||
344,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6434
|
||||
345,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1050
|
||||
346,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1055
|
||||
347,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1058
|
||||
348,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1063
|
||||
349,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6493
|
||||
350,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=5565
|
||||
351,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2871
|
||||
352,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1083
|
||||
353,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1091
|
||||
354,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1092
|
||||
355,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1093
|
||||
356,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1094
|
||||
357,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1095
|
||||
358,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1096
|
||||
359,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1097
|
||||
360,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/558/weaverWearne06.zip
|
||||
361,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1118
|
||||
362,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1090
|
||||
363,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1155
|
||||
364,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=15929656b
|
||||
365,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=15929656d
|
||||
366,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=702
|
||||
367,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?id=4449054c
|
||||
374,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2860
|
||||
385,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=2431
|
||||
399,0,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=6494
|
||||
410,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1207
|
||||
411,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1221
|
||||
412,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1229
|
||||
416,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1039
|
||||
417,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1040
|
||||
444,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7051
|
||||
447,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/221/data/SEG/000802_1_hi.swc
|
||||
448,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/485/data/SEG/030715_2p4a_sw.swc
|
||||
449,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/485/data/SEG/030715_2p4b_sw.swc
|
||||
450,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/486/data/SEG/971224_1p4abd_ms.swc
|
||||
451,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/487/data/SEG/980112_2p4abcd_ef_ms.swc
|
||||
452,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/488/data/SEG/980117_3p4abcde_ms.swc
|
||||
453,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/489/data/SEG/980130_2f4ab_ms.swc
|
||||
454,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/490/data/SEG/980608_1f4a_ms.swc
|
||||
455,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/491/data/SEG/981218_3f4abc_ms.swc
|
||||
456,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/492/data/SEG/001122_1f4b_sw.swc
|
||||
457,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/493/data/SEG/051010_2f4f_rf.swc
|
||||
458,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/494/data/SEG/981219_3p4c_kg.swc
|
||||
459,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/495/data/SEG/990524_01f4c_mr.swc
|
||||
460,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/496/data/SEG/990616_51f4es_mr.swc
|
||||
461,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/497/data/SEG/990708_68f4c_mr.swc
|
||||
462,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/498/data/SEG/000501_1_hi.swc
|
||||
463,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/499/data/SEG/000712_sw.swc
|
||||
464,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/500/data/SEG/000713_1_hi.swc
|
||||
465,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/501/data/SEG/000720_2_hi.swc
|
||||
466,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/502/data/SEG/000720_sw.swc
|
||||
467,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/503/data/SEG/000721_sw.swc
|
||||
468,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/504/data/SEG/020215_1_sw.swc
|
||||
469,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/505/data/SEG/030710_sw.swc
|
||||
470,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/506/data/SEG/030715_sw.swc
|
||||
471,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/507/data/SEG/030724_sw.swc
|
||||
472,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/508/data/SEG/031030_sn.swc
|
||||
473,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/509/data/SEG/070727_sw.swc
|
||||
474,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/510/data/SEG/091118_sn.swc
|
||||
475,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/511/data/SEG/980112_4_ms.swc
|
||||
476,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/512/data/SEG/980201_3_ms.swc
|
||||
477,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/513/data/SEG/980203_2_kg.swc
|
||||
478,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/514/data/SEG/980601_2_ms.swc
|
||||
479,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/515/data/SEG/980601_3f4d_kg.swc
|
||||
480,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/516/data/SEG/980729_97_mr.swc
|
||||
481,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/517/data/SEG/981214_40_mr.swc
|
||||
482,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/518/data/SEG/990520_99_mr.swc
|
||||
483,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/519/data/SEG/Number_28_mr.swc
|
||||
484,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/520/data/SEG/000703_1f4a_hi.swc
|
||||
485,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427
|
||||
486,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425
|
||||
487,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424
|
||||
488,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423
|
||||
489,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422
|
||||
490,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421
|
||||
491,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420
|
||||
492,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419
|
||||
493,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418
|
||||
494,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1417
|
||||
496,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416
|
||||
497,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415
|
||||
498,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362
|
||||
499,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414
|
||||
500,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363
|
||||
501,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413
|
||||
502,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411
|
||||
503,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409
|
||||
504,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365
|
||||
505,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369
|
||||
506,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1408
|
||||
507,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1406
|
||||
508,0,invbrain,https://invbrain.neuroinf.jp/modules/newdb5/extract/568/data/Model/sb_0970.obj
|
||||
510,0,invbrain,https://invbrain.neuroinf.jp/modules/htmldocs/IVBPF/BombyxStandardBrain/SBfiles/0512x0512x0154-gray.tif
|
||||
511,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362
|
||||
514,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364
|
||||
515,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367
|
||||
516,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366
|
||||
517,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405
|
||||
518,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364
|
||||
519,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401
|
||||
520,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415
|
||||
521,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368
|
||||
523,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399
|
||||
524,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370
|
||||
525,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398
|
||||
526,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371
|
||||
527,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397
|
||||
528,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396
|
||||
529,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372
|
||||
530,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1373
|
||||
531,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374
|
||||
532,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375
|
||||
533,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376
|
||||
534,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380
|
||||
535,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395
|
||||
536,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394
|
||||
537,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393
|
||||
538,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392
|
||||
539,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391
|
||||
540,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390
|
||||
541,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389
|
||||
542,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387
|
||||
543,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386
|
||||
544,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385
|
||||
545,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384
|
||||
546,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382
|
||||
547,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381
|
||||
550,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1362
|
||||
551,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1363
|
||||
552,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1364
|
||||
553,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1365
|
||||
554,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1366
|
||||
555,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1367
|
||||
556,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1368
|
||||
557,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1369
|
||||
558,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1370
|
||||
559,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1371
|
||||
560,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1372
|
||||
561,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1373
|
||||
562,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1374
|
||||
563,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1375
|
||||
564,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1376
|
||||
565,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1379
|
||||
566,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1380
|
||||
567,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1381
|
||||
568,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1382
|
||||
569,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1384
|
||||
570,0,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1446
|
||||
571,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1385
|
||||
572,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1386
|
||||
573,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1387
|
||||
574,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1045
|
||||
575,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1389
|
||||
576,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1390
|
||||
577,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1391
|
||||
578,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1392
|
||||
579,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1393
|
||||
580,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1394
|
||||
581,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1395
|
||||
582,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1396
|
||||
583,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1397
|
||||
584,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1398
|
||||
585,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1399
|
||||
586,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1400
|
||||
587,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1401
|
||||
588,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1402
|
||||
589,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1405
|
||||
590,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409
|
||||
591,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1409
|
||||
592,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1411
|
||||
593,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1413
|
||||
594,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1414
|
||||
595,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1415
|
||||
596,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1416
|
||||
598,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1418
|
||||
599,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1419
|
||||
600,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1420
|
||||
601,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1421
|
||||
602,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1422
|
||||
603,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1423
|
||||
604,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1424
|
||||
605,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1425
|
||||
606,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1427
|
||||
607,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1428
|
||||
608,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1429
|
||||
609,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1430
|
||||
610,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1431
|
||||
611,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1432
|
||||
612,1,visiome,https://visiome.neuroinf.jp/modules/xoonips/detail.php?item_id=7252
|
||||
613,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1434
|
||||
614,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1435
|
||||
615,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1450
|
||||
616,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1452
|
||||
617,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1453
|
||||
618,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1454
|
||||
619,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1455
|
||||
620,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1458
|
||||
621,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1460
|
||||
622,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1461
|
||||
623,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1462
|
||||
624,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1463
|
||||
625,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1466
|
||||
626,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1465
|
||||
627,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1467
|
||||
628,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1470
|
||||
629,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1471
|
||||
630,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1472
|
||||
631,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1473
|
||||
632,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1474
|
||||
633,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1476
|
||||
634,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1477
|
||||
635,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1479
|
||||
636,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1481
|
||||
637,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1482
|
||||
638,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1483
|
||||
639,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1486
|
||||
640,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1487
|
||||
641,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1488
|
||||
642,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1489
|
||||
643,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1490
|
||||
644,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1493
|
||||
645,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1496
|
||||
646,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1497
|
||||
647,1,cerebellum,https://cerebellum.neuroinf.jp/modules/xoonips/detail.php?item_id=1498
|
||||
650,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/475/11_1_1.tgz
|
||||
652,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/481/11_1_2.tgz
|
||||
653,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/482/ALsample1.tgz
|
||||
654,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/535/purkinjecell.zip
|
||||
656,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/533/SundtEtAl2015.zip
|
||||
657,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/536/baker_etal_JCNS_2010.zip
|
||||
658,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/537/dLGN_modelDB.zip
|
||||
659,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/538/CS56PyModelDB.zip
|
||||
660,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/539/TCconvergenceModel.zip
|
||||
661,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/540/BahlEtAl2012.zip
|
||||
662,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/541/ACh_ModelDB.zip
|
||||
663,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/542/FleidervishEtAl2010.zip
|
||||
664,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/543/OLMmodel_r3.zip
|
||||
665,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/545/CasaleEtAl2011.zip
|
||||
666,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/546/SudhakarEtAl2015.zip
|
||||
667,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/547/GrC_FHF_ModelDB.zip
|
||||
668,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/548/GentilettiEtAl2016.zip
|
||||
669,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/549/MultiChirp.zip
|
||||
670,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/550/DAcomparison.zip
|
||||
671,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/551/singleDendrite.zip
|
||||
672,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/552/CanakciEtAl2017.zip
|
||||
674,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/553/AnwarEtAl2010.zip
|
||||
675,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/554/MiocinovicEtAl2006.zip
|
||||
676,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/555/dendritic_complexity.zip
|
||||
677,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/556/FUS_model.zip
|
||||
678,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/557/NarayananJohnston2010.zip
|
||||
679,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/559/RoyeckEtAl2008.zip
|
||||
680,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/560/ShepherdBrayton1979.zip
|
||||
681,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/561/gc-1.1_r2.zip
|
||||
682,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/562/fietkiewicz2011_r1.zip
|
||||
683,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/564/VladimirovTuTraub2012.zip
|
||||
684,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/565/xiaoshenli.zip
|
||||
685,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/566/kv72-R213QW-mutations_r2.zip
|
||||
686,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/567/Ih_current.zip
|
||||
687,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/569/Schizophr.zip
|
||||
688,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/570/SaudargieneEtAl2015.zip
|
||||
689,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/571/bpap.zip
|
||||
690,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/568/reduction1.0.zip
|
||||
691,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/572/magical7.zip
|
||||
692,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/538/CS56PyModelDB.zip
|
||||
693,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/573/CavarrettaEtAl2014.zip
|
||||
694,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/574/Forrest2015.zip
|
||||
695,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/544/SinKin_ModelDB_r4.zip
|
||||
696,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/575/HyunEtAl2015.zip
|
||||
697,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/576/MasurkarChen2011_r1.zip
|
||||
698,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/577/Nakano_FICN_model_r1.zip
|
||||
699,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/582/AshhadNarayanan2013.zip
|
||||
700,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/583/DiFrancescoNoble1985.zip
|
||||
701,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/584/DGC.zip
|
||||
702,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/585/TejadaEtAl2014.zip
|
||||
703,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/586/DG_BC.zip
|
||||
704,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/587/DRG_Devor.zip
|
||||
705,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/588/Kv72_ModelDB.zip
|
||||
706,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/589/SousaEtAl2014.zip
|
||||
707,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/590/MiglioreEtAl2015.zip
|
||||
708,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/592/Chloride_Model.zip
|
||||
709,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/593/MiglioreEJN2016_r2.zip
|
||||
710,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/593/MiglioreEJN2016_r2.zip
|
||||
711,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/595/Moore2015.zip
|
||||
712,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/596/ephaptic.zip
|
||||
713,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/597/FFI_CA1_r3.zip
|
||||
714,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/598/stadler2014_layerV_r1.zip
|
||||
715,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/599/KubotaEtAl2011.zip
|
||||
716,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/600/2VN.zip
|
||||
717,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/601/SFS-IPS-WM-network.zip
|
||||
718,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/602/Branch_Point_Tapering.zip
|
||||
719,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/603/Golgi.zip
|
||||
720,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/604/MenonEtAl2009_r1.zip
|
||||
721,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/605/Skolnik_python_WinogradEtAl2008.zip
|
||||
722,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/606/CA3Atrophy.zip
|
||||
723,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/607/Gorin_et_al_2016.zip
|
||||
724,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/608/Poleg-PolskyDiamond2011.zip
|
||||
725,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/609/Guet-McCreightEtAl2016.zip
|
||||
726,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/610/ShuEtAl20062007_r1.zip
|
||||
727,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/611/ChambersEtAl2013.zip
|
||||
728,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/613/Demo.zip
|
||||
729,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/614/ShortEtAl2016.zip
|
||||
730,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/615/beelerReuter.zip
|
||||
731,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/616/YuEtAl2012.zip
|
||||
732,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/617/kv31m.zip
|
||||
733,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/618/Casaleggio2014.zip
|
||||
734,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/620/SekulicEtAl2015.zip
|
||||
735,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/621/DSGC.zip
|
||||
736,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/623/MiglioreMcTavish2013.zip
|
||||
737,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/624/KimEtAl2017.zip
|
||||
738,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/626/fig1b.zip
|
||||
739,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/627/cortex_r1.zip
|
||||
740,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/628/ConnellyEtAl2015_2016.zip
|
||||
741,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/629/oltedal.zip
|
||||
742,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/630/BalbiEtAl2013.zip
|
||||
743,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/631/LombardoHarrington2016.zip
|
||||
744,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/632/ka_rgc.zip
|
||||
745,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/634/na_rgc.zip
|
||||
746,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/635/kx_photo.zip
|
||||
747,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/636/V1_PFC_ModelDB.zip
|
||||
748,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/637/ROD_r1.zip
|
||||
749,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/638/a2dmodeldb_r1.zip
|
||||
750,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/639/Figure5.zip
|
||||
751,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/640/moore83.zip
|
||||
752,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/641/bogaard2009.zip
|
||||
753,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/642/SpaceClampDemo.zip
|
||||
754,0,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/643/Hines2011.zip
|
||||
755,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/644/anderson.zip
|
||||
756,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip
|
||||
757,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/645/VNO.zip
|
||||
758,1,cns,https://cns.neuroinf.jp/modules/fmanager/index.php/view/647/Watanabe-et-al_2017_r1.zip
|
||||
|
@@ -1,429 +0,0 @@
|
||||
38,https://cerebellum.neuroinf.jp/database/file/40/internalclock.zip
|
||||
39,https://cerebellum.neuroinf.jp/database/file/38/phase_converter.zip
|
||||
40,https://cerebellum.neuroinf.jp/database/file/30/adaptive_leakyintegrator.zip
|
||||
41,https://cerebellum.neuroinf.jp/database/file/14/tapped_delayline.zip
|
||||
42,https://cerebellum.neuroinf.jp/database/file/39/oscillator.zip
|
||||
43,https://cerebellum.neuroinf.jp/database/file/22/delayed_feedback.zip
|
||||
44,https://cerebellum.neuroinf.jp/database/file/25/mGluR_spectra.zip
|
||||
45,https://cerebellum.neuroinf.jp/database/file/15/spectral_timing.zip
|
||||
57,https://cerebellum.neuroinf.jp/database/file/83/nfimb.zip
|
||||
58,https://cerebellum.neuroinf.jp/database/file/84/code.zip
|
||||
59,https://cerebellum.neuroinf.jp/database/file/85/NCmodel.zip
|
||||
60,https://cerebellum.neuroinf.jp/database/file/86/LP_mDB.zip
|
||||
61,https://cerebellum.neuroinf.jp/database/file/87/canavier2007.zip
|
||||
62,https://cerebellum.neuroinf.jp/database/file/88/GeneratingOscillatoryBursts.zip
|
||||
63,https://cerebellum.neuroinf.jp/database/file/89/LundstromEtAl2009.zip
|
||||
64,https://cerebellum.neuroinf.jp/database/file/90/TS_mutation.zip
|
||||
65,https://cerebellum.neuroinf.jp/database/file/91/XuClancy2008.zip
|
||||
66,https://cerebellum.neuroinf.jp/database/file/92/largectx2004.zip
|
||||
67,https://cerebellum.neuroinf.jp/database/file/95/izh.zip
|
||||
68,https://cerebellum.neuroinf.jp/database/file/96/TalathiEtAl2008.zip
|
||||
69,https://cerebellum.neuroinf.jp/database/file/97/ATS-file.zip
|
||||
70,https://cerebellum.neuroinf.jp/database/file/98/decorr-model.zip
|
||||
71,https://cerebellum.neuroinf.jp/database/file/99/Okamoto_etal.zip
|
||||
72,https://cerebellum.neuroinf.jp/database/file/100/Deilephila.cc
|
||||
73,https://cerebellum.neuroinf.jp/database/file/102/aans2008.zip
|
||||
74,https://cerebellum.neuroinf.jp/database/file/103/nmda_model_db.zip
|
||||
75,https://cerebellum.neuroinf.jp/database/file/104/FEF_DEMO.zip
|
||||
76,https://cerebellum.neuroinf.jp/database/file/106/GWReverb_corrected.zip
|
||||
77,https://cerebellum.neuroinf.jp/database/file/107/mbe.zip
|
||||
78,https://cerebellum.neuroinf.jp/database/file/109/PrimAff_IntFire.zip
|
||||
79,https://cerebellum.neuroinf.jp/database/file/111/extendedmodel.zip
|
||||
80,https://cerebellum.neuroinf.jp/database/file/112/MIpaper_coderelease.zip
|
||||
81,https://cerebellum.neuroinf.jp/database/file/114/CMNG_JCN.zip
|
||||
82,https://cerebellum.neuroinf.jp/database/file/115/na_excit.zip
|
||||
83,https://cerebellum.neuroinf.jp/database/file/116/modelDB.zip
|
||||
84,https://cerebellum.neuroinf.jp/database/file/117/cav21_model.zip
|
||||
85,https://cerebellum.neuroinf.jp/database/file/119/v8sources_r1.zip
|
||||
86,https://cerebellum.neuroinf.jp/database/file/120/a_and_t.zip
|
||||
87,https://cerebellum.neuroinf.jp/database/file/121/chain_1d.zip
|
||||
114,https://cerebellum.neuroinf.jp/database/file/122/ihc-an_syn.zip
|
||||
116,https://cerebellum.neuroinf.jp/database/file/123/DynBasIrregSpNMDA.zip
|
||||
117,https://cerebellum.neuroinf.jp/database/file/124/laminarWsimulation.zip
|
||||
118,https://cerebellum.neuroinf.jp/database/file/125/DendroDendriticInhibition.zip
|
||||
119,https://cerebellum.neuroinf.jp/database/file/126/daspnet.zip
|
||||
120,https://cerebellum.neuroinf.jp/database/file/127/Ca_dyn_ORN_Reidl_etal.zip
|
||||
121,https://cerebellum.neuroinf.jp/database/file/128/pbmodel.zip
|
||||
122,https://cerebellum.neuroinf.jp/database/file/129/JNE.zip
|
||||
123,https://cerebellum.neuroinf.jp/database/file/130/CalyxSTPModel.zip
|
||||
124,https://cerebellum.neuroinf.jp/database/file/131/ihc.zip
|
||||
125,https://cerebellum.neuroinf.jp/database/file/132/RespirGeneratorBioSystems.zip
|
||||
126,https://cerebellum.neuroinf.jp/database/file/133/dwy_pnas_demo2.zip
|
||||
127,https://cerebellum.neuroinf.jp/database/file/134/BahmerLangner2007.zip
|
||||
131,https://cerebellum.neuroinf.jp/database/file/135/varkonyiEtAl2008.zip
|
||||
132,https://cerebellum.neuroinf.jp/database/file/136/intrinsicmodel.zip
|
||||
133,https://cerebellum.neuroinf.jp/database/file/137/IKHToffsetsIKLT.zip
|
||||
134,https://cerebellum.neuroinf.jp/database/file/139/KovacicEtAl2008.zip
|
||||
135,https://cerebellum.neuroinf.jp/database/file/140/selfinfluencing_plasticity.zip
|
||||
136,https://cerebellum.neuroinf.jp/database/file/141/slowwave.zip
|
||||
137,https://cerebellum.neuroinf.jp/database/file/142/SRM_simulator.zip
|
||||
138,https://cerebellum.neuroinf.jp/database/file/143/HerzogEtAl2001.zip
|
||||
139,https://cerebellum.neuroinf.jp/database/file/144/Hadipour-Niktarash2006.zip
|
||||
140,https://cerebellum.neuroinf.jp/database/file/154/FRB.zip
|
||||
141,https://cerebellum.neuroinf.jp/database/file/155/MSO_Zhouetal_2005.zip
|
||||
142,https://cerebellum.neuroinf.jp/database/file/156/PublioEtAl2009.zip
|
||||
143,https://cerebellum.neuroinf.jp/database/file/157/purkinje_ppr.zip
|
||||
144,https://cerebellum.neuroinf.jp/database/file/158/McCormickEtAl2007YuEtAl2008.zip
|
||||
145,https://cerebellum.neuroinf.jp/database/file/159/Hossain.zip
|
||||
146,https://cerebellum.neuroinf.jp/database/file/161/Hu_etal_AIS_Nav1p6_and_1p2_2009.zip
|
||||
147,https://cerebellum.neuroinf.jp/database/file/162/Alle_et_al_2009.zip
|
||||
148,https://cerebellum.neuroinf.jp/database/file/163/OLMmodel.zip
|
||||
149,https://cerebellum.neuroinf.jp/database/file/164/liuEtAl1998.zip
|
||||
150,https://cerebellum.neuroinf.jp/database/file/165/HCN2k.zip
|
||||
151,https://cerebellum.neuroinf.jp/database/file/166/nacb_msp_new.zip
|
||||
152,https://cerebellum.neuroinf.jp/database/file/167/Golgi_cell_NaKATPAse.zip
|
||||
153,https://cerebellum.neuroinf.jp/database/file/168/CA1_abeta.zip
|
||||
154,https://cerebellum.neuroinf.jp/database/file/169/SYN_NEW.zip
|
||||
155,https://cerebellum.neuroinf.jp/database/file/170/crane2001.zip
|
||||
156,https://cerebellum.neuroinf.jp/database/file/171/leeEtAl2003.zip
|
||||
157,https://cerebellum.neuroinf.jp/database/file/172/RoyeckEtAl2008.zip
|
||||
158,https://cerebellum.neuroinf.jp/database/file/173/CarvalhoBuonomano.zip
|
||||
159,https://cerebellum.neuroinf.jp/database/file/175/badoual_stdp.zip
|
||||
160,https://cerebellum.neuroinf.jp/database/file/176/b08dec23.zip
|
||||
161,https://cerebellum.neuroinf.jp/database/file/177/GranuleCell.zip
|
||||
162,https://cerebellum.neuroinf.jp/database/file/178/slowinact.zip
|
||||
163,https://cerebellum.neuroinf.jp/database/file/179/k_interneurons.zip
|
||||
164,https://cerebellum.neuroinf.jp/database/file/180/olm-int.zip
|
||||
165,https://cerebellum.neuroinf.jp/database/file/181/ca1.zip
|
||||
166,https://cerebellum.neuroinf.jp/database/file/182/Uebachs-et-al_2010.zip
|
||||
167,https://cerebellum.neuroinf.jp/database/file/183/CA1_multi.zip
|
||||
168,https://cerebellum.neuroinf.jp/database/file/184/magee2000.zip
|
||||
169,https://cerebellum.neuroinf.jp/database/file/185/nc-mri.zip
|
||||
170,https://cerebellum.neuroinf.jp/database/file/186/boosting.zip
|
||||
171,https://cerebellum.neuroinf.jp/database/file/187/gaspiriniEtAl2004.zip
|
||||
172,https://cerebellum.neuroinf.jp/database/file/188/synchro-ca1.zip
|
||||
173,https://cerebellum.neuroinf.jp/database/file/189/lamotrigine.zip
|
||||
174,https://cerebellum.neuroinf.jp/database/file/190/km.zip
|
||||
175,https://cerebellum.neuroinf.jp/database/file/191/theta.zip
|
||||
176,https://cerebellum.neuroinf.jp/database/file/192/sc-pp.zip
|
||||
177,https://cerebellum.neuroinf.jp/database/file/193/rebound.zip
|
||||
178,https://cerebellum.neuroinf.jp/database/file/194/obliques.zip
|
||||
179,https://cerebellum.neuroinf.jp/database/file/195/mutant.zip
|
||||
180,https://cerebellum.neuroinf.jp/database/file/196/ca3_db.zip
|
||||
181,https://cerebellum.neuroinf.jp/database/file/197/b04feb12.zip
|
||||
182,https://cerebellum.neuroinf.jp/database/file/198/ca3_2002.zip
|
||||
183,https://cerebellum.neuroinf.jp/database/file/199/develop.zip
|
||||
184,https://cerebellum.neuroinf.jp/database/file/200/ca3b.zip
|
||||
185,https://cerebellum.neuroinf.jp/database/file/201/h_cno.zip
|
||||
186,https://cerebellum.neuroinf.jp/database/file/202/CN_Bushy_Stellate.zip
|
||||
187,https://cerebellum.neuroinf.jp/database/file/203/CN_Pyr.zip
|
||||
188,https://cerebellum.neuroinf.jp/database/file/204/kca.zip
|
||||
189,https://cerebellum.neuroinf.jp/database/file/205/ca3-summ.zip
|
||||
190,https://cerebellum.neuroinf.jp/database/file/206/KampaStuart2006.zip
|
||||
191,https://cerebellum.neuroinf.jp/database/file/207/fink2000.zip
|
||||
192,https://cerebellum.neuroinf.jp/database/file/208/giuglianoEtAl2007.zip
|
||||
193,https://cerebellum.neuroinf.jp/database/file/209/cardiac1998_20030409.zip
|
||||
194,https://cerebellum.neuroinf.jp/database/file/210/NegroniLascano.zip
|
||||
195,https://cerebellum.neuroinf.jp/database/file/212/Golgi_cell.zip
|
||||
196,https://cerebellum.neuroinf.jp/database/file/213/purkinje.zip
|
||||
197,https://cerebellum.neuroinf.jp/database/file/214/prknj.zip
|
||||
198,https://cerebellum.neuroinf.jp/database/file/215/AkemannKnopfelPurkinje_cell_model.zip
|
||||
199,https://cerebellum.neuroinf.jp/database/file/216/tri_cpg_old.zip
|
||||
200,https://cerebellum.neuroinf.jp/database/file/217/cdlab_r1.zip
|
||||
201,https://cerebellum.neuroinf.jp/database/file/218/anyas2005.zip
|
||||
202,https://cerebellum.neuroinf.jp/database/file/219/CruzEtAlS_cellModel.zip
|
||||
203,https://cerebellum.neuroinf.jp/database/file/220/Wimmer-et-al2009.zip
|
||||
204,https://cerebellum.neuroinf.jp/database/file/221/FerranteEtAl2008.zip
|
||||
205,https://cerebellum.neuroinf.jp/database/file/222/lytton97b.zip
|
||||
206,https://cerebellum.neuroinf.jp/database/file/223/NEURON-2008b.zip
|
||||
207,https://cerebellum.neuroinf.jp/database/file/224/korogod.zip
|
||||
208,https://cerebellum.neuroinf.jp/database/file/225/moore78.zip
|
||||
209,https://cerebellum.neuroinf.jp/database/file/226/demo.zip
|
||||
210,https://cerebellum.neuroinf.jp/database/file/227/ctxnet_r1.zip
|
||||
211,https://cerebellum.neuroinf.jp/database/file/228/joyner80.zip
|
||||
212,https://cerebellum.neuroinf.jp/database/file/229/D2modul.zip
|
||||
213,https://cerebellum.neuroinf.jp/database/file/230/ka_dg.zip
|
||||
214,https://cerebellum.neuroinf.jp/database/file/231/shrager91.zip
|
||||
215,https://cerebellum.neuroinf.jp/database/file/232/EurJNeurosci2000.zip
|
||||
216,https://cerebellum.neuroinf.jp/database/file/233/nevian.zip
|
||||
217,https://cerebellum.neuroinf.jp/database/file/234/dendgeom.zip
|
||||
218,https://cerebellum.neuroinf.jp/database/file/235/dgbc.zip
|
||||
219,https://cerebellum.neuroinf.jp/database/file/236/FFI.zip
|
||||
220,https://cerebellum.neuroinf.jp/database/file/237/dentate_gyrus_r1.zip
|
||||
221,https://cerebellum.neuroinf.jp/database/file/239/aradi1999.zip
|
||||
222,https://cerebellum.neuroinf.jp/database/file/240/dentategyrusnet2005_r1.zip
|
||||
223,https://cerebellum.neuroinf.jp/database/file/241/CanavierLandry2006.zip
|
||||
224,https://cerebellum.neuroinf.jp/database/file/242/hines2004.zip
|
||||
225,https://cerebellum.neuroinf.jp/database/file/243/amirdevor03.zip
|
||||
226,https://cerebellum.neuroinf.jp/database/file/244/dm1_pn_model.zip
|
||||
227,https://cerebellum.neuroinf.jp/database/file/245/mitral.zip
|
||||
228,https://cerebellum.neuroinf.jp/database/file/246/AkemannEtAl2009.zip
|
||||
229,https://cerebellum.neuroinf.jp/database/file/247/MSN2009.zip
|
||||
230,https://cerebellum.neuroinf.jp/database/file/248/rall1964.zip
|
||||
231,https://cerebellum.neuroinf.jp/database/file/249/Neural_Computation.zip
|
||||
232,https://cerebellum.neuroinf.jp/database/file/250/ElectricallycoupledRetziusneurons.zip
|
||||
238,https://cerebellum.neuroinf.jp/database/file/265/ephaptic.zip
|
||||
239,https://cerebellum.neuroinf.jp/database/file/266/time.zip
|
||||
240,https://cerebellum.neuroinf.jp/database/file/267/acker_antic.zip
|
||||
241,https://cerebellum.neuroinf.jp/database/file/268/b1.zip
|
||||
242,https://cerebellum.neuroinf.jp/database/file/269/WC.zip
|
||||
243,https://cerebellum.neuroinf.jp/database/file/270/eaps.zip
|
||||
244,https://cerebellum.neuroinf.jp/database/file/271/stockbridge1982.zip
|
||||
245,https://cerebellum.neuroinf.jp/database/file/272/geigerEtAl1997.zip
|
||||
246,https://cerebellum.neuroinf.jp/database/file/273/fs_internrn.zip
|
||||
247,https://cerebellum.neuroinf.jp/database/file/274/ihmodel.zip
|
||||
248,https://cerebellum.neuroinf.jp/database/file/275/lytton98.zip
|
||||
249,https://cerebellum.neuroinf.jp/database/file/276/fluct.zip
|
||||
250,https://cerebellum.neuroinf.jp/database/file/277/vs4_modelDB.zip
|
||||
251,https://cerebellum.neuroinf.jp/database/file/279/djurisic2008.zip
|
||||
252,https://cerebellum.neuroinf.jp/database/file/280/JohnsonMcIntyre2008.zip
|
||||
253,https://cerebellum.neuroinf.jp/database/file/281/inhibnet.zip
|
||||
254,https://cerebellum.neuroinf.jp/database/file/282/wangbuzsaki1996.zip
|
||||
255,https://cerebellum.neuroinf.jp/database/file/283/GeneralizedCarnevaleHinesScheme.zip
|
||||
256,https://cerebellum.neuroinf.jp/database/file/284/geomindu.zip
|
||||
257,https://cerebellum.neuroinf.jp/database/file/285/gludiff.zip
|
||||
258,https://cerebellum.neuroinf.jp/database/file/287/HFO.zip
|
||||
259,https://cerebellum.neuroinf.jp/database/file/288/Basketcell.zip
|
||||
260,https://cerebellum.neuroinf.jp/database/file/289/lytton99.zip
|
||||
261,https://cerebellum.neuroinf.jp/database/file/290/HAGPA.zip
|
||||
262,https://cerebellum.neuroinf.jp/database/file/291/PospischilEtAl2008.zip
|
||||
263,https://cerebellum.neuroinf.jp/database/file/292/hb.zip
|
||||
264,https://cerebellum.neuroinf.jp/database/file/293/Welie-Wadman-JPhysiol-subiculum.zip
|
||||
265,https://cerebellum.neuroinf.jp/database/file/294/Arsiero_et_al2007.zip
|
||||
266,https://cerebellum.neuroinf.jp/database/file/295/Ga_demo20070907.zip
|
||||
267,https://cerebellum.neuroinf.jp/database/file/296/ring.zip
|
||||
268,https://cerebellum.neuroinf.jp/database/file/297/b07dec27_20091025.zip
|
||||
269,https://cerebellum.neuroinf.jp/database/file/299/NMDA_Mg.zip
|
||||
270,https://cerebellum.neuroinf.jp/database/file/300/Channels_NEW.zip
|
||||
271,https://cerebellum.neuroinf.jp/database/file/301/lsimp2.zip
|
||||
272,https://cerebellum.neuroinf.jp/database/file/302/bfstdp.zip
|
||||
273,https://cerebellum.neuroinf.jp/database/file/303/baccus98.zip
|
||||
274,https://cerebellum.neuroinf.jp/database/file/304/locstepperf.zip
|
||||
275,https://cerebellum.neuroinf.jp/database/file/305/dendtc.zip
|
||||
276,https://cerebellum.neuroinf.jp/database/file/306/SS-cortex.zip
|
||||
277,https://cerebellum.neuroinf.jp/database/file/307/kv31m.zip
|
||||
278,https://cerebellum.neuroinf.jp/database/file/308/beelerReuter.zip
|
||||
279,https://cerebellum.neuroinf.jp/database/file/309/StiefelSejnowskiCode.zip
|
||||
280,https://cerebellum.neuroinf.jp/database/file/310/Traub2003.zip
|
||||
281,https://cerebellum.neuroinf.jp/database/file/312/canavier1999.zip
|
||||
282,https://cerebellum.neuroinf.jp/database/file/313/GPSingleCompartment_r1.zip
|
||||
283,https://cerebellum.neuroinf.jp/database/file/314/LFP.zip
|
||||
284,https://cerebellum.neuroinf.jp/database/file/315/CA1_Aged.zip
|
||||
285,https://cerebellum.neuroinf.jp/database/file/316/baker05.zip
|
||||
286,https://cerebellum.neuroinf.jp/database/file/317/window.zip
|
||||
287,https://cerebellum.neuroinf.jp/database/file/318/GrC.zip
|
||||
288,https://cerebellum.neuroinf.jp/database/file/319/MyFirstNrn_r1.zip
|
||||
289,https://cerebellum.neuroinf.jp/database/file/320/brill77.zip
|
||||
290,https://cerebellum.neuroinf.jp/database/file/321/withdrawal.zip
|
||||
291,https://cerebellum.neuroinf.jp/database/file/322/nrnpython.zip
|
||||
292,https://cerebellum.neuroinf.jp/database/file/323/murphy01.zip
|
||||
293,https://cerebellum.neuroinf.jp/database/file/324/NN_kole.zip
|
||||
294,https://cerebellum.neuroinf.jp/database/file/325/gp.zip
|
||||
295,https://cerebellum.neuroinf.jp/database/file/326/neo_LI.zip
|
||||
296,https://cerebellum.neuroinf.jp/database/file/327/pyrcell.zip
|
||||
297,https://cerebellum.neuroinf.jp/database/file/328/lindgren89.zip
|
||||
298,https://cerebellum.neuroinf.jp/database/file/329/destexhe_benchmarks.zip
|
||||
299,https://cerebellum.neuroinf.jp/database/file/330/modeldb-etoh.zip
|
||||
300,https://cerebellum.neuroinf.jp/database/file/331/nainact.zip
|
||||
301,https://cerebellum.neuroinf.jp/database/file/332/RichyandStarfish.zip
|
||||
302,https://cerebellum.neuroinf.jp/database/file/333/bulbNet.zip
|
||||
303,https://cerebellum.neuroinf.jp/database/file/334/bbmit.zip
|
||||
304,https://cerebellum.neuroinf.jp/database/file/335/mit4.zip
|
||||
305,https://cerebellum.neuroinf.jp/database/file/336/mitral_1999.zip
|
||||
306,https://cerebellum.neuroinf.jp/database/file/337/ka_kdr_mt.zip
|
||||
307,https://cerebellum.neuroinf.jp/database/file/338/chen2002.zip
|
||||
308,https://cerebellum.neuroinf.jp/database/file/339/h_pg.zip
|
||||
309,https://cerebellum.neuroinf.jp/database/file/340/migliore2010.zip
|
||||
310,https://cerebellum.neuroinf.jp/database/file/341/saghatelyan.zip
|
||||
311,https://cerebellum.neuroinf.jp/database/file/342/plast.zip
|
||||
312,https://cerebellum.neuroinf.jp/database/file/343/MT-GC.zip
|
||||
313,https://cerebellum.neuroinf.jp/database/file/344/gap-modeldb.zip
|
||||
314,https://cerebellum.neuroinf.jp/database/file/345/stockbridge84.zip
|
||||
315,https://cerebellum.neuroinf.jp/database/file/346/patdemo.zip
|
||||
316,https://cerebellum.neuroinf.jp/database/file/347/Korngreen_Sakmann.zip
|
||||
317,https://cerebellum.neuroinf.jp/database/file/348/spru1998.zip
|
||||
318,https://cerebellum.neuroinf.jp/database/file/349/cortex.zip
|
||||
319,https://cerebellum.neuroinf.jp/database/file/350/sth-model.zip
|
||||
320,https://cerebellum.neuroinf.jp/database/file/351/Kourennyi-etal2004.zip
|
||||
321,https://cerebellum.neuroinf.jp/database/file/352/oltedal.zip
|
||||
322,https://cerebellum.neuroinf.jp/database/file/353/mcn1.zip
|
||||
323,https://cerebellum.neuroinf.jp/database/file/354/KuznetsovaEtAl2010.zip
|
||||
324,https://cerebellum.neuroinf.jp/database/file/355/rejuvenation.zip
|
||||
325,https://cerebellum.neuroinf.jp/database/file/356/ka_rgc.zip
|
||||
326,https://cerebellum.neuroinf.jp/database/file/357/ca_rgc.zip
|
||||
327,https://cerebellum.neuroinf.jp/database/file/358/kdr_rgc.zip
|
||||
328,https://cerebellum.neuroinf.jp/database/file/359/na_rgc.zip
|
||||
329,https://cerebellum.neuroinf.jp/database/file/360/kx_photo.zip
|
||||
330,https://cerebellum.neuroinf.jp/database/file/361/Ribbon.zip
|
||||
331,https://cerebellum.neuroinf.jp/database/file/362/ROD.zip
|
||||
332,https://cerebellum.neuroinf.jp/database/file/363/LetzkusEtAl2006.zip
|
||||
333,https://cerebellum.neuroinf.jp/database/file/364/sheasbyfohlmeister1999a.zip
|
||||
334,https://cerebellum.neuroinf.jp/database/file/365/5chan.zip
|
||||
335,https://cerebellum.neuroinf.jp/database/file/366/YuEtAlPNAS2007.zip
|
||||
336,https://cerebellum.neuroinf.jp/database/file/367/ShortTermPlasticityMFGRC_Nieus2006.zip
|
||||
337,https://cerebellum.neuroinf.jp/database/file/368/varela.zip
|
||||
338,https://cerebellum.neuroinf.jp/database/file/369/lgnsigint.zip
|
||||
339,https://cerebellum.neuroinf.jp/database/file/370/SNRCA1.zip
|
||||
340,https://cerebellum.neuroinf.jp/database/file/371/Liu-Kourennyi_2004.zip
|
||||
345,https://cerebellum.neuroinf.jp/database/file/105/mNing.zip
|
||||
346,https://cerebellum.neuroinf.jp/database/file/110/arlo.zip
|
||||
347,https://cerebellum.neuroinf.jp/database/file/113/SynInt_Cond.zip
|
||||
348,https://cerebellum.neuroinf.jp/database/file/118/mearealtimesoftware.zip
|
||||
352,https://cerebellum.neuroinf.jp/database/file/138/KoendgenEtAl2008.zip
|
||||
353,https://cerebellum.neuroinf.jp/database/file/146/modeldb_peron_gabbiani_nn.zip
|
||||
354,https://cerebellum.neuroinf.jp/database/file/147/BG_spiking_model.zip
|
||||
355,https://cerebellum.neuroinf.jp/database/file/148/carver.zip
|
||||
356,https://cerebellum.neuroinf.jp/database/file/149/leechCPG.zip
|
||||
357,https://cerebellum.neuroinf.jp/database/file/150/motor_plant.zip
|
||||
358,https://cerebellum.neuroinf.jp/database/file/151/activityphase.zip
|
||||
359,https://cerebellum.neuroinf.jp/database/file/152/syndep.zip
|
||||
361,https://cerebellum.neuroinf.jp/database/file/174/BGnet.zip
|
||||
362,https://cerebellum.neuroinf.jp/database/file/145/SWMdend1.zip
|
||||
363,https://cerebellum.neuroinf.jp/database/file/211/splitcell_r1.zip
|
||||
410,https://cerebellum.neuroinf.jp/database/file/264/Hipp_paper_code.zip
|
||||
411,https://cerebellum.neuroinf.jp/database/file/278/SFS-IPS-WM-network.zip
|
||||
412,https://cerebellum.neuroinf.jp/database/file/286/SRandCRnet.zip
|
||||
416,https://cerebellum.neuroinf.jp/database/file/93/purkinje.zip
|
||||
417,https://cerebellum.neuroinf.jp/database/file/94/HHsim_31.zip
|
||||
485,https://cerebellum.neuroinf.jp/database/file/463/hines2001_r1.zip
|
||||
486,https://cerebellum.neuroinf.jp/database/file/461/ba.zip
|
||||
487,https://cerebellum.neuroinf.jp/database/file/460/spikeinit.zip
|
||||
488,https://cerebellum.neuroinf.jp/database/file/459/FoustEtAl2011.zip
|
||||
489,https://cerebellum.neuroinf.jp/database/file/458/dodge73.zip
|
||||
490,https://cerebellum.neuroinf.jp/database/file/457/MRGaxon_r1.zip
|
||||
491,https://cerebellum.neuroinf.jp/database/file/456/motoneuron.zip
|
||||
492,https://cerebellum.neuroinf.jp/database/file/455/spinebranches_r1.zip
|
||||
493,https://cerebellum.neuroinf.jp/database/file/454/GrahamEtAl20145.zip
|
||||
494,https://cerebellum.neuroinf.jp/database/file/453/SpineCaModel.zip
|
||||
496,https://cerebellum.neuroinf.jp/database/file/452/spinycell.zip
|
||||
497,https://cerebellum.neuroinf.jp/database/file/451/stochastichh.zip
|
||||
498,https://cerebellum.neuroinf.jp/database/file/396/synmap.zip
|
||||
499,https://cerebellum.neuroinf.jp/database/file/450/hh.zip
|
||||
500,https://cerebellum.neuroinf.jp/database/file/397/LRd_Hypoxia.cpp
|
||||
501,https://cerebellum.neuroinf.jp/database/file/448/HallermannEtAl2012_r1.zip
|
||||
502,https://cerebellum.neuroinf.jp/database/file/447/LuthmanEtAl2011.zip
|
||||
503,https://cerebellum.neuroinf.jp/database/file/445/NCnote.zip
|
||||
504,https://cerebellum.neuroinf.jp/database/file/399/tri_cpg_new20070903.zip
|
||||
505,https://cerebellum.neuroinf.jp/database/file/409/calc.zip
|
||||
506,https://cerebellum.neuroinf.jp/database/file/444/Stochastic_r1.zip
|
||||
507,https://cerebellum.neuroinf.jp/database/file/442/SeqLearn.zip
|
||||
511,https://cerebellum.neuroinf.jp/database/file/396/synmap.zip
|
||||
514,https://cerebellum.neuroinf.jp/database/file/398/PurkReduction.zip
|
||||
515,https://cerebellum.neuroinf.jp/database/file/401/TurtleVisCortex.zip
|
||||
516,https://cerebellum.neuroinf.jp/database/file/400/Two_Models.zip
|
||||
517,https://cerebellum.neuroinf.jp/database/file/441/MahonEtAl2000.zip
|
||||
518,https://cerebellum.neuroinf.jp/database/file/398/PurkReduction.zip
|
||||
519,https://cerebellum.neuroinf.jp/database/file/437/Kopp-Scheinpflug2011.zip
|
||||
520,https://cerebellum.neuroinf.jp/database/file/451/stochastichh.zip
|
||||
521,https://cerebellum.neuroinf.jp/database/file/402/herzogEtAl01.zip
|
||||
523,https://cerebellum.neuroinf.jp/database/file/435/ncdemo.zip
|
||||
524,https://cerebellum.neuroinf.jp/database/file/404/HinesCarnevaleJNM2007.zip
|
||||
525,https://cerebellum.neuroinf.jp/database/file/434/granule.zip
|
||||
526,https://cerebellum.neuroinf.jp/database/file/406/kkt98.zip
|
||||
527,https://cerebellum.neuroinf.jp/database/file/433/larkumEtAl2009_2_r1.zip
|
||||
528,https://cerebellum.neuroinf.jp/database/file/432/LDS_model.zip
|
||||
529,https://cerebellum.neuroinf.jp/database/file/407/b07dec17_r2.zip
|
||||
530,https://cerebellum.neuroinf.jp/database/file/408/lamina1.zip
|
||||
531,https://cerebellum.neuroinf.jp/database/file/410/bb.zip
|
||||
532,https://cerebellum.neuroinf.jp/database/file/411/Gow_Devaux_2009.zip
|
||||
533,https://cerebellum.neuroinf.jp/database/file/412/b09jan08_r1.zip
|
||||
534,https://cerebellum.neuroinf.jp/database/file/416/DLGN_NEW_r1.zip
|
||||
535,https://cerebellum.neuroinf.jp/database/file/431/tsodyks.zip
|
||||
536,https://cerebellum.neuroinf.jp/database/file/430/CoHCNS2000.zip
|
||||
537,https://cerebellum.neuroinf.jp/database/file/429/Welday_et_al.zip
|
||||
538,https://cerebellum.neuroinf.jp/database/file/428/zippedModels_r1.zip
|
||||
539,https://cerebellum.neuroinf.jp/database/file/427/ca_t_lva.zip
|
||||
540,https://cerebellum.neuroinf.jp/database/file/426/CaT.zip
|
||||
541,https://cerebellum.neuroinf.jp/database/file/425/westerfield78.zip
|
||||
542,https://cerebellum.neuroinf.jp/database/file/423/b09jan13_r4.zip
|
||||
543,https://cerebellum.neuroinf.jp/database/file/422/lytton97_r1.zip
|
||||
544,https://cerebellum.neuroinf.jp/database/file/421/h_tc.zip
|
||||
545,https://cerebellum.neuroinf.jp/database/file/420/it.zip
|
||||
546,https://cerebellum.neuroinf.jp/database/file/418/NTW_NEW_r1.zip
|
||||
547,https://cerebellum.neuroinf.jp/database/file/417/dendre_r1.zip
|
||||
550,https://cerebellum.neuroinf.jp/database/file/396/synmap.zip
|
||||
551,https://cerebellum.neuroinf.jp/database/file/397/LRd_Hypoxia.cpp
|
||||
552,https://cerebellum.neuroinf.jp/database/file/398/PurkReduction.zip
|
||||
553,https://cerebellum.neuroinf.jp/database/file/399/tri_cpg_new20070903.zip
|
||||
554,https://cerebellum.neuroinf.jp/database/file/400/Two_Models.zip
|
||||
555,https://cerebellum.neuroinf.jp/database/file/401/TurtleVisCortex.zip
|
||||
556,https://cerebellum.neuroinf.jp/database/file/402/herzogEtAl01.zip
|
||||
557,https://cerebellum.neuroinf.jp/database/file/409/calc.zip
|
||||
558,https://cerebellum.neuroinf.jp/database/file/404/HinesCarnevaleJNM2007.zip
|
||||
559,https://cerebellum.neuroinf.jp/database/file/406/kkt98.zip
|
||||
560,https://cerebellum.neuroinf.jp/database/file/407/b07dec17_r2.zip
|
||||
561,https://cerebellum.neuroinf.jp/database/file/408/lamina1.zip
|
||||
562,https://cerebellum.neuroinf.jp/database/file/410/bb.zip
|
||||
563,https://cerebellum.neuroinf.jp/database/file/411/Gow_Devaux_2009.zip
|
||||
564,https://cerebellum.neuroinf.jp/database/file/412/b09jan08_r1.zip
|
||||
565,https://cerebellum.neuroinf.jp/database/file/415/thal_aug_resp_r1.zip
|
||||
566,https://cerebellum.neuroinf.jp/database/file/416/DLGN_NEW_r1.zip
|
||||
567,https://cerebellum.neuroinf.jp/database/file/417/dendre_r1.zip
|
||||
568,https://cerebellum.neuroinf.jp/database/file/418/NTW_NEW_r1.zip
|
||||
569,https://cerebellum.neuroinf.jp/database/file/420/it.zip
|
||||
570,simpf:cerebellum/533/desac_imp.zip
|
||||
571,https://cerebellum.neuroinf.jp/database/file/421/h_tc.zip
|
||||
572,https://cerebellum.neuroinf.jp/database/file/422/lytton97_r1.zip
|
||||
573,https://cerebellum.neuroinf.jp/database/file/423/b09jan13_r4.zip
|
||||
574,https://cerebellum.neuroinf.jp/database/file/99/Okamoto_etal.zip
|
||||
575,https://cerebellum.neuroinf.jp/database/file/425/westerfield78.zip
|
||||
576,https://cerebellum.neuroinf.jp/database/file/426/CaT.zip
|
||||
577,https://cerebellum.neuroinf.jp/database/file/427/ca_t_lva.zip
|
||||
578,https://cerebellum.neuroinf.jp/database/file/428/zippedModels_r1.zip
|
||||
579,https://cerebellum.neuroinf.jp/database/file/429/Welday_et_al.zip
|
||||
580,https://cerebellum.neuroinf.jp/database/file/430/CoHCNS2000.zip
|
||||
581,https://cerebellum.neuroinf.jp/database/file/431/tsodyks.zip
|
||||
582,https://cerebellum.neuroinf.jp/database/file/432/LDS_model.zip
|
||||
583,https://cerebellum.neuroinf.jp/database/file/433/larkumEtAl2009_2_r1.zip
|
||||
584,https://cerebellum.neuroinf.jp/database/file/434/granule.zip
|
||||
585,https://cerebellum.neuroinf.jp/database/file/435/ncdemo.zip
|
||||
586,https://cerebellum.neuroinf.jp/database/file/436/VladimirovTuTraub2013.zip
|
||||
587,https://cerebellum.neuroinf.jp/database/file/437/Kopp-Scheinpflug2011.zip
|
||||
588,https://cerebellum.neuroinf.jp/database/file/438/stnAxonDbsModel.zip
|
||||
589,https://cerebellum.neuroinf.jp/database/file/441/MahonEtAl2000.zip
|
||||
590,https://cerebellum.neuroinf.jp/database/file/445/NCnote.zip
|
||||
591,https://cerebellum.neuroinf.jp/database/file/445/NCnote.zip
|
||||
592,https://cerebellum.neuroinf.jp/database/file/447/LuthmanEtAl2011.zip
|
||||
593,https://cerebellum.neuroinf.jp/database/file/448/HallermannEtAl2012_r1.zip
|
||||
594,https://cerebellum.neuroinf.jp/database/file/450/hh.zip
|
||||
595,https://cerebellum.neuroinf.jp/database/file/451/stochastichh.zip
|
||||
596,https://cerebellum.neuroinf.jp/database/file/452/spinycell.zip
|
||||
598,https://cerebellum.neuroinf.jp/database/file/454/GrahamEtAl20145.zip
|
||||
599,https://cerebellum.neuroinf.jp/database/file/455/spinebranches_r1.zip
|
||||
600,https://cerebellum.neuroinf.jp/database/file/456/motoneuron.zip
|
||||
601,https://cerebellum.neuroinf.jp/database/file/457/MRGaxon_r1.zip
|
||||
602,https://cerebellum.neuroinf.jp/database/file/458/dodge73.zip
|
||||
603,https://cerebellum.neuroinf.jp/database/file/459/FoustEtAl2011.zip
|
||||
604,https://cerebellum.neuroinf.jp/database/file/460/spikeinit.zip
|
||||
605,https://cerebellum.neuroinf.jp/database/file/461/ba.zip
|
||||
606,https://cerebellum.neuroinf.jp/database/file/463/hines2001_r1.zip
|
||||
607,https://cerebellum.neuroinf.jp/database/file/464/SENB.hoc
|
||||
608,https://cerebellum.neuroinf.jp/database/file/465/kootsey83.zip
|
||||
609,https://cerebellum.neuroinf.jp/database/file/466/na2006.zip
|
||||
610,https://cerebellum.neuroinf.jp/database/file/467/BiddellJohnson2013.zip
|
||||
611,https://cerebellum.neuroinf.jp/database/file/468/WilsonBower1992.zip
|
||||
613,https://cerebellum.neuroinf.jp/database/file/470/Liu-Kourennyi_2004_r1.zip
|
||||
614,https://cerebellum.neuroinf.jp/database/file/471/DAmodel.zip
|
||||
615,https://cerebellum.neuroinf.jp/database/file/482/HBplusIh.zip
|
||||
616,https://cerebellum.neuroinf.jp/database/file/484/damodel_r1.zip
|
||||
617,https://cerebellum.neuroinf.jp/database/file/485/OlivaresEtAl2015.zip
|
||||
618,https://cerebellum.neuroinf.jp/database/file/486/RallShepherd1968.zip
|
||||
619,https://cerebellum.neuroinf.jp/database/file/487/SPN_ModelDB.zip
|
||||
620,https://cerebellum.neuroinf.jp/database/file/490/KonstantoudakiEtAl2014.zip
|
||||
621,https://cerebellum.neuroinf.jp/database/file/492/HayEtAl2013.zip
|
||||
622,https://cerebellum.neuroinf.jp/database/file/493/FietkiewiczEtAl2016.zip
|
||||
623,https://cerebellum.neuroinf.jp/database/file/494/GPeNeuronKitano.zip
|
||||
624,https://cerebellum.neuroinf.jp/database/file/495/netmod_r3.zip
|
||||
625,https://cerebellum.neuroinf.jp/database/file/498/ModelDBFolder.zip
|
||||
626,https://cerebellum.neuroinf.jp/database/file/497/L5P.zip
|
||||
627,https://cerebellum.neuroinf.jp/database/file/499/oconnoretal2012.zip
|
||||
628,https://cerebellum.neuroinf.jp/database/file/502/LavzinEtAl2012.zip
|
||||
629,https://cerebellum.neuroinf.jp/database/file/503/PolskyEtAl2009.zip
|
||||
630,https://cerebellum.neuroinf.jp/database/file/504/modeldb-etoh.zip
|
||||
631,https://cerebellum.neuroinf.jp/database/file/505/Fineberg_et_al_2012.zip
|
||||
632,https://cerebellum.neuroinf.jp/database/file/506/ParekhAscoli2013.zip
|
||||
633,https://cerebellum.neuroinf.jp/database/file/509/NQS_with_example.zip
|
||||
634,https://cerebellum.neuroinf.jp/database/file/510/internalclock.zip
|
||||
635,https://cerebellum.neuroinf.jp/database/file/512/macroglossum_models.zip
|
||||
636,https://cerebellum.neuroinf.jp/database/file/514/BerzThetaGamm2013.zip
|
||||
637,https://cerebellum.neuroinf.jp/database/file/515/JedlickaEtAl2015.zip
|
||||
638,https://cerebellum.neuroinf.jp/database/file/516/GG.zip
|
||||
639,https://cerebellum.neuroinf.jp/database/file/519/PalmerStuart2009.zip
|
||||
640,https://cerebellum.neuroinf.jp/database/file/520/mvns.zip
|
||||
641,https://cerebellum.neuroinf.jp/database/file/521/grid.zip
|
||||
642,https://cerebellum.neuroinf.jp/database/file/522/StochasticHH.zip
|
||||
643,https://cerebellum.neuroinf.jp/database/file/523/CoskrenEtAl2015.zip
|
||||
644,https://cerebellum.neuroinf.jp/database/file/526/WDR-Model_r2.zip
|
||||
645,https://cerebellum.neuroinf.jp/database/file/529/CutsuridisPoirazi2015_r2.zip
|
||||
646,https://cerebellum.neuroinf.jp/database/file/530/PFCcell_r5.zip
|
||||
647,https://cerebellum.neuroinf.jp/database/file/531/DendroDend_r3.zip
|
||||
|
@@ -1,19 +1,20 @@
|
||||
<!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="robots" content="index,follow" />
|
||||
<meta name="keywords" content="neuroinformatics, xoonips, database, cerebellar platform, cerebellum" />
|
||||
<meta name="author" content="Neuroinformatics Unit, RIKEN Center for Brain Science" />
|
||||
<meta name="copyright" content="Copyright © 2019" />
|
||||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<title>Cerebellar Platform - Official Site</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
Generated
+2104
File diff suppressed because it is too large
Load Diff
+41
-58
@@ -1,60 +1,43 @@
|
||||
{
|
||||
"name": "cerebellum",
|
||||
"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": "cerebellum",
|
||||
"version": "2.0.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc -b && vite build",
|
||||
"preview": "vite preview",
|
||||
"lint": "biome lint",
|
||||
"format": "biome format --write",
|
||||
"check": "biome check --write"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dr.pogodin/react-helmet": "^3.2.3",
|
||||
"@orrisroot/react-html-parser": "^3.0.1",
|
||||
"async-lock": "^1.4.1",
|
||||
"date-fns": "^4.4.0",
|
||||
"ky": "^2.1.0",
|
||||
"lokijs": "^1.5.12",
|
||||
"rc-tree": "^5.13.1",
|
||||
"react": "^19.3.0",
|
||||
"react-cookie": "^8.1.2",
|
||||
"react-dom": "^19.3.0",
|
||||
"react-ga4": "^3.0.1",
|
||||
"react-overlays": "^5.2.1",
|
||||
"react-router": "^8.3.1",
|
||||
"sanitize.css": "^13.0.0",
|
||||
"yet-another-react-lightbox": "^3.32.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^2.5.13",
|
||||
"@types/async-lock": "^1.4.2",
|
||||
"@types/lokijs": "^1.5.14",
|
||||
"@types/node": "^24.13.4",
|
||||
"@types/react": "^19.3.0",
|
||||
"@types/react-dom": "^19.3.0",
|
||||
"@vitejs/plugin-react": "^6.1.1",
|
||||
"sirv": "^3.0.2",
|
||||
"typescript": "~7.0.2",
|
||||
"vite": "^8.3.0"
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -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
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"short_name": "Cerebellar Platform",
|
||||
"name": "Cerebellar Platform",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "32x32 16x16",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
"short_name": "Cerebellar Platform",
|
||||
"name": "Cerebellar Platform",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "32x32 16x16",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
@import url('./common/assets/theme/style.css');
|
||||
@import url("./common/assets/theme/style.css");
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
+46
-65
@@ -1,83 +1,64 @@
|
||||
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 = import.meta.env.PROD && Config.GOOGLE_ANALYTICS_TRACKING_ID !== '';
|
||||
|
||||
interface Props extends RouteComponentProps, ReactCookieProps { }
|
||||
interface State {
|
||||
lang: MultiLang;
|
||||
if (isAnalyticsEnabled) {
|
||||
// Page views are sent from the location effect below, the first one included;
|
||||
// gtag's own page_view on config would count the landing page twice.
|
||||
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID, { gtagOptions: { send_page_view: false } });
|
||||
}
|
||||
|
||||
class AppRoot extends Component<Props, State> {
|
||||
const toMultiLang = (value: unknown): MultiLang | null => (value === 'en' || value === 'ja' ? value : null);
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.state = { lang: 'en' };
|
||||
if (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;
|
||||
|
||||
+28
-19
@@ -1,16 +1,21 @@
|
||||
import React from 'react';
|
||||
import { Route, Switch } from 'react-router-dom';
|
||||
import { MultiLang } from '../config';
|
||||
import { lazy, Suspense } from 'react';
|
||||
import { useLocation } from 'react-router';
|
||||
import type { MultiLang } from '../config';
|
||||
import CerebellarPlatformCommittee from '../custom/blocks/CerebellarPlatformCommittee';
|
||||
import CerebrationOfDrItosNewBook from '../custom/blocks/CerebrationOfDrItosNewBook';
|
||||
import NewArticleAlert from '../custom/blocks/NewArticleAlert';
|
||||
import Loading from './lib/Loading';
|
||||
|
||||
// A standing bibliography, and by far the largest source file in the app. It
|
||||
// only ever appears on the top page, so keep it out of the entry chunk.
|
||||
const NewArticleAlert = lazy(() => import('../custom/blocks/NewArticleAlert'));
|
||||
|
||||
import Welcome from '../custom/blocks/Welcome';
|
||||
import Rankings from '../database/blocks/Rankings';
|
||||
import RecentContents from '../database/blocks/RecentContents';
|
||||
import DatabaseTop from '../database/DatabaseTop';
|
||||
import Functions from '../functions';
|
||||
import Footer from './Footer';
|
||||
import MainContent from './MainContent';
|
||||
import Welcome from '../custom/blocks/Welcome';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -21,7 +26,7 @@ const CenterBlocks = (props: Props) => {
|
||||
return (
|
||||
<div className="block">
|
||||
<div className="centerCcolumn">
|
||||
<div className="block">
|
||||
<div className="block">
|
||||
<div className="blockTitle">Welcome to Cerebellar Platform</div>
|
||||
<div className="blockContent">
|
||||
<Welcome lang={lang} />
|
||||
@@ -30,23 +35,27 @@ const CenterBlocks = (props: Props) => {
|
||||
<div className="block">
|
||||
<div className="blockTitle">Cerebration of Dr. Ito's New Book</div>
|
||||
<div className="blockContent">
|
||||
<CerebrationOfDrItosNewBook lang={lang} />
|
||||
<CerebrationOfDrItosNewBook />
|
||||
</div>
|
||||
</div>
|
||||
<div className="block">
|
||||
<div className="blockTitle">Cerebellar Platfrom Committee</div>
|
||||
<div className="blockContent">
|
||||
<CerebellarPlatformCommittee lang={lang} />
|
||||
<CerebellarPlatformCommittee />
|
||||
</div>
|
||||
</div>
|
||||
<div className="block">
|
||||
<div className="blockTitle">New article alert</div>
|
||||
<div className="blockContent">
|
||||
<NewArticleAlert lang={lang} />
|
||||
<Suspense fallback={<Loading />}>
|
||||
<NewArticleAlert />
|
||||
</Suspense>
|
||||
</div>
|
||||
</div>
|
||||
<div className="block">
|
||||
<div className="blockTitle">{Functions.mlang('[en]Item Types[/en][ja]アイテムタイプ一覧[/ja]', lang)}</div>
|
||||
<div className="blockTitle">
|
||||
{Functions.mlang('[en]Item Types[/en][ja]アイテムタイプ一覧[/ja]', lang)}
|
||||
</div>
|
||||
<div className="blockContent">
|
||||
<DatabaseTop lang={lang} />
|
||||
</div>
|
||||
@@ -63,32 +72,32 @@ const CenterBlocks = (props: Props) => {
|
||||
</div>
|
||||
<div className="centerRcolumn">
|
||||
<div className="block">
|
||||
<div className="blockTitle">{Functions.mlang('[en]Recent Contents[/en][ja]新着コンテンツ[/ja]', lang)}</div>
|
||||
<div className="blockTitle">
|
||||
{Functions.mlang('[en]Recent Contents[/en][ja]新着コンテンツ[/ja]', lang)}
|
||||
</div>
|
||||
<div className="blockContent">
|
||||
<RecentContents lang={lang} />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const CenterColumn = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const { pathname } = useLocation();
|
||||
|
||||
return (
|
||||
<div className="centercolumn">
|
||||
<Switch>
|
||||
<Route exact path="/" render={() => <CenterBlocks lang={lang} />} />
|
||||
</Switch>
|
||||
{pathname === '/' && <CenterBlocks lang={lang} />}
|
||||
<div className="block">
|
||||
<MainContent lang={lang} />
|
||||
</div>
|
||||
<div className="block">
|
||||
<div id="page_top">
|
||||
<a href="#header" onClick={(e) => { e.preventDefault(); window.scrollTo(0, 0); }}>
|
||||
<a href="#header">
|
||||
<span className="hidden">Go Page Top</span>
|
||||
</a>
|
||||
</div>
|
||||
@@ -96,6 +105,6 @@ const CenterColumn = (props: Props) => {
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default CenterColumn;
|
||||
export default CenterColumn;
|
||||
|
||||
+21
-7
@@ -1,8 +1,7 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import bannerCBS from './assets/theme/images/banner-riken-cbs.png';
|
||||
import bannerRIKEN from './assets/theme/images/banner-riken.png';
|
||||
import bannerCBS from './assets/theme/images/banner-riken-cbs.png';
|
||||
import bannerXooNIps from './assets/theme/images/banner-xoonips.png';
|
||||
import LinkImage from './lib/LinkImage';
|
||||
|
||||
@@ -15,13 +14,28 @@ const Footer = (props: Props) => {
|
||||
return (
|
||||
<footer id="footer">
|
||||
<div className="links">
|
||||
<LinkImage image={bannerRIKEN} title={Functions.mlang('[en]RIKEN[/en][ja]理化学研究所[/ja]', lang)} url={'http://www.riken.jp/'} />
|
||||
<LinkImage image={bannerCBS} title={Functions.mlang('[en]RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター[/ja]', lang)} url={'https://cbs.riken.jp/'} />
|
||||
<LinkImage image={bannerXooNIps} title={Functions.mlang('[en]The XooNIps Project[/en][ja]XooNIps 公式サイト[/ja]', lang)} url={'https://xoonips.osdn.jp/'} />
|
||||
<LinkImage
|
||||
image={bannerRIKEN}
|
||||
title={Functions.mlang('[en]RIKEN[/en][ja]理化学研究所[/ja]', lang)}
|
||||
url={'http://www.riken.jp/'}
|
||||
/>
|
||||
<LinkImage
|
||||
image={bannerCBS}
|
||||
title={Functions.mlang(
|
||||
'[en]RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター[/ja]',
|
||||
lang
|
||||
)}
|
||||
url={'https://cbs.riken.jp/'}
|
||||
/>
|
||||
<LinkImage
|
||||
image={bannerXooNIps}
|
||||
title={Functions.mlang('[en]The XooNIps Project[/en][ja]XooNIps 公式サイト[/ja]', lang)}
|
||||
url={'https://xoonips.osdn.jp/'}
|
||||
/>
|
||||
</div>
|
||||
<div className="copyright">Copyright (C) 2018 Neuroinformatics Unit, RIKEN Center for Brain Science</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Footer;
|
||||
|
||||
+49
-54
@@ -1,69 +1,64 @@
|
||||
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, useState } from 'react';
|
||||
import { Link, useNavigate } from 'react-router';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import ItemUtil from '../database/lib/ItemUtil';
|
||||
import Functions from '../functions';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
interface State {
|
||||
keyword: string;
|
||||
}
|
||||
const Header = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const navigate = useNavigate();
|
||||
const [keyword, setKeyword] = useState('');
|
||||
|
||||
class Header extends Component<Props, State> {
|
||||
const handleChangeKeyword = (event: ChangeEvent<HTMLInputElement>) => {
|
||||
setKeyword(event.target.value);
|
||||
};
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
this.handleChangeKeyword = this.handleChangeKeyword.bind(this);
|
||||
this.handleSubmit = this.handleSubmit.bind(this);
|
||||
this.state = { keyword: '' };
|
||||
}
|
||||
|
||||
handleChangeKeyword(event: ChangeEvent<HTMLInputElement>) {
|
||||
const keyword = event.target.value;
|
||||
this.setState({ keyword });
|
||||
}
|
||||
|
||||
handleSubmit(event: FormEvent<HTMLFormElement>) {
|
||||
const handleSubmit = (event: FormEvent<HTMLFormElement>) => {
|
||||
event.preventDefault();
|
||||
const keyword = this.state.keyword.trim();
|
||||
if (keyword !== '') {
|
||||
const url = ItemUtil.getSearchByKeywordUrl('all', this.state.keyword);
|
||||
this.props.history.push(url);
|
||||
if (keyword.trim() !== '') {
|
||||
void navigate(ItemUtil.getSearchByKeywordUrl('all', keyword));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const title = Functions.mlang(Config.SITE_TITLE, lang);
|
||||
return (
|
||||
<div id="header">
|
||||
<div className="r_back">
|
||||
<div className="logo">
|
||||
<Link to="/" title={title} className="go_home"><span className="hidden">{title}</span></Link>
|
||||
<a className="go_jnode" href="https://www.neuroinf.jp/" title="INCF Japan Node Portal Site" target="_blank" rel="noopener noreferrer">
|
||||
<span className="hidden">INCF Japan Node Portal Site</span>
|
||||
</a>
|
||||
<div className="search_box">
|
||||
<form onSubmit={this.handleSubmit}>
|
||||
<input type="text" value={this.state.keyword} onChange={this.handleChangeKeyword} />
|
||||
|
||||
<input className="formButton" type="submit" value="Search" />
|
||||
|
||||
<Link to="/database/advanced">{Functions.mlang('[en]Advanced[/en][ja]詳細検索[/ja]', lang)}</Link>
|
||||
</form>
|
||||
</div>
|
||||
<div className="sub">
|
||||
<div className="menu">
|
||||
</div>
|
||||
</div>
|
||||
const title = Functions.mlang(Config.SITE_TITLE, lang);
|
||||
return (
|
||||
<div id="header">
|
||||
<div className="r_back">
|
||||
<div className="logo">
|
||||
<Link to="/" title={title} className="go_home">
|
||||
<span className="hidden">{title}</span>
|
||||
</Link>
|
||||
<a
|
||||
className="go_jnode"
|
||||
href="https://www.neuroinf.jp/"
|
||||
title="INCF Japan Node Portal Site"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<span className="hidden">INCF Japan Node Portal Site</span>
|
||||
</a>
|
||||
<div className="search_box">
|
||||
<form onSubmit={handleSubmit}>
|
||||
<input type="text" value={keyword} onChange={handleChangeKeyword} />
|
||||
|
||||
<input className="formButton" type="submit" value="Search" />
|
||||
|
||||
<Link to="/database/advanced">
|
||||
{Functions.mlang('[en]Advanced[/en][ja]詳細検索[/ja]', lang)}
|
||||
</Link>
|
||||
</form>
|
||||
</div>
|
||||
<div className="sub">
|
||||
<div className="menu" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default withRouter(Header);
|
||||
export default Header;
|
||||
|
||||
@@ -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 Functions from '../functions';
|
||||
@@ -46,6 +45,6 @@ const LeftColumn = (props: Props) => {
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default LeftColumn;
|
||||
|
||||
+31
-24
@@ -1,6 +1,5 @@
|
||||
import React from 'react';
|
||||
import { Route, Switch } from 'react-router-dom';
|
||||
import Config, { MultiLang } from '../config';
|
||||
import { Route, Routes } from 'react-router';
|
||||
import Config, { type MultiLang } from '../config';
|
||||
import Credits from '../credits/Credits';
|
||||
import CreditsXoopsPathRedirect from '../credits/CreditsXoopsPathRedirect';
|
||||
import D3Forum from '../d3forum/D3Forum';
|
||||
@@ -19,27 +18,35 @@ const MainContent = (props: Props) => {
|
||||
const { lang } = props;
|
||||
return (
|
||||
<div className="mainContent">
|
||||
<Switch>
|
||||
<Route path="/database" render={() => <Database {...props} />} />
|
||||
<Route path="/credits" render={() => <Credits lang={lang} />} />
|
||||
{Config.PICO_MODULES.map((name) =>
|
||||
<Route key={name} path={'/' + name} render={() => <Pico lang={lang} name={name} />} />
|
||||
)}
|
||||
{Config.D3FORUM_MODULES.map((name) =>
|
||||
<Route key={name} path={'/' + name} render={() => <D3Forum 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} />} />
|
||||
)}
|
||||
{Config.D3FORUM_MODULES.map((name) =>
|
||||
<Route key={name} path={'/modules/' + name} render={() => <D3ForumXoopsPathRedirect lang={lang} name={name} />} />
|
||||
)}
|
||||
<Route component={XoopsPathRedirect} />
|
||||
</Switch>
|
||||
<Routes>
|
||||
<Route path="/database/*" element={<Database lang={lang} />} />
|
||||
<Route path="/credits/*" element={<Credits lang={lang} />} />
|
||||
{Config.PICO_MODULES.map((name) => (
|
||||
<Route key={name} path={`/${name}/*`} element={<Pico lang={lang} name={name} />} />
|
||||
))}
|
||||
{Config.D3FORUM_MODULES.map((name) => (
|
||||
<Route key={name} path={`/${name}/*`} element={<D3Forum 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} />}
|
||||
/>
|
||||
))}
|
||||
{Config.D3FORUM_MODULES.map((name) => (
|
||||
<Route
|
||||
key={name}
|
||||
path={`/modules/${name}/*`}
|
||||
element={<D3ForumXoopsPathRedirect lang={lang} name={name} />}
|
||||
/>
|
||||
))}
|
||||
<Route path="*" element={<XoopsPathRedirect lang={lang} />} />
|
||||
</Routes>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default MainContent;
|
||||
export default MainContent;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -177,8 +177,11 @@ form {
|
||||
border: 1px solid #eeeeee;
|
||||
border-style: inset;
|
||||
padding: 2px;
|
||||
width: 170px;
|
||||
height: 16px;
|
||||
/* sanitize.css leaves form fields transparent, which vanishes on the header image */
|
||||
background-color: #ffffff;
|
||||
/* border-box: 170 + 2px padding + 1px border per side, likewise 16 high */
|
||||
width: 176px;
|
||||
height: 22px;
|
||||
}
|
||||
#header .search_box a {
|
||||
font-size: 10px;
|
||||
@@ -188,7 +191,8 @@ form {
|
||||
#header .sub {
|
||||
font-size: 10px;
|
||||
display: block;
|
||||
height: 27px;
|
||||
/* border-box: 27 plus the 5px of top padding */
|
||||
height: 32px;
|
||||
padding: 5px 20px 0 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
@@ -326,7 +330,8 @@ form {
|
||||
.centerRcolumn .blockTitle {
|
||||
clear: both;
|
||||
color: #6075aa;
|
||||
width: 100%;
|
||||
/* border-box: 100% plus the 26px of left padding */
|
||||
width: calc(100% + 26px);
|
||||
margin: 8px 0 3px;
|
||||
padding: 3px 0px 4px 26px;
|
||||
font: bold 120% / normal "Trebuchet MS", "Lucida Grande", Verdana, Arial, "Hiragino Kaku Gothic Pro", osaka, sans-serif;
|
||||
@@ -372,7 +377,8 @@ form {
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
padding: 18px;
|
||||
width: 100%;
|
||||
/* border-box: 100% plus the 18px of padding on each side */
|
||||
width: calc(100% + 36px);
|
||||
background: #cfd5e9 url(images/block_title1.gif) repeat-x left center;
|
||||
}
|
||||
.leftcolumn .blockContent {
|
||||
@@ -391,7 +397,8 @@ form {
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
padding: 18px;
|
||||
width: 100%;
|
||||
/* border-box: 100% plus the 18px of padding on each side */
|
||||
width: calc(100% + 36px);
|
||||
background: #cfd5e9 url(images/block_title2.gif) repeat-x left center;
|
||||
}
|
||||
.rightcolumn .blockContent {
|
||||
@@ -609,3 +616,11 @@ div.xoopsQuote {
|
||||
padding: 5px 0 5px 28px;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
/* sanitize.css forms.css leaves form controls transparent; keep the search
|
||||
and language blocks on white. */
|
||||
.leftcolumn .blockContent input[type="text"],
|
||||
.leftcolumn .blockContent select {
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
+62
-17
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import mainMenus from '../assets/main-menu.json';
|
||||
import { MultiLang } from '../../config.js';
|
||||
import { Link } from 'react-router';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import mainMenus from '../assets/main-menu.json';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -12,14 +11,16 @@ const MainMenu = (props: Props) => {
|
||||
const { lang } = props;
|
||||
const links = mainMenus.map((item, idx) => {
|
||||
const title = Functions.mlang(item.title, lang);
|
||||
const style = idx === 0 ? "menuTop" : "menuMain";
|
||||
return <li key={idx}><Link className={style} to={item.link}>{title}</Link></li>
|
||||
const style = idx === 0 ? 'menuTop' : 'menuMain';
|
||||
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 MainMenu;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+9
-2
@@ -1,10 +1,16 @@
|
||||
const SITE_TITLE = '[en]Cerebellar Platform[/en][ja]小脳プラットフォーム[/ja]';
|
||||
const SITE_SLOGAN = 'Official Site';
|
||||
const GOOGLE_ANALYTICS_TRACKING_ID = 'UA-2787349-1';
|
||||
// Replaces the Universal Analytics property (UA-2787349-1), shut down in 2023.
|
||||
const GOOGLE_ANALYTICS_TRACKING_ID = 'G-K94TTGLC6K';
|
||||
const XOONIPS_ITEMTYPES = ['data', 'model', 'paper', 'book', 'tool', 'url', 'memo', 'binder'];
|
||||
const D3FORUM_MODULES = ['forum'];
|
||||
const PICO_MODULES = ['documents'];
|
||||
|
||||
// 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 = {
|
||||
@@ -14,6 +20,7 @@ const Config = {
|
||||
XOONIPS_ITEMTYPES,
|
||||
D3FORUM_MODULES,
|
||||
PICO_MODULES,
|
||||
}
|
||||
BASE_URL,
|
||||
};
|
||||
|
||||
export default Config;
|
||||
|
||||
+12
-11
@@ -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;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -1,25 +1,33 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
const CerebellarPlatformCommittee = (props: Props) => {
|
||||
const CerebellarPlatformCommittee = () => {
|
||||
return (
|
||||
<>
|
||||
<h3>Members:</h3>
|
||||
<p>
|
||||
<b>Shinji Kakei</b>: Motor Disorders Project, Tokyo Metropolitan Institute for Neuroscience<br />
|
||||
<b>Yutaka Hirata</b>: Dept. of Computer Science, College of Engineering, Chubu University<br />
|
||||
<a href="http://neuralgorithm.org" target="_blank" rel="noopener noreferrer"><b>Tadashi Yamazaki</b></a>: The University of Electro-Communications<br />
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/profile/76/" target="_blank" rel="noopener noreferrer"><b>Soichi Nagao</b></a>: Laboratory for Integrative Brain Functions, Nozomi Hospital<br />
|
||||
<b>Shiro Usui</b>: Toyohashi University of Technology<br />
|
||||
<b>Yoko Yamaguchi</b>: Neuroinformatics Unit, RIKEN CBS<br />
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/profile/57/" target="_blank" rel="noopener noreferrer"><b>Takeru Honda</b></a>: Motor Disorders Project, Tokyo Metropolitan Institute for Neuroscience
|
||||
</p>
|
||||
<b>Shinji Kakei</b>: Motor Disorders Project, Tokyo Metropolitan Institute for Neuroscience
|
||||
<br />
|
||||
<b>Yutaka Hirata</b>: Dept. of Computer Science, College of Engineering, Chubu University
|
||||
<br />
|
||||
<a href="http://neuralgorithm.org" target="_blank" rel="noopener noreferrer">
|
||||
<b>Tadashi Yamazaki</b>
|
||||
</a>
|
||||
: The University of Electro-Communications
|
||||
<br />
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/profile/76/" target="_blank" rel="noopener noreferrer">
|
||||
<b>Soichi Nagao</b>
|
||||
</a>
|
||||
: Laboratory for Integrative Brain Functions, Nozomi Hospital
|
||||
<br />
|
||||
<b>Shiro Usui</b>: Toyohashi University of Technology
|
||||
<br />
|
||||
<b>Yoko Yamaguchi</b>: Neuroinformatics Unit, RIKEN CBS
|
||||
<br />
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/profile/57/" target="_blank" rel="noopener noreferrer">
|
||||
<b>Takeru Honda</b>
|
||||
</a>
|
||||
: Motor Disorders Project, Tokyo Metropolitan Institute for Neuroscience
|
||||
</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default CerebellarPlatformCommittee;
|
||||
|
||||
@@ -1,21 +1,15 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../config';
|
||||
import imageBookCover from '../assets/images/book-cover.jpg';
|
||||
import imageBookToc from '../assets/images/book-toc.jpg';
|
||||
import imageGroupPhoto from '../assets/images/group-photo.jpg';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
}
|
||||
|
||||
const CerebrationOfDrItosNewBook = (props: Props) => {
|
||||
const CerebrationOfDrItosNewBook = () => {
|
||||
return (
|
||||
<p style={{ textAlign: "center" }}>
|
||||
<p style={{ textAlign: 'center' }}>
|
||||
<img src={imageBookCover} alt="" width="222" height="300" />
|
||||
<img src={imageBookToc} alt="" width="252" height="300" />
|
||||
<img src={imageGroupPhoto} alt="" width="480" height="229" />
|
||||
</p>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default CerebrationOfDrItosNewBook;
|
||||
|
||||
+9911
-4180
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,6 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Link } from 'react-router';
|
||||
import NoticeSiteHasBeenArchived from '../../common/lib/NoticeSiteHasBeenArchived';
|
||||
import { MultiLang } from '../../config';
|
||||
import type { MultiLang } from '../../config';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -13,20 +12,27 @@ const Welcome = (props: Props) => {
|
||||
<>
|
||||
<NoticeSiteHasBeenArchived lang={lang} />
|
||||
<p>
|
||||
Cerebellar Platform is a digital research archive for cerebellar research.
|
||||
Available resources include mini-reviews of contemporary cerebellar research, list of papers and mathematical models for cerebellar operation.
|
||||
If you need more information about this website, please click <Link to="/credits/1">HERE</Link>.
|
||||
You will find a 'Privacy Policy' and some instructions for use.
|
||||
This database was supported by Grant-in-Aid for Publication of Scientific Research Results from Japan Society for the Promotion of Science (2007).
|
||||
Cerebellar Platform is a digital research archive for cerebellar research. Available resources include
|
||||
mini-reviews of contemporary cerebellar research, list of papers and mathematical models for cerebellar
|
||||
operation. If you need more information about this website, please click{' '}
|
||||
<Link to="/credits/1">HERE</Link>. You will find a 'Privacy Policy' and some instructions for use. This
|
||||
database was supported by Grant-in-Aid for Publication of Scientific Research Results from Japan Society
|
||||
for the Promotion of Science (2007).
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/" target="_blank" rel="noopener noreferrer">New "Cerebellar Platform"</a> provides utilities (SNS and a cloud system) for anyone who is interested in the cerebellum.
|
||||
It provides you focused and up-to-date information related to the cerebellum easily and quickly.
|
||||
It also features a communication field like FaceBook, which is designed to accelerate interaction between cerebellar researchers.
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/" target="_blank" rel="noopener noreferrer">Please click HERE!</a>
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/" target="_blank" rel="noopener noreferrer">
|
||||
New "Cerebellar Platform"
|
||||
</a>{' '}
|
||||
provides utilities (SNS and a cloud system) for anyone who is interested in the cerebellum. It provides
|
||||
you focused and up-to-date information related to the cerebellum easily and quickly. It also features a
|
||||
communication field like FaceBook, which is designed to accelerate interaction between cerebellar
|
||||
researchers.
|
||||
<a href="https://pf.cerebellum.neuroinf.jp/" target="_blank" rel="noopener noreferrer">
|
||||
Please click HERE!
|
||||
</a>
|
||||
</p>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Welcome;
|
||||
export default Welcome;
|
||||
|
||||
+16
-15
@@ -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 './assets/d3forum_common.css';
|
||||
import './assets/d3forum_main.css';
|
||||
@@ -23,18 +22,20 @@ const D3Forum = (props: Props) => {
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>{D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}</title>
|
||||
<title>
|
||||
{D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<Switch>
|
||||
<Route exact path={'/' + name} render={() => <D3ForumTop {...props} />} />
|
||||
<Route exact path={'/' + name + '/category/:id'} render={(props: RouteComponentProps<{ id?: string }>) => <D3ForumCategory lang={lang} name={name} {...props} />} />
|
||||
<Route exact path={'/' + name + '/forum/:id'} render={(props: RouteComponentProps<{ id?: string }>) => <D3ForumForum lang={lang} name={name} {...props} />} />
|
||||
<Route exact path={'/' + name + '/topic/:id'} render={(props: RouteComponentProps<{ id?: string }>) => <D3ForumTopic lang={lang} name={name} {...props} />} />
|
||||
<Route exact path={'/' + name + '/post/:id'} render={(props: RouteComponentProps<{ id?: string }>) => <D3ForumPost lang={lang} name={name} {...props} />} />
|
||||
<Route component={PageNotFound} />
|
||||
</Switch>
|
||||
<Routes>
|
||||
<Route path="/" element={<D3ForumTop lang={lang} name={name} />} />
|
||||
<Route path="category/:id" element={<D3ForumCategory lang={lang} name={name} />} />
|
||||
<Route path="forum/:id" element={<D3ForumForum lang={lang} name={name} />} />
|
||||
<Route path="topic/:id" element={<D3ForumTopic lang={lang} name={name} />} />
|
||||
<Route path="post/:id" element={<D3ForumPost lang={lang} name={name} />} />
|
||||
<Route path="*" element={<PageNotFound lang={lang} />} />
|
||||
</Routes>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default D3Forum;
|
||||
export default D3Forum;
|
||||
|
||||
@@ -1,23 +1,18 @@
|
||||
import moment from 'moment';
|
||||
import React 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 { format } from 'date-fns';
|
||||
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 imageCategory0 from './assets/images/category_0.gif';
|
||||
import imageCategory1 from './assets/images/category_1.gif';
|
||||
import imageForum0 from './assets/images/forum_0.gif';
|
||||
import imageForum1 from './assets/images/forum_1.gif';
|
||||
import CategoryJump from './lib/CategoryJump';
|
||||
import D3ForumUtils, { D3ForumCategoryData, D3ForumForumData } from './lib/D3ForumUtils';
|
||||
import D3ForumUtils, { type D3ForumCategoryData, type D3ForumForumData } from './lib/D3ForumUtils';
|
||||
import PostIcon from './lib/PostIcon';
|
||||
|
||||
interface Params {
|
||||
id?: string;
|
||||
}
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
}
|
||||
@@ -38,12 +33,21 @@ const D3ForumCategorySubCategory = (props: D3ForumCategoryProps) => {
|
||||
const title = Functions.mlang(category.cat_title, lang);
|
||||
const url = D3ForumUtils.getCategoryUrl(name, category.cat_id);
|
||||
const image = category.cat_posts_count === 0 ? imageCategory0 : imageCategory1;
|
||||
const latest = category.cat_last_post_time === 0 ? '' : ', ' + LABEL_LATEST_POST + ': ' + moment(new Date(category.cat_last_post_time * 1000)).format('Y/M/D H:m');
|
||||
const latest =
|
||||
category.cat_last_post_time === 0
|
||||
? ''
|
||||
: ', ' +
|
||||
LABEL_LATEST_POST +
|
||||
': ' +
|
||||
format(new Date(category.cat_last_post_time * 1000), 'yyyy/M/d H:m');
|
||||
return (
|
||||
<li key={category.cat_id}>
|
||||
<Link to={url} title={title}><img src={image} alt={title} width="16" height="16" /> {title}</Link>
|
||||
|
||||
({LABEL_TOTAL_TOPICS}: {category.cat_topics_count}, {LABEL_TOTAL_POSTS}: {category.cat_posts_count}{latest})
|
||||
<Link to={url} title={title}>
|
||||
<img src={image} alt={title} width="16" height="16" /> {title}
|
||||
</Link>
|
||||
({LABEL_TOTAL_TOPICS}: {category.cat_topics_count}, {LABEL_TOTAL_POSTS}:{' '}
|
||||
{category.cat_posts_count}
|
||||
{latest})
|
||||
</li>
|
||||
);
|
||||
});
|
||||
@@ -53,12 +57,10 @@ const D3ForumCategorySubCategory = (props: D3ForumCategoryProps) => {
|
||||
return (
|
||||
<>
|
||||
<h2 className="head">{LABEL_HEADER_TITLE}</h2>
|
||||
<ul className="d3f_subcategories">
|
||||
{subCategories}
|
||||
</ul>
|
||||
<ul className="d3f_subcategories">{subCategories}</ul>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const D3ForumCategoryForum = (props: D3ForumCategoryProps) => {
|
||||
const { lang, name, catId } = props;
|
||||
@@ -83,7 +85,8 @@ const D3ForumCategoryForum = (props: D3ForumCategoryProps) => {
|
||||
const subject = Functions.mlang(post.subject, lang);
|
||||
return (
|
||||
<>
|
||||
{moment(new Date(post.post_time * 1000)).format('Y/M/D H:m')}<br />
|
||||
{format(new Date(post.post_time * 1000), 'yyyy/M/d H:m')}
|
||||
<br />
|
||||
{post.uid_uname}
|
||||
|
||||
<Link to={D3ForumUtils.getPostUrl(name, post.post_id)}>
|
||||
@@ -94,18 +97,20 @@ const D3ForumCategoryForum = (props: D3ForumCategoryProps) => {
|
||||
};
|
||||
return (
|
||||
<tr key={forum.forum_id} className={evenodd}>
|
||||
<td className="d3f_mainicon"><img src={image} alt={title} /></td>
|
||||
<td className="d3f_mainicon">
|
||||
<img src={image} alt={title} />
|
||||
</td>
|
||||
<td>
|
||||
<dl>
|
||||
<dt><Link to={url}>{title}</Link></dt>
|
||||
<dt>
|
||||
<Link to={url}>{title}</Link>
|
||||
</dt>
|
||||
<dd>{desc}</dd>
|
||||
</dl>
|
||||
</td>
|
||||
<td>{forum.forum_topics_count}</td>
|
||||
<td>{forum.forum_posts_count}</td>
|
||||
<td className="d3f_posters">
|
||||
{getPoster(forum.forum_last_post_id)}
|
||||
</td>
|
||||
<td className="d3f_posters">{getPoster(forum.forum_last_post_id)}</td>
|
||||
</tr>
|
||||
);
|
||||
});
|
||||
@@ -124,25 +129,27 @@ const D3ForumCategoryForum = (props: D3ForumCategoryProps) => {
|
||||
<th>{LABEL_LATEST_POST}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{forums}
|
||||
</tbody>
|
||||
<tbody>{forums}</tbody>
|
||||
</table>
|
||||
<div className="d3f_iconexps">
|
||||
<ul className="d3f_iconexp">
|
||||
<li><img src={imageForum1} alt="" width="18" height="18" /> = {LABEL_NEW_POSTS}</li>
|
||||
<li>
|
||||
<img src={imageForum1} alt="" width="18" height="18" /> = {LABEL_NEW_POSTS}
|
||||
</li>
|
||||
</ul>
|
||||
<ul className="d3f_iconexp">
|
||||
<li><img src={imageForum0} alt="" width="18" height="18" /> = {LABEL_NO_NEW_POSTS}</li>
|
||||
<li>
|
||||
<img src={imageForum0} alt="" width="18" height="18" /> = {LABEL_NO_NEW_POSTS}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const D3ForumCategory = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
const params = props.match.params;
|
||||
const params = useParams<{ id?: string }>();
|
||||
if (typeof params.id === 'undefined') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
@@ -155,7 +162,9 @@ const D3ForumCategory = (props: Props) => {
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}</title>
|
||||
<title>
|
||||
{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<Link to={D3ForumUtils.getIndexUrl(name)}>{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}</Link>
|
||||
@@ -166,6 +175,6 @@ const D3ForumCategory = (props: Props) => {
|
||||
<CategoryJump lang={lang} name={name} catId={catId} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default D3ForumCategory;
|
||||
export default D3ForumCategory;
|
||||
|
||||
+155
-109
@@ -1,10 +1,9 @@
|
||||
import moment from 'moment';
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import { format } from 'date-fns';
|
||||
import { useParams } from 'react-router';
|
||||
import HashLink from '../common/lib/HashLink';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import imageTopic01 from './assets/images/topic_01.gif';
|
||||
import imageTopic10 from './assets/images/topic_10.gif';
|
||||
@@ -14,114 +13,161 @@ import imageTopicStatusLocked1 from './assets/images/topic_status_locked1.gif';
|
||||
import imageTopicStatusMarked1 from './assets/images/topic_status_marked1.gif';
|
||||
import imageTopicStatusSolved0 from './assets/images/topic_status_solved0.gif';
|
||||
import imageTopicSticky0 from './assets/images/topic_sticky0.gif';
|
||||
import D3ForumUtils, { type D3ForumPostData, D3ForumPostSortOrder, type D3ForumTopicData } from './lib/D3ForumUtils';
|
||||
import ForumJump from './lib/ForumJump';
|
||||
import D3ForumUtils, { D3ForumPostData, D3ForumPostSortOrder, D3ForumTopicData } from './lib/D3ForumUtils';
|
||||
import PostIcon from './lib/PostIcon';
|
||||
|
||||
interface Params {
|
||||
id?: string;
|
||||
}
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
}
|
||||
|
||||
const D3ForumForum = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
const params = props.match.params;
|
||||
if (typeof params.id === 'undefined') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const forumId = parseInt(params.id, 10);
|
||||
const forum = D3ForumUtils.getForum(name, forumId);
|
||||
if (forum === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const category = D3ForumUtils.getCategory(name, forum.cat_id);
|
||||
if (category === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const topics = D3ForumUtils.getTopics(name, forum.forum_id);
|
||||
const title = Functions.mlang(forum.forum_title, lang);
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<HashLink to={D3ForumUtils.getIndexUrl(name)}>{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}</HashLink>
|
||||
>
|
||||
<HashLink to={D3ForumUtils.getCategoryUrl(name, category.cat_id)}>{Functions.mlang(category.cat_title, lang)}</HashLink>
|
||||
</div>
|
||||
<h1 className="d3f_title">{title}</h1>
|
||||
<p className="d3f_welcome">{Functions.mlang(forum.forum_desc, lang)}</p>
|
||||
<table className="outer d3f_table">
|
||||
<thead>
|
||||
<tr className="head">
|
||||
<th colSpan={2}>{Functions.mlang(`[en]hits ${topics.length} items[/en][ja]${topics.length}件ヒットしました[/ja]`, lang)}</th>
|
||||
<th>{Functions.mlang('[en]Reply[/en][ja]返信[/ja]', lang)}</th>
|
||||
<th>{Functions.mlang('[en]First post[/en][ja]トピック開始[/ja]', lang)}</th>
|
||||
<th>{Functions.mlang('[en]Latest post[/en][ja]最新投稿[/ja]', lang)}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{topics.map((topic: D3ForumTopicData, idx: number) => {
|
||||
const postStart = D3ForumUtils.getPost(name, topic.topic_first_post_id);
|
||||
const postLast = D3ForumUtils.getPost(name, topic.topic_last_post_id);
|
||||
if (postStart === null || postLast === null) {
|
||||
return null;
|
||||
}
|
||||
const postTitleStart = Functions.mlang(postStart.subject, lang);
|
||||
const imageTopic = topic.topic_invisible !== 0 ? imageTopicInvisible : topic.topic_sticky !== 0 ? imageTopicSticky0 : imageTopic10;
|
||||
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
|
||||
const poster = (post: D3ForumPostData) => {
|
||||
const title = Functions.mlang(post.subject, lang);
|
||||
return (
|
||||
<>
|
||||
{moment(new Date(post.post_time * 1000)).format('YYYY/M/D')}<br />
|
||||
{post.uid_uname} <HashLink to={D3ForumUtils.getPostUrl(name, post.post_id)}><PostIcon lang={lang} post={post} title={title} /></HashLink>
|
||||
</>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<tr key={topic.topic_id} className={evenodd}>
|
||||
<td className="d3f_mainicon">
|
||||
<img src={imageTopic} alt="" />
|
||||
</td>
|
||||
<td className="d3f_topictitle">
|
||||
{topic.topic_solved === 0 && <img src={imageTopicStatusSolved0} alt="" />}
|
||||
{topic.topic_locked !== 0 && <img src={imageTopicStatusLocked1} alt="" />}
|
||||
<HashLink to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.TREE, postLast.post_id)}>{postTitleStart}</HashLink>
|
||||
</td>
|
||||
<td>{topic.topic_posts_count - 1}</td>
|
||||
<td className="d3f_posters">
|
||||
{poster(postStart)}
|
||||
</td>
|
||||
<td className="d3f_posters">
|
||||
{postStart.post_id !== postLast.post_id && poster(postLast)}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
<div className="d3f_iconexps clearfix">
|
||||
<ul className="d3f_iconexp">
|
||||
<li><img src={imageTopic11} alt="" width="18" height="18" /> = {Functions.mlang('[en]Topic with new posts[/en][ja]新しい投稿があります[/ja]', lang)}</li>
|
||||
<li><img src={imageTopic01} alt="" width="18" height="18" /> = {Functions.mlang('[en]Topic without new posts[/en][ja]新しい投稿はありません[/ja]', lang)}</li>
|
||||
<li><img src={imageTopicInvisible} alt="" width="18" height="18" /> = {Functions.mlang('[en]Invisible topic (Only admins and moderators can read this)[/en][ja]不可視トピック(管理者とモデレータ以外には見えません)[/ja]', lang)}</li>
|
||||
<li><img src={imageTopicSticky0} alt="" width="18" height="18" /> = {Functions.mlang('[en]Sticky topic[/en][ja]特別扱いされたトピック[/ja]', lang)}</li>
|
||||
</ul>
|
||||
<ul className="d3f_iconexp">
|
||||
<li><img src={imageTopicStatusLocked1} alt="" width="18" height="18" /> = {Functions.mlang('[en]Locked topic[/en][ja]ロックされたトピック[/ja]', lang)}</li>
|
||||
<li><img src={imageTopicStatusSolved0} alt="" width="18" height="18" /> = {Functions.mlang('[en]Unsolved topic[/en][ja]未解決トピック[/ja]', lang)}</li>
|
||||
<li><img src={imageTopicStatusMarked1} alt="" width="18" height="18" /> = {Functions.mlang('[en]Marked[/en][ja]未解決トピック[/ja]', lang)}</li>
|
||||
</ul>
|
||||
</div>
|
||||
<ForumJump lang={lang} name={name} forumId={forum.forum_id} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
const { lang, name } = props;
|
||||
const params = useParams<{ id?: string }>();
|
||||
if (typeof params.id === 'undefined') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const forumId = parseInt(params.id, 10);
|
||||
const forum = D3ForumUtils.getForum(name, forumId);
|
||||
if (forum === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const category = D3ForumUtils.getCategory(name, forum.cat_id);
|
||||
if (category === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const topics = D3ForumUtils.getTopics(name, forum.forum_id);
|
||||
const title = Functions.mlang(forum.forum_title, lang);
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<HashLink to={D3ForumUtils.getIndexUrl(name)}>
|
||||
{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}
|
||||
</HashLink>
|
||||
>
|
||||
<HashLink to={D3ForumUtils.getCategoryUrl(name, category.cat_id)}>
|
||||
{Functions.mlang(category.cat_title, lang)}
|
||||
</HashLink>
|
||||
</div>
|
||||
<h1 className="d3f_title">{title}</h1>
|
||||
<p className="d3f_welcome">{Functions.mlang(forum.forum_desc, lang)}</p>
|
||||
<table className="outer d3f_table">
|
||||
<thead>
|
||||
<tr className="head">
|
||||
<th colSpan={2}>
|
||||
{Functions.mlang(
|
||||
`[en]hits ${topics.length} items[/en][ja]${topics.length}件ヒットしました[/ja]`,
|
||||
lang
|
||||
)}
|
||||
</th>
|
||||
<th>{Functions.mlang('[en]Reply[/en][ja]返信[/ja]', lang)}</th>
|
||||
<th>{Functions.mlang('[en]First post[/en][ja]トピック開始[/ja]', lang)}</th>
|
||||
<th>{Functions.mlang('[en]Latest post[/en][ja]最新投稿[/ja]', lang)}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{topics.map((topic: D3ForumTopicData, idx: number) => {
|
||||
const postStart = D3ForumUtils.getPost(name, topic.topic_first_post_id);
|
||||
const postLast = D3ForumUtils.getPost(name, topic.topic_last_post_id);
|
||||
if (postStart === null || postLast === null) {
|
||||
return null;
|
||||
}
|
||||
const postTitleStart = Functions.mlang(postStart.subject, lang);
|
||||
const imageTopic =
|
||||
topic.topic_invisible !== 0
|
||||
? imageTopicInvisible
|
||||
: topic.topic_sticky !== 0
|
||||
? imageTopicSticky0
|
||||
: imageTopic10;
|
||||
const evenodd = idx % 2 === 0 ? 'even' : 'odd';
|
||||
const poster = (post: D3ForumPostData) => {
|
||||
const title = Functions.mlang(post.subject, lang);
|
||||
return (
|
||||
<>
|
||||
{format(new Date(post.post_time * 1000), 'yyyy/M/d')}
|
||||
<br />
|
||||
{post.uid_uname}{' '}
|
||||
<HashLink to={D3ForumUtils.getPostUrl(name, post.post_id)}>
|
||||
<PostIcon lang={lang} post={post} title={title} />
|
||||
</HashLink>
|
||||
</>
|
||||
);
|
||||
};
|
||||
return (
|
||||
<tr key={topic.topic_id} className={evenodd}>
|
||||
<td className="d3f_mainicon">
|
||||
<img src={imageTopic} alt="" />
|
||||
</td>
|
||||
<td className="d3f_topictitle">
|
||||
{topic.topic_solved === 0 && <img src={imageTopicStatusSolved0} alt="" />}
|
||||
{topic.topic_locked !== 0 && <img src={imageTopicStatusLocked1} alt="" />}
|
||||
<HashLink
|
||||
to={D3ForumUtils.getTopicUrl(
|
||||
name,
|
||||
topic.topic_id,
|
||||
D3ForumPostSortOrder.TREE,
|
||||
postLast.post_id
|
||||
)}
|
||||
>
|
||||
{postTitleStart}
|
||||
</HashLink>
|
||||
</td>
|
||||
<td>{topic.topic_posts_count - 1}</td>
|
||||
<td className="d3f_posters">{poster(postStart)}</td>
|
||||
<td className="d3f_posters">
|
||||
{postStart.post_id !== postLast.post_id && poster(postLast)}
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
<div className="d3f_iconexps clearfix">
|
||||
<ul className="d3f_iconexp">
|
||||
<li>
|
||||
<img src={imageTopic11} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang('[en]Topic with new posts[/en][ja]新しい投稿があります[/ja]', lang)}
|
||||
</li>
|
||||
<li>
|
||||
<img src={imageTopic01} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang('[en]Topic without new posts[/en][ja]新しい投稿はありません[/ja]', lang)}
|
||||
</li>
|
||||
<li>
|
||||
<img src={imageTopicInvisible} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang(
|
||||
'[en]Invisible topic (Only admins and moderators can read this)[/en][ja]不可視トピック(管理者とモデレータ以外には見えません)[/ja]',
|
||||
lang
|
||||
)}
|
||||
</li>
|
||||
<li>
|
||||
<img src={imageTopicSticky0} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang('[en]Sticky topic[/en][ja]特別扱いされたトピック[/ja]', lang)}
|
||||
</li>
|
||||
</ul>
|
||||
<ul className="d3f_iconexp">
|
||||
<li>
|
||||
<img src={imageTopicStatusLocked1} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang('[en]Locked topic[/en][ja]ロックされたトピック[/ja]', lang)}
|
||||
</li>
|
||||
<li>
|
||||
<img src={imageTopicStatusSolved0} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang('[en]Unsolved topic[/en][ja]未解決トピック[/ja]', lang)}
|
||||
</li>
|
||||
<li>
|
||||
<img src={imageTopicStatusMarked1} alt="" width="18" height="18" /> ={' '}
|
||||
{Functions.mlang('[en]Marked[/en][ja]未解決トピック[/ja]', lang)}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<ForumJump lang={lang} name={name} forumId={forum.forum_id} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default D3ForumForum;
|
||||
|
||||
+80
-69
@@ -1,80 +1,91 @@
|
||||
import React 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 { 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 D3ForumUtils, { D3ForumPostData, D3ForumPostSortOrder } from './lib/D3ForumUtils';
|
||||
import D3ForumUtils, { type D3ForumPostData, D3ForumPostSortOrder } from './lib/D3ForumUtils';
|
||||
import ForumJump from './lib/ForumJump';
|
||||
import Post from './lib/Post';
|
||||
import PostsTree from './lib/PostsTree';
|
||||
|
||||
interface Params {
|
||||
id?: string;
|
||||
}
|
||||
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
}
|
||||
|
||||
const D3ForumPost = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
const params = props.match.params;
|
||||
if (typeof params.id === 'undefined') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const postId = parseInt(params.id, 10);
|
||||
const post = D3ForumUtils.getPost(name, postId);
|
||||
if (post === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const topic = D3ForumUtils.getTopic(name, post.topic_id);
|
||||
if (topic === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const forum = D3ForumUtils.getForum(name, topic.forum_id);
|
||||
if (forum === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const category = D3ForumUtils.getCategory(name, forum.cat_id);
|
||||
if (category === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const posts = D3ForumUtils.getPosts(name, topic.topic_id, D3ForumPostSortOrder.TREE);
|
||||
const idx = posts.findIndex((post: D3ForumPostData) => {
|
||||
return post.post_id === postId;
|
||||
});
|
||||
const prevPostId = idx <= 0 ? 0 : posts[idx - 1].post_id;
|
||||
const nextPostId = (idx + 1) === posts.length ? 0 : posts[idx + 1].post_id;
|
||||
const title = Functions.mlang(post.subject, lang);
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<Link to={D3ForumUtils.getIndexUrl(name)}>{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}</Link>
|
||||
>
|
||||
<Link to={D3ForumUtils.getCategoryUrl(name, category.cat_id)}>{Functions.mlang(category.cat_title, lang)}</Link>
|
||||
>
|
||||
<Link to={D3ForumUtils.getForumUrl(name, forum.forum_id)}>{Functions.mlang(forum.forum_title, lang)}</Link>
|
||||
>
|
||||
<Link to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.TREE, null)}>{Functions.mlang(topic.topic_title, lang)}</Link>
|
||||
</div>
|
||||
<h1 className="d3f_title">{title}</h1>
|
||||
<PostsTree lang={lang} name={name} posts={posts} postId={postId} />
|
||||
<br />
|
||||
<p className="d3f_topicinfo">
|
||||
<Link to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.TREE, null)}>{Functions.mlang('[en]List posts in the topic[/en][ja]このトピックの投稿一覧へ[/ja]', lang)}</Link>
|
||||
</p>
|
||||
<div className="d3f_wrap">
|
||||
<Post lang={lang} name={name} post={post} prevPostId={prevPostId} nextPostId={nextPostId} inTopic={false} />
|
||||
</div>
|
||||
<ForumJump lang={lang} name={name} forumId={forum.forum_id} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
const { lang, name } = props;
|
||||
const params = useParams<{ id?: string }>();
|
||||
if (typeof params.id === 'undefined') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const postId = parseInt(params.id, 10);
|
||||
const post = D3ForumUtils.getPost(name, postId);
|
||||
if (post === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const topic = D3ForumUtils.getTopic(name, post.topic_id);
|
||||
if (topic === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const forum = D3ForumUtils.getForum(name, topic.forum_id);
|
||||
if (forum === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const category = D3ForumUtils.getCategory(name, forum.cat_id);
|
||||
if (category === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const posts = D3ForumUtils.getPosts(name, topic.topic_id, D3ForumPostSortOrder.TREE);
|
||||
const idx = posts.findIndex((post: D3ForumPostData) => {
|
||||
return post.post_id === postId;
|
||||
});
|
||||
const prevPostId = idx <= 0 ? 0 : posts[idx - 1].post_id;
|
||||
const nextPostId = idx + 1 === posts.length ? 0 : posts[idx + 1].post_id;
|
||||
const title = Functions.mlang(post.subject, lang);
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<Link to={D3ForumUtils.getIndexUrl(name)}>{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}</Link>
|
||||
>
|
||||
<Link to={D3ForumUtils.getCategoryUrl(name, category.cat_id)}>
|
||||
{Functions.mlang(category.cat_title, lang)}
|
||||
</Link>
|
||||
>
|
||||
<Link to={D3ForumUtils.getForumUrl(name, forum.forum_id)}>
|
||||
{Functions.mlang(forum.forum_title, lang)}
|
||||
</Link>
|
||||
>
|
||||
<Link to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.TREE, null)}>
|
||||
{Functions.mlang(topic.topic_title, lang)}
|
||||
</Link>
|
||||
</div>
|
||||
<h1 className="d3f_title">{title}</h1>
|
||||
<PostsTree lang={lang} name={name} posts={posts} postId={postId} />
|
||||
<br />
|
||||
<p className="d3f_topicinfo">
|
||||
<Link to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.TREE, null)}>
|
||||
{Functions.mlang('[en]List posts in the topic[/en][ja]このトピックの投稿一覧へ[/ja]', lang)}
|
||||
</Link>
|
||||
</p>
|
||||
<div className="d3f_wrap">
|
||||
<Post
|
||||
lang={lang}
|
||||
name={name}
|
||||
post={post}
|
||||
prevPostId={prevPostId}
|
||||
nextPostId={nextPostId}
|
||||
inTopic={false}
|
||||
/>
|
||||
</div>
|
||||
<ForumJump lang={lang} name={name} forumId={forum.forum_id} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default D3ForumPost;
|
||||
|
||||
+58
-36
@@ -1,16 +1,16 @@
|
||||
import moment from 'moment';
|
||||
import React, { Fragment } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { MultiLang } from '../config';
|
||||
import { format } from 'date-fns';
|
||||
import { Fragment } from 'react';
|
||||
import { Link } from 'react-router';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import XoopsCode from '../common/lib/XoopsCode';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import imageCategory0 from './assets/images/category_0.gif';
|
||||
import imageCategory1 from './assets/images/category_1.gif';
|
||||
import imageForum0 from './assets/images/forum_0.gif';
|
||||
import imageForum1 from './assets/images/forum_1.gif';
|
||||
import D3ForumUtils, { type D3ForumCategoryData, type D3ForumForumData } from './lib/D3ForumUtils';
|
||||
import ForumJump from './lib/ForumJump';
|
||||
import D3ForumUtils, { D3ForumCategoryData, D3ForumForumData } from './lib/D3ForumUtils';
|
||||
import XoopsCode from '../common/lib/XoopsCode';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
|
||||
export interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -35,12 +35,18 @@ const D3ForumTopForum = (props: D3ForumTopForumProps) => {
|
||||
const title = Functions.mlang(forum.forum_title, lang);
|
||||
const url = D3ForumUtils.getForumUrl(name, forum.forum_id);
|
||||
const image = forum.forum_posts_count === 0 ? imageForum0 : imageForum1;
|
||||
const latest = forum.forum_last_post_time === 0 ? '' : ', ' + LABEL_LATEST_POST + ': ' + moment(new Date(forum.forum_last_post_time * 1000)).format('Y/M/D H:m');
|
||||
const latest =
|
||||
forum.forum_last_post_time === 0
|
||||
? ''
|
||||
: `, ${LABEL_LATEST_POST}: ${format(new Date(forum.forum_last_post_time * 1000), 'yyyy/M/d H:m')}`;
|
||||
return (
|
||||
<li key={forum.forum_id}>
|
||||
<Link to={url} title={title}><img src={image} alt={title} width="16" height="16" /> {title}</Link>
|
||||
<Link to={url} title={title}>
|
||||
<img src={image} alt={title} width="16" height="16" /> {title}
|
||||
</Link>
|
||||
|
||||
{LABEL_TOPICS}: {forum.forum_topics_count}, {LABEL_POSTS}: {forum.forum_posts_count}{latest}
|
||||
{LABEL_TOPICS}: {forum.forum_topics_count}, {LABEL_POSTS}: {forum.forum_posts_count}
|
||||
{latest}
|
||||
</li>
|
||||
);
|
||||
});
|
||||
@@ -50,12 +56,10 @@ const D3ForumTopForum = (props: D3ForumTopForumProps) => {
|
||||
return (
|
||||
<>
|
||||
<h3 className="d3f_head_h3">{LABEL_HEADER_TITLE}</h3>
|
||||
<ul className="d3f_listforums">
|
||||
{forums}
|
||||
</ul>
|
||||
<ul className="d3f_listforums">{forums}</ul>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const D3ForumTopSubCategory = (props: D3ForumTopSubCategoryProps) => {
|
||||
const { lang, name, catId } = props;
|
||||
@@ -67,12 +71,21 @@ const D3ForumTopSubCategory = (props: D3ForumTopSubCategoryProps) => {
|
||||
const title = Functions.mlang(category.cat_title, lang);
|
||||
const url = D3ForumUtils.getCategoryUrl(name, category.cat_id);
|
||||
const image = category.cat_posts_count === 0 ? imageCategory0 : imageCategory1;
|
||||
const latest = category.cat_last_post_time === 0 ? '' : ', ' + LABEL_LATEST_POST + ': ' + moment(new Date(category.cat_last_post_time * 1000)).format('Y/M/D H:m');
|
||||
const latest =
|
||||
category.cat_last_post_time === 0
|
||||
? ''
|
||||
: ', ' +
|
||||
LABEL_LATEST_POST +
|
||||
': ' +
|
||||
format(new Date(category.cat_last_post_time * 1000), 'yyyy/M/d H:m');
|
||||
return (
|
||||
<li key={category.cat_id}>
|
||||
<Link to={url} title={title}><img src={image} alt={title} width="16" height="16" /> {title}</Link>
|
||||
|
||||
({LABEL_TOTAL_TOPICS}: {category.cat_topics_count}, {LABEL_TOTAL_POSTS}: {category.cat_posts_count}{latest})
|
||||
<Link to={url} title={title}>
|
||||
<img src={image} alt={title} width="16" height="16" /> {title}
|
||||
</Link>
|
||||
({LABEL_TOTAL_TOPICS}: {category.cat_topics_count}, {LABEL_TOTAL_POSTS}:{' '}
|
||||
{category.cat_posts_count}
|
||||
{latest})
|
||||
</li>
|
||||
);
|
||||
});
|
||||
@@ -82,12 +95,10 @@ const D3ForumTopSubCategory = (props: D3ForumTopSubCategoryProps) => {
|
||||
return (
|
||||
<>
|
||||
<h3 className="d3f_head_h3">{LABEL_HEADER_TITLE}</h3>
|
||||
<ul className="d3f_subcategories">
|
||||
{subCategories}
|
||||
</ul>
|
||||
<ul className="d3f_subcategories">{subCategories}</ul>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const D3ForumTopCategory = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
@@ -98,31 +109,38 @@ const D3ForumTopCategory = (props: Props) => {
|
||||
const title = Functions.mlang(category.cat_title, lang);
|
||||
const image = category.cat_posts_count === 0 ? imageCategory0 : imageCategory1;
|
||||
const url = D3ForumUtils.getCategoryUrl(name, category.cat_id);
|
||||
const latest = category.cat_last_post_time === 0 ? '' : ', ' + LABEL_LATEST_POST + ': ' + moment(new Date(category.cat_last_post_time * 1000)).format('Y/M/D H:m');
|
||||
const latest =
|
||||
category.cat_last_post_time === 0
|
||||
? ''
|
||||
: ', ' +
|
||||
LABEL_LATEST_POST +
|
||||
': ' +
|
||||
format(new Date(category.cat_last_post_time * 1000), 'yyyy/M/d H:m');
|
||||
return (
|
||||
<Fragment key={category.cat_id}>
|
||||
<div className="itemHead">
|
||||
<h2 className="itemTitle">
|
||||
<Link to={url}><img src={image} alt="" width="16" height="16" /> {title}</Link>
|
||||
<Link to={url}>
|
||||
<img src={image} alt="" width="16" height="16" /> {title}
|
||||
</Link>
|
||||
</h2>
|
||||
<p>{LABEL_TOTAL_TOPICS}: {category.cat_topics_count}, {LABEL_TOTAL_POSTS}: {category.cat_posts_count}{latest}</p>
|
||||
<p>
|
||||
{LABEL_TOTAL_TOPICS}: {category.cat_topics_count}, {LABEL_TOTAL_POSTS}:{' '}
|
||||
{category.cat_posts_count}
|
||||
{latest}
|
||||
</p>
|
||||
</div>
|
||||
<D3ForumTopSubCategory lang={lang} name={name} catId={category.cat_id} />
|
||||
<D3ForumTopForum lang={lang} name={name} catId={category.cat_id} />
|
||||
<div className="d3f_info_ctrl">
|
||||
</div>
|
||||
<div className="d3f_info_ctrl"> </div>
|
||||
</Fragment>
|
||||
);
|
||||
});
|
||||
if (categories.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<div className="d3f_wrap">
|
||||
{categories}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return <div className="d3f_wrap">{categories}</div>;
|
||||
};
|
||||
|
||||
const D3ForumTop = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
@@ -146,16 +164,20 @@ const D3ForumTop = (props: Props) => {
|
||||
<D3ForumTopCategory lang={lang} name={name} />
|
||||
<div className="d3f_iconexps clearfix">
|
||||
<ul className="d3f_iconexp">
|
||||
<li><img src={imageForum1} alt="" width="18" height="18" /> = {LABEL_NEW_POSTS}</li>
|
||||
<li>
|
||||
<img src={imageForum1} alt="" width="18" height="18" /> = {LABEL_NEW_POSTS}
|
||||
</li>
|
||||
</ul>
|
||||
<ul className="d3f_iconexp">
|
||||
<li><img src={imageForum0} alt="" width="18" height="18" /> = {LABEL_NO_NEW_POSTS}</li>
|
||||
<li>
|
||||
<img src={imageForum0} alt="" width="18" height="18" /> = {LABEL_NO_NEW_POSTS}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<ForumJump lang={lang} name={name} forumId={0} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default D3ForumTop;
|
||||
|
||||
+88
-109
@@ -1,125 +1,104 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { RouteComponentProps } from 'react-router';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import Loading from '../common/lib/Loading';
|
||||
import { Helmet } from '@dr.pogodin/react-helmet';
|
||||
import { useLocation, useParams } from 'react-router';
|
||||
import HashLink from '../common/lib/HashLink';
|
||||
import PageNotFound from '../common/lib/PageNotFound';
|
||||
import { MultiLang } from '../config';
|
||||
import type { MultiLang } from '../config';
|
||||
import Functions from '../functions';
|
||||
import D3ForumUtils, { D3ForumCategoryData, D3ForumForumData, D3ForumPostData, D3ForumPostSortOrder, D3ForumTopicData } from './lib/D3ForumUtils';
|
||||
import D3ForumUtils, { D3ForumPostSortOrder } from './lib/D3ForumUtils';
|
||||
import ForumJump from './lib/ForumJump';
|
||||
import Post from './lib/Post';
|
||||
import PostsTree from './lib/PostsTree';
|
||||
|
||||
interface Params {
|
||||
id?: string;
|
||||
}
|
||||
|
||||
interface Props extends RouteComponentProps<Params> {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
}
|
||||
|
||||
interface State {
|
||||
loading: boolean;
|
||||
name: string;
|
||||
topicId: number;
|
||||
order: D3ForumPostSortOrder;
|
||||
}
|
||||
const D3ForumTopic = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
const { search } = useLocation();
|
||||
const { id } = useParams<{ id?: string }>();
|
||||
const topicId = typeof id === 'undefined' ? 0 : Number.parseInt(id, 10);
|
||||
const orderParam = new URLSearchParams(search).get('order');
|
||||
const order =
|
||||
orderParam !== null && orderParam.match(/(0|1|2)/) !== null
|
||||
? (Number.parseInt(orderParam, 10) as D3ForumPostSortOrder)
|
||||
: D3ForumPostSortOrder.TREE;
|
||||
|
||||
class D3ForumTopic extends Component<Props, State> {
|
||||
|
||||
private topic: D3ForumTopicData | null = null;
|
||||
private forum: D3ForumForumData | null = null;
|
||||
private category: D3ForumCategoryData | null = null;
|
||||
private posts: D3ForumPostData[] = [];
|
||||
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
const { name } = props;
|
||||
this.state = {
|
||||
loading: true,
|
||||
name: name,
|
||||
topicId: 0,
|
||||
order: D3ForumPostSortOrder.TREE,
|
||||
};
|
||||
const topic = D3ForumUtils.getTopic(name, topicId);
|
||||
const forum = D3ForumUtils.getForum(name, topic === null ? 0 : topic.forum_id);
|
||||
const category = D3ForumUtils.getCategory(name, forum === null ? 0 : forum.cat_id);
|
||||
if (topic === null || forum === null || category === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const posts = D3ForumUtils.getPosts(name, topicId, order);
|
||||
|
||||
static getDerivedStateFromProps(nextProps: Props, prevState: State) {
|
||||
const params = new URLSearchParams(nextProps.location.search);
|
||||
const topicId = typeof nextProps.match.params.id === 'undefined' ? 0 : parseInt(nextProps.match.params.id, 10);
|
||||
const order_ = params.get('order');
|
||||
const order = (order_ !== null && order_.match(/(0|1|2)/)) ? parseInt(order_, 10) as D3ForumPostSortOrder : D3ForumPostSortOrder.TREE;
|
||||
if (nextProps.name !== prevState.name || prevState.topicId !== topicId || prevState.order !== order) {
|
||||
return { loading: true, name: nextProps.name, topicId, order };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.load();
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
this.load();
|
||||
}
|
||||
|
||||
load() {
|
||||
const { name } = this.props;
|
||||
if (this.state.loading) {
|
||||
this.topic = D3ForumUtils.getTopic(name, this.state.topicId);
|
||||
this.forum = D3ForumUtils.getForum(name, this.topic === null ? 0 : this.topic.forum_id);
|
||||
this.category = D3ForumUtils.getCategory(name, this.forum === null ? 0 : this.forum.cat_id);
|
||||
this.posts = D3ForumUtils.getPosts(name, this.state.topicId, this.state.order);
|
||||
this.setState({ loading: false });
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
const { lang, name } = this.props;
|
||||
if (this.state.loading) {
|
||||
return <Loading />;
|
||||
}
|
||||
if (this.topic === null || this.forum === null || this.category === null) {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
const orderCtrl = (
|
||||
<div className="clearfix">
|
||||
<div className="d3f_order_ctrl">
|
||||
{this.state.order !== D3ForumPostSortOrder.TREE && <HashLink to={D3ForumUtils.getTopicUrl(name, this.topic.topic_id, D3ForumPostSortOrder.TREE, null)}>{Functions.mlang('[en]Tree order[/en][ja]ツリー構造順で表示[/ja]', lang)}</HashLink>}
|
||||
{this.state.order !== D3ForumPostSortOrder.OLD && <HashLink to={D3ForumUtils.getTopicUrl(name, this.topic.topic_id, D3ForumPostSortOrder.OLD, null)}>{Functions.mlang('[en]Older is upper[/en][ja]投稿の古いものから[/ja]', lang)}</HashLink>}
|
||||
{this.state.order !== D3ForumPostSortOrder.NEW && <HashLink to={D3ForumUtils.getTopicUrl(name, this.topic.topic_id, D3ForumPostSortOrder.NEW, null)}>{Functions.mlang('[en]Newer is upper[/en][ja]投稿の新しいものから[/ja]', lang)}</HashLink>}
|
||||
</div>
|
||||
const orderCtrl = (
|
||||
<div className="clearfix">
|
||||
<div className="d3f_order_ctrl">
|
||||
{order !== D3ForumPostSortOrder.TREE && (
|
||||
<HashLink to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.TREE, null)}>
|
||||
{Functions.mlang('[en]Tree order[/en][ja]ツリー構造順で表示[/ja]', lang)}
|
||||
</HashLink>
|
||||
)}
|
||||
{order !== D3ForumPostSortOrder.OLD && (
|
||||
<HashLink to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.OLD, null)}>
|
||||
{Functions.mlang('[en]Older is upper[/en][ja]投稿の古いものから[/ja]', lang)}
|
||||
</HashLink>
|
||||
)}
|
||||
{order !== D3ForumPostSortOrder.NEW && (
|
||||
<HashLink to={D3ForumUtils.getTopicUrl(name, topic.topic_id, D3ForumPostSortOrder.NEW, null)}>
|
||||
{Functions.mlang('[en]Newer is upper[/en][ja]投稿の新しいものから[/ja]', lang)}
|
||||
</HashLink>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
const title = Functions.mlang(this.topic.topic_title, lang);
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<HashLink to={D3ForumUtils.getIndexUrl(name)}>{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}</HashLink>
|
||||
>
|
||||
<HashLink to={D3ForumUtils.getCategoryUrl(name, this.category.cat_id)}>{Functions.mlang(this.category.cat_title, lang)}</HashLink>
|
||||
>
|
||||
<HashLink to={D3ForumUtils.getForumUrl(name, this.forum.forum_id)}>{Functions.mlang(this.forum.forum_title, lang)}</HashLink>
|
||||
</div>
|
||||
<h1 className="d3f_title">{title}</h1>
|
||||
<PostsTree lang={lang} name={name} posts={this.posts} postId={0} />
|
||||
{orderCtrl}
|
||||
<div className="d3f_wrap">
|
||||
{this.posts.map((post, idx) => {
|
||||
const prevPostId = idx === 0 ? 0 : this.posts[idx - 1].post_id;
|
||||
const nextPostId = (idx + 1) === this.posts.length ? 0 : this.posts[idx + 1].post_id;
|
||||
return <Post key={post.post_id} lang={lang} name={name} post={post} prevPostId={prevPostId} nextPostId={nextPostId} inTopic={true} />;
|
||||
})}
|
||||
</div>
|
||||
{orderCtrl}
|
||||
<ForumJump lang={lang} name={name} forumId={this.forum.forum_id} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
</div>
|
||||
);
|
||||
const title = Functions.mlang(topic.topic_title, lang);
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>
|
||||
{title} - {D3ForumUtils.getTitle(name, lang)} - {Functions.siteTitle(lang)}
|
||||
</title>
|
||||
</Helmet>
|
||||
<div className="d3f_breadcrumbs">
|
||||
<HashLink to={D3ForumUtils.getIndexUrl(name)}>
|
||||
{Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang)}
|
||||
</HashLink>
|
||||
>
|
||||
<HashLink to={D3ForumUtils.getCategoryUrl(name, category.cat_id)}>
|
||||
{Functions.mlang(category.cat_title, lang)}
|
||||
</HashLink>
|
||||
>
|
||||
<HashLink to={D3ForumUtils.getForumUrl(name, forum.forum_id)}>
|
||||
{Functions.mlang(forum.forum_title, lang)}
|
||||
</HashLink>
|
||||
</div>
|
||||
<h1 className="d3f_title">{title}</h1>
|
||||
<PostsTree lang={lang} name={name} posts={posts} postId={0} />
|
||||
{orderCtrl}
|
||||
<div className="d3f_wrap">
|
||||
{posts.map((post, idx) => {
|
||||
const prevPostId = idx === 0 ? 0 : posts[idx - 1].post_id;
|
||||
const nextPostId = idx + 1 === posts.length ? 0 : posts[idx + 1].post_id;
|
||||
return (
|
||||
<Post
|
||||
key={post.post_id}
|
||||
lang={lang}
|
||||
name={name}
|
||||
post={post}
|
||||
prevPostId={prevPostId}
|
||||
nextPostId={nextPostId}
|
||||
inTopic={true}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
{orderCtrl}
|
||||
<ForumJump lang={lang} name={name} forumId={forum.forum_id} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default D3ForumTopic;
|
||||
|
||||
@@ -1,65 +1,61 @@
|
||||
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;
|
||||
name: string;
|
||||
}
|
||||
|
||||
class D3ForumXoopsPathRedirect extends Component<Props> {
|
||||
|
||||
getRedirectUrl(): string {
|
||||
const { name, location } = this.props;
|
||||
const pathname = location.pathname || '';
|
||||
const hash = location.hash || '';
|
||||
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 catId = query.get('cat_id');
|
||||
if (catId !== null && catId.match(/^\d+$/) !== null) {
|
||||
return '/' + name + '/category/' + Functions.escape(catId);
|
||||
}
|
||||
const forumId = query.get('forum_id');
|
||||
if (forumId !== null && forumId.match(/^\d+$/) !== null) {
|
||||
return '/' + name + '/forum/' + Functions.escape(forumId);
|
||||
}
|
||||
const topicId = query.get('topic_id');
|
||||
if (topicId !== null && topicId.match(/^\d+$/) !== null) {
|
||||
const matches = hash.match(/^#post_id(\d+)$/);
|
||||
return '/' + name + '/topic/' + Functions.escape(topicId) + (matches === null ? '' : '#postId' + matches[1]);
|
||||
}
|
||||
const postId = query.get('post_id');
|
||||
if (postId !== null && postId.match(/^\d+$/) !== null) {
|
||||
return '/' + name + '/post/' + Functions.escape(postId);
|
||||
}
|
||||
const catIds = query.get('cat_ids');
|
||||
if (catIds !== null && catIds.match(/^\d+$/) !== null) {
|
||||
return '/' + name + '/category/' + Functions.escape(catIds);
|
||||
}
|
||||
return '/' + name + '/';
|
||||
const getRedirectUrl = (name: string, location: { pathname: string; search: string; hash: string }): string => {
|
||||
const pathname = location.pathname || '';
|
||||
const hash = location.hash || '';
|
||||
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 catId = query.get('cat_id');
|
||||
if (catId !== null && catId.match(/^\d+$/) !== null) {
|
||||
return `/${name}/category/${Functions.escape(catId)}`;
|
||||
}
|
||||
const forumId = query.get('forum_id');
|
||||
if (forumId !== null && forumId.match(/^\d+$/) !== null) {
|
||||
return `/${name}/forum/${Functions.escape(forumId)}`;
|
||||
}
|
||||
const topicId = query.get('topic_id');
|
||||
if (topicId !== null && topicId.match(/^\d+$/) !== null) {
|
||||
const postMatches = hash.match(/^#post_id(\d+)$/);
|
||||
return `/${name}/topic/${Functions.escape(topicId)}${postMatches === null ? '' : `#postId${postMatches[1]}`}`;
|
||||
}
|
||||
const postId = query.get('post_id');
|
||||
if (postId !== null && postId.match(/^\d+$/) !== null) {
|
||||
return `/${name}/post/${Functions.escape(postId)}`;
|
||||
}
|
||||
const catIds = query.get('cat_ids');
|
||||
if (catIds !== null && catIds.match(/^\d+$/) !== null) {
|
||||
return `/${name}/category/${Functions.escape(catIds)}`;
|
||||
}
|
||||
return `/${name}/`;
|
||||
}
|
||||
return '/' + name + '/' + path;
|
||||
}
|
||||
return `/${name}/${path}`;
|
||||
};
|
||||
|
||||
render() {
|
||||
const { lang } = this.props;
|
||||
const url = this.getRedirectUrl();
|
||||
if (url === '') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
return <Redirect to={url} />;
|
||||
const D3ForumXoopsPathRedirect = (props: Props) => {
|
||||
const { lang, name } = props;
|
||||
const location = useLocation();
|
||||
const url = getRedirectUrl(name, location);
|
||||
if (url === '') {
|
||||
return <PageNotFound lang={lang} />;
|
||||
}
|
||||
}
|
||||
return <Navigate to={url} replace />;
|
||||
};
|
||||
|
||||
export default withRouter(D3ForumXoopsPathRedirect);
|
||||
export default D3ForumXoopsPathRedirect;
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
/* Page Navigation */
|
||||
|
||||
div.boxNavi .itemBody {
|
||||
margin: 1px 2px 5px 2px;
|
||||
text-align: center;
|
||||
list-style-type: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
div.boxNavi .itemBody li {
|
||||
display: inline;
|
||||
margin: 1px 2px 1px 2px;
|
||||
padding: 5px 0px 5px 0px;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
border-top: 1px solid lightgrey;
|
||||
border-bottom: 1px solid lightgrey;
|
||||
border-left: 1px solid lightgrey;
|
||||
border-right: 1px solid lightgrey;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
div.boxNavi .itemBody li.txt span,
|
||||
div.boxNavi .itemBody li.this span,
|
||||
div.boxNavi .itemBody li a {
|
||||
margin: 0;
|
||||
padding: 5px 7px 5px 10px;
|
||||
text-decoration: none;
|
||||
}
|
||||
div.boxNavi .itemBody li.this span {
|
||||
background-color: #cccccc;
|
||||
}
|
||||
/* Page Navigation */
|
||||
|
||||
div.boxNavi .itemBody {
|
||||
margin: 1px 2px 5px 2px;
|
||||
text-align: center;
|
||||
list-style-type: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
div.boxNavi .itemBody li {
|
||||
display: inline;
|
||||
margin: 1px 2px 1px 2px;
|
||||
padding: 5px 0px 5px 0px;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
border-top: 1px solid lightgrey;
|
||||
border-bottom: 1px solid lightgrey;
|
||||
border-left: 1px solid lightgrey;
|
||||
border-right: 1px solid lightgrey;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
div.boxNavi .itemBody li.txt span,
|
||||
div.boxNavi .itemBody li.this span,
|
||||
div.boxNavi .itemBody li a {
|
||||
margin: 0;
|
||||
padding: 5px 7px 5px 10px;
|
||||
text-decoration: none;
|
||||
}
|
||||
div.boxNavi .itemBody li.this span {
|
||||
background-color: #cccccc;
|
||||
}
|
||||
|
||||
@@ -195,6 +195,13 @@ form.d3f_form p input {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* sanitize.css forms.css leaves form controls transparent; keep them on white. */
|
||||
form.d3f_form select,
|
||||
form.d3f_form input[type="submit"] {
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
/* d3f_ctrl */
|
||||
.d3f_ctrl {
|
||||
width: 100%;
|
||||
@@ -356,13 +363,13 @@ table.d3f_table {
|
||||
}
|
||||
table.d3f_table thead th,
|
||||
table.d3f_table td {
|
||||
text-align: center !important;
|
||||
text-align: center;
|
||||
padding: 3px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
table.d3f_table td.d3f_topictitle,
|
||||
table.d3f_table td.d3f_posters {
|
||||
text-align: left !important;
|
||||
text-align: left;
|
||||
}
|
||||
table.d3f_table td.d3f_mainicon {
|
||||
padding: 0;
|
||||
@@ -374,7 +381,7 @@ table.d3f_table td img {
|
||||
}
|
||||
|
||||
table.d3f_table td dl {
|
||||
text-align: left !important;
|
||||
text-align: left;
|
||||
margin: 0 -3px;
|
||||
padding: 0;
|
||||
}
|
||||
@@ -422,7 +429,7 @@ ul.d3f_iconexp li img {
|
||||
/* table.d3f_form_table */
|
||||
table.d3f_form_table td,
|
||||
table.d3f_form_table th {
|
||||
vertical-align: top !important;
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,45 +1,59 @@
|
||||
import React from 'react';
|
||||
import { RouteComponentProps, withRouter } from 'react-router-dom';
|
||||
import { MultiLang } from '../../config';
|
||||
import { createRef, type ReactElement } from 'react';
|
||||
import { useNavigate } from 'react-router';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import D3ForumUtils, { D3ForumCategoryData } from './D3ForumUtils';
|
||||
import D3ForumUtils, { type D3ForumCategoryData } from './D3ForumUtils';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
catId: number;
|
||||
}
|
||||
|
||||
export const CategoryJump = (props: Props) => {
|
||||
const CategoryJump = (props: Props) => {
|
||||
const { lang, name, catId } = props;
|
||||
const navigate = useNavigate();
|
||||
const LABEL_TOP = Functions.mlang('[en]Top[/en][ja]トップ[/ja]', lang);
|
||||
const LABE_SUBMIT = Functions.mlang('[en]Jump to a category[/en][ja]カテゴリージャンプ[/ja]', lang);
|
||||
const catSelect = React.createRef<HTMLSelectElement>();
|
||||
const catSelectOptions: JSX.Element[] = [
|
||||
<option key="0" value="0">({LABEL_TOP})</option>
|
||||
const catSelect = createRef<HTMLSelectElement>();
|
||||
const catSelectOptions: ReactElement[] = [
|
||||
<option key="0" value="0">
|
||||
({LABEL_TOP})
|
||||
</option>,
|
||||
];
|
||||
const catSelectLoop = (categories: D3ForumCategoryData[]) => {
|
||||
categories.forEach((category) => {
|
||||
const title = Functions.mlang(category.cat_title, lang);
|
||||
const depth = category.cat_depth_in_tree !== 0 ? '--'.repeat(category.cat_depth_in_tree) + ' ' : '';
|
||||
catSelectOptions.push(<option key={category.cat_id} value={category.cat_id}>{depth}{title}</option>);
|
||||
const depth = category.cat_depth_in_tree !== 0 ? `${'--'.repeat(category.cat_depth_in_tree)} ` : '';
|
||||
catSelectOptions.push(
|
||||
<option key={category.cat_id} value={category.cat_id}>
|
||||
{depth}
|
||||
{title}
|
||||
</option>
|
||||
);
|
||||
catSelectLoop(D3ForumUtils.getSubCategories(name, category.cat_id));
|
||||
});
|
||||
};
|
||||
catSelectLoop(D3ForumUtils.getCategories(name));
|
||||
return (<form className="d3f_form" onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
if (catSelect.current !== null) {
|
||||
const catId = parseInt(catSelect.current.value, 10)
|
||||
const url = catId === 0 ? D3ForumUtils.getIndexUrl(name) : D3ForumUtils.getCategoryUrl(name, catId);
|
||||
props.history.push(url);
|
||||
}
|
||||
}}>
|
||||
<select ref={catSelect} defaultValue={String(catId)}>
|
||||
{catSelectOptions}
|
||||
</select>
|
||||
<input type="submit" value={LABE_SUBMIT} />
|
||||
</form>);
|
||||
return (
|
||||
<form
|
||||
className="d3f_form"
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
if (catSelect.current !== null) {
|
||||
const selected = Number.parseInt(catSelect.current.value, 10);
|
||||
const url =
|
||||
selected === 0 ? D3ForumUtils.getIndexUrl(name) : D3ForumUtils.getCategoryUrl(name, selected);
|
||||
navigate(url);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<select ref={catSelect} defaultValue={String(catId)}>
|
||||
{catSelectOptions}
|
||||
</select>
|
||||
<input type="submit" value={LABE_SUBMIT} />
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
export default withRouter(CategoryJump);
|
||||
export default CategoryJump;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import loki from 'lokijs';
|
||||
import { MultiLang } from '../../config';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import d3forumJson from '../assets/d3forum.json';
|
||||
|
||||
export interface D3ForumModuleData {
|
||||
name: string;
|
||||
@@ -24,10 +23,10 @@ export interface D3ForumCategoryData {
|
||||
cat_last_post_time_in_tree: number;
|
||||
cat_depth_in_tree: number;
|
||||
cat_order_in_tree: number;
|
||||
cat_path_in_tree: any;
|
||||
cat_path_in_tree: Record<string, string>;
|
||||
cat_unique_path: string;
|
||||
cat_weight: number;
|
||||
cat_options: any;
|
||||
cat_options: unknown[];
|
||||
}
|
||||
|
||||
export interface D3ForumForumData {
|
||||
@@ -41,7 +40,7 @@ export interface D3ForumForumData {
|
||||
forum_last_post_id: number;
|
||||
forum_last_post_time: number;
|
||||
forum_weight: number;
|
||||
forum_options: any;
|
||||
forum_options: unknown[];
|
||||
}
|
||||
|
||||
export interface D3ForumTopicData {
|
||||
@@ -106,7 +105,7 @@ export interface D3ForumPostData {
|
||||
uid_posts: number;
|
||||
}
|
||||
|
||||
interface D3ForumData {
|
||||
export interface D3ForumData {
|
||||
module: D3ForumModuleData;
|
||||
categories: D3ForumCategoryData[];
|
||||
forums: D3ForumForumData[];
|
||||
@@ -134,7 +133,7 @@ const categorySort = (a: D3ForumCategoryData, b: D3ForumCategoryData) => {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
const forumSort = (a: D3ForumForumData, b: D3ForumForumData) => {
|
||||
if (a.forum_weight > b.forum_weight) {
|
||||
@@ -148,11 +147,14 @@ const forumSort = (a: D3ForumForumData, b: D3ForumForumData) => {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
export enum D3ForumPostSortOrder {
|
||||
TREE,
|
||||
OLD,
|
||||
NEW,
|
||||
}
|
||||
|
||||
export enum D3ForumPostSortOrder { TREE, OLD, NEW }
|
||||
class D3ForumPostSorter {
|
||||
|
||||
private order: D3ForumPostSortOrder;
|
||||
|
||||
constructor(order: D3ForumPostSortOrder) {
|
||||
@@ -192,22 +194,24 @@ class D3ForumPostSorter {
|
||||
}
|
||||
|
||||
class D3ForumUtils {
|
||||
|
||||
private database: loki;
|
||||
private modules: Map<string, D3ForumLokiData>;
|
||||
|
||||
constructor(json: D3ForumData[]) {
|
||||
constructor() {
|
||||
this.database = new loki('d3forum');
|
||||
this.modules = new Map<string, D3ForumLokiData>();
|
||||
}
|
||||
|
||||
init(json: D3ForumData[]): void {
|
||||
json.forEach((data) => {
|
||||
const name = data.module.dirname;
|
||||
const d3forum = {
|
||||
module: data.module,
|
||||
categories: this.database.addCollection<D3ForumCategoryData>(name + '_categories'),
|
||||
forums: this.database.addCollection<D3ForumForumData>(name + '_forums'),
|
||||
topics: this.database.addCollection<D3ForumTopicData>(name + '_topics'),
|
||||
posts: this.database.addCollection<D3ForumPostData>(name + '_posts'),
|
||||
}
|
||||
categories: this.database.addCollection<D3ForumCategoryData>(`${name}_categories`),
|
||||
forums: this.database.addCollection<D3ForumForumData>(`${name}_forums`),
|
||||
topics: this.database.addCollection<D3ForumTopicData>(`${name}_topics`),
|
||||
posts: this.database.addCollection<D3ForumPostData>(`${name}_posts`),
|
||||
};
|
||||
data.categories.forEach((category) => {
|
||||
d3forum.categories.insert(category);
|
||||
});
|
||||
@@ -233,15 +237,15 @@ class D3ForumUtils {
|
||||
}
|
||||
|
||||
getIndexUrl(name: string): string {
|
||||
return '/' + name;
|
||||
return `/${name}`;
|
||||
}
|
||||
|
||||
getCategoryUrl(name: string, catId: number): string {
|
||||
return this.getIndexUrl(name) + '/category/' + catId;
|
||||
return `${this.getIndexUrl(name)}/category/${catId}`;
|
||||
}
|
||||
|
||||
getForumUrl(name: string, forumId: number): string {
|
||||
return this.getIndexUrl(name) + '/forum/' + forumId;
|
||||
return `${this.getIndexUrl(name)}/forum/${forumId}`;
|
||||
}
|
||||
|
||||
getTopicUrl(name: string, topicId: number, order: D3ForumPostSortOrder, postId: number | null): string {
|
||||
@@ -250,11 +254,17 @@ class D3ForumUtils {
|
||||
params.set('order', String(order));
|
||||
}
|
||||
const paramString = params.toString();
|
||||
return this.getIndexUrl(name) + '/topic/' + topicId + (paramString !== '' ? '?' + paramString : '') + (postId !== null ? '#postId' + postId : '');
|
||||
return (
|
||||
this.getIndexUrl(name) +
|
||||
'/topic/' +
|
||||
topicId +
|
||||
(paramString !== '' ? `?${paramString}` : '') +
|
||||
(postId !== null ? `#postId${postId}` : '')
|
||||
);
|
||||
}
|
||||
|
||||
getPostUrl(name: string, postId: number): string {
|
||||
return this.getIndexUrl(name) + '/post/' + postId;
|
||||
return `${this.getIndexUrl(name)}/post/${postId}`;
|
||||
}
|
||||
|
||||
getTotalTopics(name: string): number {
|
||||
@@ -273,7 +283,7 @@ class D3ForumUtils {
|
||||
return d3forum.posts.count();
|
||||
}
|
||||
|
||||
getModule(name: string): D3ForumModuleData | null{
|
||||
getModule(name: string): D3ForumModuleData | null {
|
||||
const d3forum = this.modules.get(name);
|
||||
if (typeof d3forum === 'undefined') {
|
||||
return null;
|
||||
@@ -291,7 +301,7 @@ class D3ForumUtils {
|
||||
return [];
|
||||
}
|
||||
const filter = {
|
||||
'pid': parentCatId
|
||||
pid: parentCatId,
|
||||
};
|
||||
const result = d3forum.categories.chain().find(filter).sort(categorySort).data();
|
||||
return result;
|
||||
@@ -303,7 +313,7 @@ class D3ForumUtils {
|
||||
return null;
|
||||
}
|
||||
const filter = {
|
||||
'cat_id': catId
|
||||
cat_id: catId,
|
||||
};
|
||||
const result = d3forum.categories.findOne(filter);
|
||||
return result;
|
||||
@@ -315,7 +325,7 @@ class D3ForumUtils {
|
||||
return [];
|
||||
}
|
||||
const filter = {
|
||||
'cat_id': catId
|
||||
cat_id: catId,
|
||||
};
|
||||
const result = d3forum.forums.chain().find(filter).sort(forumSort).data();
|
||||
return result;
|
||||
@@ -327,7 +337,7 @@ class D3ForumUtils {
|
||||
return null;
|
||||
}
|
||||
const filter = {
|
||||
'forum_id': forumId
|
||||
forum_id: forumId,
|
||||
};
|
||||
const result = d3forum.forums.findOne(filter);
|
||||
return result;
|
||||
@@ -339,7 +349,7 @@ class D3ForumUtils {
|
||||
return [];
|
||||
}
|
||||
const filter = {
|
||||
'forum_id': forumId
|
||||
forum_id: forumId,
|
||||
};
|
||||
const result = d3forum.topics.find(filter);
|
||||
return result;
|
||||
@@ -351,7 +361,7 @@ class D3ForumUtils {
|
||||
return null;
|
||||
}
|
||||
const filter = {
|
||||
'topic_id': topicId
|
||||
topic_id: topicId,
|
||||
};
|
||||
const result = d3forum.topics.findOne(filter);
|
||||
return result;
|
||||
@@ -363,7 +373,7 @@ class D3ForumUtils {
|
||||
return [];
|
||||
}
|
||||
const filter = {
|
||||
'topic_id': topicId
|
||||
topic_id: topicId,
|
||||
};
|
||||
const sorter = new D3ForumPostSorter(order);
|
||||
const result = d3forum.posts.chain().find(filter).sort(sorter.sort).data();
|
||||
@@ -376,7 +386,7 @@ class D3ForumUtils {
|
||||
return [];
|
||||
}
|
||||
const filter = {
|
||||
'pid': parentPostId
|
||||
pid: parentPostId,
|
||||
};
|
||||
const sorter = new D3ForumPostSorter(D3ForumPostSortOrder.TREE);
|
||||
const result = d3forum.posts.chain().find(filter).sort(sorter.sort).data();
|
||||
@@ -389,11 +399,11 @@ class D3ForumUtils {
|
||||
return null;
|
||||
}
|
||||
const filter = {
|
||||
'post_id': postId
|
||||
post_id: postId,
|
||||
};
|
||||
const result = d3forum.posts.findOne(filter);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export default new D3ForumUtils(d3forumJson);
|
||||
export default new D3ForumUtils();
|
||||
|
||||
@@ -1,39 +1,47 @@
|
||||
import React from 'react';
|
||||
import { RouteComponentProps, withRouter } from 'react-router-dom';
|
||||
import { MultiLang } from '../../config';
|
||||
import { createRef, type ReactElement } from 'react';
|
||||
import { useNavigate } from 'react-router';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import D3ForumUtils, { D3ForumCategoryData, D3ForumForumData } from './D3ForumUtils';
|
||||
import D3ForumUtils, { type D3ForumCategoryData, type D3ForumForumData } from './D3ForumUtils';
|
||||
|
||||
interface Props extends RouteComponentProps {
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
name: string;
|
||||
forumId: number;
|
||||
}
|
||||
|
||||
export const ForumJump = (props: Props) => {
|
||||
const ForumJump = (props: Props) => {
|
||||
const { lang, name, forumId } = props;
|
||||
const navigate = useNavigate();
|
||||
const LABE_SUBMIT = Functions.mlang('[en]Jump to a forum[/en][ja]フォーラムジャンプ[/ja]', lang);
|
||||
const forumSelect = React.createRef<HTMLSelectElement>();
|
||||
const forumSelectOptions: JSX.Element[] = [];
|
||||
const forumSelect = createRef<HTMLSelectElement>();
|
||||
const forumSelectOptions: ReactElement[] = [];
|
||||
const forumSelectLoop = (categories: D3ForumCategoryData[]) => {
|
||||
categories.forEach((category) => {
|
||||
D3ForumUtils.getForums(name, category.cat_id).forEach((forum: D3ForumForumData) => {
|
||||
const title = Functions.mlang(category.cat_title + ' - ' + forum.forum_title, lang);
|
||||
const depth = category.cat_depth_in_tree !== 0 ? '--'.repeat(category.cat_depth_in_tree) + ' ' : '';
|
||||
forumSelectOptions.push(<option key={forum.forum_id} value={forum.forum_id}>{depth}{title}</option>);
|
||||
const title = Functions.mlang(`${category.cat_title} - ${forum.forum_title}`, lang);
|
||||
const depth = category.cat_depth_in_tree !== 0 ? `${'--'.repeat(category.cat_depth_in_tree)} ` : '';
|
||||
forumSelectOptions.push(
|
||||
<option key={forum.forum_id} value={forum.forum_id}>
|
||||
{depth}
|
||||
{title}
|
||||
</option>
|
||||
);
|
||||
});
|
||||
forumSelectLoop(D3ForumUtils.getSubCategories(name, category.cat_id));
|
||||
});
|
||||
};
|
||||
forumSelectLoop(D3ForumUtils.getCategories(name));
|
||||
return (
|
||||
<form className="d3f_form" onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
if (forumSelect.current !== null) {
|
||||
const url = D3ForumUtils.getForumUrl(name, parseInt(forumSelect.current.value, 10));
|
||||
props.history.push(url);
|
||||
}
|
||||
}}>
|
||||
<form
|
||||
className="d3f_form"
|
||||
onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
if (forumSelect.current !== null) {
|
||||
navigate(D3ForumUtils.getForumUrl(name, Number.parseInt(forumSelect.current.value, 10)));
|
||||
}
|
||||
}}
|
||||
>
|
||||
<select ref={forumSelect} defaultValue={String(forumId)}>
|
||||
{forumSelectOptions}
|
||||
</select>
|
||||
@@ -42,4 +50,4 @@ export const ForumJump = (props: Props) => {
|
||||
);
|
||||
};
|
||||
|
||||
export default withRouter(ForumJump);
|
||||
export default ForumJump;
|
||||
|
||||
+66
-30
@@ -1,12 +1,12 @@
|
||||
import moment from 'moment';
|
||||
import React, { Fragment } from 'react';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import { format } from 'date-fns';
|
||||
import { Fragment } from 'react';
|
||||
import noAvatarImage from '../../common/assets/images/no_avatar.gif';
|
||||
import HashLink from '../../common/lib/HashLink';
|
||||
import UserRankStarImage from '../../common/lib/UserRankStarImage';
|
||||
import XoopsCode from '../../common/lib/XoopsCode';
|
||||
import { MultiLang } from '../../config';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import D3ForumUtils, { D3ForumPostData } from './D3ForumUtils';
|
||||
import D3ForumUtils, { type D3ForumPostData } from './D3ForumUtils';
|
||||
import PostIcon from './PostIcon';
|
||||
|
||||
interface Props {
|
||||
@@ -19,14 +19,18 @@ interface Props {
|
||||
}
|
||||
|
||||
const postUrl = (name: string, postId: number, inTopic: boolean) => {
|
||||
return inTopic ? '#postId' + postId : D3ForumUtils.getPostUrl(name, postId);
|
||||
}
|
||||
return inTopic ? `#postId${postId}` : D3ForumUtils.getPostUrl(name, postId);
|
||||
};
|
||||
|
||||
const Post = (props: Props) => {
|
||||
const { lang, name, post, nextPostId, prevPostId, inTopic } = props;
|
||||
const depth = String(post.depth_in_tree * 5) + '%';
|
||||
const url = D3ForumUtils.getPostUrl(name, post.post_id)
|
||||
const subject = <><PostIcon lang={lang} post={post} /> {Functions.mlang(post.subject, lang)}</>;
|
||||
const depth = `${String(post.depth_in_tree * 5)}%`;
|
||||
const url = D3ForumUtils.getPostUrl(name, post.post_id);
|
||||
const subject = (
|
||||
<>
|
||||
<PostIcon lang={lang} post={post} /> {Functions.mlang(post.subject, lang)}
|
||||
</>
|
||||
);
|
||||
const children = D3ForumUtils.getChildPosts(name, post.post_id);
|
||||
const LABEL_PARENT = Functions.mlang('[en]Parent[/en][ja]親投稿[/ja]', lang);
|
||||
const LABEL_PREV = Functions.mlang('[en]Previous post[/en][ja]前の投稿[/ja]', lang);
|
||||
@@ -38,7 +42,13 @@ const Post = (props: Props) => {
|
||||
<div className="itemHead">
|
||||
<img className="d3f_avatar" src={noAvatarImage} alt={post.uid_uname} />
|
||||
<h2 className=" itemTitle">
|
||||
{inTopic ? <HashLink id={'postId' + post.post_id} to={url}>{subject}</HashLink> : subject}
|
||||
{inTopic ? (
|
||||
<HashLink id={`postId${post.post_id}`} to={url}>
|
||||
{subject}
|
||||
</HashLink>
|
||||
) : (
|
||||
subject
|
||||
)}
|
||||
</h2>
|
||||
<span className="d3f_msgnum">msg# {post.unique_path.substring(1)}</span>
|
||||
</div>
|
||||
@@ -48,27 +58,45 @@ const Post = (props: Props) => {
|
||||
<dd>{post.depth_in_tree}</dd>
|
||||
</dl>
|
||||
<div className="d3f_info_val">
|
||||
{prevPostId === 0 ? LABEL_PREV : <HashLink to={postUrl(name, prevPostId, inTopic)}>{LABEL_PREV}</HashLink>}
|
||||
{prevPostId === 0 ? (
|
||||
LABEL_PREV
|
||||
) : (
|
||||
<HashLink to={postUrl(name, prevPostId, inTopic)}>{LABEL_PREV}</HashLink>
|
||||
)}
|
||||
-
|
||||
{nextPostId === 0 ? LABEL_NEXT : <HashLink to={postUrl(name, nextPostId, inTopic)}>{LABEL_NEXT}</HashLink>}
|
||||
{nextPostId === 0 ? (
|
||||
LABEL_NEXT
|
||||
) : (
|
||||
<HashLink to={postUrl(name, nextPostId, inTopic)}>{LABEL_NEXT}</HashLink>
|
||||
)}
|
||||
|
|
||||
{post.pid === 0 ? LABEL_PARENT : <HashLink to={postUrl(name, post.pid, inTopic)}>{LABEL_PARENT}</HashLink>}
|
||||
{post.pid === 0 ? (
|
||||
LABEL_PARENT
|
||||
) : (
|
||||
<HashLink to={postUrl(name, post.pid, inTopic)}>{LABEL_PARENT}</HashLink>
|
||||
)}
|
||||
-
|
||||
{children.length === 0 ? LABEL_NO_CHILD : children.map((child: D3ForumPostData, idx: number) => {
|
||||
const label = (idx === 0 ? LABEL_CHILD : '') + child.unique_path.substr(post.unique_path.length);
|
||||
return (
|
||||
<Fragment key={child.post_id}>
|
||||
{idx > 0 && ' '}
|
||||
<HashLink to={postUrl(name, child.post_id, inTopic)}>{label}</HashLink>
|
||||
</Fragment>
|
||||
);
|
||||
})}
|
||||
{children.length === 0
|
||||
? LABEL_NO_CHILD
|
||||
: children.map((child: D3ForumPostData, idx: number) => {
|
||||
const label =
|
||||
(idx === 0 ? LABEL_CHILD : '') + child.unique_path.substr(post.unique_path.length);
|
||||
return (
|
||||
<Fragment key={child.post_id}>
|
||||
{idx > 0 && ' '}
|
||||
<HashLink to={postUrl(name, child.post_id, inTopic)}>{label}</HashLink>
|
||||
</Fragment>
|
||||
);
|
||||
})}
|
||||
|
|
||||
{Functions.mlang('[en]Posted on[/en][ja]投稿日時[/ja]', lang)} {moment(new Date(post.post_time * 1000)).format('YYYY/M/D H:m')}
|
||||
{Functions.mlang('[en]Posted on[/en][ja]投稿日時[/ja]', lang)}{' '}
|
||||
{format(new Date(post.post_time * 1000), 'yyyy/M/d H:m')}
|
||||
</div>
|
||||
</div>
|
||||
<div className="itemInfo" style={{ textAlign: 'left' }}>
|
||||
{post.uid === 0 ? Functions.mlang(post.guest_name, lang) :
|
||||
{post.uid === 0 ? (
|
||||
Functions.mlang(post.guest_name, lang)
|
||||
) : (
|
||||
<>
|
||||
{post.uid_uname}
|
||||
|
||||
@@ -76,20 +104,28 @@ const Post = (props: Props) => {
|
||||
|
||||
{Functions.mlang('[en]Posts[/en][ja]投稿数[/ja]', lang)}: {post.uid_posts}
|
||||
</>
|
||||
}
|
||||
)}
|
||||
</div>
|
||||
<div className="d3f_body">
|
||||
<XoopsCode lang={lang} text={post.post_text} dohtml={post.html === 1} dosmiley={post.smiley === 1} doxcode={post.xcode === 1} dobr={post.br === 1} />
|
||||
<XoopsCode
|
||||
lang={lang}
|
||||
text={post.post_text}
|
||||
dohtml={post.html === 1}
|
||||
dosmiley={post.smiley === 1}
|
||||
doxcode={post.xcode === 1}
|
||||
dobr={post.br === 1}
|
||||
/>
|
||||
</div>
|
||||
<div className="itemFoot">
|
||||
<span className="d3f_vote">
|
||||
{Functions.mlang('[en]Votes[/en][ja]投票数[/ja]', lang)}:{post.votes_count}
|
||||
|
||||
{Functions.mlang('[en]Average[/en][ja]平均点[/ja]', lang)}:{(post.votes_count === 0 ? 0 : post.votes_sum / post.votes_count).toFixed(2)}
|
||||
{Functions.mlang('[en]Average[/en][ja]平均点[/ja]', lang)}:
|
||||
{(post.votes_count === 0 ? 0 : post.votes_sum / post.votes_count).toFixed(2)}
|
||||
</span>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Post;
|
||||
export default Post;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import React from 'react';
|
||||
import { MultiLang } from '../../config';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import imagePost0 from '../assets/images/posticon0.gif';
|
||||
import imagePost1 from '../assets/images/posticon1.gif';
|
||||
@@ -9,7 +8,7 @@ import imagePost4 from '../assets/images/posticon4.gif';
|
||||
import imagePost5 from '../assets/images/posticon5.gif';
|
||||
import imagePost6 from '../assets/images/posticon6.gif';
|
||||
import imagePost7 from '../assets/images/posticon7.gif';
|
||||
import { D3ForumPostData } from './D3ForumUtils';
|
||||
import type { D3ForumPostData } from './D3ForumUtils';
|
||||
|
||||
interface Props {
|
||||
lang: MultiLang;
|
||||
@@ -18,7 +17,16 @@ interface Props {
|
||||
}
|
||||
|
||||
const postIcons = [imagePost0, imagePost1, imagePost2, imagePost3, imagePost4, imagePost5, imagePost6, imagePost7];
|
||||
const postIconMeanings = ['[en]none[/en][ja]なし[/ja]', '[en]normal[/en][ja]通常[/ja]', '[en]unhappy[/en][ja]不満[/ja]', '[en]happy[/en][ja]満足[/ja]', '[en]lower it[/en][ja]下げ[/ja]', '[en]raise it[/en][ja]上げ[/ja]', '[en]report[/en][ja]報告[/ja]', '[en]question[/en][ja]質問[/ja]'];
|
||||
const postIconMeanings = [
|
||||
'[en]none[/en][ja]なし[/ja]',
|
||||
'[en]normal[/en][ja]通常[/ja]',
|
||||
'[en]unhappy[/en][ja]不満[/ja]',
|
||||
'[en]happy[/en][ja]満足[/ja]',
|
||||
'[en]lower it[/en][ja]下げ[/ja]',
|
||||
'[en]raise it[/en][ja]上げ[/ja]',
|
||||
'[en]report[/en][ja]報告[/ja]',
|
||||
'[en]question[/en][ja]質問[/ja]',
|
||||
];
|
||||
|
||||
const PostIcon = (props: Props) => {
|
||||
const { lang, post, title } = props;
|
||||
@@ -27,6 +35,6 @@ const PostIcon = (props: Props) => {
|
||||
const meaning = Functions.mlang(postIconMeanings[num], lang);
|
||||
const title_ = typeof title === 'undefined' ? meaning : title;
|
||||
return <img src={icon} alt={meaning} title={title_} />;
|
||||
}
|
||||
};
|
||||
|
||||
export default PostIcon;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import moment from 'moment';
|
||||
import React from 'react';
|
||||
import { HashLink } from 'react-router-hash-link';
|
||||
import { MultiLang } from '../../config';
|
||||
import { format } from 'date-fns';
|
||||
import HashLink from '../../common/lib/HashLink';
|
||||
import type { MultiLang } from '../../config';
|
||||
import Functions from '../../functions';
|
||||
import D3ForumUtils, { D3ForumPostData } from './D3ForumUtils';
|
||||
import D3ForumUtils, { type D3ForumPostData } from './D3ForumUtils';
|
||||
import PostIcon from './PostIcon';
|
||||
|
||||
interface Props {
|
||||
@@ -14,8 +13,8 @@ interface Props {
|
||||
}
|
||||
|
||||
const postUrl = (name: string, postId: number, inTopic: boolean) => {
|
||||
return inTopic ? '#postId' + postId : D3ForumUtils.getPostUrl(name, postId);
|
||||
}
|
||||
return inTopic ? `#postId${postId}` : D3ForumUtils.getPostUrl(name, postId);
|
||||
};
|
||||
|
||||
const PostsTree = (props: Props) => {
|
||||
const { lang, name, posts, postId } = props;
|
||||
@@ -26,17 +25,25 @@ const PostsTree = (props: Props) => {
|
||||
<ul className="d3f_eachbranch">
|
||||
{posts.map((post) => {
|
||||
const style = {
|
||||
paddingLeft: String(post.depth_in_tree * 10) + 'px',
|
||||
}
|
||||
const className = post.post_id === postId ? 'd3f_eachbranchitem d3f_currenttopic' : 'd3f_eachbranchitem';
|
||||
const subject = <><PostIcon lang={lang} post={post} /> {Functions.mlang(post.subject, lang)}</>;
|
||||
paddingLeft: `${String(post.depth_in_tree * 10)}px`,
|
||||
};
|
||||
const className =
|
||||
post.post_id === postId ? 'd3f_eachbranchitem d3f_currenttopic' : 'd3f_eachbranchitem';
|
||||
const subject = (
|
||||
<>
|
||||
<PostIcon lang={lang} post={post} /> {Functions.mlang(post.subject, lang)}
|
||||
</>
|
||||
);
|
||||
return (
|
||||
<li key={post.post_id} className={className}>
|
||||
<span style={style}>
|
||||
{post.post_id === postId ? subject : <HashLink to={postUrl(name, post.post_id, inTopic)}>{subject}</HashLink>}
|
||||
|
||||
({post.uid !== 0 ? post.uid_uname : post.guest_name}, {moment(new Date(post.post_time * 1000)).format('YYYY/M/D H:mm')})
|
||||
|
||||
{post.post_id === postId ? (
|
||||
subject
|
||||
) : (
|
||||
<HashLink to={postUrl(name, post.post_id, inTopic)}>{subject}</HashLink>
|
||||
)}
|
||||
({post.uid !== 0 ? post.uid_uname : post.guest_name},{' '}
|
||||
{format(new Date(post.post_time * 1000), 'yyyy/M/d H:mm')})
|
||||
</span>
|
||||
</li>
|
||||
);
|
||||
@@ -44,6 +51,6 @@ const PostsTree = (props: Props) => {
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default PostsTree;
|
||||
export default PostsTree;
|
||||
|
||||
@@ -68,3 +68,13 @@
|
||||
.database :global(.advancedSearch .fieldDate input) {
|
||||
margin: 0 5px 0 0;
|
||||
}
|
||||
|
||||
/* sanitize.css forms.css leaves form controls transparent; keep them on white. */
|
||||
.database :global(.fieldInputText),
|
||||
.database :global(.fieldSelect),
|
||||
.database :global(.fieldDate select),
|
||||
.database :global(.fieldDate input),
|
||||
.database :global(.listTable select) {
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
+24
-20
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -10,4 +10,4 @@
|
||||
.itemTypes .itemType :global(table .itemTypeName) {
|
||||
vertical-align: middle;
|
||||
font-size: large;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,8 +4,10 @@
|
||||
border-bottom: 1px solid #404040;
|
||||
border-right: 1px solid #404040;
|
||||
background-color: white;
|
||||
height: 400px;
|
||||
width: calc(100% - 6px);
|
||||
/* border-box totals: 400 + 3px padding + 1px border per side, and a width
|
||||
that keeps the 2px the original content-box rule overflowed by. */
|
||||
height: 408px;
|
||||
width: calc(100% + 2px);
|
||||
overflow: auto;
|
||||
margin: 0 auto;
|
||||
padding: 3px;
|
||||
@@ -14,6 +16,9 @@
|
||||
|
||||
.formButton {
|
||||
margin: 3px 3px 10px;
|
||||
/* sanitize.css forms.css leaves buttons transparent */
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.indexTree div span {
|
||||
@@ -39,24 +44,37 @@
|
||||
display: inline-block;
|
||||
height: 20px;
|
||||
width: 9px;
|
||||
background: url(../assets/images/tree_line.png);
|
||||
background: url(../assets/images/tree_line.png) no-repeat -18px 0;
|
||||
}
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child)) {
|
||||
/* treeData has a single root, so the first indent unit never carries a line. */
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:first-child) {
|
||||
display: none;
|
||||
}
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(.rc-tree-indent-unit-end)) {
|
||||
background-position: -9px 0;
|
||||
}
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:not(:last-child).rc-tree-indent-unit-end) {
|
||||
background-position: -18px 0;
|
||||
/* The node's own branch (├ or └) is drawn after the indent units. */
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent)::after {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
height: 20px;
|
||||
width: 9px;
|
||||
background: url(../assets/images/tree_line.png) no-repeat 0 0;
|
||||
}
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-indent .rc-tree-indent-unit:last-child.rc-tree-indent-unit-end) {
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode.rc-tree-treenode-leaf-last .rc-tree-indent)::after {
|
||||
background-position: -27px 0;
|
||||
}
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-indent)::after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-switcher) {
|
||||
display: inline-block;
|
||||
height: 20px;
|
||||
width: 16px;
|
||||
margin-right: 2px;
|
||||
background: url(../assets/images/tree_node.png);
|
||||
background: url(../assets/images/tree_node.png) no-repeat;
|
||||
cursor: pointer;
|
||||
}
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode:first-child .rc-tree-switcher.rc-tree-switcher-noop) {
|
||||
@@ -88,4 +106,4 @@
|
||||
.indexTree:global(.rc-tree .rc-tree-treenode .rc-tree-node-content-wrapper .rc-tree-title) {
|
||||
vertical-align: middle;
|
||||
line-height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -25,4 +25,4 @@
|
||||
|
||||
.star {
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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} />
|
||||
|
||||
<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" />
|
||||
|
||||
<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())}
|
||||
/>
|
||||
|
||||
<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" />
|
||||
|
||||
<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) },
|
||||
];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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} />,
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user