first commit.
28
.gitignore
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# database contents
|
||||||
|
/public/modules
|
||||||
|
#/src/xoonips/assets/*.json
|
45
README.md
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# NeuroImaging Platform
|
||||||
|
React project for nimg.neuroinf.jp
|
||||||
|
|
||||||
|
## Available Scripts
|
||||||
|
|
||||||
|
In the project directory, you can run:
|
||||||
|
|
||||||
|
### `npm start`
|
||||||
|
|
||||||
|
Runs the app in the development mode.<br>
|
||||||
|
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
|
||||||
|
|
||||||
|
The page will reload if you make edits.<br>
|
||||||
|
You will also see any lint errors in the console.
|
||||||
|
|
||||||
|
### `npm test`
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
### `npm run build`
|
||||||
|
|
||||||
|
Builds the app for production to the `build` folder.<br>
|
||||||
|
It correctly bundles React in production mode and optimizes the build for the best performance.
|
||||||
|
|
||||||
|
The build is minified and the filenames include the hashes.<br>
|
||||||
|
Your app is ready to be deployed!
|
||||||
|
|
||||||
|
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
|
||||||
|
|
||||||
|
### `npm run eject`
|
||||||
|
|
||||||
|
**Note: this is a one-way operation. Once you `eject`, you can’t go back!**
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||||
|
|
||||||
|
To learn React, check out the [React documentation](https://reactjs.org/).
|
324
etc/common.inc.php
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
<?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)
|
||||||
|
{
|
||||||
|
foreach ($data as $k => $v) {
|
||||||
|
if (is_string($v)) {
|
||||||
|
$v = html_entity_decode($v, ENT_QUOTES | ENT_HTML5);
|
||||||
|
$v = mb_decode_numericentity($v, [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,
|
||||||
|
'drop-proprietary-attributes' => true,
|
||||||
|
'logical-emphasis' => 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);
|
||||||
|
$text = tidy_repair_string($text, $config);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function tableExists($name)
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT 1
|
||||||
|
FROM `${prefix}_${name}`
|
||||||
|
LIMIT 1
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function makeDirectory($dirname)
|
||||||
|
{
|
||||||
|
$path = MYDUMPTOOL_OUTPUTDIR.('' !== $dirname ? '/'.$dirname : '');
|
||||||
|
if (!is_dir($path)) {
|
||||||
|
if (!@mkdir($path, 0755, true)) {
|
||||||
|
exit('Failed to create directory: '.$path.PHP_EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function saveJson($fname, $data)
|
||||||
|
{
|
||||||
|
$path = MYDUMPTOOL_OUTPUTDIR.'/'.$fname;
|
||||||
|
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
|
||||||
|
if (false === $data) {
|
||||||
|
echo json_last_error_msg().PHP_EOL;
|
||||||
|
exit('Failed to encode json data: '.$path.PHP_EOL);
|
||||||
|
}
|
||||||
|
if (false === file_put_contents($path, $data)) {
|
||||||
|
exit('Failed to save json file: '.$path.PHP_EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function fileDownload($url, $fpath)
|
||||||
|
{
|
||||||
|
$fp = fopen($fpath, 'w');
|
||||||
|
if (false === $fp) {
|
||||||
|
exit('Failed to open file: '.$fpath.PHP_EOL);
|
||||||
|
}
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_URL, $url);
|
||||||
|
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
||||||
|
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_FAILONERROR, true);
|
||||||
|
curl_setopt($curl, CURLOPT_FILE, $fp);
|
||||||
|
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
|
||||||
|
$ret = curl_exec($curl);
|
||||||
|
fclose($fp);
|
||||||
|
if (false === $ret) {
|
||||||
|
unlink($fpath);
|
||||||
|
echo 'Failed to download file, unexpected error: '.$url.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||||
|
if (200 !== $code) {
|
||||||
|
unlink($fpath);
|
||||||
|
echo 'Failed to download file, invalid status code('.$code.'): '.$url.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getModule($dirname)
|
||||||
|
{
|
||||||
|
$moduleHandler = xoops_gethandler('module');
|
||||||
|
$moduleObj = $moduleHandler->getByDirname($dirname);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => (int) $moduleObj->get('mid'),
|
||||||
|
'name' => $moduleObj->get('name'),
|
||||||
|
'dirname' => $moduleObj->get('dirname'),
|
||||||
|
'version' => (int) $moduleObj->get('version'),
|
||||||
|
'lastupdate' => (int) $moduleObj->get('last_update'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function canModuleRead($dirname, $uid)
|
||||||
|
{
|
||||||
|
$moduleHandler = xoops_gethandler('module');
|
||||||
|
$moduleObj = $moduleHandler->getByDirname($dirname);
|
||||||
|
$moduleId = (int) $moduleObj->get('mid');
|
||||||
|
$memberHandler = xoops_gethandler('member');
|
||||||
|
$groupIds = 0 === $uid ? [XOOPS_GROUP_ANONYMOUS] : $memberHandler->getGroupsByUser($uid);
|
||||||
|
$groupPermHandler = xoops_gethandler('groupperm');
|
||||||
|
$ret = $groupPermHandler->checkRight('module_read', $moduleId, $groupIds);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function mlang($s, $url, $lang)
|
||||||
|
{
|
||||||
|
if (!defined('CUBE_UTILS_ML_LANGS')) {
|
||||||
|
exit('Error: cubeUtils is not loaded'.PHP_EOL);
|
||||||
|
}
|
||||||
|
$mLanguage = $lang;
|
||||||
|
$mLanguages = explode(',', CUBE_UTILS_ML_LANGS);
|
||||||
|
$mLanguageNames = explode(',', CUBE_UTILS_ML_LANGNAMES);
|
||||||
|
// escape brackets inside of <input type="text" value="...">
|
||||||
|
$s = preg_replace_callback('/(\<input)([^>]*)(\>)/isU', 'self::mlang_escapeBracketTextBox', $s);
|
||||||
|
// escape brackets inside of <textarea></textarea>
|
||||||
|
$s = preg_replace_callback('/(\<textarea[^>]*\>)(.*)(<\/textarea\>)/isU', 'self::mlang_escapeBracket', $s);
|
||||||
|
// multilanguage image tag
|
||||||
|
$langimages = explode(',', CUBE_UTILS_ML_LANGIMAGES);
|
||||||
|
$langnames = explode(',', CUBE_UTILS_ML_LANGNAMES);
|
||||||
|
@list($url, $query) = explode('?', $url);
|
||||||
|
if (empty($query)) {
|
||||||
|
$link_base = '?'.CUBE_UTILS_ML_PARAM_NAME.'=';
|
||||||
|
} elseif (false === ($pos = strpos($query, CUBE_UTILS_ML_PARAM_NAME.'='))) {
|
||||||
|
$link_base = '?'.htmlspecialchars($query, ENT_QUOTES).'&'.CUBE_UTILS_ML_PARAM_NAME.'=';
|
||||||
|
} elseif ($pos < 2) {
|
||||||
|
$link_base = '?'.CUBE_UTILS_ML_PARAM_NAME.'=';
|
||||||
|
} else {
|
||||||
|
$link_base = '?'.htmlspecialchars(substr($query, 0, $pos - 1), ENT_QUOTES).'&'.CUBE_UTILS_ML_PARAM_NAME.'=';
|
||||||
|
}
|
||||||
|
$link_base = $url.$link_base;
|
||||||
|
$langimage_html = '';
|
||||||
|
foreach ($mLanguages as $l => $lang) {
|
||||||
|
$langimage_html .= '<a rel="nofollow" href="'.$link_base.$lang.'"><img src="'.XOOPS_URL.'/'.$langimages[$l].'" alt="flag" title="'.$langnames[$l].'" /></a>';
|
||||||
|
}
|
||||||
|
$s = preg_replace('/\['.CUBE_UTILS_ML_IMAGETAG.'\]/', $langimage_html, $s);
|
||||||
|
|
||||||
|
$s = preg_replace('/\['.CUBE_UTILS_ML_URLTAG.':([^\]]*?)\]/', $link_base.'$1', $s);
|
||||||
|
|
||||||
|
// simple pattern to strip selected lang_tags
|
||||||
|
$s = preg_replace('/\[(\/)?([^\]]+\|)?'.preg_quote($mLanguage).'(\|[^\]]+)?\](\<br \/\>)?/i', '', $s);
|
||||||
|
|
||||||
|
// eliminate description between the other language tags.
|
||||||
|
foreach ($mLanguages as $lang) {
|
||||||
|
if ($mLanguage == $lang) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$s = preg_replace_callback('/\[(?:^\/[^\]]+\|)?'.preg_quote($lang).'(?:\|[^\]]+)?\].*\[\/(?:^\/[^\]]+\|)?'.preg_quote($lang).'(?:\|[^\]]+)?(?:\]\<br \/\>|\])/isU', 'self::mlang_checkNeverCross', $s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// escape brackets inside of <input type="text" value="...">
|
||||||
|
$s = preg_replace_callback('/(\<input)([^>]*)(\>)/isU', 'self::mlang_unEscapeBracketTextBox', $s);
|
||||||
|
|
||||||
|
// escape brackets inside of <textarea></textarea>
|
||||||
|
$s = preg_replace_callback('/(\<textarea[^>]*\>)(.*)(<\/textarea\>)/isU', 'self::mlang_unEscapeBracket', $s);
|
||||||
|
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function mlang_escapeBracketTextBox($matches)
|
||||||
|
{
|
||||||
|
if (preg_match('/type=["\']?(?=text|hidden)["\']?/i', $matches[2])) {
|
||||||
|
return $matches[1].str_replace('[', '__ml[ml__', $matches[2]).$matches[3];
|
||||||
|
} else {
|
||||||
|
return $matches[1].$matches[2].$matches[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function mlang_escapeBracket($matches)
|
||||||
|
{
|
||||||
|
return $matches[1].str_replace('[', '__ml[ml__', $matches[2]).$matches[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function mlang_unEscapeBracketTextBox($matches)
|
||||||
|
{
|
||||||
|
if (preg_match('/type=["\']?(?=text|hidden)["\']?/i', $matches[2])) {
|
||||||
|
return $matches[1].str_replace('__ml[ml__', '[', $matches[2]).$matches[3];
|
||||||
|
} else {
|
||||||
|
return $matches[1].$matches[2].$matches[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function mlang_unEscapeBracket($matches)
|
||||||
|
{
|
||||||
|
return $matches[1].str_replace('__ml[ml__', '[', $matches[2]).$matches[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function mlang_checkNeverCross($matches)
|
||||||
|
{
|
||||||
|
return preg_match(CUBE_UTILS_ML_NEVERCROSSREGEX, $matches[0]) ? $matches[0] : '';
|
||||||
|
}
|
||||||
|
}
|
51
etc/config.inc.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$mainfile = '/data/www/nimg.neuroinf.jp/html/mainfile.php';
|
||||||
|
|
||||||
|
//$XOOPS_MODULE_D3FORUM = ['forum'];
|
||||||
|
//$XOOPS_MODULE_PICO = ['credits'];
|
||||||
|
|
||||||
|
$XOOPS_STATIC_PAGES = [
|
||||||
|
'/modules/xnpnimgcenter/utilities/brain_conv/howtouse.php' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgcenter/assets/howtouse.json'
|
||||||
|
],
|
||||||
|
'/modules/xnpnimgcenter/utilities/index.php' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgcenter/assets/utilities.json'
|
||||||
|
],
|
||||||
|
//'/modules/nimgdocs/tutorials/index.php' => [
|
||||||
|
// 'type' => 'tsx',
|
||||||
|
// 'file' => 'extras/nimgdocs/Tutorials.tsx',
|
||||||
|
//],
|
||||||
|
'/modules/nimgdocs/index.php?docname=about_NIMGPF' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/about.json',
|
||||||
|
],
|
||||||
|
'/modules/nimgdocs/index.php?docname=introduction' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/introduction.json',
|
||||||
|
],
|
||||||
|
'/modules/nimgdocs/index.php?docname=additem' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/additem.json',
|
||||||
|
],
|
||||||
|
'/modules/nimgdocs/index.php?docname=nimgcenter' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/nimgcenter.json',
|
||||||
|
],
|
||||||
|
'/modules/nimgdocs/index.php?docname=nimgsearch' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/nimgsearch.json',
|
||||||
|
],
|
||||||
|
'/modules/nimgdocs/index.php?docname=3DBrowse' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/3dbrowse.json',
|
||||||
|
],
|
||||||
|
'/modules/nimgdocs/index.php?docname=3DBrowse_usage' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'file' => 'src/nimgdocs/assets/3dbrowse_usage.json',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
$_CURLOPT_RESOLVE_VALUE = ['nimg.neuroinf.jp:443:127.0.0.1'];
|
15
etc/copy-brainexplorer.sh
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
XOOPS_ROOT_PATH=/data/www/nimg.neuroinf.jp/html
|
||||||
|
DATADIR=$(dirname $0)/data
|
||||||
|
|
||||||
|
SRCDIR=${XOOPS_ROOT_PATH}/modules/brainexplorer/data/MRI
|
||||||
|
DESTDIR=${DATADIR}/public/modules/brainexplorer/data/m3d
|
||||||
|
|
||||||
|
mkdir -p ${DESTDIR}
|
||||||
|
rsync -av --delete ${SRCDIR}/ ${DESTDIR}/
|
||||||
|
|
||||||
|
SRCDIR=${XOOPS_ROOT_PATH}/modules/be2/data/g3d
|
||||||
|
DESTDIR=${DATADIR}/public/modules/brainexplorer/data/g3d
|
||||||
|
mkdir -p ${DESTDIR}
|
||||||
|
rsync -av --delete ${SRCDIR}/ ${DESTDIR}/
|
18
etc/copy-nimgdocs.sh
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
XOOPS_ROOT_PATH=/data/www/nimg.neuroinf.jp/html
|
||||||
|
DATADIR=$(dirname $0)/data
|
||||||
|
|
||||||
|
SRCDIR=${XOOPS_ROOT_PATH}/modules/nimgdocs
|
||||||
|
DESTDIR=${DATADIR}/public/modules/nimgdocs
|
||||||
|
rsync -av --delete ${SRCDIR}/tutorials/movie/ ${DESTDIR}/tutorials/movie/
|
||||||
|
rsync -av ${SRCDIR}/tutorials/slide.html ${DESTDIR}/tutorials/
|
||||||
|
rsync -av --delete ${SRCDIR}/tutorials/slide/ ${DESTDIR}/tutorials/slide/
|
||||||
|
rsync -av ${SRCDIR}/tutorials/slide2.html ${DESTDIR}/tutorials/
|
||||||
|
rsync -av --delete ${SRCDIR}/tutorials/slide2/ ${DESTDIR}/tutorials/slide2/
|
||||||
|
rsync -av --delete ${SRCDIR}/docs/nimgcenter_document/ ${DESTDIR}/docs/nimgcenter_document/
|
||||||
|
rsync -av --delete ${SRCDIR}/docs/nimgsearch_document/ ${DESTDIR}/docs/nimgsearch_document/
|
||||||
|
rsync -av --delete ${SRCDIR}/docs/pdf/ ${DESTDIR}/docs/pdf/
|
||||||
|
rsync -av --delete ${SRCDIR}/docs/poster/ ${DESTDIR}/docs/poster/
|
||||||
|
rsync -av --delete ${SRCDIR}/docs/viewlet/ ${DESTDIR}/docs/viewlet/
|
||||||
|
rsync -av --delete ${SRCDIR}/docs/winword/ ${DESTDIR}/docs/winword/
|
10
etc/copy-nimgsearch.sh
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
XOOPS_ROOT_PATH=/data/www/nimg.neuroinf.jp/html
|
||||||
|
DATADIR=$(dirname $0)/data
|
||||||
|
|
||||||
|
SRCDIR=${XOOPS_ROOT_PATH}/modules/nimgsearch
|
||||||
|
DESTDIR=${DATADIR}/public/modules/nimgsearch
|
||||||
|
mkdir -p ${DESTDIR}
|
||||||
|
rsync -av --delete ${SRCDIR}/res/ ${DESTDIR}/res/
|
||||||
|
rsync -av --delete ${SRCDIR}/help/ ${DESTDIR}/help/
|
10
etc/dl-limit-items.csv
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
610,fujimaki,"Norio Fujimaki",fujimaki@po.nict.go.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=610
|
||||||
|
611,fujimaki,"Norio Fujimaki",fujimaki@po.nict.go.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=611
|
||||||
|
612,fujimaki,"Norio Fujimaki",fujimaki@po.nict.go.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=612
|
||||||
|
613,fujimaki,"Norio Fujimaki",fujimaki@po.nict.go.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=613
|
||||||
|
1262,ichikawa,"Kazuhisa Ichikawa",kichi@ims.u-tokyo.ac.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=1262
|
||||||
|
1343,kuriki,"Shinya Kuriki",sk@es.hokudai.ac.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?id=DD019
|
||||||
|
1358,kuriki,"Shinya Kuriki",sk@es.hokudai.ac.jp,https://nimg.neuroinf.jp/modules/xoonips/detail.php?id=DD018
|
||||||
|
6965,kiyotaka,根本清貴,kiyotaka@nemotos.net,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=6965
|
||||||
|
6966,kiyotaka,根本清貴,kiyotaka@nemotos.net,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=6966
|
||||||
|
6967,kiyotaka,根本清貴,kiyotaka@nemotos.net,https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=6967
|
|
154
etc/dumpCredits.php
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__.'/common.inc.php';
|
||||||
|
require_once __DIR__.'/extras.inc.php';
|
||||||
|
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
|
||||||
|
$table = 'nipfcredits_organization';
|
||||||
|
if (!MyDumpTool::tableExists($table)) {
|
||||||
|
exit('credits module not found'.PHP_EOL);
|
||||||
|
}
|
||||||
|
MyDumpTool::makeDirectory('public/modules/credits');
|
||||||
|
|
||||||
|
// module
|
||||||
|
$module = MyDumpTool::getModule('credits');
|
||||||
|
|
||||||
|
// 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'] = '[en]Neuroinformatics Unit, RIKEN Center for Brain Science[/en][ja]理化学研究所 脳神経科学研究センター 神経情報基盤ユニット[/ja]';
|
||||||
|
$organization['url'] = 'https://www.ni.riken.jp/';
|
||||||
|
$organization['email'] = 'office (at) ni.riken.jp';
|
||||||
|
$organization['address'] = '[en]Hirosawa 2-1, Wako, Saitama, 351-0198 Japan[/en][ja]埼玉県和光市広沢 2-1[/ja]';
|
||||||
|
$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, $module);
|
||||||
|
MyDumpTool::saveJson('public/modules/credits/0.json', $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 = normalizeHtml($content, '/modules/credits/index.php');
|
||||||
|
$content = preg_replace('/<a (?:[^>]*)href="(?:'.preg_quote(XOOPS_URL, '/').')?\/modules\/xoonips\/(?:register|edit|user)[^"]*"(?:[^>]*)>(.*)<\/a>/Usi', '<s>\1</s>(closed)', $content);
|
||||||
|
$row['content'] = $content;
|
||||||
|
MyDumpTool::dropColumn($row, ['weight']);
|
||||||
|
$pages[] = [
|
||||||
|
'id' => $row['pid'],
|
||||||
|
'title' => $row['title'],
|
||||||
|
];
|
||||||
|
MyDumpTool::saveJson('public/modules/credits/'.$row['pid'].'.json', $row);
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
|
||||||
|
$pages[] = [
|
||||||
|
'id' => $opage['id'],
|
||||||
|
'title' => $opage['title'],
|
||||||
|
];
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'name' => $module['name'],
|
||||||
|
'pages' => $pages,
|
||||||
|
];
|
||||||
|
MyDumpTool::saveJson('public/modules/credits/index.json', $data);
|
||||||
|
|
||||||
|
function replaceOrganization($text, $org)
|
||||||
|
{
|
||||||
|
$map = [
|
||||||
|
'{COMMITTEE_NAME}' => htmlspecialchars($org['committee']),
|
||||||
|
//'{COMMITTEE_EMAIL}' => '<s>'.htmlspecialchars($org['com_email'], ENT_QUOTES).'</s>(committee email has been closed)',
|
||||||
|
'{COMMITTEE_EMAIL}' => htmlspecialchars($org['com_email'], ENT_QUOTES),
|
||||||
|
'{INSTITUTE_NAME}' => htmlspecialchars($org['institute'], ENT_QUOTES),
|
||||||
|
'{INSTITUTE_URL}' => htmlspecialchars($org['url'], ENT_QUOTES),
|
||||||
|
'{INSTITUTE_EMAIL}' => htmlspecialchars($org['email'], ENT_QUOTES),
|
||||||
|
'{INSTITUTE_ADDRESS}' => htmlspecialchars($org['address'], ENT_QUOTES),
|
||||||
|
'{INSTITUTE_TEL}' => htmlspecialchars($org['tel'], ENT_QUOTES),
|
||||||
|
'{PLATFORM_URL}' => XOOPS_URL,
|
||||||
|
];
|
||||||
|
|
||||||
|
return str_replace(array_keys($map), $map, $text);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOrganizationPage($org, $member, $module)
|
||||||
|
{
|
||||||
|
$members = [];
|
||||||
|
if (!empty($member)) {
|
||||||
|
$members[] = ' <li>[en]Members[/en][ja]委員一覧[/ja]';
|
||||||
|
$members[] = ' <ul>';
|
||||||
|
foreach ($member as $m) {
|
||||||
|
$members[] = ' <li>'.htmlspecialchars($m['name'].' : '.$m['division'], ENT_QUOTES).'</li>';
|
||||||
|
}
|
||||||
|
$members[] = ' </ul>';
|
||||||
|
$members[] = ' </li>';
|
||||||
|
}
|
||||||
|
$members = implode("\n", $members);
|
||||||
|
$committee = htmlspecialchars($org['committee'], ENT_QUOTES);
|
||||||
|
$institute = htmlspecialchars($org['institute'], ENT_QUOTES);
|
||||||
|
$address = htmlspecialchars($org['address'], ENT_QUOTES);
|
||||||
|
$url = htmlspecialchars($org['url'], ENT_QUOTES);
|
||||||
|
$email = htmlspecialchars($org['com_email'], ENT_QUOTES);
|
||||||
|
$html = <<< HTML
|
||||||
|
<h4>${committee}</h4>
|
||||||
|
<ul>
|
||||||
|
<li>E-Mail: <strike>${email}</strike></li>
|
||||||
|
${members}
|
||||||
|
</ul>
|
||||||
|
<h4>${institute}</h4>
|
||||||
|
<ul>
|
||||||
|
<li>[en]Address[/en][ja]所在地[/ja]: ${address}</li>
|
||||||
|
<li>URL: <a href="${url}" target="_blank" rel=”noopener noreferrer”>${url}</a></li>
|
||||||
|
</ul>
|
||||||
|
HTML;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => 0,
|
||||||
|
'title' => '[en]About Us[/en][ja]運用母体[/ja]',
|
||||||
|
'content' => $html,
|
||||||
|
'lastupdate' => 0,
|
||||||
|
];
|
||||||
|
}
|
44
etc/dumpNimgdocsBulletin.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__.'/common.inc.php';
|
||||||
|
require_once __DIR__.'/extras.inc.php';
|
||||||
|
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$table = 'nimgdocs_bulletin';
|
||||||
|
if (!MyDumpTool::tableExists($table)) {
|
||||||
|
exit('nimgdocs module not found'.PHP_EOL);
|
||||||
|
}
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT
|
||||||
|
`b`.*
|
||||||
|
FROM `${prefix}_${table}` AS `b`
|
||||||
|
WHERE `b`.`accepted`=1
|
||||||
|
ORDER BY `b`.`post_date` DESC
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = [];
|
||||||
|
while ($row = $xoopsDB->fetchArray($res)) {
|
||||||
|
$row['tags'] = urldecode($row['tags']);
|
||||||
|
$row['text_en'] = urldecode($row['text_en']);
|
||||||
|
$row['text_jp'] = urldecode($row['text_jp']);
|
||||||
|
MyDumpTool::decode($row);
|
||||||
|
MyDumpTool::convertToInt($row, ['id', 'accepted']);
|
||||||
|
$row['text'] = [
|
||||||
|
'en' => $row['text_en'],
|
||||||
|
'ja' => $row['text_jp'],
|
||||||
|
];
|
||||||
|
MyDumpTool::dropColumn($row, ['accepted', 'text_en', 'text_jp']);
|
||||||
|
$row['tags'] = explode(' ', $row['tags']);
|
||||||
|
$row['post_date'] = strtotime($row['post_date']);
|
||||||
|
$row['end_date'] = strtotime($row['end_date']);
|
||||||
|
$data[] = $row;
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
|
||||||
|
MyDumpTool::makeDirectory('src/nimgdocs/assets');
|
||||||
|
MyDumpTool::saveJson('src/nimgdocs/assets/bulletin.json', $data);
|
||||||
|
|
102
etc/dumpPico.php
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__.'/common.inc.php';
|
||||||
|
require_once __DIR__.'/extras.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);
|
||||||
|
|
||||||
|
foreach ($XOOPS_MODULE_PICO as $pico) {
|
||||||
|
dumpPico($pico);
|
||||||
|
}
|
||||||
|
|
||||||
|
function dumpPico($pico)
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$table = $pico.'_contents';
|
||||||
|
if (!MyDumpTool::tableExists($table)) {
|
||||||
|
exit('pico('.$pico.') module not found'.PHP_EOL);
|
||||||
|
}
|
||||||
|
MyDumpTool::makeDirectory('public/modules/'.$pico);
|
||||||
|
$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 = [];
|
||||||
|
$dataMap = [];
|
||||||
|
$dataSeq = 1;
|
||||||
|
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);
|
||||||
|
$url = XOOPS_URL.'/modules/'.$pico.'/'.$link;
|
||||||
|
$content_en = normalizeHtml(MyDumpTool::mlang($data['body_cached'], $url, 'en'), $url);
|
||||||
|
$content_ja = normalizeHtml(MyDumpTool::mlang($data['body_cached'], $url, 'ja'), $url);
|
||||||
|
$item = [
|
||||||
|
'id' => $data['id'],
|
||||||
|
'title' => $data['subject_raw'],
|
||||||
|
'content' => [
|
||||||
|
'en' => $content_en,
|
||||||
|
'ja' => $content_ja,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
MyDumpTool::saveJson('public/modules/'.$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,
|
||||||
|
];
|
||||||
|
MyDumpTool::saveJson('public/modules/'.$pico.'/index.json', $config);
|
||||||
|
}
|
207
etc/dumpStaticPage.php
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__.'/common.inc.php';
|
||||||
|
require_once __DIR__.'/extras.inc.php';
|
||||||
|
|
||||||
|
foreach ($XOOPS_STATIC_PAGES as $page => $config) {
|
||||||
|
$data = [
|
||||||
|
'en' => StaticFiles::getPage($page, 'en'),
|
||||||
|
'ja' => StaticFiles::getPage($page, 'ja'),
|
||||||
|
];
|
||||||
|
MyDumpTool::makeDirectory(dirname($config['file']));
|
||||||
|
switch ($config['type']) {
|
||||||
|
case 'json':
|
||||||
|
MyDumpTool::saveJson($config['file'], $data);
|
||||||
|
break;
|
||||||
|
case 'tsx':
|
||||||
|
StaticFiles::saveTsx($config['file'], $data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class StaticFiles
|
||||||
|
{
|
||||||
|
public static function saveTsx($fname, $data)
|
||||||
|
{
|
||||||
|
$path = MYDUMPTOOL_OUTPUTDIR.'/'.$fname;
|
||||||
|
$cname = basename($fname, '.tsx');
|
||||||
|
$content_ja = self::makeJsx($data['ja']);
|
||||||
|
$content_en = self::makeJsx($data['en']);
|
||||||
|
$tsx = <<< TSX
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { MultiLang } from '../config';
|
||||||
|
import Functions from '../functions';
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface State {
|
||||||
|
isOpen: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ${cname} extends Component<Props, State> {
|
||||||
|
|
||||||
|
constructor(props: Props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
isOpen: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getContent(lang: MultiLang) {
|
||||||
|
const contents = {
|
||||||
|
en: <>
|
||||||
|
${content_en}
|
||||||
|
</>,
|
||||||
|
ja: <>
|
||||||
|
${content_ja}
|
||||||
|
</>;
|
||||||
|
}
|
||||||
|
return contents[lang];
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { lang } = this.props;
|
||||||
|
return this.getContent(lang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ${cname};
|
||||||
|
TSX;
|
||||||
|
file_put_contents($path, $tsx);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function makeJsx($text)
|
||||||
|
{
|
||||||
|
$text = preg_replace_callback('/<([a-z0-9]+)((?: +[a-z]+(?:="[^"]*")?)*)( *\/?)>/Us', function ($matches) {
|
||||||
|
$tag = $matches[1];
|
||||||
|
preg_match_all('/ +([a-z]+?)(?:="([^"]*)")??/Us', $matches[2], $out, PREG_SET_ORDER);
|
||||||
|
$attribs = [];
|
||||||
|
foreach ($out as $_out) {
|
||||||
|
$key = $_out[1];
|
||||||
|
$value = html_entity_decode(trim($_out[2]), ENT_QUOTES | ENT_HTML5);
|
||||||
|
$attribs[$key] = $value;
|
||||||
|
}
|
||||||
|
$styles = [];
|
||||||
|
if (isset($attribs['style'])) {
|
||||||
|
foreach (array_map('trim', explode(';', $attribs['style'])) as $style) {
|
||||||
|
if ('' === $style) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
[$key, $value] = array_map('trim', explode(':', $style));
|
||||||
|
$key = lcfirst(str_replace(' ', '', ucwords(str_replace('-', ' ', $key))));
|
||||||
|
$styles[$key] = preg_replace('/ +/U', ' ', $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$close = str_replace('/', ' /', trim($matches[3]));
|
||||||
|
if (isset($attribs['class'])) {
|
||||||
|
$attribs['className'] = $attribs['class'];
|
||||||
|
unset($attribs['class']);
|
||||||
|
}
|
||||||
|
if ('a' === $tag && isset($attribs['target']) && '_blank' === $attribs['target'] && !isset($attribs['rel'])) {
|
||||||
|
$attribs['rel'] = 'noopener noreferrer';
|
||||||
|
}
|
||||||
|
foreach (['align', 'width', 'height'] as $key) {
|
||||||
|
$kmap = ['align' => 'textAlign'];
|
||||||
|
$skey = isset($kmap[$key]) ? $kmap[$key] : $key;
|
||||||
|
if (isset($attribs[$key])) {
|
||||||
|
$styles[$skey] = $attribs[$key];
|
||||||
|
unset($attribs[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$x = [];
|
||||||
|
foreach ($styles as $key => $style) {
|
||||||
|
$x[] = $key.': "'.$style.'"';
|
||||||
|
}
|
||||||
|
if (empty($x)) {
|
||||||
|
unset($attribs['style']);
|
||||||
|
} else {
|
||||||
|
$attribs['style'] = '{'.implode(', ', $x).'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
$x = '';
|
||||||
|
foreach ($attribs as $key => $value) {
|
||||||
|
if ('' !== $x) {
|
||||||
|
$x .= ' ';
|
||||||
|
}
|
||||||
|
switch ($key) {
|
||||||
|
case 'style':
|
||||||
|
$x .= $key.'={'.$value.'}';
|
||||||
|
break;
|
||||||
|
case 'controls':
|
||||||
|
if ('' === $value) {
|
||||||
|
$x .= $key;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$x .= $key.'="'.str_replace(''', '\'', htmlspecialchars($value, ENT_QUOTES)).'"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ('' !== $x) {
|
||||||
|
$x = ' '.$x;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<'.$tag.$x.$close.'>';
|
||||||
|
}, $text);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getPage($page, $lang)
|
||||||
|
{
|
||||||
|
$url = XOOPS_URL.$page;
|
||||||
|
$html = self::fetch($url.(false !== strpos($page, '?') ? '&' : '?').'ml_lang='.$lang);
|
||||||
|
$xml = self::getXml($html, 'content');
|
||||||
|
|
||||||
|
return normalizeHtml($xml, $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getXml($html, $id)
|
||||||
|
{
|
||||||
|
$text = MyDumpTool::fixHtml($html);
|
||||||
|
$text = str_replace('&', '&', $text);
|
||||||
|
$xml = simplexml_load_string($text);
|
||||||
|
if (false === $xml) {
|
||||||
|
die('failed to load xml: '.$text.PHP_EOL);
|
||||||
|
}
|
||||||
|
$objs = $xml->xpath('//*[@id="'.$id.'"]/*');
|
||||||
|
if (false === $objs || empty($objs)) {
|
||||||
|
die('failed to find id attribute: '.$id.PHP_EOL);
|
||||||
|
}
|
||||||
|
$ret = '';
|
||||||
|
foreach ($objs as $obj) {
|
||||||
|
$ret .= $obj->asXml();
|
||||||
|
}
|
||||||
|
$ret = str_replace('&', '&', $ret);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function fetch($url)
|
||||||
|
{
|
||||||
|
$curl = curl_init();
|
||||||
|
curl_setopt($curl, CURLOPT_URL, $url);
|
||||||
|
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
||||||
|
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($curl, CURLOPT_FAILONERROR, true);
|
||||||
|
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
|
||||||
|
if (isset($GLOBALS['_CURLOPT_RESOLVE_VALUE'])) {
|
||||||
|
curl_setopt($curl, CURLOPT_RESOLVE, $GLOBALS['_CURLOPT_RESOLVE_VALUE']);
|
||||||
|
}
|
||||||
|
$ret = curl_exec($curl);
|
||||||
|
if (false === $ret) {
|
||||||
|
exit('Failed to fetch, 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 $ret;
|
||||||
|
}
|
||||||
|
}
|
1241
etc/dumpXooNIps.php
Normal file
188
etc/extra.inc.php
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function normalizeUrl($url, $base, $type)
|
||||||
|
{
|
||||||
|
$localpath = function ($url, $type) {
|
||||||
|
$purl1 = parse_url($url);
|
||||||
|
$purl2 = parse_url(XOOPS_URL);
|
||||||
|
if (isset($purl1['host']) && isset($purl2['host']) && $purl1['host'] === $purl2['host']) {
|
||||||
|
$url = preg_replace('/^http:/', 'https:', $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = preg_replace('/^https?:\/\/nimg.neuroinf\.jp\/?/', '/', $url);
|
||||||
|
$url = preg_replace('/^\/fmanager\/(view|tmb)\/(.*)(:?\?_t=.*)?$/U', '/modules/fmanager/index.php/\1/\2', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/detail\.php\?((:?item_)?id=.+)&download=.*$/U', '/modules/xoonips/detail.php?\1', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/image\.php\/thumbnail\/(\d+)\/(.*)$/U', '/modules/xoonips/file/\1.png', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/preview\.php\/\d+\/(\d+)\/(.*)$/U', '/modules/xoonips/file/\1.png', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/download\.php\/\d+\/(\d+)\/(.*)$/U', '/modules/xoonips/file/\1/\2', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/download\.php\/([^\/]+)\?file_id=(\d+)$/U', '/modules/xoonips/file/\2/\1', $url);
|
||||||
|
if (preg_match('/^\/modules\/xoonips\/download\.php\?file_id=(\d+)$/U', $url, $matches)) {
|
||||||
|
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public/modules/xoonips/file/'.$matches[1];
|
||||||
|
$found = false;
|
||||||
|
foreach (glob($fpath.'/*') as $fname) {
|
||||||
|
if ('.htaccess' === $fname) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
$url = '/modules/xoonips/file/'.$matches[1].'/'.urlencode(basename($fname));
|
||||||
|
$found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (false === $found) {
|
||||||
|
echo 'Failed to replace xoonips download url:'.$url.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// append
|
||||||
|
if ('videoSrc' === $type) {
|
||||||
|
//$url = preg_replace('/^\/modules\/xoonips\/file\/1459.png$/', '/modules/xoonips/file/1459/benham\'s_top.mp4', $url);
|
||||||
|
//$url = preg_replace('/^\/modules\/xoonips\/file\/1469.png$/', '/modules/xoonips/file/1469/music_notes.mp4', $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
};
|
||||||
|
if ('' === $url) {
|
||||||
|
return $localpath($base, $type);
|
||||||
|
}
|
||||||
|
$purl = parse_url($url);
|
||||||
|
if (isset($purl['scheme'])) {
|
||||||
|
return $localpath($url, $type);
|
||||||
|
}
|
||||||
|
$pburl = parse_url($base);
|
||||||
|
$path = $pburl['path'];
|
||||||
|
if ('/' == $url[0]) {
|
||||||
|
$path = '';
|
||||||
|
} elseif ('#' !== $url[0] && '?' !== $url[0]) {
|
||||||
|
$path = preg_replace('#/[^/]*$#', '', $path).'/';
|
||||||
|
}
|
||||||
|
$path .= $url;
|
||||||
|
$pattern = ['#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'];
|
||||||
|
do {
|
||||||
|
$path = preg_replace($pattern, '/', $path, -1, $count);
|
||||||
|
} while (0 < $count);
|
||||||
|
|
||||||
|
return $localpath($pburl['scheme'].'://'.$pburl['host'].$path, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkLocalFile($url, $tag)
|
||||||
|
{
|
||||||
|
$url2 = preg_replace('/'.preg_quote(XOOPS_URL, '/').'/', '', $url);
|
||||||
|
if (preg_match('/^\//', $url2)) {
|
||||||
|
if (!preg_match('/\/([^\/]+\.(php|html))?(\?.+)?(#.+)?$/i', $url2, $matches)) {
|
||||||
|
$dstFpath = MYDUMPTOOL_OUTPUTDIR.'/public'.urldecode($url2);
|
||||||
|
$srcFpath = XOOPS_ROOT_PATH.urldecode($url2);
|
||||||
|
if (!file_exists($dstFpath)) {
|
||||||
|
if (file_exists($srcFpath)) {
|
||||||
|
MyDumpTool::makeDirectory('/public'.dirname($url2));
|
||||||
|
if (!MyDumpTool::fileCopy($srcFpath, $dstFpath)) {
|
||||||
|
echo 'Error: Failed to copy file: '.$fpath.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo 'Error: File not found: '.$fpath.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeHtml($text, $path)
|
||||||
|
{
|
||||||
|
$text = MyDumpTool::fixHtml($text);
|
||||||
|
$text = preg_replace_callback('/<img ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
$url = normalizeUrl($url, $path, 'imgSrc');
|
||||||
|
$url = checkLocalFile($url, 'imgSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<img '.$matches[1].'src="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'/>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace_callback('/<a ([^>]*)href="([^"]+)"([^>]*)>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
if (!preg_match('/^#/', $url)) {
|
||||||
|
$url = normalizeUrl($url, $path, 'aHref');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
$url = checkLocalFile($url, 'aHref');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<a '.$matches[1].'href="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace_callback('/<embed ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
$url = normalizeUrl($url, $path, 'embedSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
$url = checkLocalFile($url, 'embedSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<embed '.$matches[1].'src="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'/>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace_callback('/<video ([^>]*)src="(.*)"([^>]*)>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
$url = normalizeUrl($url, $path, 'videoSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
$url = checkLocalFile($url, 'videoSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<video '.$matches[1].'src="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace('/ lang="([^"]+)"/Us', '', $text);
|
||||||
|
$text = preg_replace('/ xml:lang="([^"]+)"/Us', '', $text);
|
||||||
|
// remove font-family attributes
|
||||||
|
$text = preg_replace_callback('/<span([^>]*?)>((?!<span).*)<\/span>/Us', function ($matches) use ($path) {
|
||||||
|
if ('' === trim($matches[1]) || '' === trim($matches[2]) || ' ' === trim($matches[2])) {
|
||||||
|
return $matches[2];
|
||||||
|
}
|
||||||
|
$m1 = $matches[1];
|
||||||
|
$m1 = preg_replace_callback('/style="(.*)"/Us', function ($matches2) {
|
||||||
|
$styles1 = array_map('trim', explode(';', htmlspecialchars_decode($matches2[1], ENT_QUOTES)));
|
||||||
|
$styles2 = [];
|
||||||
|
foreach ($styles1 as $style1) {
|
||||||
|
if ('' === $style1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$style = explode(':', $style1);
|
||||||
|
list($key, $value) = array_map('trim', explode(':', $style1));
|
||||||
|
if ('font-family' === $key || 'line-height' === $key || '' === $value || 'color' === $key && 'null' === $value) {
|
||||||
|
// skip
|
||||||
|
} else {
|
||||||
|
$styles2[] = $key.':'.$value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0 === count($styles2) ? '' : ('style="'.htmlspecialchars(implode(';', $styles2).';', ENT_QUOTES).'"');
|
||||||
|
}, $m1);
|
||||||
|
if ('' === trim($m1)) {
|
||||||
|
return $matches[2];
|
||||||
|
}
|
||||||
|
if (strpos($m1, 'font-family') > 0) {
|
||||||
|
echo 'trimed span:'.$path.PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<span'.$m1.'>'.$matches[2].'</span>';
|
||||||
|
}, $text);
|
||||||
|
$text = MyDumpTool::fixHtml($text);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
188
etc/extras.inc.php
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function normalizeUrl($url, $base, $type)
|
||||||
|
{
|
||||||
|
$localpath = function ($url, $type) {
|
||||||
|
$purl1 = parse_url($url);
|
||||||
|
$purl2 = parse_url(XOOPS_URL);
|
||||||
|
if (isset($purl1['host']) && isset($purl2['host']) && $purl1['host'] === $purl2['host']) {
|
||||||
|
$url = preg_replace('/^http:/', 'https:', $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = preg_replace('/^https?:\/\/nimg.neuroinf\.jp\/?/', '/', $url);
|
||||||
|
$url = preg_replace('/^\/fmanager\/(view|tmb)\/(.*)(:?\?_t=.*)?$/U', '/modules/fmanager/index.php/\1/\2', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/detail\.php\?((:?item_)?id=.+)&download=.*$/U', '/modules/xoonips/detail.php?\1', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/image\.php\/thumbnail\/(\d+)\/(.*)$/U', '/modules/xoonips/file/\1.png', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/preview\.php\/\d+\/(\d+)\/(.*)$/U', '/modules/xoonips/file/\1.png', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/download\.php\/\d+\/(\d+)\/(.*)$/U', '/modules/xoonips/file/\1/\2', $url);
|
||||||
|
$url = preg_replace('/^\/modules\/xoonips\/download\.php\/([^\/]+)\?file_id=(\d+)$/U', '/modules/xoonips/file/\2/\1', $url);
|
||||||
|
if (preg_match('/^\/modules\/xoonips\/download\.php\?file_id=(\d+)$/U', $url, $matches)) {
|
||||||
|
$fpath = MYDUMPTOOL_OUTPUTDIR.'/public/modules/xoonips/file/'.$matches[1];
|
||||||
|
$found = false;
|
||||||
|
foreach (glob($fpath.'/*') as $fname) {
|
||||||
|
if ('.htaccess' === $fname) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
$url = '/modules/xoonips/file/'.$matches[1].'/'.urlencode(basename($fname));
|
||||||
|
$found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (false === $found) {
|
||||||
|
echo 'Failed to replace xoonips download url:'.$url.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// append
|
||||||
|
if ('videoSrc' === $type) {
|
||||||
|
//$url = preg_replace('/^\/modules\/xoonips\/file\/1459.png$/', '/modules/xoonips/file/1459/benham\'s_top.mp4', $url);
|
||||||
|
//$url = preg_replace('/^\/modules\/xoonips\/file\/1469.png$/', '/modules/xoonips/file/1469/music_notes.mp4', $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
};
|
||||||
|
if ('' === $url) {
|
||||||
|
return $localpath($base, $type);
|
||||||
|
}
|
||||||
|
$purl = parse_url($url);
|
||||||
|
if (isset($purl['scheme'])) {
|
||||||
|
return $localpath($url, $type);
|
||||||
|
}
|
||||||
|
$pburl = parse_url($base);
|
||||||
|
$path = $pburl['path'];
|
||||||
|
if ('/' == $url[0]) {
|
||||||
|
$path = '';
|
||||||
|
} elseif ('#' !== $url[0] && '?' !== $url[0]) {
|
||||||
|
$path = preg_replace('#/[^/]*$#', '', $path).'/';
|
||||||
|
}
|
||||||
|
$path .= $url;
|
||||||
|
$pattern = ['#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'];
|
||||||
|
do {
|
||||||
|
$path = preg_replace($pattern, '/', $path, -1, $count);
|
||||||
|
} while (0 < $count);
|
||||||
|
|
||||||
|
return $localpath($pburl['scheme'].'://'.$pburl['host'].$path, $type);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkLocalFile($url, $tag)
|
||||||
|
{
|
||||||
|
$url2 = preg_replace('/'.preg_quote(XOOPS_URL, '/').'/', '', $url);
|
||||||
|
if (preg_match('/^\//', $url2)) {
|
||||||
|
if (!preg_match('/\/([^\/]+\.(php|html))?(\?.+)?(#.+)?$/i', $url2, $matches)) {
|
||||||
|
$dstFpath = MYDUMPTOOL_OUTPUTDIR.'/public'.urldecode($url2);
|
||||||
|
$srcFpath = XOOPS_ROOT_PATH.urldecode($url2);
|
||||||
|
if (!file_exists($dstFpath)) {
|
||||||
|
if (file_exists($srcFpath)) {
|
||||||
|
MyDumpTool::makeDirectory('/public'.dirname($url2));
|
||||||
|
if (!MyDumpTool::fileCopy($srcFpath, $dstFpath)) {
|
||||||
|
echo 'Error: Failed to copy file: '.$srcFpath.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo 'Error: File not found: '.$srcFpath.PHP_EOL;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeHtml($text, $path)
|
||||||
|
{
|
||||||
|
$text = MyDumpTool::fixHtml($text);
|
||||||
|
$text = preg_replace_callback('/<img ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
$url = normalizeUrl($url, $path, 'imgSrc');
|
||||||
|
$url = checkLocalFile($url, 'imgSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<img '.$matches[1].'src="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'/>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace_callback('/<a ([^>]*)href="([^"]+)"([^>]*)>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
if (!preg_match('/^#/', $url)) {
|
||||||
|
$url = normalizeUrl($url, $path, 'aHref');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
$url = checkLocalFile($url, 'aHref');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<a '.$matches[1].'href="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace_callback('/<embed ([^>]*)src="(.*)"([^>]*)\/>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
$url = normalizeUrl($url, $path, 'embedSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
$url = checkLocalFile($url, 'embedSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<embed '.$matches[1].'src="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'/>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace_callback('/<video ([^>]*)src="(.*)"([^>]*)>/Us', function ($matches) use ($path) {
|
||||||
|
$url = htmlspecialchars_decode($matches[2], ENT_QUOTES);
|
||||||
|
$url = normalizeUrl($url, $path, 'videoSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
$url = checkLocalFile($url, 'videoSrc');
|
||||||
|
if (false === $url) {
|
||||||
|
exit($path.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<video '.$matches[1].'src="'.htmlspecialchars($url, ENT_QUOTES).'"'.$matches[3].'>';
|
||||||
|
}, $text);
|
||||||
|
$text = preg_replace('/ lang="([^"]+)"/Us', '', $text);
|
||||||
|
$text = preg_replace('/ xml:lang="([^"]+)"/Us', '', $text);
|
||||||
|
// remove font-family attributes
|
||||||
|
$text = preg_replace_callback('/<span([^>]*?)>((?!<span).*)<\/span>/Us', function ($matches) use ($path) {
|
||||||
|
if ('' === trim($matches[1]) || '' === trim($matches[2]) || ' ' === trim($matches[2])) {
|
||||||
|
return $matches[2];
|
||||||
|
}
|
||||||
|
$m1 = $matches[1];
|
||||||
|
$m1 = preg_replace_callback('/style="(.*)"/Us', function ($matches2) {
|
||||||
|
$styles1 = array_map('trim', explode(';', htmlspecialchars_decode($matches2[1], ENT_QUOTES)));
|
||||||
|
$styles2 = [];
|
||||||
|
foreach ($styles1 as $style1) {
|
||||||
|
if ('' === $style1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$style = explode(':', $style1);
|
||||||
|
list($key, $value) = array_map('trim', explode(':', $style1));
|
||||||
|
if ('font-family' === $key || 'line-height' === $key || '' === $value || 'color' === $key && 'null' === $value) {
|
||||||
|
// skip
|
||||||
|
} else {
|
||||||
|
$styles2[] = $key.':'.$value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0 === count($styles2) ? '' : ('style="'.htmlspecialchars(implode(';', $styles2).';', ENT_QUOTES).'"');
|
||||||
|
}, $m1);
|
||||||
|
if ('' === trim($m1)) {
|
||||||
|
return $matches[2];
|
||||||
|
}
|
||||||
|
if (strpos($m1, 'font-family') > 0) {
|
||||||
|
echo 'trimed span:'.$path.PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<span'.$m1.'>'.$matches[2].'</span>';
|
||||||
|
}, $text);
|
||||||
|
$text = MyDumpTool::fixHtml($text);
|
||||||
|
|
||||||
|
return $text;
|
||||||
|
}
|
310
etc/fixXooNIps.php
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$method = 'POST';
|
||||||
|
require_once __DIR__.'/common.inc.php';
|
||||||
|
|
||||||
|
$table = 'xoonips_item_basic';
|
||||||
|
if (!MyDumpTool::tableExists($table)) {
|
||||||
|
exit('xoonips module not found'.PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tree = getPublicIndex();
|
||||||
|
$items = getPublicItems();
|
||||||
|
checkNimgCenterBaseItem();
|
||||||
|
checkBadIndexItemLink();
|
||||||
|
checkBadItemTitle();
|
||||||
|
checkNimgCenterItem($items);
|
||||||
|
|
||||||
|
// check nimgcenter item
|
||||||
|
function checkNimgCenterItem($items)
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
foreach ($items as $item) {
|
||||||
|
if ('xnpnimgcenter' !== $item['item_type_name']) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
appendNimgcenterInfo($item);
|
||||||
|
$itemId = $item['item_id'];
|
||||||
|
$indexIds = getPublicIndexIdsByItemId($itemId);
|
||||||
|
$baseItemId = $item['baseitem_id'];
|
||||||
|
$baseIndexIds = getPublicIndexIdsByItemId($baseItemId);
|
||||||
|
if (empty($baseIndexIds)) {
|
||||||
|
// private item found.
|
||||||
|
foreach ($indexIds as $indexId) {
|
||||||
|
$sql = <<< SQL
|
||||||
|
INSERT INTO `${prefix}_xoonips_index_item_link` VALUES (NULL, $indexId, $baseItemId, 2)
|
||||||
|
SQL;
|
||||||
|
var_dump($sql);
|
||||||
|
if (!($res = $xoopsDB->queryF($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check bad item title
|
||||||
|
function checkBadItemTitle()
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT `it`.*
|
||||||
|
FROM `${prefix}_xoonips_item_title` AS `it`
|
||||||
|
LEFT JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `it`.`item_id`=`ib`.`item_id`
|
||||||
|
WHERE `ib`.`item_id` IS NULL
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$itemIds = [];
|
||||||
|
while ($row = $xoopsDB->fetchArray($res)) {
|
||||||
|
$itemIds[] = $row['item_id'];
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
$itemIds = array_unique($itemIds);
|
||||||
|
foreach ($itemIds as $itemId) {
|
||||||
|
$sql = <<< SQL
|
||||||
|
DELETE FROM `${prefix}_xoonips_item_title` WHERE `item_id`=$itemId
|
||||||
|
SQL;
|
||||||
|
var_dump($sql);
|
||||||
|
if (!($res = $xoopsDB->queryF($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var_dump($itemIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check bad index item link
|
||||||
|
function checkBadIndexItemLink()
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT `iil`.*
|
||||||
|
FROM `${prefix}_xoonips_index_item_link` AS `iil`
|
||||||
|
LEFT JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `iil`.`item_id`=`ib`.`item_id`
|
||||||
|
WHERE `ib`.`item_id` IS NULL
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$itemIds = [];
|
||||||
|
while ($row = $xoopsDB->fetchArray($res)) {
|
||||||
|
$itemIds[] = $row['item_id'];
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
$itemIds = array_unique($itemIds);
|
||||||
|
foreach ($itemIds as $itemId) {
|
||||||
|
$sql = <<< SQL
|
||||||
|
DELETE FROM `${prefix}_xoonips_index_item_link` WHERE `item_id`=$itemId
|
||||||
|
SQL;
|
||||||
|
var_dump($sql);
|
||||||
|
if (!($res = $xoopsDB->queryF($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var_dump($itemIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check baseitem of nimgcenter item
|
||||||
|
function checkNimgCenterBaseItem()
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT `id`.*
|
||||||
|
FROM `${prefix}_xnpnimgcenter_item_detail` AS `id`
|
||||||
|
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `id`.`nimgcenter_id`=`iil`.`item_id`
|
||||||
|
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
||||||
|
LEFT JOIN `${prefix}_xoonips_item_basic` AS `ib` ON `id`.`baseitem_id`=`ib`.`item_id`
|
||||||
|
WHERE `ib`.`item_id` IS NULL
|
||||||
|
AND `iil`.`certify_state`=2
|
||||||
|
AND `idx`.`open_level`=1
|
||||||
|
GROUP BY `id`.`nimgcenter_id`
|
||||||
|
ORDER BY `id`.`nimgcenter_id` ASC
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
while ($detail = $xoopsDB->fetchArray($res)) {
|
||||||
|
echo 'baseitem not found: nimgcenter_item_id:'.$detail['nimgcenter_id'].', baseitem_id:'.$detail['baseitem_id'].PHP_EOL;
|
||||||
|
withdrawItem($detail['nimgcenter_id']);
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// withdraw item
|
||||||
|
function withdrawItem($item_id)
|
||||||
|
{
|
||||||
|
$index_item_link_handler = &xoonips_getormhandler('xoonips', 'index_item_link');
|
||||||
|
$criteria = new CriteriaCompo(new Criteria('item_id', $item_id));
|
||||||
|
$criteria->add(new Criteria('certify_state', 2));
|
||||||
|
$index_item_link_handler->deleteAll($criteria);
|
||||||
|
|
||||||
|
$item_show_handler = &xoonips_getormhandler('xoonips', 'item_show');
|
||||||
|
$item_show_handler->deleteAll(new Criteria('item_id', $item_id));
|
||||||
|
|
||||||
|
$item_status_handler = &xoonips_getormhandler('xoonips', 'item_status');
|
||||||
|
$item_status_handler->updateItemStatus($item_id);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// append nimgcenter info
|
||||||
|
function appendNimgcenterInfo(&$row)
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$coord_type_names = [
|
||||||
|
0 => 'Talairach',
|
||||||
|
1 => 'NMI',
|
||||||
|
2 => 'Unclear',
|
||||||
|
];
|
||||||
|
$item_id = $row['item_id'];
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT `id`.*,
|
||||||
|
`ity`.`display_name` AS `base_type_display_name`
|
||||||
|
FROM `${prefix}_xnpnimgcenter_item_detail` AS `id`
|
||||||
|
INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `id`.`base_type_name`=`ity`.`name`
|
||||||
|
WHERE `id`.`nimgcenter_id`=$item_id
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
while ($detail = $xoopsDB->fetchArray($res)) {
|
||||||
|
MyDumpTool::decode($detail);
|
||||||
|
MyDumpTool::convertToInt($detail, ['baseitem_id', 'coord_type']);
|
||||||
|
$detail['coord_type_name'] = $coord_type_names[$detail['coord_type']];
|
||||||
|
MyDumpTool::dropColumn($detail, ['nimgcenter_id']);
|
||||||
|
$row += $detail;
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT *
|
||||||
|
FROM `${prefix}_xnpnimgcenter_talairach_list`
|
||||||
|
WHERE `nimgcenter_id`=$item_id
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$row['coordinate'] = [];
|
||||||
|
while ($t = $xoopsDB->fetchArray($res)) {
|
||||||
|
MyDumpTool::dropColumn($t, ['nimgcenter_id']);
|
||||||
|
MyDumpTool::convertToInt($t, ['x', 'y', 'z']);
|
||||||
|
$row['coordinate'][] = $t;
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get public indexes
|
||||||
|
function getPublicIndex()
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT
|
||||||
|
`idx`.*,
|
||||||
|
`it`.`title`
|
||||||
|
FROM `${prefix}_xoonips_index` AS `idx`
|
||||||
|
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `idx`.`index_id`=`it`.`item_id`
|
||||||
|
WHERE `it`.`title_id`=0
|
||||||
|
AND `idx`.`open_level`=1
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$tree = [];
|
||||||
|
while ($row = $xoopsDB->fetchArray($res)) {
|
||||||
|
MyDumpTool::decode($row);
|
||||||
|
MyDumpTool::convertToInt($row, ['index_id', 'parent_index_id', 'uid', 'gid', 'open_level', 'sort_number']);
|
||||||
|
$tree[$row['index_id']] = $row;
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
|
||||||
|
return $tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get public indexes by item id
|
||||||
|
function getPublicIndexIdsByItemId($item_id)
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT
|
||||||
|
`iil`.`index_id`
|
||||||
|
FROM `${prefix}_xoonips_index_item_link` AS `iil`
|
||||||
|
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
||||||
|
WHERE `iil`.`item_id`=$item_id
|
||||||
|
AND `idx`.`open_level`=1
|
||||||
|
ORDER BY `iil`.`index_id`
|
||||||
|
SQL;
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$indexes = [];
|
||||||
|
while ($row = $xoopsDB->fetchArray($res)) {
|
||||||
|
MyDumpTool::convertToInt($row, ['index_id']);
|
||||||
|
$indexes[] = $row['index_id'];
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get public items
|
||||||
|
function getPublicItems()
|
||||||
|
{
|
||||||
|
global $xoopsDB;
|
||||||
|
$prefix = $xoopsDB->prefix();
|
||||||
|
$sql = <<< SQL
|
||||||
|
SELECT
|
||||||
|
`ib`.*,
|
||||||
|
GROUP_CONCAT(DISTINCT `it`.`title` ORDER BY `it`.`title_id` ASC SEPARATOR '\n') AS `title`,
|
||||||
|
`ity`.`display_name` AS `item_type_display_name`, `ity`.`name` AS `item_type_name`,
|
||||||
|
`u`.`uname`, `u`.`name`, `u`.`email`
|
||||||
|
FROM `${prefix}_xoonips_item_basic` AS `ib`
|
||||||
|
INNER JOIN `${prefix}_xoonips_item_title` AS `it` ON `ib`.`item_id`=`it`.`item_id`
|
||||||
|
INNER JOIN `${prefix}_xoonips_item_type` AS `ity` ON `ib`.`item_type_id`=`ity`.`item_type_id`
|
||||||
|
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
|
||||||
|
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
||||||
|
LEFT JOIN `${prefix}_users` AS `u` ON `ib`.`uid`=`u`.`uid`
|
||||||
|
WHERE `ity`.`display_name` != 'Index'
|
||||||
|
AND `iil`.`certify_state`=2
|
||||||
|
AND `idx`.`open_level`=1
|
||||||
|
GROUP BY `ib`.`item_id`
|
||||||
|
ORDER BY `ib`.`item_id` ASC
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
if (!($res = $xoopsDB->query($sql))) {
|
||||||
|
var_dump($xoopsDB);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$items = [];
|
||||||
|
$itemIds = [];
|
||||||
|
$baseItemIds = [];
|
||||||
|
while ($row = $xoopsDB->fetchArray($res)) {
|
||||||
|
MyDumpTool::decode($row);
|
||||||
|
MyDumpTool::convertToInt($row, ['item_id', 'item_type_id', 'uid', 'last_update_date', 'creation_date', 'publication_year', 'publication_month', 'publication_mday']);
|
||||||
|
$row['index'] = getPublicIndexIdsByItemId($row['item_id']);
|
||||||
|
if (empty($row['index'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$items[$row['item_id']] = $row;
|
||||||
|
}
|
||||||
|
$xoopsDB->freeRecordSet($res);
|
||||||
|
|
||||||
|
return $items;
|
||||||
|
}
|
465
etc/simpflink.csv
Normal file
@ -0,0 +1,465 @@
|
|||||||
|
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
|
|
64
package.json
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"name": "nimg",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@orrisroot/react-html-parser": "^2.1.1",
|
||||||
|
"@testing-library/jest-dom": "^5.16.4",
|
||||||
|
"@testing-library/react": "^13.3.0",
|
||||||
|
"@testing-library/user-event": "^14.2.1",
|
||||||
|
"@types/async-lock": "^1.1.5",
|
||||||
|
"@types/jest": "^28.1.2",
|
||||||
|
"@types/lokijs": "^1.5.7",
|
||||||
|
"@types/node": "^18.0.0",
|
||||||
|
"@types/react": "^18.0.14",
|
||||||
|
"@types/react-dom": "^18.0.5",
|
||||||
|
"@types/react-router-dom": "^5.3.3",
|
||||||
|
"@types/react-router-hash-link": "^2.4.5",
|
||||||
|
"async-lock": "^1.3.1",
|
||||||
|
"axios": "^0.27.2",
|
||||||
|
"lokijs": "^1.5.12",
|
||||||
|
"moment": "^2.29.3",
|
||||||
|
"rc-tree": "^5.6.5",
|
||||||
|
"react": "^18.2.0",
|
||||||
|
"react-app-polyfill": "^3.0.0",
|
||||||
|
"react-cookie": "^4.1.1",
|
||||||
|
"react-dom": "^18.2.0",
|
||||||
|
"react-ga4": "^1.4.1",
|
||||||
|
"react-helmet-async": "^1.3.0",
|
||||||
|
"react-image-lightbox": "^5.1.4",
|
||||||
|
"react-overlays": "^5.2.0",
|
||||||
|
"react-router-dom": "^6.3.0",
|
||||||
|
"react-router-hash-link": "^2.4.3",
|
||||||
|
"react-scripts": "5.0.1",
|
||||||
|
"react-spinner-material": "^1.4.0",
|
||||||
|
"split-string": "^6.1.0",
|
||||||
|
"typescript": "~4.7.4",
|
||||||
|
"web-vitals": "^2.1.4",
|
||||||
|
"xregexp": "^5.1.1"
|
||||||
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"@svgr/webpack": "^6.2.1"
|
||||||
|
},
|
||||||
|
"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"
|
||||||
|
],
|
||||||
|
"development": [
|
||||||
|
"last 1 chrome version",
|
||||||
|
"last 1 firefox version",
|
||||||
|
"last 1 safari version"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
11
public/.htaccess
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
RewriteEngine on
|
||||||
|
RewriteBase /
|
||||||
|
|
||||||
|
RewriteCond %{QUERY_STRING} (^|&)file_id=([0-9]+)($|&)
|
||||||
|
RewriteRule ^modules/xoonips/download.php /modules/xoonips/file/%2? [R=301,L]
|
||||||
|
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-d [OR]
|
||||||
|
RewriteCond %{REQUEST_FILENAME} -d
|
||||||
|
RewriteCond %{REQUEST_FILENAME}index.html !-f
|
||||||
|
RewriteRule . /index.html [L]
|
BIN
public/favicon.ico
Normal file
After Width: | Height: | Size: 3.6 KiB |
19
public/index.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#000000" />
|
||||||
|
<meta
|
||||||
|
name="description"
|
||||||
|
content="NIMG-PF is the Neuroinformatics site of Neuroimaging under NIJC."
|
||||||
|
/>
|
||||||
|
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
|
||||||
|
<title>NIMG - NeuroImaging Platform</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
15
public/manifest.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"short_name": "NIMG-PF",
|
||||||
|
"name": "NeuroImaging Platform",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "favicon.ico",
|
||||||
|
"sizes": "32x32 16x16",
|
||||||
|
"type": "image/x-icon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"start_url": ".",
|
||||||
|
"display": "standalone",
|
||||||
|
"theme_color": "#000000",
|
||||||
|
"background_color": "#ffffff"
|
||||||
|
}
|
2
public/robots.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# https://www.robotstxt.org/robotstxt.html
|
||||||
|
User-agent: *
|
89
public/rss.xml
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||||
|
<channel>
|
||||||
|
<title>NeuroImaging Platform</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/</link>
|
||||||
|
<description>NIMG-PF is the Neuroinformatics site of Neuroimaging under NIJC.</description>
|
||||||
|
<language>en</language>
|
||||||
|
<item>
|
||||||
|
<title>Age-related effect of serotonin transporter genotype on amygdala and prefrontal cortex function in adolescence.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7998</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:02 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7998</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Age-related effect of serotonin transporter genotype on amygdala and prefrontal cortex function in adolescence.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7999</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:02 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7999</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Altered emotion processing circuits during the anticipation of emotional stimuli in women with borderline personality disorder.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=8002</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:02 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=8002</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Age-related effect of serotonin transporter genotype on amygdala and prefrontal cortex function in adolescence.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=8004</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:02 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=8004</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Altered emotion processing circuits during the anticipation of emotional stimuli in women with borderline personality disorder.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7996</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:02 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7996</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Altered emotion processing circuits during the anticipation of emotional stimuli in women with borderline personality disorder.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7997</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:02 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7997</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Violence-related PTSD and neural activation when seeing emotionally charged male-female interactions.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7984</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:01 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7984</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Valence-specific conflict moderation in the dorso-medial PFC and the caudate head in emotional speech.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7986</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:01 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7986</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Functional alteration in frontolimbic systems relevant to moral judgment in cocaine-dependent subjects.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7988</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:01 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7988</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Functional changes of the reward system underlie blunted response to social gaze in cocaine users.</title>
|
||||||
|
<link>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7991</link>
|
||||||
|
<pubDate>Sat, 11 May 2019 03:21:01 GMT</pubDate>
|
||||||
|
<guid>https://nimg.neuroinf.jp/modules/xoonips/detail.php?item_id=7991</guid>
|
||||||
|
<description></description>
|
||||||
|
<category>Incoming Public Item</category>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
2
src/App.css
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
@import url("./common/assets/xoops.css");
|
||||||
|
@import url("./custom/assets/style.css");
|
10
src/App.test.tsx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { render, screen } from "@testing-library/react";
|
||||||
|
import React from "react";
|
||||||
|
import App from "./App";
|
||||||
|
|
||||||
|
test("renders welcome message", () => {
|
||||||
|
window.scrollTo = () => {};
|
||||||
|
render(<App />);
|
||||||
|
const linkElement = screen.getByText(/NeuroImaging Platform/);
|
||||||
|
expect(linkElement).toBeInTheDocument();
|
||||||
|
});
|
20
src/App.tsx
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { CookiesProvider } from "react-cookie";
|
||||||
|
import { HelmetProvider } from "react-helmet-async";
|
||||||
|
import { BrowserRouter } from "react-router-dom";
|
||||||
|
import "./App.css";
|
||||||
|
import AppRoot from "./common/AppRoot";
|
||||||
|
|
||||||
|
const App: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<BrowserRouter>
|
||||||
|
<CookiesProvider>
|
||||||
|
<HelmetProvider>
|
||||||
|
<AppRoot />
|
||||||
|
</HelmetProvider>
|
||||||
|
</CookiesProvider>
|
||||||
|
</BrowserRouter>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default App;
|
31
src/brainexplorer/BrainExplorer.tsx
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Helmet } from "react-helmet-async";
|
||||||
|
import { Route, Routes } from "react-router-dom";
|
||||||
|
import PageNotFound from "../common/lib/PageNotFound";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import Functions from "../functions";
|
||||||
|
import BrainExplorerIndex from "./BrainExplorerIndex";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const BrainExplorer: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Helmet>
|
||||||
|
<title>Brain Explorer - {Functions.siteTitle(lang)}</title>
|
||||||
|
</Helmet>
|
||||||
|
<Routes>
|
||||||
|
<Route path="index_jm_eng.php" element={<BrainExplorerIndex lang="en" type="jm" />} />
|
||||||
|
<Route path="index_jm_jpn.php" element={<BrainExplorerIndex lang="ja" type="jm" />} />
|
||||||
|
<Route path="index_hu_eng.php" element={<BrainExplorerIndex lang="en" type="hu" />} />
|
||||||
|
<Route path="index_hu_jpn.php" element={<BrainExplorerIndex lang="ja" type="hu" />} />
|
||||||
|
<Route path="*" element={<PageNotFound lang={lang} />} />
|
||||||
|
</Routes>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BrainExplorer;
|
49
src/brainexplorer/BrainExplorerIndex.module.css
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
.panel {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: white;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel::after {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panelNavi {
|
||||||
|
width: 22%;
|
||||||
|
height: 100%;
|
||||||
|
border-right: 2px solid #cccccc;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panelButtons {
|
||||||
|
border-bottom: 2px solid #cccccc;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panelMenu {
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panelMenuAistLink {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panelContent {
|
||||||
|
height: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
float: right;
|
||||||
|
padding: 5px;
|
||||||
|
width: calc(100% - 22% - 2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.panelContent iframe {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
}
|
111
src/brainexplorer/BrainExplorerIndex.tsx
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
import React, { useState } from "react";
|
||||||
|
import { Modal } from "react-overlays";
|
||||||
|
import { Link, useLocation } from "react-router-dom";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import Functions from "../functions";
|
||||||
|
import imageLogoAist from "./assets/images/logo_aist.png";
|
||||||
|
import imageNaviHome from "./assets/images/navi_home.png";
|
||||||
|
import imageNaviInfo from "./assets/images/navi_info.png";
|
||||||
|
import styles from "./BrainExplorerIndex.module.css";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
type: "jm" | "hu";
|
||||||
|
}
|
||||||
|
|
||||||
|
const title = {
|
||||||
|
en: "Brain Atlas Database of Japanese Monkey for WWW.",
|
||||||
|
ja: "脳画像データベース",
|
||||||
|
};
|
||||||
|
const description = {
|
||||||
|
en: "Neuroscience researches for elucidation of brain functions require electrophysiological, pharmacological or anatomical operations into the brain. However, no brain atlas of a Japanese monkey, which is used widely in these experiments, was made except detail maps of the brain stem. We have made magnetic resonance images as well as histological sections of a Japanese monkey brain. For the purpose of the practical and efficient use of these images, we will construct computer database for WWW, in which we can display, magnify, and compare these images by easy mouse operations.",
|
||||||
|
ja: "脳の優れた機能を解明し工学に利用するために、ヒトに近い機能を持った霊長類の神経科学的研究が行われている。脳機能の解明のためには脳の内部に対してさまざまな処置を施す必要がある。例えば、脳の特定の位置に記録、刺激電極を刺入する、薬剤を注入する、局部的に破壊するなどの場合がある。これらの処置に必要な資料は、脳の組織標本である。しかし、研究で良く使われるニホンザルの脳の組織標本は脳幹部を除いては今まで利用できる資料はなかった。そこで脳のMRI(磁気共鳴映像法)連続画像を撮ると共に、高次機能を調べるうえで重要な脳皮質全体を含む組織標本の連続切片を作成した。実験上また文献を読むときなどの資料として有効かつ簡便に活用するために、それらの画像をデジタル化し、マウスの操作のみで簡便に参照できるデータベースを構築し、WWW上で公開する。",
|
||||||
|
};
|
||||||
|
|
||||||
|
const BrainExplorerIndex: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang, type } = props;
|
||||||
|
const [showInfo, setShowInfo] = useState(false);
|
||||||
|
const location = useLocation();
|
||||||
|
const parentUrl = location.pathname.substring(0, location.pathname.lastIndexOf("/"));
|
||||||
|
|
||||||
|
const getUrl = (type: string, lang: MultiLang) => {
|
||||||
|
const label = { en: "eng", ja: "jpn" };
|
||||||
|
return `${parentUrl}/index_${type}_${label[lang]}.php`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderShowInfo = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1>{title[lang]}</h1>
|
||||||
|
<hr />
|
||||||
|
<p>{description[lang]}</p>
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderBrainExplorerContent = () => {
|
||||||
|
const url = `./${type === "hu" ? "human" : "jmonkey"}.html?LANG=${lang === "en" ? "ENG" : "JPN"}`;
|
||||||
|
return <iframe src={url} title="image"></iframe>;
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal show={true}>
|
||||||
|
<div className={styles.panel}>
|
||||||
|
<div className={styles.panelNavi}>
|
||||||
|
<div className={styles.panelButtons}>
|
||||||
|
<Link to="/">
|
||||||
|
<img src={imageNaviHome} alt="HOME" />
|
||||||
|
</Link>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="/"
|
||||||
|
onClick={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
setShowInfo(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img src={imageNaviInfo} alt="INFO" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className={styles.panelMenu}>
|
||||||
|
<h3>Brain Explorer [MRI]</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<Link to={getUrl("jm", lang)} onClick={() => setShowInfo(false)}>
|
||||||
|
{Functions.mlang("[en]Japanese Monkey[/en][ja]ニホンザル[/ja]", lang)}
|
||||||
|
<br />
|
||||||
|
<em>(Macaca fuscata)</em>
|
||||||
|
<br />
|
||||||
|
{Functions.mlang("[en]Developmental Data[/en][ja]発達の様子[/ja]", lang)}
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link to={getUrl("hu", lang)} onClick={() => setShowInfo(false)}>
|
||||||
|
{Functions.mlang("[en]Human[/en][ja]ヒト[/ja]", lang)}
|
||||||
|
<br />
|
||||||
|
<em>(Homo sapiens)</em>
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<hr />
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<Link to={getUrl(type, lang === "en" ? "ja" : "en")}>{Functions.mlang("[en]Japanese page.[/en][ja]English page.[/ja]", lang)}</Link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<hr />
|
||||||
|
<div className={styles.panelMenuAistLink}>
|
||||||
|
<a href="http://www.aist.go.jp/" target="_blank" rel="noopener noreferrer">
|
||||||
|
<img src={imageLogoAist} alt="AIST" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className={styles.panelContent}>{showInfo ? renderShowInfo() : renderBrainExplorerContent()}</div>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BrainExplorerIndex;
|
BIN
src/brainexplorer/assets/images/logo_aist.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
src/brainexplorer/assets/images/navi_home.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
src/brainexplorer/assets/images/navi_info.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
1035
src/brainexplorer/lib/g3d.ts
Normal file
616
src/brainexplorer/lib/m3d.ts
Normal file
@ -0,0 +1,616 @@
|
|||||||
|
export interface M3DHeader {
|
||||||
|
magic: number;
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
z: number;
|
||||||
|
filename: string;
|
||||||
|
subject: string;
|
||||||
|
direction: string;
|
||||||
|
date: number;
|
||||||
|
fov: number;
|
||||||
|
weight: number;
|
||||||
|
ax: number;
|
||||||
|
ay: number;
|
||||||
|
az: number;
|
||||||
|
ox: number;
|
||||||
|
oy: number;
|
||||||
|
oz: number;
|
||||||
|
dlen: number;
|
||||||
|
dth: number;
|
||||||
|
memo: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface M3DImageRenderingContext {
|
||||||
|
a1: number;
|
||||||
|
a2: number;
|
||||||
|
a3: number;
|
||||||
|
b1: number;
|
||||||
|
b2: number;
|
||||||
|
b3: number;
|
||||||
|
c1: number;
|
||||||
|
c2: number;
|
||||||
|
c3: number;
|
||||||
|
d1: number;
|
||||||
|
d2: number;
|
||||||
|
d3: number;
|
||||||
|
ra1: number;
|
||||||
|
ra1_2: number;
|
||||||
|
ra2: number;
|
||||||
|
ra2_2: number;
|
||||||
|
ra3: number;
|
||||||
|
ra3_2: number;
|
||||||
|
rb1: number;
|
||||||
|
rb1_2: number;
|
||||||
|
rb2: number;
|
||||||
|
rb2_2: number;
|
||||||
|
rb3: number;
|
||||||
|
rb3_2: number;
|
||||||
|
rc1: number;
|
||||||
|
rc1_2: number;
|
||||||
|
rc2: number;
|
||||||
|
rc2_2: number;
|
||||||
|
rc3: number;
|
||||||
|
rc3_2: number;
|
||||||
|
rd1: number;
|
||||||
|
rd2: number;
|
||||||
|
rd3: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* MeshLength unit is same as fov unit */
|
||||||
|
const MeshLength = 10;
|
||||||
|
enum DrawingLineType {
|
||||||
|
VLine = 0,
|
||||||
|
VDottedLine = 1,
|
||||||
|
HLine = 2,
|
||||||
|
HDottedLine = 3,
|
||||||
|
}
|
||||||
|
const LineBrightness = 200;
|
||||||
|
const DottedLineBrightness = 128;
|
||||||
|
const EXACTSWITCH: 0 | 1 = 1;
|
||||||
|
const MaxIntensity = 200;
|
||||||
|
|
||||||
|
class M3D {
|
||||||
|
private data: ArrayBuffer;
|
||||||
|
private header: M3DHeader | null = null;
|
||||||
|
private xposView: Int32Array | null = null;
|
||||||
|
private zposView: Int32Array | null = null;
|
||||||
|
private yposView: Int32Array | null = null;
|
||||||
|
private img3dView: Uint8ClampedArray | null = null;
|
||||||
|
private imageSize = 0; // imagesize size : max (size_x, size_y, size_z)
|
||||||
|
private centerX = 0; // camera coordinates origin : x
|
||||||
|
private centerY = 0; // camera coordinates origin : y
|
||||||
|
private centerZ = 0; // camera coordinates origin : z
|
||||||
|
private ox = 0; // object coordinates origin : x
|
||||||
|
private oy = 0; // object coordinates origin : y
|
||||||
|
private oz = 0; // object coordinates origin : z
|
||||||
|
|
||||||
|
constructor(data: ArrayBuffer) {
|
||||||
|
this.data = data;
|
||||||
|
this._initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
isBigEndian(): boolean {
|
||||||
|
return new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x11;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader(): M3DHeader | null {
|
||||||
|
return this.header;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawImage(canvas: HTMLCanvasElement, ax: number, ay: number, az: number, cutdepth: number, th: number, is3d: boolean, mesh: boolean): boolean {
|
||||||
|
const irc: M3DImageRenderingContext = {
|
||||||
|
a1: 0,
|
||||||
|
a2: 0,
|
||||||
|
a3: 0,
|
||||||
|
b1: 0,
|
||||||
|
b2: 0,
|
||||||
|
b3: 0,
|
||||||
|
c1: 0,
|
||||||
|
c2: 0,
|
||||||
|
c3: 0,
|
||||||
|
d1: 0,
|
||||||
|
d2: 0,
|
||||||
|
d3: 0,
|
||||||
|
ra1: 0,
|
||||||
|
ra1_2: 0,
|
||||||
|
ra2: 0,
|
||||||
|
ra2_2: 0,
|
||||||
|
ra3: 0,
|
||||||
|
ra3_2: 0,
|
||||||
|
rb1: 0,
|
||||||
|
rb1_2: 0,
|
||||||
|
rb2: 0,
|
||||||
|
rb2_2: 0,
|
||||||
|
rb3: 0,
|
||||||
|
rb3_2: 0,
|
||||||
|
rc1: 0,
|
||||||
|
rc1_2: 0,
|
||||||
|
rc2: 0,
|
||||||
|
rc2_2: 0,
|
||||||
|
rc3: 0,
|
||||||
|
rc3_2: 0,
|
||||||
|
rd1: 0,
|
||||||
|
rd2: 0,
|
||||||
|
rd3: 0,
|
||||||
|
};
|
||||||
|
// console.log(ax, ay, az, cutdepth, th, dim, mesh)
|
||||||
|
if (this.header === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.width = this.imageSize;
|
||||||
|
canvas.height = this.imageSize;
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
if (ctx === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ctx.fillStyle = 'rgb(0, 0, 0)';
|
||||||
|
ctx.fillRect(0, 0, this.imageSize, this.imageSize);
|
||||||
|
const img = ctx.getImageData(0, 0, this.imageSize, this.imageSize);
|
||||||
|
|
||||||
|
this._setMatrix(ax, ay, az, irc);
|
||||||
|
if (is3d) {
|
||||||
|
const ddimg = [...Array<number>(this.imageSize * this.imageSize)].map(() => 0);
|
||||||
|
this._makeDIMG(img, cutdepth, th, ddimg, irc);
|
||||||
|
this._makeShadingImage(img, ddimg);
|
||||||
|
} else {
|
||||||
|
this._makeSliceImage(img, cutdepth, irc);
|
||||||
|
}
|
||||||
|
if (mesh) {
|
||||||
|
this._drawMesh(img, irc);
|
||||||
|
}
|
||||||
|
ctx.putImageData(img, 0, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _makeDIMG(img: ImageData, cutdepth: number, th: number, ddimg: number[], irc: M3DImageRenderingContext) {
|
||||||
|
if (this.header === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const pdimg = [...Array<number>(this.imageSize * this.imageSize)].map(() => 0);
|
||||||
|
const sw = th > this.header.dth ? 1 : th < this.header.dth ? 2 : EXACTSWITCH;
|
||||||
|
switch (sw) {
|
||||||
|
case 0: {
|
||||||
|
this._transSurface(cutdepth, pdimg, irc);
|
||||||
|
let pos = 0;
|
||||||
|
for (let j = 0; j < this.imageSize; j++) {
|
||||||
|
for (let i = 0; i < this.imageSize; i++, pos++) {
|
||||||
|
ddimg[pos] = pdimg[pos];
|
||||||
|
const pix = this._getPixel(i, j, cutdepth, irc);
|
||||||
|
if (pix > th) {
|
||||||
|
this._drawPixel(img, pos, pix, pix, pix);
|
||||||
|
ddimg[pos] = cutdepth;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: {
|
||||||
|
this._transSurface(cutdepth, pdimg, irc);
|
||||||
|
let pos = 0;
|
||||||
|
for (let y = 0; y < this.imageSize; y++) {
|
||||||
|
for (let x = 0; x < this.imageSize; x++, pos++) {
|
||||||
|
let pdPos = (ddimg[pos] = pdimg[pos]);
|
||||||
|
if (pdPos === 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const pix = this._getPixel(x, y, cutdepth, irc);
|
||||||
|
if (pix > th) {
|
||||||
|
this._drawPixel(img, pos, pix, pix, pix);
|
||||||
|
ddimg[pos] = cutdepth;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pdPos < cutdepth) {
|
||||||
|
pdPos = cutdepth;
|
||||||
|
}
|
||||||
|
ddimg[pos] = 0;
|
||||||
|
for (let z = pdPos; z < this.imageSize; z++) {
|
||||||
|
const pix = this._getPixel(x, y, z, irc);
|
||||||
|
if (pix > th) {
|
||||||
|
ddimg[pos] = z;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
let pos = 0;
|
||||||
|
for (let y = 0; y < this.imageSize; y++) {
|
||||||
|
for (let x = 0; x < this.imageSize; x++, pos++) {
|
||||||
|
ddimg[pos] = 0;
|
||||||
|
for (let z = cutdepth; z < this.imageSize; z++) {
|
||||||
|
const pix = this._getPixel(x, y, z, irc);
|
||||||
|
if (pix > th) {
|
||||||
|
if (z === cutdepth) {
|
||||||
|
this._drawPixel(img, pos, pix, pix, pix);
|
||||||
|
} else {
|
||||||
|
ddimg[pos] = z;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _makeShadingImage(img: ImageData, ddimg: number[]) {
|
||||||
|
let pos = 0;
|
||||||
|
for (let x = 0; x < this.imageSize; x++) {
|
||||||
|
for (let y = 0; y < this.imageSize; y++, pos++) {
|
||||||
|
const base = pos * 4;
|
||||||
|
if (img.data[base] === 0) {
|
||||||
|
let timg2d = 0;
|
||||||
|
if (x < this.imageSize - 2 && y < this.imageSize - 2) {
|
||||||
|
if (ddimg[pos] !== 0) {
|
||||||
|
const nx = (ddimg[pos] + ddimg[pos + this.imageSize] - ddimg[pos + 2] - ddimg[pos + 2 + this.imageSize]) / 4.0;
|
||||||
|
const ny = (ddimg[pos] + ddimg[pos + 1] - ddimg[pos + this.imageSize * 2] - ddimg[pos + 1 + this.imageSize * 2]) / 4.0;
|
||||||
|
const n = Math.sqrt(nx * nx + ny * ny + 1);
|
||||||
|
timg2d = Math.round(MaxIntensity / n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._drawPixel(img, pos, timg2d, timg2d, timg2d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _makeSliceImage(img: ImageData, cutdepth: number, irc: M3DImageRenderingContext) {
|
||||||
|
let pos = 0;
|
||||||
|
for (let y = 0; y < this.imageSize; y++) {
|
||||||
|
for (let x = 0; x < this.imageSize; x++, pos++) {
|
||||||
|
const pix = this._getPixel(x, y, cutdepth, irc);
|
||||||
|
this._drawPixel(img, pos, pix, pix, pix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _drawMesh(img: ImageData, irc: M3DImageRenderingContext) {
|
||||||
|
let origx: number;
|
||||||
|
let origy: number;
|
||||||
|
if (this.header === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.header.ox !== 0 && this.header.oy !== 0) {
|
||||||
|
origx = this.header.ox * irc.ra1 + this.header.oy * irc.rb1 + this.header.oz * irc.rc1 + irc.rd1;
|
||||||
|
origy = this.header.ox * irc.ra2 + this.header.oy * irc.rb2 + this.header.oz * irc.rc2 + irc.rd2;
|
||||||
|
} else {
|
||||||
|
origx = this.centerX;
|
||||||
|
origy = this.centerY;
|
||||||
|
}
|
||||||
|
origx = this._fround(origx, 5);
|
||||||
|
origy = this._fround(origy, 5);
|
||||||
|
|
||||||
|
const band = (this.header.x * MeshLength) / this.header.fov;
|
||||||
|
const r = 0;
|
||||||
|
const g = 0;
|
||||||
|
const b = LineBrightness;
|
||||||
|
const sr = 0;
|
||||||
|
const sg = 0;
|
||||||
|
const sb = DottedLineBrightness;
|
||||||
|
this._drawLine(img, Math.round(origx), r, g, b, DrawingLineType.VLine);
|
||||||
|
this._drawLine(img, Math.round(origy), r, g, b, DrawingLineType.HLine);
|
||||||
|
for (let pos = Math.round(origx) + band; pos < this.imageSize; pos += band) {
|
||||||
|
this._drawLine(img, Math.round(pos), sr, sg, sb, DrawingLineType.VDottedLine);
|
||||||
|
}
|
||||||
|
for (let pos = Math.round(origx) - band; pos >= 0; pos -= band) {
|
||||||
|
this._drawLine(img, Math.round(pos), sr, sg, sb, DrawingLineType.VDottedLine);
|
||||||
|
}
|
||||||
|
for (let pos = Math.round(origy) + band; pos < this.imageSize; pos += band) {
|
||||||
|
this._drawLine(img, Math.round(pos), sr, sg, sb, DrawingLineType.HDottedLine);
|
||||||
|
}
|
||||||
|
for (let pos = Math.round(origy) - band; pos >= 0; pos -= band) {
|
||||||
|
this._drawLine(img, Math.round(pos), sr, sg, sb, DrawingLineType.HDottedLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _drawLine(img: ImageData, value: number, r: number, g: number, b: number, type: DrawingLineType) {
|
||||||
|
switch (type) {
|
||||||
|
case DrawingLineType.VLine: {
|
||||||
|
let pos = value;
|
||||||
|
for (let y = 0; y < this.imageSize; y++, pos += this.imageSize) {
|
||||||
|
this._drawPixel(img, pos, r, g, b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DrawingLineType.VDottedLine: {
|
||||||
|
let pos = value;
|
||||||
|
for (let y = 0; y < this.imageSize; y += 2, pos += this.imageSize * 2) {
|
||||||
|
this._drawPixel(img, pos, r, g, b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DrawingLineType.HLine: {
|
||||||
|
let pos = value * this.imageSize;
|
||||||
|
for (let x = 0; x < this.imageSize; x++, pos++) {
|
||||||
|
this._drawPixel(img, pos, r, g, b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DrawingLineType.HDottedLine: {
|
||||||
|
let pos = value * this.imageSize;
|
||||||
|
for (let x = 0; x < this.imageSize; x += 2, pos += 2) {
|
||||||
|
this._drawPixel(img, pos, r, g, b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _drawPixel(img: ImageData, pos: number, r: number, g: number, b: number) {
|
||||||
|
let base = pos * 4;
|
||||||
|
img.data[base++] = r;
|
||||||
|
img.data[base++] = g;
|
||||||
|
img.data[base++] = b;
|
||||||
|
img.data[base] = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _getPixel(x: number, y: number, z: number, irc: M3DImageRenderingContext): number {
|
||||||
|
const len = [...Array<number>(8)].map(() => 0);
|
||||||
|
const ratio = [...Array<number>(8)].map(() => 0);
|
||||||
|
|
||||||
|
const tx = x * irc.a1 + y * irc.b1 + z * irc.c1 + irc.d1;
|
||||||
|
const ty = x * irc.a2 + y * irc.b2 + z * irc.c2 + irc.d2;
|
||||||
|
const tz = x * irc.a3 + y * irc.b3 + z * irc.c3 + irc.d3;
|
||||||
|
|
||||||
|
let ix = Math.floor(tx);
|
||||||
|
let iy = Math.floor(ty);
|
||||||
|
let iz = Math.floor(tz);
|
||||||
|
|
||||||
|
if (this.header === null || this.img3dView === null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ix < 0 || ix + 1 >= this.header.x || iy < 0 || iy + 1 >= this.header.y || iz < 0 || iz + 1 >= this.header.z) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ax1 = Math.abs(tx - ix);
|
||||||
|
const ax2 = Math.abs(1 - ax1);
|
||||||
|
const ay1 = Math.abs(ty - iy);
|
||||||
|
const ay2 = Math.abs(1 - ay1);
|
||||||
|
const az1 = Math.abs(tz - iz);
|
||||||
|
const az2 = Math.abs(1 - az1);
|
||||||
|
|
||||||
|
let sumlen1 = 0;
|
||||||
|
for (let i = 0; i < 8; i++) {
|
||||||
|
len[i] = i & 1 ? ax2 : ax1;
|
||||||
|
len[i] += i & 2 ? ay2 : ay1;
|
||||||
|
len[i] += i & 4 ? az2 : az1;
|
||||||
|
if (len[i] < 0.001) {
|
||||||
|
ix += i & 1 ? 1 : 0;
|
||||||
|
iy += i & 2 ? 1 : 0;
|
||||||
|
iz += i & 4 ? 1 : 0;
|
||||||
|
return this.img3dView[ix + iy * this.header.x + iz * this.header.x * this.header.y];
|
||||||
|
}
|
||||||
|
sumlen1 += ratio[i] = 1 / len[i];
|
||||||
|
}
|
||||||
|
let pos = ix + iy * this.header.x + iz * this.header.x * this.header.y;
|
||||||
|
let sumlen2 = this.img3dView[pos] * ratio[0];
|
||||||
|
sumlen2 += this.img3dView[pos + 1] * ratio[1];
|
||||||
|
sumlen2 += this.img3dView[pos + this.header.x] * ratio[2];
|
||||||
|
sumlen2 += this.img3dView[pos + 1 + this.header.x] * ratio[3];
|
||||||
|
pos += this.header.x * this.header.y;
|
||||||
|
sumlen2 += this.img3dView[pos] * ratio[4];
|
||||||
|
sumlen2 += this.img3dView[pos + 1] * ratio[5];
|
||||||
|
sumlen2 += this.img3dView[pos + this.header.x] * ratio[6];
|
||||||
|
sumlen2 += this.img3dView[pos + 1 + this.header.x] * ratio[7];
|
||||||
|
|
||||||
|
return Math.round(sumlen2 / sumlen1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _transSurface(cutdepth: number, pdimg: number[], irc: M3DImageRenderingContext) {
|
||||||
|
if (this.header === null || this.xposView === null || this.yposView === null || this.zposView === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const ix = [...Array<number>(8)].map(() => 0);
|
||||||
|
const iy = [...Array<number>(8)].map(() => 0);
|
||||||
|
const iz = [...Array<number>(8)].map(() => 0);
|
||||||
|
for (let i = 0; i < this.header.dlen; i++) {
|
||||||
|
const x = this.xposView[i];
|
||||||
|
const y = this.yposView[i];
|
||||||
|
const z = this.zposView[i];
|
||||||
|
ix[0] = x * irc.ra1 + y * irc.rb1 + z * irc.rc1 + irc.rd1;
|
||||||
|
iy[0] = x * irc.ra2 + y * irc.rb2 + z * irc.rc2 + irc.rd2;
|
||||||
|
iz[0] = x * irc.ra3 + y * irc.rb3 + z * irc.rc3 + irc.rd3;
|
||||||
|
ix[1] = ix[0] + irc.ra1_2;
|
||||||
|
iy[1] = iy[0] + irc.ra2_2;
|
||||||
|
iz[1] = iz[0] + irc.ra3_2;
|
||||||
|
ix[2] = ix[0] + irc.rb1_2;
|
||||||
|
iy[2] = iy[0] + irc.rb2_2;
|
||||||
|
iz[2] = iz[0] + irc.rb3_2;
|
||||||
|
ix[3] = ix[0] + irc.rc1_2;
|
||||||
|
iy[3] = iy[0] + irc.rc2_2;
|
||||||
|
iz[3] = iz[0] + irc.rc3_2;
|
||||||
|
ix[4] = ix[1] + irc.rb1_2;
|
||||||
|
iy[4] = iy[1] + irc.rb2_2;
|
||||||
|
iz[4] = iz[1] + irc.rb3_2;
|
||||||
|
ix[5] = ix[1] + irc.rc1_2;
|
||||||
|
iy[5] = iy[1] + irc.rc2_2;
|
||||||
|
iz[5] = iz[1] + irc.rc3_2;
|
||||||
|
ix[6] = ix[2] + irc.rc1_2;
|
||||||
|
iy[6] = iy[2] + irc.rc2_2;
|
||||||
|
iz[6] = iz[2] + irc.rc3_2;
|
||||||
|
ix[7] = ix[4] + irc.rc1_2;
|
||||||
|
iy[7] = iy[4] + irc.rc2_2;
|
||||||
|
iz[7] = iz[4] + irc.rc3_2;
|
||||||
|
for (let j = 0; j < 8; j++) {
|
||||||
|
const xi = Math.round(ix[j]);
|
||||||
|
const yi = Math.round(iy[j]);
|
||||||
|
if (xi < 0 || xi >= this.imageSize || yi < 0 || yi >= this.imageSize || iz[j] < cutdepth || iz[j] >= this.imageSize) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const pos = xi + yi * this.imageSize;
|
||||||
|
if (pdimg[pos] === 0 || pdimg[pos] > iz[j]) {
|
||||||
|
pdimg[pos] = iz[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _setMatrix(x: number, y: number, z: number, irc: M3DImageRenderingContext) {
|
||||||
|
const xtr = [...Array<number>(9)].map(() => 0);
|
||||||
|
const ytr = [...Array<number>(9)].map(() => 0);
|
||||||
|
const ztr = [...Array<number>(9)].map(() => 0);
|
||||||
|
const tmp = [...Array<number>(9)].map(() => 0);
|
||||||
|
const tr = [...Array<number>(9)].map(() => 0);
|
||||||
|
this._setXtr(xtr, (x * Math.PI) / 180.0);
|
||||||
|
this._setYtr(ytr, (y * Math.PI) / 180.0);
|
||||||
|
this._setZtr(ztr, (z * Math.PI) / 180.0);
|
||||||
|
this._multi(ytr, xtr, tmp);
|
||||||
|
this._multi(ztr, tmp, tr);
|
||||||
|
irc.a1 = tr[0];
|
||||||
|
irc.b1 = tr[1];
|
||||||
|
irc.c1 = tr[2];
|
||||||
|
irc.a2 = tr[3];
|
||||||
|
irc.b2 = tr[4];
|
||||||
|
irc.c2 = tr[5];
|
||||||
|
irc.a3 = tr[6];
|
||||||
|
irc.b3 = tr[7];
|
||||||
|
irc.c3 = tr[8];
|
||||||
|
irc.d1 = -irc.a1 * this.centerX - irc.b1 * this.centerY - irc.c1 * this.centerZ + this.ox;
|
||||||
|
irc.d2 = -irc.a2 * this.centerX - irc.b2 * this.centerY - irc.c2 * this.centerZ + this.oy;
|
||||||
|
irc.d3 = -irc.a3 * this.centerX - irc.b3 * this.centerY - irc.c3 * this.centerZ + this.oz;
|
||||||
|
|
||||||
|
this._setXtr(xtr, (-x * Math.PI) / 180.0);
|
||||||
|
this._setYtr(ytr, (-y * Math.PI) / 180.0);
|
||||||
|
this._setZtr(ztr, (-z * Math.PI) / 180.0);
|
||||||
|
this._multi(ytr, ztr, tmp);
|
||||||
|
this._multi(xtr, tmp, tr);
|
||||||
|
irc.ra1 = tr[0];
|
||||||
|
irc.rb1 = tr[1];
|
||||||
|
irc.rc1 = tr[2];
|
||||||
|
irc.ra2 = tr[3];
|
||||||
|
irc.rb2 = tr[4];
|
||||||
|
irc.rc2 = tr[5];
|
||||||
|
irc.ra3 = tr[6];
|
||||||
|
irc.rb3 = tr[7];
|
||||||
|
irc.rc3 = tr[8];
|
||||||
|
irc.rd1 = -irc.ra1 * this.ox - irc.rb1 * this.oy - irc.rc1 * this.oz + this.centerX;
|
||||||
|
irc.rd2 = -irc.ra2 * this.ox - irc.rb2 * this.oy - irc.rc2 * this.oz + this.centerY;
|
||||||
|
irc.rd3 = -irc.ra3 * this.ox - irc.rb3 * this.oy - irc.rc3 * this.oz + this.centerZ;
|
||||||
|
irc.ra1_2 = irc.ra1 / 2;
|
||||||
|
irc.rb1_2 = irc.rb1 / 2;
|
||||||
|
irc.rc1_2 = irc.rc1 / 2;
|
||||||
|
irc.ra2_2 = irc.ra2 / 2;
|
||||||
|
irc.rb2_2 = irc.rb2 / 2;
|
||||||
|
irc.rc2_2 = irc.rc2 / 2;
|
||||||
|
irc.ra3_2 = irc.ra3 / 2;
|
||||||
|
irc.rb3_2 = irc.rb3 / 2;
|
||||||
|
irc.rc3_2 = irc.rc3 / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _setXtr(xtr: number[], ang: number) {
|
||||||
|
xtr[0] = 1;
|
||||||
|
xtr[1] = 0;
|
||||||
|
xtr[2] = 0;
|
||||||
|
xtr[3] = 0;
|
||||||
|
xtr[4] = Math.cos(ang);
|
||||||
|
xtr[5] = -Math.sin(ang);
|
||||||
|
xtr[6] = 0;
|
||||||
|
xtr[7] = Math.sin(ang);
|
||||||
|
xtr[8] = Math.cos(ang);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _setYtr(ytr: number[], ang: number) {
|
||||||
|
ytr[0] = Math.cos(ang);
|
||||||
|
ytr[1] = 0;
|
||||||
|
ytr[2] = Math.sin(ang);
|
||||||
|
ytr[3] = 0;
|
||||||
|
ytr[4] = 1;
|
||||||
|
ytr[5] = 0;
|
||||||
|
ytr[6] = -Math.sin(ang);
|
||||||
|
ytr[7] = 0;
|
||||||
|
ytr[8] = Math.cos(ang);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _setZtr(ztr: number[], ang: number) {
|
||||||
|
ztr[0] = Math.cos(ang);
|
||||||
|
ztr[1] = -Math.sin(ang);
|
||||||
|
ztr[2] = 0;
|
||||||
|
ztr[3] = Math.sin(ang);
|
||||||
|
ztr[4] = Math.cos(ang);
|
||||||
|
ztr[5] = 0;
|
||||||
|
ztr[6] = 0;
|
||||||
|
ztr[7] = 0;
|
||||||
|
ztr[8] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _multi(l: number[], r: number[], a: number[]) {
|
||||||
|
a[0] = l[0] * r[0] + l[1] * r[3] + l[2] * r[6];
|
||||||
|
a[3] = l[3] * r[0] + l[4] * r[3] + l[5] * r[6];
|
||||||
|
a[6] = l[6] * r[0] + l[7] * r[3] + l[8] * r[6];
|
||||||
|
a[1] = l[0] * r[1] + l[1] * r[4] + l[2] * r[7];
|
||||||
|
a[4] = l[3] * r[1] + l[4] * r[4] + l[5] * r[7];
|
||||||
|
a[7] = l[6] * r[1] + l[7] * r[4] + l[8] * r[7];
|
||||||
|
a[2] = l[0] * r[2] + l[1] * r[5] + l[2] * r[8];
|
||||||
|
a[5] = l[3] * r[2] + l[4] * r[5] + l[5] * r[8];
|
||||||
|
a[8] = l[6] * r[2] + l[7] * r[5] + l[8] * r[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
private _fround(x: number, n: number) {
|
||||||
|
return Math.round(x * Math.pow(10, n)) / Math.pow(10, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _initialize(): void {
|
||||||
|
const view = new DataView(this.data);
|
||||||
|
const magic = view.getInt32(0, true);
|
||||||
|
const isLittleEndianFile = magic === 0x4d523344;
|
||||||
|
if (!isLittleEndianFile && magic !== 0x4433524d) {
|
||||||
|
console.log('invalid data format, this data is not m3d format');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let offset = 0;
|
||||||
|
const decoder = new TextDecoder('utf-8');
|
||||||
|
this.header = {
|
||||||
|
magic: view.getInt32(offset, isLittleEndianFile),
|
||||||
|
x: view.getInt32((offset += 4), isLittleEndianFile),
|
||||||
|
y: view.getInt32((offset += 4), isLittleEndianFile),
|
||||||
|
z: view.getInt32((offset += 4), isLittleEndianFile),
|
||||||
|
filename: decoder.decode(new Uint8Array(this.data, (offset += 4), 256)).replace(/\0+$/, ''),
|
||||||
|
subject: decoder.decode(new Uint8Array(this.data, (offset += 256), 256)).replace(/\0+$/, ''),
|
||||||
|
direction: decoder.decode(new Uint8Array(this.data, (offset += 256), 4)).replace(/\0+$/, ''),
|
||||||
|
date: view.getUint32((offset += 4), isLittleEndianFile),
|
||||||
|
fov: view.getFloat64((offset += 4), isLittleEndianFile),
|
||||||
|
weight: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
ax: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
ay: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
az: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
ox: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
oy: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
oz: view.getFloat64((offset += 8), isLittleEndianFile),
|
||||||
|
dlen: view.getInt32((offset += 8), isLittleEndianFile),
|
||||||
|
dth: view.getInt32((offset += 4), isLittleEndianFile),
|
||||||
|
memo: decoder.decode(new Uint8Array(this.data, (offset += 4), 256)).replace(/\0+$/, ''),
|
||||||
|
};
|
||||||
|
// swap byte order if endian is not matched
|
||||||
|
if ((this.isBigEndian() && isLittleEndianFile) || (!this.isBigEndian() && !isLittleEndianFile)) {
|
||||||
|
const start = 864;
|
||||||
|
const end = start + this.header.dlen * 4 * 3;
|
||||||
|
for (let i = start; i < end; i += 4) {
|
||||||
|
const data = new Uint8Array(this.data, i, 4);
|
||||||
|
data.reverse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.xposView = new Int32Array(this.data, 864, this.header.dlen);
|
||||||
|
this.yposView = new Int32Array(this.data, 864 + this.header.dlen * 4, this.header.dlen);
|
||||||
|
this.zposView = new Int32Array(this.data, 864 + this.header.dlen * 8, this.header.dlen);
|
||||||
|
this.img3dView = new Uint8ClampedArray(this.data, 864 + this.header.dlen * 12, this.header.x * this.header.y * this.header.z);
|
||||||
|
// set image generation offset
|
||||||
|
this.imageSize = Math.ceil(Math.max(this.header.x, this.header.y, this.header.z) * Math.sqrt(3.0)) + 1;
|
||||||
|
this.centerX = (this.imageSize - 1) / 2.0;
|
||||||
|
this.centerY = (this.imageSize - 1) / 2.0;
|
||||||
|
this.centerZ = (this.imageSize - 1) / 2.0;
|
||||||
|
this.ox = (this.header.x - 1) / 2.0;
|
||||||
|
this.oy = (this.header.y - 1) / 2.0;
|
||||||
|
this.oz = (this.header.z - 1) / 2.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default M3D;
|
41
src/common/AppRoot.tsx
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { useCookies } from "react-cookie";
|
||||||
|
import ReactGA from "react-ga4";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
import Config, { MultiLang } from "../config";
|
||||||
|
import Page from "../custom/Page";
|
||||||
|
|
||||||
|
const AppMain: React.FC = () => {
|
||||||
|
const [cookies, setCookie] = useCookies();
|
||||||
|
const [lang, setLang] = useState<MultiLang>(["en", "ja"].includes(cookies.ml_lang) ? cookies.ml_lang : "en");
|
||||||
|
const location = useLocation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== "") {
|
||||||
|
ReactGA.send("pageview");
|
||||||
|
}
|
||||||
|
const params = new URLSearchParams(location.search);
|
||||||
|
const ml_lang = params.get("ml_lang");
|
||||||
|
if (ml_lang != null && ["en", "ja"].includes(ml_lang)) {
|
||||||
|
if (cookies.ml_lang !== ml_lang) {
|
||||||
|
setCookie("ml_lang", ml_lang);
|
||||||
|
}
|
||||||
|
if (lang !== ml_lang) {
|
||||||
|
setLang(ml_lang as MultiLang);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
}, [cookies, setCookie, lang, location]);
|
||||||
|
|
||||||
|
return <Page lang={lang} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
const AppRoot: React.FC = () => {
|
||||||
|
if (Config.GOOGLE_ANALYTICS_TRACKING_ID !== "") {
|
||||||
|
ReactGA.initialize(Config.GOOGLE_ANALYTICS_TRACKING_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return <AppMain />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AppRoot;
|
35
src/common/XoopsPathRedirect.tsx
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Navigate } from "react-router";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import PageNotFound from "./lib/PageNotFound";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const XoopsPathRedirect: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
const location = useLocation();
|
||||||
|
|
||||||
|
const getRedirectUrl = () => {
|
||||||
|
const { pathname } = location;
|
||||||
|
switch (pathname || "") {
|
||||||
|
case "/index.php": {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
if (location.pathname === "/") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const url = getRedirectUrl();
|
||||||
|
if (url === "") {
|
||||||
|
return <PageNotFound lang={lang} />;
|
||||||
|
}
|
||||||
|
return <Navigate to={url} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default XoopsPathRedirect;
|
BIN
src/common/assets/images/mlang_english.gif
Normal file
After Width: | Height: | Size: 175 B |
BIN
src/common/assets/images/mlang_japanese.gif
Normal file
After Width: | Height: | Size: 126 B |
BIN
src/common/assets/images/no_avatar.gif
Normal file
After Width: | Height: | Size: 985 B |
BIN
src/common/assets/images/pagact.gif
Normal file
After Width: | Height: | Size: 121 B |
BIN
src/common/assets/images/paginact.gif
Normal file
After Width: | Height: | Size: 121 B |
BIN
src/common/assets/images/pagneutral.gif
Normal file
After Width: | Height: | Size: 121 B |
BIN
src/common/assets/images/rank3dbf8e94a6f72.gif
Normal file
After Width: | Height: | Size: 905 B |
BIN
src/common/assets/images/rank3dbf8e9e7d88d.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/common/assets/images/rank3dbf8ea81e642.gif
Normal file
After Width: | Height: | Size: 894 B |
BIN
src/common/assets/images/rank3dbf8eb1a72e7.gif
Normal file
After Width: | Height: | Size: 856 B |
BIN
src/common/assets/images/rank3dbf8edf15093.gif
Normal file
After Width: | Height: | Size: 789 B |
BIN
src/common/assets/images/rank3dbf8ee8681cd.gif
Normal file
After Width: | Height: | Size: 779 B |
BIN
src/common/assets/images/rank3e632f95e81ca.gif
Normal file
After Width: | Height: | Size: 475 B |
BIN
src/common/assets/images/smil3dbd4bf386b36.gif
Normal file
After Width: | Height: | Size: 210 B |
BIN
src/common/assets/images/smil3dbd4d4e4c4f2.gif
Normal file
After Width: | Height: | Size: 204 B |
BIN
src/common/assets/images/smil3dbd4d6422f04.gif
Normal file
After Width: | Height: | Size: 174 B |
BIN
src/common/assets/images/smil3dbd4d75edb5e.gif
Normal file
After Width: | Height: | Size: 204 B |
BIN
src/common/assets/images/smil3dbd4d8676346.gif
Normal file
After Width: | Height: | Size: 176 B |
BIN
src/common/assets/images/smil3dbd4d99c6eaa.gif
Normal file
After Width: | Height: | Size: 207 B |
BIN
src/common/assets/images/smil3dbd4daabd491.gif
Normal file
After Width: | Height: | Size: 170 B |
BIN
src/common/assets/images/smil3dbd4dbc14f3f.gif
Normal file
After Width: | Height: | Size: 210 B |
BIN
src/common/assets/images/smil3dbd4dcd7b9f4.gif
Normal file
After Width: | Height: | Size: 278 B |
BIN
src/common/assets/images/smil3dbd4ddd6835f.gif
Normal file
After Width: | Height: | Size: 202 B |
BIN
src/common/assets/images/smil3dbd4df1944ee.gif
Normal file
After Width: | Height: | Size: 678 B |
BIN
src/common/assets/images/smil3dbd4e02c5440.gif
Normal file
After Width: | Height: | Size: 263 B |
BIN
src/common/assets/images/smil3dbd4e1748cc9.gif
Normal file
After Width: | Height: | Size: 209 B |
BIN
src/common/assets/images/smil3dbd4e29bbcc7.gif
Normal file
After Width: | Height: | Size: 492 B |
BIN
src/common/assets/images/smil3dbd4e398ff7b.gif
Normal file
After Width: | Height: | Size: 205 B |
BIN
src/common/assets/images/smil3dbd4e4c2e742.gif
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
src/common/assets/images/smil3dbd4e5e7563a.gif
Normal file
After Width: | Height: | Size: 736 B |
BIN
src/common/assets/images/smil3dbd4e7853679.gif
Normal file
After Width: | Height: | Size: 273 B |
17
src/common/assets/xoops.css
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
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;}
|
33
src/common/lib/LangFlag.tsx
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Link, useLocation } from "react-router-dom";
|
||||||
|
import { MultiLang } from "../../config";
|
||||||
|
import mlangEnglish from "../assets/images/mlang_english.gif";
|
||||||
|
import mlangJapanese from "../assets/images/mlang_japanese.gif";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
className?: string;
|
||||||
|
image?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const langResources = {
|
||||||
|
en: { image: mlangEnglish, title: "English" },
|
||||||
|
ja: { image: mlangJapanese, title: "Japanese" },
|
||||||
|
};
|
||||||
|
|
||||||
|
const LangFlag: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang, className, image } = props;
|
||||||
|
const location = useLocation();
|
||||||
|
const params = new URLSearchParams(location.search);
|
||||||
|
const flagLang = lang === "en" ? "ja" : "en";
|
||||||
|
params.set("ml_lang", flagLang);
|
||||||
|
const url = location.pathname + "?" + params.toString();
|
||||||
|
const imageSrc = image || langResources[flagLang].image;
|
||||||
|
return (
|
||||||
|
<Link className={className} to={url}>
|
||||||
|
<img src={imageSrc} alt={langResources[flagLang].title} title={langResources[flagLang].title} />
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LangFlag;
|
12
src/common/lib/Loading.tsx
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import React from "react";
|
||||||
|
import Spinner from "react-spinner-material";
|
||||||
|
|
||||||
|
const Loading: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<div style={{ display: "flex", justifyContent: "center", alignContent: "center", margin: "100px 0" }}>
|
||||||
|
<Spinner radius={60} color={"#cccccc"} stroke={8} visible={true} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Loading;
|
15
src/common/lib/NoticeSiteHasBeenArchived.tsx
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { MultiLang } from "../../config";
|
||||||
|
import Functions from "../../functions";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NoticeSiteHasBeenArchived: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
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;
|
50
src/common/lib/PageNotFound.tsx
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import React, { useEffect } from "react";
|
||||||
|
import { Helmet } from "react-helmet-async";
|
||||||
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
|
import { MultiLang } from "../../config";
|
||||||
|
import Functions from "../../functions";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PageNotFound: React.FC<Props> = (props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
const location = useLocation();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const url = "/";
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let timer: NodeJS.Timeout | null = null;
|
||||||
|
if (location.pathname !== "/" && process.env.NODE_ENV === "production") {
|
||||||
|
if (timer === null) {
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
navigate(url);
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
if (timer !== null) {
|
||||||
|
clearTimeout(timer);
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, [location, navigate]);
|
||||||
|
|
||||||
|
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={url}>here</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PageNotFound;
|
132
src/common/lib/XoopsCode.tsx
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import ReactHtmlParser, { convertNodeToElement, DomElement, DomNode, Transform } from "@orrisroot/react-html-parser";
|
||||||
|
import React from "react";
|
||||||
|
import { HashLink } from "react-router-hash-link";
|
||||||
|
import { MultiLang } from "../../config";
|
||||||
|
import Functions from "../../functions";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
text: string;
|
||||||
|
dohtml?: boolean;
|
||||||
|
dosmiley?: boolean;
|
||||||
|
doxcode?: boolean;
|
||||||
|
doimage?: boolean;
|
||||||
|
dobr?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const preConvertXCode = (text: string, doxcode: boolean): string => {
|
||||||
|
if (doxcode) {
|
||||||
|
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\]/gs, (m0, m1) => {
|
||||||
|
const text = convertXCode(Functions.htmlspecialchars(Functions.base64Decode(m1)), doimage);
|
||||||
|
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>";
|
||||||
|
});
|
||||||
|
return text;
|
||||||
|
};
|
||||||
|
|
||||||
|
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 />");
|
||||||
|
};
|
||||||
|
|
||||||
|
const cssConvert = (text: string): object => {
|
||||||
|
const ret: any = {};
|
||||||
|
text.split(";").forEach((line) => {
|
||||||
|
const line_ = line.trim();
|
||||||
|
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 xoopsTransform: Transform = (node: DomNode, index: number | string, transform?: Transform): React.ReactNode => {
|
||||||
|
if (node.type === "tag") {
|
||||||
|
const node_ = node as DomElement;
|
||||||
|
if (node_.name === "a") {
|
||||||
|
const url = node_.attribs?.["href"] || "/";
|
||||||
|
const download = (node_.attribs && node_.attribs["download"]) || "";
|
||||||
|
const rel = (node_.attribs && node_.attribs["rel"]) || "";
|
||||||
|
const klass = (node_.attribs && node_.attribs["class"]) || "";
|
||||||
|
const isFile = download !== "" || /\.(zip|pdf|png|gif|jpg)$/.test(url);
|
||||||
|
const isExternal = /external/.test(rel) || /external/.test(klass) || /^(mailto|https?:?\/\/)/.test(url);
|
||||||
|
if (!isFile && !isExternal) {
|
||||||
|
const style = node_.attribs?.["style"] || "";
|
||||||
|
const title = node_.attribs?.["title"];
|
||||||
|
return (
|
||||||
|
<HashLink key={index} to={url} style={cssConvert(style)} title={title}>
|
||||||
|
{node_.children.map((value: DomNode, index: number) => {
|
||||||
|
return convertNodeToElement(value, index, transform);
|
||||||
|
})}
|
||||||
|
</HashLink>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (node_.name === "img") {
|
||||||
|
const src = (node_.attribs && node_.attribs["src"]) || "";
|
||||||
|
node_.attribs["src"] = src.replace("`XOOPS_URL`", process.env.PUBLIC_URL);
|
||||||
|
return convertNodeToElement(node_, index, transform);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const XoopsCode: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
let text = props.text;
|
||||||
|
const dohtml = !!props.dohtml;
|
||||||
|
const dosmiley = !!props.dosmiley;
|
||||||
|
const doxcode = !!props.doxcode;
|
||||||
|
const doimage = !!props.doimage;
|
||||||
|
const dobr = !!props.dobr;
|
||||||
|
text = preConvertXCode(text, doxcode);
|
||||||
|
if (!dohtml) {
|
||||||
|
text = Functions.htmlspecialchars(text);
|
||||||
|
text = convertClickable(text);
|
||||||
|
}
|
||||||
|
if (dosmiley) {
|
||||||
|
text = convertSmiley(text);
|
||||||
|
}
|
||||||
|
if (doxcode) {
|
||||||
|
text = convertXCode(text, doimage);
|
||||||
|
}
|
||||||
|
if (dobr) {
|
||||||
|
text = convertBr(text);
|
||||||
|
}
|
||||||
|
text = postConvertXCode(text, doxcode, doimage);
|
||||||
|
text = Functions.mlang(text, lang);
|
||||||
|
return <div>{ReactHtmlParser(text, { transform: xoopsTransform })}</div>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default XoopsCode;
|
15
src/config.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
const SITE_TITLE = "NeuroImaging Platform";
|
||||||
|
const SITE_SLOGAN = "";
|
||||||
|
const GOOGLE_ANALYTICS_TRACKING_ID = "UA-3757403-1";
|
||||||
|
const XOONIPS_ITEMTYPES = ["book", "paper", "presentation", "data", "tool", "nimgcenter", "model", "url"];
|
||||||
|
|
||||||
|
export type MultiLang = "en" | "ja";
|
||||||
|
|
||||||
|
const Config = {
|
||||||
|
SITE_TITLE,
|
||||||
|
SITE_SLOGAN,
|
||||||
|
GOOGLE_ANALYTICS_TRACKING_ID,
|
||||||
|
XOONIPS_ITEMTYPES,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Config;
|
47
src/credits/Credits.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Navigate, Route, Routes, useLocation } from "react-router-dom";
|
||||||
|
import PageNotFound from "../common/lib/PageNotFound";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import CreditsIndex from "./CreditsIndex";
|
||||||
|
import CreditsPage from "./CreditsPage";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CreditsTop: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
const location = useLocation();
|
||||||
|
const params = new URLSearchParams(location.search);
|
||||||
|
const paramId = params.get("id");
|
||||||
|
if (null === paramId) {
|
||||||
|
return <CreditsIndex lang={lang} />;
|
||||||
|
}
|
||||||
|
if (/^[1-9][0-9]*$/.test(paramId)) {
|
||||||
|
const id = parseInt(paramId, 10);
|
||||||
|
return <CreditsPage lang={lang} id={id} />;
|
||||||
|
}
|
||||||
|
return <PageNotFound lang={lang} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
const CreditsRedirectToTop: React.FC = () => {
|
||||||
|
const location = useLocation();
|
||||||
|
const url = location.pathname + "index.php" + location.search + location.hash;
|
||||||
|
return <Navigate to={url} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Credits: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Routes>
|
||||||
|
<Route path="" element={<CreditsRedirectToTop />} />
|
||||||
|
<Route path="index.php" element={<CreditsTop lang={lang} />} />
|
||||||
|
<Route path="aboutus.php" element={<CreditsPage lang={lang} id={0} />} />
|
||||||
|
<Route path="*" element={<PageNotFound lang={lang} />} />
|
||||||
|
</Routes>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Credits;
|
59
src/credits/CreditsIndex.tsx
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Helmet } from "react-helmet-async";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import Loading from "../common/lib/Loading";
|
||||||
|
import NoticeSiteHasBeenArchived from "../common/lib/NoticeSiteHasBeenArchived";
|
||||||
|
import PageNotFound from "../common/lib/PageNotFound";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import Functions from "../functions";
|
||||||
|
import CreditsUtils, { CreditsIndexData } from "./lib/CreditsUtils";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CreditsIndex: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
const [loading, setLoading] = useState<boolean>(true);
|
||||||
|
const [index, setIndex] = useState<CreditsIndexData | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const updatePage = async () => {
|
||||||
|
const index = await CreditsUtils.getIndex();
|
||||||
|
setLoading(false);
|
||||||
|
setIndex(index);
|
||||||
|
};
|
||||||
|
updatePage();
|
||||||
|
}, [lang]);
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return <Loading />;
|
||||||
|
}
|
||||||
|
if (null === index) {
|
||||||
|
return <PageNotFound lang={lang} />;
|
||||||
|
}
|
||||||
|
const mtitle = Functions.mlang(index.name, lang);
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Helmet>
|
||||||
|
<title>
|
||||||
|
{mtitle} - {Functions.siteTitle(lang)}
|
||||||
|
</title>
|
||||||
|
</Helmet>
|
||||||
|
<h3>{mtitle}</h3>
|
||||||
|
<NoticeSiteHasBeenArchived lang={lang} />
|
||||||
|
<ul>
|
||||||
|
{index.pages.map((page) => {
|
||||||
|
const title = Functions.mlang(page.title, lang);
|
||||||
|
const url = CreditsUtils.getPageUrl(page.id);
|
||||||
|
return (
|
||||||
|
<li key={page.id}>
|
||||||
|
<Link to={url}>{title}</Link>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default CreditsIndex;
|
62
src/credits/CreditsPage.tsx
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Helmet } from "react-helmet-async";
|
||||||
|
import Loading from "../common/lib/Loading";
|
||||||
|
import NoticeSiteHasBeenArchived from "../common/lib/NoticeSiteHasBeenArchived";
|
||||||
|
import PageNotFound from "../common/lib/PageNotFound";
|
||||||
|
import XoopsCode from "../common/lib/XoopsCode";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import Functions from "../functions";
|
||||||
|
import CreditsUtils, { CreditsIndexData, CreditsPageDetailData } from "./lib/CreditsUtils";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
id: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CreditsPage: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang, id } = props;
|
||||||
|
const [loading, setLoading] = useState<boolean>(true);
|
||||||
|
const [index, setIndex] = useState<CreditsIndexData | null>(null);
|
||||||
|
const [page, setPage] = useState<CreditsPageDetailData | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const updatePage = async () => {
|
||||||
|
const index = await CreditsUtils.getIndex();
|
||||||
|
const page = await CreditsUtils.getPage(id);
|
||||||
|
setLoading(false);
|
||||||
|
setIndex(index);
|
||||||
|
setPage(page);
|
||||||
|
};
|
||||||
|
updatePage();
|
||||||
|
}, [id]);
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return <Loading />;
|
||||||
|
}
|
||||||
|
if (page === null || index === null) {
|
||||||
|
return <PageNotFound lang={lang} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mtitle = Functions.mlang(index.name, lang);
|
||||||
|
const title = Functions.mlang(page.title, lang);
|
||||||
|
const lastupdate = page.lastupdate === 0 ? "" : Functions.formatDate(page.lastupdate, "MMMM Do, YYYY");
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Helmet>
|
||||||
|
<title>
|
||||||
|
{title} - {mtitle} - {Functions.siteTitle(lang)}
|
||||||
|
</title>
|
||||||
|
</Helmet>
|
||||||
|
<h3>{title}</h3>
|
||||||
|
<NoticeSiteHasBeenArchived lang={lang} />
|
||||||
|
{"" !== lastupdate && (
|
||||||
|
<div style={{ textAlign: "right" }}>
|
||||||
|
{Functions.mlang("[en]Last Update[/en][ja]最終更新日[/ja]", lang)} : {lastupdate}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<hr />
|
||||||
|
<XoopsCode lang={lang} text={page.content} dohtml={true} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default CreditsPage;
|
47
src/credits/blocks/CreditsMenu.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import Loading from "../../common/lib/Loading";
|
||||||
|
import PageNotFound from "../../common/lib/PageNotFound";
|
||||||
|
import { MultiLang } from "../../config";
|
||||||
|
import Functions from "../../functions";
|
||||||
|
import CreditsUtils, { CreditsMenuData } from "../lib/CreditsUtils";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CreditsMenu: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
const [loading, setLoading] = useState<boolean>(true);
|
||||||
|
const [menu, setMenu] = useState<CreditsMenuData[] | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const updatePage = async () => {
|
||||||
|
const menu = await CreditsUtils.getMenu();
|
||||||
|
setLoading(false);
|
||||||
|
setMenu(menu);
|
||||||
|
};
|
||||||
|
updatePage();
|
||||||
|
}, [lang]);
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return <Loading />;
|
||||||
|
}
|
||||||
|
if (menu === null || menu.length === 0) {
|
||||||
|
return <PageNotFound lang={lang} />;
|
||||||
|
}
|
||||||
|
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 <ul className="mainmenu">{links}</ul>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CreditsMenu;
|
77
src/credits/lib/CreditsUtils.ts
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
export interface CreditsPageData {
|
||||||
|
id: number;
|
||||||
|
title: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreditsPageDetailData extends CreditsPageData {
|
||||||
|
content: string;
|
||||||
|
lastupdate: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreditsIndexData {
|
||||||
|
name: string;
|
||||||
|
pages: CreditsPageData[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreditsMenuData {
|
||||||
|
title: string;
|
||||||
|
link: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CreditsUtils {
|
||||||
|
private pathname: string;
|
||||||
|
private index?: CreditsIndexData | null;
|
||||||
|
|
||||||
|
constructor(path: string) {
|
||||||
|
this.pathname = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
getIndexUrl(): string {
|
||||||
|
return this.pathname + "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
getPageUrl(id: number): string {
|
||||||
|
return this.getIndexUrl() + (0 === id ? "aboutus.php" : "?id=" + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getIndex(): Promise<CreditsIndexData | null> {
|
||||||
|
if (typeof this.index === "undefined") {
|
||||||
|
try {
|
||||||
|
const url = this.getIndexUrl() + "index.json";
|
||||||
|
const response = await axios.get(url);
|
||||||
|
const index = response.data as CreditsIndexData;
|
||||||
|
this.index = index;
|
||||||
|
} catch (err) {
|
||||||
|
this.index = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.index;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getMenu(): Promise<CreditsMenuData[]> {
|
||||||
|
const menu: CreditsMenuData[] = [];
|
||||||
|
const index = await this.getIndex();
|
||||||
|
if (index !== null) {
|
||||||
|
index.pages.forEach((page) => {
|
||||||
|
menu.push({ title: page.title, link: this.getPageUrl(page.id) });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getPage(id: number): Promise<CreditsPageDetailData | null> {
|
||||||
|
let page = null;
|
||||||
|
try {
|
||||||
|
const url = this.getIndexUrl() + id + ".json";
|
||||||
|
const response = await axios.get(url);
|
||||||
|
page = response.data as CreditsPageDetailData;
|
||||||
|
} catch (err) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new CreditsUtils("/modules/credits");
|
52
src/custom/Footer.tsx
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
import { HashLink } from "react-router-hash-link";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import imageBannerNiu from "./assets/images/banner-niu.png";
|
||||||
|
import imageBannerRikenCbs from "./assets/images/banner-riken-cbs.png";
|
||||||
|
import imageBannerRiken from "./assets/images/banner-riken.png";
|
||||||
|
import imageBannerXoonips from "./assets/images/banner-xoonips.png";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Footer: React.FC<Props> = (props: Props) => {
|
||||||
|
const location = useLocation();
|
||||||
|
return (
|
||||||
|
<footer id="footer">
|
||||||
|
<div className="pageTop">
|
||||||
|
<HashLink to={`${location.pathname}${location.search}#page`}>
|
||||||
|
<span className="hidden">Go Page Top</span>
|
||||||
|
</HashLink>
|
||||||
|
</div>
|
||||||
|
<div className="link">
|
||||||
|
<span>
|
||||||
|
<a href="http://www.riken.jp/" title="RIKEN" target="_blank" rel="noopener noreferrer">
|
||||||
|
<img src={imageBannerRiken} alt="RIKEN" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<a href="https://cbs.riken.jp/" title="RIKEN Center for Brain Science" target="_blank" rel="noopener noreferrer">
|
||||||
|
<img src={imageBannerRikenCbs} alt="RIKEN Center for Brain Science" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<a href="https://www.ni.riken.jp/" title="Neuroinformatics Unit, RIKEN Center for Brain Science" target="_blank" rel="noopener noreferrer">
|
||||||
|
<img src={imageBannerNiu} alt="Neuroinformatics Unit, RIKEN Center for Brain Science" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<a href="http://xoonips.osdn.jp/" title="XooNIps" target="_blank" rel="noopener noreferrer">
|
||||||
|
<img src={imageBannerXoonips} alt="XooNIps" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="copyright">
|
||||||
|
<span>Copyright (C) 2018 Neuroinformatics Unit, RIKEN Center for Brain Science</span>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Footer;
|
73
src/custom/Header.tsx
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import LangFlag from "../common/lib/LangFlag";
|
||||||
|
import Config, { MultiLang } from "../config";
|
||||||
|
import imageJnode from "./assets/images/jnode.png";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Header: React.FC<Props> = (props: Props) => {
|
||||||
|
return (
|
||||||
|
<header id="header">
|
||||||
|
<div className="logo">
|
||||||
|
<Link to="/" title="Home">
|
||||||
|
<span className="hidden">{Config.SITE_TITLE}</span>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
<div className="jnode">
|
||||||
|
<a href="https://www.neuroinf.jp/" target="_blank" rel="noopener noreferrer" title="INCF Japan Node">
|
||||||
|
<img src={imageJnode} alt="INCF Japan Node" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<nav className="menubar">
|
||||||
|
<ul className="mainmenu">
|
||||||
|
<li>
|
||||||
|
<Link id="hmm01" to="/modules/nimgdocs/index.php?docname=about_NIMGPF" title="NIMG-PFの基本理念、委員会構成、取り扱い説明等を掲載しています。">
|
||||||
|
NIMG-PFについて About This Site
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link id="hmm02" to="/modules/xoonips/" title="データベースを検索することができます。">
|
||||||
|
XooNIpsモード XooNIps database mode
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link id="hmm03" to="/modules/nimgsearch/" title="脳図から関連する文献を検索することができます。">
|
||||||
|
脳図検索モード search with Brain Atlas
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link id="hmm04" to="/modules/nimgdocs/tutorials/" title="脳イメージングについて説明した教育資料を閲覧できます。">
|
||||||
|
チュートリアル NIMG-PF Tutorials
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link id="hsm01" to="/modules/xnpnimgcenter/utilities/" title="ユーティリティ">
|
||||||
|
ユーティリティ Utilities
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link id="hsm03" to="/modules/nimgdocs/index.php?docname=3DBrowse" title="日本人脳データ">
|
||||||
|
日本人脳データ 3D Browse
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link id="hsm04" to="/modules/nimgdocs/index.php?docname=3DBrowse" title="日本ザル脳データ">
|
||||||
|
日本ザル脳データ 3D Browse
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div className="lang">
|
||||||
|
<LangFlag lang="en" />
|
||||||
|
<LangFlag lang="ja" />
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Header;
|
148
src/custom/Page.tsx
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Outlet, Route, Routes } from "react-router-dom";
|
||||||
|
import BrainExplorerIndex from "../brainexplorer/BrainExplorer";
|
||||||
|
import XoopsPathRedirect from "../common/XoopsPathRedirect";
|
||||||
|
import { MultiLang } from "../config";
|
||||||
|
import CreditsMenu from "../credits/blocks/CreditsMenu";
|
||||||
|
import Credits from "../credits/Credits";
|
||||||
|
import NimgcenterUtilities from "../nimgcenter/NimgenterUtilities";
|
||||||
|
import Nimgdocs from "../nimgdocs/Nimgdocs";
|
||||||
|
import Nimgsearch from "../nimgsearch/Nimgsearch";
|
||||||
|
import IndexTree from "../xoonips/blocks/IndexTree";
|
||||||
|
import Ranking from "../xoonips/blocks/Rankings";
|
||||||
|
import RecentContents from "../xoonips/blocks/RecentContents";
|
||||||
|
import Search2 from "../xoonips/blocks/Search";
|
||||||
|
import Xoonips from "../xoonips/Xoonips";
|
||||||
|
import BulletinBoard from "./blocks/BulletinBoard";
|
||||||
|
import HowToUseLinks from "./blocks/HowToUseLinks";
|
||||||
|
import HowToUseVideo from "./blocks/HowToUseVideo";
|
||||||
|
import Information from "./blocks/Information";
|
||||||
|
import Questionnaire from "./blocks/Questionnaire";
|
||||||
|
import RecentStatus from "./blocks/RecentStatus";
|
||||||
|
import Footer from "./Footer";
|
||||||
|
import Header from "./Header";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
lang: MultiLang;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MainContent: React.FC<Props> = (props: Props) => {
|
||||||
|
return (
|
||||||
|
<div id="main">
|
||||||
|
<div className="mainContent">
|
||||||
|
<Outlet />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const CenterColumn: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<div id="centercolumn">
|
||||||
|
<Outlet />
|
||||||
|
<Routes>
|
||||||
|
<Route path="/*" element={<MainContent lang={lang} />}>
|
||||||
|
<Route path="modules/credits/*" element={<Credits lang={lang} />} />
|
||||||
|
<Route path="modules/xoonips/*" element={<Xoonips lang={lang} />} />
|
||||||
|
<Route path="modules/nimgdocs/*" element={<Nimgdocs lang={lang} />} />
|
||||||
|
<Route path="modules/nimgsearch/*" element={<Nimgsearch lang={lang} />} />
|
||||||
|
<Route path="modules/xnpnimgcenter/utilities/*" element={<NimgcenterUtilities lang={lang} />} />
|
||||||
|
<Route path="modules/brainexplorer/*" element={<BrainExplorerIndex lang={lang} />} />
|
||||||
|
<Route path="*" element={<XoopsPathRedirect lang={lang} />} />
|
||||||
|
</Route>
|
||||||
|
</Routes>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const CenterColumnBlock: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div id="centerCcolumn">
|
||||||
|
<Information lang={lang} />
|
||||||
|
<BulletinBoard lang={lang} />
|
||||||
|
<HowToUseVideo lang={lang} />
|
||||||
|
<HowToUseLinks lang={lang} />
|
||||||
|
<Questionnaire lang={lang} />
|
||||||
|
<RecentStatus lang={lang} />
|
||||||
|
</div>
|
||||||
|
<div className="col2">
|
||||||
|
<div id="centerLcolumn">
|
||||||
|
<div className="block">
|
||||||
|
<div className="blockTitle">XooNIps Ranking</div>
|
||||||
|
<div className="blockContent">
|
||||||
|
<Ranking lang={lang} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="centerRcolumn">
|
||||||
|
<div className="block">
|
||||||
|
<div className="blockTitle">XooNIps Update</div>
|
||||||
|
<div className="blockContent">
|
||||||
|
<RecentContents lang={lang} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const LeftColumn: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<div id="leftcolumn">
|
||||||
|
<Outlet />
|
||||||
|
<div className="block">
|
||||||
|
<div className="blockTitle">Index Tree</div>
|
||||||
|
<div className="blockContent">
|
||||||
|
<IndexTree lang={lang} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="block">
|
||||||
|
<div className="blockTitle">Site Information</div>
|
||||||
|
<div className="blockContent">
|
||||||
|
<CreditsMenu lang={lang} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const XoopsSearchBlock: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<div className="block">
|
||||||
|
<div className="blockTitle">Item Search</div>
|
||||||
|
<div className="blockContent">
|
||||||
|
<Search2 lang={lang} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Page: React.FC<Props> = (props: Props) => {
|
||||||
|
const { lang } = props;
|
||||||
|
return (
|
||||||
|
<div id="page">
|
||||||
|
<Header lang={lang} />
|
||||||
|
<div className="col2">
|
||||||
|
<Routes>
|
||||||
|
<Route path="/*" element={<CenterColumn lang={lang} />}>
|
||||||
|
<Route index element={<CenterColumnBlock lang={lang} />} />
|
||||||
|
</Route>
|
||||||
|
</Routes>
|
||||||
|
<Routes>
|
||||||
|
<Route path="/*" element={<LeftColumn lang={lang} />}>
|
||||||
|
<Route path="modules/xoonips/*" element={<XoopsSearchBlock lang={lang} />} />
|
||||||
|
</Route>
|
||||||
|
</Routes>
|
||||||
|
</div>
|
||||||
|
<Footer lang={lang} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Page;
|
BIN
src/custom/assets/images/back.png
Normal file
After Width: | Height: | Size: 569 B |
BIN
src/custom/assets/images/banner-niu.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/custom/assets/images/banner-riken-cbs.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
src/custom/assets/images/banner-riken.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
src/custom/assets/images/banner-xoonips.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
src/custom/assets/images/blockTitle.png
Normal file
After Width: | Height: | Size: 633 B |
BIN
src/custom/assets/images/blockTitleBack.png
Normal file
After Width: | Height: | Size: 98 B |
BIN
src/custom/assets/images/blockTitleIndent12.png
Normal file
After Width: | Height: | Size: 269 B |
BIN
src/custom/assets/images/blockTitleIndent16.png
Normal file
After Width: | Height: | Size: 310 B |
BIN
src/custom/assets/images/footer_back.png
Normal file
After Width: | Height: | Size: 187 B |
BIN
src/custom/assets/images/h1_indent.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/custom/assets/images/h2_background.png
Normal file
After Width: | Height: | Size: 98 B |
BIN
src/custom/assets/images/jnode.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
src/custom/assets/images/logo.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
src/custom/assets/images/mlang_english.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
src/custom/assets/images/mlang_japanese.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
src/custom/assets/images/mmenu_01.png
Normal file
After Width: | Height: | Size: 3.7 KiB |